Ejemplo n.º 1
0
int
WriteMemoryBlock (char *buffer, unsigned size)
{
  if (WriteFunc (buffer, size))
    {
      AmofProcessed += (long) size;
      return TRUE;
    }
  return FALSE;
}
Ejemplo n.º 2
0
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);
  }
}