Skip to content

Commit 8caa5a8

Browse files
committed
m
1 parent a1c3ee2 commit 8caa5a8

File tree

1 file changed

+54
-47
lines changed

1 file changed

+54
-47
lines changed

samples/geotag.cpp

Lines changed: 54 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <sys/types.h>
99

1010
#include <algorithm>
11+
#include <fstream>
1112
#include <iostream>
1213

1314
#if __has_include(<filesystem>)
@@ -475,48 +476,55 @@ bool readDir(const char* path, Options& options) {
475476
return bResult;
476477
}
477478

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+
}
481485
return len;
482486
}
483487

484488
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+
486494
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+
}
506498

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;
513517
}
514518

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+
}
519526

527+
XML_ParserFree(parser);
520528
return bResult;
521529
}
522530

@@ -579,22 +587,21 @@ bool sina(const char* s, const char** a) {
579587
}
580588

581589
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;
595602
}
596603

597-
return nResult;
604+
return typeFile;
598605
}
599606

600607
Position* searchTimeDict(TimeDict_t& td, const time_t& time, long long delta) {

0 commit comments

Comments
 (0)