home *** CD-ROM | disk | FTP | other *** search
- /* ------------------------------------------------- */
- /* FFHC.C */
- /* Der Compiler des Hilfe-Pakets */
- /* (c) 1991 Axel Geßner & DMV-Verlag */
- /* ------------------------------------------------- */
-
- #ifndef __COMPACT__
- #error please use model compact \
- (far data, near code pointers) !
- #endif
-
- #include "ffhc.h"
-
- tree_t *kwtree = NULL; /* KeyWordTree */
- char sname[13], /* Name der Quelldatei */
- dname[13]; /* Name der Zieldatei */
- int (*cmpstr) (const char *s1, const char *s2);
-
- int main (int argc, char *argv[])
- {
- FILE *infile;
-
- checkparameters (argv);
- /* prüfen der Parameter; initialisieren */
- infile = readfile (sname);
- /* Lesen der Datei; Aufbauen des Baums */
- writefile (dname, kwtree, infile);
- /* Schreiben der Datei */
- return 0; /* Exit mit 0 */
- }
-
- void checkparameters (char **argv)
- {
- char *s;
-
- printf (PROG);
- if (!argv[1])
- error ("Keine Quelldatei angegeben.\n" +
- "Korrekter Aufruf: %s\n", USAGE);
- if (!argv[2] || strchr (argv[2], '/')) {
- strcpy (dname, strupr (argv[1]));
- argv[3] = argv[2];
- /* Options-Zeiger stets in argv[3] */
- } else
- strcpy (dname, strupr (argv[2]));
- strcpy (sname, strupr (argv[1]));
- if (!strchr (sname, '.'))
- strcat (sname, S_EXT);
- if (!strchr (dname, '.'))
- strcat (dname, D_EXT);
-
- cmpstr = stricmp;
- for (s = argv[3]; s && *s; s++) {
- switch (*s) {
- case '/' :
- s++;
- switch (toupper(*s)) {
- case 'H' :
- /* HILFE kommt hierher */ ;
- break;
- case 'C' :
- cmpstr = strcmp;
- break;
- case 'D' :
- showindex (dname);
- /* kein break;
- index terminiert selbst */
- default :
- error ("Unbekannte Kommandozeilen" +
- "option /%c.\n",*s);
- break;
- }
- }
- }
- }
-
- void writefile (char *fname, tree_t *tree,
- FILE *infile)
- {
- FILE *outfile = fopen (fname, "wb");
-
- if (outfile == NULL)
- error ("Fehler beim Öffnen der Ausgabedatei %s.\n",
- fname);
-
- printf ("\rSchreiben der Zieldatei %s ",fname);
- fwrite ((void *) &header, sizeof (header), 1,
- outfile);
- writetexts (tree, infile, outfile);
- header.offs = ftell (outfile);
- /* ab hier wird Inh.verz. geschrieben */
- writetree (tree, outfile);
- fputc (0, outfile);
- printf ("\r%79s\n","");
- fseek (outfile, 0, SEEK_SET);
- fwrite ((void *) &header, sizeof (header), 1,
- outfile);
- fclose (infile); fclose (outfile);
- }
-
- void writetexts (tree_t *tree, FILE *infile,
- FILE *outfile)
- {
- char *buf;
- if (tree == NULL) return;
- writetexts (tree->left, infile, outfile);
- fseek (infile, tree->offs, SEEK_SET);
- buf = (char *) calloc (tree->textlen+1, 1);
- read ((void *) buf, tree->textlen, 1, infile);
- /* buf = shrinkbuftext (buf); */
- tree->textlen = strlen (buf);
- tree->offs = ftell (outfile);
- fwrite (buf, tree->textlen, 1, outfile);
- writetexts (tree->right, infile, outfile);
- free ((void *) buf);
- }
-
- void writetree (tree_t *tree, FILE *outfile)
- {
- if (tree == NULL) return;
- writetree (tree->left, outfile);
- fwrite ((void *) tree->keyword,
- strlen (tree->keyword)+1, 1,
- outfile);
- fwrite ((void *) &tree->offs, sizeof (tree->offs),
- 1, outfile);
- fwrite ((void *) &tree->textlen,
- sizeof (tree->textlen), 1,
- outfile);
- writetree (tree->right, outfile);
- /* Freigabe des Blatts */
- free ((void *) tree->keyword);
- free ((void *) tree);
- }
-
- FILE *readfile (char *fname)
- {
- char helpstr[MAX_KEYWORD+1], line[MAXLINE+1];
- FILE *in = fopen (fname, "rb");
- long offs;
- char *s;
- tree_t *t;
-
- if (in == NULL)
- error ("Fehler beim Öffnen der Quelldatei %s.\n",
- fname);
- printf("Lesen der Quelldatei %s ",fname);
- while (!feof(in)) {
- checkforkeywords (in, fname, KEYWORDSTR, helpstr);
- checkforkeywords (in, fname, HELPTEXTSTR, NULL);
- kwtree = genleaf (helpstr, ftell (in), kwtree);
- while (!feof (in)) {
- long pos = ftell (in);
- s = fgets (line, MAXLINE, in);
- if (isalpha (*s)) {
- fseek (in, pos, SEEK_SET);
- break;
- }
- }
- t = search (helpstr, kwtree);
- t->textlen = ftell (in) - t->offs - 1;
- }
- return in;
- }
-
- tree_t *search (char *name, tree_t *tree)
- {
- if (tree == NULL) return NULL;
- if (cmpstr (name, tree->keyword) < 0)
- return search (name, tree->left);
- else if (cmpstr (name, tree->keyword) > 0)
- return search (name, tree->right);
- else
- return tree;
- }
-
- void checkforkeywords (FILE *fp, char *fname,
- char *type, char *res)
- {
- char *s;
- char line[MAXLINE+1];
- char keyw[MAX_KEYWORD+1], helpstr[MAX_KEYWORD+1];
- long pos;
-
- while (!feof (fp)) {
- s = fgets (line, MAXLINE, fp);
- if (!isalpha (*s))
- /* wenn 1. Spalte kein Buchstabe --> continue */
- continue;
- sscanf (line, "%[A-Za-z] %[A-Za-z]",
- &keyw[0], &helpstr[0]);
- if (stricmp (keyw, type))
- /* wenn kein KEYWORD oder TEXT ... */
- error ("Kein »%s« an der erwarteten Stelle " +
- "in Datei %s.\n", type, fname);
- else
- break;
- }
- if (res != NULL) strcpy (res, helpstr);
- }
-
- FILE *skipnonalphas (FILE *fp)
- {
- int c;
-
- while (!isalpha (c = fgetc (fp)))
- ;
- ungetc (c, fp);
- return fp;
- }
-
- tree_t *genleaf (char *name, long offs, tree_t *tree)
- {
- tree_t *tt = NULL, *t = tree;
- /* tt hinkt hinterher */
- int cmp;
-
- while (t != NULL) {
- tt = t;
- cmp = cmpstr (name, t->keyword);
- if (cmp < 0)
- t = t->left;
- else if (cmp > 0)
- t = t->right;
- else
- error ("Doppelter Hilfstextname %s in " +
- "Quelldatei %s.\n", name, sname);
- }
- t = (tree_t *) calloc (1, sizeof (tree_t));
- t->keyword = cpystr (name);
- t->left = t->right = NULL;
- t->offs = offs;
- t->textlen = /* noch */ 0;
- if (tt != NULL)
- if (cmp < 0)
- tt->left = t;
- else
- tt->right = t;
-
- return (tree == NULL ? t
- /* wenn 1. Aufruf, dann Wurzel in *t */
- : tree);
- /* danach immer in *tree */
- }
-
- void showindex (char *fname)
- {
- FILE *fp = fopen (fname, "rb");
- int c;
- long offs;
-
- if (fp == NULL)
- error ("Fehler beim Öffnen der Datei %s zum " +
- "Erstellen eines Schlüssel-\n" +
- "wortverzeichnisses.\n", fname);
- while ((c = fgetc (fp)) != 26)
- ;
- fread ((void *) &offs, sizeof (offs), 1, fp);
- /* lesen des Offs. */
- fseek (fp, offs, SEEK_SET);
- /* springen zum ermittelten Dateioffset */
-
- while (!feof (fp)) {
- char keyword[MAX_KEYWORD+1] = {""};
- fscanf (fp, "%s", keyword);
- c = fgetc (fp);
- fread ((void *) &offs, sizeof (offs), 1, fp);
- printf ("Schlüsselwort: %s Dateioffset: %ld ",
- keyword, offs);
- fread ((void *) &offs, sizeof (offs), 1, fp);
- /* offs zweckentfremdet */
- printf ("Länge des Hilfstextes: %ld\n", offs);
-
- c = fgetc (fp);
- if (c == 0)
- /* wenn nach einem Satz direkt 0 kommt ... */
- break; /* ... Abbruch */
- else
- ungetc (c, fp);
- }
- fclose (fp);
- exit (0); /* Beenden */
- }
-
- char *cpystr (char *s)
- {
- char *new = (char *) calloc (1, strlen (s)+1);
- return strcpy (new, s);
- }
-
- void error (const char *format, ...)
- {
- va_list argptr;
-
- fputs ("\nFFHC: ", stderr);
-
- va_start (argptr, format);
- vfprintf (stderr, format, argptr);
- va_end (argptr)
-
- exit (0x0A);
- }
- /* ------------------------------------------------- */
- /* Ende von FFHC.C */
-
-