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