@@ -559,10 +559,9 @@ unsigned int CppCheck::check(const FileWithDetails &file)
559559 return checkFile (file, emptyString);
560560}
561561
562- unsigned int CppCheck::check (const FileWithDetails &file, const std::string &content )
562+ unsigned int CppCheck::check (const FileWithDetails &file, const uint8_t * data, std::size_t size )
563563{
564- std::istringstream iss (content);
565- return checkFile (file, emptyString, &iss);
564+ return checkBuffer (file, emptyString, data, size);
566565}
567566
568567unsigned int CppCheck::check (const FileSettings &fs)
@@ -608,15 +607,41 @@ unsigned int CppCheck::check(const FileSettings &fs)
608607 return returnValue;
609608}
610609
611- static simplecpp::TokenList createTokenList (const std::string& filename, std::vector<std:: string>& files, simplecpp::OutputList* outputList , std::istream* fileStream )
610+ unsigned int CppCheck::checkBuffer (const FileWithDetails &file, const std::string &cfgname, const uint8_t * data , std::size_t size )
612611{
613- if (fileStream)
614- return {*fileStream, files, filename, outputList};
612+ return checkInternal (file, cfgname,
613+ [&file, data, size](TokenList& list) {
614+ list.createTokens (data, size, file.spath ());
615+ },
616+ [&file, data, size](std::vector<std::string>& files, simplecpp::OutputList* outputList) {
617+ return simplecpp::TokenList{data, size, files, file.spath (), outputList};
618+ });
619+ }
620+
621+ unsigned int CppCheck::checkStream (const FileWithDetails &file, const std::string &cfgname, std::istream& fileStream)
622+ {
623+ return checkInternal (file, cfgname,
624+ [&file, &fileStream](TokenList& list) {
625+ list.createTokens (fileStream, file.spath ());
626+ },
627+ [&file, &fileStream](std::vector<std::string>& files, simplecpp::OutputList* outputList) {
628+ return simplecpp::TokenList{fileStream, files, file.spath (), outputList};
629+ });
630+ }
615631
616- return {filename, files, outputList};
632+ unsigned int CppCheck::checkFile (const FileWithDetails& file, const std::string &cfgname)
633+ {
634+ return checkInternal (file, cfgname,
635+ [&file](TokenList& list) {
636+ std::ifstream in (file.spath ());
637+ list.createTokens (in, file.spath ());
638+ },
639+ [&file](std::vector<std::string>& files, simplecpp::OutputList* outputList) {
640+ return simplecpp::TokenList{file.spath (), files, outputList};
641+ });
617642}
618643
619- unsigned int CppCheck::checkFile (const FileWithDetails& file, const std::string &cfgname, std::istream* fileStream )
644+ unsigned int CppCheck::checkInternal (const FileWithDetails& file, const std::string &cfgname, const CreateTokensFn& createTokens, const CreateTokenListFn& createTokenList )
620645{
621646 // TODO: move to constructor when CppCheck no longer owns the settings
622647 if (mSettings .checks .isEnabled (Checks::unusedFunction) && !mUnusedFunctionsCheck )
@@ -662,21 +687,15 @@ unsigned int CppCheck::checkFile(const FileWithDetails& file, const std::string
662687 Tokenizer tokenizer (mSettings , *this );
663688 // enforce the language since markup files are special and do not adhere to the enforced language
664689 tokenizer.list .setLang (Standards::Language::C, true );
665- if (fileStream) {
666- tokenizer.list .createTokens (*fileStream, file.spath ());
667- }
668- else {
669- std::ifstream in (file.spath ());
670- tokenizer.list .createTokens (in, file.spath ());
671- }
690+ createTokens (tokenizer.list );
672691 mUnusedFunctionsCheck ->parseTokens (tokenizer, mSettings );
673692 }
674693 return EXIT_SUCCESS;
675694 }
676695
677696 simplecpp::OutputList outputList;
678697 std::vector<std::string> files;
679- simplecpp::TokenList tokens1 = createTokenList (file. spath (), files, &outputList, fileStream );
698+ simplecpp::TokenList tokens1 = createTokenList (files, &outputList);
680699
681700 // If there is a syntax error, report it and stop
682701 const auto output_it = std::find_if (outputList.cbegin (), outputList.cend (), [](const simplecpp::Output &output){
0 commit comments