bits.c revision 55682
1356290Sjkim/*
2238405Sjkim * Copyright (c) 1997 - 1999 Kungliga Tekniska H�gskolan
3238405Sjkim * (Royal Institute of Technology, Stockholm, Sweden).
4238405Sjkim * All rights reserved.
5238405Sjkim *
6238405Sjkim * Redistribution and use in source and binary forms, with or without
7238405Sjkim * modification, are permitted provided that the following conditions
8238405Sjkim * are met:
9238405Sjkim *
10238405Sjkim * 1. Redistributions of source code must retain the above copyright
11238405Sjkim *    notice, this list of conditions and the following disclaimer.
12238405Sjkim *
13238405Sjkim * 2. Redistributions in binary form must reproduce the above copyright
14238405Sjkim *    notice, this list of conditions and the following disclaimer in the
15238405Sjkim *    documentation and/or other materials provided with the distribution.
16238405Sjkim *
17238405Sjkim * 3. Neither the name of the Institute nor the names of its contributors
18238405Sjkim *    may be used to endorse or promote products derived from this software
19238405Sjkim *    without specific prior written permission.
20238405Sjkim *
21238405Sjkim * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22238405Sjkim * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23238405Sjkim * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24238405Sjkim * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25238405Sjkim * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26238405Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27238405Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28238405Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29238405Sjkim * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30238405Sjkim * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31238405Sjkim * SUCH DAMAGE.
32238405Sjkim */
33238405Sjkim
34238405Sjkim#ifdef HAVE_CONFIG_H
35238405Sjkim#include <config.h>
36238405SjkimRCSID("$Id: bits.c,v 1.16 1999/12/02 17:04:57 joda Exp $");
37238405Sjkim#endif
38238405Sjkim#include <stdio.h>
39238405Sjkim#include <string.h>
40238405Sjkim#include <stdlib.h>
41276861Sjkim#include <ctype.h>
42276861Sjkim
43238405Sjkimstatic void
44238405Sjkimmy_strupr(char *s)
45238405Sjkim{
46238405Sjkim    char *p = s;
47238405Sjkim
48238405Sjkim    while(*p){
49312826Sjkim	if(islower((unsigned char)*p))
50238405Sjkim	    *p = toupper((unsigned char)*p);
51238405Sjkim	p++;
52238405Sjkim    }
53276861Sjkim}
54276861Sjkim
55276861Sjkim
56238405Sjkim#define BITSIZE(TYPE)						\
57344604Sjkim{								\
58344604Sjkim    int b = 0; TYPE x = 1, zero = 0; char *pre = "u_";		\
59344604Sjkim    char tmp[128], tmp2[128];					\
60344604Sjkim    while(x){ x <<= 1; b++; if(x < zero) pre=""; }		\
61344604Sjkim    if(b >= len){						\
62344604Sjkim        int tabs;						\
63238405Sjkim	sprintf(tmp, "%sint%d_t" , pre, len);			\
64344604Sjkim	sprintf(tmp2, "typedef %s %s;", #TYPE, tmp);		\
65344604Sjkim	my_strupr(tmp);						\
66344604Sjkim	tabs = 5 - strlen(tmp2) / 8;				\
67344604Sjkim        fprintf(f, "%s", tmp2);					\
68276861Sjkim	while(tabs-- > 0) fprintf(f, "\t");			\
69238405Sjkim	fprintf(f, "/* %2d bits */\n", b);			\
70344604Sjkim        return;                                                 \
71238405Sjkim    }								\
72238405Sjkim}
73238405Sjkim
74238405Sjkimstatic void
75238405Sjkimtry_signed(FILE *f, int len)
76238405Sjkim{
77238405Sjkim    BITSIZE(signed char);
78238405Sjkim    BITSIZE(short);
79238405Sjkim    BITSIZE(int);
80238405Sjkim    BITSIZE(long);
81238405Sjkim#ifdef HAVE_LONG_LONG
82238405Sjkim    BITSIZE(long long);
83238405Sjkim#endif
84238405Sjkim    fprintf(f, "/* There is no %d bit type */\n", len);
85238405Sjkim}
86238405Sjkim
87238405Sjkimstatic void
88238405Sjkimtry_unsigned(FILE *f, int len)
89238405Sjkim{
90238405Sjkim    BITSIZE(unsigned char);
91238405Sjkim    BITSIZE(unsigned short);
92238405Sjkim    BITSIZE(unsigned int);
93238405Sjkim    BITSIZE(unsigned long);
94238405Sjkim#ifdef HAVE_LONG_LONG
95238405Sjkim    BITSIZE(unsigned long long);
96238405Sjkim#endif
97238405Sjkim    fprintf(f, "/* There is no %d bit type */\n", len);
98238405Sjkim}
99238405Sjkim
100238405Sjkimstatic int
101238405Sjkimprint_bt(FILE *f, int flag)
102238405Sjkim{
103238405Sjkim    if(flag == 0){
104238405Sjkim	fprintf(f, "/* For compatibility with various type definitions */\n");
105238405Sjkim	fprintf(f, "#ifndef __BIT_TYPES_DEFINED__\n");
106238405Sjkim	fprintf(f, "#define __BIT_TYPES_DEFINED__\n");
107238405Sjkim	fprintf(f, "\n");
108238405Sjkim    }
109238405Sjkim    return 1;
110238405Sjkim}
111238405Sjkim
112238405Sjkimint main(int argc, char **argv)
113238405Sjkim{
114238405Sjkim    FILE *f;
115238405Sjkim    int flag;
116238405Sjkim    char *fn, *hb;
117238405Sjkim
118238405Sjkim    if(argc < 2){
119238405Sjkim	fn = "bits.h";
120238405Sjkim	hb = "__BITS_H__";
121238405Sjkim	f = stdout;
122238405Sjkim    } else {
123238405Sjkim	char *p;
124238405Sjkim	fn = argv[1];
125238405Sjkim	hb = malloc(strlen(fn) + 5);
126238405Sjkim	sprintf(hb, "__%s__", fn);
127238405Sjkim	for(p = hb; *p; p++){
128238405Sjkim	    if(!isalnum((unsigned char)*p))
129238405Sjkim		*p = '_';
130238405Sjkim	}
131238405Sjkim	f = fopen(argv[1], "w");
132238405Sjkim    }
133238405Sjkim    fprintf(f, "/* %s -- this file was generated for %s by\n", fn, HOST);
134238405Sjkim    fprintf(f, "   %*s    %s */\n\n", (int)strlen(fn), "",
135238405Sjkim	    "$Id: bits.c,v 1.16 1999/12/02 17:04:57 joda Exp $");
136356290Sjkim    fprintf(f, "#ifndef %s\n", hb);
137238405Sjkim    fprintf(f, "#define %s\n", hb);
138238405Sjkim    fprintf(f, "\n");
139238405Sjkim#ifdef HAVE_SYS_TYPES_H
140238405Sjkim    fprintf(f, "#include <sys/types.h>\n");
141238405Sjkim#endif
142238405Sjkim#ifdef HAVE_INTTYPES_H
143238405Sjkim    fprintf(f, "#include <inttypes.h>\n");
144238405Sjkim#endif
145238405Sjkim#ifdef HAVE_SYS_BITYPES_H
146238405Sjkim    fprintf(f, "#include <sys/bitypes.h>\n");
147238405Sjkim#endif
148238405Sjkim#ifdef HAVE_BIND_BITYPES_H
149238405Sjkim    fprintf(f, "#include <bind/bitypes.h>\n");
150238405Sjkim#endif
151238405Sjkim#ifdef HAVE_NETINET_IN6_MACHTYPES_H
152238405Sjkim    fprintf(f, "#include <netinet/in6_machtypes.h>\n");
153344604Sjkim#endif
154238405Sjkim    fprintf(f, "\n");
155344604Sjkim
156238405Sjkim    flag = 0;
157238405Sjkim#ifndef HAVE_INT8_T
158238405Sjkim    flag = print_bt(f, flag);
159344604Sjkim    try_signed (f, 8);
160344604Sjkim#endif /* HAVE_INT8_T */
161344604Sjkim#ifndef HAVE_INT16_T
162238405Sjkim    flag = print_bt(f, flag);
163238405Sjkim    try_signed (f, 16);
164238405Sjkim#endif /* HAVE_INT16_T */
165238405Sjkim#ifndef HAVE_INT32_T
166    flag = print_bt(f, flag);
167    try_signed (f, 32);
168#endif /* HAVE_INT32_T */
169#if 0
170#ifndef HAVE_INT64_T
171    flag = print_bt(f, flag);
172    try_signed (f, 64);
173#endif /* HAVE_INT64_T */
174#endif
175
176#ifndef HAVE_U_INT8_T
177    flag = print_bt(f, flag);
178    try_unsigned (f, 8);
179#endif /* HAVE_INT8_T */
180#ifndef HAVE_U_INT16_T
181    flag = print_bt(f, flag);
182    try_unsigned (f, 16);
183#endif /* HAVE_U_INT16_T */
184#ifndef HAVE_U_INT32_T
185    flag = print_bt(f, flag);
186    try_unsigned (f, 32);
187#endif /* HAVE_U_INT32_T */
188#if 0
189#ifndef HAVE_U_INT64_T
190    flag = print_bt(f, flag);
191    try_unsigned (f, 64);
192#endif /* HAVE_U_INT64_T */
193#endif
194
195    if(flag){
196	fprintf(f, "\n");
197	fprintf(f, "#endif /* __BIT_TYPES_DEFINED__ */\n\n");
198    }
199    fprintf(f, "#endif /* %s */\n", hb);
200    return 0;
201}
202