mux2.0/game/
mux2.0/game/data/
mux2.0/src/tools/
//
// mkindx.cpp -- make help/news file indexes 
//
// $Id: mkindx.cpp,v 1.2 2000/09/18 08:03:42 sdennis Exp $ 
//
#include "copyright.h"
#include "autoconf.h"
#include "config.h"

#include "help.h"
#include "_build.h"

#define LINE_SIZE 4096

char line[LINE_SIZE + 1];
int DCL_CDECL main(int argc, char *argv[])
{
    long pos;
    int i, n, lineno, ntopics;
    char *s, *topic;
    help_indx entry;
    FILE *rfp, *wfp;

    if (argc < 2 || argc > 3)
    {
#ifdef WIN32
#ifdef BETA
#if PATCHLEVEL > 0
        printf("%s from MUX %s.p%d for Win32 #%s [BETA]\n", argv[0],
            MUX_VERSION, PATCHLEVEL, MUX_BUILD_NUM);
#else // PATCHLEVEL
        printf("%s from MUX %s for Win32 #%s [BETA]\n", argv[0], MUX_VERSION,
            MUX_BUILD_NUM);
#endif // PATCHLEVEL
#else // BETA
#if PATCHLEVEL > 0 
        printf("%s from MUX %s.p%d for Win32 #%s [%s]\n", argv[0], MUX_VERSION,
            PATCHLEVEL, MUX_BUILD_NUM, MUX_RELEASE_DATE);
#else // PATCHLEVEL
        printf("%s from MUX %s for Win32 #%s [%s]\n", argv[0], MUX_VERSION,
            MUX_BUILD_NUM, MUX_RELEASE_DATE);
#endif // PATCHLEVEL
#endif // BETA
#else // WIN32
#ifdef BETA
#if PATCHLEVEL > 0
        printf("%s from MUX %s.p%d #%s [BETA]\n", argv[0], MUX_VERSION,
            PATCHLEVEL, MUX_BUILD_NUM);
#else // PATCHLEVEL
        printf("%s from MUX %s #%s [BETA]\n", argv[0], MUX_VERSION,
            MUX_BUILD_NUM);
#endif // PATCHLEVEL
#else // BETA
#if PATCHLEVEL > 0 
        printf("%s from MUX %s.p%d #%s [%s]\n", argv[0], MUX_VERSION,
            PATCHLEVEL, MUX_BUILD_NUM, MUX_RELEASE_DATE);
#else // PATCHLEVEL
        printf("%s from MUX %s #%s [%s]\n", argv[0], MUX_VERSION, MUX_BUILD_NUM,
            MUX_RELEASE_DATE);
#endif // PATCHLEVEL
#endif // BETA
#endif // WIN32
        printf("Usage:\tmkindx <file_to_be_indexed> <output_index_filename>\n");
        exit(-1);
    }
    if ((rfp = fopen(argv[1], "rb")) == NULL)
    {
        fprintf(stderr, "can't open %s for reading\n", argv[1]);
        exit(-1);
    }
    if ((wfp = fopen(argv[2], "wb")) == NULL)
    {
        fprintf(stderr, "can't open %s for writing\n", argv[2]);
        exit(-1);
    }
    pos = 0L;
    lineno = 0;
    ntopics = 0;
    while (fgets(line, LINE_SIZE, rfp) != NULL) {
        ++lineno;

        n = strlen(line);
        if (line[n - 1] != '\n') {
            fprintf(stderr, "line %d: line too long\n", lineno);
        }
        if (line[0] == '&') {
            ++ntopics;

            if (ntopics > 1) {
                entry.len = (int)(pos - entry.pos);
                if (fwrite(&entry, sizeof(help_indx), 1, wfp) < 1) {
                    fprintf(stderr, "error writing %s\n", argv[2]);
                    exit(-1);
                }
            }
            for (topic = &line[1];
                 (*topic == ' ' || *topic == '\t') && *topic != '\0'; topic++) ;
            for (i = -1, s = topic; *s != '\n' && *s != '\0'; s++) {
                if (i >= TOPIC_NAME_LEN - 1)
                    break;
                if (*s != ' ' || entry.topic[i] != ' ')
                    entry.topic[++i] = *s;
            }
            entry.topic[++i] = '\0';
            entry.pos = pos + (long)n;
        }
        pos += n;
    }
    entry.len = (int)(pos - entry.pos);
    if (fwrite(&entry, sizeof(help_indx), 1, wfp) < 1) {
        fprintf(stderr, "error writing %s\n", argv[2]);
        exit(-1);
    }
    fclose(rfp);
    fclose(wfp);

    printf("%d topics indexed\n", ntopics);
    return 0;
}