summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenneth Graunke <kenneth@whitecape.org>2010-06-23 14:00:27 -0700
committerIan Romanick <ian.d.romanick@intel.com>2010-06-23 14:14:57 -0700
commit186e2634bfb8f624f3721673964e29428269cd47 (patch)
treeeb3550a672afa99aa7dc16cb84df4c43ca1cd59b
parent12a820c9d84cec0e2f36d9571ca841499b67eac4 (diff)
glcpp: Make standalone binary use preprocess().
This prevents the two code paths from getting out of sync. Also, future work will need the shader source as a string anyway. Unfortunately, this copies and pastes load_text_file from main.cpp, with small changes (support for reading from stdin, talloc).
-rw-r--r--glcpp/glcpp.c62
-rw-r--r--glcpp/glcpp.h3
2 files changed, 56 insertions, 9 deletions
diff --git a/glcpp/glcpp.c b/glcpp/glcpp.c
index 8ba4661..cc87e14 100644
--- a/glcpp/glcpp.c
+++ b/glcpp/glcpp.c
@@ -21,24 +21,68 @@
* DEALINGS IN THE SOFTWARE.
*/
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
#include "glcpp.h"
extern int yydebug;
-int
-main (void)
+static char *
+load_text_file(void *ctx, const char *file_name)
{
- glcpp_parser_t *parser;
- int ret;
+ char *text = NULL;
+ struct stat st;
+ ssize_t total_read = 0;
+ int fd = file_name == NULL ? STDIN_FILENO : open(file_name, O_RDONLY);
+
+ if (fd < 0) {
+ return NULL;
+ }
+
+ if (fstat(fd, & st) == 0) {
+ text = (char *) talloc_size(ctx, st.st_size + 1);
+ if (text != NULL) {
+ do {
+ ssize_t bytes = read(fd, text + total_read,
+ st.st_size - total_read);
+ if (bytes < 0) {
+ text = NULL;
+ break;
+ }
+
+ if (bytes == 0) {
+ break;
+ }
+
+ total_read += bytes;
+ } while (total_read < st.st_size);
+
+ text[total_read] = '\0';
+ }
+ }
- parser = glcpp_parser_create ();
+ close(fd);
- ret = glcpp_parser_parse (parser);
+ return text;
+}
+
+int
+preprocess(void *talloc_ctx, const char **shader, char **info_log);
+
+int
+main (void)
+{
+ void *ctx = talloc(NULL, void*);
+ const char *shader = load_text_file(ctx, NULL);
+ char *info_log = talloc_strdup(ctx, "");
+ int ret = preprocess(ctx, &shader, &info_log);
- printf("%s", parser->output);
- fprintf(stderr, "%s", parser->info_log);
+ printf("%s", shader);
+ fprintf(stderr, "%s", info_log);
- glcpp_parser_destroy (parser);
+ talloc_free(ctx);
return ret;
}
diff --git a/glcpp/glcpp.h b/glcpp/glcpp.h
index bb0ac95..2cfa98d 100644
--- a/glcpp/glcpp.h
+++ b/glcpp/glcpp.h
@@ -167,6 +167,9 @@ glcpp_parser_parse (glcpp_parser_t *parser);
void
glcpp_parser_destroy (glcpp_parser_t *parser);
+int
+preprocess(void *talloc_ctx, const char **shader, char **info_log);
+
/* Functions for writing to the info log */
void