#include "../cl/sl_cl_parse.h"
+static void
+usage(void)
+{
+ printf("Usage:\n");
+ printf(" compile fragment|vertex|geometry <source> <output>\n");
+}
+
int
main(int argc,
char *argv[])
char *inbuf;
struct sl_pp_purify_options options;
char errmsg[100] = "";
- unsigned int errline = 0;
struct sl_pp_context *context;
- struct sl_pp_token_info *tokens;
unsigned int version;
- unsigned int tokens_eaten;
- struct sl_pp_token_info *outtokens;
FILE *out;
- unsigned int i, j;
unsigned char *outbytes;
unsigned int cboutbytes;
unsigned int shader_type;
if (argc != 4) {
+ usage();
return 1;
}
shader_type = 1;
} else if (!strcmp(argv[1], "vertex")) {
shader_type = 2;
+ } else if (!strcmp(argv[1], "geometry")) {
+ shader_type = 3;
} else {
+ usage();
return 1;
}
in = fopen(argv[2], "rb");
if (!in) {
+ printf("Could not open `%s' for read.\n", argv[2]);
+ usage();
return 1;
}
fseek(in, 0, SEEK_END);
size = ftell(in);
+ assert(size != -1);
fseek(in, 0, SEEK_SET);
out = fopen(argv[3], "w");
if (!out) {
fclose(in);
+ printf("Could not open `%s' for write.\n", argv[3]);
+ usage();
return 1;
}
fclose(out);
fclose(in);
- return 1;
+ printf("Out of memory.\n");
+ return 0;
}
if (fread(inbuf, 1, size, in) != size) {
free(inbuf);
fclose(out);
fclose(in);
- return 1;
+ printf("Could not read from `%s'.\n", argv[2]);
+ return 0;
}
inbuf[size] = '\0';
memset(&options, 0, sizeof(options));
- context = sl_pp_context_create();
+ context = sl_pp_context_create(inbuf, &options);
if (!context) {
fprintf(out, "$CONTEXERROR\n");
free(inbuf);
fclose(out);
- return 1;
+ printf("Could not create parse context.\n");
+ return 0;
}
- if (sl_pp_tokenise(context, inbuf, &options, &tokens)) {
+ if (sl_pp_version(context, &version)) {
fprintf(out, "$ERROR: `%s'\n", sl_pp_context_error_message(context));
+ printf("Error: %s\n", sl_pp_context_error_message(context));
sl_pp_context_destroy(context);
free(inbuf);
fclose(out);
- return 1;
- }
-
- free(inbuf);
-
- if (sl_pp_version(context, tokens, &version, &tokens_eaten)) {
- fprintf(out, "$ERROR: `%s'\n", sl_pp_context_error_message(context));
-
- sl_pp_context_destroy(context);
- free(tokens);
- fclose(out);
- return -1;
+ return 0;
}
- if (sl_pp_process(context, &tokens[tokens_eaten], &outtokens)) {
+ if (sl_pp_context_add_extension(context, "GL_ARB_draw_buffers") ||
+ sl_pp_context_add_extension(context, "GL_ARB_texture_rectangle")) {
fprintf(out, "$ERROR: `%s'\n", sl_pp_context_error_message(context));
+ printf("Error: %s\n", sl_pp_context_error_message(context));
sl_pp_context_destroy(context);
- free(tokens);
+ free(inbuf);
fclose(out);
- return -1;
+ return 0;
}
- free(tokens);
-
- for (i = j = 0; outtokens[i].token != SL_PP_EOF; i++) {
- switch (outtokens[i].token) {
- case SL_PP_NEWLINE:
- case SL_PP_EXTENSION_REQUIRE:
- case SL_PP_EXTENSION_ENABLE:
- case SL_PP_EXTENSION_WARN:
- case SL_PP_EXTENSION_DISABLE:
- case SL_PP_LINE:
- break;
- default:
- outtokens[j++] = outtokens[i];
- }
- }
- outtokens[j] = outtokens[i];
-
- if (sl_cl_compile(context, outtokens, shader_type, 1, &outbytes, &cboutbytes, errmsg, sizeof(errmsg)) == 0) {
+ if (sl_cl_compile(context, shader_type, 1, &outbytes, &cboutbytes, errmsg, sizeof(errmsg)) == 0) {
unsigned int i;
unsigned int line = 0;
free(outbytes);
} else {
fprintf(out, "$SYNTAXERROR: `%s'\n", errmsg);
- return -1;
+
+ printf("Error: %s\n", errmsg);
}
sl_pp_context_destroy(context);
- free(outtokens);
+ free(inbuf);
fclose(out);
-
return 0;
}