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

Diff of /cvsgraph/cvsgraph.c

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

revision 1.7, Sun Mar 4 01:38:23 2001 UTC revision 1.8, Sun Mar 4 03:19:18 2001 UTC
# Line 31  Line 31 
31  #include <regex.h>  #include <regex.h>
32  #include <errno.h>  #include <errno.h>
33  #include <getopt.h>  #include <getopt.h>
34    #include <ctype.h>
35    
36  #include <gd.h>  #include <gd.h>
37  #include <gdfontt.h>  #include <gdfontt.h>
# Line 697  Line 698 
698    
699  /*  /*
700   **************************************************************************   **************************************************************************
701     * String expansion
702     **************************************************************************
703     */
704    static char *_string;
705    static int _nstring;
706    static int _nastring;
707    
708    void add_string_str(const char *s)
709    {
710            int l = strlen(s) + 1;
711            if(_nstring + l > _nastring)
712            {
713                    _nastring += 128;
714                    _string = xrealloc(_string, _nastring * sizeof(_string[0]));
715            }
716            memcpy(_string+_nstring, s, l);
717            _nstring += l-1;
718    }
719    
720    void add_string_ch(int ch)
721    {
722            char buf[2];
723            buf[0] = ch;
724            buf[1] = '\0';
725            add_string_str(buf);
726    }
727    
728    char *expand_string(const char *s, rcsfile_t *rcs, rev_t *rev, tag_t *tag)
729    {
730            char nb[32];
731            char nr[32];
732            char *base;
733    
734            if(!s)
735                    return xstrdup("");
736    
737            _nstring = 0;
738            if(_string)
739                    _string[0] = '\0';
740    
741            sprintf(nb, "%d", rcs->nbranches);
742            sprintf(nr, "%d", rcs->nsrev);
743            for(; *s; s++)
744            {
745                    if(*s == '%')
746                    {
747                            switch(*++s)
748                            {
749                            case 'c': add_string_str(conf.cvsroot); break;
750                            case 'f':
751                            case 'F':
752                                    base = strrchr(rcs->file, '/');
753                                    if(!base)
754                                            add_string_str(rcs->file);
755                                    else
756                                            add_string_str(base+1);
757                                    if(*s == 'F' && _string[_nstring-1] == 'v' && _string[_nstring-2] == ',')
758                                    {
759                                            _nstring -= 2;
760                                            _string[_nstring] = '\0';
761                                    }
762                                    break;
763                            case 'p':
764                                    base = strrchr(rcs->file, '/');
765                                    if(base)
766                                    {
767                                            char *c = xstrdup(rcs->file);
768                                            base = strrchr(c, '/');
769                                            assert(base != NULL);
770                                            base[1] = '\0';
771                                            add_string_str(c);
772                                            xfree(c);
773                                    }
774                                    else
775                                            add_string_str("/");
776                                    break;
777                            case 'm': add_string_str(conf.cvsmodule); break;
778                            case 'r': add_string_str(nr); break;
779                            case 'b': add_string_str(nb); break;
780                            case '%': add_string_ch('%'); break;
781                            case '0': if(conf.expand[0]) add_string_str(conf.expand[0]); break;
782                            case '1': if(conf.expand[1]) add_string_str(conf.expand[1]); break;
783                            case '2': if(conf.expand[2]) add_string_str(conf.expand[2]); break;
784                            case '3': if(conf.expand[3]) add_string_str(conf.expand[3]); break;
785                            case '4': if(conf.expand[4]) add_string_str(conf.expand[4]); break;
786                            case '5': if(conf.expand[5]) add_string_str(conf.expand[5]); break;
787                            case '6': if(conf.expand[6]) add_string_str(conf.expand[6]); break;
788                            case '7': if(conf.expand[7]) add_string_str(conf.expand[7]); break;
789                            case '8': if(conf.expand[8]) add_string_str(conf.expand[8]); break;
790                            case '9': if(conf.expand[9]) add_string_str(conf.expand[9]); break;
791                            case 'R': if(rev && rev->rev) add_string_str(rev->rev); break;
792                            case 'B': if(rev && rev->branch) add_string_str(rev->branch); break;
793                            case 't': if(tag && tag->tag) add_string_str(tag->tag); break;
794                            default:
795                                    add_string_ch('%');
796                                    add_string_ch(*s);
797                                    break;
798                            }
799                    }
800                    else
801                            add_string_ch(*s);
802            }
803            return xstrdup(_string);
804    }
805    
806    /*
807     **************************************************************************
808   * Drawing routines   * Drawing routines
809   **************************************************************************   **************************************************************************
810   */   */
# Line 799  Line 907 
907          }          }
908  }  }
909    
 static char *_title;  
 static int _ntitle;  
 static int _natitle;  
   
 void add_title_str(const char *s)  
 {  
         int l = strlen(s) + 1;  
         if(_ntitle + l > _natitle)  
         {  
                 _natitle += 128;  
                 _title = xrealloc(_title, _natitle * sizeof(_title[0]));  
         }  
         memcpy(_title+_ntitle, s, l);  
         _ntitle += l-1;  
 }  
   
 void add_title_ch(int ch)  
 {  
         char buf[2];  
         buf[0] = ch;  
         buf[1] = '\0';  
         add_title_str(buf);  
 }  
   
 char *expand_title(rcsfile_t *rcs)  
 {  
         char nb[32];  
         char nr[32];  
         char *cptr;  
   
         sprintf(nb, "%d", rcs->nbranches);  
         sprintf(nr, "%d", rcs->nsrev);  
         for(cptr = conf.title; *cptr; cptr++)  
         {  
                 if(*cptr == '%')  
                 {  
                         switch(*++cptr)  
                         {  
                         case 'c': add_title_str(conf.cvsroot); break;  
                         case 'f': add_title_str(rcs->file); break;  
                         case 'm': add_title_str(conf.cvsmodule); break;  
                         case 'r': add_title_str(nr); break;  
                         case 'b': add_title_str(nb); break;  
                         case '%': add_title_ch('%'); break;  
                         default:  
                                 add_title_ch('%');  
                                 add_title_ch(*cptr);  
                                 break;  
                         }  
                 }  
                 else  
                         add_title_ch(*cptr);  
         }  
         return _title;  
 }  
   
