diff options
author | Eduardo Chappa <echappa@gmx.com> | 2013-02-03 00:59:38 -0700 |
---|---|---|
committer | Eduardo Chappa <echappa@gmx.com> | 2013-02-03 00:59:38 -0700 |
commit | 094ca96844842928810f14844413109fc6cdd890 (patch) | |
tree | e60efbb980f38ba9308ccb4fb2b77b87bbc115f3 /pith/helpindx.c | |
download | alpine-094ca96844842928810f14844413109fc6cdd890.tar.xz |
Initial Alpine Version
Diffstat (limited to 'pith/helpindx.c')
-rw-r--r-- | pith/helpindx.c | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/pith/helpindx.c b/pith/helpindx.c new file mode 100644 index 00000000..20cb9273 --- /dev/null +++ b/pith/helpindx.c @@ -0,0 +1,132 @@ +#if !defined(lint) && !defined(DOS) +static char rcsid[] = "$Id: helpindx.c 769 2007-10-24 00:15:40Z hubert@u.washington.edu $"; +#endif + +/* + * ======================================================================== + * Copyright 2006-2007 University of Washington + * Copyright 2013 Eduardo Chappa + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * ======================================================================== + */ + +/* + * very short, very specialized + * + * + * + */ + +#include "system.h" + +#define HELP_KEY_MAX 64 /* maximum length of a key */ + +struct hindx { + char key[HELP_KEY_MAX]; /* name of help section */ + long offset; /* where help text starts */ + short lines; /* how many lines there are */ +}; + +int +main(int argc, char **argv) +{ + char *p, s[1024]; + long index; + int section, + len, + line, + i; + FILE *hp, + *hip, /* help index ptr */ + *hhp; /* help header ptr */ + struct hindx irec; + + if(argc < 4){ + fprintf(stderr, + "usage: helpindx <help_file> <index_file> <header_file>\n"); + exit(-1); + } + + if((hp = fopen(argv[1], "rb")) == NULL){ /* problems */ + perror(argv[1]); + exit(-1); + } + + if((hip = fopen(argv[2], "wb")) == NULL){ /* problems */ + perror(argv[2]); + exit(-1); + } + + if((hhp = fopen(argv[3], "w")) == NULL){ /* problems */ + perror(argv[3]); + exit(-1); + } + + fprintf(hhp,"/*\n * Alpine Help text header file\n */\n"); + fprintf(hhp,"\n#ifndef PITH_HELPTEXT_INCLUDED\n#define PITH_HELPTEXT_INCLUDED\n"); + fprintf(hhp,"\n#define\tHELP_KEY_MAX\t%d\n", HELP_KEY_MAX); + fprintf(hhp,"\ntypedef\tshort\tHelpType;\n"); + fprintf(hhp,"\n#define\tNO_HELP\t(-1)\n"); + fprintf(hhp,"struct hindx {\n char key[HELP_KEY_MAX];"); + fprintf(hhp,"\t\t/* name of help section */\n"); + fprintf(hhp," long offset;\t\t\t/* where help text starts */\n"); + fprintf(hhp," short lines;\t\t\t/* how many lines there are */\n"); + fprintf(hhp,"};\n\n\n/*\n * defs for help section titles\n */\n"); + + index = 0L; + line = section = 0; + + while(fgets(s, sizeof(s) - 1, hp) != NULL){ + line++; + len = strlen(s); + if(s[0] == '='){ /* new section? */ + i = 0; + while((s[i] == '=' || isspace((unsigned char)s[i])) && i < len) + i++; + + if(section) + fwrite(&irec, sizeof(struct hindx), 1, hip); + + irec.offset = index + (long)i; /* save where name starts */ + irec.lines = 0; + p = &irec.key[0]; /* save name field */ + while(!isspace((unsigned char)s[i]) && i < len) + *p++ = s[i++]; + *p = '\0'; + + if(irec.key[0] == '\0'){ + fprintf(stderr,"Invalid help line %d: %s", line, s); + exit(-1); + } + else + fprintf(hhp, "#define\t%s\t%d\n", irec.key, section++); + + } + else if(s[0] == '#' && section){ + fprintf(stderr,"Comments not allowed in help text: line %d", line); + exit(-1); + } + else{ + irec.lines++; + } + index += len; + } + + if(section) /* write last entry */ + fwrite(&irec, sizeof(struct hindx), 1, hip); + + fprintf(hhp, "#define\tLASTHELP\t%d\n", section); + + fprintf(hhp,"\n#endif /* PITH_HELPTEXT_INCLUDED */\n"); + + fclose(hp); + fclose(hip); + fclose(hhp); + exit(0); +} |