Annotation of src/usr.bin/asn1_compile/gen_free.c, Revision 1.1
1.1 ! hin 1: /*
! 2: * Copyright (c) 1997 - 2000 Kungliga Tekniska Högskolan
! 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: /*
! 37: RCSID("$KTH: gen_free.c,v 1.9 2001/09/25 13:39:26 assar Exp $");
! 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:
! 58: case TEnumerated :
! 59: break;
! 60: case TOctetString:
! 61: free_primitive ("octet_string", name);
! 62: break;
! 63: case TOID :
! 64: free_primitive ("oid", name);
! 65: break;
! 66: case TBitString: {
! 67: break;
! 68: }
! 69: case TSequence: {
! 70: Member *m;
! 71: int tag = -1;
! 72:
! 73: if (t->members == NULL)
! 74: break;
! 75:
! 76: for (m = t->members; m && tag != m->val; m = m->next) {
! 77: char *s;
! 78:
! 79: asprintf (&s, "%s(%s)->%s",
! 80: m->optional ? "" : "&", name, m->gen_name);
! 81: if(m->optional)
! 82: fprintf(codefile, "if(%s) {\n", s);
! 83: free_type (s, m->type);
! 84: if(m->optional)
! 85: fprintf(codefile,
! 86: "free(%s);\n"
! 87: "}\n",s);
! 88: if (tag == -1)
! 89: tag = m->val;
! 90: free (s);
! 91: }
! 92: break;
! 93: }
! 94: case TSequenceOf: {
! 95: char *n;
! 96:
! 97: fprintf (codefile, "while((%s)->len){\n", name);
! 98: asprintf (&n, "&(%s)->val[(%s)->len-1]", name, name);
! 99: free_type(n, t->subtype);
! 100: fprintf(codefile,
! 101: "(%s)->len--;\n"
! 102: "}\n",
! 103: name);
! 104: fprintf(codefile,
! 105: "free((%s)->val);\n", name);
! 106: free(n);
! 107: break;
! 108: }
! 109: case TGeneralizedTime:
! 110: break;
! 111: case TGeneralString:
! 112: free_primitive ("general_string", name);
! 113: break;
! 114: case TApplication:
! 115: free_type (name, t->subtype);
! 116: break;
! 117: default :
! 118: abort ();
! 119: }
! 120: }
! 121:
! 122: void
! 123: generate_type_free (const Symbol *s)
! 124: {
! 125: fprintf (headerfile,
! 126: "void free_%s (%s *);\n",
! 127: s->gen_name, s->gen_name);
! 128:
! 129: fprintf (codefile, "void\n"
! 130: "free_%s(%s *data)\n"
! 131: "{\n",
! 132: s->gen_name, s->gen_name);
! 133:
! 134: free_type ("data", s->type);
! 135: fprintf (codefile, "}\n\n");
! 136: }
! 137: