Annotation of src/usr.bin/asn1_compile/gen_free.c, Revision 1.2
1.1 hin 1: /*
1.2 ! biorn 2: * Copyright (c) 1997 - 2003 Kungliga Tekniska Högskolan
1.1 hin 3: * (Royal Institute of Technology, Stockholm, Sweden).
4: * All rights reserved.
5: *
6: * Redistribution and use in source and binary forms, with or without
7: * modification, are permitted provided that the following conditions
8: * are met:
9: *
10: * 1. Redistributions of source code must retain the above copyright
11: * notice, this list of conditions and the following disclaimer.
12: *
13: * 2. Redistributions in binary form must reproduce the above copyright
14: * notice, this list of conditions and the following disclaimer in the
15: * documentation and/or other materials provided with the distribution.
16: *
17: * 3. Neither the name of the Institute nor the names of its contributors
18: * may be used to endorse or promote products derived from this software
19: * without specific prior written permission.
20: *
21: * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24: * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31: * SUCH DAMAGE.
32: */
33:
34: #include "gen_locl.h"
35:
36: /*
1.2 ! biorn 37: RCSID("$KTH: gen_free.c,v 1.12 2003/10/03 00:28:08 lha Exp $");
1.1 hin 38: */
39:
40: static void
41: free_primitive (const char *typename, const char *name)
42: {
43: fprintf (codefile, "free_%s(%s);\n", typename, name);
44: }
45:
46: static void
47: free_type (const char *name, const Type *t)
48: {
49: switch (t->type) {
50: case TType:
51: #if 0
52: free_type (name, t->symbol->type);
53: #endif
54: fprintf (codefile, "free_%s(%s);\n", t->symbol->gen_name, name);
55: break;
56: case TInteger:
57: case TUInteger:
1.2 ! biorn 58: case TBoolean:
1.1 hin 59: case TEnumerated :
60: break;
61: case TOctetString:
62: free_primitive ("octet_string", name);
63: break;
64: case TOID :
65: free_primitive ("oid", name);
66: break;
67: case TBitString: {
68: break;
69: }
70: case TSequence: {
71: Member *m;
72: int tag = -1;
73:
74: if (t->members == NULL)
75: break;
76:
77: for (m = t->members; m && tag != m->val; m = m->next) {
78: char *s;
79:
80: asprintf (&s, "%s(%s)->%s",
81: m->optional ? "" : "&", name, m->gen_name);
82: if(m->optional)
83: fprintf(codefile, "if(%s) {\n", s);
84: free_type (s, m->type);
85: if(m->optional)
86: fprintf(codefile,
87: "free(%s);\n"
1.2 ! biorn 88: "%s = NULL;\n"
! 89: "}\n", s, s);
1.1 hin 90: if (tag == -1)
91: tag = m->val;
92: free (s);
93: }
94: break;
95: }
96: case TSequenceOf: {
97: char *n;
98:
99: fprintf (codefile, "while((%s)->len){\n", name);
100: asprintf (&n, "&(%s)->val[(%s)->len-1]", name, name);
101: free_type(n, t->subtype);
102: fprintf(codefile,
103: "(%s)->len--;\n"
104: "}\n",
105: name);
106: fprintf(codefile,
1.2 ! biorn 107: "free((%s)->val);\n"
! 108: "(%s)->val = NULL;\n", name, name);
1.1 hin 109: free(n);
110: break;
111: }
112: case TGeneralizedTime:
113: break;
114: case TGeneralString:
115: free_primitive ("general_string", name);
1.2 ! biorn 116: break;
! 117: case TUTF8String:
! 118: free_primitive ("utf8string", name);
! 119: break;
! 120: case TNull:
1.1 hin 121: break;
122: case TApplication:
123: free_type (name, t->subtype);
124: break;
125: default :
126: abort ();
127: }
128: }
129:
130: void
131: generate_type_free (const Symbol *s)
132: {
133: fprintf (headerfile,
134: "void free_%s (%s *);\n",
135: s->gen_name, s->gen_name);
136:
137: fprintf (codefile, "void\n"
138: "free_%s(%s *data)\n"
139: "{\n",
140: s->gen_name, s->gen_name);
141:
142: free_type ("data", s->type);
143: fprintf (codefile, "}\n\n");
144: }
145: