📄 enquire.c
字号:
}Procedure bitpattern(p, size) char *p; unsigned int size; { /* Printf the bit-pattern of p */ char c; int i, j; for (i=1; i<=size; i++) { c= *p; p++; for (j=bits_per_byte-1; j>=0; j--) printf("%c", (c>>j)&1 ? '1' : '0'); if (i!=size) printf(" "); }}#define Order(x, px, mode)\ printf("%s%s ", co, mode); for (i=0; i<sizeof(x); i++) px[i]= ab[i]; \ for (i=1; i<=sizeof(x); i++) { c=((x>>(bits_per_byte*(sizeof(x)-i)))&mask);\ putchar(c==0 ? '?' : (char)c); }\ printf("%s\n", oc);Procedure endian(bits_per_byte) int bits_per_byte; { /* Printf the byte-order used on this machine */ /*unsigned*/ short s=0; /*unsigned*/ int j=0; /*unsigned*/ long l=0; char *ps= (char *) &s, *pj= (char *) &j, *pl= (char *) &l, *ab= "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; unsigned int mask, i, c; mask=0; for (i=1; i<=(unsigned)bits_per_byte; i++) mask= (mask<<1)|1; if (V) { printf("%sCHARACTER ORDER%s\n", co, oc); Order(s, ps, "short:"); Order(j, pj, "int: "); Order(l, pl, "long: "); }}Procedure missing(s) char *s; { printf("%s*** #define %s missing from limits.h%s\n", co, s, oc); bugs++;}Procedure fmissing(s) char *s; { printf("%s*** #define %s missing from float.h%s\n", co, s, oc); bugs++;}/* To try and fool optimisers */int false() { return 0; }#define Promoted(x) (false()?(x):(-1))#define is_signed(x) (Promoted(x) < 0)#define sign_of(x) ((x)?"signed":"unsigned")#define Signed 1#define Unsigned 0#define sgn(x) ((is_signed(x))?Signed:Unsigned)#define showtype(t, x) Vprintf("%s%s %s %s%s\n", co, t, sign_of(is_signed(x)), type_of(sizeof(x)), oc)char *type_of(x) int x; { if (x == sizeof(char)) { if (sizeof(char) == sizeof(int)) return "char/short/int"; if (sizeof(char) == sizeof(short)) return "char/short"; return "char"; } if (x == sizeof(short)) { if (sizeof(short) == sizeof(int)) return "short/int"; return "short"; } if (x == sizeof(int)) { if (sizeof(int) == sizeof(long)) return "int/long"; return "int"; } if (x == sizeof(long)) return "long"; return "unknown-type";}char *ftype_of(x) int x; { if (x == sizeof(float)) { return "float"; } if (x == sizeof(double)) { if (sizeof(double) == sizeof(Long_double)) return "(long)double"; return "double"; } if (x == sizeof(Long_double)) { return "long double"; } return "unknown-type";}Procedure typerr(name, esign, esize, sign, size) char *name; int esign, esize, sign, size;{ Vprintf("*** %s has wrong type: expected %s %s, found %s %s\n", name, sign_of(esign), type_of(esize), sign_of(sign), type_of(size));}Procedure ftyperr(name, esize, size) char *name; int esize, size; { Vprintf("*** %s has wrong type: expected %s, found %s\n", name, ftype_of(esize), ftype_of(size));}int promotions() { int si = 0; long sl = 0; unsigned int ui; unsigned long ul; short ss; unsigned short us; Vprintf("\n%sPROMOTIONS%s\n", co, oc); if ( /* Possible warnings here; no problem */ (sizeof(Promoted(si)) != sizeof(int)) || (sizeof(Promoted(sl)) != sizeof(long)) || (sizeof(Promoted(ss)) != sizeof(int)) || (sizeof(Promoted(ui)) != sizeof(int)) || (sizeof(Promoted(ul)) != sizeof(long)) || (sizeof(Promoted(us)) != sizeof(int)) || is_signed(ui) || is_signed(ul) || !is_signed(si) || !is_signed(sl) ) { eek_a_bug("promotions don't work properly in conditional expressions\n"); } showtype("unsigned short promotes to", Promoted((unsigned short)0)); showtype("long+unsigned gives", sl+ui); return 0;}#define checktype(x, n, s, t) if((sgn(x)!=s)||(sizeof(x)!=sizeof(t))) typerr(n, s, sizeof(t), sign_of(x), sizeof(x));#define fchecktype(x, n, t) if (sizeof(x) != sizeof(t)) ftyperr(n, sizeof(x), sizeof(t));Procedure check_defines() { /* ensure that all #defines are present and have the correct type */#ifdef VERIFY int usign;#ifdef NO_UI usign= Signed;#else /* Implementations promote unsigned short differently */ usign= is_signed((unsigned short)0);#endif if (L) {#ifdef CHAR_BIT checktype(CHAR_BIT, "CHAR_BIT", Signed, int);#else missing("CHAR_BIT");#endif#ifdef CHAR_MAX checktype(CHAR_MAX, "CHAR_MAX", Signed, int);#else missing("CHAR_MAX");#endif#ifdef CHAR_MIN checktype(CHAR_MIN, "CHAR_MIN", Signed, int);#else missing("CHAR_MIN");#endif#ifdef SCHAR_MAX checktype(SCHAR_MAX, "SCHAR_MAX", Signed, int);#else missing("SCHAR_MAX");#endif#ifdef SCHAR_MIN checktype(SCHAR_MIN, "SCHAR_MIN", Signed, int);#else missing("SCHAR_MIN");#endif#ifdef UCHAR_MAX checktype(UCHAR_MAX, "UCHAR_MAX", Signed, int);#else missing("UCHAR_MAX");#endif#ifdef SHRT_MAX checktype(SHRT_MAX, "SHRT_MAX", Signed, int);#else missing("SHRT_MAX");#endif#ifdef SHRT_MIN checktype(SHRT_MIN, "SHRT_MIN", Signed, int);#else missing("SHRT_MIN");#endif#ifdef INT_MAX checktype(INT_MAX, "INT_MAX", Signed, int);#else missing("INT_MAX");#endif#ifdef INT_MIN checktype(INT_MIN, "INT_MIN", Signed, int);#else missing("INT_MIN");#endif#ifdef LONG_MAX checktype(LONG_MAX, "LONG_MAX", Signed, long);#else missing("LONG_MAX");#endif#ifdef LONG_MIN checktype(LONG_MIN, "LONG_MIN", Signed, long);#else missing("LONG_MIN");#endif#ifdef USHRT_MAX checktype(USHRT_MAX, "USHRT_MAX", usign, int);#else missing("USHRT_MAX");#endif#ifdef UINT_MAX checktype(UINT_MAX, "UINT_MAX", Unsigned, int);#else missing("UINT_MAX");#endif#ifdef ULONG_MAX checktype(ULONG_MAX, "ULONG_MAX", Unsigned, long);#else missing("ULONG_MAX");#endif } /* if (L) */ if (F) {#ifdef FLT_RADIX checktype(FLT_RADIX, "FLT_RADIX", Signed, int);#else fmissing("FLT_RADIX");#endif#ifdef FLT_MANT_DIG checktype(FLT_MANT_DIG, "FLT_MANT_DIG", Signed, int);#else fmissing("FLT_MANT_DIG");#endif#ifdef FLT_DIG checktype(FLT_DIG, "FLT_DIG", Signed, int);#else fmissing("FLT_DIG");#endif#ifdef FLT_ROUNDS checktype(FLT_ROUNDS, "FLT_ROUNDS", Signed, int);#else fmissing("FLT_ROUNDS");#endif#ifdef FLT_EPSILON fchecktype(FLT_EPSILON, "FLT_EPSILON", float);#else fmissing("FLT_EPSILON");#endif#ifdef FLT_MIN_EXP checktype(FLT_MIN_EXP, "FLT_MIN_EXP", Signed, int);#else fmissing("FLT_MIN_EXP");#endif#ifdef FLT_MIN fchecktype(FLT_MIN, "FLT_MIN", float);#else fmissing("FLT_MIN");#endif#ifdef FLT_MIN_10_EXP checktype(FLT_MIN_10_EXP, "FLT_MIN_10_EXP", Signed, int);#else fmissing("FLT_MIN_10_EXP");#endif#ifdef FLT_MAX_EXP checktype(FLT_MAX_EXP, "FLT_MAX_EXP", Signed, int);#else fmissing("FLT_MAX_EXP");#endif#ifdef FLT_MAX fchecktype(FLT_MAX, "FLT_MAX", float);#else fmissing("FLT_MAX");#endif#ifdef FLT_MAX_10_EXP checktype(FLT_MAX_10_EXP, "FLT_MAX_10_EXP", Signed, int);#else fmissing("FLT_MAX_10_EXP");#endif#ifdef DBL_MANT_DIG checktype(DBL_MANT_DIG, "DBL_MANT_DIG", Signed, int);#else fmissing("DBL_MANT_DIG");#endif#ifdef DBL_DIG checktype(DBL_DIG, "DBL_DIG", Signed, int);#else fmissing("DBL_DIG");#endif#ifdef DBL_EPSILON fchecktype(DBL_EPSILON, "DBL_EPSILON", double);#else fmissing("DBL_EPSILON");#endif#ifdef DBL_MIN_EXP checktype(DBL_MIN_EXP, "DBL_MIN_EXP", Signed, int);#else fmissing("DBL_MIN_EXP");#endif#ifdef DBL_MIN fchecktype(DBL_MIN, "DBL_MIN", double);#else fmissing("DBL_MIN");#endif#ifdef DBL_MIN_10_EXP checktype(DBL_MIN_10_EXP, "DBL_MIN_10_EXP", Signed, int);#else fmissing("DBL_MIN_10_EXP");#endif#ifdef DBL_MAX_EXP checktype(DBL_MAX_EXP, "DBL_MAX_EXP", Signed, int);#else fmissing("DBL_MAX_EXP");#endif#ifdef DBL_MAX fchecktype(DBL_MAX, "DBL_MAX", double);#else fmissing("DBL_MAX");#endif#ifdef DBL_MAX_10_EXP checktype(DBL_MAX_10_EXP, "DBL_MAX_10_EXP", Signed, int);#else fmissing("DBL_MAX_10_EXP");#endif#ifdef STDC#ifdef LDBL_MANT_DIG checktype(LDBL_MANT_DIG, "LDBL_MANT_DIG", Signed, int);#else fmissing("LDBL_MANT_DIG");#endif#ifdef LDBL_DIG checktype(LDBL_DIG, "LDBL_DIG", Signed, int);#else fmissing("LDBL_DIG");#endif#ifdef LDBL_EPSILON fchecktype(LDBL_EPSILON, "LDBL_EPSILON", long double);#else fmissing("LDBL_EPSILON");#endif#ifdef LDBL_MIN_EXP checktype(LDBL_MIN_EXP, "LDBL_MIN_EXP", Signed, int);#else fmissing("LDBL_MIN_EXP");#endif#ifdef LDBL_MIN fchecktype(LDBL_MIN, "LDBL_MIN", long double);#else fmissing("LDBL_MIN");#endif#ifdef LDBL_MIN_10_EXP checktype(LDBL_MIN_10_EXP, "LDBL_MIN_10_EXP", Signed, int);#else fmissing("LDBL_MIN_10_EXP");#endif#ifdef LDBL_MAX_EXP checktype(LDBL_MAX_EXP, "LDBL_MAX_EXP", Signed, int);#else fmissing("LDBL_MAX_EXP");#endif#ifdef LDBL_MAX fchecktype(LDBL_MAX, "LDBL_MAX", long double);#else fmissing("LDBL_MAX");#endif#ifdef LDBL_MAX_10_EXP checktype(LDBL_MAX_10_EXP, "LDBL_MAX_10_EXP", Signed, int);#else fmissing("LDBL_MAX_10_EXP");#endif#endif /* STDC */ } /* if (F) */#endif /* VERIFY */}#ifdef VERIFY#ifndef SCHAR_MAX#define SCHAR_MAX char_max#endif#ifndef SCHAR_MIN#define SCHAR_MIN char_min#endif#ifndef UCHAR_MAX#define UCHAR_MAX char_max#endif#endif /* VERIFY */#ifndef CHAR_BIT#define CHAR_BIT char_bit#endif#ifndef CHAR_MAX#define CHAR_MAX char_max#endif#ifndef CHAR_MIN#define CHAR_MIN char_min#endif#ifndef SCHAR_MAX#define SCHAR_MAX char_max#endif#ifndef SCHAR_MIN#define SCHAR_MIN char_min#endif#ifndef UCHAR_MAX#define UCHAR_MAX char_max#endifint cprop() { /* Properties of type char */ Volatile char c, char_max, char_min; Volatile int bits_per_byte, c_signed; long char_bit; Unexpected(2); /* Calculate number of bits per character *************************/ c=1; bits_per_byte=0; do { c=c<<1; bits_per_byte++; } while(c!=0); c= (char)(-1); if (((int)c)<0) c_signed=1; else c_signed=0; Vprintf("%schar = %d bits, %ssigned%s\n", co, (int)sizeof(c)*bits_per_byte, (c_signed?"":"un"), oc); char_bit=(long)(sizeof(c)*bits_per_byte); if (L) i_define(D_CHAR_BIT, "", "CHAR", "_BIT", char_bit, 0L, (long) CHAR_BIT, ""); c=0; char_max=0; c++; if (setjmp(lab)==0) { /* Yields char_max */ while (c>char_max) { char_max=c; c++; } } else { Vprintf("%sCharacter overflow generates a trap!%s\n", co, oc); } c=0; char_min=0; c--; if (setjmp(lab)==0) { /* Yields char_min */ while (c<char_min) { char_min=c; c--; } } if (c_signed && char_min == 0) { Vprintf("%sBEWARE! Chars are pseudo-unsigned:%s\n", co, oc); Vprintf("%s %s%s%s\n", "They contain only nonnegative values, ", "but sign extend when used as integers.", co, oc); } Unexpected(3); if (L) { /* Because of the integer promotions, you must use a U after the MAX_CHARS in the following cases */ if ((sizeof(char) == sizeof(int)) && !c_signed) { u_define(D_CHAR_MAX, "", "CHAR", "_MAX", (long) char_max, (long) CHAR_MAX, ""); } else { i_define(D_CHAR_MAX, "", "CHAR", "_MAX", (long) char_max, 0L, (long) CHAR_MAX, ""); } i_define(D_CHAR_MIN, "", "CHAR", "_MIN",
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -