1*8ec969ceSTreehugger Robot /*
2*8ec969ceSTreehugger Robot * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
3*8ec969ceSTreehugger Robot * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
4*8ec969ceSTreehugger Robot * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
5*8ec969ceSTreehugger Robot */
6*8ec969ceSTreehugger Robot
7*8ec969ceSTreehugger Robot /* $Header: /tmp_amd/presto/export/kbs/jutta/src/gsm/RCS/add_test.c,v 1.2 1994/05/10 20:18:17 jutta Exp $ */
8*8ec969ceSTreehugger Robot
9*8ec969ceSTreehugger Robot #ifndef _POSIX_C_SOURCE
10*8ec969ceSTreehugger Robot #define _POSIX_C_SOURCE 200809L
11*8ec969ceSTreehugger Robot #endif
12*8ec969ceSTreehugger Robot
13*8ec969ceSTreehugger Robot #include <stdio.h>
14*8ec969ceSTreehugger Robot #include <stdlib.h>
15*8ec969ceSTreehugger Robot #include <string.h>
16*8ec969ceSTreehugger Robot #include <unistd.h>
17*8ec969ceSTreehugger Robot
18*8ec969ceSTreehugger Robot #include "gsm.h"
19*8ec969ceSTreehugger Robot
20*8ec969ceSTreehugger Robot #include "../src/add.c"
21*8ec969ceSTreehugger Robot
22*8ec969ceSTreehugger Robot int interactive = 1;
23*8ec969ceSTreehugger Robot
24*8ec969ceSTreehugger Robot char * opname;
25*8ec969ceSTreehugger Robot longword L_op1, L_op2, L_expect;
26*8ec969ceSTreehugger Robot word op1, op2, expect;
27*8ec969ceSTreehugger Robot int do_expect;
28*8ec969ceSTreehugger Robot
29*8ec969ceSTreehugger Robot word M_gsm_add P((word op1, word op2));
30*8ec969ceSTreehugger Robot word M_gsm_sub P((word op1, word op2));
31*8ec969ceSTreehugger Robot word M_gsm_mult P((word op1, word op2));
32*8ec969ceSTreehugger Robot word M_gsm_mult_r P((word op1, word op2));
33*8ec969ceSTreehugger Robot word M_gsm_abs P((word op1));
34*8ec969ceSTreehugger Robot longword M_gsm_L_mult P((word op1, word op2));
35*8ec969ceSTreehugger Robot longword M_gsm_L_add P((longword op1, longword op2));
36*8ec969ceSTreehugger Robot
help()37*8ec969ceSTreehugger Robot void help()
38*8ec969ceSTreehugger Robot {
39*8ec969ceSTreehugger Robot puts( " add a b sub a b mult a b div a b" );
40*8ec969ceSTreehugger Robot puts( "L_add A B L_sub A B L_mult A B mult_r a b" );
41*8ec969ceSTreehugger Robot puts( "" );
42*8ec969ceSTreehugger Robot puts( "abs a norm a >> a b << a b" );
43*8ec969ceSTreehugger Robot puts( " L_>> A B L_<< A B" );
44*8ec969ceSTreehugger Robot }
45*8ec969ceSTreehugger Robot
46*8ec969ceSTreehugger Robot char * strtek P2((str, sep), char * str, char * sep) {
47*8ec969ceSTreehugger Robot
48*8ec969ceSTreehugger Robot static char * S = (char *)0;
49*8ec969ceSTreehugger Robot char * c, * base;
50*8ec969ceSTreehugger Robot
51*8ec969ceSTreehugger Robot if (str) S = str;
52*8ec969ceSTreehugger Robot
53*8ec969ceSTreehugger Robot if (!S || !*S) return (char *)0;
54*8ec969ceSTreehugger Robot
55*8ec969ceSTreehugger Robot /* Skip delimiters.
56*8ec969ceSTreehugger Robot */
57*8ec969ceSTreehugger Robot while (*S) {
58*8ec969ceSTreehugger Robot for (c = sep; *c && *c != *S; c++) ;
59*8ec969ceSTreehugger Robot if (*c) *S++ = 0;
60*8ec969ceSTreehugger Robot else break;
61*8ec969ceSTreehugger Robot }
62*8ec969ceSTreehugger Robot
63*8ec969ceSTreehugger Robot base = S;
64*8ec969ceSTreehugger Robot
65*8ec969ceSTreehugger Robot /* Skip non-delimiters.
66*8ec969ceSTreehugger Robot */
67*8ec969ceSTreehugger Robot for (base = S; *S; S++) {
68*8ec969ceSTreehugger Robot
69*8ec969ceSTreehugger Robot for (c = sep; *c; c++)
70*8ec969ceSTreehugger Robot if (*c == *S) {
71*8ec969ceSTreehugger Robot *S++ = 0;
72*8ec969ceSTreehugger Robot return base;
73*8ec969ceSTreehugger Robot }
74*8ec969ceSTreehugger Robot }
75*8ec969ceSTreehugger Robot
76*8ec969ceSTreehugger Robot return base == S ? (char *)0 : base;
77*8ec969ceSTreehugger Robot }
78*8ec969ceSTreehugger Robot
79*8ec969ceSTreehugger Robot long value P1((s), char * s)
80*8ec969ceSTreehugger Robot {
81*8ec969ceSTreehugger Robot switch (*s) {
82*8ec969ceSTreehugger Robot case '-': switch (s[1]) {
83*8ec969ceSTreehugger Robot case '\0': return MIN_WORD;
84*8ec969ceSTreehugger Robot case '-': return MIN_LONGWORD;
85*8ec969ceSTreehugger Robot default: break;
86*8ec969ceSTreehugger Robot }
87*8ec969ceSTreehugger Robot break;
88*8ec969ceSTreehugger Robot
89*8ec969ceSTreehugger Robot case '+': switch (s[1]) {
90*8ec969ceSTreehugger Robot case '\0': return MAX_WORD;
91*8ec969ceSTreehugger Robot case '+': return MAX_LONGWORD;
92*8ec969ceSTreehugger Robot default: break;
93*8ec969ceSTreehugger Robot }
94*8ec969ceSTreehugger Robot default: break;
95*8ec969ceSTreehugger Robot }
96*8ec969ceSTreehugger Robot
97*8ec969ceSTreehugger Robot return strtol(s, (char **)0, 0);
98*8ec969ceSTreehugger Robot }
99*8ec969ceSTreehugger Robot
100*8ec969ceSTreehugger Robot char * parse P1((buf), char * buf)
101*8ec969ceSTreehugger Robot {
102*8ec969ceSTreehugger Robot char * s, * a;
103*8ec969ceSTreehugger Robot
104*8ec969ceSTreehugger Robot if ((a = strchr(buf, '=')) != 0) *a++ = 0;
105*8ec969ceSTreehugger Robot
106*8ec969ceSTreehugger Robot opname = s = strtek(buf, " \t(");
107*8ec969ceSTreehugger Robot if (!s) return (char *)0;
108*8ec969ceSTreehugger Robot
109*8ec969ceSTreehugger Robot op1 = op2 = L_op1 = L_op2 = 0;
110*8ec969ceSTreehugger Robot
111*8ec969ceSTreehugger Robot if ((s = strtek( (char *)0, "( \t,")) != 0) {
112*8ec969ceSTreehugger Robot op1 = L_op1 = value(s);
113*8ec969ceSTreehugger Robot if ((s = strtek( (char *)0, ", \t)")) != 0)
114*8ec969ceSTreehugger Robot op2 = L_op2 = value(s);
115*8ec969ceSTreehugger Robot }
116*8ec969ceSTreehugger Robot
117*8ec969ceSTreehugger Robot if (a) {
118*8ec969ceSTreehugger Robot do_expect = 1;
119*8ec969ceSTreehugger Robot while (*a == ' ' || *a == '\t') a++;
120*8ec969ceSTreehugger Robot expect = L_expect = value(a);
121*8ec969ceSTreehugger Robot }
122*8ec969ceSTreehugger Robot
123*8ec969ceSTreehugger Robot return opname;
124*8ec969ceSTreehugger Robot }
125*8ec969ceSTreehugger Robot
126*8ec969ceSTreehugger Robot void fprint_word P2((f, w), FILE * f, word w)
127*8ec969ceSTreehugger Robot {
128*8ec969ceSTreehugger Robot if (!w) putc('0', f);
129*8ec969ceSTreehugger Robot else fprintf(f, "0x%4.4x (%d%s)",
130*8ec969ceSTreehugger Robot (unsigned int)w,
131*8ec969ceSTreehugger Robot (int)w,
132*8ec969ceSTreehugger Robot w == MIN_WORD? "/-" : (w == MAX_WORD ? "/+" : ""));
133*8ec969ceSTreehugger Robot }
134*8ec969ceSTreehugger Robot
135*8ec969ceSTreehugger Robot void print_word P1((w), word w)
136*8ec969ceSTreehugger Robot {
137*8ec969ceSTreehugger Robot fprint_word( stdout, w );
138*8ec969ceSTreehugger Robot }
139*8ec969ceSTreehugger Robot
140*8ec969ceSTreehugger Robot void fprint_longword P2((f, w), FILE * f, longword w)
141*8ec969ceSTreehugger Robot {
142*8ec969ceSTreehugger Robot if (!w) putc('0', f);
143*8ec969ceSTreehugger Robot else fprintf(f, "0x%8.8lx (%ld%s)",
144*8ec969ceSTreehugger Robot (unsigned long)w, (long)w, w == MIN_WORD ? "/-"
145*8ec969ceSTreehugger Robot : (w == MAX_WORD ? "/+"
146*8ec969ceSTreehugger Robot : (w == MIN_LONGWORD ? "/--"
147*8ec969ceSTreehugger Robot : (w == MAX_LONGWORD ? "/++" : ""))));
148*8ec969ceSTreehugger Robot }
149*8ec969ceSTreehugger Robot
150*8ec969ceSTreehugger Robot void print_longword P1((w),longword w)
151*8ec969ceSTreehugger Robot {
152*8ec969ceSTreehugger Robot fprint_longword(stdout, w);
153*8ec969ceSTreehugger Robot }
154*8ec969ceSTreehugger Robot
155*8ec969ceSTreehugger Robot void do_longword P1((w), longword w)
156*8ec969ceSTreehugger Robot {
157*8ec969ceSTreehugger Robot if (interactive) print_longword(w);
158*8ec969ceSTreehugger Robot if (do_expect) {
159*8ec969ceSTreehugger Robot if ((w & 0xfffffffful) != (L_expect & 0xfffffffful)) {
160*8ec969ceSTreehugger Robot if (!interactive) fprint_longword(stderr, w);
161*8ec969ceSTreehugger Robot fprintf(stderr, " != %s (%ld, %ld) -- expected ",
162*8ec969ceSTreehugger Robot opname, (long)L_op1, (long)L_op2 );
163*8ec969ceSTreehugger Robot fprint_longword(stderr, L_expect);
164*8ec969ceSTreehugger Robot putc( '\n', stderr );
165*8ec969ceSTreehugger Robot }
166*8ec969ceSTreehugger Robot } else if (interactive) putchar('\n');
167*8ec969ceSTreehugger Robot }
168*8ec969ceSTreehugger Robot
169*8ec969ceSTreehugger Robot void do_word P1((w), word w )
170*8ec969ceSTreehugger Robot {
171*8ec969ceSTreehugger Robot if (interactive) print_word(w);
172*8ec969ceSTreehugger Robot if (do_expect) {
173*8ec969ceSTreehugger Robot if (w != expect) {
174*8ec969ceSTreehugger Robot if (!interactive) fprint_word(stderr, w);
175*8ec969ceSTreehugger Robot fprintf(stderr, " != %s (%ld, %ld) -- expected ",
176*8ec969ceSTreehugger Robot opname, (long)L_op1, (long)L_op2 );
177*8ec969ceSTreehugger Robot fprint_word(stderr, expect);
178*8ec969ceSTreehugger Robot putc('\n', stderr);
179*8ec969ceSTreehugger Robot }
180*8ec969ceSTreehugger Robot } else if (interactive) putchar('\n');
181*8ec969ceSTreehugger Robot }
182*8ec969ceSTreehugger Robot
main(ac,av)183*8ec969ceSTreehugger Robot int main(ac, av) char ** av;
184*8ec969ceSTreehugger Robot {
185*8ec969ceSTreehugger Robot char buf[299];
186*8ec969ceSTreehugger Robot char * c;
187*8ec969ceSTreehugger Robot FILE * in;
188*8ec969ceSTreehugger Robot
189*8ec969ceSTreehugger Robot if (ac > 2) {
190*8ec969ceSTreehugger Robot fprintf(stderr, "Usage: %s [filename]\n", av[0]);
191*8ec969ceSTreehugger Robot fail:
192*8ec969ceSTreehugger Robot #ifdef EXIT_FAILURE
193*8ec969ceSTreehugger Robot exit(EXIT_FAILURE);
194*8ec969ceSTreehugger Robot #else
195*8ec969ceSTreehugger Robot exit(1);
196*8ec969ceSTreehugger Robot #endif
197*8ec969ceSTreehugger Robot }
198*8ec969ceSTreehugger Robot if (ac < 2) in = stdin;
199*8ec969ceSTreehugger Robot else if (!(in = fopen(av[1], "r"))) {
200*8ec969ceSTreehugger Robot perror(av[1]);
201*8ec969ceSTreehugger Robot fprintf(stderr, "%s: cannot open file \"%s\" for reading\n",
202*8ec969ceSTreehugger Robot av[0], av[1]);
203*8ec969ceSTreehugger Robot goto fail;
204*8ec969ceSTreehugger Robot }
205*8ec969ceSTreehugger Robot
206*8ec969ceSTreehugger Robot interactive = isatty(fileno(in));
207*8ec969ceSTreehugger Robot
208*8ec969ceSTreehugger Robot for (;;) {
209*8ec969ceSTreehugger Robot if (interactive) fprintf(stderr, "? ");
210*8ec969ceSTreehugger Robot
211*8ec969ceSTreehugger Robot if (!fgets(buf, sizeof(buf), in)) exit(0);
212*8ec969ceSTreehugger Robot if ((c = strchr(buf, '\n')) != 0) *c = 0;
213*8ec969ceSTreehugger Robot
214*8ec969ceSTreehugger Robot if (*buf == ';' || *buf == '#') continue;
215*8ec969ceSTreehugger Robot if (*buf == '\'') {
216*8ec969ceSTreehugger Robot puts(buf + 1);
217*8ec969ceSTreehugger Robot continue;
218*8ec969ceSTreehugger Robot }
219*8ec969ceSTreehugger Robot if (*buf == '\"') {
220*8ec969ceSTreehugger Robot fprintf(stderr, "%s\n", buf + 1);
221*8ec969ceSTreehugger Robot continue;
222*8ec969ceSTreehugger Robot }
223*8ec969ceSTreehugger Robot
224*8ec969ceSTreehugger Robot c = parse(buf);
225*8ec969ceSTreehugger Robot
226*8ec969ceSTreehugger Robot if (!c) continue;
227*8ec969ceSTreehugger Robot if (!strcmp(c, "add")) {
228*8ec969ceSTreehugger Robot do_word( gsm_add( op1, op2 ));
229*8ec969ceSTreehugger Robot continue;
230*8ec969ceSTreehugger Robot }
231*8ec969ceSTreehugger Robot if (!strcmp(c, "M_add")) {
232*8ec969ceSTreehugger Robot do_word( M_gsm_add( op1, op2 ));
233*8ec969ceSTreehugger Robot continue;
234*8ec969ceSTreehugger Robot }
235*8ec969ceSTreehugger Robot if (!strcmp(c, "sub")) {
236*8ec969ceSTreehugger Robot do_word( gsm_sub( op1, op2 ));
237*8ec969ceSTreehugger Robot continue;
238*8ec969ceSTreehugger Robot }
239*8ec969ceSTreehugger Robot if (!strcmp(c, "M_sub")) {
240*8ec969ceSTreehugger Robot do_word( M_gsm_sub( op1, op2 ));
241*8ec969ceSTreehugger Robot continue;
242*8ec969ceSTreehugger Robot }
243*8ec969ceSTreehugger Robot if (!strcmp(c, "mult")) {
244*8ec969ceSTreehugger Robot do_word( gsm_mult( op1, op2 ));
245*8ec969ceSTreehugger Robot continue;
246*8ec969ceSTreehugger Robot }
247*8ec969ceSTreehugger Robot if (!strcmp(c, "M_mult")) {
248*8ec969ceSTreehugger Robot do_word( M_gsm_mult( op1, op2 ));
249*8ec969ceSTreehugger Robot continue;
250*8ec969ceSTreehugger Robot }
251*8ec969ceSTreehugger Robot if (!strcmp(c, "mult_r")) {
252*8ec969ceSTreehugger Robot do_word( gsm_mult_r(op1, op2));
253*8ec969ceSTreehugger Robot continue;
254*8ec969ceSTreehugger Robot }
255*8ec969ceSTreehugger Robot if (!strcmp(c, "M_mult_r")) {
256*8ec969ceSTreehugger Robot do_word( M_gsm_mult_r(op1, op2));
257*8ec969ceSTreehugger Robot continue;
258*8ec969ceSTreehugger Robot }
259*8ec969ceSTreehugger Robot if (!strcmp(c, "abs" )) {
260*8ec969ceSTreehugger Robot do_word( gsm_abs(op1) );
261*8ec969ceSTreehugger Robot continue;
262*8ec969ceSTreehugger Robot }
263*8ec969ceSTreehugger Robot if (!strcmp(c, "M_abs" )) {
264*8ec969ceSTreehugger Robot do_word( M_gsm_abs(op1) );
265*8ec969ceSTreehugger Robot continue;
266*8ec969ceSTreehugger Robot }
267*8ec969ceSTreehugger Robot if (!strcmp(c, "div" )) {
268*8ec969ceSTreehugger Robot do_word( gsm_div( op1, op2 ));
269*8ec969ceSTreehugger Robot continue;
270*8ec969ceSTreehugger Robot }
271*8ec969ceSTreehugger Robot if (!strcmp(c, "norm" )) {
272*8ec969ceSTreehugger Robot do_word( gsm_norm(L_op1));
273*8ec969ceSTreehugger Robot continue;
274*8ec969ceSTreehugger Robot }
275*8ec969ceSTreehugger Robot if (!strcmp(c, "<<" )) {
276*8ec969ceSTreehugger Robot do_word( gsm_asl( op1, op2));
277*8ec969ceSTreehugger Robot continue;
278*8ec969ceSTreehugger Robot }
279*8ec969ceSTreehugger Robot if (!strcmp(c, ">>" )) {
280*8ec969ceSTreehugger Robot do_word( gsm_asr( op1, op2 ));
281*8ec969ceSTreehugger Robot continue;
282*8ec969ceSTreehugger Robot }
283*8ec969ceSTreehugger Robot if (!strcmp(c, "L_mult")) {
284*8ec969ceSTreehugger Robot do_longword( gsm_L_mult( op1, op2 ));
285*8ec969ceSTreehugger Robot continue;
286*8ec969ceSTreehugger Robot }
287*8ec969ceSTreehugger Robot if (!strcmp(c, "M_L_mult")) {
288*8ec969ceSTreehugger Robot do_longword( M_gsm_L_mult( op1, op2 ));
289*8ec969ceSTreehugger Robot continue;
290*8ec969ceSTreehugger Robot }
291*8ec969ceSTreehugger Robot if (!strcmp(c, "L_add" )) {
292*8ec969ceSTreehugger Robot do_longword( gsm_L_add( L_op1, L_op2 ));
293*8ec969ceSTreehugger Robot continue;
294*8ec969ceSTreehugger Robot }
295*8ec969ceSTreehugger Robot if (!strcmp(c, "M_L_add" )) {
296*8ec969ceSTreehugger Robot do_longword( M_gsm_L_add( L_op1, L_op2 ));
297*8ec969ceSTreehugger Robot continue;
298*8ec969ceSTreehugger Robot }
299*8ec969ceSTreehugger Robot if (!strcmp(c, "L_sub" )) {
300*8ec969ceSTreehugger Robot do_longword( gsm_L_sub( L_op1, L_op2 ));
301*8ec969ceSTreehugger Robot continue;
302*8ec969ceSTreehugger Robot }
303*8ec969ceSTreehugger Robot if (!strcmp(c, "L_<<" )) {
304*8ec969ceSTreehugger Robot do_longword( gsm_L_asl( L_op1, L_op2 ));
305*8ec969ceSTreehugger Robot continue;
306*8ec969ceSTreehugger Robot }
307*8ec969ceSTreehugger Robot if (!strcmp(c, "L_>>")) {
308*8ec969ceSTreehugger Robot do_longword( gsm_L_asr( L_op1, L_op2 ));
309*8ec969ceSTreehugger Robot continue;
310*8ec969ceSTreehugger Robot }
311*8ec969ceSTreehugger Robot help();
312*8ec969ceSTreehugger Robot }
313*8ec969ceSTreehugger Robot }
314*8ec969ceSTreehugger Robot
315*8ec969ceSTreehugger Robot #include "private.h"
316*8ec969ceSTreehugger Robot
317*8ec969ceSTreehugger Robot /*
318*8ec969ceSTreehugger Robot * Function stubs for macro implementations of commonly used
319*8ec969ceSTreehugger Robot * math functions
320*8ec969ceSTreehugger Robot */
321*8ec969ceSTreehugger Robot word M_gsm_add P2((op1, op2),word op1, word op2)
322*8ec969ceSTreehugger Robot {
323*8ec969ceSTreehugger Robot longword ltmp;
324*8ec969ceSTreehugger Robot return GSM_ADD(op1, op2);
325*8ec969ceSTreehugger Robot }
326*8ec969ceSTreehugger Robot
327*8ec969ceSTreehugger Robot word M_gsm_sub P2((op1, op2), word op1, word op2)
328*8ec969ceSTreehugger Robot {
329*8ec969ceSTreehugger Robot longword ltmp;
330*8ec969ceSTreehugger Robot return GSM_SUB(op1, op2);
331*8ec969ceSTreehugger Robot }
332*8ec969ceSTreehugger Robot
333*8ec969ceSTreehugger Robot word M_gsm_mult P2((op1, op2), word op1, word op2)
334*8ec969ceSTreehugger Robot {
335*8ec969ceSTreehugger Robot return GSM_MULT(op1, op2);
336*8ec969ceSTreehugger Robot }
337*8ec969ceSTreehugger Robot
338*8ec969ceSTreehugger Robot word M_gsm_mult_r P2((op1, op2), word op1, word op2)
339*8ec969ceSTreehugger Robot {
340*8ec969ceSTreehugger Robot return GSM_MULT_R(op1, op2);
341*8ec969ceSTreehugger Robot }
342*8ec969ceSTreehugger Robot
343*8ec969ceSTreehugger Robot word M_gsm_abs P1((op1), word op1)
344*8ec969ceSTreehugger Robot {
345*8ec969ceSTreehugger Robot return GSM_ABS(op1);
346*8ec969ceSTreehugger Robot }
347*8ec969ceSTreehugger Robot
348*8ec969ceSTreehugger Robot longword M_gsm_L_mult P2((op1, op2), word op1, word op2)
349*8ec969ceSTreehugger Robot {
350*8ec969ceSTreehugger Robot return GSM_L_MULT(op1, op2);
351*8ec969ceSTreehugger Robot }
352*8ec969ceSTreehugger Robot
353*8ec969ceSTreehugger Robot longword M_gsm_L_add P2((op1, op2), longword op1, longword op2)
354*8ec969ceSTreehugger Robot {
355*8ec969ceSTreehugger Robot ulongword utmp;
356*8ec969ceSTreehugger Robot return GSM_L_ADD(op1, op2);
357*8ec969ceSTreehugger Robot }
358