/*++ Copyright (c) 1991-1999, Microsoft Corporation All rights reserved. Module Name: nlstrans.c Abstract: This file contains the main function, the main parsing functions, and all helper functions used by the various modules. External Routines in this file: MAIN GetSize Revision History: 06-14-91 JulieB Created. --*/ // // Include Files. // #include #include "nlstrans.h" // // Global Variables. // FILE *pInputFile; // pointer to Input File BOOL Verbose = 0; // verbose flag BOOL NLSPlus = 0; // To indicate the file should be generated in NLS+ format. WCHAR FileExtension[32]; // The file extension for generated files. It can be ".nls" or ".nlp" // // Forward Declarations. // int ParseCmdLine( int argc, char *argv[]); void InitGlobals(); int ParseInputFile(void); int GetKeyParam( PSZ pszParam); //-------------------------------------------------------------------------// // MAIN ROUTINE // //-------------------------------------------------------------------------// //////////////////////////////////////////////////////////////////////////// // // MAIN // // Main Routine. // // 07-30-91 JulieB Created. // 12-10-91 JulieB Modified for new table format. //////////////////////////////////////////////////////////////////////////// int __cdecl main( int argc, char *argv[]) { // // Parse the command line. // Open input file. // if (ParseCmdLine(argc, argv)) { return (1); } InitGlobals(); // // Parse the input file. // Close the input file. // if (ParseInputFile()) { fclose(pInputFile); return (1); } fclose(pInputFile); // // Return success. // return (0); } //-------------------------------------------------------------------------// // INTERNAL ROUTINES // //-------------------------------------------------------------------------// //////////////////////////////////////////////////////////////////////////// // // ParseCmdLine // // This routine parses the command line. // // 07-30-91 JulieB Created. // 12-10-91 JulieB Modified for new table format. //////////////////////////////////////////////////////////////////////////// int ParseCmdLine( int argc, char *argv[]) { int Pos = 1; // position of argument // // Check for correct number of arguments. // if (argc < 2) { printf("Usage: nlstrans [-v] [-nlp] \n"); printf(" -v: Verbose output.\n"); printf(" -nlp: NLS+ format. This will only affect sortkey and sorttabl generation.\n"); return (1); } // // Parse switches. // for (Pos = 1; Pos < argc - 1; Pos++) { if (argv[Pos][0] == '-' || argv[Pos][0] == '/') { // // Check for verbose switch. // if (_stricmp(argv[Pos]+1, "v") == 0) { Verbose = 1; Pos++; } else if (_stricmp(argv[Pos]+1, "nlp") == 0) { NLSPlus = 1; Pos++; } else { printf("Invalid switch.\n"); return (1); } } else { printf("Invalid switch.\n"); return (1); } } // // The last argument is the file name. // Check input file exists and can be open as read only. // if ((pInputFile = fopen(argv[argc-1], "r")) == 0) { printf("Error opening input file.\n"); return (1); } // // Return success. // return (0); } //////////////////////////////////////////////////////////////////////////// // // InitGlobals // // Initialize global variables. // //////////////////////////////////////////////////////////////////////////// void InitGlobals() { if (NLSPlus) { wcscpy(FileExtension, NLP_FILE_SUFFIX_W); } else { wcscpy(FileExtension, DATA_FILE_SUFFIX_W); } } //////////////////////////////////////////////////////////////////////////// // // ParseInputFile // // This routine parses the input file. // // 07-30-91 JulieB Created. // 12-10-91 JulieB Modified for new table format. //////////////////////////////////////////////////////////////////////////// int ParseInputFile() { char pszKeyWord[MAX]; // input token char pszParam[MAX]; // parameter for keyword CODEPAGE CP; // codepage structure LANGUAGE Lang; // language structure LANG_EXCEPT LangExcept; // language exception structure LOCALE_HEADER LocHdr; // header locale structure LOCALE_STATIC LocStat; // static length locale structure LOCALE_VARIABLE LocVar; // variable length locale structure UNICODE Unic; // unicode structure CTYPES CTypes; // ctypes structure SORTKEY Sortkey; // sortkey structure - sorting SORT_TABLES SortTbls; // sort tables structure - sorting IDEOGRAPH_EXCEPT IdeographExcept; // ideograph exception structure - sorting char SortKeyFileName[MAX_PATH]; // The output file name for sortkey table. char SortTblsFileName[MAX_PATH]; // The output file name for sorttbls table. while (fscanf(pInputFile, "%s", pszKeyWord) == 1) { if (_stricmp(pszKeyWord, "CODEPAGE") == 0) { if (Verbose) printf("\n\nFound CODEPAGE keyword.\n"); // // Initialize CodePage structure. // memset(&CP, 0, sizeof(CODEPAGE)); memset(pszParam, 0, MAX * sizeof(char)); CP.pszName = pszParam; // // Get CODEPAGE parameter string. // if (GetKeyParam(pszParam)) { return (1); } // // Get the valid keywords for CODEPAGE. // if (ParseCodePage(&CP, pszKeyWord)) { return (1); } // // Write the CODEPAGE tables to an output file. // if (WriteCodePage(&CP)) { return (1); } } else if (_stricmp(pszKeyWord, "LANGUAGE") == 0) { if (Verbose) printf("\n\nFound LANGUAGE keyword.\n"); // // Initialize Language structure. // memset(&Lang, 0, sizeof(LANGUAGE)); // // Get LANGUAGE parameter string. // if (GetKeyParam(pszParam)) { return (1); } // // Get the valid keywords for LANGUAGE. // if (ParseLanguage(&Lang, pszKeyWord)) { return (1); } // // Write the LANGUAGE tables to an output file. // if (WriteLanguage(&Lang)) { return (1); } } else if (_stricmp(pszKeyWord, "LANGUAGE_EXCEPTION") == 0) { if (Verbose) printf("\n\nFound LANGUAGE_EXCEPTION keyword.\n"); // // Initialize Language structure. // memset(&LangExcept, 0, sizeof(LANG_EXCEPT)); // // Get the valid keywords for LANGUAGE_EXCEPTION. // if (ParseLangException(&LangExcept, pszKeyWord)) { return (1); } // // Write the LANGUAGE_EXCEPTION tables to an output file. // if (WriteLangException(&LangExcept)) { return (1); } } else if (_stricmp(pszKeyWord, "LOCALE") == 0) { if (Verbose) printf("\n\nFound LOCALE keyword.\n"); // // Get the valid keywords for LOCALE. // Write the LOCALE information to an output file. // if (ParseWriteLocale( &LocHdr, &LocStat, &LocVar, pszKeyWord )) { return (1); } } else if (_stricmp(pszKeyWord, "UNICODE") == 0) { if (Verbose) printf("\n\nFound UNICODE keyword.\n"); // // Initialize Unicode structure. // memset(&Unic, 0, sizeof(UNICODE)); // // Get the valid keywords for UNICODE. // if (ParseUnicode(&Unic, pszKeyWord)) { return (1); } // // Write the UNICODE tables to an output file. // if (WriteUnicode(&Unic)) { return (1); } } else if (_stricmp(pszKeyWord, "GEO") == 0) { if (Verbose) printf("\n\nFound GEO keyword.\n"); // // Get the valid keywords for GEO. // Write the GEO information to an output file. // if (ParseWriteGEO(pszKeyWord)) { return (1); } } else if (_stricmp(pszKeyWord, "CTYPES") == 0) { if (Verbose) printf("\n\nFound CTYPES keyword.\n"); // // Initialize CTypes structure. // memset(&CTypes, 0, sizeof(CTYPES)); // // Get the valid keywords for CTYPES. // if (ParseCTypes(&CTypes)) { return (1); } // // Write the CTYPES tables to different output files. // if (WriteCTypes(&CTypes)) { return (1); } } else if (_stricmp(pszKeyWord, "SORTKEY") == 0) { if (Verbose) printf("\n\nFound SORTKEY keyword.\n"); if (NLSPlus) { strcpy(SortKeyFileName, SORTKEY_NLP_FILE); } else { strcpy(SortKeyFileName, SORTKEY_FILE); } // // Initialize Sortkey structure. // memset(&Sortkey, 0, sizeof(SORTKEY)); // // Get the valid keywords for SORTKEY. // if (ParseSortkey(&Sortkey, pszKeyWord)) { return (1); } // // Write the SORTKEY tables to an output file. // if (WriteSortkey(&Sortkey, SortKeyFileName)) { return (1); } } else if (_stricmp(pszKeyWord, "SORTTABLES") == 0) { if (Verbose) printf("\n\nFound SORTTABLES keyword.\n"); if (NLSPlus) { strcpy(SortTblsFileName, SORTTBLS_NLP_FILE); } else { strcpy(SortTblsFileName, SORTTBLS_FILE); } // // Initialize Sort Tables structure. // memset(&SortTbls, 0, sizeof(SORT_TABLES)); // // Get the valid keywords for SORTTABLES. // if (ParseSortTables(&SortTbls, pszKeyWord)) { return (1); } // // Write the Sort Tables to an output file. // if (WriteSortTables(&SortTbls, SortTblsFileName)) { return (1); } } else if (_stricmp(pszKeyWord, "IDEOGRAPH_EXCEPTION") == 0) { if (Verbose) printf("\n\nFound IDEOGRAPH_EXCEPTION keyword.\n"); // // Initialize Ideograph Exception structure. // memset(&IdeographExcept, 0, sizeof(IDEOGRAPH_EXCEPT)); // // Get the valid keywords for IDEOGRAPH_EXCEPTION. // if (ParseIdeographExceptions(&IdeographExcept)) { return (1); } // // Write the Ideograph Exceptions to the given output file. // if (WriteIdeographExceptions(&IdeographExcept)) { return (1); } } else { printf("Parse Error: Invalid Instruction '%s'.\n", pszKeyWord); return (1); } } // // Return success. // return (0); } //////////////////////////////////////////////////////////////////////////// // // GetKeyParam // // This routine gets the parameter for the keyword from the input file. If // the parameter is not there, then an error is returned. // // 12-10-91 JulieB Created. //////////////////////////////////////////////////////////////////////////// int GetKeyParam( PSZ pszParam) { // // Read the parameter from the input file. // if (fscanf( pInputFile, "%s ;%*[^\n]", pszParam ) != 1) { printf("Parse Error: Error reading parameter value.\n"); return (1); } if (Verbose) printf(" PARAMETER = %s\n\n", pszParam); // // Return success. // return (0); } //-------------------------------------------------------------------------// // EXTERNAL ROUTINES // //-------------------------------------------------------------------------// //////////////////////////////////////////////////////////////////////////// // // GetSize // // This routine gets the size of the table from the input file. If the // size is not there, then an error is returned. // // 07-30-91 JulieB Created. //////////////////////////////////////////////////////////////////////////// int GetSize( int *pSize) { int NumItems; // number of items returned from fscanf // // Read the size from the input file. // NumItems = fscanf( pInputFile, "%d ;%*[^\n]", pSize ); if (NumItems != 1) { printf("Parse Error: Error reading size value.\n"); return (1); } if (*pSize < 0) { printf("Parse Error: Invalid size value %d\n", *pSize); return (1); } if (Verbose) printf(" SIZE = %d\n\n", *pSize); // // Return success. // return (0); }