2 * Copyright (C) 1991,1992 Erik Schoenfelder (schoenfr@ibr.cs.tu-bs.de)
4 * This file is part of NASE A60.
6 * NASE A60 is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2, or (at your option)
11 * NASE A60 is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with NASE A60; see the file COPYING. If not, write to the Free
18 * Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
22 * Erik Schoenfelder (schoenfr@ibr.cs.tu-bs.de)
37 * include common stuff:
39 #include "a60-mkc.inc"
41 /* and clear the flag: */
46 * the predefind functions (procs):
60 printf ("** builtin PI called.\n");
63 for (cb=act_cblock; cb && cb->block != sym->block; cb=cb->next)
66 if (!cb || ! cb->block || ! cb->activ)
67 xabort ("INTERNAL: bltin_pi: no block or activation");
69 data = (cb->activ)[sym->actidx].data;
71 data->u.val->u.rval = M_PI;
72 data->u.val->valid = 1;
78 bltin_rand (sym, nparm)
87 printf ("** builtin rand called.\n");
90 for (cb=act_cblock; cb && cb->block != sym->block; cb=cb->next)
93 if (!cb || ! cb->block || ! cb->activ)
94 xabort ("INTERNAL: bltin_rand: no block or activation");
96 data = (cb->activ)[sym->actidx].data;
98 data->u.val->u.rval = b_rand ();
99 data->u.val->valid = 1;
104 * hmmm - the vprint proc; this one with a variable number of arguments.
110 bltin_vprint (sym, nparm)
121 printf ("** builtin vprint called (%d arguments).\n", nparm);
126 if (!cb || ! cb->block || ! cb->activ) {
127 /* no activation means no parameter -> newline only. */
132 for (i=0; i<nparm; i++) {
133 data = (cb->activ)[i].data;
134 do_eval_pexpr (& data->u.pexpr);
135 DO_DEREF(data->u.pexpr.expr->source,
136 data->u.pexpr.expr->lineno);
139 if (ev.tag == ev_ival) {
140 printf (" %15ld ", ev.u.ival);
142 else if (ev.tag == ev_rval) {
145 * printf ("%g", - 0.0) gives: -0
146 * may be a ``Klassiker'' by sun only...
147 * i like to prevent this:
149 if (ev.u.rval == 0.0)
150 ev.u.rval = (int) ev.u.rval;
152 printf (" %15.7e ", ev.u.rval);
154 else if (ev.tag == ev_string) {
155 printf ("%s", ev.u.string);
157 else if (ev.tag == ev_bool) {
158 printf (" %s ", (ev.u.bool) ? "T" : "F");
161 a60_error (ev.source, ev.lineno,
162 "vprint cannot handle parameter of type `%s'\n",
163 eval_tag_name[ev.tag]);
164 xabort ("runtime error");
176 bltin_outreal (sym, nparm)
181 DATA *chandata, *valdata;
187 printf ("** builtin outreal called.\n");
192 if (!cb || ! cb->block || ! cb->activ)
193 xabort ("INTERNAL: bltin_outreal: no block or activation");
195 chandata = (cb->activ)[0].data;
196 valdata = (cb->activ)[1].data;
198 chan = chandata->u.val->u.ival;
199 val = valdata->u.val->u.rval;
203 printf ("** bltin_outreal: chan %d; value %g\n",
207 b_outreal (chan, val);
213 bltin_outinteger (sym, nparm)
222 printf ("** builtin outinteger called.\n");
227 if (!cb || ! cb->block || ! cb->activ)
228 xabort ("INTERNAL: bltin_outinteger: no block or activation");
230 chan = (cb->activ)[0].data->u.val->u.ival;
231 val = (cb->activ)[1].data->u.val->u.ival;
235 printf ("** bltin_outinteger: chan %ld; value %ld\n",
239 b_outint (chan, val);
245 bltin_outstring (sym, nparm)
257 printf ("** builtin outstring called.\n");
262 if (!cb || ! cb->block || ! cb->activ)
263 xabort ("INTERNAL: bltin_outstring: no block or activation");
265 chan = (cb->activ)[0].data->u.val->u.ival;
266 pexpr = & (cb->activ)[1].data->u.pexpr;
267 do_eval_pexpr (pexpr);
269 if (ev.tag != ev_string) {
270 a60_error (ev.source, ev.lineno,
271 "actual parameter does not match formal\n");
272 xabort ("runtime error");
278 printf ("** bltin_outstring: chan %ld; value %s\n",
279 chan, (val) ? val : "");
281 b_outstr (chan, val);
287 bltin_outsymbol (sym, nparm)
299 printf ("** builtin outsymbol called.\n");
304 if (!cb || ! cb->block || ! cb->activ)
305 xabort ("INTERNAL: bltin_outsymbol: no block or activation");
307 chan = (cb->activ)[0].data->u.val->u.ival;
308 idx = (cb->activ)[2].data->u.val->u.ival;
310 pexpr = & (cb->activ)[1].data->u.pexpr;
311 do_eval_pexpr (pexpr);
313 if (ev.tag != ev_string) {
314 a60_error (ev.source, ev.lineno,
315 "actual parameter does not match formal\n");
316 xabort ("runtime error");
322 printf ("** bltin_outsymbol: chan %ld; str %s; idx %ld\n",
323 chan, (val) ? val : "", idx);
326 b_outsym (chan, val, idx);
332 bltin_insymbol (sym, nparm)
344 printf ("** builtin insymbol called.\n");
349 if (!cb || ! cb->block || ! cb->activ)
350 xabort ("INTERNAL: bltin_insymbol: no block or activation");
352 chan = (cb->activ)[0].data->u.val->u.ival;
354 pexpr = & (cb->activ)[1].data->u.pexpr;
355 do_eval_pexpr (pexpr);
357 if (ev.tag != ev_string) {
358 a60_error (ev.source, ev.lineno,
359 "actual parameter does not match formal\n");
360 xabort ("runtime error");
366 printf ("** bltin_insymbol: chan %ld; str %s:\n",
367 chan, (str) ? str : "");
371 xabort ("xa60: insymbol: cannot send input - sorry.");
376 val = b_insym (chan, str);
380 printf ("** bltin_insymbol: val %ld\n", val);
383 pexpr = & (cb->activ)[2].data->u.pexpr;
384 do_eval_pexpr (pexpr);
386 evp = PUSH_EVALST ("internal", 0, ev_ival);
395 bltin_inreal (sym, nparm)
407 printf ("** builtin inreal called.\n");
412 if (!cb || ! cb->block || ! cb->activ)
413 xabort ("INTERNAL: bltin_inreal: no block or activation");
415 chan = (cb->activ)[0].data->u.val->u.ival;
418 printf ("** bltin_inreal: chan %ld;\n", chan);
422 xabort ("xa60: inreal: cannot send input - sorry.");
427 val = b_inreal (chan);
431 printf ("** bltin_inreal: val %e\n", val);
434 pexpr = & (cb->activ)[1].data->u.pexpr;
435 do_eval_pexpr (pexpr);
437 evp = PUSH_EVALST ("internal", 0, ev_rval);
446 bltin_length (sym, nparm)
459 printf ("** builtin length called.\n");
464 if (!cb || ! cb->block || ! cb->activ)
465 xabort ("INTERNAL: bltin_length: no block or activation");
467 pexpr = & (cb->activ)[0].data->u.pexpr;
468 do_eval_pexpr (pexpr);
470 if (ev.tag != ev_string) {
471 a60_error (ev.source, ev.lineno,
472 "actual parameter does not match formal\n");
473 xabort ("runtime error");
479 printf ("** bltin_length: string `%s'\n", (val) ? val : "");
482 len = b_length (val);
485 * now assign the return value:
488 for (cb=act_cblock; cb && cb->block != sym->block; cb=cb->next)
491 if (!cb || ! cb->block || ! cb->activ)
492 xabort ("INTERNAL: bltin_length: no block or activation");
494 data = (cb->activ)[sym->actidx].data;
496 data->u.val->u.ival = len;
497 data->u.val->valid = 1;
503 bltin_print (sym, nparm)
513 printf ("** builtin print called.\n");
518 if (!cb || ! cb->block || ! cb->activ)
519 xabort ("INTERNAL: bltin_print: no block or activation");
521 val = (cb->activ)[0].data->u.val->u.rval;
522 f1 = (cb->activ)[1].data->u.val->u.ival;
523 f2 = (cb->activ)[2].data->u.val->u.ival;
527 printf ("** bltin_print: val %g; format: %ld %ld\n",
531 b_print (val, f1, f2);
540 bltin_write (sym, nparm)
551 printf ("** builtin write called.\n");
556 if (!cb || ! cb->block || ! cb->activ)
557 xabort ("INTERNAL: bltin_write: no block or activation");
559 pexpr = & (cb->activ)[0].data->u.pexpr;
560 do_eval_pexpr (pexpr);
562 if (ev.tag != ev_string) {
563 a60_error (ev.source, ev.lineno,
564 "actual parameter does not match formal\n");
565 xabort ("runtime error");
575 * get the parameter of the function and the data space for the
580 get_val_and_rdata (sym, val_data, ret_data)
582 DATA **val_data, **ret_data;
589 printf ("** builtin func `%s' called.\n", sym->name);
594 if (! cb || ! cb->block || ! cb->activ)
595 xabort ("INTERNAL: get_val_and_rdata: no block or activation");
597 data = (cb->activ)[0].data;
601 * now get the return data space:
604 for (cb=act_cblock; cb && cb->block != sym->block; cb=cb->next)
607 if (! cb || ! cb->block || ! cb->activ)
608 xabort ("INTERNAL: get_val_and_rdata: no block or activation");
610 data = (cb->activ)[sym->actidx].data;
617 * builtin real functions:
620 #define BLTIN_MATH_HEAD(b) \
627 DATA *val_data, *ret_data; \
630 get_val_and_rdata (sym, &val_data, &ret_data); \
631 x = val_data->u.val->u.rval;
633 #define BLTIN_MATH_TAIL \
634 ret_data->u.val->u.rval = x; \
635 ret_data->u.val->valid = 1; \
641 * and now the bltin functions:
644 BLTIN_MATH_HEAD(bltin_abs)
649 BLTIN_MATH_HEAD(bltin_sqrt)
651 a60_error (sym->source, sym->lineno,
652 "argument of sqrt is negative (%g).\n", x);
653 xabort ("runtime error");
658 BLTIN_MATH_HEAD(bltin_sin)
662 BLTIN_MATH_HEAD(bltin_cos)
666 BLTIN_MATH_HEAD(bltin_arctan)
670 BLTIN_MATH_HEAD(bltin_ln)
672 a60_error (sym->source, sym->lineno,
673 "argument of log is negative (%g).\n", x);
674 xabort ("runtime error");
679 BLTIN_MATH_HEAD(bltin_exp)
690 bltin_sign (sym, nparm)
694 DATA *val_data, *ret_data; double x;
697 if (do_debug) printf ("* bltin sign called ...\n");
699 get_val_and_rdata (sym, &val_data, &ret_data);
700 x = val_data->u.val->u.rval;
702 ret_data->u.val->u.ival = b_sign (x);
703 ret_data->u.val->valid = 1;
713 bltin_entier (sym, nparm)
717 DATA *val_data, *ret_data; double x;
720 if (do_debug) printf ("* bltin entier called ...\n");
723 get_val_and_rdata (sym, &val_data, &ret_data);
724 x = val_data->u.val->u.rval;
726 ret_data->u.val->u.ival = b_entier (x);
727 ret_data->u.val->valid = 1;
733 * init the predefined symbols;
737 init_new_symbol (name, type, bltin)
742 PPROC *new = TALLOC (PPROC);
743 SYMTAB *psym = new_symbol (name, type, s_defined);
744 psym->source = "<internal>";
746 examine_and_append_symtab (current_scope->symtab, psym);
747 psym->block = current_scope->block;
751 psym->u.pproc->nparm = 0;
752 psym->u.pproc->block = current_scope->block;
754 psym->u.pproc->bltin = bltin;
755 close_current_scope ();
761 init_parmsym (name, type, tag)
766 SYMTAB *new = new_symbol (name, type, tag);
773 * initialize builtin function `PI':
775 * 'real' 'procedure' PI;
785 sym = init_new_symbol ("PI", ty_real_proc, bltin_pi);
786 sym->u.pproc->block->nact = 0;
791 * initialize build in function `rand':
793 * 'real' 'procedure' rand;
803 sym = init_new_symbol ("rand", ty_real_proc, bltin_rand);
804 sym->u.pproc->block->nact = 0;
809 * initialize builtin function `print':
811 * 'procedure' printf (....);
820 sym = init_new_symbol ("vprint", ty_proc, bltin_vprint);
821 sym->u.pproc->nparm = -1;
826 * initialize builtin function `outreal':
828 * 'procedure' outreal (channel, value);
829 * 'value' channel, value;
839 SYMTAB *sym, *parmsym;
841 sym = init_new_symbol ("outreal", ty_proc, bltin_outreal);
842 parmsym = init_parmsym ("channel", ty_integer, s_byvalue);
843 parmsym->block = sym->u.pproc->block;
844 parmsym->next = init_parmsym ("source", ty_real, s_byvalue);
845 parmsym->next->block = sym->u.pproc->block;
846 set_actidx (parmsym);
847 sym->u.pproc->block->symtab = parmsym;
848 sym->u.pproc->block->nact = 2;
849 sym->u.pproc->nparm = 2;
854 * initialize builtin function `outinteger':
856 * 'procedure' outinteger (channel, value);
857 * 'value' channel, value;
858 * 'integer' channel, value;
866 SYMTAB *sym, *parmsym;
868 sym = init_new_symbol ("outinteger", ty_proc, bltin_outinteger);
869 parmsym = init_parmsym ("channel", ty_integer, s_byvalue);
870 parmsym->block = sym->u.pproc->block;
871 parmsym->next = init_parmsym ("source", ty_integer, s_byvalue);
872 parmsym->next->block = sym->u.pproc->block;
873 set_actidx (parmsym);
874 sym->u.pproc->block->symtab = parmsym;
875 sym->u.pproc->block->nact = 2;
876 sym->u.pproc->nparm = 2;
881 * initialize builtin function `outstring':
883 * 'procedure' outstring (channel, value);
894 SYMTAB *sym, *parmsym;
896 sym = init_new_symbol ("outstring", ty_proc, bltin_outstring);
897 parmsym = init_parmsym ("channel", ty_integer, s_byvalue);
898 parmsym->block = sym->u.pproc->block;
899 parmsym->next = init_parmsym ("source", ty_string, s_byname);
900 parmsym->next->block = sym->u.pproc->block;
901 set_actidx (parmsym);
902 sym->u.pproc->block->symtab = parmsym;
903 sym->u.pproc->block->nact = 2;
904 sym->u.pproc->nparm = 2;
909 * initialize builtin function `outsymbol':
911 * 'procedure' outsymbol (channel, string, source);
912 * 'value' channel, source;
913 * 'integer' channel, source;
922 SYMTAB *sym, *parmsym;
924 sym = init_new_symbol ("outsymbol", ty_proc, bltin_outsymbol);
925 parmsym = init_parmsym ("channel", ty_integer, s_byvalue);
926 parmsym->block = sym->u.pproc->block;
927 parmsym->next = init_parmsym ("string", ty_string, s_byname);
928 parmsym->next->block = sym->u.pproc->block;
929 parmsym->next->next = init_parmsym ("source", ty_integer, s_byvalue);
930 parmsym->next->next->block = sym->u.pproc->block;
931 set_actidx (parmsym);
932 sym->u.pproc->block->symtab = parmsym;
933 sym->u.pproc->block->nact = 3;
934 sym->u.pproc->nparm = 3;
939 * initialize builtin fucntion `insymbol':
941 * 'integer' 'procedure' insymbol (channel, string, value);
943 * 'integer' channel, value;
952 SYMTAB *sym, *parmsym;
954 sym = init_new_symbol ("insymbol", ty_proc, bltin_insymbol);
955 parmsym = init_parmsym ("channel", ty_integer, s_byvalue);
956 parmsym->block = sym->u.pproc->block;
957 parmsym->next = init_parmsym ("string", ty_string, s_byname);
958 parmsym->next->block = sym->u.pproc->block;
959 parmsym->next->next = init_parmsym ("value", ty_integer, s_byname);
960 parmsym->next->next->block = sym->u.pproc->block;
961 set_actidx (parmsym);
962 sym->u.pproc->block->symtab = parmsym;
963 sym->u.pproc->block->nact = 3;
964 sym->u.pproc->nparm = 3;
969 * initialize builtin fucntion `inreal':
971 * 'procedure' inreal (channel, value);
982 SYMTAB *sym, *parmsym;
984 sym = init_new_symbol ("inreal", ty_proc, bltin_inreal);
985 parmsym = init_parmsym ("channel", ty_integer, s_byvalue);
986 parmsym->block = sym->u.pproc->block;
987 parmsym->next = init_parmsym ("value", ty_real, s_byname);
988 parmsym->next->block = sym->u.pproc->block;
989 set_actidx (parmsym);
990 sym->u.pproc->block->symtab = parmsym;
991 sym->u.pproc->block->nact = 2;
992 sym->u.pproc->nparm = 2;
997 * initialize builtin function `print':
999 * 'procedure' print (value, f1, f2);
1000 * 'value' value, f1, f2;
1009 SYMTAB *sym, *parmsym;
1011 sym = init_new_symbol ("print", ty_proc, bltin_print);
1012 parmsym = init_parmsym ("value", ty_real, s_byvalue);
1013 parmsym->block = sym->u.pproc->block;
1014 parmsym->next = init_parmsym ("f1", ty_integer, s_byvalue);
1015 parmsym->next->block = sym->u.pproc->block;
1016 parmsym->next->next = init_parmsym ("f2", ty_integer, s_byvalue);
1017 parmsym->next->next->block = sym->u.pproc->block;
1018 set_actidx (parmsym);
1019 sym->u.pproc->block->symtab = parmsym;
1020 sym->u.pproc->block->nact = 3;
1021 sym->u.pproc->nparm = 3;
1026 * initialize builtin function `length':
1028 * 'integer' 'procedure' length (string);
1037 SYMTAB *sym, *parmsym;
1039 sym = init_new_symbol ("length", ty_int_proc, bltin_length);
1040 parmsym = init_parmsym ("string", ty_string, s_byname);
1041 parmsym->block = sym->u.pproc->block;
1042 set_actidx (parmsym);
1043 sym->u.pproc->block->symtab = parmsym;
1044 sym->u.pproc->block->nact = 1;
1045 sym->u.pproc->nparm = 1;
1050 * initialize build-in function `write':
1052 * 'integer' 'procedure' write (string);
1060 SYMTAB *sym, *parmsym;
1062 sym = init_new_symbol ("write", ty_proc, bltin_write);
1063 parmsym = init_parmsym ("string", ty_string, s_byname);
1064 parmsym->block = sym->u.pproc->block;
1065 set_actidx (parmsym);
1066 sym->u.pproc->block->symtab = parmsym;
1067 sym->u.pproc->block->nact = 1;
1068 sym->u.pproc->nparm = 1;
1073 * initialize the bltin simple functions:
1075 * <value> 'procedure' func (x);
1080 * this is for abs(), sign(), sqrt(), sin(), cos(), arctan(),
1084 #define INIT_SFUNC(f,s,rty,ty,b) \
1088 SYMTAB *sym, *parmsym; \
1090 sym = init_new_symbol (s, rty, b); \
1091 parmsym = init_parmsym ("value", ty, s_byvalue); \
1092 parmsym->block = sym->u.pproc->block; \
1093 set_actidx (parmsym); \
1094 sym->u.pproc->block->symtab = parmsym; \
1095 sym->u.pproc->block->nact = 1; \
1096 sym->u.pproc->nparm = 1; \
1099 INIT_SFUNC(init_entier, "entier", ty_int_proc, ty_real, bltin_entier)
1100 INIT_SFUNC(init_abs, "abs", ty_real_proc, ty_real, bltin_abs)
1101 INIT_SFUNC(init_sign, "sign", ty_int_proc, ty_real, bltin_sign)
1102 INIT_SFUNC(init_sqrt, "sqrt", ty_real_proc, ty_real, bltin_sqrt)
1103 INIT_SFUNC(init_sin, "sin", ty_real_proc, ty_real, bltin_sin)
1104 INIT_SFUNC(init_cos, "cos", ty_real_proc, ty_real, bltin_cos)
1105 INIT_SFUNC(init_arctan, "arctan", ty_real_proc, ty_real, bltin_arctan)
1106 INIT_SFUNC(init_ln, "ln", ty_real_proc, ty_real, bltin_ln)
1107 INIT_SFUNC(init_exp, "exp", ty_real_proc, ty_real, bltin_exp)
1136 /* end of bltin.c */