asn1: Minor compiler performance improvment
This commit is contained in:
		@@ -37,20 +37,6 @@
 | 
			
		||||
 * Currently we generate C source code defining constant arrays of structures
 | 
			
		||||
 * containing a sort of a "byte-coded" template of an ASN.1 compiler to be
 | 
			
		||||
 * interpreted at run-time.
 | 
			
		||||
 *
 | 
			
		||||
 * FIXME: Also generate binary representations of these arrays and structs
 | 
			
		||||
 *        directly so that we can implement value notation where a value
 | 
			
		||||
 *        assignment in a module will get "compiled" by first compiling the
 | 
			
		||||
 *        type into such a binary representation in memory, _then_ interpreting
 | 
			
		||||
 *        it to produce a BER/DER encoding of the value on the fly, then we can
 | 
			
		||||
 *        store the encoded value in the module's compiled form.
 | 
			
		||||
 *
 | 
			
		||||
 * FIXME MORE: Also, make all this compiler into a library so that we can have
 | 
			
		||||
 *             programs like hxtool(1) take a module and an ASN.1 value
 | 
			
		||||
 *             representation and have that encoded into BER/DER directly.
 | 
			
		||||
 *             This would allow hxtool(1) to support arbitrary PKIX certificate
 | 
			
		||||
 *             and CSR and ... extensions on the fly without having to change
 | 
			
		||||
 *             any source code.  (Like OpenSSL, but without sucking.)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "gen_locl.h"
 | 
			
		||||
@@ -145,7 +131,7 @@ ia5string_symbol(const char *basename, const Type *t)
 | 
			
		||||
static const char *
 | 
			
		||||
