@@ -550,10 +550,9 @@ unsigned int CppCheck::check(const FileWithDetails &file)
550550 return checkFile (file, emptyString);
551551}
552552
553- unsigned int CppCheck::check (const FileWithDetails &file, const std::string &content )
553+ unsigned int CppCheck::check (const FileWithDetails &file, const uint8_t * data, std::size_t size )
554554{
555- std::istringstream iss (content);
556- return checkFile (file, emptyString, &iss);
555+ return checkBuffer (file, emptyString, data, size);
557556}
558557
559558unsigned int CppCheck::check (const FileSettings &fs)
@@ -593,15 +592,41 @@ unsigned int CppCheck::check(const FileSettings &fs)
593592 return returnValue;
594593}
595594
596- static simplecpp::TokenList createTokenList (const std::string& filename, std::vector<std:: string>& files, simplecpp::OutputList* outputList , std::istream* fileStream )
595+ unsigned int CppCheck::checkBuffer (const FileWithDetails &file, const std::string &cfgname, const uint8_t * data , std::size_t size )
597596{
598- if (fileStream)
599- return {*fileStream, files, filename, outputList};
597+ return checkInternal (file, cfgname,
598+ [&file, data, size](TokenList& list) {
599+ list.createTokens (data, size, file.spath ());
600+ },
601+ [&file, data, size](std::vector<std::string>& files, simplecpp::OutputList* outputList) {
602+ return simplecpp::TokenList{data, size, files, file.spath (), outputList};
603+ });
604+ }
605+
606+ unsigned int CppCheck::checkStream (const FileWithDetails &file, const std::string &cfgname, std::istream& fileStream)
607+ {
608+ return checkInternal (file, cfgname,
609+ [&file, &fileStream](TokenList& list) {
610+ list.createTokens (fileStream, file.spath ());
611+ },
612+ [&file, &fileStream](std::vector<std::string>& files, simplecpp::OutputList* outputList) {
613+ return simplecpp::TokenList{fileStream, files, file.spath (), outputList};
614+ });
615+ }
600616
601- return {filename, files, outputList};
617+ unsigned int CppCheck::checkFile (const FileWithDetails& file, const std::string &cfgname)
618+ {
619+ return checkInternal (file, cfgname,
620+ [&file](TokenList& list) {
621+ std::ifstream in (file.spath ());
622+ list.createTokens (in, file.spath ());
623+ },
624+ [&file](std::vector<std::string>& files, simplecpp::OutputList* outputList) {
625+ return simplecpp::TokenList{file.spath (), files, outputList};
626+ });
602627}
603628
604- unsigned int CppCheck::checkFile (const FileWithDetails& file, const std::string &cfgname, std::istream* fileStream )
629+ unsigned int CppCheck::checkInternal (const FileWithDetails& file, const std::string &cfgname, const CreateTokensFn& createTokens, const CreateTokenListFn& createTokenList )
605630{
606631 // TODO: move to constructor when CppCheck no longer owns the settings
607632 if (mSettings .checks .isEnabled (Checks::unusedFunction) && !mUnusedFunctionsCheck )
@@ -647,21 +672,15 @@ unsigned int CppCheck::checkFile(const FileWithDetails& file, const std::string
647672 Tokenizer tokenizer (mSettings , *this );
648673 // enforce the language since markup files are special and do not adhere to the enforced language
649674 tokenizer.list .setLang (Standards::Language::C, true );
650- if (fileStream) {
651- tokenizer.list .createTokens (*fileStream, file.spath ());
652- }
653- else {
654- std::ifstream in (file.spath ());
655- tokenizer.list .createTokens (in, file.spath ());
656- }
675+ createTokens (tokenizer.list );
657676 mUnusedFunctionsCheck ->parseTokens (tokenizer, mSettings );
658677 }
659678 return EXIT_SUCCESS;
660679 }
661680
662681 simplecpp::OutputList outputList;
663682 std::vector<std::string> files;
664- simplecpp::TokenList tokens1 = createTokenList (file. spath (), files, &outputList, fileStream );
683+ simplecpp::TokenList tokens1 = createTokenList (files, &outputList);
665684
666685 // If there is a syntax error, report it and stop
667686 const auto output_it = std::find_if (outputList.cbegin (), outputList.cend (), [](const simplecpp::Output &output){
0 commit comments