diff options
| author | Michal Krol <michal@vmware.com> | 2009-06-12 12:57:59 +0200 | 
|---|---|---|
| committer | Michal Krol <michal@vmware.com> | 2009-09-07 10:11:32 +0200 | 
| commit | 0d5ef796f847bc51888a8883110cc607494a61f0 (patch) | |
| tree | 313511999b7771611d18c464f1df5190fa744917 /src | |
| parent | 2c9a627b48119b3cafc9fb25239fe929bc4cf8d8 (diff) | |
glsl: Add a tokenise app.
Diffstat (limited to 'src')
| -rw-r--r-- | src/glsl/apps/SConscript | 5 | ||||
| -rw-r--r-- | src/glsl/apps/tokenise.c | 318 | 
2 files changed, 323 insertions, 0 deletions
| diff --git a/src/glsl/apps/SConscript b/src/glsl/apps/SConscript index d68e6b23b3..6af1e55253 100644 --- a/src/glsl/apps/SConscript +++ b/src/glsl/apps/SConscript @@ -16,3 +16,8 @@ env.Program(      target = 'purify',      source = ['purify.c'],  ) + +env.Program( +    target = 'tokenise', +    source = ['tokenise.c'], +) diff --git a/src/glsl/apps/tokenise.c b/src/glsl/apps/tokenise.c new file mode 100644 index 0000000000..2631b82998 --- /dev/null +++ b/src/glsl/apps/tokenise.c @@ -0,0 +1,318 @@ +/************************************************************************** + *  + * Copyright 2009 VMware, Inc. + * All Rights Reserved. + *  + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + *  + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + *  + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + *  + **************************************************************************/ + +#include <stdio.h> +#include <stdlib.h> +#include <assert.h> +#include "../pp/sl_pp_purify.h" +#include "../pp/sl_pp_token.h" + + +int +main(int argc, +     char *argv[]) +{ +   FILE *in; +   long size; +   char *inbuf; +   struct sl_pp_purify_options options; +   char *outbuf; +   struct sl_pp_token_info *tokens; +   FILE *out; +   unsigned int i; + +   if (argc != 3) { +      return 1; +   } + +   in = fopen(argv[1], "rb"); +   if (!in) { +      return 1; +   } + +   fseek(in, 0, SEEK_END); +   size = ftell(in); +   fseek(in, 0, SEEK_SET); + +   inbuf = malloc(size + 1); +   if (!inbuf) { +      fclose(in); +      return 1; +   } + +   if (fread(inbuf, 1, size, in) != size) { +      free(inbuf); +      fclose(in); +      return 1; +   } +   inbuf[size] = '\0'; + +   fclose(in); + +   memset(&options, 0, sizeof(options)); + +   if (sl_pp_purify(inbuf, &options, &outbuf)) { +      free(inbuf); +      return 1; +   } + +   free(inbuf); + +   if (sl_pp_tokenise(outbuf, &tokens)) { +      free(outbuf); +      return 1; +   } + +   free(outbuf); + +   out = fopen(argv[2], "wb"); +   if (!out) { +      free(tokens); +      return 1; +   } + +   for (i = 0; tokens[i].token != SL_PP_EOF; i++) { +      switch (tokens[i].token) { +      case SL_PP_WHITESPACE: +         break; + +      case SL_PP_NEWLINE: +         fprintf(out, "\n"); +         break; + +      case SL_PP_HASH: +         fprintf(out, "# "); +         break; + +      case SL_PP_COMMA: +         fprintf(out, ", "); +         break; + +      case SL_PP_SEMICOLON: +         fprintf(out, "; "); +         break; + +      case SL_PP_LBRACE: +         fprintf(out, "{ "); +         break; + +      case SL_PP_RBRACE: +         fprintf(out, "} "); +         break; + +      case SL_PP_LPAREN: +         fprintf(out, "( "); +         break; + +      case SL_PP_RPAREN: +         fprintf(out, ") "); +         break; + +      case SL_PP_LBRACKET: +         fprintf(out, "[ "); +         break; + +      case SL_PP_RBRACKET: +         fprintf(out, "] "); +         break; + +      case SL_PP_DOT: +         fprintf(out, ". "); +         break; + +      case SL_PP_INCREMENT: +         fprintf(out, "++ "); +         break; + +      case SL_PP_ADDASSIGN: +         fprintf(out, "+= "); +         break; + +      case SL_PP_PLUS: +         fprintf(out, "+ "); +         break; + +      case SL_PP_DECREMENT: +         fprintf(out, "-- "); +         break; + +      case SL_PP_SUBASSIGN: +         fprintf(out, "-= "); +         break; + +      case SL_PP_MINUS: +         fprintf(out, "- "); +         break; + +      case SL_PP_BITNOT: +         fprintf(out, "~ "); +         break; + +      case SL_PP_NOTEQUAL: +         fprintf(out, "!= "); +         break; + +      case SL_PP_NOT: +         fprintf(out, "! "); +         break; + +      case SL_PP_MULASSIGN: +         fprintf(out, "*= "); +         break; + +      case SL_PP_STAR: +         fprintf(out, "* "); +         break; + +      case SL_PP_DIVASSIGN: +         fprintf(out, "/= "); +         break; + +      case SL_PP_SLASH: +         fprintf(out, "/ "); +         break; + +      case SL_PP_MODASSIGN: +         fprintf(out, "%= "); +         break; + +      case SL_PP_MODULO: +         fprintf(out, "% "); +         break; + +      case SL_PP_LSHIFTASSIGN: +         fprintf(out, "<<= "); +         break; + +      case SL_PP_LSHIFT: +         fprintf(out, "<< "); +         break; + +      case SL_PP_LESSEQUAL: +         fprintf(out, "<= "); +         break; + +      case SL_PP_LESS: +         fprintf(out, "< "); +         break; + +      case SL_PP_RSHIFTASSIGN: +         fprintf(out, ">>= "); +         break; + +      case SL_PP_RSHIFT: +         fprintf(out, ">> "); +         break; + +      case SL_PP_GREATEREQUAL: +         fprintf(out, ">= "); +         break; + +      case SL_PP_GREATER: +         fprintf(out, "> "); +         break; + +      case SL_PP_EQUAL: +         fprintf(out, "== "); +         break; + +      case SL_PP_ASSIGN: +         fprintf(out, "= "); +         break; + +      case SL_PP_AND: +         fprintf(out, "&& "); +         break; + +      case SL_PP_BITANDASSIGN: +         fprintf(out, "&= "); +         break; + +      case SL_PP_BITAND: +         fprintf(out, "& "); +         break; + +      case SL_PP_XOR: +         fprintf(out, "^^ "); +         break; + +      case SL_PP_BITXORASSIGN: +         fprintf(out, "^= "); +         break; + +      case SL_PP_BITXOR: +         fprintf(out, "^ "); +         break; + +      case SL_PP_OR: +         fprintf(out, "|| "); +         break; + +      case SL_PP_BITORASSIGN: +         fprintf(out, "|= "); +         break; + +      case SL_PP_BITOR: +         fprintf(out, "| "); +         break; + +      case SL_PP_QUESTION: +         fprintf(out, "? "); +         break; + +      case SL_PP_COLON: +         fprintf(out, ": "); +         break; + +      case SL_PP_IDENTIFIER: +         fprintf(out, "%s ", tokens[i].data.identifier); +         free(tokens[i].data.identifier); +         break; + +      case SL_PP_NUMBER: +         fprintf(out, "(%s) ", tokens[i].data.number); +         free(tokens[i].data.number); +         break; + +      case SL_PP_OTHER: +         if (tokens[i].data.other == '\'') { +            fprintf(out, "'\\'' "); +         } else { +            fprintf(out, "'%c' ", tokens[i].data.other); +         } +         break; + +      default: +         assert(0); +      } +   } + +   free(tokens); +   fclose(out); + +   return 0; +} | 
