home *** CD-ROM | disk | FTP | other *** search
/ Piper's Pit BBS/FTP: ibm 0040 - 0049 / ibm0040-0049 / ibm0040.tar / ibm0040 / ZINC_6.ZIP / DOSSRC.ZIP / GENHELP.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1991-06-01  |  5.0 KB  |  189 lines

  1. //    Zinc Interface Library - GENHELP.CPP
  2. //    COPYRIGHT (C) 1990, 1991.  All Rights Reserved.
  3. //    Zinc Software Incorporated.  Pleasant Grove, Utah  USA
  4.  
  5. #include "ui_gen.hpp"
  6. #include <stdio.h>
  7. #include <string.h>
  8.  
  9. const int ID_HELP_CONTEXT            = 20;    // pre-defined value in ui_map.hpp
  10.  
  11. static void WriteHelpConstant(FILE *includeFile, UI_STORAGE_ELEMENT *element,
  12.     char *title)
  13. {
  14.     // Write out the help constant.
  15.     char buffer[256];
  16.     sprintf(buffer, "#define %-32s 0x%04X // %s\n",
  17.         element->search.stringID, element->search.numberID, title);
  18.     fwrite(buffer, strlen(buffer), 1, includeFile);
  19. }
  20.  
  21. static void WriteHelpMessage(UI_STORAGE &helpFile, FILE *textFile,
  22.     UI_STORAGE_ELEMENT *element, long beginOffset, long endOffset)
  23. {
  24.     // Write out the help message.
  25.     long originalOffset = ftell(textFile);
  26.     if (endOffset != beginOffset)
  27.     {
  28.         element->search.size = (int)(endOffset - beginOffset);
  29.         char *buffer = new char[element->search.size];
  30.         fseek(textFile, beginOffset, SEEK_SET);
  31.         fread(buffer, element->search.size, 1, textFile);
  32.         for (int i = 0; i < element->search.size; )
  33.             if (buffer[i] == '\\' && buffer[i+1] == '\r')
  34.             {
  35.                 element->search.size -= 1;
  36.                 memcpy(&buffer[i], &buffer[i+1], element->search.size - i);
  37.                 i += 2;
  38.             }
  39.             else if (buffer[i] == '\\' && buffer[i+1] == '\n')
  40.             {
  41.                 element->search.size -= 1;
  42.                 memcpy(&buffer[i], &buffer[i+1], element->search.size - i);
  43.                 i += 1;
  44.             }
  45.             else if (buffer[i] == '\r')
  46.             {
  47.                 if (buffer[i+2] != '\r')
  48.                 {
  49.                     if (buffer[i-1] != ' ')
  50.                     {
  51.                         buffer[i++] = ' ';
  52.                         element->search.size -= 1;
  53.                         memcpy(&buffer[i], &buffer[i+1], element->search.size - i);
  54.                     }
  55.                     else
  56.                     {
  57.                         element->search.size -= 2;
  58.                         memcpy(&buffer[i], &buffer[i+2], element->search.size - i);
  59.                     }
  60.                 }
  61.  
  62.                 // Check for blank line.
  63.                 while (buffer[i] == '\r' || buffer[i] == '\n')
  64.                     i++;
  65.             }
  66.             else if (buffer[i] == '\n')
  67.             {
  68.                 if (buffer[i+1] != '\n')
  69.                 {
  70.                     if (buffer[i-1] != ' ')
  71.                         buffer[i] = ' ';
  72.                     else
  73.                     {
  74.                         element->search.size -= 1;
  75.                         memcpy(&buffer[i], &buffer[i+1], element->search.size - i);
  76.                     }
  77.                 }
  78.  
  79.                 // Check for blank line.
  80.                 while (buffer[i] == '\n')
  81.                     i++;
  82.             }
  83.             else
  84.                 i++;
  85.         helpFile.Store(element->search.size);
  86.         if (element->search.size)
  87.             helpFile.Store(buffer, element->search.size);
  88.         delete buffer;
  89.     }
  90.     else
  91.     {
  92.         element->search.size = 0;
  93.         helpFile.Store(element->search.size);
  94.     }
  95.     helpFile.ObjectSize(element->search.stringID, element->search);
  96.     fseek(textFile, originalOffset, SEEK_SET);
  97. }
  98.  
  99. main(int argc, char *argv[])
  100. {
  101.     // Make sure there is a specified text file.
  102.     if (argc != 2)
  103.     {
  104.         printf("Usage: genhelp <text file name>\n");
  105.         return (1);
  106.     }
  107.  
  108.     // Open the text file.
  109.     char fileName[128];
  110.     strcpy(fileName, argv[1]);
  111.     UI_STORAGE::ChangeExtension(fileName, ".TXT");
  112.     FILE *textFile = fopen(fileName, "rb");
  113.     if (!textFile)
  114.         printf("Could not open the text file: %s.\n", fileName);
  115.  
  116.     // Open the data file.
  117.     UI_STORAGE::defaultCacheSize = 20480;
  118.     UI_STORAGE::ChangeExtension(fileName, ".DAT");
  119.     if (!UI_STORAGE::ValidName(fileName, TRUE))
  120.     {
  121.         printf("Could not create the help data file: %s.\n", fileName);
  122.         return (0);
  123.     }
  124.  
  125.     // Generate the help contexts.
  126.     UI_STORAGE helpFile(fileName, TRUE);
  127.     char line[256], title[256];
  128.     long beginOffset, endOffset;
  129.     UI_STORAGE_ELEMENT *element = NULL;
  130.     while (textFile && fgets(line, sizeof(line), textFile))
  131.     {
  132.         char helpName[64];
  133.         if (sscanf(line, "--- %[a-zA-Z0-9_]", helpName) == 1)
  134.         {
  135.             // Save the previous help message.
  136.             if (element)
  137.                 WriteHelpMessage(helpFile, textFile, element, beginOffset, endOffset);
  138.  
  139.             // Get the new help storage element.
  140.             element = helpFile.Seek(helpName, SEEK_WRITE);
  141.             if (element->search.numberID == 0)
  142.             {
  143.                 element->search.type = ID_HELP_CONTEXT;
  144.                 USHORT numberID = 1;
  145.                 while (helpFile.Seek(numberID))
  146.                     numberID++;
  147.                 element->search.numberID = numberID;
  148.                 helpFile.Seek(numberID, SEEK_WRITE);
  149.             }
  150.  
  151.             // Get and save the new help title.
  152.             if (!fgets(title, sizeof(title), textFile))
  153.                 title[0] = '\0';
  154.             ui_strrepc(title, '\r', '\0');
  155.             ui_strrepc(title, '\n', '\0');
  156.             helpFile.Store(title);
  157.  
  158.             // Get the starting position of the help message.
  159.             beginOffset = endOffset = ftell(textFile);
  160.         }
  161.         else
  162.             endOffset = ftell(textFile);
  163.     }
  164.  
  165.     // Save the last help message.
  166.     if (element)
  167.     {
  168.         endOffset = ftell(textFile);
  169.         WriteHelpMessage(helpFile, textFile, element, beginOffset, endOffset);
  170.     }
  171.     helpFile.Save();
  172.     if (textFile)
  173.         fclose(textFile);
  174.  
  175.     // Save the help information.
  176.     UI_STORAGE::ChangeExtension(fileName, ".HLH");
  177.     FILE *includeFile = fopen(fileName, "w+");
  178.     for (element = helpFile.First(); element; element = element->Next())
  179.         if (element->search.type == ID_HELP_CONTEXT)
  180.         {
  181.             char *title;
  182.             helpFile.Seek(element->search.stringID);
  183.             helpFile.Load(&title);
  184.             WriteHelpConstant(includeFile, element, title);
  185.             delete title;
  186.         }
  187.     fclose(includeFile);
  188. }
  189.