Ejemplo n.º 1
0
 result_type call_fun(mem_function_calltype, seq<S...>, CArgs && ... cargs)
 {
     using seq_type = typename gen<sizeof...(S)-1>::type;
     typedef Tuple<CArgs&&...> CallArgs;
     CallArgs cargs_tuple((CArgs&&)cargs...);
     return call_mem_fun<CArgs...>(seq_type()
         , select<BindArgs, CallArgs, 0>::invoke(m_args, cargs_tuple)
         , cargs_tuple);
 }
Ejemplo n.º 2
0
void
generate_type_seq (const Symbol *s)
{
    char *subname;
    Type *type;

    if (!seq_type(s->name))
        return;
    type = s->type;
    while(type->type == TTag)
        type = type->subtype;

    if (type->type != TSequenceOf) {
        printf("%s not seq of %d\n", s->name, (int)type->type);
        return;
    }

    /*
     * Require the subtype to be a type so we can name it and use
     * copy_/free_
     */

    if (type->subtype->type != TType) {
        fprintf(stderr, "%s subtype is not a type, can't generate "
                "sequence code for this case: %d\n",
                s->name, (int)type->subtype->type);
        exit(1);
    }

    subname = type->subtype->symbol->gen_name;

    fprintf (headerfile,
             "int   add_%s  (%s *, const %s *);\n"
             "int   remove_%s  (%s *, unsigned int);\n",
             s->gen_name, s->gen_name, subname,
             s->gen_name, s->gen_name);

    fprintf (codefile, "int\n"
             "add_%s(%s *data, const %s *element)\n"
             "{\n",
             s->gen_name, s->gen_name, subname);

    fprintf (codefile,
             "int ret;\n"
             "void *ptr;\n"
             "\n"
             "ptr = realloc(data->val, \n"
             "\t(data->len + 1) * sizeof(data->val[0]));\n"
             "if (ptr == NULL) return ENOMEM;\n"
             "data->val = ptr;\n\n"
             "ret = copy_%s(element, &data->val[data->len]);\n"
             "if (ret) return ret;\n"
             "data->len++;\n"
             "return 0;\n",
             subname);

    fprintf (codefile, "}\n\n");

    fprintf (codefile, "int\n"
             "remove_%s(%s *data, unsigned int element)\n"
             "{\n",
             s->gen_name, s->gen_name);

    fprintf (codefile,
             "void *ptr;\n"
             "\n"
             "if (data->len == 0 || element >= data->len)\n"
             "\treturn ASN1_OVERRUN;\n"
             "free_%s(&data->val[element]);\n"
             "data->len--;\n"
             /* don't move if its the last element */
             "if (element < data->len)\n"
             "\tmemmove(&data->val[element], &data->val[element + 1], \n"
             "\t\tsizeof(data->val[0]) * data->len);\n"
             /* resize but don't care about failures since it doesn't matter */
             "ptr = realloc(data->val, data->len * sizeof(data->val[0]));\n"
             "if (ptr != NULL || data->len == 0) data->val = ptr;\n"
             "return 0;\n",
             subname);

    fprintf (codefile, "}\n\n");
}