Revision: 8707 https://osdn.net/projects/ttssh2/scm/svn/commits/8707 Author: zmatsuo Date: 2020-04-12 00:56:35 +0900 (Sun, 12 Apr 2020) Log Message: ----------- ttmparse.cppにリネーム - ttmparse.c -> ttmparse.cpp - プロジェクトファイルを修正 Modified Paths: -------------- trunk/teraterm/ttpmacro/CMakeLists.txt trunk/teraterm/ttpmacro/ttpmacro.v16.vcxproj trunk/teraterm/ttpmacro/ttpmacro.v16.vcxproj.filters trunk/teraterm/ttpmacro/ttpmacro.vcproj Added Paths: ----------- trunk/teraterm/ttpmacro/ttmparse.cpp Removed Paths: ------------- trunk/teraterm/ttpmacro/ttmparse.c -------------- next part -------------- Modified: trunk/teraterm/ttpmacro/CMakeLists.txt =================================================================== --- trunk/teraterm/ttpmacro/CMakeLists.txt 2020-04-11 15:56:26 UTC (rev 8706) +++ trunk/teraterm/ttpmacro/CMakeLists.txt 2020-04-11 15:56:35 UTC (rev 8707) @@ -41,7 +41,7 @@ ttmmain.h ttmmsg.h ttmonig.h - ttmparse.c + ttmparse.cpp ttmparse.h wait4all.c wait4all.h Deleted: trunk/teraterm/ttpmacro/ttmparse.c =================================================================== --- trunk/teraterm/ttpmacro/ttmparse.c 2020-04-11 15:56:26 UTC (rev 8706) +++ trunk/teraterm/ttpmacro/ttmparse.c 2020-04-11 15:56:35 UTC (rev 8707) @@ -1,1931 +0,0 @@ -/* - * Copyright (C) 1994-1998 T. Teranishi - * (C) 2005-2020 TeraTerm Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -// TTMACRO.EXE, TTL parser - -#include "teraterm.h" -#include <string.h> -#include <stdio.h> -#include <ctype.h> -#if !defined(_CRTDBG_MAP_ALLOC) -#define _CRTDBG_MAP_ALLOC -#endif -#include <stdlib.h> -#include <crtdbg.h> -#include "ttmdlg.h" -#include "ttmparse.h" -#include "ttmbuff.h" - -/* C\x8C\xBE\x8C\xEA\x83X\x83^\x83C\x83\x8B\x82̃R\x83\x81\x83\x93\x83g\x82\xF0\x83T\x83|\x81[\x83g\x82\xB7\x82邩\x82ǂ\xA4\x82\xA9 (2009.7.2 yutaka) */ -#define SUPPORT_C_STYLE_COMMENT -static int commenting = 0; /* C\x8C\xBE\x8C\xEA\x83R\x83\x81\x83\x93\x83g */ - -WORD TTLStatus = 0; -char LineBuff[MaxLineLen]; // \x8Ds\x83o\x83b\x83t\x83@\x82̃T\x83C\x83Y\x82\xF0\x8Ag\x92\xA3\x82\xB5\x82\xBD\x81B(2007.6.9 maya) -WORD LinePtr; -WORD LineLen; -WORD LineParsePtr; // \x83g\x81[\x83N\x83\x93\x82̉\xF0\x90͂\xF0\x8AJ\x8En\x82\xB5\x82\xBD\x88ʒu (2013.6.23 yutaka) - -typedef struct { - int size; - int *val; -} TIntAry, *PIntAry; - -typedef struct { - int size; -// PStrVal val; - char **val; -} TStrAry, *PStrAry; - -typedef struct { - BINT val; - WORD level; -} TLab; - -typedef enum { - TypeUnknown = TypUnknown, - TypeInteger = TypInteger, - //TypeLogical = TypLogical, - TypeString = TypString, - TypeLabel = TypLabel, - TypeIntArray = TypIntArray, - TypeStrArray = TypStrArray, -} VariableType_t; - -typedef struct { - char *Name; - VariableType_t Type; - union { - char *Str; - int Int; - TLab Lab; - TIntAry IntAry; - TStrAry StrAry; - } Value; -} Variable_t; - -static Variable_t *Variables; -static int VariableCount; - -// \x83g\x81[\x83N\x83\x93\x82̉\xF0\x90͊J\x8En\x88ʒu\x82\xF0\x8DX\x90V\x82\xB7\x82\xE9\x81B -static void UpdateLineParsePtr(void) -{ - LineParsePtr = LinePtr; -} - - -BOOL InitVar() -{ - Variables = NULL; - VariableCount = 0; - return TRUE; -} - -void EndVar() -{ - // TODO Variables \x82\xF0\x82\xB7\x82ׂ\xC4 free \x82\xB7\x82\xE9 -} - -void DispErr(WORD Err) -{ - const char *Msg; - int i; - int no, start, end; - char *filename; - - switch (Err) { - case ErrCloseParent: Msg = "\")\" expected."; break; - case ErrCantCall: Msg = "Can't call sub."; break; - case ErrCantConnect: Msg = "Can't link macro."; break; - case ErrCantOpen: Msg = "Can't open file."; break; - case ErrDivByZero: Msg = "Divide by zero."; break; - case ErrInvalidCtl: Msg = "Invalid control."; break; - case ErrLabelAlreadyDef: Msg = "Label already defined."; break; - case ErrLabelReq: Msg = "Label requiered."; break; - case ErrLinkFirst: Msg = "Link macro first. Use 'connect' macro."; break; - case ErrStackOver: Msg = "Stack overflow."; break; - case ErrSyntax: Msg = "Syntax error."; break; - case ErrTooManyLabels: Msg = "Too many labels."; break; - case ErrTooManyVar: Msg = "Too many variables."; break; - case ErrTypeMismatch: Msg = "Type mismatch."; break; - case ErrVarNotInit: Msg = "Variable not initialized."; break; - case ErrCloseComment: Msg = "\"*/\" expected."; break; - case ErrOutOfRange: Msg = "Index out of range."; break; - case ErrCloseBracket: Msg = "\"]\" expected."; break; - case ErrFewMemory: Msg = "Can't allocate memory."; break; - case ErrNotSupported: Msg = "Unknown command."; break; - case ErrCantExec: Msg = "Can't execute command."; break; - default: Msg = "Unknown error message number."; break; - }; - - no = GetLineNo(); - start = LineParsePtr; - end = LinePtr; - if (start == end) - end = LineLen; - - filename = GetMacroFileName(); - - i = OpenErrDlg(Msg, LineBuff, no, start, end, filename); - if (i==IDOK) TTLStatus = IdTTLEnd; -} - -void LockVar() -{ -} - -void UnlockVar() -{ -} - -BOOL CheckReservedWord(PCHAR Str, LPWORD WordId) -{ - *WordId = 0; - - switch (Str[0] | 0x20) { // to lower-case - case 'a': - if (_stricmp(Str,"and")==0) *WordId = RsvBAnd; - break; - case 'b': - if (_stricmp(Str,"beep")==0) *WordId = RsvBeep; - else if (_stricmp(Str,"bplusrecv")==0) *WordId = RsvBPlusRecv; - else if (_stricmp(Str,"bplussend")==0) *WordId = RsvBPlusSend; - else if (_stricmp(Str,"break")==0) *WordId = RsvBreak; - else if (_stricmp(Str,"bringupbox")==0) *WordId = RsvBringupBox; - else if (_stricmp(Str,"basename")==0) *WordId = RsvBasename; - break; - case 'c': - if (_stricmp(Str,"call")==0) *WordId = RsvCall; - else if (_stricmp(Str,"callmenu")==0) *WordId = RsvCallMenu; - else if (_stricmp(Str,"changedir")==0) *WordId = RsvChangeDir; - else if (_stricmp(Str,"checksum8")==0) *WordId = RsvChecksum8; - else if (_stricmp(Str,"checksum8file")==0) *WordId = RsvChecksum8File; - else if (_stricmp(Str,"checksum16")==0) *WordId = RsvChecksum16; - else if (_stricmp(Str,"checksum16file")==0) *WordId = RsvChecksum16File; - else if (_stricmp(Str,"checksum32")==0) *WordId = RsvChecksum32; - else if (_stricmp(Str,"checksum32file")==0) *WordId = RsvChecksum32File; - else if (_stricmp(Str,"clearscreen")==0) *WordId = RsvClearScreen; - else if (_stricmp(Str,"clipb2var")==0) *WordId = RsvClipb2Var; // add 'clipb2var' (2006.9.17 maya) - else if (_stricmp(Str,"closesbox")==0) *WordId = RsvCloseSBox; - else if (_stricmp(Str,"closett")==0) *WordId = RsvCloseTT; - else if (_stricmp(Str,"code2str")==0) *WordId = RsvCode2Str; - else if (_stricmp(Str,"connect")==0) *WordId = RsvConnect; - else if (_stricmp(Str,"continue")==0) *WordId = RsvContinue; - else if (_stricmp(Str,"crc16")==0) *WordId = RsvCrc16; - else if (_stricmp(Str,"crc16file")==0) *WordId = RsvCrc16File; - else if (_stricmp(Str,"crc32")==0) *WordId = RsvCrc32; - else if (_stricmp(Str,"crc32file")==0) *WordId = RsvCrc32File; - else if (_stricmp(Str,"cygconnect")==0) *WordId = RsvCygConnect; - break; - case 'd': - if (_stricmp(Str,"delpassword")==0) *WordId = RsvDelPassword; - else if (_stricmp(Str,"disconnect")==0) *WordId = RsvDisconnect; - else if (_stricmp(Str,"dispstr")==0) *WordId = RsvDispStr; - else if (_stricmp(Str,"do")==0) *WordId = RsvDo; - else if (_stricmp(Str,"dirname")==0) *WordId = RsvDirname; - else if (_stricmp(Str, "dirnamebox") == 0) *WordId = RsvDirnameBox; - break; - case 'e': - if (_stricmp(Str,"else")==0) *WordId = RsvElse; - else if (_stricmp(Str,"elseif")==0) *WordId = RsvElseIf; - else if (_stricmp(Str,"enablekeyb")==0) *WordId = RsvEnableKeyb; - else if (_stricmp(Str,"end")==0) *WordId = RsvEnd; - else if (_stricmp(Str,"endif")==0) *WordId = RsvEndIf; - else if (_stricmp(Str,"enduntil")==0) *WordId = RsvEndUntil; - else if (_stricmp(Str,"endwhile")==0) *WordId = RsvEndWhile; - else if (_stricmp(Str,"exec")==0) *WordId = RsvExec; - else if (_stricmp(Str,"execcmnd")==0) *WordId = RsvExecCmnd; - else if (_stricmp(Str,"exit")==0) *WordId = RsvExit; - else if (_stricmp(Str,"expandenv")==0) *WordId = RsvExpandEnv; - break; - case 'f': - if (_stricmp(Str,"fileclose")==0) *WordId = RsvFileClose; - else if (_stricmp(Str,"fileconcat")==0) *WordId = RsvFileConcat; - else if (_stricmp(Str,"filecopy")==0) *WordId = RsvFileCopy; - else if (_stricmp(Str,"filecreate")==0) *WordId = RsvFileCreate; - else if (_stricmp(Str,"filedelete")==0) *WordId = RsvFileDelete; - else if (_stricmp(Str,"filelock")==0) *WordId = RsvFileLock; - else if (_stricmp(Str,"filemarkptr")==0) *WordId = RsvFileMarkPtr; - else if (_stricmp(Str,"filenamebox")==0) *WordId = RsvFilenameBox; // add 'filenamebox' (2007.9.13 maya) - else if (_stricmp(Str,"fileopen")==0) *WordId = RsvFileOpen; - else if (_stricmp(Str,"filereadln")==0) *WordId = RsvFileReadln; - else if (_stricmp(Str,"fileread")==0) *WordId = RsvFileRead; // add - else if (_stricmp(Str,"filerename")==0) *WordId = RsvFileRename; - else if (_stricmp(Str,"filesearch")==0) *WordId = RsvFileSearch; - else if (_stricmp(Str,"fileseek")==0) *WordId = RsvFileSeek; - else if (_stricmp(Str,"fileseekback")==0) *WordId = RsvFileSeekBack; - else if (_stricmp(Str,"filestat")==0) *WordId = RsvFileStat; - else if (_stricmp(Str,"filestrseek")==0) *WordId = RsvFileStrSeek; - else if (_stricmp(Str,"filestrseek2")==0) *WordId = RsvFileStrSeek2; - else if (_stricmp(Str,"filetruncate")==0) *WordId = RsvFileTruncate; - else if (_stricmp(Str,"fileunlock")==0) *WordId = RsvFileUnLock; - else if (_stricmp(Str,"filewrite")==0) *WordId = RsvFileWrite; - else if (_stricmp(Str,"filewriteln")==0) *WordId = RsvFileWriteLn; - else if (_stricmp(Str,"findclose")==0) *WordId = RsvFindClose; - else if (_stricmp(Str,"findfirst")==0) *WordId = RsvFindFirst; - else if (_stricmp(Str,"findnext")==0) *WordId = RsvFindNext; - else if (_stricmp(Str,"flushrecv")==0) *WordId = RsvFlushRecv; - else if (_stricmp(Str,"foldercreate")==0) *WordId = RsvFolderCreate; - else if (_stricmp(Str,"folderdelete")==0) *WordId = RsvFolderDelete; - else if (_stricmp(Str,"foldersearch")==0) *WordId = RsvFolderSearch; - else if (_stricmp(Str,"for")==0) *WordId = RsvFor; - break; - case 'g': - if (_stricmp(Str,"getdate")==0) *WordId = RsvGetDate; - else if (_stricmp(Str,"getdir")==0) *WordId = RsvGetDir; - else if (_stricmp(Str,"getenv")==0) *WordId = RsvGetEnv; - else if (_stricmp(Str,"getfileattr")==0) *WordId = RsvGetFileAttr; - else if (_stricmp(Str,"gethostname")==0) *WordId = RsvGetHostname; - else if (_stricmp(Str,"getipv4addr")==0) *WordId = RsvGetIPv4Addr; - else if (_stricmp(Str,"getipv6addr")==0) *WordId = RsvGetIPv6Addr; - else if (_stricmp(Str,"getmodemstatus") == 0) *WordId = RsvGetModemStatus; - else if (_stricmp(Str,"getpassword")==0) *WordId = RsvGetPassword; - else if (_stricmp(Str,"getspecialfolder")==0) *WordId = RsvGetSpecialFolder; - else if (_stricmp(Str,"gettime")==0) *WordId = RsvGetTime; - else if (_stricmp(Str,"gettitle")==0) *WordId = RsvGetTitle; - else if (_stricmp(Str,"getttdir")==0) *WordId = RsvGetTTDir; - else if (_stricmp(Str,"getver")==0) *WordId = RsvGetVer; - else if (_stricmp(Str,"goto")==0) *WordId = RsvGoto; - break; - case 'i': - if (_stricmp(Str,"if")==0) *WordId = RsvIf; - else if (_stricmp(Str,"ifdefined")==0) *WordId = RsvIfDefined; - else if (_stricmp(Str,"include")==0) *WordId = RsvInclude ; - else if (_stricmp(Str,"inputbox")==0) *WordId = RsvInputBox; - else if (_stricmp(Str,"int2str")==0) *WordId = RsvInt2Str; - else if (_stricmp(Str,"intdim")==0) *WordId = RsvIntDim; - else if (_stricmp(Str,"ispassword")==0) *WordId = RsvIsPassword; // add 'ispassword' (2012.5.24 yutaka) - break; - case 'k': - if (_stricmp(Str,"kmtfinish")==0) *WordId = RsvKmtFinish; - else if (_stricmp(Str,"kmtget")==0) *WordId = RsvKmtGet; - else if (_stricmp(Str,"kmtrecv")==0) *WordId = RsvKmtRecv; - else if (_stricmp(Str,"kmtsend")==0) *WordId = RsvKmtSend; - break; - case 'l': - if (_stricmp(Str,"listbox")==0) *WordId = RsvListBox; - else if (_stricmp(Str,"loadkeymap")==0) *WordId = RsvLoadKeyMap; - else if (_stricmp(Str,"logautoclosemode")==0) *WordId = RsvLogAutoClose; - else if (_stricmp(Str,"logclose")==0) *WordId = RsvLogClose; - else if (_stricmp(Str,"loginfo")==0) *WordId = RsvLogInfo; - else if (_stricmp(Str,"logopen")==0) *WordId = RsvLogOpen; - else if (_stricmp(Str,"logpause")==0) *WordId = RsvLogPause; - else if (_stricmp(Str,"logrotate")==0) *WordId = RsvLogRotate; - else if (_stricmp(Str,"logstart")==0) *WordId = RsvLogStart; - else if (_stricmp(Str,"logwrite")==0) *WordId = RsvLogWrite; - else if (_stricmp(Str,"loop")==0) *WordId = RsvLoop; - break; - case 'm': - if (_stricmp(Str,"makepath")==0) *WordId = RsvMakePath; - else if (_stricmp(Str,"messagebox")==0) *WordId = RsvMessageBox; - else if (_stricmp(Str,"mpause")==0) *WordId = RsvMilliPause; - break; - case 'n': - if (_stricmp(Str,"next")==0) *WordId = RsvNext; - else if (_stricmp(Str,"not")==0) *WordId = RsvBNot; - break; - case 'o': - if (_stricmp(Str,"or")==0) *WordId = RsvBOr; - break; - case 'p': - if (_stricmp(Str,"passwordbox")==0) *WordId = RsvPasswordBox; - else if (_stricmp(Str,"pause")==0) *WordId = RsvPause; - break; - case 'q': - if (_stricmp(Str,"quickvanrecv")==0) *WordId = RsvQuickVANRecv; - else if (_stricmp(Str,"quickvansend")==0) *WordId = RsvQuickVANSend; - break; - case 'r': - if (_stricmp(Str,"random")==0) *WordId = RsvRandom; // add 'random' (2006.2.11 yutaka) - else if (_stricmp(Str,"recvln")==0) *WordId = RsvRecvLn; - else if (_stricmp(Str,"regexoption")==0) *WordId = RsvRegexOption; - else if (_stricmp(Str,"restoresetup")==0) *WordId = RsvRestoreSetup; - else if (_stricmp(Str,"return")==0) *WordId = RsvReturn; - else if (_stricmp(Str,"rotateleft")==0) *WordId = RsvRotateL; // add 'rotateleft' (2007.8.19 maya) - else if (_stricmp(Str,"rotateright")==0) *WordId = RsvRotateR; // add 'rotateright' (2007.8.19 maya) - break; - case 's': - if (_stricmp(Str,"scprecv")==0) *WordId = RsvScpRecv; // add 'scprecv' (2008.1.1 yutaka) - else if (_stricmp(Str,"scpsend")==0) *WordId = RsvScpSend; // add 'scpsend' (2008.1.1 yutaka) - else if (_stricmp(Str,"send")==0) *WordId = RsvSend; - else if (_stricmp(Str,"sendbreak")==0) *WordId = RsvSendBreak; - else if (_stricmp(Str,"sendbroadcast")==0) *WordId = RsvSendBroadcast; - else if (_stricmp(Str,"sendlnbroadcast")==0) *WordId = RsvSendlnBroadcast; - else if (_stricmp(Str,"sendlnmulticast")==0) *WordId = RsvSendlnMulticast; - else if (_stricmp(Str,"sendmulticast")==0) *WordId = RsvSendMulticast; - else if (_stricmp(Str,"setfileattr")==0) *WordId = RsvSetFileAttr; - else if (_stricmp(Str,"setmulticastname")==0) *WordId = RsvSetMulticastName; - else if (_stricmp(Str,"sendfile")==0) *WordId = RsvSendFile; - else if (_stricmp(Str,"sendkcode")==0) *WordId = RsvSendKCode; - else if (_stricmp(Str,"sendln")==0) *WordId = RsvSendLn; - else if (_stricmp(Str,"setbaud")==0) *WordId = RsvSetBaud; - else if (_stricmp(Str,"setdate")==0) *WordId = RsvSetDate; - else if (_stricmp(Str,"setdebug")==0) *WordId = RsvSetDebug; - else if (_stricmp(Str,"setdir")==0) *WordId = RsvSetDir; - else if (_stricmp(Str,"setdlgpos")==0) *WordId = RsvSetDlgPos; - else if (_stricmp(Str,"setdtr")==0) *WordId = RsvSetDtr; // add 'setdtr' (2008.3.12 maya) - else if (_stricmp(Str,"setecho")==0) *WordId = RsvSetEcho; - else if (_stricmp(Str,"setenv")==0) *WordId = RsvSetEnv; // reactivate 'setenv' (2007.8.31 maya) - else if (_stricmp(Str,"setexitcode")==0) *WordId = RsvSetExitCode; - else if (_stricmp(Str,"setflowctrl")==0) *WordId = RsvSetFlowCtrl; - else if (_stricmp(Str,"setpassword")==0) *WordId = RsvSetPassword; // add 'setpassword' (2012.5.23 yutaka) - else if (_stricmp(Str,"setrts")==0) *WordId = RsvSetRts; // add 'setrts' (2008.3.12 maya) - else if (_stricmp(Str,"setspeed")==0) *WordId = RsvSetBaud; - else if (_stricmp(Str,"setsync")==0) *WordId = RsvSetSync; - else if (_stricmp(Str,"settime")==0) *WordId = RsvSetTime; - else if (_stricmp(Str,"settitle")==0) *WordId = RsvSetTitle; - else if (_stricmp(Str,"show")==0) *WordId = RsvShow; - else if (_stricmp(Str,"showtt")==0) *WordId = RsvShowTT; - else if (_stricmp(Str,"sprintf")==0) *WordId = RsvSprintf; // add 'sprintf' (2007.5.1 yutaka) - else if (_stricmp(Str,"sprintf2")==0) *WordId = RsvSprintf2; // add 'sprintf2' (2008.12.18 maya) - else if (_stricmp(Str,"statusbox")==0) *WordId = RsvStatusBox; - else if (_stricmp(Str,"str2code")==0) *WordId = RsvStr2Code; - else if (_stricmp(Str,"str2int")==0) *WordId = RsvStr2Int; - else if (_stricmp(Str,"strcompare")==0) *WordId = RsvStrCompare; - else if (_stricmp(Str,"strconcat")==0) *WordId = RsvStrConcat; - else if (_stricmp(Str,"strcopy")==0) *WordId = RsvStrCopy; - else if (_stricmp(Str,"strdim")==0) *WordId = RsvStrDim; - else if (_stricmp(Str,"strinsert")==0) *WordId = RsvStrInsert; - else if (_stricmp(Str,"strjoin")==0) *WordId = RsvStrJoin; - else if (_stricmp(Str,"strlen")==0) *WordId = RsvStrLen; - else if (_stricmp(Str,"strmatch")==0) *WordId = RsvStrMatch; - else if (_stricmp(Str,"strremove")==0) *WordId = RsvStrRemove; - else if (_stricmp(Str,"strreplace")==0) *WordId = RsvStrReplace; - else if (_stricmp(Str,"strscan")==0) *WordId = RsvStrScan; - else if (_stricmp(Str,"strspecial")==0) *WordId = RsvStrSpecial; - else if (_stricmp(Str,"strsplit")==0) *WordId = RsvStrSplit; - else if (_stricmp(Str,"strtrim")==0) *WordId = RsvStrTrim; - break; - case 't': - if (_stricmp(Str,"testlink")==0) *WordId = RsvTestLink; - else if (_stricmp(Str,"then")==0) *WordId = RsvThen; - else if (_stricmp(Str,"tolower")==0) *WordId = RsvToLower; // add 'tolower' (2007.7.12 maya) - else if (_stricmp(Str,"toupper")==0) *WordId = RsvToUpper; // add 'toupper' (2007.7.12 maya) - break; - case 'u': - if (_stricmp(Str,"unlink")==0) *WordId = RsvUnlink; - else if (_stricmp(Str,"until")==0) *WordId = RsvUntil; - else if (_stricmp(Str,"uptime")==0) *WordId = RsvUptime; - break; - case 'v': - if (_stricmp(Str,"var2clipb")==0) *WordId = RsvVar2Clipb; // add 'var2clipb' (2006.9.17 maya) - break; - case 'w': - if (_stricmp(Str,"waitregex")==0) *WordId = RsvWaitRegex; // add 'waitregex' (2005.10.5 yutaka) - else if (_stricmp(Str,"wait")==0) *WordId = RsvWait; - else if (_stricmp(Str,"wait4all")==0) *WordId = RsvWait4all; - else if (_stricmp(Str,"waitevent")==0) *WordId = RsvWaitEvent; - else if (_stricmp(Str,"waitln")==0) *WordId = RsvWaitLn; - else if (_stricmp(Str,"waitn")==0) *WordId = RsvWaitN; // add 'waitn' (2009.1.26 maya) - else if (_stricmp(Str,"waitrecv")==0) *WordId = RsvWaitRecv; - else if (_stricmp(Str,"while")==0) *WordId = RsvWhile; - break; - case 'x': - if (_stricmp(Str,"xmodemrecv")==0) *WordId = RsvXmodemRecv; - else if (_stricmp(Str,"xmodemsend")==0) *WordId = RsvXmodemSend; - else if (_stricmp(Str,"xor")==0) *WordId = RsvBXor; - break; - case 'y': - if (_stricmp(Str,"yesnobox")==0) *WordId = RsvYesNoBox; - else if (_stricmp(Str,"ymodemrecv")==0) *WordId = RsvYmodemRecv; - else if (_stricmp(Str,"ymodemsend")==0) *WordId = RsvYmodemSend; - break; - case 'z': - if (_stricmp(Str,"zmodemrecv")==0) *WordId = RsvZmodemRecv; - else if (_stricmp(Str,"zmodemsend")==0) *WordId = RsvZmodemSend; - break; - default: - ; /* nothing to do */ - } - - return (*WordId!=0); -} - -/* C\x8C\xBE\x8C\xEA\x83R\x83\x81\x83\x93\x83g\x82\xAA\x95\xB6\x82\xE7\x82\xEA\x82Ă\xA2\x82邩\x82ǂ\xA4\x82\xA9 */ -int IsCommentClosed(void) -{ -#ifdef SUPPORT_C_STYLE_COMMENT - int ret = (commenting == 0); - - /* \x83R\x83\x81\x83\x93\x83g\x82\xAA\x8En\x82܂\xE9\x8E\xE8\x91O\x82܂ł̃R\x83}\x83\x93\x83h\x82\xF0\x8E\xC0\x8Ds\x82ł\xAB\x82\xE9\x82悤\x82ɂ\xB7\x82邽\x82߁A - * \x93\xE0\x95\x94\x83t\x83\x89\x83O\x82̓N\x83\x8A\x83A\x82\xB5\x82Ă\xA8\x82\xAD\x81B - */ - commenting = 0; - return (ret); -#else - // \x93\x96\x8AY\x8B@\x94\\x82\xAA\x96\xB3\x8C\xF8\x82̏ꍇ\x82́A\x8F\xED\x82Ɂu\x90^\x81v\x82\xF0\x95Ԃ\xB7\x81B - return 1; -#endif -} - -BYTE GetFirstChar() -{ - BYTE b; - int comment_starting = 0; - - if (LinePtr<LineLen) - b = LineBuff[LinePtr]; - else return 0; - - while ((LinePtr<LineLen) && ((b==' ') || (b=='\t'))) - { - LinePtr++; - if (LinePtr<LineLen) b = LineBuff[LinePtr]; - } - -#ifdef SUPPORT_C_STYLE_COMMENT - if (commenting) { - while (LinePtr < LineLen) { - /* \x83R\x83\x81\x83\x93\x83g\x82̏I\x82\xED\x82肪\x8Fo\x82Ă\xAD\x82\xE9\x82܂ŃX\x83L\x83b\x83v */ - if (LineBuff[LinePtr] == '*' && LineBuff[LinePtr + 1] == '/') { - commenting = 0; - LinePtr += 2; - break; - } - LinePtr++; - } - /* \x88\xEA\x8Ds\x82ɃR\x83\x81\x83\x93\x83g\x82̏I\x82\xED\x82肪\x82Ȃ\xA9\x82\xC1\x82\xBD\x82\xE7\x81A\x8E\x9F\x82̍s\x82\xF0\x93ǂށB*/ - if (commenting) - return 0; // next line - - if (LinePtr < LineLen) - b = LineBuff[LinePtr]; - else - b = 0; - - while ((LinePtr<LineLen) && ((b==' ') || (b=='\t'))) - { - LinePtr++; - if (LinePtr<LineLen) b = LineBuff[LinePtr]; - } - } - - /* C\x8C\xBE\x8C\xEA\x83R\x83\x81\x83\x93\x83g\x82̎n\x82܂\xE8 */ - do { - if (LineBuff[LinePtr] == '/' && LineBuff[LinePtr + 1] == '*') { - comment_starting = 1; - LinePtr += 2; - while (LinePtr < LineLen) { - /* \x83R\x83\x81\x83\x93\x83g\x82̏I\x82\xED\x82肪\x8Fo\x82Ă\xAD\x82\xE9\x82܂ŃX\x83L\x83b\x83v */ - if (LineBuff[LinePtr] == '*' && LineBuff[LinePtr + 1] == '/') { - LinePtr += 2; - comment_starting = 0; - break; - } - LinePtr++; - } - - if (LinePtr < LineLen) - b = LineBuff[LinePtr]; - else - b = 0; - - while ((LinePtr<LineLen) && ((b==' ') || (b=='\t'))) - { - LinePtr++; - if (LinePtr<LineLen) b = LineBuff[LinePtr]; - } - - /* \x83R\x83\x81\x83\x93\x83g\x82̏I\x82\xED\x82肪\x88\xEA\x8Ds\x82ɓo\x8Fꂵ\x82Ȃ\xA2\x8Fꍇ\x82́A\x89i\x91\xB1\x93I\x82ɋL\x98^\x82\xB7\x82\xE9\x81B*/ - if (comment_starting) - commenting = 1; - } - else { - break; - } - - /* 1\x82̍s\x82ɁA\x95\xA1\x90\x94\x82̃R\x83\x81\x83\x93\x83g\x82\xAA\x82\xA0\x82\xE9\x8Fꍇ\x82ɑΉ\x9E\x82\xB7\x82邽\x82߁A\x8E\x9F\x82̕\xB6\x8E\x9A\x82\xAA\x83X\x83\x89\x83b\x83V\x83\x85\x82Ȃ\xE7\x82A - * \x83\x8B\x81[\x83v\x8F\x88\x97\x9D\x82̎n\x82߂ɖ߂\xB7\x81B - */ - } while (b == '/'); -#endif - - if ((b>' ') && (b!=';')) - { - LinePtr++; - return b; - } - return 0; -} - -BOOL CheckParameterGiven() -{ - WORD P; - - P = LinePtr; - - if (GetFirstChar()) { - LinePtr = P; - return TRUE; - } - else { - LinePtr = P; - return FALSE; - } -} - -BOOL GetIdentifier(PCHAR Name) -{ - int i; - BYTE b; - - memset(Name,0,MaxNameLen); - - b = GetFirstChar(); - if (b==0) return FALSE; - - // Check first character of identifier - if (! __iscsymf(b)) { // [^A-Za-z_] - LinePtr--; - return FALSE; - } - - Name[0] = b; - i = 1; - - if (LinePtr<LineLen) b = LineBuff[LinePtr]; - while ((LinePtr<LineLen) && __iscsym(b)) { // [0-9A-Za-z_] - if (i<MaxNameLen-1) - { - Name[i] = b; - i++; - } - LinePtr++; - if (LinePtr<LineLen) b = LineBuff[LinePtr]; - } - return TRUE; -} - -BOOL GetReservedWord(LPWORD WordId) -{ - TName Name; - WORD P; - - P = LinePtr; - if (! GetIdentifier(Name)) return FALSE; - if (! CheckReservedWord(Name,WordId)) - { - LinePtr = P; - return FALSE; - } - if (0 < *WordId) - return TRUE; - else - LinePtr = P; - return FALSE; -} - -BOOL GetOperator(LPWORD WordId) -{ - WORD P; - BYTE b; - - P = LinePtr; - b = GetFirstChar(); - switch (b) { - case 0: return FALSE; break; - case '*': *WordId = RsvMul; break; - case '+': *WordId = RsvPlus; break; - case '-': *WordId = RsvMinus; break; - case '/': *WordId = RsvDiv; break; - case '%': *WordId = RsvMod; break; - case '=': *WordId = RsvEQ; - if (LinePtr < LineLen && LineBuff[LinePtr] == '=') { - LinePtr++; - } - break; - case '<': *WordId = RsvLT; - if (LinePtr < LineLen) { - switch (LineBuff[LinePtr++]) { - case '=': *WordId = RsvLE; break; - case '>': *WordId = RsvNE; break; - case '<': *WordId = RsvALShift; break; - default: LinePtr--; - } - } - break; - case '>': *WordId = RsvGT; - if (LinePtr < LineLen) { - switch (LineBuff[LinePtr++]) { - case '=': *WordId = RsvGE; break; - case '>': *WordId = RsvARShift; - if (LinePtr < LineLen && LineBuff[LinePtr] == '>') { - *WordId = RsvLRShift; LinePtr++; - } - break; - default: LinePtr--; - } - } - break; - case '&': *WordId = RsvBAnd; - if (LinePtr < LineLen && LineBuff[LinePtr] == '&') { - *WordId = RsvLAnd; LinePtr++; - } - break; - case '|': *WordId = RsvBOr; - if (LinePtr < LineLen && LineBuff[LinePtr] == '|') { - *WordId = RsvLOr; LinePtr++; - } - break; - case '^': *WordId = RsvBXor; break; - case '~': *WordId = RsvBNot; break; - case '!': *WordId = RsvLNot; - if (LinePtr < LineLen && LineBuff[LinePtr] == '=') { - *WordId = RsvNE; LinePtr++; - } - break; - default: - LinePtr--; - if (! GetReservedWord(WordId) || (*WordId < RsvOperator)) { - LinePtr = P; - return FALSE; - } - } - - return TRUE; -} - -BOOL GetLabelName(PCHAR Name) -{ - int i; - BYTE b; - - memset(Name,0,MaxNameLen); - - b = GetFirstChar(); - if (b==0) return FALSE; - Name[0] = b; - - i = 1; - if (LinePtr<LineLen) b = LineBuff[LinePtr]; - while ((LinePtr<LineLen) && __iscsym(b)) { // [0-9A-Za-z_] - if (i<MaxNameLen-1) - { - Name[i] = b; - i++; - } - LinePtr++; - if (LinePtr<LineLen) b = LineBuff[LinePtr]; - } - - return (strlen(Name)>0); -} - -static int GetQuotedStr(PCHAR Str, BYTE q, LPWORD i) -{ - BYTE b; - - b=0; - if (LinePtr<LineLen) b = LineBuff[LinePtr]; - while ((LinePtr<LineLen) && (b>=' '||b=='\t') && (b!=q)) - { - if (*i<MaxStrLen-1) - { - Str[*i] = b; - (*i)++; - } - - LinePtr++; - if (LinePtr<LineLen) b = LineBuff[LinePtr]; - } - if (b==q) { - if (LinePtr<LineLen) - LinePtr++; - } - else - return (ErrSyntax); - - return 0; -} - -static WORD GetCharByCode(PCHAR Str, LPWORD i) -{ - BYTE b; - WORD n; - - b=0; - n = 0; - if (LinePtr<LineLen) b = LineBuff[LinePtr]; - if (!isdigit(b) && (b!='$')) return ErrSyntax; - - if (b!='$') { /* decimal */ - while ((LinePtr<LineLen) && isdigit(b)) { // [0-9] - n = n * 10 + b - '0'; - LinePtr++; - if (LinePtr<LineLen) b = LineBuff[LinePtr]; - } - } - else { /* hexadecimal */ - LinePtr++; - if (LinePtr<LineLen) b = LineBuff[LinePtr]; - while ((LinePtr<LineLen) && isxdigit(b)) { // [0-9A-Fa-f] - if (isalpha(b)) - b = (b|0x20) - 'a' + 10; - else - b = b - '0'; - n = n * 16 + b; - LinePtr++; - if (LinePtr<LineLen) b = LineBuff[LinePtr]; - } - } - - if ((n==0) || (n>255)) return ErrSyntax; - - if (*i<MaxStrLen-1) - { - Str[*i] = (char)n; - (*i)++; - } - return 0; -} - -BOOL GetString(PCHAR Str, LPWORD Err) -{ - BYTE q; - WORD i; - - *Err = 0; - memset(Str,0,MaxStrLen); - - q = GetFirstChar(); - if (q==0) return FALSE; - LinePtr--; - if ((q!='"') && (q!='\'') && (q!='#')) - return FALSE; - - i = 0; - while (((q=='"') || (q=='\'') || (q=='#')) && (*Err==0)) - { - LinePtr++; - switch (q) { - case '"': - case '\'': *Err = GetQuotedStr(Str,q,&i); break; - case '#': *Err = GetCharByCode(Str,&i); break; - } - q = LineBuff[LinePtr]; - } - return TRUE; -} - -BOOL GetNumber(int far *Num) -{ - BYTE b; - - *Num = 0; - - b = GetFirstChar(); - if (b==0) return FALSE; - if (isdigit(b)) { /* decimal constant */ - *Num = b - '0'; - if (LinePtr<LineLen) b = LineBuff[LinePtr]; - while ((LinePtr<LineLen) && isdigit(b)) { - *Num = *Num * 10 + b - '0'; - LinePtr++; - if (LinePtr<LineLen) b = LineBuff[LinePtr]; - } - } - else if (b=='$') - { /* hexadecimal constant */ - if (LinePtr<LineLen) b = LineBuff[LinePtr]; - while ((LinePtr<LineLen) && isxdigit(b)) { // [0-9A-Fa-f] - if (isalpha(b)) - b = (b|0x20) - 'a' + 10; - else - b = b - '0'; - *Num = *Num * 16 + b; - LinePtr++; - if (LinePtr<LineLen) b = LineBuff[LinePtr]; - } - } - else { - LinePtr--; - return FALSE; - } - return TRUE; -} - -BOOL CheckVar(const char *Name, LPWORD VarType, PVarId VarId) -{ - int i; - const Variable_t *v = Variables; - for (i = 0; i < VariableCount; v++,i++) { - if (_stricmp(v->Name, Name) == 0) { - *VarType = v->Type; - *VarId = (TVarId)i; - return TRUE; - } - } - *VarType = TypUnknown; - *VarId = 0; - return FALSE; -} - -static Variable_t *NewVar(const char *name, VariableType_t type) -{ - Variable_t *new_v = realloc(Variables, sizeof(Variable_t) * (VariableCount + 1)); - if (new_v == NULL) { - // TODO \x83\x81\x83\x82\x83\x8A\x82\xAA\x82Ȃ\xA2 - return NULL; - }; - Variables = new_v; - Variable_t *v = &Variables[VariableCount]; - VariableCount++; - v->Name = strdup(name); - v->Type = type; - return v; -} - -BOOL NewIntVar(const char *Name, int InitVal) -{ - Variable_t *v = NewVar(Name, TypeInteger); - v->Value.Int = InitVal; - return TRUE; -} - -BOOL NewStrVar(const char *Name, const char *InitVal) -{ - Variable_t *v = NewVar(Name, TypeString); - v->Value.Str = strdup(InitVal); - return TRUE; -} - -int NewIntAryVar(const char *Name, int size) -{ - Variable_t *v = NewVar(Name, TypeIntArray); - TIntAry *intAry = &v->Value.IntAry; - int *array = calloc(size, sizeof(int)); - if (array == NULL) { - return ErrFewMemory; - } - intAry->val = array; - intAry->size = size; - return 0; -} - -int NewStrAryVar(const char *Name, int size) -{ - Variable_t *v = NewVar(Name, TypeStrArray); - TStrAry *strAry = &v->Value.StrAry; - char **array = calloc(size, sizeof(char *)); - if (array == NULL) { - return ErrFewMemory; - } - strAry->val = array; - strAry->size = size; - return 0; -} - -BOOL NewLabVar(const char *Name, BINT InitVal, WORD ILevel) -{ - Variable_t *v = NewVar(Name, TypeLabel); - TLab *lab = &v->Value.Lab; - lab->val = InitVal; - lab->level = ILevel; - return TRUE; -} - -void DelLabVar(WORD ILevel) -{ - Variable_t *v = Variables; - for (;;) { - if (v == &Variables[VariableCount]) { - // \x8DŌ\xE3\x82܂ŗ\x88\x82\xBD - break; - } - if (v->Type == TypeLabel) { - if (v->Value.Lab.level >= ILevel) { - size_t left; - // \x8D폜\x82\xB7\x82\xE9 - free(v->Name); - // \x8C\xE3\x82\xEB\x82\xF0\x91O\x82ɂ߂\xE9 - left = &Variables[VariableCount - 1] - v; - if (left > 0) { - memmove(v, v+1, sizeof(Variable_t) * left); - } - // 1\x82\xB8\x82\xE9 - VariableCount--; - - continue; - } - } - v++; - } - Variables = realloc(Variables, sizeof(Variable_t) * VariableCount); -} - -void CopyLabel(WORD ILabel, BINT far *Ptr, LPWORD Level) -{ - Variable_t *v = &Variables[ILabel]; - *Ptr = v->Value.Lab.val; - *Level = v->Value.Lab.level; -} - -/* - * Precedence: 1 - * Evaluate variable. - * Evaluate number. - * Evaluate parenthesis. - * Evaluate following operator. - * not, ~, !, +(unary), -(unary) - */ -BOOL GetFactor(LPWORD ValType, int far *Val, LPWORD Err) -{ - TName Name; - WORD P, WId; - TVarId VarId; - int Index; - - P = LinePtr; - *Err = 0; - if (GetIdentifier(Name)) { - if (CheckReservedWord(Name,&WId)) { - if (GetFactor(ValType, Val, Err)) { - if ((*Err==0) && (*ValType!=TypInteger)) - *Err = ErrTypeMismatch; - switch (WId) { - case RsvBNot: *Val = ~(*Val); break; - case RsvLNot: *Val = !(*Val); break; - default: *Err = ErrSyntax; - } - } - else { - *Err = ErrSyntax; - } - } - else if (CheckVar(Name, ValType, &VarId)) { - switch (*ValType) { - case TypInteger: - *Val = Variables[VarId].Value.Int; - break; - case TypString: *Val = VarId; break; - case TypIntArray: - if (GetIndex(&Index, Err)) { - TIntAry *intAry = &Variables[VarId].Value.IntAry; - if (Index >= 0 && Index < intAry->size) { - *Val = intAry->val[Index]; - *ValType = TypInteger; - } - else { - *Err = ErrOutOfRange; - } - } - else if (*Err == 0) { - *Val = VarId; - } - break; - case TypStrArray: - if (GetIndex(&Index, Err)) { - VarId = GetStrVarFromArray(VarId, Index, Err); - if (*Err == 0) { - *Val = VarId; - *ValType = TypString; - } - } - else if (*Err == 0) { - *Val = VarId; - } - break; - } - } - else - *Err = ErrVarNotInit; - } - else if (GetNumber(Val)) - *ValType = TypInteger; - else if (GetOperator(&WId)) { - if (GetFactor(ValType, Val, Err)) { - if ((*Err==0) && (*ValType != TypInteger)) - *Err = ErrTypeMismatch; - switch (WId) { - case RsvPlus: break; - case RsvMinus: *Val = -(*Val); break; - case RsvBNot: *Val = ~(*Val); break; - case RsvLNot: *Val = !(*Val); break; - default: *Err = ErrSyntax; - } - } - else { - *Err = ErrSyntax; - } - } - else if (GetFirstChar()=='(') { - if (GetExpression(ValType, Val, Err)) { - if ((*Err==0) && (GetFirstChar()!=')')) - *Err = ErrCloseParent; - } - else - *Err = ErrSyntax; - } - else { - *Err = 0; - return FALSE; - } - - if (*Err!=0) LinePtr = P; - return TRUE; -} - -/* - * Precedence: 2 - * Evaluate following operator. - * *, /, % - */ -BOOL EvalMultiplication(LPWORD ValType, int far *Val, LPWORD Err) -{ - WORD P, Type, Er; - int Val1, Val2; - WORD WId; - - if (! GetFactor(&Type, &Val1, &Er)) return FALSE; - *ValType = Type; - *Val = Val1; - *Err = Er; - if (Er) return TRUE; - if (Type!=TypInteger) return TRUE; - - while (TRUE) { - P = LinePtr; - if (! GetOperator(&WId)) return TRUE; - - switch (WId) { - case RsvMul: - case RsvDiv: - case RsvMod: - break; - default: - LinePtr = P; - return TRUE; - } - - if (! GetFactor(&Type, &Val2, &Er)) { - *Err = ErrSyntax; - return TRUE; - } - - if (Er) { - *Err = Er; - return TRUE; - } - - if (Type!=TypInteger) { - *Err = ErrTypeMismatch; - return TRUE; - } - - if (Val2 == 0 && WId != RsvMul) { - *Err = ErrDivByZero; - return TRUE; - } - - switch (WId) { - case RsvMul: Val1 = Val1 * Val2; break; - case RsvDiv: Val1 = Val1 / Val2; break; - case RsvMod: Val1 = Val1 % Val2; break; - } - *Val = Val1; - } -} - -/* - * Precedence: 3 - * Evaluate following operator. - * +, - - */ -BOOL EvalAddition(LPWORD ValType, int far *Val, LPWORD Err) -{ - WORD P, Type, Er; - int Val1, Val2; - WORD WId; - - if (! EvalMultiplication(&Type, &Val1, &Er)) return FALSE; - *ValType = Type; - *Val = Val1; - *Err = Er; - if (Er) return TRUE; - if (Type!=TypInteger) return TRUE; - - while (TRUE) { - P = LinePtr; - if (! GetOperator(&WId)) return TRUE; - - switch (WId) { - case RsvPlus: - case RsvMinus: - break; - default: - LinePtr = P; - return TRUE; - } - - if (! EvalMultiplication(&Type, &Val2, &Er)) { - *Err = ErrSyntax; - return TRUE; - } - - if (Er) { - *Err = Er; - return TRUE; - } - - if (Type!=TypInteger) { - *Err = ErrTypeMismatch; - return TRUE; - } - - switch (WId) { - case RsvPlus: Val1 = Val1 + Val2; break; - case RsvMinus: Val1 = Val1 - Val2; break; - } - *Val = Val1; - } -} - -/* - * Precedence: 4 - * Evaluate following operator. - * >>, <<, >>> - */ -BOOL EvalBitShift(LPWORD ValType, int far *Val, LPWORD Err) -{ - WORD P, Type, Er; - int Val1, Val2; - WORD WId; - - if (! EvalAddition(&Type, &Val1, &Er)) return FALSE; - *ValType = Type; - *Val = Val1; - *Err = Er; - if (Er) return TRUE; - if (Type!=TypInteger) return TRUE; - - while (TRUE) { - P = LinePtr; - if (! GetOperator(&WId)) return TRUE; - - switch (WId) { - case RsvARShift: - case RsvALShift: - case RsvLRShift: - break; - default: - LinePtr = P; - return TRUE; - } - - if (! EvalAddition(&Type, &Val2, &Er)) { - *Err = ErrSyntax; - return TRUE; - } - - if (Er) { - *Err = Er; - return TRUE; - } - - if (Type!=TypInteger) { - *Err = ErrTypeMismatch; - return TRUE; - } - - if (WId == RsvALShift) - Val2 = -Val2; - - if (Val2 <= -(int)INT_BIT) { /* Val2 <= -32 */ - Val1 = 0; - } else if (Val2 < 0 ) { /* -32 < Val2 < 0 */ - Val1 = Val1 << -Val2; - } else if (Val2 == 0 ) { /* Val2 == 0 */ - ; /* do nothing */ - } else if (Val2 < INT_BIT) { /* 0 < Val2 < 32 */ - if (WId == RsvLRShift) { - // use unsigned int for logical right shift - Val1 = (unsigned int)Val1 >> Val2; - } else { - Val1 = Val1 >> Val2; - } - } else { /* Val2 >= 32 */ - if (Val1 > 0 || WId == RsvLRShift) { - Val1 = 0; - } else { - Val1 = ~0; - } - } - *Val = Val1; - } -} - -/* - * Precedence: 5 - * Evaluate following operator. - * & - */ -BOOL EvalBitAnd(LPWORD ValType, int far *Val, LPWORD Err) -{ - WORD P, Type, Er; - int Val1, Val2; - WORD WId; - - if (! EvalBitShift(&Type, &Val1, &Er)) return FALSE; - *ValType = Type; - *Val = Val1; - *Err = Er; - if (Er) return TRUE; - if (Type!=TypInteger) return TRUE; - - while (TRUE) { - P = LinePtr; - if (! GetOperator(&WId)) return TRUE; - - if (WId != RsvBAnd) { - LinePtr = P; - return TRUE; - } - - if (! EvalBitShift(&Type, &Val2, &Er)) { - *Err = ErrSyntax; - return TRUE; - } - - if (Er) { - *Err = Er; - return TRUE; - } - - if (Type!=TypInteger) { - *Err = ErrTypeMismatch; - return TRUE; - } - - Val1 = Val1 & Val2; - *Val = Val1; - } -} - -/* - * Precedence: 6 - * Evaluate following operator. - * ^ - */ -BOOL EvalBitXor(LPWORD ValType, int far *Val, LPWORD Err) -{ - WORD P, Type, Er; - int Val1, Val2; - WORD WId; - - if (! EvalBitAnd(&Type, &Val1, &Er)) return FALSE; - *ValType = Type; - *Val = Val1; - *Err = Er; - if (Er) return TRUE; - if (Type!=TypInteger) return TRUE; - - while (TRUE) { - P = LinePtr; - if (! GetOperator(&WId)) return TRUE; - - if (WId != RsvBXor) { - LinePtr = P; - return TRUE; - } - - if (! EvalBitAnd(&Type, &Val2, &Er)) { - *Err = ErrSyntax; - return TRUE; - } - - if (Er) { - *Err = Er; - return TRUE; - } - - if (Type!=TypInteger) { - *Err = ErrTypeMismatch; - return TRUE; - } - - Val1 = Val1 ^ Val2; - *Val = Val1; - } -} - -/* - * Precedence: 7 - * Evaluate following operator. - * | - */ -BOOL EvalBitOr(LPWORD ValType, int far *Val, LPWORD Err) -{ - WORD P, Type, Er; - int Val1, Val2; - WORD WId; - - if (! EvalBitXor(&Type, &Val1, &Er)) return FALSE; - *ValType = Type; - *Val = Val1; - *Err = Er; - if (Er) return TRUE; - if (Type!=TypInteger) return TRUE; - - while (TRUE) { - P = LinePtr; - if (! GetOperator(&WId)) return TRUE; - - if (WId != RsvBOr) { - LinePtr = P; - return TRUE; - } - - if (! EvalBitXor(&Type, &Val2, &Er)) { - *Err = ErrSyntax; - return TRUE; - } - - if (Er) { - *Err = Er; - return TRUE; - } - - if (Type!=TypInteger) { - *Err = ErrTypeMismatch; - return TRUE; - } - - Val1 = Val1 | Val2; - *Val = Val1; - } -} - -/* - * Precedence: 8 - * Evaluate following operator. - * <, >, <=, >= - */ -BOOL EvalGreater(LPWORD ValType, int far *Val, LPWORD Err) -{ - WORD P, Type, Er; - int Val1, Val2; - WORD WId; - - if (! EvalBitOr(&Type, &Val1, &Er)) return FALSE; - *ValType = Type; - *Val = Val1; - *Err = Er; - if (Er) return TRUE; - if (Type!=TypInteger) return TRUE; - - while (TRUE) { - P = LinePtr; - if (! GetOperator(&WId)) return TRUE; - - switch (WId) { - case RsvLT: - case RsvGT: - case RsvLE: - case RsvGE: - break; - default: - LinePtr = P; - return TRUE; - } - - if (! EvalBitOr(&Type, &Val2, &Er)) { - *Err = ErrSyntax; - return TRUE; - } - - if (Er) { - *Err = Er; - return TRUE; - } - - if (Type!=TypInteger) { - *Err = ErrTypeMismatch; - return TRUE; - } - - switch (WId) { - case RsvLT: Val1 = (Val1 <Val2); break; - case RsvGT: Val1 = (Val1 >Val2); break; - case RsvLE: Val1 = (Val1<=Val2); break; - case RsvGE: Val1 = (Val1>=Val2); break; - } - *Val = Val1; - } -} - -/* - * Precedence: 9 - * Evaluate following operator. - * =, ==, <>, != - */ -BOOL EvalEqual(LPWORD ValType, int far *Val, LPWORD Err) -{ - WORD P, Type, Er; - int Val1, Val2; - WORD WId; - - if (! EvalGreater(&Type, &Val1, &Er)) return FALSE; - *ValType = Type; - *Val = Val1; - *Err = Er; - if (Er) return TRUE; - if (Type!=TypInteger) return TRUE; - - while (TRUE) { - P = LinePtr; - if (! GetOperator(&WId)) return TRUE; - - switch (WId) { - case RsvEQ: - case RsvNE: - break; - default: - LinePtr = P; - return TRUE; - } - - if (! EvalGreater(&Type, &Val2, &Er)) { - *Err = ErrSyntax; - return TRUE; - } - - if (Er) { - *Err = Er; - return TRUE; - } - - if (Type!=TypInteger) { - *Err = ErrTypeMismatch; - return TRUE; - } - - switch (WId) { - case RsvEQ: Val1 = (Val1==Val2); break; - case RsvNE: Val1 = (Val1!=Val2); break; - } - *Val = Val1; - } -} - -/* - * Precedence: 10 - * Evaluate following operator. - * && - */ -BOOL EvalLogicalAnd(LPWORD ValType, int far *Val, LPWORD Err) -{ - WORD P, Type, Er; - int Val1, Val2; - WORD WId; - - if (! EvalEqual(&Type, &Val1, &Er)) return FALSE; - *ValType = Type; - *Val = Val1; - *Err = Er; - if (Er) return TRUE; - if (Type!=TypInteger) return TRUE; - - while (TRUE) { - P = LinePtr; - if (! GetOperator(&WId)) return TRUE; - - if (WId != RsvLAnd) { - LinePtr = P; - return TRUE; - } - - if (! EvalEqual(&Type, &Val2, &Er)) { - *Err = ErrSyntax; - return TRUE; - } - - if (Er) { - *Err = Er; - return TRUE; - } - - if (Type!=TypInteger) { - *Err = ErrTypeMismatch; - return TRUE; - } - - Val1 = Val1 && Val2; - *Val = Val1; - } -} - -/* - * Precedence: 11 - * Evaluate following operator. - * || - */ -BOOL GetExpression(LPWORD ValType, int far *Val, LPWORD Err) -{ - WORD P1, P2, Type, Er; - int Val1, Val2; - WORD WId; - - P1 = LinePtr; - if (! EvalLogicalAnd(&Type, &Val1, &Er)) { - LinePtr = P1; - return FALSE; - } - *ValType = Type; - *Val = Val1; - *Err = Er; - if (Er) { - LinePtr = P1; - return TRUE; - } - if (Type!=TypInteger) return TRUE; - - while (TRUE) { - P2 = LinePtr; - if (! GetOperator(&WId)) return TRUE; - - if (WId != RsvLOr && WId != RsvLXor) { - LinePtr = P2; - return TRUE; - } - - if (! EvalLogicalAnd(&Type, &Val2, &Er)) { - *Err = ErrSyntax; - LinePtr = P1; - return TRUE; - } - - if (Er) { - *Err = Er; - LinePtr = P1; - return TRUE; - } - - if (Type!=TypInteger) { - *Err = ErrTypeMismatch; - LinePtr = P1; - return TRUE; - } - - switch (WId) { - case RsvLOr: Val1 = Val1 || Val2; break; - case RsvLXor: Val1 = (Val1 && !Val2) || (!Val1 && Val2); break; - } - *Val = Val1; - } -} - -void GetIntVal(int far *Val, LPWORD Err) -{ - WORD ValType; - - UpdateLineParsePtr(); - - if (*Err != 0) return; - if (! GetExpression(&ValType,Val,Err)) - { - *Err = ErrSyntax; - return; - } - if (*Err!=0) return; - if (ValType!=TypInteger) - *Err = ErrTypeMismatch; -} - -void SetIntVal(TVarId VarId, int Val) -{ - if (VarId >> 16) { - Variable_t *v = &Variables[(VarId>>16)-1]; - int *int_val = &v->Value.IntAry.val[VarId & 0xffff]; - *int_val = Val; - } - else { - Variable_t *v = &Variables[VarId]; - v->Value.Int = Val; - } -} - -int CopyIntVal(TVarId VarId) -{ - Variable_t *v; - if (VarId >> 16) { - v = &Variables[(VarId>>16)-1]; - return v->Value.IntAry.val[VarId & 0xffff]; - } - else { - v = &Variables[VarId]; - return v->Value.Int; - } -} - -void GetIntVar(PVarId VarId, LPWORD Err) -{ - TName Name; - WORD VarType; - int Index; - - if (*Err!=0) return; - - if (GetIdentifier(Name)) { - if (CheckVar(Name, &VarType, VarId)) { - switch (VarType) { - case TypInteger: - break; - case TypIntArray: - if (GetIndex(&Index, Err)) { - *VarId = GetIntVarFromArray(*VarId, Index, Err); - } - else if (*Err == 0) { - *Err = ErrTypeMismatch; - } - break; - default: - *Err = ErrTypeMismatch; - } - } - else { - if (NewIntVar(Name, 0)) - CheckVar(Name, &VarType, VarId); - else - *Err = ErrTooManyVar; - } - } - else - *Err = ErrSyntax; -} - -void GetStrVal(PCHAR Str, LPWORD Err) -{ - UpdateLineParsePtr(); - GetStrVal2(Str, Err, FALSE); -} - -void GetStrVal2(PCHAR Str, LPWORD Err, BOOL AutoConversion) -{ - WORD VarType; - int VarId; - - Str[0] = 0; - if (*Err!=0) return; - - if (GetString(Str, Err)) - return; - else if (GetExpression(&VarType, &VarId, Err)) { - if (*Err!=0) return; - switch (VarType) { - case TypString: - strncpy_s(Str, MaxStrLen, StrVarPtr((TVarId)VarId), _TRUNCATE); - break; - case TypInteger: - if (AutoConversion) - _snprintf_s(Str, MaxStrLen, _TRUNCATE, "%d", VarId); - else - *Err = ErrTypeMismatch; - break; - default: - *Err = ErrTypeMismatch; - } - } - else - *Err = ErrSyntax; -} - -void GetStrVar(PVarId VarId, LPWORD Err) -{ - TName Name; - WORD VarType; - int Index; - - if (*Err!=0) return; - - if (GetIdentifier(Name)) { - if (CheckVar(Name, &VarType, VarId)) { - switch (VarType) { - case TypString: - break; - case TypStrArray: - if (GetIndex(&Index, Err)) { - *VarId = GetStrVarFromArray(*VarId, Index, Err); - } - else if (*Err == 0) { - *Err = ErrTypeMismatch; - } - break; - default: - *Err = ErrTypeMismatch; - } - } - else { - if (NewStrVar(Name, "")) - CheckVar(Name, &VarType, VarId); - else - *Err = ErrTooManyVar; - } - } - else - *Err = ErrSyntax; -} - -void SetStrVal(TVarId VarId, const char *Str) -{ - if (VarId >> 16) { - Variable_t *v = &Variables[(VarId>>16)-1]; - char **str = &v->Value.StrAry.val[VarId & 0xffff]; - free(*str); - *str = strdup(Str); - } - else { - Variable_t *v = &Variables[VarId]; - char **str = &v->Value.Str; - free(*str); - *str = strdup(Str); - } -} - -const char *StrVarPtr(TVarId VarId) -{ - Variable_t *v; - if (VarId >> 16) { - v = &Variables[(VarId>>16)-1]; - return v->Value.StrAry.val[VarId & 0xffff]; - } - else { - v = &Variables[VarId]; - return v->Value.Str; - } -} - -// for ifdefined (2006.9.23 maya) -void GetVarType(LPWORD ValType, int far *Val, LPWORD Err) -{ - TName Name; - WORD WId; - TVarId VarId; - int Index; - - if (GetIdentifier(Name)) { - if (CheckReservedWord(Name,&WId)) { - *ValType = TypUnknown; - } - else { - CheckVar(Name, ValType, &VarId); - switch (*ValType) { - case TypIntArray: - if (GetIndex(&Index, Err)) { - TIntAry *intAry = &Variables[VarId].Value.IntAry; - if (Index >= 0 && Index < intAry->size) { - *ValType = TypInteger; - } - else { - *ValType = TypUnknown; - } - } - break; - case TypStrArray: - if (GetIndex(&Index, Err)) { - VarId = GetStrVarFromArray(VarId, Index, Err); - if (*Err == 0) { - *ValType = TypString; - } - else { - *ValType = TypUnknown; - } - } - break; - } - } - } - else { - *ValType = TypUnknown; - } - - *Err = 0; -} - -BOOL GetIndex(int *Index, LPWORD Err) -{ - WORD P; - int Idx; - - *Err = 0; - P = LinePtr; - if (GetFirstChar() == '[') { - GetIntVal(&Idx, Err); - if (*Err == 0) { - if (GetFirstChar() == ']') { - *Index = Idx; - return TRUE; - } - *Err = ErrCloseBracket; - } - } - LinePtr = P; - return FALSE; -} - -TVarId GetIntVarFromArray(TVarId VarId, int Index, LPWORD Err) -{ - TIntAry *intAry = &Variables[VarId].Value.IntAry; - if (Index < 0 || Index >= intAry->size) { - *Err = ErrOutOfRange; - return -1; - } - *Err = 0; - return ((VarId+1) << 16) | Index; -} - -TVarId GetStrVarFromArray(TVarId VarId, int Index, LPWORD Err) -{ - TStrAry *strAry = &Variables[VarId].Value.StrAry; - if (Index < 0 || Index >= strAry->size) { - *Err = ErrOutOfRange; - return -1; - } - *Err = 0; - return ((VarId+1) << 16) | Index; -} - -void GetAryVar(PVarId VarId, WORD VarType, LPWORD Err) -{ - TName Name; - - if (*Err!=0) return; - - if (GetIdentifier(Name)) { - GetAryVarByName(VarId, Name, VarType, Err); - } - else { - *Err = ErrSyntax; - } -} - -void GetAryVarByName(PVarId VarId, const char *Name, WORD VarType, LPWORD Err) -{ - WORD typ; - - if (CheckVar(Name, &typ, VarId)) { - if (typ != VarType) { - *Err = ErrTypeMismatch; - } - } - else { - *Err = ErrVarNotInit; - } -} - -void SetIntValInArray(TVarId VarId, int Index, int Val, LPWORD Err) -{ - TVarId id; - - id = GetIntVarFromArray(VarId, Index, Err); - if (*Err == 0) { - SetIntVal(id, Val); - } -} - -void SetStrValInArray(TVarId VarId, int Index, PCHAR Str, LPWORD Err) -{ - TVarId id; - - id = GetStrVarFromArray(VarId, Index, Err); - if (*Err == 0) { - SetStrVal(id, Str); - } -} - -int GetIntAryVarSize(TVarId VarId) -{ - TIntAry *intAry = &Variables[VarId].Value.IntAry; - return intAry->size; -} - -int GetStrAryVarSize(TVarId VarId) -{ - TIntAry *strAry = &Variables[VarId].Value.IntAry; - return strAry->size; -} Copied: trunk/teraterm/ttpmacro/ttmparse.cpp (from rev 8706, trunk/teraterm/ttpmacro/ttmparse.c) =================================================================== --- trunk/teraterm/ttpmacro/ttmparse.cpp (rev 0) +++ trunk/teraterm/ttpmacro/ttmparse.cpp 2020-04-11 15:56:35 UTC (rev 8707) @@ -0,0 +1,1950 @@ +/* + * Copyright (C) 1994-1998 T. Teranishi + * (C) 2005-2020 TeraTerm Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +// TTMACRO.EXE, TTL parser + +#include "teraterm.h" +#include <string.h> +#include <stdio.h> +#include <ctype.h> +#if !defined(_CRTDBG_MAP_ALLOC) +#define _CRTDBG_MAP_ALLOC +#endif +#include <stdlib.h> +#include <crtdbg.h> +#include "ttmdlg.h" +#include "ttmparse.h" +#include "ttmbuff.h" + +/* C\x8C\xBE\x8C\xEA\x83X\x83^\x83C\x83\x8B\x82̃R\x83\x81\x83\x93\x83g\x82\xF0\x83T\x83|\x81[\x83g\x82\xB7\x82邩\x82ǂ\xA4\x82\xA9 (2009.7.2 yutaka) */ +#define SUPPORT_C_STYLE_COMMENT +static int commenting = 0; /* C\x8C\xBE\x8C\xEA\x83R\x83\x81\x83\x93\x83g */ + +WORD TTLStatus = 0; +char LineBuff[MaxLineLen]; // \x8Ds\x83o\x83b\x83t\x83@\x82̃T\x83C\x83Y\x82\xF0\x8Ag\x92\xA3\x82\xB5\x82\xBD\x81B(2007.6.9 maya) +WORD LinePtr; +WORD LineLen; +WORD LineParsePtr; // \x83g\x81[\x83N\x83\x93\x82̉\xF0\x90͂\xF0\x8AJ\x8En\x82\xB5\x82\xBD\x88ʒu (2013.6.23 yutaka) + +typedef struct { + int size; + int *val; +} TIntAry, *PIntAry; + +typedef struct { + int size; +// PStrVal val; + char **val; +} TStrAry, *PStrAry; + +typedef struct { + BINT val; + WORD level; +} TLab; + +typedef enum { + TypeUnknown = TypUnknown, + TypeInteger = TypInteger, + //TypeLogical = TypLogical, + TypeString = TypString, + TypeLabel = TypLabel, + TypeIntArray = TypIntArray, + TypeStrArray = TypStrArray, +} VariableType_t; + +typedef struct { + char *Name; + VariableType_t Type; + union { + char *Str; + int Int; + TLab Lab; + TIntAry IntAry; + TStrAry StrAry; + } Value; +} Variable_t; + +static Variable_t *Variables; +static int VariableCount; + +// \x83g\x81[\x83N\x83\x93\x82̉\xF0\x90͊J\x8En\x88ʒu\x82\xF0\x8DX\x90V\x82\xB7\x82\xE9\x81B +static void UpdateLineParsePtr(void) +{ + LineParsePtr = LinePtr; +} + + +BOOL InitVar() +{ + Variables = NULL; + VariableCount = 0; + return TRUE; +} + +void EndVar() +{ + Variable_t *v = Variables; + for (;v != &Variables[VariableCount]; v++) { + free(v->Name); + switch (v->Type) { + case TypeString: + free(v->Value.Str); + break; + case TypeIntArray: + free(v->Value.IntAry.val); + break; + case TypeStrArray: + free(v->Value.StrAry.val); + break; + default: + break; + } + } + free(Variables); + Variables = NULL; + VariableCount = 0; +} + +void DispErr(WORD Err) +{ + const char *Msg; + int i; + int no, start, end; + char *filename; + + switch (Err) { + case ErrCloseParent: Msg = "\")\" expected."; break; + case ErrCantCall: Msg = "Can't call sub."; break; + case ErrCantConnect: Msg = "Can't link macro."; break; + case ErrCantOpen: Msg = "Can't open file."; break; + case ErrDivByZero: Msg = "Divide by zero."; break; + case ErrInvalidCtl: Msg = "Invalid control."; break; + case ErrLabelAlreadyDef: Msg = "Label already defined."; break; + case ErrLabelReq: Msg = "Label requiered."; break; + case ErrLinkFirst: Msg = "Link macro first. Use 'connect' macro."; break; + case ErrStackOver: Msg = "Stack overflow."; break; + case ErrSyntax: Msg = "Syntax error."; break; + case ErrTooManyLabels: Msg = "Too many labels."; break; + case ErrTooManyVar: Msg = "Too many variables."; break; + case ErrTypeMismatch: Msg = "Type mismatch."; break; + case ErrVarNotInit: Msg = "Variable not initialized."; break; + case ErrCloseComment: Msg = "\"*/\" expected."; break; + case ErrOutOfRange: Msg = "Index out of range."; break; + case ErrCloseBracket: Msg = "\"]\" expected."; break; + case ErrFewMemory: Msg = "Can't allocate memory."; break; + case ErrNotSupported: Msg = "Unknown command."; break; + case ErrCantExec: Msg = "Can't execute command."; break; + default: Msg = "Unknown error message number."; break; + }; + + no = GetLineNo(); + start = LineParsePtr; + end = LinePtr; + if (start == end) + end = LineLen; + + filename = GetMacroFileName(); + + i = OpenErrDlg(Msg, LineBuff, no, start, end, filename); + if (i==IDOK) TTLStatus = IdTTLEnd; +} + +void LockVar() +{ +} + +void UnlockVar() +{ +} + +BOOL CheckReservedWord(PCHAR Str, LPWORD WordId) +{ + *WordId = 0; + + switch (Str[0] | 0x20) { // to lower-case + case 'a': + if (_stricmp(Str,"and")==0) *WordId = RsvBAnd; + break; + case 'b': + if (_stricmp(Str,"beep")==0) *WordId = RsvBeep; + else if (_stricmp(Str,"bplusrecv")==0) *WordId = RsvBPlusRecv; + else if (_stricmp(Str,"bplussend")==0) *WordId = RsvBPlusSend; + else if (_stricmp(Str,"break")==0) *WordId = RsvBreak; + else if (_stricmp(Str,"bringupbox")==0) *WordId = RsvBringupBox; + else if (_stricmp(Str,"basename")==0) *WordId = RsvBasename; + break; + case 'c': + if (_stricmp(Str,"call")==0) *WordId = RsvCall; + else if (_stricmp(Str,"callmenu")==0) *WordId = RsvCallMenu; + else if (_stricmp(Str,"changedir")==0) *WordId = RsvChangeDir; + else if (_stricmp(Str,"checksum8")==0) *WordId = RsvChecksum8; + else if (_stricmp(Str,"checksum8file")==0) *WordId = RsvChecksum8File; + else if (_stricmp(Str,"checksum16")==0) *WordId = RsvChecksum16; + else if (_stricmp(Str,"checksum16file")==0) *WordId = RsvChecksum16File; + else if (_stricmp(Str,"checksum32")==0) *WordId = RsvChecksum32; + else if (_stricmp(Str,"checksum32file")==0) *WordId = RsvChecksum32File; + else if (_stricmp(Str,"clearscreen")==0) *WordId = RsvClearScreen; + else if (_stricmp(Str,"clipb2var")==0) *WordId = RsvClipb2Var; // add 'clipb2var' (2006.9.17 maya) + else if (_stricmp(Str,"closesbox")==0) *WordId = RsvCloseSBox; + else if (_stricmp(Str,"closett")==0) *WordId = RsvCloseTT; + else if (_stricmp(Str,"code2str")==0) *WordId = RsvCode2Str; + else if (_stricmp(Str,"connect")==0) *WordId = RsvConnect; + else if (_stricmp(Str,"continue")==0) *WordId = RsvContinue; + else if (_stricmp(Str,"crc16")==0) *WordId = RsvCrc16; + else if (_stricmp(Str,"crc16file")==0) *WordId = RsvCrc16File; + else if (_stricmp(Str,"crc32")==0) *WordId = RsvCrc32; + else if (_stricmp(Str,"crc32file")==0) *WordId = RsvCrc32File; + else if (_stricmp(Str,"cygconnect")==0) *WordId = RsvCygConnect; + break; + case 'd': + if (_stricmp(Str,"delpassword")==0) *WordId = RsvDelPassword; + else if (_stricmp(Str,"disconnect")==0) *WordId = RsvDisconnect; + else if (_stricmp(Str,"dispstr")==0) *WordId = RsvDispStr; + else if (_stricmp(Str,"do")==0) *WordId = RsvDo; + else if (_stricmp(Str,"dirname")==0) *WordId = RsvDirname; + else if (_stricmp(Str, "dirnamebox") == 0) *WordId = RsvDirnameBox; + break; + case 'e': + if (_stricmp(Str,"else")==0) *WordId = RsvElse; + else if (_stricmp(Str,"elseif")==0) *WordId = RsvElseIf; + else if (_stricmp(Str,"enablekeyb")==0) *WordId = RsvEnableKeyb; + else if (_stricmp(Str,"end")==0) *WordId = RsvEnd; + else if (_stricmp(Str,"endif")==0) *WordId = RsvEndIf; + else if (_stricmp(Str,"enduntil")==0) *WordId = RsvEndUntil; + else if (_stricmp(Str,"endwhile")==0) *WordId = RsvEndWhile; + else if (_stricmp(Str,"exec")==0) *WordId = RsvExec; + else if (_stricmp(Str,"execcmnd")==0) *WordId = RsvExecCmnd; + else if (_stricmp(Str,"exit")==0) *WordId = RsvExit; + else if (_stricmp(Str,"expandenv")==0) *WordId = RsvExpandEnv; + break; + case 'f': + if (_stricmp(Str,"fileclose")==0) *WordId = RsvFileClose; + else if (_stricmp(Str,"fileconcat")==0) *WordId = RsvFileConcat; + else if (_stricmp(Str,"filecopy")==0) *WordId = RsvFileCopy; + else if (_stricmp(Str,"filecreate")==0) *WordId = RsvFileCreate; + else if (_stricmp(Str,"filedelete")==0) *WordId = RsvFileDelete; + else if (_stricmp(Str,"filelock")==0) *WordId = RsvFileLock; + else if (_stricmp(Str,"filemarkptr")==0) *WordId = RsvFileMarkPtr; + else if (_stricmp(Str,"filenamebox")==0) *WordId = RsvFilenameBox; // add 'filenamebox' (2007.9.13 maya) + else if (_stricmp(Str,"fileopen")==0) *WordId = RsvFileOpen; + else if (_stricmp(Str,"filereadln")==0) *WordId = RsvFileReadln; + else if (_stricmp(Str,"fileread")==0) *WordId = RsvFileRead; // add + else if (_stricmp(Str,"filerename")==0) *WordId = RsvFileRename; + else if (_stricmp(Str,"filesearch")==0) *WordId = RsvFileSearch; + else if (_stricmp(Str,"fileseek")==0) *WordId = RsvFileSeek; + else if (_stricmp(Str,"fileseekback")==0) *WordId = RsvFileSeekBack; + else if (_stricmp(Str,"filestat")==0) *WordId = RsvFileStat; + else if (_stricmp(Str,"filestrseek")==0) *WordId = RsvFileStrSeek; + else if (_stricmp(Str,"filestrseek2")==0) *WordId = RsvFileStrSeek2; + else if (_stricmp(Str,"filetruncate")==0) *WordId = RsvFileTruncate; + else if (_stricmp(Str,"fileunlock")==0) *WordId = RsvFileUnLock; + else if (_stricmp(Str,"filewrite")==0) *WordId = RsvFileWrite; + else if (_stricmp(Str,"filewriteln")==0) *WordId = RsvFileWriteLn; + else if (_stricmp(Str,"findclose")==0) *WordId = RsvFindClose; + else if (_stricmp(Str,"findfirst")==0) *WordId = RsvFindFirst; + else if (_stricmp(Str,"findnext")==0) *WordId = RsvFindNext; + else if (_stricmp(Str,"flushrecv")==0) *WordId = RsvFlushRecv; + else if (_stricmp(Str,"foldercreate")==0) *WordId = RsvFolderCreate; + else if (_stricmp(Str,"folderdelete")==0) *WordId = RsvFolderDelete; + else if (_stricmp(Str,"foldersearch")==0) *WordId = RsvFolderSearch; + else if (_stricmp(Str,"for")==0) *WordId = RsvFor; + break; + case 'g': + if (_stricmp(Str,"getdate")==0) *WordId = RsvGetDate; + else if (_stricmp(Str,"getdir")==0) *WordId = RsvGetDir; + else if (_stricmp(Str,"getenv")==0) *WordId = RsvGetEnv; + else if (_stricmp(Str,"getfileattr")==0) *WordId = RsvGetFileAttr; + else if (_stricmp(Str,"gethostname")==0) *WordId = RsvGetHostname; + else if (_stricmp(Str,"getipv4addr")==0) *WordId = RsvGetIPv4Addr; + else if (_stricmp(Str,"getipv6addr")==0) *WordId = RsvGetIPv6Addr; + else if (_stricmp(Str,"getmodemstatus") == 0) *WordId = RsvGetModemStatus; + else if (_stricmp(Str,"getpassword")==0) *WordId = RsvGetPassword; + else if (_stricmp(Str,"getspecialfolder")==0) *WordId = RsvGetSpecialFolder; + else if (_stricmp(Str,"gettime")==0) *WordId = RsvGetTime; + else if (_stricmp(Str,"gettitle")==0) *WordId = RsvGetTitle; + else if (_stricmp(Str,"getttdir")==0) *WordId = RsvGetTTDir; + else if (_stricmp(Str,"getver")==0) *WordId = RsvGetVer; + else if (_stricmp(Str,"goto")==0) *WordId = RsvGoto; + break; + case 'i': + if (_stricmp(Str,"if")==0) *WordId = RsvIf; + else if (_stricmp(Str,"ifdefined")==0) *WordId = RsvIfDefined; + else if (_stricmp(Str,"include")==0) *WordId = RsvInclude ; + else if (_stricmp(Str,"inputbox")==0) *WordId = RsvInputBox; + else if (_stricmp(Str,"int2str")==0) *WordId = RsvInt2Str; + else if (_stricmp(Str,"intdim")==0) *WordId = RsvIntDim; + else if (_stricmp(Str,"ispassword")==0) *WordId = RsvIsPassword; // add 'ispassword' (2012.5.24 yutaka) + break; + case 'k': + if (_stricmp(Str,"kmtfinish")==0) *WordId = RsvKmtFinish; + else if (_stricmp(Str,"kmtget")==0) *WordId = RsvKmtGet; + else if (_stricmp(Str,"kmtrecv")==0) *WordId = RsvKmtRecv; + else if (_stricmp(Str,"kmtsend")==0) *WordId = RsvKmtSend; + break; + case 'l': + if (_stricmp(Str,"listbox")==0) *WordId = RsvListBox; + else if (_stricmp(Str,"loadkeymap")==0) *WordId = RsvLoadKeyMap; + else if (_stricmp(Str,"logautoclosemode")==0) *WordId = RsvLogAutoClose; + else if (_stricmp(Str,"logclose")==0) *WordId = RsvLogClose; + else if (_stricmp(Str,"loginfo")==0) *WordId = RsvLogInfo; + else if (_stricmp(Str,"logopen")==0) *WordId = RsvLogOpen; + else if (_stricmp(Str,"logpause")==0) *WordId = RsvLogPause; + else if (_stricmp(Str,"logrotate")==0) *WordId = RsvLogRotate; + else if (_stricmp(Str,"logstart")==0) *WordId = RsvLogStart; + else if (_stricmp(Str,"logwrite")==0) *WordId = RsvLogWrite; + else if (_stricmp(Str,"loop")==0) *WordId = RsvLoop; + break; + case 'm': + if (_stricmp(Str,"makepath")==0) *WordId = RsvMakePath; + else if (_stricmp(Str,"messagebox")==0) *WordId = RsvMessageBox; + else if (_stricmp(Str,"mpause")==0) *WordId = RsvMilliPause; + break; + case 'n': + if (_stricmp(Str,"next")==0) *WordId = RsvNext; + else if (_stricmp(Str,"not")==0) *WordId = RsvBNot; + break; + case 'o': + if (_stricmp(Str,"or")==0) *WordId = RsvBOr; + break; + case 'p': + if (_stricmp(Str,"passwordbox")==0) *WordId = RsvPasswordBox; + else if (_stricmp(Str,"pause")==0) *WordId = RsvPause; + break; + case 'q': + if (_stricmp(Str,"quickvanrecv")==0) *WordId = RsvQuickVANRecv; + else if (_stricmp(Str,"quickvansend")==0) *WordId = RsvQuickVANSend; + break; + case 'r': + if (_stricmp(Str,"random")==0) *WordId = RsvRandom; // add 'random' (2006.2.11 yutaka) + else if (_stricmp(Str,"recvln")==0) *WordId = RsvRecvLn; + else if (_stricmp(Str,"regexoption")==0) *WordId = RsvRegexOption; + else if (_stricmp(Str,"restoresetup")==0) *WordId = RsvRestoreSetup; + else if (_stricmp(Str,"return")==0) *WordId = RsvReturn; + else if (_stricmp(Str,"rotateleft")==0) *WordId = RsvRotateL; // add 'rotateleft' (2007.8.19 maya) + else if (_stricmp(Str,"rotateright")==0) *WordId = RsvRotateR; // add 'rotateright' (2007.8.19 maya) + break; + case 's': + if (_stricmp(Str,"scprecv")==0) *WordId = RsvScpRecv; // add 'scprecv' (2008.1.1 yutaka) + else if (_stricmp(Str,"scpsend")==0) *WordId = RsvScpSend; // add 'scpsend' (2008.1.1 yutaka) + else if (_stricmp(Str,"send")==0) *WordId = RsvSend; + else if (_stricmp(Str,"sendbreak")==0) *WordId = RsvSendBreak; + else if (_stricmp(Str,"sendbroadcast")==0) *WordId = RsvSendBroadcast; + else if (_stricmp(Str,"sendlnbroadcast")==0) *WordId = RsvSendlnBroadcast; + else if (_stricmp(Str,"sendlnmulticast")==0) *WordId = RsvSendlnMulticast; + else if (_stricmp(Str,"sendmulticast")==0) *WordId = RsvSendMulticast; + else if (_stricmp(Str,"setfileattr")==0) *WordId = RsvSetFileAttr; + else if (_stricmp(Str,"setmulticastname")==0) *WordId = RsvSetMulticastName; + else if (_stricmp(Str,"sendfile")==0) *WordId = RsvSendFile; + else if (_stricmp(Str,"sendkcode")==0) *WordId = RsvSendKCode; + else if (_stricmp(Str,"sendln")==0) *WordId = RsvSendLn; + else if (_stricmp(Str,"setbaud")==0) *WordId = RsvSetBaud; + else if (_stricmp(Str,"setdate")==0) *WordId = RsvSetDate; + else if (_stricmp(Str,"setdebug")==0) *WordId = RsvSetDebug; + else if (_stricmp(Str,"setdir")==0) *WordId = RsvSetDir; + else if (_stricmp(Str,"setdlgpos")==0) *WordId = RsvSetDlgPos; + else if (_stricmp(Str,"setdtr")==0) *WordId = RsvSetDtr; // add 'setdtr' (2008.3.12 maya) + else if (_stricmp(Str,"setecho")==0) *WordId = RsvSetEcho; + else if (_stricmp(Str,"setenv")==0) *WordId = RsvSetEnv; // reactivate 'setenv' (2007.8.31 maya) + else if (_stricmp(Str,"setexitcode")==0) *WordId = RsvSetExitCode; + else if (_stricmp(Str,"setflowctrl")==0) *WordId = RsvSetFlowCtrl; + else if (_stricmp(Str,"setpassword")==0) *WordId = RsvSetPassword; // add 'setpassword' (2012.5.23 yutaka) + else if (_stricmp(Str,"setrts")==0) *WordId = RsvSetRts; // add 'setrts' (2008.3.12 maya) + else if (_stricmp(Str,"setspeed")==0) *WordId = RsvSetBaud; + else if (_stricmp(Str,"setsync")==0) *WordId = RsvSetSync; + else if (_stricmp(Str,"settime")==0) *WordId = RsvSetTime; + else if (_stricmp(Str,"settitle")==0) *WordId = RsvSetTitle; + else if (_stricmp(Str,"show")==0) *WordId = RsvShow; + else if (_stricmp(Str,"showtt")==0) *WordId = RsvShowTT; + else if (_stricmp(Str,"sprintf")==0) *WordId = RsvSprintf; // add 'sprintf' (2007.5.1 yutaka) + else if (_stricmp(Str,"sprintf2")==0) *WordId = RsvSprintf2; // add 'sprintf2' (2008.12.18 maya) + else if (_stricmp(Str,"statusbox")==0) *WordId = RsvStatusBox; + else if (_stricmp(Str,"str2code")==0) *WordId = RsvStr2Code; + else if (_stricmp(Str,"str2int")==0) *WordId = RsvStr2Int; + else if (_stricmp(Str,"strcompare")==0) *WordId = RsvStrCompare; + else if (_stricmp(Str,"strconcat")==0) *WordId = RsvStrConcat; + else if (_stricmp(Str,"strcopy")==0) *WordId = RsvStrCopy; + else if (_stricmp(Str,"strdim")==0) *WordId = RsvStrDim; + else if (_stricmp(Str,"strinsert")==0) *WordId = RsvStrInsert; + else if (_stricmp(Str,"strjoin")==0) *WordId = RsvStrJoin; + else if (_stricmp(Str,"strlen")==0) *WordId = RsvStrLen; + else if (_stricmp(Str,"strmatch")==0) *WordId = RsvStrMatch; + else if (_stricmp(Str,"strremove")==0) *WordId = RsvStrRemove; + else if (_stricmp(Str,"strreplace")==0) *WordId = RsvStrReplace; + else if (_stricmp(Str,"strscan")==0) *WordId = RsvStrScan; + else if (_stricmp(Str,"strspecial")==0) *WordId = RsvStrSpecial; + else if (_stricmp(Str,"strsplit")==0) *WordId = RsvStrSplit; + else if (_stricmp(Str,"strtrim")==0) *WordId = RsvStrTrim; + break; + case 't': + if (_stricmp(Str,"testlink")==0) *WordId = RsvTestLink; + else if (_stricmp(Str,"then")==0) *WordId = RsvThen; + else if (_stricmp(Str,"tolower")==0) *WordId = RsvToLower; // add 'tolower' (2007.7.12 maya) + else if (_stricmp(Str,"toupper")==0) *WordId = RsvToUpper; // add 'toupper' (2007.7.12 maya) + break; + case 'u': + if (_stricmp(Str,"unlink")==0) *WordId = RsvUnlink; + else if (_stricmp(Str,"until")==0) *WordId = RsvUntil; + else if (_stricmp(Str,"uptime")==0) *WordId = RsvUptime; + break; + case 'v': + if (_stricmp(Str,"var2clipb")==0) *WordId = RsvVar2Clipb; // add 'var2clipb' (2006.9.17 maya) + break; + case 'w': + if (_stricmp(Str,"waitregex")==0) *WordId = RsvWaitRegex; // add 'waitregex' (2005.10.5 yutaka) + else if (_stricmp(Str,"wait")==0) *WordId = RsvWait; + else if (_stricmp(Str,"wait4all")==0) *WordId = RsvWait4all; + else if (_stricmp(Str,"waitevent")==0) *WordId = RsvWaitEvent; + else if (_stricmp(Str,"waitln")==0) *WordId = RsvWaitLn; + else if (_stricmp(Str,"waitn")==0) *WordId = RsvWaitN; // add 'waitn' (2009.1.26 maya) + else if (_stricmp(Str,"waitrecv")==0) *WordId = RsvWaitRecv; + else if (_stricmp(Str,"while")==0) *WordId = RsvWhile; + break; + case 'x': + if (_stricmp(Str,"xmodemrecv")==0) *WordId = RsvXmodemRecv; + else if (_stricmp(Str,"xmodemsend")==0) *WordId = RsvXmodemSend; + else if (_stricmp(Str,"xor")==0) *WordId = RsvBXor; + break; + case 'y': + if (_stricmp(Str,"yesnobox")==0) *WordId = RsvYesNoBox; + else if (_stricmp(Str,"ymodemrecv")==0) *WordId = RsvYmodemRecv; + else if (_stricmp(Str,"ymodemsend")==0) *WordId = RsvYmodemSend; + break; + case 'z': + if (_stricmp(Str,"zmodemrecv")==0) *WordId = RsvZmodemRecv; + else if (_stricmp(Str,"zmodemsend")==0) *WordId = RsvZmodemSend; + break; + default: + ; /* nothing to do */ + } + + return (*WordId!=0); +} + +/* C\x8C\xBE\x8C\xEA\x83R\x83\x81\x83\x93\x83g\x82\xAA\x95\xB6\x82\xE7\x82\xEA\x82Ă\xA2\x82邩\x82ǂ\xA4\x82\xA9 */ +int IsCommentClosed(void) +{ +#ifdef SUPPORT_C_STYLE_COMMENT + int ret = (commenting == 0); + + /* \x83R\x83\x81\x83\x93\x83g\x82\xAA\x8En\x82܂\xE9\x8E\xE8\x91O\x82܂ł̃R\x83}\x83\x93\x83h\x82\xF0\x8E\xC0\x8Ds\x82ł\xAB\x82\xE9\x82悤\x82ɂ\xB7\x82邽\x82߁A + * \x93\xE0\x95\x94\x83t\x83\x89\x83O\x82̓N\x83\x8A\x83A\x82\xB5\x82Ă\xA8\x82\xAD\x81B + */ + commenting = 0; + return (ret); +#else + // \x93\x96\x8AY\x8B@\x94\\x82\xAA\x96\xB3\x8C\xF8\x82̏ꍇ\x82́A\x8F\xED\x82Ɂu\x90^\x81v\x82\xF0\x95Ԃ\xB7\x81B + return 1; +#endif +} + +BYTE GetFirstChar() +{ + BYTE b; + int comment_starting = 0; + + if (LinePtr<LineLen) + b = LineBuff[LinePtr]; + else return 0; + + while ((LinePtr<LineLen) && ((b==' ') || (b=='\t'))) + { + LinePtr++; + if (LinePtr<LineLen) b = LineBuff[LinePtr]; + } + +#ifdef SUPPORT_C_STYLE_COMMENT + if (commenting) { + while (LinePtr < LineLen) { + /* \x83R\x83\x81\x83\x93\x83g\x82̏I\x82\xED\x82肪\x8Fo\x82Ă\xAD\x82\xE9\x82܂ŃX\x83L\x83b\x83v */ + if (LineBuff[LinePtr] == '*' && LineBuff[LinePtr + 1] == '/') { + commenting = 0; + LinePtr += 2; + break; + } + LinePtr++; + } + /* \x88\xEA\x8Ds\x82ɃR\x83\x81\x83\x93\x83g\x82̏I\x82\xED\x82肪\x82Ȃ\xA9\x82\xC1\x82\xBD\x82\xE7\x81A\x8E\x9F\x82̍s\x82\xF0\x93ǂށB*/ + if (commenting) + return 0; // next line + + if (LinePtr < LineLen) + b = LineBuff[LinePtr]; + else + b = 0; + + while ((LinePtr<LineLen) && ((b==' ') || (b=='\t'))) + { + LinePtr++; + if (LinePtr<LineLen) b = LineBuff[LinePtr]; + } + } + + /* C\x8C\xBE\x8C\xEA\x83R\x83\x81\x83\x93\x83g\x82̎n\x82܂\xE8 */ + do { + if (LineBuff[LinePtr] == '/' && LineBuff[LinePtr + 1] == '*') { + comment_starting = 1; + LinePtr += 2; + while (LinePtr < LineLen) { + /* \x83R\x83\x81\x83\x93\x83g\x82̏I\x82\xED\x82肪\x8Fo\x82Ă\xAD\x82\xE9\x82܂ŃX\x83L\x83b\x83v */ + if (LineBuff[LinePtr] == '*' && LineBuff[LinePtr + 1] == '/') { + LinePtr += 2; + comment_starting = 0; + break; + } + LinePtr++; + } + + if (LinePtr < LineLen) + b = LineBuff[LinePtr]; + else + b = 0; + + while ((LinePtr<LineLen) && ((b==' ') || (b=='\t'))) + { + LinePtr++; + if (LinePtr<LineLen) b = LineBuff[LinePtr]; + } + + /* \x83R\x83\x81\x83\x93\x83g\x82̏I\x82\xED\x82肪\x88\xEA\x8Ds\x82ɓo\x8Fꂵ\x82Ȃ\xA2\x8Fꍇ\x82́A\x89i\x91\xB1\x93I\x82ɋL\x98^\x82\xB7\x82\xE9\x81B*/ + if (comment_starting) + commenting = 1; + } + else { + break; + } + + /* 1\x82̍s\x82ɁA\x95\xA1\x90\x94\x82̃R\x83\x81\x83\x93\x83g\x82\xAA\x82\xA0\x82\xE9\x8Fꍇ\x82ɑΉ\x9E\x82\xB7\x82邽\x82߁A\x8E\x9F\x82̕\xB6\x8E\x9A\x82\xAA\x83X\x83\x89\x83b\x83V\x83\x85\x82Ȃ\xE7\x82A + * \x83\x8B\x81[\x83v\x8F\x88\x97\x9D\x82̎n\x82߂ɖ߂\xB7\x81B + */ + } while (b == '/'); +#endif + + if ((b>' ') && (b!=';')) + { + LinePtr++; + return b; + } + return 0; +} + +BOOL CheckParameterGiven() +{ + WORD P; + + P = LinePtr; + + if (GetFirstChar()) { + LinePtr = P; + return TRUE; + } + else { + LinePtr = P; + return FALSE; + } +} + +BOOL GetIdentifier(PCHAR Name) +{ + int i; + BYTE b; + + memset(Name,0,MaxNameLen); + + b = GetFirstChar(); + if (b==0) return FALSE; + + // Check first character of identifier + if (! __iscsymf(b)) { // [^A-Za-z_] + LinePtr--; + return FALSE; + } + + Name[0] = b; + i = 1; + + if (LinePtr<LineLen) b = LineBuff[LinePtr]; + while ((LinePtr<LineLen) && __iscsym(b)) { // [0-9A-Za-z_] + if (i<MaxNameLen-1) + { + Name[i] = b; + i++; + } + LinePtr++; + if (LinePtr<LineLen) b = LineBuff[LinePtr]; + } + return TRUE; +} + +BOOL GetReservedWord(LPWORD WordId) +{ + TName Name; + WORD P; + + P = LinePtr; + if (! GetIdentifier(Name)) return FALSE; + if (! CheckReservedWord(Name,WordId)) + { + LinePtr = P; + return FALSE; + } + if (0 < *WordId) + return TRUE; + else + LinePtr = P; + return FALSE; +} + +BOOL GetOperator(LPWORD WordId) +{ + WORD P; + BYTE b; + + P = LinePtr; + b = GetFirstChar(); + switch (b) { + case 0: return FALSE; break; + case '*': *WordId = RsvMul; break; + case '+': *WordId = RsvPlus; break; + case '-': *WordId = RsvMinus; break; + case '/': *WordId = RsvDiv; break; + case '%': *WordId = RsvMod; break; + case '=': *WordId = RsvEQ; + if (LinePtr < LineLen && LineBuff[LinePtr] == '=') { + LinePtr++; + } + break; + case '<': *WordId = RsvLT; + if (LinePtr < LineLen) { + switch (LineBuff[LinePtr++]) { + case '=': *WordId = RsvLE; break; + case '>': *WordId = RsvNE; break; + case '<': *WordId = RsvALShift; break; + default: LinePtr--; + } + } + break; + case '>': *WordId = RsvGT; + if (LinePtr < LineLen) { + switch (LineBuff[LinePtr++]) { + case '=': *WordId = RsvGE; break; + case '>': *WordId = RsvARShift; + if (LinePtr < LineLen && LineBuff[LinePtr] == '>') { + *WordId = RsvLRShift; LinePtr++; + } + break; + default: LinePtr--; + } + } + break; + case '&': *WordId = RsvBAnd; + if (LinePtr < LineLen && LineBuff[LinePtr] == '&') { + *WordId = RsvLAnd; LinePtr++; + } + break; + case '|': *WordId = RsvBOr; + if (LinePtr < LineLen && LineBuff[LinePtr] == '|') { + *WordId = RsvLOr; LinePtr++; + } + break; + case '^': *WordId = RsvBXor; break; + case '~': *WordId = RsvBNot; break; + case '!': *WordId = RsvLNot; + if (LinePtr < LineLen && LineBuff[LinePtr] == '=') { + *WordId = RsvNE; LinePtr++; + } + break; + default: + LinePtr--; + if (! GetReservedWord(WordId) || (*WordId < RsvOperator)) { + LinePtr = P; + return FALSE; + } + } + + return TRUE; +} + +BOOL GetLabelName(PCHAR Name) +{ + int i; + BYTE b; + + memset(Name,0,MaxNameLen); + + b = GetFirstChar(); + if (b==0) return FALSE; + Name[0] = b; + + i = 1; + if (LinePtr<LineLen) b = LineBuff[LinePtr]; + while ((LinePtr<LineLen) && __iscsym(b)) { // [0-9A-Za-z_] + if (i<MaxNameLen-1) + { + Name[i] = b; + i++; + } + LinePtr++; + if (LinePtr<LineLen) b = LineBuff[LinePtr]; + } + + return (strlen(Name)>0); +} + +static int GetQuotedStr(PCHAR Str, BYTE q, LPWORD i) +{ + BYTE b; + + b=0; + if (LinePtr<LineLen) b = LineBuff[LinePtr]; + while ((LinePtr<LineLen) && (b>=' '||b=='\t') && (b!=q)) + { + if (*i<MaxStrLen-1) + { + Str[*i] = b; + (*i)++; + } + + LinePtr++; + if (LinePtr<LineLen) b = LineBuff[LinePtr]; + } + if (b==q) { + if (LinePtr<LineLen) + LinePtr++; + } + else + return (ErrSyntax); + + return 0; +} + +static WORD GetCharByCode(PCHAR Str, LPWORD i) +{ + BYTE b; + WORD n; + + b=0; + n = 0; + if (LinePtr<LineLen) b = LineBuff[LinePtr]; + if (!isdigit(b) && (b!='$')) return ErrSyntax; + + if (b!='$') { /* decimal */ + while ((LinePtr<LineLen) && isdigit(b)) { // [0-9] + n = n * 10 + b - '0'; + LinePtr++; + if (LinePtr<LineLen) b = LineBuff[LinePtr]; + } + } + else { /* hexadecimal */ + LinePtr++; + if (LinePtr<LineLen) b = LineBuff[LinePtr]; + while ((LinePtr<LineLen) && isxdigit(b)) { // [0-9A-Fa-f] + if (isalpha(b)) + b = (b|0x20) - 'a' + 10; + else + b = b - '0'; + n = n * 16 + b; + LinePtr++; + if (LinePtr<LineLen) b = LineBuff[LinePtr]; + } + } + + if ((n==0) || (n>255)) return ErrSyntax; + + if (*i<MaxStrLen-1) + { + Str[*i] = (char)n; + (*i)++; + } + return 0; +} + +BOOL GetString(PCHAR Str, LPWORD Err) +{ + BYTE q; + WORD i; + + *Err = 0; + memset(Str,0,MaxStrLen); + + q = GetFirstChar(); + if (q==0) return FALSE; + LinePtr--; + if ((q!='"') && (q!='\'') && (q!='#')) + return FALSE; + + i = 0; + while (((q=='"') || (q=='\'') || (q=='#')) && (*Err==0)) + { + LinePtr++; + switch (q) { + case '"': + case '\'': *Err = GetQuotedStr(Str,q,&i); break; + case '#': *Err = GetCharByCode(Str,&i); break; + } + q = LineBuff[LinePtr]; + } + return TRUE; +} + +BOOL GetNumber(int far *Num) +{ + BYTE b; + + *Num = 0; + + b = GetFirstChar(); + if (b==0) return FALSE; + if (isdigit(b)) { /* decimal constant */ + *Num = b - '0'; + if (LinePtr<LineLen) b = LineBuff[LinePtr]; + while ((LinePtr<LineLen) && isdigit(b)) { + *Num = *Num * 10 + b - '0'; + LinePtr++; + if (LinePtr<LineLen) b = LineBuff[LinePtr]; + } + } + else if (b=='$') + { /* hexadecimal constant */ + if (LinePtr<LineLen) b = LineBuff[LinePtr]; + while ((LinePtr<LineLen) && isxdigit(b)) { // [0-9A-Fa-f] + if (isalpha(b)) + b = (b|0x20) - 'a' + 10; + else + b = b - '0'; + *Num = *Num * 16 + b; + LinePtr++; + if (LinePtr<LineLen) b = LineBuff[LinePtr]; + } + } + else { + LinePtr--; + return FALSE; + } + return TRUE; +} + +BOOL CheckVar(const char *Name, LPWORD VarType, PVarId VarId) +{ + int i; + const Variable_t *v = Variables; + for (i = 0; i < VariableCount; v++,i++) { + if (_stricmp(v->Name, Name) == 0) { + *VarType = v->Type; + *VarId = (TVarId)i; + return TRUE; + } + } + *VarType = TypUnknown; + *VarId = 0; + return FALSE; +} + +static Variable_t *NewVar(const char *name, VariableType_t type) +{ + Variable_t *new_v = (Variable_t * )realloc(Variables, sizeof(Variable_t) * (VariableCount + 1)); + if (new_v == NULL) { + // TODO \x83\x81\x83\x82\x83\x8A\x82\xAA\x82Ȃ\xA2 + return NULL; + }; + Variables = new_v; + Variable_t *v = &Variables[VariableCount]; + VariableCount++; + v->Name = _strdup(name); + v->Type = type; + return v; +} + +BOOL NewIntVar(const char *Name, int InitVal) +{ + Variable_t *v = NewVar(Name, TypeInteger); + v->Value.Int = InitVal; + return TRUE; +} + +BOOL NewStrVar(const char *Name, const char *InitVal) +{ + Variable_t *v = NewVar(Name, TypeString); + v->Value.Str = _strdup(InitVal); + return TRUE; +} + +int NewIntAryVar(const char *Name, int size) +{ + Variable_t *v = NewVar(Name, TypeIntArray); + TIntAry *intAry = &v->Value.IntAry; + int *array = (int *)calloc(size, sizeof(int)); + if (array == NULL) { + return ErrFewMemory; + } + intAry->val = array; + intAry->size = size; + return 0; +} + +int NewStrAryVar(const char *Name, int size) +{ + Variable_t *v = NewVar(Name, TypeStrArray); + TStrAry *strAry = &v->Value.StrAry; + char **array = (char **)calloc(size, sizeof(char *)); + if (array == NULL) { + return ErrFewMemory; + } + strAry->val = array; + strAry->size = size; + return 0; +} + +BOOL NewLabVar(const char *Name, BINT InitVal, WORD ILevel) +{ + Variable_t *v = NewVar(Name, TypeLabel); + TLab *lab = &v->Value.Lab; + lab->val = InitVal; + lab->level = ILevel; + return TRUE; +} + +void DelLabVar(WORD ILevel) +{ + Variable_t *v = Variables; + for (;;) { + if (v == &Variables[VariableCount]) { + // \x8DŌ\xE3\x82܂ŗ\x88\x82\xBD + break; + } + if (v->Type == TypeLabel) { + if (v->Value.Lab.level >= ILevel) { + size_t left; + // \x8D폜\x82\xB7\x82\xE9 + free(v->Name); + // \x8C\xE3\x82\xEB\x82\xF0\x91O\x82ɂ߂\xE9 + left = &Variables[VariableCount - 1] - v; + if (left > 0) { + memmove(v, v+1, sizeof(Variable_t) * left); + } + // 1\x82\xB8\x82\xE9 + VariableCount--; + + continue; + } + } + v++; + } + Variables = (Variable_t *)realloc(Variables, sizeof(Variable_t) * VariableCount); +} + +void CopyLabel(WORD ILabel, BINT far *Ptr, LPWORD Level) +{ + Variable_t *v = &Variables[ILabel]; + *Ptr = v->Value.Lab.val; + *Level = v->Value.Lab.level; +} + +/* + * Precedence: 1 + * Evaluate variable. + * Evaluate number. + * Evaluate parenthesis. + * Evaluate following operator. + * not, ~, !, +(unary), -(unary) + */ +BOOL GetFactor(LPWORD ValType, int far *Val, LPWORD Err) +{ + TName Name; + WORD P, WId; + TVarId VarId; + int Index; + + P = LinePtr; + *Err = 0; + if (GetIdentifier(Name)) { + if (CheckReservedWord(Name,&WId)) { + if (GetFactor(ValType, Val, Err)) { + if ((*Err==0) && (*ValType!=TypInteger)) + *Err = ErrTypeMismatch; + switch (WId) { + case RsvBNot: *Val = ~(*Val); break; + case RsvLNot: *Val = !(*Val); break; + default: *Err = ErrSyntax; + } + } + else { + *Err = ErrSyntax; + } + } + else if (CheckVar(Name, ValType, &VarId)) { + switch (*ValType) { + case TypInteger: + *Val = Variables[VarId].Value.Int; + break; + case TypString: *Val = VarId; break; + case TypIntArray: + if (GetIndex(&Index, Err)) { + TIntAry *intAry = &Variables[VarId].Value.IntAry; + if (Index >= 0 && Index < intAry->size) { + *Val = intAry->val[Index]; + *ValType = TypInteger; + } + else { + *Err = ErrOutOfRange; + } + } + else if (*Err == 0) { + *Val = VarId; + } + break; + case TypStrArray: + if (GetIndex(&Index, Err)) { + VarId = GetStrVarFromArray(VarId, Index, Err); + if (*Err == 0) { + *Val = VarId; + *ValType = TypString; + } + } + else if (*Err == 0) { + *Val = VarId; + } + break; + } + } + else + *Err = ErrVarNotInit; + } + else if (GetNumber(Val)) + *ValType = TypInteger; + else if (GetOperator(&WId)) { + if (GetFactor(ValType, Val, Err)) { + if ((*Err==0) && (*ValType != TypInteger)) + *Err = ErrTypeMismatch; + switch (WId) { + case RsvPlus: break; + case RsvMinus: *Val = -(*Val); break; + case RsvBNot: *Val = ~(*Val); break; + case RsvLNot: *Val = !(*Val); break; + default: *Err = ErrSyntax; + } + } + else { + *Err = ErrSyntax; + } + } + else if (GetFirstChar()=='(') { + if (GetExpression(ValType, Val, Err)) { + if ((*Err==0) && (GetFirstChar()!=')')) + *Err = ErrCloseParent; + } + else + *Err = ErrSyntax; + } + else { + *Err = 0; + return FALSE; + } + + if (*Err!=0) LinePtr = P; + return TRUE; +} + +/* + * Precedence: 2 + * Evaluate following operator. + * *, /, % + */ +BOOL EvalMultiplication(LPWORD ValType, int far *Val, LPWORD Err) +{ + WORD P, Type, Er; + int Val1, Val2; + WORD WId; + + if (! GetFactor(&Type, &Val1, &Er)) return FALSE; + *ValType = Type; + *Val = Val1; + *Err = Er; + if (Er) return TRUE; + if (Type!=TypInteger) return TRUE; + + while (TRUE) { + P = LinePtr; + if (! GetOperator(&WId)) return TRUE; + + switch (WId) { + case RsvMul: + case RsvDiv: + case RsvMod: + break; + default: + LinePtr = P; + return TRUE; + } + + if (! GetFactor(&Type, &Val2, &Er)) { + *Err = ErrSyntax; + return TRUE; + } + + if (Er) { + *Err = Er; + return TRUE; + } + + if (Type!=TypInteger) { + *Err = ErrTypeMismatch; + return TRUE; + } + + if (Val2 == 0 && WId != RsvMul) { + *Err = ErrDivByZero; + return TRUE; + } + + switch (WId) { + case RsvMul: Val1 = Val1 * Val2; break; + case RsvDiv: Val1 = Val1 / Val2; break; + case RsvMod: Val1 = Val1 % Val2; break; + } + *Val = Val1; + } +} + +/* + * Precedence: 3 + * Evaluate following operator. + * +, - + */ +BOOL EvalAddition(LPWORD ValType, int far *Val, LPWORD Err) +{ + WORD P, Type, Er; + int Val1, Val2; + WORD WId; + + if (! EvalMultiplication(&Type, &Val1, &Er)) return FALSE; + *ValType = Type; + *Val = Val1; + *Err = Er; + if (Er) return TRUE; + if (Type!=TypInteger) return TRUE; + + while (TRUE) { + P = LinePtr; + if (! GetOperator(&WId)) return TRUE; + + switch (WId) { + case RsvPlus: + case RsvMinus: + break; + default: + LinePtr = P; + return TRUE; + } + + if (! EvalMultiplication(&Type, &Val2, &Er)) { + *Err = ErrSyntax; + return TRUE; + } + + if (Er) { + *Err = Er; + return TRUE; + } + + if (Type!=TypInteger) { + *Err = ErrTypeMismatch; + return TRUE; + } + + switch (WId) { + case RsvPlus: Val1 = Val1 + Val2; break; + case RsvMinus: Val1 = Val1 - Val2; break; + } + *Val = Val1; + } +} + +/* + * Precedence: 4 + * Evaluate following operator. + * >>, <<, >>> + */ +BOOL EvalBitShift(LPWORD ValType, int far *Val, LPWORD Err) +{ + WORD P, Type, Er; + int Val1, Val2; + WORD WId; + + if (! EvalAddition(&Type, &Val1, &Er)) return FALSE; + *ValType = Type; + *Val = Val1; + *Err = Er; + if (Er) return TRUE; + if (Type!=TypInteger) return TRUE; + + while (TRUE) { + P = LinePtr; + if (! GetOperator(&WId)) return TRUE; + + switch (WId) { + case RsvARShift: + case RsvALShift: + case RsvLRShift: + break; + default: + LinePtr = P; + return TRUE; + } + + if (! EvalAddition(&Type, &Val2, &Er)) { + *Err = ErrSyntax; + return TRUE; + } + + if (Er) { + *Err = Er; + return TRUE; + } + + if (Type!=TypInteger) { + *Err = ErrTypeMismatch; + return TRUE; + } + + if (WId == RsvALShift) + Val2 = -Val2; + + if (Val2 <= -(int)INT_BIT) { /* Val2 <= -32 */ + Val1 = 0; + } else if (Val2 < 0 ) { /* -32 < Val2 < 0 */ + Val1 = Val1 << -Val2; + } else if (Val2 == 0 ) { /* Val2 == 0 */ + ; /* do nothing */ + } else if (Val2 < INT_BIT) { /* 0 < Val2 < 32 */ + if (WId == RsvLRShift) { + // use unsigned int for logical right shift + Val1 = (unsigned int)Val1 >> Val2; + } else { + Val1 = Val1 >> Val2; + } + } else { /* Val2 >= 32 */ + if (Val1 > 0 || WId == RsvLRShift) { + Val1 = 0; + } else { + Val1 = ~0; + } + } + *Val = Val1; + } +} + +/* + * Precedence: 5 + * Evaluate following operator. + * & + */ +BOOL EvalBitAnd(LPWORD ValType, int far *Val, LPWORD Err) +{ + WORD P, Type, Er; + int Val1, Val2; + WORD WId; + + if (! EvalBitShift(&Type, &Val1, &Er)) return FALSE; + *ValType = Type; + *Val = Val1; + *Err = Er; + if (Er) return TRUE; + if (Type!=TypInteger) return TRUE; + + while (TRUE) { + P = LinePtr; + if (! GetOperator(&WId)) return TRUE; + + if (WId != RsvBAnd) { + LinePtr = P; + return TRUE; + } + + if (! EvalBitShift(&Type, &Val2, &Er)) { + *Err = ErrSyntax; + return TRUE; + } + + if (Er) { + *Err = Er; + return TRUE; + } + + if (Type!=TypInteger) { + *Err = ErrTypeMismatch; + return TRUE; + } + + Val1 = Val1 & Val2; + *Val = Val1; + } +} + +/* + * Precedence: 6 + * Evaluate following operator. + * ^ + */ +BOOL EvalBitXor(LPWORD ValType, int far *Val, LPWORD Err) +{ + WORD P, Type, Er; + int Val1, Val2; + WORD WId; + + if (! EvalBitAnd(&Type, &Val1, &Er)) return FALSE; + *ValType = Type; + *Val = Val1; + *Err = Er; + if (Er) return TRUE; + if (Type!=TypInteger) return TRUE; + + while (TRUE) { + P = LinePtr; + if (! GetOperator(&WId)) return TRUE; + + if (WId != RsvBXor) { + LinePtr = P; + return TRUE; + } + + if (! EvalBitAnd(&Type, &Val2, &Er)) { + *Err = ErrSyntax; + return TRUE; + } + + if (Er) { + *Err = Er; + return TRUE; + } + + if (Type!=TypInteger) { + *Err = ErrTypeMismatch; + return TRUE; + } + + Val1 = Val1 ^ Val2; + *Val = Val1; + } +} + +/* + * Precedence: 7 + * Evaluate following operator. + * | + */ +BOOL EvalBitOr(LPWORD ValType, int far *Val, LPWORD Err) +{ + WORD P, Type, Er; + int Val1, Val2; + WORD WId; + + if (! EvalBitXor(&Type, &Val1, &Er)) return FALSE; + *ValType = Type; + *Val = Val1; + *Err = Er; + if (Er) return TRUE; + if (Type!=TypInteger) return TRUE; + + while (TRUE) { + P = LinePtr; + if (! GetOperator(&WId)) return TRUE; + + if (WId != RsvBOr) { + LinePtr = P; + return TRUE; + } + + if (! EvalBitXor(&Type, &Val2, &Er)) { + *Err = ErrSyntax; + return TRUE; + } + + if (Er) { + *Err = Er; + return TRUE; + } + + if (Type!=TypInteger) { + *Err = ErrTypeMismatch; + return TRUE; + } + + Val1 = Val1 | Val2; + *Val = Val1; + } +} + +/* + * Precedence: 8 + * Evaluate following operator. + * <, >, <=, >= + */ +BOOL EvalGreater(LPWORD ValType, int far *Val, LPWORD Err) +{ + WORD P, Type, Er; + int Val1, Val2; + WORD WId; + + if (! EvalBitOr(&Type, &Val1, &Er)) return FALSE; + *ValType = Type; + *Val = Val1; + *Err = Er; + if (Er) return TRUE; + if (Type!=TypInteger) return TRUE; + + while (TRUE) { + P = LinePtr; + if (! GetOperator(&WId)) return TRUE; + + switch (WId) { + case RsvLT: + case RsvGT: + case RsvLE: + case RsvGE: + break; + default: + LinePtr = P; + return TRUE; + } + + if (! EvalBitOr(&Type, &Val2, &Er)) { + *Err = ErrSyntax; + return TRUE; + } + + if (Er) { + *Err = Er; + return TRUE; + } + + if (Type!=TypInteger) { + *Err = ErrTypeMismatch; + return TRUE; + } + + switch (WId) { + case RsvLT: Val1 = (Val1 <Val2); break; + case RsvGT: Val1 = (Val1 >Val2); break; + case RsvLE: Val1 = (Val1<=Val2); break; + case RsvGE: Val1 = (Val1>=Val2); break; + } + *Val = Val1; + } +} + +/* + * Precedence: 9 + * Evaluate following operator. + * =, ==, <>, != + */ +BOOL EvalEqual(LPWORD ValType, int far *Val, LPWORD Err) +{ + WORD P, Type, Er; + int Val1, Val2; + WORD WId; + + if (! EvalGreater(&Type, &Val1, &Er)) return FALSE; + *ValType = Type; + *Val = Val1; + *Err = Er; + if (Er) return TRUE; + if (Type!=TypInteger) return TRUE; + + while (TRUE) { + P = LinePtr; + if (! GetOperator(&WId)) return TRUE; + + switch (WId) { + case RsvEQ: + case RsvNE: + break; + default: + LinePtr = P; + return TRUE; + } + + if (! EvalGreater(&Type, &Val2, &Er)) { + *Err = ErrSyntax; + return TRUE; + } + + if (Er) { + *Err = Er; + return TRUE; + } + + if (Type!=TypInteger) { + *Err = ErrTypeMismatch; + return TRUE; + } + + switch (WId) { + case RsvEQ: Val1 = (Val1==Val2); break; + case RsvNE: Val1 = (Val1!=Val2); break; + } + *Val = Val1; + } +} + +/* + * Precedence: 10 + * Evaluate following operator. + * && + */ +BOOL EvalLogicalAnd(LPWORD ValType, int far *Val, LPWORD Err) +{ + WORD P, Type, Er; + int Val1, Val2; + WORD WId; + + if (! EvalEqual(&Type, &Val1, &Er)) return FALSE; + *ValType = Type; + *Val = Val1; + *Err = Er; + if (Er) return TRUE; + if (Type!=TypInteger) return TRUE; + + while (TRUE) { + P = LinePtr; + if (! GetOperator(&WId)) return TRUE; + + if (WId != RsvLAnd) { + LinePtr = P; + return TRUE; + } + + if (! EvalEqual(&Type, &Val2, &Er)) { + *Err = ErrSyntax; + return TRUE; + } + + if (Er) { + *Err = Er; + return TRUE; + } + + if (Type!=TypInteger) { + *Err = ErrTypeMismatch; + return TRUE; + } + + Val1 = Val1 && Val2; + *Val = Val1; + } +} + +/* + * Precedence: 11 + * Evaluate following operator. + * || + */ +BOOL GetExpression(LPWORD ValType, int far *Val, LPWORD Err) +{ + WORD P1, P2, Type, Er; + int Val1, Val2; + WORD WId; + + P1 = LinePtr; + if (! EvalLogicalAnd(&Type, &Val1, &Er)) { + LinePtr = P1; + return FALSE; + } + *ValType = Type; + *Val = Val1; + *Err = Er; + if (Er) { + LinePtr = P1; + return TRUE; + } + if (Type!=TypInteger) return TRUE; + + while (TRUE) { + P2 = LinePtr; + if (! GetOperator(&WId)) return TRUE; + + if (WId != RsvLOr && WId != RsvLXor) { + LinePtr = P2; + return TRUE; + } + + if (! EvalLogicalAnd(&Type, &Val2, &Er)) { + *Err = ErrSyntax; + LinePtr = P1; + return TRUE; + } + + if (Er) { + *Err = Er; + LinePtr = P1; + return TRUE; + } + + if (Type!=TypInteger) { + *Err = ErrTypeMismatch; + LinePtr = P1; + return TRUE; + } + + switch (WId) { + case RsvLOr: Val1 = Val1 || Val2; break; + case RsvLXor: Val1 = (Val1 && !Val2) || (!Val1 && Val2); break; + } + *Val = Val1; + } +} + +void GetIntVal(int far *Val, LPWORD Err) +{ + WORD ValType; + + UpdateLineParsePtr(); + + if (*Err != 0) return; + if (! GetExpression(&ValType,Val,Err)) + { + *Err = ErrSyntax; + return; + } + if (*Err!=0) return; + if (ValType!=TypInteger) + *Err = ErrTypeMismatch; +} + +void SetIntVal(TVarId VarId, int Val) +{ + if (VarId >> 16) { + Variable_t *v = &Variables[(VarId>>16)-1]; + int *int_val = &v->Value.IntAry.val[VarId & 0xffff]; + *int_val = Val; + } + else { + Variable_t *v = &Variables[VarId]; + v->Value.Int = Val; + } +} + +int CopyIntVal(TVarId VarId) +{ + Variable_t *v; + if (VarId >> 16) { + v = &Variables[(VarId>>16)-1]; + return v->Value.IntAry.val[VarId & 0xffff]; + } + else { + v = &Variables[VarId]; + return v->Value.Int; + } +} + +void GetIntVar(PVarId VarId, LPWORD Err) +{ + TName Name; + WORD VarType; + int Index; + + if (*Err!=0) return; + + if (GetIdentifier(Name)) { + if (CheckVar(Name, &VarType, VarId)) { + switch (VarType) { + case TypInteger: + break; + case TypIntArray: + if (GetIndex(&Index, Err)) { + *VarId = GetIntVarFromArray(*VarId, Index, Err); + } + else if (*Err == 0) { + *Err = ErrTypeMismatch; + } + break; + default: + *Err = ErrTypeMismatch; + } + } + else { + if (NewIntVar(Name, 0)) + CheckVar(Name, &VarType, VarId); + else + *Err = ErrTooManyVar; + } + } + else + *Err = ErrSyntax; +} + +void GetStrVal(PCHAR Str, LPWORD Err) +{ + UpdateLineParsePtr(); + GetStrVal2(Str, Err, FALSE); +} + +void GetStrVal2(PCHAR Str, LPWORD Err, BOOL AutoConversion) +{ + WORD VarType; + int VarId; + + Str[0] = 0; + if (*Err!=0) return; + + if (GetString(Str, Err)) + return; + else if (GetExpression(&VarType, &VarId, Err)) { + if (*Err!=0) return; + switch (VarType) { + case TypString: + strncpy_s(Str, MaxStrLen, StrVarPtr((TVarId)VarId), _TRUNCATE); + break; + case TypInteger: + if (AutoConversion) + _snprintf_s(Str, MaxStrLen, _TRUNCATE, "%d", VarId); + else + *Err = ErrTypeMismatch; + break; + default: + *Err = ErrTypeMismatch; + } + } + else + *Err = ErrSyntax; +} + +void GetStrVar(PVarId VarId, LPWORD Err) +{ + TName Name; + WORD VarType; + int Index; + + if (*Err!=0) return; + + if (GetIdentifier(Name)) { + if (CheckVar(Name, &VarType, VarId)) { + switch (VarType) { + case TypString: + break; + case TypStrArray: + if (GetIndex(&Index, Err)) { + *VarId = GetStrVarFromArray(*VarId, Index, Err); + } + else if (*Err == 0) { + *Err = ErrTypeMismatch; + } + break; + default: + *Err = ErrTypeMismatch; + } + } + else { + if (NewStrVar(Name, "")) + CheckVar(Name, &VarType, VarId); + else + *Err = ErrTooManyVar; + } + } + else + *Err = ErrSyntax; +} + +void SetStrVal(TVarId VarId, const char *Str) +{ + if (VarId >> 16) { + Variable_t *v = &Variables[(VarId>>16)-1]; + char **str = &v->Value.StrAry.val[VarId & 0xffff]; + free(*str); + *str = _strdup(Str); + } + else { + Variable_t *v = &Variables[VarId]; + char **str = &v->Value.Str; + free(*str); + *str = _strdup(Str); + } +} + +const char *StrVarPtr(TVarId VarId) +{ + Variable_t *v; + if (VarId >> 16) { + v = &Variables[(VarId>>16)-1]; + return v->Value.StrAry.val[VarId & 0xffff]; + } + else { + v = &Variables[VarId]; + return v->Value.Str; + } +} + +// for ifdefined (2006.9.23 maya) +void GetVarType(LPWORD ValType, int far *Val, LPWORD Err) +{ + TName Name; + WORD WId; + TVarId VarId; + int Index; + + if (GetIdentifier(Name)) { + if (CheckReservedWord(Name,&WId)) { + *ValType = TypUnknown; + } + else { + CheckVar(Name, ValType, &VarId); + switch (*ValType) { + case TypIntArray: + if (GetIndex(&Index, Err)) { + TIntAry *intAry = &Variables[VarId].Value.IntAry; + if (Index >= 0 && Index < intAry->size) { + *ValType = TypInteger; + } + else { + *ValType = TypUnknown; + } + } + break; + case TypStrArray: + if (GetIndex(&Index, Err)) { + VarId = GetStrVarFromArray(VarId, Index, Err); + if (*Err == 0) { + *ValType = TypString; + } + else { + *ValType = TypUnknown; + } + } + break; + } + } + } + else { + *ValType = TypUnknown; + } + + *Err = 0; +} + +BOOL GetIndex(int *Index, LPWORD Err) +{ + WORD P; + int Idx; + + *Err = 0; + P = LinePtr; + if (GetFirstChar() == '[') { + GetIntVal(&Idx, Err); + if (*Err == 0) { + if (GetFirstChar() == ']') { + *Index = Idx; + return TRUE; + } + *Err = ErrCloseBracket; + } + } + LinePtr = P; + return FALSE; +} + +TVarId GetIntVarFromArray(TVarId VarId, int Index, LPWORD Err) +{ + TIntAry *intAry = &Variables[VarId].Value.IntAry; + if (Index < 0 || Index >= intAry->size) { + *Err = ErrOutOfRange; + return -1; + } + *Err = 0; + return ((VarId+1) << 16) | Index; +} + +TVarId GetStrVarFromArray(TVarId VarId, int Index, LPWORD Err) +{ + TStrAry *strAry = &Variables[VarId].Value.StrAry; + if (Index < 0 || Index >= strAry->size) { + *Err = ErrOutOfRange; + return -1; + } + *Err = 0; + return ((VarId+1) << 16) | Index; +} + +void GetAryVar(PVarId VarId, WORD VarType, LPWORD Err) +{ + TName Name; + + if (*Err!=0) return; + + if (GetIdentifier(Name)) { + GetAryVarByName(VarId, Name, VarType, Err); + } + else { + *Err = ErrSyntax; + } +} + +void GetAryVarByName(PVarId VarId, const char *Name, WORD VarType, LPWORD Err) +{ + WORD typ; + + if (CheckVar(Name, &typ, VarId)) { + if (typ != VarType) { + *Err = ErrTypeMismatch; + } + } + else { + *Err = ErrVarNotInit; + } +} + +void SetIntValInArray(TVarId VarId, int Index, int Val, LPWORD Err) +{ + TVarId id; + + id = GetIntVarFromArray(VarId, Index, Err); + if (*Err == 0) { + SetIntVal(id, Val); + } +} + +void SetStrValInArray(TVarId VarId, int Index, PCHAR Str, LPWORD Err) +{ + TVarId id; + + id = GetStrVarFromArray(VarId, Index, Err); + if (*Err == 0) { + SetStrVal(id, Str); + } +} + +int GetIntAryVarSize(TVarId VarId) +{ + TIntAry *intAry = &Variables[VarId].Value.IntAry; + return intAry->size; +} + +int GetStrAryVarSize(TVarId VarId) +{ + TIntAry *strAry = &Variables[VarId].Value.IntAry; + return strAry->size; +} Modified: trunk/teraterm/ttpmacro/ttpmacro.v16.vcxproj =================================================================== --- trunk/teraterm/ttpmacro/ttpmacro.v16.vcxproj 2020-04-11 15:56:26 UTC (rev 8706) +++ trunk/teraterm/ttpmacro/ttpmacro.v16.vcxproj 2020-04-11 15:56:35 UTC (rev 8707) @@ -144,7 +144,7 @@ <ClCompile Include="ttmenc.c" /> <ClCompile Include="ttmlib.c" /> <ClCompile Include="ttmmain.cpp" /> - <ClCompile Include="ttmparse.c" /> + <ClCompile Include="ttmparse.cpp" /> <ClCompile Include="wait4all.c" /> </ItemGroup> <ItemGroup> Modified: trunk/teraterm/ttpmacro/ttpmacro.v16.vcxproj.filters =================================================================== --- trunk/teraterm/ttpmacro/ttpmacro.v16.vcxproj.filters 2020-04-11 15:56:26 UTC (rev 8706) +++ trunk/teraterm/ttpmacro/ttpmacro.v16.vcxproj.filters 2020-04-11 15:56:35 UTC (rev 8707) @@ -58,9 +58,6 @@ <ClCompile Include="ttmlib.c"> <Filter>Source Files %28C%29</Filter> </ClCompile> - <ClCompile Include="ttmparse.c"> - <Filter>Source Files %28C%29</Filter> - </ClCompile> <ClCompile Include="wait4all.c"> <Filter>Source Files %28C%29</Filter> </ClCompile> @@ -70,6 +67,9 @@ <ClCompile Include="ttl_gui.cpp"> <Filter>Source Files</Filter> </ClCompile> + <ClCompile Include="ttmparse.cpp"> + <Filter>Source Files</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <ClInclude Include="errdlg.h"> Modified: trunk/teraterm/ttpmacro/ttpmacro.vcproj =================================================================== --- trunk/teraterm/ttpmacro/ttpmacro.vcproj 2020-04-11 15:56:26 UTC (rev 8706) +++ trunk/teraterm/ttpmacro/ttpmacro.vcproj 2020-04-11 15:56:35 UTC (rev 8707) @@ -251,6 +251,10 @@ RelativePath="ttmmain.cpp" > </File> + <File + RelativePath="ttmparse.cpp" + > + </File> </Filter> <Filter Name="Header Files" @@ -429,10 +433,6 @@ > </File> <File - RelativePath="ttmparse.c" - > - </File> - <File RelativePath="wait4all.c" > </File>