root/source4/heimdal/lib/asn1/gen_free.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. free_primitive
  2. free_type
  3. generate_type_free

   1 /*
   2  * Copyright (c) 1997 - 2005 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 RCSID("$Id$");
  37 
  38 static void
  39 free_primitive (const char *typename, const char *name)
     /* [<][>][^][v][top][bottom][index][help] */
  40 {
  41     fprintf (codefile, "der_free_%s(%s);\n", typename, name);
  42 }
  43 
  44 static void
  45 free_type (const char *name, const Type *t, int preserve)
     /* [<][>][^][v][top][bottom][index][help] */
  46 {
  47     switch (t->type) {
  48     case TType:
  49 #if 0
  50         free_type (name, t->symbol->type, preserve);
  51 #endif
  52         fprintf (codefile, "free_%s(%s);\n", t->symbol->gen_name, name);
  53         break;
  54     case TInteger:
  55         if (t->range == NULL && t->members == NULL) {
  56             free_primitive ("heim_integer", name);
  57             break;
  58         }
  59     case TBoolean:
  60     case TEnumerated :
  61     case TNull:
  62     case TGeneralizedTime:
  63     case TUTCTime:
  64         break;
  65     case TBitString:
  66         if (ASN1_TAILQ_EMPTY(t->members))
  67             free_primitive("bit_string", name);
  68         break;
  69     case TOctetString:
  70         free_primitive ("octet_string", name);
  71         break;
  72     case TChoice:
  73     case TSet:
  74     case TSequence: {
  75         Member *m, *have_ellipsis = NULL;
  76 
  77         if (t->members == NULL)
  78             break;
  79 
  80         if ((t->type == TSequence || t->type == TChoice) && preserve)
  81             fprintf(codefile, "der_free_octet_string(&data->_save);\n");
  82 
  83         if(t->type == TChoice)
  84             fprintf(codefile, "switch((%s)->element) {\n", name);
  85 
  86         ASN1_TAILQ_FOREACH(m, t->members, members) {
  87             char *s;
  88 
  89             if (m->ellipsis){
  90                 have_ellipsis = m;
  91                 continue;
  92             }
  93 
  94             if(t->type == TChoice)
  95                 fprintf(codefile, "case %s:\n", m->label);
  96             asprintf (&s, "%s(%s)->%s%s",
  97                       m->optional ? "" : "&", name,
  98                       t->type == TChoice ? "u." : "", m->gen_name);
  99             if (s == NULL)
 100                 errx(1, "malloc");
 101             if(m->optional)
 102                 fprintf(codefile, "if(%s) {\n", s);
 103             free_type (s, m->type, FALSE);
 104             if(m->optional)
 105                 fprintf(codefile,
 106                         "free(%s);\n"
 107                         "%s = NULL;\n"
 108                         "}\n",s, s);
 109             free (s);
 110             if(t->type == TChoice)
 111                 fprintf(codefile, "break;\n");
 112         }
 113         
 114         if(t->type == TChoice) {
 115             if (have_ellipsis)
 116                 fprintf(codefile,
 117                         "case %s:\n"
 118                         "der_free_octet_string(&(%s)->u.%s);\n"
 119                         "break;",
 120                         have_ellipsis->label,
 121                         name, have_ellipsis->gen_name);
 122             fprintf(codefile, "}\n");
 123         }
 124         break;
 125     }
 126     case TSetOf:
 127     case TSequenceOf: {
 128         char *n;
 129 
 130         fprintf (codefile, "while((%s)->len){\n", name);
 131         asprintf (&n, "&(%s)->val[(%s)->len-1]", name, name);
 132         if (n == NULL)
 133             errx(1, "malloc");
 134         free_type(n, t->subtype, FALSE);
 135         fprintf(codefile,
 136                 "(%s)->len--;\n"
 137                 "}\n",
 138                 name);
 139         fprintf(codefile,
 140                 "free((%s)->val);\n"
 141                 "(%s)->val = NULL;\n", name, name);
 142         free(n);
 143         break;
 144     }
 145     case TGeneralString:
 146         free_primitive ("general_string", name);
 147         break;
 148     case TUTF8String:
 149         free_primitive ("utf8string", name);
 150         break;
 151     case TPrintableString:
 152         free_primitive ("printable_string", name);
 153         break;
 154     case TIA5String:
 155         free_primitive ("ia5_string", name);
 156         break;
 157     case TBMPString:
 158         free_primitive ("bmp_string", name);
 159         break;
 160     case TUniversalString:
 161         free_primitive ("universal_string", name);
 162         break;
 163     case TVisibleString:
 164         free_primitive ("visible_string", name);
 165         break;
 166     case TTag:
 167         free_type (name, t->subtype, preserve);
 168         break;
 169     case TOID :
 170         free_primitive ("oid", name);
 171         break;
 172     default :
 173         abort ();
 174     }
 175 }
 176 
 177 void
 178 generate_type_free (const Symbol *s)
     /* [<][>][^][v][top][bottom][index][help] */
 179 {
 180   int preserve = preserve_type(s->name) ? TRUE : FALSE;
 181 
 182   fprintf (headerfile,
 183            "void   free_%s  (%s *);\n",
 184            s->gen_name, s->gen_name);
 185 
 186   fprintf (codefile, "void\n"
 187            "free_%s(%s *data)\n"
 188            "{\n",
 189            s->gen_name, s->gen_name);
 190 
 191   free_type ("data", s->type, preserve);
 192   fprintf (codefile, "}\n\n");
 193 }
 194 

/* [<][>][^][v][top][bottom][index][help] */