Changeset 740 for vendor/current/source4/heimdal/lib/asn1/gen.c
- Timestamp:
- Nov 14, 2012, 12:59:34 PM (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified vendor/current/source4/heimdal/lib/asn1/gen.c ¶
r414 r740 3 3 * (Royal Institute of Technology, Stockholm, Sweden). 4 4 * All rights reserved. 5 * 6 * Portions Copyright (c) 2009 Apple Inc. All rights reserved. 5 7 * 6 8 * Redistribution and use in source and binary forms, with or without … … 36 38 RCSID("$Id$"); 37 39 38 FILE * headerfile, *codefile, *logfile;40 FILE *privheaderfile, *headerfile, *codefile, *logfile, *templatefile; 39 41 40 42 #define STEM "asn1" 41 43 42 44 static const char *orig_filename; 43 static char * header;45 static char *privheader, *header, *template; 44 46 static const char *headerbase = STEM; 45 47 … … 67 69 } 68 70 71 /* 72 * List of all exported symbols 73 */ 74 75 struct sexport { 76 const char *name; 77 int defined; 78 struct sexport *next; 79 }; 80 81 static struct sexport *exports = NULL; 82 83 void 84 add_export (const char *name) 85 { 86 struct sexport *tmp = emalloc (sizeof(*tmp)); 87 88 tmp->name = name; 89 tmp->next = exports; 90 exports = tmp; 91 } 92 93 int 94 is_export(const char *name) 95 { 96 struct sexport *tmp; 97 98 if (exports == NULL) /* no export list, all exported */ 99 return 1; 100 101 for (tmp = exports; tmp != NULL; tmp = tmp->next) { 102 if (strcmp(tmp->name, name) == 0) { 103 tmp->defined = 1; 104 return 1; 105 } 106 } 107 return 0; 108 } 109 69 110 const char * 70 111 get_filename (void) … … 76 117 init_generate (const char *filename, const char *base) 77 118 { 78 char *fn ;119 char *fn = NULL; 79 120 80 121 orig_filename = filename; … … 86 127 87 128 /* public header file */ 88 asprintf(&header, "%s.h", headerbase); 89 if (header == NULL) 129 if (asprintf(&header, "%s.h", headerbase) < 0 || header == NULL) 90 130 errx(1, "malloc"); 91 asprintf(&fn, "%s.hx", headerbase); 92 if (fn == NULL) 131 if (asprintf(&fn, "%s.hx", headerbase) < 0 || fn == NULL) 93 132 errx(1, "malloc"); 94 133 headerfile = fopen (fn, "w"); … … 96 135 err (1, "open %s", fn); 97 136 free(fn); 98 137 fn = NULL; 138 139 /* private header file */ 140 if (asprintf(&privheader, "%s-priv.h", headerbase) < 0 || privheader == NULL) 141 errx(1, "malloc"); 142 if (asprintf(&fn, "%s-priv.hx", headerbase) < 0 || fn == NULL) 143 errx(1, "malloc"); 144 privheaderfile = fopen (fn, "w"); 145 if (privheaderfile == NULL) 146 err (1, "open %s", fn); 147 free(fn); 148 fn = NULL; 149 150 /* template file */ 151 if (asprintf(&template, "%s-template.c", headerbase) < 0 || template == NULL) 152 errx(1, "malloc"); 99 153 fprintf (headerfile, 100 154 "/* Generated from %s */\n" … … 128 182 ); 129 183 fprintf (headerfile, 130 "typedef char *heim_printable_string;\n\n"184 "typedef struct heim_octet_string heim_printable_string;\n\n" 131 185 ); 132 186 fprintf (headerfile, 133 "typedef char *heim_ia5_string;\n\n"187 "typedef struct heim_octet_string heim_ia5_string;\n\n" 134 188 ); 135 189 fprintf (headerfile, … … 175 229 " } while (0)\n\n", 176 230 headerfile); 231 fputs("#ifdef _WIN32\n" 232 "#ifndef ASN1_LIB\n" 233 "#define ASN1EXP __declspec(dllimport)\n" 234 "#else\n" 235 "#define ASN1EXP\n" 236 "#endif\n" 237 "#define ASN1CALL __stdcall\n" 238 "#else\n" 239 "#define ASN1EXP\n" 240 "#define ASN1CALL\n" 241 "#endif\n", 242 headerfile); 177 243 fprintf (headerfile, "struct units;\n\n"); 178 244 fprintf (headerfile, "#endif\n\n"); 179 asprintf(&fn, "%s_files", base); 180 if (fn == NULL) 245 if (asprintf(&fn, "%s_files", base) < 0 || fn == NULL) 181 246 errx(1, "malloc"); 182 247 logfile = fopen(fn, "w"); 183 248 if (logfile == NULL) 184 249 err (1, "open %s", fn); 185 } 186 187 void 188 close_generate (void) 189 { 190 fprintf (headerfile, "#endif /* __%s_h__ */\n", headerbase); 191 192 fclose (headerfile); 193 fprintf (logfile, "\n"); 194 fclose (logfile); 195 } 196 197 void 198 gen_assign_defval(const char *var, struct value *val) 199 { 200 switch(val->type) { 201 case stringvalue: 202 fprintf(codefile, "if((%s = strdup(\"%s\")) == NULL)\nreturn ENOMEM;\n", var, val->u.stringvalue); 203 break; 204 case integervalue: 205 fprintf(codefile, "%s = %d;\n", var, val->u.integervalue); 206 break; 207 case booleanvalue: 208 if(val->u.booleanvalue) 209 fprintf(codefile, "%s = TRUE;\n", var); 210 else 211 fprintf(codefile, "%s = FALSE;\n", var); 212 break; 213 default: 214 abort(); 215 } 216 } 217 218 void 219 gen_compare_defval(const char *var, struct value *val) 220 { 221 switch(val->type) { 222 case stringvalue: 223 fprintf(codefile, "if(strcmp(%s, \"%s\") != 0)\n", var, val->u.stringvalue); 224 break; 225 case integervalue: 226 fprintf(codefile, "if(%s != %d)\n", var, val->u.integervalue); 227 break; 228 case booleanvalue: 229 if(val->u.booleanvalue) 230 fprintf(codefile, "if(!%s)\n", var); 231 else 232 fprintf(codefile, "if(%s)\n", var); 233 break; 234 default: 235 abort(); 236 } 237 } 238 239 void 240 generate_header_of_codefile(const char *name) 241 { 242 char *filename; 243 244 if (codefile != NULL) 245 abort(); 246 247 asprintf (&filename, "%s_%s.x", STEM, name); 248 if (filename == NULL) 249 errx(1, "malloc"); 250 codefile = fopen (filename, "w"); 251 if (codefile == NULL) 252 err (1, "fopen %s", filename); 253 fprintf(logfile, "%s ", filename); 254 free(filename); 255 fprintf (codefile, 250 251 /* if one code file, write into the one codefile */ 252 if (one_code_file) 253 return; 254 255 templatefile = fopen (template, "w"); 256 if (templatefile == NULL) 257 err (1, "open %s", template); 258 259 fprintf (templatefile, 256 260 "/* Generated from %s */\n" 257 261 "/* Do not edit */\n\n" … … 263 267 "#include <limits.h>\n" 264 268 "#include <krb5-types.h>\n", 269 filename); 270 271 fprintf (templatefile, 272 "#include <%s>\n" 273 "#include <%s>\n" 274 "#include <der.h>\n" 275 "#include <der-private.h>\n" 276 "#include <asn1-template.h>\n", 277 header, privheader); 278 279 280 } 281 282 void 283 close_generate (void) 284 { 285 fprintf (headerfile, "#endif /* __%s_h__ */\n", headerbase); 286 287 if (headerfile) 288 fclose (headerfile); 289 if (privheaderfile) 290 fclose (privheaderfile); 291 if (templatefile) 292 fclose (templatefile); 293 if (logfile) 294 fprintf (logfile, "\n"); 295 fclose (logfile); 296 } 297 298 void 299 gen_assign_defval(const char *var, struct value *val) 300 { 301 switch(val->type) { 302 case stringvalue: 303 fprintf(codefile, "if((%s = strdup(\"%s\")) == NULL)\nreturn ENOMEM;\n", var, val->u.stringvalue); 304 break; 305 case integervalue: 306 fprintf(codefile, "%s = %d;\n", var, val->u.integervalue); 307 break; 308 case booleanvalue: 309 if(val->u.booleanvalue) 310 fprintf(codefile, "%s = TRUE;\n", var); 311 else 312 fprintf(codefile, "%s = FALSE;\n", var); 313 break; 314 default: 315 abort(); 316 } 317 } 318 319 void 320 gen_compare_defval(const char *var, struct value *val) 321 { 322 switch(val->type) { 323 case stringvalue: 324 fprintf(codefile, "if(strcmp(%s, \"%s\") != 0)\n", var, val->u.stringvalue); 325 break; 326 case integervalue: 327 fprintf(codefile, "if(%s != %d)\n", var, val->u.integervalue); 328 break; 329 case booleanvalue: 330 if(val->u.booleanvalue) 331 fprintf(codefile, "if(!%s)\n", var); 332 else 333 fprintf(codefile, "if(%s)\n", var); 334 break; 335 default: 336 abort(); 337 } 338 } 339 340 void 341 generate_header_of_codefile(const char *name) 342 { 343 char *filename = NULL; 344 345 if (codefile != NULL) 346 abort(); 347 348 if (asprintf (&filename, "%s_%s.x", STEM, name) < 0 || filename == NULL) 349 errx(1, "malloc"); 350 codefile = fopen (filename, "w"); 351 if (codefile == NULL) 352 err (1, "fopen %s", filename); 353 fprintf(logfile, "%s ", filename); 354 free(filename); 355 filename = NULL; 356 fprintf (codefile, 357 "/* Generated from %s */\n" 358 "/* Do not edit */\n\n" 359 "#define ASN1_LIB\n\n" 360 "#include <stdio.h>\n" 361 "#include <stdlib.h>\n" 362 "#include <time.h>\n" 363 "#include <string.h>\n" 364 "#include <errno.h>\n" 365 "#include <limits.h>\n" 366 "#include <krb5-types.h>\n", 265 367 orig_filename); 266 368 267 369 fprintf (codefile, 268 "#include <%s.h>\n", 269 headerbase); 370 "#include <%s>\n" 371 "#include <%s>\n", 372 header, privheader); 270 373 fprintf (codefile, 271 374 "#include <asn1_err.h>\n" 272 375 "#include <der.h>\n" 376 "#include <der-private.h>\n" 377 "#include <asn1-template.h>\n" 273 378 "#include <parse_units.h>\n\n"); 274 379 … … 303 408 struct objid *o, **list; 304 409 unsigned int i, len; 410 char *gen_upper; 305 411 306 412 if (!one_code_file) … … 328 434 } 329 435 330 fprintf (headerfile, "} */\n");331 fprintf (headerfile, "const heim_oid *oid_%s(void);\n",332 s->gen_name);333 fprintf (headerfile,334 "extern const heim_oid asn1_oid_%s;\n\n",335 s->gen_name);336 337 338 436 fprintf (codefile, "static unsigned oid_%s_variable_num[%d] = {", 339 437 s->gen_name, len); … … 347 445 s->gen_name, len, s->gen_name); 348 446 349 fprintf (codefile, "const heim_oid *oid_%s(void)\n"350 "{\n"351 "return &asn1_oid_%s;\n"352 "}\n\n",353 s->gen_name, s->gen_name);354 355 447 free(list); 448 449 /* header file */ 450 451 gen_upper = strdup(s->gen_name); 452 len = strlen(gen_upper); 453 for (i = 0; i < len; i++) 454 gen_upper[i] = toupper((int)s->gen_name[i]); 455 456 fprintf (headerfile, "} */\n"); 457 fprintf (headerfile, 458 "extern ASN1EXP const heim_oid asn1_oid_%s;\n" 459 "#define ASN1_OID_%s (&asn1_oid_%s)\n\n", 460 s->gen_name, 461 gen_upper, 462 s->gen_name); 463 464 free(gen_upper); 356 465 357 466 if (!one_code_file) … … 362 471 default: 363 472 abort(); 473 } 474 } 475 476 int 477 is_primitive_type(int type) 478 { 479 switch(type) { 480 case TInteger: 481 case TBoolean: 482 case TOctetString: 483 case TBitString: 484 case TEnumerated: 485 case TGeneralizedTime: 486 case TGeneralString: 487 case TTeletexString: 488 case TOID: 489 case TUTCTime: 490 case TUTF8String: 491 case TPrintableString: 492 case TIA5String: 493 case TBMPString: 494 case TUniversalString: 495 case TVisibleString: 496 case TNull: 497 return 1; 498 default: 499 return 0; 364 500 } 365 501 } … … 495 631 fprintf (headerfile, "GeneralString"); 496 632 break; 633 case TTeletexString: 634 fprintf (headerfile, "TeletexString"); 635 break; 497 636 case TTag: { 498 637 const char *classnames[] = { "UNIVERSAL ", "APPLICATION ", … … 548 687 549 688 static void 550 define_type (int level, const char *name, Type *t, int typedefp, int preservep) 551 { 689 getnewbasename(char **newbasename, int typedefp, const char *basename, const char *name) 690 { 691 if (typedefp) 692 *newbasename = strdup(name); 693 else { 694 if (name[0] == '*') 695 name++; 696 if (asprintf(newbasename, "%s_%s", basename, name) < 0) 697 errx(1, "malloc"); 698 } 699 if (*newbasename == NULL) 700 err(1, "malloc"); 701 } 702 703 static void 704 define_type (int level, const char *name, const char *basename, Type *t, int typedefp, int preservep) 705 { 706 char *newbasename = NULL; 707 552 708 switch (t->type) { 553 709 case TType: … … 600 756 fprintf (headerfile, "heim_bit_string %s;\n", name); 601 757 else { 602 fprintf (headerfile, "struct %s {\n", typedefp ? name : ""); 758 int pos = 0; 759 getnewbasename(&newbasename, typedefp, basename, name); 760 761 fprintf (headerfile, "struct %s {\n", newbasename); 603 762 ASN1_TAILQ_FOREACH(m, t->members, members) { 604 char *n ;763 char *n = NULL; 605 764 606 asprintf (&n, "%s:1", m->gen_name); 607 if (n == NULL) 765 /* pad unused */ 766 while (pos < m->val) { 767 if (asprintf (&n, "_unused%d:1", pos) < 0 || n == NULL) 768 errx(1, "malloc"); 769 define_type (level + 1, n, newbasename, &i, FALSE, FALSE); 770 free(n); 771 pos++; 772 } 773 774 n = NULL; 775 if (asprintf (&n, "%s:1", m->gen_name) < 0 || n == NULL) 608 776 errx(1, "malloc"); 609 define_type (level + 1, n, &i, FALSE, FALSE);777 define_type (level + 1, n, newbasename, &i, FALSE, FALSE); 610 778 free (n); 779 n = NULL; 780 pos++; 611 781 } 782 /* pad to 32 elements */ 783 while (pos < 32) { 784 char *n = NULL; 785 if (asprintf (&n, "_unused%d:1", pos) < 0 || n == NULL) 786 errx(1, "malloc"); 787 define_type (level + 1, n, newbasename, &i, FALSE, FALSE); 788 free(n); 789 pos++; 790 } 791 612 792 space(level); 613 793 fprintf (headerfile, "} %s;\n\n", name); … … 636 816 Member *m; 637 817 638 space(level); 639 fprintf (headerfile, "struct %s {\n", typedefp ? name : ""); 818 getnewbasename(&newbasename, typedefp, basename, name); 819 820 space(level); 821 fprintf (headerfile, "struct %s {\n", newbasename); 640 822 if (t->type == TSequence && preservep) { 641 823 space(level + 1); … … 646 828 ; 647 829 } else if (m->optional) { 648 char *n; 649 650 asprintf (&n, "*%s", m->gen_name); 651 if (n == NULL) 830 char *n = NULL; 831 832 if (asprintf (&n, "*%s", m->gen_name) < 0 || n == NULL) 652 833 errx(1, "malloc"); 653 define_type (level + 1, n, m->type, FALSE, FALSE);834 define_type (level + 1, n, newbasename, m->type, FALSE, FALSE); 654 835 free (n); 655 836 } else 656 define_type (level + 1, m->gen_name, m->type, FALSE, FALSE);837 define_type (level + 1, m->gen_name, newbasename, m->type, FALSE, FALSE); 657 838 } 658 839 space(level); … … 665 846 struct range range = { 0, INT_MAX }; 666 847 848 getnewbasename(&newbasename, typedefp, basename, name); 849 667 850 i.type = TInteger; 668 851 i.range = ⦥ … … 671 854 672 855 space(level); 673 fprintf (headerfile, "struct %s {\n", typedefp ? name : "");674 define_type (level + 1, "len", &i, FALSE, FALSE);675 define_type (level + 1, "*val", t->subtype, FALSE, FALSE);856 fprintf (headerfile, "struct %s {\n", newbasename); 857 define_type (level + 1, "len", newbasename, &i, FALSE, FALSE); 858 define_type (level + 1, "*val", newbasename, t->subtype, FALSE, FALSE); 676 859 space(level); 677 860 fprintf (headerfile, "} %s;\n", name); … … 686 869 fprintf (headerfile, "heim_general_string %s;\n", name); 687 870 break; 871 case TTeletexString: 872 space(level); 873 fprintf (headerfile, "heim_general_string %s;\n", name); 874 break; 688 875 case TTag: 689 define_type (level, name, t->subtype, typedefp, preservep);876 define_type (level, name, basename, t->subtype, typedefp, preservep); 690 877 break; 691 878 case TChoice: { … … 693 880 Member *m; 694 881 695 space(level); 696 fprintf (headerfile, "struct %s {\n", typedefp ? name : ""); 882 getnewbasename(&newbasename, typedefp, basename, name); 883 884 space(level); 885 fprintf (headerfile, "struct %s {\n", newbasename); 697 886 if (preservep) { 698 887 space(level + 1); … … 726 915 fprintf(headerfile, "heim_octet_string asn1_ellipsis;\n"); 727 916 } else if (m->optional) { 728 char *n; 729 730 asprintf (&n, "*%s", m->gen_name); 731 if (n == NULL) 917 char *n = NULL; 918 919 if (asprintf (&n, "*%s", m->gen_name) < 0 || n == NULL) 732 920 errx(1, "malloc"); 733 define_type (level + 2, n, m->type, FALSE, FALSE);921 define_type (level + 2, n, newbasename, m->type, FALSE, FALSE); 734 922 free (n); 735 923 } else 736 define_type (level + 2, m->gen_name, m->type, FALSE, FALSE);924 define_type (level + 2, m->gen_name, newbasename, m->type, FALSE, FALSE); 737 925 } 738 926 space(level + 1); … … 781 969 abort (); 782 970 } 971 if (newbasename) 972 free(newbasename); 783 973 } 784 974 … … 794 984 795 985 fprintf (headerfile, "typedef "); 796 define_type (0, s->gen_name, s-> type, TRUE, preservep);986 define_type (0, s->gen_name, s->gen_name, s->type, TRUE, preservep); 797 987 798 988 fprintf (headerfile, "\n"); 799 989 } 800 801 990 802 991 void 803 992 generate_type (const Symbol *s) 804 993 { 994 FILE *h; 995 const char * exp; 996 805 997 if (!one_code_file) 806 998 generate_header_of_codefile(s->gen_name); 807 999 808 1000 generate_type_header (s); 809 generate_type_encode (s); 810 generate_type_decode (s); 811 generate_type_free (s); 812 generate_type_length (s); 813 generate_type_copy (s); 1001 1002 if (template_flag) 1003 generate_template(s); 1004 1005 if (template_flag == 0 || is_template_compat(s) == 0) { 1006 generate_type_encode (s); 1007 generate_type_decode (s); 1008 generate_type_free (s); 1009 generate_type_length (s); 1010 generate_type_copy (s); 1011 } 814 1012 generate_type_seq (s); 815 1013 generate_glue (s->type, s->gen_name); 816 fprintf(headerfile, "\n\n"); 1014 1015 /* generate prototypes */ 1016 1017 if (is_export(s->name)) { 1018 h = headerfile; 1019 exp = "ASN1EXP "; 1020 } else { 1021 h = privheaderfile; 1022 exp = ""; 1023 } 1024 1025 fprintf (h, 1026 "%sint ASN1CALL " 1027 "decode_%s(const unsigned char *, size_t, %s *, size_t *);\n", 1028 exp, 1029 s->gen_name, s->gen_name); 1030 fprintf (h, 1031 "%sint ASN1CALL " 1032 "encode_%s(unsigned char *, size_t, const %s *, size_t *);\n", 1033 exp, 1034 s->gen_name, s->gen_name); 1035 fprintf (h, 1036 "%ssize_t ASN1CALL length_%s(const %s *);\n", 1037 exp, 1038 s->gen_name, s->gen_name); 1039 fprintf (h, 1040 "%sint ASN1CALL copy_%s (const %s *, %s *);\n", 1041 exp, 1042 s->gen_name, s->gen_name, s->gen_name); 1043 fprintf (h, 1044 "%svoid ASN1CALL free_%s (%s *);\n", 1045 exp, 1046 s->gen_name, s->gen_name); 1047 1048 fprintf(h, "\n\n"); 817 1049 818 1050 if (!one_code_file) {
Note:
See TracChangeset
for help on using the changeset viewer.