# HG changeset patch # User František Kučera # Date 1557167897 -7200 # Node ID f515d14794e03117d4002d78ca83373368c11d18 # Parent f911910fd68f629d18cb503ddef1a8620a577a4d variable execvp() arguments diff -r f911910fd68f -r f515d14794e0 src/AwkHandler.h --- a/src/AwkHandler.h Mon May 06 17:46:49 2019 +0200 +++ b/src/AwkHandler.h Mon May 06 20:38:17 2019 +0200 @@ -86,6 +86,17 @@ if (error) throw cli::RelpipeCLIException(L"Unable to close FD: " + to_wstring(fd) + L" from PID: " + to_wstring(getpid()), cli::CLI::EXIT_CODE_UNEXPECTED_ERROR); // TODO: better exceptions? } + void execp(const std::vector& args) { + const char** a = new const char*[args.size() + 1]; + for (size_t i = 0; i < args.size(); i++) a[i] = args[i].c_str(); + a[args.size()] = nullptr; + + execvp(a[0], (char*const*) a); + + delete[] a; + throw cli::RelpipeCLIException(L"Unable to do execvp().", cli::CLI::EXIT_CODE_UNEXPECTED_ERROR); // TODO: better exceptions? + } + void cleanUp() { if (awkInputWriterFD >= 0) { closeOrThrow(awkInputWriterFD); @@ -140,8 +151,23 @@ redirectFD(awkInputReaderFD, STDIN_FILENO); redirectFD(awkOutputWriterFD, STDOUT_FILENO); + std::wstringstream awkScript; + awkScript << L"BEGIN {" << std::endl; + awkScript << L"FS=\"\\t\";" << std::endl; + awkScript << L"};" << std::endl; + + awkScript << L"END {" << std::endl; + // awkScript << … << std::endl; + awkScript << L"};" << std::endl; + + awkScript << L"{print \"AWK says: line \" NR \" '\" $0 \"' has \" NF \" fields; first field is '\" $1 \"'\";}" << std::endl; + + std::vector args; + args.push_back("awk"); + args.push_back(convertor.to_bytes(awkScript.str())); + // Runs AWK program found on $PATH → user can plug-in a custom implementation or a wrapper, but this can be also bit dangerous (however AWK itself is dangerous). - execlp("awk", "awk", "BEGIN { FS=\"\\t\" }; {print \"AWK says: line \" NR \" '\" $0 \"' has \" NF \" fields; first field is '\" $1 \"'\";}", nullptr); + execp(args); } else { // Parent process closeOrThrow(awkInputReaderFD); @@ -156,7 +182,7 @@ closeOrThrow(awkInputWriterFD); locale::global(locale("")); // needed for processing unicode texts, otherwise getline() stopped working on first line with non-ascii characters; TODO: move somewhere else? - + __gnu_cxx::stdio_filebuf awkOutputReaderBuffer(awkOutputReaderFD, std::ios::in); std::wistream awkOutputReader(&awkOutputReaderBuffer);