Complain and exit if the given shader file doesn't exist.
[mesa.git] / main.cpp
index 9301d5113f5021a296585665cc53ca33afaf324f..b8b99bf0bb060761b04aae6b294ca49e8ae89f1e 100644 (file)
--- a/main.cpp
+++ b/main.cpp
 #include <fcntl.h>
 #include <unistd.h>
 
+extern "C" {
+#include <talloc.h>
+}
+
 #include "ast.h"
 #include "glsl_parser_extras.h"
 #include "glsl_parser.h"
@@ -114,6 +118,7 @@ compile_shader(struct glsl_shader *shader)
    state.scanner = NULL;
    state.translation_unit.make_empty();
    state.symbols = new glsl_symbol_table;
+   state.info_log = talloc_strdup(shader, "");
    state.error = false;
    state.temp_index = 0;
    state.loop_or_switch_nesting = NULL;
@@ -160,6 +165,12 @@ compile_shader(struct glsl_shader *shader)
 
    shader->symbols = state.symbols;
    shader->CompileStatus = !state.error;
+
+   if (shader->InfoLog)
+      talloc_free(shader->InfoLog);
+
+   shader->InfoLog = state.info_log;
+
    return;
 }
 
@@ -186,8 +197,8 @@ main(int argc, char **argv)
                 sizeof(struct glsl_shader *) * (whole_program.NumShaders + 1));
       assert(whole_program.Shaders != NULL);
 
-      struct glsl_shader *shader = new glsl_shader;
-      memset(shader, 0, sizeof(*shader));
+      /* talloc context should probably be whole_program */
+      struct glsl_shader *shader = talloc_zero(NULL, glsl_shader);
 
       whole_program.Shaders[whole_program.NumShaders] = shader;
       whole_program.NumShaders++;
@@ -207,10 +218,15 @@ main(int argc, char **argv)
         usage_fail(argv[0]);
 
       shader->Source = load_text_file(argv[optind], &shader->SourceLen);
+      if (shader->Source == NULL) {
+        printf("File \"%s\" does not exist.\n", argv[optind]);
+        exit(EXIT_FAILURE);
+      }
 
       compile_shader(shader);
 
       if (!shader->CompileStatus) {
+        printf("Info log for %s:\n%s\n", argv[optind], shader->InfoLog);
         status = EXIT_FAILURE;
         break;
       }