source: tags/arb_5.5/TREEGEN/readcfg.c

Last change on this file was 4043, checked in by westram, 18 years ago
  • includes fixed (make depends had problems with)
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.5 KB
Line 
1#include "readcfg.h"
2
3#include <string.h>
4#include <stdlib.h>
5#include <errno.h>
6
7#define COMMENT     ';'
8#define MAXLEN  2048
9
10static cstr error_message;   /* Kann von decode gesetzt werden */
11                             /* und wird dann als Fehlermeldung */
12                             /* ausgegeben */
13
14/* -------------------------------------------------------------------------- */
15/*      static void scanKeywords(struct S_cfgLine line[], int *lineanz, int... */
16/* ------------------------------------------------------ 18.05.95 02.10 ---- */
17/* */
18/*  Anzahl und maximale L„nge der Keywords bestimmen */
19/* */
20static void scanKeywords(struct S_cfgLine line[], int *lineanz, int *maxlen)
21{
22    while (1)
23    {
24        cstr keyword    = line[*lineanz].keyword;
25        int  keywordlen;
26
27        if (!keyword) break;
28        keywordlen = strlen(keyword);
29        if (keywordlen>*maxlen) *maxlen = keywordlen;
30        (*lineanz)++;
31    }
32}
33/* -------------------------------------------------------------------------- */
34/*      static void cfgReadWarning(cstr fname, int lineno) */
35/* ------------------------------------------------------ 18.05.95 02.23 ---- */
36static void cfgReadWarning(cstr fname, int lineno)
37{
38    warningf("Error in line %i of '%s'", lineno, fname);
39}
40/* -------------------------------------------------------------------------- */
41/*      int readCfg(cstr fname, struct S_cfgLine line[]) */
42/* ------------------------------------------------------ 17.05.95 21:23 ---- */
43/* */
44/*  liest und dekodiert CFG-Datei */
45/* */
46int readCfg(cstr fname, struct S_cfgLine line[])
47{
48    FILE *in = fopen(fname, "r");
49    int   ok = in!=NULL;
50
51    if (!ok && errno==ENOENT)                              /* Datei nicht vorhanden */
52    {
53        FILE *out = fopen(fname, "w");
54
55        if (out)
56        {
57            fprintf(out, ";\n; arb_treegen CFG-File '%s'\n;\n\n", fname);
58            fclose(out);
59
60            warningf("'%s' has been generated.", fname);
61
62            in = fopen(fname, "r");
63            ok = in!=NULL;
64        }
65    }
66
67    if (ok)
68    {
69        char  linebuf[MAXLEN];
70        int   readLines        = 0,                        /* Anzahl gelesener Zeilen */
71              keywords         = 0,                        /* Anzahl keywords */
72              maxKeywordlen    = 0,                        /* Laenge des laengsten keywords */
73              lineno           = 0,                        /* fortlaufende Zeilennummer */
74             *wordRead,                                    /* welche Worte wurden in welcher Zeile gelesen */
75              x;
76
77        scanKeywords(line, &keywords, &maxKeywordlen);
78
79        wordRead = (int*)malloc(keywords*sizeof(int));
80        for (x = 0; x<keywords; x++) wordRead[x] = 0;
81
82        /* /----------------------------\ */
83        /* |  CFG lesen und decodieren  | */
84        /* \----------------------------/ */
85
86        while (1)
87        {
88            str firstWord;
89
90            if (!fgets(linebuf, MAXLEN, in)) break;
91            lineno++;
92
93            firstWord = strtok(linebuf, " \n");
94
95            if (firstWord && firstWord[0]!=COMMENT && firstWord[0]!=0)
96            {
97                int search;
98
99                for (search = 0; search<keywords; search++)
100                {
101                    if (strcmp(line[search].keyword, firstWord)==0)
102                    {
103                        str restDerZeile = strtok(NULL, "\n");
104                        int decoded;
105
106                        error_message = NULL;
107                        decoded       = line[search].decode(restDerZeile, line[search].varPointer);
108
109                        if (!decoded)
110                        {
111                            cfgReadWarning(fname, lineno);
112                            if (error_message) warning(error_message);
113                            else               warningf("Can't interpret '%s'", line[search].keyword);
114                            ok = 0;
115                        }
116                        else
117                        {
118                            if (wordRead[search])          /* schonmal gelesen? */
119                            {
120                                if (decoded!=2)            /* mehrfache Verwendung erlaubt? */
121                                {
122                                    cfgReadWarning(fname, lineno);
123                                    warningf("Keyword '%s' duplicated (already specified in line %i)", firstWord, wordRead[search]);
124                                    ok = 0;
125                                }
126                            }
127                            else                           /* nein, dann merken! */
128                            {
129                                wordRead[search] = lineno;
130                                readLines++;
131                            }
132                        }
133
134                        break;
135                    }
136                }
137
138                if (search==keywords)                      /* keyword nicht gefunden! */
139                {
140                    cfgReadWarning(fname, lineno);
141                    warningf("Unknown Keyword '%s'", firstWord);
142                    ok = 0;
143                }
144            }
145        }
146
147        fclose(in);
148
149        /* /----------------------------------------------\ */
150        /* |  Waren alle keywords im CFG-File vorhanden?  | */
151        /* \----------------------------------------------/ */
152
153        if (ok && readLines<keywords)                      /* nein :-( */
154        {
155            FILE *out = fopen(fname, "a");
156
157            if (out)
158            {
159                for (x = 0; x<keywords; x++)
160                {
161                    if (!wordRead[x])
162                    {
163                        fprintf(out, ";%s\n"
164                                     "\n"
165                                     "%-*s %s\n"
166                                     "\n",
167                                     line[x].description,
168                                     maxKeywordlen,
169                                     line[x].keyword,
170                                     line[x].defaultVal);
171                    }
172                }
173
174                fclose(out);
175                warningf("Missing keywords appended to '%s'.", fname);
176            }
177
178            ok = 0;
179        }
180
181        free(wordRead);
182    }
183
184    return ok;
185}
186/* -------------------------------------------------------------------------- */
187/*      void setCfgError(cstr message) */
188/* ------------------------------------------------------ 17.05.95 22.01 ---- */
189void setCfgError(cstr message)
190{
191    error_message = message;
192}
193
194
Note: See TracBrowser for help on using the repository browser.