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