+static\r
+INTN\r
+PreprocessSourceFile (\r
+ UINT8 *SourceFileName\r
+ )\r
+{\r
+ char *Cptr;\r
+ FILE *InFptr;\r
+ FILE *OutFptr;\r
+ UINT32 CmdLen;\r
+ char *PreProcessCmd;\r
+ char BaseName[MAX_PATH];\r
+ char TempFileName[MAX_PATH];\r
+ char SourceFileDir[MAX_PATH];\r
+ char Line[MAX_LINE_LEN];\r
+ TEXT_STRING_LIST *List;\r
+ char InsertLine[] = "#undef STRING_TOKEN\n";\r
+ int Status;\r
+\r
+ //\r
+ // Check whehter source file exist\r
+ //\r
+ InFptr = fopen (SourceFileName, "r");\r
+ if (InFptr == NULL) {\r
+ Error (NULL, 0, 0, SourceFileName, "failed to open input file for scanning");\r
+ return STATUS_ERROR;\r
+ }\r
+\r
+ //\r
+ // Get source file directory\r
+ //\r
+ strcpy (SourceFileDir, SourceFileName);\r
+ Cptr = strrchr (SourceFileDir, '\\');\r
+ if (Cptr != NULL) {\r
+ *Cptr = '\0';\r
+ }\r
+\r
+ //\r
+ // Generate preprocess output file name\r
+ //\r
+ strcpy (BaseName, mGlobals.OutputDatabaseFileName);\r
+ Cptr = strrchr (BaseName, '\\');\r
+ if (Cptr != NULL) {\r
+ *++Cptr = '\0';\r
+ }\r
+\r
+ Cptr = strrchr (SourceFileName, '\\');\r
+ if (Cptr != NULL) {\r
+ Cptr++;\r
+ }\r
+ strcat (BaseName, Cptr);\r
+\r
+ Cptr = strrchr (BaseName, '.');\r
+ if (Cptr != NULL) {\r
+ *Cptr = '\0';\r
+ }\r
+\r
+ strcpy (mGlobals.PreprocessFileName, BaseName);\r
+ strcat (mGlobals.PreprocessFileName, PREPROCESS_OUTPUT_FILE_EXTENSION);\r
+\r
+ strcpy (TempFileName, BaseName);\r
+ strcat (TempFileName, PREPROCESS_TEMP_FILE_EXTENSION);\r
+\r
+ //\r
+ // Insert "#undef STRING_TOKEN" after each line of "#include ...", so as to\r
+ // preserve the STRING_TOKEN() for scanning after preprocess\r
+ //\r
+ OutFptr = fopen (TempFileName, "w");\r
+ if (OutFptr == NULL) {\r
+ Error (NULL, 0, 0, TempFileName, "failed to open file for write");\r
+ fclose (InFptr);\r
+ return STATUS_ERROR;\r
+ }\r
+ while (fgets (Line, MAX_LINE_LEN, InFptr) != NULL) {\r
+ fputs (Line, OutFptr);\r
+ Cptr = Line;\r
+\r
+ //\r
+ // Skip leading blank space\r
+ //\r
+ while (*Cptr == ' ' || *Cptr == '\t') {\r
+ Cptr++;\r
+ }\r
+\r
+ if (*Cptr == '#' && strncmp (Cptr + 1, "include", 7) == 0){\r
+ fputs (InsertLine, OutFptr);\r
+ }\r
+ }\r
+ fclose (InFptr);\r
+ fclose (OutFptr);\r
+\r
+ //\r
+ // Prepare preprocess command\r
+ //\r
+ CmdLen = 1;\r
+ CmdLen += strlen (PREPROCESSOR_COMMAND);\r
+ CmdLen++;\r
+ CmdLen += strlen (PREPROCESSOR_OPTIONS);\r
+ CmdLen++;\r
+\r
+ //\r
+ // "-I SourceFileDir "\r
+ //\r
+ CmdLen += strlen (SourceFileDir);\r
+ CmdLen += 4;\r
+\r
+ List = mGlobals.PreprocessFlags;\r
+ while (List != NULL) {\r
+ CmdLen += strlen (List->Str);\r
+ CmdLen++;\r
+\r
+ List = List->Next;\r
+ }\r
+\r
+ CmdLen += strlen (TempFileName);\r
+ CmdLen += 3;\r
+ CmdLen += strlen (mGlobals.PreprocessFileName);\r
+\r
+ PreProcessCmd = malloc (CmdLen);\r
+ if (PreProcessCmd == NULL) {\r
+ Error (NULL, 0, 0, UTILITY_NAME, "memory allocation fail (%d bytes)\n", CmdLen);\r
+ return STATUS_ERROR;\r
+ }\r
+\r
+ strcpy (PreProcessCmd, PREPROCESSOR_COMMAND);\r
+ strcat (PreProcessCmd, " ");\r
+ strcat (PreProcessCmd, PREPROCESSOR_OPTIONS);\r
+ strcat (PreProcessCmd, " ");\r
+\r
+\r
+ strcat (PreProcessCmd, "-I ");\r
+ strcat (PreProcessCmd, SourceFileDir);\r
+ strcat (PreProcessCmd, " ");\r
+\r
+ List = mGlobals.PreprocessFlags;\r
+ while (List != NULL) {\r
+ strcat (PreProcessCmd, List->Str);\r
+ strcat (PreProcessCmd, " ");\r
+\r
+ List = List->Next;\r
+ }\r
+\r
+ strcat (PreProcessCmd, TempFileName);\r
+ strcat (PreProcessCmd, " > ");\r
+ strcat (PreProcessCmd, mGlobals.PreprocessFileName);\r
+\r
+ //\r
+ // Preprocess the source file\r
+ //\r
+ Status = system (PreProcessCmd);\r
+ if (Status != 0) {\r
+ Error (NULL, 0, 0, PreProcessCmd, "failed to spawn C preprocessor on source file\n");\r
+ free (PreProcessCmd);\r
+ return STATUS_ERROR;\r
+ }\r
+\r
+ free (PreProcessCmd);\r
+ return STATUS_SUCCESS;\r
+}\r
+\r