/[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.2, Wed Jan 9 00:28:36 2002 UTC revision 1.22, Wed Jun 22 22:51:51 2005 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 42  Line 42 
42    
43  typedef struct  typedef struct
44  {  {
45          char    *keyword;          const char      *keyword;
46          int     type;          int             type;
47          union {          union {
48                  void    *v;     /* join of other values */                  void    *v;     /* join of other values */
49                  int     *i;                  int     *i;
# Line 51  Line 51 
51                  char    **s;                  char    **s;
52                  color_t *c;                  color_t *c;
53                  double  *d;                  double  *d;
54                  int     val;    /* FIXME: Oops, sizeof(int) must be sizeof(void *) */                  INTTYPE val;
55          } confref;          } confref;
56  } keyword_t;  } keyword_t;
57    
# Line 96  Line 96 
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            { "left_right",         TYPE_BOOLEAN,   { &conf.left_right } },
105          { "auto_stretch",       TYPE_BOOLEAN,   { &conf.auto_stretch } },          { "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 } },          { "transparent_bg",     TYPE_BOOLEAN,   { &conf.transparent_bg } },
# Line 108  Line 113 
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 } },          { "anti_alias",         TYPE_BOOLEAN,   { &conf.anti_alias } },
115          { "use_ttf",            TYPE_BOOLEAN,   { &conf.use_ttf } },          { "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.gdfont } },          { "rev_font",           TYPE_FONT,      { &conf.rev_font.gdfont } },
# Line 125  Line 138 
138          { "rev_text_font",      TYPE_FONT,      { &conf.rev_text_font.gdfont } },          { "rev_text_font",      TYPE_FONT,      { &conf.rev_text_font.gdfont } },
139          { "rev_text_ttfont",    TYPE_STRING,    { &conf.rev_text_font.ttfont } },          { "rev_text_ttfont",    TYPE_STRING,    { &conf.rev_text_font.ttfont } },
140          { "rev_text_ttsize",    TYPE_DOUBLE,    { &conf.rev_text_font.ttsize } },          { "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.gdfont } },          { "tag_font",           TYPE_FONT,      { &conf.tag_font.gdfont } },
155          { "tag_ttfont",         TYPE_STRING,    { &conf.tag_font.ttfont } },          { "tag_ttfont",         TYPE_STRING,    { &conf.tag_font.ttfont } },
156          { "tag_ttsize",         TYPE_DOUBLE,    { &conf.tag_font.ttsize } },          { "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 } },
# Line 143  Line 172 
172          { "margin_right",       TYPE_NUMBER,    { &conf.margin_right } },          { "margin_right",       TYPE_NUMBER,    { &conf.margin_right } },
173          { "image_type",         TYPE_NUMBER,    { &conf.image_type } },          { "image_type",         TYPE_NUMBER,    { &conf.image_type } },
174          { "image_quality",      TYPE_NUMBER,    { &conf.image_quality } },          { "image_quality",      TYPE_NUMBER,    { &conf.image_quality } },
175            { "image_compress",     TYPE_NUMBER,    { &conf.image_compress } },
176            { "image_interlace",    TYPE_BOOLEAN,   { &conf.image_interlace } },
177          { "map_name",           TYPE_STRING,    { &conf.map_name } },          { "map_name",           TYPE_STRING,    { &conf.map_name } },
178          { "map_branch_href",    TYPE_STRING,    { &conf.map_branch_href } },          { "map_branch_href",    TYPE_STRING,    { &conf.map_branch_href } },
179          { "map_branch_alt",     TYPE_STRING,    { &conf.map_branch_alt } },          { "map_branch_alt",     TYPE_STRING,    { &conf.map_branch_alt } },
# Line 150  Line 181 
181          { "map_rev_alt",        TYPE_STRING,    { &conf.map_rev_alt } },          { "map_rev_alt",        TYPE_STRING,    { &conf.map_rev_alt } },
182          { "map_diff_href",      TYPE_STRING,    { &conf.map_diff_href } },          { "map_diff_href",      TYPE_STRING,    { &conf.map_diff_href } },
183          { "map_diff_alt",       TYPE_STRING,    { &conf.map_diff_alt } },          { "map_diff_alt",       TYPE_STRING,    { &conf.map_diff_alt } },
184            { "map_merge_href",     TYPE_STRING,    { &conf.map_merge_href } },
185            { "map_merge_alt",      TYPE_STRING,    { &conf.map_merge_alt } },
186          { "jpeg",               TYPE_VALUE,     { (void *)IMAGE_JPEG } },          { "jpeg",               TYPE_VALUE,     { (void *)IMAGE_JPEG } },
187          { "png",                TYPE_VALUE,     { (void *)IMAGE_PNG } },          { "png",                TYPE_VALUE,     { (void *)IMAGE_PNG } },
188          { "gif",                TYPE_VALUE,     { (void *)IMAGE_GIF } },          { "gif",                TYPE_VALUE,     { (void *)IMAGE_GIF } },
189          { "true",               TYPE_VALUE,     { (void *)1 } },          { "true",               TYPE_VALUE,     { (void *)1 } },
190          { "false",              TYPE_VALUE,     { (void *)0 } },          { "false",              TYPE_VALUE,     { (void *)0 } },
191            { "not",                TYPE_VALUE,     { (void *)-1 } },
192          { "left",               TYPE_VALUE,     { (void *)0 } },          { "left",               TYPE_VALUE,     { (void *)0 } },
193          { "center",             TYPE_VALUE,     { (void *)1 } },          { "center",             TYPE_VALUE,     { (void *)1 } },
194          { "right",              TYPE_VALUE,     { (void *)2 } },          { "right",              TYPE_VALUE,     { (void *)2 } },
# Line 163  Line 197 
197          { "medium",             TYPE_VALUE,     { (void *)2 } },          { "medium",             TYPE_VALUE,     { (void *)2 } },
198          { "large",              TYPE_VALUE,     { (void *)3 } },          { "large",              TYPE_VALUE,     { (void *)3 } },
199          { "giant",              TYPE_VALUE,     { (void *)4 } },          { "giant",              TYPE_VALUE,     { (void *)4 } },
200            { "HTML3",              TYPE_VALUE,     { (void *)1 } },
201            { "HTML4",              TYPE_VALUE,     { (void *)2 } },
202            { "XHTML",              TYPE_VALUE,     { (void *)3 } },
203  };  };
204    
205  #define NKEYWORDS       (sizeof(keywords) / sizeof(keywords[0]))  #define NKEYWORDS       (sizeof(keywords) / sizeof(keywords[0]))
# Line 267  Line 304 
304          debug_pcolor("color_bg", &conf.color_bg);          debug_pcolor("color_bg", &conf.color_bg);
305          debug_pbool("box_shadow", conf.box_shadow);          debug_pbool("box_shadow", conf.box_shadow);
306          debug_pbool("upside_down", conf.upside_down);          debug_pbool("upside_down", conf.upside_down);
307            debug_pbool("left_right", conf.left_right);
308          debug_pbool("strip_untagged", conf.strip_untagged);          debug_pbool("strip_untagged", conf.strip_untagged);
309          debug_pbool("strip_first_rev", conf.strip_first_rev);          debug_pbool("strip_first_rev", conf.strip_first_rev);
310          debug_pbool("auto_kern", conf.auto_kern);          debug_pbool("auto_stretch", conf.auto_stretch);
311            debug_pbool("anti_alias", conf.anti_alias);
312            debug_pbool("use_ttf", conf.use_ttf);
313            debug_pint("thick_lines", conf.thick_lines);
314    
315          debug_pfont("tag_font", conf.tag_font.gdfont);          debug_pfont("tag_font", conf.tag_font.gdfont);
316          debug_pstring("tag_ttfont", conf.tag_font.ttfont);          debug_pstring("tag_ttfont", conf.tag_font.ttfont);
# Line 508  Line 549 
549                                                  c[0] = get_input();                                                  c[0] = get_input();
550                                                  c[1] = get_input();                                                  c[1] = get_input();
551                                                  c[2] = '\0';                                                  c[2] = '\0';
552                                                  if(!isxdigit(c[0]) || !isxdigit(c[1]))                                                  if(!isxdigit((int)(unsigned char)c[0]) || !isxdigit((int)(unsigned char)c[1]))
553                                                          yyerror("Invalid hex escape");                                                          stack_msg(MSG_ERR, "config: %d: Invalid hex escape", line_number);
554                                                  add_str((int)strtol(c, NULL, 16));                                                  add_str((int)strtol(c, NULL, 16));
555                                                  break;                                                  break;
556                                          case '0':                                          case '0':
# Line 528  Line 569 
569                                                  add_str((int)strtol(c, NULL, 8));                                                  add_str((int)strtol(c, NULL, 8));
570                                                  break;                                                  break;
571                                          case EOF:                                          case EOF:
572                                                    yyerror("Unexpected EOF in escape");                                                  yyerror("Unexpected EOF in escape");
573                                                    break;                                                  break;
574                                          }                                          }
575                                          break;                                          break;
576                                  case '"':                                  case '"':
# Line 559  Line 600 
600                                  while(1)                                  while(1)
601                                  {                                  {
602                                          ch = get_input();                                          ch = get_input();
603                                          if(isalpha(ch) || ch == '_')                                          if(isalnum(ch) || ch == '_')
604                                                  add_str(ch);                                                  add_str(ch);
605                                          else                                          else
606                                          {                                          {
# Line 570  Line 611 
611                                  skw.keyword = get_str();                                  skw.keyword = get_str();
612                                  kw = bsearch(&skw, keywords, NKEYWORDS, sizeof(keywords[0]), cmp_kw);                                  kw = bsearch(&skw, keywords, NKEYWORDS, sizeof(keywords[0]), cmp_kw);
613                                  if(!kw)                                  if(!kw)
614                                          yyerror("Unknown keyword '%s'", skw.keyword);                                  {
615                                  xfree(skw.keyword);                                          stack_msg(MSG_ERR, "config: %d: Unknown keyword '%s'", line_number, skw.keyword);
616                                            yylval.kw = NULL;
617                                            return TYPE_KEYWORD;
618                                    }
619                                    xfree((void *)skw.keyword);
620                                  if(kw->type == TYPE_VALUE)                                  if(kw->type == TYPE_VALUE)
621                                  {                                  {
622                                          yylval.i = kw->confref.val;                                          yylval.i = (int)kw->confref.val;
623                                          return TYPE_NUMBER;                                          return TYPE_NUMBER;
624                                  }                                  }
625                                  yylval.kw = kw;                                  yylval.kw = kw;
# Line 606  Line 651 
651                                  {                                  {
652                                          yylval.d = strtod(s, &eptr);                                          yylval.d = strtod(s, &eptr);
653                                          if(*eptr)                                          if(*eptr)
654                                                  yyerror("Invalid floating point number");                                                  stack_msg(MSG_ERR, "config: %d: Invalid floating point number", line_number);
655                                  }                                  }
656                                  else                                  else
657                                  {                                  {
658                                          yylval.i = strtol(s, &eptr, 0);                                          yylval.i = strtol(s, &eptr, 0);
659                                          if(*eptr)                                          if(*eptr)
660                                                  yyerror("Invalid number");                                                  stack_msg(MSG_ERR, "config: %d: Invalid number", line_number);
661                                  }                                  }
662                                  xfree(s);                                  xfree(s);
663                                  return type;                                  return type;
# Line 630  Line 675 
675          if(*s != '#' || strlen(s) != 7)          if(*s != '#' || strlen(s) != 7)
676          {          {
677  colorerror:  colorerror:
678                  yyerror("Invalid color value");                  stack_msg(MSG_ERR, "config: %d: Invalid color value '%s'", line_number, s);
679                    return;
680          }          }
681          c->b = strtol(s+5, &cptr, 16);          c->b = strtol(s+5, &cptr, 16);
682          if(*cptr)          if(*cptr)
# Line 688  Line 734 
734                  if(token == EOF)                  if(token == EOF)
735                  {                  {
736                          if(state)                          if(state)
737                                  yyerror("Unexpected EOF");                                  stack_msg(MSG_ERR, "config: %d: Unexpected EOF", line_number);
738                          break;                          break;
739                  }                  }
740    
# Line 701  Line 747 
747                                  state = 1;                                  state = 1;
748                          }                          }
749                          else if(token != ';')                          else if(token != ';')
750                                  yyerror("Keyword expected");                                  stack_msg(MSG_ERR, "config: %d: Keyword expected", line_number);
751                          break;                          break;
752                  case 1:                  case 1:
753                          if(token != '=')                          if(token != '=')
754                                  yyerror("'=' expected");                          {
755                          state = 2;                                  stack_msg(MSG_ERR, "config: %d: '=' expected", line_number);
756                                    while(1)
757                                    {
758                                            token = config_lex();
759                                            if(token == ';')
760                                            {
761                                                    state = 0;
762                                                    break;
763                                            }
764                                            else if(token == EOF)
765                                                    break;
766                                    }
767                            }
768                            else
769                                    state = 2;
770                          break;                          break;
771                  case 2:                  case 2:
772                            if(!kw)
773                            {
774                                    /* Error recovery of failed keyword */
775                                    state = 3;
776                                    break;
777                            }
778                          if(kw->type == TYPE_FONT || kw->type == TYPE_BOOLEAN)                          if(kw->type == TYPE_FONT || kw->type == TYPE_BOOLEAN)
779                                  t = TYPE_NUMBER;                                  t = TYPE_NUMBER;
780                          else if(kw->type == TYPE_COLOR)                          else if(kw->type == TYPE_COLOR)
# Line 728  Line 794 
794                                  char *e;                                  char *e;
795                                  switch(kw->type)                                  switch(kw->type)
796                                  {                                  {
797                                  case TYPE_STRING:       e = "String"; break;                                  case TYPE_STRING:       e = "String"; yylval.str = xstrdup("error recovery"); break;
798                                  case TYPE_NUMBER:       e = "Number"; break;                                  case TYPE_NUMBER:       e = "Number"; yylval.i = 0; break;
799                                  case TYPE_COLOR:        e = "Color"; break;                                  case TYPE_COLOR:        e = "Color"; yylval.str = xstrdup("#123456"); break;
800                                  case TYPE_FONT:         e = "Font"; break;                                  case TYPE_FONT:         e = "Font"; yylval.i = 0; break;
801                                  case TYPE_BOOLEAN:      e = "Boolean"; break;                                  case TYPE_BOOLEAN:      e = "Boolean"; yylval.i = 0; break;
802                                  case TYPE_DOUBLE:       e = "Double"; break;                                  case TYPE_DOUBLE:       e = "Double"; yylval.d = 0.0; break;
803                                  default:                e = "Internal error: Unknown type"; break;                                  default:                e = "Internal error: Unknown type"; yylval.i = 0; break;
804                                  }                                  }
805                                  yyerror("%s expected", e);                                  stack_msg(MSG_ERR, "config: %d: %s expected", line_number, e);
806                          }                          }
807  #ifdef DEBUG  #ifdef DEBUG
808                          printf("processing: '%s'\n", kw->keyword);                          printf("processing: '%s'\n", kw->keyword);
# Line 750  Line 816 
816                                          *kw->confref.i = yylval.i;                                          *kw->confref.i = yylval.i;
817                                          break;                                          break;
818                                  case TYPE_BOOLEAN:                                  case TYPE_BOOLEAN:
819                                          *kw->confref.i = yylval.i != 0;                                          if(yylval.i == -1)
820                                                    *kw->confref.i = !*kw->confref.i;
821                                            else
822                                                    *kw->confref.i = yylval.i != 0;
823                                          break;                                          break;
824                                  case TYPE_COLOR:                                  case TYPE_COLOR:
825                                          set_color(kw->confref.c, yylval.str);                                          set_color(kw->confref.c, yylval.str);
# Line 769  Line 838 
838                          break;                          break;
839                  case 3:                  case 3:
840                          if(token != ';')                          if(token != ';')
841                                  yyerror("';' expected");                                  stack_msg(MSG_ERR, "config: %d: ';' expected", line_number);
842                          state = 0;                          state = 0;
843                          break;                          break;
844                  default:                  default:
# Line 848  Line 917 
917  #endif  #endif
918  }  }
919    
920    /*
921     **************************************************************************
922     * Color reference by name for late-binding color allocation
923     **************************************************************************
924     */
925    color_t *get_colorref(const char *confcolor)
926    {
927            keyword_t skw;
928            keyword_t *kw;
929    
930            assert(confcolor != NULL);
931    
932            skw.keyword = confcolor;
933            kw = bsearch(&skw, keywords, NKEYWORDS, sizeof(keywords[0]), cmp_kw);
934            if(!kw || kw->type != TYPE_COLOR)
935                    return NULL;
936            return kw->confref.c;
937    }

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.22

  ViewVC Help
Powered by ViewVC 1.1.0 with CvsGraph 1.7.0