Generate free functions.
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@1380 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
		| @@ -661,10 +661,102 @@ generate_type_decode (Symbol *s) | ||||
| } | ||||
| #endif | ||||
|  | ||||
| static void | ||||
| free_primitive (char *typename, char *name) | ||||
| { | ||||
|     fprintf (codefile, "free_%s(%s);\n", typename, name); | ||||
| } | ||||
|  | ||||
| static void | ||||
| free_type (char *name, Type *t) | ||||
| { | ||||
|   switch (t->type) { | ||||
|   case TType: | ||||
| #if 0 | ||||
|       free_type (name, t->symbol->type); | ||||
| #endif | ||||
|       fprintf (codefile, "free_%s(%s);\n", t->symbol->gen_name, name); | ||||
|       break; | ||||
|   case TInteger: | ||||
|       free_primitive ("integer", name); | ||||
|       break; | ||||
|   case TOctetString: | ||||
|       free_primitive ("octet_string", name); | ||||
|       break; | ||||
|   case TBitString: { | ||||
|       break; | ||||
|   } | ||||
|   case TSequence: { | ||||
|       Member *m; | ||||
|       int tag = -1; | ||||
|  | ||||
|       if (t->members == NULL) | ||||
| 	  break; | ||||
|        | ||||
|       for (m = t->members; m && tag != m->val; m = m->next) { | ||||
| 	  char *s = malloc(2 + strlen(name) + 1 + strlen(m->gen_name) + 3); | ||||
|  | ||||
| 	  sprintf (s, "%s(%s)->%s", m->optional ? "" : "&", name, m->gen_name); | ||||
| 	  free_type (s, m->type); | ||||
| 	  if(m->optional) | ||||
| 	      fprintf(codefile, "if(%s) free(%s);\n", s, s); | ||||
| 	  if (tag == -1) | ||||
| 	      tag = m->val; | ||||
| 	  free (s); | ||||
|       } | ||||
|       break; | ||||
|   } | ||||
|   case TSequenceOf: { | ||||
|       char *n = malloc(2*strlen(name) + 20); | ||||
|  | ||||
|       fprintf (codefile, "while((%s)->len){\n", name); | ||||
|       sprintf (n, "&(%s)->val[(%s)->len-1]", name, name); | ||||
|       free_type(n, t->subtype); | ||||
|       fprintf(codefile,  | ||||
| 	      "(%s)->len--;\n" | ||||
| 	      "}\n", | ||||
| 	      name); | ||||
|       fprintf(codefile, | ||||
| 	      "free((%s)->val);\n", name); | ||||
|       free(n); | ||||
|       break; | ||||
|   } | ||||
|   case TGeneralizedTime: | ||||
|       free_primitive ("generalized_time", name); | ||||
|       break; | ||||
|   case TGeneralString: | ||||
|       free_primitive ("general_string", name); | ||||
|       break; | ||||
|   case TApplication: | ||||
|       free_type (name, t->subtype); | ||||
|       break; | ||||
|   default : | ||||
|       abort (); | ||||
|   } | ||||
| } | ||||
|  | ||||
| static void | ||||
| generate_type_free (Symbol *s) | ||||
| { | ||||
|   fprintf (headerfile, | ||||
| 	   "void free_%s(%s *);\n", | ||||
| 	   s->gen_name, s->gen_name); | ||||
|  | ||||
|   fprintf (codefile, "void\n" | ||||
| 	   "free_%s(%s *data)\n" | ||||
| 	   "{\n", | ||||
| 	   s->gen_name, s->gen_name); | ||||
|  | ||||
|   free_type ("data", s->type); | ||||
|   fprintf (codefile, "}\n\n"); | ||||
| } | ||||
|  | ||||
|  | ||||
| void | ||||
| generate_type (Symbol *s) | ||||
| { | ||||
|   generate_type_header (s); | ||||
|   generate_type_encode (s); | ||||
|   generate_type_decode (s); | ||||
|   generate_type_free (s); | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Johan Danielsson
					Johan Danielsson