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