source: abuse/trunk/src/maker.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.6 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#include <unistd.h>
13
14#include <stdio.h>
15#include <string.h>
16#include <stdlib.h>
17#include <sys/stat.h>
18#define make_dir(dir) mkdir(dir,511)
19
20#define NO_LIBS 1
21#include "lisp.c"
22#include "trig.c"
23#include "lisp_gc.c"
24#include "lisp_opt.c"
25
26enum { LINUX, WATCOM, AIX, SUN, SGI };
27
28char *plat_names[] = {"Linux (SVGA & X11)",
29                      "Watcom for MS-DOS",
30                      "IBM AIX for RS6000's",
31                      "Sun OS",
32                      "Silicon Graphics"};
33
34char *plat_name[] = {"LINUX","WATCOM","AIX","SUN","SGI"};
35
36
37int detect_platform()
38{
39#ifdef __linux__
40  return LINUX;
41#endif
42
43#ifdef _AIX
44  return AIX;
45#endif
46
47#ifdef sun
48  return SUN;
49#endif
50
51#ifdef SUN3
52  return SUN;
53#endif
54
55#ifdef SUN4
56  return SUN;
57#endif
58
59#ifdef __sgi
60  return SGI;
61#endif
62
63  printf("Cannot detect platform\n");
64  exit(1);
65
66  return 0;
67}
68
69
70 void *l_obj_get(long number) { return NULL; }  // exten lisp function switches on number
71 void l_obj_set(long number, void *arg) { ; }  // exten lisp function switches on number
72 void l_obj_print(long number) { ; }  // exten lisp function switches on number
73
74void clisp_init()
75{                      // external initalizer call by lisp_init()
76  void *platform=make_find_symbol("platform");
77  set_symbol_value(platform,make_find_symbol(plat_name[detect_platform()])); 
78  add_lisp_function("get_depends",3,3,              0);
79  add_lisp_function("split_filename",2,2,           1);
80  add_lisp_function("convert_slashes",2,2,          2);
81  add_lisp_function("make_dir",1,1,                 3);
82  add_lisp_function("extension",1,1,                4);
83  add_lisp_function("system",1,1,                   5);
84  add_lisp_function("get_cwd",0,0,                  6);
85
86  add_lisp_function("mangle_oname",1,1,             7);
87
88  add_c_bool_fun("chdir",1,1,                       1);
89}
90
91
92int change_dir(char *path)
93{
94    int ret = chdir(path); // weird
95    ret = chdir(path);
96    return ret == 0;
97}
98
99long c_caller(long number, void *arg) // exten c function switches on number
100{
101  switch (number)
102  {
103    case 1 :
104    {
105      if (change_dir(lstring_value(eval(CAR(arg)))))
106        return 1;
107      else return 0;
108    } break;
109  }
110}
111
112void get_depends(char *fn, char *slash, void *ilist, void *&ret)
113{
114  p_ref r8(ret); 
115  p_ref r1(ilist);
116  void *v=ret;
117  p_ref r2(v);
118  for (;v;v=CDR(v))
119    if (!strcmp(fn,lstring_value(CAR(v)))) return ;     // check to see if file already in list
120
121  char tmp_name[200]; 
122  strcpy(tmp_name,fn);
123  FILE *fp=fopen(fn,"rb");
124  if (!fp)
125  {
126    for (v=ilist;!fp && v;v=CDR(v))     
127    {
128      sprintf(tmp_name,"%s%s%s",lstring_value(CAR(v)),slash,fn);
129      for (void *v=ret;v;v=CDR(v))
130        if (!strcmp(tmp_name,lstring_value(CAR(v)))) return ;
131      // check to see if file already in list
132      fp=fopen(tmp_name,"rb");
133    }
134  }
135  if (fp)
136  {
137    push_onto_list(new_lisp_string(tmp_name),ret);
138
139    char line[200];
140    while (!feof(fp))
141    {
142      fgets(line,200,fp);
143      if (!feof(fp))
144      {
145        if (memcmp(line,"#include",8)==0)
146        {
147          char *ch,*ch2;
148          for (ch=line+8;*ch==' ' || *ch=='\t';ch++);
149          if (*ch=='"')
150          {
151            ch++;
152            for (ch2=line;*ch!='"';ch++,ch2++)
153            { *ch2=*ch; }
154            *ch2=0;
155            get_depends(line,slash,ilist,ret);
156          }
157        }
158      }
159    }
160    fclose(fp);
161  }
162}
163
164void *l_caller(long number, void *arg)
165{
166  p_ref r1(arg);
167  void *ret=NULL;
168  switch (number)
169  {
170    case 0 :
171    {
172      void *fn=eval(CAR(arg));  arg=CDR(arg);
173      p_ref r1(fn);
174      void *sl=eval(CAR(arg));   arg=CDR(arg);
175      p_ref r2(sl);
176
177      void *ilist=eval(CAR(arg));
178      p_ref r3(ilist);
179
180      char filename[200];
181      strcpy(filename,lstring_value(fn));
182
183      char slash[10];
184      strcpy(slash,lstring_value(sl));
185
186      get_depends(filename,slash,ilist,ret);
187      void *v=ret;
188      if (v && CDR(v))
189      {
190        for (;CDR(CDR(v));v=CDR(v)); CDR(v)=NULL;  //chop of self
191      }
192    } break;
193    case 1 :
194    {
195      void *fn=eval(CAR(arg));  arg=CDR(arg);
196      p_ref r1(fn);
197      char *current_dir=lstring_value(eval(CAR(arg)));
198      char *filename=lstring_value(fn);
199
200      char *last=NULL,*s=filename,*dp;
201      char dir[200],name[200];
202      while (*s) { if (*s=='\\' || *s=='/') last=s+1; s++; }
203      if (last)
204      {
205        for (dp=dir,s=filename;s!=last;dp++,s++) { *dp=*s; }
206        *dp=0;
207        strcpy(name,last);
208      } else
209      {
210        strcpy(dir,current_dir);
211        strcpy(name,filename);
212      }
213      void *cs=(void *)new_cons_cell();
214      p_ref r24(cs);
215      ((cons_cell *)cs)->car=new_lisp_string(dir);
216      ((cons_cell *)cs)->cdr=new_lisp_string(name);
217      ret=cs;
218    } break;
219    case 2 :
220    {
221      void *fn=eval(CAR(arg)); arg=CDR(arg);
222      p_ref r1(fn);
223      char *slash=lstring_value(eval(CAR(arg)));
224      char *filename=lstring_value(fn);
225
226      char tmp[200],*s=filename,*tp;
227     
228      for (tp=tmp;*s;s++,tp++)
229      {
230        if (*s=='/' || *s=='\\')
231        {
232          *tp=*slash;
233//        if (*slash=='\\')
234//        { tp++; *tp='\\'; }
235        }
236        else *tp=*s;
237      }
238      *tp=0;
239      ret=new_lisp_string(tmp);
240    } break;
241    case 3 :
242    {
243      char name_so_far[100];
244      char *dir=lstring_value(eval(CAR(arg)));
245      char *d,ch;
246      d=dir;
247      while (*d)
248      {
249        if (*d=='\\' || *d=='/')
250        {
251          ch=*d;
252          *d=0;
253          make_dir(dir);
254          *d=ch;
255         
256        }
257        d++;
258      }
259      ret=NULL;
260    } break;
261    case 4 :
262    {
263      char *fn=lstring_value(eval(CAR(arg)));
264      char *l=NULL,*s=fn;
265      while (*s) { if (*s=='.') l=s; s++; }
266      if (l) ret=new_lisp_string(l);
267      else ret=new_lisp_string("");
268    } break;
269    case 5 :
270    {
271      ret=new_lisp_number(system(lstring_value(eval(CAR(arg)))));
272    } break;
273    case 6 :
274    {
275      char cd[150];
276      getcwd(cd,100);
277      return new_lisp_string(cd);
278    } break;
279    case 7 :
280    {
281      char *fn=lstring_value(eval(CAR(arg)));
282      uchar c1=0,c2=0,c3=0,c4=0;
283      while (*fn)
284      {
285        c1+=*fn;
286        c2+=c1;
287        c3+=c2;
288        c4+=c3;
289        fn++;
290      }
291      char st[15];
292      sprintf(st,"%02x%02x%02x%02x",c1,c2,c3,c4);
293      return new_lisp_string(st);           
294    } break;
295  }
296  return ret;
297}
298
299
300 // exten lisp function switches on number
301
302
303main(int argc, char **argv)
304{
305  lisp_init(5*1000*1024,5*1000*1024);
306  char *use_file="maker.lsp";
307  for (int i=1;i<argc;i++)
308  {
309    if (!strcmp(argv[i],"-f"))
310    {
311      i++;
312      use_file=argv[i];
313    }
314  }
315
316  char prog[100],*s;
317  sprintf(prog,"(compile-file \"%s\")\n",use_file);
318  s=prog;
319  if (!eval(compile(s)))
320  {
321    printf("unable to open file %s",use_file);
322    exit(0);
323  }
324  return 0;
325}
326
327
328
329
330
Note: See TracBrowser for help on using the repository browser.