/[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.4, Fri Feb 23 00:12:42 2001 UTC revision 1.6, Mon Feb 26 00:09:20 2001 UTC
# Line 72  Line 72 
72  #include <gd.h>  #include <gd.h>
73  #include <gdfontt.h>  #include <gdfontt.h>
74    
75    #include "config.h"
76  #include "cvsgraph.h"  #include "cvsgraph.h"
77  #include "utils.h"  #include "utils.h"
78  #include "readconf.h"  #include "readconf.h"
79    
80    #if !defined(HAVE_IMAGE_GIF) && !defined(HAVE_IMAGE_PNG) && !defined(HAVE_IMAGE_JPEG)
81    # error No image output format available. Check libgd
82    #endif
83    
84    
85  /*#define DEBUG         1*/  /*#define DEBUG         1*/
86    
87  #define RLOGCMD         "/usr/bin/rlog"  #define RLOGCMD         "/usr/bin/rlog"
# Line 260  Line 266 
266          }          }
267          umask(um);          umask(um);
268    
269          cmd = xmalloc(strlen(cvsroot) + + strlen(module) + strlen(file) + 2 + 1);          cmd = xmalloc(strlen(cvsroot) + strlen(module) + strlen(file) + 2 + 1);
270          sprintf(cmd, "%s/%s/%s", cvsroot, module, file);          sprintf(cmd, "%s/%s/%s", cvsroot, module, file);
271    
272          switch(pid = fork())          switch(pid = fork())
# Line 595  Line 601 
601   * Sort and find helpers   * Sort and find helpers
602   **************************************************************************   **************************************************************************
603   */   */
604    int count_dots(const char *s)
605    {
606            int i;
607            for(i = 0; *s; s++)
608            {
609                    if(*s == '.')
610                            i++;
611            }
612            return i;
613    }
614    
615    int compare_revid(const revid_t *r1, const revid_t *r2)
616    {
617            int d1, d2;
618            char *v1, *v2;
619            char *s1, *s2;
620            int retval = 0;
621            assert(r1 != NULL);
622            assert(r1->rev != NULL);
623            assert(r2 != NULL);
624            assert(r2->rev != NULL);
625    
626            d1 = count_dots(r1->rev);
627            d2 = count_dots(r2->rev);
628            if(d1 != d2)
629            {
630                    return d1 - d2;
631            }
632    
633            s1 = v1 = xstrdup(r1->rev);
634            s2 = v2 = xstrdup(r2->rev);
635            while(1)
636            {
637                    char *vc1 = strchr(s1, '.');
638                    char *vc2 = strchr(s2, '.');
639                    if(vc1 && vc2)
640                            *vc1 = *vc2 = '\0';
641                    if(*s1 && *s2)
642                    {
643                            d1 = atoi(s1);
644                            d2 = atoi(s2);
645                            if(d1 != d2)
646                            {
647                                    retval = d1 - d2;
648                                    break;
649                            }
650                    }
651                    if(!vc1 || !vc2)
652                            break;
653                    s1 = vc1 + 1;
654                    s2 = vc2 + 1;
655            }
656            xfree(v1);
657            xfree(v2);
658            return retval;
659    }
660    
661  int tag_sort(const void *t1, const void *t2)  int tag_sort(const void *t1, const void *t2)
662  {  {
663  #define TAGPTR(t)       (*((tag_t **)t))  #define TAGPTR(t)       (*((tag_t **)t))
# Line 605  Line 668 
668  int rev_sort(const void *v1, const void *v2)  int rev_sort(const void *v1, const void *v2)
669  {  {
670  #define REVPTR(t)       (*((revision_t **)t))  #define REVPTR(t)       (*((revision_t **)t))
671          /* FIXME: This can lead to a segfault when no '.' is found */          return compare_revid(REVPTR(v1)->rev, REVPTR(v2)->rev);
         return atoi(strrchr(REVPTR(v1)->rev->rev, '.') + 1) -  
                 atoi(strrchr(REVPTR(v2)->rev->rev, '.') + 1);  
672  #undef REVPTR  #undef REVPTR
673  }  }
674    
# Line 621  Line 682 
682  int rev_cmp(const void *id, const void *v)  int rev_cmp(const void *id, const void *v)
683  {  {
684  #define REVPTR(t)       (*((revision_t **)t))  #define REVPTR(t)       (*((revision_t **)t))
685          return strcmp(((revid_t *)id)->rev, REVPTR(v)->rev->rev);          return compare_revid((revid_t *)id, REVPTR(v)->rev);
686  #undef REVPTR  #undef REVPTR
687  }  }
688    
# Line 888  Line 949 
949          }          }
950  }  }
951    
952    void reposition_branch(revision_t *r, int *x, int *w)
953    {
954            int i, j;
955            for(j = 0; j < r->nbranches; j++)
956            {
957                    branch_t *b = r->branches[j];
958                    *x += *w + conf.rev_minline + b->tw/2 - b->x;
959                    *w = b->tw/2;
960                    move_branch(b, *x, r->y + r->h);
961                    *x = b->x;
962                    /* Recurse to move branches of branched revisions */
963                    for(i = b->nrevs-1; i >= 0; i--)
964                    {
965                            reposition_branch(b->revs[i], x, w);
966                    }
967            }
968    }
969    
970  void rect_union(int *x, int *y, int *w, int *h, branch_t *b)  void rect_union(int *x, int *y, int *w, int *h, branch_t *b)
971  {  {
972          int x1 = *x;          int x1 = *x;
# Line 979  Line 1058 
1058                  }                  }
1059          }          }
1060    
1061          /* Reposition the branches FIXME: Should be recursive on branchpoint revisions within branches... */          /* Reposition the branches */
1062          x = rcs->branches[0]->x;          x = rcs->branches[0]->x;
1063          w2 = rcs->branches[0]->tw / 2;          w2 = rcs->branches[0]->tw / 2;
1064          for(i = rcs->branches[0]->nrevs-1; i >= 0; i--)          for(i = rcs->branches[0]->nrevs-1; i >= 0; i--)
1065          {          {
1066                  revision_t *r = rcs->branches[0]->revs[i];                  reposition_branch(rcs->branches[0]->revs[i], &x, &w2);
                 for(j = 0; j < r->nbranches; j++)  
                 {  
                         branch_t *b = r->branches[j];  
                         x += w2 + conf.rev_minline + b->tw/2 - b->x;  
                         w2 = b->tw/2;  
                         move_branch(b, x, r->y + r->h);  
                         x = b->x;  
                 }  
1067          }          }
1068    
1069          for(i = 0; i < rcs->nbranches; i++)          for(i = 0; i < rcs->nbranches; i++)
# Line 1011  Line 1082 
1082    
1083  /*  /*
1084   **************************************************************************   **************************************************************************
1085     * Imagemap functions
1086     **************************************************************************
1087     */
1088    void make_imagemap(rcsfilelog_t *rcs, FILE *fp)
1089    {
1090            int i, j;
1091            fprintf(fp, "<map name=\"%s\">\n", conf.map_name);
1092            for(i = 0; i < rcs->nbranches; i++)
1093            {
1094                    branch_t *b = rcs->branches[i];
1095                    fprintf(fp, "<area shape=\"rect\" href=\"branch_%s\" coords=\"%d,%d,%d,%d\" alt=\"Branch %s\">\n",
1096                                    b->branch,
1097                                    b->x - b->w/2, b->y, b->x + b->w/2, b->y + b->h,
1098                                    b->branch);
1099                    for(j = 0; j < b->nrevs; j++)
1100                    {
1101                            revision_t *r = b->revs[j];
1102                            fprintf(fp, "<area shape=\"rect\" href=\"rev_%s\" coords=\"%d,%d,%d,%d\" alt=\"Revision %s\">\n",
1103                                    r->rev->rev,
1104                                    r->x - r->w/2, r->y, r->x + r->w/2, r->y + r->h,
1105                                    r->rev->rev);
1106                    }
1107            }
1108            fprintf(fp, "</map>\n");
1109    }
1110    
1111    /*
1112     **************************************************************************
1113   * Configuration   * Configuration
1114   **************************************************************************   **************************************************************************
1115   */   */
# Line 1051  Line 1150 
1150          "Usage: cvsgraph [options] <file>\n"          "Usage: cvsgraph [options] <file>\n"
1151          "  -c <file>  Read alternative config from <file>\n"          "  -c <file>  Read alternative config from <file>\n"
1152          "  -h         This message\n"          "  -h         This message\n"
1153            "  -i <file>  Write an imagamap to <file>\n"
1154          "  -m <mod>   Use <mod> as cvs module\n"          "  -m <mod>   Use <mod> as cvs module\n"
1155          "  -o <file>  Output to <file>\n"          "  -o <file>  Output to <file>\n"
1156          "  -r <path>  Use <path> as cvsroot path\n"          "  -r <path>  Use <path> as cvsroot path\n"
1157          "  -V         Print version and exit\n"          "  -V         Print version and exit\n"
1158          ;          ;
1159    
1160  #define VERSION_STR     "1.0.0"  #define VERSION_STR     "1.0.1"
1161  #define NOTICE_STR      "Copyright (c) 2001 B.Stultiens"  #define NOTICE_STR      "Copyright (c) 2001 B.Stultiens"
1162    
1163  void add_tag(rcsfilelog_t *rcs, const char *tag, const char *rev)  void add_tag(rcsfilelog_t *rcs, const char *tag, const char *rev)
# Line 1076  Line 1176 
1176          char *outfile = NULL;          char *outfile = NULL;
1177          char *cvsroot = NULL;          char *cvsroot = NULL;
1178          char *cvsmodule = NULL;          char *cvsmodule = NULL;
1179            char *imagemap = NULL;
1180          int lose = 0;          int lose = 0;
1181          FILE *fp;          FILE *fp;
1182          int n;          int n;
1183          rcsfilelog_t *rcs;          rcsfilelog_t *rcs;
1184          gdImagePtr im;          gdImagePtr im;
1185    
1186          while((optc = getopt(argc, argv, "c:hm:o:r:V")) != EOF)  #ifdef DEBUG
1187            setvbuf(stdout, NULL, 0, _IONBF);
1188            setvbuf(stderr, NULL, 0, _IONBF);
1189    #endif
1190    
1191            while((optc = getopt(argc, argv, "c:hi:m:o:r:V")) != EOF)
1192          {          {
1193                  switch(optc)                  switch(optc)
1194                  {                  {
1195                  case 'c':                  case 'c':
1196                          confpath = xstrdup(optarg);                          confpath = xstrdup(optarg);
1197                          break;                          break;
1198                    case 'i':
1199                            imagemap = xstrdup(optarg);
1200                            break;
1201                  case 'm':                  case 'm':
1202                          cvsmodule = xstrdup(optarg);                          cvsmodule = xstrdup(optarg);
1203                          break;                          break;
# Line 1231  Line 1340 
1340          }          }
1341          else          else
1342                  fp = stdout;                  fp = stdout;
1343          GD_IMAGE_XXX(im, fp);  
1344            switch(conf.image_type)
1345            {
1346    #ifdef HAVE_IMAGE_GIF
1347            default:
1348            case IMAGE_GIF:
1349                    gdImageGif(im, fp);
1350                    break;
1351    #endif
1352    #ifdef HAVE_IMAGE_PNG
1353    # ifndef HAVE_IMAGE_GIF
1354            default:
1355    # endif
1356            case IMAGE_PNG:
1357                    gdImagePng(im, fp);
1358                    break;
1359    #endif
1360    #ifdef HAVE_IMAGE_JPEG
1361    # if !defined(HAVE_IMAGE_GIF) && !defined(HAVE_IMAGE_PNG)
1362            default:
1363    # endif
1364            case IMAGE_JPEG:
1365                    gdImageJpeg(im, fp, conf.image_quality);
1366                    break;
1367    #endif
1368            }
1369    
1370          if(outfile)          if(outfile)
1371                  fclose(fp);                  fclose(fp);
1372          gdImageDestroy(im);          gdImageDestroy(im);
1373    
1374            if(imagemap)
1375            {
1376                    if((fp = fopen(imagemap, "w")) == NULL)
1377                    {
1378                            perror(imagemap);
1379                            return 1;
1380                    }
1381                    make_imagemap(rcs, fp);
1382                    fclose(fp);
1383            }
1384    
1385          return 0;          return 0;
1386  }  }
1387    

Legend:
Removed from v.1.4  
changed lines
  Added in v.1.6

  ViewVC Help
Powered by ViewVC 1.1.0 with CvsGraph 1.7.0