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 RCSID("$Id: gen_copy.c,v 1.11 2000/04/06 17:22:05 assar 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 case TUInteger: 58 fprintf(codefile, "*(%s) = *(%s);\n", to, from); 59 break; 60 case TOctetString: 61 copy_primitive ("octet_string", from, to); 62 break; 63 case TBitString: { 64 fprintf(codefile, "*(%s) = *(%s);\n", to, from); 65 break; 66 } 67 case TSequence: { 68 Member *m; 69 int tag = -1; 70 71 if (t->members == NULL) 72 break; 73 74 for (m = t->members; m && tag != m->val; m = m->next) { 75 char *f; 76 char *t; 77 78 asprintf (&f, "%s(%s)->%s", 79 m->optional ? "" : "&", from, m->gen_name); 80 asprintf (&t, "%s(%s)->%s", 81 m->optional ? "" : "&", to, m->gen_name); 82 if(m->optional){ 83 fprintf(codefile, "if(%s) {\n", f); 84 fprintf(codefile, "%s = malloc(sizeof(*%s));\n", t, t); 85 fprintf(codefile, "if(%s == NULL) return ENOMEM;\n", t); 86 } 87 copy_type (f, t, m->type); 88 if(m->optional){ 89 fprintf(codefile, "}else\n"); 90 fprintf(codefile, "%s = NULL;\n", t); 91 } 92 if (tag == -1) 93 tag = m->val; 94 free (f); 95 free (t); 96 } 97 break; 98 } 99 case TSequenceOf: { 100 char *f; 101 char *T; 102 103 fprintf (codefile, "if(((%s)->val = " 104 "malloc((%s)->len * sizeof(*(%s)->val))) == NULL && (%s)->len != 0)\n", 105 to, from, to, from); 106 fprintf (codefile, "return ENOMEM;\n"); 107 fprintf(codefile, 108 "for((%s)->len = 0; (%s)->len < (%s)->len; (%s)->len++){\n", 109 to, to, from, to); 110 asprintf(&f, "&(%s)->val[(%s)->len]", from, to); 111 asprintf(&T, "&(%s)->val[(%s)->len]", to, to); 112 copy_type(f, T, t->subtype); 113 fprintf(codefile, "}\n"); 114 free(f); 115 free(T); 116 break; 117 } 118 case TGeneralizedTime: 119 fprintf(codefile, "*(%s) = *(%s);\n", to, from); 120 break; 121 case TGeneralString: 122 copy_primitive ("general_string", from, to); 123 break; 124 case TApplication: 125 copy_type (from, to, t->subtype); 126 break; 127 default : 128 abort (); 129 } 130 } 131 132 void 133 generate_type_copy (const Symbol *s) 134 { 135 fprintf (headerfile, 136 "int copy_%s (const %s *, %s *);\n", 137 s->gen_name, s->gen_name, s->gen_name); 138 139 fprintf (codefile, "int\n" 140 "copy_%s(const %s *from, %s *to)\n" 141 "{\n", 142 s->gen_name, s->gen_name, s->gen_name); 143 144 copy_type ("from", "to", s->type); 145 fprintf (codefile, "return 0;\n}\n\n"); 146 } 147 148