teletexstring_symbol(const char *basename, const Type *t)
 | 
			
		||||
{
 | 
			
		||||
    return "heim_teletex_string";
 | 
			
		||||
    return "heim_general_string";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const char *
 | 
			
		||||
@@ -188,35 +174,36 @@ bitstring_symbol(const char *basename, const Type *t)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* XXX Make sure this is sorted by `type' and can just index this by type */
 | 
			
		||||
/* Keep this sorted by `type' so we can just index this by type */
 | 
			
		||||
const struct {
 | 
			
		||||
    enum typetype type;
 | 
			
		||||
    const char *(*symbol_name)(const char *, const Type *);
 | 
			
		||||
    int is_struct;
 | 
			
		||||
} types[] =  {
 | 
			
		||||
    { TBMPString, bmpstring_symbol, 0 },
 | 
			
		||||
    { TBitString, bitstring_symbol, 0 },
 | 
			
		||||
    { TBoolean, boolean_symbol, 0 },
 | 
			
		||||
    { TChoice, sequence_symbol, 1 },
 | 
			
		||||
    { TEnumerated, integer_symbol, 0 },
 | 
			
		||||
    { TGeneralString, generalstring_symbol, 0 },
 | 
			
		||||
    { TTeletexString, teletexstring_symbol, 0 },
 | 
			
		||||
    { TGeneralizedTime, time_symbol, 0 },
 | 
			
		||||
    { TIA5String, ia5string_symbol, 0 },
 | 
			
		||||
    { TTeletexString, generalstring_symbol, 0 },
 | 
			
		||||
    { TInteger, integer_symbol, 0 },
 | 
			
		||||
    { TNull, integer_symbol, 1 },
 | 
			
		||||
    { TOID, oid_symbol, 0 },
 | 
			
		||||
    { TOctetString, octetstring_symbol, 0 },
 | 
			
		||||
    { TPrintableString, printablestring_symbol, 0 },
 | 
			
		||||
    { TSequence, sequence_symbol, 1 },
 | 
			
		||||
    { TSequenceOf, tag_symbol, 1 },
 | 
			
		||||
    { TSet, sequence_symbol, 1 },
 | 
			
		||||
    { TSetOf, tag_symbol, 1 },
 | 
			
		||||
    { TTag, tag_symbol, 1 },
 | 
			
		||||
    { TType, ttype_symbol, 1 },
 | 
			
		||||
    { TUTCTime, time_symbol, 0 },
 | 
			
		||||
    { TUniversalString, universalstring_symbol, 0 },
 | 
			
		||||
    { TTeletexString, teletexstring_symbol, 0 },
 | 
			
		||||
    { TVisibleString,  visiblestring_symbol, 0 },
 | 
			
		||||
    { TUTF8String, utf8string_symbol, 0 },
 | 
			
		||||
    { TChoice, sequence_symbol, 1 },
 | 
			
		||||
    { TNull, integer_symbol, 1 }
 | 
			
		||||
    { TBMPString, bmpstring_symbol, 0 },
 | 
			
		||||
    { TUniversalString, universalstring_symbol, 0 },
 | 
			
		||||
    { TVisibleString, visiblestring_symbol, 0 },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static FILE *
 | 
			
		||||
@@ -231,12 +218,8 @@ get_code_file(void)
 | 
			
		||||
static int
 | 
			
		||||
is_supported_type_p(const Type *t)
 | 
			
		||||
{
 | 
			
		||||
    size_t i;
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < sizeof(types)/sizeof(types[0]); i++)
 | 
			
		||||
	if (t->type == types[i].type)
 | 
			
		||||
	    return 1;
 | 
			
		||||
    return 0;
 | 
			
		||||
    return t->type >= 0 && t->type <= TVisibleString &&
 | 
			
		||||
        types[t->type].type == t->type;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
@@ -248,13 +231,13 @@ is_template_compat (const Symbol *s)
 | 
			
		||||
static const char *
 | 
			
		||||
symbol_name(const char *basename, const Type *t)
 | 
			
		||||
{
 | 
			
		||||
    size_t i;
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < sizeof(types)/sizeof(types[0]); i++)
 | 
			
		||||
	if (t->type == types[i].type)
 | 
			
		||||
	    return (types[i].symbol_name)(basename, t);
 | 
			
		||||
    printf("unknown der type: %d\n", t->type);
 | 
			
		||||
    exit(1);
 | 
			
		||||
    if (t->type >= 0 && t->type <= TVisibleString &&
 | 
			
		||||
        types[t->type].type == t->type)
 | 
			
		||||
        return (types[t->type].symbol_name)(basename, t);
 | 
			
		||||
    if (t->type >= 0 && t->type <= TVisibleString)
 | 
			
		||||
        errx(1, "types[] is not sorted");
 | 
			
		||||
    errx(1, "unknown der type: %d\n", t->type);
 | 
			
		||||
    return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -529,8 +512,6 @@ use_extern(const Symbol *s)
 | 
			
		||||
static int
 | 
			
		||||
is_struct(const Type *t, int isstruct)
 | 
			
		||||
{
 | 
			
		||||
    size_t i;
 | 
			
		||||
 | 
			
		||||
    if (t->type == TType)
 | 
			
		||||
	return 0;
 | 
			
		||||
    if (t->type == TSequence || t->type == TSet || t->type == TChoice)
 | 
			
		||||
@@ -538,15 +519,15 @@ is_struct(const Type *t, int isstruct)
 | 
			
		||||
    if (t->type == TTag)
 | 
			
		||||
	return is_struct(t->subtype, isstruct);
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < sizeof(types)/sizeof(types[0]); i++) {
 | 
			
		||||
	if (t->type == types[i].type) {
 | 
			
		||||
	    if (types[i].is_struct == 0)
 | 
			
		||||
		return 0;
 | 
			
		||||
	    else
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
    if (t->type >= 0 && t->type <= TVisibleString &&
 | 
			
		||||
        types[t->type].type == t->type) {
 | 
			
		||||
        if (types[t->type].is_struct == 0)
 | 
			
		||||
            return 0;
 | 
			
		||||
        return isstruct;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (t->type >= 0 && t->type <= TVisibleString)
 | 
			
		||||
        errx(1, "types[] is not sorted");
 | 
			
		||||
    errx(1, "unknown der type: %d\n", t->type);
 | 
			
		||||
    return isstruct;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user