funcs.c.3
上传用户:upcnvip
上传日期:2007-01-06
资源大小:474k
文件大小:41k
源码类别:

编译器/解释器

开发平台:

C/C++

  1.     ex2 = p_expr(tp_str255);
  2.     skipcloseparen();
  3.     return makestmt_assign(ex, makeexpr_concat(copyexpr(ex), ex2, 0));
  4. }
  5. Static Stmt *proc_strdelete()
  6. {
  7.     Meaning *tvar = NULL, *tvari;
  8.     Expr *ex, *ex2, *ex3, *ex4, *exi, *exn;
  9.     Stmt *sp;
  10.     if (!skipopenparen())
  11. return NULL;
  12.     ex = p_expr(tp_str255);
  13.     if (!skipcomma())
  14. return NULL;
  15.     exi = p_expr(tp_integer);
  16.     if (curtok == TOK_COMMA) {
  17. gettok();
  18. exn = p_expr(tp_integer);
  19.     } else
  20. exn = makeexpr_long(1);
  21.     skipcloseparen();
  22.     if (exprspeed(exi) < 5 && nosideeffects(exi, 0))
  23.         sp = NULL;
  24.     else {
  25.         tvari = makestmttempvar(tp_int, name_TEMP);
  26.         sp = makestmt_assign(makeexpr_var(tvari), exi);
  27.         exi = makeexpr_var(tvari);
  28.     }
  29.     ex3 = bumpstring(copyexpr(ex), copyexpr(exi), 1);
  30.     ex4 = bumpstring(copyexpr(ex), makeexpr_plus(exi, exn), 1);
  31.     if (strcpyleft) {
  32.         ex2 = ex3;
  33.     } else {
  34.         tvar = makestmttempvar(tp_str255, name_STRING);
  35.         ex2 = makeexpr_var(tvar);
  36.     }
  37.     sp = makestmt_seq(sp, makestmt_assign(ex2, ex4));
  38.     if (!strcpyleft)
  39.         sp = makestmt_seq(sp, makestmt_assign(ex3, makeexpr_var(tvar)));
  40.     return sp;
  41. }
  42. Static Stmt *proc_strinsert()
  43. {
  44.     Meaning *tvari;
  45.     Expr *exs, *exd, *exi;
  46.     Stmt *sp;
  47.     if (!skipopenparen())
  48. return NULL;
  49.     exs = p_expr(tp_str255);
  50.     if (!skipcomma())
  51. return NULL;
  52.     exd = p_expr(tp_str255);
  53.     if (!skipcomma())
  54. return NULL;
  55.     exi = p_expr(tp_integer);
  56.     skipcloseparen();
  57. #if 0
  58.     if (checkconst(exi, 1)) {
  59.         freeexpr(exi);
  60.         return makestmt_assign(exd,
  61.                                makeexpr_concat(exs, copyexpr(exd)));
  62.     }
  63. #endif
  64.     if (exprspeed(exi) < 5 && nosideeffects(exi, 0))
  65.         sp = NULL;
  66.     else {
  67.         tvari = makestmttempvar(tp_int, name_TEMP);
  68.         sp = makestmt_assign(makeexpr_var(tvari), exi);
  69.         exi = makeexpr_var(tvari);
  70.     }
  71.     exd = bumpstring(exd, exi, 1);
  72.     sp = makestmt_seq(sp, makestmt_assign(exd,
  73.                                           makeexpr_concat(exs, copyexpr(exd), 0)));
  74.     return sp;
  75. }
  76. Static Stmt *proc_strmove()
  77. {
  78.     Expr *exlen, *exs, *exsi, *exd, *exdi;
  79.     if (!skipopenparen())
  80. return NULL;
  81.     exlen = p_expr(tp_integer);
  82.     if (!skipcomma())
  83. return NULL;
  84.     exs = p_expr(tp_str255);
  85.     if (!skipcomma())
  86. return NULL;
  87.     exsi = p_expr(tp_integer);
  88.     if (!skipcomma())
  89. return NULL;
  90.     exd = p_expr(tp_str255);
  91.     if (!skipcomma())
  92. return NULL;
  93.     exdi = p_expr(tp_integer);
  94.     skipcloseparen();
  95.     exsi = makeexpr_arglong(exsi, 0);
  96.     exdi = makeexpr_arglong(exdi, 0);
  97.     return makestmt_call(makeexpr_bicall_5(strmovename, tp_str255,
  98.    exlen, exs, exsi, exd, exdi));
  99. }
  100. Static Expr *func_strlen(ex)
  101. Expr *ex;
  102. {
  103.     return makeexpr_bicall_1("strlen", tp_int, grabarg(ex, 0));
  104. }
  105. Static Expr *func_strltrim(ex)
  106. Expr *ex;
  107. {
  108.     return makeexpr_assign(makeexpr_hat(ex->args[0], 0),
  109.                            makeexpr_bicall_1(strltrimname, tp_str255, ex->args[1]));
  110. }
  111. Static Expr *func_strmax(ex)
  112. Expr *ex;
  113. {
  114.     return strmax_func(grabarg(ex, 0));
  115. }
  116. Static Expr *func_strpos(ex)
  117. Expr *ex;
  118. {
  119.     char *cp;
  120.     if (!switch_strpos)
  121.         swapexprs(ex->args[0], ex->args[1]);
  122.     cp = strposname;
  123.     if (!*cp) {
  124.         note("STRPOS function used [201]");
  125.         cp = "STRPOS";
  126.     } 
  127.     return makeexpr_bicall_3(cp, tp_int,
  128.                              ex->args[0], 
  129.                              ex->args[1],
  130.                              makeexpr_long(1));
  131. }
  132. Static Expr *func_strrpt(ex)
  133. Expr *ex;
  134. {
  135.     if (ex->args[1]->kind == EK_CONST &&
  136.         ex->args[1]->val.i == 1 && ex->args[1]->val.s[0] == ' ') {
  137.         return makeexpr_bicall_4("sprintf", tp_strptr, ex->args[0],
  138.                                  makeexpr_string("%*s"),
  139.                                  makeexpr_longcast(ex->args[2], 0),
  140.                                  makeexpr_string(""));
  141.     } else
  142.         return makeexpr_bicall_3(strrptname, tp_strptr, ex->args[0], ex->args[1],
  143.                                  makeexpr_arglong(ex->args[2], 0));
  144. }
  145. Static Expr *func_strrtrim(ex)
  146. Expr *ex;
  147. {
  148.     return makeexpr_bicall_1(strrtrimname, tp_strptr,
  149.                              makeexpr_assign(makeexpr_hat(ex->args[0], 0),
  150.                                              ex->args[1]));
  151. }
  152. Static Expr *func_succ()
  153. {
  154.     Expr *ex;
  155.     if (wneedtok(TOK_LPAR)) {
  156. ex = p_ord_expr();
  157. skipcloseparen();
  158.     } else
  159. ex = p_ord_expr();
  160. #if 1
  161.     ex = makeexpr_inc(ex, makeexpr_long(1));
  162. #else
  163.     ex = makeexpr_cast(makeexpr_plus(ex, makeexpr_long(1)), ex->val.type);
  164. #endif
  165.     return ex;
  166. }
  167. Static Expr *func_sqr()
  168. {
  169.     return makeexpr_sqr(p_parexpr(tp_integer), 0);
  170. }
  171. Static Expr *func_sqrt(ex)
  172. Expr *ex;
  173. {
  174.     return makeexpr_bicall_1("sqrt", tp_longreal, grabarg(ex, 0));
  175. }
  176. Static Expr *func_swap(ex)
  177. Expr *ex;
  178. {
  179.     char *cp;
  180.     ex = grabarg(ex, 0);
  181.     cp = swapname;
  182.     if (!*cp) {
  183.         note("SWAP function was used [202]");
  184.         cp = "SWAP";
  185.     }
  186.     return makeexpr_bicall_1(swapname, tp_int, ex);
  187. }
  188. Static Expr *func_tan(ex)
  189. Expr *ex;
  190. {
  191.     return makeexpr_bicall_1("tan", tp_longreal, grabarg(ex, 0));
  192. }
  193. Static Expr *func_tanh(ex)
  194. Expr *ex;
  195. {
  196.     return makeexpr_bicall_1("tanh", tp_longreal, grabarg(ex, 0));
  197. }
  198. Static Expr *func_trunc(ex)
  199. Expr *ex;
  200. {
  201.     return makeexpr_actcast(grabarg(ex, 0), tp_integer);
  202. }
  203. Static Expr *func_utrunc(ex)
  204. Expr *ex;
  205. {
  206.     return makeexpr_actcast(grabarg(ex, 0), tp_unsigned);
  207. }
  208. Static Expr *func_uand()
  209. {
  210.     Expr *ex;
  211.     if (!skipopenparen())
  212. return NULL;
  213.     ex = p_expr(tp_unsigned);
  214.     if (skipcomma()) {
  215. ex = makeexpr_bin(EK_BAND, ex->val.type, ex, p_expr(tp_unsigned));
  216. skipcloseparen();
  217.     }
  218.     return ex;
  219. }
  220. Static Expr *func_udec()
  221. {
  222.     return handle_vax_hex(NULL, "u", 0);
  223. }
  224. Static Expr *func_unot()
  225. {
  226.     Expr *ex;
  227.     if (!skipopenparen())
  228. return NULL;
  229.     ex = p_expr(tp_unsigned);
  230.     ex = makeexpr_un(EK_BNOT, ex->val.type, ex);
  231.     skipcloseparen();
  232.     return ex;
  233. }
  234. Static Expr *func_uor()
  235. {
  236.     Expr *ex;
  237.     if (!skipopenparen())
  238. return NULL;
  239.     ex = p_expr(tp_unsigned);
  240.     if (skipcomma()) {
  241. ex = makeexpr_bin(EK_BOR, ex->val.type, ex, p_expr(tp_unsigned));
  242. skipcloseparen();
  243.     }
  244.     return ex;
  245. }
  246. Static Expr *func_upcase(ex)
  247. Expr *ex;
  248. {
  249.     return makeexpr_bicall_1("toupper", tp_char, grabarg(ex, 0));
  250. }
  251. Static Expr *func_upper()
  252. {
  253.     Expr *ex;
  254.     Value val;
  255.     if (!skipopenparen())
  256. return NULL;
  257.     ex = p_expr(tp_integer);
  258.     if (curtok == TOK_COMMA) {
  259. gettok();
  260. val = p_constant(tp_integer);
  261. if (!val.type || val.i != 1)
  262.     note("UPPER(v,n) not supported for n>1 [190]");
  263.     }
  264.     skipcloseparen();
  265.     return copyexpr(ex->val.type->indextype->smax);
  266. }
  267. Static Expr *func_uxor()
  268. {
  269.     Expr *ex;
  270.     if (!skipopenparen())
  271. return NULL;
  272.     ex = p_expr(tp_unsigned);
  273.     if (skipcomma()) {
  274. ex = makeexpr_bin(EK_BXOR, ex->val.type, ex, p_expr(tp_unsigned));
  275. skipcloseparen();
  276.     }
  277.     return ex;
  278. }
  279. Static Expr *func_val_modula()
  280. {
  281.     Expr *ex;
  282.     Type *tp;
  283.     if (!skipopenparen())
  284. return NULL;
  285.     tp = p_type(NULL);
  286.     if (!skipcomma())
  287. return NULL;
  288.     ex = p_expr(tp);
  289.     skipcloseparen();
  290.     return pascaltypecast(tp, ex);
  291. }
  292. Static Stmt *proc_val_turbo()
  293. {
  294.     Expr *ex, *vex, *code, *fmt;
  295.     if (!skipopenparen())
  296. return NULL;
  297.     ex = gentle_cast(p_expr(tp_str255), tp_str255);
  298.     if (!skipcomma())
  299. return NULL;
  300.     vex = p_expr(NULL);
  301.     if (curtok == TOK_COMMA) {
  302. gettok();
  303. code = gentle_cast(p_expr(tp_integer), tp_integer);
  304.     } else
  305. code = NULL;
  306.     skipcloseparen();
  307.     if (vex->val.type->kind == TK_REAL)
  308.         fmt = makeexpr_string("%lg");
  309.     else if (exprlongness(vex) > 0)
  310.         fmt = makeexpr_string("%ld");
  311.     else
  312.         fmt = makeexpr_string("%d");
  313.     ex = makeexpr_bicall_3("sscanf", tp_int,
  314.                            ex, fmt, makeexpr_addr(vex));
  315.     if (code) {
  316. ex = makeexpr_rel(EK_EQ, ex, makeexpr_long(0));
  317. return makestmt_assign(code, makeexpr_ord(ex));
  318.     } else
  319. return makestmt_call(ex);
  320. }
  321. Static Expr *writestrelement(ex, wid, vex, code, needboth)
  322. Expr *ex, *wid, *vex;
  323. int code, needboth;
  324. {
  325.     if (formatstrings && needboth) {
  326.         return makeexpr_bicall_5("sprintf", tp_str255, vex,
  327.                                  makeexpr_string(format_d("%%*.*%c", code)),
  328.                                  copyexpr(wid),
  329.                                  wid,
  330.                                  ex);
  331.     } else {
  332.         return makeexpr_bicall_4("sprintf", tp_str255, vex,
  333.                                  makeexpr_string(format_d("%%*%c", code)),
  334.                                  wid,
  335.                                  ex);
  336.     }
  337. }
  338. Static char *makeenumnames(tp)
  339. Type *tp;
  340. {
  341.     Strlist *sp;
  342.     char *name;
  343.     Meaning *mp;
  344.     int saveindent;
  345.     for (sp = enumnames; sp && sp->value != (long)tp; sp = sp->next) ;
  346.     if (!sp) {
  347.         if (tp->meaning)
  348.             name = format_s(name_ENUM, tp->meaning->name);
  349.         else
  350.             name = format_s(name_ENUM, format_d("_%d", ++enumnamecount));
  351.         sp = strlist_insert(&enumnames, name);
  352.         sp->value = (long)tp;
  353.         outsection(2);
  354.         output(format_s("Static %s *", charname));
  355.         output(sp->s);
  356.         output("[] = {n");
  357. saveindent = outindent;
  358. moreindent(tabsize);
  359. moreindent(structinitindent);
  360.         for (mp = tp->fbase; mp; mp = mp->xnext) {
  361.             output(makeCstring(mp->sym->name, strlen(mp->sym->name)));
  362.             if (mp->xnext)
  363.                 output(",02 ");
  364.         }
  365.         outindent = saveindent;
  366.         output("n} ;n");
  367.         outsection(2);
  368.     }
  369.     return sp->s;
  370. }
  371. /* This function must return a "tempsprintf" */
  372. Expr *writeelement(ex, wid, prec, base)
  373. Expr *ex, *wid, *prec;
  374. int base;
  375. {
  376.     Expr *vex, *ex1, *ex2;
  377.     Meaning *tvar;
  378.     char *fmtcode;
  379.     Type *type;
  380.     ex = makeexpr_charcast(ex);
  381.     if (ex->val.type->kind == TK_POINTER) {
  382.         ex = makeexpr_hat(ex, 0);   /* convert char *'s to strings */
  383.         intwarning("writeelement", "got a char * instead of a string [214]");
  384.     }
  385.     if ((ex->val.type->kind == TK_STRING && !wid) ||
  386.         (ord_type(ex->val.type)->kind == TK_CHAR && (!wid || checkconst(wid, 1)))) {
  387.         return makeexpr_sprintfify(ex);
  388.     }
  389.     tvar = makestmttempvar(tp_str255, name_STRING);
  390.     vex = makeexpr_var(tvar);
  391.     if (wid)
  392.         wid = makeexpr_longcast(wid, 0);
  393.     if (prec)
  394.         prec = makeexpr_longcast(prec, 0);
  395. #if 0
  396.     if (wid && (wid->kind == EK_CONST && wid->val.i < 0 ||
  397.                 checkconst(wid, -1))) {
  398.         freeexpr(wid);     /* P-system uses write(x:-1) to mean write(x) */
  399.         wid = NULL;
  400.     }
  401.     if (prec && (prec->kind == EK_CONST && prec->val.i < 0 ||
  402.                  checkconst(prec, -1))) {
  403.         freeexpr(prec);
  404.         prec = NULL;
  405.     }
  406. #endif
  407.     switch (ord_type(ex->val.type)->kind) {
  408.         case TK_INTEGER:
  409.             if (!wid) {
  410. if (integerwidth < 0)
  411.     integerwidth = (which_lang == LANG_TURBO) ? 1 : 12;
  412. wid = makeexpr_long(integerwidth);
  413.     }
  414.     type = findbasetype(ex->val.type, 0);
  415.     if (base == 16)
  416. fmtcode = "x";
  417.     else if (base == 8)
  418. fmtcode = "o";
  419.     else if ((possiblesigns(wid) & (1|4)) == 1) {
  420. wid = makeexpr_neg(wid);
  421. fmtcode = "x";
  422.     } else if (type == tp_unsigned ||
  423.        type == tp_uint ||
  424.        (type == tp_ushort && sizeof_int < 32))
  425. fmtcode = "u";
  426.     else
  427. fmtcode = "d";
  428.             ex = makeexpr_forcelongness(ex);
  429.             if (checkconst(wid, 0) || checkconst(wid, 1)) {
  430.                 ex = makeexpr_bicall_3("sprintf", tp_str255, vex,
  431.                                        makeexpr_string(format_ss("%%%s%s",
  432.  (exprlongness(ex) > 0) ? "l" : "",
  433.  fmtcode)),
  434.                                        ex);
  435.             } else {
  436.                 ex = makeexpr_bicall_4("sprintf", tp_str255, vex,
  437.                                        makeexpr_string(format_ss("%%*%s%s",
  438.  (exprlongness(ex) > 0) ? "l" : "",
  439.  fmtcode)),
  440.                                        wid,
  441.                                        ex);
  442.             }
  443.             break;
  444.         case TK_CHAR:
  445.             ex = writestrelement(ex, wid, vex, 'c',
  446.                                      (wid->kind != EK_CONST || wid->val.i < 1));
  447.             break;
  448.         case TK_BOOLEAN:
  449.             if (!wid) {
  450.                 ex = makeexpr_bicall_3("sprintf", tp_str255, vex,
  451.                                        makeexpr_string("%s"),
  452.                                        makeexpr_cond(ex,
  453.                                                      makeexpr_string(" TRUE"),
  454.                                                      makeexpr_string("FALSE")));
  455.             } else if (checkconst(wid, 1)) {
  456.                 ex = makeexpr_bicall_3("sprintf", tp_str255, vex,
  457.                                        makeexpr_string("%c"),
  458.                                        makeexpr_cond(ex,
  459.                                                      makeexpr_char('T'),
  460.                                                      makeexpr_char('F')));
  461.             } else {
  462.                 ex = writestrelement(makeexpr_cond(ex,
  463.                                                    makeexpr_string("TRUE"),
  464.                                                    makeexpr_string("FALSE")),
  465.                                      wid, vex, 's',
  466.                                      (wid->kind != EK_CONST || wid->val.i < 5));
  467.             }
  468.             break;
  469.         case TK_ENUM:
  470.             ex = makeexpr_bicall_3("sprintf", tp_str255, vex,
  471.                                    makeexpr_string("%s"),
  472.                                    makeexpr_index(makeexpr_name(makeenumnames(ex->val.type),
  473.                                                                 tp_strptr),
  474.                                                   ex, NULL));
  475.             break;
  476.         case TK_REAL:
  477.             if (!wid)
  478.                 wid = makeexpr_long(realwidth);
  479.             if (prec && (possiblesigns(prec) & (1|4)) != 1) {
  480.                 ex = makeexpr_bicall_5("sprintf", tp_str255, vex,
  481.                                        makeexpr_string("%*.*f"),
  482.                                        wid,
  483.                                        prec,
  484.                                        ex);
  485.             } else {
  486. if (prec)
  487.     prec = makeexpr_neg(prec);
  488. else
  489.     prec = makeexpr_minus(copyexpr(wid),
  490.   makeexpr_long(7));
  491. if (prec->kind == EK_CONST) {
  492.     if (prec->val.i <= 0)
  493. prec = makeexpr_long(1);
  494. } else {
  495.     prec = makeexpr_bicall_2("P_max", tp_integer, prec,
  496.      makeexpr_long(1));
  497. }
  498.                 if (wid->kind == EK_CONST && wid->val.i > 21) {
  499.                     ex = makeexpr_bicall_5("sprintf", tp_str255, vex,
  500.                                            makeexpr_string("%*.*E"),
  501.                                            wid,
  502.    prec,
  503.                                            ex);
  504. #if 0
  505.                 } else if (checkconst(wid, 7)) {
  506.                     ex = makeexpr_bicall_3("sprintf", tp_str255, vex,
  507.                                            makeexpr_string("%E"),
  508.                                            ex);
  509. #endif
  510.                 } else {
  511.                     ex = makeexpr_bicall_4("sprintf", tp_str255, vex,
  512.                                            makeexpr_string("% .*E"),
  513.    prec,
  514.                                            ex);
  515.                 }
  516.             }
  517.             break;
  518.         case TK_STRING:
  519.             ex = writestrelement(ex, wid, vex, 's', 1);
  520.             break;
  521.         case TK_ARRAY:     /* assume packed array of char */
  522.     ord_range_expr(ex->val.type->indextype, &ex1, &ex2);
  523.     ex1 = makeexpr_plus(makeexpr_minus(copyexpr(ex2),
  524.        copyexpr(ex1)),
  525. makeexpr_long(1));
  526.     ex1 = makeexpr_longcast(ex1, 0);
  527.     fmtcode = "%.*s";
  528.             if (!wid) {
  529. wid = ex1;
  530.             } else {
  531. if (isliteralconst(wid, NULL) == 2 &&
  532.     isliteralconst(ex1, NULL) == 2) {
  533.     if (wid->val.i > ex1->val.i) {
  534. fmtcode = format_ds("%*s%%.*s",
  535.     wid->val.i - ex1->val.i, "");
  536. wid = ex1;
  537.     }
  538. } else
  539.     note("Format for packed-array-of-char will work only if width < length [321]");
  540.     }
  541.             ex = makeexpr_bicall_4("sprintf", tp_str255, vex,
  542.                                    makeexpr_string(fmtcode),
  543.                                    wid,
  544.                                    makeexpr_addr(ex));
  545.             break;
  546.         default:
  547.             note("Element has wrong type for WRITE statement [196]");
  548.             ex = makeexpr_bicall_2("sprintf", tp_str255, vex, makeexpr_string("<meef>"));
  549.             break;
  550.     }
  551.     return ex;
  552. }
  553. Static Stmt *handlewrite_text(fex, ex, iswriteln)
  554. Expr *fex, *ex;
  555. int iswriteln;
  556. {
  557.     Expr *print, *wid, *prec;
  558.     unsigned char *ucp;
  559.     int i, done, base;
  560.     print = NULL;
  561.     for (;;) {
  562.         wid = NULL;
  563.         prec = NULL;
  564. base = 10;
  565. if (curtok == TOK_COLON && iswriteln >= 0) {
  566.     gettok();
  567.     wid = p_expr(tp_integer);
  568.     if (curtok == TOK_COLON) {
  569. gettok();
  570. prec = p_expr(tp_integer);
  571.     }
  572. }
  573. if (curtok == TOK_IDENT &&
  574.     !strcicmp(curtokbuf, "OCT")) {
  575.     base = 8;
  576.     gettok();
  577. } else if (curtok == TOK_IDENT &&
  578.    !strcicmp(curtokbuf, "HEX")) {
  579.     base = 16;
  580.     gettok();
  581. }
  582.         ex = writeelement(ex, wid, prec, base);
  583.         print = makeexpr_concat(print, cleansprintf(ex), 1);
  584.         if (curtok == TOK_COMMA && iswriteln >= 0) {
  585.             gettok();
  586.             ex = p_expr(NULL);
  587.         } else
  588.             break;
  589.     }
  590.     if (fex->val.type->kind != TK_STRING) {      /* not strwrite */
  591.         switch (iswriteln) {
  592.             case 1:
  593.             case -1:
  594.                 print = makeexpr_concat(print, makeexpr_string("n"), 1);
  595.                 break;
  596.             case 2:
  597.             case -2:
  598.                 print = makeexpr_concat(print, makeexpr_string("r"), 1);
  599.                 break;
  600.         }
  601.         if (isvar(fex, mp_output)) {
  602.             ucp = (unsigned char *)print->args[1]->val.s;
  603.             for (i = 0; i < print->args[1]->val.i; i++) {
  604.                 if (ucp[i] >= 128 && ucp[i] < 144) {
  605.                     note("WRITE statement contains color/attribute characters [203]");
  606.     break;
  607. }
  608.             }
  609.         }
  610.         if ((i = sprintflength(print, 0)) > 0 && print->nargs == 2 && printfonly != 1) {
  611.             print = makeexpr_unsprintfify(print);
  612.             done = 1;
  613.             if (isvar(fex, mp_output)) {
  614.                 if (i == 1) {
  615.                     print = makeexpr_bicall_1("putchar", tp_int,
  616.                                               makeexpr_charcast(print));
  617.                 } else {
  618.                     if (printfonly == 0) {
  619.                         if (print->val.s[print->val.i-1] == 'n') {
  620.     print->val.s[--(print->val.i)] = 0;
  621.                             print = makeexpr_bicall_1("puts", tp_int, print);
  622.                         } else {
  623.                             print = makeexpr_bicall_2("fputs", tp_int,
  624.                                                       print,
  625.                                                       copyexpr(fex));
  626.                         }
  627.                     } else {
  628.                         print = makeexpr_sprintfify(print);
  629.                         done = 0;
  630.                     }
  631.                 }
  632.             } else {
  633.                 if (i == 1) {
  634.                     print = makeexpr_bicall_2("putc", tp_int,
  635.                                               makeexpr_charcast(print),
  636.                                               copyexpr(fex));
  637.                 } else if (printfonly == 0) {
  638.                     print = makeexpr_bicall_2("fputs", tp_int,
  639.                                               print,
  640.                                               copyexpr(fex));
  641.                 } else {
  642.                     print = makeexpr_sprintfify(print);
  643.                     done = 0;
  644.                 }
  645.             }
  646.         } else
  647.             done = 0;
  648.         if (!done) {
  649.             canceltempvar(istempvar(print->args[0]));
  650.             if (checkstring(print->args[1], "%s") && printfonly != 1) {
  651.                 print = makeexpr_bicall_2("fputs", tp_int,
  652.                                           grabarg(print, 2),
  653.                                           copyexpr(fex));
  654.             } else if (checkstring(print->args[1], "%c") && printfonly != 1 &&
  655.                        !nosideeffects(print->args[2], 0)) {
  656.                 print = makeexpr_bicall_2("fputc", tp_int,
  657.                                           grabarg(print, 2),
  658.                                           copyexpr(fex));
  659.             } else if (isvar(fex, mp_output)) {
  660.                 if (checkstring(print->args[1], "%sn") && printfonly != 1) {
  661.                     print = makeexpr_bicall_1("puts", tp_int, grabarg(print, 2));
  662.                 } else if (checkstring(print->args[1], "%c") && printfonly != 1) {
  663.                     print = makeexpr_bicall_1("putchar", tp_int, grabarg(print, 2));
  664.                 } else {
  665.                     strchange(&print->val.s, "printf");
  666.                     delfreearg(&print, 0);
  667.                     print->val.type = tp_int;
  668.                 }
  669.             } else {
  670.                 if (checkstring(print->args[1], "%c") && printfonly != 1) {
  671.                     print = makeexpr_bicall_2("putc", tp_int,
  672.                                               grabarg(print, 2),
  673.                                               copyexpr(fex));
  674.                 } else {
  675.                     strchange(&print->val.s, "fprintf");
  676.                     freeexpr(print->args[0]);
  677.                     print->args[0] = copyexpr(fex);
  678.                     print->val.type = tp_int;
  679.                 }
  680.             }
  681.         }
  682.         if (FCheck(checkfilewrite)) {
  683.             print = makeexpr_bicall_2("~SETIO", tp_void,
  684.                                       makeexpr_rel(EK_GE, print, makeexpr_long(0)),
  685.       makeexpr_name(filewriteerrorname, tp_int));
  686.         }
  687.     }
  688.     return makestmt_call(print);
  689. }
  690. Static Stmt *handlewrite_bin(fex, ex)
  691. Expr *fex, *ex;
  692. {
  693.     Type *basetype;
  694.     Stmt *sp;
  695.     Expr *tvardef = NULL;
  696.     Meaning *tvar = NULL;
  697.     sp = NULL;
  698.     basetype = fex->val.type->basetype->basetype;
  699.     for (;;) {
  700.         if (!expr_has_address(ex) || ex->val.type != basetype) {
  701.             if (!tvar)
  702.                 tvar = makestmttempvar(basetype, name_TEMP);
  703.             if (!tvardef || !exprsame(tvardef, ex, 1)) {
  704.                 freeexpr(tvardef);
  705.                 tvardef = copyexpr(ex);
  706.                 sp = makestmt_seq(sp, makestmt_assign(makeexpr_var(tvar),
  707.                                                       ex));
  708.             } else
  709.                 freeexpr(ex);
  710.             ex = makeexpr_var(tvar);
  711.         }
  712.         ex = makeexpr_bicall_4("fwrite", tp_integer, makeexpr_addr(ex),
  713.                                                      makeexpr_sizeof(makeexpr_type(basetype), 0),
  714.                                                      makeexpr_long(1),
  715.                                                      copyexpr(fex));
  716.         if (FCheck(checkfilewrite)) {
  717.             ex = makeexpr_bicall_2("~SETIO", tp_void,
  718.                                    makeexpr_rel(EK_EQ, ex, makeexpr_long(1)),
  719.    makeexpr_name(filewriteerrorname, tp_int));
  720.         }
  721.         sp = makestmt_seq(sp, makestmt_call(ex));
  722.         if (curtok == TOK_COMMA) {
  723.             gettok();
  724.             ex = p_expr(NULL);
  725.         } else
  726.             break;
  727.     }
  728.     freeexpr(tvardef);
  729.     return sp;
  730. }
  731. Static Stmt *proc_write()
  732. {
  733.     Expr *fex, *ex;
  734.     Stmt *sp;
  735.     if (!skipopenparen())
  736. return NULL;
  737.     ex = p_expr(NULL);
  738.     if (isfiletype(ex->val.type) && wneedtok(TOK_COMMA)) {
  739.         fex = ex;
  740.         ex = p_expr(NULL);
  741.     } else {
  742.         fex = makeexpr_var(mp_output);
  743.     }
  744.     if (fex->val.type == tp_text)
  745.         sp = handlewrite_text(fex, ex, 0);
  746.     else
  747.         sp = handlewrite_bin(fex, ex);
  748.     skipcloseparen();
  749.     return wrapopencheck(sp, fex);
  750. }
  751. Static Stmt *handle_modula_write(fmt)
  752. char *fmt;
  753. {
  754.     Expr *ex, *wid;
  755.     if (!skipopenparen())
  756. return NULL;
  757.     ex = makeexpr_forcelongness(p_expr(NULL));
  758.     if (skipcomma())
  759. wid = p_expr(tp_integer);
  760.     else
  761. wid = makeexpr_long(1);
  762.     if (checkconst(wid, 0) || checkconst(wid, 1))
  763. ex = makeexpr_bicall_2("printf", tp_str255,
  764.        makeexpr_string(format_ss("%%%s%s",
  765.  (exprlongness(ex) > 0) ? "l" : "",
  766.  fmt)),
  767.        ex);
  768.     else
  769. ex = makeexpr_bicall_3("printf", tp_str255,
  770.        makeexpr_string(format_ss("%%*%s%s",
  771.  (exprlongness(ex) > 0) ? "l" : "",
  772.  fmt)),
  773.        makeexpr_arglong(wid, 0),
  774.        ex);
  775.     skipcloseparen();
  776.     return makestmt_call(ex);
  777. }
  778. Static Stmt *proc_writecard()
  779. {
  780.     return handle_modula_write("u");
  781. }
  782. Static Stmt *proc_writeint()
  783. {
  784.     return handle_modula_write("d");
  785. }
  786. Static Stmt *proc_writehex()
  787. {
  788.     return handle_modula_write("x");
  789. }
  790. Static Stmt *proc_writeoct()
  791. {
  792.     return handle_modula_write("o");
  793. }
  794. Static Stmt *proc_writereal()
  795. {
  796.     return handle_modula_write("f");
  797. }
  798. Static Stmt *proc_writedir()
  799. {
  800.     Expr *fex, *ex;
  801.     Stmt *sp;
  802.     if (!skipopenparen())
  803. return NULL;
  804.     fex = p_expr(tp_text);
  805.     if (!skipcomma())
  806. return NULL;
  807.     ex = p_expr(tp_integer);
  808.     sp = doseek(fex, ex);
  809.     if (!skipcomma())
  810. return sp;
  811.     sp = makestmt_seq(sp, handlewrite_bin(fex, p_expr(NULL)));
  812.     skipcloseparen();
  813.     return wrapopencheck(sp, fex);
  814. }
  815. Static Stmt *handlewriteln(iswriteln)
  816. int iswriteln;
  817. {
  818.     Expr *fex, *ex;
  819.     Stmt *sp;
  820.     Meaning *deffile = mp_output;
  821.     sp = NULL;
  822.     if (iswriteln == 3) {
  823. iswriteln = 1;
  824. if (messagestderr)
  825.     deffile = mp_stderr;
  826.     }
  827.     if (curtok != TOK_LPAR) {
  828.         fex = makeexpr_var(deffile);
  829.         if (iswriteln)
  830.             sp = handlewrite_text(fex, makeexpr_string(""), -iswriteln);
  831.     } else {
  832.         gettok();
  833.         ex = p_expr(NULL);
  834.         if (isfiletype(ex->val.type)) {
  835.             fex = ex;
  836.             if (curtok == TOK_RPAR || !wneedtok(TOK_COMMA)) {
  837.                 if (iswriteln)
  838.                     ex = makeexpr_string("");
  839.                 else
  840.                     ex = NULL;
  841.             } else {
  842.                 ex = p_expr(NULL);
  843.             }
  844.         } else {
  845.             fex = makeexpr_var(deffile);
  846.         }
  847.         if (ex)
  848.             sp = handlewrite_text(fex, ex, iswriteln);
  849.         skipcloseparen();
  850.     }
  851.     if (iswriteln == 0) {
  852.         sp = makestmt_seq(sp, makestmt_call(makeexpr_bicall_1("fflush", tp_void,
  853.                                                               copyexpr(fex))));
  854.     }
  855.     return wrapopencheck(sp, fex);
  856. }
  857. Static Stmt *proc_overprint()
  858. {
  859.     return handlewriteln(2);
  860. }
  861. Static Stmt *proc_prompt()
  862. {
  863.     return handlewriteln(0);
  864. }
  865. Static Stmt *proc_writeln()
  866. {
  867.     return handlewriteln(1);
  868. }
  869. Static Stmt *proc_message()
  870. {
  871.     return handlewriteln(3);
  872. }
  873. Static Stmt *proc_writev()
  874. {
  875.     Expr *vex, *ex;
  876.     Stmt *sp;
  877.     Meaning *mp;
  878.     if (!skipopenparen())
  879. return NULL;
  880.     vex = p_expr(tp_str255);
  881.     if (curtok == TOK_RPAR) {
  882. gettok();
  883. return makestmt_assign(vex, makeexpr_string(""));
  884.     }
  885.     if (!skipcomma())
  886. return NULL;
  887.     sp = handlewrite_text(vex, p_expr(NULL), 0);
  888.     skipcloseparen();
  889.     ex = sp->exp1;
  890.     if (ex->kind == EK_BICALL && !strcmp(ex->val.s, "sprintf") &&
  891.         (mp = istempvar(ex->args[0])) != NULL) {
  892.         canceltempvar(mp);
  893.         ex->args[0] = vex;
  894.     } else
  895.         sp->exp1 = makeexpr_assign(vex, ex);
  896.     return sp;
  897. }
  898. Static Stmt *proc_strwrite(mp_x, spbase)
  899. Meaning *mp_x;
  900. Stmt *spbase;
  901. {
  902.     Expr *vex, *exi, *exj, *ex;
  903.     Stmt *sp;
  904.     Meaning *mp;
  905.     if (!skipopenparen())
  906. return NULL;
  907.     vex = p_expr(tp_str255);
  908.     if (!skipcomma())
  909. return NULL;
  910.     exi = p_expr(tp_integer);
  911.     if (!skipcomma())
  912. return NULL;
  913.     exj = p_expr(tp_integer);
  914.     if (!skipcomma())
  915. return NULL;
  916.     sp = handlewrite_text(vex, p_expr(NULL), 0);
  917.     skipcloseparen();
  918.     ex = sp->exp1;
  919.     FREE(sp);
  920.     if (checkconst(exi, 1)) {
  921.         sp = spbase;
  922.         while (sp && sp->next)
  923.             sp = sp->next;
  924.         if (sp && sp->kind == SK_ASSIGN && sp->exp1->kind == EK_ASSIGN &&
  925.              (sp->exp1->args[0]->kind == EK_HAT ||
  926.               sp->exp1->args[0]->kind == EK_INDEX) &&
  927.              exprsame(sp->exp1->args[0]->args[0], vex, 1) &&
  928.              checkconst(sp->exp1->args[1], 0)) {
  929.             nukestmt(sp);     /* remove preceding bogus setstrlen */
  930.         }
  931.     }
  932.     if (ex->kind == EK_BICALL && !strcmp(ex->val.s, "sprintf") &&
  933.         (mp = istempvar(ex->args[0])) != NULL) {
  934.         canceltempvar(mp);
  935.         ex->args[0] = bumpstring(copyexpr(vex), exi, 1);
  936.         sp = makestmt_call(ex);
  937.     } else
  938.         sp = makestmt_assign(bumpstring(copyexpr(vex), exi, 1), ex);
  939.     if (fullstrwrite != 0) {
  940.         sp = makestmt_seq(sp, makestmt_assign(exj,
  941.                                               makeexpr_plus(makeexpr_bicall_1("strlen", tp_int, vex),
  942.                                                             makeexpr_long(1))));
  943.         if (fullstrwrite == 1)
  944.             note("FullStrWrite=1 not yet supported [204]");
  945.         if (fullstrwrite == 2)
  946.             note("STRWRITE was used [205]");
  947.     } else {
  948.         freeexpr(vex);
  949.     }
  950.     return mixassignments(sp, NULL);
  951. }
  952. Static Stmt *proc_str_turbo()
  953. {
  954.     Expr *ex, *wid, *prec;
  955.     if (!skipopenparen())
  956. return NULL;
  957.     ex = p_expr(NULL);
  958.     wid = NULL;
  959.     prec = NULL;
  960.     if (curtok == TOK_COLON) {
  961.         gettok();
  962.         wid = p_expr(tp_integer);
  963.         if (curtok == TOK_COLON) {
  964.             gettok();
  965.             prec = p_expr(tp_integer);
  966.         }
  967.     }
  968.     ex = writeelement(ex, wid, prec, 10);
  969.     if (!skipcomma())
  970. return NULL;
  971.     wid = p_expr(tp_str255);
  972.     skipcloseparen();
  973.     return makestmt_assign(wid, ex);
  974. }
  975. Static Expr *func_xor()
  976. {
  977.     Expr *ex, *ex2;
  978.     Type *type;
  979.     Meaning *tvar;
  980.     if (!skipopenparen())
  981. return NULL;
  982.     ex = p_expr(NULL);
  983.     if (!skipcomma())
  984. return ex;
  985.     ex2 = p_expr(ex->val.type);
  986.     skipcloseparen();
  987.     if (ex->val.type->kind != TK_SET &&
  988. ex->val.type->kind != TK_SMALLSET) {
  989. ex = makeexpr_bin(EK_BXOR, ex->val.type, ex, ex2);
  990.     } else {
  991. type = mixsets(&ex, &ex2);
  992. tvar = makestmttempvar(type, name_SET);
  993. ex = makeexpr_bicall_3(setxorname, type,
  994.        makeexpr_var(tvar),
  995.        ex, ex2);
  996.     }
  997.     return ex;
  998. }
  999. void decl_builtins()
  1000. {
  1001.     makespecialfunc( "ABS",           func_abs);
  1002.     makespecialfunc( "ADDR",          func_addr);
  1003.     if (!modula2)
  1004. makespecialfunc( "ADDRESS",   func_addr);
  1005.     makespecialfunc( "ADDTOPOINTER",  func_addtopointer);
  1006.     makespecialfunc( "ADR",           func_addr);
  1007.     makespecialfunc( "ASL",       func_lsl);
  1008.     makespecialfunc( "ASR",       func_asr);
  1009.     makespecialfunc( "BADDRESS",      func_iaddress);
  1010.     makespecialfunc( "BAND",       func_uand);
  1011.     makespecialfunc( "BIN",           func_bin);
  1012.     makespecialfunc( "BITNEXT",       func_bitnext);
  1013.     makespecialfunc( "BITSIZE",       func_bitsize);
  1014.     makespecialfunc( "BITSIZEOF",     func_bitsize);
  1015. mp_blockread_ucsd =
  1016.     makespecialfunc( "BLOCKREAD",     func_blockread);
  1017. mp_blockwrite_ucsd =
  1018.     makespecialfunc( "BLOCKWRITE",    func_blockwrite);
  1019.     makespecialfunc( "BNOT",       func_unot);
  1020.     makespecialfunc( "BOR",       func_uor);
  1021.     makespecialfunc( "BSL",       func_bsl);
  1022.     makespecialfunc( "BSR",       func_bsr);
  1023.     makespecialfunc( "BTST",       func_btst);
  1024.     makespecialfunc( "BXOR",       func_uxor);
  1025.     makespecialfunc( "BYTEREAD",      func_byteread);
  1026.     makespecialfunc( "BYTEWRITE",     func_bytewrite);
  1027.     makespecialfunc( "BYTE_OFFSET",   func_byte_offset);
  1028.     makespecialfunc( "CHR",           func_chr);         
  1029.     makespecialfunc( "CONCAT",        func_concat);
  1030.     makespecialfunc( "DBLE",          func_float);
  1031. mp_dec_dec =
  1032.     makespecialfunc( "DEC",           func_dec);
  1033.     makespecialfunc( "EOF",           func_eof);
  1034.     makespecialfunc( "EOLN",          func_eoln);
  1035.     makespecialfunc( "FCALL",         func_fcall);
  1036.     makespecialfunc( "FILEPOS",       func_filepos);
  1037.     makespecialfunc( "FILESIZE",      func_filesize);
  1038.     makespecialfunc( "FLOAT",       func_float);
  1039.     makespecialfunc( "HEX",           func_hex);         
  1040.     makespecialfunc( "HI",            func_hi);
  1041.     makespecialfunc( "HIWORD",        func_hiword);
  1042.     makespecialfunc( "HIWRD",         func_hiword);
  1043.     makespecialfunc( "HIGH",          func_high);
  1044.     makespecialfunc( "IADDRESS",      func_iaddress);
  1045.     makespecialfunc( "INT",           func_int);         
  1046.     makespecialfunc( "LAND",       func_uand);
  1047.     makespecialfunc( "LNOT",       func_unot);
  1048.     makespecialfunc( "LO",            func_lo);
  1049.     makespecialfunc( "LOOPHOLE",      func_loophole);
  1050.     makespecialfunc( "LOR",       func_uor);
  1051.     makespecialfunc( "LOWER",       func_lower);
  1052.     makespecialfunc( "LOWORD",        func_loword);
  1053.     makespecialfunc( "LOWRD",         func_loword);
  1054.     makespecialfunc( "LSL",       func_lsl);
  1055.     makespecialfunc( "LSR",       func_lsr);
  1056.     makespecialfunc( "MAX",       func_max);
  1057.     makespecialfunc( "MAXPOS",        func_maxpos);
  1058.     makespecialfunc( "MIN",       func_min);
  1059.     makespecialfunc( "NEXT",          func_sizeof);
  1060.     makespecialfunc( "OCT",           func_oct);
  1061.     makespecialfunc( "ORD",           func_ord);
  1062.     makespecialfunc( "ORD4",          func_ord4);
  1063.     makespecialfunc( "PI",       func_pi);
  1064.     makespecialfunc( "POSITION",      func_position);
  1065.     makespecialfunc( "PRED",          func_pred);
  1066.     makespecialfunc( "QUAD",          func_float);
  1067.     makespecialfunc( "RANDOM",        func_random);
  1068.     makespecialfunc( "REF",       func_addr);
  1069.     makespecialfunc( "SCAN",       func_scan);
  1070.     makespecialfunc( "SEEKEOF",       func_seekeof);
  1071.     makespecialfunc( "SEEKEOLN",      func_seekeoln);
  1072.     makespecialfunc( "SIZE",          func_sizeof);
  1073.     makespecialfunc( "SIZEOF",        func_sizeof);
  1074.     makespecialfunc( "SNGL",          func_sngl);
  1075.     makespecialfunc( "SQR",           func_sqr);
  1076.     makespecialfunc( "STATUSV",       func_statusv);
  1077.     makespecialfunc( "SUCC",          func_succ);
  1078.     makespecialfunc( "TSIZE",         func_sizeof);
  1079.     makespecialfunc( "UAND",       func_uand);
  1080.     makespecialfunc( "UDEC",          func_udec);
  1081.     makespecialfunc( "UINT",          func_uint);         
  1082.     makespecialfunc( "UNOT",       func_unot);
  1083.     makespecialfunc( "UOR",       func_uor);
  1084.     makespecialfunc( "UPPER",       func_upper);
  1085.     makespecialfunc( "UXOR",       func_uxor);
  1086. mp_val_modula =
  1087.     makespecialfunc( "VAL",       func_val_modula);
  1088.     makespecialfunc( "WADDRESS",      func_iaddress);
  1089.     makespecialfunc( "XOR",       func_xor);
  1090.     makestandardfunc("ARCTAN",        func_arctan);
  1091.     makestandardfunc("ARCTANH",       func_arctanh);
  1092.     makestandardfunc("BINARY",        func_binary);      
  1093.     makestandardfunc("CAP",           func_upcase);
  1094.     makestandardfunc("COPY",          func_copy);        
  1095.     makestandardfunc("COS",           func_cos);         
  1096.     makestandardfunc("COSH",          func_cosh);         
  1097.     makestandardfunc("EXP",           func_exp);         
  1098.     makestandardfunc("EXP10",         func_pwroften);
  1099.     makestandardfunc("EXPO",          func_expo);         
  1100.     makestandardfunc("FRAC",          func_frac);        
  1101.     makestandardfunc("INDEX",         func_strpos);      
  1102.     makestandardfunc("LASTPOS",       NULL);             
  1103.     makestandardfunc("LINEPOS",       NULL);             
  1104.     makestandardfunc("LENGTH",        func_strlen);      
  1105.     makestandardfunc("LN",            func_ln);          
  1106.     makestandardfunc("LOG",           func_log);
  1107.     makestandardfunc("LOG10",         func_log);
  1108.     makestandardfunc("MAXAVAIL",      func_maxavail);
  1109.     makestandardfunc("MEMAVAIL",      func_memavail);
  1110.     makestandardfunc("OCTAL",         func_octal);       
  1111.     makestandardfunc("ODD",           func_odd);         
  1112.     makestandardfunc("PAD",           func_pad);
  1113.     makestandardfunc("PARAMCOUNT",    func_paramcount);
  1114.     makestandardfunc("PARAMSTR",      func_paramstr);    
  1115.     makestandardfunc("POS",           func_pos);         
  1116.     makestandardfunc("PTR",           func_ptr);
  1117.     makestandardfunc("PWROFTEN",      func_pwroften);
  1118.     makestandardfunc("ROUND",         func_round);       
  1119.     makestandardfunc("SCANEQ",        func_scaneq);
  1120.     makestandardfunc("SCANNE",        func_scanne);
  1121.     makestandardfunc("SIN",           func_sin);         
  1122.     makestandardfunc("SINH",          func_sinh);         
  1123.     makestandardfunc("SQRT",          func_sqrt);        
  1124. mp_str_hp =
  1125.     makestandardfunc("STR",           func_str_hp);
  1126.     makestandardfunc("STRLEN",        func_strlen);      
  1127.     makestandardfunc("STRLTRIM",      func_strltrim);    
  1128.     makestandardfunc("STRMAX",        func_strmax);      
  1129.     makestandardfunc("STRPOS",        func_strpos);      
  1130.     makestandardfunc("STRRPT",        func_strrpt);      
  1131.     makestandardfunc("STRRTRIM",      func_strrtrim);    
  1132.     makestandardfunc("SUBSTR",        func_str_hp);
  1133.     makestandardfunc("SWAP",          func_swap);        
  1134.     makestandardfunc("TAN",           func_tan);       
  1135.     makestandardfunc("TANH",          func_tanh);       
  1136.     makestandardfunc("TRUNC",         func_trunc);       
  1137.     makestandardfunc("UPCASE",        func_upcase);      
  1138.     makestandardfunc("UROUND",        func_uround);
  1139.     makestandardfunc("UTRUNC",        func_utrunc);
  1140.     makespecialproc( "APPEND",        proc_append);
  1141.     makespecialproc( "ARGV",       proc_argv);
  1142.     makespecialproc( "ASSERT",        proc_assert);
  1143.     makespecialproc( "ASSIGN",        proc_assign);
  1144.     makespecialproc( "BCLR",       proc_bclr);
  1145. mp_blockread_turbo =
  1146.     makespecialproc( "BLOCKREAD_TURBO", proc_blockread);
  1147. mp_blockwrite_turbo =
  1148.     makespecialproc( "BLOCKWRITE_TURBO", proc_blockwrite);
  1149.     makespecialproc( "BREAK",         proc_flush);
  1150.     makespecialproc( "BSET",       proc_bset);
  1151.     makespecialproc( "CALL",          proc_call);
  1152.     makespecialproc( "CLOSE",         proc_close);
  1153.     makespecialproc( "CONNECT",       proc_assign);
  1154.     makespecialproc( "CYCLE",       proc_cycle);
  1155. mp_dec_turbo =
  1156.     makespecialproc( "DEC_TURBO",     proc_dec);
  1157.     makespecialproc( "DISPOSE",       proc_dispose);
  1158.     makespecialproc( "ESCAPE",        proc_escape);
  1159.     makespecialproc( "EXCL",          proc_excl);
  1160.     makespecialproc( "EXIT",          proc_exit);
  1161.     makespecialproc( "FILLCHAR",      proc_fillchar);
  1162.     makespecialproc( "FLUSH",         proc_flush);
  1163.     makespecialproc( "GET",           proc_get);
  1164.     makespecialproc( "HALT",          proc_escape);
  1165.     makespecialproc( "INC",           proc_inc);
  1166.     makespecialproc( "INCL",          proc_incl);
  1167.     makespecialproc( "LEAVE",       proc_leave);
  1168.     makespecialproc( "LOCATE",        proc_seek);
  1169.     makespecialproc( "MESSAGE",       proc_message);
  1170.     makespecialproc( "MOVE_FAST",     proc_move_fast);        
  1171.     makespecialproc( "MOVE_L_TO_R",   proc_move_fast);        
  1172.     makespecialproc( "MOVE_R_TO_L",   proc_move_fast);        
  1173.     makespecialproc( "NEW",           proc_new);
  1174.     if (which_lang != LANG_VAX)
  1175. makespecialproc( "OPEN",      proc_open);
  1176.     makespecialproc( "OVERPRINT",     proc_overprint);
  1177.     makespecialproc( "PACK",          NULL);
  1178.     makespecialproc( "PAGE",          proc_page);
  1179.     makespecialproc( "PUT",           proc_put);
  1180.     makespecialproc( "PROMPT",        proc_prompt);
  1181.     makespecialproc( "RANDOMIZE",     proc_randomize);
  1182.     makespecialproc( "READ",          proc_read);
  1183.     makespecialproc( "READDIR",       proc_readdir);
  1184.     makespecialproc( "READLN",        proc_readln);
  1185.     makespecialproc( "READV",         proc_readv);
  1186.     makespecialproc( "RESET",         proc_reset);
  1187.     makespecialproc( "REWRITE",       proc_rewrite);
  1188.     makespecialproc( "SEEK",          proc_seek);
  1189.     makespecialproc( "SETSTRLEN",     proc_setstrlen);
  1190.     makespecialproc( "SETTEXTBUF",    proc_settextbuf);
  1191. mp_str_turbo =
  1192.     makespecialproc( "STR_TURBO",     proc_str_turbo);
  1193.     makespecialproc( "STRAPPEND",     proc_strappend);
  1194.     makespecialproc( "STRDELETE",     proc_strdelete);
  1195.     makespecialproc( "STRINSERT",     proc_strinsert);
  1196.     makespecialproc( "STRMOVE",       proc_strmove);
  1197.     makespecialproc( "STRREAD",       proc_strread);
  1198.     makespecialproc( "STRWRITE",      proc_strwrite);
  1199.     makespecialproc( "UNPACK",        NULL);
  1200.     makespecialproc( "WRITE",         proc_write);
  1201.     makespecialproc( "WRITEDIR",      proc_writedir);
  1202.     makespecialproc( "WRITELN",       proc_writeln);
  1203.     makespecialproc( "WRITEV",        proc_writev);
  1204. mp_val_turbo =
  1205.     makespecialproc( "VAL_TURBO",     proc_val_turbo);
  1206.     makestandardproc("DELETE",        proc_delete);      
  1207.     makestandardproc("FREEMEM",       proc_freemem);     
  1208.     makestandardproc("GETMEM",        proc_getmem);
  1209.     makestandardproc("GOTOXY",        proc_gotoxy);      
  1210.     makestandardproc("INSERT",        proc_insert);      
  1211.     makestandardproc("MARK",          NULL);             
  1212.     makestandardproc("MOVE",          proc_move);        
  1213.     makestandardproc("MOVELEFT",      proc_move);        
  1214.     makestandardproc("MOVERIGHT",     proc_move);        
  1215.     makestandardproc("RELEASE",       NULL);             
  1216.     makespecialvar(  "MEM",           var_mem);
  1217.     makespecialvar(  "MEMW",          var_memw);
  1218.     makespecialvar(  "MEML",          var_meml);
  1219.     makespecialvar(  "PORT",          var_port);
  1220.     makespecialvar(  "PORTW",         var_portw);
  1221.     /* Modula-2 standard I/O procedures (case-sensitive!) */
  1222.     makespecialproc( "Read",          proc_read);
  1223.     makespecialproc( "ReadCard",      proc_read);
  1224.     makespecialproc( "ReadInt",       proc_read);
  1225.     makespecialproc( "ReadReal",      proc_read);
  1226.     makespecialproc( "ReadString",    proc_read);
  1227.     makespecialproc( "Write",         proc_write);
  1228.     makespecialproc( "WriteCard",     proc_writecard);
  1229.     makespecialproc( "WriteHex",      proc_writehex);
  1230.     makespecialproc( "WriteInt",      proc_writeint);
  1231.     makespecialproc( "WriteOct",      proc_writeoct);
  1232.     makespecialproc( "WriteLn",       proc_writeln);
  1233.     makespecialproc( "WriteReal",     proc_writereal);
  1234.     makespecialproc( "WriteString",   proc_write);
  1235. }
  1236. /* End. */