910  void draw_title(gdImagePtr im, char *title)  void draw_title(gdImagePtr im, char *title)
911  {  {
912          char *t;          char *t;
# Line 887  Line 939 
939  {  {
940          gdImagePtr im;          gdImagePtr im;
941          int i;          int i;
942            char *cptr;
943    
944          im = gdImageCreate(rcs->tw+conf.margin_left+conf.margin_right, rcs->th+conf.margin_top+conf.margin_bottom);          im = gdImageCreate(rcs->tw+conf.margin_left+conf.margin_right, rcs->th+conf.margin_top+conf.margin_bottom);
945          conf.color_bg.id = gdImageColorAllocate(im, conf.color_bg.r, conf.color_bg.g, conf.color_bg.b);          conf.color_bg.id = gdImageColorAllocate(im, conf.color_bg.r, conf.color_bg.g, conf.color_bg.b);
# Line 903  Line 956 
956                  if(rcs->branches[i]->branchpoint)                  if(rcs->branches[i]->branchpoint)
957                          draw_connector(im, rcs->branches[i]);                          draw_connector(im, rcs->branches[i]);
958          }          }
959          draw_title(im, expand_title(rcs));          cptr = expand_string(conf.title, rcs, NULL, NULL);
960            draw_title(im, cptr);
961            xfree(cptr);
962    
963          return im;          return im;
964  }  }
# Line 1112  Line 1167 
1167  void make_imagemap(rcsfile_t *rcs, FILE *fp)  void make_imagemap(rcsfile_t *rcs, FILE *fp)
1168  {  {
1169          int i, j;          int i, j;
1170            char *href;
1171            char *alt;
1172          fprintf(fp, "<map name=\"%s\">\n", conf.map_name);          fprintf(fp, "<map name=\"%s\">\n", conf.map_name);
1173          for(i = 0; i < rcs->nbranches; i++)          for(i = 0; i < rcs->nbranches; i++)
1174          {          {
1175                  branch_t *b = rcs->branches[i];                  branch_t *b = rcs->branches[i];
1176                  fprintf(fp, "<area shape=\"rect\" href=\"branch_%s\" coords=\"%d,%d,%d,%d\" alt=\"Branch %s\">\n",                  tag_t *tag = b->ntags ? b->tags[0] : NULL;
1177                                  b->branch->branch,                  href = expand_string(conf.map_branch_href, rcs, b->branch, tag);
1178                    alt = expand_string(conf.map_branch_alt, rcs, b->branch, tag);
1179                    fprintf(fp, "\t<area shape=\"rect\" %s coords=\"%d,%d,%d,%d\" %s>\n",
1180                                    href,
1181                                  b->cx - b->w/2, b->y, b->cx + b->w/2, b->y + b->h,                                  b->cx - b->w/2, b->y, b->cx + b->w/2, b->y + b->h,
1182                                  b->branch->branch);                                  alt);
1183                    xfree(href);
1184                    xfree(alt);
1185                  for(j = 0; j < b->nrevs; j++)                  for(j = 0; j < b->nrevs; j++)
1186                  {                  {
1187                          revision_t *r = b->revs[j];                          revision_t *r = b->revs[j];
1188                          fprintf(fp, "<area shape=\"rect\" href=\"rev_%s\" coords=\"%d,%d,%d,%d\" alt=\"Revision %s\">\n",                          tag = r->ntags ? r->tags[0] : NULL;
1189                                  r->rev->rev,                          href = expand_string(conf.map_rev_href, rcs, r->rev, tag);
1190                            alt = expand_string(conf.map_rev_alt, rcs, r->rev, tag);
1191                            fprintf(fp, "\t<area shape=\"rect\" %s coords=\"%d,%d,%d,%d\" %s>\n",
1192                                    href,
1193                                  r->cx - r->w/2, r->y, r->cx + r->w/2, r->y + r->h,                                  r->cx - r->w/2, r->y, r->cx + r->w/2, r->y + r->h,
1194                                  r->rev->rev);                                  alt);
1195                            xfree(href);
1196                            xfree(alt);
1197                  }                  }
1198          }          }
1199          fprintf(fp, "</map>\n");          fprintf(fp, "</map>\n");
# Line 1180  Line 1247 
1247   */   */
1248  static const char usage_str[] =  static const char usage_str[] =
1249          "Usage: cvsgraph [options] <file>\n"          "Usage: cvsgraph [options] <file>\n"
1250          "  -c <file>  Read alternative config from <file>\n"          "  -c <file>    Read alternative config from <file>\n"
1251          "  -d <level> Enable debug mode at <level>\n"          "  -d <level>   Enable debug mode at <level>\n"
1252          "  -h         This message\n"          "  -h           This message\n"
1253          "  -i         Generate an imagemap instead of image\n"          "  -i           Generate an imagemap instead of image\n"
1254          "  -M <name>  Use <name> as imagemap name\n"          "  -M <name>    Use <name> as imagemap name\n"
1255          "  -m <mod>   Use <mod> as cvs module\n"          "  -m <mod>     Use <mod> as cvs module\n"
1256          "  -o <file>  Output to <file>\n"          "  -o <file>    Output to <file>\n"
1257          "  -q         Be quiet (i.e. no warnings)\n"          "  -q           Be quiet (i.e. no warnings)\n"
1258          "  -r <path>  Use <path> as cvsroot path\n"          "  -r <path>    Use <path> as cvsroot path\n"
1259          "  -V         Print version and exit\n"          "  -V           Print version and exit\n"
1260            "  -[0-9] <txt> Use <txt> for expansion\n"
1261          ;          ;
1262    
1263  #define VERSION_STR     "1.1.0"  #define VERSION_STR     "1.1.0"
# Line 1213  Line 1281 
1281          rcsfile_t *rcs;          rcsfile_t *rcs;
1282          gdImagePtr im;          gdImagePtr im;
1283    
1284          while((optc = getopt(argc, argv, "c:d:hiM:m:o:qr:V")) != EOF)          while((optc = getopt(argc, argv, "0:1:2:3:4:5:6:7:8:9:c:d:hiM:m:o:qr:V")) != EOF)
1285          {          {
1286                  switch(optc)                  switch(optc)
1287                  {                  {
# Line 1248  Line 1316 
1316                          fprintf(stdout, "%s", usage_str);                          fprintf(stdout, "%s", usage_str);
1317                          return 0;                          return 0;
1318                  default:                  default:
1319                          lose++;                          if(isdigit(optc))
1320                            {
1321                                    conf.expand[optc-'0'] = xstrdup(optarg);
1322                            }
1323                            else
1324                                    lose++;
1325                  }                  }
1326          }          }
1327    

Legend:
Removed from v.1.7  
changed lines
  Added in v.1.8

  ViewVC Help
Powered by ViewVC 1.1.0 with CvsGraph 1.7.0