|
8 | 8 | #include <sys/types.h> |
9 | 9 |
|
10 | 10 | #include <algorithm> |
| 11 | +#include <fstream> |
11 | 12 | #include <iostream> |
12 | 13 |
|
13 | 14 | #if __has_include(<filesystem>) |
@@ -475,48 +476,55 @@ bool readDir(const char* path, Options& options) { |
475 | 476 | return bResult; |
476 | 477 | } |
477 | 478 |
|
478 | | -inline size_t sip(FILE* f, char* buffer, size_t max_len, size_t len) { |
479 | | - while (!feof(f) && len < max_len && buffer[len - 1] != '>') |
480 | | - buffer[len++] = fgetc(f); |
| 479 | +inline size_t sip(std::ifstream& f, char* buffer, size_t max_len, size_t len) { |
| 480 | + while (f && len < max_len && buffer[len - 1] != '>') { |
| 481 | + char c; |
| 482 | + f.get(c); |
| 483 | + buffer[len++] = c; |
| 484 | + } |
481 | 485 | return len; |
482 | 486 | } |
483 | 487 |
|
484 | 488 | bool readXML(const char* path, Options& options) { |
485 | | - FILE* f = fopen(path, "r"); |
| 489 | + std::ifstream file(path, std::ios::binary); |
| 490 | + if (!file.is_open()) { |
| 491 | + return false; |
| 492 | + } |
| 493 | + |
486 | 494 | XML_Parser parser = XML_ParserCreate(nullptr); |
487 | | - bool bResult = f && parser; |
488 | | - if (bResult) { |
489 | | - char buffer[8 * 1024]; |
490 | | - UserData me(options); |
491 | | - |
492 | | - XML_SetUserData(parser, &me); |
493 | | - XML_SetElementHandler(parser, startElement, endElement); |
494 | | - XML_SetCharacterDataHandler(parser, charHandler); |
495 | | - |
496 | | - // a little sip at the data |
497 | | - size_t len = fread(buffer, 1, sizeof(buffer) - 100, f); |
498 | | - const char* lead = "<?xml"; |
499 | | - bResult = strncmp(lead, buffer, strlen(lead)) == 0; |
500 | | - |
501 | | - // swallow it |
502 | | - if (bResult) { |
503 | | - len = sip(f, buffer, sizeof buffer, len); |
504 | | - bResult = XML_Parse(parser, buffer, static_cast<int>(len), len == 0) == XML_STATUS_OK; |
505 | | - } |
| 495 | + if (!parser) { |
| 496 | + return false; |
| 497 | + } |
506 | 498 |
|
507 | | - // drink the rest of the file |
508 | | - while (bResult && len != 0) { |
509 | | - len = fread(buffer, 1, sizeof(buffer) - 100, f); |
510 | | - len = sip(f, buffer, sizeof buffer, len); |
511 | | - bResult = XML_Parse(parser, buffer, static_cast<int>(len), len == 0) == XML_STATUS_OK; |
512 | | - }; |
| 499 | + bool bResult = true; |
| 500 | + std::vector<char> buffer(8 * 1024); |
| 501 | + UserData me(options); |
| 502 | + |
| 503 | + XML_SetUserData(parser, &me); |
| 504 | + XML_SetElementHandler(parser, startElement, endElement); |
| 505 | + XML_SetCharacterDataHandler(parser, charHandler); |
| 506 | + |
| 507 | + // A little sip at the data |
| 508 | + file.read(buffer.data(), buffer.size() - 100); |
| 509 | + std::streamsize len = file.gcount(); |
| 510 | + const char* lead = "<?xml"; |
| 511 | + bResult = len > 0 && strncmp(lead, buffer.data(), strlen(lead)) == 0; |
| 512 | + |
| 513 | + // Swallow it |
| 514 | + if (bResult) { |
| 515 | + len = sip(file, buffer.data(), buffer.size(), len); |
| 516 | + bResult = XML_Parse(parser, buffer.data(), static_cast<int>(len), len == 0) == XML_STATUS_OK; |
513 | 517 | } |
514 | 518 |
|
515 | | - if (f) |
516 | | - fclose(f); |
517 | | - if (parser) |
518 | | - XML_ParserFree(parser); |
| 519 | + // Drink the rest of the file |
| 520 | + while (bResult && len > 0) { |
| 521 | + file.read(buffer.data(), buffer.size() - 100); |
| 522 | + len = file.gcount(); |
| 523 | + len = sip(file, buffer.data(), buffer.size(), len); |
| 524 | + bResult = XML_Parse(parser, buffer.data(), static_cast<int>(len), len == 0) == XML_STATUS_OK; |
| 525 | + } |
519 | 526 |
|
| 527 | + XML_ParserFree(parser); |
520 | 528 | return bResult; |
521 | 529 | } |
522 | 530 |
|
@@ -579,22 +587,21 @@ bool sina(const char* s, const char** a) { |
579 | 587 | } |
580 | 588 |
|
581 | 589 | int readFile(const char* path, const Options& /* options */) { |
582 | | - FILE* f = fopen(path, "r"); |
583 | | - int nResult = f ? typeFile : typeUnknown; |
584 | | - if (f) { |
585 | | - const char* ext = strstr(path, "."); |
586 | | - if (ext) { |
587 | | - const char* docs[] = {".doc", ".txt", nullptr}; |
588 | | - const char* code[] = {".cpp", ".h", ".pl", ".py", ".pyc", nullptr}; |
589 | | - if (sina(ext, docs)) |
590 | | - nResult = typeDoc; |
591 | | - if (sina(ext, code)) |
592 | | - nResult = typeCode; |
593 | | - } |
594 | | - fclose(f); |
| 590 | + if (!std::ifstream(path)) { |
| 591 | + return typeUnknown; |
| 592 | + } |
| 593 | + |
| 594 | + const char* ext = strstr(path, "."); |
| 595 | + if (ext) { |
| 596 | + const char* docs[] = {".doc", ".txt", nullptr}; |
| 597 | + const char* code[] = {".cpp", ".h", ".pl", ".py", ".pyc", nullptr}; |
| 598 | + if (sina(ext, docs)) |
| 599 | + return typeDoc; |
| 600 | + if (sina(ext, code)) |
| 601 | + return typeCode; |
595 | 602 | } |
596 | 603 |
|
597 | | - return nResult; |
| 604 | + return typeFile; |
598 | 605 | } |
599 | 606 |
|
600 | 607 | Position* searchTimeDict(TimeDict_t& td, const time_t& time, long long delta) { |
|
0 commit comments