|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include "typedef.h" ! 3: #include "basic.h" ! 4: ! 5: #define MAXPLOT 32 /* number of bytes in plot buffer */ ! 6: #define SFLAG 035 ! 7: #define EFLAG 0377 ! 8: #define CLEAR 030 ! 9: #define UP 0 ! 10: #define DOWN 1 ! 11: ! 12: #define LIMIT 1024. /* Screen limit */ ! 13: #define XMAX 280 ! 14: #define YMAX 192 ! 15: #define XSCALE (LIMIT/XMAX) ! 16: #define YSCALE (LIMIT/YMAX) ! 17: ! 18: static struct plotinfo { ! 19: int p_des; /* plot file descriptor */ ! 20: char *p_file; /* the plot file name */ ! 21: char p_buff[MAXPLOT]; /* the plot buffer */ ! 22: int p_pen; /* current pen position */ ! 23: char *p_ptr; /* plot buffer pointer */ ! 24: int p_x; /* current x position */ ! 25: int p_y; /* current y position */ ! 26: } p; ! 27: ! 28: ! 29: /* ! 30: * pltini --- initialize the plot structure ! 31: */ ! 32: ! 33: pltini(file) ! 34: char *file; ! 35: { ! 36: if (p.p_des > 0) ! 37: pltcls(); /* close it if open */ ! 38: if (file == NULL) ! 39: file = p.p_file; ! 40: if (file == NULL) ! 41: file = "!plot"; ! 42: if (file[0] == '!') ! 43: p.p_des = pipeout("/bin/sh", "sh", "-c", &file[1], 0); ! 44: else ! 45: p.p_des = creat(file, 0666); ! 46: if (p.p_des < 0) ! 47: err("cannot open %s for plotting", file); ! 48: p.p_ptr = p.p_buff; ! 49: p.p_pen = UP; ! 50: p.p_file = file; ! 51: } ! 52: ! 53: ! 54: /* ! 55: * pltcls --- close the plot file ! 56: */ ! 57: ! 58: pltcls() ! 59: { ! 60: ! 61: if (p.p_des > 0) { ! 62: penup(); ! 63: pltflush(); ! 64: close(p.p_des); ! 65: } ! 66: p.p_des = 0; ! 67: } ! 68: ! 69: ! 70: /* ! 71: * pltflush --- flush the plot buffer ! 72: */ ! 73: ! 74: pltflush() ! 75: { ! 76: register int l; ! 77: ! 78: l = p.p_ptr - p.p_buff; ! 79: if (l) ! 80: if (write(p.p_des, p.p_buff, l) < 0) ! 81: err("write error during plotting"); ! 82: p.p_ptr = p.p_buff; ! 83: } ! 84: ! 85: ! 86: /* ! 87: * plot --- move the pen to the specified coordinates ! 88: */ ! 89: ! 90: plot(x, y) ! 91: { ! 92: register int ix, iy; ! 93: ! 94: if (tflg) ! 95: fprintf(stderr, "plot %d %d\n", x, y); ! 96: if (x < 0 || x >= XMAX) ! 97: err("invalid x co-ordinate %d", x); ! 98: if (y < 0 || y >= YMAX) ! 99: err("invalid y co-ordinate %d", y); ! 100: if (p.p_pen == DOWN) { ! 101: ix = x * XSCALE; ! 102: iy = (YMAX - y) * YSCALE; ! 103: plotc((ix >> 6) & 077); ! 104: plotc(ix & 077); ! 105: plotc((iy >> 6) & 077); ! 106: plotc(iy & 077); ! 107: } ! 108: p.p_x = x; ! 109: p.p_y = y; ! 110: } ! 111: ! 112: ! 113: /* ! 114: * plotc --- enter a character into the plot buffer ! 115: */ ! 116: ! 117: plotc(ch) ! 118: { ! 119: ! 120: *p.p_ptr++ = ch; ! 121: if (p.p_ptr >= &p.p_buff[MAXPLOT]) ! 122: pltflush(); ! 123: } ! 124: ! 125: ! 126: /* ! 127: * penup --- raise the pen ! 128: */ ! 129: ! 130: penup() ! 131: { ! 132: ! 133: if (p.p_pen == DOWN) ! 134: plotc(EFLAG); ! 135: p.p_pen = UP; ! 136: pltflush(); ! 137: } ! 138: ! 139: ! 140: /* ! 141: * pendn --- lower the pen ! 142: */ ! 143: ! 144: pendn() ! 145: { ! 146: ! 147: if (p.p_pen == UP) { ! 148: plotc(SFLAG); ! 149: p.p_pen = DOWN; ! 150: plot(p.p_x, p.p_y); ! 151: } ! 152: } ! 153: ! 154: ! 155: /* ! 156: * erase --- erase the plot display ! 157: */ ! 158: ! 159: erase() ! 160: { ! 161: ! 162: penup(); ! 163: plotc(CLEAR); ! 164: plotc(EFLAG); ! 165: pltflush(); ! 166: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.