cfad47cfa3/t3compiler/tads3/test/data/main.t

4b825dc642cb6eb9a060e54bf8d69288fbee4904cfad47cfa334b206c65f22086bcc5d63e6f70944
1
/* Copyright (c) 1999, 2002 Michael J. Roberts.  All Rights Reserved. */
2
/*
3
Name
4
  main.t - test source file for test_tok.exe.
5
Function
6
  Tests the tokenizer and preprocessor functions
7
Notes
8
  
9
Modified
10
  04/17/99 MJRoberts  - Creation
11
*/
12
13
#pragma all_once-
14
15
#define AAA  1
16
#define YES  1
17
#define NO   0
18
19
#if AAA ? YES : NO
20
"AAA -> yes - ok";
21
#else
22
"AAA -> no???";
23
#endif
24
25
#undef AAA
26
#define AAA 0
27
#if AAA ? YES : NO
28
"AAA -> yes???";
29
#else
30
"AAA -> no - ok";
31
#endif
32
33
34
#if 1 + 2 > 8 - 5 ? 1 : 0
35
"bad ?:";
36
#else
37
"good ?:";
38
#endif
39
40
#if 1+2*3 > 8 ? 0 : 1
41
"good ?:";
42
#else
43
"bad ?:";
44
#endif
45
46
#define PRINTVAL(val) printf(#@val + '= %d\n', val)
47
PRINTVAL(abc);
48
PRINTVAL(def_);
49
50
#if defined(PRINTVAL)
51
"printval is defined!";
52
#endif
53
54
#if defined(UNDEFINED_SYMBOL) && defined(PRINTVAL)
55
"something's wrong!!!";
56
#endif
57
58
#if defined(DEFINITELY_NOT_DEFINED) || defined(PRINTVAL)
59
"okay!!!";
60
#endif
61
62
63
#define LINENUM  100
64
#define FILENAME "test"
65
66
"try string translations";
67
#if 'u' > '7'
68
#pragma message("u > 7 - ok")
69
#else
70
#pragma message("u not > 7 - WRONG")
71
#endif
72
73
#if '\u00C7' > 'aaaa'
74
#pragma message("\\u00C7 > aaaa - ok")
75
#else
76
#pragma message("\\u00c7 not > aaaa - WRONG")
77
#endif
78
79
#if '\uC7' > '\xC6'
80
#pragma message("\\uC7 > \\xC6 - ok")
81
#else
82
#pragma message("\\C7 not > \\xC6 - WRONG")
83
#endif
84
85
"pragma message with a translation";
86
#define TEST "this is a test message"
87
#pragma message(TEST)
88
#error "macro: " TEST "!!!"
89
90
91
"try some macros with arguments";
92
#define PRODUCT(a, b) ((a) * (b))
93
#define SUM(a, b) ((a) + (b))
94
#define SUM3(a, b, c) ((a) + (b) + (c))
95
96
"testing product(10, 20): "; PRODUCT(10, 20);
97
"testing product(sum(10, sum3(1, 2, 3)), product(5, 10)): ";
98
   PRODUCT(SUM(10, SUM3(1, 2, 3)), PRODUCT(5, 10));
99
100
"testing sum(sum(sum(1, 2), sum(3, 4)), sum(sum(5, 6), sum(7, 8))): ";
101
   SUM(SUM(SUM(1, 2), SUM(3, 4)), SUM(SUM(5, 6), SUM(7, 8)));
102
103
#define CIRCULAR_A(foo) CIRCULAR_B(foo*A)
104
#define CIRCULAR_B(foo) CIRCULAR_A(foo*B)
105
"circular_a(100): "; CIRCULAR_A(100);
106
"circular_a(circular_b(50)): "; CIRCULAR_A(CIRCULAR_B(50));
107
108
#if SUM(1+2, 3+4) == PRODUCT(2, 5)
109
   "good argument expansion";
110
#else
111
   "bad argument expansion";
112
#endif
113
114
#if PRODUCT(10,11) != PRODUCT(11,10)
115
    "bad expansion";
116
#elif SUM(5 + 6, 7) == SUM3(5, 6, 7)
117
    "good expansion";
118
#else
119
    "bad else expansion";
120
#endif
121
    
122
123
"try some #if's with macro expansions";
124
125
#define TEST_ONE  1
126
#define TEST_NINE 9
127
#define TEST_TEN  10
128
129
#if TEST_ONE == TEST_TEN
130
   "bad if";
131
#elif TEST_ONE + TEST_NINE == TEST_TEN
132
   "good elif with expansion!!!";
133
#else
134
   "bad else";
135
#endif
136
137
#define TEST_STR_1  'abc'
138
#define TEST_STR_2  'def'
139
#define TEST_STR_3  'abc'
140
141
#if TEST_STR_1 < TEST_STR_2
142
    "good string #if";
143
#endif
144
145
#if TEST_STR_1 > TEST_STR_2
146
    "bad string #if";
147
#else
148
    "good string #else";
149
#endif
150
151
#if TEST_STR_1 == TEST_STR_2
152
    "bad string #if";
153
#elif TEST_STR_1 == TEST_STR_3
154
    "good string #elif";
155
#endif
156
157
"try some #if's with constant expressions"
158
#if 0
159
    "bad if"
160
#elif 1
161
   "good if!!!"
162
#else
163
   "bad else"
164
#endif
165
166
#if 1+2*3 == (4+11)*2 - ((6+7) << 1) + (0xF03 & 03)
167
   "good if!!! (and a tough one, too)";
