NEURON
plot.cpp
Go to the documentation of this file.
1 #include <../../nrnconf.h>
2 
3 #include "hocdec.h"
4 #include "oc_ansi.h"
5 
6 #include "utils/logger.hpp"
7 
8 /*LINTLIBRARY*/
9 #undef IGNORE
10 #if LINT
11 #define IGNORE(arg) \
12  { \
13  if (arg) \
14  ; \
15  }
16 #else
17 #define IGNORE(arg) arg
18 #endif
19 
20 #if defined(__linux__)
21 #ifndef NRNOC_X11
22 #define NRNOC_X11 0
23 #endif
24 #endif
25 
26 static void Codraw_plt(int, double, double);
27 static void Codraw_preamble(void);
28 
29 static void hplot(int, double, double);
30 
31 static void Fig_preamble(void);
32 static void Fig_plt(int, double, double);
33 void Fig_file(const char*, int);
34 
35 static void tplot(int, double, double);
36 
37 #include <stdio.h>
38 #include <string.h>
39 
40 #if defined(__MINGW32__)
41 extern char** _environ;
42 #else /*!__MINGW32__*/
43 
44 #if HAVE_UNISTD_H
45 #include <unistd.h>
46 #if !defined(__APPLE__)
47 extern char** environ;
48 #else /* __APPLE */
49 #include <crt_externs.h>
50 #endif /* __APPLE__ */
51 #endif /* HAVE_UNISTD_H */
52 
53 #endif /*!__MINGW32__*/
54 
55 static int console = 1; /* 1 plotting to console graphics */
56 static int hardplot; /* 1 hp style 2 fig style 3 coplot*/
57 static int graphdev;
58 static int hpflag; /* hp plotter switch */
59 int hoc_plttext; /* text can be printed to hpdev */
60 #define text hoc_plttext
61 static FILE* gdev; /* system call stdout not directed to here */
62 static FILE* hpdev; /* hp, or fig style file */
63 static FILE* cdev; /* console device */
64 
65 #define SSUN 1
66 #define VT 2
67 #define SEL 3
68 #define TEK4014 4
69 #define ADM 5
70 #define NX 6
71 
72 #define US 037
73 #define GS 035
74 #define CAN 030
75 #define EM 031
76 #define FS 034
77 #define ESC 033
78 #define ETX 03
79 
80 static char vt100[] = "TERM=vt125";
81 static char adm3a[] = "TERM=adm3a";
82 static char ssun[] = "TERM=sun";
83 static char tek4014[] = "TERM=4014";
84 static char ncsa[] = "NEURON=ncsa";
85 int hoc_color = 15;
86 static double xlast, ylast;
87 
88 #if NRNOC_X11
89 extern void x11_put_text(const char*), x11_close_window(void), x11_setcolor(int);
90 extern void x11_coord(double, double), x11_vector(), x11_point(), x11_move(), x11flush();
91 extern void x11_clear(), x11_cleararea(), x11_open_window(), x11_fast(int);
92 static void hoc_x11plot(int, double, double);
93 #endif
94 
95 static void hard_text_preamble();
96 
97 void hoc_plprint(const char* s) {
98  char buf[128];
99 
100  if (text && s[strlen(s) - 1] == '\n') {
101  IGNORE(strcpy(buf, s));
102  s = buf;
103  buf[strlen(s) - 1] = '\0';
104  }
105 
106  if (console && text) {
107 #if SUNCORE
108  hoc_pl_sunplot(s);
109 #else
110 #if NRNOC_X11
111  x11_put_text(s);
112 #else
113  IGNORE(fprintf(cdev, "%s", s));
114  IGNORE(fflush(cdev));
115 #endif
116 #endif
117 
118  } else if (!text) {
119  Printf("%s", s);
120  }
121  if (hardplot && hpdev && text && strlen(s)) {
123  IGNORE(fprintf(hpdev, "%s", s));
124  IGNORE(fflush(hpdev));
125  }
126  if (text && s == buf) {
127  hoc_plt(1, xlast, ylast - 20);
128  hoc_plt(-2, 0., 0.);
129  }
130 }
131 
132 void initplot(void) {
133 #if !defined(__MINGW32__) /* to end of function */
134  int i;
135 #if defined(__APPLE__)
136  char** environ = (*_NSGetEnviron());
137 #endif
138  graphdev = SSUN;
139  for (i = 0; environ[i] != NULL; i++) {
140  if (strcmp(environ[i], vt100) == 0)
141  graphdev = VT;
142  if (strcmp(environ[i], ssun) == 0)
143  graphdev = SSUN;
144  if (strcmp(environ[i], adm3a) == 0)
145  graphdev = ADM;
146  if (strcmp(environ[i], tek4014) == 0)
147  graphdev = TEK4014;
148  if (strcmp(environ[i], ncsa) == 0)
149  graphdev = TEK4014;
150  }
151  hpdev = (FILE*) 0;
152  cdev = gdev = stdout;
153 #if SUNCORE
154  if (graphdev == SSUN) {
155  hoc_open_sunplot(environ);
156 #else
157 #if NRNOC_X11
158  /*EMPTY*/
159  if (graphdev == SSUN) {
160 #else
161  if (graphdev == SSUN) {
162 /*
163  if (graphdev == SSUN &&(cdev = fopen("/dev/ttyp4", "w")) == (FILE *)0) {
164  IGNORE(fprintf(stderr, "Can't open /dev/ttyp4 for TEK\n"));
165  cdev = stdout;
166 */
167 #endif /*NRNOC_X11*/
168 #endif /*SUNCORE*/
169  } else {
170  if (graphdev == TEK4014) {
171  cdev = gdev = stdout;
172  }
173  }
174 #endif /*!__MINGW32__*/
175 }
176 
177 void hoc_close_plot(void) {
178 #if SUNCORE
179  hoc_close_sunplot();
180 #else
181 #if NRNOC_X11
182  x11_close_window();
183 #else
184 #endif
185 #endif
186 }
187 
188 void hoc_plt(int mode, double x, double y) {
189  if (x < 0.)
190  x = 0.;
191  if (x > 1000.)
192  x = 1000.;
193  if (y < 0.)
194  y = 0.;
195  if (y > 780.)
196  y = 780.;
197  if (mode >= 0) {
198  xlast = x;
199  ylast = y;
200  }
201  if (console) {
202  switch (graphdev) {
203  case SSUN:
204 #if SUNCORE
205  hoc_sunplot(&text, mode, x, y);
206  break;
207 #else
208 #if NRNOC_X11
209  hoc_x11plot(mode, x, y);
210  break;
211 #else
212 #endif
213 #endif
214  case ADM:
215  case SEL:
216  case TEK4014:
217  tplot(mode, x, y);
218  break;
219 #if VT125
220  case VT:
221  vtplot(mode, x, y);
222  break;
223 #endif
224  }
225  }
226  if (hardplot == 1) {
227  hplot(mode, x, y);
228  }
229  if (hardplot == 2) {
230  Fig_plt(mode, x, y);
231  }
232  if (hardplot == 3) {
233  Codraw_plt(mode, x, y);
234  }
235  if (hardplot && hpdev) {
236  IGNORE(fflush(hpdev));
237  }
238  if (console && cdev) {
239  IGNORE(fflush(cdev));
240  }
241 }
242 
243 #define XHOME 0
244 #define YHOME 770
245 
246 static void tplot(int mode, double x, double y) {
247  unsigned ix, iy;
248  int hx, hy, ly, lx;
249 
250  if (graphdev == SEL) {
251  IGNORE(putc(ESC, cdev));
252  IGNORE(putc('1', cdev));
253  }
254  if (mode < 0) {
255  switch (mode) {
256  default:
257  case -1: /* home cursor */
258  switch (graphdev) {
259  case ADM: /* to adm3a alpha mode */
260  IGNORE(putc(US, cdev));
261  IGNORE(putc(CAN, cdev));
262  break;
263  case TEK4014:
264  default:
265  IGNORE(putc(GS, cdev));
266  hy = (((YHOME & 01777) >> 5) + 32);
267  ly = ((YHOME & 037) + 96);
268  hx = (((XHOME & 01777) >> 5) + 32);
269  lx = ((XHOME & 037) + 64);
270  IGNORE(fprintf(cdev, "%c%c%c%c", hy, ly, hx, lx));
271  IGNORE(putc(US, cdev));
272  break;
273  }
274  text = 0;
275  return;
276 
277  case -2: /* to 4010 alpha mode */
278  IGNORE(putc(GS, cdev));
279  IGNORE(putc(US, cdev));
280  text = 1;
281  return;
282 
283  case -3: /* erase, and go to alpha on ADM */
284  switch (graphdev) {
285  case ADM:
286  IGNORE(putc(GS, cdev));
287  IGNORE(putc(EM, cdev));
288  IGNORE(putc(US, cdev));
289  IGNORE(putc(CAN, cdev));
290  break;
291  case TEK4014:
292  default:
293  IGNORE(putc(ESC, cdev));
294  IGNORE(putc(014, cdev));
295  break;
296  }
297  text = 0;
298  return;
299  }
300  }
301  switch (mode) {
302  case 0: /* enter point mode */
303  /*IGNORE(putc(FS, cdev));
304  break;*/ /* no point mode on pure 4014 so plot vector of 0 length*/
305  case 1: /* enter vector mode */
306  IGNORE(putc(GS, cdev));
307  break;
308  }
309  iy = y;
310  ix = x;
311  hy = (((iy & 01777) >> 5) + 32);
312  ly = ((iy & 037) + 96);
313  hx = (((ix & 01777) >> 5) + 32);
314  lx = ((ix & 037) + 64);
315  IGNORE(fprintf(cdev, "%c%c%c%c", hy, ly, hx, lx));
316  if (mode == 0) {
317  IGNORE(fprintf(cdev, "%c%c%c%c", hy, ly, hx, lx));
318  }
319  return;
320 }
321 
322 static char hardplot_filename[100];
323 
324 static void hardplot_file(const char* s) {
325  if (hpdev) {
326  IGNORE(fclose(hpdev));
327  }
328  hpdev = (FILE*) 0;
329  hpflag = 0;
330  hardplot = 0;
331  gdev = stdout;
332  if (s) {
333  hpdev = fopen(s, "w");
334  if (hpdev) {
335  strncpy(hardplot_filename, s, 99);
336  hpflag = 1;
337  gdev = hpdev;
338  } else {
339  IGNORE(fprintf(stderr, "Can't open %s for hardplot output\n", s));
340  }
341  } else {
342  hardplot_filename[0] = '\0';
343  }
344 }
345 
346 void Fig_file(const char* s, int dev) {
347  hoc_plt(-1, 0., 0.);
348  hardplot_file(s);
349  if (!hpdev)
350  return;
351  hardplot = dev;
352  if (hardplot == 2) {
353  Fig_preamble();
354  }
355  if (hardplot == 3) {
356  Codraw_preamble();
357  }
358 }
359 
360 static char fig_text_preamble[100];
361 
362 static void hard_text_preamble(void) {
363  if (hardplot == 2) {
364  IGNORE(fprintf(hpdev, "%s", fig_text_preamble));
365  fig_text_preamble[0] = '\0';
366  }
367 }
368 
369 static void Fig_preamble(void) {
370  static char fig_preamble[] = "#FIG 1.4\n80 2\n";
371 
372  if (!hpdev)
373  return;
374  IGNORE(fprintf(hpdev, "%s", fig_preamble));
375 }
376 
377 void Fig_plt(int mode, double x, double y) {
378 #define SCX(x) ((int) (x * .8))
379 #define SCY(y) (600 - (int) (y * .8))
380 #define SCXD(x) ((x * .8))
381 #define SCYD(y) (7.5 * 80. - (y * .8))
382 #undef TEXT
383 #define TEXT 1
384 #define LINE1 2
385 #define LINE2 3
386  static short state = 0;
387  static double oldx, oldy;
388  static char text_preamble[] = "4 0 0 16 0 0 0 0.000 1 16 40 ", text_postamble[] = "\1\n",
389  line_preamble[] = "7 1 0 1 0 0 0 0 0.000 0 0\n", line_postamble[] = " 9999 9999\n";
390 
391 
392  if (!hpdev)
393  return;
394 
395  if (state == TEXT) {
396  if (!fig_text_preamble[0]) {
397  IGNORE(fprintf(hpdev, "%s", text_postamble));
398  }
399  state = 0;
400  text = 0;
401  }
402 
403  if (mode < 0) {
404  if (state == LINE2) {
405  IGNORE(fprintf(hpdev, "%s", line_postamble));
406  }
407  text = 0;
408  state = 0;
409  if (mode == -2) {
410  IGNORE(Sprintf(fig_text_preamble, "%s %d %d ", text_preamble, SCX(oldx), SCY(oldy)));
411  state = TEXT;
412  text = 1;
413  return;
414  }
415  if (mode == -3) {
417  }
418  } else {
419  switch (mode) {
420  case 0:
421  break;
422  case 1:
423  if (state == LINE2) {
424  IGNORE(fprintf(hpdev, "%s", line_postamble));
425  }
426  state = LINE1;
427  break;
428  default:
429  if (state == LINE1) {
430  IGNORE(fprintf(hpdev, "%s %.1f %.1f\n", line_preamble, SCXD(oldx), SCYD(oldy)));
431  state = LINE2;
432  }
433  IGNORE(fprintf(hpdev, " %.1f %.1f\n", SCXD(x), SCYD(y)));
434  break;
435  }
436  oldx = x;
437  oldy = y;
438  }
439 }
440 
441 void hplot(int mode, double x, double y) {
442  static short hpflag = 0;
443  static short txt = 0;
444 
445  if (!hpdev)
446  return;
447  if (hpflag == 0) {
448  hpflag = 1;
449  IGNORE(fprintf(hpdev, "%c.Y%c.I81;;17:%c.N;19:SC 0,1023,0,780;SP 1;", ESC, ESC, ESC));
450  }
451 
452  if (txt == 1) {
453  IGNORE(fprintf(hpdev, "%c;", ETX));
454  txt = 0;
455  text = 0;
456  }
457  if (mode < 0)
458  switch (mode) {
459  case -2:
460  IGNORE(fprintf(hpdev, "LB"));
461  txt = 1;
462  text = 1;
463  return;
464 
465  case -3:
466  txt = 0;
467  text = 0;
468  hpflag = 0;
469  IGNORE(fseek(hpdev, 0L, 0));
470  return;
471  default:
472  IGNORE(fprintf(hpdev, "PU;SP;%c.Z", ESC));
473  txt = 0;
474  text = 0;
475  hpflag = 0;
476  return;
477  }
478  switch (mode) {
479  case 0:
480  IGNORE(fprintf(hpdev, "PU %8.2f,%8.2f;PD;", x, y));
481  return;
482  case 1:
483  IGNORE(fprintf(hpdev, "PU %8.2f,%8.2f;", x, y));
484  return;
485  default:
486  IGNORE(fprintf(hpdev, "PD %8.2f,%8.2f;", x, y));
487  return;
488  }
489 }
490 
491 /* not modified for new method */
492 #if VT125
493 void vtplot(int mode, double x, double y) {
494  static short vtgrph = 0;
495  int vtx, vty;
496 
497  if (mode < 0) {
498  IGNORE(fprintf(gdev, "%c\\%c", ESC, ESC));
499  switch (mode) {
500  default:
501  case -1: /* vt125 alpha mode */
502  break;
503 
504  case -2: /* graphics text mode */
505  IGNORE(fprintf(gdev, "P1pt\'"));
506  vtgrph = 2;
507  return;
508 
509  case -3: /* erase graphics */
510  IGNORE(fprintf(gdev, "P1pS(E)"));
511  break;
512 
513  case -4: /* erase text */
514  IGNORE(fprintf(gdev, "[2J"));
515  break;
516 
517  case -5: /* switch to HP plotter */
518  IGNORE(fprintf(gdev, "%c\\%c[5i", ESC, ESC)); /* esc and open port */
519  vtgrph = 0;
520  hplot(-5, 0., 0.);
521  return;
522  }
523  IGNORE(fprintf(gdev, "%c\\", ESC));
524  vtgrph = 0;
525  return;
526  }
527 
528  if (vtgrph == 2) {
529  IGNORE(fprintf(gdev, "%c\\", ESC));
530  vtgrph = 0;
531  }
532  if (vtgrph == 0) {
533  IGNORE(fprintf(gdev, "%cP1p", ESC));
534  vtgrph = 1;
535  }
536  vtx = (int) ((767. / 1023.) * x);
537  vty = (int) (479. - (479 / 779.) * y);
538  if (mode >= 2) {
539  IGNORE(fprintf(gdev, "v[%d,%d]", vtx, vty));
540  return;
541  }
542  IGNORE(fprintf(gdev, "p[%d,%d]", vtx, vty));
543  if (mode == 0)
544  IGNORE(fprintf(gdev, "v[]"));
545  return;
546 }
547 #endif /*VT*/
548 
549 int hoc_set_color(int c) {
550  hoc_color = c;
551 #if SUNCORE
552  set_line_index(c);
553  set_text_index(c);
554 #else
555 #if NRNOC_X11
556  x11_setcolor(c);
557 #else
558 #endif
559 #endif
560  return (int) hoc_color;
561 }
562 
563 #define CODRAW_MAXPOINT 200
564 static int codraw_npoint = 0;
565 static float *codraw_pointx, *codraw_pointy;
566 
567 static void codraw_line();
568 
570  static char codraw_preamble[] =
571  "SW(1,0,8,0,8);\nST(1);\nSG(0.1);\n\
572 SF(1,'HELVET-L');\nSF(2,'HELVET');\nSF(3,'CENTURY');\nSF(4,'SCRIPT');\n\
573 SF(5,'GREEK');\nSP(1);\nLT(1);LW(1);LC(15);LD(50);\nTF(1);TW(1);TS(0);TC(15);\
574 TL(1);TV(4);TA(0);TH(0.2);\n";
575 
576  if (!hpdev)
577  return;
578  IGNORE(fprintf(hpdev, "%s", codraw_preamble));
579  codraw_npoint = 0;
580  if (!codraw_pointy) {
581  codraw_pointx = (float*) hoc_Emalloc(CODRAW_MAXPOINT * sizeof(float));
582  codraw_pointy = (float*) hoc_Emalloc(CODRAW_MAXPOINT * sizeof(float));
583  hoc_malchk();
584  }
585 }
586 
587 void Codraw_plt(int mode, double x, double y) {
588 #undef SCXD
589 #undef SCYD
590 #define SCXD(x) ((x * .008))
591 #define SCYD(y) ((y * .008))
592 #undef TEXT
593 #undef LINE1
594 #undef LINE2
595 #define TEXT 1
596 #define LINE1 2
597 #define LINE2 3
598  static short state = 0;
599  static double oldx, oldy;
600 
601  if (!hpdev)
602  return;
603 
604  if (state == TEXT) {
605  IGNORE(fprintf(hpdev, "');\n"));
606  state = 0;
607  text = 0;
608  }
609 
610  if (mode < 0) {
611  if (state == LINE2) {
612  codraw_line();
613  }
614  text = 0;
615  state = 0;
616  if (mode == -2) {
617  IGNORE(fprintf(hpdev, "TT(%.2f,%.2f,'", SCXD(oldx), SCYD(oldy)));
618  state = TEXT;
619  text = 1;
620  return;
621  }
622  if (mode == -3) {
623  IGNORE(fseek(hpdev, 0L, 0));
624  Codraw_preamble();
625  }
626  } else {
627  switch (mode) {
628  case 0:
629  break;
630  case 1:
631  if (state == LINE2) {
632  codraw_line();
633  }
634  state = LINE1;
635  break;
636  default:
637  if (state == LINE1) {
638  codraw_npoint = 1;
639  codraw_pointx[0] = oldx;
640  codraw_pointy[0] = oldy;
641  state = LINE2;
642  }
645  if (++codraw_npoint == CODRAW_MAXPOINT) {
646  codraw_line();
647  }
648  break;
649  }
650  oldx = x;
651  oldy = y;
652  }
653 }
654 
655 static void codraw_line() {
656  int i;
657 
658  if (codraw_npoint < 2) {
659  codraw_npoint = 0;
660  return;
661  }
662  IGNORE(fprintf(hpdev, "LL(%d", codraw_npoint));
663  for (i = 0; i < codraw_npoint; i++) {
664  if (((i + 1) % 8) == 0) {
665  IGNORE(fprintf(hpdev, "\n"));
666  }
667  IGNORE(fprintf(hpdev, ",%.2f,%.2f", SCXD(codraw_pointx[i]), SCYD(codraw_pointy[i])));
668  }
669  IGNORE(fprintf(hpdev, ");\n"));
671  codraw_npoint = 1;
674  } else {
675  codraw_npoint = 0;
676  }
677 }
678 
679 #if NRNOC_X11
680 extern char* getenv();
681 static void hoc_x11plot(int mode, double x, double y) {
682  extern int x11_init_done;
683 
684  if (!x11_init_done) {
685  x11_open_window();
686  }
687 
688  if (mode >= 0) {
689  x11_coord(x, y);
690  }
691  if (mode > 1) {
692  x11_vector();
693  } else {
694  switch (mode) {
695  case 0:
696  x11_point();
697  break;
698  case 1:
699  x11_move();
700  break;
701  case -1:
702  text = 0;
703  x11flush();
704  break;
705  case -2:
706  text = 1;
707  break;
708  case -3:
709  x11_clear();
710  break;
711  case -4:
712  x11_coord(x, y);
713  x11_cleararea();
714  break;
715  case -5:
716  x11_fast(1);
717  break;
718  case -6:
719  x11_fast(0);
720  }
721  }
722 }
723 #endif /*NRNOC_X11*/
#define i
Definition: md1redef.h:19
char buf[512]
Definition: init.cpp:13
void initplot(void)
Definition: plot.cpp:132
void hoc_plprint(const char *s)
Definition: plot.cpp:97
void hoc_close_plot(void)
Definition: plot.cpp:177
int hoc_set_color(int c)
Definition: plot.cpp:549
void hoc_plt(int mode, double x, double y)
Definition: plot.cpp:188
int hoc_color
Definition: plot.cpp:85
static int c
Definition: hoc.cpp:169
void hoc_malchk(void)
Definition: nrnoc_aux.cpp:83
void * hoc_Emalloc(size_t)
Definition: nrnoc_aux.cpp:80
int Sprintf(char(&buf)[N], const char *fmt, Args &&... args)
Redirect sprintf to snprintf if the buffer size can be deduced.
Definition: wrap_sprintf.h:14
s
Definition: multisend.cpp:521
static double * lx
Definition: axis.cpp:427
HOC interpreter function declarations (included by hocdec.h)
#define CODRAW_MAXPOINT
Definition: plot.cpp:563
static char hardplot_filename[100]
Definition: plot.cpp:322
#define YHOME
Definition: plot.cpp:244
static void Fig_preamble(void)
Definition: plot.cpp:369
static void hard_text_preamble()
Definition: plot.cpp:362
#define VT
Definition: plot.cpp:66
static int codraw_npoint
Definition: plot.cpp:564
#define text
Definition: plot.cpp:60
static FILE * hpdev
Definition: plot.cpp:62
static FILE * gdev
Definition: plot.cpp:61
#define LINE2
void Fig_file(const char *, int)
Definition: plot.cpp:346
#define SCX(x)
#define EM
Definition: plot.cpp:75
static double ylast
Definition: plot.cpp:86
static void hardplot_file(const char *s)
Definition: plot.cpp:324
#define CAN
Definition: plot.cpp:74
#define ESC
Definition: plot.cpp:77
#define SCXD(x)
static int hpflag
Definition: plot.cpp:58
#define LINE1
static char ncsa[]
Definition: plot.cpp:84
#define TEXT
#define SCYD(y)
static void Fig_plt(int, double, double)
Definition: plot.cpp:377
#define SEL
Definition: plot.cpp:67
static void hplot(int, double, double)
Definition: plot.cpp:441
#define XHOME
Definition: plot.cpp:243
static FILE * cdev
Definition: plot.cpp:63
#define ADM
Definition: plot.cpp:69
int hoc_plttext
Definition: plot.cpp:59
static char ssun[]
Definition: plot.cpp:82
static int hardplot
Definition: plot.cpp:56
static void Codraw_preamble(void)
Definition: plot.cpp:569
static void codraw_line()
Definition: plot.cpp:655
static int console
Definition: plot.cpp:55
static char fig_text_preamble[100]
Definition: plot.cpp:360
#define US
Definition: plot.cpp:72
#define SCY(y)
#define IGNORE(arg)
Definition: plot.cpp:17
#define TEK4014
Definition: plot.cpp:68
#define GS
Definition: plot.cpp:73
static float * codraw_pointx
Definition: plot.cpp:565
static char tek4014[]
Definition: plot.cpp:83
static void Codraw_plt(int, double, double)
Definition: plot.cpp:587
static int graphdev
Definition: plot.cpp:57
static void tplot(int, double, double)
Definition: plot.cpp:246
static float * codraw_pointy
Definition: plot.cpp:565
static char adm3a[]
Definition: plot.cpp:81
static double xlast
Definition: plot.cpp:86
static char vt100[]
Definition: plot.cpp:80
#define SSUN
Definition: plot.cpp:65
#define ETX
Definition: plot.cpp:78
#define NULL
Definition: spdefs.h:105
int Printf(const char *fmt, Args... args)
Definition: logger.hpp:18