URI:
       tplot.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tplot.c (2783B)
       ---
            1 #include <stdio.h>
            2 #include <stdlib.h>
            3 #include <math.h>
            4 #include "grap.h"
            5 #include "y.tab.h"
            6 
            7 void line(int type, Point p1, Point p2, Attr *desc)        /* draw a line segment */
            8 {
            9         fprintf(tfd, "%s %s from %s",
           10                 type==LINE ? "line" : "arrow",  desc_str(desc), xyname(p1));
           11         fprintf(tfd, " to %s", xyname(p2));        /* 'cause xyname is botched */
           12         fprintf(tfd, "\n");
           13         range(p1);
           14         range(p2);
           15 }
           16 
           17 void circle(double r, Point pt)                /* draw a circle */
           18 {
           19         if (r > 0.0)
           20                 fprintf(tfd, "circle rad %g at %s\n", r, xyname(pt));
           21         else
           22                 fprintf(tfd, "\"\\s-3\\(ob\\s0\" at %s\n", xyname(pt));
           23         range(pt);
           24 }
           25 
           26 char *xyname(Point pt)        /* generate xy name macro for point p */
           27 {
           28         static char buf[200];
           29         Obj *p;
           30 
           31         p = pt.obj;
           32         if (p->log & XFLAG) {
           33                 if (pt.x <= 0.0)
           34                         ERROR "can't take log of x coord %g", pt.x FATAL;
           35                 logit(pt.x);
           36         }
           37         if (p->log & YFLAG) {
           38                 if (pt.y <= 0.0)
           39                         ERROR "can't take log of y coord %g", pt.y FATAL;
           40                 logit(pt.y);
           41         }
           42         sprintf(buf, "xy_%s(%g,%g)", p->name, pt.x, pt.y);
           43         return buf;        /* WATCH IT:  static */
           44 }
           45 
           46 void pic(char *s)        /* fire out pic stuff directly */
           47 {
           48         while (*s == ' ')
           49                 s++;
           50         fprintf(tfd, "%s\n", s);
           51 }
           52 
           53 int        auto_x        = 0;        /* counts abscissa if none provided */
           54 
           55 void numlist(void)        /* print numbers in default way */
           56 {
           57         Obj *p;
           58         Point pt;
           59         int i;
           60         static char *spot = "\\(bu";
           61         Attr *ap;
           62 
           63         p = pt.obj = lookup(curr_coord, 1);
           64         if (nnum == 1) {
           65                 nnum = 2;
           66                 num[1] = num[0];
           67                 num[0] = ++auto_x;
           68         }
           69         pt.x = num[0];
           70         if (p->attr && p->attr->sval)
           71                 spot = p->attr->sval;
           72         for (i = 1; i < nnum; i++) {
           73                 pt.y = num[i];
           74                 if (p->attr == 0 || p->attr->type == 0) {
           75                         ap = makesattr(tostring(spot));
           76                         plot(ap, pt);
           77                 } else
           78                         next(p, pt, p->attr);
           79         }
           80         nnum = 0;
           81 }
           82 
           83 void plot(Attr *sl, Point pt)        /* put stringlist sl at point pt */
           84 {
           85         fprintf(tfd, "%s at %s\n", slprint(sl), xyname(pt));
           86         range(pt);
           87         freeattr(sl);
           88 }
           89 
           90 void plotnum(double f, char *fmt, Point pt)        /* plot value f at point */
           91 {
           92         char buf[100];
           93 
           94         if (fmt) {
           95                 sprintf(buf, fmt, f);
           96                 free(fmt);
           97         } else if (f >= 0.0)
           98                 sprintf(buf, "%g", f);
           99         else
          100                 sprintf(buf, "\\-%g", -f);
          101         fprintf(tfd, "\"%s\" at %s\n", buf, xyname(pt));
          102         range(pt);
          103 }
          104 
          105 void drawdesc(int type, Obj *p, Attr *desc, char *s)        /* set line description for p */
          106 {
          107         p->attr = desc;
          108         p->attr->sval = s;
          109         if (type == NEW) {
          110                 p->first = 0;        /* so it really looks new */
          111                 auto_x = 0;
          112         }
          113 }
          114 
          115 void next(Obj *p, Point pt, Attr *desc)        /* add component to a path */
          116 {
          117         char *s;
          118 
          119         if (p->first == 0) {
          120                 p->first++;
          121                 fprintf(tfd, "L%s: %s\n", p->name, xyname(pt));
          122         } else {
          123                 fprintf(tfd, "line %s from L%s to %s; L%s: Here\n",
          124                         desc_str(desc->type ? desc : p->attr),
          125                         p->name, xyname(pt), p->name);
          126         }
          127         if (p->attr && (s=p->attr->sval)) {
          128                 /* BUG: should fix size here */
          129                 fprintf(tfd, "\"%s\" at %s\n", s, xyname(pt));
          130         }
          131         range(pt);
          132 }