|
|
1.1 root 1: /* baja.c */
2:
3: /* Synchronet command shell/module compiler */
4:
5: /* $Id: baja.c,v 1.13 2000/11/14 02:16:57 rswindell Exp $ */
6:
7: /****************************************************************************
8: * @format.tab-size 4 (Plain Text/Source Code File Header) *
9: * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
10: * *
11: * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html *
12: * *
13: * This program is free software; you can redistribute it and/or *
14: * modify it under the terms of the GNU General Public License *
15: * as published by the Free Software Foundation; either version 2 *
16: * of the License, or (at your option) any later version. *
17: * See the GNU General Public License for more details: gpl.txt or *
18: * http://www.fsf.org/copyleft/gpl.html *
19: * *
20: * Anonymous FTP access to the most recent released source is available at *
21: * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net *
22: * *
23: * Anonymous CVS access to the development source and modification history *
24: * is available at cvs.synchro.net:/cvsroot/sbbs, example: *
25: * cvs -d :pserver:[email protected]:/cvsroot/sbbs login *
26: * (just hit return, no password is necessary) *
27: * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src *
28: * *
29: * For Synchronet coding style and modification guidelines, see *
30: * http://www.synchro.net/source.html *
31: * *
32: * You are encouraged to submit any modifications (preferably in Unix diff *
33: * format) via e-mail to [email protected] *
34: * *
35: * Note: If this box doesn't appear square, then you need to fix your tabs. *
36: ****************************************************************************/
37:
38: /* OS-specific */
39: #ifndef __unix__
40: #include <io.h>
41: #include <share.h>
42: #endif
43: #ifdef _WIN32
44: #include <windows.h>
45: #endif
46:
47: /* ANSI */
48: #include <stdio.h>
49: #include <string.h>
50: #include <ctype.h>
51: #include <fcntl.h>
52:
53: /* Synchronet-specific */
54: #include "cmdshell.h"
55: #include "ars_defs.h"
56: #include "crc32.h"
57: #include "smbwrap.h" /* portability wrappers */
58:
59: #ifdef __BORLANDC__
60: unsigned _stklen=20000; /* Set stack size in code, not header */
61: #endif
62:
63: char **label_name=NULL
64: ,**goto_file=NULL
65: ,**goto_label=NULL
66: ,**call_file=NULL
67: ,**call_label=NULL;
68:
69: ulong *var_name=NULL,vars=0;
70:
71: char **define_str=NULL
72: ,**define_val=NULL;
73:
74: char *linestr="%s %d: %s\n";
75: char tmp[256];
76:
77: uint *label_indx=NULL
78: ,*goto_indx=NULL
79: ,*goto_line=NULL
80: ,*call_indx=NULL
81: ,*call_line=NULL;
82:
83: uint display=0,line=0,labels=0,gotos=0,calls=0,defines=0,case_sens=0;
84:
85: FILE *out=NULL;
86:
87: void bail(void)
88: {
89: if(out)
90: chsize(fileno(out),0);
91: }
92:
93: /****************************************************************************/
94: /* Truncates white-space chars off end of 'str' */
95: /****************************************************************************/
96: void truncsp(char *str)
97: {
98: int c;
99:
100: c=strlen(str);
101: while(c && str[c-1]<=SP) c--;
102: str[c]=0;
103: }
104:
105: /****************************************************************************/
106: /* Converts an ASCII Hex string into an ulong */
107: /****************************************************************************/
108: ulong ahtoul(char *str)
109: {
110: ulong l,val=0;
111:
112: while((l=(*str++)|0x20)!=0x20)
113: val=(l&0xf)+(l>>6&1)*9+val*16;
114: return(val);
115: }
116:
117: /* C Escape char */
118:
119: uchar cesc(char ch)
120: {
121: switch(ch) {
122: case 'r':
123: return(CR);
124: case 'n':
125: return(LF);
126: case 't':
127: return(TAB);
128: case 'b':
129: return(BS);
130: case 'a':
131: return(BEL);
132: case 'f':
133: return(FF);
134: case 'v':
135: return(11);
136: default:
137: return(ch);
138: }
139: }
140:
141: long val(char *src, char *p)
142: {
143: static int inside;
144: long l;
145:
146: if(isdigit(*p) || *p=='-') /* Dec, Hex, or Oct */
147: l=strtol(p,&p,0);
148: else if(*p=='\'') { /* Char */
149: p++;
150: if(*p=='\\') {
151: p++;
152: l=cesc(*p); }
153: else
154: l=*p;
155: p++; }
156: else if(*p=='.') /* Bit */
157: l=1L<<strtol(p+1,&p,0);
158: else {
159: printf("SYNTAX ERROR (expecting integer constant):\n");
160: printf(linestr,src,line,*p ? p : "<end of line>");
161: exit(1);
162: return(0); }
163: if(inside) {
164: return(l); }
165: inside=1;
166: while(*p)
167: switch(*(p++)) {
168: case '+':
169: l+=val(src,p);
170: break;
171: case '-':
172: l-=val(src,p);
173: break;
174: case '*':
175: l*=val(src,p);
176: break;
177: case '/':
178: l/=val(src,p);
179: break;
180: case '%':
181: l%=val(src,p);
182: break;
183: case '&':
184: l&=val(src,p);
185: break;
186: case '|':
187: l|=val(src,p);
188: break;
189: case '~':
190: l&=~val(src,p);
191: break;
192: case '^':
193: l^=val(src,p);
194: break;
195: case '>':
196: if(*p=='>') {
197: p++;
198: l>>=val(src,p); }
199: break;
200: case '<':
201: if(*p=='<') {
202: p++;
203: l<<=val(src,p); }
204: break;
205: case SP:
206: case '#':
207: inside=0;
208: return(l); }
209: inside=0;
210: return(l);
211: }
212:
213:
214: void writecstr(uchar *p)
215: {
216: char str[1024];
217: int j=0,inquotes=0;
218:
219: while(*p) {
220: if(*p=='"') { /* ignore quotes */
221: if(inquotes)
222: break;
223: inquotes=1;
224: p++;
225: continue; }
226: if(*p=='\\') { /* escape */
227: p++;
228: if(isdigit(*p)) {
229: str[j]=atoi(p); /* decimal, NOT octal */
230: if(isdigit(*(++p))) /* skip up to 3 digits */
231: if(isdigit(*(++p)))
232: p++;
233: j++;
234: continue; }
235: switch(*(p++)) {
236: case 'x':
237: tmp[0]=*(p++);
238: tmp[1]=0;
239: if(isxdigit(*p)) { /* if another hex digit, skip too */
240: tmp[1]=*(p++);
241: tmp[2]=0; }
242: str[j]=(char)ahtoul(tmp);
243: break;
244: case 'r':
245: str[j]=CR;
246: break;
247: case 'n':
248: str[j]=LF;
249: break;
250: case 't':
251: str[j]=TAB;
252: break;
253: case 'b':
254: str[j]=BS;
255: break;
256: case 'a':
257: str[j]=BEL;
258: break;
259: case 'f':
260: str[j]=FF;
261: break;
262: case 'v':
263: str[j]=11; /* VT */
264: break;
265: default:
266: str[j]=*(p-1);
267: break; }
268: j++;
269: continue; }
270: str[j++]=*(p++); }
271: str[j]=0;
272: fwrite(str,1,j+1,out);
273: }
274:
275: void writestr(uchar *p)
276: {
277: char str[1024];
278: int j=0;
279:
280: while(*p) {
281: if(*p=='"') { /* ignore quotes */
282: p++;
283: continue; }
284: if(*p=='\\' && *(p+1)=='"' && *(p+2))
285: p++;
286: str[j++]=*(p++); }
287: str[j]=0;
288: fwrite(str,1,j+1,out);
289: }
290:
291: /****************************************************************************/
292: /* Returns 32-crc of string (not counting terminating NULL) */
293: /****************************************************************************/
294: ulong crc32(char *str)
295: {
296: int i=0;
297: ulong crc=0xffffffffUL;
298:
299: while(str[i])
300: crc=ucrc32(str[i++],crc);
301: crc=~crc;
302: return(crc);
303: }
304:
305: void cvttab(char *str)
306: {
307: int i;
308:
309: for(i=0;str[i];i++)
310: if(str[i]==TAB)
311: str[i]=SP;
312: }
313:
314: void newvar(uchar *in)
315: {
316: uchar name[128];
317: long i,l;
318:
319: sprintf(name,"%.80s",in);
320: if(!case_sens)
321: strupr(name);
322: l=crc32(name);
323: for(i=0;i<vars;i++)
324: if(var_name[i]==l)
325: break;
326: if(i<vars)
327: return;
328: if((var_name=(ulong *)REALLOC(var_name,sizeof(long)*(vars+1)))==NULL) {
329: printf("Too many (%lu) variables!\n",vars);
330: exit(1); }
331: var_name[vars]=l;
332: if(display)
333: printf("newvar(%08lX)=%s\n",l,in);
334: vars++;
335: }
336:
337: void writecrc(uchar *src, uchar *in)
338: {
339: uchar name[128];
340: uchar* p;
341: long i,l;
342:
343: /* Automatically terminate variable name Oct-09-2000 rswindell */
344: sprintf(name,"%.80s",in);
345: p=strchr(name,SP);
346: if(p) *p=0;
347:
348: if(!case_sens)
349: strupr(name);
350: if(!stricmp(name,"STR") || !name[0])
351: l=0;
352: else {
353: l=crc32(name);
354:
355: for(i=0;i<vars;i++)
356: if(var_name[i]==l)
357: break;
358: if(i==vars) {
359: printf("SYNTAX ERROR (expecting variable name):\n");
360: printf(linestr,src,line,*in ? (char*)in : "<end of line>");
361: exit(1);
362: }
363: }
364: fwrite(&l,4,1,out);
365: }
366:
367: long isvar(uchar *arg)
368: {
369: uchar name[128],*p;
370: long i,l;
371:
372: if(!arg || !(*arg))
373: return(0);
374:
375: sprintf(name,"%.80s",arg);
376: if((p=strchr(name,SP))!=NULL) // Truncate at first space
377: *p=0;
378: if(!case_sens)
379: strupr(name);
380: l=crc32(name);
381:
382: for(i=0;i<vars;i++)
383: if(var_name[i]==l)
384: break;
385: if(i==vars)
386: return(0);
387: return(l);
388: }
389:
390: int str_cmp(char *s1, char *s2)
391: {
392: if(case_sens)
393: return(strcmp(s1,s2));
394: return(stricmp(s1,s2));
395: }
396:
397: void expdefs(uchar *line)
398: {
399: uchar str[512],*p,*sp,sav[2]={0};
400: int i;
401:
402: str[0]=0;
403: for(p=line;*p;p++) {
404: if(*p==SP) {
405: strcat(str," ");
406: continue; }
407:
408: if(*p=='"') { /* Skip quoted text */
409: sp=strchr(p+1,'"');
410: if(sp) *sp=0;
411: strcat(str,p);
412: if(!sp)
413: break;
414: strcat(str,"\"");
415: p+=strlen(p);
416: continue; }
417:
418: for(sp=p;*sp;sp++)
419: if(!isalnum(*sp) && *sp!='_')
420: break;
421: sav[0]=*sp; /* Save delimiter */
422: sav[1]=0;
423: *sp=0;
424: for(i=0;i<defines;i++)
425: if(!str_cmp(define_str[i],p))
426: break;
427: if(i<defines)
428: strcat(str,define_val[i]);
429: else
430: strcat(str,p);
431: if(!sav[0]) /* Last argument */
432: break;
433: p+=strlen(p);
434: strcat(str,sav); /* Restore delimiter */
435: }
436: strcpy(line,str);
437: }
438:
439:
440:
441: void compile(char *src)
442: {
443: uchar *str,*save,*p,*sp,*tp,*arg,*arg2,*arg3,*ar,ch;
444: ushort i,j;
445: long l,savline;
446: FILE *in;
447:
448: if((in=fopen(src,"rb"))==NULL) {
449: printf("error opening %s for read\n",src);
450: exit(1); }
451: line=0;
452:
453: if((str=malloc(1024))==NULL) {
454: printf("malloc error\n");
455: exit(1);
456: }
457:
458: if((save=malloc(1024))==NULL) {
459: printf("malloc error\n");
460: exit(1);
461: }
462:
463: while(!feof(in) && !ferror(in)) {
464: if(!fgets(str,1000,in))
465: break;
466: truncsp(str);
467: cvttab(str);
468: line++;
469: strcpy(save,str);
470: p=str;
471: while(*p && *p<=SP) /* look for beginning of command */
472: p++;
473: if((*p)==0)
474: continue;
475: if(*p=='#') /* remarks start with # */
476: continue;
477: expdefs(p); /* expand defines */
478: if(display)
479: printf("%s\n",p);
480: sp=strchr(p,SP);
481: arg=arg2=arg3="";
482: if(sp) {
483: *sp=0;
484: arg=sp+1;
485: while(*arg && *arg<=SP) arg++;
486: sp=strchr(arg,SP);
487: if(sp) {
488: arg2=sp+1;
489: while(*arg2 && *arg2<=SP) arg2++;
490: sp=strchr(arg2,SP);
491: if(sp) {
492: arg3=sp+1;
493: while(*arg3 && *arg3<=SP) arg3++; } } }
494:
495: if(!stricmp(p,"!INCLUDE")) {
496: savline=line;
497: sp=strchr(arg,SP);
498: if(sp) *sp=0;
499: compile(arg);
500: line=savline;
501: continue; }
502:
503: if(!stricmp(p,"!DEFINE")) { /* define */
504: sp=strchr(arg,SP);
505: if(sp)
506: *sp=0;
507: else
508: break;
509: tp=strrchr(arg2,'\"');
510: if(!tp)
511: tp=arg2;
512: sp=strchr(tp,'#');
513: if(sp)
514: *sp=0;
515: truncsp(arg2);
516: if((define_str=(char **)REALLOC(define_str,sizeof(char *)*(defines+1)))
517: ==NULL) {
518: printf("Too many defines.\n");
519: exit(1); }
520: if((define_str[defines]=(char *)MALLOC(strlen(arg)+1))==NULL) {
521: printf("Too many defines.\n");
522: exit(1); }
523: if((define_val=(char **)REALLOC(define_val,sizeof(char *)*(defines+1)))
524: ==NULL) {
525: printf("Too many defines.\n");
526: exit(1); }
527: if((define_val[defines]=(char *)MALLOC(strlen(arg2)+1))==NULL) {
528: printf("Too many defines.\n");
529: exit(1); }
530: strcpy(define_str[defines],arg);
531: strcpy(define_val[defines],arg2);
532: defines++;
533: continue; }
534:
535: if(!stricmp(p,"!GLOBAL")) { /* declare global variables */
536: if(!(*arg)) break;
537: for(p=arg;*p && *p!='#';) {
538: sp=strchr(p,SP);
539: if(sp) *sp=0;
540: newvar(p);
541: if(!sp)
542: break;
543: p=sp+1;
544: while(*p && *p<=SP)
545: p++; }
546: continue; }
547:
548: if(!stricmp(p,"PATCH")) {
549: if(!(*arg)) break;
550: p=arg;
551: while(*p) {
552: while(*p && *p<=SP) p++;
553: tmp[0]=*p++;
554: tmp[1]=*p++;
555: tmp[2]=0;
556: if(!tmp[0])
557: break;
558: ch=ahtoul(tmp);
559: fputc(ch,out); }
560: continue; }
561:
562: if(!stricmp(p,"SHOW_VARS")) {
563: fputc(CS_VAR_INSTRUCTION,out);
564: fputc(SHOW_VARS,out);
565: continue; }
566:
567: if(!stricmp(p,"COMPARE_ARS")) {
568: if(!(*arg)) break;
569: strupr(arg);
570: ar=arstr(&i,arg,NULL);
571: fprintf(out,"%c%c",CS_COMPARE_ARS,(uchar)i);
572: fwrite(ar,i,1,out);
573: continue; }
574:
575: if(!stricmp(p,"CHKSYSPASS")) {
576: fprintf(out,"%c",CS_CHKSYSPASS);
577: continue; }
578: if(!stricmp(p,"INFO_SYSTEM")) {
579: fprintf(out,"%c",CS_INFO_SYSTEM);
580: continue; }
581: if(!stricmp(p,"INFO_SUBBOARD")) {
582: fprintf(out,"%c",CS_INFO_SUBBOARD);
583: continue; }
584: if(!stricmp(p,"INFO_DIRECTORY")) {
585: fprintf(out,"%c",CS_INFO_DIRECTORY);
586: continue; }
587: if(!stricmp(p,"INFO_VERSION")) {
588: fprintf(out,"%c",CS_INFO_VERSION);
589: continue; }
590: if(!stricmp(p,"INFO_USER")) {
591: fprintf(out,"%c",CS_INFO_USER);
592: continue; }
593: if(!stricmp(p,"INFO_XFER_POLICY")) {
594: fprintf(out,"%c",CS_INFO_XFER_POLICY);
595: continue; }
596: if(!stricmp(p,"LOGKEY")) {
597: fprintf(out,"%c",CS_LOGKEY);
598: continue; }
599: if(!stricmp(p,"LOGKEY_COMMA")) {
600: fprintf(out,"%c",CS_LOGKEY_COMMA);
601: continue; }
602: if(!stricmp(p,"LOGSTR")) {
603: fprintf(out,"%c",CS_LOGSTR);
604: continue; }
605:
606: if(!stricmp(p,"ONLINE")) {
607: fprintf(out,"%c%c",CS_ONE_MORE_BYTE,CS_ONLINE);
608: continue; }
609: if(!stricmp(p,"OFFLINE")) {
610: fprintf(out,"%c%c",CS_ONE_MORE_BYTE,CS_OFFLINE);
611: continue; }
612: if(!stricmp(p,"NEWUSER")) {
613: fprintf(out,"%c%c",CS_ONE_MORE_BYTE,CS_NEWUSER);
614: continue; }
615: if(!stricmp(p,"LOGON")) {
616: fprintf(out,"%c%c",CS_ONE_MORE_BYTE,CS_LOGON);
617: continue; }
618: if(!stricmp(p,"LOGOUT")) {
619: fprintf(out,"%c%c",CS_ONE_MORE_BYTE,CS_LOGOUT);
620: continue; }
621: if(!stricmp(p,"EXIT")) {
622: fprintf(out,"%c%c",CS_ONE_MORE_BYTE,CS_EXIT);
623: continue; }
624:
625: if(!stricmp(p,"USER_EVENT")) {
626: if(!(*arg))
627: break;
628: if((l=isvar(arg))!=0) {
629: fputc(CS_USE_INT_VAR,out);
630: fwrite(&l,4,1,out); // variable
631: fputc(2,out); // int offset
632: fputc(1,out); // int length
633: ch=0; } // place holder
634: else
635: ch=val(src,arg);
636: fprintf(out,"%c%c",CS_TWO_MORE_BYTES,CS_USER_EVENT);
637: fwrite(&ch,1,1,out);
638: continue; }
639:
640: if(!stricmp(p,"PUT_NODE")) {
641: fprintf(out,"%c",CS_PUT_NODE);
642: continue; }
643: if(!stricmp(p,"SYNC")) {
644: fprintf(out,"%c",CS_SYNC);
645: continue; }
646: if(!stricmp(p,"ASYNC")) {
647: fprintf(out,"%c",CS_ASYNC);
648: continue; }
649: if(!stricmp(p,"RIOSYNC")) {
650: fprintf(out,"%c",CS_RIOSYNC);
651: continue; }
652: if(!stricmp(p,"GETTIMELEFT")) {
653: fprintf(out,"%c",CS_GETTIMELEFT);
654: continue; }
655: if(!stricmp(p,"SAVELINE")) {
656: fprintf(out,"%c",CS_SAVELINE);
657: continue; }
658: if(!stricmp(p,"RESTORELINE")) {
659: fprintf(out,"%c",CS_RESTORELINE);
660: continue; }
661: if(!stricmp(p,"IF_TRUE") || !stricmp(p,"IF_EQUAL")) {
662: fprintf(out,"%c",CS_IF_TRUE);
663: continue; }
664: if(!stricmp(p,"IF_FALSE") || !stricmp(p,"IF_NOT_EQUAL")) {
665: fprintf(out,"%c",CS_IF_FALSE);
666: continue; }
667: if(!stricmp(p,"IF_GREATER")) {
668: fprintf(out,"%c",CS_IF_GREATER);
669: continue; }
670: if(!stricmp(p,"IF_GREATER_OR_EQUAL")
671: || !stricmp(p,"IF_EQUAL_OR_GREATER")) {
672: fprintf(out,"%c",CS_IF_GREATER_OR_EQUAL);
673: continue; }
674: if(!stricmp(p,"IF_LESS")) {
675: fprintf(out,"%c",CS_IF_LESS);
676: continue; }
677: if(!stricmp(p,"IF_LESS_OR_EQUAL")
678: || !stricmp(p,"IF_EQUAL_OR_LESS")) {
679: fprintf(out,"%c",CS_IF_LESS_OR_EQUAL);
680: continue; }
681: if(!stricmp(p,"ENDIF") || !stricmp(p,"END_IF")) {
682: fprintf(out,"%c",CS_ENDIF);
683: continue; }
684: if(!stricmp(p,"ELSE")) {
685: fprintf(out,"%c",CS_ELSE);
686: continue; }
687: if(p[0]==':') { /* :label */
688: p++;
689: sp=strchr(p,SP);
690: if(sp)
691: *sp=0;
692: for(i=0;i<labels;i++)
693: if(!stricmp(label_name[i],p))
694: break;
695: if(i<labels) {
696: printf("SYNTAX ERROR (duplicate label name):\n");
697: printf(linestr,src,line,p);
698: exit(1); }
699: if((label_name=(char **)REALLOC(label_name,sizeof(char *)*(labels+1)))
700: ==NULL) {
701: printf("Too many labels.\n");
702: exit(1); }
703: if((label_indx=(uint *)REALLOC(label_indx,sizeof(int)*(labels+1)))
704: ==NULL) {
705: printf("Too many labels.\n");
706: exit(1); }
707: if((label_name[labels]=(char *)MALLOC(strlen(p)+1))==NULL) {
708: printf("Too many labels.\n");
709: exit(1); }
710: strcpy(label_name[labels],p);
711: label_indx[labels]=ftell(out);
712: labels++;
713: continue; }
714: if(!stricmp(p,"GOTO")) { /* goto */
715: if(!(*arg)) break;
716: sp=strchr(arg,SP);
717: if(sp)
718: *sp=0;
719: if((goto_label=(char **)REALLOC(goto_label,sizeof(char *)*(gotos+1)))
720: ==NULL) {
721: printf("Too many gotos.\n");
722: exit(1); }
723: if((goto_file=(char **)REALLOC(goto_file,sizeof(char *)*(gotos+1)))
724: ==NULL) {
725: printf("Too many gotos.\n");
726: exit(1); }
727: if((goto_indx=(uint *)REALLOC(goto_indx,sizeof(int)*(gotos+1)))
728: ==NULL) {
729: printf("Too many gotos.\n");
730: exit(1); }
731: if((goto_line=(uint *)REALLOC(goto_line,sizeof(int)*(gotos+1)))
732: ==NULL) {
733: printf("Too many gotos.\n");
734: exit(1); }
735: if((goto_label[gotos]=(char *)MALLOC(strlen(arg)+1))==NULL) {
736: printf("Too many gotos.\n");
737: exit(1); }
738: if((goto_file[gotos]=(char *)MALLOC(strlen(str)+1))==NULL) {
739: printf("Too many gotos.\n");
740: exit(1); }
741: strcpy(goto_label[gotos],arg);
742: strcpy(goto_file[gotos],str);
743: goto_indx[gotos]=ftell(out);
744: goto_line[gotos]=line;
745: gotos++;
746: fprintf(out,"%c%c%c",CS_GOTO,0xff,0xff);
747: continue; }
748: if(!stricmp(p,"CALL")) { /* call */
749: if(!(*arg)) break;
750: sp=strchr(arg,SP);
751: if(sp)
752: *sp=0;
753: if((call_label=(char **)REALLOC(call_label,sizeof(char *)*(calls+1)))
754: ==NULL) {
755: printf("Too many calls.\n");
756: exit(1); }
757: if((call_file=(char **)REALLOC(call_file,sizeof(char *)*(calls+1)))
758: ==NULL) {
759: printf("Too many calls.\n");
760: exit(1); }
761: if((call_indx=(uint *)REALLOC(call_indx,sizeof(int)*(calls+1)))
762: ==NULL) {
763: printf("Too many calls.\n");
764: exit(1); }
765: if((call_line=(uint *)REALLOC(call_line,sizeof(int)*(calls+1)))
766: ==NULL) {
767: printf("Too many calls.\n");
768: exit(1); }
769: if((call_label[calls]=(char *)MALLOC(strlen(arg)+1))==NULL) {
770: printf("Too many calls.\n");
771: exit(1); }
772: if((call_file[calls]=(char *)MALLOC(strlen(src)+1))==NULL) {
773: printf("Too many calls.\n");
774: exit(1); }
775:
776: strcpy(call_label[calls],arg);
777: strcpy(call_file[calls],src);
778: call_indx[calls]=ftell(out);
779: call_line[calls]=line;
780: calls++;
781: fprintf(out,"%c%c%c",CS_CALL,0xff,0xff);
782: continue; }
783:
784: if(!stricmp(p,"RETURN")) {
785: fprintf(out,"%c",CS_RETURN);
786: continue; }
787: if(!stricmp(p,"CMD_HOME")) {
788: fprintf(out,"%c",CS_CMD_HOME);
789: continue; }
790: if(!stricmp(p,"CMDKEY")) {
791: if(!(*arg)) break;
792: if(!stricmp(arg,"DIGIT"))
793: ch=CS_DIGIT;
794: else if(!stricmp(arg,"EDIGIT"))
795: ch=CS_EDIGIT;
796: else
797: ch=toupper(*arg);
798: if(ch=='/')
799: ch=*(arg+1)|0x80; /* high bit indicates slash required */
800: else if(ch=='^' && *(arg+1)>=0x40)
801: ch=*(arg+1)-0x40; /* ctrl char */
802: else if(ch=='\\')
803: ch=cesc(*(arg+1));
804: else if(ch=='\'')
805: ch=*(arg+1);
806: fprintf(out,"%c%c",CS_CMDKEY,ch);
807: continue; }
808: if(!stricmp(p,"CMDCHAR")) {
809: if(!(*arg)) break;
810: fprintf(out,"%c%c",CS_CMDKEY,*arg);
811: continue; }
812: if(!stricmp(p,"SETLOGIC") || !stricmp(p,"SET_LOGIC")) {
813: if(!(*arg)) break;
814: if(!stricmp(arg,"TRUE") || !stricmp(arg,"EQUAL"))
815: ch=LOGIC_TRUE;
816: else if(!stricmp(arg,"GREATER"))
817: ch=LOGIC_GREATER;
818: else if(!stricmp(arg,"LESS"))
819: ch=LOGIC_LESS;
820: else
821: ch=LOGIC_FALSE;
822: fprintf(out,"%c%c",CS_SETLOGIC,ch);
823: continue; }
824:
825: if(!stricmp(p,"DEFINE_STR_VAR") || !stricmp(p,"STR")) {
826: if(!(*arg)) break;
827: for(p=arg;*p && *p!='#';) {
828: sp=strchr(p,SP);
829: if(sp) *sp=0;
830: fputc(CS_VAR_INSTRUCTION,out);
831: fputc(DEFINE_STR_VAR,out);
832: newvar(p);
833: writecrc(src,p);
834: if(!sp)
835: break;
836: p=sp+1;
837: while(*p && *p<=SP)
838: p++; }
839: continue; }
840: if(!stricmp(p,"DEFINE_INT_VAR") || !stricmp(p,"INT")) {
841: if(!(*arg)) break;
842: for(p=arg;*p && *p!='#';) {
843: sp=strchr(p,SP);
844: if(sp) *sp=0;
845: fputc(CS_VAR_INSTRUCTION,out);
846: fputc(DEFINE_INT_VAR,out);
847: newvar(p);
848: writecrc(src,p);
849: if(!sp)
850: break;
851: p=sp+1;
852: while(*p && *p<=SP)
853: p++; }
854: continue; }
855: if(!stricmp(p,"DEFINE_GLOBAL_STR_VAR") || !stricmp(p,"GLOBAL_STR")) {
856: if(!(*arg)) break;
857: for(p=arg;*p && *p!='#';) {
858: sp=strchr(p,SP);
859: if(sp) *sp=0;
860: fputc(CS_VAR_INSTRUCTION,out);
861: fputc(DEFINE_GLOBAL_STR_VAR,out);
862: newvar(p);
863: writecrc(src,p);
864: if(!sp)
865: break;
866: p=sp+1;
867: while(*p && *p<=SP)
868: p++; }
869: continue; }
870: if(!stricmp(p,"DEFINE_GLOBAL_INT_VAR") || !stricmp(p,"GLOBAL_INT")) {
871: if(!(*arg)) break;
872: for(p=arg;*p && *p!='#';) {
873: sp=strchr(p,SP);
874: if(sp) *sp=0;
875: fputc(CS_VAR_INSTRUCTION,out);
876: fputc(DEFINE_GLOBAL_INT_VAR,out);
877: newvar(p);
878: writecrc(src,p);
879: if(!sp)
880: break;
881: p=sp+1;
882: while(*p && *p<=SP)
883: p++; }
884: continue; }
885:
886: if(!stricmp(p,"LOGIN")) {
887: if(!(*arg)) break;
888: fputc(CS_STR_FUNCTION,out);
889: fputc(CS_LOGIN,out);
890: writecstr(arg);
891: continue; }
892:
893: if(!stricmp(p,"LOAD_TEXT")) {
894: if(!(*arg)) break;
895: fputc(CS_STR_FUNCTION,out);
896: fputc(CS_LOAD_TEXT,out);
897: writestr(arg);
898: continue; }
899:
900: if(!stricmp(p,"SET_STR_VAR")
901: || (!stricmp(p,"SET") && strchr(arg,'"'))) {
902: if(!(*arg)) break;
903: fputc(CS_VAR_INSTRUCTION,out);
904: fputc(SET_STR_VAR,out);
905: p=strchr(arg,SP);
906: if(!p)
907: break;
908: *p=0;
909: writecrc(src,arg);
910: writecstr(arg2);
911: continue; }
912: if(!stricmp(p,"CAT_STR_VAR")
913: || (!stricmp(p,"STRCAT") && strchr(arg,'"'))) {
914: fputc(CS_VAR_INSTRUCTION,out);
915: fputc(CAT_STR_VAR,out);
916: p=strchr(arg,SP);
917: if(!p)
918: break;
919: *p=0;
920: writecrc(src,arg);
921: writecstr(arg2);
922: continue; }
923: if((!stricmp(p,"STRSTR") || !stricmp(p,"COMPARE_SUBSTR"))
924: && strchr(arg,'"')) {
925: fputc(CS_VAR_INSTRUCTION,out);
926: fputc(STRSTR_VAR,out);
927: p=strchr(arg,SP);
928: if(!p)
929: break;
930: *p=0;
931: writecrc(src,arg);
932: writecstr(arg2);
933: continue; }
934: if(!stricmp(p,"STRSTR") || !stricmp(p,"COMPARE_SUBSTR")) {
935: if(!(*arg)) break;
936: fputc(CS_VAR_INSTRUCTION,out);
937: fputc(STRSTR_VARS,out);
938: p=strchr(arg,SP);
939: if(!p)
940: break;
941: *p=0;
942: writecrc(src,arg);
943: writecrc(src,arg2);
944: continue; }
945: if(!stricmp(p,"COPY_FIRST_CHAR")) {
946: fputc(CS_VAR_INSTRUCTION,out);
947: fputc(COPY_FIRST_CHAR,out);
948: writecrc(src,arg);
949: writecrc(src,arg2);
950: continue; }
951: if(!stricmp(p,"COMPARE_FIRST_CHAR")) {
952: fputc(CS_VAR_INSTRUCTION,out);
953: fputc(COMPARE_FIRST_CHAR,out);
954: writecrc(src,arg);
955: fputc((uchar)val(src,arg2),out);
956: continue; }
957: if(!stricmp(p,"CAT_STR_VARS") || !stricmp(p,"STRCAT")) {
958: if(!(*arg)) break;
959: fputc(CS_VAR_INSTRUCTION,out);
960: fputc(CAT_STR_VARS,out);
961: p=strchr(arg,SP);
962: if(!p)
963: break;
964: *p=0;
965: writecrc(src,arg);
966: writecrc(src,arg2);
967: continue; }
968: if(!stricmp(p,"FORMAT") || !stricmp(p,"SPRINTF")) {
969: if(!(*arg)) break;
970: fputc(CS_VAR_INSTRUCTION,out);
971: fputc(FORMAT_STR_VAR,out);
972: p=strchr(arg,SP);
973: if(!p)
974: break;
975: *p=0;
976: writecrc(src,arg); /* Write destination variable */
977: p++;
978: while(*p && *p<=SP) p++;
979: arg=p;
980: p=strrchr(arg,'"');
981: if(!p)
982: break;
983: *p=0;
984: p++;
985: while(*p && *p<=SP) p++;
986: writecstr(arg); /* Write string */
987: l=ftell(out);
988: fputc(0,out); /* Write total number of args */
989: i=0;
990: while(p && *p) {
991: arg=p;
992: p=strchr(arg,SP);
993: if(p) {
994: *p=0;
995: p++; }
996: writecrc(src,arg);
997: i++; }
998: fseek(out,l,SEEK_SET);
999: fputc((char)i,out);
1000: fseek(out,i*4,SEEK_CUR);
1001: continue; }
1002:
1003: if(!stricmp(p,"STRFTIME") || !stricmp(p,"FTIME_STR")) {
1004: if(!(*arg) || !(*arg2) || !(*arg3)) break;
1005: fputc(CS_VAR_INSTRUCTION,out);
1006: fputc(FORMAT_TIME_STR,out);
1007: p=strchr(arg,SP);
1008: if(!p)
1009: break;
1010: *p=0;
1011: writecrc(src,arg); /* Write destination variable */
1012: p++;
1013: while(*p && *p<=SP) p++;
1014: arg=p;
1015: p=strrchr(arg,'"');
1016: if(!p)
1017: break;
1018: *p=0;
1019: writecstr(arg); /* Write string */
1020: p++;
1021: while(*p && *p<=SP) p++;
1022: writecrc(src,p);
1023: continue; }
1024:
1025: if(!stricmp(p,"TIME_STR")) {
1026: if(!(*arg)) break;
1027: fputc(CS_VAR_INSTRUCTION,out);
1028: fputc(TIME_STR,out);
1029: p=strchr(arg,SP);
1030: if(!p)
1031: break;
1032: *p=0;
1033: writecrc(src,arg);
1034: writecrc(src,arg2);
1035: continue; }
1036:
1037: if(!stricmp(p,"DATE_STR")) {
1038: if(!(*arg)) break;
1039: fputc(CS_VAR_INSTRUCTION,out);
1040: fputc(DATE_STR,out);
1041: p=strchr(arg,SP);
1042: if(!p)
1043: break;
1044: *p=0;
1045: writecrc(src,arg);
1046: writecrc(src,arg2);
1047: continue; }
1048:
1049: if(!stricmp(p,"SECOND_STR")) {
1050: if(!(*arg)) break;
1051: fputc(CS_VAR_INSTRUCTION,out);
1052: fputc(SECOND_STR,out);
1053: p=strchr(arg,SP);
1054: if(!p)
1055: break;
1056: *p=0;
1057: writecrc(src,arg);
1058: writecrc(src,arg2);
1059: continue; }
1060:
1061:
1062: if(!stricmp(p,"SET_INT_VAR")
1063: || (!stricmp(p,"SET") && *arg2!='"')) {
1064: if(!(*arg)) break;
1065: fputc(CS_VAR_INSTRUCTION,out);
1066: fputc(SET_INT_VAR,out);
1067: p=strchr(arg,SP);
1068: if(!p)
1069: break;
1070: *p=0;
1071: writecrc(src,arg);
1072: l=val(src,arg2);
1073: fwrite(&l,4,1,out);
1074: continue; }
1075:
1076: if(!stricmp(p,"COMPARE_STR_VAR") ||
1077: (!stricmp(p,"COMPARE") && *arg2=='"')) {
1078: if(!(*arg)) break;
1079: fputc(CS_VAR_INSTRUCTION,out);
1080: fputc(COMPARE_STR_VAR,out);
1081: p=strchr(arg,SP);
1082: if(!p)
1083: break;
1084: *p=0;
1085: writecrc(src,arg);
1086: writecstr(arg2);
1087: continue; }
1088:
1089: if(!stricmp(p,"COMPARE_STRN_VAR") ||
1090: ((!stricmp(p,"STRNCMP") || !stricmp(p,"COMPARE_STRN"))
1091: && *arg3 && strchr(arg3,'"'))) {
1092: if((l=isvar(arg))!=0) {
1093: fputc(CS_USE_INT_VAR,out);
1094: fwrite(&l,4,1,out); // variable
1095: fputc(2,out); // int offset
1096: fputc(1,out); // int length
1097: i=0; } // place holder
1098: else
1099: i=val(src,arg);
1100: fputc(CS_VAR_INSTRUCTION,out);
1101: fputc(STRNCMP_VAR,out);
1102: fwrite(&i,1,1,out); /* Length */
1103: p=strchr(arg2,SP);
1104: if(!p)
1105: break;
1106: *p=0;
1107: p++;
1108: while(*p && *p<=SP) p++;
1109: writecrc(src,arg2);
1110: writecstr(p);
1111: continue; }
1112:
1113: if(!stricmp(p,"COMPARE_STRN_VARS") || !stricmp(p,"STRNCMP")
1114: || !stricmp(p,"COMPARE_STRN")) {
1115: if(!(*arg) || !(*arg2) || !(*arg3))
1116: break;
1117: if((l=isvar(arg))!=0) {
1118: fputc(CS_USE_INT_VAR,out);
1119: fwrite(&l,4,1,out); // variable
1120: fputc(2,out); // int offset
1121: fputc(1,out); // int length
1122: i=0; } // place holder
1123: else
1124: i=val(src,arg);
1125: fputc(CS_VAR_INSTRUCTION,out);
1126: fputc(STRNCMP_VARS,out);
1127:
1128: fwrite(&i,1,1,out); /* Length */
1129: p=strchr(arg2,SP);
1130: if(!p)
1131: break;
1132: *p=0;
1133: p++;
1134: while(*p && *p<=SP) p++;
1135: writecrc(src,arg2);
1136: writecrc(src,p);
1137: continue; }
1138:
1139: if(!stricmp(p,"COMPARE_INT_VAR") ||
1140: (!stricmp(p,"COMPARE")
1141: && (isdigit(*arg2) || atol(arg2) || *arg2=='\'' || *arg2=='.'))) {
1142: if(!(*arg)) break;
1143:
1144: fputc(CS_VAR_INSTRUCTION,out);
1145: fputc(COMPARE_INT_VAR,out);
1146: p=strchr(arg,SP);
1147: if(!p)
1148: break;
1149: *p=0;
1150: writecrc(src,arg);
1151: l=val(src,arg2);
1152: fwrite(&l,4,1,out);
1153: continue; }
1154:
1155: if(!stricmp(p,"COMPARE")) {
1156: if(!(*arg)) break;
1157: fputc(CS_VAR_INSTRUCTION,out);
1158: fputc(COMPARE_VARS,out);
1159: p=strchr(arg,SP);
1160: if(!p)
1161: break;
1162: *p=0;
1163: writecrc(src,arg);
1164: writecrc(src,arg2);
1165: continue; }
1166: if(!stricmp(p,"COPY")) {
1167: if(!(*arg)) break;
1168: fputc(CS_VAR_INSTRUCTION,out);
1169: fputc(COPY_VAR,out);
1170: p=strchr(arg,SP);
1171: if(!p)
1172: break;
1173: *p=0;
1174: writecrc(src,arg);
1175: writecrc(src,arg2);
1176: continue; }
1177: if(!stricmp(p,"SWAP")) {
1178: if(!(*arg)) break;
1179: fputc(CS_VAR_INSTRUCTION,out);
1180: fputc(SWAP_VARS,out);
1181: p=strchr(arg,SP);
1182: if(!p)
1183: break;
1184: *p=0;
1185: writecrc(src,arg);
1186: writecrc(src,arg2);
1187: continue; }
1188:
1189: if(!stricmp(p,"TIME")) {
1190: if(!(*arg)) break;
1191: fputc(CS_VAR_INSTRUCTION,out);
1192: fputc(TIME_INT_VAR,out);
1193: writecrc(src,arg);
1194: continue; }
1195:
1196: if(!stricmp(p,"DATE_INT")) {
1197: if(!(*arg)) break;
1198: fputc(CS_VAR_INSTRUCTION,out);
1199: fputc(DATE_STR_TO_INT,out);
1200: p=strchr(arg,SP);
1201: if(!p)
1202: break;
1203: *p=0;
1204: writecrc(src,arg);
1205: writecrc(src,arg2);
1206: continue; }
1207:
1208: if(!stricmp(p,"CRC16")) {
1209: if(!(*arg)) break;
1210: fputc(CS_VAR_INSTRUCTION,out);
1211: fputc(CRC16_TO_INT,out);
1212: p=strchr(arg,SP);
1213: if(!p)
1214: break;
1215: *p=0;
1216: writecrc(src,arg);
1217: writecrc(src,arg2);
1218: continue; }
1219:
1220: if(!stricmp(p,"CRC32")) {
1221: if(!(*arg)) break;
1222: fputc(CS_VAR_INSTRUCTION,out);
1223: fputc(CRC32_TO_INT,out);
1224: p=strchr(arg,SP);
1225: if(!p)
1226: break;
1227: *p=0;
1228: writecrc(src,arg);
1229: writecrc(src,arg2);
1230: continue; }
1231:
1232: if(!stricmp(p,"CHKSUM")) {
1233: if(!(*arg)) break;
1234: fputc(CS_VAR_INSTRUCTION,out);
1235: fputc(CHKSUM_TO_INT,out);
1236: p=strchr(arg,SP);
1237: if(!p)
1238: break;
1239: *p=0;
1240: writecrc(src,arg);
1241: writecrc(src,arg2);
1242: continue; }
1243:
1244: if(!stricmp(p,"ADD_INT_VAR")
1245: || (!stricmp(p,"ADD")
1246: && (isdigit(*arg2) || atol(arg2) || *arg2=='\'' || *arg2=='.'))) {
1247: if(!(*arg)) break;
1248: fputc(CS_VAR_INSTRUCTION,out);
1249: fputc(ADD_INT_VAR,out);
1250: p=strchr(arg,SP);
1251: if(!p)
1252: break;
1253: *p=0;
1254: writecrc(src,arg);
1255: l=val(src,arg2);
1256: if(!l)
1257: break;
1258: fwrite(&l,4,1,out);
1259: continue; }
1260: if(!stricmp(p,"ADD_INT_VARS") || !stricmp(p,"ADD")) {
1261: if(!(*arg)) break;
1262: fputc(CS_VAR_INSTRUCTION,out);
1263: fputc(ADD_INT_VARS,out);
1264: p=strchr(arg,SP);
1265: if(!p)
1266: break;
1267: *p=0;
1268: writecrc(src,arg);
1269: writecrc(src,arg2);
1270: continue; }
1271:
1272: if(!stricmp(p,"SUB_INT_VAR")
1273: || (!stricmp(p,"SUB")
1274: && (isdigit(*arg2) || atol(arg2) || *arg2=='\'' || *arg2=='.'))) {
1275: if(!(*arg)) break;
1276: fputc(CS_VAR_INSTRUCTION,out);
1277: fputc(SUB_INT_VAR,out);
1278: p=strchr(arg,SP);
1279: if(!p)
1280: break;
1281: *p=0;
1282: writecrc(src,arg);
1283: l=val(src,arg2);
1284: if(!l)
1285: break;
1286: fwrite(&l,4,1,out);
1287: continue; }
1288: if(!stricmp(p,"SUB_INT_VARS") || !stricmp(p,"SUB")) {
1289: if(!(*arg)) break;
1290: fputc(CS_VAR_INSTRUCTION,out);
1291: fputc(SUB_INT_VARS,out);
1292: p=strchr(arg,SP);
1293: if(!p)
1294: break;
1295: *p=0;
1296: writecrc(src,arg);
1297: writecrc(src,arg2);
1298: continue; }
1299:
1300: if(!stricmp(p,"MUL_INT_VAR")
1301: || (!stricmp(p,"MUL")
1302: && (isdigit(*arg2) || atol(arg2) || *arg2=='\'' || *arg2=='.'))) {
1303: if(!(*arg)) break;
1304: fputc(CS_VAR_INSTRUCTION,out);
1305: fputc(MUL_INT_VAR,out);
1306: p=strchr(arg,SP);
1307: if(!p)
1308: break;
1309: *p=0;
1310: writecrc(src,arg);
1311: l=val(src,arg2);
1312: if(!l)
1313: break;
1314: fwrite(&l,4,1,out);
1315: continue; }
1316: if(!stricmp(p,"MUL_INT_VARS") || !stricmp(p,"MUL")) {
1317: if(!(*arg)) break;
1318: fputc(CS_VAR_INSTRUCTION,out);
1319: fputc(MUL_INT_VARS,out);
1320: p=strchr(arg,SP);
1321: if(!p)
1322: break;
1323: *p=0;
1324: writecrc(src,arg);
1325: writecrc(src,arg2);
1326: continue; }
1327:
1328: if(!stricmp(p,"DIV_INT_VAR")
1329: || (!stricmp(p,"DIV")
1330: && (isdigit(*arg2) || atol(arg2) || *arg2=='\'' || *arg2=='.'))) {
1331: if(!(*arg)) break;
1332: fputc(CS_VAR_INSTRUCTION,out);
1333: fputc(DIV_INT_VAR,out);
1334: p=strchr(arg,SP);
1335: if(!p)
1336: break;
1337: *p=0;
1338: writecrc(src,arg);
1339: l=val(src,arg2);
1340: if(!l)
1341: break;
1342: fwrite(&l,4,1,out);
1343: continue; }
1344: if(!stricmp(p,"DIV_INT_VARS") || !stricmp(p,"DIV")) {
1345: if(!(*arg)) break;
1346: fputc(CS_VAR_INSTRUCTION,out);
1347: fputc(DIV_INT_VARS,out);
1348: p=strchr(arg,SP);
1349: if(!p)
1350: break;
1351: *p=0;
1352: writecrc(src,arg);
1353: writecrc(src,arg2);
1354: continue; }
1355:
1356: if(!stricmp(p,"MOD_INT_VAR")
1357: || (!stricmp(p,"MOD")
1358: && (isdigit(*arg2) || atol(arg2) || *arg2=='\'' || *arg2=='.'))) {
1359: if(!(*arg)) break;
1360: fputc(CS_VAR_INSTRUCTION,out);
1361: fputc(MOD_INT_VAR,out);
1362: p=strchr(arg,SP);
1363: if(!p)
1364: break;
1365: *p=0;
1366: writecrc(src,arg);
1367: l=val(src,arg2);
1368: if(!l)
1369: break;
1370: fwrite(&l,4,1,out);
1371: continue; }
1372: if(!stricmp(p,"MOD_INT_VARS") || !stricmp(p,"MOD")) {
1373: if(!(*arg)) break;
1374: fputc(CS_VAR_INSTRUCTION,out);
1375: fputc(MOD_INT_VARS,out);
1376: p=strchr(arg,SP);
1377: if(!p)
1378: break;
1379: *p=0;
1380: writecrc(src,arg);
1381: writecrc(src,arg2);
1382: continue; }
1383:
1384: if(!stricmp(p,"AND_INT_VAR")
1385: || (!stricmp(p,"AND")
1386: && (isdigit(*arg2) || atol(arg2) || *arg2=='\'' || *arg2=='.'))) {
1387: if(!(*arg)) break;
1388: fputc(CS_VAR_INSTRUCTION,out);
1389: fputc(AND_INT_VAR,out);
1390: p=strchr(arg,SP);
1391: if(!p)
1392: break;
1393: *p=0;
1394: writecrc(src,arg);
1395: l=val(src,arg2);
1396: fwrite(&l,4,1,out);
1397: continue; }
1398: if(!stricmp(p,"AND_INT_VARS") || !stricmp(p,"AND")) {
1399: if(!(*arg)) break;
1400: fputc(CS_VAR_INSTRUCTION,out);
1401: fputc(AND_INT_VARS,out);
1402: p=strchr(arg,SP);
1403: if(!p)
1404: break;
1405: *p=0;
1406: writecrc(src,arg);
1407: writecrc(src,arg2);
1408: continue; }
1409:
1410: if(!stricmp(p,"OR_INT_VAR")
1411: || (!stricmp(p,"OR")
1412: && (isdigit(*arg2) || atol(arg2) || *arg2=='\'' || *arg2=='.'))) {
1413: if(!(*arg)) break;
1414: fputc(CS_VAR_INSTRUCTION,out);
1415: fputc(OR_INT_VAR,out);
1416: p=strchr(arg,SP);
1417: if(!p)
1418: break;
1419: *p=0;
1420: writecrc(src,arg);
1421: l=val(src,arg2);
1422: fwrite(&l,4,1,out);
1423: continue; }
1424: if(!stricmp(p,"OR_INT_VARS") || !stricmp(p,"OR")) {
1425: if(!(*arg)) break;
1426: fputc(CS_VAR_INSTRUCTION,out);
1427: fputc(OR_INT_VARS,out);
1428: p=strchr(arg,SP);
1429: if(!p)
1430: break;
1431: *p=0;
1432: writecrc(src,arg);
1433: writecrc(src,arg2);
1434: continue; }
1435:
1436: if(!stricmp(p,"NOT_INT_VAR")
1437: || (!stricmp(p,"NOT")
1438: && (isdigit(*arg2) || atol(arg2) || *arg2=='\'' || *arg2=='.'))) {
1439: if(!(*arg)) break;
1440: fputc(CS_VAR_INSTRUCTION,out);
1441: fputc(NOT_INT_VAR,out);
1442: p=strchr(arg,SP);
1443: if(!p)
1444: break;
1445: *p=0;
1446: writecrc(src,arg);
1447: l=val(src,arg2);
1448: fwrite(&l,4,1,out);
1449: continue; }
1450: if(!stricmp(p,"NOT_INT_VARS") || !stricmp(p,"NOT")) {
1451: if(!(*arg)) break;
1452: fputc(CS_VAR_INSTRUCTION,out);
1453: fputc(NOT_INT_VARS,out);
1454: p=strchr(arg,SP);
1455: if(!p)
1456: break;
1457: *p=0;
1458: writecrc(src,arg);
1459: writecrc(src,arg2);
1460: continue; }
1461:
1462: if(!stricmp(p,"XOR_INT_VAR")
1463: || (!stricmp(p,"XOR")
1464: && (isdigit(*arg2) || atol(arg2) || *arg2=='\'' || *arg2=='.'))) {
1465: if(!(*arg)) break;
1466: fputc(CS_VAR_INSTRUCTION,out);
1467: fputc(XOR_INT_VAR,out);
1468: p=strchr(arg,SP);
1469: if(!p)
1470: break;
1471: *p=0;
1472: writecrc(src,arg);
1473: l=val(src,arg2);
1474: fwrite(&l,4,1,out);
1475: continue; }
1476: if(!stricmp(p,"XOR_INT_VARS") || !stricmp(p,"XOR")) {
1477: if(!(*arg)) break;
1478: fputc(CS_VAR_INSTRUCTION,out);
1479: fputc(XOR_INT_VARS,out);
1480: p=strchr(arg,SP);
1481: if(!p)
1482: break;
1483: *p=0;
1484: writecrc(src,arg);
1485: writecrc(src,arg2);
1486: continue; }
1487:
1488: if(!stricmp(p,"RANDOM_INT_VAR") || !stricmp(p,"RANDOM")) {
1489: if(!(*arg)) break;
1490: if((l=isvar(arg2))!=0) {
1491: fputc(CS_USE_INT_VAR,out);
1492: fwrite(&l,4,1,out); // variable
1493: fputc(6,out); // int offset
1494: fputc(4,out); // int length
1495: l=0; } // place holder
1496: else
1497: l=val(src,arg2);
1498: fputc(CS_VAR_INSTRUCTION,out);
1499: fputc(RANDOM_INT_VAR,out);
1500: p=strchr(arg,SP);
1501: if(!p)
1502: break;
1503: *p=0;
1504: writecrc(src,arg);
1505: fwrite(&l,4,1,out);
1506: continue; }
1507:
1508: if(!stricmp(p,"SWITCH")) {
1509: if(!(*arg)) break;
1510: fputc(CS_SWITCH,out);
1511: writecrc(src,arg);
1512: continue; }
1513: if(!stricmp(p,"END_SWITCH")) {
1514: fputc(CS_END_SWITCH,out);
1515: continue; }
1516: if(!stricmp(p,"CASE")) {
1517: if(!(*arg)) break;
1518: fputc(CS_CASE,out);
1519: l=val(src,arg);
1520: fwrite(&l,4,1,out);
1521: continue; }
1522: if(!stricmp(p,"DEFAULT")) {
1523: fputc(CS_DEFAULT,out);
1524: continue; }
1525: if(!stricmp(p,"END_CASE")) {
1526: fputc(CS_END_CASE,out);
1527: continue; }
1528:
1529: if(!stricmp(p,"PRINT") && !strchr(arg,'"') && !strchr(arg,'\\')
1530: && !strchr(arg,SP)) {
1531: if(!(*arg)) break;
1532: fputc(CS_VAR_INSTRUCTION,out);
1533: fputc(PRINT_VAR,out);
1534: writecrc(src,arg);
1535: continue; }
1536:
1537: if(!stricmp(p,"PRINTF")) {
1538: if(!(*arg)) break;
1539: fputc(CS_VAR_INSTRUCTION,out);
1540: fputc(VAR_PRINTF,out);
1541: p=strrchr(arg,'"');
1542: if(!p)
1543: break;
1544: *p=0;
1545: p++;
1546: while(*p && *p<=SP) p++;
1547: writecstr(arg); /* Write string */
1548: l=ftell(out);
1549: fputc(0,out); /* Write total number of args */
1550: i=0;
1551: while(p && *p) {
1552: arg=p;
1553: p=strchr(arg,SP);
1554: if(p) {
1555: *p=0;
1556: p++; }
1557: writecrc(src,arg);
1558: i++; }
1559: fseek(out,l,SEEK_SET);
1560: fputc((char)i,out);
1561: fseek(out,i*4,SEEK_CUR);
1562: continue; }
1563:
1564: if(!stricmp(p,"FOPEN")) {
1565: if(!(*arg) || !(*arg2) || !(*arg3)) break;
1566: if((l=isvar(arg2))!=0) {
1567: fputc(CS_USE_INT_VAR,out);
1568: fwrite(&l,4,1,out); // variable
1569: fputc(6,out); // int offset
1570: fputc(2,out); // int length
1571: i=0; } // place holder
1572: else
1573: i=val(src,arg2);
1574:
1575: fputc(CS_FIO_FUNCTION,out);
1576: if(*arg3=='"')
1577: fputc(FIO_OPEN,out);
1578: else
1579: fputc(FIO_OPEN_VAR,out);
1580: p=strchr(arg,SP);
1581: if(!p)
1582: break;
1583: *p=0;
1584: writecrc(src,arg);
1585: p=strchr(arg2,SP);
1586: if(!p)
1587: break;
1588: *p=0;
1589: p++;
1590: fwrite(&i,2,1,out);
1591: while(*p && *p<=SP) p++;
1592: if(*p=='"')
1593: writestr(p);
1594: else
1595: writecrc(src,p);
1596: continue; }
1597: if(!stricmp(p,"FCLOSE")) {
1598: if(!(*arg)) break;
1599: fputc(CS_FIO_FUNCTION,out);
1600: fputc(FIO_CLOSE,out);
1601: writecrc(src,arg);
1602: continue; }
1603: if(!stricmp(p,"FFLUSH")) {
1604: if(!(*arg)) break;
1605: fputc(CS_FIO_FUNCTION,out);
1606: fputc(FIO_FLUSH,out);
1607: writecrc(src,arg);
1608: continue; }
1609: if(!stricmp(p,"FREAD")) {
1610: if(!(*arg)) break;
1611:
1612: fputc(CS_FIO_FUNCTION,out);
1613: if(!(*arg3) || isdigit(*arg3) || atoi(arg3))
1614: fputc(FIO_READ,out);
1615: else
1616: fputc(FIO_READ_VAR,out);
1617: p=strchr(arg,SP);
1618: if(!p)
1619: break;
1620: *p=0;
1621: writecrc(src,arg); /* File handle */
1622: p=strchr(arg2,SP);
1623: if(p)
1624: *p=0;
1625: writecrc(src,arg2); /* Variable */
1626: if(isdigit(*arg3))
1627: i=val(src,arg3); /* Length */
1628: else
1629: i=0;
1630: if(i || !(*arg3))
1631: fwrite(&i,2,1,out);
1632: else
1633: writecrc(src,arg3);
1634: continue; }
1635: if(!stricmp(p,"FWRITE")) {
1636: if(!(*arg)) break;
1637: fputc(CS_FIO_FUNCTION,out);
1638: if(!(*arg3) || isdigit(*arg3) || atoi(arg3))
1639: fputc(FIO_WRITE,out);
1640: else
1641: fputc(FIO_WRITE_VAR,out);
1642: p=strchr(arg,SP);
1643: if(!p)
1644: break;
1645: *p=0;
1646: writecrc(src,arg); /* File handle */
1647: p=strchr(arg2,SP);
1648: if(p)
1649: *p=0;
1650: writecrc(src,arg2); /* Variable */
1651: if(isdigit(*arg3))
1652: i=val(src,arg3); /* Length */
1653: else
1654: i=0;
1655: if(i || !(*arg3))
1656: fwrite(&i,2,1,out);
1657: else
1658: writecrc(src,arg3);
1659: continue; }
1660: if(!stricmp(p,"FGET_LENGTH")
1661: || !stricmp(p,"FGETLENGTH")
1662: || !stricmp(p,"GETFLENGTH")) {
1663: if(!(*arg) || !(*arg2)) break;
1664: fputc(CS_FIO_FUNCTION,out);
1665: fputc(FIO_GET_LENGTH,out);
1666: p=strchr(arg,SP);
1667: if(!p)
1668: break;
1669: *p=0;
1670: writecrc(src,arg); /* File handle */
1671: writecrc(src,arg2); /* Variable */
1672: continue; }
1673: if(!stricmp(p,"FREAD_LINE")) {
1674: if(!(*arg) || !(*arg2)) break;
1675: fputc(CS_FIO_FUNCTION,out);
1676: fputc(FIO_READ_LINE,out);
1677: p=strchr(arg,SP);
1678: if(!p)
1679: break;
1680: *p=0;
1681: writecrc(src,arg); /* File handle */
1682: writecrc(src,arg2); /* Variable */
1683: continue; }
1684: if(!stricmp(p,"FEOF")) {
1685: if(!(*arg)) break;
1686: fputc(CS_FIO_FUNCTION,out);
1687: fputc(FIO_EOF,out);
1688: writecrc(src,arg);
1689: continue; }
1690: if(!stricmp(p,"FGET_POS")) {
1691: if(!(*arg) || !(*arg2)) break;
1692: fputc(CS_FIO_FUNCTION,out);
1693: fputc(FIO_GET_POS,out);
1694: p=strchr(arg,SP);
1695: if(!p)
1696: break;
1697: *p=0;
1698: writecrc(src,arg); /* File handle */
1699: writecrc(src,arg2); /* Variable */
1700: continue; }
1701: if(!stricmp(p,"FSET_POS") || !stricmp(p,"FSEEK")) {
1702: if(!(*arg)) break;
1703: fputc(CS_FIO_FUNCTION,out);
1704: if(isdigit(*arg2) || atol(arg2))
1705: fputc(FIO_SEEK,out);
1706: else
1707: fputc(FIO_SEEK_VAR,out);
1708: p=strchr(arg,SP);
1709: if(!p)
1710: break;
1711: *p=0;
1712: writecrc(src,arg); /* File handle */
1713: p=strchr(arg2,SP);
1714: if(p)
1715: *p=0;
1716: if(atol(arg2) || isdigit(*arg2)) {
1717: l=val(src,arg2);
1718: fwrite(&l,4,1,out); }
1719: else
1720: writecrc(src,arg2); /* Offset variable */
1721: i=0;
1722: if(p) {
1723: p++;
1724: while(*p && *p<=SP) p++;
1725: i=atoi(p);
1726: if(!stricmp(p,"CUR"))
1727: i=SEEK_CUR;
1728: else if(!stricmp(p,"END"))
1729: i=SEEK_END; }
1730: fwrite(&i,2,1,out);
1731: continue; }
1732: if(!stricmp(p,"FLOCK")) {
1733: if(!(*arg)) break;
1734: fputc(CS_FIO_FUNCTION,out);
1735: if(isdigit(*arg2) || atol(arg2))
1736: fputc(FIO_LOCK,out);
1737: else
1738: fputc(FIO_LOCK_VAR,out);
1739: p=strchr(arg,SP);
1740: if(!p)
1741: break;
1742: *p=0;
1743: writecrc(src,arg); /* File handle */
1744: if(atol(arg2) || isdigit(*arg2)) {
1745: l=val(src,arg2);
1746: if(!l)
1747: break;
1748: fwrite(&l,4,1,out); }
1749: else
1750: writecrc(src,arg2); /* Length variable */
1751: continue; }
1752: if(!stricmp(p,"FUNLOCK")) {
1753: if(!(*arg)) break;
1754: fputc(CS_FIO_FUNCTION,out);
1755: if(isdigit(*arg2) || atol(arg2))
1756: fputc(FIO_UNLOCK,out);
1757: else
1758: fputc(FIO_UNLOCK_VAR,out);
1759: p=strchr(arg,SP);
1760: if(!p)
1761: break;
1762: *p=0;
1763: writecrc(src,arg); /* File handle */
1764: if(atol(arg2) || isdigit(*arg2)) {
1765: l=val(src,arg2);
1766: if(!l)
1767: break;
1768: fwrite(&l,4,1,out); }
1769: else
1770: writecrc(src,arg2); /* Length variable */
1771: continue; }
1772: if(!stricmp(p,"FSET_LENGTH")) {
1773: if(!(*arg)) break;
1774: fputc(CS_FIO_FUNCTION,out);
1775: if(isdigit(*arg2) || atol(arg2))
1776: fputc(FIO_SET_LENGTH,out);
1777: else
1778: fputc(FIO_SET_LENGTH_VAR,out);
1779: p=strchr(arg,SP);
1780: if(!p)
1781: break;
1782: *p=0;
1783: writecrc(src,arg); /* File handle */
1784: if(atol(arg2) || isdigit(*arg2)) {
1785: l=val(src,arg2);
1786: fwrite(&l,4,1,out); }
1787: else
1788: writecrc(src,arg2); /* Length variable */
1789: continue; }
1790: if(!stricmp(p,"FPRINTF")) {
1791: if(!(*arg)) break;
1792: fputc(CS_FIO_FUNCTION,out);
1793: fputc(FIO_PRINTF,out);
1794: p=strchr(arg,SP);
1795: if(!p)
1796: break;
1797: *p=0;
1798: writecrc(src,arg); /* Write destination variable */
1799: p++;
1800: while(*p && *p<=SP) p++;
1801: arg=p;
1802: p=strrchr(arg,'"');
1803: if(!p)
1804: break;
1805: *p=0;
1806: p++;
1807: while(*p && *p<=SP) p++;
1808: writecstr(arg); /* Write string */
1809: l=ftell(out);
1810: fputc(0,out); /* Write total number of args */
1811: i=0;
1812: while(p && *p) {
1813: arg=p;
1814: p=strchr(arg,SP);
1815: if(p) {
1816: *p=0;
1817: p++; }
1818: writecrc(src,arg);
1819: i++; }
1820: fseek(out,l,SEEK_SET);
1821: fputc((char)i,out);
1822: fseek(out,i*4,SEEK_CUR);
1823: continue; }
1824: if(!stricmp(p,"FSET_ETX")) {
1825: if(!(*arg)) break;
1826: if((l=isvar(arg))!=0) {
1827: fputc(CS_USE_INT_VAR,out);
1828: fwrite(&l,4,1,out); // variable
1829: fputc(2,out); // int offset
1830: fputc(1,out); // int length
1831: ch=0; } // place holder
1832: else
1833: ch=val(src,arg);
1834:
1835: fputc(CS_FIO_FUNCTION,out);
1836: fputc(FIO_SET_ETX,out);
1837: fwrite(&ch,1,1,out);
1838: continue; }
1839: if(!stricmp(p,"FGET_TIME")) {
1840: if(!(*arg) || !(*arg2)) break;
1841: fputc(CS_FIO_FUNCTION,out);
1842: fputc(FIO_GET_TIME,out);
1843: p=strchr(arg,SP);
1844: if(!p)
1845: break;
1846: *p=0;
1847: writecrc(src,arg); /* File handle */
1848: writecrc(src,arg2); /* Variable */
1849: continue; }
1850: if(!stricmp(p,"FSET_TIME")) {
1851: if(!(*arg) || !(*arg2)) break;
1852: fputc(CS_FIO_FUNCTION,out);
1853: fputc(FIO_SET_TIME,out);
1854: p=strchr(arg,SP);
1855: if(!p)
1856: break;
1857: *p=0;
1858: writecrc(src,arg); /* File handle */
1859: writecrc(src,arg2); /* Variable */
1860: continue; }
1861: if(!stricmp(p,"REMOVE_FILE")) {
1862: if(!(*arg)) break;
1863: fputc(CS_FIO_FUNCTION,out);
1864: fputc(REMOVE_FILE,out);
1865: writecrc(src,arg); /* Str var */
1866: continue; }
1867: if(!stricmp(p,"RENAME_FILE")) {
1868: if(!(*arg) || !(*arg2)) break;
1869: fputc(CS_FIO_FUNCTION,out);
1870: fputc(RENAME_FILE,out);
1871: p=strchr(arg,SP);
1872: if(!p)
1873: break;
1874: *p=0;
1875: writecrc(src,arg); /* str var */
1876: writecrc(src,arg2); /* str var */
1877: continue; }
1878: if(!stricmp(p,"COPY_FILE")) {
1879: if(!(*arg) || !(*arg2)) break;
1880: fputc(CS_FIO_FUNCTION,out);
1881: fputc(COPY_FILE,out);
1882: p=strchr(arg,SP);
1883: if(!p)
1884: break;
1885: *p=0;
1886: writecrc(src,arg); /* str var */
1887: writecrc(src,arg2); /* str var */
1888: continue; }
1889: if(!stricmp(p,"MOVE_FILE")) {
1890: if(!(*arg) || !(*arg2)) break;
1891: fputc(CS_FIO_FUNCTION,out);
1892: fputc(MOVE_FILE,out);
1893: p=strchr(arg,SP);
1894: if(!p)
1895: break;
1896: *p=0;
1897: writecrc(src,arg); /* str var */
1898: writecrc(src,arg2); /* str var */
1899: continue; }
1900: if(!stricmp(p,"GET_FILE_ATTRIB")) {
1901: if(!(*arg) || !(*arg2)) break;
1902: fputc(CS_FIO_FUNCTION,out);
1903: fputc(GET_FILE_ATTRIB,out);
1904: p=strchr(arg,SP);
1905: if(!p)
1906: break;
1907: *p=0;
1908: writecrc(src,arg); /* str var */
1909: writecrc(src,arg2); /* int var */
1910: continue; }
1911: if(!stricmp(p,"SET_FILE_ATTRIB")) {
1912: if(!(*arg) || !(*arg2)) break;
1913: fputc(CS_FIO_FUNCTION,out);
1914: fputc(SET_FILE_ATTRIB,out);
1915: p=strchr(arg,SP);
1916: if(!p)
1917: break;
1918: *p=0;
1919: writecrc(src,arg); /* str var */
1920: writecrc(src,arg2); /* int var */
1921: continue; }
1922: if(!stricmp(p,"RMDIR") || !stricmp(p,"REMOVE_DIR")) {
1923: if(!(*arg)) break;
1924: fputc(CS_FIO_FUNCTION,out);
1925: fputc(REMOVE_DIR,out);
1926: writecrc(src,arg); /* Str var */
1927: continue; }
1928: if(!stricmp(p,"MKDIR") || !stricmp(p,"MAKE_DIR")) {
1929: if(!(*arg)) break;
1930: fputc(CS_FIO_FUNCTION,out);
1931: fputc(MAKE_DIR,out);
1932: writecrc(src,arg); /* Str var */
1933: continue; }
1934: if(!stricmp(p,"CHDIR") || !stricmp(p,"CHANGE_DIR")) {
1935: if(!(*arg)) break;
1936: fputc(CS_FIO_FUNCTION,out);
1937: fputc(CHANGE_DIR,out);
1938: writecrc(src,arg); /* Str var */
1939: continue; }
1940: if(!stricmp(p,"OPEN_DIR")) {
1941: if(!(*arg) || !(*arg2)) break;
1942: fputc(CS_FIO_FUNCTION,out);
1943: fputc(OPEN_DIR,out);
1944: p=strchr(arg,SP);
1945: if(!p)
1946: break;
1947: *p=0;
1948: writecrc(src,arg); /* int var */
1949: writecrc(src,arg2); /* str var */
1950: continue; }
1951: if(!stricmp(p,"READ_DIR")) {
1952: if(!(*arg) || !(*arg2)) break;
1953: fputc(CS_FIO_FUNCTION,out);
1954: fputc(READ_DIR,out);
1955: p=strchr(arg,SP);
1956: if(!p)
1957: break;
1958: *p=0;
1959: writecrc(src,arg); /* int var */
1960: writecrc(src,arg2); /* str var */
1961: continue; }
1962: if(!stricmp(p,"REWIND_DIR")) {
1963: if(!(*arg)) break;
1964: fputc(CS_FIO_FUNCTION,out);
1965: fputc(REWIND_DIR,out);
1966: writecrc(src,arg); /* int var */
1967: continue; }
1968: if(!stricmp(p,"CLOSE_DIR")) {
1969: if(!(*arg)) break;
1970: fputc(CS_FIO_FUNCTION,out);
1971: fputc(CLOSE_DIR,out);
1972: writecrc(src,arg); /* int var */
1973: continue; }
1974:
1975: if(!stricmp(p,"NODE_ACTION")) {
1976: if(!(*arg)) break;
1977: if((l=isvar(arg))!=0) {
1978: fputc(CS_USE_INT_VAR,out);
1979: fwrite(&l,4,1,out); // variable
1980: fputc(1,out); // int offset
1981: fputc(1,out); // int length
1982: ch=0; } // place holder
1983: else
1984: ch=val(src,arg);
1985:
1986: fprintf(out,"%c%c",CS_NODE_ACTION,ch);
1987: continue; }
1988: if(!stricmp(p,"NODE_STATUS")) {
1989: if(!(*arg)) break;
1990: if((l=isvar(arg))!=0) {
1991: fputc(CS_USE_INT_VAR,out);
1992: fwrite(&l,4,1,out); // variable
1993: fputc(1,out); // int offset
1994: fputc(1,out); // int length
1995: ch=0; } // place holder
1996: else
1997: ch=val(src,arg);
1998:
1999: fprintf(out,"%c%c",CS_NODE_STATUS,ch);
2000: continue; }
2001: if(!stricmp(p,"END_CMD") || !stricmp(p,"ENDCMD")) {
2002: fprintf(out,"%c",CS_END_CMD);
2003: continue; }
2004: if(!stricmp(p,"CMD_POP") || !stricmp(p,"CMDPOP")) {
2005: fprintf(out,"%c",CS_CMD_POP);
2006: continue; }
2007: if(!stricmp(p,"CLS")) {
2008: fprintf(out,"%c",CS_CLS);
2009: continue; }
2010: if(!stricmp(p,"CRLF")) {
2011: fprintf(out,"%c",CS_CRLF);
2012: continue; }
2013: if(!stricmp(p,"PAUSE")) {
2014: fprintf(out,"%c",CS_PAUSE);
2015: continue; }
2016: if(!stricmp(p,"PAUSE_RESET")) {
2017: fprintf(out,"%c",CS_PAUSE_RESET);
2018: continue; }
2019: if(!stricmp(p,"CLEAR_ABORT")) {
2020: fprintf(out,"%c",CS_CLEAR_ABORT);
2021: continue; }
2022: if(!stricmp(p,"GETLINES")) {
2023: fprintf(out,"%c",CS_GETLINES);
2024: continue; }
2025: if(!stricmp(p,"GETFILESPEC")) {
2026: fprintf(out,"%c",CS_GETFILESPEC);
2027: continue; }
2028: if(!stricmp(p,"FINDUSER")) {
2029: fprintf(out,"%c",CS_FINDUSER);
2030: continue; }
2031:
2032: if(!stricmp(p,"LOG")) {
2033: if(!(*arg)) break;
2034: fprintf(out,"%c",CS_LOG);
2035: writecstr(arg);
2036: continue; }
2037: if(!stricmp(p,"MNEMONICS")) {
2038: if(!(*arg)) break;
2039: fprintf(out,"%c",CS_MNEMONICS);
2040: writecstr(arg);
2041: continue; }
2042: if(!stricmp(p,"PRINT")) {
2043: if(!(*arg)) break;
2044: fprintf(out,"%c",CS_PRINT);
2045: writecstr(arg);
2046: continue; }
2047: if(!stricmp(p,"PRINT_LOCAL")) {
2048: if(!(*arg)) break;
2049: fprintf(out,"%c",CS_PRINT_LOCAL);
2050: writecstr(arg);
2051: continue; }
2052: if(!stricmp(p,"PRINT_REMOTE")) {
2053: if(!(*arg)) break;
2054: fprintf(out,"%c",CS_PRINT_REMOTE);
2055: writecstr(arg);
2056: continue; }
2057: if(!stricmp(p,"PRINTFILE")) {
2058: if(!(*arg)) break;
2059: if(*arg=='"') { /* NEED TO SUPPORT MODE HERE */
2060: fprintf(out,"%c",CS_PRINTFILE);
2061: writestr(arg); }
2062: else {
2063: if((l=isvar(arg2))!=0) {
2064: fputc(CS_USE_INT_VAR,out);
2065: fwrite(&l,4,1,out); // variable
2066: fputc(6,out); // int offset
2067: fputc(2,out); // int length
2068: i=0; } // place holder
2069: else
2070: i=val(src,arg2);
2071:
2072: fprintf(out,"%c%c",CS_VAR_INSTRUCTION,PRINTFILE_VAR_MODE);
2073: p=strchr(arg,SP);
2074: if(p) *p=0;
2075: writecrc(src,arg);
2076: fwrite(&i,2,1,out); }
2077: continue; }
2078: if(!stricmp(p,"PRINTTAIL")) {
2079: if(!(*arg) || !(*arg2))
2080: break;
2081: if((l=isvar(arg3))!=0) {
2082: fputc(CS_USE_INT_VAR,out);
2083: fwrite(&l,4,1,out); // variable
2084: fputc(8,out); // int offset
2085: fputc(1,out); // int length
2086: j=0; } // place holder
2087: else
2088: j=val(src,arg3);
2089:
2090: fprintf(out,"%c%c",CS_VAR_INSTRUCTION,PRINTTAIL_VAR_MODE);
2091: p=strchr(arg,SP);
2092: if(p) *p=0;
2093: writecrc(src,arg);
2094: i=val(src,arg2);
2095: fwrite(&i,2,1,out);
2096: fwrite(&j,1,1,out);
2097: continue; }
2098:
2099: if(!stricmp(p,"PRINTFILE_STR")) {
2100: fprintf(out,"%c",CS_PRINTFILE_STR);
2101: continue; }
2102: if(!stricmp(p,"PRINTFILE_LOCAL")) {
2103: if(!(*arg)) break;
2104: fprintf(out,"%c",CS_PRINTFILE_LOCAL);
2105: writestr(arg);
2106: continue; }
2107: if(!stricmp(p,"PRINTFILE_REMOTE")) {
2108: if(!(*arg)) break;
2109: fprintf(out,"%c",CS_PRINTFILE_REMOTE);
2110: writestr(arg);
2111: continue; }
2112:
2113: if(!stricmp(p,"TELNET_GATE")) {
2114: if(!(*arg)) break;
2115: if((l=isvar(arg2))!=0) {
2116: fputc(CS_USE_INT_VAR,out);
2117: fwrite(&l,4,1,out); // variable
2118: fputc(2,out); // int offset
2119: fputc(4,out); // int length
2120: l=0; } // place holder
2121: else if(*arg2)
2122: l=val(src,arg2);
2123: else
2124: l=0;
2125:
2126: if(*arg=='"') {
2127: fprintf(out,"%c%c",CS_VAR_INSTRUCTION,TELNET_GATE_STR);
2128: fwrite(&l,4,1,out);
2129: writestr(arg);
2130: } else {
2131: fprintf(out,"%c%c",CS_VAR_INSTRUCTION,TELNET_GATE_VAR);
2132: fwrite(&l,4,1,out);
2133: p=strchr(arg,SP);
2134: if(p) *p=0;
2135: writecrc(src,arg);
2136: }
2137: continue;
2138: }
2139:
2140: if(!stricmp(p,"EXEC")) {
2141: if(!(*arg)) break;
2142: fprintf(out,"%c",CS_EXEC);
2143: writestr(arg);
2144: continue; }
2145: if(!stricmp(p,"EXEC_INT")) {
2146: if(!(*arg)) break;
2147: fprintf(out,"%c",CS_EXEC_INT);
2148: writestr(arg);
2149: continue; }
2150: if(!stricmp(p,"EXEC_BIN")) {
2151: if(!(*arg)) break;
2152: fprintf(out,"%c",CS_EXEC_BIN);
2153: writestr(arg);
2154: continue; }
2155: if(!stricmp(p,"EXEC_XTRN")) {
2156: if(!(*arg)) break;
2157: fprintf(out,"%c",CS_EXEC_XTRN);
2158: writestr(arg);
2159: continue; }
2160:
2161: if(!stricmp(p,"SELECT_SHELL")) {
2162: fprintf(out,"%c",CS_SELECT_SHELL);
2163: continue; }
2164: if(!stricmp(p,"SET_SHELL")) {
2165: fprintf(out,"%c",CS_SET_SHELL);
2166: continue; }
2167: if(!stricmp(p,"SELECT_EDITOR")) {
2168: fprintf(out,"%c",CS_SELECT_EDITOR);
2169: continue; }
2170: if(!stricmp(p,"SET_EDITOR")) {
2171: fprintf(out,"%c",CS_SET_EDITOR);
2172: continue; }
2173:
2174: if(!stricmp(p,"YES_NO")) {
2175: if(!(*arg)) break;
2176: fprintf(out,"%c",CS_YES_NO);
2177: writecstr(arg);
2178: continue; }
2179: if(!stricmp(p,"NO_YES")) {
2180: if(!(*arg)) break;
2181: fprintf(out,"%c",CS_NO_YES);
2182: writecstr(arg);
2183: continue; }
2184: if(!stricmp(p,"MENU")) {
2185: if(!(*arg)) break;
2186: fprintf(out,"%c",CS_MENU);
2187: writestr(arg);
2188: continue; }
2189: if(!stricmp(p,"SET_MENU_DIR")) {
2190: if(!(*arg)) break;
2191: fprintf(out,"%c",CS_SET_MENU_DIR);
2192: writestr(arg);
2193: continue; }
2194: if(!stricmp(p,"SET_MENU_FILE")) {
2195: if(!(*arg)) break;
2196: fprintf(out,"%c",CS_SET_MENU_FILE);
2197: writestr(arg);
2198: continue; }
2199: if(!stricmp(p,"SEND_FILE_VIA")) {
2200: if(!(*arg) || !(*arg2)) break;
2201: if(*arg2=='"') {
2202: fprintf(out,"%c%c%c",CS_VAR_INSTRUCTION,SEND_FILE_VIA,*arg);
2203: writestr(arg2); }
2204: else {
2205: fprintf(out,"%c%c%c",CS_VAR_INSTRUCTION,SEND_FILE_VIA_VAR,*arg);
2206: writecrc(src,arg2); }
2207: continue; }
2208: if(!stricmp(p,"RECEIVE_FILE_VIA")) {
2209: if(!(*arg) || !(*arg2)) break;
2210: if(*arg2=='"') {
2211: fprintf(out,"%c%c%c",CS_VAR_INSTRUCTION,RECEIVE_FILE_VIA,*arg);
2212: writestr(arg2); }
2213: else {
2214: fprintf(out,"%c%c%c",CS_VAR_INSTRUCTION,RECEIVE_FILE_VIA_VAR,*arg);
2215: writecrc(src,arg2); }
2216: continue; }
2217: if(!stricmp(p,"CHKFILE")) {
2218: if(!(*arg)) break;
2219: if(*arg=='"') {
2220: fprintf(out,"%c",CS_CHKFILE);
2221: writestr(arg); }
2222: else {
2223: fprintf(out,"%c%c",CS_VAR_INSTRUCTION,CHKFILE_VAR);
2224: writecrc(src,arg); }
2225: continue; }
2226: if(!stricmp(p,"GET_FILE_LENGTH")) {
2227: if(!(*arg) || !(*arg2))
2228: break;
2229: fprintf(out,"%c%c",CS_VAR_INSTRUCTION,FLENGTH_TO_INT);
2230: p=strchr(arg,SP);
2231: if(p) *p=0;
2232: writecrc(src,arg);
2233: writecrc(src,arg2);
2234: continue; }
2235: if(!stricmp(p,"GET_FILE_TIME")) {
2236: if(!(*arg) || !(*arg2))
2237: break;
2238: fprintf(out,"%c%c",CS_VAR_INSTRUCTION,FTIME_TO_INT);
2239: p=strchr(arg,SP);
2240: if(p) *p=0;
2241: writecrc(src,arg);
2242: writecrc(src,arg2);
2243: continue; }
2244: if(!stricmp(p,"CHARVAL")) {
2245: if(!(*arg) || !(*arg2))
2246: break;
2247: fprintf(out,"%c%c",CS_VAR_INSTRUCTION,CHARVAL_TO_INT);
2248: p=strchr(arg,SP);
2249: if(p) *p=0;
2250: writecrc(src,arg);
2251: writecrc(src,arg2);
2252: continue; }
2253: if(!stricmp(p,"SETSTR")) {
2254: if(!(*arg)) break;
2255: fprintf(out,"%c",CS_SETSTR);
2256: writecstr(arg);
2257: continue; }
2258: if(!stricmp(p,"COMPARE_STR")) {
2259: if(!(*arg)) break;
2260: fprintf(out,"%c",CS_COMPARE_STR);
2261: writecstr(arg);
2262: continue; }
2263: if(!stricmp(p,"GET_TEMPLATE")) {
2264: if(!(*arg)) break;
2265: fprintf(out,"%c",CS_GET_TEMPLATE);
2266: writestr(arg);
2267: continue; }
2268: if(!stricmp(p,"READ_SIF")) {
2269: if(!(*arg)) break;
2270: fprintf(out,"%c",CS_READ_SIF);
2271: writestr(arg);
2272: continue; }
2273: if(!stricmp(p,"CREATE_SIF")) {
2274: if(!(*arg)) break;
2275: fprintf(out,"%c",CS_CREATE_SIF);
2276: writestr(arg);
2277: continue; }
2278: if(!stricmp(p,"TRASHCAN")) {
2279: if(!(*arg)) break;
2280: fprintf(out,"%c",CS_TRASHCAN);
2281: writestr(arg);
2282: continue; }
2283: if(!stricmp(p,"CMDSTR")) {
2284: if(!(*arg)) break;
2285: fprintf(out,"%c",CS_CMDSTR);
2286: writecstr(arg);
2287: continue; }
2288: if(!stricmp(p,"CMDKEYS")) {
2289: if(!(*arg)) break;
2290: fprintf(out,"%c",CS_CMDKEYS);
2291: for(p=arg;*p && *p!='#';p++) {
2292: ch=*p;
2293: if(ch=='"')
2294: continue;
2295: if(ch=='/') {
2296: p++;
2297: ch=*p|0x80; } /* high bit indicates slash required */
2298: else if(ch=='^' && *(p+1)>=0x40) {
2299: p++;
2300: ch=*p;
2301: ch-=0x40; }
2302: else if(ch=='\\') {
2303: p++;
2304: ch=cesc(*p); }
2305: fputc(ch,out); }
2306: fputc(0,out);
2307: continue; }
2308: if(!stricmp(p,"COMPARE_WORD")) {
2309: if(!(*arg)) break;
2310: fprintf(out,"%c",CS_COMPARE_WORD);
2311: writecstr(arg);
2312: continue; }
2313: if(!stricmp(p,"GETSTR")) {
2314: p=strchr(arg,SP);
2315: if(p) *p=0;
2316: if((!(*arg) || isdigit(*arg) || !stricmp(arg,"STR")) && !(*arg3))
2317: fprintf(out,"%c%c",CS_GETSTR,atoi(arg) ? atoi(arg)
2318: : *arg2 ? atoi(arg2) : 128);
2319: else {
2320: if((l=isvar(arg2))!=0) {
2321: fputc(CS_USE_INT_VAR,out);
2322: fwrite(&l,4,1,out); // variable
2323: fputc(6,out); // int offset
2324: fputc(1,out); // int length
2325: i=0; } // place holder
2326: else if(*arg2)
2327: i=val(src,arg2);
2328: else
2329: i=0;
2330:
2331: fprintf(out,"%c%c",CS_VAR_INSTRUCTION
2332: ,*arg3 ? GETSTR_MODE : GETSTR_VAR);
2333: writecrc(src,arg);
2334:
2335: if(!i) i=128;
2336: fwrite(&i,1,1,out);
2337: if(*arg3) {
2338: l=val(src,arg3);
2339: fwrite(&l,4,1,out); } }
2340: continue; }
2341: if(!stricmp(p,"GETNUM")) {
2342: if(!(*arg)) break;
2343: p=strchr(arg,SP);
2344: if(p) *p=0;
2345: if(isdigit(*arg)) {
2346: i=val(src,arg);
2347: fprintf(out,"%c",CS_GETNUM);
2348: fwrite(&i,2,1,out); }
2349: else {
2350: if((l=isvar(arg2))!=0) {
2351: fputc(CS_USE_INT_VAR,out);
2352: fwrite(&l,4,1,out); // variable
2353: fputc(6,out); // int offset
2354: fputc(2,out); // int length
2355: i=0; } // place holder
2356: else
2357: i=val(src,arg2);
2358:
2359: fprintf(out,"%c%c",CS_VAR_INSTRUCTION,GETNUM_VAR);
2360: writecrc(src,arg);
2361: fwrite(&i,2,1,out); }
2362: continue; }
2363: if(!stricmp(p,"MSWAIT")) {
2364: if(!(*arg)) break;
2365: if((l=isvar(arg))!=0) {
2366: fputc(CS_USE_INT_VAR,out);
2367: fwrite(&l,4,1,out); // variable
2368: fputc(1,out); // int offset
2369: fputc(2,out); // int length
2370: i=0; } // place holder
2371: else
2372: i=val(src,arg);
2373:
2374: fprintf(out,"%c",CS_MSWAIT);
2375: fwrite(&i,2,1,out);
2376: continue; }
2377: if(!stricmp(p,"GETLINE")) {
2378: p=strchr(arg,SP);
2379: if(p) *p=0;
2380: if(!(*arg) || isdigit(*arg))
2381: fprintf(out,"%c%c",CS_GETLINE,*arg ? atoi(arg) :128);
2382: else {
2383: if((l=isvar(arg2))!=0) {
2384: fputc(CS_USE_INT_VAR,out);
2385: fwrite(&l,4,1,out); // variable
2386: fputc(6,out); // int offset
2387: fputc(1,out); // int length
2388: i=0; } // place holder
2389: else
2390: i=val(src,arg2);
2391:
2392: fprintf(out,"%c%c",CS_VAR_INSTRUCTION,GETLINE_VAR);
2393: writecrc(src,arg);
2394: if(!i) i=128;
2395: fwrite(&i,1,1,out); }
2396: continue; }
2397: if(!stricmp(p,"GETSTRUPR")) {
2398: p=strchr(arg,SP);
2399: if(p) *p=0;
2400: if(!(*arg) || isdigit(*arg))
2401: fprintf(out,"%c%c",CS_GETSTRUPR,*arg ? atoi(arg) :128);
2402: else {
2403: if((l=isvar(arg2))!=0) {
2404: fputc(CS_USE_INT_VAR,out);
2405: fwrite(&l,4,1,out); // variable
2406: fputc(6,out); // int offset
2407: fputc(1,out); // int length
2408: i=0; } // place holder
2409: else
2410: i=val(src,arg2);
2411:
2412: fprintf(out,"%c%c",CS_VAR_INSTRUCTION,GETSTRUPR_VAR);
2413: writecrc(src,arg);
2414: if(!i) i=128;
2415: fwrite(&i,1,1,out); }
2416: continue; }
2417: if(!stricmp(p,"GETNAME")) {
2418: p=strchr(arg,SP);
2419: if(p) *p=0;
2420: if(!(*arg) || isdigit(*arg))
2421: fprintf(out,"%c%c",CS_GETNAME,*arg ? atoi(arg) :25);
2422: else {
2423: if((l=isvar(arg2))!=0) {
2424: fputc(CS_USE_INT_VAR,out);
2425: fwrite(&l,4,1,out); // variable
2426: fputc(6,out); // int offset
2427: fputc(1,out); // int length
2428: i=0; } // place holder
2429: else
2430: i=atoi(arg2);
2431:
2432: fprintf(out,"%c%c",CS_VAR_INSTRUCTION,GETNAME_VAR);
2433: writecrc(src,arg);
2434: if(!i) i=128;
2435: fwrite(&i,1,1,out); }
2436: continue; }
2437: if(!stricmp(p,"SHIFT_STR")) {
2438: if(!(*arg)) break;
2439: p=strchr(arg,SP);
2440: if(p) *p=0;
2441: if(!(*arg) || isdigit(*arg))
2442: fprintf(out,"%c%c",CS_SHIFT_STR,atoi(arg));
2443: else {
2444: if((l=isvar(arg2))!=0) {
2445: fputc(CS_USE_INT_VAR,out);
2446: fwrite(&l,4,1,out); // variable
2447: fputc(6,out); // int offset
2448: fputc(1,out); // int length
2449: i=0; } // place holder
2450: else
2451: i=atoi(arg2);
2452:
2453: fprintf(out,"%c%c",CS_VAR_INSTRUCTION,SHIFT_STR_VAR);
2454: writecrc(src,arg);
2455: if(!i) i=128;
2456: fwrite(&i,1,1,out); }
2457: continue; }
2458: if(!stricmp(p,"TRUNCSP")) {
2459: fprintf(out,"%c%c",CS_VAR_INSTRUCTION,TRUNCSP_STR_VAR);
2460: writecrc(src,arg);
2461: continue; }
2462: if(!stricmp(p,"STRIP_CTRL")) {
2463: fprintf(out,"%c%c",CS_VAR_INSTRUCTION,STRIP_CTRL_STR_VAR);
2464: writecrc(src,arg);
2465: continue; }
2466: if(!stricmp(p,"STRUPR")) {
2467: fprintf(out,"%c%c",CS_VAR_INSTRUCTION,STRUPR_VAR);
2468: writecrc(src,arg);
2469: continue; }
2470: if(!stricmp(p,"STRLWR")) {
2471: fprintf(out,"%c%c",CS_VAR_INSTRUCTION,STRLWR_VAR);
2472: writecrc(src,arg);
2473: continue; }
2474: if(!stricmp(p,"STRLEN")) {
2475: if(!(*arg)) break;
2476: fprintf(out,"%c%c",CS_VAR_INSTRUCTION,STRLEN_INT_VAR);
2477: p=strchr(arg,SP);
2478: if(!p)
2479: break;
2480: *p=0;
2481: writecrc(src,arg);
2482: writecrc(src,arg2);
2483: continue; }
2484: if(!stricmp(p,"REPLACE_TEXT")) {
2485: if(!(*arg) || !(*arg2)) break;
2486: if((l=isvar(arg))!=0) {
2487: fputc(CS_USE_INT_VAR,out);
2488: fwrite(&l,4,1,out); // variable
2489: fputc(1,out); // int offset
2490: fputc(2,out); // int length
2491: i=0; } // place holder
2492: else
2493: i=val(src,arg);
2494:
2495: fprintf(out,"%c",CS_REPLACE_TEXT);
2496: fwrite(&i,2,1,out);
2497: writecstr(arg2);
2498: continue; }
2499: if(!stricmp(p,"REVERT_TEXT")) {
2500: if(!(*arg)) break;
2501: if(!stricmp(arg,"ALL"))
2502: i=0xffff;
2503: else {
2504: if((l=isvar(arg))!=0) {
2505: fputc(CS_USE_INT_VAR,out);
2506: fwrite(&l,4,1,out); // variable
2507: fputc(1,out); // int offset
2508: fputc(2,out); // int length
2509: i=0; } // place holder
2510: else
2511: i=val(src,arg); }
2512:
2513: fprintf(out,"%c",CS_REVERT_TEXT);
2514: fwrite(&i,2,1,out);
2515: continue; }
2516: if(!stricmp(p,"TOGGLE_USER_MISC")
2517: || !stricmp(p,"COMPARE_USER_MISC")) {
2518: if(!(*arg)) break;
2519:
2520: if((l=isvar(arg))!=0) {
2521: fputc(CS_USE_INT_VAR,out);
2522: fwrite(&l,4,1,out); // variable
2523: fputc(1,out); // int offset
2524: fputc(4,out); // int length
2525: l=0; } // place holder
2526: else
2527: l=val(src,arg);
2528:
2529: if(!stricmp(p,"TOGGLE_USER_MISC"))
2530: fprintf(out,"%c",CS_TOGGLE_USER_MISC);
2531: else
2532: fprintf(out,"%c",CS_COMPARE_USER_MISC);
2533: fwrite(&l,4,1,out);
2534: continue; }
2535:
2536: if(!stricmp(p,"TOGGLE_USER_CHAT")
2537: || !stricmp(p,"COMPARE_USER_CHAT")) {
2538: if(!(*arg)) break;
2539:
2540: if((l=isvar(arg))!=0) {
2541: fputc(CS_USE_INT_VAR,out);
2542: fwrite(&l,4,1,out); // variable
2543: fputc(1,out); // int offset
2544: fputc(4,out); // int length
2545: l=0; } // place holder
2546: else
2547: l=val(src,arg);
2548:
2549: if(!stricmp(p,"TOGGLE_USER_CHAT"))
2550: fprintf(out,"%c",CS_TOGGLE_USER_CHAT);
2551: else
2552: fprintf(out,"%c",CS_COMPARE_USER_CHAT);
2553: fwrite(&l,4,1,out);
2554: continue; }
2555:
2556: if(!stricmp(p,"TOGGLE_USER_QWK")
2557: || !stricmp(p,"COMPARE_USER_QWK")) {
2558: if(!(*arg)) break;
2559:
2560: if((l=isvar(arg))!=0) {
2561: fputc(CS_USE_INT_VAR,out);
2562: fwrite(&l,4,1,out); // variable
2563: fputc(1,out); // int offset
2564: fputc(4,out); // int length
2565: l=0; } // place holder
2566: else
2567: l=val(src,arg);
2568:
2569: if(!stricmp(p,"TOGGLE_USER_QWK"))
2570: fprintf(out,"%c",CS_TOGGLE_USER_QWK);
2571: else
2572: fprintf(out,"%c",CS_COMPARE_USER_QWK);
2573: fwrite(&l,4,1,out);
2574: continue; }
2575:
2576: if(!stricmp(p,"TOGGLE_NODE_MISC")
2577: || !stricmp(p,"COMPARE_NODE_MISC")) {
2578: if(!(*arg)) break;
2579:
2580: if((l=isvar(arg))!=0) {
2581: fputc(CS_USE_INT_VAR,out);
2582: fwrite(&l,4,1,out); // variable
2583: fputc(1,out); // int offset
2584: fputc(2,out); // int length
2585: i=0; } // place holder
2586: else
2587: i=val(src,arg);
2588:
2589: if(!stricmp(p,"TOGGLE_NODE_MISC"))
2590: fprintf(out,"%c",CS_TOGGLE_NODE_MISC);
2591: else
2592: fprintf(out,"%c",CS_COMPARE_NODE_MISC);
2593: fwrite(&i,2,1,out);
2594: continue; }
2595:
2596: if(!stricmp(p,"TOGGLE_USER_FLAG")) {
2597: if(!(*arg)) break;
2598: p=arg;
2599: fprintf(out,"%c%c",CS_TOGGLE_USER_FLAG,toupper(*p++));
2600: while(*p && *p<=SP) p++;
2601: fprintf(out,"%c",toupper(*p));
2602: continue; }
2603:
2604: if(!stricmp(p,"SET_USER_LEVEL")) {
2605: if(!(*arg)) break;
2606:
2607: if((l=isvar(arg))!=0) {
2608: fputc(CS_USE_INT_VAR,out);
2609: fwrite(&l,4,1,out); // variable
2610: fputc(1,out); // int offset
2611: fputc(1,out); // int length
2612: ch=0; } // place holder
2613: else
2614: ch=val(src,arg);
2615:
2616: fprintf(out,"%c%c",CS_SET_USER_LEVEL,ch);
2617: continue; }
2618:
2619: if(!stricmp(p,"SET_USER_STRING")) {
2620: if(!(*arg)) break;
2621:
2622: if((l=isvar(arg))!=0) {
2623: fputc(CS_USE_INT_VAR,out);
2624: fwrite(&l,4,1,out); // variable
2625: fputc(1,out); // int offset
2626: fputc(1,out); // int length
2627: ch=0; } // place holder
2628: else
2629: ch=val(src,arg);
2630:
2631: fprintf(out,"%c%c",CS_SET_USER_STRING,ch);
2632: continue; }
2633:
2634:
2635: if(!stricmp(p,"ADJUST_USER_CREDITS")) {
2636: if(!(*arg)) break;
2637:
2638: if((l=isvar(arg))!=0) {
2639: fputc(CS_USE_INT_VAR,out);
2640: fwrite(&l,4,1,out); // variable
2641: fputc(1,out); // int offset
2642: fputc(2,out); // int length
2643: i=0; } // place holder
2644: else
2645: i=val(src,arg);
2646:
2647: fprintf(out,"%c",CS_ADJUST_USER_CREDITS);
2648: fwrite(&i,2,1,out);
2649: continue; }
2650:
2651: if(!stricmp(p,"ADJUST_USER_MINUTES")) {
2652: if(!(*arg)) break;
2653:
2654: if((l=isvar(arg))!=0) {
2655: fputc(CS_USE_INT_VAR,out);
2656: fwrite(&l,4,1,out); // variable
2657: fputc(1,out); // int offset
2658: fputc(2,out); // int length
2659: i=0; } // place holder
2660: else
2661: i=val(src,arg);
2662:
2663: fprintf(out,"%c",CS_ADJUST_USER_MINUTES);
2664: fwrite(&i,2,1,out);
2665: continue; }
2666:
2667: if(!stricmp(p,"SHOW_MEM")) {
2668: fprintf(out,"%c",CS_SHOW_MEM);
2669: continue; }
2670: if(!stricmp(p,"GURU_LOG")) {
2671: fprintf(out,"%c",CS_GURU_LOG);
2672: continue; }
2673: if(!stricmp(p,"ERROR_LOG")) {
2674: fprintf(out,"%c",CS_ERROR_LOG);
2675: continue; }
2676: if(!stricmp(p,"SYSTEM_LOG")) {
2677: fprintf(out,"%c",CS_SYSTEM_LOG);
2678: continue; }
2679: if(!stricmp(p,"SYSTEM_YLOG")) {
2680: fprintf(out,"%c",CS_SYSTEM_YLOG);
2681: continue; }
2682: if(!stricmp(p,"SYSTEM_STATS")) {
2683: fprintf(out,"%c",CS_SYSTEM_STATS);
2684: continue; }
2685: if(!stricmp(p,"NODE_STATS")) {
2686: fprintf(out,"%c",CS_NODE_STATS);
2687: continue; }
2688: if(!stricmp(p,"CHANGE_USER")) {
2689: fprintf(out,"%c",CS_CHANGE_USER);
2690: continue; }
2691: if(!stricmp(p,"ANSI_CAPTURE")) {
2692: fprintf(out,"%c",CS_ANSI_CAPTURE);
2693: continue; }
2694: if(!stricmp(p,"LIST_TEXT_FILE")) {
2695: fprintf(out,"%c",CS_LIST_TEXT_FILE);
2696: continue; }
2697: if(!stricmp(p,"EDIT_TEXT_FILE")) {
2698: fprintf(out,"%c",CS_EDIT_TEXT_FILE);
2699: continue; }
2700:
2701:
2702: if(!stricmp(p,"COMPARE_KEY")) {
2703: if(!stricmp(arg,"DIGIT"))
2704: ch=CS_DIGIT;
2705: else if(!stricmp(arg,"EDIGIT"))
2706: ch=CS_EDIGIT;
2707: else
2708: ch=toupper(*arg);
2709: if(ch=='/')
2710: ch=(*arg)|0x80; /* high bit indicates slash required */
2711: else if(ch=='^' && (*(arg+1))>=0x40)
2712: ch=(*(arg+1))-0x40; /* ctrl char */
2713: else if(ch=='\\')
2714: ch=cesc(*(arg+1));
2715: else if(ch=='\'')
2716: ch=*(arg+1);
2717: fprintf(out,"%c%c",CS_COMPARE_KEY,ch);
2718: continue; }
2719: if(!stricmp(p,"COMPARE_CHAR")) {
2720: ch=*arg;
2721: fprintf(out,"%c%c",CS_COMPARE_CHAR,ch);
2722: continue; }
2723: if(!stricmp(p,"COMPARE_KEYS")) {
2724: fputc(CS_COMPARE_KEYS,out);
2725: for(p=arg;*p && *p!='#';p++) {
2726: ch=*p;
2727: if(ch=='"')
2728: continue;
2729: if(ch=='/') {
2730: p++;
2731: ch=*p|0x80; } /* high bit indicates slash required */
2732: else if(ch=='^' && *(p+1)>=0x40) {
2733: p++;
2734: ch=*p;
2735: ch-=0x40; }
2736: else if(ch=='\\') {
2737: p++;
2738: ch=cesc(*p); }
2739: fputc(ch,out); }
2740: fputc(0,out);
2741: continue; }
2742: if(!stricmp(p,"GETCMD")) {
2743: fprintf(out,"%c",CS_GETCMD);
2744: writecstr(arg);
2745: continue; }
2746: if(!stricmp(p,"INKEY")) {
2747: fprintf(out,"%c",CS_INKEY);
2748: continue; }
2749: if(!stricmp(p,"GETKEY")) {
2750: fprintf(out,"%c",CS_GETKEY);
2751: continue; }
2752: if(!stricmp(p,"GETCHAR")) {
2753: fprintf(out,"%c",CS_GETCHAR);
2754: continue; }
2755: if(!stricmp(p,"GETKEYE")) {
2756: fprintf(out,"%c",CS_GETKEYE);
2757: continue; }
2758: if(!stricmp(p,"UNGETKEY")) {
2759: fprintf(out,"%c",CS_UNGETKEY);
2760: continue; }
2761: if(!stricmp(p,"UNGETSTR")) {
2762: fprintf(out,"%c",CS_UNGETSTR);
2763: continue; }
2764: if(!stricmp(p,"PRINTKEY")) {
2765: fprintf(out,"%c",CS_PRINTKEY);
2766: continue; }
2767: if(!stricmp(p,"PRINTSTR")) {
2768: fprintf(out,"%c",CS_PRINTSTR);
2769: continue; }
2770:
2771: /* FUNCTIONS */
2772:
2773: if(!stricmp(p,"NODELIST_ALL")) {
2774: fprintf(out,"%c",CS_NODELIST_ALL);
2775: continue; }
2776: if(!stricmp(p,"NODELIST_USERS")) {
2777: fprintf(out,"%c",CS_NODELIST_USERS);
2778: continue; }
2779:
2780: if(!stricmp(p,"USERLIST_ALL")) {
2781: fprintf(out,"%c",CS_USERLIST_ALL);
2782: continue; }
2783: if(!stricmp(p,"USERLIST_SUB")) {
2784: fprintf(out,"%c",CS_USERLIST_SUB);
2785: continue; }
2786: if(!stricmp(p,"USERLIST_DIR")) {
2787: fprintf(out,"%c",CS_USERLIST_DIR);
2788: continue; }
2789: if(!stricmp(p,"USERLIST_LOGONS")) {
2790: fprintf(out,"%c",CS_USERLIST_LOGONS);
2791: continue; }
2792:
2793: if(!stricmp(p,"HANGUP")) {
2794: fprintf(out,"%c",CS_HANGUP);
2795: continue; }
2796:
2797: if(!stricmp(p,"LOGOFF")) {
2798: fprintf(out,"%c",CS_LOGOFF);
2799: continue; }
2800:
2801: if(!stricmp(p,"LOGOFF_FAST")) {
2802: fprintf(out,"%c",CS_LOGOFF_FAST);
2803: continue; }
2804:
2805: if(!stricmp(p,"AUTO_MESSAGE")) {
2806: fprintf(out,"%c",CS_AUTO_MESSAGE);
2807: continue; }
2808:
2809: if(!stricmp(p,"MINUTE_BANK")) {
2810: fprintf(out,"%c",CS_MINUTE_BANK);
2811: continue; }
2812:
2813: if(!stricmp(p,"USER_EDIT")) {
2814: fprintf(out,"%c",CS_USER_EDIT);
2815: continue; }
2816:
2817: if(!stricmp(p,"USER_DEFAULTS")) {
2818: fprintf(out,"%c",CS_USER_DEFAULTS);
2819: continue; }
2820:
2821: if(!stricmp(p,"PAGE_SYSOP")) {
2822: fprintf(out,"%c",CS_PAGE_SYSOP);
2823: continue; }
2824: if(!stricmp(p,"PAGE_GURU")) {
2825: fprintf(out,"%c",CS_PAGE_GURU);
2826: continue; }
2827: if(!stricmp(p,"SPY")) {
2828: fprintf(out,"%c",CS_SPY);
2829: continue; }
2830:
2831:
2832: if(!stricmp(p,"PRIVATE_CHAT")) {
2833: fprintf(out,"%c",CS_PRIVATE_CHAT);
2834: continue; }
2835:
2836: if(!stricmp(p,"PRIVATE_MESSAGE")) {
2837: fprintf(out,"%c",CS_PRIVATE_MESSAGE);
2838: continue; }
2839:
2840: if(!stricmp(p,"MAIL_READ")) {
2841: fprintf(out,"%c",CS_MAIL_READ);
2842: continue; }
2843: if(!stricmp(p,"MAIL_READ_SENT")) { /* Kill/read sent mail */
2844: fprintf(out,"%c",CS_MAIL_READ_SENT);
2845: continue; }
2846: if(!stricmp(p,"MAIL_READ_ALL")) {
2847: fprintf(out,"%c",CS_MAIL_READ_ALL);
2848: continue; }
2849: if(!stricmp(p,"MAIL_SEND")) { /* Send E-mail */
2850: fprintf(out,"%c",CS_MAIL_SEND);
2851: continue; }
2852: if(!stricmp(p,"MAIL_SEND_FEEDBACK")) { /* Feedback */
2853: fprintf(out,"%c",CS_MAIL_SEND_FEEDBACK);
2854: continue; }
2855: if(!stricmp(p,"MAIL_SEND_NETMAIL")) {
2856: fprintf(out,"%c",CS_MAIL_SEND_NETMAIL);
2857: continue; }
2858: if(!stricmp(p,"MAIL_SEND_NETFILE")) {
2859: fprintf(out,"%c",CS_MAIL_SEND_NETFILE);
2860: continue; }
2861: if(!stricmp(p,"MAIL_SEND_FILE")) { /* Upload Attached File to E-mail */
2862: fprintf(out,"%c",CS_MAIL_SEND_FILE);
2863: continue; }
2864: if(!stricmp(p,"MAIL_SEND_BULK")) {
2865: fprintf(out,"%c",CS_MAIL_SEND_BULK);
2866: continue; }
2867:
2868:
2869: if(!stricmp(p,"MSG_SET_AREA")) {
2870: fprintf(out,"%c",CS_MSG_SET_AREA);
2871: continue; }
2872: if(!stricmp(p,"MSG_SET_GROUP")) {
2873: fprintf(out,"%c",CS_MSG_SET_GROUP);
2874: continue; }
2875: if(!stricmp(p,"MSG_SELECT_AREA")) {
2876: fprintf(out,"%c",CS_MSG_SELECT_AREA);
2877: continue; }
2878: if(!stricmp(p,"MSG_SHOW_GROUPS")) {
2879: fprintf(out,"%c",CS_MSG_SHOW_GROUPS);
2880: continue; }
2881: if(!stricmp(p,"MSG_SHOW_SUBBOARDS")) {
2882: fprintf(out,"%c",CS_MSG_SHOW_SUBBOARDS);
2883: continue; }
2884: if(!stricmp(p,"MSG_GROUP_UP")) {
2885: fprintf(out,"%c",CS_MSG_GROUP_UP);
2886: continue; }
2887: if(!stricmp(p,"MSG_GROUP_DOWN")) {
2888: fprintf(out,"%c",CS_MSG_GROUP_DOWN);
2889: continue; }
2890: if(!stricmp(p,"MSG_SUBBOARD_UP")) {
2891: fprintf(out,"%c",CS_MSG_SUBBOARD_UP);
2892: continue; }
2893: if(!stricmp(p,"MSG_SUBBOARD_DOWN")) {
2894: fprintf(out,"%c",CS_MSG_SUBBOARD_DOWN);
2895: continue; }
2896: if(!stricmp(p,"MSG_GET_SUB_NUM")) {
2897: fprintf(out,"%c",CS_MSG_GET_SUB_NUM);
2898: continue; }
2899: if(!stricmp(p,"MSG_GET_GRP_NUM")) {
2900: fprintf(out,"%c",CS_MSG_GET_GRP_NUM);
2901: continue; }
2902: if(!stricmp(p,"MSG_READ")) {
2903: fprintf(out,"%c",CS_MSG_READ);
2904: continue; }
2905: if(!stricmp(p,"MSG_POST")) {
2906: fprintf(out,"%c",CS_MSG_POST);
2907: continue; }
2908: if(!stricmp(p,"MSG_QWK")) {
2909: fprintf(out,"%c",CS_MSG_QWK);
2910: continue; }
2911: if(!stricmp(p,"MSG_PTRS_CFG")) {
2912: fprintf(out,"%c",CS_MSG_PTRS_CFG);
2913: continue; }
2914: if(!stricmp(p,"MSG_PTRS_REINIT")) {
2915: fprintf(out,"%c",CS_MSG_PTRS_REINIT);
2916: continue; }
2917: if(!stricmp(p,"MSG_NEW_SCAN_CFG")) {
2918: fprintf(out,"%c",CS_MSG_NEW_SCAN_CFG);
2919: continue; }
2920: if(!stricmp(p,"MSG_NEW_SCAN")) {
2921: fprintf(out,"%c",CS_MSG_NEW_SCAN);
2922: continue; }
2923: if(!stricmp(p,"MSG_NEW_SCAN_SUB")) {
2924: fprintf(out,"%c",CS_MSG_NEW_SCAN_SUB);
2925: continue; }
2926: if(!stricmp(p,"MSG_NEW_SCAN_ALL")) {
2927: fprintf(out,"%c",CS_MSG_NEW_SCAN_ALL);
2928: continue; }
2929: if(!stricmp(p,"MSG_CONT_SCAN")) {
2930: fprintf(out,"%c",CS_MSG_CONT_SCAN);
2931: continue; }
2932: if(!stricmp(p,"MSG_CONT_SCAN_ALL")) {
2933: fprintf(out,"%c",CS_MSG_CONT_SCAN_ALL);
2934: continue; }
2935: if(!stricmp(p,"MSG_BROWSE_SCAN")) {
2936: fprintf(out,"%c",CS_MSG_BROWSE_SCAN);
2937: continue; }
2938: if(!stricmp(p,"MSG_BROWSE_SCAN_ALL")) {
2939: fprintf(out,"%c",CS_MSG_BROWSE_SCAN_ALL);
2940: continue; }
2941: if(!stricmp(p,"MSG_FIND_TEXT")) {
2942: fprintf(out,"%c",CS_MSG_FIND_TEXT);
2943: continue; }
2944: if(!stricmp(p,"MSG_FIND_TEXT_ALL")) {
2945: fprintf(out,"%c",CS_MSG_FIND_TEXT_ALL);
2946: continue; }
2947: if(!stricmp(p,"MSG_YOUR_SCAN_CFG")) {
2948: fprintf(out,"%c",CS_MSG_YOUR_SCAN_CFG);
2949: continue; }
2950: if(!stricmp(p,"MSG_YOUR_SCAN")) {
2951: fprintf(out,"%c",CS_MSG_YOUR_SCAN);
2952: continue; }
2953: if(!stricmp(p,"MSG_YOUR_SCAN_ALL")) {
2954: fprintf(out,"%c",CS_MSG_YOUR_SCAN_ALL);
2955: continue; }
2956: if(!stricmp(p,"CHAT_SECTION")) {
2957: fprintf(out,"%c",CS_CHAT_SECTION);
2958: continue; }
2959: if(!stricmp(p,"TEXT_FILE_SECTION")) {
2960: fprintf(out,"%c",CS_TEXT_FILE_SECTION);
2961: continue; }
2962: if(!stricmp(p,"XTRN_EXEC")) {
2963: fprintf(out,"%c",CS_XTRN_EXEC);
2964: continue; }
2965: if(!stricmp(p,"XTRN_SECTION")) {
2966: fprintf(out,"%c",CS_XTRN_SECTION);
2967: continue; }
2968:
2969: if(!stricmp(p,"FILE_SET_AREA")) {
2970: fprintf(out,"%c",CS_FILE_SET_AREA);
2971: continue; }
2972: if(!stricmp(p,"FILE_SET_LIBRARY")) {
2973: fprintf(out,"%c",CS_FILE_SET_LIBRARY);
2974: continue; }
2975: if(!stricmp(p,"FILE_SELECT_AREA")) {
2976: fprintf(out,"%c",CS_FILE_SELECT_AREA);
2977: continue; }
2978: if(!stricmp(p,"FILE_SHOW_LIBRARIES")) {
2979: fprintf(out,"%c",CS_FILE_SHOW_LIBRARIES);
2980: continue; }
2981: if(!stricmp(p,"FILE_SHOW_DIRECTORIES")) {
2982: fprintf(out,"%c",CS_FILE_SHOW_DIRECTORIES);
2983: continue; }
2984: if(!stricmp(p,"FILE_LIBRARY_UP")) {
2985: fprintf(out,"%c",CS_FILE_LIBRARY_UP);
2986: continue; }
2987: if(!stricmp(p,"FILE_LIBRARY_DOWN")) {
2988: fprintf(out,"%c",CS_FILE_LIBRARY_DOWN);
2989: continue; }
2990: if(!stricmp(p,"FILE_DIRECTORY_UP")) {
2991: fprintf(out,"%c",CS_FILE_DIRECTORY_UP);
2992: continue; }
2993: if(!stricmp(p,"FILE_DIRECTORY_DOWN")) {
2994: fprintf(out,"%c",CS_FILE_DIRECTORY_DOWN);
2995: continue; }
2996: if(!stricmp(p,"FILE_GET_DIR_NUM")) {
2997: fprintf(out,"%c",CS_FILE_GET_DIR_NUM);
2998: continue; }
2999: if(!stricmp(p,"FILE_GET_LIB_NUM")) {
3000: fprintf(out,"%c",CS_FILE_GET_LIB_NUM);
3001: continue; }
3002: if(!stricmp(p,"FILE_UPLOAD")) {
3003: fprintf(out,"%c",CS_FILE_UPLOAD);
3004: continue; }
3005: if(!stricmp(p,"FILE_UPLOAD_USER")) {
3006: fprintf(out,"%c",CS_FILE_UPLOAD_USER);
3007: continue; }
3008: if(!stricmp(p,"FILE_UPLOAD_BULK")) {
3009: fprintf(out,"%c",CS_FILE_UPLOAD_BULK);
3010: continue; }
3011: if(!stricmp(p,"FILE_UPLOAD_SYSOP")) {
3012: fprintf(out,"%c",CS_FILE_UPLOAD_SYSOP);
3013: continue; }
3014: if(!stricmp(p,"FILE_RESORT_DIRECTORY")) {
3015: fprintf(out,"%c",CS_FILE_RESORT_DIRECTORY);
3016: continue; }
3017: if(!stricmp(p,"FILE_SET_ALT_PATH")) {
3018: fprintf(out,"%c",CS_FILE_SET_ALT_PATH);
3019: continue; }
3020: if(!stricmp(p,"FILE_GET")) {
3021: fprintf(out,"%c",CS_FILE_GET);
3022: continue; }
3023: if(!stricmp(p,"FILE_SEND")) {
3024: fprintf(out,"%c",CS_FILE_SEND);
3025: continue; }
3026: if(!stricmp(p,"FILE_PUT")) {
3027: fprintf(out,"%c",CS_FILE_PUT);
3028: continue; }
3029: if(!stricmp(p,"FILE_FIND_OLD")) {
3030: fprintf(out,"%c",CS_FILE_FIND_OLD);
3031: continue; }
3032: if(!stricmp(p,"FILE_FIND_OPEN")) {
3033: fprintf(out,"%c",CS_FILE_FIND_OPEN);
3034: continue; }
3035: if(!stricmp(p,"FILE_FIND_OFFLINE")) {
3036: fprintf(out,"%c",CS_FILE_FIND_OFFLINE);
3037: continue; }
3038: if(!stricmp(p,"FILE_FIND_OLD_UPLOADS")) {
3039: fprintf(out,"%c",CS_FILE_FIND_OLD_UPLOADS);
3040: continue; }
3041: if(!stricmp(p,"FILE_DOWNLOAD")) {
3042: fprintf(out,"%c",CS_FILE_DOWNLOAD);
3043: continue; }
3044: if(!stricmp(p,"FILE_DOWNLOAD_USER")) {
3045: fprintf(out,"%c",CS_FILE_DOWNLOAD_USER);
3046: continue; }
3047: if(!stricmp(p,"FILE_DOWNLOAD_BATCH")) {
3048: fprintf(out,"%c",CS_FILE_DOWNLOAD_BATCH);
3049: continue; }
3050: if(!stricmp(p,"FILE_REMOVE")) {
3051: fprintf(out,"%c",CS_FILE_REMOVE);
3052: continue; }
3053: if(!stricmp(p,"FILE_LIST")) {
3054: fprintf(out,"%c",CS_FILE_LIST);
3055: continue; }
3056: if(!stricmp(p,"FILE_LIST_EXTENDED")) {
3057: fprintf(out,"%c",CS_FILE_LIST_EXTENDED);
3058: continue; }
3059: if(!stricmp(p,"FILE_VIEW")) {
3060: fprintf(out,"%c",CS_FILE_VIEW);
3061: continue; }
3062: if(!stricmp(p,"FILE_FIND_TEXT")) {
3063: fprintf(out,"%c",CS_FILE_FIND_TEXT);
3064: continue; }
3065: if(!stricmp(p,"FILE_FIND_TEXT_ALL")) {
3066: fprintf(out,"%c",CS_FILE_FIND_TEXT_ALL);
3067: continue; }
3068: if(!stricmp(p,"FILE_FIND_NAME")) {
3069: fprintf(out,"%c",CS_FILE_FIND_NAME);
3070: continue; }
3071: if(!stricmp(p,"FILE_FIND_NAME_ALL")) {
3072: fprintf(out,"%c",CS_FILE_FIND_NAME_ALL);
3073: continue; }
3074: if(!stricmp(p,"FILE_BATCH_SECTION")) {
3075: fprintf(out,"%c",CS_FILE_BATCH_SECTION);
3076: continue; }
3077: if(!stricmp(p,"FILE_TEMP_SECTION")) {
3078: fprintf(out,"%c",CS_FILE_TEMP_SECTION);
3079: continue; }
3080: if(!stricmp(p,"FILE_NEW_SCAN")) {
3081: fprintf(out,"%c",CS_FILE_NEW_SCAN);
3082: continue; }
3083: if(!stricmp(p,"FILE_NEW_SCAN_ALL")) {
3084: fprintf(out,"%c",CS_FILE_NEW_SCAN_ALL);
3085: continue; }
3086: if(!stricmp(p,"FILE_NEW_SCAN_CFG")) {
3087: fprintf(out,"%c",CS_FILE_NEW_SCAN_CFG);
3088: continue; }
3089: if(!stricmp(p,"FILE_PTRS_CFG")) {
3090: fprintf(out,"%c",CS_FILE_PTRS_CFG);
3091: continue; }
3092: if(!stricmp(p,"FILE_BATCH_ADD")) {
3093: fprintf(out,"%c",CS_FILE_BATCH_ADD);
3094: continue; }
3095: if(!stricmp(p,"FILE_BATCH_ADD_LIST")) {
3096: fprintf(out,"%c",CS_FILE_BATCH_ADD_LIST);
3097: continue; }
3098: if(!stricmp(p,"FILE_BATCH_CLEAR")) {
3099: fprintf(out,"%c",CS_FILE_BATCH_CLEAR);
3100: continue; }
3101:
3102: if(!stricmp(p,"INC_MAIN_CMDS")) {
3103: fprintf(out,"%c",CS_INC_MAIN_CMDS);
3104: continue; }
3105: if(!stricmp(p,"INC_FILE_CMDS")) {
3106: fprintf(out,"%c",CS_INC_FILE_CMDS);
3107: continue; }
3108:
3109: break; }
3110:
3111:
3112: if(!feof(in)) {
3113: printf("SYNTAX ERROR:\n");
3114: printf(linestr,src,line,save);
3115: exit(1); }
3116: fclose(in);
3117: free(str);
3118: free(save);
3119: }
3120:
3121: char *banner= "\n"
3122: "BAJA v2.20 - Synchronet Shell/Module Compiler - "
3123: "Copyright 2000 Rob Swindell\n";
3124:
3125: char *usage= "\n"
3126: "usage: baja [/opts] file[.src]\n"
3127: "\n"
3128: " opts: /d display debug during compile\n"
3129: " /c case sensitive variables, labels, and macros\n"
3130: " /o set output directory (e.g. /o/sbbs/exec)\n"
3131: " /q quiet mode (no banner)\n"
3132: ;
3133:
3134: int main(int argc, char **argv)
3135: {
3136: uchar str[128],src[128]="",*p,outdir[128]="",outfname[128]="";
3137: int i,j;
3138: int show_banner=1;
3139:
3140: for(i=1;i<argc;i++)
3141: if(argv[i][0]=='/')
3142: switch(toupper(argv[i][1])) {
3143: case 'D':
3144: display=1;
3145: break;
3146: case 'C':
3147: case_sens=1;
3148: break;
3149: case 'O':
3150: strcpy(outdir,argv[i]+2);
3151: break;
3152: case 'Q':
3153: show_banner=0;
3154: break;
3155: default:
3156: printf(banner);
3157: printf(usage);
3158: exit(1); }
3159: else
3160: strcpy(src,argv[i]);
3161:
3162: if(show_banner)
3163: printf(banner);
3164:
3165: if(!src[0]) {
3166: printf(usage);
3167: exit(1); }
3168:
3169: strcpy(str,src);
3170: if(!strchr(str,'.'))
3171: sprintf(src,"%s.src",str);
3172:
3173: strcpy(str,src);
3174: p=strrchr(str,'.');
3175: if(p)
3176: *p=0;
3177: strcat(str,".bin");
3178:
3179: if(outdir[0]) {
3180: p=strrchr(str,'\\');
3181: if(!p)
3182: p=strrchr(str,':');
3183: if(p)
3184: strcpy(outfname,p+1);
3185: else
3186: strcpy(outfname,str);
3187: if(outdir[strlen(outdir)-1]!='\\'
3188: && outdir[strlen(outdir)-1]!=':')
3189: strcat(outdir,"\\");
3190: sprintf(str,"%s%s",outdir,outfname); }
3191:
3192: if((out=fopen(str,"wb"))==NULL) {
3193: printf("error opening %s for write\n",str);
3194: exit(1); }
3195:
3196: atexit(bail);
3197:
3198: printf("\nCompiling %s...\n",src);
3199:
3200: compile(src);
3201:
3202: /****************************/
3203: /* Resolve GOTOS and CALLS */
3204: /****************************/
3205:
3206: printf("Resolving labels...\n");
3207:
3208: for(i=0;i<gotos;i++) {
3209: for(j=0;j<labels;j++)
3210: if(!stricmp(goto_label[i],label_name[j]))
3211: break;
3212: if(j>=labels) {
3213: printf("%s line %d: label (%s) not found.\n"
3214: ,goto_file[i],goto_line[i],goto_label[i]);
3215: exit(1); }
3216: fseek(out,(long)(goto_indx[i]+1),SEEK_SET);
3217: fwrite(&label_indx[j],2,1,out); }
3218:
3219: for(i=0;i<calls;i++) {
3220: for(j=0;j<labels;j++)
3221: if((!case_sens
3222: && !strnicmp(call_label[i],label_name[j],strlen(call_label[i])))
3223: || (case_sens
3224: && !strncmp(call_label[i],label_name[j],strlen(call_label[i]))))
3225: break;
3226: if(j>=labels) {
3227: printf("%s line %d: label (%s) not found.\n"
3228: ,call_file[i],call_line[i],call_label[i]);
3229: exit(1); }
3230: fseek(out,(long)(call_indx[i]+1),SEEK_SET);
3231: fwrite(&label_indx[j],2,1,out); }
3232:
3233: fclose(out);
3234: out=NULL; /* so bail() won't truncate */
3235:
3236: printf("\nDone.\n");
3237: return(0);
3238: }
3239:
3240:
3241:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.