Skip to content

Instantly share code, notes, and snippets.

@emadflash
Created May 9, 2021 06:09
Show Gist options
  • Save emadflash/db6de36ba53c816413cbdec9b31fad51 to your computer and use it in GitHub Desktop.
Save emadflash/db6de36ba53c816413cbdec9b31fad51 to your computer and use it in GitHub Desktop.
#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