int WriteMemoryBlock (char *buffer, unsigned size) { if (WriteFunc (buffer, size)) { AmofProcessed += (long) size; return TRUE; } return FALSE; }
static void WriteC(Cell *c, bool parentheses) { int k; FuncDef *fun; if(c==NULL) return; switch(c->tag) { case APPLY: if(parentheses) WriteString("("); WriteApply(c); if(parentheses) WriteString(")"); break; case ARG: if(c->value>0) Write("ARG(%d)", c->value); else Write("LOCAL(%d)", -c->value); break; case INT: Write("%ld", integer(c)); break; case REAL: Write("%lg", real(c)); break; case CHAR: Write("'%c'", c->value); break; case BOOLEAN: WriteString(c->value ? "True" : "False"); break; case NULLTUPLE: WriteString("()"); break; case LIST: WriteList(c, parentheses); break; case NIL: WriteString("Nil"); break; case STRUCT: WriteElems(c, STRUCT, parentheses ? "(" : "", " ", parentheses ? ")" : "", True); break; case PAIR: WriteElems(c, PAIR, "(", ", ", ")", False); break; case RECORD: WriteElems(c, RECORD, "{", ", ", "}", False); break; case _IF: if(parentheses) WriteString("("); WriteString("_if "); WriteC(c->left, True); WriteString(" "); WriteC(c->right->left, True); WriteString(" "); WriteC(c->right->right, True); if(parentheses) WriteString(")"); break; case MATCH: if(parentheses) WriteString("("); WriteString("_match "); WriteC(c->left, True); WriteString(" "); WriteC(c->right, True); if(parentheses) WriteString(")"); break; case MATCHARG: if(parentheses) WriteString("("); for(;;) { WriteString("_match "); WriteC(c->left, True); WriteString(" "); if(c->value>0) Write("ARG(%d)", c->value); else Write("LOCAL(%d)", -c->value); c = c->right; if(c == NULL) break; WriteString(" /\\ "); } if(parentheses) WriteString(")"); break; case MATCHTYPE: if(c->value == INT) WriteString("num"); else if(c->value == BOOLEAN) WriteString("bool"); else if(c->value == CHAR) WriteString("char"); else WriteString("..."); break; case ALIAS: if(parentheses) WriteString("("); WriteC(c->left, False); WriteString(" = "); WriteC(c->right, False); if(parentheses) WriteString(")"); break; case UNDEFINED: WriteString("undefined"); break; case GENERATOR: WriteString("["); WriteElems(c->left, LIST, "", ", ", "", False); WriteString(" | "); for(c=c->right; c->tag==GENERATOR; c=c->right) { if(c->left->right) { WriteElems(c->left->left, LIST, "", ", ", "", False); WriteString(" <- "); WriteElems(c->left->right, LIST, "", ", ", "", False); } else WriteC(c->left->left, False); if(c->right->tag==GENERATOR) WriteString("; "); } WriteString("]"); break; case SYSFUNC1: fun = getfunction(c->value); if(parentheses) WriteString("("); WriteString(fun->name); WriteString(" "); WriteC(c->left, True); if(parentheses) WriteString(")"); break; case SYSFUNC2: fun = getfunction(c->value); if(parentheses) WriteString("("); WriteC(c->left, True); WriteString(" "); WriteString(fun->name); WriteString(" "); WriteC(c->right, True); if(parentheses) WriteString(")"); break; case APPLICATION: fun = getfunction(c->value); if(parentheses) WriteString("("); WriteString(fun->name); if(fun->argcount == 0) ; else if(fun->argcount == 1) push(c->right); else { for(k=fun->argcount; k>1; k--) { push(c->left); c = c->right; } push(c); } for(k=fun->argcount; k>0; k--) { WriteString(" "); WriteC(pop(), True); } if(parentheses) WriteString(")"); break; case FUNC: case TYPE: WriteFunc(getfunction(c->value)->name); break; case ERROR: Write("error(%s)", getfunction(c->value)->name); break; case CONST: WriteString("(Const "); WriteC(c->left, False); WriteString(")"); break; case STRICTDIRECTOR: case LAZYDIRECTOR: WriteDirector(c->value, c->tag); if(parentheses) WriteString("("); WriteC(c->left, True); if(parentheses) WriteString(")"); break; case LETREC: if(parentheses) WriteString("("); WriteC(c->right, False); WriteString(" WHERE "); k = 0; for(c=c->left; c->tag==LIST; c=c->right) { Write("LOCAL(%d) = ", -(k--)); WriteC(c->left, False); WriteString("; "); } WriteString("ENDWHERE"); if(parentheses) WriteString(")"); break; case LAMBDA: WriteC(c->left, False); WriteString(" -> "); WriteC(c->right, False); break; case LAMBDAS: WriteElems(c, LAMBDAS, "(", " | ", ")", False); break; case VARIABLE: WriteString(getfunction(c->left->value)->name); break; case SET1: case SET2: WriteString("["); WriteC(c->left->left, False); for(k=1; k<=c->value; k++) Write(" x%d", k); WriteString(" | (x1"); for(k=2; k<=c->value; k++) Write(", x%d", k); WriteString(") <- "); WriteC(c->left->right->right, False); if(c->left->right->left) { WriteString("; "); WriteC(c->left->right->left, False); for(k=1; k<=c->value; k++) Write(" x%d", k); } WriteString("]"); break; default: systemerror(7); } }