Ignore:
Timestamp:
Nov 14, 2012, 12:59:34 PM (12 years ago)
Author:
Silvan Scherrer
Message:

Samba Server: update vendor to 3.6.0

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified vendor/current/source4/heimdal/lib/asn1/gen.c

    r414 r740  
    33 * (Royal Institute of Technology, Stockholm, Sweden).
    44 * All rights reserved.
     5 *
     6 * Portions Copyright (c) 2009 Apple Inc. All rights reserved.
    57 *
    68 * Redistribution and use in source and binary forms, with or without
     
    3638RCSID("$Id$");
    3739
    38 FILE *headerfile, *codefile, *logfile;
     40FILE *privheaderfile, *headerfile, *codefile, *logfile, *templatefile;
    3941
    4042#define STEM "asn1"
    4143
    4244static const char *orig_filename;
    43 static char *header;
     45static char *privheader, *header, *template;
    4446static const char *headerbase = STEM;
    4547
     
    6769}
    6870
     71/*
     72 * List of all exported symbols
     73 */
     74
     75struct sexport {
     76    const char *name;
     77    int defined;
     78    struct sexport *next;
     79};
     80
     81static struct sexport *exports = NULL;
     82
     83void
     84add_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
     93int
     94is_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
    69110const char *
    70111get_filename (void)
     
    76117init_generate (const char *filename, const char *base)
    77118{
    78     char *fn;
     119    char *fn = NULL;
    79120
    80121    orig_filename = filename;
     
    86127
    87128    /* public header file */
    88     asprintf(&header, "%s.h", headerbase);
    89     if (header == NULL)
     129    if (asprintf(&header, "%s.h", headerbase) < 0 || header == NULL)
    90130        errx(1, "malloc");
    91     asprintf(&fn, "%s.hx", headerbase);
    92     if (fn == NULL)
     131    if (asprintf(&fn, "%s.hx", headerbase) < 0 || fn == NULL)
    93132        errx(1, "malloc");
    94133    headerfile = fopen (fn, "w");
     
    96135        err (1, "open %s", fn);
    97136    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");
    99153    fprintf (headerfile,
    100154             "/* Generated from %s */\n"
     
    128182             );
    129183    fprintf (headerfile,
    130              "typedef char *heim_printable_string;\n\n"
     184             "typedef struct heim_octet_string heim_printable_string;\n\n"
    131185             );
    132186    fprintf (headerfile,
    133              "typedef char *heim_ia5_string;\n\n"
     187             "typedef struct heim_octet_string heim_ia5_string;\n\n"
    134188             );
    135189    fprintf (headerfile,
     
    175229          "  } while (0)\n\n",
    176230          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);
    177243    fprintf (headerfile, "struct units;\n\n");
    178244    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)
    181246        errx(1, "malloc");
    182247    logfile = fopen(fn, "w");
    183248    if (logfile == NULL)
    184249        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,
    256260             "/* Generated from %s */\n"
    257261             "/* Do not edit */\n\n"
     
    263267             "#include <limits.h>\n"
    264268             "#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
     282void
     283close_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
     298void
     299gen_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
     319void
     320gen_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
     340void
     341generate_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",
    265367             orig_filename);
    266368
    267369    fprintf (codefile,
    268              "#include <%s.h>\n",
    269              headerbase);
     370             "#include <%s>\n"
     371             "#include <%s>\n",
     372             header, privheader);
    270373    fprintf (codefile,
    271374             "#include <asn1_err.h>\n"
    272375             "#include <der.h>\n"
     376             "#include <der-private.h>\n"
     377             "#include <asn1-template.h>\n"
    273378             "#include <parse_units.h>\n\n");
    274379
     
    303408        struct objid *o, **list;
    304409        unsigned int i, len;
     410        char *gen_upper;
    305411
    306412        if (!one_code_file)
     
    328434        }
    329435
    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 
    338436        fprintf (codefile, "static unsigned oid_%s_variable_num[%d] =  {",
    339437                 s->gen_name, len);
     
    347445                 s->gen_name, len, s->gen_name);
    348446
    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 
    355447        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);
    356465
    357466        if (!one_code_file)
     
    362471    default:
    363472        abort();
     473    }
     474}
     475
     476int
     477is_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;
    364500    }
    365501}
     
    495631        fprintf (headerfile, "GeneralString");
    496632        break;
     633    case TTeletexString:
     634        fprintf (headerfile, "TeletexString");
     635        break;
    497636    case TTag: {
    498637        const char *classnames[] = { "UNIVERSAL ", "APPLICATION ",
     
    548687
    549688static void
    550 define_type (int level, const char *name, Type *t, int typedefp, int preservep)
    551 {
     689getnewbasename(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
     703static void
     704define_type (int level, const char *name, const char *basename, Type *t, int typedefp, int preservep)
     705{
     706    char *newbasename = NULL;
     707
    552708    switch (t->type) {
    553709    case TType:
     
    600756            fprintf (headerfile, "heim_bit_string %s;\n", name);
    601757        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);
    603762            ASN1_TAILQ_FOREACH(m, t->members, members) {
    604                 char *n;
     763                char *n = NULL;
    605764       
    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)
    608776                    errx(1, "malloc");
    609                 define_type (level + 1, n, &i, FALSE, FALSE);
     777                define_type (level + 1, n, newbasename, &i, FALSE, FALSE);
    610778                free (n);
     779                n = NULL;
     780                pos++;
    611781            }
     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
    612792            space(level);
    613793            fprintf (headerfile, "} %s;\n\n", name);
     
    636816        Member *m;
    637817
    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);
    640822        if (t->type == TSequence && preservep) {
    641823            space(level + 1);
     
    646828                ;
    647829            } 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)
    652833                    errx(1, "malloc");
    653                 define_type (level + 1, n, m->type, FALSE, FALSE);
     834                define_type (level + 1, n, newbasename, m->type, FALSE, FALSE);
    654835                free (n);
    655836            } 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);
    657838        }
    658839        space(level);
     
    665846        struct range range = { 0, INT_MAX };
    666847
     848        getnewbasename(&newbasename, typedefp, basename, name);
     849
    667850        i.type = TInteger;
    668851        i.range = &range;
     
    671854
    672855        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);
    676859        space(level);
    677860        fprintf (headerfile, "} %s;\n", name);
     
    686869        fprintf (headerfile, "heim_general_string %s;\n", name);
    687870        break;
     871    case TTeletexString:
     872        space(level);
     873        fprintf (headerfile, "heim_general_string %s;\n", name);
     874        break;
    688875    case TTag:
    689         define_type (level, name, t->subtype, typedefp, preservep);
     876        define_type (level, name, basename, t->subtype, typedefp, preservep);
    690877        break;
    691878    case TChoice: {
     
    693880        Member *m;
    694881
    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);
    697886        if (preservep) {
    698887            space(level + 1);
     
    726915                fprintf(headerfile, "heim_octet_string asn1_ellipsis;\n");
    727916            } 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)
    732920                    errx(1, "malloc");
    733                 define_type (level + 2, n, m->type, FALSE, FALSE);
     921                define_type (level + 2, n, newbasename, m->type, FALSE, FALSE);
    734922                free (n);
    735923            } 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);
    737925        }
    738926        space(level + 1);
     
    781969        abort ();
    782970    }
     971    if (newbasename)
     972        free(newbasename);
    783973}
    784974
     
    794984
    795985    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);
    797987
    798988    fprintf (headerfile, "\n");
    799989}
    800 
    801990
    802991void
    803992generate_type (const Symbol *s)
    804993{
     994    FILE *h;
     995    const char * exp;
     996
    805997    if (!one_code_file)
    806998        generate_header_of_codefile(s->gen_name);
    807999
    8081000    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    }
    8141012    generate_type_seq (s);
    8151013    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");
    8171049
    8181050    if (!one_code_file) {
Note: See TracChangeset for help on using the changeset viewer.