1 // Copyright (C) 2010-2018 Joel Rosdahl
3 // This program is free software; you can redistribute it and/or modify it
4 // under the terms of the GNU General Public License as published by the Free
5 // Software Foundation; either version 3 of the License, or (at your option)
8 // This program is distributed in the hope that it will be useful, but WITHOUT
9 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13 // You should have received a copy of the GNU General Public License along with
14 // this program; if not, write to the Free Software Foundation, Inc., 51
15 // Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 // Supported file extensions and corresponding languages (as in parameter to
24 const char *extension;
39 {".m", "objective-c"},
40 {".M", "objective-c++"},
41 {".mm", "objective-c++"},
42 {".sx", "assembler-with-cpp"},
43 {".S", "assembler-with-cpp"},
46 {".ii", "c++-cpp-output"},
47 {".mi", "objective-c-cpp-output"},
48 {".mii", "objective-c++-cpp-output"},
50 // Header file (for precompilation):
53 {".h++", "c++-header"},
54 {".H++", "c++-header"},
55 {".hh", "c++-header"},
56 {".HH", "c++-header"},
57 {".hp", "c++-header"},
58 {".HP", "c++-header"},
59 {".hpp", "c++-header"},
60 {".HPP", "c++-header"},
61 {".hxx", "c++-header"},
62 {".HXX", "c++-header"},
63 {".tcc", "c++-header"},
64 {".TCC", "c++-header"},
66 {".ic", "cuda-output"},
70 // Supported languages and corresponding preprocessed languages.
73 const char *p_language;
76 {"cpp-output", "cpp-output"},
77 {"c-header", "cpp-output"},
78 {"c++", "c++-cpp-output"},
79 {"c++-cpp-output", "c++-cpp-output"},
80 {"c++-header", "c++-cpp-output"},
81 {"objective-c", "objective-c-cpp-output"},
82 {"objective-c-header", "objective-c-cpp-output"},
83 {"objc-cpp-output", "objective-c-cpp-output"},
84 {"objective-c-cpp-output", "objective-c-cpp-output"},
85 {"objective-c++", "objective-c++-cpp-output"},
86 {"objc++-cpp-output", "objective-c++-cpp-output"},
87 {"objective-c++-header", "objective-c++-cpp-output"},
88 {"objective-c++-cpp-output", "objective-c++-cpp-output"},
89 {"cuda", "cuda-output"},
90 {"assembler-with-cpp", "assembler"},
91 {"assembler", "assembler"},
95 // Guess the language of a file based on its extension. Returns NULL if the
96 // extension is unknown.
98 language_for_file(const char *fname)
100 const char *p = get_extension(fname);
101 for (int i = 0; extensions[i].extension; i++) {
102 if (str_eq(p, extensions[i].extension)) {
103 return extensions[i].language;
109 // Return the preprocessed language for a given language, or NULL if unknown.
111 p_language_for_language(const char *language)
116 for (int i = 0; languages[i].language; ++i) {
117 if (str_eq(language, languages[i].language)) {
118 return languages[i].p_language;
124 // Return the default file extension (including dot) for a language, or NULL if
127 extension_for_language(const char *language)
132 for (int i = 0; extensions[i].extension; i++) {
133 if (str_eq(language, extensions[i].language)) {
134 return extensions[i].extension;
141 language_is_supported(const char *language)
143 return p_language_for_language(language) != NULL;
147 language_is_preprocessed(const char *language)
149 const char *p_language = p_language_for_language(language);
151 return str_eq(language, p_language);