source: tags/ms_r16q4/TREEGEN/readcfg.c

Last change on this file was 7811, checked in by westram, 13 years ago

merge from dev [7748] [7749] [7750]

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