|
|
1.1 root 1: /*ident "@(#)ctrans:src/size.c 1.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:
52: int get_line(FILE* fp)
53: {
54: char s[32];
55: char s2[32];
56:
57: if (fscanf(fp,"%s %s",s2,s) == EOF) return 0;
58:
59: if (strcmp("DLARGEST_INT",s) == 0) {
60: if (fscanf(fp," %s",s2)==EOF) return 0;
61: //// get rid of quotes
62: for(int i=0;i<=strlen(s2)+1;i++)
63: if (s2[i]== '"') {
64: for (int j=i;j<=strlen(s2)+1;j++)
65: s2[j]=s2[j+1];
66: }
67: }
68: else
69: if (fscanf(fp,"%d ",&arg1) == EOF) return 0;
70:
71: if (strcmp("DSZ_CHAR",s) == 0) {
72: SZ_CHAR = arg1;
73: return 1;
74: }
75:
76: if (strcmp("DAL_CHAR",s) == 0) {
77: AL_CHAR = arg1;
78: return 1;
79: }
80:
81: if (strcmp("DSZ_SHORT",s) == 0) {
82: SZ_SHORT = arg1;
83: return 1;
84: }
85:
86: if (strcmp("DAL_SHORT",s) == 0) {
87: AL_SHORT = arg1;
88: return 1;
89: }
90:
91: if (strcmp("DSZ_INT",s) == 0) {
92: SZ_INT = arg1;
93: return 1;
94: }
95:
96: if (strcmp("DAL_INT",s) == 0) {
97: AL_INT=arg1;
98: return 1;
99: }
100:
101: if (strcmp("DLARGEST_INT",s) == 0) {
102: LARGEST_INT = new char[strlen(s2)+1];
103: strcpy(LARGEST_INT,s2);
104: return 1;
105: }
106:
107: if (strcmp("DSZ_LONG",s) == 0) {
108: SZ_LONG = arg1;
109: return 1;
110: }
111:
112: if (strcmp("DAL_LONG",s) == 0) {
113: AL_LONG = arg1;
114: return 1;
115: }
116:
117: if (strcmp("DSZ_FLOAT",s) == 0) {
118: SZ_FLOAT = arg1;
119: return 1;
120: }
121:
122: if (strcmp("DAL_FLOAT",s) == 0) {
123: AL_FLOAT = arg1;
124: return 1;
125: }
126:
127: if (strcmp("DSZ_DOUBLE",s) == 0) {
128: SZ_DOUBLE = arg1;
129: return 1;
130: }
131:
132: if (strcmp("DAL_DOUBLE",s) == 0) {
133: AL_DOUBLE = arg1;
134: return 1;
135: }
136:
137: if (strcmp("DSZ_LDOUBLE",s) == 0) {
138: SZ_LDOUBLE = arg1;
139: return 1;
140: }
141:
142: if (strcmp("DAL_LDOUBLE",s) == 0) {
143: AL_LDOUBLE = arg1;
144: return 1;
145: }
146:
147: if (strcmp("DBI_IN_BYTE",s) == 0) {
148: BI_IN_BYTE = arg1;
149: return 1;
150: }
151:
152: if (strcmp("DBI_IN_WORD",s) == 0) {
153: BI_IN_WORD= arg1;
154: return 1;
155: }
156:
157: if (strcmp("DSZ_STRUCT",s) == 0) {
158: SZ_STRUCT = arg1;
159: return 1;
160: }
161:
162: if (strcmp("DAL_STRUCT",s) == 0) {
163: AL_STRUCT = arg1;
164: return 1;
165: }
166:
167: if (strcmp("DF_SENSITIVE",s) == 0) {
168: F_SENSITIVE = arg1;
169: return 1;
170: }
171:
172: if (strcmp("DF_OPTIMIZED",s) == 0) {
173: F_OPTIMIZED = arg1;
174: return 1;
175: }
176:
177: if (strcmp("frame",s) == 0) {
178: // SZ_FRAME = arg1;
179: // AL_FRAME = arg2;
180: return 1;
181: }
182:
183: if (strcmp("DSZ_WORD",s) == 0) {
184: SZ_WORD = arg1;
185: return 1;
186: }
187:
188: if (strcmp("DSZ_WPTR",s) == 0) {
189: SZ_WPTR = arg1;
190: return 1;
191: }
192:
193: if (strcmp("DAL_WPTR",s) == 0) {
194: AL_WPTR = arg1;
195: return 1;
196: }
197:
198: if (strcmp("DSZ_BPTR",s) == 0) {
199: SZ_BPTR = arg1;
200: return 1;
201: }
202:
203: if (strcmp("DAL_BPTR",s) == 0) {
204: AL_BPTR = arg1;
205: return 1;
206: }
207:
208: if (strcmp("top",s) == 0) {
209: // SZ_TOP = arg1;
210: // SZ_BOTTOM = arg2;
211: return 1;
212: }
213: return 0;
214: }
215:
216: int read_align(char* f)
217: {
218: char* p = f;
219: if (*p == 0) {
220: fprintf(stderr,"size/align file missing\n");
221: ext(1);
222: }
223: FILE* fp = fopen(f,"r");
224: if (fp == 0) return 1;
225: while (get_line(fp)) ;
226: return 0;
227: }
228: /*
229: print_align(char* s)
230: {
231: fprintf(stderr,"%s sizes and alignments\n\n",s);
232:
233: fprintf(stderr," size align largest\n");
234: fprintf(stderr,"char %d %d\n",SZ_CHAR,AL_CHAR);
235: fprintf(stderr,"short %d %d\n",SZ_SHORT,AL_SHORT);
236: fprintf(stderr,"int %d %d %s\n",SZ_INT,AL_INT,LARGEST_INT);
237: fprintf(stderr,"long %d %d\n",SZ_LONG,AL_LONG);
238: fprintf(stderr,"float %d %d\n",SZ_FLOAT,AL_FLOAT);
239: fprintf(stderr,"double %d %d\n",SZ_DOUBLE,AL_DOUBLE);
240: fprintf(stderr,"ldouble %d %d\n",SZ_LDOUBLE,AL_LDOUBLE);
241: fprintf(stderr,"bptr %d %d\n",SZ_BPTR,AL_BPTR);
242: fprintf(stderr,"wptr %d %d\n",SZ_WPTR,AL_WPTR);
243: fprintf(stderr,"struct %d %d\n",SZ_STRUCT,AL_STRUCT);
244: fprintf(stderr,"struct2 %d %d\n",F_SENSITIVE,F_OPTIMIZED);
245: // fprintf(stderr,"frame %d %d\n",SZ_FRAME,AL_FRAME);
246:
247: fprintf(stderr,"%d bits in a byte, %d bits in a word, %d bytes in a word\n",
248: BI_IN_BYTE, BI_IN_WORD, SZ_WORD);
249: return 1;
250: }
251: */
252:
253: int c_strlen(const char* s)
254: /*
255: return sizeof(s) with escapes processed
256: sizeof("") == 1 the terminating 0
257: sizeof("a") == 2
258: sizeof("\0x") == 3 0 x 0
259: sizeof("\012") == 2 '\012'
260: sizeof("\01") '\001'
261: sizeof("\x") == 2 \ ignored
262:
263: */
264: {
265: int i = 1;
266: for (const char* p = s; *p; i++,p++) {
267: if (*p == '\\') { // '\?
268: switch (*++p) {
269: case '0':
270: switch (p[1]) { // '\01' or '\012'
271: case '0': case '1': case '2': case '3':
272: case '4': case '5': case '6': case '7':
273: break;
274: default:
275: continue; // '\0'
276: }
277: /* no break */
278: case '1': case '2': case '3':
279: case '4': case '5': case '6': case '7': // '\123'
280: switch (*++p) {
281: case '0': case '1': case '2': case '3':
282: case '4': case '5': case '6': case '7':
283: switch (*++p) {
284: case '0': case '1': case '2': case '3':
285: case '4': case '5': case '6': case '7':
286: break;
287: default:
288: --p;
289: }
290: break;
291: default:
292: --p;
293: break;
294: }
295: break;
296: case '\n': // \newline doesn't count
297: i--;
298: break;
299: }
300: }
301: }
302: return i;
303: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.