"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 /*}}}*/