void BuildAndOutputTable(FILE *fp, FILE *fpBody, FILE *fpInclude, char *UpperPrefix, char *LowerPrefix) { // Construct State Transition Table. // sm.Init(); LoadStrings(fp, fpBody, fpInclude); TestTable(fp); sm.SetUndefinedStates(false); TestTable(fp); // Optimize State Transition Table. // sm.MergeAcceptingStates(); TestTable(fp); sm.MergeAcceptingStates(); TestTable(fp); sm.MergeAcceptingStates(); TestTable(fp); sm.RemoveDuplicateRows(); TestTable(fp); sm.RemoveDuplicateRows(); TestTable(fp); sm.RemoveDuplicateRows(); TestTable(fp); sm.DetectDuplicateColumns(); // Output State Transition Table. // sm.NumberStates(); OutputControl oc; oc.fpBody = fpBody; oc.fpInclude = fpInclude; oc.UpperPrefix = UpperPrefix; oc.LowerPrefix = LowerPrefix; sm.OutputTables(&oc, NULL); }
void LoadStrings(FILE *fp, FILE *fpBody, FILE *fpInclude) { int cIncluded = 0; int cExcluded = 0; int cErrors = 0; fseek(fp, 0, SEEK_SET); int Value; UTF32 nextcode = ReadCodePoint(fp); UTF32 i; for (i = 0; i <= UNI_MAX_LEGAL_UTF32; i++) { bool bMember; if (i == nextcode) { bMember = true; cIncluded++; if (UNI_EOF != nextcode) { nextcode = ReadCodePoint(fp); if (nextcode <= i) { fprintf(stderr, "Codes in file are not in order (U+%04X).\n", static_cast<unsigned int>(nextcode)); exit(0); } } } else { bMember = false; cExcluded++; } UTF32 Source[2]; Source[0] = i; Source[1] = L'\0'; const UTF32 *pSource = Source; UTF8 Target[5]; UTF8 *pTarget = Target; ConversionResult cr; cr = ConvertUTF32toUTF8(&pSource, pSource+1, &pTarget, pTarget+sizeof(Target)-1, lenientConversion); if (conversionOK == cr) { sm.RecordString(Target, pTarget, bMember); } else { cErrors++; } } fprintf(fpBody, "// %d included, %d excluded, %d errors.\n", cIncluded, cExcluded, cErrors); fprintf(fpInclude, "// %d included, %d excluded, %d errors.\n", cIncluded, cExcluded, cErrors); fprintf(stderr, "%d included, %d excluded, %d errors.\n", cIncluded, cExcluded, cErrors); OutputStatus os; sm.OutputTables(NULL, &os); fprintf(stderr, "%d states, %d columns, %d bytes\n", os.nStates, os.nColumns, os.SizeOfMachine); }