version 1.3, 2005/05/11 19:45:50 |
version 1.4, 2005/10/16 18:56:35 |
|
|
#include "gen_locl.h" |
#include "gen_locl.h" |
|
|
/* |
/* |
RCSID("$KTH: gen.c,v 1.50 2003/04/17 07:09:18 lha Exp $"); |
RCSID("$KTH: gen.c,v 1.58 2005/03/31 00:08:58 lha Exp $"); |
*/ |
*/ |
|
|
FILE *headerfile, *codefile, *logfile; |
FILE *headerfile, *codefile, *logfile; |
|
|
|
|
static const char *orig_filename; |
static const char *orig_filename; |
static char *header; |
static char *header; |
static char *headerbase = STEM; |
static char *headerbase; |
|
|
/* |
/* |
* list of all IMPORTs |
* list of all IMPORTs |
|
|
init_generate (const char *filename, const char *base) |
init_generate (const char *filename, const char *base) |
{ |
{ |
orig_filename = filename; |
orig_filename = filename; |
if(base) |
if(base){ |
if((headerbase = strdup(base)) == NULL) |
if((headerbase = strdup(base)) == NULL) |
err(1, NULL); |
err(1, NULL); |
|
}else{ |
|
if((headerbase = strdup(STEM)) == NULL) |
|
err(1, NULL); |
|
} |
asprintf(&header, "%s.h", headerbase); |
asprintf(&header, "%s.h", headerbase); |
if(header == NULL) |
if(header == NULL) |
err(1, NULL); |
err(1, NULL); |
|
|
headerfile = fopen (header, "w"); |
headerfile = fopen (header, "w"); |
if (headerfile == NULL) |
if (headerfile == NULL) |
err (1, "open %s", header); |
err (1, "open %s", header); |
|
|
"#ifndef __asn1_common_definitions__\n" |
"#ifndef __asn1_common_definitions__\n" |
"#define __asn1_common_definitions__\n\n"); |
"#define __asn1_common_definitions__\n\n"); |
fprintf (headerfile, |
fprintf (headerfile, |
"typedef struct octet_string {\n" |
"typedef struct heim_octet_string {\n" |
" size_t length;\n" |
" size_t length;\n" |
" void *data;\n" |
" void *data;\n" |
"} octet_string;\n\n"); |
"} heim_octet_string;\n\n"); |
fprintf (headerfile, |
fprintf (headerfile, |
"typedef char *general_string;\n\n" |
"typedef char *heim_general_string;\n\n" |
); |
); |
fprintf (headerfile, |
fprintf (headerfile, |
"typedef struct oid {\n" |
"typedef char *heim_utf8_string;\n\n" |
|
); |
|
fprintf (headerfile, |
|
"typedef struct heim_oid {\n" |
" size_t length;\n" |
" size_t length;\n" |
" unsigned *components;\n" |
" unsigned *components;\n" |
"} oid;\n\n"); |
"} heim_oid;\n\n"); |
fputs("#define ASN1_MALLOC_ENCODE(T, B, BL, S, L, R) \\\n" |
fputs("#define ASN1_MALLOC_ENCODE(T, B, BL, S, L, R) \\\n" |
" do { \\\n" |
" do { \\\n" |
" (BL) = length_##T((S)); \\\n" |
" (BL) = length_##T((S)); \\\n" |
|
|
fprintf (headerfile, "[APPLICATION %d] ", t->application); |
fprintf (headerfile, "[APPLICATION %d] ", t->application); |
define_asn1 (level, t->subtype); |
define_asn1 (level, t->subtype); |
break; |
break; |
|
case TBoolean: |
|
space(level); |
|
fprintf (headerfile, "BOOLEAN"); |
|
break; |
|
case TUTF8String: |
|
space(level); |
|
fprintf (headerfile, "UTF8String"); |
|
break; |
|
case TNull: |
|
space(level); |
|
fprintf (headerfile, "NULL"); |
|
break; |
default: |
default: |
abort (); |
abort (); |
} |
} |
} |
} |
|
|
static void |
static void |
define_type (int level, char *name, Type *t, int typedefp) |
define_type (int level, const char *name, Type *t, int typedefp) |
{ |
{ |
switch (t->type) { |
switch (t->type) { |
case TType: |
case TType: |
|
|
break; |
break; |
case TOctetString: |
case TOctetString: |
space(level); |
space(level); |
fprintf (headerfile, "octet_string %s;\n", name); |
fprintf (headerfile, "heim_octet_string %s;\n", name); |
break; |
break; |
case TOID : |
case TOID : |
space(level); |
space(level); |
fprintf (headerfile, "oid %s;\n", name); |
fprintf (headerfile, "heim_oid %s;\n", name); |
break; |
break; |
case TBitString: { |
case TBitString: { |
Member *m; |
Member *m; |
|
|
break; |
break; |
case TGeneralString: |
case TGeneralString: |
space(level); |
space(level); |
fprintf (headerfile, "general_string %s;\n", name); |
fprintf (headerfile, "heim_general_string %s;\n", name); |
break; |
break; |
|
case TUTF8String: |
|
space(level); |
|
fprintf (headerfile, "heim_utf8_string %s;\n", name); |
|
break; |
|
case TBoolean: |
|
space(level); |
|
fprintf (headerfile, "int %s;\n", name); |
|
break; |
|
case TNull: |
|
space(level); |
|
fprintf (headerfile, "NULL %s;\n", name); |
|
break; |
case TApplication: |
case TApplication: |
define_type (level, name, t->subtype, FALSE); |
define_type (level, name, t->subtype, FALSE); |
break; |
break; |
|
|
"#include <asn1_err.h>\n" |
"#include <asn1_err.h>\n" |
"#include <der.h>\n" |
"#include <der.h>\n" |
"#include <parse_units.h>\n\n"); |
"#include <parse_units.h>\n\n"); |
generate_type_header (s); |
|
generate_type_encode (s); |
if (s->stype == Stype && s->type->type == TChoice) { |
generate_type_decode (s); |
fprintf(codefile, |
generate_type_free (s); |
"/* CHOICE */\n" |
generate_type_length (s); |
"int asn1_%s_dummy_holder = 1;\n", s->gen_name); |
generate_type_copy (s); |
} else { |
generate_glue (s); |
generate_type_header (s); |
|
generate_type_encode (s); |
|
generate_type_decode (s); |
|
generate_type_free (s); |
|
generate_type_length (s); |
|
generate_type_copy (s); |
|
generate_glue (s); |
|
} |
fprintf(headerfile, "\n\n"); |
fprintf(headerfile, "\n\n"); |
fclose(codefile); |
fclose(codefile); |
} |
} |