diff --git a/cli/cmdlineparser.cpp b/cli/cmdlineparser.cpp index 034b61046..941c7dd9b 100644 --- a/cli/cmdlineparser.cpp +++ b/cli/cmdlineparser.cpp @@ -45,11 +45,21 @@ static void AddFilesToList(const std::string& FileList, std::vector // xml is a bonus then, since we can easily extend it // we need a good parser then -> suggestion : TinyXml // drawback : creates a dependency - std::ifstream Files(FileList.c_str()); + std::istream *Files; + std::ifstream Infile; + if (FileList.compare("-") == 0) // read from stdin + { + Files = &std::cin; + } + else + { + Infile.open(FileList.c_str()); + Files = &Infile; + } if (Files) { std::string FileName; - while (std::getline(Files, FileName)) // next line + while (std::getline(*Files, FileName)) // next line { if (!FileName.empty()) { @@ -720,7 +730,8 @@ void CmdLineParser::PrintHelp() " Used when certain messages should be displayed but\n" " should not cause a non-zero exitcode.\n" " --file-list= Specify the files to check in a text file. Add one\n" - " filename per line.\n" + " filename per line. When file is -, the file list will\n" + " be read from standard input.\n" " -f, --force Force checking of all configurations in files that have\n" " \"too many\" configurations.\n" " -h, --help Print this help.\n" diff --git a/man/cppcheck.1.xml b/man/cppcheck.1.xml index 88536f431..a8e3f2fd4 100644 --- a/man/cppcheck.1.xml +++ b/man/cppcheck.1.xml @@ -225,7 +225,7 @@ Example: -DDEBUG=1 -D__cplusplus - Specify the files to check in a text file. One filename per line. + Specify the files to check in a text file. One filename per line. When file is -, the file list will be read from standard input. diff --git a/test/testcmdlineparser.cpp b/test/testcmdlineparser.cpp index b85e00e2a..aacae87e6 100644 --- a/test/testcmdlineparser.cpp +++ b/test/testcmdlineparser.cpp @@ -71,6 +71,7 @@ private: TEST_CASE(exitcodeSuppressions); TEST_CASE(exitcodeSuppressionsNoFile); TEST_CASE(fileList); // TODO: Create and test real file listing file + TEST_CASE(fileListStdin); TEST_CASE(inlineSuppr); TEST_CASE(jobs); TEST_CASE(jobsMissingCount); @@ -530,6 +531,17 @@ private: CmdLineParser parser(&settings); TODO_ASSERT_EQUALS(true, false, parser.ParseFromArgs(4, argv)); } + + void fileListStdin() + { + // TODO: Give it some stdin to read from, fails because the list of + // files in stdin (_pathnames) is empty + REDIRECT; + const char *argv[] = {"cppcheck", "--file-list=-", "file.cpp"}; + Settings settings; + CmdLineParser parser(&settings); + TODO_ASSERT_EQUALS(true, false, parser.ParseFromArgs(3, argv)); + } void inlineSuppr() {