home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1998 September / PCO_0998.ISO / filesbbs / dos / sbbs_src.exe / SBBS / BAJA / BAJA.C next >
Encoding:
C/C++ Source or Header  |  1997-05-30  |  81.4 KB  |  3,116 lines

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