gen_seq.c revision 233294
1178825Sdfr/* 2233294Sstas * Copyright (c) 1997 - 2006 Kungliga Tekniska H��gskolan 3233294Sstas * (Royal Institute of Technology, Stockholm, Sweden). 4233294Sstas * All rights reserved. 5178825Sdfr * 6233294Sstas * Redistribution and use in source and binary forms, with or without 7233294Sstas * modification, are permitted provided that the following conditions 8233294Sstas * are met: 9178825Sdfr * 10233294Sstas * 1. Redistributions of source code must retain the above copyright 11233294Sstas * notice, this list of conditions and the following disclaimer. 12178825Sdfr * 13233294Sstas * 2. Redistributions in binary form must reproduce the above copyright 14233294Sstas * notice, this list of conditions and the following disclaimer in the 15233294Sstas * documentation and/or other materials provided with the distribution. 16178825Sdfr * 17233294Sstas * 3. Neither the name of the Institute nor the names of its contributors 18233294Sstas * may be used to endorse or promote products derived from this software 19233294Sstas * without specific prior written permission. 20178825Sdfr * 21233294Sstas * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 22233294Sstas * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23233294Sstas * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24233294Sstas * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 25233294Sstas * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26233294Sstas * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27233294Sstas * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28233294Sstas * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29233294Sstas * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30233294Sstas * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31233294Sstas * SUCH DAMAGE. 32178825Sdfr */ 33178825Sdfr 34178825Sdfr#include "gen_locl.h" 35178825Sdfr 36233294SstasRCSID("$Id$"); 37178825Sdfr 38178825Sdfrvoid 39178825Sdfrgenerate_type_seq (const Symbol *s) 40178825Sdfr{ 41178825Sdfr char *subname; 42178825Sdfr Type *type; 43178825Sdfr 44178825Sdfr if (!seq_type(s->name)) 45178825Sdfr return; 46178825Sdfr type = s->type; 47178825Sdfr while(type->type == TTag) 48178825Sdfr type = type->subtype; 49178825Sdfr 50233294Sstas if (type->type != TSequenceOf && type->type != TSetOf) { 51233294Sstas fprintf(stderr, "%s not seq of %d\n", s->name, (int)type->type); 52178825Sdfr return; 53178825Sdfr } 54178825Sdfr 55178825Sdfr /* 56178825Sdfr * Require the subtype to be a type so we can name it and use 57178825Sdfr * copy_/free_ 58178825Sdfr */ 59233294Sstas 60178825Sdfr if (type->subtype->type != TType) { 61178825Sdfr fprintf(stderr, "%s subtype is not a type, can't generate " 62178825Sdfr "sequence code for this case: %d\n", 63178825Sdfr s->name, (int)type->subtype->type); 64178825Sdfr exit(1); 65178825Sdfr } 66178825Sdfr 67178825Sdfr subname = type->subtype->symbol->gen_name; 68178825Sdfr 69178825Sdfr fprintf (headerfile, 70233294Sstas "ASN1EXP int ASN1CALL add_%s (%s *, const %s *);\n" 71233294Sstas "ASN1EXP int ASN1CALL remove_%s (%s *, unsigned int);\n", 72178825Sdfr s->gen_name, s->gen_name, subname, 73178825Sdfr s->gen_name, s->gen_name); 74178825Sdfr 75233294Sstas fprintf (codefile, "int ASN1CALL\n" 76178825Sdfr "add_%s(%s *data, const %s *element)\n" 77178825Sdfr "{\n", 78178825Sdfr s->gen_name, s->gen_name, subname); 79178825Sdfr 80233294Sstas fprintf (codefile, 81178825Sdfr "int ret;\n" 82178825Sdfr "void *ptr;\n" 83178825Sdfr "\n" 84178825Sdfr "ptr = realloc(data->val, \n" 85178825Sdfr "\t(data->len + 1) * sizeof(data->val[0]));\n" 86178825Sdfr "if (ptr == NULL) return ENOMEM;\n" 87178825Sdfr "data->val = ptr;\n\n" 88178825Sdfr "ret = copy_%s(element, &data->val[data->len]);\n" 89178825Sdfr "if (ret) return ret;\n" 90178825Sdfr "data->len++;\n" 91178825Sdfr "return 0;\n", 92178825Sdfr subname); 93178825Sdfr 94178825Sdfr fprintf (codefile, "}\n\n"); 95233294Sstas 96233294Sstas fprintf (codefile, "int ASN1CALL\n" 97178825Sdfr "remove_%s(%s *data, unsigned int element)\n" 98178825Sdfr "{\n", 99178825Sdfr s->gen_name, s->gen_name); 100178825Sdfr 101233294Sstas fprintf (codefile, 102178825Sdfr "void *ptr;\n" 103178825Sdfr "\n" 104178825Sdfr "if (data->len == 0 || element >= data->len)\n" 105178825Sdfr "\treturn ASN1_OVERRUN;\n" 106178825Sdfr "free_%s(&data->val[element]);\n" 107178825Sdfr "data->len--;\n" 108178825Sdfr /* don't move if its the last element */ 109178825Sdfr "if (element < data->len)\n" 110178825Sdfr "\tmemmove(&data->val[element], &data->val[element + 1], \n" 111233294Sstas "\t\tsizeof(data->val[0]) * (data->len - element));\n" 112178825Sdfr /* resize but don't care about failures since it doesn't matter */ 113178825Sdfr "ptr = realloc(data->val, data->len * sizeof(data->val[0]));\n" 114178825Sdfr "if (ptr != NULL || data->len == 0) data->val = ptr;\n" 115178825Sdfr "return 0;\n", 116178825Sdfr subname); 117178825Sdfr 118178825Sdfr fprintf (codefile, "}\n\n"); 119178825Sdfr} 120