|
|
1.1 root 1: /* Copyright Bell Telephone Laboratories Whippany, N.J.
2:
3: * /////////////////////////////////////
4: * /////////////////////////////////////
5: * ////////////// print.c //////////////
6: * /// J. P. Hawkins WH X4610 8C-001 ///
7: * ///// Fri Aug 24 17:02:55 1979 //////
8: * /////////////////////////////////////
9: * /////////////////////////////////////
10: *
11:
12: *
13: * BASIC Print Command
14: *
15: * MOD,J.P.Hawkins,3-FEB-81 to handle string variables
16: */
17: /* "@(#) print.c: V 1.5 5/6/81" */
18: #include "bas.h"
19: #define NMFIELD 5 /* number of print fields */
20: #define PSIZE 80 /* max print columns */
21: /*
22: #define skip00() {while(*ptext == ' ' || *ptext == '\t') *ptext++;}
23: */
24: #define skip00() {} /* skip00 does nothing */
25: static int contin = 1; /* line continuation flag initted
26: to no continuation */
27: extern struct FILTBL filtbl[];
28: #ifdef TEST
29: char busaddr[2]; /* IBV11 bus address (one char term by null) */
30: buspr()
31: {
32: char *ptr;
33:
34: ptr = expr; /* point to beginning of string */
35:
36: if(*ptr++ != '\'')
37: {
38: error(inst.thing.linno, 100); /* MISSING ' DELIM */
39: return(-1);
40: }
41:
42: busaddr[0] = *ptr++; /* next char is buss address */
43: busaddr[1] = '\0'; /* null terminate */
44:
45: expr = ptr; /* make prguts start at current pointer */
46: prguts(1); /* call prguts with buslfg on */
47: }
48: #endif
49:
50: __print()
51: {
52: prguts(0);
53: }
54:
55: /*
56: *
57: * GUTS TO NORMAL PRINT AND IEEE BUS OUTPUT
58: */
59: prguts(busflg)
60: int busflg; /* true if talking to IBV11 bus */
61: {
62: #ifdef STRINGS
63: char *savptr;
64: char field[80];
65: #endif
66: int tvalue; /* tab value */
67: int fildes; /* file designator for BASIC */
68: double value; /* evaluated floating point value */
69: double evalx(); /* expression avaluator */
70: char pbuild[PSIZE]; /* print string build area */
71: char numbuf[80]; /* number text storage */
72: register i; /* build txtbuf index */
73: int n; /* number txtbuf index */
74: int fd; /* file descriptor */
75: char *ptext; /* input text pointer */
76: fd = 1; /* init fd to 1 for normal print */
77: ptext = expr; /* point to beginning of text area */
78:
79: i = 0;
80:
81: if(!(busflg))
82: {
83: if(*ptext == '_' && (*(ptext+1) >= '0' && *(ptext+1) <= '8'))
84: {
85: *ptext++;
86: fildes = *ptext - '1'; /* get BASIC file designator */
87: fd = filtbl[fildes].fildes;
88: *ptext++;
89: if(filtbl[fildes].mode != 'w') /* file must be open
90: for writing */
91: {
92: error(inst.thing.linno, 36); /* FILE NOT OPEN FOR WRITE */
93: return(-1);
94: }
95: }
96: }
97: if(*ptext == '\0') /* if line empty */
98: contin = 1; /* force newline */
99:
100: while(*ptext != '\0')
101: {
102: skip00(); /* skip blanks and tabs */
103: if(equal(ptext,"tab")) /* if "tab" function */
104: {
105: contin = 1;
106: ptext += 3; /* skip "tab" string */
107: if(*ptext != '(')
108: {
109: error(inst.thing.linno, 30);
110: return(-1);
111: }
112: else
113: {
114: n = 0;
115: cpyprn(numbuf,&ptext,&n); /* get expr */
116: numbuf[n] = '\0';
117: value = evalx(numbuf);
118: if(value < 0.0) value = 0.0;
119: tvalue = value;
120: while((i < tvalue) && (i < PSIZE-2))
121: pbuild[i++] = ' ';
122: }
123: }
124: else if(*ptext == '"') /* if string delimiter */
125: {
126: contin = 1; /* flip to no line continuation */
127: *ptext++; /* bump past delimiter */
128: while(*ptext != '"' && *ptext != '\0')
129: {
130: if(i > PSIZE-2) i = PSIZE-2;
131: pbuild[i++] = *ptext++; /* copy text
132: into build area */
133: }
134: if(*ptext == '\0') /* if null before end quote */
135: {
136: error(inst.thing.linno, 11); /* error */
137: return(-1);
138: }
139: else if(i >= PSIZE-2)
140: {
141: i = PSIZE-2; /* truncate line at line limit */
142: }
143: else;
144:
145: *ptext++; /* bump past end delim */
146: skip00(); /* skip blanks and tabs */
147: }
148: else if(*ptext == ',' || *ptext == ';')
149: {
150: pbuild[i++] = ' ';
151: }
152: else
153: {
154: contin = 1; /* flip to no line continuation */
155: n = 0;
156: while(*ptext != ';' && *ptext != ',' && *ptext != '\0')
157: {
158: /*
159: * SKIP EVERYTHING ENCLOSED IN BALANCED ()
160: * This is so commas in array specs
161: * ARENT interpreted as print delims
162: */
163: if(*ptext == '(')
164: {
165: cpyprn(numbuf,&ptext,&n);
166: }
167: else
168: {
169: numbuf[n++] = *ptext++;
170: }
171: }
172: numbuf[n] = '\0'; /* null terminate expr */
173: #ifdef STRINGS
174: savptr=numbuf;
175: if(class(&savptr,field) < STCLASS)
176: {
177: #endif
178: value = evalx(numbuf); /* eval the expr. */
179: /*
180: * PRECEDE POS. NUMS WITH A BLANK
181: * IF NOT A BUS CALL
182: */
183: if(busflg == 0)
184: if(value>=0.0) pbuild[i++] = ' ';
185:
186: sprintf(numbuf,"%g", value); /* conv to ascii */
187: #ifdef STRINGS
188: }
189: else
190: {
191: evals(numbuf,numbuf);
192: }
193: #endif
194: n=0;
195: while(numbuf[n] != '\0' && i < PSIZE-2)
196: {
197: pbuild[i++] = numbuf[n++];
198: }
199: if(i >= PSIZE-2)
200: {
201: i = PSIZE-2; /* truncate line */
202: }
203: }
204: switch(*ptext)
205: {
206: case ';':
207: contin = 0; /* turn on line continuation */
208: *ptext++; /* bump past delim */
209: break;
210: case ',':
211: contin = 0; /* turn on line continuation */
212: /*
213: * this is a modulo count to
214: * set up field seperation
215: */
216: while((i%(PSIZE/NMFIELD)) && i < PSIZE-2)
217: pbuild[i++] = ' '; /* blank fill */
218: *ptext++;
219: break;
220: case '\0':
221: break;
222: default:
223: error(inst.thing.linno, 13); /* missing delim */
224: return(0);
225: /* bad news */
226: break;
227: }
228: skip00(); /* skip spaces and tabs */
229: }
230: if(contin && !(busflg)) /* if continuation off
231: and not a bus command */
232: {
233: if(i >= PSIZE-2)
234: i = PSIZE-2; /* truncate line at maximum */
235: pbuild[i++] = '\n'; /* put in "newline" char */
236: }
237:
238: pbuild[i] = '\0'; /* null term string */
239: /*
240: * write to terminal if fd = 1 otherwise write to file
241: */
242: #ifdef TEST
243: if(busflg)
244: {
245: ibs(busaddr,pbuild);
246: return(0);
247: }
248: #endif
249:
250: if(fd == 1)
251: printf("%s",pbuild); /* PRINT OUT THE LINE */
252: else
253: write(fd, pbuild, i);
254: return(0);
255: }
256: /*
257: *
258: * /// COPY CHARS WITHIN BALANCED PARENS TO NUMBUF ///
259: */
260: cpyprn(numbuf,txtptr,n)
261: char numbuf[];
262: char **txtptr;
263: int *n;
264: {
265: int pcnt;
266:
267: pcnt = 1;
268: numbuf[(*n)++] = *(*txtptr)++;
269: while(pcnt>0 && **txtptr != '\0')
270: {
271: switch(**txtptr)
272: {
273: case '(':
274: pcnt += 1;
275: break;
276: case ')':
277: pcnt -= 1;
278: break;
279: default:
280: break;
281: }
282: numbuf[(*n)++] = *(*txtptr)++;
283: }
284: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.