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

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