|
20 | 20 | #include <cstring> |
21 | 21 | #include <ctime> |
22 | 22 | #include <exception> |
23 | | -#include <fstream> // IWYU pragma: keep |
| 23 | +#include <fstream> |
24 | 24 | #include <iostream> |
25 | 25 | #include <limits> |
26 | 26 | #include <list> |
27 | 27 | #include <map> |
28 | 28 | #include <set> |
29 | | -#include <sstream> // IWYU pragma: keep |
| 29 | +#include <sstream> |
30 | 30 | #include <stack> |
31 | 31 | #include <stdexcept> |
32 | 32 | #include <string> |
@@ -377,6 +377,40 @@ class StdIStream : public simplecpp::TokenList::Stream { |
377 | 377 | std::istream &istr; |
378 | 378 | }; |
379 | 379 |
|
| 380 | +class StdCharBufStream : public simplecpp::TokenList::Stream { |
| 381 | +public: |
| 382 | + // cppcheck-suppress uninitDerivedMemberVar - we call Stream::init() to initialize the private members |
| 383 | + StdCharBufStream(const unsigned char* str, std::size_t size) |
| 384 | + : str(str) |
| 385 | + , size(size) |
| 386 | + , pos(-1) |
| 387 | + { |
| 388 | + init(); |
| 389 | + } |
| 390 | + |
| 391 | + virtual int get() OVERRIDE { |
| 392 | + if (pos >= size) |
| 393 | + return EOF; |
| 394 | + return str[++pos]; |
| 395 | + } |
| 396 | + virtual int peek() OVERRIDE { |
| 397 | + if ((pos+1) >= size) |
| 398 | + return EOF; |
| 399 | + return str[pos+1]; |
| 400 | + } |
| 401 | + virtual void unget() OVERRIDE { |
| 402 | + --pos; |
| 403 | + } |
| 404 | + virtual bool good() OVERRIDE { |
| 405 | + return pos < size; |
| 406 | + } |
| 407 | + |
| 408 | +private: |
| 409 | + const unsigned char *str; |
| 410 | + const int size; |
| 411 | + int pos; |
| 412 | +}; |
| 413 | + |
380 | 414 | class FileStream : public simplecpp::TokenList::Stream { |
381 | 415 | public: |
382 | 416 | // cppcheck-suppress uninitDerivedMemberVar - we call Stream::init() to initialize the private members |
@@ -442,6 +476,20 @@ simplecpp::TokenList::TokenList(std::istream &istr, std::vector<std::string> &fi |
442 | 476 | readfile(stream,filename,outputList); |
443 | 477 | } |
444 | 478 |
|
| 479 | +simplecpp::TokenList::TokenList(const unsigned char* data, std::size_t size, std::vector<std::string> &filenames, const std::string &filename, OutputList *outputList) |
| 480 | + : frontToken(nullptr), backToken(nullptr), files(filenames) |
| 481 | +{ |
| 482 | + StdCharBufStream stream(data, size); |
| 483 | + readfile(stream,filename,outputList); |
| 484 | +} |
| 485 | + |
| 486 | +simplecpp::TokenList::TokenList(const char* data, std::size_t size, std::vector<std::string> &filenames, const std::string &filename, OutputList *outputList) |
| 487 | + : frontToken(nullptr), backToken(nullptr), files(filenames) |
| 488 | +{ |
| 489 | + StdCharBufStream stream(reinterpret_cast<const unsigned char*>(data), size); |
| 490 | + readfile(stream,filename,outputList); |
| 491 | +} |
| 492 | + |
445 | 493 | simplecpp::TokenList::TokenList(const std::string &filename, std::vector<std::string> &filenames, OutputList *outputList) |
446 | 494 | : frontToken(nullptr), backToken(nullptr), files(filenames) |
447 | 495 | { |
@@ -1447,8 +1495,7 @@ namespace simplecpp { |
1447 | 1495 |
|
1448 | 1496 | Macro(const std::string &name, const std::string &value, std::vector<std::string> &f) : nameTokDef(nullptr), files(f), tokenListDefine(f), valueDefinedInCode_(false) { |
1449 | 1497 | const std::string def(name + ' ' + value); |
1450 | | - std::istringstream istr(def); |
1451 | | - StdIStream stream(istr); |
| 1498 | + StdCharBufStream stream(reinterpret_cast<const unsigned char*>(def.data()), def.size()); |
1452 | 1499 | tokenListDefine.readfile(stream); |
1453 | 1500 | if (!parseDefine(tokenListDefine.cfront())) |
1454 | 1501 | throw std::runtime_error("bad macro syntax. macroname=" + name + " value=" + value); |
|
0 commit comments