|
|
1.1 root 1: #
2:
3: /*
4: * monadic epsilon and encode /rww
5: */
6:
7: #include "apl.h"
8:
9: ex_meps()
10: {
11: register struct item *p;
12: register i,j;
13: struct item *mark;
14:
15: char *a,*b,*c;
16: int dim0,dim1;
17: int xpcp;
18:
19: p = fetch1();
20: if(p->rank>2 || p->type!=CH)
21: error("execute C");
22: if(!p->size) {
23: pop();
24: push(newdat(DA,1,0));
25: return;
26: }
27: b = p->datap;
28: dim0 = p->rank<2 ? 1 : p->dim[0];
29: dim1 = p->rank<2 ? p->size : p->dim[1];
30: a = alloc(dim1+1);
31: xpcp = pcp;
32: mark = sp;
33: for(i=0; i<dim0; i++){
34: for(j=0; j<dim1; j++)
35: a[j] = b[j];
36: a[j] = '\n';
37: c = compile(a,1);
38: execute(c);
39: afree(c);
40: b =+ dim1;
41: if(i < dim0-1)
42: pop();
43: }
44: afree(a);
45: pcp = xpcp;
46: while(sp>mark)
47: dealloc(*--sp);
48: pop();
49: push(newdat(DA,1,0));
50: }
51:
52: ex_menc()
53: {
54: struct item *p;
55:
56: p = fetch1();
57: if(p->type == CH)
58: menc0();
59: else
60: menc1();
61: }
62:
63: menc0() /* dredge up a function and put it into an array*/
64: {
65: int oifile;
66: char name[NAMS];
67: char *c, *c2;
68: struct nlist *np;
69: struct item *p;
70: int len, dim0, dim1;
71: register i;
72: register char *dp;
73:
74: p = fetch1();
75: if(p->size == 0 || p->rank >1 || p->size >= NAMS)
76: error("menc C");
77: /* set up the name in search format */
78: copy(CH, p->datap, name, p->size);
79: name[p->size] = '\0';
80: /* search for name among the functions */
81: for(np = nlist; np->namep; np++)
82: if(equal(np->namep,name))
83: break;
84: /* if not found then domain error */
85: if(!np->namep)
86: error("menc D");
87: /* set up new array */
88: dim0 = 0;
89: dim1 = 0;
90: oifile = ifile;
91: ifile = dup(wfile);
92: lseek(ifile, np->label, 0); /* look up function */
93: /* compute max width and height */
94: while(c2 = c = rline(0))
95: { while(*c2++ != '\n');
96: dim0++;
97: len = c2 - c - 1;
98: dim1 = dim1 < len ? len : dim1;
99: afree(c);
100: }
101: afree(p); /* release old variable */
102: /* create new array and put function in */
103: p = newdat(CH, 2, dim0*dim1);
104: p->rank = 2;
105: p->dim[0] = dim0;
106: p->dim[1] = dim1;
107: dp = p->datap;
108: lseek(ifile, np->label, 0);
109: while(c2 = c = rline(0))
110: { for(i=0; i<dim1; i++)
111: if(*c != '\n')
112: *dp++ = *c++;
113: else
114: *dp++ = ' '; /* fill w/blanks*/
115: afree(c2);
116: }
117: /* put the new array on the stack */
118: push(p);
119: /* reset the current file */
120: ifile = oifile;
121: }
122:
123: menc1()/* change numbers into characters */
124: {
125: struct item *p, *q;
126: register i,j,numsz;
127: data *dp;
128: int total,param[4];
129:
130: /* zeroize size information vector */
131: for(i=0; i<4; i++)
132: param[i] = 0;
133: /* pick up the argument */
134: p = fetch1();
135: dp = p->datap;
136: /* find the maximum # of chars in any # */
137: for(i=0; i<p->size; i++)
138: epr1(*dp++, param);
139: numsz = param[1] + param[2] + !!param[2] + param[3] + 1;
140: /* rowsize is max # size x last dim */
141: rowsz = p->rank ? p->dim[p->rank-1] : 1;
142: rowsz *= numsz;
143: /* row size x # of rows(incl blank)*/
144: total = p->size * numsz;
145: for(j=i=0; i<p->rank; i++)
146: if(p->dim[i] != 1)
147: if(j++ > 1)
148: total =+ rowsz;
149: /* make new data and fill with blanks */
150: q = newdat(CH, 2, total);
151: q->dim[0] = total/rowsz;
152: q->dim[1] = rowsz;
153: mencptr = q->datap;
154: for(i=0; i<total; i++)
155: *mencptr++ = ' ';
156: mencptr = q->datap;
157: /* use putchar()to fill up the array */
158: mencflg = 2;
159: ex_hprint();
160: mencflg = 0;
161: /* put it on the stack */
162: push(q);
163: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.