/[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.8, Sun Mar 4 03:19:18 2001 UTC revision 1.13, Tue Nov 20 15:00:06 2001 UTC
# Line 32  Line 32 
32  #include <errno.h>  #include <errno.h>
33  #include <getopt.h>  #include <getopt.h>
34  #include <ctype.h>  #include <ctype.h>
35    #include <time.h>
36    
37  #include <gd.h>  #include <gd.h>
38  #include <gdfontt.h>  #include <gdfontt.h>
39    
# Line 66  Line 67 
67  #define ALIGN_HL        0x00  #define ALIGN_HL        0x00
68  #define ALIGN_HC        0x01  #define ALIGN_HC        0x01
69  #define ALIGN_HR        0x02  #define ALIGN_HR        0x02
70  #define ALIGN_HX        0x0f  #define ALIGN_HX        0x0f
71  #define ALIGN_VT        0x00  #define ALIGN_VT        0x00
72  #define ALIGN_VC        0x10  #define ALIGN_VC        0x10
73  #define ALIGN_VB        0x20  #define ALIGN_VB        0x20
74  #define ALIGN_VX        0xf0  #define ALIGN_VX        0xf0
75    
76  /*  /*
77   **************************************************************************   **************************************************************************
78   * Globals   * Globals
# Line 80  Line 81 
81    
82  config_t conf;  config_t conf;
83  int debuglevel;  int debuglevel;
84    color_t white_color = {255, 255, 255, 0};
85    color_t black_color = {0, 0, 0, 0};
86    
87    
88  /*  /*
89   **************************************************************************   **************************************************************************
# Line 195  Line 199 
199          char *cmd = NULL;          char *cmd = NULL;
200          int rv;          int rv;
201    
202          cmd = xmalloc(strlen(cvsroot) + strlen(module) + strlen(file) + 2 + 1);          cmd = xmalloc(strlen(cvsroot) + strlen(module) + strlen(file) + 1);
203          sprintf(cmd, "%s/%s/%s", cvsroot, module, file);          sprintf(cmd, "%s%s%s", cvsroot, module, file);
204          if(!(rcsin = fopen(cmd, "r")))          if(!(rcsin = fopen(cmd, "r")))
205            {
206                    perror(cmd);
207                  return NULL;                  return NULL;
208            }
209          input_file = cmd;          input_file = cmd;
210          line_number = 1;          line_number = 1;
211          rv = rcsparse();          rv = rcsparse();
# Line 440  Line 447 
447                  /* Walk through the next list */                  /* Walk through the next list */
448                  if(!head->next)                  if(!head->next)
449                          return;                          return;
450    
451                  head = find_delta(sdl, nsdl, head->next);                  head = find_delta(sdl, nsdl, head->next);
452                  if(!head)                  if(!head)
453                  {                  {
# Line 554  Line 561 
561          char *cptr;          char *cptr;
562          char *r;          char *r;
563          if(!dots)          if(!dots)
564            {
565                    fprintf(stderr, "FIXME: previous_rev(\"%s\"): Cannot determine parent branch revision\n", c);
566                  return xstrdup("1.0");  /* FIXME: don't know what the parent is */                  return xstrdup("1.0");  /* FIXME: don't know what the parent is */
567            }
568          if(dots & 1)          if(dots & 1)
569          {          {
570                  /* Is is a revision we want the parent of */                  /* Is is a revision we want the parent of */
# Line 563  Line 573 
573                  assert(cptr != NULL);                  assert(cptr != NULL);
574                  if(dots == 1)                  if(dots == 1)
575                  {                  {
576                            fprintf(stderr, "FIXME: previous_rev(\"%s\"): Going beyond top-level?\n", c);
577                          /* FIXME: What is the parent of 1.1? */                          /* FIXME: What is the parent of 1.1? */
578                          cptr[1] = '\0';                          cptr[1] = '\0';
579                          strcat(r, "0");                          strcat(r, "0");
# Line 631  Line 642 
642                                  rev_t rev;                                  rev_t rev;
643                                  revision_t **r;                                  revision_t **r;
644                                  /* This happens for the magic branch numbers if there are                                  /* This happens for the magic branch numbers if there are
645                                   * no commits withing the new branch yet. So, we add the                                   * no commits within the new branch yet. So, we add the
646                                   * branch and try continue.                                   * branch and try to continue.
647                                   */                                   */
648                                  rev.rev = previous_rev(t->rev->branch);                                  rev.rev = previous_rev(t->rev->branch);
649                                  rev.branch = NULL;                                  rev.branch = NULL;
# Line 641  Line 652 
652                                  xfree(rev.rev);                                  xfree(rev.rev);
653                                  if(!r)                                  if(!r)
654                                  {                                  {
655                                          fprintf(stderr, "No branch found for tag '%s:%s'\n", t->tag, t->rev->branch);                                          if(!quiet)
656                                                    fprintf(stderr, "No branch found for tag '%s:%s'\n", t->tag, t->rev->branch);
657                                  }                                  }
658                                  else                                  else
659                                  {                                  {
# Line 670  Line 682 
682                  {                  {
683                          revision_t **r = bsearch(t->rev, rcs->srev, rcs->nsrev, sizeof(rcs->srev[0]), search_revision);                          revision_t **r = bsearch(t->rev, rcs->srev, rcs->nsrev, sizeof(rcs->srev[0]), search_revision);
684                          if(!r)                          if(!r)
685                                  fprintf(stderr, "No revision found for tag '%s:%s'\n", t->tag, t->rev->rev);                          {
686                                    if(!quiet)
687                                            fprintf(stderr, "No revision found for tag '%s:%s'\n", t->tag, t->rev->rev);
688                            }
689                          else                          else
690                          {                          {
691                                  revision_t *rr = *r;                                  revision_t *rr = *r;
# Line 725  Line 740 
740          add_string_str(buf);          add_string_str(buf);
741  }  }
742    
743  char *expand_string(const char *s, rcsfile_t *rcs, rev_t *rev, tag_t *tag)  void add_string_date(const char *d)
744    {
745            struct tm tm, *tmp;
746            int n;
747            time_t t;
748            char *buf;
749            int nbuf;
750    
751            memset(&tm, 0, sizeof(tm));
752            n = sscanf(d, "%d.%d.%d.%d.%d.%d",
753                            &tm.tm_year, &tm.tm_mon, &tm.tm_mday,
754                            &tm.tm_hour, &tm.tm_min, &tm.tm_sec);
755            tm.tm_mon--;
756            if(tm.tm_year > 1900)
757                    tm.tm_year -= 1900;
758            t = mktime(&tm);
759            if(n != 6 || t == (time_t)(-1))
760            {
761                    add_string_str("<invalid date>");
762                    return;
763            }
764    
765            tmp = localtime(&t);
766            nbuf = strlen(conf.date_format) * 16;   /* Should be enough to hold all types of expansions */
767            buf = xmalloc(nbuf);
768            strftime(buf, nbuf, conf.date_format, tmp);
769            add_string_str(buf);
770            xfree(buf);
771    }
772    
773    char *expand_string(const char *s, rcsfile_t *rcs, revision_t *r, rev_t *rev, rev_t *prev, tag_t *tag)
774  {  {
775          char nb[32];          char nb[32];
776          char nr[32];          char nr[32];
# Line 746  Line 791 
791                  {                  {
792                          switch(*++s)                          switch(*++s)
793                          {                          {
794                          case 'c': add_string_str(conf.cvsroot); break;                          case 'c':
795                            case 'C':
796                                    add_string_str(conf.cvsroot);
797                                    if(*s == 'C' && conf.cvsroot[0] && conf.cvsroot[strlen(conf.cvsroot)-1] == '/')
798                                    {
799                                            /* Strip the trailing '/' */
800                                            _nstring--;
801                                            _string[_nstring] = '\0';
802                                    }
803                                    break;
804                          case 'f':                          case 'f':
805                          case 'F':                          case 'F':
806                                  base = strrchr(rcs->file, '/');                                  base = strrchr(rcs->file, '/');
# Line 771  Line 825 
825                                          add_string_str(c);                                          add_string_str(c);
826                                          xfree(c);                                          xfree(c);
827                                  }                                  }
828                                  else                                  /*
829                                          add_string_str("/");                                   * We should not add anything here because we can encounter
830                                     * a completely empty path, in which case we do not want
831                                     * to add any slash. This prevents a inadvertent root redirect.
832                                     *
833                                     * else
834                                     *      add_string_str("/");
835                                     */
836                                    break;
837                            case 'm':
838                            case 'M':
839                                    add_string_str(conf.cvsmodule);
840                                    if(*s == 'M' && conf.cvsmodule[0] && conf.cvsmodule[strlen(conf.cvsmodule)-1] == '/')
841                                    {
842                                            /* Strip the trailing '/' */
843                                            _nstring--;
844                                            _string[_nstring] = '\0';
845                                    }
846                                  break;                                  break;
                         case 'm': add_string_str(conf.cvsmodule); break;  
847                          case 'r': add_string_str(nr); break;                          case 'r': add_string_str(nr); break;
848                          case 'b': add_string_str(nb); break;                          case 'b': add_string_str(nb); break;
849                          case '%': add_string_ch('%'); break;                          case '%': add_string_ch('%'); break;
# Line 789  Line 858 
858                          case '8': if(conf.expand[8]) add_string_str(conf.expand[8]); break;                          case '8': if(conf.expand[8]) add_string_str(conf.expand[8]); break;
859                          case '9': if(conf.expand[9]) add_string_str(conf.expand[9]); break;                          case '9': if(conf.expand[9]) add_string_str(conf.expand[9]); break;
860                          case 'R': if(rev && rev->rev) add_string_str(rev->rev); break;                          case 'R': if(rev && rev->rev) add_string_str(rev->rev); break;
861                            case 'P': if(prev && prev->rev) add_string_str(prev->rev); break;
862                          case 'B': if(rev && rev->branch) add_string_str(rev->branch); break;                          case 'B': if(rev && rev->branch) add_string_str(rev->branch); break;
863                          case 't': if(tag && tag->tag) add_string_str(tag->tag); break;                          case 't': if(tag && tag->tag) add_string_str(tag->tag); break;
864                            case 'd': if(r && r->delta && r->delta->date) add_string_date(r->delta->date); break;
865                            case 's': if(r && r->delta && r->delta->state) add_string_str(r->delta->state); break;
866                            case 'a': if(r && r->delta && r->delta->author) add_string_str(r->delta->author); break;
867                          default:                          default:
868                                  add_string_ch('%');                                  add_string_ch('%');
869                                  add_string_ch(*s);                                  add_string_ch(*s);
# Line 810  Line 883 
883   */   */
884  int get_swidth(const char *s, font_t *f)  int get_swidth(const char *s, font_t *f)
885  {  {
886          if(!s)          int n;
887            int m;
888            if(!s || !*s)
889                  return 0;                  return 0;
890          return strlen(s) * (*f)->w;          for(n = m = 0; *s; n++, s++)
891            {
892                    if(*s == '\n')
893                    {
894                            if(n > m)
895                                    m = n;
896                            n = 0;
897                    }
898            }
899            if(n > m)
900                    m = n;
901            return m * (*f)->w;
902  }  }
903    
904  int get_sheight(const char *s, font_t *f)  int get_sheight(const char *s, font_t *f)
905  {  {
906          int nl;          int nl;
907          if(!s)          if(!s || !*s)
908                  return 0;                  return 0;
909          for(nl = 1; *s; s++)          for(nl = 1; *s; s++)
910          {          {
# Line 828  Line 914 
914          return nl * (*f)->h;          return nl * (*f)->h;
915  }  }
916    
917  void draw_rbox(gdImagePtr im, int x1, int y1, int x2, int y2, int r, color_t *color)  void draw_rbox(gdImagePtr im, int x1, int y1, int x2, int y2, int r, color_t *color, color_t *bgcolor)
918  {  {
919          int r2 = 2*r;          int r2 = 2*r;
920          gdImageLine(im, x1+r, y1, x2-r, y1, color->id);          gdImageLine(im, x1+r, y1, x2-r, y1, color->id);
921          gdImageLine(im, x1+r, y2, x2-r, y2, color->id);          gdImageLine(im, x1+r, y2, x2-r, y2, color->id);
922          gdImageLine(im, x1, y1+r, x1, y2-r, color->id);          gdImageLine(im, x1, y1+r, x1, y2-r, color->id);
923          gdImageLine(im, x2, y1+r, x2, y2-r, color->id);          gdImageLine(im, x2, y1+r, x2, y2-r, color->id);
924            if(conf.box_shadow)
925            {
926                    gdImageLine(im, x1+r+1, y2+1, x2-r, y2+1, black_color.id);
927                    gdImageLine(im, x2+1, y1+r+1, x2+1, y2-r, black_color.id);
928            }
929          if(r)          if(r)
930          {          {
931                  gdImageArc(im, x1+r, y1+r, r2, r2, 180, 270, color->id);                  gdImageArc(im, x1+r, y1+r, r2, r2, 180, 270, color->id);
932                  gdImageArc(im, x2-r, y1+r, r2, r2, 270, 360, color->id);                  gdImageArc(im, x2-r, y1+r, r2, r2, 270, 360, color->id);
933                  gdImageArc(im, x1+r, y2-r, r2, r2,  90, 180, color->id);                  gdImageArc(im, x1+r, y2-r, r2, r2,  90, 180, color->id);
934                  gdImageArc(im, x2-r, y2-r, r2, r2,   0,  90, color->id);                  gdImageArc(im, x2-r, y2-r, r2, r2,   0,  90, color->id);
935                    if(conf.box_shadow)
936                    {
937                            /* FIXME: Pixelization is not correct here */
938                            gdImageArc(im, x2-r+1, y2-r+1, r2, r2,   0,  90, black_color.id);
939                    }
940          }          }
941            gdImageFillToBorder(im, (x1+x2)/2, (y1+y2)/2, color->id, bgcolor->id);
942  }  }
943    
944  void draw_string(gdImagePtr im, char *s, font_t *f, int x, int y, int align, color_t *c)  void draw_string(gdImagePtr im, char *s, font_t *f, int x, int y, int align, color_t *c)
# Line 864  Line 961 
961          gdImageString(im, *f, x+xx+1, y+yy, s, c->id);          gdImageString(im, *f, x+xx+1, y+yy, s, c->id);
962  }  }
963    
964    void draw_stringnl(gdImagePtr im, char *s, font_t *f, int x, int y, int align, color_t *c)
965    {
966            char *t;
967            char *d;
968            d = s = xstrdup(s);
969            do
970            {
971                    t = strchr(s, '\n');
972                    if(t)
973                            *t = '\0';
974                    draw_string(im, s, f, x, y, align, c);
975                    y += get_sheight(s, f);
976                    s = t+1;
977            } while(t);
978            xfree(d);
979    }
980    
981  void draw_rev(gdImagePtr im, int cx, int ty, revision_t *r)  void draw_rev(gdImagePtr im, int cx, int ty, revision_t *r)
982  {  {
983          int lx = cx - r->w/2;          int lx = cx - r->w/2;
984          int rx = lx + r->w;          int rx = lx + r->w;
985          int i;          int i;
986          draw_rbox(im, lx, ty, rx, ty+r->h, 0, &conf.rev_color);          draw_rbox(im, lx, ty, rx, ty+r->h, 0, &conf.rev_color, &conf.rev_bgcolor);
987          ty += conf.rev_tspace;          ty += conf.rev_tspace;
988          draw_string(im, r->rev->rev, &conf.rev_font, cx, ty, ALIGN_HC, &conf.rev_color);          draw_string(im, r->rev->rev, &conf.rev_font, cx, ty, ALIGN_HC, &conf.rev_color);
989          ty += get_sheight(r->rev->rev, &conf.rev_font);          ty += get_sheight(r->rev->rev, &conf.rev_font);
990            draw_stringnl(im, r->revtext, &conf.rev_text_font, cx, ty, ALIGN_HC, &conf.rev_text_color);
991            ty += get_sheight(r->revtext, &conf.rev_text_font);
992          for(i = 0; i < r->ntags; i++)          for(i = 0; i < r->ntags; i++)
993          {          {
994                  draw_string(im, r->tags[i]->tag, &conf.tag_font, cx, ty, ALIGN_HC, &conf.tag_color);                  draw_string(im, r->tags[i]->tag, &conf.tag_font, cx, ty, ALIGN_HC, &conf.tag_color);
# Line 887  Line 1003 
1003          int yy;          int yy;
1004          int i;          int i;
1005          /*draw_rbox(im, cx-b->tw/2-1, ty-1, cx+b->tw/2+1, ty+b->th+1, 0, &conf.title_color);*/          /*draw_rbox(im, cx-b->tw/2-1, ty-1, cx+b->tw/2+1, ty+b->th+1, 0, &conf.title_color);*/
1006          draw_rbox(im, lx, ty, rx, ty+b->h, 5, &conf.branch_color);          draw_rbox(im, lx, ty, rx, ty+b->h, 5, &conf.branch_color, &conf.branch_bgcolor);
1007          yy = conf.branch_tspace;          yy = conf.branch_tspace;
1008          draw_string(im, b->branch->branch, &conf.branch_font, cx, ty+yy, ALIGN_HC, &conf.branch_color);          draw_string(im, b->branch->branch, &conf.branch_font, cx, ty+yy, ALIGN_HC, &conf.branch_color);
1009          yy += get_sheight(b->branch->branch, &conf.branch_font);          yy += get_sheight(b->branch->branch, &conf.branch_font);
# Line 907  Line 1023 
1023          }          }
1024  }  }
1025    
 void draw_title(gdImagePtr im, char *title)  
 {  
         char *t;  
         char *s = title;  
         int x = conf.title_x;  
         int y = conf.title_y;  
         do  
         {  
                 t = strchr(s, '\n');  
                 if(t)  
                         *t = '\0';  
                 draw_string(im, s, &conf.title_font, x, y, conf.title_align, &conf.title_color);  
                 y += get_sheight(s, &conf.title_font);  
                 s = t+1;  
         } while(t);  
 }  
   
1026  void draw_connector(gdImagePtr im, branch_t *b)  void draw_connector(gdImagePtr im, branch_t *b)
1027  {  {
1028          revision_t *r = b->branchpoint;          revision_t *r = b->branchpoint;
# Line 935  Line 1034 
1034          gdImageLine(im, x2, y1, x2, y2, conf.branch_color.id);          gdImageLine(im, x2, y1, x2, y2, conf.branch_color.id);
1035  }  }
1036    
1037    void alloc_color(gdImagePtr im, color_t *c)
1038    {
1039            c->id = gdImageColorAllocate(im, c->r, c->g, c->b);
1040    }
1041    
1042  gdImagePtr make_image(rcsfile_t *rcs)  gdImagePtr make_image(rcsfile_t *rcs)
1043  {  {
1044          gdImagePtr im;          gdImagePtr im;
# Line 942  Line 1046 
1046          char *cptr;          char *cptr;
1047    
1048          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);
1049          conf.color_bg.id = gdImageColorAllocate(im, conf.color_bg.r, conf.color_bg.g, conf.color_bg.b);          alloc_color(im, &conf.color_bg);
1050          conf.tag_color.id = gdImageColorAllocate(im, conf.tag_color.r, conf.tag_color.g, conf.tag_color.b);          alloc_color(im, &conf.tag_color);
1051          conf.rev_color.id = gdImageColorAllocate(im, conf.rev_color.r, conf.rev_color.g, conf.rev_color.b);          alloc_color(im, &conf.rev_color);
1052          conf.branch_color.id = gdImageColorAllocate(im, conf.branch_color.r, conf.branch_color.g, conf.branch_color.b);          alloc_color(im, &conf.rev_bgcolor);
1053          conf.branch_bgcolor.id = gdImageColorAllocate(im, conf.branch_bgcolor.r, conf.branch_bgcolor.g, conf.branch_bgcolor.b);          alloc_color(im, &conf.rev_text_color);
1054          conf.title_color.id = gdImageColorAllocate(im, conf.title_color.r, conf.title_color.g, conf.title_color.b);          alloc_color(im, &conf.branch_color);
1055            alloc_color(im, &conf.branch_bgcolor);
1056            alloc_color(im, &conf.title_color);
1057            alloc_color(im, &black_color);
1058            alloc_color(im, &white_color);
1059    
1060          for(i = 0; i < rcs->nbranches; i++)          for(i = 0; i < rcs->nbranches; i++)
1061                  draw_branch(im, rcs->branches[i]->cx, rcs->branches[i]->y, rcs->branches[i]);                  draw_branch(im, rcs->branches[i]->cx, rcs->branches[i]->y, rcs->branches[i]);
# Line 956  Line 1064 
1064                  if(rcs->branches[i]->branchpoint)                  if(rcs->branches[i]->branchpoint)
1065                          draw_connector(im, rcs->branches[i]);                          draw_connector(im, rcs->branches[i]);
1066          }          }
1067          cptr = expand_string(conf.title, rcs, NULL, NULL);          cptr = expand_string(conf.title, rcs, NULL, NULL, NULL, NULL);
1068          draw_title(im, cptr);          draw_stringnl(im, cptr, &conf.title_font, conf.title_x, conf.title_y, conf.title_align, &conf.title_color);
1069          xfree(cptr);          xfree(cptr);
1070    
1071          return im;          return im;
# Line 1069  Line 1177 
1177                  int w;                  int w;
1178                  int h;                  int h;
1179                  rp = rcs->srev[i];                  rp = rcs->srev[i];
1180                  w = get_swidth(rp->rev->rev, &conf.rev_font);                  rp->revtext = expand_string(conf.rev_text, rcs, rp, rp->rev, NULL, rp->ntags ? rp->tags[0] : NULL);
1181                  h = get_sheight(rp->rev->rev, &conf.rev_font);                  w = get_swidth(rp->revtext, &conf.rev_text_font);
1182                    j = get_swidth(rp->rev->rev, &conf.rev_font);
1183                    if(j > w)
1184                            w = j;
1185                    h = get_sheight(rp->revtext, &conf.rev_text_font) + get_sheight(rp->rev->rev, &conf.rev_font);
1186                  for(j = 0; j < rp->ntags; j++)                  for(j = 0; j < rp->ntags; j++)
1187                  {                  {
1188                          int ww = get_swidth(rp->tags[j]->tag, &conf.tag_font);                          int ww = get_swidth(rp->tags[j]->tag, &conf.tag_font);
# Line 1174  Line 1286 
1286          {          {
1287                  branch_t *b = rcs->branches[i];                  branch_t *b = rcs->branches[i];
1288                  tag_t *tag = b->ntags ? b->tags[0] : NULL;                  tag_t *tag = b->ntags ? b->tags[0] : NULL;
1289                  href = expand_string(conf.map_branch_href, rcs, b->branch, tag);                  href = expand_string(conf.map_branch_href, rcs, NULL, b->branch, NULL, tag);
1290                  alt = expand_string(conf.map_branch_alt, rcs, b->branch, tag);                  alt = expand_string(conf.map_branch_alt, rcs, NULL, b->branch, NULL, tag);
1291                  fprintf(fp, "\t<area shape=\"rect\" %s coords=\"%d,%d,%d,%d\" %s>\n",                  fprintf(fp, "\t<area shape=\"rect\" %s coords=\"%d,%d,%d,%d\" %s>\n",
1292                                  href,                                  href,
1293                                  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,
# Line 1185  Line 1297 
1297                  for(j = 0; j < b->nrevs; j++)                  for(j = 0; j < b->nrevs; j++)
1298                  {                  {
1299                          revision_t *r = b->revs[j];                          revision_t *r = b->revs[j];
1300                            revision_t* r1;
1301                            int xoff;
1302                            int x1;
1303                            int x2;
1304                            int y1;
1305    
1306                          tag = r->ntags ? r->tags[0] : NULL;                          tag = r->ntags ? r->tags[0] : NULL;
1307                          href = expand_string(conf.map_rev_href, rcs, r->rev, tag);                          href = expand_string(conf.map_rev_href, rcs, r, r->rev, NULL, tag);
1308                          alt = expand_string(conf.map_rev_alt, rcs, r->rev, tag);                          alt = expand_string(conf.map_rev_alt, rcs, r, r->rev, NULL, tag);
1309                          fprintf(fp, "\t<area shape=\"rect\" %s coords=\"%d,%d,%d,%d\" %s>\n",                          fprintf(fp, "\t<area shape=\"rect\" %s coords=\"%d,%d,%d,%d\" %s>\n",
1310                                  href,                                  href,
1311                                  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,
1312                                  alt);                                  alt);
1313                          xfree(href);                          xfree(href);
1314                          xfree(alt);                          xfree(alt);
1315                            if ( j > 0 || b->branchpoint )
1316                            {
1317                                if ( j > 0 )
1318                                {
1319                                    r1 = b->revs[j-1];
1320                                    xoff = MIN(r->w, r1->w)/4;
1321                                    y1 = r1->y + r1->h;
1322                                }
1323                                else
1324                                {
1325                                    r1 = b->branchpoint;
1326                                    xoff = MIN(r->w, b->w)/4;
1327                                    y1 = b->y + b->h;
1328                                }
1329                                x1 = r->cx - xoff;
1330                                x2 = r->cx + xoff;
1331    
1332                                href = expand_string(conf.map_diff_href, rcs, r, r->rev, r1->rev, tag);
1333                                alt = expand_string(conf.map_diff_alt, rcs, r, r->rev, r1->rev, tag);
1334                                fprintf(fp, "\t<area shape=\"rect\" %s coords=\"%d,%d,%d,%d\" %s>\n",
1335                                        href,
1336                                        x1, y1 + 1, x2, r->y - 1,
1337                                        alt);
1338                                xfree(href);
1339                                xfree(alt);
1340                            }
1341                  }                  }
1342          }          }
1343          fprintf(fp, "</map>\n");          fprintf(fp, "</map>\n");
# Line 1260  Line 1404 
1404          "  -[0-9] <txt> Use <txt> for expansion\n"          "  -[0-9] <txt> Use <txt> for expansion\n"
1405          ;          ;
1406    
1407  #define VERSION_STR     "1.1.0"  #define VERSION_STR     "1.1.2"
1408  #define NOTICE_STR      "Copyright (c) 2001 B.Stultiens"  #define NOTICE_STR      "Copyright (c) 2001 B.Stultiens"
1409    
1410    void append_slash(char **path)
1411    {
1412            int l;
1413            assert(path != NULL);
1414            assert(*path != NULL);
1415            l = strlen(*path);
1416            if(!l || (*path)[l-1] == '/')
1417                    return;
1418            *path = xrealloc(*path, l+2);
1419            strcat(*path, "/");
1420    }
1421    
1422  int main(int argc, char *argv[])  int main(int argc, char *argv[])
1423  {  {
1424          extern int yy_flex_debug;          extern int yy_flex_debug;
# Line 1348  Line 1504 
1504          rcsdebug = (debuglevel & DEBUG_RCS_YACC) != 0;          rcsdebug = (debuglevel & DEBUG_RCS_YACC) != 0;
1505    
1506          /* Set defaults */          /* Set defaults */
1507          if(!conf.tag_font)      conf.tag_font = gdFontTiny;          conf.tag_font           = gdFontTiny;
1508          if(!conf.rev_font)      conf.rev_font = gdFontTiny;          conf.rev_font           = gdFontTiny;
1509          if(!conf.branch_font)   conf.branch_font = gdFontTiny;          conf.branch_font        = gdFontTiny;
1510          if(!conf.title_font)    conf.title_font = gdFontTiny;          conf.title_font         = gdFontTiny;
1511            conf.rev_text_font      = gdFontTiny;
1512    
1513            conf.cvsroot            = xstrdup("");
1514            conf.cvsmodule          = xstrdup("");
1515            conf.date_format        = xstrdup("%d-%b-%Y %H:%M:%S");
1516            conf.title              = xstrdup("");
1517            conf.map_name           = xstrdup("CvsGraphImageMap");
1518            conf.map_branch_href    = xstrdup("href=\"unset: conf.map_branch_href\"");
1519            conf.map_branch_alt     = xstrdup("alt=\"%B\"");
1520            conf.map_rev_href       = xstrdup("href=\"unset: conf.map_rev_href\"");
1521            conf.map_rev_alt        = xstrdup("alt=\"%R\"");
1522            conf.map_diff_href      = xstrdup("href=\"unset: conf.map_diff_href\"");
1523            conf.map_diff_alt       = xstrdup("alt=\"%P &lt;-&gt; %R\"");
1524            conf.rev_text           = xstrdup("%d");
1525    
1526            conf.color_bg           = white_color;
1527            conf.branch_bgcolor     = white_color;
1528            conf.branch_color       = black_color;
1529            conf.rev_color          = black_color;
1530            conf.rev_bgcolor        = white_color;
1531            conf.tag_color          = black_color;
1532            conf.title_color        = black_color;
1533            conf.rev_text_color     = black_color;
1534    
1535            conf.image_quality      = 100;
1536    
1537          if(!read_config(confpath))          if(!read_config(confpath))
1538          {          {
# Line 1364  Line 1545 
1545          if(cvsmodule)   conf.cvsmodule = cvsmodule;          if(cvsmodule)   conf.cvsmodule = cvsmodule;
1546          if(imgmapname)  conf.map_name = imgmapname;          if(imgmapname)  conf.map_name = imgmapname;
1547    
1548            append_slash(&conf.cvsroot);
1549            append_slash(&conf.cvsmodule);
1550    
1551          rcs = get_rcsfile(conf.cvsroot, conf.cvsmodule, argv[optind]);          rcs = get_rcsfile(conf.cvsroot, conf.cvsmodule, argv[optind]);
1552          if(!rcs)          if(!rcs)
         {  
                 fprintf(stderr, "Error reading rcs-file\n");  
1553                  return 1;                  return 1;
         }  
1554    
1555          if(debuglevel & DEBUG_RCS_FILE)          if(debuglevel & DEBUG_RCS_FILE)
1556                  dump_rcsfile(rcs);                  dump_rcsfile(rcs);

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

  ViewVC Help
Powered by ViewVC 1.1.0 with CvsGraph 1.7.0