155682Smarkm/* 2233294Sstas * Copyright (c) 1997-2002 Kungliga Tekniska H��gskolan 3233294Sstas * (Royal Institute of Technology, Stockholm, Sweden). 4233294Sstas * All rights reserved. 555682Smarkm * 6233294Sstas * Portions Copyright (c) 2010 Apple Inc. All rights reserved. 755682Smarkm * 8233294Sstas * Redistribution and use in source and binary forms, with or without 9233294Sstas * modification, are permitted provided that the following conditions 10233294Sstas * are met: 1155682Smarkm * 12233294Sstas * 1. Redistributions of source code must retain the above copyright 13233294Sstas * notice, this list of conditions and the following disclaimer. 1455682Smarkm * 15233294Sstas * 2. Redistributions in binary form must reproduce the above copyright 16233294Sstas * notice, this list of conditions and the following disclaimer in the 17233294Sstas * documentation and/or other materials provided with the distribution. 1855682Smarkm * 19233294Sstas * 3. Neither the name of the Institute nor the names of its contributors 20233294Sstas * may be used to endorse or promote products derived from this software 21233294Sstas * without specific prior written permission. 22233294Sstas * 23233294Sstas * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 24233294Sstas * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25233294Sstas * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26233294Sstas * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 27233294Sstas * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28233294Sstas * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29233294Sstas * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30233294Sstas * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31233294Sstas * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32233294Sstas * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33233294Sstas * SUCH DAMAGE. 3455682Smarkm */ 3555682Smarkm 3655682Smarkm#ifdef HAVE_CONFIG_H 3755682Smarkm#include <config.h> 38233294SstasRCSID("$Id$"); 3955682Smarkm#endif 4055682Smarkm#include <stdio.h> 4155682Smarkm#include <string.h> 4255682Smarkm#include <stdlib.h> 4355682Smarkm#include <ctype.h> 44233294Sstas#ifdef WIN32 45233294Sstas#include <winsock2.h> 46233294Sstas#include <ws2tcpip.h> 47233294Sstas#endif 4855682Smarkm 4955682Smarkm#define BITSIZE(TYPE) \ 5055682Smarkm{ \ 51102644Snectar int b = 0; TYPE x = 1, zero = 0; const char *pre = "u"; \ 5255682Smarkm char tmp[128], tmp2[128]; \ 5355682Smarkm while(x){ x <<= 1; b++; if(x < zero) pre=""; } \ 5455682Smarkm if(b >= len){ \ 55233294Sstas size_t tabs; \ 5655682Smarkm sprintf(tmp, "%sint%d_t" , pre, len); \ 5755682Smarkm sprintf(tmp2, "typedef %s %s;", #TYPE, tmp); \ 5855682Smarkm tabs = 5 - strlen(tmp2) / 8; \ 5955682Smarkm fprintf(f, "%s", tmp2); \ 6055682Smarkm while(tabs-- > 0) fprintf(f, "\t"); \ 6155682Smarkm fprintf(f, "/* %2d bits */\n", b); \ 6255682Smarkm return; \ 6355682Smarkm } \ 6455682Smarkm} 6555682Smarkm 6672445Sassar#ifndef HAVE___ATTRIBUTE__ 6772445Sassar#define __attribute__(x) 6872445Sassar#endif 6972445Sassar 7055682Smarkmstatic void 7172445Sassartry_signed(FILE *f, int len) __attribute__ ((unused)); 7272445Sassar 7372445Sassarstatic void 7472445Sassartry_unsigned(FILE *f, int len) __attribute__ ((unused)); 7572445Sassar 7672445Sassarstatic int 7772445Sassarprint_bt(FILE *f, int flag) __attribute__ ((unused)); 7872445Sassar 7972445Sassarstatic void 8055682Smarkmtry_signed(FILE *f, int len) 8155682Smarkm{ 8255682Smarkm BITSIZE(signed char); 8355682Smarkm BITSIZE(short); 8455682Smarkm BITSIZE(int); 8555682Smarkm BITSIZE(long); 8655682Smarkm#ifdef HAVE_LONG_LONG 8755682Smarkm BITSIZE(long long); 8855682Smarkm#endif 8955682Smarkm fprintf(f, "/* There is no %d bit type */\n", len); 9055682Smarkm} 9155682Smarkm 9255682Smarkmstatic void 9355682Smarkmtry_unsigned(FILE *f, int len) 9455682Smarkm{ 9555682Smarkm BITSIZE(unsigned char); 9655682Smarkm BITSIZE(unsigned short); 9755682Smarkm BITSIZE(unsigned int); 9855682Smarkm BITSIZE(unsigned long); 9955682Smarkm#ifdef HAVE_LONG_LONG 10055682Smarkm BITSIZE(unsigned long long); 10155682Smarkm#endif 10255682Smarkm fprintf(f, "/* There is no %d bit type */\n", len); 10355682Smarkm} 10455682Smarkm 10555682Smarkmstatic int 10655682Smarkmprint_bt(FILE *f, int flag) 10755682Smarkm{ 10855682Smarkm if(flag == 0){ 10955682Smarkm fprintf(f, "/* For compatibility with various type definitions */\n"); 11055682Smarkm fprintf(f, "#ifndef __BIT_TYPES_DEFINED__\n"); 11155682Smarkm fprintf(f, "#define __BIT_TYPES_DEFINED__\n"); 11255682Smarkm fprintf(f, "\n"); 11355682Smarkm } 11455682Smarkm return 1; 11555682Smarkm} 11655682Smarkm 11755682Smarkmint main(int argc, char **argv) 11855682Smarkm{ 11955682Smarkm FILE *f; 12055682Smarkm int flag; 121178825Sdfr const char *fn, *hb; 122233294Sstas 123178825Sdfr if (argc > 1 && strcmp(argv[1], "--version") == 0) { 124178825Sdfr printf("some version"); 125178825Sdfr return 0; 126178825Sdfr } 127178825Sdfr 12855682Smarkm if(argc < 2){ 12955682Smarkm fn = "bits.h"; 13055682Smarkm hb = "__BITS_H__"; 13155682Smarkm f = stdout; 13255682Smarkm } else { 13355682Smarkm char *p; 13455682Smarkm fn = argv[1]; 135178825Sdfr p = malloc(strlen(fn) + 5); 136178825Sdfr sprintf(p, "__%s__", fn); 137178825Sdfr hb = p; 138178825Sdfr for(; *p; p++){ 13955682Smarkm if(!isalnum((unsigned char)*p)) 14055682Smarkm *p = '_'; 14155682Smarkm } 14255682Smarkm f = fopen(argv[1], "w"); 14355682Smarkm } 14455682Smarkm fprintf(f, "/* %s -- this file was generated for %s by\n", fn, HOST); 145233294Sstas fprintf(f, " %*s %s */\n\n", (int)strlen(fn), "", 146233294Sstas "$Id$"); 14755682Smarkm fprintf(f, "#ifndef %s\n", hb); 14855682Smarkm fprintf(f, "#define %s\n", hb); 14955682Smarkm fprintf(f, "\n"); 150102644Snectar#ifdef HAVE_INTTYPES_H 151102644Snectar fprintf(f, "#include <inttypes.h>\n"); 152102644Snectar#endif 15355682Smarkm#ifdef HAVE_SYS_TYPES_H 15455682Smarkm fprintf(f, "#include <sys/types.h>\n"); 15555682Smarkm#endif 15655682Smarkm#ifdef HAVE_SYS_BITYPES_H 15755682Smarkm fprintf(f, "#include <sys/bitypes.h>\n"); 15855682Smarkm#endif 15955682Smarkm#ifdef HAVE_BIND_BITYPES_H 16055682Smarkm fprintf(f, "#include <bind/bitypes.h>\n"); 16155682Smarkm#endif 16255682Smarkm#ifdef HAVE_NETINET_IN6_MACHTYPES_H 16355682Smarkm fprintf(f, "#include <netinet/in6_machtypes.h>\n"); 16455682Smarkm#endif 165102644Snectar#ifdef HAVE_SOCKLEN_T 166233294Sstas#ifndef WIN32 167102644Snectar fprintf(f, "#include <sys/socket.h>\n"); 168233294Sstas#else 169233294Sstas fprintf(f, "#include <winsock2.h>\n"); 170233294Sstas fprintf(f, "#include <ws2tcpip.h>\n"); 171102644Snectar#endif 172233294Sstas#endif 17355682Smarkm fprintf(f, "\n"); 17455682Smarkm 17555682Smarkm flag = 0; 17655682Smarkm#ifndef HAVE_INT8_T 17755682Smarkm flag = print_bt(f, flag); 17855682Smarkm try_signed (f, 8); 17955682Smarkm#endif /* HAVE_INT8_T */ 18055682Smarkm#ifndef HAVE_INT16_T 18155682Smarkm flag = print_bt(f, flag); 18255682Smarkm try_signed (f, 16); 18355682Smarkm#endif /* HAVE_INT16_T */ 18455682Smarkm#ifndef HAVE_INT32_T 18555682Smarkm flag = print_bt(f, flag); 18655682Smarkm try_signed (f, 32); 18755682Smarkm#endif /* HAVE_INT32_T */ 18855682Smarkm#ifndef HAVE_INT64_T 18955682Smarkm flag = print_bt(f, flag); 19055682Smarkm try_signed (f, 64); 19155682Smarkm#endif /* HAVE_INT64_T */ 19255682Smarkm 19372445Sassar#ifndef HAVE_UINT8_T 19472445Sassar flag = print_bt(f, flag); 19572445Sassar try_unsigned (f, 8); 19672445Sassar#endif /* HAVE_UINT8_T */ 19772445Sassar#ifndef HAVE_UINT16_T 19872445Sassar flag = print_bt(f, flag); 19972445Sassar try_unsigned (f, 16); 20072445Sassar#endif /* HAVE_UINT16_T */ 20172445Sassar#ifndef HAVE_UINT32_T 20272445Sassar flag = print_bt(f, flag); 20372445Sassar try_unsigned (f, 32); 20472445Sassar#endif /* HAVE_UINT32_T */ 20572445Sassar#ifndef HAVE_UINT64_T 20672445Sassar flag = print_bt(f, flag); 20772445Sassar try_unsigned (f, 64); 20872445Sassar#endif /* HAVE_UINT64_T */ 20972445Sassar 21072445Sassar#define X(S) fprintf(f, "typedef uint" #S "_t u_int" #S "_t;\n") 21155682Smarkm#ifndef HAVE_U_INT8_T 21255682Smarkm flag = print_bt(f, flag); 21372445Sassar X(8); 21472445Sassar#endif /* HAVE_U_INT8_T */ 21555682Smarkm#ifndef HAVE_U_INT16_T 21655682Smarkm flag = print_bt(f, flag); 21772445Sassar X(16); 21855682Smarkm#endif /* HAVE_U_INT16_T */ 21955682Smarkm#ifndef HAVE_U_INT32_T 22055682Smarkm flag = print_bt(f, flag); 22172445Sassar X(32); 22255682Smarkm#endif /* HAVE_U_INT32_T */ 22355682Smarkm#ifndef HAVE_U_INT64_T 22455682Smarkm flag = print_bt(f, flag); 22572445Sassar X(64); 22655682Smarkm#endif /* HAVE_U_INT64_T */ 22755682Smarkm 22855682Smarkm if(flag){ 22955682Smarkm fprintf(f, "\n"); 23055682Smarkm fprintf(f, "#endif /* __BIT_TYPES_DEFINED__ */\n\n"); 23155682Smarkm } 232102644Snectar#ifdef KRB5 233102644Snectar fprintf(f, "\n"); 234102644Snectar#if defined(HAVE_SOCKLEN_T) 235102644Snectar fprintf(f, "typedef socklen_t krb5_socklen_t;\n"); 236102644Snectar#else 237102644Snectar fprintf(f, "typedef int krb5_socklen_t;\n"); 238102644Snectar#endif 239102644Snectar#if defined(HAVE_SSIZE_T) 240102644Snectar#ifdef HAVE_UNISTD_H 241102644Snectar fprintf(f, "#include <unistd.h>\n"); 242102644Snectar#endif 243102644Snectar fprintf(f, "typedef ssize_t krb5_ssize_t;\n"); 244102644Snectar#else 245102644Snectar fprintf(f, "typedef int krb5_ssize_t;\n"); 246102644Snectar#endif 247102644Snectar fprintf(f, "\n"); 248233294Sstas 249233294Sstas#if defined(_WIN32) 250233294Sstas fprintf(f, "typedef SOCKET krb5_socket_t;\n"); 251233294Sstas#else 252233294Sstas fprintf(f, "typedef int krb5_socket_t;\n"); 253233294Sstas#endif 254233294Sstas fprintf(f, "\n"); 255233294Sstas 256102644Snectar#endif /* KRB5 */ 257233294Sstas 258233294Sstas fprintf(f, "#ifndef HEIMDAL_DEPRECATED\n"); 259233294Sstas fprintf(f, "#if defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1 )))\n"); 260233294Sstas fprintf(f, "#define HEIMDAL_DEPRECATED __attribute__((deprecated))\n"); 261233294Sstas fprintf(f, "#elif defined(_MSC_VER) && (_MSC_VER>1200)\n"); 262233294Sstas fprintf(f, "#define HEIMDAL_DEPRECATED __declspec(deprecated)\n"); 263233294Sstas fprintf(f, "#else\n"); 264233294Sstas fprintf(f, "#define HEIMDAL_DEPRECATED\n"); 265233294Sstas fprintf(f, "#endif\n"); 266233294Sstas fprintf(f, "#endif\n"); 267233294Sstas 268233294Sstas fprintf(f, "#ifndef HEIMDAL_PRINTF_ATTRIBUTE\n"); 269233294Sstas fprintf(f, "#if defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1 )))\n"); 270233294Sstas fprintf(f, "#define HEIMDAL_PRINTF_ATTRIBUTE(x) __attribute__((format x))\n"); 271233294Sstas fprintf(f, "#else\n"); 272233294Sstas fprintf(f, "#define HEIMDAL_PRINTF_ATTRIBUTE(x)\n"); 273233294Sstas fprintf(f, "#endif\n"); 274233294Sstas fprintf(f, "#endif\n"); 275233294Sstas 276233294Sstas fprintf(f, "#ifndef HEIMDAL_NORETURN_ATTRIBUTE\n"); 277233294Sstas fprintf(f, "#if defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1 )))\n"); 278233294Sstas fprintf(f, "#define HEIMDAL_NORETURN_ATTRIBUTE __attribute__((noreturn))\n"); 279233294Sstas fprintf(f, "#else\n"); 280233294Sstas fprintf(f, "#define HEIMDAL_NORETURN_ATTRIBUTE\n"); 281233294Sstas fprintf(f, "#endif\n"); 282233294Sstas fprintf(f, "#endif\n"); 283233294Sstas 284233294Sstas fprintf(f, "#ifndef HEIMDAL_UNUSED_ATTRIBUTE\n"); 285233294Sstas fprintf(f, "#if defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1 )))\n"); 286233294Sstas fprintf(f, "#define HEIMDAL_UNUSED_ATTRIBUTE __attribute__((unused))\n"); 287233294Sstas fprintf(f, "#else\n"); 288233294Sstas fprintf(f, "#define HEIMDAL_UNUSED_ATTRIBUTE\n"); 289233294Sstas fprintf(f, "#endif\n"); 290233294Sstas fprintf(f, "#endif\n"); 291233294Sstas 29255682Smarkm fprintf(f, "#endif /* %s */\n", hb); 293233294Sstas 294233294Sstas if (f != stdout) 295233294Sstas fclose(f); 29655682Smarkm return 0; 29755682Smarkm} 298