source: abuse/trunk/src/install.cpp @ 56

Last change on this file since 56 was 56, checked in by Sam Hocevar, 11 years ago
  • Add licensing terms to most C / C++ files (Ref #5).
File size: 6.9 KB
Line 
1/*
2 *  Abuse - dark 2D side-scrolling platform game
3 *  Copyright (c) 1995 Crack dot Com
4 *
5 *  This software was released into the Public Domain. As with most public
6 *  domain software, no warranty is made or implied by Crack dot Com or
7 *  Jonathan Clark.
8 */
9
10#include "config.h"
11
12#define NO_LIBS 1
13#include "lisp.c"
14#include "trig.c"
15#include "lisp_gc.c"
16#include "lisp_opt.c"
17#include "text_gui.c"
18
19
20enum { LINUX, WATCOM, AIX, SUN, SGI };
21
22char *plat_names[] = {"Linux (SVGA & X11)",
23                      "Watcom for MS-DOS",
24                      "IBM AIX for RS6000's",
25                      "Sun OS",
26                      "Silicon Graphics"};
27
28char *plat_name[] = {"LINUX","WATCOM","AIX","SUN","SGI"};
29
30
31int detect_platform()
32{
33#ifdef __linux__
34  return LINUX;
35#endif
36
37#ifdef __WATCOMC__
38  return WATCOM;
39#endif
40
41#ifdef _AIX
42  return AIX;
43#endif
44
45#ifdef sun
46  return SUN;
47#endif
48
49#ifdef SUN3
50  return SUN;
51#endif
52
53#ifdef SUN4
54  return SUN;
55#endif
56
57#ifdef __sgi
58  return SGI;
59#endif
60
61  printf("Cannot detect platform\n");
62  exit(1);
63
64  return 0;
65}
66
67
68long c_caller(long number, void *arg)  // exten c function switches on number
69{
70  switch (number)
71  {
72    case 0 :
73    {
74      char cd[100];
75      getcwd(cd,100);
76      int t=change_dir(lstring_value(CAR(arg)));
77      change_dir(cd);
78      return t;
79    } break;   
80    case 1 :
81    {
82      if (change_dir(lstring_value(eval(CAR(arg)))))
83        return 1;
84      else return 0;
85    } break;
86    case 2 :
87    {
88      return K_avail(lstring_value(CAR(arg)));
89    } break;
90    case 3 :
91    {
92      void *title=eval(CAR(arg)); arg=CDR(arg);   p_ref r1(title);
93      void *source=eval(CAR(arg)); arg=CDR(arg);  p_ref r2(source);
94      void *dest=eval(CAR(arg)); arg=CDR(arg);    p_ref r3(dest);
95
96      return nice_copy(lstring_value(title),lstring_value(source),lstring_value(dest));
97    } break;
98    case 4 :
99    {
100      if (access(lstring_value(eval(CAR(arg))),R_OK)==0)
101        return 1;
102      else
103        return 0;
104    } break;
105  }
106  return 0;
107}
108
109
110int nice_copy(char *title, char *source, char *dest);
111
112 void *l_obj_get(long number) { return NULL; }  // exten lisp function switches on number
113 void l_obj_set(long number, void *arg) { ; }  // exten lisp function switches on number
114 void l_obj_print(long number) { ; }  // exten lisp function switches on number
115
116void clisp_init()
117{                      // external initalizer call by lisp_init()
118  void *platform=make_find_symbol("platform");
119  set_symbol_value(platform,make_find_symbol(plat_name[detect_platform()])); 
120  add_lisp_function("system",1,1,                   0);
121  add_lisp_function("split_filename",2,2,           1);
122  add_lisp_function("convert_slashes",2,2,          2);
123  add_lisp_function("make_dir",1,1,                 3);
124  add_lisp_function("extension",1,1,                4);
125  add_lisp_function("nice_input",3,3,               5);  // title, prompt, default -> returns input
126  add_lisp_function("nice_menu",3,3,                6);  // title, menu_title, list -> return selection number
127  add_lisp_function("show_yes_no",4,4,              7);
128  add_lisp_function("get_cwd",0,0,                  8);
129  add_lisp_function("getenv",1,1,                   9);
130  add_lisp_function("modify_install_path",1,1,     10);
131 
132
133  add_c_bool_fun("dir_exsist",1,1,                  0);
134  add_c_bool_fun("chdir",1,1,                       1);
135  add_c_function("K_avail",1,1,                     2);  // path
136  add_c_bool_fun("nice_copy",3,3,                   3);  // source file, dest file
137  add_c_bool_fun("file_exsist",1,1,                 4);
138 
139  char esc_str[2]={27,0};
140  set_symbol_value(make_find_symbol("ESC_string"),new_lisp_string(esc_str));
141}
142
143
144
145
146void *l_caller(long number, void *arg)
147{
148  p_ref r1(arg);
149  void *ret=NULL;
150  switch (number)
151  {
152    case 0 :
153    { system(lstring_value(eval(CAR(arg)))); } break;
154    case 1 :
155    {
156      void *fn=eval(CAR(arg));  arg=CDR(arg);
157      p_ref r1(fn);
158      char *current_dir=lstring_value(eval(CAR(arg)));
159      char *filename=lstring_value(fn);
160
161      char *last=NULL,*s=filename,*dp;
162      char dir[200],name[200];
163      while (*s) { if (*s=='\\' || *s=='/') last=s+1; s++; }
164      if (last)
165      {
166        for (dp=dir,s=filename;s!=last;dp++,s++) { *dp=*s; }
167        *dp=0;
168        strcpy(name,last);
169      } else
170      {
171        strcpy(dir,current_dir);
172        strcpy(name,filename);
173      }
174      void *cs=(void *)new_cons_cell();
175      p_ref r24(cs);
176      ((cons_cell *)cs)->car=new_lisp_string(dir);
177      ((cons_cell *)cs)->cdr=new_lisp_string(name);
178      ret=cs;
179    } break;
180    case 2 :
181    {
182      void *fn=eval(CAR(arg)); arg=CDR(arg);
183      p_ref r1(fn);
184      char *slash=lstring_value(eval(CAR(arg)));
185      char *filename=lstring_value(fn);
186
187      char tmp[200],*s=filename,*tp;
188     
189      for (tp=tmp;*s;s++,tp++)
190      {
191        if (*s=='/' || *s=='\\')
192        {
193          *tp=*slash;
194//        if (*slash=='\\')
195//        { tp++; *tp='\\'; }
196        }
197        else *tp=*s;
198      }
199      *tp=0;
200      ret=new_lisp_string(tmp);
201    } break;
202    case 3 :
203    {
204      char cd[100];
205      getcwd(cd,100);
206
207      char name_so_far[100];
208      char *dir=lstring_value(eval(CAR(arg)));
209      char *d,ch;
210      d=dir;
211      int err=0;
212      while (*d && !err)
213      {
214        if ((*d=='\\' || *d=='/') && d!=dir && *(d-1)!=':')
215        {
216          ch=*d;
217          *d=0;
218          if (!change_dir(dir))
219            if (make_dir(dir)!=0)
220              err=1;
221
222          *d=ch;
223         
224        }
225        d++;
226      }
227      change_dir(cd);
228
229      if (err)
230        ret=NULL;
231      else ret=true_symbol;
232    } break;
233    case 4 :
234    {
235      char *fn=lstring_value(eval(CAR(arg)));
236      char *l=NULL,*s=fn;
237      while (*s) { if (*s=='.') l=s; s++; }
238      if (l) ret=new_lisp_string(l);
239      else ret=new_lisp_string("");
240    } break;
241    case 5 :
242    {
243      void *tit=eval(CAR(arg));  arg=CDR(arg);
244      p_ref r1(tit);
245      void *prompt=eval(CAR(arg));  arg=CDR(arg);
246      p_ref r2(prompt);
247      void *def=eval(CAR(arg));  arg=CDR(arg);
248      p_ref r3(def);
249
250      return nice_input(lstring_value(tit),lstring_value(prompt),lstring_value(def));
251    } break;
252    case 6 :
253    {
254      return nice_menu(CAR(arg),CAR(CDR(arg)),CAR(CDR(CDR(arg))));
255    } break;
256    case 7 :
257    {
258      return show_yes_no(CAR(arg),CAR(CDR(arg)),CAR(CDR(CDR(arg))),CAR(CDR(CDR(CDR(arg)))));
259    } break;
260    case 8 :
261    {
262      char cd[150];
263      getcwd(cd,100);
264      return new_lisp_string(cd);
265    } break;
266    case 9 :
267    {
268      return new_lisp_string(getenv(lstring_value(eval(CAR(arg)))));
269    } break;
270    case 10 :
271    {
272      char str[200];
273      strcpy(str,lstring_value(eval(CAR(arg))));
274      modify_install_path(str);
275      return new_lisp_string(str);
276    } break;
277  }
278  return ret;
279}
280
281
282 // exten lisp function switches on number
283
284
285main(int argc, char **argv)
286{
287  lisp_init(100000,0x2000);
288  char *use_file="install.lsp";
289  for (int i=1;i<argc;i++)
290  {
291    if (!strcmp(argv[i],"-f"))
292    {
293      i++;
294      use_file=argv[i];
295    }
296  }
297
298  char prog[100],*s;
299  sprintf(prog,"(compile-file \"%s\")\n",use_file);
300  s=prog;
301  if (!eval(compile(s)))
302  {
303    printf("unable to open file %s",use_file);
304    exit(0);
305  }
306  return 0;
307}
308
Note: See TracBrowser for help on using the repository browser.