1 /* 2 * Copyright (c) 1997 - 1999 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: gen_copy.c,v 1.10 1999/12/02 17:05:02 joda Exp $"); 37 38 static void 39 copy_primitive (const char *typename, const char *from, const char *to) 40 { 41 fprintf (codefile, "if(copy_%s(%s, %s)) return ENOMEM;\n", 42 typename, from, to); 43 } 44 45 static void 46 copy_type (const char *from, const char *to, const Type *t) 47 { 48 switch (t->type) { 49 case TType: 50 #if 0 51 copy_type (from, to, t->symbol->type); 52 #endif 53 fprintf (codefile, "if(copy_%s(%s, %s)) return ENOMEM;\n", 54 t->symbol->gen_name, from, to); 55 break; 56 case TInteger: 57 fprintf(codefile, "*(%s) = *(%s);\n", to, from); 58 break; 59 case TOctetString: 60 copy_primitive ("octet_string", from, to); 61 break; 62 case TBitString: { 63 fprintf(codefile, "*(%s) = *(%s);\n", to, from); 64 break; 65 } 66 case TSequence: { 67 Member *m; 68 int tag = -1; 69 70 if (t->members == NULL) 71 break; 72 73 for (m = t->members; m && tag != m->val; m = m->next) { 74 char *f; 75 char *t; 76 77 asprintf (&f, "%s(%s)->%s", 78 m->optional ? "" : "&", from, m->gen_name); 79 asprintf (&t, "%s(%s)->%s", 80 m->optional ? "" : "&", to, m->gen_name); 81 if(m->optional){ 82 fprintf(codefile, "if(%s) {\n", f); 83 fprintf(codefile, "%s = malloc(sizeof(*%s));\n", t, t); 84 fprintf(codefile, "if(%s == NULL) return ENOMEM;\n", t); 85 } 86 copy_type (f, t, m->type); 87 if(m->optional){ 88 fprintf(codefile, "}else\n"); 89 fprintf(codefile, "%s = NULL;\n", t); 90 } 91 if (tag == -1) 92 tag = m->val; 93 free (f); 94 free (t); 95 } 96 break; 97 } 98 case TSequenceOf: { 99 char *f; 100 char *T; 101 102 fprintf (codefile, "if(((%s)->val = " 103 "malloc((%s)->len * sizeof(*(%s)->val))) == NULL && (%s)->len != 0)\n", 104 to, from, to, from); 105 fprintf (codefile, "return ENOMEM;\n"); 106 fprintf(codefile, 107 "for((%s)->len = 0; (%s)->len < (%s)->len; (%s)->len++){\n", 108 to, to, from, to); 109 asprintf(&f, "&(%s)->val[(%s)->len]", from, to); 110 asprintf(&T, "&(%s)->val[(%s)->len]", to, to); 111 copy_type(f, T, t->subtype); 112 fprintf(codefile, "}\n"); 113 free(f); 114 free(T); 115 break; 116 } 117 case TGeneralizedTime: 118 fprintf(codefile, "*(%s) = *(%s);\n", to, from); 119 break; 120 case TGeneralString: 121 copy_primitive ("general_string", from, to); 122 break; 123 case TApplication: 124 copy_type (from, to, t->subtype); 125 break; 126 default : 127 abort (); 128 } 129 } 130 131 void 132 generate_type_copy (const Symbol *s) 133 { 134 fprintf (headerfile, 135 "int copy_%s (const %s *, %s *);\n", 136 s->gen_name, s->gen_name, s->gen_name); 137 138 fprintf (codefile, "int\n" 139 "copy_%s(const %s *from, %s *to)\n" 140 "{\n", 141 s->gen_name, s->gen_name, s->gen_name); 142 143 copy_type ("from", "to", s->type); 144 fprintf (codefile, "return 0;\n}\n\n"); 145 } 146 147