Home | History | Annotate | Download | only in glcpp
      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    (void) ctx;
     38    *ptr = sh;
     39 }
     40 
     41 /* Read from fp until EOF and return a string of everything read.
     42  */
     43 static char *
     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 *
     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
     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