distrib.c
上传用户:shbosideng
上传日期:2013-05-04
资源大小:1555k
文件大小:20k
源码类别:

SNMP编程

开发平台:

C/C++

  1. /****************************************************************/
  2. /*                                                              */
  3. /* distrib.c (see readme.html for program explanation)          */
  4. /*                                                              */
  5. /* author : Philippe Simonet, Philippe.Simonet@swiisstelecom.com*/
  6. /*                                                              */
  7. /* change log :                                                 */
  8. /*                                                              */
  9. /* v. 1.00 : initial update (SIP) (23.06.97)                    */
  10. /*                                                              */
  11. /*                                                              */
  12. /*                                                              */
  13. /************************************************************************/
  14. #include <stdio.h>
  15. #include <string.h>
  16. #include <stdlib.h>
  17. #include <malloc.h>
  18. #include <time.h>
  19. #include "gd.h"
  20. #include "gdfonts.h"
  21. #define FALSE 0
  22. #define TRUE 1
  23. #define TEXT 1
  24. #define RECT 2
  25. #define POLY 3
  26. #define COLOR 4
  27. #define COLORDEF 5
  28. #define LINK 6
  29. #define COMPOUND 7
  30. #define ENDCOMPOUND 8
  31. #define GIFAREA 9
  32. #define URL 10
  33. #define IN 11
  34. #define OUT 12
  35. #define INOUT 13
  36. #define UNKNOWN 99
  37. #ifndef max
  38.  #define max(a,b) ((a)>(b))?(a):(b)
  39. #endif
  40. #ifndef min
  41.  #define min(a,b) ((a)<(b))?(a):(b)
  42. #endif
  43. int distcount;
  44. int xsize, ysize, rounds, rate;
  45. int dist[1000][2];
  46. /************************************************************************/
  47. /* analyze command-line options */
  48. static int optind = 0;  /* Global argv index.  */
  49. static char *scan = NULL;   /* Private scan pointer. */
  50. static int scale = 15;
  51. int getopt1( int argc, char *argv[], char *optstring, char ** optarg )
  52. {
  53.     int  c; /* return value */
  54.     char  *place;
  55.     char     *index();
  56.     *optarg = NULL;
  57. /* check argument validity */
  58.     if (scan == NULL || *scan == '') {
  59.         if (optind == 0) optind++;
  60.         if (optind >= argc) return EOF;
  61.         place = argv[optind];
  62.         if (place[0] != '-' || place[1] == '') return EOF;
  63.         optind++;
  64.         if (place[1] == '-' && place[2] == '') return EOF;
  65.         scan = place+1;
  66.     }
  67.     c = *scan++; /* get option character */
  68.     place = strchr(optstring, c);
  69.     if (place == NULL || c == ':') return '?';
  70. /* set optarg if needed */
  71.     if (*++place == ':') {
  72.         if (*scan != '') {
  73.          *optarg = scan; scan = NULL;
  74.         } else {
  75.          *optarg = argv[optind], optind++;
  76.         }
  77.     }
  78.     return c;
  79. }
  80. /************************************************************************/
  81. void computes_distrib ( FILE * fi, int length, int nb, unsigned int maxbytes ) {
  82. int i,j;
  83. unsigned long time, in, out, maxin, maxout;
  84. for ( i = 0; i < length; i ++ ) {
  85. in = 0; out = 0; 
  86. /* compute mean on 'nb' items */
  87. for (j = 0; j < nb; j ++ ) {
  88. unsigned long wi, wo;
  89. if (fscanf(fi,"%lu %lu %lu %lu %lun",&time,&wi,&wo,&maxin, &maxout) != 5) {
  90. printf ( "config file error !!!n" );
  91. } else {
  92. in += wi; out += wo;
  93. }
  94. }
  95. in /= nb; out /= nb;
  96. if ( in  >= maxbytes ) in  = maxbytes-1;
  97. if ( out >= maxbytes ) out = maxbytes-1;
  98. dist[(( in*distcount)/maxbytes)][0] ++;
  99. dist[((out*distcount)/maxbytes)][1] ++;
  100. }
  101. };
  102. /************************************************************************/
  103. /* in case of trouble ...                                               */
  104. void print_error ( void )
  105. fprintf ( stderr, "Read mrtg log files and build distribution graphs.n" );
  106. fprintf ( stderr, "Version 1.1, 27.06.97.n" );
  107. fprintf ( stderr, "Use : case 1 : (1 distr. log file)n" );
  108. fprintf ( stderr, "  distrib -i logfile -o gfile -w width -h height -t type -r rate -d countn" );
  109. fprintf ( stderr, "   ifile : input log file name,n" );
  110. fprintf ( stderr, "   gfile : output gif file (will be overwritten),n" );
  111. fprintf ( stderr, "   count : histogram count,n" );
  112. fprintf ( stderr, "   rate : line rate,n" );
  113. fprintf ( stderr, "   type : length of measurement (d/w/m/y).n" );
  114. fprintf ( stderr, "Use : case 2 : (distr. from distrib. file)n" );
  115. fprintf ( stderr, "  distrib -i distrib -o gfile -w width -h height -t x -r top -d countn" );
  116. fprintf ( stderr, "   ifile : input distribution summary file name,n" );
  117. fprintf ( stderr, "   gfile : output gif file (will be overwritten),n" );
  118. fprintf ( stderr, "   top : how may top n,n" );
  119. fprintf ( stderr, "   count : histogram count,n" );
  120. fprintf ( stderr, "   type : 'x'.n" );
  121. }
  122. /************************************************************************/
  123. #define r(color) ((color&0x0000ff)>>0)
  124. #define g(color) ((color&0x00ff00)>>8)
  125. #define b(color) ((color&0xff0000)>>16)
  126. #define rgb(color) ((color&0x0000ff)>>0),((color&0x00ff00)>>8),((color&0xff0000)>>16)
  127. /************************************************************************/
  128. /* build a color or find the nearest color in the color table           */ 
  129. int find_color ( gdImagePtr graph, int color ) {
  130. int i_col;
  131. if ( (i_col = gdImageColorExact(graph,r(color), g(color), b(color))) == -1 ) {
  132. if ( (i_col = gdImageColorAllocate(graph,r(color), g(color), b(color))) == -1 ) {
  133. i_col = gdImageColorClosest(graph,r(color), g(color), b(color));
  134. }
  135. }
  136. return (i_col);
  137. }
  138. /************************************************************************/
  139. /* draw the gif file */
  140. void draw_distrib_gif ( FILE * score, FILE * gif )
  141. {
  142. #define c_blank 245,245,245 /* base colors */
  143. #define c_light 194,194,194
  144. #define c_dark 100,100,100
  145. #define c_black 0,0,0
  146. #define c_white 255,255,0
  147. #define c_blue 0,0,255
  148. #define c_red 255,0,0
  149. #define c_green 0,255,0
  150.     gdImagePtr graph;
  151. int i_light,i_dark,i_blank, i_black, i_white, i_blue, i_red, i_green;
  152. int color[4000][2];
  153.     graph = gdImageCreate(xsize, ysize);
  154.     /* the first color allocated will be the background color. */
  155.     i_blank = gdImageColorAllocate(graph,c_blank);
  156.     i_light = gdImageColorAllocate(graph,c_light);
  157.     i_dark = gdImageColorAllocate(graph,c_dark);
  158.     gdImageInterlace(graph, 1); 
  159.     i_black = gdImageColorAllocate(graph,c_black);
  160.     i_white = gdImageColorAllocate(graph,c_white);
  161.     i_red = gdImageColorAllocate(graph,c_red);
  162.     i_green = gdImageColorAllocate(graph,c_green);
  163.     i_blue = gdImageColorAllocate(graph,c_blue);
  164. int i;
  165. for (i = 0; i <= distcount; i++ ) {
  166. color[distcount - i - 1][0] = gdImageColorAllocate(graph, (255*i)/distcount, 255, (255*i)/distcount);
  167. }
  168. for (i = 0; i <= distcount; i++ ) {
  169. color[distcount - i - 1][1] = gdImageColorAllocate(graph, (255*i)/distcount, (255*i)/distcount, 255);
  170. }
  171. }
  172.     /* draw the image border */
  173.     gdImageLine(graph,0,0,xsize-1,0,i_light);
  174.     gdImageLine(graph,1,1,xsize-2,1,i_light);
  175.     gdImageLine(graph,0,0,0,ysize-1,i_light);
  176.     gdImageLine(graph,1,1,1,ysize-2,i_light);
  177.     gdImageLine(graph,xsize-1,0,xsize-1,ysize-1,i_dark);
  178.     gdImageLine(graph,0,ysize-1,xsize-1,ysize-1,i_dark);
  179.     gdImageLine(graph,xsize-2,1,xsize-2,ysize-2,i_dark);
  180.     gdImageLine(graph,1,ysize-2,xsize-2,ysize-2,i_dark);
  181. { /* date the graph */
  182. struct tm *newtime;
  183. time_t aclock;
  184. time( &aclock ); /* Get time in seconds */
  185. newtime = localtime( &aclock ); /* Convert time to struct */
  186. /* tm form */
  187. gdImageString(graph, gdFontSmall,gdFontSmall->w,3,asctime( newtime ),i_dark);
  188. };
  189. /*i_col = find_color(graph, colortable[pcurrententry->color]);
  190.       gdImageFilledRectangle(graph,
  191. pcurrententry->coords[0],
  192. pcurrententry->coords[1],
  193. pcurrententry->coords[2],
  194. pcurrententry->coords[3],i_col2);
  195.  }
  196. gdImageString(graph, gdFontSmall,
  197. pcurrententry->coords[0],
  198. pcurrententry->coords[1],
  199. pcurrententry->str,
  200. i_col );
  201. gdImageStringUp(graph, gdFontSmall,
  202. pcurrententry->coords[0],
  203. pcurrententry->coords[1],
  204. pcurrententry->str,
  205. i_col );
  206.    gdImagePtr brush_2pix;
  207.     brush_2pix = gdImageCreate(2,2);
  208. gdImageColorAllocate(
  209. brush_2pix,
  210. r(colortable[colorratetable[pcurrententry->rate]]),
  211. g(colortable[colorratetable[pcurrententry->rate]]),
  212. b(colortable[colorratetable[pcurrententry->rate]]) );
  213. gdImageSetBrush(graph, brush_2pix);
  214. i_col = gdBrushed;
  215. gdImageLine(graph, x, y, x2, y2,i_col);
  216.     gdImageDestroy(brush_2pix);*/
  217. /* draw axes and graphs */
  218. {
  219. int w = gdFontSmall->w, h = gdFontSmall->h, i, j, k, incrx, incry;
  220. char str[4000];
  221. int nbaxesx = (rate + 1);
  222. int nbaxesy = 6;
  223. int textx = 7;
  224. int texty = 15;
  225. incry = (ysize-(h*2)-(w*texty))/(nbaxesy-1); 
  226. incrx = (xsize-(w*(textx+2)))/(nbaxesx-1);
  227. j = 100;
  228. for ( i = h*2; i <= ((h*2) + (incry * (nbaxesy-1))) ; i+= incry ) {
  229. gdImageLine(graph,w*textx,i,w*textx + (incrx*(nbaxesx-1)),i,i_black); /* horizontal */
  230. sprintf ( str, "%3u%%", j ); j-= 100/(nbaxesy-1);
  231. gdImageString(graph, gdFontSmall,w,i-h/2,str,i_black );
  232. }
  233. j = 0;
  234. for ( i = w*7; i <= ((w*7) + (incrx * (nbaxesx-1))) ; i+= incrx ) {
  235. /*gdImageLine(graph,i,h*2,i,h*2 + (incry*(AXESY-1)),i_black);*/ /* vertical */
  236. /*sprintf ( str, "%3u%%", j ); j+= (100/(AXESX-1));
  237. gdImageStringUp(graph, gdFontSmall, i - w/2, ysize - h, str, i_black );*/
  238. }
  239. for ( i = 0; i < rate; i ++ ) {
  240. char *name,*ptr;
  241. int tin=0, tout=0;
  242. int x1, x2, y1, y2, mrgx;
  243. if ( fscanf ( score, "%s", str ) == EOF ) break;
  244. /*printf ( "%sn", str );*/
  245. name = str;
  246. if ((ptr = strtok( str, ":")) == NULL) continue;
  247. /*printf ( "%s:", name );*/
  248. for ( j = 0; j < distcount; j++ ) {
  249. dist[j][0] = dist[j][0] = 0;
  250. if ((ptr = strtok( NULL, "/,")) == NULL) continue;
  251. dist[j][0] = atoi(ptr); tin += dist[j][0];
  252. if ((ptr = strtok( NULL, "/,")) == NULL) continue;
  253. dist[j][1] = atoi(ptr); tout += dist[j][1];
  254. /*printf ( "%u/%u,",dist[j][0],dist[j][1]  );*/
  255. }
  256. /*printf ( "n" );*/
  257. /* draw label and graphs */
  258. mrgx = incrx/5;
  259. x1 = (w*textx) + (i*incrx) + (incrx/2) - (h/2);
  260. y1 = ysize-h;
  261. gdImageStringUp( graph, gdFontSmall, x1, y1, str, i_black );
  262. for (k = 0; k < 2; k ++ ) {
  263. y1 = ysize-((texty-4) * w);
  264. if ( k == 0 ) {
  265. x1 = (w*textx) + (i*incrx) + mrgx;
  266. x2 = x1 + (incrx/3);
  267. gdImageStringUp( graph, gdFontSmall, x1, y1, "in", i_black );
  268. } else {
  269. x2 = (w*textx) + ((i+1)*incrx) - mrgx;
  270. x1 = x2 - (incrx/3);
  271. gdImageStringUp( graph, gdFontSmall, x1, y1, "out", i_black );
  272. }
  273. y2 = h*2 + (incry*(nbaxesy-1));
  274. for ( j = distcount-1; j >=0 ; j-- ) {
  275. y1 = y2 - (((ysize-(h*2)-(w*texty) - 2) * dist[j][k]) / tin);
  276. if (j == 0) { /* 'correct' cumulative error */
  277. y1 = h*2;
  278. }
  279. gdImageFilledRectangle(graph, x1, y1, x2, y2,color[j][k]);
  280. gdImageRectangle(graph, x1, y1, x2, y2,i_black);
  281. y2 = y1;
  282. }
  283. }
  284. /*
  285. int x1, x2, y1, y2, mrgx;
  286. mrgx = incrx/5;
  287. x1 = (w*7) + (i*incrx) + mrgx;
  288. x2 = x1 + (incrx/3);
  289. y2 = h*2 + (incry*(AXESY-1)) - 2;
  290. y1 = y2 - (((ysize-(h*2)-(w*7) - 2) * dist[i][0]) / rounds);
  291. gdImageFilledRectangle(graph, x1, y1, x2, y2,i_green);
  292. gdImageRectangle(graph, x1, y1, x2, y2,i_dark);
  293. x2 = (w*7) + ((i+1)*incrx) - mrgx;
  294. x1 = x2 - (incrx/3);
  295. y2 = h*2 + (incry*(AXESY-1)) - 2;
  296. y1 = y2 - (((ysize-(h*2)-(w*7) - 2) * dist[i][1]) / rounds);
  297. gdImageFilledRectangle(graph, x1, y1, x2, y2,i_blue);
  298. gdImageRectangle(graph, x1, y1, x2, y2,i_dark);
  299. */
  300. }
  301. }
  302.     gdImageGif(graph, gif);    
  303.     gdImageDestroy(graph);
  304. }
  305. /************************************************************************/
  306. /* draw the gif file, based on the tentry desciption                    */
  307. void draw_gif ( FILE * gif )
  308. {
  309. #define c_blank 245,245,245 /* base colors */
  310. #define c_light 194,194,194
  311. #define c_dark 100,100,100
  312. #define c_black 0,0,0
  313. #define c_white 255,255,0
  314. #define c_blue 0,0,255
  315. #define c_red 255,0,0
  316. #define c_green 0,255,0
  317.     gdImagePtr graph;
  318. int i_light,i_dark,i_blank, i_black, i_white, i_blue, i_red, i_green;
  319.     graph = gdImageCreate(xsize, ysize);
  320.     /* the first color allocated will be the background color. */
  321.     i_blank = gdImageColorAllocate(graph,c_blank);
  322.     i_light = gdImageColorAllocate(graph,c_light);
  323.     i_dark = gdImageColorAllocate(graph,c_dark);
  324.     gdImageInterlace(graph, 1); 
  325.     i_black = gdImageColorAllocate(graph,c_black);
  326.     i_white = gdImageColorAllocate(graph,c_white);
  327.     i_red = gdImageColorAllocate(graph,c_red);
  328.     i_green = gdImageColorAllocate(graph,c_green);
  329.     i_blue = gdImageColorAllocate(graph,c_blue);
  330.     /* draw the image border */
  331.     gdImageLine(graph,0,0,xsize-1,0,i_light);
  332.     gdImageLine(graph,1,1,xsize-2,1,i_light);
  333.     gdImageLine(graph,0,0,0,ysize-1,i_light);
  334.     gdImageLine(graph,1,1,1,ysize-2,i_light);
  335.     gdImageLine(graph,xsize-1,0,xsize-1,ysize-1,i_dark);
  336.     gdImageLine(graph,0,ysize-1,xsize-1,ysize-1,i_dark);
  337.     gdImageLine(graph,xsize-2,1,xsize-2,ysize-2,i_dark);
  338.     gdImageLine(graph,1,ysize-2,xsize-2,ysize-2,i_dark);
  339. { /* date the graph */
  340. struct tm *newtime;
  341. time_t aclock;
  342. time( &aclock ); /* Get time in seconds */
  343. newtime = localtime( &aclock ); /* Convert time to struct */
  344. /* tm form */
  345. gdImageString(graph, gdFontSmall,gdFontSmall->w,3,asctime( newtime ),i_dark);
  346. };
  347. /*i_col = find_color(graph, colortable[pcurrententry->color]);
  348.       gdImageFilledRectangle(graph,
  349. pcurrententry->coords[0],
  350. pcurrententry->coords[1],
  351. pcurrententry->coords[2],
  352. pcurrententry->coords[3],i_col2);
  353.  }
  354. gdImageString(graph, gdFontSmall,
  355. pcurrententry->coords[0],
  356. pcurrententry->coords[1],
  357. pcurrententry->str,
  358. i_col );
  359. gdImageStringUp(graph, gdFontSmall,
  360. pcurrententry->coords[0],
  361. pcurrententry->coords[1],
  362. pcurrententry->str,
  363. i_col );
  364.    gdImagePtr brush_2pix;
  365.     brush_2pix = gdImageCreate(2,2);
  366. gdImageColorAllocate(
  367. brush_2pix,
  368. r(colortable[colorratetable[pcurrententry->rate]]),
  369. g(colortable[colorratetable[pcurrententry->rate]]),
  370. b(colortable[colorratetable[pcurrententry->rate]]) );
  371. gdImageSetBrush(graph, brush_2pix);
  372. i_col = gdBrushed;
  373. gdImageLine(graph, x, y, x2, y2,i_col);
  374.     gdImageDestroy(brush_2pix);*/
  375. /* draw axes and graphs */
  376. {
  377. int w = gdFontSmall->w, h = gdFontSmall->h, i, j, incrx, incry, maxio;
  378. char str[20];
  379. #define AXESX (distcount + 1)
  380. #define AXESY 6
  381. maxio = 0;
  382. for ( i = 0; i < distcount; i ++ ) {
  383. if (maxio < dist[i][0]) maxio = dist[i][0];
  384. if (maxio < dist[i][1]) maxio = dist[i][1];
  385. }
  386. incry = (ysize-(h*2)-(w*7))/(AXESY-1); incrx = (xsize-(w*9))/(AXESX-1);
  387. j = 100;
  388. for ( i = h*2; i <= ((h*2) + (incry * (AXESY-1))) ; i+= incry ) {
  389. gdImageLine(graph,w*7,i,w*7 + (incrx*(AXESX-1)),i,i_black); /* horizontal */
  390. sprintf ( str, "%3u%%", j ); j-= 100/(AXESY-1);
  391. gdImageString(graph, gdFontSmall,w,i-h/2,str,i_black );
  392. }
  393. j = 0;
  394. for ( i = w*7; i <= ((w*7) + (incrx * (AXESX-1))) ; i+= incrx ) {
  395. gdImageLine(graph,i,h*2,i,h*2 + (incry*(AXESY-1)),i_black); /* vertical */
  396. sprintf ( str, "%3u%%", j ); j+= (100/(AXESX-1));
  397. gdImageStringUp(graph, gdFontSmall, i - w/2, ysize - h, str, i_black );
  398. }
  399. for ( i = 0; i < distcount; i ++ ) {
  400. int x1, x2, y1, y2, mrgx;
  401. mrgx = incrx/5;
  402. x1 = (w*7) + (i*incrx) + mrgx;
  403. x2 = x1 + (incrx/3);
  404. y2 = h*2 + (incry*(AXESY-1)) - 2;
  405. y1 = y2 - (((ysize-(h*2)-(w*7) - 2) * dist[i][0]) / rounds);
  406. /* printf ( "x1 %u, y1 %u, x2 %u, y2 %u.n", x1, y1, x2, y2 );*/
  407. gdImageFilledRectangle(graph, x1, y1, x2, y2,i_green);
  408. gdImageRectangle(graph, x1, y1, x2, y2,i_dark);
  409. x2 = (w*7) + ((i+1)*incrx) - mrgx;
  410. x1 = x2 - (incrx/3);
  411. y2 = h*2 + (incry*(AXESY-1)) - 2;
  412. y1 = y2 - (((ysize-(h*2)-(w*7) - 2) * dist[i][1]) / rounds);
  413. /* printf ( "x1 %u, y1 %u, x2 %u, y2 %u.n", x1, y1, x2, y2 );*/
  414. gdImageFilledRectangle(graph, x1, y1, x2, y2,i_blue);
  415. gdImageRectangle(graph, x1, y1, x2, y2,i_dark);
  416. }
  417. }
  418.     gdImageGif(graph, gif);    
  419.     gdImageDestroy(graph);
  420. }
  421. /************************************************************************/
  422. void main ( int argc, char * argv[] )
  423. {
  424. FILE *config = NULL, *gif = NULL;
  425. char  *sconfig = NULL, *sgif = NULL;
  426. char  *optarg;
  427. char type;
  428. int i; 
  429. /* globals */
  430. xsize = 400, ysize = 150; type = 'd'; rate = 1250000; distcount = 10;
  431. do {
  432. /***************************************************************/
  433. /* 0 : read program arguments */
  434. while ( ( i = getopt1( argc, argv, "o:i:t:w:h:r:d:", &optarg ) ) != EOF ) {
  435. switch ( i ) {
  436. case 'i':
  437. sconfig = optarg;
  438. break;
  439. case 'o':
  440. sgif = optarg;
  441. break;
  442. case 'w':
  443. if ( optarg != NULL ) { 
  444. xsize = atoi (optarg);
  445. }
  446. break;
  447. case 'r':
  448. if ( optarg != NULL ) { 
  449. rate = atoi (optarg);
  450. }
  451. break;
  452. case 'd':
  453. if ( optarg != NULL ) { 
  454. distcount = atoi (optarg);
  455. }
  456. break;
  457. case 'h':
  458. if ( optarg != NULL ) { 
  459. ysize = atoi (optarg);
  460. }
  461. break;
  462. case 't':
  463. if ( optarg != NULL ) type = optarg[0];
  464. if (type != 'd' && type != 'm' && type != 'w' && type != 'y' && type != 'x' ) {
  465. print_error();
  466. exit (0);
  467. }
  468. break;
  469. case '?':
  470. print_error();
  471. exit (0);
  472. break;
  473. default:
  474. break;
  475. }
  476. }
  477. if ( sgif == NULL || sconfig == NULL ) {
  478. print_error();
  479. break;
  480. }
  481. /***************************************************************/
  482. /* 1 : OPEN FILES */
  483. gif = fopen ( sgif, "wb" );
  484. if ( gif == NULL ) {
  485. fprintf ( stderr, "Error opening %s.n", sgif );
  486. fclose ( config );
  487. break;
  488. }
  489. config = fopen ( sconfig, "r" );
  490. if ( config == NULL ) {
  491. fprintf ( stderr, "Error opening %s.n", sconfig );
  492. break;
  493. }
  494. if ( type != 'x' ) {
  495. /***************************************************************/
  496. for ( i = 0; i < distcount; i ++ ) {
  497. dist[i][0] = 0; dist[i][1] = 0;
  498. }
  499. { /* read first line ... */
  500. unsigned long time, in, out;
  501. fscanf ( config, "%lu %lu %lun", &time, &in, &out ); /* read first line */
  502. }
  503. switch ( type ) {
  504. case 'd':
  505. computes_distrib ( config, 288,  1, rate );
  506. rounds = 288; /* 288 * 5' = 24 hours */
  507. break;
  508. case 'w':
  509. computes_distrib ( config, 100,  6, rate ); /* 600 * 5', with mean on 6  (30')*/
  510. computes_distrib ( config, 236,  1, rate );
  511. rounds = 336; /* 336 * 30' = 7 days */
  512. break;
  513. case 'm':
  514. computes_distrib ( config,  25, 24, rate ); /* 600 * 5', with mean on 24 (2hours) */
  515. computes_distrib ( config, 150,  4, rate ); /* 600 *30', with mean on 4 */
  516. computes_distrib ( config, 185,  1, rate );
  517. rounds = 360; /* 260 * 2 hours = 30 days */
  518. break;
  519. case 'y':
  520. computes_distrib ( config,   2,300, rate ); /* 600 * 5', with mean on 300  ~= 1 day */
  521. computes_distrib ( config,  12, 50, rate ); /* 600 *30', with mean on 50 ~= 1 day */
  522. computes_distrib ( config,  50, 12, rate ); /* 600 * 2h, with mean on 12 */
  523. computes_distrib ( config, 300,  1, rate );
  524. rounds = 364;
  525. break;
  526. }
  527. for ( i = 0; i < distcount; i ++ ) {
  528. printf ( "%u:%u,%u.n", i, dist[i][0],dist[i][1] );
  529. }
  530. /***************************************************************/
  531. draw_gif ( gif );
  532. /***************************************************************/
  533. fclose ( gif );
  534. fclose ( config );
  535. break;
  536. } else {
  537. draw_distrib_gif ( config, gif );
  538. fclose ( config );
  539. fclose ( gif );
  540. break;
  541. }
  542. } while ( TRUE );
  543. }