bits.c revision 72445
1178151Srpaulo/*
2189769Srpaulo * Copyright (c) 1997 - 2000 Kungliga Tekniska H�gskolan
3189769Srpaulo * (Royal Institute of Technology, Stockholm, Sweden).
4232090Sjkim * All rights reserved.
5178151Srpaulo *
6178151Srpaulo * Redistribution and use in source and binary forms, with or without
7178151Srpaulo * modification, are permitted provided that the following conditions
8178151Srpaulo * are met:
9178151Srpaulo *
10178151Srpaulo * 1. Redistributions of source code must retain the above copyright
11178151Srpaulo *    notice, this list of conditions and the following disclaimer.
12178151Srpaulo *
13178151Srpaulo * 2. Redistributions in binary form must reproduce the above copyright
14178151Srpaulo *    notice, this list of conditions and the following disclaimer in the
15178151Srpaulo *    documentation and/or other materials provided with the distribution.
16178151Srpaulo *
17178151Srpaulo * 3. Neither the name of the Institute nor the names of its contributors
18178151Srpaulo *    may be used to endorse or promote products derived from this software
19178151Srpaulo *    without specific prior written permission.
20178151Srpaulo *
21178151Srpaulo * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22178151Srpaulo * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23178151Srpaulo * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24178151Srpaulo * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25178151Srpaulo * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26178151Srpaulo * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27178151Srpaulo * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28178151Srpaulo * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29178151Srpaulo * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30232090Sjkim * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31197102Sjkim * SUCH DAMAGE.
32178151Srpaulo */
33178151Srpaulo
34178151Srpaulo#ifdef HAVE_CONFIG_H
35178151Srpaulo#include <config.h>
36178151SrpauloRCSID("$Id: bits.c,v 1.18 2000/08/27 05:42:46 assar Exp $");
37178151Srpaulo#endif
38178151Srpaulo#include <stdio.h>
39178151Srpaulo#include <string.h>
40178151Srpaulo#include <stdlib.h>
41197102Sjkim#include <ctype.h>
42178151Srpaulo
43197102Sjkim#define BITSIZE(TYPE)						\
44178151Srpaulo{								\
45197205Sjkim    int b = 0; TYPE x = 1, zero = 0; char *pre = "u";		\
46197102Sjkim    char tmp[128], tmp2[128];					\
47178151Srpaulo    while(x){ x <<= 1; b++; if(x < zero) pre=""; }		\
48178151Srpaulo    if(b >= len){						\
49178151Srpaulo        int tabs;						\
50232090Sjkim	sprintf(tmp, "%sint%d_t" , pre, len);			\
51178151Srpaulo	sprintf(tmp2, "typedef %s %s;", #TYPE, tmp);		\
52189769Srpaulo	tabs = 5 - strlen(tmp2) / 8;				\
53232090Sjkim        fprintf(f, "%s", tmp2);					\
54232090Sjkim	while(tabs-- > 0) fprintf(f, "\t");			\
55232090Sjkim	fprintf(f, "/* %2d bits */\n", b);			\
56232090Sjkim        return;                                                 \
57189769Srpaulo    }								\
58189769Srpaulo}
59189769Srpaulo
60189769Srpaulo#ifndef HAVE___ATTRIBUTE__
61189769Srpaulo#define __attribute__(x)
62178151Srpaulo#endif
63197102Sjkim
64178151Srpaulostatic void
65197205Sjkimtry_signed(FILE *f, int len)  __attribute__ ((unused));
66232090Sjkim
67232090Sjkimstatic void
68232090Sjkimtry_unsigned(FILE *f, int len) __attribute__ ((unused));
69232090Sjkim
70197102Sjkimstatic int
71197102Sjkimprint_bt(FILE *f, int flag) __attribute__ ((unused));
72180312Srpaulo
73178151Srpaulostatic void
74178151Srpaulotry_signed(FILE *f, int len)
75197102Sjkim{
76197102Sjkim    BITSIZE(signed char);
77197102Sjkim    BITSIZE(short);
78197102Sjkim    BITSIZE(int);
79232090Sjkim    BITSIZE(long);
80232090Sjkim#ifdef HAVE_LONG_LONG
81178151Srpaulo    BITSIZE(long long);
82189769Srpaulo#endif
83189769Srpaulo    fprintf(f, "/* There is no %d bit type */\n", len);
84189769Srpaulo}
85189769Srpaulo
86189769Srpaulostatic void
87189769Srpaulotry_unsigned(FILE *f, int len)
88189769Srpaulo{
89232090Sjkim    BITSIZE(unsigned char);
90232090Sjkim    BITSIZE(unsigned short);
91178151Srpaulo    BITSIZE(unsigned int);
92178151Srpaulo    BITSIZE(unsigned long);
93178151Srpaulo#ifdef HAVE_LONG_LONG
94178151Srpaulo    BITSIZE(unsigned long long);
95232090Sjkim#endif
96178151Srpaulo    fprintf(f, "/* There is no %d bit type */\n", len);
97197102Sjkim}
98178151Srpaulo
99189769Srpaulostatic int
100232090Sjkimprint_bt(FILE *f, int flag)
101189769Srpaulo{
102197102Sjkim    if(flag == 0){
103232090Sjkim	fprintf(f, "/* For compatibility with various type definitions */\n");
104232090Sjkim	fprintf(f, "#ifndef __BIT_TYPES_DEFINED__\n");
105178151Srpaulo	fprintf(f, "#define __BIT_TYPES_DEFINED__\n");
106197102Sjkim	fprintf(f, "\n");
107232090Sjkim    }
108232090Sjkim    return 1;
109232090Sjkim}
110232090Sjkim
111232090Sjkimint main(int argc, char **argv)
112232090Sjkim{
113197102Sjkim    FILE *f;
114197102Sjkim    int flag;
115197102Sjkim    char *fn, *hb;
116178151Srpaulo
117178151Srpaulo    if(argc < 2){
118178151Srpaulo	fn = "bits.h";
119178151Srpaulo	hb = "__BITS_H__";
120189769Srpaulo	f = stdout;
121189769Srpaulo    } else {
122189769Srpaulo	char *p;
123189769Srpaulo	fn = argv[1];
124189769Srpaulo	hb = malloc(strlen(fn) + 5);
125189769Srpaulo	sprintf(hb, "__%s__", fn);
126189769Srpaulo	for(p = hb; *p; p++){
127189769Srpaulo	    if(!isalnum((unsigned char)*p))
128189769Srpaulo		*p = '_';
129178151Srpaulo	}
130189769Srpaulo	f = fopen(argv[1], "w");
131178151Srpaulo    }
132189769Srpaulo    fprintf(f, "/* %s -- this file was generated for %s by\n", fn, HOST);
133189769Srpaulo    fprintf(f, "   %*s    %s */\n\n", (int)strlen(fn), "",
134189769Srpaulo	    "$Id: bits.c,v 1.18 2000/08/27 05:42:46 assar Exp $");
135189769Srpaulo    fprintf(f, "#ifndef %s\n", hb);
136178151Srpaulo    fprintf(f, "#define %s\n", hb);
137178151Srpaulo    fprintf(f, "\n");
138178151Srpaulo#ifdef HAVE_SYS_TYPES_H
139178151Srpaulo    fprintf(f, "#include <sys/types.h>\n");
140189769Srpaulo#endif
141189769Srpaulo#ifdef HAVE_INTTYPES_H
142189769Srpaulo    fprintf(f, "#include <inttypes.h>\n");
143189769Srpaulo#endif
144178151Srpaulo#ifdef HAVE_SYS_BITYPES_H
145178151Srpaulo    fprintf(f, "#include <sys/bitypes.h>\n");
146189769Srpaulo#endif
147189769Srpaulo#ifdef HAVE_BIND_BITYPES_H
148178151Srpaulo    fprintf(f, "#include <bind/bitypes.h>\n");
149178151Srpaulo#endif
150189769Srpaulo#ifdef HAVE_NETINET_IN6_MACHTYPES_H
151178151Srpaulo    fprintf(f, "#include <netinet/in6_machtypes.h>\n");
152178151Srpaulo#endif
153178151Srpaulo    fprintf(f, "\n");
154197102Sjkim
155197102Sjkim    flag = 0;
156178151Srpaulo#ifndef HAVE_INT8_T
157178151Srpaulo    flag = print_bt(f, flag);
158189769Srpaulo    try_signed (f, 8);
159189769Srpaulo#endif /* HAVE_INT8_T */
160189769Srpaulo#ifndef HAVE_INT16_T
161178151Srpaulo    flag = print_bt(f, flag);
162178151Srpaulo    try_signed (f, 16);
163178151Srpaulo#endif /* HAVE_INT16_T */
164178151Srpaulo#ifndef HAVE_INT32_T
165178151Srpaulo    flag = print_bt(f, flag);
166178151Srpaulo    try_signed (f, 32);
167178151Srpaulo#endif /* HAVE_INT32_T */
168189769Srpaulo#if 0
169178151Srpaulo#ifndef HAVE_INT64_T
170178151Srpaulo    flag = print_bt(f, flag);
171178151Srpaulo    try_signed (f, 64);
172178151Srpaulo#endif /* HAVE_INT64_T */
173189769Srpaulo#endif
174178151Srpaulo
175197102Sjkim#ifndef HAVE_UINT8_T
176189769Srpaulo    flag = print_bt(f, flag);
177189769Srpaulo    try_unsigned (f, 8);
178178151Srpaulo#endif /* HAVE_UINT8_T */
179189769Srpaulo#ifndef HAVE_UINT16_T
180178151Srpaulo    flag = print_bt(f, flag);
181178151Srpaulo    try_unsigned (f, 16);
182178151Srpaulo#endif /* HAVE_UINT16_T */
183178151Srpaulo#ifndef HAVE_UINT32_T
184189769Srpaulo    flag = print_bt(f, flag);
185178151Srpaulo    try_unsigned (f, 32);
186197205Sjkim#endif /* HAVE_UINT32_T */
187197102Sjkim#if 0
188241885Seadler#ifndef HAVE_UINT64_T
189241885Seadler    flag = print_bt(f, flag);
190241885Seadler    try_unsigned (f, 64);
191197205Sjkim#endif /* HAVE_UINT64_T */
192197205Sjkim#endif
193197102Sjkim
194197102Sjkim#define X(S) fprintf(f, "typedef uint" #S "_t u_int" #S "_t;\n")
195197102Sjkim#ifndef HAVE_U_INT8_T
196197205Sjkim    flag = print_bt(f, flag);
197197205Sjkim    X(8);
198197102Sjkim#endif /* HAVE_U_INT8_T */
199197102Sjkim#ifndef HAVE_U_INT16_T
200197102Sjkim    flag = print_bt(f, flag);
201197102Sjkim    X(16);
202232090Sjkim#endif /* HAVE_U_INT16_T */
203232090Sjkim#ifndef HAVE_U_INT32_T
204232090Sjkim    flag = print_bt(f, flag);
205197102Sjkim    X(32);
206197102Sjkim#endif /* HAVE_U_INT32_T */
207178151Srpaulo#if 0
208178151Srpaulo#ifndef HAVE_U_INT64_T
209197102Sjkim    flag = print_bt(f, flag);
210197102Sjkim    X(64);
211178151Srpaulo#endif /* HAVE_U_INT64_T */
212178151Srpaulo#endif
213178151Srpaulo
214178151Srpaulo    if(flag){
215189769Srpaulo	fprintf(f, "\n");
216178151Srpaulo	fprintf(f, "#endif /* __BIT_TYPES_DEFINED__ */\n\n");
217232090Sjkim    }
218232090Sjkim    fprintf(f, "#endif /* %s */\n", hb);
219189769Srpaulo    return 0;
220178151Srpaulo}
221178151Srpaulo