diff --git a/src/driver.cpp b/src/driver.cpp index 3165ed5..23d1ef7 100644 --- a/src/driver.cpp +++ b/src/driver.cpp @@ -4,15 +4,32 @@ #include #include +namespace { + /** + * Filter only valid identifier chars: alphanumeric, and not starting with a digit + */ + std::string clean(std::string in) { + std::string s; + for (char c : in) { + if ((s.length() && std::isalnum(c)) || std::isalpha(c)) + s += c; + } + return s; + } +} + namespace lxs { Driver::Driver(std::unique_ptr backends, std::istream& inputfile, std::string outputdir, std::string language, std::string lexername) : m_backends(std::move(backends)), m_inputfile(inputfile), m_outputdir(outputdir), m_language(language), - m_lexername(lexername) + m_lexername(clean(lexername)) { - //TODO clean lexername + if (!m_lexername.length()) { + std::cerr << "No valid lexer name possible" << std::endl; + exit(1); + } } Driver::~Driver() diff --git a/src/main.cpp b/src/main.cpp index 0e0c834..e2dd158 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -29,14 +29,35 @@ int main(int argc, char** argv) { return 1; } +#ifdef _WIN32 + const char PATHSEP = '\\'; +#else + const char PATHSEP = '/'; +#endif + std::string lexername = options["lexername"]; - //FIXME: this really needs some more work... - if (!lexername.length()) { + + if (!lexername.length()) { //The option is empty if (args[0].length() >= 4 && args[0].substr(args[0].length() - 4, 4) == ".lxs") { lexername = args[0].substr(0, args[0].length() - 4); //Drop the .lxs + } else { lexername = args[0]; } + + std::size_t pos; + // '/' can be used on most platforms (even windows) + pos = lexername.find_last_of('/'); + if (pos != lexername.npos) { + lexername = lexername.substr(pos + 1); + } + + // strip platform specific as well + pos = lexername.find_last_of(PATHSEP); + if (pos != lexername.npos) { + lexername = lexername.substr(pos + 1); + } + } std::unique_ptr backends(new lxs::BackendManager());