You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

138 lines
2.6 KiB
C++

#include <iostream>
//#include <cstring>
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;
}