v21i062: Pascal to C translator, Part17/32

Rich Salz rsalz at uunet.uu.net
Wed Mar 28 08:17:06 AEST 1990


Submitted-by: Dave Gillespie <daveg at csvax.caltech.edu>
Posting-number: Volume 21, Issue 62
Archive-name: p2c/part17

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 17 (of 32)."
# Contents:  src/funcs.c.3
# Wrapped by rsalz at litchi.bbn.com on Mon Mar 26 14:29:39 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'src/funcs.c.3' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'src/funcs.c.3'\"
else
echo shar: Extracting \"'src/funcs.c.3'\" \(42271 characters\)
sed "s/^X//" >'src/funcs.c.3' <<'END_OF_FILE'
X    ex2 = p_expr(tp_str255);
X    skipcloseparen();
X    return makestmt_assign(ex, makeexpr_concat(copyexpr(ex), ex2, 0));
X}
X
X
X
XStatic Stmt *proc_strdelete()
X{
X    Meaning *tvar = NULL, *tvari;
X    Expr *ex, *ex2, *ex3, *ex4, *exi, *exn;
X    Stmt *sp;
X
X    if (!skipopenparen())
X	return NULL;
X    ex = p_expr(tp_str255);
X    if (!skipcomma())
X	return NULL;
X    exi = p_expr(tp_integer);
X    if (curtok == TOK_COMMA) {
X	gettok();
X	exn = p_expr(tp_integer);
X    } else
X	exn = makeexpr_long(1);
X    skipcloseparen();
X    if (exprspeed(exi) < 5 && nosideeffects(exi, 0))
X        sp = NULL;
X    else {
X        tvari = makestmttempvar(tp_int, name_TEMP);
X        sp = makestmt_assign(makeexpr_var(tvari), exi);
X        exi = makeexpr_var(tvari);
X    }
X    ex3 = bumpstring(copyexpr(ex), copyexpr(exi), 1);
X    ex4 = bumpstring(copyexpr(ex), makeexpr_plus(exi, exn), 1);
X    if (strcpyleft) {
X        ex2 = ex3;
X    } else {
X        tvar = makestmttempvar(tp_str255, name_STRING);
X        ex2 = makeexpr_var(tvar);
X    }
X    sp = makestmt_seq(sp, makestmt_assign(ex2, ex4));
X    if (!strcpyleft)
X        sp = makestmt_seq(sp, makestmt_assign(ex3, makeexpr_var(tvar)));
X    return sp;
X}
X
X
X
XStatic Stmt *proc_strinsert()
X{
X    Meaning *tvari;
X    Expr *exs, *exd, *exi;
X    Stmt *sp;
X
X    if (!skipopenparen())
X	return NULL;
X    exs = p_expr(tp_str255);
X    if (!skipcomma())
X	return NULL;
X    exd = p_expr(tp_str255);
X    if (!skipcomma())
X	return NULL;
X    exi = p_expr(tp_integer);
X    skipcloseparen();
X#if 0
X    if (checkconst(exi, 1)) {
X        freeexpr(exi);
X        return makestmt_assign(exd,
X                               makeexpr_concat(exs, copyexpr(exd)));
X    }
X#endif
X    if (exprspeed(exi) < 5 && nosideeffects(exi, 0))
X        sp = NULL;
X    else {
X        tvari = makestmttempvar(tp_int, name_TEMP);
X        sp = makestmt_assign(makeexpr_var(tvari), exi);
X        exi = makeexpr_var(tvari);
X    }
X    exd = bumpstring(exd, exi, 1);
X    sp = makestmt_seq(sp, makestmt_assign(exd,
X                                          makeexpr_concat(exs, copyexpr(exd), 0)));
X    return sp;
X}
X
X
X
XStatic Stmt *proc_strmove()
X{
X    Expr *exlen, *exs, *exsi, *exd, *exdi;
X
X    if (!skipopenparen())
X	return NULL;
X    exlen = p_expr(tp_integer);
X    if (!skipcomma())
X	return NULL;
X    exs = p_expr(tp_str255);
X    if (!skipcomma())
X	return NULL;
X    exsi = p_expr(tp_integer);
X    if (!skipcomma())
X	return NULL;
X    exd = p_expr(tp_str255);
X    if (!skipcomma())
X	return NULL;
X    exdi = p_expr(tp_integer);
X    skipcloseparen();
X    exsi = makeexpr_arglong(exsi, 0);
X    exdi = makeexpr_arglong(exdi, 0);
X    return makestmt_call(makeexpr_bicall_5(strmovename, tp_str255,
X					   exlen, exs, exsi, exd, exdi));
X}
X
X
X
XStatic Expr *func_strlen(ex)
XExpr *ex;
X{
X    return makeexpr_bicall_1("strlen", tp_int, grabarg(ex, 0));
X}
X
X
X
XStatic Expr *func_strltrim(ex)
XExpr *ex;
X{
X    return makeexpr_assign(makeexpr_hat(ex->args[0], 0),
X                           makeexpr_bicall_1(strltrimname, tp_str255, ex->args[1]));
X}
X
X
X
XStatic Expr *func_strmax(ex)
XExpr *ex;
X{
X    return strmax_func(grabarg(ex, 0));
X}
X
X
X
XStatic Expr *func_strpos(ex)
XExpr *ex;
X{
X    char *cp;
X
X    if (!switch_strpos)
X        swapexprs(ex->args[0], ex->args[1]);
X    cp = strposname;
X    if (!*cp) {
X        note("STRPOS function used [201]");
X        cp = "STRPOS";
X    } 
X    return makeexpr_bicall_3(cp, tp_int,
X                             ex->args[0], 
X                             ex->args[1],
X                             makeexpr_long(1));
X}
X
X
X
XStatic Expr *func_strrpt(ex)
XExpr *ex;
X{
X    if (ex->args[1]->kind == EK_CONST &&
X        ex->args[1]->val.i == 1 && ex->args[1]->val.s[0] == ' ') {
X        return makeexpr_bicall_4("sprintf", tp_strptr, ex->args[0],
X                                 makeexpr_string("%*s"),
X                                 makeexpr_longcast(ex->args[2], 0),
X                                 makeexpr_string(""));
X    } else
X        return makeexpr_bicall_3(strrptname, tp_strptr, ex->args[0], ex->args[1],
X                                 makeexpr_arglong(ex->args[2], 0));
X}
X
X
X
XStatic Expr *func_strrtrim(ex)
XExpr *ex;
X{
X    return makeexpr_bicall_1(strrtrimname, tp_strptr,
X                             makeexpr_assign(makeexpr_hat(ex->args[0], 0),
X                                             ex->args[1]));
X}
X
X
X
XStatic Expr *func_succ()
X{
X    Expr *ex;
X
X    if (wneedtok(TOK_LPAR)) {
X	ex = p_ord_expr();
X	skipcloseparen();
X    } else
X	ex = p_ord_expr();
X#if 1
X    ex = makeexpr_inc(ex, makeexpr_long(1));
X#else
X    ex = makeexpr_cast(makeexpr_plus(ex, makeexpr_long(1)), ex->val.type);
X#endif
X    return ex;
X}
X
X
X
XStatic Expr *func_sqr()
X{
X    return makeexpr_sqr(p_parexpr(tp_integer), 0);
X}
X
X
X
XStatic Expr *func_sqrt(ex)
XExpr *ex;
X{
X    return makeexpr_bicall_1("sqrt", tp_longreal, grabarg(ex, 0));
X}
X
X
X
XStatic Expr *func_swap(ex)
XExpr *ex;
X{
X    char *cp;
X
X    ex = grabarg(ex, 0);
X    cp = swapname;
X    if (!*cp) {
X        note("SWAP function was used [202]");
X        cp = "SWAP";
X    }
X    return makeexpr_bicall_1(swapname, tp_int, ex);
X}
X
X
X
XStatic Expr *func_tan(ex)
XExpr *ex;
X{
X    return makeexpr_bicall_1("tan", tp_longreal, grabarg(ex, 0));
X}
X
X
XStatic Expr *func_tanh(ex)
XExpr *ex;
X{
X    return makeexpr_bicall_1("tanh", tp_longreal, grabarg(ex, 0));
X}
X
X
X
XStatic Expr *func_trunc(ex)
XExpr *ex;
X{
X    return makeexpr_actcast(grabarg(ex, 0), tp_integer);
X}
X
X
X
XStatic Expr *func_utrunc(ex)
XExpr *ex;
X{
X    return makeexpr_actcast(grabarg(ex, 0), tp_unsigned);
X}
X
X
X
XStatic Expr *func_uand()
X{
X    Expr *ex;
X
X    if (!skipopenparen())
X	return NULL;
X    ex = p_expr(tp_unsigned);
X    if (skipcomma()) {
X	ex = makeexpr_bin(EK_BAND, ex->val.type, ex, p_expr(tp_unsigned));
X	skipcloseparen();
X    }
X    return ex;
X}
X
X
X
XStatic Expr *func_udec()
X{
X    return handle_vax_hex(NULL, "u", 0);
X}
X
X
X
XStatic Expr *func_unot()
X{
X    Expr *ex;
X
X    if (!skipopenparen())
X	return NULL;
X    ex = p_expr(tp_unsigned);
X    ex = makeexpr_un(EK_BNOT, ex->val.type, ex);
X    skipcloseparen();
X    return ex;
X}
X
X
X
XStatic Expr *func_uor()
X{
X    Expr *ex;
X
X    if (!skipopenparen())
X	return NULL;
X    ex = p_expr(tp_unsigned);
X    if (skipcomma()) {
X	ex = makeexpr_bin(EK_BOR, ex->val.type, ex, p_expr(tp_unsigned));
X	skipcloseparen();
X    }
X    return ex;
X}
X
X
X
XStatic Expr *func_upcase(ex)
XExpr *ex;
X{
X    return makeexpr_bicall_1("toupper", tp_char, grabarg(ex, 0));
X}
X
X
X
XStatic Expr *func_upper()
X{
X    Expr *ex;
X    Value val;
X
X    if (!skipopenparen())
X	return NULL;
X    ex = p_expr(tp_integer);
X    if (curtok == TOK_COMMA) {
X	gettok();
X	val = p_constant(tp_integer);
X	if (!val.type || val.i != 1)
X	    note("UPPER(v,n) not supported for n>1 [190]");
X    }
X    skipcloseparen();
X    return copyexpr(ex->val.type->indextype->smax);
X}
X
X
X
XStatic Expr *func_uxor()
X{
X    Expr *ex;
X
X    if (!skipopenparen())
X	return NULL;
X    ex = p_expr(tp_unsigned);
X    if (skipcomma()) {
X	ex = makeexpr_bin(EK_BXOR, ex->val.type, ex, p_expr(tp_unsigned));
X	skipcloseparen();
X    }
X    return ex;
X}
X
X
X
XStatic Expr *func_val_modula()
X{
X    Expr *ex;
X    Type *tp;
X
X    if (!skipopenparen())
X	return NULL;
X    tp = p_type(NULL);
X    if (!skipcomma())
X	return NULL;
X    ex = p_expr(tp);
X    skipcloseparen();
X    return pascaltypecast(tp, ex);
X}
X
X
X
XStatic Stmt *proc_val_turbo()
X{
X    Expr *ex, *vex, *code, *fmt;
X
X    if (!skipopenparen())
X	return NULL;
X    ex = gentle_cast(p_expr(tp_str255), tp_str255);
X    if (!skipcomma())
X	return NULL;
X    vex = p_expr(NULL);
X    if (curtok == TOK_COMMA) {
X	gettok();
X	code = gentle_cast(p_expr(tp_integer), tp_integer);
X    } else
X	code = NULL;
X    skipcloseparen();
X    if (vex->val.type->kind == TK_REAL)
X        fmt = makeexpr_string("%lg");
X    else if (exprlongness(vex) > 0)
X        fmt = makeexpr_string("%ld");
X    else
X        fmt = makeexpr_string("%d");
X    ex = makeexpr_bicall_3("sscanf", tp_int,
X                           ex, fmt, makeexpr_addr(vex));
X    if (code) {
X	ex = makeexpr_rel(EK_EQ, ex, makeexpr_long(0));
X	return makestmt_assign(code, makeexpr_ord(ex));
X    } else
X	return makestmt_call(ex);
X}
X
X
X
X
X
X
X
XStatic Expr *writestrelement(ex, wid, vex, code, needboth)
XExpr *ex, *wid, *vex;
Xint code, needboth;
X{
X    if (formatstrings && needboth) {
X        return makeexpr_bicall_5("sprintf", tp_str255, vex,
X                                 makeexpr_string(format_d("%%*.*%c", code)),
X                                 copyexpr(wid),
X                                 wid,
X                                 ex);
X    } else {
X        return makeexpr_bicall_4("sprintf", tp_str255, vex,
X                                 makeexpr_string(format_d("%%*%c", code)),
X                                 wid,
X                                 ex);
X    }
X}
X
X
X
XStatic char *makeenumnames(tp)
XType *tp;
X{
X    Strlist *sp;
X    char *name;
X    Meaning *mp;
X    int saveindent;
X
X    for (sp = enumnames; sp && sp->value != (long)tp; sp = sp->next) ;
X    if (!sp) {
X        if (tp->meaning)
X            name = format_s(name_ENUM, tp->meaning->name);
X        else
X            name = format_s(name_ENUM, format_d("_%d", ++enumnamecount));
X        sp = strlist_insert(&enumnames, name);
X        sp->value = (long)tp;
X        outsection(2);
X        output(format_s("Static %s *", charname));
X        output(sp->s);
X        output("[] = {\n");
X	saveindent = outindent;
X	moreindent(tabsize);
X	moreindent(structinitindent);
X        for (mp = tp->fbase; mp; mp = mp->xnext) {
X            output(makeCstring(mp->sym->name, strlen(mp->sym->name)));
X            if (mp->xnext)
X                output(",\002 ");
X        }
X        outindent = saveindent;
X        output("\n} ;\n");
X        outsection(2);
X    }
X    return sp->s;
X}
X
X
X
X
X
X/* This function must return a "tempsprintf" */
X
XExpr *writeelement(ex, wid, prec, base)
XExpr *ex, *wid, *prec;
Xint base;
X{
X    Expr *vex, *ex1, *ex2;
X    Meaning *tvar;
X    char *fmtcode;
X    Type *type;
X
X    ex = makeexpr_charcast(ex);
X    if (ex->val.type->kind == TK_POINTER) {
X        ex = makeexpr_hat(ex, 0);   /* convert char *'s to strings */
X        intwarning("writeelement", "got a char * instead of a string [214]");
X    }
X    if ((ex->val.type->kind == TK_STRING && !wid) ||
X        (ord_type(ex->val.type)->kind == TK_CHAR && (!wid || checkconst(wid, 1)))) {
X        return makeexpr_sprintfify(ex);
X    }
X    tvar = makestmttempvar(tp_str255, name_STRING);
X    vex = makeexpr_var(tvar);
X    if (wid)
X        wid = makeexpr_longcast(wid, 0);
X    if (prec)
X        prec = makeexpr_longcast(prec, 0);
X#if 0
X    if (wid && (wid->kind == EK_CONST && wid->val.i < 0 ||
X                checkconst(wid, -1))) {
X        freeexpr(wid);     /* P-system uses write(x:-1) to mean write(x) */
X        wid = NULL;
X    }
X    if (prec && (prec->kind == EK_CONST && prec->val.i < 0 ||
X                 checkconst(prec, -1))) {
X        freeexpr(prec);
X        prec = NULL;
X    }
X#endif
X    switch (ord_type(ex->val.type)->kind) {
X
X        case TK_INTEGER:
X            if (!wid) {
X		if (integerwidth < 0)
X		    integerwidth = (which_lang == LANG_TURBO) ? 1 : 12;
X		wid = makeexpr_long(integerwidth);
X	    }
X	    type = findbasetype(ex->val.type, 0);
X	    if (base == 16)
X		fmtcode = "x";
X	    else if (base == 8)
X		fmtcode = "o";
X	    else if ((possiblesigns(wid) & (1|4)) == 1) {
X		wid = makeexpr_neg(wid);
X		fmtcode = "x";
X	    } else if (type == tp_unsigned ||
X		       type == tp_uint ||
X		       (type == tp_ushort && sizeof_int < 32))
X		fmtcode = "u";
X	    else
X		fmtcode = "d";
X            ex = makeexpr_forcelongness(ex);
X            if (checkconst(wid, 0) || checkconst(wid, 1)) {
X                ex = makeexpr_bicall_3("sprintf", tp_str255, vex,
X                                       makeexpr_string(format_ss("%%%s%s",
X								 (exprlongness(ex) > 0) ? "l" : "",
X								 fmtcode)),
X                                       ex);
X            } else {
X                ex = makeexpr_bicall_4("sprintf", tp_str255, vex,
X                                       makeexpr_string(format_ss("%%*%s%s",
X								 (exprlongness(ex) > 0) ? "l" : "",
X								 fmtcode)),
X                                       wid,
X                                       ex);
X            }
X            break;
X
X        case TK_CHAR:
X            ex = writestrelement(ex, wid, vex, 'c',
X                                     (wid->kind != EK_CONST || wid->val.i < 1));
X            break;
X
X        case TK_BOOLEAN:
X            if (!wid) {
X                ex = makeexpr_bicall_3("sprintf", tp_str255, vex,
X                                       makeexpr_string("%s"),
X                                       makeexpr_cond(ex,
X                                                     makeexpr_string(" TRUE"),
X                                                     makeexpr_string("FALSE")));
X            } else if (checkconst(wid, 1)) {
X                ex = makeexpr_bicall_3("sprintf", tp_str255, vex,
X                                       makeexpr_string("%c"),
X                                       makeexpr_cond(ex,
X                                                     makeexpr_char('T'),
X                                                     makeexpr_char('F')));
X            } else {
X                ex = writestrelement(makeexpr_cond(ex,
X                                                   makeexpr_string("TRUE"),
X                                                   makeexpr_string("FALSE")),
X                                     wid, vex, 's',
X                                     (wid->kind != EK_CONST || wid->val.i < 5));
X            }
X            break;
X
X        case TK_ENUM:
X            ex = makeexpr_bicall_3("sprintf", tp_str255, vex,
X                                   makeexpr_string("%s"),
X                                   makeexpr_index(makeexpr_name(makeenumnames(ex->val.type),
X                                                                tp_strptr),
X                                                  ex, NULL));
X            break;
X
X        case TK_REAL:
X            if (!wid)
X                wid = makeexpr_long(realwidth);
X            if (prec && (possiblesigns(prec) & (1|4)) != 1) {
X                ex = makeexpr_bicall_5("sprintf", tp_str255, vex,
X                                       makeexpr_string("%*.*f"),
X                                       wid,
X                                       prec,
X                                       ex);
X            } else {
X		if (prec)
X		    prec = makeexpr_neg(prec);
X		else
X		    prec = makeexpr_minus(copyexpr(wid),
X					  makeexpr_long(7));
X		if (prec->kind == EK_CONST) {
X		    if (prec->val.i <= 0)
X			prec = makeexpr_long(1);
X		} else {
X		    prec = makeexpr_bicall_2("P_max", tp_integer, prec,
X					     makeexpr_long(1));
X		}
X                if (wid->kind == EK_CONST && wid->val.i > 21) {
X                    ex = makeexpr_bicall_5("sprintf", tp_str255, vex,
X                                           makeexpr_string("%*.*E"),
X                                           wid,
X					   prec,
X                                           ex);
X#if 0
X                } else if (checkconst(wid, 7)) {
X                    ex = makeexpr_bicall_3("sprintf", tp_str255, vex,
X                                           makeexpr_string("%E"),
X                                           ex);
X#endif
X                } else {
X                    ex = makeexpr_bicall_4("sprintf", tp_str255, vex,
X                                           makeexpr_string("% .*E"),
X					   prec,
X                                           ex);
X                }
X            }
X            break;
X
X        case TK_STRING:
X            ex = writestrelement(ex, wid, vex, 's', 1);
X            break;
X
X        case TK_ARRAY:     /* assume packed array of char */
X	    ord_range_expr(ex->val.type->indextype, &ex1, &ex2);
X	    ex1 = makeexpr_plus(makeexpr_minus(copyexpr(ex2),
X					       copyexpr(ex1)),
X				makeexpr_long(1));
X	    ex1 = makeexpr_longcast(ex1, 0);
X	    fmtcode = "%.*s";
X            if (!wid) {
X		wid = ex1;
X            } else {
X		if (isliteralconst(wid, NULL) == 2 &&
X		    isliteralconst(ex1, NULL) == 2) {
X		    if (wid->val.i > ex1->val.i) {
X			fmtcode = format_ds("%*s%%.*s",
X					    wid->val.i - ex1->val.i, "");
X			wid = ex1;
X		    }
X		} else
X		    note("Format for packed-array-of-char will work only if width < length [321]");
X	    }
X            ex = makeexpr_bicall_4("sprintf", tp_str255, vex,
X                                   makeexpr_string(fmtcode),
X                                   wid,
X                                   makeexpr_addr(ex));
X            break;
X
X        default:
X            note("Element has wrong type for WRITE statement [196]");
X            ex = makeexpr_bicall_2("sprintf", tp_str255, vex, makeexpr_string("<meef>"));
X            break;
X
X    }
X    return ex;
X}
X
X
X
XStatic Stmt *handlewrite_text(fex, ex, iswriteln)
XExpr *fex, *ex;
Xint iswriteln;
X{
X    Expr *print, *wid, *prec;
X    unsigned char *ucp;
X    int i, done, base;
X
X    print = NULL;
X    for (;;) {
X        wid = NULL;
X        prec = NULL;
X	base = 10;
X	if (curtok == TOK_COLON && iswriteln >= 0) {
X	    gettok();
X	    wid = p_expr(tp_integer);
X	    if (curtok == TOK_COLON) {
X		gettok();
X		prec = p_expr(tp_integer);
X	    }
X	}
X	if (curtok == TOK_IDENT &&
X	    !strcicmp(curtokbuf, "OCT")) {
X	    base = 8;
X	    gettok();
X	} else if (curtok == TOK_IDENT &&
X		   !strcicmp(curtokbuf, "HEX")) {
X	    base = 16;
X	    gettok();
X	}
X        ex = writeelement(ex, wid, prec, base);
X        print = makeexpr_concat(print, cleansprintf(ex), 1);
X        if (curtok == TOK_COMMA && iswriteln >= 0) {
X            gettok();
X            ex = p_expr(NULL);
X        } else
X            break;
X    }
X    if (fex->val.type->kind != TK_STRING) {      /* not strwrite */
X        switch (iswriteln) {
X            case 1:
X            case -1:
X                print = makeexpr_concat(print, makeexpr_string("\n"), 1);
X                break;
X            case 2:
X            case -2:
X                print = makeexpr_concat(print, makeexpr_string("\r"), 1);
X                break;
X        }
X        if (isvar(fex, mp_output)) {
X            ucp = (unsigned char *)print->args[1]->val.s;
X            for (i = 0; i < print->args[1]->val.i; i++) {
X                if (ucp[i] >= 128 && ucp[i] < 144) {
X                    note("WRITE statement contains color/attribute characters [203]");
X		    break;
X		}
X            }
X        }
X        if ((i = sprintflength(print, 0)) > 0 && print->nargs == 2 && printfonly != 1) {
X            print = makeexpr_unsprintfify(print);
X            done = 1;
X            if (isvar(fex, mp_output)) {
X                if (i == 1) {
X                    print = makeexpr_bicall_1("putchar", tp_int,
X                                              makeexpr_charcast(print));
X                } else {
X                    if (printfonly == 0) {
X                        if (print->val.s[print->val.i-1] == '\n') {
X			    print->val.s[--(print->val.i)] = 0;
X                            print = makeexpr_bicall_1("puts", tp_int, print);
X                        } else {
X                            print = makeexpr_bicall_2("fputs", tp_int,
X                                                      print,
X                                                      copyexpr(fex));
X                        }
X                    } else {
X                        print = makeexpr_sprintfify(print);
X                        done = 0;
X                    }
X                }
X            } else {
X                if (i == 1) {
X                    print = makeexpr_bicall_2("putc", tp_int,
X                                              makeexpr_charcast(print),
X                                              copyexpr(fex));
X                } else if (printfonly == 0) {
X                    print = makeexpr_bicall_2("fputs", tp_int,
X                                              print,
X                                              copyexpr(fex));
X                } else {
X                    print = makeexpr_sprintfify(print);
X                    done = 0;
X                }
X            }
X        } else
X            done = 0;
X        if (!done) {
X            canceltempvar(istempvar(print->args[0]));
X            if (checkstring(print->args[1], "%s") && printfonly != 1) {
X                print = makeexpr_bicall_2("fputs", tp_int,
X                                          grabarg(print, 2),
X                                          copyexpr(fex));
X            } else if (checkstring(print->args[1], "%c") && printfonly != 1 &&
X                       !nosideeffects(print->args[2], 0)) {
X                print = makeexpr_bicall_2("fputc", tp_int,
X                                          grabarg(print, 2),
X                                          copyexpr(fex));
X            } else if (isvar(fex, mp_output)) {
X                if (checkstring(print->args[1], "%s\n") && printfonly != 1) {
X                    print = makeexpr_bicall_1("puts", tp_int, grabarg(print, 2));
X                } else if (checkstring(print->args[1], "%c") && printfonly != 1) {
X                    print = makeexpr_bicall_1("putchar", tp_int, grabarg(print, 2));
X                } else {
X                    strchange(&print->val.s, "printf");
X                    delfreearg(&print, 0);
X                    print->val.type = tp_int;
X                }
X            } else {
X                if (checkstring(print->args[1], "%c") && printfonly != 1) {
X                    print = makeexpr_bicall_2("putc", tp_int,
X                                              grabarg(print, 2),
X                                              copyexpr(fex));
X                } else {
X                    strchange(&print->val.s, "fprintf");
X                    freeexpr(print->args[0]);
X                    print->args[0] = copyexpr(fex);
X                    print->val.type = tp_int;
X                }
X            }
X        }
X        if (FCheck(checkfilewrite)) {
X            print = makeexpr_bicall_2("~SETIO", tp_void,
X                                      makeexpr_rel(EK_GE, print, makeexpr_long(0)),
X				      makeexpr_name(filewriteerrorname, tp_int));
X        }
X    }
X    return makestmt_call(print);
X}
X
X
X
XStatic Stmt *handlewrite_bin(fex, ex)
XExpr *fex, *ex;
X{
X    Type *basetype;
X    Stmt *sp;
X    Expr *tvardef = NULL;
X    Meaning *tvar = NULL;
X
X    sp = NULL;
X    basetype = fex->val.type->basetype->basetype;
X    for (;;) {
X        if (!expr_has_address(ex) || ex->val.type != basetype) {
X            if (!tvar)
X                tvar = makestmttempvar(basetype, name_TEMP);
X            if (!tvardef || !exprsame(tvardef, ex, 1)) {
X                freeexpr(tvardef);
X                tvardef = copyexpr(ex);
X                sp = makestmt_seq(sp, makestmt_assign(makeexpr_var(tvar),
X                                                      ex));
X            } else
X                freeexpr(ex);
X            ex = makeexpr_var(tvar);
X        }
X        ex = makeexpr_bicall_4("fwrite", tp_integer, makeexpr_addr(ex),
X                                                     makeexpr_sizeof(makeexpr_type(basetype), 0),
X                                                     makeexpr_long(1),
X                                                     copyexpr(fex));
X        if (FCheck(checkfilewrite)) {
X            ex = makeexpr_bicall_2("~SETIO", tp_void,
X                                   makeexpr_rel(EK_EQ, ex, makeexpr_long(1)),
X				   makeexpr_name(filewriteerrorname, tp_int));
X        }
X        sp = makestmt_seq(sp, makestmt_call(ex));
X        if (curtok == TOK_COMMA) {
X            gettok();
X            ex = p_expr(NULL);
X        } else
X            break;
X    }
X    freeexpr(tvardef);
X    return sp;
X}
X
X
X
XStatic Stmt *proc_write()
X{
X    Expr *fex, *ex;
X    Stmt *sp;
X
X    if (!skipopenparen())
X	return NULL;
X    ex = p_expr(NULL);
X    if (isfiletype(ex->val.type) && wneedtok(TOK_COMMA)) {
X        fex = ex;
X        ex = p_expr(NULL);
X    } else {
X        fex = makeexpr_var(mp_output);
X    }
X    if (fex->val.type == tp_text)
X        sp = handlewrite_text(fex, ex, 0);
X    else
X        sp = handlewrite_bin(fex, ex);
X    skipcloseparen();
X    return wrapopencheck(sp, fex);
X}
X
X
X
XStatic Stmt *handle_modula_write(fmt)
Xchar *fmt;
X{
X    Expr *ex, *wid;
X
X    if (!skipopenparen())
X	return NULL;
X    ex = makeexpr_forcelongness(p_expr(NULL));
X    if (skipcomma())
X	wid = p_expr(tp_integer);
X    else
X	wid = makeexpr_long(1);
X    if (checkconst(wid, 0) || checkconst(wid, 1))
X	ex = makeexpr_bicall_2("printf", tp_str255,
X			       makeexpr_string(format_ss("%%%s%s",
X							 (exprlongness(ex) > 0) ? "l" : "",
X							 fmt)),
X			       ex);
X    else
X	ex = makeexpr_bicall_3("printf", tp_str255,
X			       makeexpr_string(format_ss("%%*%s%s",
X							 (exprlongness(ex) > 0) ? "l" : "",
X							 fmt)),
X			       makeexpr_arglong(wid, 0),
X			       ex);
X    skipcloseparen();
X    return makestmt_call(ex);
X}
X
X
XStatic Stmt *proc_writecard()
X{
X    return handle_modula_write("u");
X}
X
X
XStatic Stmt *proc_writeint()
X{
X    return handle_modula_write("d");
X}
X
X
XStatic Stmt *proc_writehex()
X{
X    return handle_modula_write("x");
X}
X
X
XStatic Stmt *proc_writeoct()
X{
X    return handle_modula_write("o");
X}
X
X
XStatic Stmt *proc_writereal()
X{
X    return handle_modula_write("f");
X}
X
X
X
XStatic Stmt *proc_writedir()
X{
X    Expr *fex, *ex;
X    Stmt *sp;
X
X    if (!skipopenparen())
X	return NULL;
X    fex = p_expr(tp_text);
X    if (!skipcomma())
X	return NULL;
X    ex = p_expr(tp_integer);
X    sp = doseek(fex, ex);
X    if (!skipcomma())
X	return sp;
X    sp = makestmt_seq(sp, handlewrite_bin(fex, p_expr(NULL)));
X    skipcloseparen();
X    return wrapopencheck(sp, fex);
X}
X
X
X
XStatic Stmt *handlewriteln(iswriteln)
Xint iswriteln;
X{
X    Expr *fex, *ex;
X    Stmt *sp;
X    Meaning *deffile = mp_output;
X
X    sp = NULL;
X    if (iswriteln == 3) {
X	iswriteln = 1;
X	if (messagestderr)
X	    deffile = mp_stderr;
X    }
X    if (curtok != TOK_LPAR) {
X        fex = makeexpr_var(deffile);
X        if (iswriteln)
X            sp = handlewrite_text(fex, makeexpr_string(""), -iswriteln);
X    } else {
X        gettok();
X        ex = p_expr(NULL);
X        if (isfiletype(ex->val.type)) {
X            fex = ex;
X            if (curtok == TOK_RPAR || !wneedtok(TOK_COMMA)) {
X                if (iswriteln)
X                    ex = makeexpr_string("");
X                else
X                    ex = NULL;
X            } else {
X                ex = p_expr(NULL);
X            }
X        } else {
X            fex = makeexpr_var(deffile);
X        }
X        if (ex)
X            sp = handlewrite_text(fex, ex, iswriteln);
X        skipcloseparen();
X    }
X    if (iswriteln == 0) {
X        sp = makestmt_seq(sp, makestmt_call(makeexpr_bicall_1("fflush", tp_void,
X                                                              copyexpr(fex))));
X    }
X    return wrapopencheck(sp, fex);
X}
X
X
X
XStatic Stmt *proc_overprint()
X{
X    return handlewriteln(2);
X}
X
X
X
XStatic Stmt *proc_prompt()
X{
X    return handlewriteln(0);
X}
X
X
X
XStatic Stmt *proc_writeln()
X{
X    return handlewriteln(1);
X}
X
X
XStatic Stmt *proc_message()
X{
X    return handlewriteln(3);
X}
X
X
X
XStatic Stmt *proc_writev()
X{
X    Expr *vex, *ex;
X    Stmt *sp;
X    Meaning *mp;
X
X    if (!skipopenparen())
X	return NULL;
X    vex = p_expr(tp_str255);
X    if (curtok == TOK_RPAR) {
X	gettok();
X	return makestmt_assign(vex, makeexpr_string(""));
X    }
X    if (!skipcomma())
X	return NULL;
X    sp = handlewrite_text(vex, p_expr(NULL), 0);
X    skipcloseparen();
X    ex = sp->exp1;
X    if (ex->kind == EK_BICALL && !strcmp(ex->val.s, "sprintf") &&
X        (mp = istempvar(ex->args[0])) != NULL) {
X        canceltempvar(mp);
X        ex->args[0] = vex;
X    } else
X        sp->exp1 = makeexpr_assign(vex, ex);
X    return sp;
X}
X
X
XStatic Stmt *proc_strwrite(mp_x, spbase)
XMeaning *mp_x;
XStmt *spbase;
X{
X    Expr *vex, *exi, *exj, *ex;
X    Stmt *sp;
X    Meaning *mp;
X
X    if (!skipopenparen())
X	return NULL;
X    vex = p_expr(tp_str255);
X    if (!skipcomma())
X	return NULL;
X    exi = p_expr(tp_integer);
X    if (!skipcomma())
X	return NULL;
X    exj = p_expr(tp_integer);
X    if (!skipcomma())
X	return NULL;
X    sp = handlewrite_text(vex, p_expr(NULL), 0);
X    skipcloseparen();
X    ex = sp->exp1;
X    FREE(sp);
X    if (checkconst(exi, 1)) {
X        sp = spbase;
X        while (sp && sp->next)
X            sp = sp->next;
X        if (sp && sp->kind == SK_ASSIGN && sp->exp1->kind == EK_ASSIGN &&
X             (sp->exp1->args[0]->kind == EK_HAT ||
X              sp->exp1->args[0]->kind == EK_INDEX) &&
X             exprsame(sp->exp1->args[0]->args[0], vex, 1) &&
X             checkconst(sp->exp1->args[1], 0)) {
X            nukestmt(sp);     /* remove preceding bogus setstrlen */
X        }
X    }
X    if (ex->kind == EK_BICALL && !strcmp(ex->val.s, "sprintf") &&
X        (mp = istempvar(ex->args[0])) != NULL) {
X        canceltempvar(mp);
X        ex->args[0] = bumpstring(copyexpr(vex), exi, 1);
X        sp = makestmt_call(ex);
X    } else
X        sp = makestmt_assign(bumpstring(copyexpr(vex), exi, 1), ex);
X    if (fullstrwrite != 0) {
X        sp = makestmt_seq(sp, makestmt_assign(exj,
X                                              makeexpr_plus(makeexpr_bicall_1("strlen", tp_int, vex),
X                                                            makeexpr_long(1))));
X        if (fullstrwrite == 1)
X            note("FullStrWrite=1 not yet supported [204]");
X        if (fullstrwrite == 2)
X            note("STRWRITE was used [205]");
X    } else {
X        freeexpr(vex);
X    }
X    return mixassignments(sp, NULL);
X}
X
X
X
XStatic Stmt *proc_str_turbo()
X{
X    Expr *ex, *wid, *prec;
X
X    if (!skipopenparen())
X	return NULL;
X    ex = p_expr(NULL);
X    wid = NULL;
X    prec = NULL;
X    if (curtok == TOK_COLON) {
X        gettok();
X        wid = p_expr(tp_integer);
X        if (curtok == TOK_COLON) {
X            gettok();
X            prec = p_expr(tp_integer);
X        }
X    }
X    ex = writeelement(ex, wid, prec, 10);
X    if (!skipcomma())
X	return NULL;
X    wid = p_expr(tp_str255);
X    skipcloseparen();
X    return makestmt_assign(wid, ex);
X}
X
X
X
XStatic Expr *func_xor()
X{
X    Expr *ex, *ex2;
X    Type *type;
X    Meaning *tvar;
X
X    if (!skipopenparen())
X	return NULL;
X    ex = p_expr(NULL);
X    if (!skipcomma())
X	return ex;
X    ex2 = p_expr(ex->val.type);
X    skipcloseparen();
X    if (ex->val.type->kind != TK_SET &&
X	ex->val.type->kind != TK_SMALLSET) {
X	ex = makeexpr_bin(EK_BXOR, ex->val.type, ex, ex2);
X    } else {
X	type = mixsets(&ex, &ex2);
X	tvar = makestmttempvar(type, name_SET);
X	ex = makeexpr_bicall_3(setxorname, type,
X			       makeexpr_var(tvar),
X			       ex, ex2);
X    }
X    return ex;
X}
X
X
X
X
X
X
X
Xvoid decl_builtins()
X{
X    makespecialfunc( "ABS",           func_abs);
X    makespecialfunc( "ADDR",          func_addr);
X    if (!modula2)
X	makespecialfunc( "ADDRESS",   func_addr);
X    makespecialfunc( "ADDTOPOINTER",  func_addtopointer);
X    makespecialfunc( "ADR",           func_addr);
X    makespecialfunc( "ASL",	      func_lsl);
X    makespecialfunc( "ASR",	      func_asr);
X    makespecialfunc( "BADDRESS",      func_iaddress);
X    makespecialfunc( "BAND",	      func_uand);
X    makespecialfunc( "BIN",           func_bin);
X    makespecialfunc( "BITNEXT",	      func_bitnext);
X    makespecialfunc( "BITSIZE",	      func_bitsize);
X    makespecialfunc( "BITSIZEOF",     func_bitsize);
Xmp_blockread_ucsd =
X    makespecialfunc( "BLOCKREAD",     func_blockread);
Xmp_blockwrite_ucsd =
X    makespecialfunc( "BLOCKWRITE",    func_blockwrite);
X    makespecialfunc( "BNOT",	      func_unot);
X    makespecialfunc( "BOR",	      func_uor);
X    makespecialfunc( "BSL",	      func_bsl);
X    makespecialfunc( "BSR",	      func_bsr);
X    makespecialfunc( "BTST",	      func_btst);
X    makespecialfunc( "BXOR",	      func_uxor);
X    makespecialfunc( "BYTEREAD",      func_byteread);
X    makespecialfunc( "BYTEWRITE",     func_bytewrite);
X    makespecialfunc( "BYTE_OFFSET",   func_byte_offset);
X    makespecialfunc( "CHR",           func_chr);         
X    makespecialfunc( "CONCAT",        func_concat);
X    makespecialfunc( "DBLE",          func_float);
Xmp_dec_dec =
X    makespecialfunc( "DEC",           func_dec);
X    makespecialfunc( "EOF",           func_eof);
X    makespecialfunc( "EOLN",          func_eoln);
X    makespecialfunc( "FCALL",         func_fcall);
X    makespecialfunc( "FILEPOS",       func_filepos);
X    makespecialfunc( "FILESIZE",      func_filesize);
X    makespecialfunc( "FLOAT",	      func_float);
X    makespecialfunc( "HEX",           func_hex);         
X    makespecialfunc( "HI",            func_hi);
X    makespecialfunc( "HIWORD",        func_hiword);
X    makespecialfunc( "HIWRD",         func_hiword);
X    makespecialfunc( "HIGH",          func_high);
X    makespecialfunc( "IADDRESS",      func_iaddress);
X    makespecialfunc( "INT",           func_int);         
X    makespecialfunc( "LAND",	      func_uand);
X    makespecialfunc( "LNOT",	      func_unot);
X    makespecialfunc( "LO",            func_lo);
X    makespecialfunc( "LOOPHOLE",      func_loophole);
X    makespecialfunc( "LOR",	      func_uor);
X    makespecialfunc( "LOWER",	      func_lower);
X    makespecialfunc( "LOWORD",        func_loword);
X    makespecialfunc( "LOWRD",         func_loword);
X    makespecialfunc( "LSL",	      func_lsl);
X    makespecialfunc( "LSR",	      func_lsr);
X    makespecialfunc( "MAX",	      func_max);
X    makespecialfunc( "MAXPOS",        func_maxpos);
X    makespecialfunc( "MIN",	      func_min);
X    makespecialfunc( "NEXT",          func_sizeof);
X    makespecialfunc( "OCT",           func_oct);
X    makespecialfunc( "ORD",           func_ord);
X    makespecialfunc( "ORD4",          func_ord4);
X    makespecialfunc( "PI",	      func_pi);
X    makespecialfunc( "POSITION",      func_position);
X    makespecialfunc( "PRED",          func_pred);
X    makespecialfunc( "QUAD",          func_float);
X    makespecialfunc( "RANDOM",        func_random);
X    makespecialfunc( "REF",	      func_addr);
X    makespecialfunc( "SCAN",	      func_scan);
X    makespecialfunc( "SEEKEOF",       func_seekeof);
X    makespecialfunc( "SEEKEOLN",      func_seekeoln);
X    makespecialfunc( "SIZE",          func_sizeof);
X    makespecialfunc( "SIZEOF",        func_sizeof);
X    makespecialfunc( "SNGL",          func_sngl);
X    makespecialfunc( "SQR",           func_sqr);
X    makespecialfunc( "STATUSV",	      func_statusv);
X    makespecialfunc( "SUCC",          func_succ);
X    makespecialfunc( "TSIZE",         func_sizeof);
X    makespecialfunc( "UAND",	      func_uand);
X    makespecialfunc( "UDEC",          func_udec);
X    makespecialfunc( "UINT",          func_uint);         
X    makespecialfunc( "UNOT",	      func_unot);
X    makespecialfunc( "UOR",	      func_uor);
X    makespecialfunc( "UPPER",	      func_upper);
X    makespecialfunc( "UXOR",	      func_uxor);
Xmp_val_modula =
X    makespecialfunc( "VAL",	      func_val_modula);
X    makespecialfunc( "WADDRESS",      func_iaddress);
X    makespecialfunc( "XOR",	      func_xor);
X
X    makestandardfunc("ARCTAN",        func_arctan);
X    makestandardfunc("ARCTANH",       func_arctanh);
X    makestandardfunc("BINARY",        func_binary);      
X    makestandardfunc("CAP",           func_upcase);
X    makestandardfunc("COPY",          func_copy);        
X    makestandardfunc("COS",           func_cos);         
X    makestandardfunc("COSH",          func_cosh);         
X    makestandardfunc("EXP",           func_exp);         
X    makestandardfunc("EXP10",         func_pwroften);
X    makestandardfunc("EXPO",          func_expo);         
X    makestandardfunc("FRAC",          func_frac);        
X    makestandardfunc("INDEX",         func_strpos);      
X    makestandardfunc("LASTPOS",       NULL);             
X    makestandardfunc("LINEPOS",       NULL);             
X    makestandardfunc("LENGTH",        func_strlen);      
X    makestandardfunc("LN",            func_ln);          
X    makestandardfunc("LOG",           func_log);
X    makestandardfunc("LOG10",         func_log);
X    makestandardfunc("MAXAVAIL",      func_maxavail);
X    makestandardfunc("MEMAVAIL",      func_memavail);
X    makestandardfunc("OCTAL",         func_octal);       
X    makestandardfunc("ODD",           func_odd);         
X    makestandardfunc("PAD",           func_pad);
X    makestandardfunc("PARAMCOUNT",    func_paramcount);
X    makestandardfunc("PARAMSTR",      func_paramstr);    
X    makestandardfunc("POS",           func_pos);         
X    makestandardfunc("PTR",           func_ptr);
X    makestandardfunc("PWROFTEN",      func_pwroften);
X    makestandardfunc("ROUND",         func_round);       
X    makestandardfunc("SCANEQ",        func_scaneq);
X    makestandardfunc("SCANNE",        func_scanne);
X    makestandardfunc("SIN",           func_sin);         
X    makestandardfunc("SINH",          func_sinh);         
X    makestandardfunc("SQRT",          func_sqrt);        
Xmp_str_hp =
X    makestandardfunc("STR",           func_str_hp);
X    makestandardfunc("STRLEN",        func_strlen);      
X    makestandardfunc("STRLTRIM",      func_strltrim);    
X    makestandardfunc("STRMAX",        func_strmax);      
X    makestandardfunc("STRPOS",        func_strpos);      
X    makestandardfunc("STRRPT",        func_strrpt);      
X    makestandardfunc("STRRTRIM",      func_strrtrim);    
X    makestandardfunc("SUBSTR",        func_str_hp);
X    makestandardfunc("SWAP",          func_swap);        
X    makestandardfunc("TAN",           func_tan);       
X    makestandardfunc("TANH",          func_tanh);       
X    makestandardfunc("TRUNC",         func_trunc);       
X    makestandardfunc("UPCASE",        func_upcase);      
X    makestandardfunc("UROUND",        func_uround);
X    makestandardfunc("UTRUNC",        func_utrunc);
X
X    makespecialproc( "APPEND",        proc_append);
X    makespecialproc( "ARGV",	      proc_argv);
X    makespecialproc( "ASSERT",        proc_assert);
X    makespecialproc( "ASSIGN",        proc_assign);
X    makespecialproc( "BCLR",	      proc_bclr);
Xmp_blockread_turbo =
X    makespecialproc( "BLOCKREAD_TURBO", proc_blockread);
Xmp_blockwrite_turbo =
X    makespecialproc( "BLOCKWRITE_TURBO", proc_blockwrite);
X    makespecialproc( "BREAK",         proc_flush);
X    makespecialproc( "BSET",	      proc_bset);
X    makespecialproc( "CALL",          proc_call);
X    makespecialproc( "CLOSE",         proc_close);
X    makespecialproc( "CONNECT",       proc_assign);
X    makespecialproc( "CYCLE",	      proc_cycle);
Xmp_dec_turbo =
X    makespecialproc( "DEC_TURBO",     proc_dec);
X    makespecialproc( "DISPOSE",       proc_dispose);
X    makespecialproc( "ESCAPE",        proc_escape);
X    makespecialproc( "EXCL",          proc_excl);
X    makespecialproc( "EXIT",          proc_exit);
X    makespecialproc( "FILLCHAR",      proc_fillchar);
X    makespecialproc( "FLUSH",         proc_flush);
X    makespecialproc( "GET",           proc_get);
X    makespecialproc( "HALT",          proc_escape);
X    makespecialproc( "INC",           proc_inc);
X    makespecialproc( "INCL",          proc_incl);
X    makespecialproc( "LEAVE",	      proc_leave);
X    makespecialproc( "LOCATE",        proc_seek);
X    makespecialproc( "MESSAGE",       proc_message);
X    makespecialproc( "MOVE_FAST",     proc_move_fast);        
X    makespecialproc( "MOVE_L_TO_R",   proc_move_fast);        
X    makespecialproc( "MOVE_R_TO_L",   proc_move_fast);        
X    makespecialproc( "NEW",           proc_new);
X    if (which_lang != LANG_VAX)
X	makespecialproc( "OPEN",      proc_open);
X    makespecialproc( "OVERPRINT",     proc_overprint);
X    makespecialproc( "PACK",          NULL);
X    makespecialproc( "PAGE",          proc_page);
X    makespecialproc( "PUT",           proc_put);
X    makespecialproc( "PROMPT",        proc_prompt);
X    makespecialproc( "RANDOMIZE",     proc_randomize);
X    makespecialproc( "READ",          proc_read);
X    makespecialproc( "READDIR",       proc_readdir);
X    makespecialproc( "READLN",        proc_readln);
X    makespecialproc( "READV",         proc_readv);
X    makespecialproc( "RESET",         proc_reset);
X    makespecialproc( "REWRITE",       proc_rewrite);
X    makespecialproc( "SEEK",          proc_seek);
X    makespecialproc( "SETSTRLEN",     proc_setstrlen);
X    makespecialproc( "SETTEXTBUF",    proc_settextbuf);
Xmp_str_turbo =
X    makespecialproc( "STR_TURBO",     proc_str_turbo);
X    makespecialproc( "STRAPPEND",     proc_strappend);
X    makespecialproc( "STRDELETE",     proc_strdelete);
X    makespecialproc( "STRINSERT",     proc_strinsert);
X    makespecialproc( "STRMOVE",       proc_strmove);
X    makespecialproc( "STRREAD",       proc_strread);
X    makespecialproc( "STRWRITE",      proc_strwrite);
X    makespecialproc( "UNPACK",        NULL);
X    makespecialproc( "WRITE",         proc_write);
X    makespecialproc( "WRITEDIR",      proc_writedir);
X    makespecialproc( "WRITELN",       proc_writeln);
X    makespecialproc( "WRITEV",        proc_writev);
Xmp_val_turbo =
X    makespecialproc( "VAL_TURBO",     proc_val_turbo);
X
X    makestandardproc("DELETE",        proc_delete);      
X    makestandardproc("FREEMEM",       proc_freemem);     
X    makestandardproc("GETMEM",        proc_getmem);
X    makestandardproc("GOTOXY",        proc_gotoxy);      
X    makestandardproc("INSERT",        proc_insert);      
X    makestandardproc("MARK",          NULL);             
X    makestandardproc("MOVE",          proc_move);        
X    makestandardproc("MOVELEFT",      proc_move);        
X    makestandardproc("MOVERIGHT",     proc_move);        
X    makestandardproc("RELEASE",       NULL);             
X
X    makespecialvar(  "MEM",           var_mem);
X    makespecialvar(  "MEMW",          var_memw);
X    makespecialvar(  "MEML",          var_meml);
X    makespecialvar(  "PORT",          var_port);
X    makespecialvar(  "PORTW",         var_portw);
X
X    /* Modula-2 standard I/O procedures (case-sensitive!) */
X    makespecialproc( "Read",          proc_read);
X    makespecialproc( "ReadCard",      proc_read);
X    makespecialproc( "ReadInt",       proc_read);
X    makespecialproc( "ReadReal",      proc_read);
X    makespecialproc( "ReadString",    proc_read);
X    makespecialproc( "Write",         proc_write);
X    makespecialproc( "WriteCard",     proc_writecard);
X    makespecialproc( "WriteHex",      proc_writehex);
X    makespecialproc( "WriteInt",      proc_writeint);
X    makespecialproc( "WriteOct",      proc_writeoct);
X    makespecialproc( "WriteLn",       proc_writeln);
X    makespecialproc( "WriteReal",     proc_writereal);
X    makespecialproc( "WriteString",   proc_write);
X}
X
X
X
X
X/* End. */
X
X
X
END_OF_FILE
if test 42271 -ne `wc -c <'src/funcs.c.3'`; then
    echo shar: \"'src/funcs.c.3'\" unpacked with wrong size!
fi
# end of 'src/funcs.c.3'
fi
echo shar: End of archive 17 \(of 32\).
cp /dev/null ark17isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 32 archives.
    echo "Now see PACKNOTES and the README"
    rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
-- 
Please send comp.sources.unix-related mail to rsalz at uunet.uu.net.
Use a domain-based address or give alternate paths, or you may lose out.



More information about the Comp.sources.unix mailing list