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++
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;
|
|
|
|
} |