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

SNMP编程

开发平台:

C/C++

  1. /****************************************************************/
  2. /*                                                              */
  3. /* rdlog2.c (see readme.html for program explanation            */
  4. /*                                                              */
  5. /* author : Philippe Simonet, sip00@vg.swissptt.ch              */
  6. /*                                                              */
  7. /* change log :                                                 */
  8. /*                                                              */
  9. /* v. 1.00 : initial update (SIP) (02.12.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 colorratetable[256];
  44. int colortable[256] = {
  45. 0x000000, /* 0  BLACK */
  46. 0xff0000, /* 1  BLUE */
  47. 0x00ff00, /* 2  GREEN*/
  48. 0xffff00, /* 3  CYAN */
  49. 0x0000ff, /* 4  RED */
  50. 0xff00ff, /* 5  MAGENTA */
  51. 0x00ffff, /* 6  YELLOW */
  52. 0xffffff, /* 7  WHITE */
  53. 0x900000, /* 8  Blue4 */
  54. 0xb00000, /* 9  Blue3 */
  55. 0xd00000, /* 10 Blue2 */
  56. 0xffce87, /* 11 LtBlue */
  57. 0x009000, /* 12 Green4 */
  58. 0x00b000, /* 13 Green3 */
  59. 0x00d000, /* 14 Green2 */
  60. 0x909000, /* 15 Cyan4 */
  61. 0xb0b000, /* 16 Cyan3 */
  62. 0xd0d000, /* 17 Cyan2 */
  63. 0x000090, /* 18 Red4 */
  64. 0x0000b0, /* 19 Red3 */
  65. 0x0000d0, /* 20 Red2 */
  66. 0x900090, /* 21 Magenta4 */
  67. 0xb000b0, /* 22 Magenta3 */
  68. 0xd000d0, /* 23 Magenta2 */
  69. 0x003080, /* 24 Brown4 */
  70. 0x0040a0, /* 25 Brown3 */
  71. 0x0060c0, /* 26 Brown2 */
  72. 0x8080ff, /* 27 Pink4 */
  73. 0xa0a0ff, /* 28 Pink3 */
  74. 0xc0c0ff, /* 29 Pink2 */
  75. 0xe0e0ff, /* 30 Pink */
  76. 0x00d7ff /* 31 gold */
  77. };
  78. /************************************************************************/
  79. /* each of these entry contain the description of a graphical object    */
  80. struct sentry {
  81. int type; /* text, line, link, poly */
  82. int depth; /* order in which it appears */
  83. char * str; /* log file name, url, text */
  84. int maxrate; /* max xfer rate */
  85. int rate; /* max xfer rate */
  86. int orientation; /* text orientation, ... */
  87. int color; /* color */
  88. int fillcolor; /* color */
  89. int colorindex; /* color index */
  90. int npoints; /* fig size */
  91. int * coords; /* coordinates list */
  92. struct sentry * next; /* next entry */
  93. }; 
  94. int xsize, ysize, rounds, xoffset, yoffset;
  95. struct sentry * pfirstentry, *pcurrententry, *pareaentry;
  96. /************************************************************************/
  97. /* analyze command-line options */
  98. static int optind = 0;  /* Global argv index.  */
  99. static char *scan = NULL;   /* Private scan pointer. */
  100. static int scale = 15;
  101. int getopt1( int argc, char *argv[], char *optstring, char ** optarg )
  102. {
  103.     int  c; /* return value */
  104.     char  *place;
  105.     char     *index();
  106.     *optarg = NULL;
  107. /* check argument validity */
  108.     if (scan == NULL || *scan == '') {
  109.         if (optind == 0) optind++;
  110.         if (optind >= argc) return EOF;
  111.         place = argv[optind];
  112.         if (place[0] != '-' || place[1] == '') return EOF;
  113.         optind++;
  114.         if (place[1] == '-' && place[2] == '') return EOF;
  115.         scan = place+1;
  116.     }
  117.     c = *scan++; /* get option character */
  118.     place = strchr(optstring, c);
  119.     if (place == NULL || c == ':') return '?';
  120. /* set optarg if needed */
  121.     if (*++place == ':') {
  122.         if (*scan != '') {
  123.          *optarg = scan; scan = NULL;
  124.         } else {
  125.          *optarg = argv[optind], optind++;
  126.         }
  127.     }
  128.     return c;
  129. }
  130. /************************************************************************/
  131. /* computes a traffic in % by reading 'rounds' lines in a MRTG log file */
  132. /* currently, it takes the maximum of the In or OUT traffic.            */
  133. void read_entry ( struct sentry * pentry) {
  134. FILE * logf;
  135. int i, j=0, k=0;
  136. logf = fopen ( pentry->str, "r" );
  137. if ( pentry->maxrate == 0 ) {
  138. fprintf ( stderr, "Max rate for %s is null.n", pentry->str );
  139. return;
  140. }
  141. if ( logf != NULL ) {
  142. fscanf(logf, "%*d %d %d", &j, &k); /* get first line */
  143. for ( i = 0; i < rounds; i ++ ) { /* computes mean */
  144. fscanf(logf, "%*d %d %d %*d %*d", &j, &k); /* get line */
  145. /*printf(" - [%d %d]n", j, k);*/
  146. switch (pentry->orientation) {
  147. case IN:
  148. pentry->rate += j;
  149. break;
  150. case OUT:
  151. pentry->rate += k;
  152. break;
  153. default:
  154. if ( j > k ) pentry->rate += j;
  155. else pentry->rate += k;
  156. break;
  157. }
  158. }
  159. /* computes the rate 0-9 */
  160. pentry->rate = pentry->rate / rounds; 
  161. /*printf ( "%s : %u, %u.n", pentry->str, (pentry->maxrate*100)/pentry->maxrate, (pentry->rate*10)/pentry->maxrate );*/
  162. pentry->rate  = (pentry->rate * 10) / pentry->maxrate;
  163. if ( pentry->rate > 9 ) pentry->rate = 9;
  164. if ( pentry->rate < 0 ) pentry->rate = 0;
  165. fclose ( logf );
  166. } else {
  167. fprintf ( stderr, "Cannot open file %s.n", pentry->str );
  168. };
  169. }
  170. /************************************************************************/
  171. /* in case of trouble ...                                               */
  172. void print_error ( void )
  173. fprintf ( stderr, "Read mrtg configuration files and convert them in gif format.n" );
  174. fprintf ( stderr, "Use :n" );
  175. fprintf ( stderr, "  rdlog -i cfile -o gfile [-m mapfile] -r roundsn" );
  176. fprintf ( stderr, "   ifile : input fig file name,n" );
  177. fprintf ( stderr, "   gfile : output gif file (will be overwritten),n" );
  178. fprintf ( stderr, "   mapfile : output map file (optional, will be overwritten),n" );
  179. fprintf ( stderr, "   rounds : number of 5 min intervals to take.n" );
  180. }
  181. /************************************************************************/
  182. /* free an 'entry' variable                                             */
  183. void free_entry (struct sentry * pentry) {
  184. if ( pentry!= NULL ) {
  185. if ( pentry->str != NULL ) free(pentry->str); pentry->str = NULL;
  186. if ( pentry->coords != NULL ) free(pentry->coords); pentry->coords = NULL;
  187. free(pentry);
  188. }
  189. }
  190. /************************************************************************/
  191. /* print an entry for debug purpose                                     */
  192. void print_entry (struct sentry * pentry) {
  193. printf ( "Entry : " );
  194. if ( pentry->str != NULL ) printf ( "str '%s' ", pentry->str );
  195. printf ( ".n type %i, maxrate %i, orientation %i, npoints %i, color %i, depth %i.n",
  196. pentry->type,pentry->maxrate,pentry->orientation,pentry->npoints,pentry->color,pentry->depth );
  197. }
  198. /************************************************************************/
  199. int new_entry( void ) {
  200. struct sentry * pentry;
  201. if ( ( pentry = malloc ( sizeof (struct sentry) )) == NULL ) {
  202. fprintf ( stderr, "Error : memory allocation failure.n" );
  203. return ( FALSE );
  204. }
  205. if ( pfirstentry == NULL ) {
  206. pfirstentry = pentry;
  207. } else {
  208. pcurrententry->next = pentry;
  209. }
  210. pentry->type = UNKNOWN;
  211. pentry->str = NULL;
  212. pentry->maxrate = 0;
  213. pentry->rate = 0;
  214. pentry->orientation = 0;
  215. pentry->color = 0;
  216. pentry->fillcolor = 0;
  217. pentry->depth = 0;
  218. pentry->colorindex = 0;
  219. pentry->npoints = 0;
  220. pentry->coords = NULL;
  221. pentry->next = NULL;
  222. pcurrententry = pentry;
  223. return ( TRUE );
  224. }
  225. /************************************************************************/
  226. #define r(color) ((color&0x0000ff)>>0)
  227. #define g(color) ((color&0x00ff00)>>8)
  228. #define b(color) ((color&0xff0000)>>16)
  229. #define rgb(color) ((color&0x0000ff)>>0),((color&0x00ff00)>>8),((color&0xff0000)>>16)
  230. /************************************************************************/
  231. /* build a color or find the nearest color in the color table           */ 
  232. int find_color ( gdImagePtr graph, int color ) {
  233. int i_col;
  234. if ( (i_col = gdImageColorExact(graph,r(color), g(color), b(color))) == -1 ) {
  235. if ( (i_col = gdImageColorAllocate(graph,r(color), g(color), b(color))) == -1 ) {
  236. i_col = gdImageColorClosest(graph,r(color), g(color), b(color));
  237. }
  238. }
  239. return (i_col);
  240. }
  241. /************************************************************************/
  242. /* draw the gif file, based on the tentry desciption                    */
  243. void draw_gif ( FILE * gif )
  244. {
  245. #define c_blank 245,245,245 /* base colors */
  246. #define c_light 194,194,194
  247. #define c_dark 100,100,100
  248. #define c_black 0,0,0
  249. #define c_white 255,255,0
  250.     gdImagePtr graph;
  251. int i_light,i_dark,i_blank, i_black, i_white;
  252. int bkcolor;
  253.     graph = gdImageCreate(xsize, ysize);
  254.     /* the first color allocated will be the background color. */
  255. bkcolor = colortable[pareaentry->fillcolor];
  256.     i_blank = gdImageColorAllocate(graph,rgb(bkcolor));
  257.     i_light = gdImageColorAllocate(graph,c_light);
  258.     i_dark = gdImageColorAllocate(graph,c_dark);
  259.     gdImageInterlace(graph, 1); 
  260.     i_black = gdImageColorAllocate(graph,c_black);
  261.     i_white = gdImageColorAllocate(graph,c_white);
  262.     /* draw the image border */
  263.     gdImageLine(graph,0,0,xsize-1,0,i_light);
  264.     gdImageLine(graph,1,1,xsize-2,1,i_light);
  265.     gdImageLine(graph,0,0,0,ysize-1,i_light);
  266.     gdImageLine(graph,1,1,1,ysize-2,i_light);
  267.     gdImageLine(graph,xsize-1,0,xsize-1,ysize-1,i_dark);
  268.     gdImageLine(graph,0,ysize-1,xsize-1,ysize-1,i_dark);
  269.     gdImageLine(graph,xsize-2,1,xsize-2,ysize-2,i_dark);
  270.     gdImageLine(graph,1,ysize-2,xsize-2,ysize-2,i_dark);
  271. { /* date the graph */
  272. struct tm *newtime;
  273. time_t aclock;
  274. time( &aclock ); /* Get time in seconds */
  275. newtime = localtime( &aclock ); /* Convert time to struct */
  276. /* tm form */
  277. gdImageString(graph, gdFontSmall,3,3,asctime( newtime ),i_dark);
  278. };
  279. while ( 1 ) {
  280. int i_col, i_col2, depth;
  281. struct sentry * pentry;
  282. /* find smallest depth */
  283. pentry = pfirstentry;
  284. depth = -1;
  285. while ( pentry != NULL ) {
  286. if (pentry->depth > depth) {
  287. depth = pentry->depth;
  288. pcurrententry = pentry;
  289. }
  290. pentry = pentry->next;
  291. }
  292. if ( depth == -1 ) break;
  293. pcurrententry->depth = -1;
  294. /* draw this fig */
  295. switch ( pcurrententry->type) {
  296. case RECT:
  297. i_col = find_color(graph, colortable[pcurrententry->color]);
  298. if ( pcurrententry->fillcolor != -1 ) {
  299. i_col2 = find_color(graph, colortable[pcurrententry->fillcolor]);
  300. gdImageFilledRectangle(graph,
  301. pcurrententry->coords[0],
  302. pcurrententry->coords[1],
  303. pcurrententry->coords[2],
  304. pcurrententry->coords[3],i_col2);
  305. }
  306. gdImageRectangle(graph,
  307. pcurrententry->coords[0],
  308. pcurrententry->coords[1],
  309. pcurrententry->coords[2],
  310. pcurrententry->coords[3],i_col);
  311. break;
  312. case TEXT:
  313. i_col = find_color(graph, colortable[pcurrententry->color]);
  314. if (pcurrententry->orientation == 0) {
  315. gdImageString(graph, gdFontSmall,
  316. pcurrententry->coords[0],
  317. pcurrententry->coords[1],
  318. pcurrententry->str,
  319. i_col );
  320. } else {
  321. gdImageStringUp(graph, gdFontSmall,
  322. pcurrententry->coords[0],
  323. pcurrententry->coords[1],
  324. pcurrententry->str,
  325. i_col );
  326. }
  327. break;
  328. case POLY:
  329. case LINK:
  330. {
  331. int x = pcurrententry->coords[0];
  332. int y = pcurrententry->coords[1];
  333. int x2, y2, j, k;
  334. gdImagePtr brush_2pix;
  335. if (pcurrententry->type == POLY) {
  336. i_col = find_color(graph, colortable[pcurrententry->color]);
  337. } else {
  338. brush_2pix = gdImageCreate(2,2);
  339. gdImageColorAllocate(
  340. brush_2pix,
  341. r(colortable[colorratetable[pcurrententry->rate]]),
  342. g(colortable[colorratetable[pcurrententry->rate]]),
  343. b(colortable[colorratetable[pcurrententry->rate]]) );
  344.     gdImageSetBrush(graph, brush_2pix);
  345. i_col = gdBrushed;
  346. }
  347. k = 2;
  348. for ( j = 1; j < pcurrententry->npoints; j ++ ) {
  349. x2 = pcurrententry->coords[k++];
  350. y2 = pcurrententry->coords[k++];
  351. gdImageLine(graph, x, y, x2, y2,i_col);
  352. x = x2; y = y2;
  353. };
  354. if (pcurrententry->type == LINK) {
  355.     gdImageDestroy(brush_2pix);
  356. };
  357. }
  358. break;
  359. default:
  360. break;
  361. }
  362. pcurrententry = pcurrententry->next;
  363. }
  364.     gdImageGif(graph, gif);    
  365.     gdImageDestroy(graph);
  366. }
  367. struct sfigrec {
  368. int type;
  369. char text[500];
  370. int colorindex;
  371. int depth;
  372. int color;
  373. int fillcolor;
  374. int angle;
  375. int coords[500];
  376. int npoints;
  377. }; 
  378. /************************************************************************/
  379. int getfig ( FILE * config, struct sfigrec * fig ) 
  380. {
  381. char buf[1000], str[1000], *s;
  382. int i, n, type, color, colorindex, depth, pen_style, font, flags, x, y;
  383. int style, thickness, pen_color, fill_color, fill_style, join_style, cap_style, radius, fa, ba, npts;
  384. float tx_size, angle, style_val;
  385. fig->type = UNKNOWN;
  386. if ( fgets (buf, 1000, config ) == NULL ) {
  387. return ( TRUE );
  388. }
  389. switch ( buf[0] ) {
  390. case '0': /* color ref */
  391. n = sscanf(buf, "%*d %d #%06x", &colorindex, &color );
  392. /*printf ( "colordef : %d, %d.n", colorindex, color );*/
  393. fig->type = COLORDEF;
  394. fig->color = ((color & 0xff0000)>>16) | (color & 0x00ff00) | ((color & 0x0000ff)<<16);
  395. fig->colorindex = colorindex;
  396. break;
  397. case '2': /* polyline */
  398. n = sscanf(buf, "%*d%d%d%d%d%d%d%d%d%f%d%d%d%d%d%d",
  399.    &type, &style, &thickness, &pen_color, &fill_color,
  400.    &depth, &pen_style, &fill_style, &style_val,
  401.    &join_style, &cap_style, &radius, &fa, &ba, &npts);
  402. /*puts ( buf );*/
  403. /*printf ("type %d, style %d, thickness %d, pen_color %d, fill_color %d, depth %d, pen_style %d, fill_style %d, style_val %f, join_style %d, cap_style %d, radius %d, fa %d, ba %d, npts %d ",
  404.    type, style, thickness, pen_color, fill_color,
  405.    depth, pen_style, fill_style, style_val,
  406.    join_style, cap_style, radius, fa, ba, npts);*/
  407. fig->depth = depth;
  408. fig->color = pen_color;
  409. fig->npoints = npts;
  410. for ( i = 0; i < npts; i ++ ) {
  411. fscanf(config, "%d%d", &x, &y);
  412. fig->coords[i*2] = x; fig->coords[i*2+1] = y;
  413. /*printf ( "[%d %d] ", x, y );*/
  414. }
  415. fig->type = POLY;
  416. if ( type == 2 ) { /* rectangle */
  417. fig->type = RECT;
  418. if ( fill_style == -1 ) {
  419. fig->fillcolor = -1;
  420. } else {
  421. fig->fillcolor = fill_color;
  422. }
  423. x = min(fig->coords[0],fig->coords[4]);
  424. y = min(fig->coords[1],fig->coords[5]);
  425. fig->coords[2] = max(fig->coords[0],fig->coords[4]);
  426. fig->coords[3] = max(fig->coords[1],fig->coords[5]);
  427. fig->coords[0] = x;
  428. fig->coords[1] = y;
  429. fig->npoints = 2;
  430. }
  431. /*printf ( ".n" );*/
  432. break;
  433. case '4': /* text */
  434. n = sscanf(buf, "%*d%d%d%d%d%d%f%f%d%*f%*f%d%d %[^n]",
  435. &type, &color, &depth, &pen_style, &font, &tx_size, &angle, &flags, &x, &y, str);
  436. s = strstr ( str, "\001" );
  437. if ( s != NULL ) s[0] = 0;
  438. /*printf ( "text : type %d, color %d, depth %d, pen_style %d, font %d, ty_size %f, angle %f, flags %d, x %d, y %d, s [%s].n",
  439. type, color, depth, pen_style, font, tx_size, angle, flags, x, y, str );*/
  440. fig->type = TEXT;
  441. strcpy (fig->text, str);
  442. fig->depth = depth;
  443. fig->color = color;
  444. if ( angle < 1) {
  445. fig->angle = 0;
  446. fig->coords[0] = x;
  447. fig->coords[1] = y-150;
  448. } else {
  449. fig->angle = 1;
  450. fig->coords[0] = x-150;
  451. fig->coords[1] = y;
  452. }
  453. fig->npoints = 1;
  454. break;
  455. case '6': /* compound */
  456. fig->type = COMPOUND;
  457. /*printf ( "compound.n" );*/
  458. break;
  459. case '-': /* compound end */
  460. fig->type = ENDCOMPOUND;
  461. /*printf ( "end of compound.n" );*/
  462. break;
  463. default:
  464. break;
  465. }
  466. return ( FALSE );
  467. }
  468. /************************************************************************/
  469. void main ( int argc, char * argv[] )
  470. {
  471. FILE *config = NULL, *gif = NULL, *map = NULL;
  472. char  *sconfig = NULL, *sgif = NULL, *smap = NULL;
  473. char  *optarg;
  474. int i; 
  475. /* globals */
  476. xsize = 100, ysize = 100;
  477. rounds = 6;
  478. do {
  479. /***************************************************************/
  480. /* 0 : read program arguments */
  481. while ( ( i = getopt1( argc, argv, "o:i:r:m:", &optarg ) ) != EOF ) {
  482. switch ( i ) {
  483. case 'i':
  484. sconfig = optarg;
  485. break;
  486. case 'o':
  487. sgif = optarg;
  488. break;
  489. case 'm':
  490. smap = optarg;
  491. break;
  492. case 'r':
  493. rounds = atoi (optarg);
  494. if ( rounds < 1 ) {
  495. print_error();
  496. exit (0);
  497. };
  498. break;
  499. case '?':
  500. print_error();
  501. exit (0);
  502. break;
  503. default:
  504. break;
  505. }
  506. }
  507. if ( sconfig == NULL || sgif == NULL ) {
  508. print_error();
  509. break;
  510. }
  511. /***************************************************************/
  512. /* 1 : OPEN FILES */
  513. config = fopen ( sconfig, "r" );
  514. if ( config == NULL ) {
  515. fprintf ( stderr, "Error opening %s.n", sconfig );
  516. break;
  517. }
  518. gif = fopen ( sgif, "wb" );
  519. if ( gif == NULL ) {
  520. fprintf ( stderr, "Error opening %s.n", sgif );
  521. fclose ( config );
  522. break;
  523. }
  524. if ( smap != NULL ) {
  525. map = fopen ( smap, "w" );
  526. if ( map == NULL ) {
  527. fprintf ( stderr, "Error opening %s.n", sgif );
  528. fclose ( config );
  529. fclose ( gif );
  530. break;
  531. }
  532. fprintf ( map, "  <map name="map1">n" );
  533. }
  534. /***************************************************************/
  535. /* 2 : SCAN CONFIG FILE */
  536. pcurrententry = NULL; pfirstentry = NULL; pareaentry = NULL;
  537. for ( i = 0; i < 256; i++ ) {
  538. colorratetable[i] = 0;
  539. }
  540. for ( i = 32; i < 256; i++ ) {
  541. colortable[i] = 0;
  542. }
  543. while ( TRUE ) {
  544. struct sfigrec figrec;
  545. /********************************************/
  546. /* get one fig record */
  547. if ( getfig ( config, &figrec ) == TRUE ) break;
  548. switch (figrec.type) {
  549. case COLORDEF:
  550. if ( figrec.colorindex < 256 ) colortable[figrec.colorindex] = figrec.color;
  551. /*printf ( "color table[%i] : %i.n", figrec.colorindex, colortable[figrec.colorindex] );*/
  552. break;
  553. case TEXT:
  554. if ( new_entry() == FALSE ) break;
  555. pcurrententry->type = UNKNOWN;
  556. pcurrententry->color = figrec.color;
  557. pcurrententry->depth = figrec.depth;
  558. if ( strncmp("color:", figrec.text, 6 ) == 0 ) { /* special 'color:' text */
  559. i = atoi ( figrec.text+6 );
  560. if ( i < 256 ) colorratetable[i] = figrec.color;
  561. /*printf ( "color rate[%i] : %i.n", i, colorratetable[i] );*/
  562. break;
  563. }
  564. if ( (pcurrententry->str = malloc ( strlen(figrec.text) + 1 )) == NULL ) {
  565. fprintf ( stderr, "Error : memory allocation failure.n" );
  566. break;
  567. }
  568. if ( (pcurrententry->coords = (int *)malloc(figrec.npoints * (sizeof (int)) * 2 )) == NULL ) {
  569. fprintf ( stderr, "Error : memory allocation failure.n" );
  570. break;
  571. }
  572. pcurrententry->type = TEXT;
  573. pcurrententry->npoints = figrec.npoints;
  574. pcurrententry->orientation = figrec.angle;
  575. strcpy (pcurrententry->str,figrec.text);
  576. memcpy (pcurrententry->coords,figrec.coords,figrec.npoints * (sizeof (int)) * 2);
  577. break;
  578. case POLY:
  579. case RECT:
  580. if ( new_entry() == FALSE ) break;
  581. pcurrententry->type = UNKNOWN;
  582. pcurrententry->depth = figrec.depth;
  583. pcurrententry->color = figrec.color;
  584. pcurrententry->fillcolor = figrec.fillcolor;
  585. if ( (pcurrententry->coords = (int *)malloc(figrec.npoints * (sizeof (int)) * 2 )) == NULL ) {
  586. fprintf ( stderr, "Error : memory allocation failure.n" );
  587. continue;
  588. }
  589. pcurrententry->type = figrec.type;
  590. pcurrententry->npoints = figrec.npoints;
  591. memcpy (pcurrententry->coords,figrec.coords,figrec.npoints * (sizeof (int)) * 2);
  592. break;
  593. case COMPOUND: /* compound must be links ... */
  594. if ( new_entry() == FALSE ) break;
  595. do {
  596. if ( getfig ( config, &figrec ) == TRUE ) break;
  597. if ( figrec.type == ENDCOMPOUND ) break;
  598. if ( figrec.type == TEXT ) {
  599. /*printf (" txt %s.n", figrec.text );*/
  600. if ( strncmp("gifarea", figrec.text, 7 ) == 0 ) {
  601. pcurrententry->type = GIFAREA;
  602. pareaentry = pcurrententry;
  603. /*printf ( " gifarea : [%i / %i] ", pcurrententry->coords[0], pcurrententry->coords[1]);
  604. printf ( " [%i / %i].n", pcurrententry->coords[2], pcurrententry->coords[3]);*/
  605. } else if ( strncmp("url:", figrec.text, 4 ) == 0 ) {
  606. if ( (pcurrententry->str = malloc ( strlen(figrec.text) + 1 )) == NULL ) {
  607. fprintf ( stderr, "Error : memory allocation failure.n" );
  608. break;
  609. }
  610. pcurrententry->type = URL;
  611. strcpy (pcurrententry->str,figrec.text+4);
  612. /*printf (" url %s.n", pcurrententry->str );*/
  613. } else if ( strncmp("log:", figrec.text, 4 ) == 0 ) {
  614. char * s = figrec.text + 4;
  615. if ( s[0] == '>' ) {
  616. pcurrententry->orientation = OUT;
  617. s++;
  618. } else if ( s[0] == '<' ) {
  619. pcurrententry->orientation = IN;
  620. s++;
  621. } else {
  622. pcurrententry->orientation = INOUT;
  623. }
  624. if ( (pcurrententry->str = malloc ( strlen(s) + 1 )) == NULL ) {
  625. fprintf ( stderr, "Error : memory allocation failure.n" );
  626. break;
  627. }
  628. pcurrententry->type = LINK;
  629. strcpy (pcurrententry->str,s);
  630. /*printf (" str %s.n", pcurrententry->str );*/
  631. } else if ( strncmp("speed:", figrec.text, 6 ) == 0 ) {
  632. pcurrententry->maxrate = atoi ( figrec.text+6 );
  633. /*printf (" max rate : %i.n", pcurrententry->maxrate );*/
  634. }
  635. }
  636. if ( (figrec.type == POLY) || (figrec.type == RECT) ) {
  637. pcurrententry->color = figrec.color; /* default color */
  638. pcurrententry->depth = figrec.depth;
  639. pcurrententry->fillcolor = figrec.fillcolor; 
  640. if ( (pcurrententry->coords = (int *)malloc(figrec.npoints * (sizeof (int)) * 2 )) == NULL ) {
  641. fprintf ( stderr, "Error : memory allocation failure.n" );
  642. break;
  643. }
  644. pcurrententry->npoints = figrec.npoints;
  645. memcpy (pcurrententry->coords,figrec.coords,figrec.npoints * (sizeof (int)) * 2);
  646. }
  647. } while ( 1 );
  648. if ( pcurrententry->type==LINK && pcurrententry->coords != NULL ) {
  649. read_entry ( pcurrententry );
  650. /*printf (" link : log : %s.log, max rate : %i.n", pcurrententry->str, pcurrententry->maxrate );*/
  651. }
  652. break;
  653. case ENDCOMPOUND:
  654. case UNKNOWN:
  655. default:
  656. break;
  657. }
  658. }
  659. /***************************************************************/
  660. /* checks */
  661. if ( pareaentry == NULL ) {
  662. fprintf ( stderr, "Error : no gif area specified.n");
  663. break;
  664. }
  665. xsize = (pareaentry->coords[2] - pareaentry->coords[0]);
  666. ysize = (pareaentry->coords[3] - pareaentry->coords[1]);
  667. xoffset = pareaentry->coords[0]; yoffset = pareaentry->coords[1];
  668. /*printf ( "size : %i %i.n", xsize, ysize );
  669. printf ( "offset : %i %i.n", xoffset, yoffset );*/
  670. /***************************************************************/
  671. /*  do translations                                            */
  672. pcurrententry = pfirstentry;
  673. while ( pcurrententry != NULL ) {
  674. for (i = 0; i < pcurrententry->npoints; i ++) {
  675. pcurrententry->coords[i*2] -= xoffset;
  676. pcurrententry->coords[i*2+1] -= yoffset;
  677. pcurrententry->coords[i*2] /= scale;
  678. pcurrententry->coords[i*2+1] /= scale;
  679. }
  680. if ( smap != NULL ) {
  681. if ( pcurrententry->type==URL && pcurrententry->coords != NULL ) {
  682. fprintf ( map, "   <area href=%s alt="%s" shape=rect coords="%i,%i,%i,%i">n", 
  683. pcurrententry->str,pcurrententry->str,
  684. pcurrententry->coords[0],pcurrententry->coords[1],
  685. pcurrententry->coords[2],pcurrententry->coords[3] );
  686. }
  687. }
  688. pcurrententry = pcurrententry->next;
  689. }
  690. xsize /= scale; ysize /=scale;
  691. /***************************************************************/
  692. /* 3 : draw gif file                                           */
  693. draw_gif ( gif );
  694. /***************************************************************/
  695. /* 4 : clean-up all    */
  696. {
  697. struct sentry * pentry;
  698. pcurrententry = pfirstentry;
  699. do {
  700. pentry = pcurrententry->next;
  701. free_entry(pcurrententry);
  702. pcurrententry = pentry;
  703. } while ( pentry != NULL );
  704. }
  705. fclose ( gif );
  706. fclose ( config );
  707. if ( smap != NULL ) {
  708. /*<area href=lk311.html alt="lk311.html" shape=rect coords="240,12,270,24">*/
  709. fprintf ( map, "  </map>n" );
  710. fclose ( map );
  711. }
  712. break;
  713. } while ( TRUE );
  714. }