funcs.c.2
上传用户:upcnvip
上传日期:2007-01-06
资源大小:474k
文件大小:47k
- return makestmt_call(makeexpr_bicall_2(getname, tp_void, ex,
- makeexpr_type(type->basetype->basetype)));
- }
- Static Stmt *proc_getmem(ex)
- Expr *ex;
- {
- Expr *vex, *ex2, *sz = NULL;
- Stmt *sp;
- vex = makeexpr_hat(eatcasts(ex->args[0]), 0);
- ex2 = ex->args[1];
- if (vex->val.type->kind == TK_POINTER)
- ex2 = convert_size(vex->val.type->basetype, ex2, "GETMEM");
- if (alloczeronil)
- sz = copyexpr(ex2);
- ex2 = makeexpr_bicall_1(mallocname, tp_anyptr, ex2);
- sp = makestmt_assign(copyexpr(vex), ex2);
- if (malloccheck) {
- sp = makestmt_seq(sp, makestmt_if(makeexpr_rel(EK_EQ, copyexpr(vex), makeexpr_nil()),
- makestmt_call(makeexpr_bicall_0(name_OUTMEM, tp_int)),
- NULL));
- }
- if (sz && !isconstantexpr(sz)) {
- if (alloczeronil == 2)
- note("Called GETMEM with variable argument [189]");
- sp = makestmt_if(makeexpr_rel(EK_NE, sz, makeexpr_long(0)),
- sp,
- makestmt_assign(vex, makeexpr_nil()));
- } else
- freeexpr(vex);
- return sp;
- }
- Static Stmt *proc_gotoxy(ex)
- Expr *ex;
- {
- return makestmt_call(makeexpr_bicall_2("gotoxy", tp_void,
- makeexpr_arglong(ex->args[0], 0),
- makeexpr_arglong(ex->args[1], 0)));
- }
- Static Expr *handle_vax_hex(ex, fmt, scale)
- Expr *ex;
- char *fmt;
- int scale;
- {
- Expr *lex, *dex, *vex;
- Meaning *tvar;
- Type *tp;
- long smin, smax;
- int bits;
- if (!ex) {
- if (!skipopenparen())
- return NULL;
- ex = p_expr(tp_integer);
- }
- tp = true_type(ex);
- if (ord_range(tp, &smin, &smax))
- bits = typebits(smin, smax);
- else
- bits = 32;
- if (curtok == TOK_COMMA) {
- gettok();
- if (curtok != TOK_COMMA)
- lex = makeexpr_arglong(p_expr(tp_integer), 0);
- else
- lex = NULL;
- } else
- lex = NULL;
- if (!lex) {
- if (!scale)
- lex = makeexpr_long(11);
- else
- lex = makeexpr_long((bits+scale-1) / scale + 1);
- }
- if (curtok == TOK_COMMA) {
- gettok();
- dex = makeexpr_arglong(p_expr(tp_integer), 0);
- } else {
- if (!scale)
- dex = makeexpr_long(10);
- else
- dex = makeexpr_long((bits+scale-1) / scale);
- }
- if (lex->kind == EK_CONST && dex->kind == EK_CONST &&
- lex->val.i < dex->val.i)
- lex = NULL;
- skipcloseparen();
- tvar = makestmttempvar(tp_str255, name_STRING);
- vex = makeexpr_var(tvar);
- ex = makeexpr_forcelongness(ex);
- if (exprlongness(ex) > 0)
- fmt = format_s("l%s", fmt);
- if (checkconst(lex, 0) || checkconst(lex, 1))
- lex = NULL;
- if (checkconst(dex, 0) || checkconst(dex, 1))
- dex = NULL;
- if (lex) {
- if (dex)
- ex = makeexpr_bicall_5("sprintf", tp_str255, vex,
- makeexpr_string(format_s("%%*.*%s", fmt)),
- lex, dex, ex);
- else
- ex = makeexpr_bicall_4("sprintf", tp_str255, vex,
- makeexpr_string(format_s("%%*%s", fmt)),
- lex, ex);
- } else {
- if (dex)
- ex = makeexpr_bicall_4("sprintf", tp_str255, vex,
- makeexpr_string(format_s("%%.*%s", fmt)),
- dex, ex);
- else
- ex = makeexpr_bicall_3("sprintf", tp_str255, vex,
- makeexpr_string(format_s("%%%s", fmt)),
- ex);
- }
- return ex;
- }
- Static Expr *func_hex()
- {
- Expr *ex;
- char *cp;
- if (!skipopenparen())
- return NULL;
- ex = makeexpr_stringcast(p_expr(tp_integer));
- if ((ex->val.type->kind == TK_STRING ||
- ex->val.type == tp_strptr) &&
- curtok != TOK_COMMA) {
- skipcloseparen();
- if (ex->kind == EK_CONST) { /* HP Pascal */
- cp = getstring(ex);
- ex = makeexpr_long(my_strtol(cp, NULL, 16));
- insertarg(&ex, 0, makeexpr_name("%#lx", tp_integer));
- return ex;
- } else {
- return makeexpr_bicall_3("strtol", tp_integer,
- ex, makeexpr_nil(), makeexpr_long(16));
- }
- } else { /* VAX Pascal */
- return handle_vax_hex(ex, "x", 4);
- }
- }
- Static Expr *func_hi()
- {
- Expr *ex;
- ex = force_unsigned(p_parexpr(tp_integer));
- return makeexpr_bin(EK_RSH, tp_ubyte,
- ex, makeexpr_long(8));
- }
- Static Expr *func_high()
- {
- Expr *ex;
- Type *type;
- ex = p_parexpr(tp_integer);
- type = ex->val.type;
- if (type->kind == TK_POINTER)
- type = type->basetype;
- if (type->kind == TK_ARRAY ||
- type->kind == TK_SMALLARRAY) {
- ex = makeexpr_minus(copyexpr(type->indextype->smax),
- copyexpr(type->indextype->smin));
- } else {
- warning("HIGH requires an array name parameter [210]");
- ex = makeexpr_bicall_1("HIGH", tp_int, ex);
- }
- return ex;
- }
- Static Expr *func_hiword()
- {
- Expr *ex;
- ex = force_unsigned(p_parexpr(tp_unsigned));
- return makeexpr_bin(EK_RSH, tp_unsigned,
- ex, makeexpr_long(16));
- }
- Static Stmt *proc_inc()
- {
- Expr *vex, *ex;
- if (!skipopenparen())
- return NULL;
- vex = p_expr(NULL);
- if (curtok == TOK_COMMA) {
- gettok();
- ex = p_expr(tp_integer);
- } else
- ex = makeexpr_long(1);
- skipcloseparen();
- return makestmt_assign(vex, makeexpr_plus(copyexpr(vex), ex));
- }
- Static Stmt *proc_incl()
- {
- Expr *vex, *ex;
- if (!skipopenparen())
- return NULL;
- vex = p_expr(NULL);
- if (!skipcomma())
- return NULL;
- ex = p_expr(vex->val.type->indextype);
- skipcloseparen();
- if (vex->val.type->kind == TK_SMALLSET)
- return makestmt_assign(vex, makeexpr_bin(EK_BOR, vex->val.type,
- copyexpr(vex),
- makeexpr_bin(EK_LSH, vex->val.type,
- makeexpr_longcast(makeexpr_long(1), 1),
- ex)));
- else
- return makestmt_call(makeexpr_bicall_2(setaddname, tp_void, vex,
- makeexpr_arglong(enum_to_int(ex), 0)));
- }
- Static Stmt *proc_insert(ex)
- Expr *ex;
- {
- return makestmt_call(makeexpr_bicall_3(strinsertname, tp_void,
- ex->args[0],
- ex->args[1],
- makeexpr_arglong(ex->args[2], 0)));
- }
- Static Expr *func_int()
- {
- Expr *ex;
- Meaning *tvar;
- ex = p_parexpr(tp_integer);
- if (ex->val.type->kind == TK_REAL) { /* Turbo Pascal INT */
- tvar = makestmttempvar(tp_longreal, name_TEMP);
- return makeexpr_comma(makeexpr_bicall_2("modf", tp_longreal,
- grabarg(ex, 0),
- makeexpr_addr(makeexpr_var(tvar))),
- makeexpr_var(tvar));
- } else { /* VAX Pascal INT */
- return makeexpr_ord(ex);
- }
- }
- Static Expr *func_uint()
- {
- Expr *ex;
- ex = p_parexpr(tp_integer);
- return makeexpr_cast(ex, tp_unsigned);
- }
- Static Stmt *proc_leave()
- {
- return makestmt(SK_BREAK);
- }
- Static Expr *func_lo()
- {
- Expr *ex;
- ex = gentle_cast(p_parexpr(tp_integer), tp_ushort);
- return makeexpr_bin(EK_BAND, tp_ubyte,
- ex, makeexpr_long(255));
- }
- Static Expr *func_loophole()
- {
- Type *type;
- Expr *ex;
- if (!skipopenparen())
- return NULL;
- type = p_type(NULL);
- if (!skipcomma())
- return NULL;
- ex = p_expr(tp_integer);
- skipcloseparen();
- return pascaltypecast(type, ex);
- }
- Static Expr *func_lower()
- {
- Expr *ex;
- Value val;
- if (!skipopenparen())
- return NULL;
- ex = p_expr(tp_integer);
- if (curtok == TOK_COMMA) {
- gettok();
- val = p_constant(tp_integer);
- if (!val.type || val.i != 1)
- note("LOWER(v,n) not supported for n>1 [190]");
- }
- skipcloseparen();
- return copyexpr(ex->val.type->indextype->smin);
- }
- Static Expr *func_loword()
- {
- Expr *ex;
- ex = p_parexpr(tp_integer);
- return makeexpr_bin(EK_BAND, tp_ushort,
- ex, makeexpr_long(65535));
- }
- Static Expr *func_ln(ex)
- Expr *ex;
- {
- return makeexpr_bicall_1("log", tp_longreal, grabarg(ex, 0));
- }
- Static Expr *func_log(ex)
- Expr *ex;
- {
- return makeexpr_bicall_1("log10", tp_longreal, grabarg(ex, 0));
- }
- Static Expr *func_max()
- {
- Type *tp;
- Expr *ex, *ex2;
- if (!skipopenparen())
- return NULL;
- if (curtok == TOK_IDENT && curtokmeaning &&
- curtokmeaning->kind == MK_TYPE) {
- tp = curtokmeaning->type;
- gettok();
- skipcloseparen();
- return copyexpr(tp->smax);
- }
- ex = p_expr(tp_integer);
- while (curtok == TOK_COMMA) {
- gettok();
- ex2 = p_expr(ex->val.type);
- if (ex->val.type->kind == TK_REAL) {
- tp = ex->val.type;
- if (ex2->val.type->kind != TK_REAL)
- ex2 = makeexpr_cast(ex2, tp);
- } else {
- tp = ex2->val.type;
- if (ex->val.type->kind != TK_REAL)
- ex = makeexpr_cast(ex, tp);
- }
- ex = makeexpr_bicall_2((tp->kind == TK_REAL) ? "P_rmax" : "P_imax",
- tp, ex, ex2);
- }
- skipcloseparen();
- return ex;
- }
- Static Expr *func_maxavail(ex)
- Expr *ex;
- {
- freeexpr(ex);
- return makeexpr_bicall_0("maxavail", tp_integer);
- }
- Static Expr *func_maxpos()
- {
- return file_iofunc(3, seek_base);
- }
- Static Expr *func_memavail(ex)
- Expr *ex;
- {
- freeexpr(ex);
- return makeexpr_bicall_0("memavail", tp_integer);
- }
- Static Expr *var_mem()
- {
- Expr *ex, *ex2;
- if (!wneedtok(TOK_LBR))
- return makeexpr_name("MEM", tp_integer);
- ex = p_expr(tp_integer);
- if (curtok == TOK_COLON) {
- gettok();
- ex2 = p_expr(tp_integer);
- ex = makeexpr_bicall_2("MEM", tp_ubyte, ex, ex2);
- } else {
- ex = makeexpr_bicall_1("MEM", tp_ubyte, ex);
- }
- if (!wneedtok(TOK_RBR))
- skippasttotoken(TOK_RBR, TOK_SEMI);
- note("Reference to MEM [191]");
- return ex;
- }
- Static Expr *var_memw()
- {
- Expr *ex, *ex2;
- if (!wneedtok(TOK_LBR))
- return makeexpr_name("MEMW", tp_integer);
- ex = p_expr(tp_integer);
- if (curtok == TOK_COLON) {
- gettok();
- ex2 = p_expr(tp_integer);
- ex = makeexpr_bicall_2("MEMW", tp_ushort, ex, ex2);
- } else {
- ex = makeexpr_bicall_1("MEMW", tp_ushort, ex);
- }
- if (!wneedtok(TOK_RBR))
- skippasttotoken(TOK_RBR, TOK_SEMI);
- note("Reference to MEMW [191]");
- return ex;
- }
- Static Expr *var_meml()
- {
- Expr *ex, *ex2;
- if (!wneedtok(TOK_LBR))
- return makeexpr_name("MEML", tp_integer);
- ex = p_expr(tp_integer);
- if (curtok == TOK_COLON) {
- gettok();
- ex2 = p_expr(tp_integer);
- ex = makeexpr_bicall_2("MEML", tp_integer, ex, ex2);
- } else {
- ex = makeexpr_bicall_1("MEML", tp_integer, ex);
- }
- if (!wneedtok(TOK_RBR))
- skippasttotoken(TOK_RBR, TOK_SEMI);
- note("Reference to MEML [191]");
- return ex;
- }
- Static Expr *func_min()
- {
- Type *tp;
- Expr *ex, *ex2;
- if (!skipopenparen())
- return NULL;
- if (curtok == TOK_IDENT && curtokmeaning &&
- curtokmeaning->kind == MK_TYPE) {
- tp = curtokmeaning->type;
- gettok();
- skipcloseparen();
- return copyexpr(tp->smin);
- }
- ex = p_expr(tp_integer);
- while (curtok == TOK_COMMA) {
- gettok();
- ex2 = p_expr(ex->val.type);
- if (ex->val.type->kind == TK_REAL) {
- tp = ex->val.type;
- if (ex2->val.type->kind != TK_REAL)
- ex2 = makeexpr_cast(ex2, tp);
- } else {
- tp = ex2->val.type;
- if (ex->val.type->kind != TK_REAL)
- ex = makeexpr_cast(ex, tp);
- }
- ex = makeexpr_bicall_2((tp->kind == TK_REAL) ? "P_rmin" : "P_imin",
- tp, ex, ex2);
- }
- skipcloseparen();
- return ex;
- }
- Static Stmt *proc_move(ex)
- Expr *ex;
- {
- ex->args[0] = gentle_cast(ex->args[0], tp_anyptr); /* source */
- ex->args[1] = gentle_cast(ex->args[1], tp_anyptr); /* dest */
- ex->args[2] = convert_size(choosetype(argbasetype(ex->args[0]),
- argbasetype(ex->args[1])), ex->args[2], "MOVE");
- return makestmt_call(makeexpr_bicall_3("memmove", tp_void,
- ex->args[1],
- ex->args[0],
- makeexpr_arglong(ex->args[2], (size_t_long != 0))));
- }
- Static Stmt *proc_move_fast()
- {
- Expr *ex, *ex2, *ex3, *ex4;
- if (!skipopenparen())
- return NULL;
- ex = p_expr(tp_integer);
- if (!skipcomma())
- return NULL;
- ex2 = p_expr(tp_integer);
- if (!skipcomma())
- return NULL;
- ord_range_expr(ex2->val.type->indextype, &ex4, NULL);
- ex2 = makeexpr_index(ex2, p_expr(tp_integer), copyexpr(ex4));
- if (!skipcomma())
- return NULL;
- ex3 = p_expr(tp_integer);
- if (!skipcomma())
- return NULL;
- ord_range_expr(ex3->val.type->indextype, &ex4, NULL);
- ex3 = makeexpr_index(ex3, p_expr(tp_integer), copyexpr(ex4));
- skipcloseparen();
- ex = convert_size(choosetype(argbasetype(ex2),
- argbasetype(ex3)), ex, "MOVE_FAST");
- return makestmt_call(makeexpr_bicall_3("memmove", tp_void,
- makeexpr_addr(ex3),
- makeexpr_addr(ex2),
- makeexpr_arglong(ex, (size_t_long != 0))));
- }
- Static Stmt *proc_new()
- {
- Expr *ex, *ex2;
- Stmt *sp, **spp;
- Type *type;
- char *name, *name2 = NULL, vbuf[1000];
- if (!skipopenparen())
- return NULL;
- ex = p_expr(tp_anyptr);
- type = ex->val.type;
- if (type->kind == TK_POINTER)
- type = type->basetype;
- parse_special_variant(type, vbuf);
- skipcloseparen();
- name = find_special_variant(vbuf, NULL, specialmallocs, 3);
- if (!name) {
- name2 = find_special_variant(vbuf, NULL, specialsizeofs, 3);
- if (!name2) {
- name = find_special_variant(vbuf, NULL, specialmallocs, 1);
- name2 = find_special_variant(vbuf, NULL, specialsizeofs, 1);
- if (name || !name2)
- name = find_special_variant(vbuf, "SpecialMalloc", specialmallocs, 1);
- else
- name2 = find_special_variant(vbuf, "SpecialSizeOf", specialsizeofs, 1);
- }
- }
- if (name) {
- ex2 = makeexpr_bicall_0(name, ex->val.type);
- } else if (name2) {
- ex2 = makeexpr_bicall_1(mallocname, tp_anyptr, pc_expr_str(name2));
- } else {
- ex2 = makeexpr_bicall_1(mallocname, tp_anyptr,
- makeexpr_sizeof(makeexpr_type(type), 1));
- }
- sp = makestmt_assign(copyexpr(ex), ex2);
- if (malloccheck) {
- sp = makestmt_seq(sp, makestmt_if(makeexpr_rel(EK_EQ,
- copyexpr(ex),
- makeexpr_nil()),
- makestmt_call(makeexpr_bicall_0(name_OUTMEM, tp_int)),
- NULL));
- }
- spp = &sp->next;
- while (*spp)
- spp = &(*spp)->next;
- if (type->kind == TK_RECORD)
- initfilevars(type->fbase, &spp, makeexpr_hat(copyexpr(ex), 0));
- else if (isfiletype(type))
- sp = makestmt_seq(sp, makestmt_assign(makeexpr_hat(copyexpr(ex), 0),
- makeexpr_nil()));
- freeexpr(ex);
- return sp;
- }
- Static Expr *func_oct()
- {
- return handle_vax_hex(NULL, "o", 3);
- }
- Static Expr *func_octal(ex)
- Expr *ex;
- {
- char *cp;
- ex = grabarg(ex, 0);
- if (ex->kind == EK_CONST) {
- cp = getstring(ex);
- ex = makeexpr_long(my_strtol(cp, NULL, 8));
- insertarg(&ex, 0, makeexpr_name("0%lo", tp_integer));
- return ex;
- } else {
- return makeexpr_bicall_3("strtol", tp_integer,
- ex, makeexpr_nil(), makeexpr_long(8));
- }
- }
- Static Expr *func_odd(ex)
- Expr *ex;
- {
- ex = makeexpr_unlongcast(grabarg(ex, 0));
- if (*oddname)
- return makeexpr_bicall_1(oddname, tp_boolean, ex);
- else
- return makeexpr_bin(EK_BAND, tp_boolean, ex, makeexpr_long(1));
- }
- Static Stmt *proc_open()
- {
- return handleopen(2);
- }
- Static Expr *func_ord()
- {
- Expr *ex;
- if (wneedtok(TOK_LPAR)) {
- ex = p_ord_expr();
- skipcloseparen();
- } else
- ex = p_ord_expr();
- return makeexpr_ord(ex);
- }
- Static Expr *func_ord4()
- {
- Expr *ex;
- if (wneedtok(TOK_LPAR)) {
- ex = p_ord_expr();
- skipcloseparen();
- } else
- ex = p_ord_expr();
- return makeexpr_longcast(makeexpr_ord(ex), 1);
- }
- Static Expr *func_pad(ex)
- Expr *ex;
- {
- if (checkconst(ex->args[1], 0) || /* "s" is null string */
- checkconst(ex->args[2], ' ')) {
- return makeexpr_bicall_4("sprintf", tp_strptr, ex->args[0],
- makeexpr_string("%*s"),
- makeexpr_longcast(ex->args[3], 0),
- makeexpr_string(""));
- }
- return makeexpr_bicall_4(strpadname, tp_strptr,
- ex->args[0], ex->args[1], ex->args[2],
- makeexpr_arglong(ex->args[3], 0));
- }
- Static Stmt *proc_page()
- {
- Expr *fex, *ex;
- if (curtok == TOK_LPAR) {
- fex = p_parexpr(tp_text);
- ex = makeexpr_bicall_2("fprintf", tp_int,
- copyexpr(fex),
- makeexpr_string("f"));
- } else {
- fex = makeexpr_var(mp_output);
- ex = makeexpr_bicall_1("printf", tp_int,
- makeexpr_string("f"));
- }
- if (FCheck(checkfilewrite)) {
- ex = makeexpr_bicall_2("~SETIO", tp_void,
- makeexpr_rel(EK_GE, ex, makeexpr_long(0)),
- makeexpr_name(filewriteerrorname, tp_int));
- }
- return wrapopencheck(makestmt_call(ex), fex);
- }
- Static Expr *func_paramcount(ex)
- Expr *ex;
- {
- freeexpr(ex);
- return makeexpr_minus(makeexpr_name(name_ARGC, tp_int),
- makeexpr_long(1));
- }
- Static Expr *func_paramstr(ex)
- Expr *ex;
- {
- Expr *ex2;
- ex2 = makeexpr_index(makeexpr_name(name_ARGV,
- makepointertype(tp_strptr)),
- makeexpr_unlongcast(ex->args[1]),
- makeexpr_long(0));
- ex2->val.type = tp_str255;
- return makeexpr_bicall_3("sprintf", tp_strptr,
- ex->args[0],
- makeexpr_string("%s"),
- ex2);
- }
- Static Expr *func_pi()
- {
- return makeexpr_name("M_PI", tp_longreal);
- }
- Static Expr *var_port()
- {
- Expr *ex;
- if (!wneedtok(TOK_LBR))
- return makeexpr_name("PORT", tp_integer);
- ex = p_expr(tp_integer);
- if (!wneedtok(TOK_RBR))
- skippasttotoken(TOK_RBR, TOK_SEMI);
- note("Reference to PORT [191]");
- return makeexpr_bicall_1("PORT", tp_ubyte, ex);
- }
- Static Expr *var_portw()
- {
- Expr *ex;
- if (!wneedtok(TOK_LBR))
- return makeexpr_name("PORTW", tp_integer);
- ex = p_expr(tp_integer);
- if (!wneedtok(TOK_RBR))
- skippasttotoken(TOK_RBR, TOK_SEMI);
- note("Reference to PORTW [191]");
- return makeexpr_bicall_1("PORTW", tp_ushort, ex);
- }
- Static Expr *func_pos(ex)
- Expr *ex;
- {
- char *cp;
- cp = strposname;
- if (!*cp) {
- note("POS function used [192]");
- cp = "POS";
- }
- return makeexpr_bicall_3(cp, tp_int,
- ex->args[1],
- ex->args[0],
- makeexpr_long(1));
- }
- Static Expr *func_ptr(ex)
- Expr *ex;
- {
- note("PTR function was used [193]");
- return ex;
- }
- Static Expr *func_position()
- {
- return file_iofunc(2, seek_base);
- }
- Static Expr *func_pred()
- {
- Expr *ex;
- if (wneedtok(TOK_LPAR)) {
- ex = p_ord_expr();
- skipcloseparen();
- } else
- ex = p_ord_expr();
- #if 1
- ex = makeexpr_inc(ex, makeexpr_long(-1));
- #else
- ex = makeexpr_cast(makeexpr_plus(ex, makeexpr_long(-1)), ex->val.type);
- #endif
- return ex;
- }
- Static Stmt *proc_put()
- {
- Expr *ex;
- Type *type;
- if (curtok == TOK_LPAR)
- ex = p_parexpr(tp_text);
- else
- ex = makeexpr_var(mp_output);
- requirefilebuffer(ex);
- type = ex->val.type;
- if (isfiletype(type) && *charputname &&
- type->basetype->basetype->kind == TK_CHAR)
- return makestmt_call(makeexpr_bicall_1(charputname, tp_void, ex));
- else if (isfiletype(type) && *arrayputname &&
- type->basetype->basetype->kind == TK_ARRAY)
- return makestmt_call(makeexpr_bicall_2(arrayputname, tp_void, ex,
- makeexpr_type(type->basetype->basetype)));
- else
- return makestmt_call(makeexpr_bicall_2(putname, tp_void, ex,
- makeexpr_type(type->basetype->basetype)));
- }
- Static Expr *func_pwroften(ex)
- Expr *ex;
- {
- return makeexpr_bicall_2("pow", tp_longreal,
- makeexpr_real("10.0"), grabarg(ex, 0));
- }
- Static Stmt *proc_reset()
- {
- return handleopen(0);
- }
- Static Stmt *proc_rewrite()
- {
- return handleopen(1);
- }
- Stmt *doseek(fex, ex)
- Expr *fex, *ex;
- {
- Expr *ex2;
- Type *basetype = fex->val.type->basetype->basetype;
- if (ansiC == 1)
- ex2 = makeexpr_name("SEEK_SET", tp_int);
- else
- ex2 = makeexpr_long(0);
- ex = makeexpr_bicall_3("fseek", tp_int,
- copyexpr(fex),
- makeexpr_arglong(
- makeexpr_times(makeexpr_minus(ex,
- makeexpr_long(seek_base)),
- makeexpr_sizeof(makeexpr_type(basetype), 0)),
- 1),
- ex2);
- if (FCheck(checkfileseek)) {
- ex = makeexpr_bicall_2("~SETIO", tp_void,
- makeexpr_rel(EK_EQ, ex, makeexpr_long(0)),
- makeexpr_name(endoffilename, tp_int));
- }
- return makestmt_call(ex);
- }
- Static Expr *makegetchar(fex)
- Expr *fex;
- {
- if (isvar(fex, mp_input))
- return makeexpr_bicall_0("getchar", tp_char);
- else
- return makeexpr_bicall_1("getc", tp_char, copyexpr(fex));
- }
- Static Stmt *fixscanf(sp, fex)
- Stmt *sp;
- Expr *fex;
- {
- int nargs, i, isstrread;
- char *cp;
- Expr *ex;
- Stmt *sp2;
- isstrread = (fex->val.type->kind == TK_STRING);
- if (sp->kind == SK_ASSIGN && sp->exp1->kind == EK_BICALL &&
- !strcmp(sp->exp1->val.s, "scanf")) {
- if (sp->exp1->args[0]->kind == EK_CONST &&
- !(sp->exp1->args[0]->val.i&1) && !isstrread) {
- cp = sp->exp1->args[0]->val.s; /* scanf("%c%c") -> getchar;getchar */
- for (i = 0; cp[i] == '%' && cp[i+1] == 'c'; ) {
- i += 2;
- if (i == sp->exp1->args[0]->val.i) {
- sp2 = NULL;
- for (i = 1; i < sp->exp1->nargs; i++) {
- ex = makeexpr_hat(sp->exp1->args[i], 0);
- sp2 = makestmt_seq(sp2,
- makestmt_assign(copyexpr(ex),
- makegetchar(fex)));
- if (checkeof(fex)) {
- sp2 = makestmt_seq(sp2,
- makestmt_call(makeexpr_bicall_2("~SETIO", tp_void,
- makeexpr_rel(EK_NE,
- ex,
- makeexpr_name("EOF", tp_char)),
- makeexpr_name(endoffilename, tp_int))));
- } else
- freeexpr(ex);
- }
- return sp2;
- }
- }
- }
- nargs = sp->exp1->nargs - 1;
- if (isstrread) {
- strchange(&sp->exp1->val.s, "sscanf");
- insertarg(&sp->exp1, 0, copyexpr(fex));
- } else if (!isvar(fex, mp_input)) {
- strchange(&sp->exp1->val.s, "fscanf");
- insertarg(&sp->exp1, 0, copyexpr(fex));
- }
- if (FCheck(checkreadformat)) {
- if (checkeof(fex) && !isstrread)
- ex = makeexpr_cond(makeexpr_rel(EK_NE,
- makeexpr_bicall_1("feof", tp_int, copyexpr(fex)),
- makeexpr_long(0)),
- makeexpr_name(endoffilename, tp_int),
- makeexpr_name(badinputformatname, tp_int));
- else
- ex = makeexpr_name(badinputformatname, tp_int);
- sp->exp1 = makeexpr_bicall_2("~SETIO", tp_void,
- makeexpr_rel(EK_EQ,
- sp->exp1,
- makeexpr_long(nargs)),
- ex);
- } else if (checkeof(fex) && !isstrread) {
- sp->exp1 = makeexpr_bicall_2("~SETIO", tp_void,
- makeexpr_rel(EK_NE,
- sp->exp1,
- makeexpr_name("EOF", tp_int)),
- makeexpr_name(endoffilename, tp_int));
- }
- }
- return sp;
- }
- Static Expr *makefgets(vex, lex, fex)
- Expr *vex, *lex, *fex;
- {
- Expr *ex;
- ex = makeexpr_bicall_3("fgets", tp_strptr,
- vex,
- lex,
- copyexpr(fex));
- if (checkeof(fex)) {
- ex = makeexpr_bicall_2("~SETIO", tp_void,
- makeexpr_rel(EK_NE, ex, makeexpr_nil()),
- makeexpr_name(endoffilename, tp_int));
- }
- return ex;
- }
- Static Stmt *skipeoln(fex)
- Expr *fex;
- {
- Meaning *tvar;
- Expr *ex;
- if (!strcmp(readlnname, "fgets")) {
- tvar = makestmttempvar(tp_str255, name_STRING);
- return makestmt_call(makefgets(makeexpr_var(tvar),
- makeexpr_long(stringceiling+1),
- fex));
- } else if (!strcmp(readlnname, "scanf") || !*readlnname) {
- if (checkeof(fex))
- ex = makeexpr_bicall_2("~SETIO", tp_void,
- makeexpr_rel(EK_NE,
- makegetchar(fex),
- makeexpr_name("EOF", tp_char)),
- makeexpr_name(endoffilename, tp_int));
- else
- ex = makegetchar(fex);
- return makestmt_seq(fixscanf(
- makestmt_call(makeexpr_bicall_1("scanf", tp_int,
- makeexpr_string("%*[^n]"))), fex),
- makestmt_call(ex));
- } else {
- return makestmt_call(makeexpr_bicall_1(readlnname, tp_void,
- copyexpr(fex)));
- }
- }
- Static Stmt *handleread_text(fex, var, isreadln)
- Expr *fex, *var;
- int isreadln;
- {
- Stmt *spbase, *spafter, *sp;
- Expr *ex = NULL, *exj = NULL;
- Type *type;
- Meaning *tvar, *tempcp, *mp;
- int i, isstrread, scanfmode, readlnflag, varstring, maxstring;
- int longstrsize = (longstringsize > 0) ? longstringsize : stringceiling;
- long rmin, rmax;
- char *fmt;
- spbase = NULL;
- spafter = NULL;
- sp = NULL;
- tempcp = NULL;
- isstrread = (fex->val.type->kind == TK_STRING);
- if (isstrread) {
- exj = var;
- var = p_expr(NULL);
- }
- scanfmode = !strcmp(readlnname, "scanf") || !*readlnname || isstrread;
- for (;;) {
- readlnflag = isreadln && curtok == TOK_RPAR;
- if (var->val.type->kind == TK_STRING && !isstrread) {
- if (sp)
- spbase = makestmt_seq(spbase, fixscanf(sp, fex));
- spbase = makestmt_seq(spbase, spafter);
- varstring = (varstrings && var->kind == EK_VAR &&
- (mp = (Meaning *)var->val.i)->kind == MK_VARPARAM &&
- mp->type == tp_strptr);
- maxstring = (strmax(var) >= longstrsize && !varstring);
- if (isvar(fex, mp_input) && maxstring && usegets && readlnflag) {
- spbase = makestmt_seq(spbase,
- makestmt_call(makeexpr_bicall_1("gets", tp_str255,
- makeexpr_addr(var))));
- isreadln = 0;
- } else if (scanfmode && !varstring &&
- (*readlnname || !isreadln)) {
- spbase = makestmt_seq(spbase, makestmt_assign(makeexpr_hat(copyexpr(var), 0),
- makeexpr_char(0)));
- if (maxstring && usegets)
- ex = makeexpr_string("%[^n]");
- else
- ex = makeexpr_string(format_d("%%%d[^n]", strmax(var)));
- ex = makeexpr_bicall_2("scanf", tp_int, ex, makeexpr_addr(var));
- spbase = makestmt_seq(spbase, fixscanf(makestmt_call(ex), fex));
- if (readlnflag && maxstring && usegets) {
- spbase = makestmt_seq(spbase, makestmt_call(makegetchar(fex)));
- isreadln = 0;
- }
- } else {
- ex = makeexpr_plus(strmax_func(var), makeexpr_long(1));
- spbase = makestmt_seq(spbase,
- makestmt_call(makefgets(makeexpr_addr(copyexpr(var)),
- ex,
- fex)));
- if (!tempcp)
- tempcp = makestmttempvar(tp_charptr, name_TEMP);
- spbase = makestmt_seq(spbase,
- makestmt_assign(makeexpr_var(tempcp),
- makeexpr_bicall_2("strchr", tp_charptr,
- makeexpr_addr(copyexpr(var)),
- makeexpr_char('n'))));
- sp = makestmt_assign(makeexpr_hat(makeexpr_var(tempcp), 0),
- makeexpr_long(0));
- if (readlnflag)
- isreadln = 0;
- else
- sp = makestmt_seq(sp,
- makestmt_call(makeexpr_bicall_2("ungetc", tp_void,
- makeexpr_char('n'),
- copyexpr(fex))));
- spbase = makestmt_seq(spbase, makestmt_if(makeexpr_rel(EK_NE,
- makeexpr_var(tempcp),
- makeexpr_nil()),
- sp,
- NULL));
- }
- sp = NULL;
- spafter = NULL;
- } else if (var->val.type->kind == TK_ARRAY && !isstrread) {
- if (sp)
- spbase = makestmt_seq(spbase, fixscanf(sp, fex));
- spbase = makestmt_seq(spbase, spafter);
- ex = makeexpr_sizeof(copyexpr(var), 0);
- if (readlnflag) {
- spbase = makestmt_seq(spbase,
- makestmt_call(
- makeexpr_bicall_3("P_readlnpaoc", tp_void,
- copyexpr(fex),
- makeexpr_addr(var),
- makeexpr_arglong(ex, 0))));
- isreadln = 0;
- } else {
- spbase = makestmt_seq(spbase,
- makestmt_call(
- makeexpr_bicall_3("P_readpaoc", tp_void,
- copyexpr(fex),
- makeexpr_addr(var),
- makeexpr_arglong(ex, 0))));
- }
- sp = NULL;
- spafter = NULL;
- } else {
- switch (ord_type(var->val.type)->kind) {
- case TK_INTEGER:
- fmt = "d";
- if (curtok == TOK_COLON) {
- gettok();
- if (curtok == TOK_IDENT &&
- !strcicmp(curtokbuf, "HEX")) {
- fmt = "x";
- } else if (curtok == TOK_IDENT &&
- !strcicmp(curtokbuf, "OCT")) {
- fmt = "o";
- } else if (curtok == TOK_IDENT &&
- !strcicmp(curtokbuf, "BIN")) {
- fmt = "b";
- note("Using %b for binary format in scanf [194]");
- } else
- warning("Unrecognized format specified in READ [212]");
- gettok();
- }
- type = findbasetype(var->val.type, 0);
- if (exprlongness(var) > 0)
- ex = makeexpr_string(format_s("%%l%s", fmt));
- else if (type == tp_integer || type == tp_int ||
- type == tp_uint || type == tp_sint)
- ex = makeexpr_string(format_s("%%%s", fmt));
- else if (type == tp_sshort || type == tp_ushort)
- ex = makeexpr_string(format_s("%%h%s", fmt));
- else {
- tvar = makestmttempvar(tp_int, name_TEMP);
- spafter = makestmt_seq(spafter,
- makestmt_assign(var,
- makeexpr_var(tvar)));
- var = makeexpr_var(tvar);
- ex = makeexpr_string(format_s("%%%s", fmt));
- }
- break;
- case TK_CHAR:
- ex = makeexpr_string("%c");
- if (newlinespace && !isstrread) {
- spafter = makestmt_seq(spafter,
- makestmt_if(makeexpr_rel(EK_EQ,
- copyexpr(var),
- makeexpr_char('n')),
- makestmt_assign(copyexpr(var),
- makeexpr_char(' ')),
- NULL));
- }
- break;
- case TK_BOOLEAN:
- tvar = makestmttempvar(tp_str255, name_STRING);
- spafter = makestmt_seq(spafter,
- makestmt_assign(var,
- makeexpr_or(makeexpr_rel(EK_EQ,
- makeexpr_hat(makeexpr_var(tvar), 0),
- makeexpr_char('T')),
- makeexpr_rel(EK_EQ,
- makeexpr_hat(makeexpr_var(tvar), 0),
- makeexpr_char('t')))));
- var = makeexpr_var(tvar);
- ex = makeexpr_string(" %[a-zA-Z]");
- break;
- case TK_ENUM:
- warning("READ on enumerated types not yet supported [213]");
- if (useenum)
- ex = makeexpr_string("%d");
- else
- ex = makeexpr_string("%hd");
- break;
- case TK_REAL:
- ex = makeexpr_string("%lg");
- break;
- case TK_STRING: /* strread only */
- ex = makeexpr_string(format_d("%%%dc", strmax(fex)));
- break;
- case TK_ARRAY: /* strread only */
- if (!ord_range(ex->val.type->indextype, &rmin, &rmax)) {
- rmin = 1;
- rmax = 1;
- note("Can't determine length of packed array of chars [195]");
- }
- ex = makeexpr_string(format_d("%%%ldc", rmax-rmin+1));
- break;
- default:
- note("Element has wrong type for WRITE statement [196]");
- ex = NULL;
- break;
- }
- if (ex) {
- var = makeexpr_addr(var);
- if (sp) {
- sp->exp1->args[0] = makeexpr_concat(sp->exp1->args[0], ex, 0);
- insertarg(&sp->exp1, sp->exp1->nargs, var);
- } else {
- sp = makestmt_call(makeexpr_bicall_2("scanf", tp_int, ex, var));
- }
- }
- }
- if (curtok == TOK_COMMA) {
- gettok();
- var = p_expr(NULL);
- } else
- break;
- }
- if (sp) {
- if (isstrread && !FCheck(checkreadformat) &&
- ((i=0, checkstring(sp->exp1->args[0], "%d")) ||
- (i++, checkstring(sp->exp1->args[0], "%ld")) ||
- (i++, checkstring(sp->exp1->args[0], "%hd")) ||
- (i++, checkstring(sp->exp1->args[0], "%lg")))) {
- if (fullstrread != 0 && exj) {
- tvar = makestmttempvar(tp_strptr, name_STRING);
- sp->exp1 = makeexpr_assign(makeexpr_hat(sp->exp1->args[1], 0),
- (i == 3) ? makeexpr_bicall_2("strtod", tp_longreal,
- copyexpr(fex),
- makeexpr_addr(makeexpr_var(tvar)))
- : makeexpr_bicall_3("strtol", tp_integer,
- copyexpr(fex),
- makeexpr_addr(makeexpr_var(tvar)),
- makeexpr_long(10)));
- spafter = makestmt_seq(spafter,
- makestmt_assign(copyexpr(exj),
- makeexpr_minus(makeexpr_var(tvar),
- makeexpr_addr(copyexpr(fex)))));
- } else {
- sp->exp1 = makeexpr_assign(makeexpr_hat(sp->exp1->args[1], 0),
- makeexpr_bicall_1((i == 1) ? "atol" : (i == 3) ? "atof" : "atoi",
- (i == 1) ? tp_integer : (i == 3) ? tp_longreal : tp_int,
- copyexpr(fex)));
- }
- } else if (isstrread && fullstrread != 0 && exj) {
- sp->exp1->args[0] = makeexpr_concat(sp->exp1->args[0],
- makeexpr_string(sizeof_int >= 32 ? "%n" : "%ln"), 0);
- insertarg(&sp->exp1, sp->exp1->nargs, makeexpr_addr(copyexpr(exj)));
- } else if (isreadln && scanfmode && !FCheck(checkreadformat)) {
- isreadln = 0;
- sp->exp1->args[0] = makeexpr_concat(sp->exp1->args[0],
- makeexpr_string("%*[^n]"), 0);
- spafter = makestmt_seq(makestmt_call(makegetchar(fex)), spafter);
- }
- spbase = makestmt_seq(spbase, fixscanf(sp, fex));
- }
- spbase = makestmt_seq(spbase, spafter);
- if (isreadln)
- spbase = makestmt_seq(spbase, skipeoln(fex));
- return spbase;
- }
- Static Stmt *handleread_bin(fex, var)
- Expr *fex, *var;
- {
- Type *basetype;
- Stmt *sp;
- Expr *ex, *tvardef = NULL;
- sp = NULL;
- basetype = fex->val.type->basetype->basetype;
- for (;;) {
- ex = makeexpr_bicall_4("fread", tp_integer, makeexpr_addr(var),
- makeexpr_sizeof(makeexpr_type(basetype), 0),
- makeexpr_long(1),
- copyexpr(fex));
- if (checkeof(fex)) {
- ex = makeexpr_bicall_2("~SETIO", tp_void,
- makeexpr_rel(EK_EQ, ex, makeexpr_long(1)),
- makeexpr_name(endoffilename, tp_int));
- }
- sp = makestmt_seq(sp, makestmt_call(ex));
- if (curtok == TOK_COMMA) {
- gettok();
- var = p_expr(NULL);
- } else
- break;
- }
- freeexpr(tvardef);
- return sp;
- }
- Static Stmt *proc_read()
- {
- Expr *fex, *ex;
- Stmt *sp;
- if (!skipopenparen())
- return NULL;
- ex = p_expr(NULL);
- if (isfiletype(ex->val.type) && wneedtok(TOK_COMMA)) {
- fex = ex;
- ex = p_expr(NULL);
- } else {
- fex = makeexpr_var(mp_input);
- }
- if (fex->val.type == tp_text)
- sp = handleread_text(fex, ex, 0);
- else
- sp = handleread_bin(fex, ex);
- skipcloseparen();
- return wrapopencheck(sp, fex);
- }
- Static Stmt *proc_readdir()
- {
- Expr *fex, *ex;
- Stmt *sp;
- if (!skipopenparen())
- return NULL;
- fex = p_expr(tp_text);
- if (!skipcomma())
- return NULL;
- ex = p_expr(tp_integer);
- sp = doseek(fex, ex);
- if (!skipopenparen())
- return sp;
- sp = makestmt_seq(sp, handleread_bin(fex, p_expr(NULL)));
- skipcloseparen();
- return wrapopencheck(sp, fex);
- }
- Static Stmt *proc_readln()
- {
- Expr *fex, *ex;
- Stmt *sp;
- if (curtok != TOK_LPAR) {
- fex = makeexpr_var(mp_input);
- return wrapopencheck(skipeoln(copyexpr(fex)), fex);
- } else {
- gettok();
- ex = p_expr(NULL);
- if (isfiletype(ex->val.type)) {
- fex = ex;
- if (curtok == TOK_RPAR || !wneedtok(TOK_COMMA)) {
- skippasttotoken(TOK_RPAR, TOK_SEMI);
- return wrapopencheck(skipeoln(copyexpr(fex)), fex);
- } else {
- ex = p_expr(NULL);
- }
- } else {
- fex = makeexpr_var(mp_input);
- }
- sp = handleread_text(fex, ex, 1);
- skipcloseparen();
- }
- return wrapopencheck(sp, fex);
- }
- Static Stmt *proc_readv()
- {
- Expr *vex;
- Stmt *sp;
- if (!skipopenparen())
- return NULL;
- vex = p_expr(tp_str255);
- if (!skipcomma())
- return NULL;
- sp = handleread_text(vex, NULL, 0);
- skipcloseparen();
- return sp;
- }
- Static Stmt *proc_strread()
- {
- Expr *vex, *exi, *exj, *exjj, *ex;
- Stmt *sp, *sp2;
- Meaning *tvar, *jvar;
- if (!skipopenparen())
- return NULL;
- vex = p_expr(tp_str255);
- if (vex->kind != EK_VAR) {
- tvar = makestmttempvar(tp_str255, name_STRING);
- sp = makestmt_assign(makeexpr_var(tvar), vex);
- vex = makeexpr_var(tvar);
- } else
- sp = NULL;
- if (!skipcomma())
- return NULL;
- exi = p_expr(tp_integer);
- if (!skipcomma())
- return NULL;
- exj = p_expr(tp_integer);
- if (!skipcomma())
- return NULL;
- if (exprspeed(exi) >= 5 || !nosideeffects(exi, 0)) {
- sp = makestmt_seq(sp, makestmt_assign(copyexpr(exj), exi));
- exi = copyexpr(exj);
- }
- if (fullstrread != 0 &&
- ((ex = singlevar(exj)) == NULL || exproccurs(exi, ex))) {
- jvar = makestmttempvar(exj->val.type, name_TEMP);
- exjj = makeexpr_var(jvar);
- } else {
- exjj = copyexpr(exj);
- jvar = (exj->kind == EK_VAR) ? (Meaning *)exj->val.i : NULL;
- }
- sp2 = handleread_text(bumpstring(copyexpr(vex),
- copyexpr(exi), 1),
- exjj, 0);
- sp = makestmt_seq(sp, sp2);
- skipcloseparen();
- if (fullstrread == 0) {
- sp = makestmt_seq(sp, makestmt_assign(exj,
- makeexpr_plus(makeexpr_bicall_1("strlen", tp_int,
- vex),
- makeexpr_long(1))));
- freeexpr(exjj);
- freeexpr(exi);
- } else {
- sp = makestmt_seq(sp, makestmt_assign(exj,
- makeexpr_plus(exjj, exi)));
- if (fullstrread == 2)
- note("STRREAD was used [197]");
- freeexpr(vex);
- }
- return mixassignments(sp, jvar);
- }
- Static Expr *func_random()
- {
- Expr *ex;
- if (curtok == TOK_LPAR) {
- gettok();
- ex = p_expr(tp_integer);
- skipcloseparen();
- return makeexpr_bicall_1(randintname, tp_integer, makeexpr_arglong(ex, 1));
- } else {
- return makeexpr_bicall_0(randrealname, tp_longreal);
- }
- }
- Static Stmt *proc_randomize()
- {
- if (*randomizename)
- return makestmt_call(makeexpr_bicall_0(randomizename, tp_void));
- else
- return NULL;
- }
- Static Expr *func_round(ex)
- Expr *ex;
- {
- Meaning *tvar;
- ex = grabarg(ex, 0);
- if (ex->val.type->kind != TK_REAL)
- return ex;
- if (*roundname) {
- if (*roundname != '*' || (exprspeed(ex) < 5 && nosideeffects(ex, 0))) {
- return makeexpr_bicall_1(roundname, tp_integer, ex);
- } else {
- tvar = makestmttempvar(tp_longreal, name_TEMP);
- return makeexpr_comma(makeexpr_assign(makeexpr_var(tvar), ex),
- makeexpr_bicall_1(roundname, tp_integer, makeexpr_var(tvar)));
- }
- } else {
- return makeexpr_actcast(makeexpr_bicall_1("floor", tp_longreal,
- makeexpr_plus(ex, makeexpr_real("0.5"))),
- tp_integer);
- }
- }
- Static Expr *func_uround(ex)
- Expr *ex;
- {
- ex = grabarg(ex, 0);
- if (ex->val.type->kind != TK_REAL)
- return ex;
- return makeexpr_actcast(makeexpr_bicall_1("floor", tp_longreal,
- makeexpr_plus(ex, makeexpr_real("0.5"))),
- tp_unsigned);
- }
- Static Expr *func_scan()
- {
- Expr *ex, *ex2, *ex3;
- char *name;
- if (!skipopenparen())
- return NULL;
- ex = p_expr(tp_integer);
- if (!skipcomma())
- return NULL;
- if (curtok == TOK_EQ)
- name = "P_scaneq";
- else
- name = "P_scanne";
- gettok();
- ex2 = p_expr(tp_char);
- if (!skipcomma())
- return NULL;
- ex3 = p_expr(tp_str255);
- skipcloseparen();
- return makeexpr_bicall_3(name, tp_int,
- makeexpr_arglong(ex, 0),
- makeexpr_charcast(ex2), ex3);
- }
- Static Expr *func_scaneq(ex)
- Expr *ex;
- {
- return makeexpr_bicall_3("P_scaneq", tp_int,
- makeexpr_arglong(ex->args[0], 0),
- makeexpr_charcast(ex->args[1]),
- ex->args[2]);
- }
- Static Expr *func_scanne(ex)
- Expr *ex;
- {
- return makeexpr_bicall_3("P_scanne", tp_int,
- makeexpr_arglong(ex->args[0], 0),
- makeexpr_charcast(ex->args[1]),
- ex->args[2]);
- }
- Static Stmt *proc_seek()
- {
- Expr *fex, *ex;
- Stmt *sp;
- if (!skipopenparen())
- return NULL;
- fex = p_expr(tp_text);
- if (!skipcomma())
- return NULL;
- ex = p_expr(tp_integer);
- skipcloseparen();
- sp = wrapopencheck(doseek(fex, ex), copyexpr(fex));
- if (*setupbufname && isfilevar(fex))
- sp = makestmt_seq(sp,
- makestmt_call(
- makeexpr_bicall_2(setupbufname, tp_void, fex,
- makeexpr_type(fex->val.type->basetype->basetype))));
- else
- freeexpr(fex);
- return sp;
- }
- Static Expr *func_seekeof()
- {
- Expr *ex;
- if (curtok == TOK_LPAR)
- ex = p_parexpr(tp_text);
- else
- ex = makeexpr_var(mp_input);
- if (*skipspacename)
- ex = makeexpr_bicall_1(skipspacename, tp_text, ex);
- else
- note("SEEKEOF was used [198]");
- return iofunc(ex, 0);
- }
- Static Expr *func_seekeoln()
- {
- Expr *ex;
- if (curtok == TOK_LPAR)
- ex = p_parexpr(tp_text);
- else
- ex = makeexpr_var(mp_input);
- if (*skipspacename)
- ex = makeexpr_bicall_1(skipspacename, tp_text, ex);
- else
- note("SEEKEOLN was used [199]");
- return iofunc(ex, 1);
- }
- Static Stmt *proc_setstrlen()
- {
- Expr *ex, *ex2;
- if (!skipopenparen())
- return NULL;
- ex = p_expr(tp_str255);
- if (!skipcomma())
- return NULL;
- ex2 = p_expr(tp_integer);
- skipcloseparen();
- return makestmt_assign(makeexpr_bicall_1("strlen", tp_int, ex),
- ex2);
- }
- Static Stmt *proc_settextbuf()
- {
- Expr *fex, *bex, *sex;
- if (!skipopenparen())
- return NULL;
- fex = p_expr(tp_text);
- if (!skipcomma())
- return NULL;
- bex = p_expr(NULL);
- if (curtok == TOK_COMMA) {
- gettok();
- sex = p_expr(tp_integer);
- } else
- sex = makeexpr_sizeof(copyexpr(bex), 0);
- skipcloseparen();
- note("Make sure setvbuf() call occurs when file is open [200]");
- return makestmt_call(makeexpr_bicall_4("setvbuf", tp_void,
- fex,
- makeexpr_addr(bex),
- makeexpr_name("_IOFBF", tp_integer),
- sex));
- }
- Static Expr *func_sin(ex)
- Expr *ex;
- {
- return makeexpr_bicall_1("sin", tp_longreal, grabarg(ex, 0));
- }
- Static Expr *func_sinh(ex)
- Expr *ex;
- {
- return makeexpr_bicall_1("sinh", tp_longreal, grabarg(ex, 0));
- }
- Static Expr *func_sizeof()
- {
- Expr *ex;
- Type *type;
- char *name, vbuf[1000];
- int lpar;
- lpar = (curtok == TOK_LPAR);
- if (lpar)
- gettok();
- if (curtok == TOK_IDENT && curtokmeaning && curtokmeaning->kind == MK_TYPE) {
- ex = makeexpr_type(curtokmeaning->type);
- gettok();
- } else
- ex = p_expr(NULL);
- type = ex->val.type;
- parse_special_variant(type, vbuf);
- if (lpar)
- skipcloseparen();
- name = find_special_variant(vbuf, "SpecialSizeOf", specialsizeofs, 1);
- if (name) {
- freeexpr(ex);
- return pc_expr_str(name);
- } else
- return makeexpr_sizeof(ex, 0);
- }
- Static Expr *func_statusv()
- {
- return makeexpr_name(name_IORESULT, tp_integer);
- }
- Static Expr *func_str_hp(ex)
- Expr *ex;
- {
- return makeexpr_addr(makeexpr_substring(ex->args[0], ex->args[1],
- ex->args[2], ex->args[3]));
- }
- Static Stmt *proc_strappend()
- {
- Expr *ex, *ex2;
- if (!skipopenparen())
- return NULL;
- ex = p_expr(tp_str255);
- if (!skipcomma())
- return NULL;