2 * Copyright © 2010 Intel Corporation
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21 * DEALINGS IN THE SOFTWARE.
30 #include "main/mtypes.h"
31 #include "main/shaderobj.h"
32 #include "util/strtod.h"
34 extern int glcpp_parser_debug
;
37 _mesa_reference_shader(struct gl_context
*ctx
, struct gl_shader
**ptr
,
44 /* Read from fp until EOF and return a string of everything read.
47 load_text_fp (void *ctx
, FILE *fp
)
52 size_t total_read
= 0;
56 if (total_read
+ CHUNK
+ 1 > text_size
) {
57 text_size
= text_size
? text_size
* 2 : CHUNK
+ 1;
58 text
= reralloc_size (ctx
, text
, text_size
);
60 fprintf (stderr
, "Out of memory\n");
64 bytes
= fread (text
+ total_read
, 1, CHUNK
, fp
);
72 text
[total_read
] = '\0';
78 load_text_file(void *ctx
, const char *filename
)
83 if (filename
== NULL
|| strcmp (filename
, "-") == 0)
84 return load_text_fp (ctx
, stdin
);
86 fp
= fopen (filename
, "r");
88 fprintf (stderr
, "Failed to open file %s: %s\n",
89 filename
, strerror (errno
));
93 text
= load_text_fp (ctx
, fp
);
100 /* Initialize only those things that glcpp cares about.
103 init_fake_gl_context (struct gl_context
*gl_ctx
)
105 gl_ctx
->API
= API_OPENGL_COMPAT
;
106 gl_ctx
->Const
.DisableGLSLLineContinuations
= false;
113 "Usage: glcpp [OPTIONS] [--] [<filename>]\n"
115 "Pre-process the given filename (stdin if no filename given).\n"
116 "The following options are supported:\n"
117 " --disable-line-continuations Do not interpret lines ending with a\n"
118 " backslash ('\\') as a line continuation.\n");
122 DISABLE_LINE_CONTINUATIONS_OPT
= CHAR_MAX
+ 1
125 static const struct option
127 {"disable-line-continuations", no_argument
, 0, DISABLE_LINE_CONTINUATIONS_OPT
},
128 {"debug", no_argument
, 0, 'd'},
133 main (int argc
, char *argv
[])
135 char *filename
= NULL
;
136 void *ctx
= ralloc(NULL
, void*);
137 char *info_log
= ralloc_strdup(ctx
, "");
140 struct gl_context gl_ctx
;
143 init_fake_gl_context (&gl_ctx
);
145 while ((c
= getopt_long(argc
, argv
, "d", long_options
, NULL
)) != -1) {
147 case DISABLE_LINE_CONTINUATIONS_OPT
:
148 gl_ctx
.Const
.DisableGLSLLineContinuations
= true;
151 glcpp_parser_debug
= 1;
159 if (optind
+ 1 < argc
) {
160 printf ("Unexpected argument: %s\n", argv
[optind
+1]);
165 filename
= argv
[optind
];
168 shader
= load_text_file (ctx
, filename
);
174 ret
= glcpp_preprocess(ctx
, &shader
, &info_log
, NULL
, &gl_ctx
);
176 printf("%s", shader
);
177 fprintf(stderr
, "%s", info_log
);