/[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.59, Thu Dec 15 13:06:09 2005 UTC revision 1.60, Sun Dec 18 01:57:57 2005 UTC
# Line 38  Line 38 
38  #include <ctype.h>  #include <ctype.h>
39  #include <time.h>  #include <time.h>
40  #include <limits.h>  #include <limits.h>
 #include <regex.h>  
41  #include <math.h>  #include <math.h>
42    
43  #ifdef HAVE_GETOPT_H  #ifdef HAVE_GETOPT_H
# Line 98  Line 97 
97  config_t conf;  config_t conf;
98  int debuglevel;  int debuglevel;
99    
100  static color_t white_color = {255, 255, 255, 0};  static color_t white_color = {255, 255, 255, 0, NULL};
101  static color_t black_color = {0, 0, 0, 0};  static color_t black_color = {0, 0, 0, 0, NULL};
102    
103  static branch_t *subtree_branch = NULL;         /* Set to the (first) subtree branch that we want to show */  static branch_t *subtree_branch = NULL;         /* Set to the (first) subtree branch that we want to show */
104  static revision_t *subtree_rev = NULL;          /* Set to the subtree revision which branches we want to show */  static revision_t *subtree_rev = NULL;          /* Set to the subtree revision which branches we want to show */
# Line 763  Line 762 
762                  rcs->merges[rcs->nmerges].to.rev = rcs->srev[i];                  rcs->merges[rcs->nmerges].to.rev = rcs->srev[i];
763                  rcs->merges[rcs->nmerges].clr = -1;                  rcs->merges[rcs->nmerges].clr = -1;
764                  rcs->nmerges++;                  rcs->nmerges++;
765                  (*r)->stripped = -1;                  (*r)->mergetarget = 1;
766                  rcs->srev[i]->stripped = -1;                  rcs->srev[i]->mergetarget = 1;
767          }          }
768  }  }
769    
# Line 1344  Line 1343 
1343  static color_t *clr_id = NULL;  static color_t *clr_id = NULL;
1344  static int nclr_id = 0;  static int nclr_id = 0;
1345    
1346    static int rexpr_eval(const char *key, const char *content, int flags)
1347    {
1348            int res;
1349            regex_t re;
1350            if(regcomp(&re, content, flags | REG_EXTENDED | REG_NOSUB))
1351                    return 0;
1352            res = regexec(&re, key, 0, NULL, 0);
1353            regfree(&re);
1354            return res == 0;
1355    }
1356    
1357    static int expr_eval(const char *key, int op, const char *content)
1358    {
1359            switch(op)
1360            {
1361            case OP_CONTAINED:      return rexpr_eval(key, content, 0);
1362            case OP_CONTAINEDI:     return rexpr_eval(key, content, REG_ICASE);
1363            case OP_NCONTAINED:     return !rexpr_eval(key, content, 0);
1364            case OP_NCONTAINEDI:    return !rexpr_eval(key, content, REG_ICASE);
1365            case OP_EQ:     return strcmp(key, content) == 0;
1366            case OP_NE:     return strcmp(key, content) != 0;
1367            case OP_GE:     return strcmp(key, content) >= 0;
1368            case OP_GT:     return strcmp(key, content) > 0;
1369            case OP_LE:     return strcmp(key, content) <= 0;
1370            case OP_LT:     return strcmp(key, content) < 0;
1371            }
1372            return 0;
1373    }
1374    
1375    static char *eval_string(node_t *node, revision_t *r)
1376    {
1377            int i;
1378            assert(node != NULL);
1379            switch(node->key)
1380            {
1381            default:
1382            case TYPE_COLOR:
1383                    return "";      /* This should not happen */
1384            case TYPE_STRING:
1385                    return node->value.str;
1386            case KEY_STATE:
1387                    if(r && expr_eval(r->delta->state, node->op, node->content))
1388                            return eval_string(node->tcase, r);
1389                    else
1390                            return eval_string(node->fcase, r);
1391            case KEY_AUTHOR:
1392                    if(r && expr_eval(r->delta->author, node->op, node->content))
1393                            return eval_string(node->tcase, r);
1394                    else
1395                            return eval_string(node->fcase, r);
1396            case KEY_TAG:
1397                    for(i = 0; r && i < r->ntags; i++)
1398                    {
1399                            if(expr_eval(r->tags[i]->tag, node->op, node->content))
1400                                    return eval_string(node->tcase, r);
1401                    }
1402                    return eval_string(node->fcase, r);
1403            case KEY_DATE:
1404                    if(r && expr_eval(r->delta->date, node->op, node->content))
1405                            return eval_string(node->tcase, r);
1406                    else
1407                            return eval_string(node->fcase, r);
1408            case KEY_REV:
1409                    if(r && expr_eval(r->rev->rev, node->op, node->content))
1410                            return eval_string(node->tcase, r);
1411                    else
1412                            return eval_string(node->fcase, r);
1413            }
1414            return "";
1415    }
1416    static color_t *eval_color(node_t *node, revision_t *r, branch_t *b)
1417    {
1418            int i;
1419            assert(node != NULL);
1420            switch(node->key)
1421            {
1422            default:
1423            case TYPE_STRING:
1424                    return &black_color;    /* This should not happen */
1425            case TYPE_COLOR:
1426                    return &node->value.clr;
1427            case KEY_STATE:
1428                    if(r && expr_eval(r->delta->state, node->op, node->content))
1429                            return eval_color(node->tcase, r, b);
1430                    else
1431                            return eval_color(node->fcase, r, b);
1432            case KEY_AUTHOR:
1433                    if(r && expr_eval(r->delta->author, node->op, node->content))
1434                            return eval_color(node->tcase, r, b);
1435                    else
1436                            return eval_color(node->fcase, r, b);
1437            case KEY_TAG:
1438                    for(i = 0; r && i < r->ntags; i++)
1439                    {
1440                            if(expr_eval(r->tags[i]->tag, node->op, node->content))
1441                                    return eval_color(node->tcase, r, b);
1442                    }
1443                    return eval_color(node->fcase, r, b);
1444            case KEY_DATE:
1445                    if(r && expr_eval(r->delta->date, node->op, node->content))
1446                            return eval_color(node->tcase, r, b);
1447                    else
1448                            return eval_color(node->fcase, r, b);
1449            case KEY_REV:
1450                    if(r && expr_eval(r->rev->rev, node->op, node->content))
1451                            return eval_color(node->tcase, r, b);
1452                    if(b && expr_eval(b->branch->branch, node->op, node->content))
1453                            return eval_color(node->tcase, r, b);
1454                    return eval_color(node->fcase, r, b);
1455            }
1456            return &black_color;
1457    }
1458    
1459  static color_t *clr(gdImagePtr im, const char *s, revision_t *r, branch_t *b, int idx)  static color_t *clr(gdImagePtr im, const char *s, revision_t *r, branch_t *b, int idx)
1460  {  {
1461          int i;          int i;
1462          color_t *c = get_colorref(s, idx);          color_t *c = get_colorref(s, idx);
1463          if(!c)          if(!c)
1464                  c = &black_color;                  c = &black_color;
1465            if(c->node)
1466                    c = eval_color(c->node, r, b);
1467          for(i = 0; i < nclr_id; i++)          for(i = 0; i < nclr_id; i++)
1468          {          {
1469                  if(c->r == clr_id[i].r && c->g == clr_id[i].g && c->b == clr_id[i].b)                  if(c->r == clr_id[i].r && c->g == clr_id[i].g && c->b == clr_id[i].b)
1470                          return &clr_id[i];                          return &clr_id[i];
1471          }          }
         /* FIXME: Do color evaluation */  
1472          clr_id = xrealloc(clr_id, (nclr_id+1) * sizeof(*clr_id));          clr_id = xrealloc(clr_id, (nclr_id+1) * sizeof(*clr_id));
1473          clr_id[nclr_id] = *c;          clr_id[nclr_id] = *c;
1474          clr_id[nclr_id].id = gdImageColorAllocate(im, c->r, c->g, c->b);          clr_id[nclr_id].id = gdImageColorAllocate(im, c->r, c->g, c->b);
# Line 1456  Line 1569 
1569          gdImageLine(im, x2, y1+r, x2, y2-r, color->id);          gdImageLine(im, x2, y1+r, x2, y2-r, color->id);
1570          if(conf.box_shadow)          if(conf.box_shadow)
1571          {          {
1572                  gdImageLine(im, x1+r+1, y2+1, x2-r, y2+1, black_color.id);                  gdImageLine(im, x1+r+1, y2+1, x2-r, y2+1, clr(im, NULL, NULL, NULL, 0)->id);
1573                  gdImageLine(im, x2+1, y1+r+1, x2+1, y2-r, black_color.id);                  gdImageLine(im, x2+1, y1+r+1, x2+1, y2-r, clr(im, NULL, NULL, NULL, 0)->id);
1574          }          }
1575          if(r)          if(r)
1576          {          {
# Line 1467  Line 1580 
1580                  gdImageArc(im, x1+r, y2-r, r2, r2,  90, 180, color->id);                  gdImageArc(im, x1+r, y2-r, r2, r2,  90, 180, color->id);
1581                  if(conf.box_shadow)                  if(conf.box_shadow)
1582                  {                  {
1583                          gdImageArc(im, x2-r+1, y2-r+1, r2, r2,   0,  90, black_color.id);                          gdImageArc(im, x2-r+1, y2-r+1, r2, r2,   0,  90, clr(im, NULL, NULL, NULL, 0)->id);
1584                          gdImageArc(im, x2-r+1, y2-r, r2, r2,   0,  90, black_color.id);                          gdImageArc(im, x2-r+1, y2-r, r2, r2,   0,  90, clr(im, NULL, NULL, NULL, 0)->id);
1585                          gdImageArc(im, x2-r, y2-r+1, r2, r2,   0,  90, black_color.id);                          gdImageArc(im, x2-r, y2-r+1, r2, r2,   0,  90, clr(im, NULL, NULL, NULL, 0)->id);
1586                  }                  }
1587                  gdImageArc(im, x2-r, y2-r, r2, r2,   0,  90, color->id);                  gdImageArc(im, x2-r, y2-r, r2, r2,   0,  90, color->id);
1588  #if !defined(NOGDFILL) && !defined(HAVE_GDIMAGEFILLEDARC)  #if !defined(NOGDFILL) && !defined(HAVE_GDIMAGEFILLEDARC)
# Line 1560  Line 1673 
1673          ty += conf.rev_tspace;          ty += conf.rev_tspace;
1674          if(!conf.rev_hidenumber)          if(!conf.rev_hidenumber)
1675          {          {
1676                  draw_string(im, r->rev->rev, &conf.rev_font, x2, ty, ALIGN_HC, clr(im, "rev_color", r, NULL, 0));                  draw_string(im, r->revidtext, &conf.rev_font, x2, ty, ALIGN_HC, clr(im, "rev_color", r, NULL, 0));
1677                  ty += get_sheight(r->rev->rev, &conf.rev_font);                  ty += get_sheight(r->revidtext, &conf.rev_font);
1678          }          }
1679          draw_stringnl(im, r->revtext, &conf.rev_text_font, x2, ty, ALIGN_HC, clr(im, "rev_text_color", r, NULL, 0));          draw_stringnl(im, r->revtext, &conf.rev_text_font, x2, ty, ALIGN_HC, clr(im, "rev_text_color", r, NULL, 0));
1680          ty += get_sheight(r->revtext, &conf.rev_text_font);          ty += get_sheight(r->revtext, &conf.rev_text_font);
# Line 2115  Line 2228 
2228          im = gdImageCreate(w, h);          im = gdImageCreate(w, h);
2229          bgid = clr(im, "color_bg", NULL, NULL, 0)->id;  /* The background is always a unique color, */          bgid = clr(im, "color_bg", NULL, NULL, 0)->id;  /* The background is always a unique color, */
2230          zap_clr();                                      /* so clear the color ref table */          zap_clr();                                      /* so clear the color ref table */
2231          clr(im, "__black_color__", NULL, NULL, 0);          clr(im, NULL, NULL, NULL, 0);
2232    
2233          if(conf.transparent_bg)          if(conf.transparent_bg)
2234                  gdImageColorTransparent(im, bgid);                  gdImageColorTransparent(im, bgid);
# Line 2844  Line 2957 
2957                          branch_t *bp = rcs->branches[i];                          branch_t *bp = rcs->branches[i];
2958                          for(j = fr; j < bp->nrevs-1; j++)                          for(j = fr; j < bp->nrevs-1; j++)
2959                          {                          {
2960                                  if(!bp->revs[j]->ntags && bp->revs[j]->stripped >= 0 && !bp->revs[j]->nbranches)                                  if(!bp->revs[j]->ntags && bp->revs[j]->stripped >= 0 && !bp->revs[j]->mergetarget && !bp->revs[j]->nbranches)
2961                                  {                                  {
2962                                          bp->revs[j]->stripped = 1;                                          bp->revs[j+1]->stripped = 1;
2963                                          memmove(&bp->revs[j], &bp->revs[j+1], (bp->nrevs-j-1) * sizeof(bp->revs[0]));                                          memmove(&bp->revs[j], &bp->revs[j+1], (bp->nrevs-j-1) * sizeof(bp->revs[0]));
2964                                          bp->nrevs--;                                          bp->nrevs--;
2965                                          j--;                                          j--;
# Line 2965  Line 3078 
3078                  int w;                  int w;
3079                  int h;                  int h;
3080                  rp = rcs->srev[i];                  rp = rcs->srev[i];
3081                  rp->revtext = expand_string(conf.rev_text, rcs, rp, rp->rev, NULL, rp->ntags ? rp->tags[0] : NULL);                  rp->revtext = expand_string(conf.rev_text.node ? eval_string(conf.rev_text.node, rp) : conf.rev_text.str, rcs, rp, rp->rev, NULL, rp->ntags ? rp->tags[0] : NULL);
3082                    rp->revidtext = expand_string(conf.rev_idtext.node ? eval_string(conf.rev_idtext.node, rp) : conf.rev_idtext.str, rcs, rp, rp->rev, NULL, rp->ntags ? rp->tags[0] : NULL);
3083                  w = get_swidth(rp->revtext, &conf.rev_text_font);                  w = get_swidth(rp->revtext, &conf.rev_text_font);
3084                  j = get_swidth(rp->rev->rev, &conf.rev_font);                  j = get_swidth(rp->revidtext, &conf.rev_font);
3085                  if(j > w)                  if(j > w)
3086                          w = j;                          w = j;
3087                  h = get_sheight(rp->revtext, &conf.rev_text_font);                  h = get_sheight(rp->revtext, &conf.rev_text_font);
3088                  if(!conf.rev_hidenumber)                  if(!conf.rev_hidenumber)
3089                          h += get_sheight(rp->rev->rev, &conf.rev_font);                          h += get_sheight(rp->revidtext, &conf.rev_font);
3090                  for(j = 0; j < rp->ntags; j++)                  for(j = 0; j < rp->ntags; j++)
3091                  {                  {
3092                          int ww = get_swidth(rp->tags[j]->tag, &conf.tag_font);                          int ww = get_swidth(rp->tags[j]->tag, &conf.tag_font);
# Line 3628  Line 3742 
3742          "  -[0-9] <txt> Use <txt> for expansion\n"          "  -[0-9] <txt> Use <txt> for expansion\n"
3743          ;          ;
3744    
3745  #define VERSION_STR     "1.5.2"  #define VERSION_STR     "1.6.0"
3746  #define NOTICE_STR      "Copyright (c) 2001,2002,2003,2004 B.Stultiens"  #define NOTICE_STR      "Copyright (c) 2001-2005 B.Stultiens"
3747    
3748  static void append_slash(char **path)  static void append_slash(char **path)
3749  {  {
# Line 3789  Line 3903 
3903          conf.map_diff_alt       = xstrdup("alt=\"%P &lt;-&gt; %R\"");          conf.map_diff_alt       = xstrdup("alt=\"%P &lt;-&gt; %R\"");
3904          conf.map_merge_href     = xstrdup("href=\"unset: conf.map_merge_href\"");          conf.map_merge_href     = xstrdup("href=\"unset: conf.map_merge_href\"");
3905          conf.map_merge_alt      = xstrdup("alt=\"%P &lt;-&gt; %R\"");          conf.map_merge_alt      = xstrdup("alt=\"%P &lt;-&gt; %R\"");
3906          conf.rev_text           = xstrdup("%d");          conf.rev_text.str       = xstrdup("%d");
3907            conf.rev_idtext.str     = xstrdup("%R");
3908          conf.branch_subtree     = xstrdup("");          conf.branch_subtree     = xstrdup("");
3909          conf.tag_ignore         = xstrdup("");          conf.tag_ignore         = xstrdup("");
3910          conf.merge_from.n       = 0;          conf.merge_from.n       = 0;

Legend:
Removed from v.1.59  
changed lines
  Added in v.1.60

  ViewVC Help
Powered by ViewVC 1.1.0 with CvsGraph 1.7.0