#include #include #include #include #include "globals.h" #include "functions.h" /* VBScript Token Types: 0: EOF 1: number 2: keyword 3: _ 4: identifier 5: EOL 6: %> 7: +,-,*,/ 8: >,<,<=,>=,<> 9: & 10: " " 11: ' ' 12: (,) 13: : 14: . 15: comment 16: , */ int gettoken(char *token) { int ptr=0,tokentype=2; int ch,sflag=0,r=0; int quote=0; if (tokenpush2[0]!=0) { strcpy(token,tokenpush2); tokenpush2[0]=0; return tokentypepush2; } if (tokenpush[0]!=0) { strcpy(token,tokenpush); tokenpush[0]=0; return tokentypepush; } token[1]=0; while(1) { if (pushback!=-1) { ch=pushback; pushback=-1; } else { ch=getc(in); } column++; if (ch==EOF) break; if (quote=='\'' && sflag!=1) { if (ch=='\n' || ch=='\r') { token[0]='/'; for (r=ptr; r>0; r--) { token[r]=token[r-1]; } token[ptr+1]='\n'; token[ptr+2]=0; return 15; } else if (ch=='%') { ch=getc(in); if (ch=='>') { push("%>",6); token[0]='/'; for (r=ptr; r>0; r--) { token[r]=token[r-1]; } token[ptr+1]=' '; token[ptr+2]=0; return 15; } else { pushback=ch; } } } if (sflag==1) { if (ch!=quote) { pushback=ch; token[ptr]=0; /* fixw2k(token); */ if (ch=='\"') return 10; return 11; } sflag=0; } if (ch=='\"' || ch=='\'') { if (ptr==0) { quote=ch; } else if (quote==ch) { if (token[ptr-1]==ch && sflag!=3) { if (ptr==1) { ch=getc(in); pushback=ch; if (ch!=quote) { token[ptr]=quote; token[ptr+1]=0; if (quote=='\'') return 11; else return 10; } sflag=1; } else if (sflag!=3) { token[ptr-1]='\\'; sflag=3; token[ptr++]=ch; continue; } } else { sflag=1; } } /* else { printf("pushback=ch; break;\n"); pushback=ch; break; } */ } if (sflag==3) sflag=0; if (quote!=0) { token[ptr++]=ch; continue; } if ((ch=='>' && ptr==1) && token[ptr-1]=='%') { token[1]='>'; token[2]=0; return 6; } if (sflag==2) { if (ch=='=' || (ch=='>' && token[0]=='<')) { token[1]=ch; token[2]=0; } else { pushback=ch; token[1]=0; } return 8; } if (ch=='>' || ch=='<') { if (ptr!=0) { pushback=ch; token[ptr]=0; break; } else { sflag=2; tokentype=8; } } if (ch=='(' || ch==')') { if (ptr!=0) { pushback=ch; token[ptr]=0; break; } else { token[0]=ch; return 12; } } if (ch=='%') { if (ptr!=0) { pushback=ch; token[ptr]=0; break; } } if (ch=='=') { if (ptr!=0) { pushback=ch; token[ptr]=0; break; } else { token[0]=ch; return 8; } } if (ch=='&') { if (ptr!=0) { pushback=ch; token[ptr]=0; break; } token[0]=ch; if (pushback!=-1) { ch=pushback; pushback=-1; } else { ch=getc(in); } if (tolower(ch)=='h') { token[ptr++]='0'; token[ptr++]='x'; tokentype=1; continue; } else { pushback=ch; token[1]=0; return 9; } /* if (ptr!=0) { if (ptr==1 && (ch=='h' || ch=='H')) { token[0]='0'; token[1]='x'; tokentype=1; } else { pushback=ch; token[ptr]=0; break; } } else { token[0]=ch; return 9; } */ } if (ch==':') { if (ptr!=0) { pushback=ch; token[ptr]=0; break; } else { token[0]=ch; return 13; } } if (ch==',') { if (ptr!=0) { pushback=ch; token[ptr]=0; break; } else { token[0]=ch; return 16; } } if (ch=='.') { if (ptr!=0) { pushback=ch; token[ptr]=0; break; } else { token[0]=ch; return 14; } } if ((ch=='+' || ch=='-') || (ch=='*' || ch=='/')) { if (ptr==0) { token[0]=ch; token[1]=0; return 7; } else { pushback=ch; break; } } if (ch=='_') { if (ptr==0) { token[0]=ch; while ((ch=getc(in))!=EOF) { if (ch=='\n' || ch=='\r') { line++; r=getc(in); if (r=='\r' || r=='\n') { if (ch==r) pushback=r; } else { pushback=r; } return 3; } } return 0; } else if (tokentype==2) { token[ptr++]=ch; continue; } else { pushback=ch; break; } } if (ch=='\r' || ch=='\n') { if (ptr==0) { token[0]='\n'; column=0; line++; r=getc(in); if (r=='\r' || r=='\n') { if (ch==r) pushback=r; } else { pushback=r; } return 5; } else { pushback=ch; break; } } if (ch==' ' || ch=='\t') { if (ptr==0) { /* putc(ch,out); */ continue; } else { pushback=ch; token[ptr]=0; return tokentype; } } if (tokentype==1) { if (ch<'0' || ch>'9') { pushback=ch; break; } } if (ch>='0' && ch<='9') { if (ptr==0) { tokentype=1; } } token[ptr++]=(char)ch; } if (ptr==0) return 0; token[ptr]=0; return tokentype; }