• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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 
24 #include <stdio.h>
25 #include <string.h>
26 #include <errno.h>
27 #include "glcpp.h"
28 #include "main/mtypes.h"
29 #include "main/shaderobj.h"
30 
31 extern int yydebug;
32 
33 void
_mesa_reference_shader(struct gl_context * ctx,struct gl_shader ** ptr,struct gl_shader * sh)34 _mesa_reference_shader(struct gl_context *ctx, struct gl_shader **ptr,
35                        struct gl_shader *sh)
36 {
37    (void) ctx;
38    *ptr = sh;
39 }
40 
41 /* Read from fp until EOF and return a string of everything read.
42  */
43 static char *
load_text_fp(void * ctx,FILE * fp)44 load_text_fp (void *ctx, FILE *fp)
45 {
46 #define CHUNK 4096
47 	char *text = NULL;
48 	size_t text_size = 0;
49 	size_t total_read = 0;
50 	size_t bytes;
51 
52 	while (1) {
53 		if (total_read + CHUNK + 1 > text_size) {
54 			text_size = text_size ? text_size * 2 : CHUNK + 1;
55 			text = reralloc_size (ctx, text, text_size);
56 			if (text == NULL) {
57 				fprintf (stderr, "Out of memory\n");
58 				return NULL;
59 			}
60 		}
61 		bytes = fread (text + total_read, 1, CHUNK, fp);
62 		total_read += bytes;
63 
64 		if (bytes < CHUNK) {
65 			break;
66 		}
67 	}
68 
69 	text[total_read] = '\0';
70 
71 	return text;
72 }
73 
74 static char *
load_text_file(void * ctx,const char * filename)75 load_text_file(void *ctx, const char *filename)
76 {
77 	char *text;
78 	FILE *fp;
79 
80 	if (filename == NULL || strcmp (filename, "-") == 0)
81 		return load_text_fp (ctx, stdin);
82 
83 	fp = fopen (filename, "r");
84 	if (fp == NULL) {
85 		fprintf (stderr, "Failed to open file %s: %s\n",
86 			 filename, strerror (errno));
87 		return NULL;
88 	}
89 
90 	text = load_text_fp (ctx, fp);
91 
92 	fclose(fp);
93 
94 	return text;
95 }
96 
97 int
main(int argc,char * argv[])98 main (int argc, char *argv[])
99 {
100 	char *filename = NULL;
101 	void *ctx = ralloc(NULL, void*);
102 	char *info_log = ralloc_strdup(ctx, "");
103 	const char *shader;
104 	int ret;
105 
106 	if (argc) {
107 		filename = argv[1];
108 	}
109 
110 	shader = load_text_file (ctx, filename);
111 	if (shader == NULL)
112 	   return 1;
113 
114 	ret = glcpp_preprocess(ctx, &shader, &info_log, NULL, API_OPENGL);
115 
116 	printf("%s", shader);
117 	fprintf(stderr, "%s", info_log);
118 
119 	ralloc_free(ctx);
120 
121 	return ret;
122 }
123