"Fossies" - the Fresh Open Source Software Archive

Member "mesa-20.1.8/src/compiler/glsl/glcpp/glcpp.c" (16 Sep 2020, 4412 Bytes) of package /linux/misc/mesa-20.1.8.tar.xz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "glcpp.c" see the Fossies "Dox" file reference documentation.

    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 <getopt.h>
   28 
   29 #include "glcpp.h"
   30 #include "main/mtypes.h"
   31 #include "main/shaderobj.h"
   32 #include "util/strtod.h"
   33 
   34 extern int glcpp_parser_debug;
   35 
   36 void
   37 _mesa_reference_shader(struct gl_context *ctx, struct gl_shader **ptr,
   38                        struct gl_shader *sh)
   39 {
   40    (void) ctx;
   41    *ptr = sh;
   42 }
   43 
   44 /* Read from fp until EOF and return a string of everything read.
   45  */
   46 static char *
   47 load_text_fp (void *ctx, FILE *fp)
   48 {
   49 #define CHUNK 4096
   50     char *text = NULL;
   51     size_t text_size = 0;
   52     size_t total_read = 0;
   53     size_t bytes;
   54 
   55     while (1) {
   56         if (total_read + CHUNK + 1 > text_size) {
   57             text_size = text_size ? text_size * 2 : CHUNK + 1;
   58             text = reralloc_size (ctx, text, text_size);
   59             if (text == NULL) {
   60                 fprintf (stderr, "Out of memory\n");
   61                 return NULL;
   62             }
   63         }
   64         bytes = fread (text + total_read, 1, CHUNK, fp);
   65         total_read += bytes;
   66 
   67         if (bytes < CHUNK) {
   68             break;
   69         }
   70     }
   71 
   72     text[total_read] = '\0';
   73 
   74     return text;
   75 }
   76 
   77 static char *
   78 load_text_file(void *ctx, const char *filename)
   79 {
   80     char *text;
   81     FILE *fp;
   82 
   83     if (filename == NULL || strcmp (filename, "-") == 0)
   84         return load_text_fp (ctx, stdin);
   85 
   86     fp = fopen (filename, "r");
   87     if (fp == NULL) {
   88         fprintf (stderr, "Failed to open file %s: %s\n",
   89              filename, strerror (errno));
   90         return NULL;
   91     }
   92 
   93     text = load_text_fp (ctx, fp);
   94 
   95     fclose(fp);
   96 
   97     return text;
   98 }
   99 
  100 /* Initialize only those things that glcpp cares about.
  101  */
  102 static void
  103 init_fake_gl_context (struct gl_context *gl_ctx)
  104 {
  105     gl_ctx->API = API_OPENGL_COMPAT;
  106     gl_ctx->Const.DisableGLSLLineContinuations = false;
  107 }
  108 
  109 static void
  110 usage (void)
  111 {
  112     fprintf (stderr,
  113          "Usage: glcpp [OPTIONS] [--] [<filename>]\n"
  114          "\n"
  115          "Pre-process the given filename (stdin if no filename given).\n"
  116          "The following options are supported:\n"
  117          "    --disable-line-continuations      Do not interpret lines ending with a\n"
  118          "                                      backslash ('\\') as a line continuation.\n");
  119 }
  120 
  121 enum {
  122     DISABLE_LINE_CONTINUATIONS_OPT = CHAR_MAX + 1
  123 };
  124 
  125 static const struct option
  126 long_options[] = {
  127     {"disable-line-continuations", no_argument, 0, DISABLE_LINE_CONTINUATIONS_OPT },
  128         {"debug",                      no_argument, 0, 'd'},
  129     {0,                            0,           0, 0 }
  130 };
  131 
  132 int
  133 main (int argc, char *argv[])
  134 {
  135     char *filename = NULL;
  136     void *ctx = ralloc(NULL, void*);
  137     char *info_log = ralloc_strdup(ctx, "");
  138     const char *shader;
  139     int ret;
  140     struct gl_context gl_ctx;
  141     int c;
  142 
  143     init_fake_gl_context (&gl_ctx);
  144 
  145     while ((c = getopt_long(argc, argv, "d", long_options, NULL)) != -1) {
  146         switch (c) {
  147         case DISABLE_LINE_CONTINUATIONS_OPT:
  148             gl_ctx.Const.DisableGLSLLineContinuations = true;
  149             break;
  150                 case 'd':
  151             glcpp_parser_debug = 1;
  152             break;
  153         default:
  154             usage ();
  155             exit (1);
  156         }
  157     }
  158 
  159     if (optind + 1 < argc) {
  160         printf ("Unexpected argument: %s\n", argv[optind+1]);
  161         usage ();
  162         exit (1);
  163     }
  164     if (optind < argc) {
  165         filename = argv[optind];
  166     }
  167 
  168     shader = load_text_file (ctx, filename);
  169     if (shader == NULL)
  170        return 1;
  171 
  172     _mesa_locale_init();
  173 
  174     ret = glcpp_preprocess(ctx, &shader, &info_log, NULL, NULL, &gl_ctx);
  175 
  176     printf("%s", shader);
  177     fprintf(stderr, "%s", info_log);
  178 
  179     ralloc_free(ctx);
  180 
  181     return ret;
  182 }