3
3
* (Royal Institute of Technology, Stockholm, Sweden).
4
4
* All rights reserved.
6
* Portions Copyright (c) 2009 Apple Inc. All rights reserved.
6
8
* Redistribution and use in source and binary forms, with or without
7
9
* modification, are permitted provided that the following conditions
38
FILE *headerfile, *codefile, *logfile;
40
FILE *privheaderfile, *headerfile, *codefile, *logfile, *templatefile;
40
42
#define STEM "asn1"
42
44
static const char *orig_filename;
45
static char *privheader, *header, *template;
44
46
static const char *headerbase = STEM;
66
68
fprintf (headerfile, "#include <%s_asn1.h>\n", module);
72
* List of all exported symbols
81
static struct sexport *exports = NULL;
84
add_export (const char *name)
86
struct sexport *tmp = emalloc (sizeof(*tmp));
94
is_export(const char *name)
98
if (exports == NULL) /* no export list, all exported */
101
for (tmp = exports; tmp != NULL; tmp = tmp->next) {
102
if (strcmp(tmp->name, name) == 0) {
70
111
get_filename (void)
87
128
/* public header file */
88
asprintf(&header, "%s.h", headerbase);
129
if (asprintf(&header, "%s.h", headerbase) < 0 || header == NULL)
90
130
errx(1, "malloc");
91
asprintf(&fn, "%s.hx", headerbase);
131
if (asprintf(&fn, "%s.hx", headerbase) < 0 || fn == NULL)
93
132
errx(1, "malloc");
94
133
headerfile = fopen (fn, "w");
95
134
if (headerfile == NULL)
96
135
err (1, "open %s", fn);
139
/* private header file */
140
if (asprintf(&privheader, "%s-priv.h", headerbase) < 0 || privheader == NULL)
142
if (asprintf(&fn, "%s-priv.hx", headerbase) < 0 || fn == NULL)
144
privheaderfile = fopen (fn, "w");
145
if (privheaderfile == NULL)
146
err (1, "open %s", fn);
151
if (asprintf(&template, "%s-template.c", headerbase) < 0 || template == NULL)
99
153
fprintf (headerfile,
100
154
"/* Generated from %s */\n"
101
155
"/* Do not edit */\n\n",
127
181
"typedef char *heim_utf8_string;\n\n"
129
183
fprintf (headerfile,
130
"typedef char *heim_printable_string;\n\n"
184
"typedef struct heim_octet_string heim_printable_string;\n\n"
132
186
fprintf (headerfile,
133
"typedef char *heim_ia5_string;\n\n"
187
"typedef struct heim_octet_string heim_ia5_string;\n\n"
135
189
fprintf (headerfile,
136
190
"typedef struct heim_bmp_string {\n"
175
229
" } while (0)\n\n",
231
fputs("#ifdef _WIN32\n"
233
"#define ASN1EXP __declspec(dllimport)\n"
237
"#define ASN1CALL __stdcall\n"
177
243
fprintf (headerfile, "struct units;\n\n");
178
244
fprintf (headerfile, "#endif\n\n");
179
asprintf(&fn, "%s_files", base);
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);
251
/* if one code file, write into the one codefile */
255
templatefile = fopen (template, "w");
256
if (templatefile == NULL)
257
err (1, "open %s", template);
259
fprintf (templatefile,
260
"/* Generated from %s */\n"
261
"/* Do not edit */\n\n"
262
"#include <stdio.h>\n"
263
"#include <stdlib.h>\n"
264
"#include <time.h>\n"
265
"#include <string.h>\n"
266
"#include <errno.h>\n"
267
"#include <limits.h>\n"
268
"#include <krb5-types.h>\n",
271
fprintf (templatefile,
275
"#include <der-private.h>\n"
276
"#include <asn1-template.h>\n",
240
341
generate_header_of_codefile(const char *name)
343
char *filename = NULL;
244
345
if (codefile != NULL)
247
asprintf (&filename, "%s_%s.x", STEM, name);
248
if (filename == NULL)
348
if (asprintf (&filename, "%s_%s.x", STEM, name) < 0 || filename == NULL)
249
349
errx(1, "malloc");
250
350
codefile = fopen (filename, "w");
251
351
if (codefile == NULL)
252
352
err (1, "fopen %s", filename);
253
353
fprintf(logfile, "%s ", filename);
255
356
fprintf (codefile,
256
357
"/* Generated from %s */\n"
257
358
"/* Do not edit */\n\n"
359
"#define ASN1_LIB\n\n"
258
360
"#include <stdio.h>\n"
259
361
"#include <stdlib.h>\n"
260
362
"#include <time.h>\n"
327
433
o->label ? o->label : "label-less", o->value);
330
fprintf (headerfile, "} */\n");
331
fprintf (headerfile, "const heim_oid *oid_%s(void);\n",
334
"extern const heim_oid asn1_oid_%s;\n\n",
338
436
fprintf (codefile, "static unsigned oid_%s_variable_num[%d] = {",
339
437
s->gen_name, len);
340
438
for (i = len ; i > 0; i--) {
346
444
"{ %d, oid_%s_variable_num };\n\n",
347
445
s->gen_name, len, s->gen_name);
349
fprintf (codefile, "const heim_oid *oid_%s(void)\n"
351
"return &asn1_oid_%s;\n"
353
s->gen_name, s->gen_name);
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]);
456
fprintf (headerfile, "} */\n");
458
"extern ASN1EXP const heim_oid asn1_oid_%s;\n"
459
"#define ASN1_OID_%s (&asn1_oid_%s)\n\n",
357
466
if (!one_code_file)
358
467
close_codefile();
494
630
case TGeneralString:
495
631
fprintf (headerfile, "GeneralString");
634
fprintf (headerfile, "TeletexString");
498
637
const char *classnames[] = { "UNIVERSAL ", "APPLICATION ",
499
638
"" /* CONTEXT */, "PRIVATE " };
550
define_type (int level, const char *name, Type *t, int typedefp, int preservep)
689
getnewbasename(char **newbasename, int typedefp, const char *basename, const char *name)
692
*newbasename = strdup(name);
696
if (asprintf(newbasename, "%s_%s", basename, name) < 0)
699
if (*newbasename == NULL)
704
define_type (int level, const char *name, const char *basename, Type *t, int typedefp, int preservep)
706
char *newbasename = NULL;
552
708
switch (t->type) {
599
755
if(ASN1_TAILQ_EMPTY(t->members))
600
756
fprintf (headerfile, "heim_bit_string %s;\n", name);
602
fprintf (headerfile, "struct %s {\n", typedefp ? name : "");
759
getnewbasename(&newbasename, typedefp, basename, name);
761
fprintf (headerfile, "struct %s {\n", newbasename);
603
762
ASN1_TAILQ_FOREACH(m, t->members, members) {
606
asprintf (&n, "%s:1", m->gen_name);
766
while (pos < m->val) {
767
if (asprintf (&n, "_unused%d:1", pos) < 0 || n == NULL)
769
define_type (level + 1, n, newbasename, &i, FALSE, FALSE);
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);
782
/* pad to 32 elements */
785
if (asprintf (&n, "_unused%d:1", pos) < 0 || n == NULL)
787
define_type (level + 1, n, newbasename, &i, FALSE, FALSE);
613
793
fprintf (headerfile, "} %s;\n\n", name);
635
815
case TSequence: {
818
getnewbasename(&newbasename, typedefp, basename, name);
639
fprintf (headerfile, "struct %s {\n", typedefp ? name : "");
821
fprintf (headerfile, "struct %s {\n", newbasename);
640
822
if (t->type == TSequence && preservep) {
641
823
space(level + 1);
642
824
fprintf(headerfile, "heim_octet_string _save;\n");
645
827
if (m->ellipsis) {
647
829
} else if (m->optional) {
650
asprintf (&n, "*%s", m->gen_name);
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);
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);
659
840
fprintf (headerfile, "} %s;\n", name);
665
846
struct range range = { 0, INT_MAX };
848
getnewbasename(&newbasename, typedefp, basename, name);
667
850
i.type = TInteger;
668
851
i.range = ⦥
669
852
i.members = NULL;
670
853
i.constraint = NULL;
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);
677
860
fprintf (headerfile, "} %s;\n", name);
686
869
fprintf (headerfile, "heim_general_string %s;\n", name);
873
fprintf (headerfile, "heim_general_string %s;\n", name);
689
define_type (level, name, t->subtype, typedefp, preservep);
876
define_type (level, name, basename, t->subtype, typedefp, preservep);
882
getnewbasename(&newbasename, typedefp, basename, name);
696
fprintf (headerfile, "struct %s {\n", typedefp ? name : "");
885
fprintf (headerfile, "struct %s {\n", newbasename);
698
887
space(level + 1);
699
888
fprintf(headerfile, "heim_octet_string _save;\n");
725
914
space(level + 2);
726
915
fprintf(headerfile, "heim_octet_string asn1_ellipsis;\n");
727
916
} else if (m->optional) {
730
asprintf (&n, "*%s", m->gen_name);
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);
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);
738
926
space(level + 1);
739
927
fprintf (headerfile, "} u;\n");
793
983
fprintf (headerfile, "\n*/\n\n");
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);
798
988
fprintf (headerfile, "\n");
803
992
generate_type (const Symbol *s)
805
997
if (!one_code_file)
806
998
generate_header_of_codefile(s->gen_name);
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);
1003
generate_template(s);
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);
814
1012
generate_type_seq (s);
815
1013
generate_glue (s->type, s->gen_name);
816
fprintf(headerfile, "\n\n");
1015
/* generate prototypes */
1017
if (is_export(s->name)) {
1027
"decode_%s(const unsigned char *, size_t, %s *, size_t *);\n",
1029
s->gen_name, s->gen_name);
1032
"encode_%s(unsigned char *, size_t, const %s *, size_t *);\n",
1034
s->gen_name, s->gen_name);
1036
"%ssize_t ASN1CALL length_%s(const %s *);\n",
1038
s->gen_name, s->gen_name);
1040
"%sint ASN1CALL copy_%s (const %s *, %s *);\n",
1042
s->gen_name, s->gen_name, s->gen_name);
1044
"%svoid ASN1CALL free_%s (%s *);\n",
1046
s->gen_name, s->gen_name);
818
1050
if (!one_code_file) {
819
1051
fprintf(codefile, "\n\n");