"Fossies" - the Fresh Open Source Software Archive

Member "teapot-2.3.0/graph.c" (6 Feb 2012, 6098 Bytes) of package /linux/privat/old/teapot-2.3.0.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "graph.c" see the Fossies "Dox" file reference documentation.

    1 /* #includes */ /*{{{C}}}*//*{{{*/
    2 #undef  _POSIX_SOURCE
    3 #define _POSIX_SOURCE   1
    4 #undef  _POSIX_C_SOURCE
    5 #define _POSIX_C_SOURCE 2
    6 #define _GNU_SOURCE   1
    7 
    8 #include <assert.h>
    9 #include <ctype.h>
   10 #include <math.h>
   11 #include <stdio.h>
   12 #include <stdlib.h>
   13 double strtod(const char *nptr, char **endptr); /* SunOS 4 hack */
   14 #ifdef OLD_REALLOC
   15 #define realloc(s,l) myrealloc(s,l)
   16 #endif
   17 extern char *optarg;
   18 extern int optind,opterr,optopt;
   19 int getopt(int argc, char * const *argv, const char *optstring);
   20 
   21 #ifdef DMALLOC
   22 #include "dmalloc.h"
   23 #endif
   24 
   25 #include "csv.h"
   26 /*}}}*/
   27 
   28 int main(int argc, char *argv[]) /*{{{*/
   29 {
   30   /* variables */ /*{{{*/
   31   struct Pair
   32   {
   33     const char *label;
   34     double value;
   35     int special;
   36   } *pair;
   37   int pairs;
   38   double height,width;
   39   int box;
   40   int nl;
   41   /*}}}*/
   42 
   43   /* parse options */ /*{{{*/
   44   {
   45     int c;
   46     height=width=2.0;
   47     box=0;
   48     nl=1;
   49     while ((c=getopt(argc,argv,"bnw:h:?"))!=EOF) switch (c)
   50     {
   51       /* w width */ /*{{{*/
   52       case 'w':
   53       {
   54         char *end;
   55 
   56         width=strtod(optarg,&end);
   57         if (*end!='\0')
   58         {
   59           fprintf(stderr,"graph: invalid width\n");
   60           exit(1);
   61         }
   62         break;
   63       }
   64       /*}}}*/
   65       /* h height */ /*{{{*/
   66       case 'h':
   67       {
   68         char *end;
   69 
   70         height=strtod(optarg,&end);
   71         if (*end!='\0')
   72         {
   73           fprintf(stderr,"graph: invalid height\n");
   74           exit(1);
   75         }
   76         break;
   77       }
   78       /*}}}*/
   79       /* n */
   80       case 'n':
   81       {
   82         nl=0;
   83         break;
   84       }
   85       /* b */
   86       case 'b':
   87       {
   88         box=1;
   89         break;
   90       }
   91       default:
   92       {
   93         fprintf(stderr,"Usage: graph [-b][-h height][-w width]\n");
   94         exit(1);
   95       }
   96     }
   97   }
   98   /*}}}*/
   99   /* get data */ /*{{{*/
  100   {
  101     char ln[256];
  102     int line,pairsz;
  103 
  104     pairs=pairsz=0;
  105     pair=(struct Pair*)0;
  106     for (line=1; fgets(ln,sizeof(ln),stdin); ++line)
  107     {
  108       const char *s;
  109       const char *end;
  110 
  111       if (pairs==pairsz)
  112       {
  113         if ((pair=realloc(pair,sizeof(struct Pair)*(pairsz+=128)))==(struct Pair*)0)
  114         {
  115           fprintf(stderr,"graph:%d:out of memory\n",line);
  116           exit(1);
  117         }
  118       }
  119       s=ln;
  120       pair[pairs].label=csv_string(s,&end);
  121       if (s==end) fprintf(stderr,"graph:%d:invalid string, ignoring record\n",line);
  122       else
  123       {
  124         s=end;
  125         pair[pairs].value=csv_double(s,&end);
  126         if (s==end) fprintf(stderr,"graph:%d:invalid value, ignoring record\n",line);
  127         else
  128         {
  129           s=end;
  130           pair[pairs].special=csv_double(s,&end);
  131           if (s==end && *s!='\n') fprintf(stderr,"graph:%d:invalid mark value, ignoringrecord\n",line);
  132           else
  133           {
  134             s=end;
  135             if (*s!='\n') fprintf(stderr,"graph:%d:trailing garbage\n",line);
  136           }
  137           ++pairs;
  138         }
  139       }
  140     }
  141   }
  142   /*}}}*/
  143 
  144   if (box) /* make box graph */ /*{{{*/
  145   {
  146     double height,boxwid,min,max,scale;
  147     int i;
  148 
  149     height=2;
  150     boxwid=width/pairs;
  151     for (min=max=0.0,i=0; i<pairs; ++i)
  152     {
  153       if (pair[i].value<min) min=pair[i].value;
  154       else if (pair[i].value>max) max=pair[i].value;
  155     }
  156     scale=height/(max-min);
  157     printf("[\nFRAME: box invis wid %f ht %f\n",width,height);
  158     for (i=0; i<pairs; ++i)
  159     {
  160       double v;
  161 
  162       v=fabs(pair[i].value);
  163       printf
  164       (
  165       "box wid %f ht %f with .%s at FRAME.sw + (%f,%f) \"%s\"\n",
  166       boxwid,
  167       v*scale,
  168       pair[i].value>0 ? "sw" : "nw",
  169       i*boxwid,
  170       -min*scale,
  171       pair[i].label
  172       );
  173     }
  174     printf("]"); if (nl) printf("\n");
  175   }
  176   /*}}}*/
  177   else /* make pie graph */ /*{{{*/
  178   {
  179     int anyspecial,i;
  180     double sum,scale,extra,arc;
  181 
  182     for (sum=0.0,i=0,anyspecial=0; i<pairs; ++i)
  183     {
  184       sum+=pair[i].value;
  185       if (pair[i].special) anyspecial=1;
  186     }
  187     scale=2.0*M_PI/sum;
  188     printf("[\n");
  189     printf("box invis wid %f ht %f\n",width,width);
  190     if (anyspecial) width-=width/10.0;
  191     for (sum=0,i=0; i<pairs; sum+=pair[i].value,++i)
  192     {
  193       extra=(pair[i].special!=0)*width/20.0;
  194       for (arc=0; (arc+M_PI_4)<(pair[i].value*scale); arc+=M_PI_4)
  195       {
  196         printf
  197         (
  198         "arc from last box.c + (%f,%f) to last box.c + (%f,%f) rad %f\n",
  199         cos((sum+arc)*scale)*width/2.0 + cos((sum+pair[i].value/2.0)*scale)*extra,
  200         sin((sum+arc)*scale)*width/2.0 + sin((sum+pair[i].value/2.0)*scale)*extra,
  201         cos((sum+arc+M_PI_4)*scale)*width/2.0 + cos((sum+pair[i].value/2.0)*scale)*extra,
  202         sin((sum+arc+M_PI_4)*scale)*width/2.0 + sin((sum+pair[i].value/2.0)*scale)*extra,
  203         width/2.0
  204         );
  205       }
  206       printf
  207       (
  208       "arc from last box.c + (%f,%f) to last box.c + (%f,%f) rad %f\n",
  209       cos((sum+arc)*scale)*width/2.0 + cos((sum+pair[i].value/2.0)*scale)*extra,
  210       sin((sum+arc)*scale)*width/2.0 + sin((sum+pair[i].value/2.0)*scale)*extra,
  211       cos((sum+pair[i].value)*scale)*width/2.0 + cos((sum+pair[i].value/2.0)*scale)*extra,
  212       sin((sum+pair[i].value)*scale)*width/2.0 + sin((sum+pair[i].value/2.0)*scale)*extra,
  213       width/2.0
  214       );
  215 
  216       printf
  217       (
  218       "line from last box.c + (%f,%f) to last box.c + (%f,%f)\n",
  219       cos((sum+pair[i].value/2.0)*scale)*extra,
  220       sin((sum+pair[i].value/2.0)*scale)*extra,
  221       cos(sum*scale)*width/2.0+cos((sum+pair[i].value/2.0)*scale)*extra,
  222       sin(sum*scale)*width/2.0+sin((sum+pair[i].value/2.0)*scale)*extra
  223       );
  224 
  225       printf
  226       (
  227       "line from last box.c + (%f,%f) to last box.c + (%f,%f)\n",
  228       cos((sum+pair[i].value/2.0)*scale)*extra,
  229       sin((sum+pair[i].value/2.0)*scale)*extra,
  230       cos((sum+pair[i].value)*scale)*width/2.0+cos((sum+pair[i].value/2.0)*scale)*extra,
  231       sin((sum+pair[i].value)*scale)*width/2.0+sin((sum+pair[i].value/2.0)*scale)*extra
  232       );
  233 
  234       printf
  235       (
  236       "\"%s\" at last box.c + (%f,%f)\n",
  237       pair[i].label,
  238       cos((sum+pair[i].value/2.0)*scale)*width*0.35,
  239       sin((sum+pair[i].value/2.0)*scale)*width*0.35
  240       );
  241     }
  242     printf("]"); if (nl) printf("\n");
  243   }
  244   /*}}}*/
  245   return 0;
  246 }
  247 /*}}}*/