#include #include #include #include #include #include "readlog.h" bool parse_logline(struct logline *parsed, std::string raw) { // Format: 1970-01-01T00:00:00 < Foobar> Hello world! // 1970-01-01T00:00:00 -!- will be skipped std::string timestring; struct tm time = {0}; std::istringstream buffer(raw); buffer >> time.tm_year; buffer.ignore(1); buffer >> time.tm_mon; buffer.ignore(1); buffer >> time.tm_mday; buffer.ignore(1); buffer >> time.tm_hour; buffer.ignore(1); buffer >> time.tm_min; buffer.ignore(1); buffer >> time.tm_sec; buffer.ignore(1); time.tm_year -= 1900; time.tm_mon -= 1; parsed->timestamp = mktime(&time); if (buffer.get() == '<') { switch(buffer.get()) { case '+': parsed->status = voice; break; case '@': parsed->status = op; break; default: parsed->status = normal; } std::getline(buffer, parsed->nick, '>'); } else if (buffer.get() == '*') { // extra space before * is taken out by first if condition parsed->status = normal; buffer.ignore(1); // ' ' std::getline(buffer, parsed->nick, ' '); } else { return false; } buffer.ignore(1); // ' ' std::getline(buffer, parsed->message); return true; } void readlog(std::vector &lines, std::istream &infile) { std::string rawline; struct logline parsedline; while (infile.good()) { std::getline(infile, rawline); if (parse_logline(&parsedline, rawline)) lines.push_back(parsedline); } }