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
31extern int yydebug;
32
33void
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 */
43static char *
44load_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
74static char *
75load_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
97int
98main (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