home *** CD-ROM | disk | FTP | other *** search
- // Zinc Interface Library - GENHELP.CPP
- // COPYRIGHT (C) 1990, 1991. All Rights Reserved.
- // Zinc Software Incorporated. Pleasant Grove, Utah USA
-
- #include "ui_gen.hpp"
- #include <stdio.h>
- #include <string.h>
-
- const int ID_HELP_CONTEXT = 20; // pre-defined value in ui_map.hpp
-
- static void WriteHelpConstant(FILE *includeFile, UI_STORAGE_ELEMENT *element,
- char *title)
- {
- // Write out the help constant.
- char buffer[256];
- sprintf(buffer, "#define %-32s 0x%04X // %s\n",
- element->search.stringID, element->search.numberID, title);
- fwrite(buffer, strlen(buffer), 1, includeFile);
- }
-
- static void WriteHelpMessage(UI_STORAGE &helpFile, FILE *textFile,
- UI_STORAGE_ELEMENT *element, long beginOffset, long endOffset)
- {
- // Write out the help message.
- long originalOffset = ftell(textFile);
- if (endOffset != beginOffset)
- {
- element->search.size = (int)(endOffset - beginOffset);
- char *buffer = new char[element->search.size];
- fseek(textFile, beginOffset, SEEK_SET);
- fread(buffer, element->search.size, 1, textFile);
- for (int i = 0; i < element->search.size; )
- if (buffer[i] == '\\' && buffer[i+1] == '\r')
- {
- element->search.size -= 1;
- memcpy(&buffer[i], &buffer[i+1], element->search.size - i);
- i += 2;
- }
- else if (buffer[i] == '\\' && buffer[i+1] == '\n')
- {
- element->search.size -= 1;
- memcpy(&buffer[i], &buffer[i+1], element->search.size - i);
- i += 1;
- }
- else if (buffer[i] == '\r')
- {
- if (buffer[i+2] != '\r')
- {
- if (buffer[i-1] != ' ')
- {
- buffer[i++] = ' ';
- element->search.size -= 1;
- memcpy(&buffer[i], &buffer[i+1], element->search.size - i);
- }
- else
- {
- element->search.size -= 2;
- memcpy(&buffer[i], &buffer[i+2], element->search.size - i);
- }
- }
-
- // Check for blank line.
- while (buffer[i] == '\r' || buffer[i] == '\n')
- i++;
- }
- else if (buffer[i] == '\n')
- {
- if (buffer[i+1] != '\n')
- {
- if (buffer[i-1] != ' ')
- buffer[i] = ' ';
- else
- {
- element->search.size -= 1;
- memcpy(&buffer[i], &buffer[i+1], element->search.size - i);
- }
- }
-
- // Check for blank line.
- while (buffer[i] == '\n')
- i++;
- }
- else
- i++;
- helpFile.Store(element->search.size);
- if (element->search.size)
- helpFile.Store(buffer, element->search.size);
- delete buffer;
- }
- else
- {
- element->search.size = 0;
- helpFile.Store(element->search.size);
- }
- helpFile.ObjectSize(element->search.stringID, element->search);
- fseek(textFile, originalOffset, SEEK_SET);
- }
-
- main(int argc, char *argv[])
- {
- // Make sure there is a specified text file.
- if (argc != 2)
- {
- printf("Usage: genhelp <text file name>\n");
- return (1);
- }
-
- // Open the text file.
- char fileName[128];
- strcpy(fileName, argv[1]);
- UI_STORAGE::ChangeExtension(fileName, ".TXT");
- FILE *textFile = fopen(fileName, "rb");
- if (!textFile)
- printf("Could not open the text file: %s.\n", fileName);
-
- // Open the data file.
- UI_STORAGE::defaultCacheSize = 20480;
- UI_STORAGE::ChangeExtension(fileName, ".DAT");
- if (!UI_STORAGE::ValidName(fileName, TRUE))
- {
- printf("Could not create the help data file: %s.\n", fileName);
- return (0);
- }
-
- // Generate the help contexts.
- UI_STORAGE helpFile(fileName, TRUE);
- char line[256], title[256];
- long beginOffset, endOffset;
- UI_STORAGE_ELEMENT *element = NULL;
- while (textFile && fgets(line, sizeof(line), textFile))
- {
- char helpName[64];
- if (sscanf(line, "--- %[a-zA-Z0-9_]", helpName) == 1)
- {
- // Save the previous help message.
- if (element)
- WriteHelpMessage(helpFile, textFile, element, beginOffset, endOffset);
-
- // Get the new help storage element.
- element = helpFile.Seek(helpName, SEEK_WRITE);
- if (element->search.numberID == 0)
- {
- element->search.type = ID_HELP_CONTEXT;
- USHORT numberID = 1;
- while (helpFile.Seek(numberID))
- numberID++;
- element->search.numberID = numberID;
- helpFile.Seek(numberID, SEEK_WRITE);
- }
-
- // Get and save the new help title.
- if (!fgets(title, sizeof(title), textFile))
- title[0] = '\0';
- ui_strrepc(title, '\r', '\0');
- ui_strrepc(title, '\n', '\0');
- helpFile.Store(title);
-
- // Get the starting position of the help message.
- beginOffset = endOffset = ftell(textFile);
- }
- else
- endOffset = ftell(textFile);
- }
-
- // Save the last help message.
- if (element)
- {
- endOffset = ftell(textFile);
- WriteHelpMessage(helpFile, textFile, element, beginOffset, endOffset);
- }
- helpFile.Save();
- if (textFile)
- fclose(textFile);
-
- // Save the help information.
- UI_STORAGE::ChangeExtension(fileName, ".HLH");
- FILE *includeFile = fopen(fileName, "w+");
- for (element = helpFile.First(); element; element = element->Next())
- if (element->search.type == ID_HELP_CONTEXT)
- {
- char *title;
- helpFile.Seek(element->search.stringID);
- helpFile.Load(&title);
- WriteHelpConstant(includeFile, element, title);
- delete title;
- }
- fclose(includeFile);
- }
-