int backend_print(class_chain * cls_chain, class_chain * inst_chain, qual_chain * qual_chain, const char * out_file, const char * out_dir, const char * ns, unsigned options, const char * extraopts) { FILE * outfile = fopen(out_file,"w"); if (outfile == NULL) { fprintf(stderr,"Failed to open %s\n",out_file); return 1; } FILE * qualfile; char qual_file[3000]; strcpy(qual_file, out_dir); strcat(qual_file, "/"); strcat(qual_file, ns); strcat(qual_file, "/"); strcat(qual_file, "qualifiers"); qualfile = fopen(qual_file, "w"); if (qualfile == NULL) { fprintf(stderr,"Failed to open %s\n",qual_file); return 1; } while (cls_chain && cls_chain->class_item) { print_class(outfile, cls_chain->class_item); cls_chain = cls_chain -> class_next; } while (inst_chain && inst_chain->class_item) { print_instance(out_dir, ns, inst_chain->class_item); inst_chain = inst_chain -> class_next; } while (qual_chain && qual_chain->qual_qual) { print_qualifier(qualfile, qual_chain->qual_qual); qual_chain = qual_chain -> qual_next; } fclose(outfile); return 0; }
void exec_wr(char* format, int pretty, FILE *out){ Pschema s = parse_schema(format); Odescr *op = top_tstack(); print_instance(op->inst.sval, s, NULL, 0, op->mode, pretty, out); // use the raw instance information free_schema(last_parsed_format); }
void print_instance(char *instance, Pschema s, char *attr_name, int spaces, Mode mode, int pretty, FILE *out){ if(attr_name!=NULL && pretty){ print_spaces(spaces, out); fprintf(out, "WR for record attribute \"%s\"\n",attr_name); } if(pretty){ print_spaces(spaces, out); } if(s->type == TY_RECORD || s->type == TY_ARRAY || s->type == TY_ATTR){ switch(s->type){ case TY_RECORD:{ if(pretty){ fprintf(out, "WR for a record\n"); } int printed_size = 0; Pschema temp = s->child; while(temp){ print_instance(instance + printed_size, temp->child, temp->id, spaces+1, mode, pretty, out); printed_size += get_schema_size(temp->child); temp = temp->brother; } break; } case TY_ARRAY:{ int i; if(pretty){ fprintf(out, "WR for an array\n"); } int field_size = get_schema_size(s->child); int nfields = s->size; for(i=0; i<nfields; i++){ print_instance(instance + field_size * i, s->child, NULL, spaces+1, mode, pretty, out); } break; } default: machine_error("TY_ATTR cannot be used in input_schema()."); break; } } else{ if(mode == EMB){ Arg inst; inst.sval = instance; if(pretty){ fprintf(out, "WR "); } switch(s->type){ case TY_INT: { fprintf(out, "%d\n",inst.ival); break; } case TY_CHAR: { fprintf(out, "%c\n",inst.cval); break; } case TY_REAL: { fprintf(out, "%f\n",inst.rval); break; } case TY_STRING: { fprintf(out, "%s\n",inst.sval); break; } case TY_BOOL: { fprintf(out, "%s\n",inst.cval == '1' ? "true" : "false"); break; } default: { break; } } } else{ if(pretty){ fprintf(out, "WR "); } switch(s->type){ case TY_INT: { int *inst = (int *)instance; fprintf(out, "%d\n",inst[0]); break; } case TY_CHAR: { char *inst = (char *)instance; fprintf(out, "%c\n",inst[0]); break; } case TY_REAL: { float *inst = (float *)instance; fprintf(out, "%f\n",inst[0]); break; } case TY_STRING: { char **inst = (char **)instance; fprintf(out, "%s\n",inst[0]); break; } case TY_BOOL: { char *inst = (char *)instance; fprintf(out, "%s\n",inst[0] == '1' ? "true" : "false"); break; } default: { break; } } } } }