From b9e3d5746af802bb2534f164c120a29bf21f5baa Mon Sep 17 00:00:00 2001 From: Abdelrahman Said Date: Mon, 12 Jun 2023 23:59:21 +0100 Subject: [PATCH] Test adding a number state machine --- .gitignore | 1 + .vscode/launch.json | 20 ++++++ fsm | Bin 0 -> 51536 bytes fsm.c | 167 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 188 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/launch.json create mode 100755 fsm create mode 100644 fsm.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cb77d18 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.dSYM diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..02fddc7 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,20 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "fsm", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/fsm", + "args": [], + "stopAtEntry": false, + "cwd": "${fileDirname}", + "environment": [], + "externalConsole": false, + "MIMode": "lldb" + } + ] +} \ No newline at end of file diff --git a/fsm b/fsm new file mode 100755 index 0000000000000000000000000000000000000000..70a72545ed6cdb8a5ca40d26d42caf226a4c7ffa GIT binary patch literal 51536 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 literal 0 HcmV?d00001 diff --git a/fsm.c b/fsm.c new file mode 100644 index 0000000..2f58270 --- /dev/null +++ b/fsm.c @@ -0,0 +1,167 @@ +#include +#include +#include +#include + +#define ARR_LEN(X) (sizeof(X) / sizeof(X[0])) + +typedef enum { + START_STATE, + DECIMAL_STATE, + NUM_STATE, + FRACTION_STATE, + EXPONENT_STATE, + EXP_SIGN_STATE, + POWER_STATE, + END_STATE, + INVALID_STATE, +} states; + +states handle_start(char input); +states handle_decimal(char input); +states handle_num(char input); +states handle_fraction(char input); +states handle_exponent(char input); +states handle_exp_sign(char input); +states handle_power(char input); + +states state_machine(states current, char input); + +bool check_number(const char *num); + +const char *inputs[] = { + "0000000", // INVALID + "01", // INVALID + "f0", // INVALID + "1f", // INVALID + "1.f", // INVALID + "1.0f", // INVALID + "8987", // VALID + "9.5", // VALID + " 7", // VALID + " 7.8", // VALID + "732.9834e", // INVALID + "732.9834e-", // INVALID + "732.9834e+", // INVALID + "732.9834e-g", // INVALID + "732.9834e-8", // VALID + "732.9834e+8", // VALID +}; + +int main(int argc, char *argv[]) { + for (int i = 0; i < ARR_LEN(inputs); ++i) { + printf("%s is %s\n", inputs[i], + check_number(inputs[i]) ? "VALID" : "INVALID"); + } + + return EXIT_SUCCESS; +} + +states handle_start(char input) { + if (isspace(input)) { + return START_STATE; + } else if (input == '0') { + return DECIMAL_STATE; + } else if (isdigit(input)) { + return NUM_STATE; + } + + return INVALID_STATE; +} + +states handle_decimal(char input) { + if (input == '.') { + return FRACTION_STATE; + } + + return INVALID_STATE; +} + +states handle_num(char input) { + if (isdigit(input)) { + return NUM_STATE; + } else if (input == '.') { + return FRACTION_STATE; + } else if (isspace(input)) { + return END_STATE; + } + + return INVALID_STATE; +} + +states handle_fraction(char input) { + if (isdigit(input)) { + return FRACTION_STATE; + } else if (isspace(input)) { + return END_STATE; + } else if (input == 'e' || input == 'E') { + return EXPONENT_STATE; + } + + return INVALID_STATE; +} + +states handle_exponent(char input) { + if (isdigit(input)) { + return POWER_STATE; + } else if (input == '+' || input == '-') { + return EXP_SIGN_STATE; + } + + return INVALID_STATE; +} + +states handle_exp_sign(char input) { + if (isdigit(input)) { + return POWER_STATE; + } + + return INVALID_STATE; +} + +states handle_power(char input) { + if (isdigit(input)) { + return POWER_STATE; + } else if (isspace(input)) { + return END_STATE; + } + + return INVALID_STATE; +} + +states state_machine(states current, char input) { + switch (current) { + case START_STATE: + return handle_start(input); + case DECIMAL_STATE: + return handle_decimal(input); + case NUM_STATE: + return handle_num(input); + case FRACTION_STATE: + return handle_fraction(input); + case EXPONENT_STATE: + return handle_exponent(input); + case EXP_SIGN_STATE: + return handle_exp_sign(input); + case POWER_STATE: + return handle_power(input); + case END_STATE: + case INVALID_STATE: + return current; + } +} + +bool check_number(const char *num) { + states current = START_STATE; + + for (const char *c = &(num[0]); *c != '\0'; ++c) { + current = state_machine(current, *c); + + if (current == INVALID_STATE) { + return false; + } + } + + return current == END_STATE || current == NUM_STATE || + current == FRACTION_STATE || current == POWER_STATE; +}