/* baja.c */ /* Synchronet command shell/module compiler */ /* $Id$ */ /**************************************************************************** * @format.tab-size 4 (Plain Text/Source Code File Header) * * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * * * * Copyright 2005 Rob Swindell - http://www.synchro.net/copyright.html * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * * as published by the Free Software Foundation; either version 2 * * of the License, or (at your option) any later version. * * See the GNU General Public License for more details: gpl.txt or * * http://www.fsf.org/copyleft/gpl.html * * * * Anonymous FTP access to the most recent released source is available at * * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * * * * Anonymous CVS access to the development source and modification history * * is available at cvs.synchro.net:/cvsroot/sbbs, example: * * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * * (just hit return, no password is necessary) * * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * * * * For Synchronet coding style and modification guidelines, see * * http://www.synchro.net/source.html * * * * You are encouraged to submit any modifications (preferably in Unix diff * * format) via e-mail to mods@synchro.net * * * * Note: If this box doesn't appear square, then you need to fix your tabs. * ****************************************************************************/ /* OS-specific */ #ifndef __unix__ #include <io.h> #include <share.h> #endif /* ANSI */ #include <stdio.h> #include <string.h> #include <ctype.h> #include <fcntl.h> #include <errno.h> /* Synchronet-specific */ #include "cmdshell.h" #include "ars_defs.h" #include "crc32.h" #include "genwrap.h" /* portability wrappers */ #include "dirwrap.h" /* MAX_PATH */ #ifdef __BORLANDC__ unsigned _stklen=20000; /* Set stack size in code, not header */ #endif char **label_name=NULL ,**goto_file=NULL ,**goto_label=NULL ,**call_file=NULL ,**call_label=NULL; uint32_t *var_name=NULL,vars=0; char **define_str=NULL ,**define_val=NULL; char *linestr="%s %d: %s\n"; char tmp[256]; uint *label_indx=NULL ,*goto_indx=NULL ,*goto_line=NULL ,*call_indx=NULL ,*call_line=NULL; char bin_file[MAX_PATH+1]; char output_dir[MAX_PATH+1]; char include_dir[MAX_PATH+1]; uint display=0,line=0,labels=0,gotos=0,calls=0,defines=0,case_sens=0; BOOL pause_on_error=FALSE; FILE *out=NULL; void bail(int retval) { if(out) fclose(out); if(retval!=0) { if(bin_file[0]!=0) remove(bin_file); if(pause_on_error) { printf("\nHit enter to contiue..."); getchar(); } } exit(retval); } /****************************************************************************/ /* Converts an ASCII Hex string into an ulong */ /****************************************************************************/ uint32_t ahtoul(char *str) { uint32_t l,val=0; while((l=(*str++)|0x20)!=0x20) val=(l&0xf)+(l>>6&1)*9+val*16; return(val); } /* C Escape char */ uchar cesc(char ch) { switch(ch) { case 'e': return(ESC); case 'r': return(CR); case 'n': return(LF); case 't': return(TAB); case 'b': return(BS); case 'a': return(BEL); case 'f': return(FF); case 'v': return(11); default: return(ch); } } int32_t val(char *src, char *p) { static int inside; int32_t l; if(isdigit((uchar)*p) || *p=='-') /* Dec, Hex, or Oct */ l=strtol(p,&p,0); else if(*p=='\'') { /* Char */ p++; if(*p=='\\') { p++; l=cesc(*p); } else l=*p; p++; } else if(*p=='.') /* Bit */ l=1L<<strtol(p+1,&p,0); else { printf("!SYNTAX ERROR (expecting integer constant):\n"); printf(linestr,src,line,*p ? p : "<end of line>"); bail(1); return(0); } if(inside) { return(l); } inside=1; while(*p) switch(*(p++)) { case '+': l+=val(src,p); break; case '-': l-=val(src,p); break; case '*': l*=val(src,p); break; case '/': l/=val(src,p); break; case '%': l%=val(src,p); break; case '&': l&=val(src,p); break; case '|': l|=val(src,p); break; case '~': l&=~val(src,p); break; case '^': l^=val(src,p); break; case '>': if(*p=='>') { p++; l>>=val(src,p); } break; case '<': if(*p=='<') { p++; l<<=val(src,p); } break; case ' ': case '#': inside=0; return(l); } inside=0; return(l); } void writecstr(char *p) { char str[1024]; int j=0,inquotes=0; while(*p) { if(*p=='"') { /* ignore quotes */ if(inquotes) break; inquotes=1; p++; continue; } if(*p=='\\') { /* escape */ p++; if(isdigit((uchar)*p)) { sprintf(tmp,"%.3s",p); str[j]=atoi(tmp); /* decimal, NOT octal */ if(isdigit((uchar)*(++p))) /* skip up to 3 digits */ if(isdigit((uchar)*(++p))) p++; j++; continue; } switch(*(p++)) { case 'x': tmp[0]=*(p++); tmp[1]=0; if(isxdigit((uchar)*p)) { /* if another hex digit, skip too */ tmp[1]=*(p++); tmp[2]=0; } str[j]=(char)ahtoul(tmp); break; case 'e': str[j]=ESC; break; case 'r': str[j]=CR; break; case 'n': str[j]=LF; break; case 't': str[j]=TAB; break; case 'b': str[j]=BS; break; case 'a': str[j]=BEL; break; case 'f': str[j]=FF; break; case 'v': str[j]=11; /* VT */ break; default: str[j]=*(p-1); break; } j++; continue; } str[j++]=*(p++); } str[j]=0; fwrite(str,1,j+1,out); } void writestr(char *p) { char str[1024]; int j=0; while(*p) { if(*p=='"') { /* ignore quotes */ p++; continue; } if(*p=='\\' && *(p+1)=='"' && *(p+2)) p++; str[j++]=*(p++); } str[j]=0; fwrite(str,1,j+1,out); } void cvttab(char *str) { int i; for(i=0;str[i];i++) if(str[i]==TAB) str[i]=' '; } void newvar(char* src, char *in) { char name[128]; int32_t i,l; if(isdigit((uchar)*in)) { printf("!SYNTAX ERROR (illegal variable name):\n"); printf(linestr,src,line,(char*)in); bail(1); } sprintf(name,"%.80s",in); if(strncmp(name,"var_",4)==0) /* decompiled source? */ l=strtoul(name+4,NULL,16); else { if(!case_sens) strupr(name); l=crc32(name,0); for(i=0;i<vars;i++) if(var_name[i]==l) break; if(i<vars) return; } if((var_name=(uint32_t *)realloc(var_name,sizeof(int32_t)*(vars+1)))==NULL) { printf("Too many (%"PRIu32") variables!\n",vars); bail(1); } var_name[vars]=l; if(display) printf("newvar(%08"PRIX32")=%s\n",l,in); vars++; } void writecrc(char *src, char *in) { char name[128]; char* p; int32_t l; int i; /* Automatically terminate variable name Oct-09-2000 rswindell */ sprintf(name,"%.80s",in); p=strchr(name,' '); if(p) *p=0; if(!stricmp(name,"STR") || !name[0]) l=0; else if(strncmp(name,"var_",4)==0) /* decompiled source? */ l=strtoul(name+4,NULL,16); else { if(!case_sens) strupr(name); l=crc32(name,0); for(i=0;i<vars;i++) if(var_name[i]==l) break; if(i==vars) { printf("!SYNTAX ERROR (expecting variable name):\n"); printf(linestr,src,line,*in ? (char*)in : "<end of line>"); bail(1); } } fwrite(&l,4,1,out); } int32_t isvar(char *arg) { char name[128],*p; int32_t i,l; if(!arg || !(*arg) || isdigit((uchar)*arg)) return(0); sprintf(name,"%.80s",arg); if((p=strchr(name,' '))!=NULL) /* Truncate at first space */ *p=0; if(strncmp(name,"var_",4)==0) /* decompiled source? */ return(strtoul(name+4,NULL,16)); if(!case_sens) strupr(name); l=crc32(name,0); for(i=0;i<vars;i++) if(var_name[i]==l) break; if(i==vars) return(0); return(l); } int str_cmp(char *s1, char *s2) { if(case_sens) return(strcmp(s1,s2)); return(stricmp(s1,s2)); } void expdefs(char *line) { char str[512],*p,*sp,sav[2]={0}; int i; str[0]=0; for(p=line;*p;p++) { if(*p==' ') { strcat(str," "); continue; } if(*p=='"') { /* Skip quoted text */ sp=strchr(p+1,'"'); if(sp) *sp=0; strcat(str,p); if(!sp) break; strcat(str,"\""); p+=strlen(p); continue; } for(sp=p;*sp;sp++) if(!isalnum((uchar)*sp) && *sp!='_') break; sav[0]=*sp; /* Save delimiter */ sav[1]=0; *sp=0; for(i=0;i<defines;i++) if(!str_cmp(define_str[i],p)) break; if(i<defines) strcat(str,define_val[i]); else strcat(str,p); if(!sav[0]) /* Last argument */ break; p+=strlen(p); strcat(str,sav); /* Restore delimiter */ } strcpy(line,str); } #define SKIPCTRLSP(p) while(*(p)<=' ' && *(p)>0) (p)++ void compile(char *src) { char *str,*save,*p,*sp,*tp,*arg,*arg2,*arg3,*arg4,ch; uchar *ar; char path[MAX_PATH+1]; uint16_t i; uint16_t j; int32_t l; int savline; FILE *in; if((in=fopen(src,"rb"))==NULL) { printf("error %d opening %s for read\n",errno,src); bail(1); } line=0; if((str=malloc(1024))==NULL) { printf("malloc error\n"); bail(1); } if((save=malloc(1024))==NULL) { printf("malloc error\n"); bail(1); } while(!feof(in) && !ferror(in)) { if(!fgets(str,1000,in)) break; truncsp(str); cvttab(str); line++; strcpy(save,str); p=str; SKIPCTRLSP(p); /* look for beginning of command */ if((*p)==0) continue; if(*p=='#') /* remarks start with # */ continue; expdefs(p); /* expand defines */ if(display) printf("%s\n",p); sp=strchr(p,' '); arg=arg2=arg3=arg4=""; if(sp) { *sp=0; arg=sp+1; SKIPCTRLSP(arg); sp=strchr(arg,' '); if(sp) { arg2=sp+1; SKIPCTRLSP(arg2); sp=strchr(arg2,' '); if(sp) { arg3=sp+1; SKIPCTRLSP(arg3); sp=strchr(arg3,' '); if(sp) { arg4=sp+1; SKIPCTRLSP(arg4); } } } } if(!stricmp(p,"!INCLUDE")) { savline=line; sp=strchr(arg,' '); if(sp) *sp=0; sprintf(path,"%s%s",include_dir,arg); compile(path); line=savline; continue; } if(!stricmp(p,"!DEFINE")) { /* define */ sp=strchr(arg,' '); if(sp) *sp=0; else break; tp=strrchr(arg2,'\"'); if(!tp) tp=arg2; sp=strchr(tp,'#'); if(sp) *sp=0; truncsp(arg2); if((define_str=(char **)realloc(define_str,sizeof(char *)*(defines+1))) ==NULL) { printf("Too many defines.\n"); bail(1); } if((define_str[defines]=(char *)malloc(strlen(arg)+1))==NULL) { printf("Too many defines.\n"); bail(1); } if((define_val=(char **)realloc(define_val,sizeof(char *)*(defines+1))) ==NULL) { printf("Too many defines.\n"); bail(1); } if((define_val[defines]=(char *)malloc(strlen(arg2)+1))==NULL) { printf("Too many defines.\n"); bail(1); } strcpy(define_str[defines],arg); strcpy(define_val[defines],arg2); defines++; continue; } if(!stricmp(p,"!GLOBAL")) { /* declare global variables */ if(!(*arg)) break; for(p=arg;*p && *p!='#';) { sp=strchr(p,' '); if(sp) *sp=0; newvar(src,p); if(!sp) break; p=sp+1; SKIPCTRLSP(p); } continue; } if(!stricmp(p,"PATCH")) { if(!(*arg)) break; p=arg; while(*p) { SKIPCTRLSP(p); tmp[0]=*p++; tmp[1]=*p++; tmp[2]=0; if(!tmp[0]) break; ch=ahtoul(tmp); fputc(ch,out); } continue; } if(!stricmp(p,"SHOW_VARS")) { fputc(CS_VAR_INSTRUCTION,out); fputc(SHOW_VARS,out); continue; } if(!stricmp(p,"COMPARE_ARS")) { if(!(*arg)) break; strupr(arg); ar=arstr(&i,arg,NULL); fprintf(out,"%c%c",CS_COMPARE_ARS,(uchar)i); fwrite(ar,i,1,out); continue; } if(!stricmp(p,"CHKSYSPASS")) { fprintf(out,"%c",CS_CHKSYSPASS); continue; } if(!stricmp(p,"INFO_SYSTEM")) { fprintf(out,"%c",CS_INFO_SYSTEM); continue; } if(!stricmp(p,"INFO_SUBBOARD")) { fprintf(out,"%c",CS_INFO_SUBBOARD); continue; } if(!stricmp(p,"INFO_DIRECTORY")) { fprintf(out,"%c",CS_INFO_DIRECTORY); continue; } if(!stricmp(p,"INFO_VERSION")) { fprintf(out,"%c",CS_INFO_VERSION); continue; } if(!stricmp(p,"INFO_USER")) { fprintf(out,"%c",CS_INFO_USER); continue; } if(!stricmp(p,"INFO_XFER_POLICY")) { fprintf(out,"%c",CS_INFO_XFER_POLICY); continue; } if(!stricmp(p,"LOGKEY")) { fprintf(out,"%c",CS_LOGKEY); continue; } if(!stricmp(p,"LOGKEY_COMMA")) { fprintf(out,"%c",CS_LOGKEY_COMMA); continue; } if(!stricmp(p,"LOGSTR")) { fprintf(out,"%c",CS_LOGSTR); continue; } if(!stricmp(p,"ONLINE")) { fprintf(out,"%c%c",CS_ONE_MORE_BYTE,CS_ONLINE); continue; } if(!stricmp(p,"OFFLINE")) { fprintf(out,"%c%c",CS_ONE_MORE_BYTE,CS_OFFLINE); continue; } if(!stricmp(p,"NEWUSER")) { fprintf(out,"%c%c",CS_ONE_MORE_BYTE,CS_NEWUSER); continue; } if(!stricmp(p,"LOGON")) { fprintf(out,"%c%c",CS_ONE_MORE_BYTE,CS_LOGON); continue; } if(!stricmp(p,"LOGOUT")) { fprintf(out,"%c%c",CS_ONE_MORE_BYTE,CS_LOGOUT); continue; } if(!stricmp(p,"EXIT")) { fprintf(out,"%c%c",CS_ONE_MORE_BYTE,CS_EXIT); continue; } if(!stricmp(p,"LOOP") || !stricmp(p,"LOOP_BEGIN")) { fprintf(out,"%c%c",CS_ONE_MORE_BYTE,CS_LOOP_BEGIN); continue; } if(!stricmp(p,"CONTINUE") || !stricmp(p,"CONTINUE_LOOP")) { fprintf(out,"%c%c",CS_ONE_MORE_BYTE,CS_CONTINUE_LOOP); continue; } if(!stricmp(p,"BREAK") || !stricmp(p,"BREAK_LOOP")) { fprintf(out,"%c%c",CS_ONE_MORE_BYTE,CS_BREAK_LOOP); continue; } if(!stricmp(p,"END_LOOP")) { fprintf(out,"%c%c",CS_ONE_MORE_BYTE,CS_END_LOOP); continue; } if(!stricmp(p,"USER_EVENT")) { if(!(*arg)) break; if((l=isvar(arg))!=0) { fputc(CS_USE_INT_VAR,out); fwrite(&l,4,1,out); /* variable */ fputc(2,out); /* int offset */ fputc(1,out); /* int length */ ch=0; } /* place holder */ else ch=val(src,arg); fprintf(out,"%c%c",CS_TWO_MORE_BYTES,CS_USER_EVENT); fwrite(&ch,1,1,out); continue; } if(!stricmp(p,"PUT_NODE")) { fprintf(out,"%c",CS_PUT_NODE); continue; } if(!stricmp(p,"SYNC")) { fprintf(out,"%c",CS_SYNC); continue; } if(!stricmp(p,"ASYNC")) { fprintf(out,"%c",CS_ASYNC); continue; } if(!stricmp(p,"RIOSYNC")) { /* deprecated */ fprintf(out,"%c",CS_SYNC); continue; } if(!stricmp(p,"GETTIMELEFT")) { fprintf(out,"%c",CS_GETTIMELEFT); continue; } if(!stricmp(p,"SAVELINE")) { fprintf(out,"%c",CS_SAVELINE); continue; } if(!stricmp(p,"RESTORELINE")) { fprintf(out,"%c",CS_RESTORELINE); continue; } if(!stricmp(p,"IF_TRUE") || !stricmp(p,"IF_EQUAL")) { fprintf(out,"%c",CS_IF_TRUE); continue; } if(!stricmp(p,"IF_FALSE") || !stricmp(p,"IF_NOT_EQUAL")) { fprintf(out,"%c",CS_IF_FALSE); continue; } if(!stricmp(p,"IF_GREATER")) { fprintf(out,"%c",CS_IF_GREATER); continue; } if(!stricmp(p,"IF_GREATER_OR_EQUAL") || !stricmp(p,"IF_EQUAL_OR_GREATER")) { fprintf(out,"%c",CS_IF_GREATER_OR_EQUAL); continue; } if(!stricmp(p,"IF_LESS")) { fprintf(out,"%c",CS_IF_LESS); continue; } if(!stricmp(p,"IF_LESS_OR_EQUAL") || !stricmp(p,"IF_EQUAL_OR_LESS")) { fprintf(out,"%c",CS_IF_LESS_OR_EQUAL); continue; } if(!stricmp(p,"ENDIF") || !stricmp(p,"END_IF")) { fprintf(out,"%c",CS_ENDIF); continue; } if(!stricmp(p,"ELSE")) { fprintf(out,"%c",CS_ELSE); continue; } if(p[0]==':') { /* :label */ p++; sp=strchr(p,' '); if(sp) *sp=0; for(i=0;i<labels;i++) if(!stricmp(label_name[i],p)) break; if(i<labels) { printf("!SYNTAX ERROR (duplicate label name):\n"); printf(linestr,src,line,p); bail(1); } if((label_name=(char **)realloc(label_name,sizeof(char *)*(labels+1))) ==NULL) { printf("Too many labels.\n"); bail(1); } if((label_indx=(uint *)realloc(label_indx,sizeof(int)*(labels+1))) ==NULL) { printf("Too many labels.\n"); bail(1); } if((label_name[labels]=(char *)malloc(strlen(p)+1))==NULL) { printf("Too many labels.\n"); bail(1); } strcpy(label_name[labels],p); label_indx[labels]=ftell(out); labels++; continue; } if(!stricmp(p,"GOTO")) { /* goto */ if(!(*arg)) break; sp=strchr(arg,' '); if(sp) *sp=0; if((goto_label=(char **)realloc(goto_label,sizeof(char *)*(gotos+1))) ==NULL) { printf("Too many gotos.\n"); bail(1); } if((goto_file=(char **)realloc(goto_file,sizeof(char *)*(gotos+1))) ==NULL) { printf("Too many gotos.\n"); bail(1); } if((goto_indx=(uint *)realloc(goto_indx,sizeof(int)*(gotos+1))) ==NULL) { printf("Too many gotos.\n"); bail(1); } if((goto_line=(uint *)realloc(goto_line,sizeof(int)*(gotos+1))) ==NULL) { printf("Too many gotos.\n"); bail(1); } if((goto_label[gotos]=(char *)malloc(strlen(arg)+1))==NULL) { printf("Too many gotos.\n"); bail(1); } if((goto_file[gotos]=(char *)malloc(strlen(str)+1))==NULL) { printf("Too many gotos.\n"); bail(1); } strcpy(goto_label[gotos],arg); strcpy(goto_file[gotos],str); goto_indx[gotos]=ftell(out); goto_line[gotos]=line; gotos++; fprintf(out,"%c%c%c",CS_GOTO,0xff,0xff); continue; } if(!stricmp(p,"CALL")) { /* call */ if(!(*arg)) break; sp=strchr(arg,' '); if(sp) *sp=0; if((call_label=(char **)realloc(call_label,sizeof(char *)*(calls+1))) ==NULL) { printf("Too many calls.\n"); bail(1); } if((call_file=(char **)realloc(call_file,sizeof(char *)*(calls+1))) ==NULL) { printf("Too many calls.\n"); bail(1); } if((call_indx=(uint *)realloc(call_indx,sizeof(int)*(calls+1))) ==NULL) { printf("Too many calls.\n"); bail(1); } if((call_line=(uint *)realloc(call_line,sizeof(int)*(calls+1))) ==NULL) { printf("Too many calls.\n"); bail(1); } if((call_label[calls]=(char *)malloc(strlen(arg)+1))==NULL) { printf("Too many calls.\n"); bail(1); } if((call_file[calls]=(char *)malloc(strlen(src)+1))==NULL) { printf("Too many calls.\n"); bail(1); } strcpy(call_label[calls],arg); strcpy(call_file[calls],src); call_indx[calls]=ftell(out); call_line[calls]=line; calls++; fprintf(out,"%c%c%c",CS_CALL,0xff,0xff); continue; } if(!stricmp(p,"RETURN")) { fprintf(out,"%c",CS_RETURN); continue; } if(!stricmp(p,"CMD_HOME")) { fprintf(out,"%c",CS_CMD_HOME); continue; } if(!stricmp(p,"CMDKEY")) { if(!(*arg)) break; if(!stricmp(arg,"DIGIT")) ch=CS_DIGIT; else if(!stricmp(arg,"EDIGIT")) ch=CS_EDIGIT; else ch=toupper(*arg); if(ch=='/') ch=*(arg+1)|0x80; /* high bit indicates slash required */ else if(ch=='^' && (*(arg+1)>=0x40)) ch=*(arg+1)-0x40; /* ctrl char */ else if(ch=='\\') ch=cesc(*(arg+1)); else if(ch=='\'') ch=*(arg+1); fprintf(out,"%c%c",CS_CMDKEY,ch); continue; } if(!stricmp(p,"CMDCHAR")) { if(!(*arg)) break; fprintf(out,"%c%c",CS_CMDKEY,*arg); continue; } if(!stricmp(p,"SETLOGIC") || !stricmp(p,"SET_LOGIC")) { if(!(*arg)) break; if(!stricmp(arg,"TRUE") || !stricmp(arg,"EQUAL")) ch=LOGIC_TRUE; else if(!stricmp(arg,"GREATER")) ch=LOGIC_GREATER; else if(!stricmp(arg,"LESS")) ch=LOGIC_LESS; else ch=LOGIC_FALSE; fprintf(out,"%c%c",CS_SETLOGIC,ch); continue; } if(!stricmp(p,"DEFINE_STR_VAR") || !stricmp(p,"STR")) { if(!(*arg)) break; for(p=arg;*p && *p!='#';) { sp=strchr(p,' '); if(sp) *sp=0; fputc(CS_VAR_INSTRUCTION,out); fputc(DEFINE_STR_VAR,out); newvar(src,p); writecrc(src,p); if(!sp) break; p=sp+1; SKIPCTRLSP(p); } continue; } if(!stricmp(p,"DEFINE_INT_VAR") || !stricmp(p,"INT")) { if(!(*arg)) break; for(p=arg;*p && *p!='#';) { sp=strchr(p,' '); if(sp) *sp=0; fputc(CS_VAR_INSTRUCTION,out); fputc(DEFINE_INT_VAR,out); newvar(src,p); writecrc(src,p); if(!sp) break; p=sp+1; SKIPCTRLSP(p); } continue; } if(!stricmp(p,"DEFINE_GLOBAL_STR_VAR") || !stricmp(p,"GLOBAL_STR")) { if(!(*arg)) break; for(p=arg;*p && *p!='#';) { sp=strchr(p,' '); if(sp) *sp=0; fputc(CS_VAR_INSTRUCTION,out); fputc(DEFINE_GLOBAL_STR_VAR,out); newvar(src,p); writecrc(src,p); if(!sp) break; p=sp+1; SKIPCTRLSP(p); } continue; } if(!stricmp(p,"DEFINE_GLOBAL_INT_VAR") || !stricmp(p,"GLOBAL_INT")) { if(!(*arg)) break; for(p=arg;*p && *p!='#';) { sp=strchr(p,' '); if(sp) *sp=0; fputc(CS_VAR_INSTRUCTION,out); fputc(DEFINE_GLOBAL_INT_VAR,out); newvar(src,p); writecrc(src,p); if(!sp) break; p=sp+1; SKIPCTRLSP(p); } continue; } if(!stricmp(p,"LOGIN")) { if(!(*arg)) break; fputc(CS_STR_FUNCTION,out); fputc(CS_LOGIN,out); writecstr(arg); continue; } if(!stricmp(p,"LOAD_TEXT")) { if(!(*arg)) break; fputc(CS_STR_FUNCTION,out); fputc(CS_LOAD_TEXT,out); writestr(arg); continue; } if(!stricmp(p,"SET_STR_VAR") || (!stricmp(p,"SET") && strchr(arg,'"'))) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(SET_STR_VAR,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); writecstr(arg2); continue; } if(!stricmp(p,"CAT_STR_VAR") || (!stricmp(p,"STRCAT") && strchr(arg,'"'))) { fputc(CS_VAR_INSTRUCTION,out); fputc(CAT_STR_VAR,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); writecstr(arg2); continue; } if((!stricmp(p,"STRSTR") || !stricmp(p,"COMPARE_SUBSTR")) && strchr(arg,'"')) { fputc(CS_VAR_INSTRUCTION,out); fputc(STRSTR_VAR,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); writecstr(arg2); continue; } if(!stricmp(p,"STRSTR") || !stricmp(p,"COMPARE_SUBSTR")) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(STRSTR_VARS,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); writecrc(src,arg2); continue; } if(!stricmp(p,"COPY_CHAR") || !stricmp(p,"COPY_KEY")) { if(!(*arg)) break; fprintf(out,"%c%c",CS_VAR_INSTRUCTION,COPY_CHAR); writecrc(src,arg); continue; } if(!stricmp(p,"COPY_FIRST_CHAR")) { if(!(*arg) || !(*arg2)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(COPY_FIRST_CHAR,out); writecrc(src,arg); writecrc(src,arg2); continue; } if(!stricmp(p,"COMPARE_FIRST_CHAR")) { if(!(*arg) || !(*arg2)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(COMPARE_FIRST_CHAR,out); writecrc(src,arg); fputc((uchar)val(src,arg2),out); continue; } if(!stricmp(p,"CAT_STR_VARS") || !stricmp(p,"STRCAT")) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(CAT_STR_VARS,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); writecrc(src,arg2); continue; } if(!stricmp(p,"FORMAT") || !stricmp(p,"SPRINTF")) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(FORMAT_STR_VAR,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); /* Write destination variable */ p++; SKIPCTRLSP(p); arg=p; p=strrchr(arg,'"'); if(!p) break; *p=0; p++; SKIPCTRLSP(p); writecstr(arg); /* Write string */ l=ftell(out); fputc(0,out); /* Write total number of args */ i=0; while(p && *p) { arg=p; p=strchr(arg,' '); if(p) { *p=0; p++; } writecrc(src,arg); i++; } fseek(out,l,SEEK_SET); fputc((char)i,out); fseek(out,i*4,SEEK_CUR); continue; } if(!stricmp(p,"STRFTIME") || !stricmp(p,"FTIME_STR")) { if(!(*arg) || !(*arg2) || !(*arg3)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(FORMAT_TIME_STR,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); /* Write destination variable */ p++; SKIPCTRLSP(p); arg=p; p=strrchr(arg,'"'); if(!p) break; *p=0; writecstr(arg); /* Write string */ p++; SKIPCTRLSP(p); writecrc(src,p); continue; } if(!stricmp(p,"TIME_STR")) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(TIME_STR,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); writecrc(src,arg2); continue; } if(!stricmp(p,"DATE_STR")) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(DATE_STR,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); writecrc(src,arg2); continue; } if(!stricmp(p,"SECOND_STR")) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(SECOND_STR,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); writecrc(src,arg2); continue; } if(!stricmp(p,"SET_INT_VAR") || (!stricmp(p,"SET") && *arg2!='"')) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(SET_INT_VAR,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); l=val(src,arg2); fwrite(&l,4,1,out); continue; } if(!stricmp(p,"COMPARE_STR_VAR") || (!stricmp(p,"COMPARE") && *arg2=='"')) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(COMPARE_STR_VAR,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); writecstr(arg2); continue; } if(!stricmp(p,"COMPARE_STRN_VAR") || ((!stricmp(p,"STRNCMP") || !stricmp(p,"COMPARE_STRN")) && *arg3 && strchr(arg3,'"'))) { if((l=isvar(arg))!=0) { fputc(CS_USE_INT_VAR,out); fwrite(&l,4,1,out); /* variable */ fputc(2,out); /* int offset */ fputc(1,out); /* int length */ i=0; } /* place holder */ else i=val(src,arg); fputc(CS_VAR_INSTRUCTION,out); fputc(STRNCMP_VAR,out); fwrite(&i,1,1,out); /* Length */ p=strchr(arg2,' '); if(!p) break; *p=0; p++; SKIPCTRLSP(p); writecrc(src,arg2); writecstr(p); continue; } if(!stricmp(p,"COMPARE_STRN_VARS") || !stricmp(p,"STRNCMP") || !stricmp(p,"COMPARE_STRN")) { if(!(*arg) || !(*arg2) || !(*arg3)) break; if((l=isvar(arg))!=0) { fputc(CS_USE_INT_VAR,out); fwrite(&l,4,1,out); /* variable */ fputc(2,out); /* int offset */ fputc(1,out); /* int length */ i=0; } /* place holder */ else i=val(src,arg); fputc(CS_VAR_INSTRUCTION,out); fputc(STRNCMP_VARS,out); fwrite(&i,1,1,out); /* Length */ p=strchr(arg2,' '); if(!p) break; *p=0; p++; SKIPCTRLSP(p); writecrc(src,arg2); writecrc(src,p); continue; } if(!stricmp(p,"COMPARE_INT_VAR") || (!stricmp(p,"COMPARE") && (isdigit((uchar)*arg2) || atol(arg2) || *arg2=='\'' || *arg2=='.'))) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(COMPARE_INT_VAR,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); l=val(src,arg2); fwrite(&l,4,1,out); continue; } if(!stricmp(p,"COMPARE")) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(COMPARE_VARS,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); writecrc(src,arg2); continue; } if(!stricmp(p,"COPY")) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(COPY_VAR,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); writecrc(src,arg2); continue; } if(!stricmp(p,"SWAP")) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(SWAP_VARS,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); writecrc(src,arg2); continue; } if(!stricmp(p,"TIME")) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(TIME_INT_VAR,out); writecrc(src,arg); continue; } if(!stricmp(p,"DATE_INT")) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(DATE_STR_TO_INT,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); writecrc(src,arg2); continue; } if(!stricmp(p,"CRC16")) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(CRC16_TO_INT,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); writecrc(src,arg2); continue; } if(!stricmp(p,"CRC32")) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(CRC32_TO_INT,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); writecrc(src,arg2); continue; } if(!stricmp(p,"CHKSUM")) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(CHKSUM_TO_INT,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); writecrc(src,arg2); continue; } if(!stricmp(p,"ADD_INT_VAR") || (!stricmp(p,"ADD") && (isdigit((uchar)*arg2) || atol(arg2) || *arg2=='\'' || *arg2=='.'))) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(ADD_INT_VAR,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); l=val(src,arg2); if(!l) break; fwrite(&l,4,1,out); continue; } if(!stricmp(p,"ADD_INT_VARS") || !stricmp(p,"ADD")) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(ADD_INT_VARS,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); writecrc(src,arg2); continue; } if(!stricmp(p,"SUB_INT_VAR") || (!stricmp(p,"SUB") && (isdigit((uchar)*arg2) || atol(arg2) || *arg2=='\'' || *arg2=='.'))) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(SUB_INT_VAR,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); l=val(src,arg2); if(!l) break; fwrite(&l,4,1,out); continue; } if(!stricmp(p,"SUB_INT_VARS") || !stricmp(p,"SUB")) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(SUB_INT_VARS,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); writecrc(src,arg2); continue; } if(!stricmp(p,"MUL_INT_VAR") || (!stricmp(p,"MUL") && (isdigit((uchar)*arg2) || atol(arg2) || *arg2=='\'' || *arg2=='.'))) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(MUL_INT_VAR,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); l=val(src,arg2); if(!l) break; fwrite(&l,4,1,out); continue; } if(!stricmp(p,"MUL_INT_VARS") || !stricmp(p,"MUL")) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(MUL_INT_VARS,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); writecrc(src,arg2); continue; } if(!stricmp(p,"DIV_INT_VAR") || (!stricmp(p,"DIV") && (isdigit((uchar)*arg2) || atol(arg2) || *arg2=='\'' || *arg2=='.'))) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(DIV_INT_VAR,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); l=val(src,arg2); if(!l) break; fwrite(&l,4,1,out); continue; } if(!stricmp(p,"DIV_INT_VARS") || !stricmp(p,"DIV")) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(DIV_INT_VARS,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); writecrc(src,arg2); continue; } if(!stricmp(p,"MOD_INT_VAR") || (!stricmp(p,"MOD") && (isdigit((uchar)*arg2) || atol(arg2) || *arg2=='\'' || *arg2=='.'))) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(MOD_INT_VAR,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); l=val(src,arg2); if(!l) break; fwrite(&l,4,1,out); continue; } if(!stricmp(p,"MOD_INT_VARS") || !stricmp(p,"MOD")) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(MOD_INT_VARS,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); writecrc(src,arg2); continue; } if(!stricmp(p,"AND_INT_VAR") || (!stricmp(p,"AND") && (isdigit((uchar)*arg2) || atol(arg2) || *arg2=='\'' || *arg2=='.'))) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(AND_INT_VAR,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); l=val(src,arg2); fwrite(&l,4,1,out); continue; } if(!stricmp(p,"AND_INT_VARS") || !stricmp(p,"AND")) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(AND_INT_VARS,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); writecrc(src,arg2); continue; } if(!stricmp(p,"COMPARE_ANY_BITS") || !stricmp(p,"COMPARE_ALL_BITS")) { if(!(*arg) || !(*arg2)) break; if((l=isvar(arg2))!=0) { fputc(CS_USE_INT_VAR,out); fwrite(&l,4,1,out); /* variable */ fputc(6,out); /* int offset */ fputc(4,out); /* int length */ l=0; } /* place holder */ else l=val(src,arg2); fprintf(out,"%c%c",CS_VAR_INSTRUCTION ,!stricmp(p,"COMPARE_ANY_BITS") ? COMPARE_ANY_BITS : COMPARE_ALL_BITS); writecrc(src,arg); fwrite(&l,sizeof(l),1,out); continue; } if(!stricmp(p,"OR_INT_VAR") || (!stricmp(p,"OR") && (isdigit((uchar)*arg2) || atol(arg2) || *arg2=='\'' || *arg2=='.'))) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(OR_INT_VAR,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); l=val(src,arg2); fwrite(&l,4,1,out); continue; } if(!stricmp(p,"OR_INT_VARS") || !stricmp(p,"OR")) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(OR_INT_VARS,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); writecrc(src,arg2); continue; } if(!stricmp(p,"NOT_INT_VAR") || (!stricmp(p,"NOT") && (isdigit((uchar)*arg2) || atol(arg2) || *arg2=='\'' || *arg2=='.'))) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(NOT_INT_VAR,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); l=val(src,arg2); fwrite(&l,4,1,out); continue; } if(!stricmp(p,"NOT_INT_VARS") || !stricmp(p,"NOT")) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(NOT_INT_VARS,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); writecrc(src,arg2); continue; } if(!stricmp(p,"XOR_INT_VAR") || (!stricmp(p,"XOR") && (isdigit((uchar)*arg2) || atol(arg2) || *arg2=='\'' || *arg2=='.'))) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(XOR_INT_VAR,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); l=val(src,arg2); fwrite(&l,4,1,out); continue; } if(!stricmp(p,"XOR_INT_VARS") || !stricmp(p,"XOR")) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(XOR_INT_VARS,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); writecrc(src,arg2); continue; } if(!stricmp(p,"RANDOM_INT_VAR") || !stricmp(p,"RANDOM")) { if(!(*arg)) break; if((l=isvar(arg2))!=0) { fputc(CS_USE_INT_VAR,out); fwrite(&l,4,1,out); /* variable */ fputc(6,out); /* int offset */ fputc(4,out); /* int length */ l=0; } /* place holder */ else l=val(src,arg2); fputc(CS_VAR_INSTRUCTION,out); fputc(RANDOM_INT_VAR,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); fwrite(&l,4,1,out); continue; } if(!stricmp(p,"SWITCH")) { if(!(*arg)) break; fputc(CS_SWITCH,out); writecrc(src,arg); continue; } if(!stricmp(p,"END_SWITCH")) { fputc(CS_END_SWITCH,out); continue; } if(!stricmp(p,"CASE")) { if(!(*arg)) break; fputc(CS_CASE,out); l=val(src,arg); fwrite(&l,4,1,out); continue; } if(!stricmp(p,"DEFAULT")) { fputc(CS_DEFAULT,out); continue; } if(!stricmp(p,"END_CASE")) { fputc(CS_END_CASE,out); continue; } if(!stricmp(p,"PRINT") && !strchr(arg,'"') && !strchr(arg,'\\') && !strchr(arg,' ')) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); fputc(PRINT_VAR,out); writecrc(src,arg); continue; } if(!stricmp(p,"PRINTF") || !stricmp(p,"LPRINTF") || !stricmp(p,"PRINTF_LOCAL")) { if(!(*arg)) break; fputc(CS_VAR_INSTRUCTION,out); if(!stricmp(p,"PRINTF")) fputc(VAR_PRINTF,out); else fputc(VAR_PRINTF_LOCAL,out); p=strrchr(arg,'"'); if(!p) break; *p=0; p++; SKIPCTRLSP(p); writecstr(arg); /* Write string */ l=ftell(out); fputc(0,out); /* Write total number of args */ i=0; while(p && *p) { arg=p; p=strchr(arg,' '); if(p) { *p=0; p++; } writecrc(src,arg); i++; } fseek(out,l,SEEK_SET); fputc((char)i,out); fseek(out,i*4,SEEK_CUR); continue; } if(!stricmp(p,"FOPEN")) { if(!(*arg) || !(*arg2) || !(*arg3)) break; if((l=isvar(arg2))!=0) { fputc(CS_USE_INT_VAR,out); fwrite(&l,4,1,out); /* variable */ fputc(6,out); /* int offset */ fputc(2,out); /* int length */ i=0; } /* place holder */ else i=val(src,arg2); fputc(CS_FIO_FUNCTION,out); if(*arg3=='"') fputc(FIO_OPEN,out); else fputc(FIO_OPEN_VAR,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); p=strchr(arg2,' '); if(!p) break; *p=0; p++; fwrite(&i,2,1,out); SKIPCTRLSP(p); if(*p=='"') writestr(p); else writecrc(src,p); continue; } if(!stricmp(p,"FCLOSE")) { if(!(*arg)) break; fputc(CS_FIO_FUNCTION,out); fputc(FIO_CLOSE,out); writecrc(src,arg); continue; } if(!stricmp(p,"FFLUSH")) { if(!(*arg)) break; fputc(CS_FIO_FUNCTION,out); fputc(FIO_FLUSH,out); writecrc(src,arg); continue; } if(!stricmp(p,"FREAD")) { if(!(*arg)) break; fputc(CS_FIO_FUNCTION,out); if(!(*arg3) || isdigit((uchar)*arg3) || atoi(arg3)) fputc(FIO_READ,out); else fputc(FIO_READ_VAR,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); /* File handle */ p=strchr(arg2,' '); if(p) *p=0; writecrc(src,arg2); /* Variable */ if(isdigit((uchar)*arg3)) i=val(src,arg3); /* Length */ else i=0; if(i || !(*arg3)) fwrite(&i,2,1,out); else writecrc(src,arg3); continue; } if(!stricmp(p,"FWRITE")) { if(!(*arg)) break; fputc(CS_FIO_FUNCTION,out); if(!(*arg3) || isdigit((uchar)*arg3) || atoi(arg3)) fputc(FIO_WRITE,out); else fputc(FIO_WRITE_VAR,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); /* File handle */ p=strchr(arg2,' '); if(p) *p=0; writecrc(src,arg2); /* Variable */ if(isdigit((uchar)*arg3)) i=val(src,arg3); /* Length */ else i=0; if(i || !(*arg3)) fwrite(&i,2,1,out); else writecrc(src,arg3); continue; } if(!stricmp(p,"FGET_LENGTH") || !stricmp(p,"FGETLENGTH") || !stricmp(p,"GETFLENGTH")) { if(!(*arg) || !(*arg2)) break; fputc(CS_FIO_FUNCTION,out); fputc(FIO_GET_LENGTH,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); /* File handle */ writecrc(src,arg2); /* Variable */ continue; } if(!stricmp(p,"FREAD_LINE")) { if(!(*arg) || !(*arg2)) break; fputc(CS_FIO_FUNCTION,out); fputc(FIO_READ_LINE,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); /* File handle */ writecrc(src,arg2); /* Variable */ continue; } if(!stricmp(p,"FEOF")) { if(!(*arg)) break; fputc(CS_FIO_FUNCTION,out); fputc(FIO_EOF,out); writecrc(src,arg); continue; } if(!stricmp(p,"FGET_POS")) { if(!(*arg) || !(*arg2)) break; fputc(CS_FIO_FUNCTION,out); fputc(FIO_GET_POS,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); /* File handle */ writecrc(src,arg2); /* Variable */ continue; } if(!stricmp(p,"FSET_POS") || !stricmp(p,"FSEEK")) { if(!(*arg)) break; fputc(CS_FIO_FUNCTION,out); if(isdigit((uchar)*arg2) || atol(arg2)) fputc(FIO_SEEK,out); else fputc(FIO_SEEK_VAR,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); /* File handle */ p=strchr(arg2,' '); if(p) *p=0; if(atol(arg2) || isdigit((uchar)*arg2)) { l=val(src,arg2); fwrite(&l,4,1,out); } else writecrc(src,arg2); /* Offset variable */ i=0; if(p) { p++; SKIPCTRLSP(p); i=atoi(p); if(!stricmp(p,"CUR")) i=SEEK_CUR; else if(!stricmp(p,"END")) i=SEEK_END; } fwrite(&i,2,1,out); continue; } if(!stricmp(p,"FLOCK")) { if(!(*arg)) break; fputc(CS_FIO_FUNCTION,out); if(isdigit((uchar)*arg2) || atol(arg2)) fputc(FIO_LOCK,out); else fputc(FIO_LOCK_VAR,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); /* File handle */ if(atol(arg2) || isdigit((uchar)*arg2)) { l=val(src,arg2); if(!l) break; fwrite(&l,4,1,out); } else writecrc(src,arg2); /* Length variable */ continue; } if(!stricmp(p,"FUNLOCK")) { if(!(*arg)) break; fputc(CS_FIO_FUNCTION,out); if(isdigit((uchar)*arg2) || atol(arg2)) fputc(FIO_UNLOCK,out); else fputc(FIO_UNLOCK_VAR,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); /* File handle */ if(atol(arg2) || isdigit((uchar)*arg2)) { l=val(src,arg2); if(!l) break; fwrite(&l,4,1,out); } else writecrc(src,arg2); /* Length variable */ continue; } if(!stricmp(p,"FSET_LENGTH")) { if(!(*arg)) break; fputc(CS_FIO_FUNCTION,out); if(isdigit((uchar)*arg2) || atol(arg2)) fputc(FIO_SET_LENGTH,out); else fputc(FIO_SET_LENGTH_VAR,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); /* File handle */ if(atol(arg2) || isdigit((uchar)*arg2)) { l=val(src,arg2); fwrite(&l,4,1,out); } else writecrc(src,arg2); /* Length variable */ continue; } if(!stricmp(p,"FPRINTF")) { if(!(*arg)) break; fputc(CS_FIO_FUNCTION,out); fputc(FIO_PRINTF,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); /* Write destination variable */ p++; SKIPCTRLSP(p); arg=p; p=strrchr(arg,'"'); if(!p) break; *p=0; p++; SKIPCTRLSP(p); writecstr(arg); /* Write string */ l=ftell(out); fputc(0,out); /* Write total number of args */ i=0; while(p && *p) { arg=p; p=strchr(arg,' '); if(p) { *p=0; p++; } writecrc(src,arg); i++; } fseek(out,l,SEEK_SET); fputc((char)i,out); fseek(out,i*4,SEEK_CUR); continue; } if(!stricmp(p,"FSET_ETX")) { if(!(*arg)) break; if((l=isvar(arg))!=0) { fputc(CS_USE_INT_VAR,out); fwrite(&l,4,1,out); /* variable */ fputc(2,out); /* int offset */ fputc(1,out); /* int length */ ch=0; } /* place holder */ else ch=val(src,arg); fputc(CS_FIO_FUNCTION,out); fputc(FIO_SET_ETX,out); fwrite(&ch,1,1,out); continue; } if(!stricmp(p,"FGET_TIME")) { if(!(*arg) || !(*arg2)) break; fputc(CS_FIO_FUNCTION,out); fputc(FIO_GET_TIME,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); /* File handle */ writecrc(src,arg2); /* Variable */ continue; } if(!stricmp(p,"FSET_TIME")) { if(!(*arg) || !(*arg2)) break; fputc(CS_FIO_FUNCTION,out); fputc(FIO_SET_TIME,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); /* File handle */ writecrc(src,arg2); /* Variable */ continue; } if(!stricmp(p,"REMOVE_FILE")) { if(!(*arg)) break; fputc(CS_FIO_FUNCTION,out); fputc(REMOVE_FILE,out); writecrc(src,arg); /* Str var */ continue; } if(!stricmp(p,"RENAME_FILE")) { if(!(*arg) || !(*arg2)) break; fputc(CS_FIO_FUNCTION,out); fputc(RENAME_FILE,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); /* str var */ writecrc(src,arg2); /* str var */ continue; } if(!stricmp(p,"COPY_FILE")) { if(!(*arg) || !(*arg2)) break; fputc(CS_FIO_FUNCTION,out); fputc(COPY_FILE,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); /* str var */ writecrc(src,arg2); /* str var */ continue; } if(!stricmp(p,"MOVE_FILE")) { if(!(*arg) || !(*arg2)) break; fputc(CS_FIO_FUNCTION,out); fputc(MOVE_FILE,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); /* str var */ writecrc(src,arg2); /* str var */ continue; } if(!stricmp(p,"GET_FILE_ATTRIB")) { if(!(*arg) || !(*arg2)) break; fputc(CS_FIO_FUNCTION,out); fputc(GET_FILE_ATTRIB,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); /* str var */ writecrc(src,arg2); /* int var */ continue; } if(!stricmp(p,"SET_FILE_ATTRIB")) { if(!(*arg) || !(*arg2)) break; fputc(CS_FIO_FUNCTION,out); fputc(SET_FILE_ATTRIB,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); /* str var */ writecrc(src,arg2); /* int var */ continue; } if(!stricmp(p,"RMDIR") || !stricmp(p,"REMOVE_DIR")) { if(!(*arg)) break; fputc(CS_FIO_FUNCTION,out); fputc(REMOVE_DIR,out); writecrc(src,arg); /* Str var */ continue; } if(!stricmp(p,"MKDIR") || !stricmp(p,"MAKE_DIR")) { if(!(*arg)) break; fputc(CS_FIO_FUNCTION,out); fputc(MAKE_DIR,out); writecrc(src,arg); /* Str var */ continue; } if(!stricmp(p,"CHDIR") || !stricmp(p,"CHANGE_DIR")) { if(!(*arg)) break; printf("!WARNING: CHANGE_DIR deprecated in Synchronet v3+\n"); printf(linestr,src,line,save); fputc(CS_FIO_FUNCTION,out); fputc(CHANGE_DIR,out); writecrc(src,arg); /* Str var */ continue; } if(!stricmp(p,"OPEN_DIR")) { if(!(*arg) || !(*arg2)) break; fputc(CS_FIO_FUNCTION,out); fputc(OPEN_DIR,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); /* int var */ writecrc(src,arg2); /* str var */ continue; } if(!stricmp(p,"READ_DIR")) { if(!(*arg) || !(*arg2)) break; fputc(CS_FIO_FUNCTION,out); fputc(READ_DIR,out); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); /* int var */ writecrc(src,arg2); /* str var */ continue; } if(!stricmp(p,"REWIND_DIR")) { if(!(*arg)) break; fputc(CS_FIO_FUNCTION,out); fputc(REWIND_DIR,out); writecrc(src,arg); /* int var */ continue; } if(!stricmp(p,"CLOSE_DIR")) { if(!(*arg)) break; fputc(CS_FIO_FUNCTION,out); fputc(CLOSE_DIR,out); writecrc(src,arg); /* int var */ continue; } /* NET_FUNCTIONS */ if(!stricmp(p,"SOCKET_OPEN")) { if(!(*arg)) break; fprintf(out,"%c%c",CS_NET_FUNCTION,CS_SOCKET_OPEN); writecrc(src,arg); /* int var (socket) */ continue; } if(!stricmp(p,"SOCKET_CLOSE")) { if(!(*arg)) break; fprintf(out,"%c%c",CS_NET_FUNCTION,CS_SOCKET_CLOSE); writecrc(src,arg); /* int var (socket) */ continue; } if(!stricmp(p,"SOCKET_CHECK")) { if(!(*arg)) break; fprintf(out,"%c%c",CS_NET_FUNCTION,CS_SOCKET_CHECK); writecrc(src,arg); /* int var (socket) */ continue; } if(!stricmp(p,"SOCKET_CONNECT")) { if(!(*arg) || !(*arg2) || !(*arg3)) break; /* TCP port */ if((l=isvar(arg3))!=0) { fputc(CS_USE_INT_VAR,out); fwrite(&l,4,1,out); /* variable */ fputc(10,out); /* int offset */ fputc(2,out); /* int length */ i=0; } /* place holder */ else i=val(src,arg3); fprintf(out,"%c%c",CS_NET_FUNCTION,CS_SOCKET_CONNECT); writecrc(src,arg); /* int var (socket) */ writecrc(src,arg2); /* str var (address) */ fwrite(&i,2,1,out); continue; } if(!stricmp(p,"SOCKET_ACCEPT")) { if(!(*arg)) break; fprintf(out,"%c%c",CS_NET_FUNCTION,CS_SOCKET_ACCEPT); writecrc(src,arg); /* int var (socket) */ continue; } if(!stricmp(p,"SOCKET_NREAD")) { if(!(*arg) || !(*arg2)) break; fprintf(out,"%c%c",CS_NET_FUNCTION,CS_SOCKET_NREAD); writecrc(src,arg); /* int var (socket) */ writecrc(src,arg2); /* int var (nbytes) */ continue; } if(!stricmp(p,"SOCKET_READ") || !stricmp(p,"SOCKET_READLINE") || !stricmp(p,"SOCKET_PEEK")) { if(!(*arg) || !(*arg2)) break; /* length */ if(!(*arg3)) i=0; else if((l=isvar(arg3))!=0) { fputc(CS_USE_INT_VAR,out); fwrite(&l,4,1,out); /* variable */ fputc(10,out); /* int offset */ fputc(2,out); /* int length */ i=0; } /* place holder */ else i=val(src,arg3); if(!stricmp(p,"SOCKET_READ")) ch=CS_SOCKET_READ; else if(!stricmp(p,"SOCKET_READLINE")) ch=CS_SOCKET_READLINE; else ch=CS_SOCKET_PEEK; fprintf(out,"%c%c",CS_NET_FUNCTION,ch); writecrc(src,arg); /* int var (socket) */ writecrc(src,arg2); /* str var (buffer) */ fwrite(&i,sizeof(i),1,out); /* word (length) */ continue; } if(!stricmp(p,"SOCKET_WRITE")) { if(!(*arg) || !(*arg2)) break; fprintf(out,"%c%c",CS_NET_FUNCTION,CS_SOCKET_WRITE); writecrc(src,arg); /* int var (socket) */ writecrc(src,arg2); /* str var (buffer) */ continue; } /* FTP functions */ if(!stricmp(p,"FTP_LOGIN")) { if(!(*arg) || !(*arg2) || !(*arg3)) break; fprintf(out,"%c%c",CS_NET_FUNCTION,CS_FTP_LOGIN); writecrc(src,arg); /* int var (socket) */ writecrc(src,arg2); /* int var (user) */ writecrc(src,arg3); /* int var (password) */ continue; } if(!stricmp(p,"FTP_LOGOUT")) { if(!(*arg)) break; fprintf(out,"%c%c",CS_NET_FUNCTION,CS_FTP_LOGOUT); writecrc(src,arg); /* int var (socket) */ continue; } if(!stricmp(p,"FTP_PWD")) { if(!(*arg)) break; fprintf(out,"%c%c",CS_NET_FUNCTION,CS_FTP_PWD); writecrc(src,arg); /* int var (socket) */ continue; } if(!stricmp(p,"FTP_CWD")) { if(!(*arg) || !(*arg2)) break; fprintf(out,"%c%c",CS_NET_FUNCTION,CS_FTP_CWD); writecrc(src,arg); /* int var (socket) */ writecrc(src,arg2); /* str var (path) */ continue; } if(!stricmp(p,"FTP_DIR")) { if(!(*arg) || !(*arg2)) break; fprintf(out,"%c%c",CS_NET_FUNCTION,CS_FTP_DIR); writecrc(src,arg); /* int var (socket) */ writecrc(src,arg2); /* str var (path) */ continue; } if(!stricmp(p,"FTP_GET")) { if(!(*arg) || !(*arg2) || !(*arg3)) break; fprintf(out,"%c%c",CS_NET_FUNCTION,CS_FTP_GET); writecrc(src,arg); /* int var (socket) */ writecrc(src,arg2); /* str var (src path) */ writecrc(src,arg3); /* str var (dest path) */ continue; } if(!stricmp(p,"FTP_PUT")) { if(!(*arg) || !(*arg2) || !(*arg3)) break; fprintf(out,"%c%c",CS_NET_FUNCTION,CS_FTP_PUT); writecrc(src,arg); /* int var (socket) */ writecrc(src,arg2); /* str var (src path) */ writecrc(src,arg3); /* str var (dest path) */ continue; } if(!stricmp(p,"FTP_DELETE")) { if(!(*arg) || !(*arg2)) break; fprintf(out,"%c%c",CS_NET_FUNCTION,CS_FTP_DELETE); writecrc(src,arg); /* int var (socket) */ writecrc(src,arg2); /* str var (path) */ continue; } if(!stricmp(p,"FTP_RENAME")) { if(!(*arg) || !(*arg2) || !(*arg3)) break; fprintf(out,"%c%c",CS_NET_FUNCTION,CS_FTP_RENAME); writecrc(src,arg); /* int var (socket) */ writecrc(src,arg2); /* str var (org name) */ writecrc(src,arg3); /* str var (new name) */ continue; } if(!stricmp(p,"NODE_ACTION")) { if(!(*arg)) break; if((l=isvar(arg))!=0) { fputc(CS_USE_INT_VAR,out); fwrite(&l,4,1,out); /* variable */ fputc(1,out); /* int offset */ fputc(1,out); /* int length */ ch=0; } /* place holder */ else ch=val(src,arg); fprintf(out,"%c%c",CS_NODE_ACTION,ch); continue; } if(!stricmp(p,"NODE_STATUS")) { if(!(*arg)) break; if((l=isvar(arg))!=0) { fputc(CS_USE_INT_VAR,out); fwrite(&l,4,1,out); /* variable */ fputc(1,out); /* int offset */ fputc(1,out); /* int length */ ch=0; } /* place holder */ else ch=val(src,arg); fprintf(out,"%c%c",CS_NODE_STATUS,ch); continue; } if(!stricmp(p,"END_CMD") || !stricmp(p,"ENDCMD")) { fprintf(out,"%c",CS_END_CMD); continue; } if(!stricmp(p,"CMD_POP") || !stricmp(p,"CMDPOP")) { fprintf(out,"%c",CS_CMD_POP); continue; } if(!stricmp(p,"CLS")) { fprintf(out,"%c",CS_CLS); continue; } if(!stricmp(p,"CRLF")) { fprintf(out,"%c",CS_CRLF); continue; } if(!stricmp(p,"PAUSE")) { fprintf(out,"%c",CS_PAUSE); continue; } if(!stricmp(p,"PAUSE_RESET")) { fprintf(out,"%c",CS_PAUSE_RESET); continue; } if(!stricmp(p,"CLEAR_ABORT")) { fprintf(out,"%c",CS_CLEAR_ABORT); continue; } if(!stricmp(p,"GETLINES")) { fprintf(out,"%c",CS_GETLINES); continue; } if(!stricmp(p,"GETFILESPEC")) { fprintf(out,"%c",CS_GETFILESPEC); continue; } if(!stricmp(p,"FINDUSER")) { fprintf(out,"%c",CS_FINDUSER); continue; } if(!stricmp(p,"MATCHUSER")) { fprintf(out,"%c%c",CS_VAR_INSTRUCTION,MATCHUSER); writecrc(src,arg); writecrc(src,arg2); continue; } if(!stricmp(p,"LOG")) { if(!(*arg)) break; fprintf(out,"%c",CS_LOG); writecstr(arg); continue; } if(!stricmp(p,"MNEMONICS")) { if(!(*arg)) break; fprintf(out,"%c",CS_MNEMONICS); writecstr(arg); continue; } if(!stricmp(p,"PRINT")) { if(!(*arg)) break; fprintf(out,"%c",CS_PRINT); if(strstr(arg,"%s")!=NULL) { printf("!WARNING: PRINT \"%%s\" is a security hole if STR contains unvalidated input\n"); printf(linestr,src,line,save); } writecstr(arg); continue; } if(!stricmp(p,"PRINT_LOCAL")) { if(!(*arg)) break; fprintf(out,"%c",CS_PRINT_LOCAL); writecstr(arg); continue; } if(!stricmp(p,"PRINT_REMOTE")) { if(!(*arg)) break; fprintf(out,"%c",CS_PRINT_REMOTE); writecstr(arg); continue; } if(!stricmp(p,"PRINTFILE")) { if(!(*arg)) break; if(*arg=='"') { /* NEED TO SUPPORT MODE HERE */ fprintf(out,"%c",CS_PRINTFILE); writestr(arg); } else { if((l=isvar(arg2))!=0) { fputc(CS_USE_INT_VAR,out); fwrite(&l,4,1,out); /* variable */ fputc(6,out); /* int offset */ fputc(2,out); /* int length */ i=0; } /* place holder */ else i=val(src,arg2); fprintf(out,"%c%c",CS_VAR_INSTRUCTION,PRINTFILE_VAR_MODE); p=strchr(arg,' '); if(p) *p=0; writecrc(src,arg); fwrite(&i,2,1,out); } continue; } if(!stricmp(p,"PRINTTAIL")) { if(!(*arg) || !(*arg2)) break; if((l=isvar(arg3))!=0) { fputc(CS_USE_INT_VAR,out); fwrite(&l,4,1,out); /* variable */ fputc(8,out); /* int offset */ fputc(1,out); /* int length */ j=0; } /* place holder */ else j=val(src,arg3); fprintf(out,"%c%c",CS_VAR_INSTRUCTION,PRINTTAIL_VAR_MODE); p=strchr(arg,' '); if(p) *p=0; writecrc(src,arg); i=val(src,arg2); fwrite(&i,2,1,out); fwrite(&j,1,1,out); continue; } if(!stricmp(p,"PRINTFILE_STR")) { fprintf(out,"%c",CS_PRINTFILE_STR); continue; } if(!stricmp(p,"PRINTFILE_LOCAL")) { if(!(*arg)) break; fprintf(out,"%c",CS_PRINTFILE_LOCAL); writestr(arg); continue; } if(!stricmp(p,"PRINTFILE_REMOTE")) { if(!(*arg)) break; fprintf(out,"%c",CS_PRINTFILE_REMOTE); writestr(arg); continue; } if(!stricmp(p,"TELNET_GATE")) { if(!(*arg)) break; if((l=isvar(arg2))!=0) { fputc(CS_USE_INT_VAR,out); fwrite(&l,4,1,out); /* variable */ fputc(2,out); /* int offset */ fputc(4,out); /* int length */ l=0; } /* place holder */ else if(*arg2) l=val(src,arg2); else l=0; if(*arg=='"') { fprintf(out,"%c%c",CS_VAR_INSTRUCTION,TELNET_GATE_STR); fwrite(&l,4,1,out); writestr(arg); } else { fprintf(out,"%c%c",CS_VAR_INSTRUCTION,TELNET_GATE_VAR); fwrite(&l,4,1,out); p=strchr(arg,' '); if(p) *p=0; writecrc(src,arg); } continue; } if(!stricmp(p,"EXEC")) { if(!(*arg)) break; fprintf(out,"%c",CS_EXEC); writestr(arg); continue; } if(!stricmp(p,"EXEC_INT")) { if(!(*arg)) break; fprintf(out,"%c",CS_EXEC_INT); writestr(arg); continue; } if(!stricmp(p,"EXEC_BIN")) { if(!(*arg)) break; fprintf(out,"%c",CS_EXEC_BIN); writestr(arg); continue; } if(!stricmp(p,"EXEC_XTRN")) { if(!(*arg)) break; fprintf(out,"%c",CS_EXEC_XTRN); writestr(arg); continue; } if(!stricmp(p,"SELECT_SHELL")) { fprintf(out,"%c",CS_SELECT_SHELL); continue; } if(!stricmp(p,"SET_SHELL")) { fprintf(out,"%c",CS_SET_SHELL); continue; } if(!stricmp(p,"SELECT_EDITOR")) { fprintf(out,"%c",CS_SELECT_EDITOR); continue; } if(!stricmp(p,"SET_EDITOR")) { fprintf(out,"%c",CS_SET_EDITOR); continue; } if(!stricmp(p,"YES_NO")) { if(!(*arg)) break; fprintf(out,"%c",CS_YES_NO); writecstr(arg); continue; } if(!stricmp(p,"NO_YES")) { if(!(*arg)) break; fprintf(out,"%c",CS_NO_YES); writecstr(arg); continue; } if(!stricmp(p,"MENU")) { if(!(*arg)) break; fprintf(out,"%c",CS_MENU); writestr(arg); continue; } if(!stricmp(p,"SET_MENU_DIR")) { if(!(*arg)) break; fprintf(out,"%c",CS_SET_MENU_DIR); writestr(arg); continue; } if(!stricmp(p,"SET_MENU_FILE")) { if(!(*arg)) break; fprintf(out,"%c",CS_SET_MENU_FILE); writestr(arg); continue; } if(!stricmp(p,"SEND_FILE_VIA")) { if(!(*arg) || !(*arg2)) break; if(*arg2=='"') { fprintf(out,"%c%c%c",CS_VAR_INSTRUCTION,SEND_FILE_VIA,*arg); writestr(arg2); } else { fprintf(out,"%c%c%c",CS_VAR_INSTRUCTION,SEND_FILE_VIA_VAR,*arg); writecrc(src,arg2); } continue; } if(!stricmp(p,"RECEIVE_FILE_VIA")) { if(!(*arg) || !(*arg2)) break; if(*arg2=='"') { fprintf(out,"%c%c%c",CS_VAR_INSTRUCTION,RECEIVE_FILE_VIA,*arg); writestr(arg2); } else { fprintf(out,"%c%c%c",CS_VAR_INSTRUCTION,RECEIVE_FILE_VIA_VAR,*arg); writecrc(src,arg2); } continue; } if(!stricmp(p,"CHKFILE")) { if(!(*arg)) break; if(*arg=='"') { fprintf(out,"%c",CS_CHKFILE); writestr(arg); } else { fprintf(out,"%c%c",CS_VAR_INSTRUCTION,CHKFILE_VAR); writecrc(src,arg); } continue; } if(!stricmp(p,"GET_FILE_LENGTH")) { if(!(*arg) || !(*arg2)) break; fprintf(out,"%c%c",CS_VAR_INSTRUCTION,FLENGTH_TO_INT); p=strchr(arg,' '); if(p) *p=0; writecrc(src,arg); writecrc(src,arg2); continue; } if(!stricmp(p,"GET_FILE_TIME")) { if(!(*arg) || !(*arg2)) break; fprintf(out,"%c%c",CS_VAR_INSTRUCTION,FTIME_TO_INT); p=strchr(arg,' '); if(p) *p=0; writecrc(src,arg); writecrc(src,arg2); continue; } if(!stricmp(p,"CHARVAL")) { if(!(*arg) || !(*arg2)) break; fprintf(out,"%c%c",CS_VAR_INSTRUCTION,CHARVAL_TO_INT); p=strchr(arg,' '); if(p) *p=0; writecrc(src,arg); writecrc(src,arg2); continue; } if(!stricmp(p,"SETSTR")) { if(!(*arg)) break; fprintf(out,"%c",CS_SETSTR); writecstr(arg); continue; } if(!stricmp(p,"COMPARE_STR")) { if(!(*arg)) break; fprintf(out,"%c",CS_COMPARE_STR); writecstr(arg); continue; } if(!stricmp(p,"GET_TEMPLATE")) { if(!(*arg)) break; fprintf(out,"%c",CS_GET_TEMPLATE); writestr(arg); continue; } if(!stricmp(p,"READ_SIF")) { if(!(*arg)) break; fprintf(out,"%c",CS_READ_SIF); writestr(arg); continue; } if(!stricmp(p,"CREATE_SIF")) { if(!(*arg)) break; fprintf(out,"%c",CS_CREATE_SIF); writestr(arg); continue; } if(!stricmp(p,"TRASHCAN")) { if(!(*arg)) break; fprintf(out,"%c",CS_TRASHCAN); writestr(arg); continue; } if(!stricmp(p,"CMDSTR")) { if(!(*arg)) break; fprintf(out,"%c",CS_CMDSTR); writecstr(arg); continue; } if(!stricmp(p,"CMDKEYS")) { if(!(*arg)) break; fprintf(out,"%c",CS_CMDKEYS); for(p=arg;*p && *p!='#';p++) { ch=*p; if(ch=='"') continue; if(ch=='/') { p++; ch=*p|0x80; } /* high bit indicates slash required */ else if(ch=='^' && *(p+1)>=0x40) { p++; ch=*p; ch-=0x40; } else if(ch=='\\') { p++; ch=cesc(*p); } fputc(ch,out); } fputc(0,out); continue; } if(!stricmp(p,"COMPARE_WORD")) { if(!(*arg)) break; fprintf(out,"%c",CS_COMPARE_WORD); writecstr(arg); continue; } if(!stricmp(p,"GETSTR")) { p=strchr(arg,' '); if(p) *p=0; if((!(*arg) || isdigit((uchar)*arg) || !stricmp(arg,"STR")) && !(*arg3)) fprintf(out,"%c%c",CS_GETSTR,atoi(arg) ? atoi(arg) : *arg2 ? atoi(arg2) : 128); else { if((l=isvar(arg2))!=0) { fputc(CS_USE_INT_VAR,out); fwrite(&l,4,1,out); /* variable */ fputc(6,out); /* int offset */ fputc(1,out); /* int length */ i=0; } /* place holder */ else if(*arg2) i=val(src,arg2); else i=0; fprintf(out,"%c%c",CS_VAR_INSTRUCTION ,*arg3 ? GETSTR_MODE : GETSTR_VAR); writecrc(src,arg); if(!i) i=128; fwrite(&i,1,1,out); if(*arg3) { l=val(src,arg3); fwrite(&l,4,1,out); } } continue; } if(!stricmp(p,"GETNUM")) { if(!(*arg)) break; p=strchr(arg,' '); if(p) *p=0; if(isdigit((uchar)*arg)) { i=val(src,arg); fprintf(out,"%c",CS_GETNUM); fwrite(&i,2,1,out); } else { if((l=isvar(arg2))!=0) { fputc(CS_USE_INT_VAR,out); fwrite(&l,4,1,out); /* variable */ fputc(6,out); /* int offset */ fputc(2,out); /* int length */ i=0; } /* place holder */ else i=val(src,arg2); fprintf(out,"%c%c",CS_VAR_INSTRUCTION,GETNUM_VAR); writecrc(src,arg); fwrite(&i,2,1,out); } continue; } if(!stricmp(p,"MSWAIT")) { if(!(*arg)) break; if((l=isvar(arg))!=0) { fputc(CS_USE_INT_VAR,out); fwrite(&l,4,1,out); /* variable */ fputc(1,out); /* int offset */ fputc(2,out); /* int length */ i=0; } /* place holder */ else i=val(src,arg); fprintf(out,"%c",CS_MSWAIT); fwrite(&i,2,1,out); continue; } if(!stricmp(p,"GETLINE")) { p=strchr(arg,' '); if(p) *p=0; if(!(*arg) || isdigit((uchar)*arg)) fprintf(out,"%c%c",CS_GETLINE,*arg ? atoi(arg) :128); else { if((l=isvar(arg2))!=0) { fputc(CS_USE_INT_VAR,out); fwrite(&l,4,1,out); /* variable */ fputc(6,out); /* int offset */ fputc(1,out); /* int length */ i=0; } /* place holder */ else i=val(src,arg2); fprintf(out,"%c%c",CS_VAR_INSTRUCTION,GETLINE_VAR); writecrc(src,arg); if(!i) i=128; fwrite(&i,1,1,out); } continue; } if(!stricmp(p,"GETSTRUPR")) { p=strchr(arg,' '); if(p) *p=0; if(!(*arg) || isdigit((uchar)*arg)) fprintf(out,"%c%c",CS_GETSTRUPR,*arg ? atoi(arg) :128); else { if((l=isvar(arg2))!=0) { fputc(CS_USE_INT_VAR,out); fwrite(&l,4,1,out); /* variable */ fputc(6,out); /* int offset */ fputc(1,out); /* int length */ i=0; } /* place holder */ else i=val(src,arg2); fprintf(out,"%c%c",CS_VAR_INSTRUCTION,GETSTRUPR_VAR); writecrc(src,arg); if(!i) i=128; fwrite(&i,1,1,out); } continue; } if(!stricmp(p,"GETNAME")) { p=strchr(arg,' '); if(p) *p=0; if(!(*arg) || isdigit((uchar)*arg)) fprintf(out,"%c%c",CS_GETNAME,*arg ? atoi(arg) :25); else { if((l=isvar(arg2))!=0) { fputc(CS_USE_INT_VAR,out); fwrite(&l,4,1,out); /* variable */ fputc(6,out); /* int offset */ fputc(1,out); /* int length */ i=0; } /* place holder */ else i=atoi(arg2); fprintf(out,"%c%c",CS_VAR_INSTRUCTION,GETNAME_VAR); writecrc(src,arg); if(!i) i=128; fwrite(&i,1,1,out); } continue; } if(!stricmp(p,"SHIFT_STR")) { if(!(*arg)) break; p=strchr(arg,' '); if(p) *p=0; if(isdigit((uchar)*arg)) fprintf(out,"%c%c",CS_SHIFT_STR,atoi(arg)); else { if((l=isvar(arg2))!=0) { fputc(CS_USE_INT_VAR,out); fwrite(&l,4,1,out); /* variable */ fputc(6,out); /* int offset */ fputc(1,out); /* int length */ i=0; } /* place holder */ else i=atoi(arg2); fprintf(out,"%c%c",CS_VAR_INSTRUCTION,SHIFT_STR_VAR); writecrc(src,arg); if(!i) i=128; fwrite(&i,1,1,out); } continue; } if(!stricmp(p,"SHIFT_TO_FIRST_CHAR") || !stricmp(p,"SHIFT_TO_LAST_CHAR")) { if(!(*arg) || !(*arg2)) break; if((l=isvar(arg2))!=0) { fputc(CS_USE_INT_VAR,out); fwrite(&l,4,1,out); /* variable */ fputc(6,out); /* int offset */ fputc(1,out); /* int length */ ch=0; } /* place holder */ else ch=val(src,arg2); fprintf(out,"%c%c",CS_VAR_INSTRUCTION ,!stricmp(p,"SHIFT_TO_FIRST_CHAR") ? SHIFT_TO_FIRST_CHAR : SHIFT_TO_LAST_CHAR); writecrc(src,arg); fwrite(&ch,sizeof(ch),1,out); continue; } if(!stricmp(p,"TRUNCSP")) { fprintf(out,"%c%c",CS_VAR_INSTRUCTION,TRUNCSP_STR_VAR); writecrc(src,arg); continue; } if(!stricmp(p,"STRIP_CTRL")) { fprintf(out,"%c%c",CS_VAR_INSTRUCTION,STRIP_CTRL_STR_VAR); writecrc(src,arg); continue; } if(!stricmp(p,"STRUPR")) { fprintf(out,"%c%c",CS_VAR_INSTRUCTION,STRUPR_VAR); writecrc(src,arg); continue; } if(!stricmp(p,"STRLWR")) { fprintf(out,"%c%c",CS_VAR_INSTRUCTION,STRLWR_VAR); writecrc(src,arg); continue; } if(!stricmp(p,"STRLEN")) { if(!(*arg)) break; fprintf(out,"%c%c",CS_VAR_INSTRUCTION,STRLEN_INT_VAR); p=strchr(arg,' '); if(!p) break; *p=0; writecrc(src,arg); writecrc(src,arg2); continue; } if(!stricmp(p,"REPLACE_TEXT")) { if(!(*arg) || !(*arg2)) break; if((l=isvar(arg))!=0) { fputc(CS_USE_INT_VAR,out); fwrite(&l,4,1,out); /* variable */ fputc(1,out); /* int offset */ fputc(2,out); /* int length */ i=0; } /* place holder */ else i=val(src,arg); fprintf(out,"%c",CS_REPLACE_TEXT); fwrite(&i,2,1,out); writecstr(arg2); continue; } if(!stricmp(p,"REVERT_TEXT")) { if(!(*arg)) break; if(!stricmp(arg,"ALL")) i=0xffff; else { if((l=isvar(arg))!=0) { fputc(CS_USE_INT_VAR,out); fwrite(&l,4,1,out); /* variable */ fputc(1,out); /* int offset */ fputc(2,out); /* int length */ i=0; } /* place holder */ else i=val(src,arg); } fprintf(out,"%c",CS_REVERT_TEXT); fwrite(&i,2,1,out); continue; } if(!stricmp(p,"TOGGLE_USER_MISC") || !stricmp(p,"COMPARE_USER_MISC")) { if(!(*arg)) break; if((l=isvar(arg))!=0) { fputc(CS_USE_INT_VAR,out); fwrite(&l,4,1,out); /* variable */ fputc(1,out); /* int offset */ fputc(4,out); /* int length */ l=0; } /* place holder */ else l=val(src,arg); if(!stricmp(p,"TOGGLE_USER_MISC")) fprintf(out,"%c",CS_TOGGLE_USER_MISC); else fprintf(out,"%c",CS_COMPARE_USER_MISC); fwrite(&l,4,1,out); continue; } if(!stricmp(p,"TOGGLE_USER_CHAT") || !stricmp(p,"COMPARE_USER_CHAT")) { if(!(*arg)) break; if((l=isvar(arg))!=0) { fputc(CS_USE_INT_VAR,out); fwrite(&l,4,1,out); /* variable */ fputc(1,out); /* int offset */ fputc(4,out); /* int length */ l=0; } /* place holder */ else l=val(src,arg); if(!stricmp(p,"TOGGLE_USER_CHAT")) fprintf(out,"%c",CS_TOGGLE_USER_CHAT); else fprintf(out,"%c",CS_COMPARE_USER_CHAT); fwrite(&l,4,1,out); continue; } if(!stricmp(p,"TOGGLE_USER_QWK") || !stricmp(p,"COMPARE_USER_QWK")) { if(!(*arg)) break; if((l=isvar(arg))!=0) { fputc(CS_USE_INT_VAR,out); fwrite(&l,4,1,out); /* variable */ fputc(1,out); /* int offset */ fputc(4,out); /* int length */ l=0; } /* place holder */ else l=val(src,arg); if(!stricmp(p,"TOGGLE_USER_QWK")) fprintf(out,"%c",CS_TOGGLE_USER_QWK); else fprintf(out,"%c",CS_COMPARE_USER_QWK); fwrite(&l,4,1,out); continue; } if(!stricmp(p,"TOGGLE_NODE_MISC") || !stricmp(p,"COMPARE_NODE_MISC")) { if(!(*arg)) break; if((l=isvar(arg))!=0) { fputc(CS_USE_INT_VAR,out); fwrite(&l,4,1,out); /* variable */ fputc(1,out); /* int offset */ fputc(2,out); /* int length */ i=0; } /* place holder */ else i=val(src,arg); if(!stricmp(p,"TOGGLE_NODE_MISC")) fprintf(out,"%c",CS_TOGGLE_NODE_MISC); else fprintf(out,"%c",CS_COMPARE_NODE_MISC); fwrite(&i,2,1,out); continue; } if(!stricmp(p,"TOGGLE_USER_FLAG")) { if(!(*arg)) break; p=arg; fprintf(out,"%c%c",CS_TOGGLE_USER_FLAG,toupper(*p++)); SKIPCTRLSP(p); fprintf(out,"%c",toupper(*p)); continue; } if(!stricmp(p,"SET_USER_LEVEL")) { if(!(*arg)) break; if((l=isvar(arg))!=0) { fputc(CS_USE_INT_VAR,out); fwrite(&l,4,1,out); /* variable */ fputc(1,out); /* int offset */ fputc(1,out); /* int length */ ch=0; } /* place holder */ else ch=val(src,arg); fprintf(out,"%c%c",CS_SET_USER_LEVEL,ch); continue; } if(!stricmp(p,"SET_USER_STRING")) { if(!(*arg)) break; if((l=isvar(arg))!=0) { fputc(CS_USE_INT_VAR,out); fwrite(&l,4,1,out); /* variable */ fputc(1,out); /* int offset */ fputc(1,out); /* int length */ ch=0; } /* place holder */ else ch=val(src,arg); fprintf(out,"%c%c",CS_SET_USER_STRING,ch); continue; } if(!stricmp(p,"ADJUST_USER_CREDITS")) { if(!(*arg)) break; if((l=isvar(arg))!=0) { fputc(CS_USE_INT_VAR,out); fwrite(&l,4,1,out); /* variable */ fputc(1,out); /* int offset */ fputc(2,out); /* int length */ i=0; } /* place holder */ else i=val(src,arg); fprintf(out,"%c",CS_ADJUST_USER_CREDITS); fwrite(&i,2,1,out); continue; } if(!stricmp(p,"ADJUST_USER_MINUTES")) { if(!(*arg)) break; if((l=isvar(arg))!=0) { fputc(CS_USE_INT_VAR,out); fwrite(&l,4,1,out); /* variable */ fputc(1,out); /* int offset */ fputc(2,out); /* int length */ i=0; } /* place holder */ else i=val(src,arg); fprintf(out,"%c",CS_ADJUST_USER_MINUTES); fwrite(&i,2,1,out); continue; } if(!stricmp(p,"SHOW_MEM")) { fprintf(out,"%c",CS_SHOW_MEM); continue; } if(!stricmp(p,"GURU_LOG")) { fprintf(out,"%c",CS_GURU_LOG); continue; } if(!stricmp(p,"ERROR_LOG")) { fprintf(out,"%c",CS_ERROR_LOG); continue; } if(!stricmp(p,"SYSTEM_LOG")) { fprintf(out,"%c",CS_SYSTEM_LOG); continue; } if(!stricmp(p,"SYSTEM_YLOG")) { fprintf(out,"%c",CS_SYSTEM_YLOG); continue; } if(!stricmp(p,"SYSTEM_STATS")) { fprintf(out,"%c",CS_SYSTEM_STATS); continue; } if(!stricmp(p,"NODE_STATS")) { fprintf(out,"%c",CS_NODE_STATS); continue; } if(!stricmp(p,"CHANGE_USER")) { fprintf(out,"%c",CS_CHANGE_USER); continue; } if(!stricmp(p,"ANSI_CAPTURE")) { fprintf(out,"%c",CS_ANSI_CAPTURE); continue; } if(!stricmp(p,"LIST_TEXT_FILE")) { fprintf(out,"%c",CS_LIST_TEXT_FILE); continue; } if(!stricmp(p,"EDIT_TEXT_FILE")) { fprintf(out,"%c",CS_EDIT_TEXT_FILE); continue; } if(!stricmp(p,"COMPARE_KEY")) { if(!stricmp(arg,"DIGIT")) ch=CS_DIGIT; else if(!stricmp(arg,"EDIGIT")) ch=CS_EDIGIT; else ch=toupper(*arg); if(ch=='/') ch=(*arg)|0x80; /* high bit indicates slash required */ else if(ch=='^' && (*(arg+1))>=0x40) ch=(*(arg+1))-0x40; /* ctrl char */ else if(ch=='\\') ch=cesc(*(arg+1)); else if(ch=='\'') ch=*(arg+1); fprintf(out,"%c%c",CS_COMPARE_KEY,ch); continue; } if(!stricmp(p,"COMPARE_CHAR")) { ch=*arg; fprintf(out,"%c%c",CS_COMPARE_CHAR,ch); continue; } if(!stricmp(p,"COMPARE_KEYS")) { fputc(CS_COMPARE_KEYS,out); for(p=arg;*p && *p!='#';p++) { ch=*p; if(ch=='"') continue; if(ch=='/') { p++; ch=*p|0x80; } /* high bit indicates slash required */ else if(ch=='^' && *(p+1)>=0x40) { p++; ch=*p; ch-=0x40; } else if(ch=='\\') { p++; ch=cesc(*p); } fputc(ch,out); } fputc(0,out); continue; } if(!stricmp(p,"GETCMD")) { fprintf(out,"%c",CS_GETCMD); writecstr(arg); continue; } if(!stricmp(p,"INKEY")) { fprintf(out,"%c",CS_INKEY); continue; } if(!stricmp(p,"INCHAR")) { fprintf(out,"%c",CS_INCHAR); continue; } if(!stricmp(p,"GETKEY")) { fprintf(out,"%c",CS_GETKEY); continue; } if(!stricmp(p,"GETCHAR")) { fprintf(out,"%c",CS_GETCHAR); continue; } if(!stricmp(p,"GETKEYE")) { fprintf(out,"%c",CS_GETKEYE); continue; } if(!stricmp(p,"UNGETKEY")) { fprintf(out,"%c",CS_UNGETKEY); continue; } if(!stricmp(p,"UNGETSTR")) { fprintf(out,"%c",CS_UNGETSTR); continue; } if(!stricmp(p,"PRINTKEY")) { fprintf(out,"%c",CS_PRINTKEY); continue; } if(!stricmp(p,"PRINTSTR")) { fprintf(out,"%c",CS_PRINTSTR); continue; } /* FUNCTIONS */ if(!stricmp(p,"NODELIST_ALL")) { fprintf(out,"%c",CS_NODELIST_ALL); continue; } if(!stricmp(p,"NODELIST_USERS")) { fprintf(out,"%c",CS_NODELIST_USERS); continue; } if(!stricmp(p,"USERLIST_ALL")) { fprintf(out,"%c",CS_USERLIST_ALL); continue; } if(!stricmp(p,"USERLIST_SUB")) { fprintf(out,"%c",CS_USERLIST_SUB); continue; } if(!stricmp(p,"USERLIST_DIR")) { fprintf(out,"%c",CS_USERLIST_DIR); continue; } if(!stricmp(p,"USERLIST_LOGONS")) { fprintf(out,"%c",CS_USERLIST_LOGONS); continue; } if(!stricmp(p,"HANGUP")) { fprintf(out,"%c",CS_HANGUP); continue; } if(!stricmp(p,"LOGOFF")) { fprintf(out,"%c",CS_LOGOFF); continue; } if(!stricmp(p,"LOGOFF_FAST")) { fprintf(out,"%c",CS_LOGOFF_FAST); continue; } if(!stricmp(p,"AUTO_MESSAGE")) { fprintf(out,"%c",CS_AUTO_MESSAGE); continue; } if(!stricmp(p,"MINUTE_BANK")) { fprintf(out,"%c",CS_MINUTE_BANK); continue; } if(!stricmp(p,"USER_EDIT")) { fprintf(out,"%c",CS_USER_EDIT); continue; } if(!stricmp(p,"USER_DEFAULTS")) { fprintf(out,"%c",CS_USER_DEFAULTS); continue; } if(!stricmp(p,"PAGE_SYSOP")) { fprintf(out,"%c",CS_PAGE_SYSOP); continue; } if(!stricmp(p,"PAGE_GURU")) { fprintf(out,"%c",CS_PAGE_GURU); continue; } if(!stricmp(p,"SPY")) { fprintf(out,"%c",CS_SPY); continue; } if(!stricmp(p,"PRIVATE_CHAT")) { fprintf(out,"%c",CS_PRIVATE_CHAT); continue; } if(!stricmp(p,"PRIVATE_MESSAGE")) { fprintf(out,"%c",CS_PRIVATE_MESSAGE); continue; } if(!stricmp(p,"MULTINODE_CHAT")) { if(!(*arg)) ch=1; else { if((l=isvar(arg))!=0) { fputc(CS_USE_INT_VAR,out); fwrite(&l,4,1,out); /* variable */ fputc(1,out); /* int offset */ fputc(1,out); /* int length */ ch=0; } /* place holder */ else ch=val(src,arg); } fprintf(out,"%c%c",CS_MULTINODE_CHAT,ch); continue; } if(!stricmp(p,"MAIL_READ")) { fprintf(out,"%c",CS_MAIL_READ); continue; } if(!stricmp(p,"MAIL_READ_SENT")) { /* Kill/read sent mail */ fprintf(out,"%c",CS_MAIL_READ_SENT); continue; } if(!stricmp(p,"MAIL_READ_ALL")) { fprintf(out,"%c",CS_MAIL_READ_ALL); continue; } if(!stricmp(p,"MAIL_SEND")) { /* Send E-mail */ fprintf(out,"%c",CS_MAIL_SEND); continue; } if(!stricmp(p,"MAIL_SEND_FEEDBACK")) { /* Feedback */ fprintf(out,"%c",CS_MAIL_SEND_FEEDBACK); continue; } if(!stricmp(p,"MAIL_SEND_NETMAIL")) { fprintf(out,"%c",CS_MAIL_SEND_NETMAIL); continue; } if(!stricmp(p,"MAIL_SEND_NETFILE")) { fprintf(out,"%c",CS_MAIL_SEND_NETFILE); continue; } if(!stricmp(p,"MAIL_SEND_FILE")) { /* Upload Attached File to E-mail */ fprintf(out,"%c",CS_MAIL_SEND_FILE); continue; } if(!stricmp(p,"MAIL_SEND_BULK")) { fprintf(out,"%c",CS_MAIL_SEND_BULK); continue; } if(!stricmp(p,"MSG_SET_AREA")) { fprintf(out,"%c",CS_MSG_SET_AREA); continue; } if(!stricmp(p,"MSG_SET_GROUP")) { fprintf(out,"%c",CS_MSG_SET_GROUP); continue; } if(!stricmp(p,"MSG_SELECT_AREA")) { fprintf(out,"%c",CS_MSG_SELECT_AREA); continue; } if(!stricmp(p,"MSG_SHOW_GROUPS")) { fprintf(out,"%c",CS_MSG_SHOW_GROUPS); continue; } if(!stricmp(p,"MSG_SHOW_SUBBOARDS")) { fprintf(out,"%c",CS_MSG_SHOW_SUBBOARDS); continue; } if(!stricmp(p,"MSG_GROUP_UP")) { fprintf(out,"%c",CS_MSG_GROUP_UP); continue; } if(!stricmp(p,"MSG_GROUP_DOWN")) { fprintf(out,"%c",CS_MSG_GROUP_DOWN); continue; } if(!stricmp(p,"MSG_SUBBOARD_UP")) { fprintf(out,"%c",CS_MSG_SUBBOARD_UP); continue; } if(!stricmp(p,"MSG_SUBBOARD_DOWN")) { fprintf(out,"%c",CS_MSG_SUBBOARD_DOWN); continue; } if(!stricmp(p,"MSG_GET_SUB_NUM")) { fprintf(out,"%c",CS_MSG_GET_SUB_NUM); continue; } if(!stricmp(p,"MSG_GET_GRP_NUM")) { fprintf(out,"%c",CS_MSG_GET_GRP_NUM); continue; } if(!stricmp(p,"MSG_READ")) { fprintf(out,"%c",CS_MSG_READ); continue; } if(!stricmp(p,"MSG_POST")) { fprintf(out,"%c",CS_MSG_POST); continue; } if(!stricmp(p,"MSG_QWK")) { fprintf(out,"%c",CS_MSG_QWK); continue; } if(!stricmp(p,"MSG_PTRS_CFG")) { fprintf(out,"%c",CS_MSG_PTRS_CFG); continue; } if(!stricmp(p,"MSG_PTRS_REINIT")) { fprintf(out,"%c",CS_MSG_PTRS_REINIT); continue; } if(!stricmp(p,"MSG_NEW_SCAN_CFG")) { fprintf(out,"%c",CS_MSG_NEW_SCAN_CFG); continue; } if(!stricmp(p,"MSG_NEW_SCAN")) { fprintf(out,"%c",CS_MSG_NEW_SCAN); continue; } if(!stricmp(p,"MSG_NEW_SCAN_SUB")) { fprintf(out,"%c",CS_MSG_NEW_SCAN_SUB); continue; } if(!stricmp(p,"MSG_NEW_SCAN_ALL")) { fprintf(out,"%c",CS_MSG_NEW_SCAN_ALL); continue; } if(!stricmp(p,"MSG_CONT_SCAN")) { fprintf(out,"%c",CS_MSG_CONT_SCAN); continue; } if(!stricmp(p,"MSG_CONT_SCAN_ALL")) { fprintf(out,"%c",CS_MSG_CONT_SCAN_ALL); continue; } if(!stricmp(p,"MSG_BROWSE_SCAN")) { fprintf(out,"%c",CS_MSG_BROWSE_SCAN); continue; } if(!stricmp(p,"MSG_BROWSE_SCAN_ALL")) { fprintf(out,"%c",CS_MSG_BROWSE_SCAN_ALL); continue; } if(!stricmp(p,"MSG_FIND_TEXT")) { fprintf(out,"%c",CS_MSG_FIND_TEXT); continue; } if(!stricmp(p,"MSG_FIND_TEXT_ALL")) { fprintf(out,"%c",CS_MSG_FIND_TEXT_ALL); continue; } if(!stricmp(p,"MSG_YOUR_SCAN_CFG")) { fprintf(out,"%c",CS_MSG_YOUR_SCAN_CFG); continue; } if(!stricmp(p,"MSG_YOUR_SCAN")) { fprintf(out,"%c",CS_MSG_YOUR_SCAN); continue; } if(!stricmp(p,"MSG_YOUR_SCAN_ALL")) { fprintf(out,"%c",CS_MSG_YOUR_SCAN_ALL); continue; } if(!stricmp(p,"CHAT_SECTION")) { fprintf(out,"%c",CS_CHAT_SECTION); continue; } if(!stricmp(p,"TEXT_FILE_SECTION")) { fprintf(out,"%c",CS_TEXT_FILE_SECTION); continue; } if(!stricmp(p,"XTRN_EXEC")) { fprintf(out,"%c",CS_XTRN_EXEC); continue; } if(!stricmp(p,"XTRN_SECTION")) { fprintf(out,"%c",CS_XTRN_SECTION); continue; } if(!stricmp(p,"FILE_SET_AREA")) { fprintf(out,"%c",CS_FILE_SET_AREA); continue; } if(!stricmp(p,"FILE_SET_LIBRARY")) { fprintf(out,"%c",CS_FILE_SET_LIBRARY); continue; } if(!stricmp(p,"FILE_SELECT_AREA")) { fprintf(out,"%c",CS_FILE_SELECT_AREA); continue; } if(!stricmp(p,"FILE_SHOW_LIBRARIES")) { fprintf(out,"%c",CS_FILE_SHOW_LIBRARIES); continue; } if(!stricmp(p,"FILE_SHOW_DIRECTORIES")) { fprintf(out,"%c",CS_FILE_SHOW_DIRECTORIES); continue; } if(!stricmp(p,"FILE_LIBRARY_UP")) { fprintf(out,"%c",CS_FILE_LIBRARY_UP); continue; } if(!stricmp(p,"FILE_LIBRARY_DOWN")) { fprintf(out,"%c",CS_FILE_LIBRARY_DOWN); continue; } if(!stricmp(p,"FILE_DIRECTORY_UP")) { fprintf(out,"%c",CS_FILE_DIRECTORY_UP); continue; } if(!stricmp(p,"FILE_DIRECTORY_DOWN")) { fprintf(out,"%c",CS_FILE_DIRECTORY_DOWN); continue; } if(!stricmp(p,"FILE_GET_DIR_NUM")) { fprintf(out,"%c",CS_FILE_GET_DIR_NUM); continue; } if(!stricmp(p,"FILE_GET_LIB_NUM")) { fprintf(out,"%c",CS_FILE_GET_LIB_NUM); continue; } if(!stricmp(p,"FILE_UPLOAD")) { fprintf(out,"%c",CS_FILE_UPLOAD); continue; } if(!stricmp(p,"FILE_UPLOAD_USER")) { fprintf(out,"%c",CS_FILE_UPLOAD_USER); continue; } if(!stricmp(p,"FILE_UPLOAD_BULK")) { fprintf(out,"%c",CS_FILE_UPLOAD_BULK); continue; } if(!stricmp(p,"FILE_UPLOAD_SYSOP")) { fprintf(out,"%c",CS_FILE_UPLOAD_SYSOP); continue; } if(!stricmp(p,"FILE_RESORT_DIRECTORY")) { fprintf(out,"%c",CS_FILE_RESORT_DIRECTORY); continue; } if(!stricmp(p,"FILE_SET_ALT_PATH")) { fprintf(out,"%c",CS_FILE_SET_ALT_PATH); continue; } if(!stricmp(p,"FILE_GET")) { fprintf(out,"%c",CS_FILE_GET); continue; } if(!stricmp(p,"FILE_SEND")) { fprintf(out,"%c",CS_FILE_SEND); continue; } if(!stricmp(p,"FILE_PUT")) { fprintf(out,"%c",CS_FILE_PUT); continue; } if(!stricmp(p,"FILE_RECEIVE")) { fprintf(out,"%c",CS_FILE_RECEIVE); continue; } if(!stricmp(p,"FILE_FIND_OLD")) { fprintf(out,"%c",CS_FILE_FIND_OLD); continue; } if(!stricmp(p,"FILE_FIND_OPEN")) { fprintf(out,"%c",CS_FILE_FIND_OPEN); continue; } if(!stricmp(p,"FILE_FIND_OFFLINE")) { fprintf(out,"%c",CS_FILE_FIND_OFFLINE); continue; } if(!stricmp(p,"FILE_FIND_OLD_UPLOADS")) { fprintf(out,"%c",CS_FILE_FIND_OLD_UPLOADS); continue; } if(!stricmp(p,"FILE_DOWNLOAD")) { fprintf(out,"%c",CS_FILE_DOWNLOAD); continue; } if(!stricmp(p,"FILE_DOWNLOAD_USER")) { fprintf(out,"%c",CS_FILE_DOWNLOAD_USER); continue; } if(!stricmp(p,"FILE_DOWNLOAD_BATCH")) { fprintf(out,"%c",CS_FILE_DOWNLOAD_BATCH); continue; } if(!stricmp(p,"FILE_REMOVE")) { fprintf(out,"%c",CS_FILE_REMOVE); continue; } if(!stricmp(p,"FILE_LIST")) { fprintf(out,"%c",CS_FILE_LIST); continue; } if(!stricmp(p,"FILE_LIST_EXTENDED")) { fprintf(out,"%c",CS_FILE_LIST_EXTENDED); continue; } if(!stricmp(p,"FILE_VIEW")) { fprintf(out,"%c",CS_FILE_VIEW); continue; } if(!stricmp(p,"FILE_FIND_TEXT")) { fprintf(out,"%c",CS_FILE_FIND_TEXT); continue; } if(!stricmp(p,"FILE_FIND_TEXT_ALL")) { fprintf(out,"%c",CS_FILE_FIND_TEXT_ALL); continue; } if(!stricmp(p,"FILE_FIND_NAME")) { fprintf(out,"%c",CS_FILE_FIND_NAME); continue; } if(!stricmp(p,"FILE_FIND_NAME_ALL")) { fprintf(out,"%c",CS_FILE_FIND_NAME_ALL); continue; } if(!stricmp(p,"FILE_BATCH_SECTION")) { fprintf(out,"%c",CS_FILE_BATCH_SECTION); continue; } if(!stricmp(p,"FILE_TEMP_SECTION")) { fprintf(out,"%c",CS_FILE_TEMP_SECTION); continue; } if(!stricmp(p,"FILE_NEW_SCAN")) { fprintf(out,"%c",CS_FILE_NEW_SCAN); continue; } if(!stricmp(p,"FILE_NEW_SCAN_ALL")) { fprintf(out,"%c",CS_FILE_NEW_SCAN_ALL); continue; } if(!stricmp(p,"FILE_NEW_SCAN_CFG")) { fprintf(out,"%c",CS_FILE_NEW_SCAN_CFG); continue; } if(!stricmp(p,"FILE_PTRS_CFG")) { fprintf(out,"%c",CS_FILE_PTRS_CFG); continue; } if(!stricmp(p,"FILE_BATCH_ADD")) { fprintf(out,"%c",CS_FILE_BATCH_ADD); continue; } if(!stricmp(p,"FILE_BATCH_ADD_LIST")) { fprintf(out,"%c",CS_FILE_BATCH_ADD_LIST); continue; } if(!stricmp(p,"FILE_BATCH_CLEAR")) { fprintf(out,"%c",CS_FILE_BATCH_CLEAR); continue; } if(!stricmp(p,"INC_MAIN_CMDS")) { fprintf(out,"%c",CS_INC_MAIN_CMDS); continue; } if(!stricmp(p,"INC_FILE_CMDS")) { fprintf(out,"%c",CS_INC_FILE_CMDS); continue; } break; } if(!feof(in)) { printf("!SYNTAX ERROR:\n"); printf(linestr,src,line,save); bail(1); } fclose(in); free(str); free(save); } char *banner= "\n" "BAJA v2.34-%s (rev %s) - Synchronet Shell/Module Compiler\n"; char *usage= "\n" "usage: baja [-opts] file[.src]\n" "\n" " opts: -d display debug during compile\n" " -c case sensitive variables, labels, and macros\n" " -o set output directory (e.g. -o/sbbs/exec)\n" " -i set include directory (e.g. -i/sbbs/exec)\n" " -q quiet mode (no banner)\n" " -p pause on error" ; int main(int argc, char **argv) { char src[MAX_PATH+1]="",*p; char path[MAX_PATH+1]; int i,j; int show_banner=TRUE; char revision[16]; sscanf("$Revision$", "%*s %s", revision); for(i=1;i<argc;i++) if(argv[i][0]=='-' #ifdef _WIN32 || argv[i][0]=='/' #endif ) switch(toupper(argv[i][1])) { case 'D': display=1; break; case 'C': case_sens=1; break; case 'O': SAFECOPY(output_dir,argv[i]+2); backslash(output_dir); break; case 'I': SAFECOPY(include_dir,argv[i]+2); backslash(include_dir); break; case 'P': pause_on_error=TRUE; break; case 'Q': show_banner=0; break; default: printf(banner,PLATFORM_DESC,revision); puts(usage); bail(1); } else sprintf(src,"%.*s",(int)(sizeof(src)-5),argv[i]); /* leave room for '.src' to be appended */ if(show_banner) printf(banner,PLATFORM_DESC,revision); if(!src[0]) { puts(usage); bail(1); } if(include_dir[0]==0) { /* Include directory not specified */ SAFECOPY(include_dir,src); /* Default to same dir as src file */ if((p=getfname(include_dir))!=NULL) *p=0; /* Truncate off the src filename */ } if(getfext(src)==NULL) strcat(src,".src"); SAFECOPY(bin_file,src); if((p=getfext(bin_file))!=NULL) *p=0; strcat(bin_file,".bin"); if(output_dir[0]) { p=getfname(bin_file); SAFEPRINTF2(path,"%s%s",output_dir,p); SAFECOPY(bin_file,path); } if((out=fopen(bin_file,"w+b"))==NULL) { printf("error %d opening %s for write\n",errno,bin_file); bail(1); } printf("\nCompiling %s...\n",src); compile(src); /****************************/ /* Resolve GOTOS and CALLS */ /****************************/ printf("Resolving labels...\n"); for(i=0;i<gotos;i++) { for(j=0;j<labels;j++) if(!stricmp(goto_label[i],label_name[j])) break; if(j>=labels) { printf("%s line %d: label (%s) not found.\n" ,goto_file[i],goto_line[i],goto_label[i]); bail(1); } fseek(out,(int32_t)(goto_indx[i]+1),SEEK_SET); fwrite(&label_indx[j],2,1,out); } for(i=0;i<calls;i++) { for(j=0;j<labels;j++) if((!case_sens && !strnicmp(call_label[i],label_name[j],strlen(call_label[i]))) || (case_sens && !strncmp(call_label[i],label_name[j],strlen(call_label[i])))) break; if(j>=labels) { printf("%s line %d: label (%s) not found.\n" ,call_file[i],call_line[i],call_label[i]); bail(1); } fseek(out,(int32_t)(call_indx[i]+1),SEEK_SET); fwrite(&label_indx[j],2,1,out); } printf("\nDone.\n"); return(0); }