root/source4/heimdal/lib/asn1/gen_glue.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. generate_2int
  2. generate_int2
  3. generate_units
  4. generate_glue

   1 /*
   2  * Copyright (c) 1997, 1999, 2000, 2003 - 2005 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$");
  37 
  38 static void
  39 generate_2int (const Type *t, const char *gen_name)
     /* [<][>][^][v][top][bottom][index][help] */
  40 {
  41     Member *m;
  42 
  43     fprintf (headerfile,
  44              "unsigned %s2int(%s);\n",
  45              gen_name, gen_name);
  46 
  47     fprintf (codefile,
  48              "unsigned %s2int(%s f)\n"
  49              "{\n"
  50              "unsigned r = 0;\n",
  51              gen_name, gen_name);
  52 
  53     ASN1_TAILQ_FOREACH(m, t->members, members) {
  54         fprintf (codefile, "if(f.%s) r |= (1U << %d);\n",
  55                  m->gen_name, m->val);
  56     }
  57     fprintf (codefile, "return r;\n"
  58              "}\n\n");
  59 }
  60 
  61 static void
  62 generate_int2 (const Type *t, const char *gen_name)
     /* [<][>][^][v][top][bottom][index][help] */
  63 {
  64     Member *m;
  65 
  66     fprintf (headerfile,
  67              "%s int2%s(unsigned);\n",
  68              gen_name, gen_name);
  69 
  70     fprintf (codefile,
  71              "%s int2%s(unsigned n)\n"
  72              "{\n"
  73              "\t%s flags;\n\n",
  74              gen_name, gen_name, gen_name);
  75 
  76     if(t->members) {
  77         ASN1_TAILQ_FOREACH(m, t->members, members) {
  78             fprintf (codefile, "\tflags.%s = (n >> %d) & 1;\n",
  79                      m->gen_name, m->val);
  80         }
  81     }
  82     fprintf (codefile, "\treturn flags;\n"
  83              "}\n\n");
  84 }
  85 
  86 /*
  87  * This depends on the bit string being declared in increasing order
  88  */
  89 
  90 static void
  91 generate_units (const Type *t, const char *gen_name)
     /* [<][>][^][v][top][bottom][index][help] */
  92 {
  93     Member *m;
  94 
  95     fprintf (headerfile,
  96              "const struct units * asn1_%s_units(void);",
  97              gen_name);
  98 
  99     fprintf (codefile,
 100              "static struct units %s_units[] = {\n",
 101              gen_name);
 102 
 103     if(t->members) {
 104         ASN1_TAILQ_FOREACH_REVERSE(m, t->members, memhead, members) {
 105             fprintf (codefile,
 106                      "\t{\"%s\",\t1U << %d},\n", m->name, m->val);
 107         }
 108     }
 109 
 110     fprintf (codefile,
 111              "\t{NULL,\t0}\n"
 112              "};\n\n");
 113 
 114     fprintf (codefile,
 115              "const struct units * asn1_%s_units(void){\n"
 116              "return %s_units;\n"
 117              "}\n\n",
 118              gen_name, gen_name);
 119 
 120 
 121 }
 122 
 123 void
 124 generate_glue (const Type *t, const char *gen_name)
     /* [<][>][^][v][top][bottom][index][help] */
 125 {
 126     switch(t->type) {
 127     case TTag:
 128         generate_glue(t->subtype, gen_name);
 129         break;
 130     case TBitString :
 131         if (!ASN1_TAILQ_EMPTY(t->members)) {
 132             generate_2int (t, gen_name);
 133             generate_int2 (t, gen_name);
 134             generate_units (t, gen_name);
 135         }
 136         break;
 137     default :
 138         break;
 139     }
 140 }

/* [<][>][^][v][top][bottom][index][help] */