155682Smarkm/* 2233294Sstas * Copyright (c) 1997 - 2006 Kungliga Tekniska H��gskolan 3233294Sstas * (Royal Institute of Technology, Stockholm, Sweden). 4233294Sstas * All rights reserved. 555682Smarkm * 6233294Sstas * Redistribution and use in source and binary forms, with or without 7233294Sstas * modification, are permitted provided that the following conditions 8233294Sstas * are met: 955682Smarkm * 10233294Sstas * 1. Redistributions of source code must retain the above copyright 11233294Sstas * notice, this list of conditions and the following disclaimer. 1255682Smarkm * 13233294Sstas * 2. Redistributions in binary form must reproduce the above copyright 14233294Sstas * notice, this list of conditions and the following disclaimer in the 15233294Sstas * documentation and/or other materials provided with the distribution. 1655682Smarkm * 17233294Sstas * 3. Neither the name of the Institute nor the names of its contributors 18233294Sstas * may be used to endorse or promote products derived from this software 19233294Sstas * without specific prior written permission. 2055682Smarkm * 21233294Sstas * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 22233294Sstas * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23233294Sstas * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24233294Sstas * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 25233294Sstas * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26233294Sstas * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27233294Sstas * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28233294Sstas * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29233294Sstas * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30233294Sstas * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31233294Sstas * SUCH DAMAGE. 3255682Smarkm */ 3355682Smarkm 3455682Smarkm#include "gen_locl.h" 3555682Smarkm 36233294SstasRCSID("$Id$"); 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]; 63233294Sstas 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 139233294Sstas 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" 212233294Sstas "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"); 221233294Sstas 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 238233294Sstas 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; 260233294Sstas 261178825Sdfr ASN1_TAILQ_FOREACH_REVERSE(m, t->members, memhead, members) { 262233294Sstas char *s = NULL; 26355682Smarkm 264178825Sdfr if (m->ellipsis) 265178825Sdfr continue; 266178825Sdfr 267233294Sstas if (asprintf (&s, "%s(%s)->%s", m->optional ? "" : "&", name, m->gen_name) < 0 || s == NULL) 268178825Sdfr errx(1, "malloc"); 269178825Sdfr fprintf(codefile, "/* %s */\n", m->name); 27072445Sassar if (m->optional) 27172445Sassar fprintf (codefile, 272178825Sdfr "if(%s) ", 27372445Sassar s); 274178825Sdfr else if(m->defval) 275178825Sdfr gen_compare_defval(s + 1, m->defval); 276178825Sdfr fprintf (codefile, "{\n"); 277233294Sstas fprintf (codefile, "size_t %s_oldret HEIMDAL_UNUSED_ATTRIBUTE = ret;\n", tmpstr); 278178825Sdfr fprintf (codefile, "ret = 0;\n"); 279178825Sdfr encode_type (s, m->type, m->gen_name); 280178825Sdfr fprintf (codefile, "ret += %s_oldret;\n", tmpstr); 281178825Sdfr fprintf (codefile, "}\n"); 28272445Sassar free (s); 28372445Sassar } 284178825Sdfr break; 285178825Sdfr } 286178825Sdfr case TSetOf: { 287178825Sdfr 288178825Sdfr fprintf(codefile, 289178825Sdfr "{\n" 290178825Sdfr "struct heim_octet_string *val;\n" 291233294Sstas "size_t elen = 0, totallen = 0;\n" 292233294Sstas "int eret = 0;\n"); 293178825Sdfr 294178825Sdfr fprintf(codefile, 295178825Sdfr "if ((%s)->len > UINT_MAX/sizeof(val[0]))\n" 296178825Sdfr "return ERANGE;\n", 297178825Sdfr name); 298178825Sdfr 299178825Sdfr fprintf(codefile, 300178825Sdfr "val = malloc(sizeof(val[0]) * (%s)->len);\n" 301178825Sdfr "if (val == NULL && (%s)->len != 0) return ENOMEM;\n", 302178825Sdfr name, name); 303178825Sdfr 304178825Sdfr fprintf(codefile, 305233294Sstas "for(i = 0; i < (int)(%s)->len; i++) {\n", 306178825Sdfr name); 307178825Sdfr 308178825Sdfr fprintf(codefile, 309178825Sdfr "ASN1_MALLOC_ENCODE(%s, val[i].data, " 310178825Sdfr "val[i].length, &(%s)->val[i], &elen, eret);\n", 311178825Sdfr t->subtype->symbol->gen_name, 312178825Sdfr name); 313178825Sdfr 314178825Sdfr fprintf(codefile, 315178825Sdfr "if(eret) {\n" 316178825Sdfr "i--;\n" 317178825Sdfr "while (i >= 0) {\n" 318178825Sdfr "free(val[i].data);\n" 319178825Sdfr "i--;\n" 320178825Sdfr "}\n" 321178825Sdfr "free(val);\n" 322178825Sdfr "return eret;\n" 323178825Sdfr "}\n" 324178825Sdfr "totallen += elen;\n" 325178825Sdfr "}\n"); 326178825Sdfr 327178825Sdfr fprintf(codefile, 328178825Sdfr "if (totallen > len) {\n" 329233294Sstas "for (i = 0; i < (int)(%s)->len; i++) {\n" 330178825Sdfr "free(val[i].data);\n" 331178825Sdfr "}\n" 332178825Sdfr "free(val);\n" 333178825Sdfr "return ASN1_OVERFLOW;\n" 334178825Sdfr "}\n", 335178825Sdfr name); 336178825Sdfr 337178825Sdfr fprintf(codefile, 338178825Sdfr "qsort(val, (%s)->len, sizeof(val[0]), _heim_der_set_sort);\n", 339178825Sdfr name); 340178825Sdfr 34172445Sassar fprintf (codefile, 342233294Sstas "for(i = (int)(%s)->len - 1; i >= 0; --i) {\n" 343178825Sdfr "p -= val[i].length;\n" 344178825Sdfr "ret += val[i].length;\n" 345178825Sdfr "memcpy(p + 1, val[i].data, val[i].length);\n" 346178825Sdfr "free(val[i].data);\n" 347178825Sdfr "}\n" 348178825Sdfr "free(val);\n" 349178825Sdfr "}\n", 350178825Sdfr name); 35172445Sassar break; 35255682Smarkm } 35372445Sassar case TSequenceOf: { 354233294Sstas char *sname = NULL; 355233294Sstas char *n = NULL; 35655682Smarkm 35772445Sassar fprintf (codefile, 358233294Sstas "for(i = (int)(%s)->len - 1; i >= 0; --i) {\n" 359178825Sdfr "size_t %s_for_oldret = ret;\n" 36072445Sassar "ret = 0;\n", 361178825Sdfr name, tmpstr); 362233294Sstas if (asprintf (&n, "&(%s)->val[i]", name) < 0 || n == NULL) 363178825Sdfr errx(1, "malloc"); 364233294Sstas if (asprintf (&sname, "%s_S_Of", tmpstr) < 0 || sname == NULL) 365178825Sdfr errx(1, "malloc"); 366178825Sdfr encode_type (n, t->subtype, sname); 36772445Sassar fprintf (codefile, 368178825Sdfr "ret += %s_for_oldret;\n" 369178825Sdfr "}\n", 370178825Sdfr tmpstr); 37172445Sassar free (n); 372178825Sdfr free (sname); 37372445Sassar break; 37472445Sassar } 37572445Sassar case TGeneralizedTime: 37672445Sassar encode_primitive ("generalized_time", name); 377178825Sdfr constructed = 0; 37872445Sassar break; 37972445Sassar case TGeneralString: 38072445Sassar encode_primitive ("general_string", name); 381178825Sdfr constructed = 0; 38272445Sassar break; 383233294Sstas case TTeletexString: 384233294Sstas encode_primitive ("general_string", name); 385233294Sstas constructed = 0; 386233294Sstas break; 387178825Sdfr case TTag: { 388233294Sstas char *tname = NULL; 389178825Sdfr int c; 390233294Sstas if (asprintf (&tname, "%s_tag", tmpstr) < 0 || tname == NULL) 391233294Sstas 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), 397233294Sstas 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; 404233294Sstas char *s = NULL; 405178825Sdfr 406178825Sdfr if (t->members == NULL) 407178825Sdfr break; 408178825Sdfr 409178825Sdfr fprintf(codefile, "\n"); 410178825Sdfr 411233294Sstas if (asprintf (&s, "(%s)", name) < 0 || s == NULL) 412178825Sdfr errx(1, "malloc"); 413178825Sdfr fprintf(codefile, "switch(%s->element) {\n", s); 414178825Sdfr 415178825Sdfr ASN1_TAILQ_FOREACH_REVERSE(m, t->members, memhead, members) { 416233294Sstas char *s2 = NULL; 417178825Sdfr 418178825Sdfr if (m->ellipsis) { 419178825Sdfr have_ellipsis = m; 420178825Sdfr continue; 421178825Sdfr } 422178825Sdfr 423233294Sstas fprintf (codefile, "case %s: {", m->label); 424233294Sstas if (asprintf(&s2, "%s(%s)->u.%s", m->optional ? "" : "&", 425233294Sstas s, m->gen_name) < 0 || s2 == NULL) 426178825Sdfr errx(1, "malloc"); 427178825Sdfr if (m->optional) 428178825Sdfr fprintf (codefile, "if(%s) {\n", s2); 429178825Sdfr fprintf (codefile, "size_t %s_oldret = ret;\n", tmpstr); 430178825Sdfr fprintf (codefile, "ret = 0;\n"); 431178825Sdfr constructed = encode_type (s2, m->type, m->gen_name); 432178825Sdfr fprintf (codefile, "ret += %s_oldret;\n", tmpstr); 433178825Sdfr if(m->optional) 434178825Sdfr fprintf (codefile, "}\n"); 435178825Sdfr fprintf(codefile, "break;\n"); 436178825Sdfr fprintf(codefile, "}\n"); 437178825Sdfr free (s2); 438178825Sdfr } 439178825Sdfr free (s); 440178825Sdfr if (have_ellipsis) { 441178825Sdfr fprintf(codefile, 442178825Sdfr "case %s: {\n" 443178825Sdfr "if (len < (%s)->u.%s.length)\n" 444178825Sdfr "return ASN1_OVERFLOW;\n" 445178825Sdfr "p -= (%s)->u.%s.length;\n" 446178825Sdfr "ret += (%s)->u.%s.length;\n" 447178825Sdfr "memcpy(p + 1, (%s)->u.%s.data, (%s)->u.%s.length);\n" 448178825Sdfr "break;\n" 449178825Sdfr "}\n", 450178825Sdfr have_ellipsis->label, 451178825Sdfr name, have_ellipsis->gen_name, 452178825Sdfr name, have_ellipsis->gen_name, 453178825Sdfr name, have_ellipsis->gen_name, 454178825Sdfr name, have_ellipsis->gen_name, 455178825Sdfr name, have_ellipsis->gen_name); 456178825Sdfr } 457178825Sdfr fprintf(codefile, "};\n"); 458178825Sdfr break; 459178825Sdfr } 460178825Sdfr case TOID: 461178825Sdfr encode_primitive ("oid", name); 462178825Sdfr constructed = 0; 463178825Sdfr break; 464178825Sdfr case TUTCTime: 465178825Sdfr encode_primitive ("utctime", name); 466178825Sdfr constructed = 0; 467178825Sdfr break; 468178825Sdfr case TUTF8String: 469178825Sdfr encode_primitive ("utf8string", name); 470178825Sdfr constructed = 0; 471178825Sdfr break; 472178825Sdfr case TPrintableString: 473178825Sdfr encode_primitive ("printable_string", name); 474178825Sdfr constructed = 0; 475178825Sdfr break; 476178825Sdfr case TIA5String: 477178825Sdfr encode_primitive ("ia5_string", name); 478178825Sdfr constructed = 0; 479178825Sdfr break; 480178825Sdfr case TBMPString: 481178825Sdfr encode_primitive ("bmp_string", name); 482178825Sdfr constructed = 0; 483178825Sdfr break; 484178825Sdfr case TUniversalString: 485178825Sdfr encode_primitive ("universal_string", name); 486178825Sdfr constructed = 0; 487178825Sdfr break; 488178825Sdfr case TVisibleString: 489178825Sdfr encode_primitive ("visible_string", name); 490178825Sdfr constructed = 0; 491178825Sdfr break; 492178825Sdfr case TNull: 493178825Sdfr fprintf (codefile, "/* NULL */\n"); 494178825Sdfr constructed = 0; 495178825Sdfr break; 49672445Sassar default: 49772445Sassar abort (); 49872445Sassar } 499178825Sdfr return constructed; 50055682Smarkm} 50155682Smarkm 50255682Smarkmvoid 50355682Smarkmgenerate_type_encode (const Symbol *s) 50455682Smarkm{ 505233294Sstas fprintf (codefile, "int ASN1CALL\n" 506233294Sstas "encode_%s(unsigned char *p HEIMDAL_UNUSED_ATTRIBUTE, size_t len HEIMDAL_UNUSED_ATTRIBUTE," 507178825Sdfr " const %s *data, size_t *size)\n" 508178825Sdfr "{\n", 509178825Sdfr s->gen_name, s->gen_name); 51055682Smarkm 511178825Sdfr switch (s->type->type) { 512178825Sdfr case TInteger: 513178825Sdfr case TBoolean: 514178825Sdfr case TOctetString: 515178825Sdfr case TGeneralizedTime: 516178825Sdfr case TGeneralString: 517233294Sstas case TTeletexString: 518178825Sdfr case TUTCTime: 519178825Sdfr case TUTF8String: 520178825Sdfr case TPrintableString: 521178825Sdfr case TIA5String: 522178825Sdfr case TBMPString: 523178825Sdfr case TUniversalString: 524178825Sdfr case TVisibleString: 525178825Sdfr case TNull: 526178825Sdfr case TBitString: 527178825Sdfr case TEnumerated: 528178825Sdfr case TOID: 529178825Sdfr case TSequence: 530178825Sdfr case TSequenceOf: 531178825Sdfr case TSet: 532178825Sdfr case TSetOf: 533178825Sdfr case TTag: 534178825Sdfr case TType: 535178825Sdfr case TChoice: 536178825Sdfr fprintf (codefile, 537233294Sstas "size_t ret HEIMDAL_UNUSED_ATTRIBUTE = 0;\n" 538233294Sstas "size_t l HEIMDAL_UNUSED_ATTRIBUTE;\n" 539233294Sstas "int i HEIMDAL_UNUSED_ATTRIBUTE, e HEIMDAL_UNUSED_ATTRIBUTE;\n\n"); 540233294Sstas 541178825Sdfr encode_type("data", s->type, "Top"); 54272445Sassar 543178825Sdfr fprintf (codefile, "*size = ret;\n" 544178825Sdfr "return 0;\n"); 545178825Sdfr break; 546178825Sdfr default: 547178825Sdfr abort (); 548178825Sdfr } 549178825Sdfr fprintf (codefile, "}\n\n"); 55055682Smarkm} 551