168
#elif 1 == 1
169
   "bad if"
170
#elif 1 == 2
171
   "another bad if"
172
#else
173
   "bad else"
174
#endif
175
176
#if 1 == 2
177
   "bad if"
178
#elif 2 == 3
179
   "another bad if"
180
#elif 3+1 == 6-4/2
181
   "good elif!!!!!!"
182
#elif 3 == 3
183
   "bad elif"
184
#elif 4 == 0
185
   "bad elif"
186
#elif 4 == 4
187
   "bad elif"
188
#else
189
   "bad else"
190
#endif
191
"done with if/elif";
192
193
"define some macros";
194
#define FOO
195
#define BAR
196
197
"try out a positive #if";
198
#ifdef FOO
199
   "this is a good #if";
200
#else /* FOO */
201
   "this is a bad #else";
202
#endif /* FOO */
203
"end of positive #if";
204
205
"try a negative #if";
206
#ifdef BLECH
207
   "this is a bad #if";
208
#else /* FOO */
209
   "this is a good #else";
210
#endif /* FOO */
211
"end of negative #if";
212
213
"try some nested #if's";
214
#ifdef FOO
215
      "good #if - level 1";   A
216
# ifdef BAR
217
      "good #if - level 2";   B
218
#  ifdef BLECH
219
      "bad #if - level 3";    C
220
#  else
221
      "good #else - level 3";  D
222
#  endif /* BLECH */
223
      "good #if - level 2";    E
224
# else /* BAR */
225
      "bad #else - level 2";   F
226
#  ifdef FOO
227
      "good #if within a bad #if -> bad - level 2";   G
228
#  else
229
      "bad #else within bad #if -> bad - level 2";  H
230
#  endif /* nested FOO */
231
# endif /* BAR */
232
      "good #if - level 1";    I
233
#else /* FOO */
234
      "bad #else - level 1";   J
235
# ifdef BAR
236
      "good #if in bad else -> bad - level 2";   B
237
#  ifdef BLECH
238
      "bad #if in bad else -> bad - level 3";    C
239
#  else
240
      "good #else in bad else -> bad - level 3";  D
241
#  endif /* BLECH */
242
      "good #if in bad else -> bad - level 2";    E
243
# else /* BAR */
244
      "bad #else in bad else -> bad - level 2";   F
245
#  ifdef FOO
246
      "good #if within a bad #if within bad #else -> bad - level 2";   G
247
#  else
248
      "bad #else within bad #if within bad #else -> bad - level 2";  H
249
#  endif /* nested FOO */
250
# endif /* BAR */
251
#endif /* FOO */
252
#ifdef FOO
253
    "good again";
254
#else
255
    "bad again";
256
#endif
257
"done with nested #if's";
258
259
"ifndef test";
260
#ifndef FOO
261
   "bad ifndef";
262
#else
263
   "good ifndef else";
264
#endif
265
#ifndef BLECH
266
   "good ifndef";
267
#else
268
   "bad ifndef else";
269
#endif
270
271
272
273
// this is a single-line comment, which should be eliminated
274
275
/* this is a multi-line comment on just one line */
276
277
/*
278
 *   this is a full multi-line comment 
279
 */
280
281
/*
282
 *   This is another multi-line comment.  The #include that follows should
283
 *   be ignored, since it's part of this comment.
284
285
#include "badfile.t"
286
287
 */
288
289
// the following #include should be ignored
290
// #include "badfile.t"
291
292
/*
293
 *   the following #include should be obeyed 
294
 */
295
#include "header.t"
296
297
"This is a string.  The #include below should be ignored,
298
because it's part of the string.
299
300
#include "badfile.t"
301
302
That's that!";
303
304
"This is a string with escaped \"quote marks\".  Those quotes
305
shouldn't end the string.
306
\"the next #include should be ignored, since it's still part of the string:
307
308
#include <badfile.t>
309
310
That's all for the string!";
311
312
/*
313
 *   here's a comment with a "string" embedded 
314
 */
315
316
"Here's a string with a /*comment*/ embedded.";
317
318
"Here's some mixing:" /* comment */  "String" /* comment */ "Done!!!" // EOL
319
320
321
/*
322
 *   Include the header with a comment dangling after the end of the
323
 *   include line. 
324
 */
325
#include "header.t"    /* Start a comment here,
326
                          but don't finish it
327
                          for a few lines, just to
328
                          make it harder. */  "<--- after the comment";
329
330
"That's it!";
331
332
#include "header.t"
333
Line directly after the header!
334
335
336
"Try some random #line directives!";
337
338
#line 1234 "foo_test.c"
339
340
hello!
341
342
#line 6789 "test2.c"
343
344
goodbye!
345
346
#line 1+2+3 "foo_test.c"
347
348
"__LINE__ and __FILE__ near the end of file: "; __LINE__, __FILE__;
349
350
"Make sure we come back here after we're done with an include file.";
351
#include "header.t"
352
>>> back from include!!! <<<
353
354
355
"Try expanding macros and calculating values in #line";
356
#line 5 + 2*LINENUM FILENAME + ".h"
357
358
"try __FILE__ and __LINE__";
359
"__FILE__: <<__FILE__>>, __LINE__: << __LINE__ >>\n";
360
361
"__FILE__: <<
362
  __FILE__
363
  >>, __LINE__:
364
  <<
365
  __LINE__ >> -- that was __FILE and __LINE!\n";
366