From a7044ba3eb5f6c2331afed0a5fbd886cf64912bd Mon Sep 17 00:00:00 2001 From: firewave Date: Wed, 10 Sep 2025 13:44:40 +0200 Subject: [PATCH] main.cpp: added options `-file`, `-buf` and `-ss` to specify the `TokenList` interface / renamed `-is` to `-fs` --- main.cpp | 56 +++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 47 insertions(+), 9 deletions(-) diff --git a/main.cpp b/main.cpp index 5c48f830..4afc1321 100644 --- a/main.cpp +++ b/main.cpp @@ -6,12 +6,14 @@ #define SIMPLECPP_TOKENLIST_ALLOW_PTR 0 #include "simplecpp.h" +#include #include #include #include #include -#include +#include #include +#include #include #include @@ -28,7 +30,12 @@ int main(int argc, char **argv) { bool error = false; const char *filename = nullptr; - bool use_istream = false; + enum : std::uint8_t { + File, + Fstream, + Sstream, + CharBuffer + } toklist_inf = File; bool fail_on_error = false; bool linenrs = false; @@ -86,9 +93,6 @@ int main(int argc, char **argv) break; } dui.includes.emplace_back(std::move(value)); - } else if (std::strcmp(arg, "-is")==0) { - found = true; - use_istream = true; } break; case 's': @@ -102,6 +106,10 @@ int main(int argc, char **argv) } dui.std = std::move(value); } + else if (std::strcmp(arg, "-ss")==0) { + toklist_inf = Sstream; + found = true; + } break; case 'q': if (std::strcmp(arg, "-q")==0) { @@ -116,9 +124,17 @@ int main(int argc, char **argv) } break; case 'f': - if (std::strcmp(arg, "-f")==0) { + if (std::strcmp(arg, "-file")==0) { + toklist_inf = File; + found = true; + } + else if (std::strcmp(arg, "-fs")==0) { + toklist_inf = Fstream; found = true; + } + else if (std::strcmp(arg, "-f")==0) { fail_on_error = true; + found = true; } break; case 'l': @@ -127,6 +143,12 @@ int main(int argc, char **argv) found = true; } break; + case 'b': + if (std::strcmp(arg, "-buf")==0) { + toklist_inf = CharBuffer; + found = true; + } + break; } if (!found) { std::cout << "error: option '" << arg << "' is unknown." << std::endl; @@ -157,7 +179,10 @@ int main(int argc, char **argv) std::cout << " -UNAME Undefine NAME." << std::endl; std::cout << " -std=STD Specify standard." << std::endl; std::cout << " -q Quiet mode (no output)." << std::endl; - std::cout << " -is Use std::istream interface." << std::endl; + std::cout << " -file Consume input as file pointer (default)." << std::endl; + std::cout << " -fs Consume input as file stream." << std::endl; + std::cout << " -ss Consume input as string stream." << std::endl; + std::cout << " -buf Consume input as char buffer." << std::endl; std::cout << " -e Output errors only." << std::endl; std::cout << " -f Fail when errors were encountered (exitcode 1)." << std::endl; std::cout << " -l Print lines numbers." << std::endl; @@ -197,8 +222,21 @@ int main(int argc, char **argv) simplecpp::TokenList outputTokens(files); { simplecpp::TokenList *rawtokens; - if (use_istream) { - rawtokens = new simplecpp::TokenList(f, files,filename,&outputList); + if (toklist_inf == Fstream) { + rawtokens = new simplecpp::TokenList(f,files,filename,&outputList); + } + else if (toklist_inf == Sstream || toklist_inf == CharBuffer) { + std::ostringstream oss; + oss << f.rdbuf(); + f.close(); + const std::string s = oss.str(); + if (toklist_inf == Sstream) { + std::istringstream iss(s); + rawtokens = new simplecpp::TokenList(iss,files,filename,&outputList); + } + else { + rawtokens = new simplecpp::TokenList({s.data(),s.size()},files,filename,&outputList); + } } else { f.close(); rawtokens = new simplecpp::TokenList(filename,files,&outputList);