|
|
1.1 root 1: /*ident "@(#)ctrans:src/size.c 1.1.4.3" */
2: /*********************************************************************
3:
4: C++ source for cfront, the C++ compiler front-end
5: written in the computer science research center of Bell Labs
6:
7: Copyright (c) 1984 AT&T, Inc. All rigths Reserved
8: THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T, INC.
9:
10: size.c:
11:
12: initialize alignment and sizeof "constants"
13:
14: **********************************************************************/
15:
16: #include "cfront.h"
17: #include "size.h"
18:
19: int BI_IN_WORD = DBI_IN_WORD;
20: int BI_IN_BYTE = DBI_IN_BYTE;
21: int SZ_CHAR = DSZ_CHAR;
22: int AL_CHAR = DAL_CHAR;
23: int SZ_SHORT = DSZ_SHORT;
24: int AL_SHORT = DAL_SHORT;
25: int SZ_INT = DSZ_INT;
26: int AL_INT = DAL_INT;
27: int SZ_LONG = DSZ_LONG;
28: int AL_LONG = DAL_LONG;
29: int SZ_FLOAT = DSZ_FLOAT;
30: int AL_FLOAT = DAL_FLOAT;
31: int SZ_DOUBLE = DSZ_DOUBLE;
32: int AL_DOUBLE = DAL_DOUBLE;
33: int SZ_LDOUBLE = DSZ_LDOUBLE;
34: int AL_LDOUBLE = DAL_LDOUBLE;
35: int SZ_STRUCT = DSZ_STRUCT;
36: int AL_STRUCT = DAL_STRUCT;
37: //int SZ_FRAME = DSZ_FRAME;
38: //int AL_FRAME = DAL_FRAME;
39: int SZ_WORD = DSZ_WORD;
40: int SZ_WPTR = DSZ_WPTR;
41: int AL_WPTR = DAL_WPTR;
42: int SZ_BPTR = DSZ_BPTR;
43: int AL_BPTR = DAL_BPTR;
44: //int SZ_TOP = DSZ_TOP;
45: //int SZ_BOTTOM = DSZ_BOTTOM;
46: char* LARGEST_INT = DLARGEST_INT;
47: int F_SENSITIVE = DF_SENSITIVE;
48: int F_OPTIMIZED = DF_OPTIMIZED;
49:
50: int arg1 = 0;
51: int arg2 = 0;
52:
53: int get_line(FILE* fp)
54: {
55: char s[32];
56:
57: if (fscanf(fp," %s %d %d",s,&arg1,&arg2) == EOF) return 0;
58: // fprintf(stderr,"xxx %s %d %d",s,arg1,arg2);
59: if (strcmp("char",s) == 0) {
60: SZ_CHAR = arg1;
61: AL_CHAR = arg2;
62: return 1;
63: }
64: if (strcmp("short",s) == 0) {
65: SZ_SHORT = arg1;
66: AL_SHORT = arg2;
67: return 1;
68: }
69: if (strcmp("int",s) == 0) {
70: SZ_INT = arg1;
71: AL_INT = arg2;
72: if (fscanf(fp," %s",s) == EOF) return 0;
73: LARGEST_INT = new char[strlen(s)+1];
74: strcpy(LARGEST_INT,s);
75: return 1;
76: }
77: if (strcmp("long",s) == 0) {
78: SZ_LONG = arg1;
79: AL_LONG = arg2;
80: return 1;
81: }
82: if (strcmp("float",s) == 0) {
83: SZ_FLOAT = arg1;
84: AL_FLOAT = arg2;
85: return 1;
86: }
87: if (strcmp("double",s) == 0) {
88: SZ_DOUBLE = arg1;
89: AL_DOUBLE = arg2;
90: return 1;
91: }
92: if (strcmp("ldouble",s) == 0) {
93: SZ_LDOUBLE = arg1;
94: AL_LDOUBLE = arg2;
95: return 1;
96: }
97: if (strcmp("bit",s) == 0) {
98: BI_IN_BYTE = arg1;
99: BI_IN_WORD = arg2;
100: return 1;
101: }
102: if (strcmp("struct",s) == 0) {
103: SZ_STRUCT = arg1;
104: AL_STRUCT = arg2;
105: return 1;
106: }
107: if (strcmp("struct2",s) == 0) {
108: F_SENSITIVE = arg1;
109: F_OPTIMIZED = arg2;
110: return 1;
111: }
112: if (strcmp("frame",s) == 0) {
113: // SZ_FRAME = arg1;
114: // AL_FRAME = arg2;
115: return 1;
116: }
117: if (strcmp("word",s) == 0) {
118: SZ_WORD = arg1;
119: return 1;
120: }
121: if (strcmp("wptr",s) == 0) {
122: SZ_WPTR = arg1;
123: AL_WPTR = arg2;
124: return 1;
125: }
126: if (strcmp("bptr",s) == 0) {
127: SZ_BPTR = arg1;
128: AL_BPTR = arg2;
129: return 1;
130: }
131: if (strcmp("top",s) == 0) {
132: // SZ_TOP = arg1;
133: // SZ_BOTTOM = arg2;
134: return 1;
135: }
136: return 0;
137: }
138:
139: int read_align(char* f)
140: {
141: char* p = f;
142: if (*p == 0) {
143: fprintf(stderr,"size/align file missing\n");
144: ext(1);
145: }
146: FILE* fp = fopen(f,"r");
147: if (fp == 0) return 1;
148: while (get_line(fp)) ;
149: return 0;
150: }
151: /*
152: print_align(char* s)
153: {
154: fprintf(stderr,"%s sizes and alignments\n\n",s);
155:
156: fprintf(stderr," size align largest\n");
157: fprintf(stderr,"char %d %d\n",SZ_CHAR,AL_CHAR);
158: fprintf(stderr,"short %d %d\n",SZ_SHORT,AL_SHORT);
159: fprintf(stderr,"int %d %d %s\n",SZ_INT,AL_INT,LARGEST_INT);
160: fprintf(stderr,"long %d %d\n",SZ_LONG,AL_LONG);
161: fprintf(stderr,"float %d %d\n",SZ_FLOAT,AL_FLOAT);
162: fprintf(stderr,"double %d %d\n",SZ_DOUBLE,AL_DOUBLE);
163: fprintf(stderr,"ldouble %d %d\n",SZ_LDOUBLE,AL_LDOUBLE);
164: fprintf(stderr,"bptr %d %d\n",SZ_BPTR,AL_BPTR);
165: fprintf(stderr,"wptr %d %d\n",SZ_WPTR,AL_WPTR);
166: fprintf(stderr,"struct %d %d\n",SZ_STRUCT,AL_STRUCT);
167: fprintf(stderr,"struct2 %d %d\n",F_SENSITIVE,F_OPTIMIZED);
168: // fprintf(stderr,"frame %d %d\n",SZ_FRAME,AL_FRAME);
169:
170: fprintf(stderr,"%d bits in a byte, %d bits in a word, %d bytes in a word\n",
171: BI_IN_BYTE, BI_IN_WORD, SZ_WORD);
172: return 1;
173: }
174: */
175:
176: int c_strlen(const char* s)
177: /*
178: return sizeof(s) with escapes processed
179: sizeof("") == 1 the terminating 0
180: sizeof("a") == 2
181: sizeof("\0x") == 3 0 x 0
182: sizeof("\012") == 2 '\012'
183: sizeof("\01") '\001'
184: sizeof("\x") == 2 \ ignored
185:
186: */
187: {
188: int i = 1;
189: for (const char* p = s; *p; i++,p++) {
190: if (*p == '\\') { // '\?
191: switch (*++p) {
192: case '0':
193: switch (p[1]) { // '\01' or '\012'
194: case '0': case '1': case '2': case '3':
195: case '4': case '5': case '6': case '7':
196: break;
197: default:
198: continue; // '\0'
199: }
200: /* no break */
201: case '1': case '2': case '3':
202: case '4': case '5': case '6': case '7': // '\123'
203: switch (*++p) {
204: case '0': case '1': case '2': case '3':
205: case '4': case '5': case '6': case '7':
206: switch (*++p) {
207: case '0': case '1': case '2': case '3':
208: case '4': case '5': case '6': case '7':
209: break;
210: default:
211: --p;
212: }
213: break;
214: default:
215: --p;
216: }
217: }
218: }
219: }
220: return i;
221: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.