Created
May 9, 2021 06:09
-
-
Save emadflash/db6de36ba53c816413cbdec9b31fad51 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include<iostream> | |
#include<vector> | |
#include<string> | |
#include<memory> | |
#include<sstream> | |
#include<iterator> | |
#include<algorithm> | |
#include<vector> | |
namespace parser { | |
using string_iterator = std::string::iterator; | |
std::string make_string(string_iterator begin, string_iterator end) { | |
auto d = std::distance(begin, end); | |
return std::string(begin, begin + d); | |
} | |
template<typename It> | |
std::vector<std::string> split(It begin, It end, char delminator) { | |
auto it = begin; | |
std::vector<std::string> vec; | |
while(begin++ != end) { | |
if (*begin == ' ') { | |
vec.push_back(make_string(it, begin)); | |
it = next(begin); | |
} | |
} | |
vec.push_back(make_string(it, end)); | |
return vec; | |
} | |
} | |
typedef struct { | |
std::string userNick; | |
std::string userName; | |
std::string userHost; | |
std::string userCommand; | |
std::string userChannel; | |
std::string userMessage; | |
} vistor; | |
void vistor_parse_first(parser::string_iterator begin, parser::string_iterator end, std::unique_ptr<vistor>& l) { | |
std::unique_ptr<parser::string_iterator> start = std::make_unique<parser::string_iterator>(begin); | |
begin = begin + 1; | |
while(begin++ != end) { | |
switch(*begin) { | |
case '!': | |
l->userNick = parser::make_string(*start, begin); | |
*start = begin + 1; | |
break; | |
case '@': | |
l->userName = parser::make_string(*start, begin); | |
*start = begin + 1; | |
break; | |
case ' ': | |
l->userHost = parser::make_string(*start, end); | |
break; | |
} | |
} | |
} | |
void vistor_parse_end(parser::string_iterator begin, parser::string_iterator end, std::unique_ptr<vistor>& l) { | |
std::unique_ptr<parser::string_iterator> start = std::make_unique<parser::string_iterator>(begin); | |
begin = begin + 1; | |
while(begin++ != end) { | |
switch(*begin) { | |
case ':': | |
auto result = parser::split(*start, begin, ' '); | |
l->userCommand = *result.begin(); | |
l->userChannel = *(result.begin() + 1); | |
*start = begin + 1; | |
break; | |
} | |
} | |
l->userMessage = parser::make_string(*start, end); | |
} | |
std::unique_ptr<vistor> vistor_parse(parser::string_iterator begin, parser::string_iterator end) { | |
std::unique_ptr<vistor> v = std::make_unique<vistor>(); | |
auto token_space = std::find(begin, end, ' '); | |
vistor_parse_first(begin, token_space, v); | |
vistor_parse_end(token_space, end, v); | |
return v; | |
} | |
int main() { | |
char *msg = ":drmessano!madflash@pdpc/supporter/active/drmessano PRIVMSG ##networking :I think they had 8086 CPUs in them, because when you enabled"; | |
auto msg_string = std::string(msg); | |
auto blah = vistor_parse(msg_string.begin() + 1, msg_string.end()); | |
std::cout << blah->userNick; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment