|
|
1.1 ! root 1: /*ident "@(#)ctrans:szal.c 1.4.1.2" */ ! 2: /******************************************************************* ! 3: ! 4: Copyright (c) 1986 AT&T, Inc. All Rights Reserved ! 5: THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T, INC. ! 6: ! 7: szal.c: ! 8: ! 9: C program to run on a machine to write a size/align file for ! 10: the C++ translator. ! 11: ! 12: Most output line are on the form: ! 13: typeX sizeof(typeX) alignment_requirement_for_typeX ! 14: assumes ! 15: ! 16: - that ``double d0; char c0;'' poses the worst alignment condition ! 17: - two's complement integer representation ! 18: - that a word is defined by a :0 field ! 19: ! 20: *****************************************************************************/ ! 21: ! 22: #include <stdio.h> ! 23: ! 24: typedef int (*PF)(); ! 25: struct st1 { char a; }; ! 26: struct ss { ! 27: double a0; char c0; ! 28: char c1; ! 29: double a00; char c00; ! 30: short s1; ! 31: double a2; char c2; ! 32: int i1; ! 33: double a3; char c3; ! 34: long l1; ! 35: double a4; char c4; ! 36: float f1; ! 37: double a6; char c5; ! 38: double d1; ! 39: double a7; char c6; ! 40: char* p1; ! 41: double a8; char c7; ! 42: struct ss * p2; ! 43: double a9; char c8; ! 44: struct st1 oo; ! 45: double a10; char c9; ! 46: PF pf; ! 47: } oo; ! 48: struct st5 { char a; int :0; }; /* by definition: a word */ ! 49: struct st2 { char :2; }; ! 50: struct st3 { int :2; }; ! 51: struct st4 { char :2; char :2; }; ! 52: ! 53: struct st6 { char v[3]; char : 2; }; /* fits in 4 bytes */ ! 54: struct st7 { char v[3]; int : 2; }; /* might not */ ! 55: struct st8 { char v[3]; char : 2; char : 2; }; ! 56: ! 57: struct st9 { char v[7]; char : 2; }; /* fits in 8 bytes */ ! 58: struct st10 { char v[7]; int : 2; }; /* might not */ ! 59: struct st11 { char v[7]; char : 2; char : 2; }; ! 60: ! 61: out(s,a1) char* s; int a1; ! 62: { ! 63: printf("%s %d\n",s,a1); ! 64: } ! 65: ! 66: outstr(s,str2) char* s; char* str2; ! 67: { ! 68: printf("%s \"%s\"\n",s,str2); ! 69: } ! 70: ! 71: int a123456789 = 1; /* if this does not compile get a better C compiler */ ! 72: int a123456780 = 2; ! 73: ! 74: ! 75: main() ! 76: { ! 77: char largest[50]; ! 78: char c = 1; ! 79: int i1 = 0; ! 80: int i2 = 0; ! 81: long i = 1L; ! 82: unsigned int large; ! 83: ! 84: if (a123456789 == a123456780) ! 85: fprintf(stderr,"Warning: Your C compiler is dangerous.\nIt strips trailing characters off long identifiers without warning.\nGet a new one\n"); ! 86: ! 87: while (c) { c<<=1; c&=~1; i1++; } /* i1 = #bits in byte */ ! 88: ! 89: if (sizeof(struct st5) == sizeof(char)) /* i2 = #bits in word */ ! 90: i2 = i1; ! 91: else if (sizeof(struct st5) == sizeof(short)) { ! 92: short i = 1; ! 93: while (i) { i<<=1; i&=~1; i2++; } ! 94: } ! 95: else if (sizeof(struct st5) == sizeof(int)) ! 96: while (i) { i<<=1; i&=~1; i2++; } ! 97: else if (sizeof(struct st5) == sizeof(long)) { ! 98: long i = 1; ! 99: while (i) { i<<=1; i&=~1; i2++; } ! 100: } ! 101: else { ! 102: fprintf(stderr,"Warning: Your C compiler probably handles 0 lengths fields wrong\n"); ! 103: i = sizeof(int); ! 104: } ! 105: ! 106: out("#define DBI_IN_WORD",i2); ! 107: out("#define DBI_IN_BYTE",i1); ! 108: out("#define DSZ_CHAR",sizeof(char)); ! 109: out("#define DAL_CHAR",(int)&oo.c1-(int)&oo.c0); ! 110: out("#define DSZ_SHORT",sizeof(short)); ! 111: out("#define DAL_SHORT",(int)&oo.s1-(int)&oo.c00); ! 112: out("#define DSZ_INT",sizeof(int)); ! 113: out("#define DAL_INT",(int)&oo.i1-(int)&oo.c2); ! 114: out("#define DSZ_LONG",sizeof(long)); ! 115: out("#define DAL_LONG",(int)&oo.l1-(int)&oo.c3); ! 116: out("#define DSZ_FLOAT",sizeof(float)); ! 117: out("#define DAL_FLOAT",(int)&oo.f1-(int)&oo.c4); ! 118: out("#define DSZ_DOUBLE",sizeof(double)); ! 119: out("#define DAL_DOUBLE",(int)&oo.d1-(int)&oo.c5); ! 120: /* next two should just be repeats of above two */ ! 121: out("#define DSZ_LDOUBLE",sizeof(double)); ! 122: out("#define DAL_LDOUBLE",(int)&oo.d1-(int)&oo.c5); ! 123: i = 1<<(sizeof(char*)*i1-2); ! 124: if (i<400*1024L) ! 125: fprintf(stderr,"Pointers to data too small to handle C++\n"); ! 126: ! 127: i = 1<<(sizeof(PF)*i1-2); ! 128: if (i<250*1024L) ! 129: fprintf(stderr,"Pointers to functions too small to handle C++\n"); ! 130: /* out("fptr",sizeof(PF),(int)&oo.pf-(int)&oo.c9,0); */ ! 131: if (sizeof(PF)!=sizeof(struct ss*)) ! 132: fprintf(stderr,"Cannot handle sizeof(pointer to function) != sizeof(pointer to struct)\n"); ! 133: out("#define DSZ_STRUCT",sizeof(struct st1)); ! 134: out("#define DAL_STRUCT",(int)&oo.oo-(int)&oo.c8); ! 135: out("#define DSZ_WORD",sizeof(struct st5)); ! 136: out("#define DSZ_WPTR",sizeof(struct ss *)); ! 137: out("#define DAL_WPTR",(int)&oo.p2-(int)&oo.c7); ! 138: out("#define DSZ_BPTR",sizeof(char*)); ! 139: out("#define DAL_BPTR",(int)&oo.p1-(int)&oo.c6); ! 140: large = (unsigned)~0; ! 141: large = large >> 1; ! 142: sprintf(largest,"%d",large); /* largest integer */ ! 143: outstr("#define DLARGEST_INT",largest); ! 144: switch (sizeof(struct st1)) { ! 145: case 1: ! 146: i1 = sizeof(struct st2)!=sizeof(struct st3); ! 147: i2 = sizeof(struct st2)==sizeof(struct st4); ! 148: break; ! 149: case 2: ! 150: i1 = sizeof(struct st6)!=sizeof(struct st7); ! 151: i2 = sizeof(struct st6)==sizeof(struct st8); ! 152: break; ! 153: case 4: ! 154: i1 = sizeof(struct st9)!=sizeof(struct st10); ! 155: i2 = sizeof(struct st9)==sizeof(struct st11); ! 156: break; ! 157: default: ! 158: fprintf(stderr,"Cannot figure out if field sizes are sensitive to the type of fields\n"); ! 159: } ! 160: out("#define DF_SENSITIVE",i1); /* sensitive to field type */ ! 161: out("#define DF_OPTIMIZED",i2); /* packs fields */ ! 162: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.