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