OSDN Git Service

Add NamedRequestScriptPuke to zspecial.acs and update the parameter counts of Request...
[zandronum/zandronum-acc.git] / token.c
diff --git a/token.c b/token.c
index 1c2ae41..eab9a2c 100644 (file)
--- a/token.c
+++ b/token.c
@@ -7,12 +7,18 @@
 \r
 // HEADER FILES ------------------------------------------------------------\r
 \r
+#if defined(_WIN32) && !defined(_MSC_VER)\r
+#define WIN32_LEAN_AND_MEAN\r
+#include <windows.h>\r
+#endif\r
+\r
 #ifdef __NeXT__\r
 #include <libc.h>\r
 #else\r
 #ifndef unix\r
 #include <io.h>\r
 #endif\r
+#include <limits.h>\r
 #include <fcntl.h>\r
 #include <stdlib.h>\r
 #endif\r
@@ -90,7 +96,7 @@ tokenType_t tk_Token;
 int tk_Line;\r
 int tk_Number;\r
 char *tk_String;\r
-U_BYTE tk_SpecialValue;\r
+int tk_SpecialValue;\r
 int tk_SpecialArgCount;\r
 char *tk_SourceName;\r
 int tk_IncludedLines;\r
@@ -177,15 +183,20 @@ static struct keyword_s
        { "wadauthor", TK_WADAUTHOR },\r
        { "nowadauthor", TK_NOWADAUTHOR },\r
        { "acs_executewait", TK_ACSEXECUTEWAIT },\r
+       { "acs_namedexecutewait", TK_ACSNAMEDEXECUTEWAIT },\r
        { "encryptstrings", TK_ENCRYPTSTRINGS },\r
        { "import", TK_IMPORT },\r
        { "library", TK_LIBRARY },\r
        { "libdefine", TK_LIBDEFINE },\r
        { "bool", TK_BOOL },\r
        { "net", TK_NET },\r
+       { "clientside", TK_CLIENTSIDE }, // [BB]\r
        { "disconnect", TK_DISCONNECT },\r
+       { "event", TK_EVENT }, //[BB]\r
        { "unloading", TK_UNLOADING },\r
-       { "static", TK_STATIC }\r
+       { "static", TK_STATIC },\r
+       { "strparam", TK_STRPARAM_EVAL }, // [FDARI]\r
+       { "strcpy", TK_STRCPY }, // [FDARI]\r
 };\r
 \r
 #define NUM_KEYWORDS (sizeof(Keywords)/sizeof(Keywords[0]))\r
@@ -305,7 +316,7 @@ static char *AddFileName(const char *name)
 \r
 //==========================================================================\r
 //\r
-// AddIncludePath\r
+// TK_AddIncludePath\r
 // This adds an include path with less priority than the ones already added\r
 // \r
 // Pascal 12/11/08\r
@@ -320,15 +331,58 @@ void TK_AddIncludePath(char *sourcePath)
                strcpy(IncludePaths[NumIncludePaths], sourcePath);\r
                \r
                // Not ending with directory delimiter?\r
-               if(*(IncludePaths[NumIncludePaths] + strlen(IncludePaths[NumIncludePaths]) - 1) != DIRECTORY_DELIMITER_CHAR)\r
+               if(!MS_IsDirectoryDelimiter(*(IncludePaths[NumIncludePaths] + strlen(IncludePaths[NumIncludePaths]) - 1)))\r
                {\r
                        // Add a directory delimiter to the include path\r
-                       strcat(IncludePaths[NumIncludePaths], DIRECTORY_DELIMITER);\r
+                       strcat(IncludePaths[NumIncludePaths], "/");\r
                }\r
+               MS_Message(MSG_DEBUG, "Add include path %d: \"%s\"\n", NumIncludePaths, IncludePaths[NumIncludePaths]);\r
                NumIncludePaths++;\r
        }\r
 }\r
 \r
+//==========================================================================\r
+//\r
+// TK_AddProgramIncludePath\r
+// Adds an include path for the directory of the executable.\r
+//\r
+//==========================================================================\r
+\r
+void TK_AddProgramIncludePath(char *progname)\r
+{\r
+       if(NumIncludePaths < MAX_INCLUDE_PATHS)\r
+       {\r
+#ifdef _WIN32\r
+#ifdef _MSC_VER\r
+#if _MSC_VER >= 1300\r
+               if (_get_pgmptr(&progname) != 0)\r
+               {\r
+                       return;\r
+               }\r
+#else\r
+               progname = _pgmptr;\r
+#endif\r
+#else\r
+               char progbuff[1024];\r
+               GetModuleFileName(0, progbuff, sizeof(progbuff));\r
+               progbuff[sizeof(progbuff)-1] = '\0';\r
+               progname = progbuff;\r
+#endif\r
+#else\r
+               char progbuff[PATH_MAX];\r
+               if (realpath(progname, progbuff) != NULL)\r
+               {\r
+                       progname = progbuff;\r
+               }\r
+#endif\r
+               strcpy(IncludePaths[NumIncludePaths], progname);\r
+               if(MS_StripFilename(IncludePaths[NumIncludePaths]))\r
+               {\r
+                       MS_Message(MSG_DEBUG, "Program include path is %d: \"%s\"\n", NumIncludePaths, IncludePaths[NumIncludePaths]);\r
+                       NumIncludePaths++;\r
+               }\r
+       }\r
+}\r
 \r
 //==========================================================================\r
 //\r
