#include //#include using namespace std; int parse_string(char input[]); void parse_string_callback(char command, char arg, int parsed_number); int main() { char input1[] = "f r20 g120 b255\n"; char input2[] = "b\n"; char input3[] = "t r20\n"; char input4[] = "t r20\nb\nf r20 g120 b255\n"; char input5[] = "t'r3\n"; cout << "parsing string: " << input4 << endl; return parse_string(input4); } void callback(char command, char arg, int parsed_number) { cout << "command: " << command << " | "; cout << "arg: " << arg << " | "; cout << "parsed_number: " << parsed_number << " | "; cout << endl; } int parse_string(char input[]) { char current_char = input[0]; char command = ' '; char arg = ' '; char current_number_string[4] = {' ', ' ', ' ', '\0'}; int line_position = 0; int total_position = 0; int current_number_len = 0; int parsed_number = 0; while (current_char != '\0') { if (line_position == 0) { switch (current_char) { case 'f': case 't': case 'b': command = current_char; break; default: cout << "invalid command. " << endl; return 1; } } else { switch (current_char) { case '0' ... '9': if (current_number_len < 4) { current_number_len++; current_number_string[current_number_len - 1] = current_char; } break; case 'r': case 'g': case 'b': case 't': arg = current_char; break; case ' ': if (current_number_len > 0) parsed_number = stoi(current_number_string); if (arg != ' ') callback(command, arg, parsed_number); arg = ' '; current_number_len = 0; fill(begin(current_number_string), end(current_number_string), ' '); current_number_string[3] = '\0'; break; case '\n': if (current_number_len > 0) parsed_number = stoi(current_number_string); callback(command, arg, parsed_number); command = arg = ' '; line_position = parsed_number = current_number_len = 0; fill(begin(current_number_string), end(current_number_string), ' '); current_number_string[3] = '\0'; break; default: cout << "invalid syntax." << endl; return 1; } } if (current_char != '\n') { //cout << "line_position: " << line_position << " | "; //cout << "current_char: " << (current_char == '\n' ? '\\' : current_char) << " | "; //cout << "parsed_number: " << parsed_number << " | "; //cout << "current_number_string: " << current_number_string << " | "; //cout << "command: " << command << endl; line_position++; } total_position++; current_char = input[total_position]; } line_position = 0; return 0; }