summaryrefslogtreecommitdiffstats
path: root/debian/uncrustify-trinity/uncrustify-trinity-0.78.0/src/language_names.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'debian/uncrustify-trinity/uncrustify-trinity-0.78.0/src/language_names.cpp')
-rw-r--r--debian/uncrustify-trinity/uncrustify-trinity-0.78.0/src/language_names.cpp227
1 files changed, 227 insertions, 0 deletions
diff --git a/debian/uncrustify-trinity/uncrustify-trinity-0.78.0/src/language_names.cpp b/debian/uncrustify-trinity/uncrustify-trinity-0.78.0/src/language_names.cpp
new file mode 100644
index 00000000..546b240e
--- /dev/null
+++ b/debian/uncrustify-trinity/uncrustify-trinity-0.78.0/src/language_names.cpp
@@ -0,0 +1,227 @@
+/**
+ * @file language_names.cpp
+ *
+ * @author Guy Maurel
+ * extract from uncrustify.cpp
+ * @license GPL v2+
+ */
+
+#include "language_names.h"
+
+static lang_name_t language_names[] =
+{
+ { "C", LANG_C }, // 0x0001
+ { "CPP", LANG_CPP }, // 0x0002
+ { "D", LANG_D }, // 0x0004
+ { "CS", LANG_CS }, // 0x0008
+ { "JAVA", LANG_JAVA }, // 0x0010
+ { "OC", LANG_OC }, // 0x0020
+ { "VALA", LANG_VALA }, // 0x0040
+ { "PAWN", LANG_PAWN }, // 0x0080
+ { "ECMA", LANG_ECMA }, // 0x0100
+ { "OC+", LANG_OC | LANG_CPP }, // 0x0020 + 0x0002
+ { "CS+", LANG_CS | LANG_CPP }, // 0x0008 + 0x0002
+ { "C-Header", LANG_C | LANG_CPP | FLAG_HDR }, // 0x0001 + 0x0002 + 0x2000 = 0x2022
+};
+
+
+//! known filename extensions linked to the corresponding programming language
+struct lang_ext_t language_exts[] =
+{
+ { ".c", "C" },
+ { ".c++", "CPP" },
+ { ".cc", "CPP" },
+ { ".cp", "CPP" },
+ { ".cpp", "CPP" },
+ { ".cs", "CS" },
+ { ".cxx", "CPP" },
+ { ".d", "D" },
+ { ".di", "D" },
+ { ".es", "ECMA" },
+ { ".h", "C-Header" },
+ { ".h++", "CPP" },
+ { ".hh", "CPP" },
+ { ".hp", "CPP" },
+ { ".hpp", "CPP" },
+ { ".hxx", "CPP" },
+ { ".inc", "PAWN" },
+ { ".inl", "CPP" },
+ { ".java", "JAVA" },
+ { ".js", "ECMA" },
+ { ".m", "OC" },
+ { ".mm", "OC+" },
+ { ".p", "PAWN" },
+ { ".pawn", "PAWN" },
+ { ".sma", "PAWN" },
+ { ".sqc", "C" }, // embedded SQL
+ { ".sql", "SQL" },
+ { ".vala", "VALA" },
+ { ".vapi", "VALA" },
+};
+
+
+size_t language_flags_from_name(const char *name)
+{
+ for (const auto &language : language_names)
+ {
+ if (strcasecmp(name, language.name) == 0)
+ {
+ return(language.lang);
+ }
+ }
+
+ return(0);
+}
+
+
+const char *language_name_from_flags(size_t lang)
+{
+ // Check for an exact match first
+ for (auto &language_name : language_names)
+ {
+ if (language_name.lang == lang)
+ {
+ return(language_name.name);
+ }
+ }
+
+ static char lang_liste[120];
+ lang_liste[0] = '\0';
+
+ // Check for the next set language bit
+ for (auto &language_name : language_names)
+ {
+ if (strcmp(language_name.name, "OC+") == 0)
+ {
+ break;
+ }
+
+ if ((language_name.lang & lang) != 0)
+ {
+ if (lang_liste[0] == '\0')
+ {
+ strcpy(lang_liste, language_name.name);
+ }
+ else
+ {
+ int ll = strlen(lang_liste);
+ strcpy(&lang_liste[ll], ", ");
+ strcpy(&lang_liste[ll + 2], language_name.name);
+ }
+ }
+ }
+
+ return(lang_liste);
+} // language_name_from_flags
+
+
+bool ends_with(const char *filename, const char *tag, bool case_sensitive = true)
+{
+ int len1 = strlen(filename);
+ int len2 = strlen(tag);
+
+ return( len2 <= len1
+ && ( ( case_sensitive
+ && (strcmp(&filename[len1 - len2], tag) == 0))
+ || ( !case_sensitive
+ && (strcasecmp(&filename[len1 - len2], tag) == 0))));
+} // ends_with
+
+
+const char *get_file_extension(int &idx)
+{
+ const char *val = nullptr;
+
+ if (idx < static_cast<int> ARRAY_SIZE(language_exts))
+ {
+ val = language_exts[idx].ext;
+ }
+ idx++;
+ return(val);
+} // get_file_extension
+
+
+////typedef std::map<std::string, std::string> extension_map_t;
+//static extension_map_t g_ext_map;
+
+
+const char *extension_add(const char *ext_text, const char *lang_text)
+{
+ size_t lang_flags = language_flags_from_name(lang_text);
+
+ if (lang_flags)
+ {
+ const char *lang_name = language_name_from_flags(lang_flags);
+ g_ext_map[std::string(ext_text)] = lang_name;
+ return(lang_name);
+ }
+ return(nullptr);
+}
+
+
+void print_extensions(FILE *pfile)
+{
+ for (auto &language : language_names)
+ {
+ bool did_one = false;
+
+ for (auto &extension_val : g_ext_map)
+ {
+ if (strcmp(extension_val.second.c_str(), language.name) == 0)
+ {
+ if (!did_one)
+ {
+ fprintf(pfile, "file_ext %s", extension_val.second.c_str());
+ did_one = true;
+ }
+ fprintf(pfile, " %s", extension_val.first.c_str());
+ }
+ }
+
+ if (did_one)
+ {
+ fprintf(pfile, "\n");
+ }
+ }
+}
+
+
+// TODO: better use enum lang_t for source file language
+size_t language_flags_from_filename(const char *filename)
+{
+ // check custom extensions first
+ for (const auto &extension_val : g_ext_map)
+ {
+ if (ends_with(filename, extension_val.first.c_str()))
+ {
+ return(language_flags_from_name(extension_val.second.c_str()));
+ }
+ }
+
+ for (auto &language : language_exts)
+ {
+ if (ends_with(filename, language.ext))
+ {
+ return(language_flags_from_name(language.name));
+ }
+ }
+
+ // check again without case sensitivity
+ for (auto &extension_val : g_ext_map)
+ {
+ if (ends_with(filename, extension_val.first.c_str(), false))
+ {
+ return(language_flags_from_name(extension_val.second.c_str()));
+ }
+ }
+
+ for (auto &language : language_exts)
+ {
+ if (ends_with(filename, language.ext, false))
+ {
+ return(language_flags_from_name(language.name));
+ }
+ }
+
+ return(LANG_C);
+} // language_flags_from_filename