source: trunk/Jgraph/edit.c @ 420

Last change on this file since 420 was 420, checked in by Nicholas Riley, 12 years ago

Jgraph: my changes - ANSIfication, few minor bug fixes; works on OS X 10.5 now

File size: 33.5 KB
Line 
1/*
2 * $Source: /tmp_mnt/n/fs/grad1/jsp/src/jgraph/RCS/edit.c,v $
3 * $Revision: 8.3 $
4 * $Date: 92/11/30 11:42:12 $
5 * $Author: jsp $
6 */
7
8
9#include <stdio.h>
10#include <string.h>
11
12#include "jgraph.h"
13
14#define MAX(a,b) ((a > b) ? a : b)
15#define MIN(a,b) ((a < b) ? a : b)
16
17void edit_label(Label l)
18{
19  char *txt, inp_str[80];
20  float f;
21  int i;
22
23  while ( getstring(inp_str) ) {
24    if (strcmp(inp_str, ":") == 0) {
25      if ((txt = getlabel()) == CNULL) return;
26      l->label = txt;
27    } else if (strcmp(inp_str, "x") == 0) {
28      if (!getfloat(&f)) rejecttoken(); else l->x = f;
29    } else if (strcmp(inp_str, "y") == 0) {
30      if (!getfloat(&f)) rejecttoken(); else l->y = f;
31    } else if (strcmp(inp_str, "fontsize") == 0) {
32      if (!getfloat(&f)) rejecttoken(); else l->fontsize = f;
33    } else if (strcmp(inp_str, "linesep") == 0) {
34      if (!getfloat(&f)) rejecttoken(); else l->linesep = f;
35    } else if (strcmp(inp_str, "hjl") == 0) {
36      l->hj = 'l';
37    } else if (strcmp(inp_str, "hjc") == 0) {
38      l->hj = 'c';
39    } else if (strcmp(inp_str, "hjr") == 0) {
40      l->hj = 'r';
41    } else if (strcmp(inp_str, "vjc") == 0) {
42      l->vj = 'c';
43    } else if (strcmp(inp_str, "vjt") == 0) {
44      l->vj = 't';
45    } else if (strcmp(inp_str, "vjb") == 0) {
46      l->vj = 'b';
47    } else if (strcmp(inp_str, "font") == 0) {
48      if (!getstring(inp_str)) return;
49      txt = (char *) malloc (sizeof(char)*strlen(inp_str)+2);
50      strcpy(txt, inp_str);
51      l->font = txt;
52    } else if (strcmp(inp_str, "rotate") == 0) {
53      if (!getfloat(&f)) rejecttoken(); else l->rotate = f;
54    } else if (strcmp(inp_str, "lgray") == 0) {
55        if (!getfloat(&f)) rejecttoken(); else {
56          l->graytype = 'g';
57          l->gray[0] = f;
58        }
59    } else if (strcmp(inp_str, "lcolor") == 0) {
60        l->graytype = 'c';
61        for( i = 0 ; i < 3 ; i++ )  {
62          if(!getfloat(&f)) {
63            rejecttoken();
64            l->graytype = 'n';
65            break ;
66          } else l->gray[i] = f ;
67        }
68    } else {
69      rejecttoken();
70      return;
71    }
72  }
73}
74
75void copy_curve(Curve c1, Curve c2) /* Copies curve c2 to c1 */
76{
77  Flist f, newf;
78  Point p, newp;
79
80  copy_label(c1->l, c2->l);
81  copy_label(c1->lmark, c2->lmark);
82  c1->l->label = CNULL;
83  c1->clip = c2->clip;
84  for (f = first(c2->gen_linetype); 
85       f != nil(c2->gen_linetype); 
86       f = next(f)) {
87    newf = (Flist) get_node(c1->gen_linetype);
88    newf->f = f->f;
89    insert(newf, c1->gen_linetype);
90  }
91  c1->pattern = c2->pattern;
92  c1->apattern = c2->apattern;
93  c1->ppattern = c2->ppattern;
94  c1->parg = c2->parg;
95  c1->aparg = c2->aparg;
96  c1->pparg = c2->pparg;
97  c1->marktype = c2->marktype;
98  c1->linetype = c2->linetype;
99  c1->linethick = c2->linethick;
100  c1->marksize[0] = c2->marksize[0];
101  c1->marksize[1] = c2->marksize[1];
102  c1->mrotate = c2->mrotate;
103  for (p = first(c2->general_marks); 
104       p != nil(c2->general_marks); 
105       p = next(p)) {
106    newp = (Point) get_node(c1->general_marks);
107    newp->x = p->x;
108    newp->y = p->y;
109    insert(newp, c1->general_marks);
110  }
111  c1->graytype = c2->graytype;
112  c1->gray[0] = c2->gray[0];
113  c1->gray[1] = c2->gray[1];
114  c1->gray[2] = c2->gray[2];
115  c1->filltype = c2->filltype;
116  c1->fill[0] = c2->fill[0];
117  c1->fill[1] = c2->fill[1];
118  c1->fill[2] = c2->fill[2];
119  c1->poly = c2->poly;
120  c1->pfilltype = c2->pfilltype;
121  c1->pfill[0] = c2->pfill[0];
122  c1->pfill[1] = c2->pfill[1];
123  c1->pfill[2] = c2->pfill[2];
124  c1->afilltype = c2->afilltype;
125  c1->afill[0] = c2->afill[0];
126  c1->afill[1] = c2->afill[1];
127  c1->afill[2] = c2->afill[2];
128  c1->postscript = c2->postscript;
129  c1->postfile = c2->postfile;
130  c1->eps = c2->eps;
131  c1->rarrow = c2->rarrow;
132  c1->larrow = c2->larrow;
133  c1->rarrows = c2->rarrows;
134  c1->larrows = c2->larrows;
135  c1->asize[0] = c2->asize[0];
136  c1->asize[1] = c2->asize[1];
137  c1->bezier = c2->bezier;
138}
139
140void copy_label(Label l1, Label l2) /* Copies label l2 to l1 */
141{
142  l1->label = l2->label;
143  l1->x = l2->x;
144  l1->y = l2->y;
145  l1->rotate = l2->rotate;
146  l1->font = l2->font;
147  l1->fontsize = l2->fontsize;
148  l1->hj = l2->hj;
149  l1->vj = l2->vj;
150  l1->graytype = l2->graytype;
151  l1->gray[0] = l2->gray[0];
152  l1->gray[1] = l2->gray[1];
153  l1->gray[2] = l2->gray[2];
154  l1->linesep = l2->linesep;
155}
156
157void copy_axis(Axis a1, Axis a2) /* Copies axis a2 to a1 */
158{
159  copy_label(a1->label, a2->label);
160  copy_label(a1->hl, a2->hl);
161  a1->max = a2->max;
162  a1->min = a2->min;
163  a1->pmax = a2->pmax;
164  a1->pmin = a2->pmin;
165  a1->size = a2->size;
166  a1->hash_interval = a2->hash_interval;
167  a1->hash_start = a2->hash_start;
168  a1->log_base = a2->log_base;
169  a1->draw_hash_marks_at = a2->draw_hash_marks_at;
170  a1->draw_hash_labels_at = a2->draw_hash_labels_at;
171  a1->draw_at = a2->draw_at;
172  a1->draw_hash_labels = a2->draw_hash_labels;
173  a1->draw_axis_line = a2->draw_axis_line;
174  a1->draw_hash_marks = a2->draw_hash_marks;
175  a1->draw_axis_label = a2->draw_axis_label;
176  a1->auto_hash_labels = a2->auto_hash_labels;
177  a1->auto_hash_marks = a2->auto_hash_marks;
178  a1->minor_hashes = a2->minor_hashes;
179  a1->hash_scale = a2->hash_scale;
180  a1->hash_format = a2->hash_format;
181  a1->graytype = a2->graytype;
182  a1->gray[0] = a2->gray[0];
183  a1->gray[1] = a2->gray[1];
184  a1->gray[2] = a2->gray[2];
185  a1->mgr_graytype = a2->mgr_graytype;
186  a1->mgr_gray[0] = a2->mgr_gray[0];
187  a1->mgr_gray[1] = a2->mgr_gray[1];
188  a1->mgr_gray[2] = a2->mgr_gray[2];
189  a1->gr_graytype = a2->gr_graytype;
190  a1->gr_gray[0] = a2->gr_gray[0];
191  a1->gr_gray[1] = a2->gr_gray[1];
192  a1->gr_gray[2] = a2->gr_gray[2];
193  a1->grid_lines = a2->grid_lines;
194  a1->mgrid_lines = a2->mgrid_lines;
195  a1->precision = a2->precision;
196  a1->start_given = a2->start_given;
197  a1->is_lg = a2->is_lg;
198  a1->is_x = a2->is_x;
199}
200
201Curve do_copy_curve(Graph g, Graphs gs, Graphs all_gs)
202{
203  Curve lastc, newc;
204  Graph oldg;
205  Graphs oldgs;
206  int num;
207
208  if (!getint(&num)) {
209    rejecttoken();
210    oldg = g;
211    oldgs = gs;
212    while(gs != nil(all_gs)) {
213      if (gs != oldgs) g = last(gs->g);
214      while(g != nil(gs->g)) {
215        if (first(g->curves) == nil(g->curves)) g = prev(g);
216        else {
217          lastc = last(g->curves);
218          if (first(oldg->curves) == nil(oldg->curves))
219            newc = new_curve(oldg->curves, 0);
220          else newc = new_curve(oldg->curves, last(oldg->curves)->num + 1);
221          copy_curve(newc, lastc);
222          return newc;
223        }
224      }
225      gs = prev(gs);
226    }
227    error_header(); 
228    fprintf(stderr, "Cannot perform copycurve on first curve\n");
229    exit(1);
230  } else {
231    if (first(g->curves) == nil(g->curves))
232      newc = new_curve(g->curves, 0);
233    else newc = new_curve(g->curves, last(g->curves)->num + 1);
234    lastc = g->curves; 
235    while(1) {
236      lastc = prev(lastc);
237      if (lastc == nil(g->curves) || lastc->num < num) {
238        error_header(); 
239        fprintf(stderr, "copycurve: curve #%d not found\n", num);
240        exit(1);
241      }
242      if (lastc->num == num) {
243        copy_curve(newc, lastc);
244        return newc;
245      }
246    }
247  }
248  return newc; /* To shut lint up */
249}
250
251Label do_copy_string(Graph g, Graphs gs, Graphs all_gs)
252{
253  String lastl, newl;
254  Graph oldg;
255  Graphs oldgs;
256  int num;
257
258  if (!getint(&num)) {
259    rejecttoken();
260    oldgs = gs;
261    oldg = g;
262    while(gs != nil(all_gs)) {
263      if (gs != oldgs) g = last(gs->g);
264      while(g != nil(gs->g)) {
265        if (first(g->strings) == nil(g->strings)) g = prev(g);
266        else {
267          lastl = last(g->strings);
268          if (first(oldg->strings) == nil(oldg->strings))
269            newl = new_string(oldg->strings, 0);
270          else newl = new_string(oldg->strings, last(oldg->strings)->num + 1);
271          copy_label(newl->s, lastl->s);
272          return newl->s;
273        }
274      }
275      gs = prev(gs);
276    }
277    error_header(); 
278    fprintf(stderr, "Cannot perform copystring on first string\n");
279    exit(1);
280    return newl->s; /* To shut lint up */
281  } else {
282    if (first(g->strings) == nil(g->strings))
283      newl = new_string(g->strings, 0);
284    else newl = new_string(g->strings, last(g->strings)->num + 1);
285    lastl = g->strings; 
286    while(1) {
287      lastl = prev(lastl);
288      if (lastl == nil(g->strings) || lastl->num < num) {
289        error_header(); 
290        fprintf(stderr, "copystring: string #%d not found\n", num);
291        exit(1);
292      }
293      if (lastl->num == num) {
294        copy_label(newl->s, lastl->s);
295        return newl->s;
296      }
297    }
298  }
299}
300
301Graph last_graph(Graph g, Graphs gs, Graphs all_gs)
302{
303  Graph lastg;
304
305
306  lastg = prev(g);
307  while(lastg == nil(gs->g)) {
308    if (prev(gs) == nil(all_gs)) {
309      error_header(); 
310      fprintf(stderr, "First graph cannot inherit axes\n");
311      exit(1);
312    } else {
313      gs = prev(gs);
314      lastg = last(gs->g);
315    }
316  }
317  return lastg;
318}
319
320void copy_legend(Legend l1, Legend l2)
321{
322  l1->linelength = l2->linelength;
323  l1->linebreak = l2->linebreak;
324  l1->midspace = l2->midspace;
325  l1->type = l2->type;
326  copy_label(l1->l, l2->l);
327}
328
329void inherit_axes(Graph g, Graph lastg)
330{
331  char *s;
332  copy_axis(g->x_axis, lastg->x_axis);
333  copy_axis(g->y_axis, lastg->y_axis);
334  g->x_translate = lastg->x_translate;
335  g->y_translate = lastg->y_translate;
336  g->clip = lastg->clip;
337  g->border = lastg->border;
338  copy_legend(g->legend, lastg->legend);
339  s = g->title->label;
340  copy_label(g->title, lastg->title);
341  g->title->label = s;
342}
343
344void getpattern(char *inp_str, char *key, char *p, float *a)
345{
346  int i;
347  float f;
348
349  if (!getstring(inp_str)) return;
350  for (i = 0; i < NPATTERNS; i++) {
351    if (strcmp(inp_str, PATTERNS[i]) == 0) {
352      *p = PTYPES[i];
353      if (getfloat(&f)) {
354        *a = f;
355      } else {
356        rejecttoken();
357      }
358      i = NPATTERNS + 1;
359    } 
360  }
361  if (i == NPATTERNS) {
362    error_header(); fprintf(stderr, "Bad %s: %s\n", key, inp_str);
363    error_header(); fprintf(stderr, "             Valid %ss are:", key);
364    for (i = 0; i < NPATTERNS; i++) fprintf(stderr, " %s", PATTERNS[i]);
365    fprintf(stderr, "\n");
366    exit(1);
367  }
368  return;
369}
370
371void edit_curve(Curve c, Graph g)
372{
373  char inp_str[256], *txt;
374  float x, y, f, e1, e2;
375  float xh, yh, xl, yl;
376  Point p, p1, p2;
377  Flist fl;
378  FILE *fi;
379  int i;
380  char e;
381
382  while ( getstring(inp_str) ) {
383    if (strcmp(inp_str, "y_epts") == 0 ||
384        strcmp(inp_str, "pts") == 0    ||
385        strcmp(inp_str, "x_epts") == 0) {
386      e = inp_str[0];
387      while (getfloat(&x)) {
388        if (e == 'p') {
389          if (!getfloat(&y)) {
390            error_header(); 
391            fprintf(stderr, "Reading Points, no y value for x=%f\n", x);
392            exit(1);
393          }
394        } else {
395          if (!getfloat(&y) || !getfloat(&e1) || !getfloat(&e2)) {
396            error_header();
397              fprintf(stderr, 
398                      "Reading %s, need 4 values per data point\n", inp_str);
399              exit(1);
400          }
401        }
402        p = (Point) get_node(c->pts);
403        p->x = x;
404        p->y = y;
405        p->e = e;
406        insert(p, c->pts);
407        c->npts++;
408        if (e == 'x') {
409          p1 = (Point) get_node(c->xepts);
410          p1->x = e1;
411          p1->y = y;
412          p2 = (Point) get_node(c->xepts);
413          p2->x = e2;
414          p2->y = y;
415          insert(p1, c->xepts);
416          insert(p2, c->xepts);
417          xh = MAX(e1, e2); xh = MAX(xh, x);
418          xl = MIN(e1, e2); xl = MIN(xl, x);
419          yh = y; yl = y;
420        } else if (e == 'y') {
421          p1 = (Point) get_node(c->yepts);
422          p1->y = e1;
423          p1->x = x;
424          p2 = (Point) get_node(c->yepts);
425          p2->y = e2;
426          p2->x = x;
427          insert(p1, c->yepts);
428          insert(p2, c->yepts);
429          yh = MAX(e1, e2); yh = MAX(yh, y);
430          yl = MIN(e1, e2); yl = MIN(yl, y);
431          xh = x; xl = x;
432        } else {
433          xh = x; xl = x; yh = y; yl = y;
434        }
435        if (g->x_axis->pmax == FSIG) {
436          g->x_axis->pmax = xh;
437          g->x_axis->pmin = xl;
438          g->y_axis->pmax = yh;
439          g->y_axis->pmin = yl;
440        } else {
441          g->x_axis->pmax = MAX(g->x_axis->pmax, xh);
442          g->x_axis->pmin = MIN(g->x_axis->pmin, xl);
443          g->y_axis->pmax = MAX(g->y_axis->pmax, yh);
444          g->y_axis->pmin = MIN(g->y_axis->pmin, yl);
445        }
446      }
447      rejecttoken();
448
449    } else if (strcmp(inp_str, "label") == 0) {
450      edit_label(c->l);
451    } else if (strcmp(inp_str, "marksize") == 0) {
452      if (!getfloat(&f)) rejecttoken(); 
453      else {
454        c->marksize[0] = f;
455        if (!getfloat(&f)) rejecttoken(); 
456        else c->marksize[1] = f;
457      }
458    } else if (strcmp(inp_str, "gmarks") == 0) {
459      while (getfloat(&x)) {
460        if (!getfloat(&y)) {
461          error_header(); 
462          fprintf(stderr, "Reading GMarks, no y value for x=%f\n", x);
463          exit(1);
464        }
465        p =  (Point) get_node(c->general_marks);
466        p->x = x;
467        p->y = y;
468        insert(p, c->general_marks);
469      }
470      rejecttoken();
471    } else if (strcmp(inp_str, "pfill") == 0) {
472        if (!getfloat(&f)) rejecttoken(); else {
473          /* grey fill */
474          c->pfilltype = 'g';
475          c->pfill[0] = f;
476        }
477    } else if (strcmp(inp_str, "pcfill") == 0) {
478         /* color fill */
479        c->pfilltype = 'c';
480        for( i = 0 ; i < 3 ; i++ )  {
481          if(!getfloat(&f)) {
482            rejecttoken();
483            c->pfilltype = 'n';
484            break ;
485          } else c->pfill[i] = f ;
486        }
487    } else if (strcmp(inp_str, "fill") == 0) {
488        if (!getfloat(&f)) rejecttoken(); else {
489          /* grey fill */
490          c->filltype = 'g';
491          c->fill[0] = f;
492        }
493    } else if (strcmp(inp_str, "cfill") == 0) {
494         /* color fill */
495        c->filltype = 'c';
496        for( i = 0 ; i < 3 ; i++ )  {
497          if(!getfloat(&f)) {
498            rejecttoken();
499            c->filltype = 'n';
500            break ;
501          } else c->fill[i] = f ;
502        }
503    } else if (strcmp(inp_str, "afill") == 0) {
504        if (!getfloat(&f)) rejecttoken(); else {
505          c->afilltype = 'g';
506          c->afill[0] = f;
507        }
508    } else if (strcmp(inp_str, "acfill") == 0) {
509        c->afilltype = 'c';
510        for( i = 0 ; i < 3 ; i++ )  {
511          if(!getfloat(&f)) { 
512            rejecttoken(); 
513            c->afilltype = 'n';
514            break ;
515          } else c->afill[i] = f ;
516        }
517    } else if (strcmp(inp_str, "marktype") == 0) {
518      if (!getstring(inp_str)) return;
519      for (i = 0; i < NMARKTYPES && strcmp(inp_str, MARKTYPESTRS[i]) != 0; i++) ;
520      if (i == NMARKTYPES) {
521        error_header(); fprintf(stderr, "Bad mark: %s\n", inp_str);
522        fprintf(stderr, "             Valid marks are:");
523        for (i = 0; i < NMARKTYPES; i++) {
524          fprintf(stderr, " %s", MARKTYPESTRS[i]);
525        }
526        fprintf(stderr, "\n");
527        exit(1);
528      } else {
529        c->marktype = MARKTYPES[i];
530        if (c->marktype == 'l') edit_label(c->lmark);
531      }
532    } else if (strcmp(inp_str, "glines") == 0) {
533      while (getfloat(&f)) {
534        fl = (Flist) get_node (c->gen_linetype);
535        fl->f = f;
536        insert(fl, c->gen_linetype);
537      } 
538      rejecttoken();
539    } else if (strcmp(inp_str, "pattern") == 0) {
540      getpattern(inp_str, "pattern", &(c->pattern), &(c->parg));
541    } else if (strcmp(inp_str, "apattern") == 0) {
542      getpattern(inp_str, "apattern", &(c->apattern), &(c->aparg));
543    } else if (strcmp(inp_str, "ppattern") == 0) {
544      getpattern(inp_str, "ppattern", &(c->ppattern), &(c->pparg));
545
546    } else if (strcmp(inp_str, "linetype") == 0) {
547      if (!getstring(inp_str)) return;
548      if (strcmp(inp_str, "none") == 0) c->linetype = '0';
549      else if (strcmp(inp_str, "solid") == 0) c->linetype = 's';
550      else if (strcmp(inp_str, "dotted") == 0) c->linetype = '.';
551      else if (strcmp(inp_str, "dashed") == 0) c->linetype = '-';
552      else if (strcmp(inp_str, "longdash") == 0) c->linetype = 'l';
553      else if (strcmp(inp_str, "dotdash") == 0) c->linetype = 'd';
554      else if (strcmp(inp_str, "dotdotdash") == 0) c->linetype = 'D';
555      else if (strcmp(inp_str, "dotdotdashdash") == 0) c->linetype = '2';
556      else if (strcmp(inp_str, "general") == 0) c->linetype = 'g';
557      else {
558        error_header(); fprintf(stderr, "Bad line type: %s\n", inp_str);
559        error_header(); fprintf(stderr, "             Valid marks are %s\n", 
560          "solid, dotted, dashed, longdash, dotdash,"); 
561        error_header(); fprintf(stderr, "             %s.\n", 
562          "dotdotdash, dotdotdashdash, none");
563        exit(1);
564      }
565    } else if (strcmp(inp_str, "linethickness") == 0) {
566      if (!getfloat(&f)) rejecttoken(); else c->linethick = f;
567    } else if (strcmp(inp_str, "gray") == 0) {
568        if (!getfloat(&f)) rejecttoken(); else {
569          c->graytype = 'g';
570          c->gray[0] = f;
571        }
572    } else if (strcmp(inp_str, "color") == 0) {
573        c->graytype = 'c';
574        for( i = 0 ; i < 3 ; i++ )  {
575          if(!getfloat(&f)) {
576            rejecttoken();
577            c->graytype = 'n';
578            break ;
579          } else c->gray[i] = f ;
580        }
581    } else if (strcmp(inp_str, "mrotate") == 0) {
582      if (!getfloat(&f)) rejecttoken(); else {
583        c->mrotate = f;
584      }
585    } else if (strcmp(inp_str, "eps") == 0) {
586      if (!getstring(inp_str)) {
587        error_header();
588        fprintf(stderr, "eps token must be followed by an %s\n",
589                "encapsulated postscript file\n");
590        exit(1);
591      }
592      c->marktype = 'E';
593      c->eps = (char *) malloc ((strlen(inp_str)+1)*sizeof(char));
594      strcpy(c->eps, inp_str);
595      fi = fopen(c->eps, "r");
596      if (fi == NULL) {
597        error_header();
598        fprintf(stderr, "couldn't open eps file '%s'\n", c->eps);
599        exit(1);
600      }
601      fclose(fi);
602    } else if (strcmp(inp_str, "postscript") == 0) {
603      if (!getstring(inp_str)) return;
604      c->marktype = 'p';
605      if (strcmp(inp_str, ":") == 0) {
606        c->postfile = 0;
607        if ((txt = getmultiline()) == CNULL) return;
608        c->postscript = txt;
609      } else {
610        c->postfile = 1;
611        c->postscript = (char *) malloc ((strlen(inp_str)+1)*sizeof(char));
612        strcpy(c->postscript, inp_str);
613        fi = fopen(c->postscript, "r");
614        if (fi == NULL) {
615          error_header();
616          fprintf(stderr, "couldn't open postscript file '%s'\n", 
617                  c->postscript);
618          exit(1);
619        }
620        fclose(fi);
621      }
622    } else if (strcmp(inp_str, "poly") == 0) {
623      c->poly = 1;
624    } else if (strcmp(inp_str, "nopoly") == 0) {
625      c->poly = 0;
626    } else if (strcmp(inp_str, "larrow") == 0) {
627      c->larrow = 1;
628    } else if (strcmp(inp_str, "nolarrow") == 0) {
629      c->larrow = 0;
630    } else if (strcmp(inp_str, "rarrow") == 0) {
631      c->rarrow = 1;
632    } else if (strcmp(inp_str, "norarrow") == 0) {
633      c->rarrow = 0;
634    } else if (strcmp(inp_str, "larrows") == 0) {
635      c->larrows = 1;
636    } else if (strcmp(inp_str, "nolarrows") == 0) {
637      c->larrows = 0;
638    } else if (strcmp(inp_str, "rarrows") == 0) {
639      c->rarrows = 1;
640    } else if (strcmp(inp_str, "norarrows") == 0) {
641      c->rarrows = 0;
642    } else if (strcmp(inp_str, "bezier") == 0) {
643      c->bezier = 1;
644    } else if (strcmp(inp_str, "nobezier") == 0) {
645      c->bezier = 0;
646    } else if (strcmp(inp_str, "asize") == 0) {
647      if (!getfloat(&f)) rejecttoken(); 
648      else {
649        c->asize[0] = f;
650        if (!getfloat(&f)) rejecttoken(); 
651        else c->asize[1] = f;
652      }
653    } else if (strcmp(inp_str, "clip") == 0) {
654      c->clip = 1;
655    } else if (strcmp(inp_str, "noclip") == 0) {
656      c->clip = 0;
657    } else {
658      rejecttoken();
659      return;
660    }
661  }
662}
663
664void edit_hash_label(Axis a)
665{
666  float at, f;
667  char *s;
668  char inp_str[256];
669  String st;
670  int done;
671
672  s = CNULL;
673
674  at = (first(a->hash_lines) == nil(a->hash_lines)) ? FSIG
675          : first(a->hash_lines)->loc;
676  while(1) {
677    done = 0;
678    if (getstring(inp_str)) {
679      if (strcmp(inp_str, ":") == 0) {
680        if ((s = getlabel()) == CNULL) return;
681      } else if (strcmp(inp_str, "at") == 0) {
682        if (getfloat(&f)) {
683          at = f; 
684        } else {
685          rejecttoken();
686          done = 1;
687        }
688      } else {
689        rejecttoken();
690        done = 1;
691      }
692    } else {
693      done = 1;
694    }
695    if (done) {
696      if (s == CNULL) return;
697      if (at == FSIG) {
698        error_header();
699        fprintf(stderr, 
700          "hash_label either needs \"at\" or an associated \"hash_at\"\n");
701        exit(1);
702      }
703      st = (String) get_node(a->hash_labels);
704      st->s = new_label();
705      st->s->label = s;
706      st->s->x = at;
707      st->s->y = at;
708      insert(st, a->hash_labels);
709      return;
710    }
711  }
712}
713
714void edit_axis(Axis a)
715{
716  char inp_str[256];
717  float f;
718  int i;
719  Hash h;
720
721  while ( getstring(inp_str) ) {
722
723    if (strcmp(inp_str, "size") == 0) {
724      if ( getfloat(&f)) a->size = f; else rejecttoken();
725    } else if (strcmp(inp_str, "max") == 0) {
726      if ( getfloat(&f)) a->max = f; else rejecttoken();
727    } else if (strcmp(inp_str, "min") == 0) {
728      if ( getfloat(&f)) a->min = f; else rejecttoken();
729    } else if (strcmp(inp_str, "hash") == 0) {
730      if ( getfloat(&f)) a->hash_interval = f; else rejecttoken();
731    } else if (strcmp(inp_str, "shash") == 0) {
732      if ( getfloat(&f)) {
733        a->hash_start = f;
734        a->start_given = 1;
735        } 
736      else rejecttoken();
737    } else if (strcmp(inp_str, "mhash") == 0) {
738      if (getint(&i)) a->minor_hashes = i; else rejecttoken();
739    } else if (strcmp(inp_str, "precision") == 0) {
740      if (getint(&i)) a->precision = i; else rejecttoken();
741    } else if (strcmp(inp_str, "label") == 0) {
742      edit_label(a->label);
743    } else if (strcmp(inp_str, "hash_format") == 0) {
744      if (!getstring(inp_str)) return;
745      if (strcmp(inp_str, "g") == 0) {
746        a->hash_format = 'g';
747      } else if (strcmp(inp_str, "G") == 0) {
748        a->hash_format = 'G';
749      } else if (strcmp(inp_str, "E") == 0) {
750        a->hash_format = 'E';
751      } else if (strcmp(inp_str, "e") == 0) {
752        a->hash_format = 'e';
753      } else if (strcmp(inp_str, "f") == 0) {
754        a->hash_format = 'f';
755      } else {
756        error_header();
757        fprintf(stderr, "Invalid hash_style %s.  Must be f, g, G, e or E\n",
758                inp_str);
759        exit(1);
760      }
761    } else if (strcmp(inp_str, "hash_labels") == 0) {
762      edit_label(a->hl);
763    } else if (strcmp(inp_str, "log_base") == 0) {
764      if (getfloat(&f)) {
765        if (f <= 1.0) {
766          error_header();
767          fprintf(stderr, "\"log_base %f\": log_base must be > 1.0\n", f);
768          exit(1);
769        } else a->log_base = f; 
770      } else rejecttoken();
771    } else if (strcmp(inp_str, "draw_at") == 0) {
772      if ( getfloat(&f)) a->draw_at = f; else rejecttoken();
773    } else if (strcmp(inp_str, "log") == 0) {
774      a->is_lg = 1;
775    } else if (strcmp(inp_str, "linear") == 0) {
776      a->is_lg = 0;
777    } else if (strcmp(inp_str, "nodraw") == 0) {
778      a->draw_hash_labels = 0;
779      a->draw_axis_line = 0;
780      a->draw_hash_marks = 0;
781      a->draw_axis_label = 0;
782    } else if (strcmp(inp_str, "draw") == 0) {
783      a->draw_hash_labels = 1;
784      a->draw_axis_line = 1;
785      a->draw_hash_marks = 1;
786      a->draw_axis_label = 1;
787    } else if (strcmp(inp_str, "hash_at") == 0 ||
788               strcmp(inp_str, "mhash_at") == 0) {
789      if (getfloat(&f)) {
790        h = (Hash) get_node (a->hash_lines);
791        h->loc = f;
792        h->major = (inp_str[0] == 'h');
793        h->size = h->major ? HASH_SIZE : MHASH_SIZE;
794        insert(h, a->hash_lines);
795      } else rejecttoken();
796    } else if (strcmp(inp_str, "hash_label") == 0) {
797      edit_hash_label(a);       
798    } else if (strcmp(inp_str, "hash_scale") == 0) {
799      if ( getfloat(&f)) a->hash_scale = f; else rejecttoken();
800    } else if (strcmp(inp_str, "auto_hash_marks") == 0) {
801      a->auto_hash_marks = 1;
802    } else if (strcmp(inp_str, "no_auto_hash_marks") == 0) {
803      a->auto_hash_marks = 0;
804    } else if (strcmp(inp_str, "auto_hash_labels") == 0) {
805      a->auto_hash_labels = 1;
806    } else if (strcmp(inp_str, "no_auto_hash_labels") == 0) {
807      a->auto_hash_labels = 0;
808    } else if (strcmp(inp_str, "draw_hash_labels_at") == 0) {
809      if (getfloat(&f)) a->draw_hash_labels_at = f; else rejecttoken();
810    } else if (strcmp(inp_str, "draw_hash_marks_at") == 0) {
811      if (getfloat(&f)) a->draw_hash_marks_at = f; else rejecttoken();
812    } else if (strcmp(inp_str, "no_draw_hash_labels") == 0) {
813      a->draw_hash_labels = 0;
814    } else if (strcmp(inp_str, "draw_hash_labels") == 0) {
815      a->draw_hash_labels = 1;
816    } else if (strcmp(inp_str, "no_draw_axis_line") == 0) {
817      a->draw_axis_line = 0;
818    } else if (strcmp(inp_str, "draw_axis_line") == 0) {
819      a->draw_axis_line = 1;
820    } else if (strcmp(inp_str, "no_draw_axis") == 0) {
821      a->draw_axis_line = 0;
822    } else if (strcmp(inp_str, "draw_axis") == 0) {
823      a->draw_axis_line = 1;
824    } else if (strcmp(inp_str, "no_draw_hash_marks") == 0) {
825      a->draw_hash_marks = 0;
826    } else if (strcmp(inp_str, "draw_hash_marks") == 0) {
827      a->draw_hash_marks = 1;
828    } else if (strcmp(inp_str, "no_draw_axis_label") == 0) {
829      a->draw_axis_label = 0;
830    } else if (strcmp(inp_str, "draw_axis_label") == 0) {
831      a->draw_axis_label = 1;
832    } else if (strcmp(inp_str, "no_grid_lines") == 0) {
833      a->grid_lines = 0;
834    } else if (strcmp(inp_str, "grid_lines") == 0) {
835      a->grid_lines = 1;
836    } else if (strcmp(inp_str, "no_mgrid_lines") == 0) {
837      a->mgrid_lines = 0;
838    } else if (strcmp(inp_str, "mgrid_lines") == 0) {
839      a->mgrid_lines = 1;
840    } else if (strcmp(inp_str, "gray") == 0) {
841      if (!getfloat(&f)) rejecttoken(); else {
842        a->graytype = 'g';
843        a->gray[0] = f;
844      }
845    } else if (strcmp(inp_str, "color") == 0) {
846      a->graytype = 'c';
847      for( i = 0 ; i < 3 ; i++ )  {
848        if(!getfloat(&f)) {
849          rejecttoken();
850          a->graytype = 'n';
851          break ;
852        } else a->gray[i] = f ;
853      }
854    } else if (strcmp(inp_str, "grid_gray") == 0) {
855      if (!getfloat(&f)) rejecttoken(); else {
856        a->gr_graytype = 'g';
857        a->gr_gray[0] = f;
858      }
859    } else if (strcmp(inp_str, "grid_color") == 0) {
860      a->gr_graytype = 'c';
861      for( i = 0 ; i < 3 ; i++ )  {
862        if(!getfloat(&f)) {
863          rejecttoken();
864          a->gr_graytype = 'n';
865          break ;
866        } else a->gr_gray[i] = f ;
867      }
868    } else if (strcmp(inp_str, "mgrid_gray") == 0) {
869      if (!getfloat(&f)) rejecttoken(); else {
870        a->mgr_graytype = 'g';
871        a->mgr_gray[0] = f;
872      }
873    } else if (strcmp(inp_str, "mgrid_color") == 0) {
874      a->mgr_graytype = 'c';
875      for( i = 0 ; i < 3 ; i++ )  {
876        if(!getfloat(&f)) {
877          rejecttoken();
878          a->mgr_graytype = 'n';
879          break ;
880        } else a->mgr_gray[i] = f ;
881      }
882    } else {
883      rejecttoken(); 
884      return;
885    }
886  }
887}
888
889void edit_legend(Legend l)
890{
891  char inp_str[256];
892  float f;
893
894  while ( getstring(inp_str) ) {
895    if (strcmp(inp_str, "x") == 0) {
896      if (!getfloat(&f)) rejecttoken(); 
897      else {
898        l->l->x = f; 
899        l->l->hj = 'l';
900        l->l->vj = 't';
901        l->type = 'u';
902      }
903    } else if (strcmp(inp_str, "y") == 0) {
904      if (!getfloat(&f)) rejecttoken(); 
905      else {
906        l->l->y = f; 
907        l->l->hj = 'l';
908        l->l->vj = 't';
909        l->type = 'u';
910      }
911    } else if (strcmp(inp_str, "right") == 0 ||
912               strcmp(inp_str, "on") == 0) {
913      l->type = 'u';
914      l->l->y = FSIG; 
915      l->l->x = FSIG; 
916      l->l->hj = 'l';
917      l->l->vj = 'c';
918    } else if (strcmp(inp_str, "left") == 0) {
919      l->type = 'u';
920      l->l->y = FSIG; 
921      l->l->x = FSIG; 
922      l->l->hj = 'r';
923      l->l->vj = 'c';
924    } else if (strcmp(inp_str, "off") == 0) {
925      l->type = 'n';
926    } else if (strcmp(inp_str, "top") == 0) {
927      l->type = 'u';
928      l->l->y = FSIG; 
929      l->l->x = FSIG; 
930      l->l->hj = 'l';
931      l->l->vj = 'b';
932    } else if (strcmp(inp_str, "bottom") == 0) {
933      l->type = 'u';
934      l->l->y = FSIG; 
935      l->l->x = FSIG; 
936      l->l->hj = 'l';
937      l->l->vj = 't';
938    } else if (strcmp(inp_str, "custom") == 0) {
939      l->type = 'c';
940    } else if (strcmp(inp_str, "linelength") == 0) {
941      if (!getfloat(&f)) rejecttoken(); else l->linelength = f;
942    } else if (strcmp(inp_str, "linebreak") == 0) {
943      if (!getfloat(&f)) rejecttoken(); else l->linebreak = f;
944    } else if (strcmp(inp_str, "midspace") == 0) {
945      if (!getfloat(&f)) rejecttoken(); else l->midspace = f;
946    } else if (strcmp(inp_str, "defaults") == 0) {
947      edit_label(l->l);
948    } else {
949      rejecttoken();
950      return;
951    }
952  }
953}
954
955void edit_graph(Graph g, Graphs gs, Graphs all_gs)
956{
957  char inp_str[80];
958  int num;
959  String s;
960  float f;
961
962  while ( getstring(inp_str) ) {
963    if (strcmp(inp_str, "xaxis") == 0)
964      edit_axis(g->x_axis);
965    else if (strcmp(inp_str, "yaxis") == 0)
966      edit_axis(g->y_axis);
967    else if (strcmp(inp_str, "curve") == 0) {
968      if (!getint(&num)) {
969        error_header(); fprintf(stderr, "\"curve\" not followed by number\n");
970        exit(1);
971      }
972      edit_curve(get_curve(g->curves, num), g);
973    } else if (strcmp(inp_str, "newcurve") == 0) {
974      if (first(g->curves) == nil(g->curves))
975        edit_curve(new_curve(g->curves, 0), g);
976      else edit_curve(new_curve(g->curves, last(g->curves)->num + 1), g);
977    } else if (strcmp(inp_str, "copycurve") == 0) {
978      edit_curve(do_copy_curve(g, gs, all_gs), g);
979    } else if (strcmp(inp_str, "newline") == 0) {
980      if (first(g->curves) == nil(g->curves))
981        edit_curve(new_line(g->curves, 0), g);
982      else edit_curve(new_line(g->curves, last(g->curves)->num + 1), g);
983    } else if (strcmp(inp_str, "title") == 0) {
984      edit_label(g->title);
985    } else if (strcmp(inp_str, "legend") == 0) {
986      edit_legend(g->legend);
987    } else if (strcmp(inp_str, "x_translate") == 0) {
988      if (!getfloat(&f)) rejecttoken(); else g->x_translate = f;
989    } else if (strcmp(inp_str, "y_translate") == 0) {
990      if (!getfloat(&f)) rejecttoken(); else g->y_translate = f;
991    } else if (strcmp(inp_str, "string") == 0) {
992      if (!getint(&num)) {
993        error_header(); fprintf(stderr, "\"string\" not followed by number\n");
994        exit(1);
995      }
996      s = get_string(g->strings, num);
997      edit_label(s->s);
998    } else if (strcmp(inp_str, "newstring") == 0) {
999      if (first(g->strings) == nil(g->strings))
1000        s = new_string(g->strings, 0);
1001      else s = new_string(g->strings, last(g->strings)->num + 1);
1002      edit_label(s->s);
1003    } else if (strcmp(inp_str, "copystring") == 0 ||
1004               strcmp(inp_str, "copyline") == 0) {
1005      edit_label(do_copy_string(g, gs, all_gs));
1006    } else if (strcmp(inp_str, "inherit_axes") == 0) {
1007      inherit_axes(g, last_graph(g, gs, all_gs));
1008    } else if (strcmp(inp_str, "Y") == 0) {
1009      if (!getfloat(&f)) rejecttoken(); else gs->height = f;
1010    } else if (strcmp(inp_str, "X") == 0) {
1011      if (!getfloat(&f)) rejecttoken(); else gs->width = f;
1012    } else if (strcmp(inp_str, "border") == 0) {
1013      g->border = 1;
1014    } else if (strcmp(inp_str, "noborder") == 0) {
1015      g->border = 0;
1016    } else if (strcmp(inp_str, "clip") == 0) {
1017      g->clip = 1;
1018    } else if (strcmp(inp_str, "noclip") == 0) {
1019      g->clip = 0;
1020    } else {
1021      rejecttoken();
1022      return;
1023    } 
1024  }
1025}
1026
1027void edit_graphs(Graphs gs)
1028{
1029  Graphs the_g;
1030  Graph g, tmp_g;
1031  char inp_str[80];
1032  float f;
1033  int num, i, ok, j;
1034
1035  the_g = first(gs);
1036  while ( getstring(inp_str) ) {
1037    if (strcmp(inp_str, "graph") == 0) {
1038      if (!getint(&num)) {
1039        error_header(); fprintf(stderr, "\"graph\" not followed by number\n");
1040        exit(1);
1041      }
1042      edit_graph(get_graph(the_g->g, num), the_g, gs);
1043    } else if (strcmp(inp_str, "newgraph") == 0) {
1044      if (first(the_g->g) == nil(the_g->g))
1045        edit_graph(new_graph(the_g->g, 0), the_g, gs);
1046      else edit_graph(new_graph(the_g->g, last(the_g->g)->num + 1), the_g, gs);
1047    } else if (strcmp(inp_str, "copygraph") == 0) {
1048      if (first(the_g->g) == nil(the_g->g))
1049        g = new_graph(the_g->g, 0);
1050      else g = new_graph(the_g->g, last(the_g->g)->num + 1);
1051      if (!getint(&num)) {
1052        rejecttoken();
1053        inherit_axes(g, last_graph(g, the_g, gs));
1054      } else {
1055        ok = 0;
1056        tmp_g = the_g->g;
1057        while(!ok) {
1058          tmp_g = prev(tmp_g);
1059          if (tmp_g == nil(the_g->g) || tmp_g->num < num) {
1060            error_header();
1061            fprintf(stderr, "copygraph: no graph #%d\n", num);
1062            exit(1);
1063          }
1064          ok = (tmp_g->num == num);
1065        }
1066        inherit_axes(g, tmp_g);
1067      }
1068      edit_graph(g, the_g, gs);
1069    } else if (strcmp(inp_str, "Y") == 0) {
1070      if (!getfloat(&f)) rejecttoken(); else the_g->height = f;
1071    } else if (strcmp(inp_str, "X") == 0) {
1072      if (!getfloat(&f)) rejecttoken(); else the_g->width = f;
1073    } else if (strcmp(inp_str, "newpage") == 0) {
1074      new_graphs(gs);
1075      the_g = last(gs);
1076    } else if (strcmp(inp_str, "bbox") == 0) {
1077      for (i = 0; i < 4; i++) {
1078        if (!getint(&j)) {
1079          error_header();
1080          fprintf(stderr, "Bbox definition must have four integers\n");
1081          exit(1);
1082        } else {
1083          the_g->bb[i] = j;
1084        }
1085      }
1086    } else if (strcmp(inp_str, "preamble") == 0) {
1087      if (!getstring(inp_str)) return;
1088      if (strcmp(inp_str, ":") != 0) {
1089        the_g->prefile = 1;
1090        the_g->preamble = (char *) malloc (sizeof(char)*(strlen(inp_str)+1));
1091        strcpy(the_g->preamble, inp_str);
1092      } else {
1093        the_g->prefile = 0;
1094        the_g->preamble = getmultiline();
1095        if (the_g->preamble == CNULL) return;
1096      }
1097    } else if (strcmp(inp_str, "epilogue") == 0) {
1098      if (!getstring(inp_str)) return;
1099      if (strcmp(inp_str, ":") != 0) {
1100        the_g->epifile = 1;
1101        the_g->epilogue = (char *) malloc (sizeof(char)*(strlen(inp_str)+1));
1102        strcpy(the_g->epilogue, inp_str);
1103      } else {
1104        the_g->epifile = 0;
1105        the_g->epilogue = getmultiline();
1106        if (the_g->epilogue == CNULL) return;
1107      }
1108    } else {
1109      error_header(); fprintf(stderr, "Bad token: %s\n", inp_str);
1110      exit(1);
1111    } 
1112  }
1113}
Note: See TracBrowser for help on using the repository browser.