/[CvsGraph]/cvsgraph/readconf.c
ViewVC logotype

Diff of /cvsgraph/readconf.c

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph | View Patch Patch

revision 1.1, Tue Jan 1 21:03:23 2002 UTC revision 1.19, Wed Oct 20 22:03:36 2004 UTC
# Line 2  Line 2 
2   * CvsGraph graphical representation generator of brances and revisions   * CvsGraph graphical representation generator of brances and revisions
3   * of a file in cvs/rcs.   * of a file in cvs/rcs.
4   *   *
5   * Copyright (C) 2001  B. Stultiens   * Copyright (C) 2001,2002  B. Stultiens
6   *   *
7   * This program is free software; you can redistribute it and/or modify   * This program is free software; you can redistribute it and/or modify
8   * it under the terms of the GNU General Public License as published by   * it under the terms of the GNU General Public License as published by
# Line 50  Line 50 
50                  font_t  *f;                  font_t  *f;
51                  char    **s;                  char    **s;
52                  color_t *c;                  color_t *c;
53                  int     val;    /* FIXME: Oops, sizeof(int) must be sizeof(void *) */                  double  *d;
54                    INTTYPE val;
55          } confref;          } confref;
56  } keyword_t;  } keyword_t;
57    
58  typedef union {  typedef union {
59          keyword_t       *kw;          keyword_t       *kw;
60          int             i;          int             i;
61            double          d;
62          char            *str;          char            *str;
63  } YYSTYPE;  } YYSTYPE;
64    
# Line 73  Line 75 
75          TYPE_BOOLEAN,          TYPE_BOOLEAN,
76          TYPE_COLOR,          TYPE_COLOR,
77          TYPE_FONT,          TYPE_FONT,
78          TYPE_STRING          TYPE_STRING,
79            TYPE_DOUBLE
80  };  };
81    
82  static keyword_t keywords[] = {  static keyword_t keywords[] = {
83          { "branch_bgcolor",     TYPE_COLOR,     { &conf.branch_bgcolor } },          { "branch_bgcolor",     TYPE_COLOR,     { &conf.branch_bgcolor } },
84          { "branch_bspace",      TYPE_NUMBER,    { &conf.branch_bspace } },          { "branch_bspace",      TYPE_NUMBER,    { &conf.branch_bspace } },
85          { "branch_color",       TYPE_COLOR,     { &conf.branch_color } },          { "branch_color",       TYPE_COLOR,     { &conf.branch_color } },
86          { "branch_font",        TYPE_FONT,      { &conf.branch_font } },          { "branch_font",        TYPE_FONT,      { &conf.branch_font.gdfont } },
87            { "branch_ttfont",      TYPE_STRING,    { &conf.branch_font.ttfont } },
88            { "branch_ttsize",      TYPE_DOUBLE,    { &conf.branch_font.ttsize } },
89            { "branch_tag_color",   TYPE_COLOR,     { &conf.branch_tag_color } },
90            { "branch_tag_font",    TYPE_FONT,      { &conf.branch_tag_font.gdfont } },
91            { "branch_tag_ttfont",  TYPE_STRING,    { &conf.branch_tag_font.ttfont } },
92            { "branch_tag_ttsize",  TYPE_DOUBLE,    { &conf.branch_tag_font.ttsize } },
93          { "branch_lspace",      TYPE_NUMBER,    { &conf.branch_lspace } },          { "branch_lspace",      TYPE_NUMBER,    { &conf.branch_lspace } },
94          { "branch_rspace",      TYPE_NUMBER,    { &conf.branch_rspace } },          { "branch_rspace",      TYPE_NUMBER,    { &conf.branch_rspace } },
95          { "branch_tspace",      TYPE_NUMBER,    { &conf.branch_tspace } },          { "branch_tspace",      TYPE_NUMBER,    { &conf.branch_tspace } },
96          { "branch_connect",     TYPE_NUMBER,    { &conf.branch_connect } },          { "branch_connect",     TYPE_NUMBER,    { &conf.branch_connect } },
97          { "branch_margin",      TYPE_NUMBER,    { &conf.branch_margin } },          { "branch_margin",      TYPE_NUMBER,    { &conf.branch_margin } },
98          { "branch_dupbox",      TYPE_BOOLEAN,   { &conf.branch_dupbox } },          { "branch_dupbox",      TYPE_BOOLEAN,   { &conf.branch_dupbox } },
99            { "branch_fold",        TYPE_BOOLEAN,   { &conf.branch_fold } },
100            { "branch_foldall",     TYPE_BOOLEAN,   { &conf.branch_foldall } },
101            { "branch_resort",      TYPE_BOOLEAN,   { &conf.branch_resort } },
102            { "branch_subtree",     TYPE_STRING,    { &conf.branch_subtree } },
103          { "upside_down",        TYPE_BOOLEAN,   { &conf.upside_down } },          { "upside_down",        TYPE_BOOLEAN,   { &conf.upside_down } },
104          { "auto_kern",          TYPE_BOOLEAN,   { &conf.auto_kern } },          { "left_right",         TYPE_BOOLEAN,   { &conf.left_right } },
105            { "auto_stretch",       TYPE_BOOLEAN,   { &conf.auto_stretch } },
106          { "color_bg",           TYPE_COLOR,     { &conf.color_bg } },          { "color_bg",           TYPE_COLOR,     { &conf.color_bg } },
107            { "transparent_bg",     TYPE_BOOLEAN,   { &conf.transparent_bg } },
108          { "cvsmodule",          TYPE_STRING,    { &conf.cvsmodule } },          { "cvsmodule",          TYPE_STRING,    { &conf.cvsmodule } },
109          { "cvsroot",            TYPE_STRING,    { &conf.cvsroot } },          { "cvsroot",            TYPE_STRING,    { &conf.cvsroot } },
110          { "date_format",        TYPE_STRING,    { &conf.date_format } },          { "date_format",        TYPE_STRING,    { &conf.date_format } },
111          { "box_shadow",         TYPE_BOOLEAN,   { &conf.box_shadow } },          { "box_shadow",         TYPE_BOOLEAN,   { &conf.box_shadow } },
112          { "strip_untagged",     TYPE_BOOLEAN,   { &conf.strip_untagged } },          { "strip_untagged",     TYPE_BOOLEAN,   { &conf.strip_untagged } },
113          { "strip_first_rev",    TYPE_BOOLEAN,   { &conf.strip_first_rev } },          { "strip_first_rev",    TYPE_BOOLEAN,   { &conf.strip_first_rev } },
114            { "anti_alias",         TYPE_BOOLEAN,   { &conf.anti_alias } },
115            { "use_ttf",            TYPE_BOOLEAN,   { &conf.use_ttf } },
116            { "parse_logs",         TYPE_BOOLEAN,   { &conf.parse_logs } },
117            { "html_level",         TYPE_NUMBER,    { &conf.html_level } },
118            { "thick_lines",        TYPE_NUMBER,    { &conf.thick_lines } },
119            { "msg_color",          TYPE_COLOR,     { &conf.msg_color } },
120            { "msg_font",           TYPE_FONT,      { &conf.msg_font.gdfont } },
121            { "msg_ttfont",         TYPE_STRING,    { &conf.msg_font.ttfont } },
122            { "msg_ttsize",         TYPE_DOUBLE,    { &conf.msg_font.ttsize } },
123            { "rev_hidenumber",     TYPE_BOOLEAN,   { &conf.rev_hidenumber } },
124          { "rev_color",          TYPE_COLOR,     { &conf.rev_color } },          { "rev_color",          TYPE_COLOR,     { &conf.rev_color } },
125          { "rev_bgcolor",        TYPE_COLOR,     { &conf.rev_bgcolor } },          { "rev_bgcolor",        TYPE_COLOR,     { &conf.rev_bgcolor } },
126          { "rev_font",           TYPE_FONT,      { &conf.rev_font } },          { "rev_font",           TYPE_FONT,      { &conf.rev_font.gdfont } },
127            { "rev_ttfont",         TYPE_STRING,    { &conf.rev_font.ttfont } },
128            { "rev_ttsize",         TYPE_DOUBLE,    { &conf.rev_font.ttsize } },
129          { "rev_separator",      TYPE_NUMBER,    { &conf.rev_separator } },          { "rev_separator",      TYPE_NUMBER,    { &conf.rev_separator } },
130          { "rev_minline",        TYPE_NUMBER,    { &conf.rev_minline } },          { "rev_minline",        TYPE_NUMBER,    { &conf.rev_minline } },
131          { "rev_maxline",        TYPE_NUMBER,    { &conf.rev_maxline } },          { "rev_maxline",        TYPE_NUMBER,    { &conf.rev_maxline } },
# Line 108  Line 135 
135          { "rev_bspace",         TYPE_NUMBER,    { &conf.rev_bspace } },          { "rev_bspace",         TYPE_NUMBER,    { &conf.rev_bspace } },
136          { "rev_text",           TYPE_STRING,    { &conf.rev_text } },          { "rev_text",           TYPE_STRING,    { &conf.rev_text } },
137          { "rev_text_color",     TYPE_COLOR,     { &conf.rev_text_color } },          { "rev_text_color",     TYPE_COLOR,     { &conf.rev_text_color } },
138          { "rev_text_font",      TYPE_FONT,      { &conf.rev_text_font } },          { "rev_text_font",      TYPE_FONT,      { &conf.rev_text_font.gdfont } },
139            { "rev_text_ttfont",    TYPE_STRING,    { &conf.rev_text_font.ttfont } },
140            { "rev_text_ttsize",    TYPE_DOUBLE,    { &conf.rev_text_font.ttsize } },
141            { "rev_maxtags",        TYPE_NUMBER,    { &conf.rev_maxtags } },
142            { "merge_color",        TYPE_COLOR,     { &conf.merge_color } },
143            { "merge_from",         TYPE_STRING,    { &conf.merge_from } },
144            { "merge_to",           TYPE_STRING,    { &conf.merge_to } },
145            { "merge_findall",      TYPE_BOOLEAN,   { &conf.merge_findall } },
146            { "merge_front",        TYPE_BOOLEAN,   { &conf.merge_front } },
147            { "merge_nocase",       TYPE_BOOLEAN,   { &conf.merge_nocase } },
148            { "merge_arrows",       TYPE_BOOLEAN,   { &conf.merge_arrows } },
149            { "merge_cvsnt",        TYPE_BOOLEAN,   { &conf.merge_cvsnt } },
150            { "merge_cvsnt_color",  TYPE_COLOR,     { &conf.merge_cvsnt_color } },
151            { "arrow_width",        TYPE_NUMBER,    { &conf.arrow_width } },
152            { "arrow_length",       TYPE_NUMBER,    { &conf.arrow_length } },
153          { "tag_color",          TYPE_COLOR,     { &conf.tag_color } },          { "tag_color",          TYPE_COLOR,     { &conf.tag_color } },
154          { "tag_font",           TYPE_FONT,      { &conf.tag_font } },          { "tag_font",           TYPE_FONT,      { &conf.tag_font.gdfont } },
155            { "tag_ttfont",         TYPE_STRING,    { &conf.tag_font.ttfont } },
156            { "tag_ttsize",         TYPE_DOUBLE,    { &conf.tag_font.ttsize } },
157            { "tag_ignore",         TYPE_STRING,    { &conf.tag_ignore } },
158            { "tag_ignore_merge",   TYPE_BOOLEAN,   { &conf.tag_ignore_merge } },
159            { "tag_nocase",         TYPE_BOOLEAN,   { &conf.tag_nocase } },
160            { "tag_negate",         TYPE_BOOLEAN,   { &conf.tag_negate } },
161          { "title",              TYPE_STRING,    { &conf.title } },          { "title",              TYPE_STRING,    { &conf.title } },
162          { "title_x",            TYPE_NUMBER,    { &conf.title_x } },          { "title_x",            TYPE_NUMBER,    { &conf.title_x } },
163          { "title_y",            TYPE_NUMBER,    { &conf.title_y } },          { "title_y",            TYPE_NUMBER,    { &conf.title_y } },
164          { "title_font",         TYPE_FONT,      { &conf.title_font } },          { "title_font",         TYPE_FONT,      { &conf.title_font.gdfont } },
165            { "title_ttfont",       TYPE_STRING,    { &conf.title_font.ttfont } },
166            { "title_ttsize",       TYPE_DOUBLE,    { &conf.title_font.ttsize } },
167          { "title_align",        TYPE_NUMBER,    { &conf.title_align } },          { "title_align",        TYPE_NUMBER,    { &conf.title_align } },
168          { "title_color",        TYPE_COLOR,     { &conf.title_color } },          { "title_color",        TYPE_COLOR,     { &conf.title_color } },
169          { "margin_top",         TYPE_NUMBER,    { &conf.margin_top } },          { "margin_top",         TYPE_NUMBER,    { &conf.margin_top } },
# Line 130  Line 179 
179          { "map_rev_alt",        TYPE_STRING,    { &conf.map_rev_alt } },          { "map_rev_alt",        TYPE_STRING,    { &conf.map_rev_alt } },
180          { "map_diff_href",      TYPE_STRING,    { &conf.map_diff_href } },          { "map_diff_href",      TYPE_STRING,    { &conf.map_diff_href } },
181          { "map_diff_alt",       TYPE_STRING,    { &conf.map_diff_alt } },          { "map_diff_alt",       TYPE_STRING,    { &conf.map_diff_alt } },
182            { "map_merge_href",     TYPE_STRING,    { &conf.map_merge_href } },
183            { "map_merge_alt",      TYPE_STRING,    { &conf.map_merge_alt } },
184          { "jpeg",               TYPE_VALUE,     { (void *)IMAGE_JPEG } },          { "jpeg",               TYPE_VALUE,     { (void *)IMAGE_JPEG } },
185          { "png",                TYPE_VALUE,     { (void *)IMAGE_PNG } },          { "png",                TYPE_VALUE,     { (void *)IMAGE_PNG } },
186          { "gif",                TYPE_VALUE,     { (void *)IMAGE_GIF } },          { "gif",                TYPE_VALUE,     { (void *)IMAGE_GIF } },
187          { "true",               TYPE_VALUE,     { (void *)1 } },          { "true",               TYPE_VALUE,     { (void *)1 } },
188          { "false",              TYPE_VALUE,     { (void *)0 } },          { "false",              TYPE_VALUE,     { (void *)0 } },
189            { "not",                TYPE_VALUE,     { (void *)-1 } },
190          { "left",               TYPE_VALUE,     { (void *)0 } },          { "left",               TYPE_VALUE,     { (void *)0 } },
191          { "center",             TYPE_VALUE,     { (void *)1 } },          { "center",             TYPE_VALUE,     { (void *)1 } },
192          { "right",              TYPE_VALUE,     { (void *)2 } },          { "right",              TYPE_VALUE,     { (void *)2 } },
# Line 143  Line 195 
195          { "medium",             TYPE_VALUE,     { (void *)2 } },          { "medium",             TYPE_VALUE,     { (void *)2 } },
196          { "large",              TYPE_VALUE,     { (void *)3 } },          { "large",              TYPE_VALUE,     { (void *)3 } },
197          { "giant",              TYPE_VALUE,     { (void *)4 } },          { "giant",              TYPE_VALUE,     { (void *)4 } },
198            { "HTML3",              TYPE_VALUE,     { (void *)1 } },
199            { "HTML4",              TYPE_VALUE,     { (void *)2 } },
200            { "XHTML",              TYPE_VALUE,     { (void *)3 } },
201  };  };
202    
203  #define NKEYWORDS       (sizeof(keywords) / sizeof(keywords[0]))  #define NKEYWORDS       (sizeof(keywords) / sizeof(keywords[0]))
# Line 209  Line 264 
264          fprintf(DEBUGSTREAM, "%i\n", i);          fprintf(DEBUGSTREAM, "%i\n", i);
265  }  }
266    
267  static void debug_pfont(const char *n, font_t f)  static void debug_pdouble(const char *n, double d)
268    {
269            debug_pname(n);
270            fprintf(DEBUGSTREAM, "%g\n", d);
271    }
272    
273    static void debug_pfont(const char *n, gdFontPtr f)
274  {  {
275          const char *s = "<Unknown font>";          const char *s = "<Unknown font>";
276          debug_pname(n);          debug_pname(n);
# Line 241  Line 302 
302          debug_pcolor("color_bg", &conf.color_bg);          debug_pcolor("color_bg", &conf.color_bg);
303          debug_pbool("box_shadow", conf.box_shadow);          debug_pbool("box_shadow", conf.box_shadow);
304          debug_pbool("upside_down", conf.upside_down);          debug_pbool("upside_down", conf.upside_down);
305            debug_pbool("left_right", conf.left_right);
306          debug_pbool("strip_untagged", conf.strip_untagged);          debug_pbool("strip_untagged", conf.strip_untagged);
307          debug_pbool("strip_first_rev", conf.strip_first_rev);          debug_pbool("strip_first_rev", conf.strip_first_rev);
308          debug_pbool("auto_kern", conf.auto_kern);          debug_pbool("auto_stretch", conf.auto_stretch);
309            debug_pbool("anti_alias", conf.anti_alias);
310          debug_pfont("tag_font", conf.tag_font);          debug_pbool("use_ttf", conf.use_ttf);
311            debug_pint("thick_lines", conf.thick_lines);
312    
313            debug_pfont("tag_font", conf.tag_font.gdfont);
314            debug_pstring("tag_ttfont", conf.tag_font.ttfont);
315            debug_psouble("tag_ttsize", conf.tag_font.ttsize);
316          debug_pcolor("tag_color", &conf.tag_color);          debug_pcolor("tag_color", &conf.tag_color);
317    
318          debug_pfont("rev_font", conf.rev_font);          debug_pfont("rev_font", conf.rev_font.gdfont);
319            debug_pstring("rev_ttfont", conf.rev_font.ttfont);
320            debug_pdouble("rev_ttsize", conf.rev_font.ttsize);
321          debug_pcolor("rev_color", &conf.rev_color);          debug_pcolor("rev_color", &conf.rev_color);
322          debug_pcolor("rev_bgcolor", &conf.rev_bgcolor);          debug_pcolor("rev_bgcolor", &conf.rev_bgcolor);
323          debug_pint("rev_separator", conf.rev_separator);          debug_pint("rev_separator", conf.rev_separator);
# Line 260  Line 329 
329          debug_pint("rev_bspace", conf.rev_bspace);          debug_pint("rev_bspace", conf.rev_bspace);
330          debug_pstring("rev_text", conf.rev_text);          debug_pstring("rev_text", conf.rev_text);
331          debug_pcolor("rev_text_color", &conf.rev_text_color);          debug_pcolor("rev_text_color", &conf.rev_text_color);
332          debug_pfont("rev_text_font", conf.rev_text_font);          debug_pfont("rev_text_font", conf.rev_text_font.gdfont);
333            debug_pstring("rev_text_ttfont", conf.rev_text_font.ttfont);
334          debug_pfont("branch_font", conf.branch_font);          debug_pdouble("rev_text_ttsize", conf.rev_text_font.ttsize);
335    
336            debug_pfont("branch_font", conf.branch_font.gdfont);
337            debug_pstring("branch_ttfont", conf.branch_font.ttfont);
338            debug_pdouble("branch_ttsize", conf.branch_font.ttsize);
339          debug_pcolor("branch_color", &conf.branch_color);          debug_pcolor("branch_color", &conf.branch_color);
340            debug_pfont("branch_tag_font", conf.branch_tag_font.gdfont);
341            debug_pstring("branch_tag_ttfont", conf.branch_tag_font.ttfont);
342            debug_pdouble("branch_tag_ttsize", conf.branch_tag_font.ttsize);
343            debug_pcolor("branch_tag_color", &conf.branch_tag_color);
344          debug_pcolor("branch_bgcolor", &conf.branch_bgcolor);          debug_pcolor("branch_bgcolor", &conf.branch_bgcolor);
345          debug_pint("branch_lspace", conf.branch_lspace);          debug_pint("branch_lspace", conf.branch_lspace);
346          debug_pint("branch_rspace", conf.branch_rspace);          debug_pint("branch_rspace", conf.branch_rspace);
# Line 276  Line 353 
353          debug_pstring("title", conf.title);          debug_pstring("title", conf.title);
354          debug_pint("title_x", conf.title_x);          debug_pint("title_x", conf.title_x);
355          debug_pint("title_y", conf.title_y);          debug_pint("title_y", conf.title_y);
356          debug_pfont("title_font", conf.title_font);          debug_pfont("title_font", conf.title_font.gdfont);
357            debug_pstring("title_ttfont", conf.title_font.ttfont);
358            debug_pdouble("title_ttsize", conf.title_font.ttsize);
359          debug_pint("title_align", conf.title_align);          debug_pint("title_align", conf.title_align);
360          debug_pcolor("title_color", &conf.title_color);          debug_pcolor("title_color", &conf.title_color);
361    
# Line 468  Line 547 
547                                                  c[0] = get_input();                                                  c[0] = get_input();
548                                                  c[1] = get_input();                                                  c[1] = get_input();
549                                                  c[2] = '\0';                                                  c[2] = '\0';
550                                                  if(!isxdigit(c[0]) || !isxdigit(c[1]))                                                  if(!isxdigit((int)(unsigned char)c[0]) || !isxdigit((int)(unsigned char)c[1]))
551                                                          yyerror("Invalid hex escape");                                                          stack_msg(MSG_ERR, "config: %d: Invalid hex escape", line_number);
552                                                  add_str((int)strtol(c, NULL, 16));                                                  add_str((int)strtol(c, NULL, 16));
553                                                  break;                                                  break;
554                                          case '0':                                          case '0':
# Line 488  Line 567 
567                                                  add_str((int)strtol(c, NULL, 8));                                                  add_str((int)strtol(c, NULL, 8));
568                                                  break;                                                  break;
569                                          case EOF:                                          case EOF:
570                                                    yyerror("Unexpected EOF in escape");                                                  yyerror("Unexpected EOF in escape");
571                                                    break;                                                  break;
572                                          }                                          }
573                                          break;                                          break;
574                                  case '"':                                  case '"':
# Line 519  Line 598 
598                                  while(1)                                  while(1)
599                                  {                                  {
600                                          ch = get_input();                                          ch = get_input();
601                                          if(isalpha(ch) || ch == '_')                                          if(isalnum(ch) || ch == '_')
602                                                  add_str(ch);                                                  add_str(ch);
603                                          else                                          else
604                                          {                                          {
# Line 530  Line 609 
609                                  skw.keyword = get_str();                                  skw.keyword = get_str();
610                                  kw = bsearch(&skw, keywords, NKEYWORDS, sizeof(keywords[0]), cmp_kw);                                  kw = bsearch(&skw, keywords, NKEYWORDS, sizeof(keywords[0]), cmp_kw);
611                                  if(!kw)                                  if(!kw)
612                                          yyerror("Unknown keyword '%s'", skw.keyword);                                  {
613                                            stack_msg(MSG_ERR, "config: %d: Unknown keyword '%s'", line_number, skw.keyword);
614                                            yylval.kw = NULL;
615                                            return TYPE_KEYWORD;
616                                    }
617                                  xfree(skw.keyword);                                  xfree(skw.keyword);
618                                  if(kw->type == TYPE_VALUE)                                  if(kw->type == TYPE_VALUE)
619                                  {                                  {
620                                          yylval.i = kw->confref.val;                                          yylval.i = (int)kw->confref.val;
621                                          return TYPE_NUMBER;                                          return TYPE_NUMBER;
622                                  }                                  }
623                                  yylval.kw = kw;                                  yylval.kw = kw;
# Line 544  Line 627 
627                          {                          {
628                                  char *s;                                  char *s;
629                                  char *eptr;                                  char *eptr;
630                                    int type = TYPE_NUMBER;
631                                  /* Collect number */                                  /* Collect number */
632                                  reset_str();                                  reset_str();
633                                  add_str(ch);                                  add_str(ch);
634                                  while(1)                                  while(1)
635                                  {                                  {
636                                          ch = get_input();                                          ch = get_input();
637                                          if(isxdigit(ch) || ch == 'x' || ch == 'X') /* Not exact, but close enough */                                          if(isxdigit(ch) || ch == 'x' || ch == 'X' || ch == '.') /* Not exact, but close enough */
638                                                  add_str(ch);                                                  add_str(ch);
639                                          else                                          else
640                                          {                                          {
641                                                  unget_input(ch);                                                  unget_input(ch);
642                                                  break;                                                  break;
643                                          }                                          }
644                                            if(ch == '.')
645                                                    type = TYPE_DOUBLE;
646                                  }                                  }
647                                  s = get_str();                                  s = get_str();
648                                  yylval.i = strtol(s, &eptr, 0);                                  if(type == TYPE_DOUBLE)
649                                  if(*eptr)                                  {
650                                          yyerror("Invalid number");                                          yylval.d = strtod(s, &eptr);
651                                            if(*eptr)
652                                                    stack_msg(MSG_ERR, "config: %d: Invalid floating point number", line_number);
653                                    }
654                                    else
655                                    {
656                                            yylval.i = strtol(s, &eptr, 0);
657                                            if(*eptr)
658                                                    stack_msg(MSG_ERR, "config: %d: Invalid number", line_number);
659                                    }
660                                  xfree(s);                                  xfree(s);
661                                  return TYPE_NUMBER;                                  return type;
662                          }                          }
663                          else                          else
664                                  yyerror("Unmatched text '%c' (0x%02x)", isprint(ch) ? ch : ' ', ch);                                  yyerror("Unmatched text '%c' (0x%02x)", isprint(ch) ? ch : ' ', ch);
# Line 578  Line 673 
673          if(*s != '#' || strlen(s) != 7)          if(*s != '#' || strlen(s) != 7)
674          {          {
675  colorerror:  colorerror:
676                  yyerror("Invalid color value");                  stack_msg(MSG_ERR, "config: %d: Invalid color value '%s'", line_number, s);
677                    return;
678          }          }
679          c->b = strtol(s+5, &cptr, 16);          c->b = strtol(s+5, &cptr, 16);
680          if(*cptr)          if(*cptr)
# Line 636  Line 732 
732                  if(token == EOF)                  if(token == EOF)
733                  {                  {
734                          if(state)                          if(state)
735                                  yyerror("Unexpected EOF");                                  stack_msg(MSG_ERR, "config: %d: Unexpected EOF", line_number);
736                          break;                          break;
737                  }                  }
738    
# Line 649  Line 745 
745                                  state = 1;                                  state = 1;
746                          }                          }
747                          else if(token != ';')                          else if(token != ';')
748                                  yyerror("Keyword expected");                                  stack_msg(MSG_ERR, "config: %d: Keyword expected", line_number);
749                          break;                          break;
750                  case 1:                  case 1:
751                          if(token != '=')                          if(token != '=')
752                                  yyerror("'=' expected");                          {
753                          state = 2;                                  stack_msg(MSG_ERR, "config: %d: '=' expected", line_number);
754                                    while(1)
755                                    {
756                                            token = config_lex();
757                                            if(token == ';')
758                                            {
759                                                    state = 0;
760                                                    break;
761                                            }
762                                            else if(token == EOF)
763                                                    break;
764                                    }
765                            }
766                            else
767                                    state = 2;
768                          break;                          break;
769                  case 2:                  case 2:
770                            if(!kw)
771                            {
772                                    /* Error recovery of failed keyword */
773                                    state = 3;
774                                    break;
775                            }
776                          if(kw->type == TYPE_FONT || kw->type == TYPE_BOOLEAN)                          if(kw->type == TYPE_FONT || kw->type == TYPE_BOOLEAN)
777                                  t = TYPE_NUMBER;                                  t = TYPE_NUMBER;
778                          else if(kw->type == TYPE_COLOR)                          else if(kw->type == TYPE_COLOR)
779                                  t = TYPE_STRING;                                  t = TYPE_STRING;
780                          else                          else
781                                  t = kw->type;                                  t = kw->type;
782    
783                            if(token == TYPE_NUMBER && kw->type == TYPE_DOUBLE)
784                            {
785                                    /* Auto promote numbers to doubles if required */
786                                    yylval.d = (double)yylval.i;
787                                    token = TYPE_DOUBLE;
788                            }
789    
790                          if(token != t)                          if(token != t)
791                          {                          {
792                                  char *e;                                  char *e;
793                                  switch(kw->type)                                  switch(kw->type)
794                                  {                                  {
795                                  case TYPE_STRING:       e = "String"; break;                                  case TYPE_STRING:       e = "String"; yylval.str = xstrdup("error recovery"); break;
796                                  case TYPE_NUMBER:       e = "Number"; break;                                  case TYPE_NUMBER:       e = "Number"; yylval.i = 0; break;
797                                  case TYPE_COLOR:        e = "Color"; break;                                  case TYPE_COLOR:        e = "Color"; yylval.str = xstrdup("#123456"); break;
798                                  case TYPE_FONT:         e = "Font"; break;                                  case TYPE_FONT:         e = "Font"; yylval.i = 0; break;
799                                  case TYPE_BOOLEAN:      e = "Boolean"; break;                                  case TYPE_BOOLEAN:      e = "Boolean"; yylval.i = 0; break;
800                                  default:                e = "Internal error: Unknown type"; break;                                  case TYPE_DOUBLE:       e = "Double"; yylval.d = 0.0; break;
801                                    default:                e = "Internal error: Unknown type"; yylval.i = 0; break;
802                                  }                                  }
803                                  yyerror("%s expected", e);                                  stack_msg(MSG_ERR, "config: %d: %s expected", line_number, e);
804                          }                          }
805  #ifdef DEBUG  #ifdef DEBUG
806                          printf("processing: '%s'\n", kw->keyword);                          printf("processing: '%s'\n", kw->keyword);
# Line 690  Line 814 
814                                          *kw->confref.i = yylval.i;                                          *kw->confref.i = yylval.i;
815                                          break;                                          break;
816                                  case TYPE_BOOLEAN:                                  case TYPE_BOOLEAN:
817                                          *kw->confref.i = yylval.i != 0;                                          if(yylval.i == -1)
818                                                    *kw->confref.i = !*kw->confref.i;
819                                            else
820                                                    *kw->confref.i = yylval.i != 0;
821                                          break;                                          break;
822                                  case TYPE_COLOR:                                  case TYPE_COLOR:
823                                          set_color(kw->confref.c, yylval.str);                                          set_color(kw->confref.c, yylval.str);
824                                          break;                                          break;
825                                  case TYPE_FONT:                                  case TYPE_FONT:
826                                          *kw->confref.f = get_font(yylval.i);                                          kw->confref.f->gdfont = get_font(yylval.i);
827                                            break;
828                                    case TYPE_DOUBLE:
829                                            *kw->confref.d = yylval.d;
830                                          break;                                          break;
831                                  default:                                  default:
832                                          yyerror("Internal error: Unknown type passed %d", kw->type);                                          yyerror("Internal error: Unknown type passed %d", kw->type);
# Line 706  Line 836 
836                          break;                          break;
837                  case 3:                  case 3:
838                          if(token != ';')                          if(token != ';')
839                                  yyerror("';' expected");                                  stack_msg(MSG_ERR, "config: %d: ';' expected", line_number);
840                          state = 0;                          state = 0;
841                          break;                          break;
842                  default:                  default:

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.19

  ViewVC Help
Powered by ViewVC 1.1.0 with CvsGraph 1.7.0