mirror of
https://github.com/reactos/ccache.git
synced 2024-11-23 11:49:41 +00:00
156 lines
3.7 KiB
C
156 lines
3.7 KiB
C
/*
|
|
* Copyright (C) 2010 Joel Rosdahl
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the Free
|
|
* Software Foundation; either version 3 of the License, or (at your option)
|
|
* any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
* more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along with
|
|
* this program; if not, write to the Free Software Foundation, Inc., 51
|
|
* Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
#include "ccache.h"
|
|
|
|
/*
|
|
* Supported file extensions and corresponding languages (as in parameter to
|
|
* the -x option).
|
|
*/
|
|
static const struct {
|
|
const char *extension;
|
|
const char *language;
|
|
} extensions[] = {
|
|
{".c", "c"},
|
|
{".C", "c++"},
|
|
{".cc", "c++"},
|
|
{".CC", "c++"},
|
|
{".cp", "c++"},
|
|
{".CP", "c++"},
|
|
{".cpp", "c++"},
|
|
{".CPP", "c++"},
|
|
{".cxx", "c++"},
|
|
{".CXX", "c++"},
|
|
{".c++", "c++"},
|
|
{".C++", "c++"},
|
|
{".m", "objective-c"},
|
|
{".M", "objective-c++"},
|
|
{".mm", "objective-c++"},
|
|
/* Preprocessed: */
|
|
{".i", "cpp-output"},
|
|
{".ii", "c++-cpp-output"},
|
|
{".mi", "objc-cpp-output"},
|
|
{".mii", "objc++-cpp-output"},
|
|
/* Header file (for precompilation): */
|
|
{".h", "c-header"},
|
|
{".H", "c++-header"},
|
|
{".h++", "c++-header"},
|
|
{".H++", "c++-header"},
|
|
{".hh", "c++-header"},
|
|
{".HH", "c++-header"},
|
|
{".hp", "c++-header"},
|
|
{".HP", "c++-header"},
|
|
{".hpp", "c++-header"},
|
|
{".HPP", "c++-header"},
|
|
{".hxx", "c++-header"},
|
|
{".HXX", "c++-header"},
|
|
{".tcc", "c++-header"},
|
|
{".TCC", "c++-header"},
|
|
{NULL, NULL}};
|
|
|
|
/*
|
|
* Supported languages and corresponding preprocessed languages.
|
|
*/
|
|
static const struct {
|
|
const char *language;
|
|
const char *p_language;
|
|
} languages[] = {
|
|
{"c", "cpp-output"},
|
|
{"cpp-output", "cpp-output"},
|
|
{"c-header", "cpp-output"},
|
|
{"c++", "c++-cpp-output"},
|
|
{"c++-cpp-output", "c++-cpp-output"},
|
|
{"c++-header", "c++-cpp-output"},
|
|
{"objective-c", "objc-cpp-output"},
|
|
{"objective-c-header", "objc-cpp-output"},
|
|
{"objc-cpp-output", "objc-cpp-output"},
|
|
{"objective-c++", "objc++-cpp-output"},
|
|
{"objc++-cpp-output", "objc++-cpp-output"},
|
|
{"objective-c++-header", "objc++-cpp-output"},
|
|
{NULL, NULL}};
|
|
|
|
/*
|
|
* Guess the language of a file based on its extension. Returns NULL if the
|
|
* extension is unknown.
|
|
*/
|
|
const char *
|
|
language_for_file(const char *fname)
|
|
{
|
|
int i;
|
|
const char *p;
|
|
|
|
p = get_extension(fname);
|
|
for (i = 0; extensions[i].extension; i++) {
|
|
if (str_eq(p, extensions[i].extension)) {
|
|
return extensions[i].language;
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
/*
|
|
* Return the preprocessed language for a given language, or NULL if unknown.
|
|
*/
|
|
const char *
|
|
p_language_for_language(const char *language)
|
|
{
|
|
int i;
|
|
|
|
if (!language) {
|
|
return NULL;
|
|
}
|
|
for (i = 0; languages[i].language; ++i) {
|
|
if (str_eq(language, languages[i].language)) {
|
|
return languages[i].p_language;
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
/*
|
|
* Return the default file extension (including dot) for a language, or NULL if
|
|
* unknown.
|
|
*/
|
|
const char *
|
|
extension_for_language(const char *language)
|
|
{
|
|
int i;
|
|
|
|
if (!language) {
|
|
return NULL;
|
|
}
|
|
for (i = 0; extensions[i].extension; i++) {
|
|
if (str_eq(language, extensions[i].language)) {
|
|
return extensions[i].extension;
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
bool
|
|
language_is_supported(const char *language)
|
|
{
|
|
return p_language_for_language(language) != NULL;
|
|
}
|
|
|
|
bool
|
|
language_is_preprocessed(const char *language)
|
|
{
|
|
return str_eq(language, p_language_for_language(language));
|
|
}
|