1*afab4e30Schristos /* $NetBSD: bits.c,v 1.4 2023/06/19 21:41:41 christos Exp $ */
2ca1c9b0cSelric
3ca1c9b0cSelric /*
4ca1c9b0cSelric * Copyright (c) 1997-2002 Kungliga Tekniska Högskolan
5ca1c9b0cSelric * (Royal Institute of Technology, Stockholm, Sweden).
6ca1c9b0cSelric * All rights reserved.
7ca1c9b0cSelric *
8ca1c9b0cSelric * Portions Copyright (c) 2010 Apple Inc. All rights reserved.
9ca1c9b0cSelric *
10ca1c9b0cSelric * Redistribution and use in source and binary forms, with or without
11ca1c9b0cSelric * modification, are permitted provided that the following conditions
12ca1c9b0cSelric * are met:
13ca1c9b0cSelric *
14ca1c9b0cSelric * 1. Redistributions of source code must retain the above copyright
15ca1c9b0cSelric * notice, this list of conditions and the following disclaimer.
16ca1c9b0cSelric *
17ca1c9b0cSelric * 2. Redistributions in binary form must reproduce the above copyright
18ca1c9b0cSelric * notice, this list of conditions and the following disclaimer in the
19ca1c9b0cSelric * documentation and/or other materials provided with the distribution.
20ca1c9b0cSelric *
21ca1c9b0cSelric * 3. Neither the name of the Institute nor the names of its contributors
22ca1c9b0cSelric * may be used to endorse or promote products derived from this software
23ca1c9b0cSelric * without specific prior written permission.
24ca1c9b0cSelric *
25ca1c9b0cSelric * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
26ca1c9b0cSelric * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27ca1c9b0cSelric * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28ca1c9b0cSelric * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
29ca1c9b0cSelric * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30ca1c9b0cSelric * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31ca1c9b0cSelric * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32ca1c9b0cSelric * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33ca1c9b0cSelric * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34ca1c9b0cSelric * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35ca1c9b0cSelric * SUCH DAMAGE.
36ca1c9b0cSelric */
37ca1c9b0cSelric
38ca1c9b0cSelric #ifdef HAVE_CONFIG_H
39ca1c9b0cSelric #include <config.h>
40*afab4e30Schristos __RCSID("$NetBSD: bits.c,v 1.4 2023/06/19 21:41:41 christos Exp $");
41ca1c9b0cSelric #endif
42ca1c9b0cSelric #include <stdio.h>
43ca1c9b0cSelric #include <string.h>
44ca1c9b0cSelric #include <stdlib.h>
45ca1c9b0cSelric #include <ctype.h>
46ca1c9b0cSelric #ifdef WIN32
47ca1c9b0cSelric #include <winsock2.h>
48ca1c9b0cSelric #include <ws2tcpip.h>
49ca1c9b0cSelric #endif
50ca1c9b0cSelric
51ca1c9b0cSelric #define BITSIZE(TYPE) \
52ca1c9b0cSelric { \
53ca1c9b0cSelric int b = 0; TYPE x = 1, zero = 0; const char *pre = "u"; \
54*afab4e30Schristos char tmp[128], tmp2[192]; \
55ca1c9b0cSelric while(x){ x <<= 1; b++; if(x < zero) pre=""; } \
56ca1c9b0cSelric if(b >= len){ \
57ca1c9b0cSelric size_t tabs; \
58ca1c9b0cSelric sprintf(tmp, "%sint%d_t" , pre, len); \
59ca1c9b0cSelric sprintf(tmp2, "typedef %s %s;", #TYPE, tmp); \
60ca1c9b0cSelric tabs = 5 - strlen(tmp2) / 8; \
61ca1c9b0cSelric fprintf(f, "%s", tmp2); \
62ca1c9b0cSelric while(tabs-- > 0) fprintf(f, "\t"); \
63ca1c9b0cSelric fprintf(f, "/* %2d bits */\n", b); \
64ca1c9b0cSelric return; \
65ca1c9b0cSelric } \
66ca1c9b0cSelric }
67ca1c9b0cSelric
68ca1c9b0cSelric #ifndef HAVE___ATTRIBUTE__
69ca1c9b0cSelric #define __attribute__(x)
70ca1c9b0cSelric #endif
71ca1c9b0cSelric
72ca1c9b0cSelric static void
73d3273b5bSchristos try_signed(FILE *f, int len) __attribute__ ((__unused__));
74ca1c9b0cSelric
75ca1c9b0cSelric static void
76d3273b5bSchristos try_unsigned(FILE *f, int len) __attribute__ ((__unused__));
77ca1c9b0cSelric
78ca1c9b0cSelric static int
79d3273b5bSchristos print_bt(FILE *f, int flag) __attribute__ ((__unused__));
80ca1c9b0cSelric
81ca1c9b0cSelric static void
try_signed(FILE * f,int len)82ca1c9b0cSelric try_signed(FILE *f, int len)
83ca1c9b0cSelric {
84ca1c9b0cSelric BITSIZE(signed char);
85ca1c9b0cSelric BITSIZE(short);
86ca1c9b0cSelric BITSIZE(int);
87ca1c9b0cSelric BITSIZE(long);
88ca1c9b0cSelric #ifdef HAVE_LONG_LONG
89ca1c9b0cSelric BITSIZE(long long);
90ca1c9b0cSelric #endif
91ca1c9b0cSelric fprintf(f, "/* There is no %d bit type */\n", len);
92ca1c9b0cSelric }
93ca1c9b0cSelric
94ca1c9b0cSelric static void
try_unsigned(FILE * f,int len)95ca1c9b0cSelric try_unsigned(FILE *f, int len)
96ca1c9b0cSelric {
97ca1c9b0cSelric BITSIZE(unsigned char);
98ca1c9b0cSelric BITSIZE(unsigned short);
99ca1c9b0cSelric BITSIZE(unsigned int);
100ca1c9b0cSelric BITSIZE(unsigned long);
101ca1c9b0cSelric #ifdef HAVE_LONG_LONG
102ca1c9b0cSelric BITSIZE(unsigned long long);
103ca1c9b0cSelric #endif
104ca1c9b0cSelric fprintf(f, "/* There is no %d bit type */\n", len);
105ca1c9b0cSelric }
106ca1c9b0cSelric
107ca1c9b0cSelric static int
print_bt(FILE * f,int flag)108ca1c9b0cSelric print_bt(FILE *f, int flag)
109ca1c9b0cSelric {
110ca1c9b0cSelric if(flag == 0){
111ca1c9b0cSelric fprintf(f, "/* For compatibility with various type definitions */\n");
112ca1c9b0cSelric fprintf(f, "#ifndef __BIT_TYPES_DEFINED__\n");
113ca1c9b0cSelric fprintf(f, "#define __BIT_TYPES_DEFINED__\n");
114ca1c9b0cSelric fprintf(f, "\n");
115ca1c9b0cSelric }
116ca1c9b0cSelric return 1;
117ca1c9b0cSelric }
118ca1c9b0cSelric
main(int argc,char ** argv)119ca1c9b0cSelric int main(int argc, char **argv)
120ca1c9b0cSelric {
121ca1c9b0cSelric FILE *f;
122ca1c9b0cSelric int flag;
123b9d004c6Schristos char *p = NULL;
124b9d004c6Schristos const char *hb;
125ca1c9b0cSelric
126ca1c9b0cSelric if (argc > 1 && strcmp(argv[1], "--version") == 0) {
127ca1c9b0cSelric printf("some version");
128ca1c9b0cSelric return 0;
129ca1c9b0cSelric }
130ca1c9b0cSelric
131ca1c9b0cSelric if(argc < 2){
132ca1c9b0cSelric hb = "__BITS_H__";
133ca1c9b0cSelric f = stdout;
134ca1c9b0cSelric } else {
135b9d004c6Schristos p = malloc(strlen(argv[1]) + 5);
136b9d004c6Schristos sprintf(p, "__%s__", argv[1]);
137ca1c9b0cSelric hb = p;
138ca1c9b0cSelric for(; *p; p++){
139ca1c9b0cSelric if(!isalnum((unsigned char)*p))
140ca1c9b0cSelric *p = '_';
141ca1c9b0cSelric }
142ca1c9b0cSelric f = fopen(argv[1], "w");
143ca1c9b0cSelric }
144ca1c9b0cSelric fprintf(f, "#ifndef %s\n", hb);
145ca1c9b0cSelric fprintf(f, "#define %s\n", hb);
146ca1c9b0cSelric fprintf(f, "\n");
147ca1c9b0cSelric #ifdef HAVE_INTTYPES_H
148ca1c9b0cSelric fprintf(f, "#include <inttypes.h>\n");
149ca1c9b0cSelric #endif
150ca1c9b0cSelric #ifdef HAVE_SYS_TYPES_H
151ca1c9b0cSelric fprintf(f, "#include <sys/types.h>\n");
152ca1c9b0cSelric #endif
153ca1c9b0cSelric #ifdef HAVE_SYS_BITYPES_H
154ca1c9b0cSelric fprintf(f, "#include <sys/bitypes.h>\n");
155ca1c9b0cSelric #endif
156ca1c9b0cSelric #ifdef HAVE_BIND_BITYPES_H
157ca1c9b0cSelric fprintf(f, "#include <bind/bitypes.h>\n");
158ca1c9b0cSelric #endif
159ca1c9b0cSelric #ifdef HAVE_NETINET_IN6_MACHTYPES_H
160ca1c9b0cSelric fprintf(f, "#include <netinet/in6_machtypes.h>\n");
161ca1c9b0cSelric #endif
162ca1c9b0cSelric #ifdef HAVE_SOCKLEN_T
163ca1c9b0cSelric #ifndef WIN32
164ca1c9b0cSelric fprintf(f, "#include <sys/socket.h>\n");
165ca1c9b0cSelric #else
166ca1c9b0cSelric fprintf(f, "#include <winsock2.h>\n");
167ca1c9b0cSelric fprintf(f, "#include <ws2tcpip.h>\n");
168ca1c9b0cSelric #endif
169ca1c9b0cSelric #endif
170ca1c9b0cSelric fprintf(f, "\n");
171ca1c9b0cSelric
172ca1c9b0cSelric flag = 0;
173ca1c9b0cSelric #ifndef HAVE_INT8_T
174ca1c9b0cSelric flag = print_bt(f, flag);
175ca1c9b0cSelric try_signed (f, 8);
176ca1c9b0cSelric #endif /* HAVE_INT8_T */
177ca1c9b0cSelric #ifndef HAVE_INT16_T
178ca1c9b0cSelric flag = print_bt(f, flag);
179ca1c9b0cSelric try_signed (f, 16);
180ca1c9b0cSelric #endif /* HAVE_INT16_T */
181ca1c9b0cSelric #ifndef HAVE_INT32_T
182ca1c9b0cSelric flag = print_bt(f, flag);
183ca1c9b0cSelric try_signed (f, 32);
184ca1c9b0cSelric #endif /* HAVE_INT32_T */
185ca1c9b0cSelric #ifndef HAVE_INT64_T
186ca1c9b0cSelric flag = print_bt(f, flag);
187ca1c9b0cSelric try_signed (f, 64);
188ca1c9b0cSelric #endif /* HAVE_INT64_T */
189ca1c9b0cSelric
190ca1c9b0cSelric #ifndef HAVE_UINT8_T
191ca1c9b0cSelric flag = print_bt(f, flag);
192ca1c9b0cSelric try_unsigned (f, 8);
193ca1c9b0cSelric #endif /* HAVE_UINT8_T */
194ca1c9b0cSelric #ifndef HAVE_UINT16_T
195ca1c9b0cSelric flag = print_bt(f, flag);
196ca1c9b0cSelric try_unsigned (f, 16);
197ca1c9b0cSelric #endif /* HAVE_UINT16_T */
198ca1c9b0cSelric #ifndef HAVE_UINT32_T
199ca1c9b0cSelric flag = print_bt(f, flag);
200ca1c9b0cSelric try_unsigned (f, 32);
201ca1c9b0cSelric #endif /* HAVE_UINT32_T */
202ca1c9b0cSelric #ifndef HAVE_UINT64_T
203ca1c9b0cSelric flag = print_bt(f, flag);
204ca1c9b0cSelric try_unsigned (f, 64);
205ca1c9b0cSelric #endif /* HAVE_UINT64_T */
206ca1c9b0cSelric
207ca1c9b0cSelric #define X(S) fprintf(f, "typedef uint" #S "_t u_int" #S "_t;\n")
208ca1c9b0cSelric #ifndef HAVE_U_INT8_T
209ca1c9b0cSelric flag = print_bt(f, flag);
210ca1c9b0cSelric X(8);
211ca1c9b0cSelric #endif /* HAVE_U_INT8_T */
212ca1c9b0cSelric #ifndef HAVE_U_INT16_T
213ca1c9b0cSelric flag = print_bt(f, flag);
214ca1c9b0cSelric X(16);
215ca1c9b0cSelric #endif /* HAVE_U_INT16_T */
216ca1c9b0cSelric #ifndef HAVE_U_INT32_T
217ca1c9b0cSelric flag = print_bt(f, flag);
218ca1c9b0cSelric X(32);
219ca1c9b0cSelric #endif /* HAVE_U_INT32_T */
220ca1c9b0cSelric #ifndef HAVE_U_INT64_T
221ca1c9b0cSelric flag = print_bt(f, flag);
222ca1c9b0cSelric X(64);
223ca1c9b0cSelric #endif /* HAVE_U_INT64_T */
224ca1c9b0cSelric
225ca1c9b0cSelric if(flag){
226ca1c9b0cSelric fprintf(f, "\n");
227ca1c9b0cSelric fprintf(f, "#endif /* __BIT_TYPES_DEFINED__ */\n\n");
228ca1c9b0cSelric }
229ca1c9b0cSelric #ifdef KRB5
230ca1c9b0cSelric fprintf(f, "\n");
231ca1c9b0cSelric #if defined(HAVE_SOCKLEN_T)
232ca1c9b0cSelric fprintf(f, "typedef socklen_t krb5_socklen_t;\n");
233ca1c9b0cSelric #else
234ca1c9b0cSelric fprintf(f, "typedef int krb5_socklen_t;\n");
235ca1c9b0cSelric #endif
236ca1c9b0cSelric #if defined(HAVE_SSIZE_T)
237ca1c9b0cSelric #ifdef HAVE_UNISTD_H
238ca1c9b0cSelric fprintf(f, "#include <unistd.h>\n");
239ca1c9b0cSelric #endif
240ca1c9b0cSelric fprintf(f, "typedef ssize_t krb5_ssize_t;\n");
241ca1c9b0cSelric #else
242ca1c9b0cSelric fprintf(f, "typedef int krb5_ssize_t;\n");
243ca1c9b0cSelric #endif
244ca1c9b0cSelric fprintf(f, "\n");
245ca1c9b0cSelric
246ca1c9b0cSelric #if defined(_WIN32)
247ca1c9b0cSelric fprintf(f, "typedef SOCKET krb5_socket_t;\n");
248ca1c9b0cSelric #else
249ca1c9b0cSelric fprintf(f, "typedef int krb5_socket_t;\n");
250ca1c9b0cSelric #endif
251ca1c9b0cSelric fprintf(f, "\n");
252ca1c9b0cSelric
253ca1c9b0cSelric #endif /* KRB5 */
254ca1c9b0cSelric
255b9d004c6Schristos fprintf(f, "#if !defined(__has_extension)\n");
256b9d004c6Schristos fprintf(f, "#define __has_extension(x) 0\n");
257b9d004c6Schristos fprintf(f, "#endif\n\n");
258b9d004c6Schristos
259b9d004c6Schristos fprintf(f, "#ifndef KRB5TYPES_REQUIRE_GNUC\n");
260b9d004c6Schristos fprintf(f, "#define KRB5TYPES_REQUIRE_GNUC(m,n,p) \\\n");
261b9d004c6Schristos fprintf(f, " (((__GNUC__ * 10000) + (__GNUC_MINOR__ * 100) + __GNUC_PATCHLEVEL__) >= \\\n");
262b9d004c6Schristos fprintf(f, " (((m) * 10000) + ((n) * 100) + (p)))\n");
263b9d004c6Schristos fprintf(f, "#endif\n\n");
264b9d004c6Schristos
265ca1c9b0cSelric fprintf(f, "#ifndef HEIMDAL_DEPRECATED\n");
266b9d004c6Schristos fprintf(f, "#if __has_extension(deprecated) || KRB5TYPES_REQUIRE_GNUC(3,1,0)\n");
267d3273b5bSchristos fprintf(f, "#define HEIMDAL_DEPRECATED __attribute__ ((__deprecated__))\n");
268ca1c9b0cSelric fprintf(f, "#elif defined(_MSC_VER) && (_MSC_VER>1200)\n");
269ca1c9b0cSelric fprintf(f, "#define HEIMDAL_DEPRECATED __declspec(deprecated)\n");
270ca1c9b0cSelric fprintf(f, "#else\n");
271ca1c9b0cSelric fprintf(f, "#define HEIMDAL_DEPRECATED\n");
272ca1c9b0cSelric fprintf(f, "#endif\n");
273b9d004c6Schristos fprintf(f, "#endif\n\n");
274ca1c9b0cSelric
275ca1c9b0cSelric fprintf(f, "#ifndef HEIMDAL_PRINTF_ATTRIBUTE\n");
276b9d004c6Schristos fprintf(f, "#if __has_extension(format) || KRB5TYPES_REQUIRE_GNUC(3,1,0)\n");
277d3273b5bSchristos fprintf(f, "#define HEIMDAL_PRINTF_ATTRIBUTE(x) __attribute__ ((__format__ x))\n");
278ca1c9b0cSelric fprintf(f, "#else\n");
279ca1c9b0cSelric fprintf(f, "#define HEIMDAL_PRINTF_ATTRIBUTE(x)\n");
280ca1c9b0cSelric fprintf(f, "#endif\n");
281b9d004c6Schristos fprintf(f, "#endif\n\n");
282ca1c9b0cSelric
283ca1c9b0cSelric fprintf(f, "#ifndef HEIMDAL_NORETURN_ATTRIBUTE\n");
284b9d004c6Schristos fprintf(f, "#if __has_extension(noreturn) || KRB5TYPES_REQUIRE_GNUC(3,1,0)\n");
285d3273b5bSchristos fprintf(f, "#define HEIMDAL_NORETURN_ATTRIBUTE __attribute__ ((__noreturn__))\n");
286ca1c9b0cSelric fprintf(f, "#else\n");
287ca1c9b0cSelric fprintf(f, "#define HEIMDAL_NORETURN_ATTRIBUTE\n");
288ca1c9b0cSelric fprintf(f, "#endif\n");
289b9d004c6Schristos fprintf(f, "#endif\n\n");
290ca1c9b0cSelric
2914f77a458Spettai fprintf(f, "#ifndef HEIMDAL_UNUSED_ATTRIBUTE\n");
292b9d004c6Schristos fprintf(f, "#if __has_extension(unused) || KRB5TYPES_REQUIRE_GNUC(3,1,0)\n");
293d3273b5bSchristos fprintf(f, "#define HEIMDAL_UNUSED_ATTRIBUTE __attribute__ ((__unused__))\n");
2944f77a458Spettai fprintf(f, "#else\n");
2954f77a458Spettai fprintf(f, "#define HEIMDAL_UNUSED_ATTRIBUTE\n");
2964f77a458Spettai fprintf(f, "#endif\n");
297b9d004c6Schristos fprintf(f, "#endif\n\n");
298b9d004c6Schristos
299b9d004c6Schristos fprintf(f, "#ifndef HEIMDAL_WARN_UNUSED_RESULT_ATTRIBUTE\n");
300b9d004c6Schristos fprintf(f, "#if __has_extension(warn_unused_result) || KRB5TYPES_REQUIRE_GNUC(3,3,0)\n");
301d3273b5bSchristos fprintf(f, "#define HEIMDAL_WARN_UNUSED_RESULT_ATTRIBUTE __attribute__ ((__warn_unused_result__))\n");
302b9d004c6Schristos fprintf(f, "#else\n");
303b9d004c6Schristos fprintf(f, "#define HEIMDAL_WARN_UNUSED_RESULT_ATTRIBUTE\n");
3044f77a458Spettai fprintf(f, "#endif\n");
305b9d004c6Schristos fprintf(f, "#endif\n\n");
3064f77a458Spettai
307ca1c9b0cSelric fprintf(f, "#endif /* %s */\n", hb);
308ca1c9b0cSelric
309ca1c9b0cSelric if (f != stdout)
310ca1c9b0cSelric fclose(f);
311ca1c9b0cSelric return 0;
312ca1c9b0cSelric }
313