155682Smarkm/* 2178825Sdfr * Copyright (c) 1997 - 2006 Kungliga Tekniska H�gskolan 355682Smarkm * (Royal Institute of Technology, Stockholm, Sweden). 455682Smarkm * All rights reserved. 555682Smarkm * 655682Smarkm * Redistribution and use in source and binary forms, with or without 755682Smarkm * modification, are permitted provided that the following conditions 855682Smarkm * are met: 955682Smarkm * 1055682Smarkm * 1. Redistributions of source code must retain the above copyright 1155682Smarkm * notice, this list of conditions and the following disclaimer. 1255682Smarkm * 1355682Smarkm * 2. Redistributions in binary form must reproduce the above copyright 1455682Smarkm * notice, this list of conditions and the following disclaimer in the 1555682Smarkm * documentation and/or other materials provided with the distribution. 1655682Smarkm * 1755682Smarkm * 3. Neither the name of the Institute nor the names of its contributors 1855682Smarkm * may be used to endorse or promote products derived from this software 1955682Smarkm * without specific prior written permission. 2055682Smarkm * 2155682Smarkm * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 2255682Smarkm * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2355682Smarkm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2455682Smarkm * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 2555682Smarkm * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2655682Smarkm * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2755682Smarkm * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2855682Smarkm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2955682Smarkm * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3055682Smarkm * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3155682Smarkm * SUCH DAMAGE. 3255682Smarkm */ 3355682Smarkm 3455682Smarkm#include "gen_locl.h" 3555682Smarkm 36178825SdfrRCSID("$Id: gen_encode.c 22429 2008-01-13 10:25:50Z lha $"); 3755682Smarkm 3855682Smarkmstatic void 3955682Smarkmencode_primitive (const char *typename, const char *name) 4055682Smarkm{ 4155682Smarkm fprintf (codefile, 42178825Sdfr "e = der_put_%s(p, len, %s, &l);\n" 43178825Sdfr "if (e) return e;\np -= l; len -= l; ret += l;\n\n", 4455682Smarkm typename, 4555682Smarkm name); 4655682Smarkm} 4755682Smarkm 48178825Sdfrconst char * 49178825Sdfrclassname(Der_class class) 5055682Smarkm{ 51178825Sdfr const char *cn[] = { "ASN1_C_UNIV", "ASN1_C_APPL", 52178825Sdfr "ASN1_C_CONTEXT", "ASN1_C_PRIV" }; 53178825Sdfr if(class < ASN1_C_UNIV || class > ASN1_C_PRIVATE) 54178825Sdfr return "???"; 55178825Sdfr return cn[class]; 56178825Sdfr} 57178825Sdfr 58178825Sdfr 59178825Sdfrconst char * 60178825Sdfrvaluename(Der_class class, int value) 61178825Sdfr{ 62178825Sdfr static char s[32]; 63178825Sdfr struct { 64178825Sdfr int value; 65178825Sdfr const char *s; 66178825Sdfr } *p, values[] = { 67178825Sdfr#define X(Y) { Y, #Y } 68178825Sdfr X(UT_BMPString), 69178825Sdfr X(UT_BitString), 70178825Sdfr X(UT_Boolean), 71178825Sdfr X(UT_EmbeddedPDV), 72178825Sdfr X(UT_Enumerated), 73178825Sdfr X(UT_External), 74178825Sdfr X(UT_GeneralString), 75178825Sdfr X(UT_GeneralizedTime), 76178825Sdfr X(UT_GraphicString), 77178825Sdfr X(UT_IA5String), 78178825Sdfr X(UT_Integer), 79178825Sdfr X(UT_Null), 80178825Sdfr X(UT_NumericString), 81178825Sdfr X(UT_OID), 82178825Sdfr X(UT_ObjectDescriptor), 83178825Sdfr X(UT_OctetString), 84178825Sdfr X(UT_PrintableString), 85178825Sdfr X(UT_Real), 86178825Sdfr X(UT_RelativeOID), 87178825Sdfr X(UT_Sequence), 88178825Sdfr X(UT_Set), 89178825Sdfr X(UT_TeletexString), 90178825Sdfr X(UT_UTCTime), 91178825Sdfr X(UT_UTF8String), 92178825Sdfr X(UT_UniversalString), 93178825Sdfr X(UT_VideotexString), 94178825Sdfr X(UT_VisibleString), 95178825Sdfr#undef X 96178825Sdfr { -1, NULL } 97178825Sdfr }; 98178825Sdfr if(class == ASN1_C_UNIV) { 99178825Sdfr for(p = values; p->value != -1; p++) 100178825Sdfr if(p->value == value) 101178825Sdfr return p->s; 102178825Sdfr } 103178825Sdfr snprintf(s, sizeof(s), "%d", value); 104178825Sdfr return s; 105178825Sdfr} 106178825Sdfr 107178825Sdfrstatic int 108178825Sdfrencode_type (const char *name, const Type *t, const char *tmpstr) 109178825Sdfr{ 110178825Sdfr int constructed = 1; 111178825Sdfr 11272445Sassar switch (t->type) { 11372445Sassar case TType: 11455682Smarkm#if 0 11572445Sassar encode_type (name, t->symbol->type); 11655682Smarkm#endif 11772445Sassar fprintf (codefile, 11872445Sassar "e = encode_%s(p, len, %s, &l);\n" 119178825Sdfr "if (e) return e;\np -= l; len -= l; ret += l;\n\n", 12072445Sassar t->symbol->gen_name, name); 12172445Sassar break; 12272445Sassar case TInteger: 123178825Sdfr if(t->members) { 124178825Sdfr fprintf(codefile, 125178825Sdfr "{\n" 126178825Sdfr "int enumint = (int)*%s;\n", 127178825Sdfr name); 128178825Sdfr encode_primitive ("integer", "&enumint"); 129178825Sdfr fprintf(codefile, "}\n;"); 130178825Sdfr } else if (t->range == NULL) { 131178825Sdfr encode_primitive ("heim_integer", name); 132178825Sdfr } else if (t->range->min == INT_MIN && t->range->max == INT_MAX) { 13372445Sassar encode_primitive ("integer", name); 134178825Sdfr } else if (t->range->min == 0 && t->range->max == UINT_MAX) { 135178825Sdfr encode_primitive ("unsigned", name); 136178825Sdfr } else if (t->range->min == 0 && t->range->max == INT_MAX) { 137178825Sdfr encode_primitive ("unsigned", name); 138178825Sdfr } else 139178825Sdfr errx(1, "%s: unsupported range %d -> %d", 140178825Sdfr name, t->range->min, t->range->max); 141178825Sdfr constructed = 0; 14272445Sassar break; 143178825Sdfr case TBoolean: 144178825Sdfr encode_primitive ("boolean", name); 145178825Sdfr constructed = 0; 14672445Sassar break; 14772445Sassar case TOctetString: 14872445Sassar encode_primitive ("octet_string", name); 149178825Sdfr constructed = 0; 15072445Sassar break; 15172445Sassar case TBitString: { 15272445Sassar Member *m; 15372445Sassar int pos; 15455682Smarkm 155178825Sdfr if (ASN1_TAILQ_EMPTY(t->members)) { 156178825Sdfr encode_primitive("bit_string", name); 157178825Sdfr constructed = 0; 15872445Sassar break; 159178825Sdfr } 16055682Smarkm 16172445Sassar fprintf (codefile, "{\n" 16272445Sassar "unsigned char c = 0;\n"); 163178825Sdfr if (!rfc1510_bitstring) 164178825Sdfr fprintf (codefile, 165178825Sdfr "int rest = 0;\n" 166178825Sdfr "int bit_set = 0;\n"); 167178825Sdfr#if 0 16872445Sassar pos = t->members->prev->val; 16972445Sassar /* fix for buggy MIT (and OSF?) code */ 17072445Sassar if (pos > 31) 17172445Sassar abort (); 172178825Sdfr#endif 17372445Sassar /* 17472445Sassar * It seems that if we do not always set pos to 31 here, the MIT 17572445Sassar * code will do the wrong thing. 17672445Sassar * 17772445Sassar * I hate ASN.1 (and DER), but I hate it even more when everybody 17872445Sassar * has to screw it up differently. 17972445Sassar */ 180178825Sdfr pos = ASN1_TAILQ_LAST(t->members, memhead)->val; 181178825Sdfr if (rfc1510_bitstring) { 182178825Sdfr if (pos < 31) 183178825Sdfr pos = 31; 184178825Sdfr } 18555682Smarkm 186178825Sdfr ASN1_TAILQ_FOREACH_REVERSE(m, t->members, memhead, members) { 18772445Sassar while (m->val / 8 < pos / 8) { 188178825Sdfr if (!rfc1510_bitstring) 189178825Sdfr fprintf (codefile, 190178825Sdfr "if (c != 0 || bit_set) {\n"); 19172445Sassar fprintf (codefile, 192178825Sdfr "if (len < 1) return ASN1_OVERFLOW;\n" 193178825Sdfr "*p-- = c; len--; ret++;\n"); 194178825Sdfr if (!rfc1510_bitstring) 195178825Sdfr fprintf (codefile, 196178825Sdfr "if (!bit_set) {\n" 197178825Sdfr "rest = 0;\n" 198178825Sdfr "while(c) { \n" 199178825Sdfr "if (c & 1) break;\n" 200178825Sdfr "c = c >> 1;\n" 201178825Sdfr "rest++;\n" 202178825Sdfr "}\n" 203178825Sdfr "bit_set = 1;\n" 204178825Sdfr "}\n" 205178825Sdfr "}\n"); 206178825Sdfr fprintf (codefile, 20772445Sassar "c = 0;\n"); 20872445Sassar pos -= 8; 20972445Sassar } 21072445Sassar fprintf (codefile, 211178825Sdfr "if((%s)->%s) {\n" 212178825Sdfr "c |= 1<<%d;\n", 213178825Sdfr name, m->gen_name, 7 - m->val % 8); 214178825Sdfr fprintf (codefile, 215178825Sdfr "}\n"); 21672445Sassar } 21772445Sassar 218178825Sdfr if (!rfc1510_bitstring) 219178825Sdfr fprintf (codefile, 220178825Sdfr "if (c != 0 || bit_set) {\n"); 22172445Sassar fprintf (codefile, 222178825Sdfr "if (len < 1) return ASN1_OVERFLOW;\n" 223178825Sdfr "*p-- = c; len--; ret++;\n"); 224178825Sdfr if (!rfc1510_bitstring) 225178825Sdfr fprintf (codefile, 226178825Sdfr "if (!bit_set) {\n" 227178825Sdfr "rest = 0;\n" 228178825Sdfr "if(c) { \n" 229178825Sdfr "while(c) { \n" 230178825Sdfr "if (c & 1) break;\n" 231178825Sdfr "c = c >> 1;\n" 232178825Sdfr "rest++;\n" 233178825Sdfr "}\n" 234178825Sdfr "}\n" 235178825Sdfr "}\n" 236178825Sdfr "}\n"); 237178825Sdfr 238178825Sdfr fprintf (codefile, 239178825Sdfr "if (len < 1) return ASN1_OVERFLOW;\n" 240178825Sdfr "*p-- = %s;\n" 241178825Sdfr "len -= 1;\n" 242178825Sdfr "ret += 1;\n" 243178825Sdfr "}\n\n", 244178825Sdfr rfc1510_bitstring ? "0" : "rest"); 245178825Sdfr constructed = 0; 24672445Sassar break; 24755682Smarkm } 24890926Snectar case TEnumerated : { 24990926Snectar encode_primitive ("enumerated", name); 250178825Sdfr constructed = 0; 25190926Snectar break; 25290926Snectar } 253178825Sdfr 254178825Sdfr case TSet: 25572445Sassar case TSequence: { 25672445Sassar Member *m; 25755682Smarkm 25872445Sassar if (t->members == NULL) 25972445Sassar break; 260178825Sdfr 261178825Sdfr ASN1_TAILQ_FOREACH_REVERSE(m, t->members, memhead, members) { 26272445Sassar char *s; 26355682Smarkm 264178825Sdfr if (m->ellipsis) 265178825Sdfr continue; 266178825Sdfr 26772445Sassar asprintf (&s, "%s(%s)->%s", m->optional ? "" : "&", name, m->gen_name); 268178825Sdfr if (s == NULL) 269178825Sdfr errx(1, "malloc"); 270178825Sdfr fprintf(codefile, "/* %s */\n", m->name); 27172445Sassar if (m->optional) 27272445Sassar fprintf (codefile, 273178825Sdfr "if(%s) ", 27472445Sassar s); 275178825Sdfr else if(m->defval) 276178825Sdfr gen_compare_defval(s + 1, m->defval); 277178825Sdfr fprintf (codefile, "{\n"); 278178825Sdfr fprintf (codefile, "size_t %s_oldret = ret;\n", tmpstr); 279178825Sdfr fprintf (codefile, "ret = 0;\n"); 280178825Sdfr encode_type (s, m->type, m->gen_name); 281178825Sdfr fprintf (codefile, "ret += %s_oldret;\n", tmpstr); 282178825Sdfr fprintf (codefile, "}\n"); 28372445Sassar free (s); 28472445Sassar } 285178825Sdfr break; 286178825Sdfr } 287178825Sdfr case TSetOf: { 288178825Sdfr 289178825Sdfr fprintf(codefile, 290178825Sdfr "{\n" 291178825Sdfr "struct heim_octet_string *val;\n" 292178825Sdfr "size_t elen, totallen = 0;\n" 293178825Sdfr "int eret;\n"); 294178825Sdfr 295178825Sdfr fprintf(codefile, 296178825Sdfr "if ((%s)->len > UINT_MAX/sizeof(val[0]))\n" 297178825Sdfr "return ERANGE;\n", 298178825Sdfr name); 299178825Sdfr 300178825Sdfr fprintf(codefile, 301178825Sdfr "val = malloc(sizeof(val[0]) * (%s)->len);\n" 302178825Sdfr "if (val == NULL && (%s)->len != 0) return ENOMEM;\n", 303178825Sdfr name, name); 304178825Sdfr 305178825Sdfr fprintf(codefile, 306178825Sdfr "for(i = 0; i < (%s)->len; i++) {\n", 307178825Sdfr name); 308178825Sdfr 309178825Sdfr fprintf(codefile, 310178825Sdfr "ASN1_MALLOC_ENCODE(%s, val[i].data, " 311178825Sdfr "val[i].length, &(%s)->val[i], &elen, eret);\n", 312178825Sdfr t->subtype->symbol->gen_name, 313178825Sdfr name); 314178825Sdfr 315178825Sdfr fprintf(codefile, 316178825Sdfr "if(eret) {\n" 317178825Sdfr "i--;\n" 318178825Sdfr "while (i >= 0) {\n" 319178825Sdfr "free(val[i].data);\n" 320178825Sdfr "i--;\n" 321178825Sdfr "}\n" 322178825Sdfr "free(val);\n" 323178825Sdfr "return eret;\n" 324178825Sdfr "}\n" 325178825Sdfr "totallen += elen;\n" 326178825Sdfr "}\n"); 327178825Sdfr 328178825Sdfr fprintf(codefile, 329178825Sdfr "if (totallen > len) {\n" 330178825Sdfr "for (i = 0; i < (%s)->len; i++) {\n" 331178825Sdfr "free(val[i].data);\n" 332178825Sdfr "}\n" 333178825Sdfr "free(val);\n" 334178825Sdfr "return ASN1_OVERFLOW;\n" 335178825Sdfr "}\n", 336178825Sdfr name); 337178825Sdfr 338178825Sdfr fprintf(codefile, 339178825Sdfr "qsort(val, (%s)->len, sizeof(val[0]), _heim_der_set_sort);\n", 340178825Sdfr name); 341178825Sdfr 34272445Sassar fprintf (codefile, 343178825Sdfr "for(i = (%s)->len - 1; i >= 0; --i) {\n" 344178825Sdfr "p -= val[i].length;\n" 345178825Sdfr "ret += val[i].length;\n" 346178825Sdfr "memcpy(p + 1, val[i].data, val[i].length);\n" 347178825Sdfr "free(val[i].data);\n" 348178825Sdfr "}\n" 349178825Sdfr "free(val);\n" 350178825Sdfr "}\n", 351178825Sdfr name); 35272445Sassar break; 35355682Smarkm } 35472445Sassar case TSequenceOf: { 35572445Sassar char *n; 356178825Sdfr char *sname; 35755682Smarkm 35872445Sassar fprintf (codefile, 35972445Sassar "for(i = (%s)->len - 1; i >= 0; --i) {\n" 360178825Sdfr "size_t %s_for_oldret = ret;\n" 36172445Sassar "ret = 0;\n", 362178825Sdfr name, tmpstr); 36372445Sassar asprintf (&n, "&(%s)->val[i]", name); 364178825Sdfr if (n == NULL) 365178825Sdfr errx(1, "malloc"); 366178825Sdfr asprintf (&sname, "%s_S_Of", tmpstr); 367178825Sdfr if (sname == NULL) 368178825Sdfr errx(1, "malloc"); 369178825Sdfr encode_type (n, t->subtype, sname); 37072445Sassar fprintf (codefile, 371178825Sdfr "ret += %s_for_oldret;\n" 372178825Sdfr "}\n", 373178825Sdfr tmpstr); 37472445Sassar free (n); 375178825Sdfr free (sname); 37672445Sassar break; 37772445Sassar } 37872445Sassar case TGeneralizedTime: 37972445Sassar encode_primitive ("generalized_time", name); 380178825Sdfr constructed = 0; 38172445Sassar break; 38272445Sassar case TGeneralString: 38372445Sassar encode_primitive ("general_string", name); 384178825Sdfr constructed = 0; 38572445Sassar break; 386178825Sdfr case TTag: { 387178825Sdfr char *tname; 388178825Sdfr int c; 389178825Sdfr asprintf (&tname, "%s_tag", tmpstr); 390178825Sdfr if (tname == NULL) 391178825Sdfr errx(1, "malloc"); 392178825Sdfr c = encode_type (name, t->subtype, tname); 39372445Sassar fprintf (codefile, 394178825Sdfr "e = der_put_length_and_tag (p, len, ret, %s, %s, %s, &l);\n" 395178825Sdfr "if (e) return e;\np -= l; len -= l; ret += l;\n\n", 396178825Sdfr classname(t->tag.tagclass), 397178825Sdfr c ? "CONS" : "PRIM", 398178825Sdfr valuename(t->tag.tagclass, t->tag.tagvalue)); 399178825Sdfr free (tname); 40072445Sassar break; 401178825Sdfr } 402178825Sdfr case TChoice:{ 403178825Sdfr Member *m, *have_ellipsis = NULL; 404178825Sdfr char *s; 405178825Sdfr 406178825Sdfr if (t->members == NULL) 407178825Sdfr break; 408178825Sdfr 409178825Sdfr fprintf(codefile, "\n"); 410178825Sdfr 411178825Sdfr asprintf (&s, "(%s)", name); 412178825Sdfr if (s == NULL) 413178825Sdfr errx(1, "malloc"); 414178825Sdfr fprintf(codefile, "switch(%s->element) {\n", s); 415178825Sdfr 416178825Sdfr ASN1_TAILQ_FOREACH_REVERSE(m, t->members, memhead, members) { 417178825Sdfr char *s2; 418178825Sdfr 419178825Sdfr if (m->ellipsis) { 420178825Sdfr have_ellipsis = m; 421178825Sdfr continue; 422178825Sdfr } 423178825Sdfr 424178825Sdfr fprintf (codefile, "case %s: {", m->label); 425178825Sdfr asprintf(&s2, "%s(%s)->u.%s", m->optional ? "" : "&", 426178825Sdfr s, m->gen_name); 427178825Sdfr if (s2 == NULL) 428178825Sdfr errx(1, "malloc"); 429178825Sdfr if (m->optional) 430178825Sdfr fprintf (codefile, "if(%s) {\n", s2); 431178825Sdfr fprintf (codefile, "size_t %s_oldret = ret;\n", tmpstr); 432178825Sdfr fprintf (codefile, "ret = 0;\n"); 433178825Sdfr constructed = encode_type (s2, m->type, m->gen_name); 434178825Sdfr fprintf (codefile, "ret += %s_oldret;\n", tmpstr); 435178825Sdfr if(m->optional) 436178825Sdfr fprintf (codefile, "}\n"); 437178825Sdfr fprintf(codefile, "break;\n"); 438178825Sdfr fprintf(codefile, "}\n"); 439178825Sdfr free (s2); 440178825Sdfr } 441178825Sdfr free (s); 442178825Sdfr if (have_ellipsis) { 443178825Sdfr fprintf(codefile, 444178825Sdfr "case %s: {\n" 445178825Sdfr "if (len < (%s)->u.%s.length)\n" 446178825Sdfr "return ASN1_OVERFLOW;\n" 447178825Sdfr "p -= (%s)->u.%s.length;\n" 448178825Sdfr "ret += (%s)->u.%s.length;\n" 449178825Sdfr "memcpy(p + 1, (%s)->u.%s.data, (%s)->u.%s.length);\n" 450178825Sdfr "break;\n" 451178825Sdfr "}\n", 452178825Sdfr have_ellipsis->label, 453178825Sdfr name, have_ellipsis->gen_name, 454178825Sdfr name, have_ellipsis->gen_name, 455178825Sdfr name, have_ellipsis->gen_name, 456178825Sdfr name, have_ellipsis->gen_name, 457178825Sdfr name, have_ellipsis->gen_name); 458178825Sdfr } 459178825Sdfr fprintf(codefile, "};\n"); 460178825Sdfr break; 461178825Sdfr } 462178825Sdfr case TOID: 463178825Sdfr encode_primitive ("oid", name); 464178825Sdfr constructed = 0; 465178825Sdfr break; 466178825Sdfr case TUTCTime: 467178825Sdfr encode_primitive ("utctime", name); 468178825Sdfr constructed = 0; 469178825Sdfr break; 470178825Sdfr case TUTF8String: 471178825Sdfr encode_primitive ("utf8string", name); 472178825Sdfr constructed = 0; 473178825Sdfr break; 474178825Sdfr case TPrintableString: 475178825Sdfr encode_primitive ("printable_string", name); 476178825Sdfr constructed = 0; 477178825Sdfr break; 478178825Sdfr case TIA5String: 479178825Sdfr encode_primitive ("ia5_string", name); 480178825Sdfr constructed = 0; 481178825Sdfr break; 482178825Sdfr case TBMPString: 483178825Sdfr encode_primitive ("bmp_string", name); 484178825Sdfr constructed = 0; 485178825Sdfr break; 486178825Sdfr case TUniversalString: 487178825Sdfr encode_primitive ("universal_string", name); 488178825Sdfr constructed = 0; 489178825Sdfr break; 490178825Sdfr case TVisibleString: 491178825Sdfr encode_primitive ("visible_string", name); 492178825Sdfr constructed = 0; 493178825Sdfr break; 494178825Sdfr case TNull: 495178825Sdfr fprintf (codefile, "/* NULL */\n"); 496178825Sdfr constructed = 0; 497178825Sdfr break; 49872445Sassar default: 49972445Sassar abort (); 50072445Sassar } 501178825Sdfr return constructed; 50255682Smarkm} 50355682Smarkm 50455682Smarkmvoid 50555682Smarkmgenerate_type_encode (const Symbol *s) 50655682Smarkm{ 507178825Sdfr fprintf (headerfile, 508178825Sdfr "int " 509178825Sdfr "encode_%s(unsigned char *, size_t, const %s *, size_t *);\n", 510178825Sdfr s->gen_name, s->gen_name); 51155682Smarkm 512178825Sdfr fprintf (codefile, "int\n" 513178825Sdfr "encode_%s(unsigned char *p, size_t len," 514178825Sdfr " const %s *data, size_t *size)\n" 515178825Sdfr "{\n", 516178825Sdfr s->gen_name, s->gen_name); 51755682Smarkm 518178825Sdfr switch (s->type->type) { 519178825Sdfr case TInteger: 520178825Sdfr case TBoolean: 521178825Sdfr case TOctetString: 522178825Sdfr case TGeneralizedTime: 523178825Sdfr case TGeneralString: 524178825Sdfr case TUTCTime: 525178825Sdfr case TUTF8String: 526178825Sdfr case TPrintableString: 527178825Sdfr case TIA5String: 528178825Sdfr case TBMPString: 529178825Sdfr case TUniversalString: 530178825Sdfr case TVisibleString: 531178825Sdfr case TNull: 532178825Sdfr case TBitString: 533178825Sdfr case TEnumerated: 534178825Sdfr case TOID: 535178825Sdfr case TSequence: 536178825Sdfr case TSequenceOf: 537178825Sdfr case TSet: 538178825Sdfr case TSetOf: 539178825Sdfr case TTag: 540178825Sdfr case TType: 541178825Sdfr case TChoice: 542178825Sdfr fprintf (codefile, 543178825Sdfr "size_t ret = 0;\n" 544178825Sdfr "size_t l;\n" 545178825Sdfr "int i, e;\n\n"); 546178825Sdfr fprintf(codefile, "i = 0;\n"); /* hack to avoid `unused variable' */ 54755682Smarkm 548178825Sdfr encode_type("data", s->type, "Top"); 54972445Sassar 550178825Sdfr fprintf (codefile, "*size = ret;\n" 551178825Sdfr "return 0;\n"); 552178825Sdfr break; 553178825Sdfr default: 554178825Sdfr abort (); 555178825Sdfr } 556178825Sdfr fprintf (codefile, "}\n\n"); 55755682Smarkm} 558