@@ -346,11 +400,6 @@ static void SetLocalIncludePath(char *sourceName)
        {\r
                IncludePaths[0][0] = 0;\r
        }\r
-       else\r
-       {\r
-               // Add a directory delimiter to the include path\r
-               strcat(IncludePaths[0], DIRECTORY_DELIMITER);\r
-       }\r
 }\r
 \r
 \r
@@ -386,7 +435,24 @@ void TK_Include(char *fileName)
        // Handle absolute paths\r
        if(MS_IsPathAbsolute(fileName))\r
        {\r
+#if defined(_WIN32) || defined(__MSDOS__)\r
+               sourceName[0] = '\0';\r
+               if(MS_IsDirectoryDelimiter(fileName[0]))\r
+               {\r
+                       // The source file is absolute for the drive, but does not\r
+                       // specify a drive. Use the path for the current file to\r
+                       // get the drive letter, if it has one.\r
+                       if(IncludePaths[0][0] != '\0' && IncludePaths[0][1] == ':')\r
+                       {\r
+                               sourceName[0] = IncludePaths[0][0];\r
+                               sourceName[1] = ':';\r
+                               sourceName[2] = '\0';\r
+                       }\r
+               }\r
+               strcat(sourceName, fileName);\r
+#else\r
                strcpy(sourceName, fileName);\r
+#endif\r
                foundfile = MS_FileExists(sourceName);\r
        }\r
        else\r
@@ -410,7 +476,9 @@ void TK_Include(char *fileName)
                ERR_ErrorAt(tk_SourceName, tk_Line);\r
                ERR_Exit(ERR_CANT_FIND_INCLUDE, YES, fileName, tk_SourceName, tk_Line);\r
        }\r
-       \r
+\r
+       MS_Message(MSG_DEBUG, "*Include file found at %s\n", sourceName);\r
+\r
        // Now change the first include path to the file directory\r
        SetLocalIncludePath(sourceName);\r
        \r
@@ -609,7 +677,7 @@ int TK_NextCharacter(void)
 \r
 void TK_SkipPast(tokenType_t token)\r
 {\r
-       while (tk_Token != token)\r
+       while (tk_Token != token && tk_Token != TK_EOF)\r
        {\r
                TK_NextToken();\r
        }\r
@@ -624,7 +692,7 @@ void TK_SkipPast(tokenType_t token)
 \r
 void TK_SkipTo(tokenType_t token)\r
 {\r
-       while (tk_Token != token)\r
+       while (tk_Token != token && tk_Token != TK_EOF)\r
        {\r
                TK_NextToken();\r
        }\r
@@ -899,8 +967,8 @@ static void ProcessNumberToken(void)
 \r
 static void EvalFixedConstant(int whole)\r
 {\r
-       int frac;\r
-       int divisor;\r
+       double frac;\r
+       double divisor;\r
 \r
        frac = 0;\r
        divisor = 1;\r
@@ -910,7 +978,7 @@ static void EvalFixedConstant(int whole)
                divisor *= 10;\r
                NextChr();\r
        }\r
-       tk_Number = (whole<<16)+((frac<<16)/divisor);\r
+       tk_Number = (whole<<16)+(int)(65536.0*frac/divisor);\r
        tk_Token = TK_NUMBER;\r
 }\r
 \r
@@ -1018,8 +1086,8 @@ static void ProcessQuoteToken(void)
                        *text++ = Chr;\r
                }\r
                // escape the character after a backslash [JB]\r
-               if(Chr == ASCII_BACKSLASH)\r
-                       escaped ^= (Chr == ASCII_BACKSLASH);\r
+               if(Chr == '\\')\r
+                       escaped ^= (Chr == '\\');\r
                else\r
                        escaped = FALSE;\r
                NextChr();\r
@@ -1315,6 +1383,7 @@ static void ProcessSpecialToken(void)
                                        tk_Number = '\r';\r
                                        break;\r
                                case '\'':\r
+                               case '\\':\r
                                        tk_Number = Chr;\r
                                        break;\r
                                default:\r