blob: 56714936bbce059ea662d359a0ea62b0dc782a67 [file] [log] [blame]
Carl Worth3a37b872010-05-10 11:44:09 -07001/*
2 * Copyright © 2010 Intel Corporation
3 *
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:
10 *
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
13 * Software.
14 *
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.
22 */
23
Kenneth Graunke186e2632010-06-23 14:00:27 -070024#include <sys/types.h>
25#include <sys/stat.h>
26#include <fcntl.h>
27#include <unistd.h>
Carl Worthcf8bb192010-08-23 09:42:14 -070028#include <string.h>
29#include <errno.h>
Carl Wortha1e32bc2010-05-10 13:17:25 -070030#include "glcpp.h"
31
Carl Worth33cc4002010-05-12 12:17:10 -070032extern int yydebug;
33
Carl Worth61f73fe2010-08-23 10:43:27 -070034/* Read from fd until EOF and return a string of everything read.
35 */
Kenneth Graunke186e2632010-06-23 14:00:27 -070036static char *
Carl Worth61f73fe2010-08-23 10:43:27 -070037load_text_fd (void *ctx, int fd)
Kenneth Graunke186e2632010-06-23 14:00:27 -070038{
Carl Worth61f73fe2010-08-23 10:43:27 -070039#define CHUNK 4096
Kenneth Graunke186e2632010-06-23 14:00:27 -070040 char *text = NULL;
Carl Worth61f73fe2010-08-23 10:43:27 -070041 ssize_t text_size = 0;
Kenneth Graunke186e2632010-06-23 14:00:27 -070042 ssize_t total_read = 0;
Carl Worth61f73fe2010-08-23 10:43:27 -070043 ssize_t bytes;
44
45 while (1) {
46 if (total_read + CHUNK + 1 > text_size) {
47 text_size = text_size ? text_size * 2 : CHUNK + 1;
48 text = talloc_realloc_size (ctx, text, text_size);
49 if (text == NULL) {
50 fprintf (stderr, "Out of memory\n");
51 return NULL;
52 }
53 }
54 bytes = read (fd, text + total_read, CHUNK);
55 if (bytes < 0) {
56 fprintf (stderr, "Error while reading: %s\n",
57 strerror (errno));
58 talloc_free (text);
59 return NULL;
60 }
61
62 if (bytes == 0) {
63 break;
64 }
65
66 total_read += bytes;
67 }
68
69 text[total_read] = '\0';
70
71 return text;
72}
73
74static char *
75load_text_file(void *ctx, const char *filename)
76{
77 char *text;
Carl Worthcf8bb192010-08-23 09:42:14 -070078 int fd;
Kenneth Graunke186e2632010-06-23 14:00:27 -070079
Carl Worth61f73fe2010-08-23 10:43:27 -070080 if (filename == NULL || strcmp (filename, "-") == 0)
81 return load_text_fd (ctx, STDIN_FILENO);
Carl Worthcf8bb192010-08-23 09:42:14 -070082
Carl Worth61f73fe2010-08-23 10:43:27 -070083 fd = open (filename, O_RDONLY);
84 if (fd < 0) {
85 fprintf (stderr, "Failed to open file %s: %s\n",
86 filename, strerror (errno));
87 return NULL;
Kenneth Graunke186e2632010-06-23 14:00:27 -070088 }
89
Carl Worth61f73fe2010-08-23 10:43:27 -070090 text = load_text_fd (ctx, fd);
Kenneth Graunke186e2632010-06-23 14:00:27 -070091
92 close(fd);
93
94 return text;
95}
96
97int
Carl Worth97638aa2010-08-17 23:13:56 -070098main (int argc, char *argv[])
Carl Worth3a37b872010-05-10 11:44:09 -070099{
Carl Worth97638aa2010-08-17 23:13:56 -0700100 char *filename = NULL;
Kenneth Graunke186e2632010-06-23 14:00:27 -0700101 void *ctx = talloc(NULL, void*);
Kenneth Graunke186e2632010-06-23 14:00:27 -0700102 char *info_log = talloc_strdup(ctx, "");
Carl Worth97638aa2010-08-17 23:13:56 -0700103 const char *shader;
104 int ret;
105
106 if (argc) {
107 filename = argv[1];
108 }
109
Carl Worth61f73fe2010-08-23 10:43:27 -0700110 shader = load_text_file (ctx, filename);
Carl Worthcf8bb192010-08-23 09:42:14 -0700111 if (shader == NULL)
112 return 1;
113
Carl Worth97638aa2010-08-17 23:13:56 -0700114 ret = preprocess(ctx, &shader, &info_log, NULL);
Carl Worth38aa8352010-05-10 11:52:29 -0700115
Kenneth Graunke186e2632010-06-23 14:00:27 -0700116 printf("%s", shader);
117 fprintf(stderr, "%s", info_log);
Carl Worth0b27b5f2010-05-10 16:16:06 -0700118
Kenneth Graunke186e2632010-06-23 14:00:27 -0700119 talloc_free(ctx);
Carl Worth38aa8352010-05-10 11:52:29 -0700120
121 return ret;
Carl Worth3a37b872010-05-10 11:44:09 -0700122}