Open-Source-Software-Entwicklung und Downloads

Browse Subversion Repository

Diff of /trunk/teraterm/ttpmacro/ttmparse.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3226 by maya, Tue Mar 24 09:37:20 2009 UTC revision 3227 by maya, Tue Mar 24 15:10:33 2009 UTC
# Line 1  Line 1 
1  // Tera Term  // Tera Term
2  // Copyright(C) 1994-1998 T. Teranishi  // Copyright(C) 1994-1998 T. Teranishi
3  // All rights reserved.  // All rights reserved.
4    
5  // TTMACRO.EXE, TTL parser  // TTMACRO.EXE, TTL parser
6    
7  #include "teraterm.h"  #include "teraterm.h"
8  #include <string.h>  #include <string.h>
9  #include <stdio.h>  #include <stdio.h>
10  #include <ctype.h>  #include <ctype.h>
11  #include "ttmdlg.h"  #include "ttmdlg.h"
12  #include "ttmparse.h"  #include "ttmparse.h"
13    
14    
15  WORD TTLStatus = 0;  WORD TTLStatus = 0;
16  char LineBuff[MaxLineLen]; // 行バッファのサイズを拡張した。(2007.6.9 maya)  char LineBuff[MaxLineLen]; // 行バッファのサイズを拡張した。(2007.6.9 maya)
17  WORD LinePtr;  WORD LinePtr;
18  WORD LineLen;  WORD LineLen;
19    
20  // 変数の個数を128->256、ラベルの個数を256->512へ拡張した。(2006.2.1 yutaka)  // 変数の個数を128->256、ラベルの個数を256->512へ拡張した。(2006.2.1 yutaka)
21  // 変数の個数を、InitTTL で作っているシステム変数の分だけ追加した。(2006.7.26 maya)  // 変数の個数を、InitTTL で作っているシステム変数の分だけ追加した。(2006.7.26 maya)
22  #define MaxNumOfIntVar (LONG)(128*2+3)  #define MaxNumOfIntVar (LONG)(128*2+3)
23  #define MaxNumOfStrVar (LONG)(128*2+19)  #define MaxNumOfStrVar (LONG)(128*2+19)
24  #define MaxNumOfLabVar (LONG)256*2  #define MaxNumOfLabVar (LONG)256*2
25    
26  #define IntVarIdOff (LONG)0  #define IntVarIdOff (LONG)0
27  #define StrVarIdOff (IntVarIdOff+MaxNumOfIntVar)  #define StrVarIdOff (IntVarIdOff+MaxNumOfIntVar)
28  #define LabVarIdOff (StrVarIdOff+MaxNumOfStrVar)  #define LabVarIdOff (StrVarIdOff+MaxNumOfStrVar)
29  #define MaxNumOfName (MaxNumOfIntVar+MaxNumOfStrVar+MaxNumOfLabVar)  #define MaxNumOfName (MaxNumOfIntVar+MaxNumOfStrVar+MaxNumOfLabVar)
30  #define NameBuffLen MaxNumOfName*MaxNameLen  #define NameBuffLen MaxNumOfName*MaxNameLen
31  #define StrBuffLen MaxNumOfStrVar*MaxStrLen  #define StrBuffLen MaxNumOfStrVar*MaxStrLen
32    
33  static int IntVal[MaxNumOfIntVar];  static int IntVal[MaxNumOfIntVar];
34  static BINT LabVal[MaxNumOfLabVar];  static BINT LabVal[MaxNumOfLabVar];
35  static BYTE LabLevel[MaxNumOfLabVar];  static BYTE LabLevel[MaxNumOfLabVar];
36    
37  static HANDLE HNameBuff;  static HANDLE HNameBuff;
38  static PCHAR NameBuff;  static PCHAR NameBuff;
39  static HANDLE HStrBuff;  static HANDLE HStrBuff;
40  static PCHAR StrBuff;  static PCHAR StrBuff;
41  static WORD IntVarCount, StrVarCount, LabVarCount;  static WORD IntVarCount, StrVarCount, LabVarCount;
42    
43    
44  BOOL InitVar()  BOOL InitVar()
45  {  {
46          HNameBuff = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT,NameBuffLen);          HNameBuff = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT,NameBuffLen);
47          if (HNameBuff==NULL) return FALSE;          if (HNameBuff==NULL) return FALSE;
48          NameBuff = NULL;          NameBuff = NULL;
49    
50          HStrBuff = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT,StrBuffLen);          HStrBuff = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT,StrBuffLen);
51          if (HStrBuff==NULL) return FALSE;          if (HStrBuff==NULL) return FALSE;
52          StrBuff = NULL;          StrBuff = NULL;
53    
54          IntVarCount = 0;          IntVarCount = 0;
55          LabVarCount = 0;          LabVarCount = 0;
56          StrVarCount = 0;          StrVarCount = 0;
57          return TRUE;          return TRUE;
58  }  }
59    
60  void EndVar()  void EndVar()
61  {  {
62          UnlockVar();          UnlockVar();
63          GlobalFree(HNameBuff);          GlobalFree(HNameBuff);
64          GlobalFree(HStrBuff);          GlobalFree(HStrBuff);
65  }  }
66    
67  void DispErr(WORD Err)  void DispErr(WORD Err)
68  {  {
69          char Msg[41];          char Msg[41];
70          int i;          int i;
71    
72          switch (Err) {          switch (Err) {
73                  case ErrCloseParent: strncpy_s(Msg, sizeof(Msg),"\")\" expected.", _TRUNCATE); break;                  case ErrCloseParent: strncpy_s(Msg, sizeof(Msg),"\")\" expected.", _TRUNCATE); break;
74                  case ErrCantCall: strncpy_s(Msg, sizeof(Msg),"Can't call sub.", _TRUNCATE); break;                  case ErrCantCall: strncpy_s(Msg, sizeof(Msg),"Can't call sub.", _TRUNCATE); break;
75                  case ErrCantConnect: strncpy_s(Msg, sizeof(Msg),"Can't link macro.", _TRUNCATE); break;                  case ErrCantConnect: strncpy_s(Msg, sizeof(Msg),"Can't link macro.", _TRUNCATE); break;
76                  case ErrCantOpen: strncpy_s(Msg, sizeof(Msg),"Can't open file.", _TRUNCATE); break;                  case ErrCantOpen: strncpy_s(Msg, sizeof(Msg),"Can't open file.", _TRUNCATE); break;
77                  case ErrDivByZero: strncpy_s(Msg, sizeof(Msg),"Divide by zero.", _TRUNCATE); break;                  case ErrDivByZero: strncpy_s(Msg, sizeof(Msg),"Divide by zero.", _TRUNCATE); break;
78                  case ErrInvalidCtl: strncpy_s(Msg, sizeof(Msg),"Invalid control.", _TRUNCATE); break;                  case ErrInvalidCtl: strncpy_s(Msg, sizeof(Msg),"Invalid control.", _TRUNCATE); break;
79                  case ErrLabelAlreadyDef: strncpy_s(Msg, sizeof(Msg),"Label already defined.", _TRUNCATE); break;                  case ErrLabelAlreadyDef: strncpy_s(Msg, sizeof(Msg),"Label already defined.", _TRUNCATE); break;
80                  case ErrLabelReq: strncpy_s(Msg, sizeof(Msg),"Label requiered.", _TRUNCATE); break;                  case ErrLabelReq: strncpy_s(Msg, sizeof(Msg),"Label requiered.", _TRUNCATE); break;
81                  case ErrLinkFirst: strncpy_s(Msg, sizeof(Msg),"Link macro first. Use 'connect' macro.", _TRUNCATE); break;                  case ErrLinkFirst: strncpy_s(Msg, sizeof(Msg),"Link macro first. Use 'connect' macro.", _TRUNCATE); break;
82                  case ErrStackOver: strncpy_s(Msg, sizeof(Msg),"Stack overflow.", _TRUNCATE); break;                  case ErrStackOver: strncpy_s(Msg, sizeof(Msg),"Stack overflow.", _TRUNCATE); break;
83                  case ErrSyntax: strncpy_s(Msg, sizeof(Msg),"Syntax error.", _TRUNCATE); break;                  case ErrSyntax: strncpy_s(Msg, sizeof(Msg),"Syntax error.", _TRUNCATE); break;
84                  case ErrTooManyLabels: strncpy_s(Msg, sizeof(Msg),"Too many labels.", _TRUNCATE); break;                  case ErrTooManyLabels: strncpy_s(Msg, sizeof(Msg),"Too many labels.", _TRUNCATE); break;
85                  case ErrTooManyVar: strncpy_s(Msg, sizeof(Msg),"Too many variables.", _TRUNCATE); break;                  case ErrTooManyVar: strncpy_s(Msg, sizeof(Msg),"Too many variables.", _TRUNCATE); break;
86                  case ErrTypeMismatch: strncpy_s(Msg, sizeof(Msg),"Type mismatch.", _TRUNCATE); break;                  case ErrTypeMismatch: strncpy_s(Msg, sizeof(Msg),"Type mismatch.", _TRUNCATE); break;
87                  case ErrVarNotInit: strncpy_s(Msg, sizeof(Msg),"Variable not initialized.", _TRUNCATE); break;                  case ErrVarNotInit: strncpy_s(Msg, sizeof(Msg),"Variable not initialized.", _TRUNCATE); break;
88          }          }
89    
90          i = OpenErrDlg(Msg,LineBuff);          i = OpenErrDlg(Msg,LineBuff);
91          if (i==IDOK) TTLStatus = IdTTLEnd;          if (i==IDOK) TTLStatus = IdTTLEnd;
92  }  }
93    
94  void LockVar()  void LockVar()
95  {  {
96          if (NameBuff==NULL)          if (NameBuff==NULL)
97                  NameBuff = GlobalLock(HNameBuff);                  NameBuff = GlobalLock(HNameBuff);
98          if (NameBuff==NULL)          if (NameBuff==NULL)
99                  PostQuitMessage(0);                  PostQuitMessage(0);
100    
101          if (StrBuff==NULL)          if (StrBuff==NULL)
102                  StrBuff = GlobalLock(HStrBuff);                  StrBuff = GlobalLock(HStrBuff);
103          if (StrBuff==NULL)          if (StrBuff==NULL)
104                  PostQuitMessage(0);                  PostQuitMessage(0);
105  }  }
106    
107  void UnlockVar()  void UnlockVar()
108  {  {
109          if (NameBuff!=NULL)          if (NameBuff!=NULL)
110                  GlobalUnlock(HNameBuff);                  GlobalUnlock(HNameBuff);
111          NameBuff = NULL;          NameBuff = NULL;
112    
113          if (StrBuff!=NULL)          if (StrBuff!=NULL)
114                  GlobalUnlock(HStrBuff);                  GlobalUnlock(HStrBuff);
115          StrBuff = NULL;          StrBuff = NULL;
116  }  }
117    
118  BOOL CheckReservedWord(PCHAR Str, LPWORD WordId)  BOOL CheckReservedWord(PCHAR Str, LPWORD WordId)
119  {  {
120          *WordId = 0;          *WordId = 0;
121    
122          switch (Str[0] | 0x20) { // to lower-case          switch (Str[0] | 0x20) { // to lower-case
123          case 'a':          case 'a':
124                  if (_stricmp(Str,"and")==0) *WordId = RsvBAnd;                  if (_stricmp(Str,"and")==0) *WordId = RsvBAnd;
125                  break;                  break;
126          case 'b':          case 'b':
127                  if (_stricmp(Str,"beep")==0) *WordId = RsvBeep;                  if (_stricmp(Str,"beep")==0) *WordId = RsvBeep;
128                  else if (_stricmp(Str,"bplusrecv")==0) *WordId = RsvBPlusRecv;                  else if (_stricmp(Str,"bplusrecv")==0) *WordId = RsvBPlusRecv;
129                  else if (_stricmp(Str,"bplussend")==0) *WordId = RsvBPlusSend;                  else if (_stricmp(Str,"bplussend")==0) *WordId = RsvBPlusSend;
130                  else if (_stricmp(Str,"break")==0) *WordId = RsvBreak;                  else if (_stricmp(Str,"break")==0) *WordId = RsvBreak;
131                  break;                  break;
132          case 'c':          case 'c':
133                  if (_stricmp(Str,"call")==0) *WordId = RsvCall;                  if (_stricmp(Str,"call")==0) *WordId = RsvCall;
134                  else if (_stricmp(Str,"callmenu")==0) *WordId = RsvCallMenu;                  else if (_stricmp(Str,"callmenu")==0) *WordId = RsvCallMenu;
135                  else if (_stricmp(Str,"changedir")==0) *WordId = RsvChangeDir;                  else if (_stricmp(Str,"changedir")==0) *WordId = RsvChangeDir;
136                  else if (_stricmp(Str,"clearscreen")==0) *WordId = RsvClearScreen;                  else if (_stricmp(Str,"clearscreen")==0) *WordId = RsvClearScreen;
137                  else if (_stricmp(Str,"clipb2var")==0) *WordId = RsvClipb2Var;  // add 'clipb2var' (2006.9.17 maya)                  else if (_stricmp(Str,"clipb2var")==0) *WordId = RsvClipb2Var;  // add 'clipb2var' (2006.9.17 maya)
138                  else if (_stricmp(Str,"closesbox")==0) *WordId = RsvCloseSBox;                  else if (_stricmp(Str,"closesbox")==0) *WordId = RsvCloseSBox;
139                  else if (_stricmp(Str,"closett")==0) *WordId = RsvCloseTT;                  else if (_stricmp(Str,"closett")==0) *WordId = RsvCloseTT;
140                  else if (_stricmp(Str,"code2str")==0) *WordId = RsvCode2Str;                  else if (_stricmp(Str,"code2str")==0) *WordId = RsvCode2Str;
141                  else if (_stricmp(Str,"connect")==0) *WordId = RsvConnect;                  else if (_stricmp(Str,"connect")==0) *WordId = RsvConnect;
142                  else if (_stricmp(Str,"crc32")==0) *WordId = RsvCrc32;                  else if (_stricmp(Str,"crc32")==0) *WordId = RsvCrc32;
143                  else if (_stricmp(Str,"crc32file")==0) *WordId = RsvCrc32File;                  else if (_stricmp(Str,"crc32file")==0) *WordId = RsvCrc32File;
144                  else if (_stricmp(Str,"cygconnect")==0) *WordId = RsvCygConnect;                  else if (_stricmp(Str,"cygconnect")==0) *WordId = RsvCygConnect;
145                  break;                  break;
146          case 'd':          case 'd':
147                  if (_stricmp(Str,"delpassword")==0) *WordId = RsvDelPassword;                  if (_stricmp(Str,"delpassword")==0) *WordId = RsvDelPassword;
148                  else if (_stricmp(Str,"disconnect")==0) *WordId = RsvDisconnect;                  else if (_stricmp(Str,"disconnect")==0) *WordId = RsvDisconnect;
149                  else if (_stricmp(Str,"do")==0) *WordId = RsvDo;                  else if (_stricmp(Str,"do")==0) *WordId = RsvDo;
150                  break;                  break;
151          case 'e':          case 'e':
152                  if (_stricmp(Str,"else")==0) *WordId = RsvElse;                  if (_stricmp(Str,"else")==0) *WordId = RsvElse;
153                  else if (_stricmp(Str,"elseif")==0) *WordId = RsvElseIf;                  else if (_stricmp(Str,"elseif")==0) *WordId = RsvElseIf;
154                  else if (_stricmp(Str,"enablekeyb")==0) *WordId = RsvEnableKeyb;                  else if (_stricmp(Str,"enablekeyb")==0) *WordId = RsvEnableKeyb;
155                  else if (_stricmp(Str,"end")==0) *WordId = RsvEnd;                  else if (_stricmp(Str,"end")==0) *WordId = RsvEnd;
156                  else if (_stricmp(Str,"endif")==0) *WordId = RsvEndIf;                  else if (_stricmp(Str,"endif")==0) *WordId = RsvEndIf;
157                  else if (_stricmp(Str,"enduntil")==0) *WordId = RsvEndUntil;                  else if (_stricmp(Str,"enduntil")==0) *WordId = RsvEndUntil;
158                  else if (_stricmp(Str,"endwhile")==0) *WordId = RsvEndWhile;                  else if (_stricmp(Str,"endwhile")==0) *WordId = RsvEndWhile;
159                  else if (_stricmp(Str,"exec")==0) *WordId = RsvExec;                  else if (_stricmp(Str,"exec")==0) *WordId = RsvExec;
160                  else if (_stricmp(Str,"execcmnd")==0) *WordId = RsvExecCmnd;                  else if (_stricmp(Str,"execcmnd")==0) *WordId = RsvExecCmnd;
161                  else if (_stricmp(Str,"exit")==0) *WordId = RsvExit;                  else if (_stricmp(Str,"exit")==0) *WordId = RsvExit;
162                  break;                  break;
163          case 'f':          case 'f':
164                  if (_stricmp(Str,"fileclose")==0) *WordId = RsvFileClose;                  if (_stricmp(Str,"fileclose")==0) *WordId = RsvFileClose;
165                  else if (_stricmp(Str,"fileconcat")==0) *WordId = RsvFileConcat;                  else if (_stricmp(Str,"fileconcat")==0) *WordId = RsvFileConcat;
166                  else if (_stricmp(Str,"filecopy")==0) *WordId = RsvFileCopy;                  else if (_stricmp(Str,"filecopy")==0) *WordId = RsvFileCopy;
167                  else if (_stricmp(Str,"filecreate")==0) *WordId = RsvFileCreate;                  else if (_stricmp(Str,"filecreate")==0) *WordId = RsvFileCreate;
168                  else if (_stricmp(Str,"filedelete")==0) *WordId = RsvFileDelete;                  else if (_stricmp(Str,"filedelete")==0) *WordId = RsvFileDelete;
169                  else if (_stricmp(Str,"filemarkptr")==0) *WordId = RsvFileMarkPtr;                  else if (_stricmp(Str,"filemarkptr")==0) *WordId = RsvFileMarkPtr;
170                  else if (_stricmp(Str,"filenamebox")==0) *WordId  = RsvFilenameBox; // add 'filenamebox' (2007.9.13 maya)                  else if (_stricmp(Str,"filenamebox")==0) *WordId  = RsvFilenameBox; // add 'filenamebox' (2007.9.13 maya)
171                  else if (_stricmp(Str,"fileopen")==0) *WordId = RsvFileOpen;                  else if (_stricmp(Str,"fileopen")==0) *WordId = RsvFileOpen;
172                  else if (_stricmp(Str,"filereadln")==0) *WordId = RsvFileReadln;                  else if (_stricmp(Str,"filereadln")==0) *WordId = RsvFileReadln;
173                  else if (_stricmp(Str,"fileread")==0) *WordId = RsvFileRead;    // add                  else if (_stricmp(Str,"fileread")==0) *WordId = RsvFileRead;    // add
174                  else if (_stricmp(Str,"filerename")==0) *WordId = RsvFileRename;                  else if (_stricmp(Str,"filerename")==0) *WordId = RsvFileRename;
175                  else if (_stricmp(Str,"filesearch")==0) *WordId = RsvFileSearch;                  else if (_stricmp(Str,"filesearch")==0) *WordId = RsvFileSearch;
176                  else if (_stricmp(Str,"fileseek")==0) *WordId = RsvFileSeek;                  else if (_stricmp(Str,"fileseek")==0) *WordId = RsvFileSeek;
177                  else if (_stricmp(Str,"fileseekback")==0) *WordId = RsvFileSeekBack;                  else if (_stricmp(Str,"fileseekback")==0) *WordId = RsvFileSeekBack;
178                  else if (_stricmp(Str,"filestrseek")==0) *WordId = RsvFileStrSeek;                  else if (_stricmp(Str,"filestrseek")==0) *WordId = RsvFileStrSeek;
179                  else if (_stricmp(Str,"filestrseek2")==0) *WordId = RsvFileStrSeek2;                  else if (_stricmp(Str,"filestrseek2")==0) *WordId = RsvFileStrSeek2;
180                  else if (_stricmp(Str,"filewrite")==0) *WordId = RsvFileWrite;                  else if (_stricmp(Str,"filewrite")==0) *WordId = RsvFileWrite;
181                  else if (_stricmp(Str,"filewriteln")==0) *WordId = RsvFileWriteLn;                  else if (_stricmp(Str,"filewriteln")==0) *WordId = RsvFileWriteLn;
182                  else if (_stricmp(Str,"findclose")==0) *WordId = RsvFindClose;                  else if (_stricmp(Str,"findclose")==0) *WordId = RsvFindClose;
183                  else if (_stricmp(Str,"findfirst")==0) *WordId = RsvFindFirst;                  else if (_stricmp(Str,"findfirst")==0) *WordId = RsvFindFirst;
184                  else if (_stricmp(Str,"findnext")==0) *WordId = RsvFindNext;                  else if (_stricmp(Str,"findnext")==0) *WordId = RsvFindNext;
185                  else if (_stricmp(Str,"flushrecv")==0) *WordId = RsvFlushRecv;                  else if (_stricmp(Str,"flushrecv")==0) *WordId = RsvFlushRecv;
186                  else if (_stricmp(Str,"for")==0) *WordId = RsvFor;                  else if (_stricmp(Str,"for")==0) *WordId = RsvFor;
187                  break;                  break;
188          case 'g':          case 'g':
189                  if (_stricmp(Str,"getdate")==0) *WordId = RsvGetDate;                  if (_stricmp(Str,"getdate")==0) *WordId = RsvGetDate;
190                  else if (_stricmp(Str,"getdir")==0) *WordId = RsvGetDir;                  else if (_stricmp(Str,"getdir")==0) *WordId = RsvGetDir;
191                  else if (_stricmp(Str,"getenv")==0) *WordId = RsvGetEnv;                  else if (_stricmp(Str,"getenv")==0) *WordId = RsvGetEnv;
192                  else if (_stricmp(Str,"gethostname")==0) *WordId = RsvGetHostname;                  else if (_stricmp(Str,"gethostname")==0) *WordId = RsvGetHostname;
193                  else if (_stricmp(Str,"getpassword")==0) *WordId = RsvGetPassword;                  else if (_stricmp(Str,"getpassword")==0) *WordId = RsvGetPassword;
194                  else if (_stricmp(Str,"gettime")==0) *WordId = RsvGetTime;                  else if (_stricmp(Str,"gettime")==0) *WordId = RsvGetTime;
195                  else if (_stricmp(Str,"gettitle")==0) *WordId = RsvGetTitle;                  else if (_stricmp(Str,"gettitle")==0) *WordId = RsvGetTitle;
196                  else if (_stricmp(Str,"getttdir")==0) *WordId = RsvGetTTDir;                  else if (_stricmp(Str,"getttdir")==0) *WordId = RsvGetTTDir;
197                  else if (_stricmp(Str,"getver")==0) *WordId = RsvGetVer;                  else if (_stricmp(Str,"getver")==0) *WordId = RsvGetVer;
198                  else if (_stricmp(Str,"goto")==0) *WordId = RsvGoto;                  else if (_stricmp(Str,"goto")==0) *WordId = RsvGoto;
199                  break;                  break;
200          case 'i':          case 'i':
201                  if (_stricmp(Str,"if")==0) *WordId = RsvIf;                  if (_stricmp(Str,"if")==0) *WordId = RsvIf;
202                  else if (_stricmp(Str,"ifdefined")==0) *WordId = RsvIfDefined;                  else if (_stricmp(Str,"ifdefined")==0) *WordId = RsvIfDefined;
203                  else if (_stricmp(Str,"include")==0) *WordId = RsvInclude ;                  else if (_stricmp(Str,"include")==0) *WordId = RsvInclude ;
204                  else if (_stricmp(Str,"inputbox")==0) *WordId = RsvInputBox;                  else if (_stricmp(Str,"inputbox")==0) *WordId = RsvInputBox;
205                  else if (_stricmp(Str,"int2str")==0) *WordId = RsvInt2Str;                  else if (_stricmp(Str,"int2str")==0) *WordId = RsvInt2Str;
206                  break;                  break;
207          case 'k':          case 'k':
208                  if (_stricmp(Str,"kmtfinish")==0) *WordId = RsvKmtFinish;                  if (_stricmp(Str,"kmtfinish")==0) *WordId = RsvKmtFinish;
209                  else if (_stricmp(Str,"kmtget")==0) *WordId = RsvKmtGet;                  else if (_stricmp(Str,"kmtget")==0) *WordId = RsvKmtGet;
210                  else if (_stricmp(Str,"kmtrecv")==0) *WordId = RsvKmtRecv;                  else if (_stricmp(Str,"kmtrecv")==0) *WordId = RsvKmtRecv;
211                  else if (_stricmp(Str,"kmtsend")==0) *WordId = RsvKmtSend;                  else if (_stricmp(Str,"kmtsend")==0) *WordId = RsvKmtSend;
212                  break;                  break;
213          case 'l':          case 'l':
214                  if (_stricmp(Str,"loadkeymap")==0) *WordId = RsvLoadKeyMap;                  if (_stricmp(Str,"loadkeymap")==0) *WordId = RsvLoadKeyMap;
215                  else if (_stricmp(Str,"logclose")==0) *WordId = RsvLogClose;                  else if (_stricmp(Str,"logclose")==0) *WordId = RsvLogClose;
216                  else if (_stricmp(Str,"logopen")==0) *WordId = RsvLogOpen;                  else if (_stricmp(Str,"logopen")==0) *WordId = RsvLogOpen;
217                  else if (_stricmp(Str,"logpause")==0) *WordId = RsvLogPause;                  else if (_stricmp(Str,"logpause")==0) *WordId = RsvLogPause;
218                  else if (_stricmp(Str,"logstart")==0) *WordId = RsvLogStart;                  else if (_stricmp(Str,"logstart")==0) *WordId = RsvLogStart;
219                  else if (_stricmp(Str,"logwrite")==0) *WordId = RsvLogWrite;                  else if (_stricmp(Str,"logwrite")==0) *WordId = RsvLogWrite;
220                  else if (_stricmp(Str,"loop")==0) *WordId = RsvLoop;                  else if (_stricmp(Str,"loop")==0) *WordId = RsvLoop;
221                  break;                  break;
222          case 'm':          case 'm':
223                  if (_stricmp(Str,"makepath")==0) *WordId = RsvMakePath;                  if (_stricmp(Str,"makepath")==0) *WordId = RsvMakePath;
224                  else if (_stricmp(Str,"messagebox")==0) *WordId = RsvMessageBox;                  else if (_stricmp(Str,"messagebox")==0) *WordId = RsvMessageBox;
225                  else if (_stricmp(Str,"mpause")==0) *WordId = RsvMilliPause;                  else if (_stricmp(Str,"mpause")==0) *WordId = RsvMilliPause;
226                  break;                  break;
227          case 'n':          case 'n':
228                  if (_stricmp(Str,"next")==0) *WordId = RsvNext;                  if (_stricmp(Str,"next")==0) *WordId = RsvNext;
229                  else if (_stricmp(Str,"not")==0) *WordId = RsvBNot;                  else if (_stricmp(Str,"not")==0) *WordId = RsvBNot;
230                  break;                  break;
231          case 'o':          case 'o':
232                  if (_stricmp(Str,"or")==0) *WordId = RsvBOr;                  if (_stricmp(Str,"or")==0) *WordId = RsvBOr;
233                  break;                  break;
234          case 'p':          case 'p':
235                  if (_stricmp(Str,"passwordbox")==0) *WordId = RsvPasswordBox;                  if (_stricmp(Str,"passwordbox")==0) *WordId = RsvPasswordBox;
236                  else if (_stricmp(Str,"pause")==0) *WordId = RsvPause;                  else if (_stricmp(Str,"pause")==0) *WordId = RsvPause;
237                  break;                  break;
238          case 'q':          case 'q':
239                  if (_stricmp(Str,"quickvanrecv")==0) *WordId = RsvQuickVANRecv;                  if (_stricmp(Str,"quickvanrecv")==0) *WordId = RsvQuickVANRecv;
240                  else if (_stricmp(Str,"quickvansend")==0) *WordId = RsvQuickVANSend;                  else if (_stricmp(Str,"quickvansend")==0) *WordId = RsvQuickVANSend;
241                  break;                  break;
242          case 'r':          case 'r':
243                  if (_stricmp(Str,"random")==0) *WordId = RsvRandom;    // add 'random' (2006.2.11 yutaka)                  if (_stricmp(Str,"random")==0) *WordId = RsvRandom;    // add 'random' (2006.2.11 yutaka)
244                  else if (_stricmp(Str,"recvln")==0) *WordId = RsvRecvLn;                  else if (_stricmp(Str,"recvln")==0) *WordId = RsvRecvLn;
245                  else if (_stricmp(Str,"restoresetup")==0) *WordId = RsvRestoreSetup;                  else if (_stricmp(Str,"restoresetup")==0) *WordId = RsvRestoreSetup;
246                  else if (_stricmp(Str,"return")==0) *WordId = RsvReturn;                  else if (_stricmp(Str,"return")==0) *WordId = RsvReturn;
247                  else if (_stricmp(Str,"rotateleft")==0) *WordId = RsvRotateL;   // add 'rotateleft' (2007.8.19 maya)                  else if (_stricmp(Str,"rotateleft")==0) *WordId = RsvRotateL;   // add 'rotateleft' (2007.8.19 maya)
248                  else if (_stricmp(Str,"rotateright")==0) *WordId = RsvRotateR;  // add 'rotateright' (2007.8.19 maya)                  else if (_stricmp(Str,"rotateright")==0) *WordId = RsvRotateR;  // add 'rotateright' (2007.8.19 maya)
249                  break;                  break;
250          case 's':          case 's':
251                  if (_stricmp(Str,"scprecv")==0) *WordId = RsvScpRecv;      // add 'scprecv' (2008.1.1 yutaka)                  if (_stricmp(Str,"scprecv")==0) *WordId = RsvScpRecv;      // add 'scprecv' (2008.1.1 yutaka)
252                  else if (_stricmp(Str,"scpsend")==0) *WordId = RsvScpSend;      // add 'scpsend' (2008.1.1 yutaka)                  else if (_stricmp(Str,"scpsend")==0) *WordId = RsvScpSend;      // add 'scpsend' (2008.1.1 yutaka)
253                  else if (_stricmp(Str,"send")==0) *WordId = RsvSend;                  else if (_stricmp(Str,"send")==0) *WordId = RsvSend;
254                  else if (_stricmp(Str,"sendbreak")==0) *WordId = RsvSendBreak;                  else if (_stricmp(Str,"sendbreak")==0) *WordId = RsvSendBreak;
255                  else if (_stricmp(Str,"sendbroadcast")==0) *WordId = RsvSendBroadcast;                  else if (_stricmp(Str,"sendbroadcast")==0) *WordId = RsvSendBroadcast;
256                  else if (_stricmp(Str,"sendlnbroadcast")==0) *WordId = RsvSendlnBroadcast;                  else if (_stricmp(Str,"sendlnbroadcast")==0) *WordId = RsvSendlnBroadcast;
257                  else if (_stricmp(Str,"sendmulticast")==0) *WordId = RsvSendMulticast;                  else if (_stricmp(Str,"sendmulticast")==0) *WordId = RsvSendMulticast;
258                  else if (_stricmp(Str,"setmulticastname")==0) *WordId = RsvSetMulticastName;                  else if (_stricmp(Str,"setmulticastname")==0) *WordId = RsvSetMulticastName;
259                  else if (_stricmp(Str,"sendfile")==0) *WordId = RsvSendFile;                  else if (_stricmp(Str,"sendfile")==0) *WordId = RsvSendFile;
260                  else if (_stricmp(Str,"sendkcode")==0) *WordId = RsvSendKCode;                  else if (_stricmp(Str,"sendkcode")==0) *WordId = RsvSendKCode;
261                  else if (_stricmp(Str,"sendln")==0) *WordId = RsvSendLn;                  else if (_stricmp(Str,"sendln")==0) *WordId = RsvSendLn;
262                  else if (_stricmp(Str,"setbaud")==0) *WordId = RsvSetBaud;                  else if (_stricmp(Str,"setbaud")==0) *WordId = RsvSetBaud;
263                  else if (_stricmp(Str,"setdate")==0) *WordId = RsvSetDate;                  else if (_stricmp(Str,"setdate")==0) *WordId = RsvSetDate;
264                  else if (_stricmp(Str,"setdir")==0) *WordId = RsvSetDir;                  else if (_stricmp(Str,"setdir")==0) *WordId = RsvSetDir;
265                  else if (_stricmp(Str,"setdlgpos")==0) *WordId = RsvSetDlgPos;                  else if (_stricmp(Str,"setdlgpos")==0) *WordId = RsvSetDlgPos;
266                  else if (_stricmp(Str,"setdtr")==0) *WordId = RsvSetDtr;    // add 'setdtr'  (2008.3.12 maya)                  else if (_stricmp(Str,"setdtr")==0) *WordId = RsvSetDtr;    // add 'setdtr'  (2008.3.12 maya)
267                  else if (_stricmp(Str,"setecho")==0) *WordId = RsvSetEcho;                  else if (_stricmp(Str,"setecho")==0) *WordId = RsvSetEcho;
268                  else if (_stricmp(Str,"setenv")==0) *WordId = RsvSetEnv;    // reactivate 'setenv' (2007.8.31 maya)                  else if (_stricmp(Str,"setenv")==0) *WordId = RsvSetEnv;    // reactivate 'setenv' (2007.8.31 maya)
269                  else if (_stricmp(Str,"setexitcode")==0) *WordId = RsvSetExitCode;                  else if (_stricmp(Str,"setexitcode")==0) *WordId = RsvSetExitCode;
270                  else if (_stricmp(Str,"setrts")==0) *WordId = RsvSetRts;    // add 'setrts'  (2008.3.12 maya)                  else if (_stricmp(Str,"setrts")==0) *WordId = RsvSetRts;    // add 'setrts'  (2008.3.12 maya)
271                  else if (_stricmp(Str,"setsync")==0) *WordId = RsvSetSync;                  else if (_stricmp(Str,"setsync")==0) *WordId = RsvSetSync;
272                  else if (_stricmp(Str,"settime")==0) *WordId = RsvSetTime;                  else if (_stricmp(Str,"settime")==0) *WordId = RsvSetTime;
273                  else if (_stricmp(Str,"settitle")==0) *WordId = RsvSetTitle;                  else if (_stricmp(Str,"settitle")==0) *WordId = RsvSetTitle;
274                  else if (_stricmp(Str,"show")==0) *WordId = RsvShow;                  else if (_stricmp(Str,"show")==0) *WordId = RsvShow;
275                  else if (_stricmp(Str,"showtt")==0) *WordId = RsvShowTT;                  else if (_stricmp(Str,"showtt")==0) *WordId = RsvShowTT;
276                  else if (_stricmp(Str,"sprintf")==0) *WordId = RsvSprintf;  // add 'sprintf' (2007.5.1 yutaka)                  else if (_stricmp(Str,"sprintf")==0) *WordId = RsvSprintf;  // add 'sprintf' (2007.5.1 yutaka)
277                  else if (_stricmp(Str,"sprintf2")==0) *WordId = RsvSprintf2;  // add 'sprintf2' (2008.12.18 maya)                  else if (_stricmp(Str,"sprintf2")==0) *WordId = RsvSprintf2;  // add 'sprintf2' (2008.12.18 maya)
278                  else if (_stricmp(Str,"statusbox")==0) *WordId = RsvStatusBox;                  else if (_stricmp(Str,"statusbox")==0) *WordId = RsvStatusBox;
279                  else if (_stricmp(Str,"str2code")==0) *WordId = RsvStr2Code;                  else if (_stricmp(Str,"str2code")==0) *WordId = RsvStr2Code;
280                  else if (_stricmp(Str,"str2int")==0) *WordId = RsvStr2Int;                  else if (_stricmp(Str,"str2int")==0) *WordId = RsvStr2Int;
281                  else if (_stricmp(Str,"strcompare")==0) *WordId = RsvStrCompare;                  else if (_stricmp(Str,"strcompare")==0) *WordId = RsvStrCompare;
282                  else if (_stricmp(Str,"strconcat")==0) *WordId = RsvStrConcat;                  else if (_stricmp(Str,"strconcat")==0) *WordId = RsvStrConcat;
283                  else if (_stricmp(Str,"strcopy")==0) *WordId = RsvStrCopy;                  else if (_stricmp(Str,"strcopy")==0) *WordId = RsvStrCopy;
284                  else if (_stricmp(Str,"strlen")==0) *WordId = RsvStrLen;                  else if (_stricmp(Str,"strlen")==0) *WordId = RsvStrLen;
285                  else if (_stricmp(Str,"strmatch")==0) *WordId = RsvStrMatch;                  else if (_stricmp(Str,"strmatch")==0) *WordId = RsvStrMatch;
286                  else if (_stricmp(Str,"strscan")==0) *WordId = RsvStrScan;                  else if (_stricmp(Str,"strscan")==0) *WordId = RsvStrScan;
287                  break;                  break;
288          case 't':          case 't':
289                  if (_stricmp(Str,"testlink")==0) *WordId = RsvTestLink;                  if (_stricmp(Str,"testlink")==0) *WordId = RsvTestLink;
290                  else if (_stricmp(Str,"then")==0) *WordId = RsvThen;                  else if (_stricmp(Str,"then")==0) *WordId = RsvThen;
291                  else if (_stricmp(Str,"tolower")==0) *WordId = RsvToLower;  // add 'tolower' (2007.7.12 maya)                  else if (_stricmp(Str,"tolower")==0) *WordId = RsvToLower;  // add 'tolower' (2007.7.12 maya)
292                  else if (_stricmp(Str,"toupper")==0) *WordId = RsvToUpper;  // add 'toupper' (2007.7.12 maya)                  else if (_stricmp(Str,"toupper")==0) *WordId = RsvToUpper;  // add 'toupper' (2007.7.12 maya)
293                  break;                  break;
294          case 'u':          case 'u':
295                  if (_stricmp(Str,"unlink")==0) *WordId = RsvUnlink;                  if (_stricmp(Str,"unlink")==0) *WordId = RsvUnlink;
296                  else if (_stricmp(Str,"until")==0) *WordId = RsvUntil;                  else if (_stricmp(Str,"until")==0) *WordId = RsvUntil;
297                  break;                  break;
298          case 'v':          case 'v':
299                  if (_stricmp(Str,"var2clipb")==0) *WordId = RsvVar2Clipb;  // add 'var2clipb' (2006.9.17 maya)                  if (_stricmp(Str,"var2clipb")==0) *WordId = RsvVar2Clipb;  // add 'var2clipb' (2006.9.17 maya)
300                  break;                  break;
301          case 'w':          case 'w':
302                  if (_stricmp(Str,"waitregex")==0) *WordId = RsvWaitRegex;  // add 'waitregex' (2005.10.5 yutaka)                  if (_stricmp(Str,"waitregex")==0) *WordId = RsvWaitRegex;  // add 'waitregex' (2005.10.5 yutaka)
303                  else if (_stricmp(Str,"wait")==0) *WordId = RsvWait;                  else if (_stricmp(Str,"wait")==0) *WordId = RsvWait;
304                  else if (_stricmp(Str,"wait4all")==0) *WordId = RsvWait4all;                  else if (_stricmp(Str,"wait4all")==0) *WordId = RsvWait4all;
305                  else if (_stricmp(Str,"waitevent")==0) *WordId = RsvWaitEvent;                  else if (_stricmp(Str,"waitevent")==0) *WordId = RsvWaitEvent;
306                  else if (_stricmp(Str,"waitln")==0) *WordId = RsvWaitLn;                  else if (_stricmp(Str,"waitln")==0) *WordId = RsvWaitLn;
307                  else if (_stricmp(Str,"waitn")==0) *WordId = RsvWaitN;  // add 'waitn'  (2009.1.26 maya)                  else if (_stricmp(Str,"waitn")==0) *WordId = RsvWaitN;  // add 'waitn'  (2009.1.26 maya)
308                  else if (_stricmp(Str,"waitrecv")==0) *WordId = RsvWaitRecv;                  else if (_stricmp(Str,"waitrecv")==0) *WordId = RsvWaitRecv;
309                  else if (_stricmp(Str,"while")==0) *WordId = RsvWhile;                  else if (_stricmp(Str,"while")==0) *WordId = RsvWhile;
310                  break;                  break;
311          case 'x':          case 'x':
312                  if (_stricmp(Str,"xmodemrecv")==0) *WordId = RsvXmodemRecv;                  if (_stricmp(Str,"xmodemrecv")==0) *WordId = RsvXmodemRecv;
313                  else if (_stricmp(Str,"xmodemsend")==0) *WordId = RsvXmodemSend;                  else if (_stricmp(Str,"xmodemsend")==0) *WordId = RsvXmodemSend;
314                  else if (_stricmp(Str,"xor")==0) *WordId = RsvBXor;                  else if (_stricmp(Str,"xor")==0) *WordId = RsvBXor;
315                  break;                  break;
316          case 'y':          case 'y':
317                  if (_stricmp(Str,"yesnobox")==0) *WordId = RsvYesNoBox;                  if (_stricmp(Str,"yesnobox")==0) *WordId = RsvYesNoBox;
318                  break;                  break;
319          case 'z':          case 'z':
320                  if (_stricmp(Str,"zmodemrecv")==0) *WordId = RsvZmodemRecv;                  if (_stricmp(Str,"zmodemrecv")==0) *WordId = RsvZmodemRecv;
321                  else if (_stricmp(Str,"zmodemsend")==0) *WordId = RsvZmodemSend;                  else if (_stricmp(Str,"zmodemsend")==0) *WordId = RsvZmodemSend;
322                  break;                  break;
323          default:          default:
324                  ; /* nothing to do */                  ; /* nothing to do */
325          }          }
326    
327          return (*WordId!=0);          return (*WordId!=0);
328  }  }
329    
330  BYTE GetFirstChar()  BYTE GetFirstChar()
331  {  {
332          BYTE b;          BYTE b;
333    
334          if (LinePtr<LineLen)          if (LinePtr<LineLen)
335                  b = LineBuff[LinePtr];                  b = LineBuff[LinePtr];
336          else return 0;          else return 0;
337    
338          while ((LinePtr<LineLen) && ((b==' ') || (b=='\t')))          while ((LinePtr<LineLen) && ((b==' ') || (b=='\t')))
339          {          {
340                  LinePtr++;                  LinePtr++;
341                  if (LinePtr<LineLen) b = LineBuff[LinePtr];                  if (LinePtr<LineLen) b = LineBuff[LinePtr];
342          }          }
343          if ((b>' ') && (b!=';'))          if ((b>' ') && (b!=';'))
344          {          {
345                  LinePtr++;                  LinePtr++;
346                  return b;                  return b;
347          }          }
348          return 0;          return 0;
349  }  }
350    
351  BOOL CheckParameterGiven()  BOOL CheckParameterGiven()
352  {  {
353          WORD P;          WORD P;
354    
355          P = LinePtr;          P = LinePtr;
356    
357          if (GetFirstChar()) {          if (GetFirstChar()) {
358                  LinePtr = P;                  LinePtr = P;
359                  return TRUE;                  return TRUE;
360          }          }
361          else {          else {
362                  LinePtr = P;                  LinePtr = P;
363                  return FALSE;                  return FALSE;
364          }          }
365  }  }
366    
367  BOOL GetIdentifier(PCHAR Name)  BOOL GetIdentifier(PCHAR Name)
368  {  {
369          int i;          int i;
370          BYTE b;          BYTE b;
371    
372          memset(Name,0,MaxNameLen);          memset(Name,0,MaxNameLen);
373    
374          b = GetFirstChar();          b = GetFirstChar();
375          if (b==0) return FALSE;          if (b==0) return FALSE;
376    
377          // Check first character of identifier          // Check first character of identifier
378          if (! __iscsymf(b)) { // [^A-Za-z_]          if (! __iscsymf(b)) { // [^A-Za-z_]
379                  LinePtr--;                  LinePtr--;
380                  return FALSE;                  return FALSE;
381          }          }
382    
383          Name[0] = b;          Name[0] = b;
384          i = 1;          i = 1;
385    
386          if (LinePtr<LineLen) b = LineBuff[LinePtr];          if (LinePtr<LineLen) b = LineBuff[LinePtr];
387          while ((LinePtr<LineLen) && __iscsym(b)) { // [0-9A-Za-z_]          while ((LinePtr<LineLen) && __iscsym(b)) { // [0-9A-Za-z_]
388                  if (i<MaxNameLen-1)                  if (i<MaxNameLen-1)
389                  {                  {
390                          Name[i] = b;                          Name[i] = b;
391                          i++;                          i++;
392                  }                  }
393                  LinePtr++;                  LinePtr++;
394                  if (LinePtr<LineLen) b = LineBuff[LinePtr];                  if (LinePtr<LineLen) b = LineBuff[LinePtr];
395          }          }
396          return TRUE;          return TRUE;
397  }  }
398    
399  BOOL GetReservedWord(LPWORD WordId)  BOOL GetReservedWord(LPWORD WordId)
400  {  {
401          TName Name;          TName Name;
402          WORD P;          WORD P;
403    
404          P = LinePtr;          P = LinePtr;
405          if (! GetIdentifier(Name)) return FALSE;          if (! GetIdentifier(Name)) return FALSE;
406          if (! CheckReservedWord(Name,WordId))          if (! CheckReservedWord(Name,WordId))
407          {          {
408                  LinePtr = P;                  LinePtr = P;
409                  return FALSE;                  return FALSE;
410          }          }
411          if (0 < *WordId)          if (0 < *WordId)
412                  return TRUE;                  return TRUE;
413          else          else
414                  LinePtr = P;                  LinePtr = P;
415          return FALSE;          return FALSE;
416  }  }
417    
418  BOOL GetOperator(LPWORD WordId)  BOOL GetOperator(LPWORD WordId)
419  {  {
420          WORD P;          WORD P;
421          BYTE b;          BYTE b;
422    
423          P = LinePtr;          P = LinePtr;
424          b = GetFirstChar();          b = GetFirstChar();
425          switch (b) {          switch (b) {
426                  case 0: return FALSE; break;                  case 0: return FALSE; break;
427                  case '*': *WordId = RsvMul;   break;                  case '*': *WordId = RsvMul;   break;
428                  case '+': *WordId = RsvPlus;  break;                  case '+': *WordId = RsvPlus;  break;
429                  case '-': *WordId = RsvMinus; break;                  case '-': *WordId = RsvMinus; break;
430                  case '/': *WordId = RsvDiv;   break;                  case '/': *WordId = RsvDiv;   break;
431                  case '%': *WordId = RsvMod;   break;                  case '%': *WordId = RsvMod;   break;
432                  case '=': *WordId = RsvEQ;                  case '=': *WordId = RsvEQ;
433                          if (LinePtr < LineLen && LineBuff[LinePtr] == '=') {                          if (LinePtr < LineLen && LineBuff[LinePtr] == '=') {
434                                  LinePtr++;                                  LinePtr++;
435                          }                          }
436                          break;                          break;
437                  case '<': *WordId = RsvLT;                  case '<': *WordId = RsvLT;
438                          if (LinePtr < LineLen) {                          if (LinePtr < LineLen) {
439                                  switch (LineBuff[LinePtr++]) {                                  switch (LineBuff[LinePtr++]) {
440                                          case '=': *WordId = RsvLE; break;                                          case '=': *WordId = RsvLE; break;
441                                          case '>': *WordId = RsvNE; break;                                          case '>': *WordId = RsvNE; break;
442                                          case '<': *WordId = RsvALShift; break;                                          case '<': *WordId = RsvALShift; break;
443                                          default: LinePtr--;                                          default: LinePtr--;
444                                  }                                  }
445                          }                          }
446                          break;                          break;
447                  case '>': *WordId = RsvGT;                  case '>': *WordId = RsvGT;
448                          if (LinePtr < LineLen) {                          if (LinePtr < LineLen) {
449                                  switch (LineBuff[LinePtr++]) {                                  switch (LineBuff[LinePtr++]) {
450                                          case '=': *WordId = RsvGE; break;                                          case '=': *WordId = RsvGE; break;
451                                          case '>': *WordId = RsvARShift;                                          case '>': *WordId = RsvARShift;
452                                                  if (LinePtr < LineLen && LineBuff[LinePtr] == '>') {                                                  if (LinePtr < LineLen && LineBuff[LinePtr] == '>') {
453                                                          *WordId = RsvLRShift; LinePtr++;                                                          *WordId = RsvLRShift; LinePtr++;
454                                                  }                                                  }
455                                                  break;                                                  break;
456                                          default: LinePtr--;                                          default: LinePtr--;
457                                  }                                  }
458                          }                          }
459                          break;                          break;
460                  case '&': *WordId = RsvBAnd;                  case '&': *WordId = RsvBAnd;
461                          if (LinePtr < LineLen && LineBuff[LinePtr] == '&') {                          if (LinePtr < LineLen && LineBuff[LinePtr] == '&') {
462                                  *WordId = RsvLAnd; LinePtr++;                                  *WordId = RsvLAnd; LinePtr++;
463                          }                          }
464                          break;                          break;
465                  case '|': *WordId = RsvBOr;                  case '|': *WordId = RsvBOr;
466                          if (LinePtr < LineLen && LineBuff[LinePtr] == '|') {                          if (LinePtr < LineLen && LineBuff[LinePtr] == '|') {
467                                  *WordId = RsvLOr; LinePtr++;                                  *WordId = RsvLOr; LinePtr++;
468                          }                          }
469                          break;                          break;
470                  case '^': *WordId = RsvBXor; break;                  case '^': *WordId = RsvBXor; break;
471                  case '~': *WordId = RsvBNot; break;                  case '~': *WordId = RsvBNot; break;
472                  case '!': *WordId = RsvLNot;                  case '!': *WordId = RsvLNot;
473                          if (LinePtr < LineLen && LineBuff[LinePtr] == '=') {                          if (LinePtr < LineLen && LineBuff[LinePtr] == '=') {
474                                  *WordId = RsvNE; LinePtr++;                                  *WordId = RsvNE; LinePtr++;
475                          }                          }
476                          break;                          break;
477                  default:                  default:
478                          LinePtr--;                          LinePtr--;
479                          if (! GetReservedWord(WordId) || (*WordId < RsvOperator)) {                          if (! GetReservedWord(WordId) || (*WordId < RsvOperator)) {
480                                  LinePtr = P;                                  LinePtr = P;
481                                  return FALSE;                                  return FALSE;
482                          }                          }
483          }          }
484    
485          return TRUE;          return TRUE;
486  }  }
487    
488  BOOL GetLabelName(PCHAR Name)  BOOL GetLabelName(PCHAR Name)
489  {  {
490          int i;          int i;
491          BYTE b;          BYTE b;
492    
493          memset(Name,0,MaxNameLen);          memset(Name,0,MaxNameLen);
494    
495          b = GetFirstChar();          b = GetFirstChar();
496          if (b==0) return FALSE;          if (b==0) return FALSE;
497          Name[0] = b;          Name[0] = b;
498    
499          i = 1;          i = 1;
500          if (LinePtr<LineLen) b = LineBuff[LinePtr];          if (LinePtr<LineLen) b = LineBuff[LinePtr];
501          while ((LinePtr<LineLen) && __iscsym(b)) { // [0-9A-Za-z_]          while ((LinePtr<LineLen) && __iscsym(b)) { // [0-9A-Za-z_]
502                  if (i<MaxNameLen-1)                  if (i<MaxNameLen-1)
503                  {                  {
504                          Name[i] = b;                          Name[i] = b;
505                          i++;                          i++;
506                  }                  }
507                  LinePtr++;                  LinePtr++;
508                  if (LinePtr<LineLen) b = LineBuff[LinePtr];                  if (LinePtr<LineLen) b = LineBuff[LinePtr];
509          }          }
510    
511          return (strlen(Name)>0);          return (strlen(Name)>0);
512  }  }
513    
514          int GetQuotedStr(PCHAR Str, BYTE q, LPWORD i)          int GetQuotedStr(PCHAR Str, BYTE q, LPWORD i)
515          {          {
516                  BYTE b;                  BYTE b;
517    
518                  b=0;                  b=0;
519                  if (LinePtr<LineLen) b = LineBuff[LinePtr];                  if (LinePtr<LineLen) b = LineBuff[LinePtr];
520                  while ((LinePtr<LineLen) && (b>=' ') && (b!=q))                  while ((LinePtr<LineLen) && (b>=' ') && (b!=q))
521                  {                  {
522                          if (*i<MaxStrLen-1)                          if (*i<MaxStrLen-1)
523                          {                          {
524                                  Str[*i] = b;                                  Str[*i] = b;
525                                  (*i)++;                                  (*i)++;
526                          }                          }
527    
528                          LinePtr++;                          LinePtr++;
529                          if (LinePtr<LineLen) b = LineBuff[LinePtr];                          if (LinePtr<LineLen) b = LineBuff[LinePtr];
530                  }                  }
531                  if (b==q)                  if (b==q)
532                          if (LinePtr<LineLen) LinePtr++;                          if (LinePtr<LineLen) LinePtr++;
533                  else                  else
534                          return (ErrSyntax);                          return (ErrSyntax);
535    
536                  return 0;                  return 0;
537          }          }
538    
539          WORD GetCharByCode(PCHAR Str, LPWORD i)          WORD GetCharByCode(PCHAR Str, LPWORD i)
540          {          {
541                  BYTE b;                  BYTE b;
542                  WORD n;                  WORD n;
543    
544                  b=0;                  b=0;
545                  n = 0;                  n = 0;
546                  if (LinePtr<LineLen) b = LineBuff[LinePtr];                  if (LinePtr<LineLen) b = LineBuff[LinePtr];
547                  if (!isdigit(b) && (b!='$')) return ErrSyntax;                  if (!isdigit(b) && (b!='$')) return ErrSyntax;
548    
549                  if (b!='$') { /* decimal */                  if (b!='$') { /* decimal */
550                          while ((LinePtr<LineLen) && isdigit(b)) { // [0-9]                          while ((LinePtr<LineLen) && isdigit(b)) { // [0-9]
551                                  n = n * 10 + b - '0';                                  n = n * 10 + b - '0';
552                                  LinePtr++;                                  LinePtr++;
553                                  if (LinePtr<LineLen) b = LineBuff[LinePtr];                                  if (LinePtr<LineLen) b = LineBuff[LinePtr];
554                          }                          }
555                  }                  }
556                  else { /* hexadecimal */                  else { /* hexadecimal */
557                          LinePtr++;                          LinePtr++;
558                          if (LinePtr<LineLen) b = LineBuff[LinePtr];                          if (LinePtr<LineLen) b = LineBuff[LinePtr];
559                          while ((LinePtr<LineLen) && isxdigit(b)) { // [0-9A-Fa-f]                          while ((LinePtr<LineLen) && isxdigit(b)) { // [0-9A-Fa-f]
560                                  if (isalpha(b))                                  if (isalpha(b))
561                                          b = (b|0x20) - 'a' + 10;                                          b = (b|0x20) - 'a' + 10;
562                                  else                                  else
563                                          b = b - '0';                                          b = b - '0';
564                                  n = n * 16 + b;                                  n = n * 16 + b;
565                                  LinePtr++;                                  LinePtr++;
566                                  if (LinePtr<LineLen) b = LineBuff[LinePtr];                                  if (LinePtr<LineLen) b = LineBuff[LinePtr];
567                          }                          }
568                  }                  }
569    
570                  if ((n==0) || (n>255)) return ErrSyntax;                  if ((n==0) || (n>255)) return ErrSyntax;
571    
572                  if (*i<MaxStrLen-1)                  if (*i<MaxStrLen-1)
573                  {                  {
574                          Str[*i] = (char)n;                          Str[*i] = (char)n;
575                          (*i)++;                          (*i)++;
576                  }                  }
577                  return 0;                  return 0;
578          }          }
579    
580  BOOL GetString(PCHAR Str, LPWORD Err)  BOOL GetString(PCHAR Str, LPWORD Err)
581  {  {
582          BYTE q;          BYTE q;
583          WORD i;          WORD i;
584    
585          *Err = 0;          *Err = 0;
586          memset(Str,0,MaxStrLen);          memset(Str,0,MaxStrLen);
587    
588          q = GetFirstChar();          q = GetFirstChar();
589          if (q==0) return FALSE;          if (q==0) return FALSE;
590          LinePtr--;          LinePtr--;
591          if ((q!='"') && (q!='\'') && (q!='#'))          if ((q!='"') && (q!='\'') && (q!='#'))
592                  return FALSE;                  return FALSE;
593    
594          i = 0;          i = 0;
595          while (((q=='"') || (q=='\'') || (q=='#')) && (*Err==0))          while (((q=='"') || (q=='\'') || (q=='#')) && (*Err==0))
596          {          {
597                  LinePtr++;                  LinePtr++;
598                  switch (q) {                  switch (q) {
599                          case '"':                          case '"':
600                          case '\'': *Err = GetQuotedStr(Str,q,&i); break;                          case '\'': *Err = GetQuotedStr(Str,q,&i); break;
601                          case '#':  *Err = GetCharByCode(Str,&i);  break;                          case '#':  *Err = GetCharByCode(Str,&i);  break;
602                  }                  }
603                  q = LineBuff[LinePtr];                  q = LineBuff[LinePtr];
604          }          }
605          return TRUE;          return TRUE;
606  }  }
607    
608  BOOL GetNumber(int far *Num)  BOOL GetNumber(int far *Num)
609  {  {
610          BYTE b;          BYTE b;
611    
612          *Num = 0;          *Num = 0;
613    
614          b = GetFirstChar();          b = GetFirstChar();
615          if (b==0) return FALSE;          if (b==0) return FALSE;
616          if (isdigit(b)) { /* decimal constant */          if (isdigit(b)) { /* decimal constant */
617                  *Num = b - '0';                  *Num = b - '0';
618                  if (LinePtr<LineLen) b = LineBuff[LinePtr];                  if (LinePtr<LineLen) b = LineBuff[LinePtr];
619                  while ((LinePtr<LineLen) && isdigit(b)) {                  while ((LinePtr<LineLen) && isdigit(b)) {
620                          *Num = *Num * 10 + b - '0';                          *Num = *Num * 10 + b - '0';
621                          LinePtr++;                          LinePtr++;
622                          if (LinePtr<LineLen) b = LineBuff[LinePtr];                          if (LinePtr<LineLen) b = LineBuff[LinePtr];
623                  }                  }
624          }          }
625          else if (b=='$')          else if (b=='$')
626          { /* hexadecimal constant */          { /* hexadecimal constant */
627                  if (LinePtr<LineLen) b = LineBuff[LinePtr];                  if (LinePtr<LineLen) b = LineBuff[LinePtr];
628                  while ((LinePtr<LineLen) && isxdigit(b)) { // [0-9A-Fa-f]                  while ((LinePtr<LineLen) && isxdigit(b)) { // [0-9A-Fa-f]
629                          if (isalpha(b))                          if (isalpha(b))
630                                  b = (b|0x20) - 'a' + 10;                                  b = (b|0x20) - 'a' + 10;
631                          else                          else
632                                  b = b - '0';                                  b = b - '0';
633                          *Num = *Num * 16 + b;                          *Num = *Num * 16 + b;
634                          LinePtr++;                          LinePtr++;
635                          if (LinePtr<LineLen) b = LineBuff[LinePtr];                          if (LinePtr<LineLen) b = LineBuff[LinePtr];
636                  }                  }
637          }          }
638          else {          else {
639                  LinePtr--;                  LinePtr--;
640                  return FALSE;                  return FALSE;
641          }          }
642          return TRUE;          return TRUE;
643  }  }
644    
645  BOOL CheckVar(PCHAR Name, LPWORD VarType, LPWORD VarId)  BOOL CheckVar(PCHAR Name, LPWORD VarType, LPWORD VarId)
646  {  {
647          int i;          int i;
648          long P;          long P;
649    
650          *VarType = TypUnknown;          *VarType = TypUnknown;
651    
652          i = 0;          i = 0;
653          while (i<IntVarCount)          while (i<IntVarCount)
654          {          {
655                  P = (i+IntVarIdOff)*MaxNameLen;                  P = (i+IntVarIdOff)*MaxNameLen;
656                  if (_stricmp(&NameBuff[P],Name)==0)                  if (_stricmp(&NameBuff[P],Name)==0)
657                  {                  {
658                          *VarType = TypInteger;                          *VarType = TypInteger;
659                          *VarId = (WORD)i;                          *VarId = (WORD)i;
660                          return TRUE;                          return TRUE;
661                  }                  }
662                  i++;                  i++;
663          }          }
664    
665          i = 0;          i = 0;
666          while (i<StrVarCount)          while (i<StrVarCount)
667          {          {
668                  P = (i+StrVarIdOff)*MaxNameLen;                  P = (i+StrVarIdOff)*MaxNameLen;
669                  if (_stricmp(&NameBuff[P],Name)==0)                  if (_stricmp(&NameBuff[P],Name)==0)
670                  {                  {
671                          *VarType = TypString;                          *VarType = TypString;
672                          *VarId = i;                          *VarId = i;
673                          return TRUE;                          return TRUE;
674                  }                  }
675                  i++;                  i++;
676          }          }
677    
678          i = 0;          i = 0;
679          while (i<LabVarCount)          while (i<LabVarCount)
680          {          {
681                  P = (i+LabVarIdOff)*MaxNameLen;                  P = (i+LabVarIdOff)*MaxNameLen;
682                  if (_stricmp(&NameBuff[P],Name)==0)                  if (_stricmp(&NameBuff[P],Name)==0)
683                  {                  {
684                          *VarType = TypLabel;                          *VarType = TypLabel;
685                          *VarId = i;                          *VarId = i;
686                          return TRUE;                          return TRUE;
687                  }                  }
688                  i++;                  i++;
689          }          }
690    
691          return FALSE;          return FALSE;
692  }  }
693    
694  BOOL NewIntVar(PCHAR Name, int InitVal)  BOOL NewIntVar(PCHAR Name, int InitVal)
695  {  {
696          long P;          long P;
697    
698          if (IntVarCount>=MaxNumOfIntVar) return FALSE;          if (IntVarCount>=MaxNumOfIntVar) return FALSE;
699          P = (IntVarIdOff+IntVarCount)*MaxNameLen;          P = (IntVarIdOff+IntVarCount)*MaxNameLen;
700          strncpy_s(&NameBuff[P],MaxNameLen,Name,_TRUNCATE);          strncpy_s(&NameBuff[P],MaxNameLen,Name,_TRUNCATE);
701          IntVal[IntVarCount] = InitVal;          IntVal[IntVarCount] = InitVal;
702          IntVarCount++;          IntVarCount++;
703          return TRUE;          return TRUE;
704  }  }
705    
706  BOOL NewStrVar(PCHAR Name, PCHAR InitVal)  BOOL NewStrVar(PCHAR Name, PCHAR InitVal)
707  {  {
708          long P;          long P;
709    
710          if (StrVarCount>=MaxNumOfStrVar) return FALSE;          if (StrVarCount>=MaxNumOfStrVar) return FALSE;
711          P = (StrVarIdOff+StrVarCount)*MaxNameLen;          P = (StrVarIdOff+StrVarCount)*MaxNameLen;
712          strncpy_s(&NameBuff[P],MaxNameLen,Name,_TRUNCATE);          strncpy_s(&NameBuff[P],MaxNameLen,Name,_TRUNCATE);
713          P = StrVarCount*MaxStrLen;          P = StrVarCount*MaxStrLen;
714          strncpy_s(&StrBuff[P],MaxStrLen,InitVal,_TRUNCATE);          strncpy_s(&StrBuff[P],MaxStrLen,InitVal,_TRUNCATE);
715          StrVarCount++;          StrVarCount++;
716          return TRUE;          return TRUE;
717  }  }
718    
719  BOOL NewLabVar(PCHAR Name, BINT InitVal, WORD ILevel)  BOOL NewLabVar(PCHAR Name, BINT InitVal, WORD ILevel)
720  {  {
721          long P;          long P;
722    
723          if (LabVarCount>=MaxNumOfLabVar) return FALSE;          if (LabVarCount>=MaxNumOfLabVar) return FALSE;
724    
725          P = (LabVarIdOff+LabVarCount)*MaxNameLen;          P = (LabVarIdOff+LabVarCount)*MaxNameLen;
726          strncpy_s(&(NameBuff[P]),MaxNameLen,Name,_TRUNCATE);          strncpy_s(&(NameBuff[P]),MaxNameLen,Name,_TRUNCATE);
727          LabVal[LabVarCount] = InitVal;          LabVal[LabVarCount] = InitVal;
728          LabLevel[LabVarCount] = LOBYTE(ILevel);          LabLevel[LabVarCount] = LOBYTE(ILevel);
729          LabVarCount++;          LabVarCount++;
730          return TRUE;          return TRUE;
731  }  }
732    
733  void DelLabVar(WORD ILevel)  void DelLabVar(WORD ILevel)
734  {  {
735          while ((LabVarCount>0) && (LabLevel[LabVarCount-1]>=ILevel))          while ((LabVarCount>0) && (LabLevel[LabVarCount-1]>=ILevel))
736                  LabVarCount--;                  LabVarCount--;
737  }  }
738    
739  void CopyLabel(WORD ILabel, BINT far *Ptr, LPWORD Level)  void CopyLabel(WORD ILabel, BINT far *Ptr, LPWORD Level)
740  {  {
741          *Ptr = LabVal[ILabel];          *Ptr = LabVal[ILabel];
742          *Level = (WORD)LabLevel[ILabel];          *Level = (WORD)LabLevel[ILabel];
743  }  }
744    
745  /*  /*
746   * Precedence: 1   * Precedence: 1
747   *   Evaluate variable.   *   Evaluate variable.
748   *   Evaluate number.   *   Evaluate number.
749   *   Evaluate parenthesis.   *   Evaluate parenthesis.
750   *   Evaluate following operator.   *   Evaluate following operator.
751   *     not, ~, !, +(unary), -(unary)   *     not, ~, !, +(unary), -(unary)
752   */   */
753  BOOL GetFactor(LPWORD ValType, int far *Val, LPWORD Err)  BOOL GetFactor(LPWORD ValType, int far *Val, LPWORD Err)
754  {  {
755          TName Name;          TName Name;
756          WORD P, Id;          WORD P, Id;
757    
758          P = LinePtr;          P = LinePtr;
759          *Err = 0;          *Err = 0;
760          if (GetIdentifier(Name)) {          if (GetIdentifier(Name)) {
761                  if (CheckReservedWord(Name,&Id)) {                  if (CheckReservedWord(Name,&Id)) {
762                          if (GetFactor(ValType, Val, Err)) {                          if (GetFactor(ValType, Val, Err)) {
763                                  if ((*Err==0) && (*ValType!=TypInteger))                                  if ((*Err==0) && (*ValType!=TypInteger))
764                                          *Err = ErrTypeMismatch;                                          *Err = ErrTypeMismatch;
765                                  switch (Id) {                                  switch (Id) {
766                                          case RsvBNot: *Val = ~(*Val); break;                                          case RsvBNot: *Val = ~(*Val); break;
767                                          case RsvLNot: *Val = !(*Val); break;                                          case RsvLNot: *Val = !(*Val); break;
768                                          default: *Err = ErrSyntax;                                          default: *Err = ErrSyntax;
769                                  }                                  }
770                          }                          }
771                          else {                          else {
772                                  *Err = ErrSyntax;                                  *Err = ErrSyntax;
773                          }                          }
774                  }                  }
775                  else if (CheckVar(Name, ValType, &Id)) {                  else if (CheckVar(Name, ValType, &Id)) {
776                          switch (*ValType) {                          switch (*ValType) {
777                                  case TypInteger: *Val = IntVal[Id]; break;                                  case TypInteger: *Val = IntVal[Id]; break;
778                                  case TypString: *Val = Id; break;                                  case TypString: *Val = Id; break;
779                          }                          }
780                  }                  }
781                  else                  else
782                          *Err = ErrVarNotInit;                          *Err = ErrVarNotInit;
783          }          }
784          else if (GetNumber(Val))          else if (GetNumber(Val))
785                  *ValType = TypInteger;                  *ValType = TypInteger;
786          else if (GetOperator(&Id)) {          else if (GetOperator(&Id)) {
787                  if (GetFactor(ValType, Val, Err)) {                  if (GetFactor(ValType, Val, Err)) {
788                          if ((*Err==0) && (*ValType != TypInteger))                          if ((*Err==0) && (*ValType != TypInteger))
789                                  *Err = ErrTypeMismatch;                                  *Err = ErrTypeMismatch;
790                          switch (Id) {                          switch (Id) {
791                                  case RsvPlus:                    break;                                  case RsvPlus:                    break;
792                                  case RsvMinus:   *Val = -(*Val); break;                                  case RsvMinus:   *Val = -(*Val); break;
793                                  case RsvBNot:    *Val = ~(*Val); break;                                  case RsvBNot:    *Val = ~(*Val); break;
794                                  case RsvLNot:    *Val = !(*Val); break;                                  case RsvLNot:    *Val = !(*Val); break;
795                                  default: *Err = ErrSyntax;                                  default: *Err = ErrSyntax;
796                          }                          }
797                  }                  }
798                  else {                  else {
799                          *Err = ErrSyntax;                          *Err = ErrSyntax;
800                  }                  }
801          }          }
802          else if (GetFirstChar()=='(') {          else if (GetFirstChar()=='(') {
803                  if (GetExpression(ValType, Val, Err)) {                  if (GetExpression(ValType, Val, Err)) {
804                          if ((*Err==0) && (GetFirstChar()!=')'))                          if ((*Err==0) && (GetFirstChar()!=')'))
805                                  *Err = ErrCloseParent;                                  *Err = ErrCloseParent;
806                  }                  }
807                  else                  else
808                          *Err = ErrSyntax;                          *Err = ErrSyntax;
809          }          }
810          else {          else {
811                  *Err = 0;                  *Err = 0;
812                  return FALSE;                  return FALSE;
813          }          }
814    
815          if (*Err!=0) LinePtr = P;          if (*Err!=0) LinePtr = P;
816          return TRUE;          return TRUE;
817  }  }
818    
819  /*  /*
820   * Precedence: 2   * Precedence: 2
821   *   Evaluate following operator.   *   Evaluate following operator.
822   *     *, /, %   *     *, /, %
823   */   */
824  BOOL EvalMultiplication(LPWORD ValType, int far *Val, LPWORD Err)  BOOL EvalMultiplication(LPWORD ValType, int far *Val, LPWORD Err)
825  {  {
826          WORD P, Type, Er;          WORD P, Type, Er;
827          int Val1, Val2;          int Val1, Val2;
828          WORD WId;          WORD WId;
829    
830          if (! GetFactor(&Type, &Val1, &Er)) return FALSE;          if (! GetFactor(&Type, &Val1, &Er)) return FALSE;
831          *ValType = Type;          *ValType = Type;
832          *Val = Val1;          *Val = Val1;
833          *Err = Er;          *Err = Er;
834          if (Er) return TRUE;          if (Er) return TRUE;
835          if (Type!=TypInteger) return TRUE;          if (Type!=TypInteger) return TRUE;
836    
837          while (TRUE) {          while (TRUE) {
838                  P = LinePtr;                  P = LinePtr;
839                  if (! GetOperator(&WId)) return TRUE;                  if (! GetOperator(&WId)) return TRUE;
840    
841                  switch (WId) {                  switch (WId) {
842                          case RsvMul:                          case RsvMul:
843                          case RsvDiv:                          case RsvDiv:
844                          case RsvMod:                          case RsvMod:
845                                  break;                                  break;
846                          default:                          default:
847                                  LinePtr = P;                                  LinePtr = P;
848                                  return TRUE;                                  return TRUE;
849                  }                  }
850    
851                  if (! GetFactor(&Type, &Val2, &Er)) {                  if (! GetFactor(&Type, &Val2, &Er)) {
852                          *Err = ErrSyntax;                          *Err = ErrSyntax;
853                          return TRUE;                          return TRUE;
854                  }                  }
855    
856                  if (Er) {                  if (Er) {
857                          *Err = Er;                          *Err = Er;
858                          return TRUE;                          return TRUE;
859                  }                  }
860    
861                  if (Type!=TypInteger) {                  if (Type!=TypInteger) {
862                          *Err = ErrTypeMismatch;                          *Err = ErrTypeMismatch;
863                          return TRUE;                          return TRUE;
864                  }                  }
865    
866                  if (Val2 == 0 && WId != RsvMul) {                  if (Val2 == 0 && WId != RsvMul) {
867                          *Err = ErrDivByZero;                          *Err = ErrDivByZero;
868                          return TRUE;                          return TRUE;
869                  }                  }
870    
871                  switch (WId) {                  switch (WId) {
872                          case RsvMul: Val1 = Val1 * Val2; break;                          case RsvMul: Val1 = Val1 * Val2; break;
873                          case RsvDiv: Val1 = Val1 / Val2; break;                          case RsvDiv: Val1 = Val1 / Val2; break;
874                          case RsvMod: Val1 = Val1 % Val2; break;                          case RsvMod: Val1 = Val1 % Val2; break;
875                  }                  }
876                  *Val = Val1;                  *Val = Val1;
877          }          }
878  }  }
879    
880  /*  /*
881   * Precedence: 3   * Precedence: 3
882   *   Evaluate following operator.   *   Evaluate following operator.
883   *     +, -   *     +, -
884   */   */
885  BOOL EvalAddition(LPWORD ValType, int far *Val, LPWORD Err)  BOOL EvalAddition(LPWORD ValType, int far *Val, LPWORD Err)
886  {  {
887          WORD P, Type, Er;          WORD P, Type, Er;
888          int Val1, Val2;          int Val1, Val2;
889          WORD WId;          WORD WId;
890    
891          if (! EvalMultiplication(&Type, &Val1, &Er)) return FALSE;          if (! EvalMultiplication(&Type, &Val1, &Er)) return FALSE;
892          *ValType = Type;          *ValType = Type;
893          *Val = Val1;          *Val = Val1;
894          *Err = Er;          *Err = Er;
895          if (Er) return TRUE;          if (Er) return TRUE;
896          if (Type!=TypInteger) return TRUE;          if (Type!=TypInteger) return TRUE;
897    
898          while (TRUE) {          while (TRUE) {
899                  P = LinePtr;                  P = LinePtr;
900                  if (! GetOperator(&WId)) return TRUE;                  if (! GetOperator(&WId)) return TRUE;
901    
902                  switch (WId) {                  switch (WId) {
903                          case RsvPlus:                          case RsvPlus:
904                          case RsvMinus:                          case RsvMinus:
905                                  break;                                  break;
906                          default:                          default:
907                                  LinePtr = P;                                  LinePtr = P;
908                                  return TRUE;                                  return TRUE;
909                  }                  }
910    
911                  if (! EvalMultiplication(&Type, &Val2, &Er)) {                  if (! EvalMultiplication(&Type, &Val2, &Er)) {
912                          *Err = ErrSyntax;                          *Err = ErrSyntax;
913                          return TRUE;                          return TRUE;
914                  }                  }
915    
916                  if (Er) {                  if (Er) {
917                          *Err = Er;                          *Err = Er;
918                          return TRUE;                          return TRUE;
919                  }                  }
920    
921                  if (Type!=TypInteger) {                  if (Type!=TypInteger) {
922                          *Err = ErrTypeMismatch;                          *Err = ErrTypeMismatch;
923                          return TRUE;                          return TRUE;
924                  }                  }
925    
926                  switch (WId) {                  switch (WId) {
927                          case RsvPlus:    Val1 = Val1 + Val2;  break;                          case RsvPlus:    Val1 = Val1 + Val2;  break;
928                          case RsvMinus:   Val1 = Val1 - Val2;  break;                          case RsvMinus:   Val1 = Val1 - Val2;  break;
929                  }                  }
930                  *Val = Val1;                  *Val = Val1;
931          }          }
932  }  }
933    
934  /*  /*
935   * Precedence: 4   * Precedence: 4
936   *   Evaluate following operator.   *   Evaluate following operator.
937   *     >>, <<, >>>   *     >>, <<, >>>
938   */   */
939  BOOL EvalBitShift(LPWORD ValType, int far *Val, LPWORD Err)  BOOL EvalBitShift(LPWORD ValType, int far *Val, LPWORD Err)
940  {  {
941          WORD P, Type, Er;          WORD P, Type, Er;
942          int Val1, Val2;          int Val1, Val2;
943          WORD WId;          WORD WId;
944    
945          if (! EvalAddition(&Type, &Val1, &Er)) return FALSE;          if (! EvalAddition(&Type, &Val1, &Er)) return FALSE;
946          *ValType = Type;          *ValType = Type;
947          *Val = Val1;          *Val = Val1;
948          *Err = Er;          *Err = Er;
949          if (Er) return TRUE;          if (Er) return TRUE;
950          if (Type!=TypInteger) return TRUE;          if (Type!=TypInteger) return TRUE;
951    
952          while (TRUE) {          while (TRUE) {
953                  P = LinePtr;                  P = LinePtr;
954                  if (! GetOperator(&WId)) return TRUE;                  if (! GetOperator(&WId)) return TRUE;
955    
956                  switch (WId) {                  switch (WId) {
957                          case RsvARShift:                          case RsvARShift:
958                          case RsvALShift:                          case RsvALShift:
959                          case RsvLRShift:                          case RsvLRShift:
960                                  break;                                  break;
961                          default:                          default:
962                                  LinePtr = P;                                  LinePtr = P;
963                                  return TRUE;                                  return TRUE;
964                  }                  }
965    
966                  if (! EvalAddition(&Type, &Val2, &Er)) {                  if (! EvalAddition(&Type, &Val2, &Er)) {
967                          *Err = ErrSyntax;                          *Err = ErrSyntax;
968                          return TRUE;                          return TRUE;
969                  }                  }
970    
971                  if (Er) {                  if (Er) {
972                          *Err = Er;                          *Err = Er;
973                          return TRUE;                          return TRUE;
974                  }                  }
975    
976                  if (Type!=TypInteger) {                  if (Type!=TypInteger) {
977                          *Err = ErrTypeMismatch;                          *Err = ErrTypeMismatch;
978                          return TRUE;                          return TRUE;
979                  }                  }
980    
981                  if (WId == RsvALShift)                  if (WId == RsvALShift)
982                          Val2 = -Val2;                          Val2 = -Val2;
983    
984                  if (Val2 <= -(int)INT_BIT) {    /* Val2 <= -32 */                  if (Val2 <= -(int)INT_BIT) {    /* Val2 <= -32 */
985                          Val1 = 0;                          Val1 = 0;
986                  } else if (Val2 < 0 ) {         /* -32 < Val2 < 0 */                  } else if (Val2 < 0 ) {         /* -32 < Val2 < 0 */
987                          Val1 = Val1 << -Val2;                          Val1 = Val1 << -Val2;
988                  } else if (Val2 == 0 ) {        /* Val2 == 0 */                  } else if (Val2 == 0 ) {        /* Val2 == 0 */
989                          ; /* do nothing */                          ; /* do nothing */
990                  } else if (Val2 < INT_BIT) {    /* 0 < Val2 < 32 */                  } else if (Val2 < INT_BIT) {    /* 0 < Val2 < 32 */
991                          if (WId == RsvLRShift) {                          if (WId == RsvLRShift) {
992                                  // use unsigned int for logical right shift                                  // use unsigned int for logical right shift
993                                  Val1 = (unsigned int)Val1 >> Val2;                                  Val1 = (unsigned int)Val1 >> Val2;
994                          } else {                          } else {
995                                  Val1 = Val1 >> Val2;                                  Val1 = Val1 >> Val2;
996                          }                          }
997                  } else {                        /* Val2 >= 32 */                  } else {                        /* Val2 >= 32 */
998                          if (Val1 > 0 || WId == RsvLRShift) {                          if (Val1 > 0 || WId == RsvLRShift) {
999                                  Val1 = 0;                                  Val1 = 0;
1000                          } else {                          } else {
1001                                  Val1 = ~0;                                  Val1 = ~0;
1002                          }                          }
1003                  }                  }
1004                  *Val = Val1;                  *Val = Val1;
1005          }          }
1006  }  }
1007    
1008  /*  /*
1009   * Precedence: 5   * Precedence: 5
1010   *   Evaluate following operator.   *   Evaluate following operator.
1011   *     &   *     &
1012   */   */
1013  BOOL EvalBitAnd(LPWORD ValType, int far *Val, LPWORD Err)  BOOL EvalBitAnd(LPWORD ValType, int far *Val, LPWORD Err)
1014  {  {
1015          WORD P, Type, Er;          WORD P, Type, Er;
1016          int Val1, Val2;          int Val1, Val2;
1017          WORD WId;          WORD WId;
1018    
1019          if (! EvalBitShift(&Type, &Val1, &Er)) return FALSE;          if (! EvalBitShift(&Type, &Val1, &Er)) return FALSE;
1020          *ValType = Type;          *ValType = Type;
1021          *Val = Val1;          *Val = Val1;
1022          *Err = Er;          *Err = Er;
1023          if (Er) return TRUE;          if (Er) return TRUE;
1024          if (Type!=TypInteger) return TRUE;          if (Type!=TypInteger) return TRUE;
1025    
1026          while (TRUE) {          while (TRUE) {
1027                  P = LinePtr;                  P = LinePtr;
1028                  if (! GetOperator(&WId)) return TRUE;                  if (! GetOperator(&WId)) return TRUE;
1029    
1030                  if (WId != RsvBAnd) {                  if (WId != RsvBAnd) {
1031                          LinePtr = P;                          LinePtr = P;
1032                          return TRUE;                          return TRUE;
1033                  }                  }
1034    
1035                  if (! EvalBitShift(&Type, &Val2, &Er)) {                  if (! EvalBitShift(&Type, &Val2, &Er)) {
1036                          *Err = ErrSyntax;                          *Err = ErrSyntax;
1037                          return TRUE;                          return TRUE;
1038                  }                  }
1039    
1040                  if (Er) {                  if (Er) {
1041                          *Err = Er;                          *Err = Er;
1042                          return TRUE;                          return TRUE;
1043                  }                  }
1044    
1045                  if (Type!=TypInteger) {                  if (Type!=TypInteger) {
1046                          *Err = ErrTypeMismatch;                          *Err = ErrTypeMismatch;
1047                          return TRUE;                          return TRUE;
1048                  }                  }
1049    
1050                  Val1 = Val1 & Val2;                  Val1 = Val1 & Val2;
1051                  *Val = Val1;                  *Val = Val1;
1052          }          }
1053  }  }
1054    
1055  /*  /*
1056   * Precedence: 6   * Precedence: 6
1057   *   Evaluate following operator.   *   Evaluate following operator.
1058   *     ^   *     ^
1059   */   */
1060  BOOL EvalBitXor(LPWORD ValType, int far *Val, LPWORD Err)  BOOL EvalBitXor(LPWORD ValType, int far *Val, LPWORD Err)
1061  {  {
1062          WORD P, Type, Er;          WORD P, Type, Er;
1063          int Val1, Val2;          int Val1, Val2;
1064          WORD WId;          WORD WId;
1065    
1066          if (! EvalBitAnd(&Type, &Val1, &Er)) return FALSE;          if (! EvalBitAnd(&Type, &Val1, &Er)) return FALSE;
1067          *ValType = Type;          *ValType = Type;
1068          *Val = Val1;          *Val = Val1;
1069          *Err = Er;          *Err = Er;
1070          if (Er) return TRUE;          if (Er) return TRUE;
1071          if (Type!=TypInteger) return TRUE;          if (Type!=TypInteger) return TRUE;
1072    
1073          while (TRUE) {          while (TRUE) {
1074                  P = LinePtr;                  P = LinePtr;
1075                  if (! GetOperator(&WId)) return TRUE;                  if (! GetOperator(&WId)) return TRUE;
1076    
1077                  if (WId != RsvBXor) {                  if (WId != RsvBXor) {
1078                          LinePtr = P;                          LinePtr = P;
1079                          return TRUE;                          return TRUE;
1080                  }                  }
1081    
1082                  if (! EvalBitAnd(&Type, &Val2, &Er)) {                  if (! EvalBitAnd(&Type, &Val2, &Er)) {
1083                          *Err = ErrSyntax;                          *Err = ErrSyntax;
1084                          return TRUE;                          return TRUE;
1085                  }                  }
1086    
1087                  if (Er) {                  if (Er) {
1088                          *Err = Er;                          *Err = Er;
1089                          return TRUE;                          return TRUE;
1090                  }                  }
1091    
1092                  if (Type!=TypInteger) {                  if (Type!=TypInteger) {
1093                          *Err = ErrTypeMismatch;                          *Err = ErrTypeMismatch;
1094                          return TRUE;                          return TRUE;
1095                  }                  }
1096    
1097                  Val1 = Val1 ^ Val2;                  Val1 = Val1 ^ Val2;
1098                  *Val = Val1;                  *Val = Val1;
1099          }          }
1100  }  }
1101    
1102  /*  /*
1103   * Precedence: 7   * Precedence: 7
1104   *   Evaluate following operator.   *   Evaluate following operator.
1105   *     |   *     |
1106   */   */
1107  BOOL EvalBitOr(LPWORD ValType, int far *Val, LPWORD Err)  BOOL EvalBitOr(LPWORD ValType, int far *Val, LPWORD Err)
1108  {  {
1109          WORD P, Type, Er;          WORD P, Type, Er;
1110          int Val1, Val2;          int Val1, Val2;
1111          WORD WId;          WORD WId;
1112    
1113          if (! EvalBitXor(&Type, &Val1, &Er)) return FALSE;          if (! EvalBitXor(&Type, &Val1, &Er)) return FALSE;
1114          *ValType = Type;          *ValType = Type;
1115          *Val = Val1;          *Val = Val1;
1116          *Err = Er;          *Err = Er;
1117          if (Er) return TRUE;          if (Er) return TRUE;
1118          if (Type!=TypInteger) return TRUE;          if (Type!=TypInteger) return TRUE;
1119    
1120          while (TRUE) {          while (TRUE) {
1121                  P = LinePtr;                  P = LinePtr;
1122                  if (! GetOperator(&WId)) return TRUE;                  if (! GetOperator(&WId)) return TRUE;
1123    
1124                  if (WId != RsvBOr) {                  if (WId != RsvBOr) {
1125                          LinePtr = P;                          LinePtr = P;
1126                          return TRUE;                          return TRUE;
1127                  }                  }
1128    
1129                  if (! EvalBitXor(&Type, &Val2, &Er)) {                  if (! EvalBitXor(&Type, &Val2, &Er)) {
1130                          *Err = ErrSyntax;                          *Err = ErrSyntax;
1131                          return TRUE;                          return TRUE;
1132                  }                  }
1133    
1134                  if (Er) {                  if (Er) {
1135                          *Err = Er;                          *Err = Er;
1136                          return TRUE;                          return TRUE;
1137                  }                  }
1138    
1139                  if (Type!=TypInteger) {                  if (Type!=TypInteger) {
1140                          *Err = ErrTypeMismatch;                          *Err = ErrTypeMismatch;
1141                          return TRUE;                          return TRUE;
1142                  }                  }
1143    
1144                  Val1 = Val1 | Val2;                  Val1 = Val1 | Val2;
1145                  *Val = Val1;                  *Val = Val1;
1146          }          }
1147  }  }
1148    
1149  /*  /*
1150   * Precedence: 8   * Precedence: 8
1151   *   Evaluate following operator.   *   Evaluate following operator.
1152   *     <, >, <=, >=   *     <, >, <=, >=
1153   */   */
1154  BOOL EvalGreater(LPWORD ValType, int far *Val, LPWORD Err)  BOOL EvalGreater(LPWORD ValType, int far *Val, LPWORD Err)
1155  {  {
1156          WORD P, Type, Er;          WORD P, Type, Er;
1157          int Val1, Val2;          int Val1, Val2;
1158          WORD WId;          WORD WId;
1159    
1160          if (! EvalBitOr(&Type, &Val1, &Er)) return FALSE;          if (! EvalBitOr(&Type, &Val1, &Er)) return FALSE;
1161          *ValType = Type;          *ValType = Type;
1162          *Val = Val1;          *Val = Val1;
1163          *Err = Er;          *Err = Er;
1164          if (Er) return TRUE;          if (Er) return TRUE;
1165          if (Type!=TypInteger) return TRUE;          if (Type!=TypInteger) return TRUE;
1166    
1167          while (TRUE) {          while (TRUE) {
1168                  P = LinePtr;                  P = LinePtr;
1169                  if (! GetOperator(&WId)) return TRUE;                  if (! GetOperator(&WId)) return TRUE;
1170    
1171                  switch (WId) {                  switch (WId) {
1172                          case RsvLT:                          case RsvLT:
1173                          case RsvGT:                          case RsvGT:
1174                          case RsvLE:                          case RsvLE:
1175                          case RsvGE:                          case RsvGE:
1176                                  break;                                  break;
1177                          default:                          default:
1178                                  LinePtr = P;                                  LinePtr = P;
1179                                  return TRUE;                                  return TRUE;
1180                  }                  }
1181    
1182                  if (! EvalBitOr(&Type, &Val2, &Er)) {                  if (! EvalBitOr(&Type, &Val2, &Er)) {
1183                          *Err = ErrSyntax;                          *Err = ErrSyntax;
1184                          return TRUE;                          return TRUE;
1185                  }                  }
1186    
1187                  if (Er) {                  if (Er) {
1188                          *Err = Er;                          *Err = Er;
1189                          return TRUE;                          return TRUE;
1190                  }                  }
1191    
1192                  if (Type!=TypInteger) {                  if (Type!=TypInteger) {
1193                          *Err = ErrTypeMismatch;                          *Err = ErrTypeMismatch;
1194                          return TRUE;                          return TRUE;
1195                  }                  }
1196    
1197                  switch (WId) {                  switch (WId) {
1198                          case RsvLT: Val1 = (Val1 <Val2); break;                          case RsvLT: Val1 = (Val1 <Val2); break;
1199                          case RsvGT: Val1 = (Val1 >Val2); break;                          case RsvGT: Val1 = (Val1 >Val2); break;
1200                          case RsvLE: Val1 = (Val1<=Val2); break;                          case RsvLE: Val1 = (Val1<=Val2); break;
1201                          case RsvGE: Val1 = (Val1>=Val2); break;                          case RsvGE: Val1 = (Val1>=Val2); break;
1202                  }                  }
1203                  *Val = Val1;                  *Val = Val1;
1204          }          }
1205  }  }
1206    
1207  /*  /*
1208   * Precedence: 9   * Precedence: 9
1209   *   Evaluate following operator.   *   Evaluate following operator.
1210   *     =, ==, <>, !=   *     =, ==, <>, !=
1211   */   */
1212  BOOL EvalEqual(LPWORD ValType, int far *Val, LPWORD Err)  BOOL EvalEqual(LPWORD ValType, int far *Val, LPWORD Err)
1213  {  {
1214          WORD P, Type, Er;          WORD P, Type, Er;
1215          int Val1, Val2;          int Val1, Val2;
1216          WORD WId;          WORD WId;
1217    
1218          if (! EvalGreater(&Type, &Val1, &Er)) return FALSE;          if (! EvalGreater(&Type, &Val1, &Er)) return FALSE;
1219          *ValType = Type;          *ValType = Type;
1220          *Val = Val1;          *Val = Val1;
1221          *Err = Er;          *Err = Er;
1222          if (Er) return TRUE;          if (Er) return TRUE;
1223          if (Type!=TypInteger) return TRUE;          if (Type!=TypInteger) return TRUE;
1224    
1225          while (TRUE) {          while (TRUE) {
1226                  P = LinePtr;                  P = LinePtr;
1227                  if (! GetOperator(&WId)) return TRUE;                  if (! GetOperator(&WId)) return TRUE;
1228    
1229                  switch (WId) {                  switch (WId) {
1230                          case RsvEQ:                          case RsvEQ:
1231                          case RsvNE:                          case RsvNE:
1232                                  break;                                  break;
1233                          default:                          default:
1234                                  LinePtr = P;                                  LinePtr = P;
1235                                  return TRUE;                                  return TRUE;
1236                  }                  }
1237    
1238                  if (! EvalGreater(&Type, &Val2, &Er)) {                  if (! EvalGreater(&Type, &Val2, &Er)) {
1239                          *Err = ErrSyntax;                          *Err = ErrSyntax;
1240                          return TRUE;                          return TRUE;
1241                  }                  }
1242    
1243                  if (Er) {                  if (Er) {
1244                          *Err = Er;                          *Err = Er;
1245                          return TRUE;                          return TRUE;
1246                  }                  }
1247    
1248                  if (Type!=TypInteger) {                  if (Type!=TypInteger) {
1249                          *Err = ErrTypeMismatch;                          *Err = ErrTypeMismatch;
1250                          return TRUE;                          return TRUE;
1251                  }                  }
1252    
1253                  switch (WId) {                  switch (WId) {
1254                          case RsvEQ: Val1 = (Val1==Val2); break;                          case RsvEQ: Val1 = (Val1==Val2); break;
1255                          case RsvNE: Val1 = (Val1!=Val2); break;                          case RsvNE: Val1 = (Val1!=Val2); break;
1256                  }                  }
1257                  *Val = Val1;                  *Val = Val1;
1258          }          }
1259  }  }
1260    
1261  /*  /*
1262   * Precedence: 10   * Precedence: 10
1263   *   Evaluate following operator.   *   Evaluate following operator.
1264   *     &&   *     &&
1265   */   */
1266  BOOL EvalLogicalAnd(LPWORD ValType, int far *Val, LPWORD Err)  BOOL EvalLogicalAnd(LPWORD ValType, int far *Val, LPWORD Err)
1267  {  {
1268          WORD P, Type, Er;          WORD P, Type, Er;
1269          int Val1, Val2;          int Val1, Val2;
1270          WORD WId;          WORD WId;
1271    
1272          if (! EvalEqual(&Type, &Val1, &Er)) return FALSE;          if (! EvalEqual(&Type, &Val1, &Er)) return FALSE;
1273          *ValType = Type;          *ValType = Type;
1274          *Val = Val1;          *Val = Val1;
1275          *Err = Er;          *Err = Er;
1276          if (Er) return TRUE;          if (Er) return TRUE;
1277          if (Type!=TypInteger) return TRUE;          if (Type!=TypInteger) return TRUE;
1278    
1279          while (TRUE) {          while (TRUE) {
1280                  P = LinePtr;                  P = LinePtr;
1281                  if (! GetOperator(&WId)) return TRUE;                  if (! GetOperator(&WId)) return TRUE;
1282    
1283                  if (WId != RsvLAnd) {                  if (WId != RsvLAnd) {
1284                          LinePtr = P;                          LinePtr = P;
1285                          return TRUE;                          return TRUE;
1286                  }                  }
1287    
1288                  if (! EvalEqual(&Type, &Val2, &Er)) {                  if (! EvalEqual(&Type, &Val2, &Er)) {
1289                          *Err = ErrSyntax;                          *Err = ErrSyntax;
1290                          return TRUE;                          return TRUE;
1291                  }                  }
1292    
1293                  if (Er) {                  if (Er) {
1294                          *Err = Er;                          *Err = Er;
1295                          return TRUE;                          return TRUE;
1296                  }                  }
1297    
1298                  if (Type!=TypInteger) {                  if (Type!=TypInteger) {
1299                          *Err = ErrTypeMismatch;                          *Err = ErrTypeMismatch;
1300                          return TRUE;                          return TRUE;
1301                  }                  }
1302    
1303                  Val1 = Val1 && Val2;                  Val1 = Val1 && Val2;
1304                  *Val = Val1;                  *Val = Val1;
1305          }          }
1306  }  }
1307    
1308  /*  /*
1309   * Precedence: 11   * Precedence: 11
1310   *   Evaluate following operator.   *   Evaluate following operator.
1311   *     ||   *     ||
1312   */   */
1313  BOOL GetExpression(LPWORD ValType, int far *Val, LPWORD Err)  BOOL GetExpression(LPWORD ValType, int far *Val, LPWORD Err)
1314  {  {
1315          WORD P1, P2, Type, Er;          WORD P1, P2, Type, Er;
1316          int Val1, Val2;          int Val1, Val2;
1317          WORD WId;          WORD WId;
1318    
1319          P1 = LinePtr;          P1 = LinePtr;
1320          if (! EvalLogicalAnd(&Type, &Val1, &Er)) {          if (! EvalLogicalAnd(&Type, &Val1, &Er)) {
1321                  LinePtr = P1;                  LinePtr = P1;
1322                  return FALSE;                  return FALSE;
1323          }          }
1324          *ValType = Type;          *ValType = Type;
1325          *Val = Val1;          *Val = Val1;
1326          *Err = Er;          *Err = Er;
1327          if (Er) {          if (Er) {
1328                  LinePtr = P1;                  LinePtr = P1;
1329                  return TRUE;                  return TRUE;
1330          }          }
1331          if (Type!=TypInteger) return TRUE;          if (Type!=TypInteger) return TRUE;
1332    
1333          while (TRUE) {          while (TRUE) {
1334                  P2 = LinePtr;                  P2 = LinePtr;
1335                  if (! GetOperator(&WId)) return TRUE;                  if (! GetOperator(&WId)) return TRUE;
1336    
1337                  if (WId != RsvLOr && WId != RsvLXor) {                  if (WId != RsvLOr && WId != RsvLXor) {
1338                          LinePtr = P2;                          LinePtr = P2;
1339                          return TRUE;                          return TRUE;
1340                  }                  }
1341    
1342                  if (! EvalLogicalAnd(&Type, &Val2, &Er)) {                  if (! EvalLogicalAnd(&Type, &Val2, &Er)) {
1343                          *Err = ErrSyntax;                          *Err = ErrSyntax;
1344                          LinePtr = P1;                          LinePtr = P1;
1345                          return TRUE;                          return TRUE;
1346                  }                  }
1347    
1348                  if (Er) {                  if (Er) {
1349                          *Err = Er;                          *Err = Er;
1350                          LinePtr = P1;                          LinePtr = P1;
1351                          return TRUE;                          return TRUE;
1352                  }                  }
1353    
1354                  if (Type!=TypInteger) {                  if (Type!=TypInteger) {
1355                          *Err = ErrTypeMismatch;                          *Err = ErrTypeMismatch;
1356                          LinePtr = P1;                          LinePtr = P1;
1357                          return TRUE;                          return TRUE;
1358                  }                  }
1359    
1360                  switch (WId) {                  switch (WId) {
1361                          case RsvLOr:  Val1 = Val1 || Val2; break;                          case RsvLOr:  Val1 = Val1 || Val2; break;
1362                          case RsvLXor: Val1 = (Val1 && !Val2) || (!Val1 && Val2); break;                          case RsvLXor: Val1 = (Val1 && !Val2) || (!Val1 && Val2); break;
1363                  }                  }
1364                  *Val = Val1;                  *Val = Val1;
1365          }          }
1366  }  }
1367    
1368  void GetIntVal(int far *Val, LPWORD Err)  void GetIntVal(int far *Val, LPWORD Err)
1369  {  {
1370          WORD ValType;          WORD ValType;
1371    
1372          if (*Err != 0) return;          if (*Err != 0) return;
1373          if (! GetExpression(&ValType,Val,Err))          if (! GetExpression(&ValType,Val,Err))
1374          {          {
1375                  *Err = ErrSyntax;                  *Err = ErrSyntax;
1376                  return;                  return;
1377          }          }
1378          if (*Err!=0) return;          if (*Err!=0) return;
1379          if (ValType!=TypInteger)          if (ValType!=TypInteger)
1380                  *Err = ErrTypeMismatch;                  *Err = ErrTypeMismatch;
1381  }  }
1382    
1383  void SetIntVal(WORD VarId, int Val)  void SetIntVal(WORD VarId, int Val)
1384  {  {
1385          IntVal[VarId] = Val;          IntVal[VarId] = Val;
1386  }  }
1387    
1388  int CopyIntVal(WORD VarId)  int CopyIntVal(WORD VarId)
1389  {  {
1390          return IntVal[VarId];          return IntVal[VarId];
1391  }  }
1392    
1393  void GetIntVar(LPWORD VarId, LPWORD Err)  void GetIntVar(LPWORD VarId, LPWORD Err)
1394  {  {
1395          TName Name;          TName Name;
1396          WORD VarType;          WORD VarType;
1397    
1398          if (*Err!=0) return;          if (*Err!=0) return;
1399    
1400          if (GetIdentifier(Name))          if (GetIdentifier(Name))
1401          {          {
1402                  if (CheckVar(Name,&VarType,VarId))                  if (CheckVar(Name,&VarType,VarId))
1403                  {                  {
1404                          if (VarType!=TypInteger)                          if (VarType!=TypInteger)
1405                                  *Err = ErrTypeMismatch;                                  *Err = ErrTypeMismatch;
1406                  }                  }
1407                  else {                  else {
1408                          if (NewIntVar(Name,0))                          if (NewIntVar(Name,0))
1409                                  CheckVar(Name,&VarType,VarId);                                  CheckVar(Name,&VarType,VarId);
1410                          else                          else
1411                                  *Err = ErrTooManyVar;                                  *Err = ErrTooManyVar;
1412                  }                  }
1413          }          }
1414          else          else
1415                  *Err = ErrSyntax;                  *Err = ErrSyntax;
1416  }  }
1417    
1418  void GetStrVal(PCHAR Str, LPWORD Err)  void GetStrVal(PCHAR Str, LPWORD Err)
1419  {  {
1420          GetStrVal2(Str, Err, FALSE);          GetStrVal2(Str, Err, FALSE);
1421  }  }
1422    
1423  void GetStrVal2(PCHAR Str, LPWORD Err, BOOL AutoConversion)  void GetStrVal2(PCHAR Str, LPWORD Err, BOOL AutoConversion)
1424  {  {
1425          WORD VarType;          WORD VarType;
1426          int VarId;          int VarId;
1427    
1428          Str[0] = 0;          Str[0] = 0;
1429          if (*Err!=0) return;          if (*Err!=0) return;
1430    
1431          if (GetString(Str,Err))          if (GetString(Str,Err))
1432                  return;                  return;
1433          else if (GetExpression(&VarType,&VarId,Err))          else if (GetExpression(&VarType,&VarId,Err))
1434          {          {
1435                  if (*Err!=0) return;                  if (*Err!=0) return;
1436                  switch (VarType) {                  switch (VarType) {
1437                          case TypString:                          case TypString:
1438                                  strncpy_s(Str,MaxStrLen,&StrBuff[VarId*MaxStrLen],_TRUNCATE);                                  strncpy_s(Str,MaxStrLen,&StrBuff[VarId*MaxStrLen],_TRUNCATE);
1439                                  break;                                  break;
1440                          case TypInteger:                          case TypInteger:
1441                                  if (AutoConversion)                                  if (AutoConversion)
1442                                          _snprintf_s(Str,MaxStrLen,_TRUNCATE,"%d",VarId);                                          _snprintf_s(Str,MaxStrLen,_TRUNCATE,"%d",VarId);
1443                                  else                                  else
1444                                          *Err = ErrTypeMismatch;                                          *Err = ErrTypeMismatch;
1445                                  break;                                  break;
1446                          default:                          default:
1447                                  *Err = ErrTypeMismatch;                                  *Err = ErrTypeMismatch;
1448                  }                  }
1449          }          }
1450          else          else
1451                  *Err = ErrSyntax;                  *Err = ErrSyntax;
1452  }  }
1453    
1454  void GetStrVar(LPWORD VarId, LPWORD Err)  void GetStrVar(LPWORD VarId, LPWORD Err)
1455  {  {
1456          TName Name;          TName Name;
1457          WORD VarType;          WORD VarType;
1458    
1459          if (*Err!=0) return;          if (*Err!=0) return;
1460    
1461          if (GetIdentifier(Name))          if (GetIdentifier(Name))
1462          {          {
1463                  if (CheckVar(Name,&VarType,VarId))                  if (CheckVar(Name,&VarType,VarId))
1464                  {                  {
1465                          if (VarType!=TypString)                          if (VarType!=TypString)
1466                                  *Err = ErrTypeMismatch;                                  *Err = ErrTypeMismatch;
1467                  }                  }
1468                  else {                  else {
1469                          if (NewStrVar(Name,""))                          if (NewStrVar(Name,""))
1470                                  CheckVar(Name,&VarType,VarId);                                  CheckVar(Name,&VarType,VarId);
1471                          else                          else
1472                                  *Err = ErrTooManyVar;                                  *Err = ErrTooManyVar;
1473                  }                  }
1474          }          }
1475          else          else
1476                  *Err = ErrSyntax;                  *Err = ErrSyntax;
1477  }  }
1478    
1479  void SetStrVal(WORD VarId, PCHAR Str)  void SetStrVal(WORD VarId, PCHAR Str)
1480  {  {
1481          // StrBuf の運用上 MaxStrLen が正しいサイズなのでサイズを固定          // StrBuf の運用上 MaxStrLen が正しいサイズなのでサイズを固定
1482          // (2007.6.23 maya)          // (2007.6.23 maya)
1483          strncpy_s(&StrBuff[VarId*MaxStrLen],MaxStrLen,Str,_TRUNCATE);          strncpy_s(&StrBuff[VarId*MaxStrLen],MaxStrLen,Str,_TRUNCATE);
1484  }  }
1485    
1486  PCHAR StrVarPtr(WORD VarId)  PCHAR StrVarPtr(WORD VarId)
1487  {  {
1488          return (&StrBuff[VarId*MaxStrLen]);          return (&StrBuff[VarId*MaxStrLen]);
1489  }  }
1490    
1491  // for ifdefined (2006.9.23 maya)  // for ifdefined (2006.9.23 maya)
1492  void GetVarType(LPWORD ValType, int far *Val, LPWORD Err)  void GetVarType(LPWORD ValType, int far *Val, LPWORD Err)
1493  {  {
1494          GetFactor(ValType,Val,Err);          GetFactor(ValType,Val,Err);
1495                    
1496          if (*Err == ErrVarNotInit) {          if (*Err == ErrVarNotInit) {
1497                  ValType = TypUnknown;                  ValType = TypUnknown;
1498          }          }
1499    
1500          *Err = 0;          *Err = 0;
1501  }  }

Legend:
Removed from v.3226  
changed lines
  Added in v.3227

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26