static void generate_type_header (const Symbol *s) { fprintf (headerfile, "/*\n"); fprintf (headerfile, "%s ::= ", s->name); define_asn1 (0, s->type); fprintf (headerfile, "\n*/\n\n"); fprintf (headerfile, "typedef "); define_type (0, s->gen_name, s->type, TRUE); fprintf (headerfile, "\n"); }
void form_mem () { unsigned long size; int type; char type_name[32]; init_mem ((unsigned long) N_OBJECTS); if (error()) return; type = MSSCENE; size = sizeof (struct msscene); strcpy (type_name, "msscene"); define_type (type, size, type_name); if (error()) return; type = SPHERE; size = sizeof (struct sphere); strcpy (type_name, "sphere"); define_type (type, size, type_name); if (error()) return; type = TORUS; size = sizeof (struct torus); strcpy (type_name, "torus"); define_type (type, size, type_name); if (error()) return; type = PROBE; size = sizeof (struct probe); strcpy (type_name, "probe"); define_type (type, size, type_name); if (error()) return; type = CENTRAL; size = sizeof (struct central); strcpy (type_name, "central"); define_type (type, size, type_name); if (error()) return; type = VERTEX; size = sizeof (struct vertex); strcpy (type_name, "vertex"); define_type (type, size, type_name); if (error()) return; type = CIRCLE; size = sizeof (struct circle); strcpy (type_name, "circle"); define_type (type, size, type_name); if (error()) return; type = ARC; size = sizeof (struct arc); strcpy (type_name, "arc"); define_type (type, size, type_name); if (error()) return; type = FACE; size = sizeof (struct face); strcpy (type_name, "face"); define_type (type, size, type_name); if (error()) return; type = CYCLE; size = sizeof (struct cycle); strcpy (type_name, "cycle"); define_type (type, size, type_name); if (error()) return; type = EDGE; size = sizeof (struct edge); strcpy (type_name, "edge"); define_type (type, size, type_name); if (error()) return; type = COMPONENT; size = sizeof (struct component); strcpy (type_name, "component"); define_type (type, size, type_name); if (error()) return; type = CHUNK; size = sizeof (struct chunk); strcpy (type_name, "chunk"); define_type (type, size, type_name); if (error()) return; type = SURFACE; size = sizeof (struct surface); strcpy (type_name, "surface"); define_type (type, size, type_name); if (error()) return; type = VARIETY; size = sizeof (struct variety); strcpy (type_name, "variety"); define_type (type, size, type_name); if (error()) return; type = PHNVTX; size = phnvtx_size (); strcpy (type_name, "phnvtx"); define_type (type, size, type_name); type = PHNEDG; size = phnedg_size (); strcpy (type_name, "phnedg"); define_type (type, size, type_name); type = PHNTRI; size = phntri_size (); strcpy (type_name, "phntri"); define_type (type, size, type_name); type = POLYGON; size = sizeof (struct polygon); strcpy (type_name, "polygon"); define_type (type, size, type_name); type = HEDVTX; size = sizeof (struct hedvtx); strcpy (type_name, "hedvtx"); define_type (type, size, type_name); if (error()) return; type = HEDEDG; size = sizeof (struct hededg); strcpy (type_name, "hededg"); define_type (type, size, type_name); if (error()) return; type = HEDTRI; size = sizeof (struct hedtri); strcpy (type_name, "hedtri"); define_type (type, size, type_name); if (error()) return; type = VTXGRP; size = sizeof (struct vtxgrp); strcpy (type_name, "vtxgrp"); define_type (type, size, type_name); if (error()) return; type = HEDRON; size = sizeof (struct hedron); strcpy (type_name, "hedron"); define_type (type, size, type_name); if (error()) return; type = OBJECT_SCHEME; size = sizeof (struct object_scheme); strcpy (type_name, "object_scheme"); define_type (type, size, type_name); type = MOLECULE; size = sizeof (struct molecule); strcpy (type_name, "molecule"); define_type (type, size, type_name); type = EVALPNT; size = sizeof (struct evalpnt); strcpy (type_name, "evalpnt"); define_type (type, size, type_name); if (error()) return; type = SOLID_ANGLE; size = sizeof (struct solid_angle); strcpy (type_name, "solid_angle"); define_type (type, size, type_name); if (error()) return; type = COLOR_RAMP; size = sizeof (struct color_ramp); strcpy (type_name, "color_ramp"); define_type (type, size, type_name); if (error()) return; type = PLEXLINK; size = sizeof (struct PlexLink); strcpy (type_name, "PlexLink"); define_type (type, size, type_name); if (error()) return; type = SUBEDGE; size = sizeof (struct subedge); strcpy (type_name, "subedge"); define_type (type, size, type_name); if (error()) return; type = SUBPOLYGON; size = sizeof (struct subpolygon); strcpy (type_name, "subpolygon"); define_type (type, size, type_name); if (error()) return; type = ORINGE; size = sizeof (struct oringe); strcpy (type_name, "oringe"); define_type (type, size, type_name); if (error()) return; type = SECTOR; size = sizeof (struct sector); strcpy (type_name, "sector"); define_type (type, size, type_name); if (error()) return; type = TERM; size = sizeof (struct term); strcpy (type_name, "term"); define_type (type, size, type_name); if (error()) return; type = BAR; size = sizeof (struct bar); strcpy (type_name, "bar"); define_type (type, size, type_name); if (error()) return; type = RECORD; size = sizeof (struct record); strcpy (type_name, "record"); define_type (type, size, type_name); if (error()) return; type = TOKEN; size = sizeof (struct token); strcpy (type_name, "token"); define_type (type, size, type_name); if (error()) return; type = EDGER; size = sizeof (struct edger); strcpy (type_name, "edger"); define_type (type, size, type_name); if (error()) return; type = PLEX; size = sizeof (struct Plex); strcpy (type_name, "Plex"); define_type (type, size, type_name); if (error()) return; type = PLEXI; size = sizeof (struct Plexi); strcpy (type_name, "Plexi"); define_type (type, size, type_name); if (error()) return; type = PLEXVERTEX; size = sizeof (struct PlexVertex); strcpy (type_name, "PlexVertex"); define_type (type, size, type_name); if (error()) return; type = PLEXEDGE; size = sizeof (struct PlexEdge); strcpy (type_name, "PlexEdge"); define_type (type, size, type_name); if (error()) return; type = PLEXTRIANGLE; size = sizeof (struct PlexTriangle); strcpy (type_name, "PlexTriangle"); define_type (type, size, type_name); if (error()) return; type = PLEXCUBE; size = sizeof (struct PlexCube); strcpy (type_name, "PlexCube"); define_type (type, size, type_name); if (error()) return; type = PLEXJOIN; size = sizeof (struct PlexJoin); strcpy (type_name, "PlexJoin"); define_type (type, size, type_name); if (error()) return; type = PROVINCE; size = sizeof (struct Province); strcpy (type_name, "Province"); define_type (type, size, type_name); if (error()) return; type = GLASS; size = sizeof (struct Glass); strcpy (type_name, "Glass"); define_type (type, size, type_name); if (error()) return; type = GLASS_BLOCK; size = sizeof (struct GlassBlock); strcpy (type_name, "GlassBlock"); define_type (type, size, type_name); if (error()) return; type = VANITY; size = sizeof (struct vanity); strcpy (type_name, "vanity"); define_type (type, size, type_name); if (error()) return; type = DENVTX; size = sizeof (struct denvtx); strcpy (type_name, "denvtx"); define_type (type, size, type_name); if (error()) return; type = MSDATA; size = sizeof (struct msdata); strcpy (type_name, "msdata"); define_type (type, size, type_name); if (error()) return; type = CRITLINK; size = sizeof (struct critlink); strcpy (type_name, "critlink"); define_type (type, size, type_name); if (error()) return; type = CEPT; size = sizeof (struct cept); strcpy (type_name, "cept"); define_type (type, size, type_name); if (error()) return; }
static void define_type (int level, const char *name, Type *t, int typedefp) { switch (t->type) { case TType: space(level); fprintf (headerfile, "%s %s;\n", t->symbol->gen_name, name); break; case TInteger: space(level); if(t->members == NULL) { fprintf (headerfile, "int %s;\n", name); } else { Member *m; int tag = -1; fprintf (headerfile, "enum %s {\n", typedefp ? name : ""); for (m = t->members; m && m->val != tag; m = m->next) { if(tag == -1) tag = m->val; space (level + 1); fprintf(headerfile, "%s = %d%s\n", m->gen_name, m->val, m->next->val == tag ? "" : ","); } fprintf (headerfile, "} %s;\n", name); } break; case TUInteger: space(level); fprintf (headerfile, "unsigned int %s;\n", name); break; case TOctetString: space(level); fprintf (headerfile, "heim_octet_string %s;\n", name); break; case TOID : space(level); fprintf (headerfile, "heim_oid %s;\n", name); break; case TBitString: { Member *m; Type i; int tag = -1; i.type = TUInteger; space(level); fprintf (headerfile, "struct %s {\n", typedefp ? name : ""); for (m = t->members; m && m->val != tag; m = m->next) { char *n; asprintf (&n, "%s:1", m->gen_name); define_type (level + 1, n, &i, FALSE); free (n); if (tag == -1) tag = m->val; } space(level); fprintf (headerfile, "} %s;\n\n", name); break; } case TEnumerated: { Member *m; int tag = -1; space(level); fprintf (headerfile, "enum %s {\n", typedefp ? name : ""); for (m = t->members; m && m->val != tag; m = m->next) { if (tag == -1) tag = m->val; space(level + 1); fprintf (headerfile, "%s = %d%s\n", m->gen_name, m->val, m->next->val == tag ? "" : ","); } space(level); fprintf (headerfile, "} %s;\n\n", name); break; } case TSequence: { Member *m; int tag = -1; space(level); fprintf (headerfile, "struct %s {\n", typedefp ? name : ""); for (m = t->members; m && m->val != tag; m = m->next) { if (m->optional) { char *n; asprintf (&n, "*%s", m->gen_name); define_type (level + 1, n, m->type, FALSE); free (n); } else define_type (level + 1, m->gen_name, m->type, FALSE); if (tag == -1) tag = m->val; } space(level); fprintf (headerfile, "} %s;\n", name); break; } case TSequenceOf: { Type i; i.type = TUInteger; i.application = 0; space(level); fprintf (headerfile, "struct %s {\n", typedefp ? name : ""); define_type (level + 1, "len", &i, FALSE); define_type (level + 1, "*val", t->subtype, FALSE); space(level); fprintf (headerfile, "} %s;\n", name); break; } case TGeneralizedTime: space(level); fprintf (headerfile, "time_t %s;\n", name); break; case TGeneralString: space(level); fprintf (headerfile, "heim_general_string %s;\n", name); break; case TUTF8String: space(level); fprintf (headerfile, "heim_utf8_string %s;\n", name); break; case TBoolean: space(level); fprintf (headerfile, "int %s;\n", name); break; case TNull: space(level); fprintf (headerfile, "NULL %s;\n", name); break; case TApplication: define_type (level, name, t->subtype, FALSE); break; default: abort (); } }