Home | History | Annotate | Download | only in buildHeaders
      1 // Copyright (c) 2014-2019 The Khronos Group Inc.
      2 //
      3 // Permission is hereby granted, free of charge, to any person obtaining a copy
      4 // of this software and/or associated documentation files (the "Materials"),
      5 // to deal in the Materials without restriction, including without limitation
      6 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
      7 // and/or sell copies of the Materials, and to permit persons to whom the
      8 // Materials are furnished to do so, subject to the following conditions:
      9 //
     10 // The above copyright notice and this permission notice shall be included in
     11 // all copies or substantial portions of the Materials.
     12 //
     13 // MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS
     14 // STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND
     15 // HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/
     16 //
     17 // THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     18 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     19 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
     20 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     21 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     22 // FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS
     23 // IN THE MATERIALS.
     24 
     25 //#include <fstream>
     26 #include <string>
     27 #include <algorithm>
     28 
     29 #include "jsonToSpirv.h"
     30 #include "header.h"
     31 
     32 // Command-line options
     33 enum TOptions {
     34     EOptionNone                       = 0x000,
     35     EOptionPrintHeader                = 0x008,
     36 };
     37 
     38 std::string jsonPath;
     39 int Options;
     40 spv::TLanguage Language;
     41 
     42 void Usage()
     43 {
     44     printf("Usage: spirv option [file]\n"
     45            "\n"
     46            "  -h <language> print header for given language to stdout, from one of:\n"
     47            "     C      - C99 header\n"
     48            "     C++    - C++03 or greater header (also accepts C++03)\n"
     49            "     C++11  - C++11 or greater header\n"
     50            "     JSON   - JSON format data\n"
     51            "     Lua    - Lua module\n"
     52            "     Python - Python module (also accepts Py)\n"
     53            "     C#     - C# module (also accepts CSharp)\n"
     54            "     D      - D module\n"
     55            "  -H print header in all supported languages to files in current directory\n"
     56            );
     57 }
     58 
     59 std::string tolower_s(std::string s)
     60 {
     61     std::transform(s.begin(), s.end(), s.begin(), ::tolower);
     62     return s;
     63 }
     64 
     65 bool ProcessArguments(int argc, char* argv[])
     66 {
     67     argc--;
     68     argv++;
     69     for (; argc >= 1; argc--, argv++) {
     70         if (argv[0][0] == '-') {
     71             switch (argv[0][1]) {
     72             case 'H':
     73                 Options |= EOptionPrintHeader;
     74                 Language = spv::ELangAll;
     75                 break;
     76             case 'h': {
     77                 if (argc < 2)
     78                     return false;
     79 
     80                 Options |= EOptionPrintHeader;
     81                 const std::string language(tolower_s(argv[1]));
     82 
     83                 if (language == "c") {
     84                     Language = spv::ELangC;
     85                 } else if (language == "c++" || language == "c++03") {
     86                     Language = spv::ELangCPP;
     87                 } else if (language == "c++11") {
     88                     Language = spv::ELangCPP11;
     89                 } else if (language == "json") {
     90                     Language = spv::ELangJSON;
     91                 } else if (language == "lua") {
     92                     Language = spv::ELangLua;
     93                 } else if (language == "python" || language == "py") {
     94                     Language = spv::ELangPython;
     95                 } else if (language == "c#" || language == "csharp") {
     96                     Language = spv::ELangCSharp;
     97                 } else if (language == "d") {
     98                     Language = spv::ELangD;
     99                 } else
    100                     return false;
    101 
    102                 return true;
    103             }
    104             default:
    105                 return false;
    106             }
    107         } else {
    108             jsonPath = std::string(argv[0]);
    109         }
    110     }
    111 
    112     return true;
    113 }
    114 
    115 int main(int argc, char* argv[])
    116 {
    117     if (argc < 2 || ! ProcessArguments(argc, argv)) {
    118         Usage();
    119         return 1;
    120     }
    121 
    122     spv::jsonToSpirv(jsonPath);
    123     if (Options & EOptionPrintHeader)
    124         spv::PrintHeader(Language, std::cout);
    125 
    126     return 0;
    127 }
    128