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