11 static char *strdupmax(char *str, int length);
12 static char *parseid(char *str);
13 static char *parsevalue(char *str);
14 static char *readline(FILE * fp);
16 static int ConfigLines = 0;
19 static Config_t Fonts[] =
21 {RESOURCE, C_FONT_NORMAL, (void *) "-adobe-times-medium-r-normal--12-120-75-75-p-64-iso8859-1"},
22 {RESOURCE, C_FONT_LIST, (void *) "8x13"},
23 {RESOURCE, C_FONT_LISTCOMPACT, (void *) "6x13"},
24 {RESOURCE, C_FONT_GLOSSARY, (void *) "-adobe-times-medium-r-normal--12-120-75-75-p-64-iso8859-1"},
25 {RESOURCE, C_FONT_GLOSSARYCOMPACT, (void *) "-adobe-times-medium-r-normal--12-120-75-75-p-64-iso8859-1"},
26 {RESOURCE, C_FONT_EXAMPLE, (void *) "7x13"},
27 {RESOURCE, C_FONT_LISTING, (void *) "7x13"},
28 {RESOURCE, C_FONT_ADDRESS, (void *) "8x13"},
29 {RESOURCE, C_FONT_HEADER1, (void *) "-adobe-times-medium-r-normal--20-140-100-100-p-96-iso8859-1"},
30 {RESOURCE, C_FONT_HEADER2, (void *) "-adobe-times-medium-r-normal--18-180-75-75-p-94-iso8859-1"},
31 {RESOURCE, C_FONT_HEADER3, (void *) "-adobe-times-medium-r-normal--17-120-100-100-p-84-iso8859-1"},
32 {RESOURCE, C_FONT_HEADER4, (void *) "-adobe-times-medium-r-normal--14-100-100-100-p-74-iso8859-1"},
33 {RESOURCE, C_FONT_HEADER5, (void *) "-adobe-times-medium-r-normal--14-100-100-100-p-74-iso8859-1"},
34 {RESOURCE, C_FONT_HEADER6, (void *) "-adobe-times-medium-r-normal--14-100-100-100-p-74-iso8859-1"},
35 {RESOURCE, C_FONT_HEADER7, (void *) "-adobe-times-medium-r-normal--14-100-100-100-p-74-iso8859-1"},
36 {EOC, (char *) NULL, (void *) NULL}
40 static Config_t GlobalSettings[] =
42 {RESOURCE, C_TOPMARGIN, (void *) "0"},
43 {RESOURCE, C_BOTTOMMARGIN, (void *) "0"},
44 {RESOURCE, C_LEFTMARGIN, (void *) "0"},
45 {RESOURCE, C_RIGHTMARGIN, (void *) "0"},
46 {RESOURCE, C_FIXEDWIDTHMODE, (void *) "Off"},
47 {RESOURCE, C_FIXEDWIDTH, (void *) "560"},
48 {RESOURCE, C_ONEPAGEMODE, (void *) "Off"},
49 {RESOURCE, C_WIDTH, (void *) "560"},
50 {RESOURCE, C_HEIGHT, (void *) "600"},
51 {RESOURCE, C_DOUBLECLICKTIME, (void *) "500"},
52 {RESOURCE, C_SEARCH, (void *) "Fixed"},
53 {RESOURCE, C_CONTROLPANEL, (void *) "Fixed"},
54 {RESOURCE, C_LIST, (void *) "Fixed"},
55 {RESOURCE, C_RECALL, (void *) "Fixed"},
56 {RESOURCE, C_PAGESETTINGS, (void *) "Fixed"},
57 {EOC, (char *) NULL, (void *) NULL}
61 static Config_t Print[] =
63 {RESOURCE, C_COMMAND, (void *) "lpr"},
64 {RESOURCE, C_FILENAME, (void *) "print.out"},
65 {RESOURCE, C_PRINTTOFILE, (void *) "False"},
66 {RESOURCE, C_TOPMARGIN, (void *) "0"},
67 {RESOURCE, C_BOTTOMMARGIN, (void *) "0"},
68 {RESOURCE, C_LEFTMARGIN, (void *) "0"},
69 {RESOURCE, C_RIGHTMARGIN, (void *) "0"},
70 {RESOURCE, C_WIDTH, (void *) "80"},
71 {EOC, (char *) NULL, (void *) NULL}
75 static Config_t Defaults[] =
77 {DYNAMIC_PTR, C_DEFAULTSTABLE, (void *) NULL},
78 {EOC, (char *) NULL, (void *) NULL}
82 static Config_t KeyBindings[] =
84 {RESOURCE, C_GETPAGE, (void *) "Return"},
85 {RESOURCE, C_PREVWORD, (void *) "Left"},
86 {RESOURCE, C_NEXTWORD, (void *) "Right"},
87 {RESOURCE, C_PREVTAG, (void *) "Up"},
88 {RESOURCE, C_NEXTTAG, (void *) "Down"},
89 {RESOURCE, C_CLOSE, (void *) "^c"},
90 {RESOURCE, C_SEARCH, (void *) "^s"},
91 {RESOURCE, C_SETTINGS, (void *) "S"},
92 {RESOURCE, C_PRINTDOC, (void *) "p"},
93 {RESOURCE, C_LIST, (void *) "L"},
94 {EOC, (char *) NULL, (void *) NULL}
100 {COMMENT, C_COMMENT, (void *) "Erwise configuration file"},
101 {BLOCK, C_FONTS, (void *) &Fonts},
102 {BLOCK, C_KEYBINDINGS, (void *) &KeyBindings},
103 {BLOCK, C_PRINT, (void *) &Print},
104 {BLOCK, C_GLOBALSETTINGS, (void *) &GlobalSettings},
105 {DYNAMIC, C_DEFAULTS, (void *) &Defaults},
106 {EOC, (char *) NULL, (void *) NULL}
114 strdupmax(str, length)
118 char *dup = (char *) NULL;
121 dup = (char *) malloc((length + 1) * sizeof(char));
122 strncpy(dup, str, length);
136 length = strlen(str);
137 if (length && (str[length - 1] == '\n'))
138 str[length - 1] = '\0';
145 * config's code starts here
151 char buffer[BUFFER_SIZE + 1];
152 char *line = (char *) NULL;
156 line = (char *) malloc(sizeof(char));
159 while (!feof(fp) && !strrchr(line, '\n')) {
160 if (data = fgets(buffer, BUFFER_SIZE, fp)) {
162 (char *) realloc(line, (strlen(data) + length) * sizeof(char));
164 length = strlen(line) + 1;
168 printf("read line: '%s'\n", line);
176 * returns a copy of id
182 char *ptr, *id = (char *) NULL;
185 while (str && *str && isspace(*str))
188 while (str && *str && !isspace(str[length]))
190 id = strdupmax(ptr, length);
192 printf("id: '%s'\n", id);
199 * returns a copy of value
206 char *value = (char *) NULL;
208 if (ptr = strchr(str, '=')) {
210 while (ptr && *ptr && isspace(*ptr))
212 value = stripnewline(strdup(ptr));
226 while (walker && (walker->type != EOC)) {
227 if (!strcmp(id, walker->id))
231 return ((Config_t *) NULL);
242 if (!strncmp(id, "{", 1))
243 return (START_OF_BLOCK);
244 if (!strncmp(id, "}", 1))
245 return (END_OF_BLOCK);
246 if (!strncmp(id, "", 1))
248 if (!strncmp(id, "#", 1))
251 if (walker = getitem(id, table))
252 return (walker->type);
258 parsedynamicobject(line)
264 while (ptr && *ptr && isspace(*ptr))
266 return (stripnewline(strdup(ptr)));
270 static int restoredynamicblock(fp, table)
277 char **items = (char **) NULL;
286 switch (getidtype(id, table)) {
294 items = (char **) malloc(2 * sizeof(char *));
298 (char **) realloc(items, (count + 1) * sizeof(char *));
300 items[count - 1] = parsedynamicobject(line);
301 items[count] = (char *) NULL;
303 printf("added to count[%d] value '%s'\n",
304 count - 1, items[count - 1]);
312 table->value = (void *) items;
318 setitemvalue(item, value)
322 void *oldvalue = (void *) NULL;
324 switch (item->type) {
326 oldvalue = item->value;
335 /* error recovery - not needed? */
336 fprintf(stderr, "unknown type for given item\n");
342 static int restoreblock(fp, table)
357 printf("parsing block\n");
359 while (!feof(fp) && !done) {
361 if (line[0] == '\0') {
365 item = getitem(id, table);
366 switch (getidtype(id, table)) {
368 value = parsevalue(line);
369 /* we don't care about this return value... */
370 value = setitemvalue(item, (void *) strdup(value));
375 printf("block: '%s'\n", id);
377 ret = restoreblock(fp, (Config_t *) item->value);
388 while (!syncdone && !feof(fp) && (syncline = readline(fp))) {
389 if (strchr(syncline, '}'))
401 fprintf(stderr, "parse error at line %d\n", ConfigLines);
406 printf("dynamic: '%s'\n", id);
408 ret = restoredynamicblock(fp, (Config_t *) item->value);
412 fprintf(stderr, "Unknown tag type '%s'\n", id);
426 fprintf(stderr, "missing { at %d\n", ConfigLines);
428 fprintf(stderr, "missing } at %d\n", ConfigLines);
431 printf("end of block\n");
436 int ConfigRestore(fp)
440 restoreblock(fp, Config);
444 static void indent(fp, depth)
449 fprintf(fp, INDENT_STR);
453 int saveblock(fp, table, depth)
459 char **dynamic_object;
463 while (walker && (walker->type != EOC)) {
464 switch (walker->type) {
466 fprintf(fp, "# %s\n", (char *) walker->value);
470 fprintf(fp, "%s = %s\n", walker->id, (char *) walker->value);
473 if (dynamic_object = (char **) walker->value)
474 while (*dynamic_object) {
476 fprintf(fp, "%s\n", (char *) *dynamic_object);
484 fprintf(fp, "%s\n", walker->id);
487 if (walker->type == BLOCK)
488 ret = saveblock(fp, (Config_t *) walker->value, depth + 1);
490 ret = saveblock(fp, (Config_t *) walker->value, depth + 1);
495 * case DYNAMIC: indent(fp, depth - 1); fprintf(fp, "%s\n",
496 * walker->id); indent(fp, depth - 1); fprintf(fp, "{\n"); ret =
497 * saveblock(fp, (Config_t *)walker->value, depth + 1);
498 * indent(fp, depth - 1); fprintf(fp, "}\n"); break;
501 fprintf(stderr, "unknown type for '%s'\n", walker->id);
511 saveblock(fp, Config, 0);
516 static void configinitloop(table)
522 while (walker && (walker->type != EOC)) {
523 switch (walker->type) {
525 walker->value = (void *) strdup((char *) walker->value);
527 printf("init: '%s': '%s'\n", walker->id, (void *) walker->value);
532 printf("init: table = %s\n", walker->id);
534 configinitloop((Config_t *) walker->value);
542 void ConfigInit(void)
544 configinitloop(Config);
549 ConfigGetValue(tableptr, id)
553 Config_t *table = (Config_t *) tableptr;
558 if (item = getitem(id, table))
559 return (item->value);
560 return ((void *) NULL);
565 ConfigSetValue(tableptr, id, value)
570 Config_t *table = (Config_t *) tableptr;
571 void *ret = (void *) NULL;
576 if (item = getitem(id, table))
577 switch (item->type) {