|
|
1.1 root 1: #include <stdio.h>
2:
3: /*
4: * This software is provided solely for use with
5: * the National Instruments GPIB series interfaces.
6: *
7: * Copyright 1980, 1983 National Instruments
8: *
9: * Jeffrey Kodosky
10: * REV D: 10/09/83
11: */
12:
13: extern int ibup(), gpib(), slp(), echo();
14: extern int errno;
15:
16: #define EINTR 4
17: #define NTYPES (sizeof fctn / sizeof fctn[0])
18:
19: char *fns[]= { "ibup", "gpib", "sleep", "echo" };
20:
21: int (*fctn[])()= { ibup, gpib, slp, echo };
22:
23: int maxcode[]= { 10, 16, 0 };
24:
25: struct argdef {
26: char *name, *args, *ans; };
27:
28: struct argdef echoargs[]= {
29: {"str", "S", "B"},
30: };
31:
32: struct argdef slpargs[]= {
33: {"sec", "I", "B"},
34: };
35:
36: struct argdef ibupargs[]= {
37: {"write", "ISL", "I" },
38: {"read", "IBN", "IB" },
39: {"clear", "I", "I" },
40: {"trigger", "I", "I" },
41: {"remote", "I", "I" },
42: {"local", "I", "I" },
43: {"poll", "I", "O" },
44: {"configure", "III", "I" },
45: {"passcontrol", "I", "I" },
46: {"define", "IIIIIII", "I" },
47: {"finish", "", "I" } };
48:
49: struct argdef gpibargs[]= {
50: {"command", "SL", "I" },
51: {"write", "SIL", "I" },
52: {"read", "BNII", "IB" },
53: {"transfer", "", "I" },
54: {"clear", "", "I" },
55: {"remote", "", "I" },
56: {"local", "", "I" },
57: {"parallelpoll", "", "O" },
58: {"passcontrol", "", "I" },
59: {"setstatus", "I", "I" },
60: {"monitor", "I", "I" },
61: {"readcommand", "", "O" },
62: {"setparameters", "I", "I" },
63: {"testsrq", "I", "I" },
64: {"finish", "", "I" },
65: {"status", "BN", "IT" },
66: {"spbyte", "I", "I" } };
67:
68: struct argdef *fnargs[]= { ibupargs, gpibargs, slpargs, echoargs };
69:
70: #define SIGSRQ 2
71: #define MAXLIN 256
72: #define MAXBUF 2048
73: #define MAXINT 0100000
74:
75: char lbuf[MAXBUF], ansbuf[MAXBUF], *cp;
76: int strleng, fn;
77: int argc;
78: int argv[9];
79: int code;
80:
81: main(){ int n, srqint();
82: char *atp, c, *getstr();
83:
84: signal(SIGSRQ,srqint);
85: loop: while((n=getline())>=0){
86: if(n==0) continue;
87: cp= lbuf;
88: skpspc();
89: if(*cp == 0) continue;
90: if((fn=getfn())<0) continue;
91: if((code=getcode(fn))<0) continue;
92: for(argc=0, atp=fnargs[fn][code].args; c= *atp++; )
93: switch(c){
94: case 'N':
95: if((n=getint(0))==MAXINT) goto loop;
96: if(n>MAXBUF) n= MAXBUF;
97: argv[argc++]= n;
98: break;
99: case 'I':
100: if((argv[argc++]= getint(0))==MAXINT)
101: goto loop;
102: break;
103: case 'S':
104: if((argv[argc++]= (int)getstr())==0)
105: goto loop;
106: break;
107: case 'L':
108: n = getint(1);
109: if(n == MAXINT) n = strleng;
110: argv[argc++]= n;
111: break;
112: case 'B':
113: argv[argc++]= (int)ansbuf;
114: break;
115: }
116: n= (*fctn[fn])(code,argv[0],argv[1],argv[2],argv[3],argv[4],argv[5]);
117: for(atp= fnargs[fn][code].ans; c= *atp++; )
118: switch(c){
119: case 'I': if(n<0) iberr(n, "IBIC");
120: else putd(n);
121: putchar(' '); break;
122: case 'O': if(n<0) putd(n);
123: else puto(n);
124: putchar(' '); break;
125: case 'B': put(ansbuf,n); putchar(' '); break;
126: case 'T': putt(ansbuf,n);putchar(' '); break;
127: }
128: putchar('\n');
129: } }
130:
131: srqint(){
132: puts("SRQ interrupt\n");
133: signal(SIGSRQ,srqint); }
134:
135: echo(n, a)
136: char *a;
137: {
138: return(strlen(ansbuf));
139: }
140:
141: slp(n, a)
142: {
143: printf("sleeping %d secs\n", a); fflush(stdout);
144: sleep(a);
145: return(0);
146: }
147:
148: getfn(){ int fn;char *s, **a;
149: skpspc();
150: for(fn=0, a=fns; fn<NTYPES; fn++, a++)
151: if(match(cp,*a)) break;
152: if(fn>=NTYPES){ putl("unrecognized function"); return -1; }
153: skpnspc();
154: return fn; }
155:
156: getcode(fn){ int f; struct argdef *a;
157: skpspc();
158: if(*cp>='0' && *cp<='9') f= atoi(cp);
159: else for(f=0, a=fnargs[fn]; f<=maxcode[fn]; a++, f++)
160: if(match(cp,a->name)) break;
161: if(f<0 || f>maxcode[fn]){ putl("illegal code"); return -1; }
162: skpnspc();
163: return f; }
164:
165: getint(opt){ register int i;
166: skpspc();
167: if(*cp>='0' && *cp<='9' || *cp=='-'){
168: i= atoi(cp);
169: skpnspc();
170: return i; }
171: if(!opt)putl("illegal integer argument");
172: return MAXINT; }
173:
174: char *getstr(){ char *s;
175: skpspc();
176: if(*cp++=='"'){
177: for(strleng=0, s=ansbuf; *cp && *cp!='"'; strleng++)
178: *s++= cscan();
179: skpnspc();
180: return ansbuf; }
181: putl("illegal string argument");
182: return 0; }
183:
184: skpspc()
185: {
186: while(*cp)
187: {
188: if(*cp == '#')
189: while(*++cp);
190: else if(*cp > ' ') break;
191: else cp++;
192: }
193: }
194:
195: skpnspc()
196: {
197: while(*cp>' ') cp++;
198: }
199:
200: putl(s) char *s;{
201: puts(s); putchar('\n'); }
202:
203: puts(s) char *s;{
204: while(*s) putchar(*s++); }
205:
206: put(s,i) char *s;{
207: register int c;
208: while(i-->0)
209: if((c= *s++&0377)>=' ' && c<0177)
210: putchar(c);
211: else { putchar('\\');
212: switch(c){
213: case '\r': putchar('r'); break;
214: case '\n': putchar('n'); break;
215: case '\t': putchar('t'); break;
216: case '\b': putchar('b'); break;
217: case '\014': putchar('p'); break;
218: default: putchar(((c>>6)&7) +'0');
219: putchar(((c>>3)&7) +'0');
220: putchar((c&7) +'0');
221: break;
222: } } }
223:
224: putd(n){
225: if(n<0){ putchar('-'); n= -n; }
226: putu(n); }
227:
228: putu(u) unsigned u;{
229: if(u>=10) putu(u/10);
230: putchar(u%10 + '0'); }
231:
232: puto(o){
233: if(o&0177770) puto((o>>3)&017777);
234: putchar((o&7) +'0'); }
235:
236: putt(buf,ct) char *buf;{ register int i;
237: if(ct<=0) return;
238: i= 0;
239: while(ct--){
240: if((i%8)==0) putchar('\n');
241: puto(buf[i++] & 0377);
242: putchar(' ');
243: } }
244:
245: atoi(s) char *s;{ int sign, base, n;
246: sign= 0;
247: base= 10;
248: if(*s=='-'){ sign++; s++; }
249: else if(*s=='0'){ base= 8; s++; }
250: for(n=0; *s>='0' && *s<='9'; ) n= n*base + *s++ - '0';
251: return sign? -n:n; }
252:
253: getline(){ char *s;
254: putchar(':');
255: for(s=lbuf; (*s=getchar())!='\n'; )
256: if(*s<=0)
257: if(errno==EINTR) errno= 0;
258: else return s>lbuf? s-lbuf: -1;
259: else s++;
260: *s= 0;
261: return s-lbuf; }
262:
263: match(st,s) char *st, *s;{ register char *t;
264: for(t=st; *t==*s || *t==(*s&~040); t++)
265: if(*s++==0) return 1;
266: if(t>st && *t<=' ') return 1;
267: return 0; }
268:
269: cscan(){ register int n, i;
270: if(*cp!='\\') return *cp++;
271: cp++;
272: if(*cp>='0' && *cp<='7'){
273: for(i=3, n=0; i-->0 && *cp>='0' && *cp<='7'; )
274: n= (n<<3) + *cp++ -'0';
275: return n; }
276: switch(*cp){
277: case 0: return 0;
278: case 'n': cp++; return '\n';
279: case 't': cp++; return '\t';
280: case 'r': cp++; return '\r';
281: case 'b': cp++; return '\b';
282: case 'p': cp++; return '\014';
283: default: return *cp++;
284: } }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.