Skip to content

Latest commit

 

History

History
972 lines (839 loc) · 30.9 KB

mojoshader-compiler.c

File metadata and controls

972 lines (839 loc) · 30.9 KB
 
1
2
3
4
5
6
7
8
9
10
11
/**
* MojoShader; generate shader programs from bytecode of compiled
* Direct3D shaders.
*
* Please see the file LICENSE.txt in the source's root directory.
*
* This file written by Ryan C. Gordon.
*/
#include <stdio.h>
#include <stdlib.h>
Feb 19, 2009
Feb 19, 2009
12
#include <string.h>
Oct 28, 2010
Oct 28, 2010
13
14
#include <assert.h>
15
16
#include "mojoshader.h"
Oct 28, 2010
Oct 28, 2010
17
18
19
20
#ifndef _WIN32
#define stricmp(a,b) strcasecmp(a,b)
#endif
Feb 19, 2009
Feb 19, 2009
21
22
23
static const char **include_paths = NULL;
static unsigned int include_path_count = 0;
Feb 19, 2009
Feb 19, 2009
24
#define MOJOSHADER_DEBUG_MALLOC 0
Feb 19, 2009
Feb 19, 2009
25
Feb 19, 2009
Feb 19, 2009
26
#if MOJOSHADER_DEBUG_MALLOC
Feb 19, 2009
Feb 19, 2009
27
static void *Malloc(int len, void *d)
Feb 19, 2009
Feb 19, 2009
28
29
30
31
32
33
34
35
36
37
{
void *ptr = malloc(len + sizeof (int));
int *store = (int *) ptr;
printf("malloc() %d bytes (%p)\n", len, ptr);
if (ptr == NULL) return NULL;
*store = len;
return (void *) (store + 1);
} // Malloc
Feb 19, 2009
Feb 19, 2009
38
static void Free(void *_ptr, void *d)
Feb 19, 2009
Feb 19, 2009
39
40
41
42
43
44
45
46
47
48
{
int *ptr = (((int *) _ptr) - 1);
int len = *ptr;
printf("free() %d bytes (%p)\n", len, ptr);
free(ptr);
} // Free
#else
#define Malloc NULL
#define Free NULL
#endif
Feb 19, 2009
Feb 19, 2009
49
Feb 19, 2009
Feb 19, 2009
50
51
52
53
54
55
56
static void fail(const char *err)
{
printf("%s.\n", err);
exit(1);
} // fail
Nov 1, 2010
Nov 1, 2010
57
static void print_unroll_attr(FILE *io, const int unroll)
Oct 28, 2010
Oct 28, 2010
58
59
{
if (unroll == 0)
Nov 1, 2010
Nov 1, 2010
60
fprintf(io, "[loop] ");
Oct 28, 2010
Oct 28, 2010
61
else if (unroll < 0)
Nov 1, 2010
Nov 1, 2010
62
fprintf(io, "[unroll] ");
Oct 28, 2010
Oct 28, 2010
63
else
Nov 1, 2010
Nov 1, 2010
64
fprintf(io, "[unroll(%d)] ", unroll);
Oct 28, 2010
Oct 28, 2010
65
66
67
} // print_unroll_attr
// !!! FIXME: this screws up on order of operations.
Nov 1, 2010
Nov 1, 2010
68
static void print_ast(FILE *io, const int substmt, const void *_ast)
Oct 28, 2010
Oct 28, 2010
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
{
const MOJOSHADER_astNode *ast = (const MOJOSHADER_astNode *) _ast;
const char *nl = substmt ? "" : "\n";
int typeint = 0;
static int indent = 0;
int isblock = 0;
int i;
// These _HAVE_ to be in the same order as MOJOSHADER_astNodeType!
static const char *binary[] =
{
",", "*", "/", "%", "+", "-", "<<", ">>", "<", ">", "<=", ">=", "==",
"!=", "&", "^", "|", "&&", "||", "=", "*=", "/=", "%=", "+=", "-=",
"<<=", ">>=", "&=", "^=", "|="
};
static const char *pre_unary[] = { "++", "--", "-", "~", "!" };
static const char *post_unary[] = { "++", "--" };
static const char *simple_stmt[] = { "", "break", "continue", "discard" };
static const char *inpmod[] = { "", "in ", "out ", "in out ", "uniform " };
static const char *fnstorage[] = { "", "inline " };
static const char *interpmod[] = {
"", " linear", " centroid", " nointerpolation",
" noperspective", " sample"
};
if (!ast) return;
typeint = (int) ast->ast.type;
#define DO_INDENT do { \
Nov 1, 2010
Nov 1, 2010
101
if (!substmt) { for (i = 0; i < indent; i++) fprintf(io, " "); } \
Oct 28, 2010
Oct 28, 2010
102
103
104
105
106
107
108
109
110
} while (0)
switch (ast->ast.type)
{
case MOJOSHADER_AST_OP_PREINCREMENT:
case MOJOSHADER_AST_OP_PREDECREMENT:
case MOJOSHADER_AST_OP_NEGATE:
case MOJOSHADER_AST_OP_COMPLEMENT:
case MOJOSHADER_AST_OP_NOT:
Nov 1, 2010
Nov 1, 2010
111
112
fprintf(io, "%s", pre_unary[(typeint-MOJOSHADER_AST_OP_START_RANGE_UNARY)-1]);
print_ast(io, 0, ast->unary.operand);
Oct 28, 2010
Oct 28, 2010
113
114
115
116
break;
case MOJOSHADER_AST_OP_POSTINCREMENT:
case MOJOSHADER_AST_OP_POSTDECREMENT:
Nov 1, 2010
Nov 1, 2010
117
118
print_ast(io, 0, ast->unary.operand);
fprintf(io, "%s", post_unary[typeint-MOJOSHADER_AST_OP_POSTINCREMENT]);
Oct 28, 2010
Oct 28, 2010
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
break;
case MOJOSHADER_AST_OP_MULTIPLY:
case MOJOSHADER_AST_OP_DIVIDE:
case MOJOSHADER_AST_OP_MODULO:
case MOJOSHADER_AST_OP_ADD:
case MOJOSHADER_AST_OP_SUBTRACT:
case MOJOSHADER_AST_OP_LSHIFT:
case MOJOSHADER_AST_OP_RSHIFT:
case MOJOSHADER_AST_OP_LESSTHAN:
case MOJOSHADER_AST_OP_GREATERTHAN:
case MOJOSHADER_AST_OP_LESSTHANOREQUAL:
case MOJOSHADER_AST_OP_GREATERTHANOREQUAL:
case MOJOSHADER_AST_OP_EQUAL:
case MOJOSHADER_AST_OP_NOTEQUAL:
case MOJOSHADER_AST_OP_BINARYAND:
case MOJOSHADER_AST_OP_BINARYXOR:
case MOJOSHADER_AST_OP_BINARYOR:
case MOJOSHADER_AST_OP_LOGICALAND:
case MOJOSHADER_AST_OP_LOGICALOR:
case MOJOSHADER_AST_OP_ASSIGN:
case MOJOSHADER_AST_OP_MULASSIGN:
case MOJOSHADER_AST_OP_DIVASSIGN:
case MOJOSHADER_AST_OP_MODASSIGN:
case MOJOSHADER_AST_OP_ADDASSIGN:
case MOJOSHADER_AST_OP_SUBASSIGN:
case MOJOSHADER_AST_OP_LSHIFTASSIGN:
case MOJOSHADER_AST_OP_RSHIFTASSIGN:
case MOJOSHADER_AST_OP_ANDASSIGN:
case MOJOSHADER_AST_OP_XORASSIGN:
case MOJOSHADER_AST_OP_ORASSIGN:
Nov 1, 2010
Nov 1, 2010
150
fprintf(io, " "); // then fall through! (no space before the comma).
Oct 28, 2010
Oct 28, 2010
151
case MOJOSHADER_AST_OP_COMMA:
Nov 1, 2010
Nov 1, 2010
152
153
print_ast(io, 0, ast->binary.left);
fprintf(io, "%s ", binary[
Oct 28, 2010
Oct 28, 2010
154
(typeint - MOJOSHADER_AST_OP_START_RANGE_BINARY) - 1]);
Nov 1, 2010
Nov 1, 2010
155
print_ast(io, 0, ast->binary.right);
Oct 28, 2010
Oct 28, 2010
156
157
158
break;
case MOJOSHADER_AST_OP_DEREF_ARRAY:
Nov 1, 2010
Nov 1, 2010
159
160
161
162
print_ast(io, 0, ast->binary.left);
fprintf(io, "[");
print_ast(io, 0, ast->binary.right);
fprintf(io, "]");
Oct 28, 2010
Oct 28, 2010
163
164
165
break;
case MOJOSHADER_AST_OP_DEREF_STRUCT:
Nov 1, 2010
Nov 1, 2010
166
167
168
print_ast(io, 0, ast->derefstruct.identifier);
fprintf(io, ".");
fprintf(io, "%s", ast->derefstruct.member);
Oct 28, 2010
Oct 28, 2010
169
170
171
break;
case MOJOSHADER_AST_OP_CONDITIONAL:
Nov 1, 2010
Nov 1, 2010
172
173
174
175
176
print_ast(io, 0, ast->ternary.left);
fprintf(io, " ? ");
print_ast(io, 0, ast->ternary.center);
fprintf(io, " : ");
print_ast(io, 0, ast->ternary.right);
Oct 28, 2010
Oct 28, 2010
177
178
179
break;
case MOJOSHADER_AST_OP_IDENTIFIER:
Nov 1, 2010
Nov 1, 2010
180
fprintf(io, "%s", ast->identifier.identifier);
Oct 28, 2010
Oct 28, 2010
181
182
183
break;
case MOJOSHADER_AST_OP_INT_LITERAL:
Nov 1, 2010
Nov 1, 2010
184
fprintf(io, "%d", ast->intliteral.value);
Oct 28, 2010
Oct 28, 2010
185
186
187
188
189
190
191
break;
case MOJOSHADER_AST_OP_FLOAT_LITERAL:
{
const float f = ast->floatliteral.value;
const long long flr = (long long) f;
if (((float) flr) == f)
Nov 1, 2010
Nov 1, 2010
192
fprintf(io, "%lld.0", flr);
Oct 28, 2010
Oct 28, 2010
193
else
Nov 1, 2010
Nov 1, 2010
194
fprintf(io, "%.16g", f);
Oct 28, 2010
Oct 28, 2010
195
196
197
198
break;
} // case
case MOJOSHADER_AST_OP_STRING_LITERAL:
Nov 1, 2010
Nov 1, 2010
199
fprintf(io, "\"%s\"", ast->stringliteral.string);
Oct 28, 2010
Oct 28, 2010
200
201
202
break;
case MOJOSHADER_AST_OP_BOOLEAN_LITERAL:
Nov 1, 2010
Nov 1, 2010
203
fprintf(io, "%s", ast->boolliteral.value ? "true" : "false");
Oct 28, 2010
Oct 28, 2010
204
205
206
break;
case MOJOSHADER_AST_ARGUMENTS:
Nov 1, 2010
Nov 1, 2010
207
print_ast(io, 0, ast->arguments.argument);
Oct 28, 2010
Oct 28, 2010
208
209
if (ast->arguments.next != NULL)
{
Nov 1, 2010
Nov 1, 2010
210
211
fprintf(io, ", ");
print_ast(io, 0, ast->arguments.next);
Oct 28, 2010
Oct 28, 2010
212
213
214
215
} // if
break;
case MOJOSHADER_AST_OP_CALLFUNC:
Nov 1, 2010
Nov 1, 2010
216
217
218
219
print_ast(io, 0, ast->callfunc.identifier);
fprintf(io, "(");
print_ast(io, 0, ast->callfunc.args);
fprintf(io, ")");
Oct 28, 2010
Oct 28, 2010
220
221
222
break;
case MOJOSHADER_AST_OP_CONSTRUCTOR:
Nov 1, 2010
Nov 1, 2010
223
224
225
fprintf(io, "%s(", ast->constructor.datatype);
print_ast(io, 0, ast->constructor.args);
fprintf(io, ")");
Oct 28, 2010
Oct 28, 2010
226
227
228
break;
case MOJOSHADER_AST_OP_CAST:
Nov 1, 2010
Nov 1, 2010
229
230
231
fprintf(io, "(%s) (", ast->cast.datatype);
print_ast(io, 0, ast->cast.operand);
fprintf(io, ")");
Oct 28, 2010
Oct 28, 2010
232
233
234
235
break;
case MOJOSHADER_AST_STATEMENT_EXPRESSION:
DO_INDENT;
Nov 1, 2010
Nov 1, 2010
236
237
238
print_ast(io, 0, ast->exprstmt.expr); // !!! FIXME: This is named badly...
fprintf(io, ";%s", nl);
print_ast(io, 0, ast->exprstmt.next);
Oct 28, 2010
Oct 28, 2010
239
240
241
242
break;
case MOJOSHADER_AST_STATEMENT_IF:
DO_INDENT;
Nov 1, 2010
Nov 1, 2010
243
244
245
fprintf(io, "if (");
print_ast(io, 0, ast->ifstmt.expr);
fprintf(io, ")\n");
Oct 28, 2010
Oct 28, 2010
246
247
isblock = ast->ifstmt.statement->ast.type == MOJOSHADER_AST_STATEMENT_BLOCK;
if (!isblock) indent++;
Nov 1, 2010
Nov 1, 2010
248
print_ast(io, 0, ast->ifstmt.statement);
Oct 28, 2010
Oct 28, 2010
249
if (!isblock) indent--;
Nov 1, 2010
Nov 1, 2010
250
print_ast(io, 0, ast->ifstmt.next);
Oct 28, 2010
Oct 28, 2010
251
252
253
254
break;
case MOJOSHADER_AST_STATEMENT_TYPEDEF:
DO_INDENT;
Nov 1, 2010
Nov 1, 2010
255
256
257
print_ast(io, 1, ast->typedefstmt.type_info);
fprintf(io, "%s", nl);
print_ast(io, 0, ast->typedefstmt.next);
Oct 28, 2010
Oct 28, 2010
258
259
260
261
262
263
264
break;
case MOJOSHADER_AST_STATEMENT_SWITCH:
DO_INDENT;
switch ( ast->switchstmt.attributes )
{
case MOJOSHADER_AST_SWITCHATTR_NONE: break;
Nov 1, 2010
Nov 1, 2010
265
266
267
268
case MOJOSHADER_AST_SWITCHATTR_FLATTEN: fprintf(io, "[flatten] "); break;
case MOJOSHADER_AST_SWITCHATTR_BRANCH: fprintf(io, "[branch] "); break;
case MOJOSHADER_AST_SWITCHATTR_FORCECASE: fprintf(io, "[forcecase] "); break;
case MOJOSHADER_AST_SWITCHATTR_CALL: fprintf(io, "[call] "); break;
Oct 28, 2010
Oct 28, 2010
269
270
} // switch
Nov 1, 2010
Nov 1, 2010
271
272
273
fprintf(io, "switch (");
print_ast(io, 0, ast->switchstmt.expr);
fprintf(io, ")\n");
Oct 28, 2010
Oct 28, 2010
274
DO_INDENT;
Nov 1, 2010
Nov 1, 2010
275
fprintf(io, "{\n");
Oct 28, 2010
Oct 28, 2010
276
indent++;
Nov 1, 2010
Nov 1, 2010
277
print_ast(io, 0, ast->switchstmt.cases);
Oct 28, 2010
Oct 28, 2010
278
indent--;
Nov 1, 2010
Nov 1, 2010
279
fprintf(io, "\n");
Oct 28, 2010
Oct 28, 2010
280
DO_INDENT;
Nov 1, 2010
Nov 1, 2010
281
282
fprintf(io, "}\n");
print_ast(io, 0, ast->switchstmt.next);
Oct 28, 2010
Oct 28, 2010
283
284
285
286
break;
case MOJOSHADER_AST_SWITCH_CASE:
DO_INDENT;
Nov 1, 2010
Nov 1, 2010
287
288
289
fprintf(io, "case ");
print_ast(io, 0, ast->cases.expr);
fprintf(io, ":\n");
Oct 28, 2010
Oct 28, 2010
290
291
isblock = ast->cases.statement->ast.type == MOJOSHADER_AST_STATEMENT_BLOCK;
if (!isblock) indent++;
Nov 1, 2010
Nov 1, 2010
292
print_ast(io, 0, ast->cases.statement);
Oct 28, 2010
Oct 28, 2010
293
if (!isblock) indent--;
Nov 1, 2010
Nov 1, 2010
294
print_ast(io, 0, ast->cases.next);
Oct 28, 2010
Oct 28, 2010
295
296
297
298
break;
case MOJOSHADER_AST_STATEMENT_STRUCT:
DO_INDENT;
Nov 1, 2010
Nov 1, 2010
299
300
301
print_ast(io, 0, ast->structstmt.struct_info);
fprintf(io, ";%s%s", nl, nl); // always space these out.
print_ast(io, 0, ast->structstmt.next);
Oct 28, 2010
Oct 28, 2010
302
303
304
305
break;
case MOJOSHADER_AST_STATEMENT_VARDECL:
DO_INDENT;
Nov 1, 2010
Nov 1, 2010
306
307
308
print_ast(io, 1, ast->vardeclstmt.declaration);
fprintf(io, ";%s", nl);
print_ast(io, 0, ast->vardeclstmt.next);
Oct 28, 2010
Oct 28, 2010
309
310
311
312
break;
case MOJOSHADER_AST_STATEMENT_BLOCK:
DO_INDENT;
Nov 1, 2010
Nov 1, 2010
313
fprintf(io, "{\n");
Oct 28, 2010
Oct 28, 2010
314
indent++;
Nov 1, 2010
Nov 1, 2010
315
print_ast(io, 0, ast->blockstmt.statements);
Oct 28, 2010
Oct 28, 2010
316
317
indent--;
DO_INDENT;
Nov 1, 2010
Nov 1, 2010
318
319
fprintf(io, "}\n");
print_ast(io, 0, ast->blockstmt.next);
Oct 28, 2010
Oct 28, 2010
320
321
322
323
break;
case MOJOSHADER_AST_STATEMENT_FOR:
DO_INDENT;
Nov 1, 2010
Nov 1, 2010
324
325
326
print_unroll_attr(io, ast->forstmt.unroll);
fprintf(io, "for (");
print_ast(io, 1, ast->forstmt.var_decl);
Oct 28, 2010
Oct 28, 2010
327
328
if (ast->forstmt.initializer != NULL)
{
Nov 1, 2010
Nov 1, 2010
329
330
fprintf(io, " = ");
print_ast(io, 1, ast->forstmt.initializer);
Oct 28, 2010
Oct 28, 2010
331
} // if
Nov 1, 2010
Nov 1, 2010
332
333
334
335
fprintf(io, "; ");
print_ast(io, 1, ast->forstmt.looptest);
fprintf(io, "; ");
print_ast(io, 1, ast->forstmt.counter);
Oct 28, 2010
Oct 28, 2010
336
Nov 1, 2010
Nov 1, 2010
337
fprintf(io, ")\n");
Oct 28, 2010
Oct 28, 2010
338
339
isblock = ast->forstmt.statement->ast.type == MOJOSHADER_AST_STATEMENT_BLOCK;
if (!isblock) indent++;
Nov 1, 2010
Nov 1, 2010
340
print_ast(io, 0, ast->forstmt.statement);
Oct 28, 2010
Oct 28, 2010
341
342
if (!isblock) indent--;
Nov 1, 2010
Nov 1, 2010
343
print_ast(io, 0, ast->forstmt.next);
Oct 28, 2010
Oct 28, 2010
344
345
346
347
break;
case MOJOSHADER_AST_STATEMENT_DO:
DO_INDENT;
Nov 1, 2010
Nov 1, 2010
348
349
print_unroll_attr(io, ast->dostmt.unroll);
fprintf(io, "do\n");
Oct 28, 2010
Oct 28, 2010
350
351
352
isblock = ast->dostmt.statement->ast.type == MOJOSHADER_AST_STATEMENT_BLOCK;
if (!isblock) indent++;
Nov 1, 2010
Nov 1, 2010
353
print_ast(io, 0, ast->dostmt.statement);
Oct 28, 2010
Oct 28, 2010
354
355
356
if (!isblock) indent--;
DO_INDENT;
Nov 1, 2010
Nov 1, 2010
357
358
359
fprintf(io, "while (");
print_ast(io, 0, ast->dostmt.expr);
fprintf(io, ");\n");
Oct 28, 2010
Oct 28, 2010
360
Nov 1, 2010
Nov 1, 2010
361
print_ast(io, 0, ast->dostmt.next);
Oct 28, 2010
Oct 28, 2010
362
363
364
365
break;
case MOJOSHADER_AST_STATEMENT_WHILE:
DO_INDENT;
Nov 1, 2010
Nov 1, 2010
366
367
368
369
print_unroll_attr(io, ast->whilestmt.unroll);
fprintf(io, "while (");
print_ast(io, 0, ast->whilestmt.expr);
fprintf(io, ")\n");
Oct 28, 2010
Oct 28, 2010
370
371
372
isblock = ast->whilestmt.statement->ast.type == MOJOSHADER_AST_STATEMENT_BLOCK;
if (!isblock) indent++;
Nov 1, 2010
Nov 1, 2010
373
print_ast(io, 0, ast->whilestmt.statement);
Oct 28, 2010
Oct 28, 2010
374
375
if (!isblock) indent--;
Nov 1, 2010
Nov 1, 2010
376
print_ast(io, 0, ast->whilestmt.next);
Oct 28, 2010
Oct 28, 2010
377
378
379
380
break;
case MOJOSHADER_AST_STATEMENT_RETURN:
DO_INDENT;
Nov 1, 2010
Nov 1, 2010
381
fprintf(io, "return");
Oct 28, 2010
Oct 28, 2010
382
383
if (ast->returnstmt.expr)
{
Nov 1, 2010
Nov 1, 2010
384
385
fprintf(io, " ");
print_ast(io, 0, ast->returnstmt.expr);
Oct 28, 2010
Oct 28, 2010
386
} // if
Nov 1, 2010
Nov 1, 2010
387
388
fprintf(io, ";%s", nl);
print_ast(io, 0, ast->returnstmt.next);
Oct 28, 2010
Oct 28, 2010
389
390
391
392
393
394
395
break;
case MOJOSHADER_AST_STATEMENT_EMPTY:
case MOJOSHADER_AST_STATEMENT_BREAK:
case MOJOSHADER_AST_STATEMENT_CONTINUE:
case MOJOSHADER_AST_STATEMENT_DISCARD:
DO_INDENT;
Nov 1, 2010
Nov 1, 2010
396
fprintf(io, "%s;%s",
Oct 28, 2010
Oct 28, 2010
397
398
simple_stmt[(typeint-MOJOSHADER_AST_STATEMENT_START_RANGE)-1],
nl);
Nov 1, 2010
Nov 1, 2010
399
print_ast(io, 0, ast->stmt.next);
Oct 28, 2010
Oct 28, 2010
400
401
402
403
break;
case MOJOSHADER_AST_COMPUNIT_FUNCTION:
DO_INDENT;
Nov 1, 2010
Nov 1, 2010
404
print_ast(io, 0, ast->funcunit.declaration);
Oct 28, 2010
Oct 28, 2010
405
if (ast->funcunit.definition == NULL)
Nov 1, 2010
Nov 1, 2010
406
fprintf(io, ";%s", nl);
Oct 28, 2010
Oct 28, 2010
407
408
else
{
Nov 1, 2010
Nov 1, 2010
409
410
411
fprintf(io, "%s", nl);
print_ast(io, 0, ast->funcunit.definition);
fprintf(io, "%s", nl);
Oct 28, 2010
Oct 28, 2010
412
} // else
Nov 1, 2010
Nov 1, 2010
413
print_ast(io, 0, ast->funcunit.next);
Oct 28, 2010
Oct 28, 2010
414
415
416
417
break;
case MOJOSHADER_AST_COMPUNIT_TYPEDEF:
DO_INDENT;
Nov 1, 2010
Nov 1, 2010
418
419
420
print_ast(io, 0, ast->typedefunit.type_info);
fprintf(io, "%s", nl);
print_ast(io, 0, ast->typedefunit.next);
Oct 28, 2010
Oct 28, 2010
421
422
423
424
break;
case MOJOSHADER_AST_COMPUNIT_STRUCT:
DO_INDENT;
Nov 1, 2010
Nov 1, 2010
425
426
427
print_ast(io, 0, ast->structunit.struct_info);
fprintf(io, ";%s%s", nl, nl); // always space these out.
print_ast(io, 0, ast->structunit.next);
Oct 28, 2010
Oct 28, 2010
428
429
430
431
break;
case MOJOSHADER_AST_COMPUNIT_VARIABLE:
DO_INDENT;
Nov 1, 2010
Nov 1, 2010
432
433
print_ast(io, 1, ast->varunit.declaration);
fprintf(io, ";%s", nl);
Oct 28, 2010
Oct 28, 2010
434
435
436
if (ast->varunit.next &&
ast->varunit.next->ast.type!=MOJOSHADER_AST_COMPUNIT_VARIABLE)
{
Nov 1, 2010
Nov 1, 2010
437
fprintf(io, "%s", nl); // group vars together, and space out other things.
Oct 28, 2010
Oct 28, 2010
438
} // if
Nov 1, 2010
Nov 1, 2010
439
print_ast(io, 0, ast->varunit.next);
Oct 28, 2010
Oct 28, 2010
440
441
442
break;
case MOJOSHADER_AST_SCALAR_OR_ARRAY:
Nov 1, 2010
Nov 1, 2010
443
fprintf(io, "%s", ast->soa.identifier);
Oct 28, 2010
Oct 28, 2010
444
445
if (ast->soa.isarray)
{
Nov 1, 2010
Nov 1, 2010
446
447
448
fprintf(io, "[");
print_ast(io, 0, ast->soa.dimension);
fprintf(io, "]");
Oct 28, 2010
Oct 28, 2010
449
450
451
452
453
} // if
break;
case MOJOSHADER_AST_TYPEDEF:
DO_INDENT;
Nov 1, 2010
Nov 1, 2010
454
fprintf(io, "typedef %s%s ",
Oct 28, 2010
Oct 28, 2010
455
ast->typdef.isconst ? "const " : "", ast->typdef.datatype);
Nov 1, 2010
Nov 1, 2010
456
457
print_ast(io, 0, ast->typdef.details);
fprintf(io, ";%s", nl);
Oct 28, 2010
Oct 28, 2010
458
459
460
break;
case MOJOSHADER_AST_FUNCTION_PARAMS:
Nov 1, 2010
Nov 1, 2010
461
462
fprintf(io, "%s", inpmod[(int) ast->params.input_modifier]);
fprintf(io, "%s %s", ast->params.datatype, ast->params.identifier);
Oct 28, 2010
Oct 28, 2010
463
if (ast->params.semantic)
Nov 1, 2010
Nov 1, 2010
464
465
fprintf(io, " : %s", ast->params.semantic);
fprintf(io, "%s", interpmod[(int) ast->params.interpolation_modifier]);
Oct 28, 2010
Oct 28, 2010
466
467
468
if (ast->params.initializer)
{
Nov 1, 2010
Nov 1, 2010
469
470
fprintf(io, " = ");
print_ast(io, 0, ast->params.initializer);
Oct 28, 2010
Oct 28, 2010
471
472
473
474
} // if
if (ast->params.next)
{
Nov 1, 2010
Nov 1, 2010
475
476
fprintf(io, ", ");
print_ast(io, 0, ast->params.next);
Oct 28, 2010
Oct 28, 2010
477
478
479
480
} // if
break;
case MOJOSHADER_AST_FUNCTION_SIGNATURE:
Nov 1, 2010
Nov 1, 2010
481
482
fprintf(io, "%s", fnstorage[(int) ast->funcsig.storage_class]);
fprintf(io, "%s %s(",
Oct 28, 2010
Oct 28, 2010
483
484
ast->funcsig.datatype ? ast->funcsig.datatype : "void",
ast->funcsig.identifier);
Nov 1, 2010
Nov 1, 2010
485
486
print_ast(io, 0, ast->funcsig.params);
fprintf(io, ")");
Oct 28, 2010
Oct 28, 2010
487
if (ast->funcsig.semantic)
Nov 1, 2010
Nov 1, 2010
488
fprintf(io, " : %s", ast->funcsig.semantic);
Oct 28, 2010
Oct 28, 2010
489
490
491
break;
case MOJOSHADER_AST_STRUCT_DECLARATION:
Nov 1, 2010
Nov 1, 2010
492
fprintf(io, "struct %s\n", ast->structdecl.name);
Oct 28, 2010
Oct 28, 2010
493
DO_INDENT;
Nov 1, 2010
Nov 1, 2010
494
fprintf(io, "{\n");
Oct 28, 2010
Oct 28, 2010
495
indent++;
Nov 1, 2010
Nov 1, 2010
496
print_ast(io, 0, ast->structdecl.members);
Oct 28, 2010
Oct 28, 2010
497
498
indent--;
DO_INDENT;
Nov 1, 2010
Nov 1, 2010
499
fprintf(io, "}");
Oct 28, 2010
Oct 28, 2010
500
501
502
503
break;
case MOJOSHADER_AST_STRUCT_MEMBER:
DO_INDENT;
Nov 1, 2010
Nov 1, 2010
504
505
506
fprintf(io, "%s", interpmod[(int)ast->structmembers.interpolation_mod]);
fprintf(io, "%s ", ast->structmembers.datatype);
print_ast(io, 0, ast->structmembers.details);
Oct 28, 2010
Oct 28, 2010
507
if (ast->structmembers.semantic)
Nov 1, 2010
Nov 1, 2010
508
509
510
fprintf(io, " : %s", ast->structmembers.semantic);
fprintf(io, ";%s", nl);
print_ast(io, 0, ast->structmembers.next);
Oct 28, 2010
Oct 28, 2010
511
512
513
514
515
break;
case MOJOSHADER_AST_VARIABLE_DECLARATION:
DO_INDENT;
if (ast->vardecl.attributes & MOJOSHADER_AST_VARATTR_EXTERN)
Nov 1, 2010
Nov 1, 2010
516
fprintf(io, "extern ");
Oct 28, 2010
Oct 28, 2010
517
if (ast->vardecl.attributes & MOJOSHADER_AST_VARATTR_NOINTERPOLATION)
Nov 1, 2010
Nov 1, 2010
518
fprintf(io, "nointerpolation ");
Oct 28, 2010
Oct 28, 2010
519
if (ast->vardecl.attributes & MOJOSHADER_AST_VARATTR_SHARED)
Nov 1, 2010
Nov 1, 2010
520
fprintf(io, "shared");
Oct 28, 2010
Oct 28, 2010
521
if (ast->vardecl.attributes & MOJOSHADER_AST_VARATTR_STATIC)
Nov 1, 2010
Nov 1, 2010
522
fprintf(io, "static ");
Oct 28, 2010
Oct 28, 2010
523
if (ast->vardecl.attributes & MOJOSHADER_AST_VARATTR_UNIFORM)
Nov 1, 2010
Nov 1, 2010
524
fprintf(io, "uniform ");
Oct 28, 2010
Oct 28, 2010
525
if (ast->vardecl.attributes & MOJOSHADER_AST_VARATTR_VOLATILE)
Nov 1, 2010
Nov 1, 2010
526
fprintf(io, "nointerpolation ");
Oct 28, 2010
Oct 28, 2010
527
if (ast->vardecl.attributes & MOJOSHADER_AST_VARATTR_CONST)
Nov 1, 2010
Nov 1, 2010
528
fprintf(io, "const ");
Oct 28, 2010
Oct 28, 2010
529
if (ast->vardecl.attributes & MOJOSHADER_AST_VARATTR_ROWMAJOR)
Nov 1, 2010
Nov 1, 2010
530
fprintf(io, "rowmajor ");
Oct 28, 2010
Oct 28, 2010
531
if (ast->vardecl.attributes & MOJOSHADER_AST_VARATTR_COLUMNMAJOR)
Nov 1, 2010
Nov 1, 2010
532
fprintf(io, "columnmajor ");
Oct 28, 2010
Oct 28, 2010
533
534
if (ast->vardecl.datatype)
Nov 1, 2010
Nov 1, 2010
535
fprintf(io, "%s", ast->vardecl.datatype);
Oct 28, 2010
Oct 28, 2010
536
else
Nov 1, 2010
Nov 1, 2010
537
538
539
print_ast(io, 0, ast->vardecl.anonymous_datatype);
fprintf(io, " ");
print_ast(io, 0, ast->vardecl.details);
Oct 28, 2010
Oct 28, 2010
540
if (ast->vardecl.semantic)
Nov 1, 2010
Nov 1, 2010
541
fprintf(io, " : %s", ast->vardecl.semantic);
Oct 28, 2010
Oct 28, 2010
542
543
if (ast->vardecl.annotations)
{
Nov 1, 2010
Nov 1, 2010
544
545
fprintf(io, " ");
print_ast(io, 0, ast->vardecl.annotations);
Oct 28, 2010
Oct 28, 2010
546
547
548
} // if
if (ast->vardecl.initializer != NULL)
{
Nov 1, 2010
Nov 1, 2010
549
550
fprintf(io, " = ");
print_ast(io, 0, ast->vardecl.initializer);
Oct 28, 2010
Oct 28, 2010
551
} // if
Nov 1, 2010
Nov 1, 2010
552
print_ast(io, 0, ast->vardecl.lowlevel);
Oct 28, 2010
Oct 28, 2010
553
554
if (ast->vardecl.next == NULL)
Nov 1, 2010
Nov 1, 2010
555
fprintf(io, "%s", nl);
Oct 28, 2010
Oct 28, 2010
556
557
558
else
{
const int attr = ast->vardecl.next->attributes;
Nov 1, 2010
Nov 1, 2010
559
fprintf(io, ", ");
Oct 28, 2010
Oct 28, 2010
560
ast->vardecl.next->attributes = 0;
Nov 1, 2010
Nov 1, 2010
561
print_ast(io, 1, ast->vardecl.next);
Oct 28, 2010
Oct 28, 2010
562
563
564
565
566
ast->vardecl.next->attributes = attr;
} // if
break;
case MOJOSHADER_AST_PACK_OFFSET:
Nov 1, 2010
Nov 1, 2010
567
fprintf(io, " : packoffset(%s%s%s)", ast->packoffset.ident1,
Oct 28, 2010
Oct 28, 2010
568
569
570
571
572
ast->packoffset.ident2 ? "." : "",
ast->packoffset.ident2 ? ast->packoffset.ident2 : "");
break;
case MOJOSHADER_AST_VARIABLE_LOWLEVEL:
Nov 1, 2010
Nov 1, 2010
573
print_ast(io, 0, ast->varlowlevel.packoffset);
Oct 28, 2010
Oct 28, 2010
574
if (ast->varlowlevel.register_name)
Nov 1, 2010
Nov 1, 2010
575
fprintf(io, " : register(%s)", ast->varlowlevel.register_name);
Oct 28, 2010
Oct 28, 2010
576
577
578
579
580
break;
case MOJOSHADER_AST_ANNOTATION:
{
const MOJOSHADER_astAnnotations *a = &ast->annotations;
Nov 1, 2010
Nov 1, 2010
581
fprintf(io, "<");
Oct 28, 2010
Oct 28, 2010
582
583
while (a)
{
Nov 1, 2010
Nov 1, 2010
584
fprintf(io, " %s ", a->datatype);
Oct 28, 2010
Oct 28, 2010
585
586
if (a->initializer != NULL)
{
Nov 1, 2010
Nov 1, 2010
587
588
fprintf(io, " = ");
print_ast(io, 0, a->initializer);
Oct 28, 2010
Oct 28, 2010
589
590
} // if
if (a->next)
Nov 1, 2010
Nov 1, 2010
591
fprintf(io, ",");
Oct 28, 2010
Oct 28, 2010
592
593
a = a->next;
} // while
Nov 1, 2010
Nov 1, 2010
594
fprintf(io, " >");
Oct 28, 2010
Oct 28, 2010
595
596
597
598
599
600
601
602
603
604
605
break;
} // case
default:
assert(0 && "unexpected type");
break;
} // switch
#undef DO_INDENT
} // print_ast
Feb 19, 2009
Feb 19, 2009
606
Feb 19, 2009
Feb 19, 2009
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
static int open_include(MOJOSHADER_includeType inctype, const char *fname,
const char *parent, const char **outdata,
unsigned int *outbytes, MOJOSHADER_malloc m,
MOJOSHADER_free f, void *d)
{
int i;
for (i = 0; i < include_path_count; i++)
{
const char *path = include_paths[i];
const size_t len = strlen(path) + strlen(fname) + 2;
char *buf = (char *) m(len, d);
if (buf == NULL)
return 0;
snprintf(buf, len, "%s/%s", path, fname);
FILE *io = fopen(buf, "rb");
f(buf, d);
if (io == NULL)
continue;
if (fseek(io, 0, SEEK_END) != -1)
{
const long fsize = ftell(io);
if ((fsize == -1) || (fseek(io, 0, SEEK_SET) == -1))
{
fclose(io);
return 0;
} // if
char *data = (char *) m(fsize, d);
if (data == NULL)
{
fclose(io);
return 0;
} // if
if (fread(data, fsize, 1, io) != 1)
{
f(data, d);
fclose(io);
return 0;
} // if
fclose(io);
*outdata = data;
*outbytes = (unsigned int) fsize;
return 1;
} // if
} // for
return 0;
} // open_include
Feb 19, 2009
Feb 19, 2009
661
662
static void close_include(const char *data, MOJOSHADER_malloc m,
MOJOSHADER_free f, void *d)
Feb 19, 2009
Feb 19, 2009
663
664
665
666
667
{
f((void *) data, d);
} // close_include
Feb 12, 2009
Feb 12, 2009
668
static int preprocess(const char *fname, const char *buf, int len,
Feb 19, 2009
Feb 19, 2009
669
670
const char *outfile,
const MOJOSHADER_preprocessorDefine *defs,
Feb 19, 2009
Feb 19, 2009
671
unsigned int defcount, FILE *io)
672
673
674
675
{
const MOJOSHADER_preprocessData *pd;
int retval = 0;
Feb 19, 2009
Feb 19, 2009
676
677
pd = MOJOSHADER_preprocess(fname, buf, len, defs, defcount, open_include,
close_include, Malloc, Free, NULL);
678
679
680
681
682
683
if (pd->error_count > 0)
{
int i;
for (i = 0; i < pd->error_count; i++)
{
Mar 5, 2010
Mar 5, 2010
684
fprintf(stderr, "%s:%d: ERROR: %s\n",
Feb 12, 2009
Feb 12, 2009
685
pd->errors[i].filename ? pd->errors[i].filename : "???",
686
687
688
689
690
691
692
693
pd->errors[i].error_position,
pd->errors[i].error);
} // for
} // if
else
{
if (pd->output != NULL)
{
Apr 9, 2009
Apr 9, 2009
694
695
const int len = pd->output_len;
if ((len) && (fwrite(pd->output, len, 1, io) != 1))
696
printf(" ... fwrite('%s') failed.\n", outfile);
Feb 19, 2009
Feb 19, 2009
697
else if ((outfile != NULL) && (fclose(io) == EOF))
698
699
700
701
702
703
704
705
printf(" ... fclose('%s') failed.\n", outfile);
else
retval = 1;
} // if
} // else
MOJOSHADER_freePreprocessData(pd);
return retval;
Feb 10, 2009
Feb 10, 2009
706
} // preprocess
Feb 19, 2009
Feb 19, 2009
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
static int assemble(const char *fname, const char *buf, int len,
const char *outfile,
const MOJOSHADER_preprocessorDefine *defs,
unsigned int defcount, FILE *io)
{
const MOJOSHADER_parseData *pd;
int retval = 0;
pd = MOJOSHADER_assemble(fname, buf, len, NULL, 0, NULL, 0,
defs, defcount, open_include, close_include,
Malloc, Free, NULL);
if (pd->error_count > 0)
{
int i;
for (i = 0; i < pd->error_count; i++)
{
Mar 5, 2010
Mar 5, 2010
726
fprintf(stderr, "%s:%d: ERROR: %s\n",
Feb 19, 2009
Feb 19, 2009
727
728
729
730
731
732
733
734
735
pd->errors[i].filename ? pd->errors[i].filename : "???",
pd->errors[i].error_position,
pd->errors[i].error);
} // for
} // if
else
{
if (pd->output != NULL)
{
Apr 9, 2009
Apr 9, 2009
736
737
const int len = pd->output_len;
if ((len) && (fwrite(pd->output, len, 1, io) != 1))
Feb 19, 2009
Feb 19, 2009
738
739
740
741
742
743
744
745
746
747
748
749
printf(" ... fwrite('%s') failed.\n", outfile);
else if ((outfile != NULL) && (fclose(io) == EOF))
printf(" ... fclose('%s') failed.\n", outfile);
else
retval = 1;
} // if
} // else
MOJOSHADER_freeParseData(pd);
return retval;
} // assemble
Oct 28, 2010
Oct 28, 2010
750
751
752
753
static int ast(const char *fname, const char *buf, int len,
const char *outfile, const MOJOSHADER_preprocessorDefine *defs,
unsigned int defcount, FILE *io)
{
Nov 1, 2010
Nov 1, 2010
754
755
const MOJOSHADER_astData *ad;
int retval = 0;
Oct 28, 2010
Oct 28, 2010
756
Nov 1, 2010
Nov 1, 2010
757
ad = MOJOSHADER_parseAst(MOJOSHADER_SRC_PROFILE_HLSL_PS_1_1, // !!! FIXME
Oct 28, 2010
Oct 28, 2010
758
759
fname, buf, len, defs, defcount,
open_include, close_include, Malloc, Free, NULL);
Nov 1, 2010
Nov 1, 2010
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
if (ad->error_count > 0)
{
int i;
for (i = 0; i < ad->error_count; i++)
{
fprintf(stderr, "%s:%d: ERROR: %s\n",
ad->errors[i].filename ? ad->errors[i].filename : "???",
ad->errors[i].error_position,
ad->errors[i].error);
} // for
} // if
else
{
print_ast(io, 0, ad->ast);
if ((outfile != NULL) && (fclose(io) == EOF))
printf(" ... fclose('%s') failed.\n", outfile);
else
retval = 1;
} // else
return retval;
Oct 28, 2010
Oct 28, 2010
782
} // ast
Feb 28, 2009
Feb 28, 2009
783
784
785
786
787
788
static int compile(const char *fname, const char *buf, int len,
const char *outfile,
const MOJOSHADER_preprocessorDefine *defs,
unsigned int defcount, FILE *io)
{
Aug 26, 2009
Aug 26, 2009
789
790
791
// !!! FIXME: write me.
//const MOJOSHADER_parseData *pd;
//int retval = 0;
Feb 28, 2009
Feb 28, 2009
792
Oct 28, 2010
Oct 28, 2010
793
794
MOJOSHADER_compile(MOJOSHADER_SRC_PROFILE_HLSL_PS_1_1, // !!! FIXME
fname, buf, len, defs, defcount,
Feb 28, 2009
Feb 28, 2009
795
796
797
798
open_include, close_include,
Malloc, Free, NULL);
return 1;
} // compile
Feb 19, 2009
Feb 19, 2009
799
800
801
802
typedef enum
{
ACTION_UNKNOWN,
Mar 10, 2010
Mar 10, 2010
803
ACTION_VERSION,
Feb 19, 2009
Feb 19, 2009
804
805
ACTION_PREPROCESS,
ACTION_ASSEMBLE,
Oct 28, 2010
Oct 28, 2010
806
ACTION_AST,
Feb 28, 2009
Feb 28, 2009
807
ACTION_COMPILE,
Feb 19, 2009
Feb 19, 2009
808
809
810
} Action;
811
812
int main(int argc, char **argv)
{
Feb 19, 2009
Feb 19, 2009
813
Action action = ACTION_UNKNOWN;
814
int retval = 1;
Feb 19, 2009
Feb 19, 2009
815
816
817
const char *infile = NULL;
const char *outfile = NULL;
int i;
Feb 19, 2009
Feb 19, 2009
819
820
821
MOJOSHADER_preprocessorDefine *defs = NULL;
unsigned int defcount = 0;
Feb 23, 2009
Feb 23, 2009
822
823
824
825
include_paths = (const char **) malloc(sizeof (char *));
include_paths[0] = ".";
include_path_count = 1;
Oct 28, 2010
Oct 28, 2010
826
// !!! FIXME: clean this up.
Feb 19, 2009
Feb 19, 2009
827
828
829
830
for (i = 1; i < argc; i++)
{
const char *arg = argv[i];
Feb 19, 2009
Feb 19, 2009
831
832
if (strcmp(arg, "-P") == 0)
{
Feb 24, 2009
Feb 24, 2009
833
if ((action != ACTION_UNKNOWN) && (action != ACTION_PREPROCESS))
Feb 19, 2009
Feb 19, 2009
834
835
836
837
838
839
fail("Multiple actions specified");
action = ACTION_PREPROCESS;
} // if
else if (strcmp(arg, "-A") == 0)
{
Feb 24, 2009
Feb 24, 2009
840
if ((action != ACTION_UNKNOWN) && (action != ACTION_ASSEMBLE))
Feb 19, 2009
Feb 19, 2009
841
842
843
844
fail("Multiple actions specified");
action = ACTION_ASSEMBLE;
} // else if
Oct 28, 2010
Oct 28, 2010
845
846
847
848
849
850
851
else if (strcmp(arg, "-T") == 0)
{
if ((action != ACTION_UNKNOWN) && (action != ACTION_AST))
fail("Multiple actions specified");
action = ACTION_AST;
} // else if
Feb 28, 2009
Feb 28, 2009
852
853
854
855
856
857
858
else if (strcmp(arg, "-C") == 0)
{
if ((action != ACTION_UNKNOWN) && (action != ACTION_COMPILE))
fail("Multiple actions specified");
action = ACTION_COMPILE;
} // else if
Mar 10, 2010
Mar 10, 2010
859
860
861
862
863
864
865
else if ((strcmp(arg, "-V") == 0) || (strcmp(arg, "--version") == 0))
{
if ((action != ACTION_UNKNOWN) && (action != ACTION_VERSION))
fail("Multiple actions specified");
action = ACTION_VERSION;
} // else if
Feb 19, 2009
Feb 19, 2009
866
else if (strcmp(arg, "-o") == 0)
Feb 19, 2009
Feb 19, 2009
867
868
{
if (outfile != NULL)
Feb 19, 2009
Feb 19, 2009
869
fail("multiple output files specified");
Feb 19, 2009
Feb 19, 2009
870
871
872
arg = argv[++i];
if (arg == NULL)
Feb 19, 2009
Feb 19, 2009
873
fail("no filename after '-o'");
Feb 19, 2009
Feb 19, 2009
874
875
876
outfile = arg;
} // if
Feb 19, 2009
Feb 19, 2009
877
else if (strcmp(arg, "-I") == 0)
Feb 19, 2009
Feb 19, 2009
878
879
880
{
arg = argv[++i];
if (arg == NULL)
Feb 19, 2009
Feb 19, 2009
881
882
fail("no path after '-I'");
Feb 19, 2009
Feb 19, 2009
883
884
885
886
887
888
include_paths = (const char **) realloc(include_paths,
(include_path_count+1) * sizeof (char *));
include_paths[include_path_count] = arg;
include_path_count++;
} // if
Feb 19, 2009
Feb 19, 2009
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
else if (strncmp(arg, "-D", 2) == 0)
{
arg += 2;
char *ident = strdup(arg);
char *ptr = strchr(ident, '=');
const char *val = "";
if (ptr)
{
*ptr = '\0';
val = ptr+1;
} // if
defs = (MOJOSHADER_preprocessorDefine *) realloc(defs,
(defcount+1) * sizeof (MOJOSHADER_preprocessorDefine));
defs[defcount].identifier = ident;
defs[defcount].definition = val;
defcount++;
} // else if
else
{
if (infile != NULL)
Feb 19, 2009
Feb 19, 2009
911
fail("multiple input files specified");
Feb 19, 2009
Feb 19, 2009
912
913
914
915
infile = arg;
} // else
} // for
Feb 19, 2009
Feb 19, 2009
916
917
918
if (action == ACTION_UNKNOWN)
action = ACTION_ASSEMBLE;
Mar 10, 2010
Mar 10, 2010
919
920
921
922
923
924
if (action == ACTION_VERSION)
{
printf("mojoshader-compiler, changeset %s\n", MOJOSHADER_CHANGESET);
return 0;
} // if
Feb 19, 2009
Feb 19, 2009
925
if (infile == NULL)
Feb 19, 2009
Feb 19, 2009
926
fail("no input file specified");
Feb 19, 2009
Feb 19, 2009
927
928
929
FILE *io = fopen(infile, "rb");
if (io == NULL)
Feb 19, 2009
Feb 19, 2009
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
fail("failed to open input file");
fseek(io, 0, SEEK_END);
long fsize = ftell(io);
fseek(io, 0, SEEK_SET);
if (fsize == -1)
fsize = 1000000;
char *buf = (char *) malloc(fsize);
const int rc = fread(buf, 1, fsize, io);
fclose(io);
if (rc == EOF)
fail("failed to read input file");
FILE *outio = outfile ? fopen(outfile, "wb") : stdout;
if (outio == NULL)
fail("failed to open output file");
if (action == ACTION_PREPROCESS)
retval = (!preprocess(infile, buf, rc, outfile, defs, defcount, outio));
else if (action == ACTION_ASSEMBLE)
retval = (!assemble(infile, buf, rc, outfile, defs, defcount, outio));
Oct 28, 2010
Oct 28, 2010
952
953
else if (action == ACTION_AST)
retval = (!ast(infile, buf, rc, outfile, defs, defcount, outio));
Feb 28, 2009
Feb 28, 2009
954
955
else if (action == ACTION_COMPILE)
retval = (!compile(infile, buf, rc, outfile, defs, defcount, outio));
Feb 19, 2009
Feb 19, 2009
956
957
958
959
960
if ((retval != 0) && (outfile != NULL))
remove(outfile);
free(buf);
Feb 19, 2009
Feb 19, 2009
962
for (i = 0; i < defcount; i++)
Feb 19, 2009
Feb 19, 2009
963
free((void *) defs[i].identifier);
Feb 19, 2009
Feb 19, 2009
964
965
free(defs);
Feb 19, 2009
Feb 19, 2009
966
967
free(include_paths);
968
969
970
return retval;
} // main
Feb 19, 2009
Feb 19, 2009
971
// end of mojoshader-compiler.c ...