From 038cca642bc8627162bdf50b132396595f9f73ea Mon Sep 17 00:00:00 2001 From: Clay Smith Date: Wed, 1 Feb 2023 18:48:57 -0600 Subject: Done minux adding new controllers? --- .DS_Store | Bin 0 -> 6148 bytes Daniels_185_Paper_IEEE.pdf | Bin 0 -> 405563 bytes WiiYourself_092b.wiiwrap.tgz | Bin 0 -> 9563911 bytes global_defs.h | 4 + handle_devices.c | 75 ++++++++- handle_devices.h | 2 + main.c | 382 ++++++++----------------------------------- 7 files changed, 147 insertions(+), 316 deletions(-) create mode 100644 .DS_Store create mode 100644 Daniels_185_Paper_IEEE.pdf create mode 100644 WiiYourself_092b.wiiwrap.tgz diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..e63965c Binary files /dev/null and b/.DS_Store differ diff --git a/Daniels_185_Paper_IEEE.pdf b/Daniels_185_Paper_IEEE.pdf new file mode 100644 index 0000000..18bedcc Binary files /dev/null and b/Daniels_185_Paper_IEEE.pdf differ diff --git a/WiiYourself_092b.wiiwrap.tgz b/WiiYourself_092b.wiiwrap.tgz new file mode 100644 index 0000000..f8e224e Binary files /dev/null and b/WiiYourself_092b.wiiwrap.tgz differ diff --git a/global_defs.h b/global_defs.h index 7649dbf..84c4124 100644 --- a/global_defs.h +++ b/global_defs.h @@ -68,3 +68,7 @@ enum { MOUSE = 12 }; +struct event_pairs { + int event_fptr_index; + int event_user_num; +}; diff --git a/handle_devices.c b/handle_devices.c index 3a746bb..2164cec 100644 --- a/handle_devices.c +++ b/handle_devices.c @@ -2,6 +2,7 @@ #include #include #include "global_defs.h" +#include void open_wii(int* controller_event_fptrs, uint64_t* connected_controllers) { //Determine if WII REMOTE is connected via bluetooth @@ -107,7 +108,6 @@ void open_xbox_360(int* controller_event_fptrs, uint64_t* connected_controllers) void close_unneeded_files(int num_exceptions, int controller_event_fptrs[], ...) { - //int events_to_skip[num_exceptions] = { -1 }; int* events_to_skip = (int *) malloc(sizeof(int) * num_exceptions); va_list list_of_args; va_start(list_of_args, controller_event_fptrs); @@ -150,3 +150,76 @@ void print_one_event(int controller_event_fptrs[], int index, int event_number) } fprintf(stderr, "DISCONNECTED\n"); } + +void print_multiple_events(int num_exceptions, int controller_event_fptrs[], ...) { + pid_t pids[num_exceptions]; + //set all pids to -1 at start + for (int i = 0; i < num_exceptions; ++i) { pids[i] = -1; } + //get all the variadic pairs sent in and store them in an array of the appropriate size + struct event_pairs pairs[num_exceptions]; + va_list list_of_args; + va_start(list_of_args, controller_event_fptrs); + for (int i = 0; i < num_exceptions; ++i) { + pairs[i] = va_arg(list_of_args, struct event_pairs); + } + //prepare to start printing inputs + struct input_event event[num_exceptions]; + int event_size = sizeof(struct input_event); + //create the amount of processes appropriate to the number of events to print + for (int i = 0; i < num_exceptions - 1; ++i) { + pids[i] = fork(); + if (pids[i] == 0) break; + } + //mark the parent + bool isParent = true; + for (int i = 0; i < num_exceptions; ++i) { + if (pids[i] == 0) isParent &= false; + } + //find and run code just for the parent process (first event (a.k.a. index 0)) + if (isParent) { + //printf("\nIm the parent, pid: %d\n", getpid()); + //put the code you want the parent to run here? + int initial_read = read(controller_event_fptrs[pairs[0].event_fptr_index], &event[0], event_size); + if (initial_read == -1) { + fprintf(stderr, "PROBLEM READING FILE!\n"); + exit(-1); + } + size_t start_sec = event[0].time.tv_sec; + while (read(controller_event_fptrs[pairs[0].event_fptr_index], &event[0], event_size) != -1) { + if (event[0].type == 0) continue; + printf("%d %zu.%-6zu %d %3d %9d\n", + pairs[0].event_user_num, + event[0].time.tv_sec - start_sec, + event[0].time.tv_usec, + event[0].type, + event[0].code, + event[0].value); + } + fprintf(stderr, "DISCONNECTED\n"); + } + //find the child process(es) and run the correct code for each (event #2 onwards) (a.k.a. index 1+)) + sleep(1); + for (int i = 0; i < num_exceptions; ++i) { + if (pids[i] == 0) { + //printf("Im child #%d.\n", i + 1); + //put the rest of the code in here? + int initial_read = read(controller_event_fptrs[pairs[i+1].event_fptr_index], &event[i+1], event_size); + if (initial_read == -1) { + fprintf(stderr, "PROBLEM READING FILE!\n"); + exit(-1); + } + size_t start_sec = event[i+1].time.tv_sec; + while (read(controller_event_fptrs[pairs[i+1].event_fptr_index], &event[i+1], event_size) != -1) { + if (event[i+1].type == 0) continue; + printf("%d %zu.%-6zu %d %3d %9d\n", + pairs[i+1].event_user_num, + event[i+1].time.tv_sec - start_sec, + event[i+1].time.tv_usec, + event[i+1].type, + event[i+1].code, + event[i+1].value); + } + fprintf(stderr, "DISCONNECTED\n"); + } + } +} diff --git a/handle_devices.h b/handle_devices.h index e0d0471..d70ff41 100644 --- a/handle_devices.h +++ b/handle_devices.h @@ -15,4 +15,6 @@ void close_unneeded_files(int num_exceptions, int controller_event_fptrs[], ...) void print_one_event(int controller_event_fptrs[], int index, int event_number); +void print_multiple_events(int num_exceptions, int controller_event_fptrs[], ...); + #endif diff --git a/main.c b/main.c index 01e393b..41c27ac 100644 --- a/main.c +++ b/main.c @@ -1,30 +1,20 @@ #include "global_defs.h" #include "handle_devices.h" -void print_single_event(int event_index) { -} - int main(void) { system("clear"); setvbuf(stdout, NULL, _IONBF, BUFSIZ); - int controller_event_fptrs[NUM_EVENTS]; uint64_t connected_controllers = 0; - open_wii(controller_event_fptrs, &connected_controllers); - open_ps4_bt(controller_event_fptrs, &connected_controllers); - open_ps4_wired(controller_event_fptrs, &connected_controllers); - open_steam(controller_event_fptrs, &connected_controllers); - open_xbox_360(controller_event_fptrs, &connected_controllers); - if (connected_controllers == 0) { fprintf(stderr, "No device matching the programs requirments (DualShock 4, Xbox 360, Valve Steam, or Wii Controller) was found, please double check the connection if you do not think that this is the case.\n"); return(-1); @@ -74,135 +64,34 @@ DUMB_USER: case PS4_WIRED_TOUCH_AND_GYRO: { close_unneeded_files(2, controller_event_fptrs, PS4_WIRED_TOUCH, PS4_WIRED_GYRO); - read(controller_event_fptrs[PS4_WIRED_TOUCH], &event1, ievt_size); - read(controller_event_fptrs[PS4_WIRED_GYRO], &event2, ievt_size); - start_sec = event1.time.tv_sec; - int pid = fork(); - if (pid == 0) { - while (1) { - read(controller_event_fptrs[PS4_WIRED_TOUCH], &event1, ievt_size); - printf("1 %zu.%-6zu %d %3d %9d\n", - event1.time.tv_sec - start_sec, - event1.time.tv_usec, - event1.type, - event1.code, - event1.value); - } - } else { - while (1) { - read(controller_event_fptrs[PS4_WIRED_GYRO], &event2, ievt_size); - printf("2 %zu.%-6zu %d %3d %9d\n", - event2.time.tv_sec - start_sec, - event2.time.tv_usec, - event2.type, - event2.code, - event2.value); - } - } + struct event_pairs first_event = {PS4_WIRED_TOUCH, 1}, + second_event = {PS4_WIRED_GYRO, 2}; + print_multiple_events(2, controller_event_fptrs, first_event, second_event); break; } case PS4_WIRED_TOUCH_AND_BUTTONS: { close_unneeded_files(2, controller_event_fptrs, PS4_WIRED_TOUCH, PS4_WIRED_BUTTONS); - read(controller_event_fptrs[PS4_WIRED_TOUCH], &event1, ievt_size); - read(controller_event_fptrs[PS4_WIRED_BUTTONS], &event2, ievt_size); - start_sec = event1.time.tv_sec; - int pid = fork(); - if (pid == 0) { - while (1) { - read(controller_event_fptrs[PS4_WIRED_TOUCH], &event1, ievt_size); - printf("1 %zu.%-6zu %d %3d %9d\n", - event1.time.tv_sec - start_sec, - event1.time.tv_usec, - event1.type, - event1.code, - event1.value); - } - } else { - while (1) { - read(controller_event_fptrs[PS4_WIRED_BUTTONS], &event2, ievt_size); - printf("3 %zu.%-6zu %d %3d %9d\n", - event2.time.tv_sec - start_sec, - event2.time.tv_usec, - event2.type, - event2.code, - event2.value); - } - } + struct event_pairs first_event = {PS4_WIRED_TOUCH, 1}, + second_event = {PS4_WIRED_BUTTONS, 3}; + print_multiple_events(2, controller_event_fptrs, first_event, second_event); break; } case PS4_WIRED_GYRO_AND_BUTTONS: { close_unneeded_files(2, controller_event_fptrs, PS4_WIRED_GYRO, PS4_WIRED_BUTTONS); - read(controller_event_fptrs[PS4_WIRED_GYRO], &event1, ievt_size); - read(controller_event_fptrs[PS4_WIRED_BUTTONS], &event2, ievt_size); - start_sec = event1.time.tv_sec; - int pid = fork(); - if (pid == 0) { - while (1) { - read(controller_event_fptrs[PS4_WIRED_GYRO], &event1, ievt_size); - printf("2 %zu.%-6zu %d %3d %9d\n", - event1.time.tv_sec - start_sec, - event1.time.tv_usec, - event1.type, - event1.code, - event1.value); - } - } else { - while (1) { - read(controller_event_fptrs[PS4_WIRED_BUTTONS], &event2, ievt_size); - printf("3 %zu.%-6zu %d %3d %9d\n", - event2.time.tv_sec - start_sec, - event2.time.tv_usec, - event2.type, - event2.code, - event2.value); - } - } + struct event_pairs first_event = {PS4_WIRED_GYRO, 2}, + second_event = {PS4_WIRED_BUTTONS, 3}; + print_multiple_events(2, controller_event_fptrs, first_event, second_event); break; } case PS4_WIRED_ALL_BITS: { close_unneeded_files(3, controller_event_fptrs, PS4_WIRED_TOUCH, PS4_WIRED_GYRO, PS4_WIRED_BUTTONS); - read(controller_event_fptrs[PS4_WIRED_TOUCH], &event1, ievt_size); - read(controller_event_fptrs[PS4_WIRED_GYRO], &event2, ievt_size); - read(controller_event_fptrs[PS4_WIRED_BUTTONS], &event3, ievt_size); - start_sec = event1.time.tv_sec; - int pid = fork(); - if (pid == 0) { - while (1) { - read(controller_event_fptrs[PS4_WIRED_TOUCH], &event1, ievt_size); - printf("1 %zu.%-6zu %d %3d %9d\n", - event1.time.tv_sec - start_sec, - event1.time.tv_usec, - event1.type, - event1.code, - event1.value); - } - } else { - pid = fork(); - if (pid == 0) { - while (1) { - read(controller_event_fptrs[PS4_WIRED_GYRO], &event2, ievt_size); - printf("2 %zu.%-6zu %d %3d %9d\n", - event2.time.tv_sec - start_sec, - event2.time.tv_usec, - event2.type, - event2.code, - event2.value); - } - } else { - while (1) { - read(controller_event_fptrs[PS4_WIRED_BUTTONS], &event3, ievt_size); - printf("3 %zu.%-6zu %d %3d %9d\n", - event3.time.tv_sec - start_sec, - event3.time.tv_usec, - event3.type, - event3.code, - event3.value); - } - } - } + struct event_pairs first_event = {PS4_WIRED_TOUCH, 1}, + second_event = {PS4_WIRED_GYRO, 2}, + third_event = {PS4_WIRED_BUTTONS, 3}; + print_multiple_events(3, controller_event_fptrs, first_event, second_event, third_event); break; } case PS4_BT_TOUCH_BIT: @@ -226,135 +115,34 @@ DUMB_USER: case PS4_BT_TOUCH_AND_GYRO: { close_unneeded_files(2, controller_event_fptrs, PS4_BT_TOUCH, PS4_BT_GYRO); - read(controller_event_fptrs[PS4_BT_TOUCH], &event1, ievt_size); - read(controller_event_fptrs[PS4_BT_GYRO], &event2, ievt_size); - start_sec = event1.time.tv_sec; - int pid = fork(); - if (pid == 0) { - while (1) { - read(controller_event_fptrs[PS4_BT_TOUCH], &event1, ievt_size); - printf("1 %zu.%-6zu %d %3d %9d\n", - event1.time.tv_sec - start_sec, - event1.time.tv_usec, - event1.type, - event1.code, - event1.value); - } - } else { - while (1) { - read(controller_event_fptrs[PS4_BT_GYRO], &event2, ievt_size); - printf("2 %zu.%-6zu %d %3d %9d\n", - event2.time.tv_sec - start_sec, - event2.time.tv_usec, - event2.type, - event2.code, - event2.value); - } - } + struct event_pairs first_event = {PS4_BT_TOUCH, 1}, + second_event = {PS4_BT_GYRO, 2}; + print_multiple_events(2, controller_event_fptrs, first_event, second_event); break; } case PS4_BT_TOUCH_AND_BUTTONS: { close_unneeded_files(2, controller_event_fptrs, PS4_BT_TOUCH, PS4_BT_BUTTONS); - read(controller_event_fptrs[PS4_BT_TOUCH], &event1, ievt_size); - read(controller_event_fptrs[PS4_BT_BUTTONS], &event2, ievt_size); - start_sec = event1.time.tv_sec; - int pid = fork(); - if (pid == 0) { - while (1) { - read(controller_event_fptrs[PS4_BT_TOUCH], &event1, ievt_size); - printf("1 %zu.%-6zu %d %3d %9d\n", - event1.time.tv_sec - start_sec, - event1.time.tv_usec, - event1.type, - event1.code, - event1.value); - } - } else { - while (1) { - read(controller_event_fptrs[PS4_BT_BUTTONS], &event2, ievt_size); - printf("3 %zu.%-6zu %d %3d %9d\n", - event2.time.tv_sec - start_sec, - event2.time.tv_usec, - event2.type, - event2.code, - event2.value); - } - } + struct event_pairs first_event = {PS4_BT_TOUCH, 1}, + second_event = {PS4_BT_BUTTONS, 3}; + print_multiple_events(2, controller_event_fptrs, first_event, second_event); break; } case PS4_BT_GYRO_AND_BUTTONS: { close_unneeded_files(2, controller_event_fptrs, PS4_BT_GYRO, PS4_BT_BUTTONS); - read(controller_event_fptrs[PS4_BT_GYRO], &event1, ievt_size); - read(controller_event_fptrs[PS4_BT_BUTTONS], &event2, ievt_size); - start_sec = event1.time.tv_sec; - int pid = fork(); - if (pid == 0) { - while (1) { - read(controller_event_fptrs[PS4_BT_GYRO], &event1, ievt_size); - printf("2 %zu.%-6zu %d %3d %9d\n", - event1.time.tv_sec - start_sec, - event1.time.tv_usec, - event1.type, - event1.code, - event1.value); - } - } else { - while (1) { - read(controller_event_fptrs[PS4_BT_BUTTONS], &event2, ievt_size); - printf("3 %zu.%-6zu %d %3d %9d\n", - event2.time.tv_sec - start_sec, - event2.time.tv_usec, - event2.type, - event2.code, - event2.value); - } - } + struct event_pairs first_event = {PS4_BT_GYRO, 2}, + second_event = {PS4_BT_BUTTONS, 3}; + print_multiple_events(2, controller_event_fptrs, first_event, second_event); break; } case PS4_BT_ALL_BITS: { close_unneeded_files(3, controller_event_fptrs, PS4_BT_TOUCH, PS4_BT_GYRO, PS4_BT_BUTTONS); - read(controller_event_fptrs[PS4_BT_TOUCH], &event1, ievt_size); - read(controller_event_fptrs[PS4_BT_GYRO], &event2, ievt_size); - read(controller_event_fptrs[PS4_BT_BUTTONS], &event3, ievt_size); - start_sec = event1.time.tv_sec; - int pid = fork(); - if (pid == 0) { - while (1) { - read(controller_event_fptrs[PS4_BT_TOUCH], &event1, ievt_size); - printf("1 %zu.%-6zu %d %3d %9d\n", - event1.time.tv_sec - start_sec, - event1.time.tv_usec, - event1.type, - event1.code, - event1.value); - } - } else { - pid = fork(); - if (pid == 0) { - while (1) { - read(controller_event_fptrs[PS4_BT_GYRO], &event2, ievt_size); - printf("2 %zu.%-6zu %d %3d %9d\n", - event2.time.tv_sec - start_sec, - event2.time.tv_usec, - event2.type, - event2.code, - event2.value); - } - } else { - while (1) { - read(controller_event_fptrs[PS4_BT_BUTTONS], &event3, ievt_size); - printf("3 %zu.%-6zu %d %3d %9d\n", - event3.time.tv_sec - start_sec, - event3.time.tv_usec, - event3.type, - event3.code, - event3.value); - } - } - } + struct event_pairs first_event = {PS4_BT_TOUCH, 1}, + second_event = {PS4_BT_GYRO, 2}, + third_event = {PS4_BT_BUTTONS, 3}; + print_multiple_events(3, controller_event_fptrs, first_event, second_event, third_event); break; } case NINTENDO_GYRO_BIT: @@ -384,137 +172,101 @@ DUMB_USER: case NINTENDO_GYRO_AND_IR: { close_unneeded_files(2, controller_event_fptrs, WII_GYRO, WII_IR); - read(controller_event_fptrs[WII_GYRO], &event1, ievt_size); - read(controller_event_fptrs[WII_IR], &event2, ievt_size); - start_sec = event1.time.tv_sec; - int pid = fork(); - if (pid == 0) { - while (1) { - read(controller_event_fptrs[WII_GYRO], &event1, ievt_size); - printf("1 %zu.%-6zu %d %3d %9d\n", - event1.time.tv_sec - start_sec, - event1.time.tv_usec, - event1.type, - event1.code, - event1.value); - } - } else { - while (1) { - read(controller_event_fptrs[WII_IR], &event2, ievt_size); - printf("2 %zu.%-6zu %d %3d %9d\n", - event2.time.tv_sec - start_sec, - event2.time.tv_usec, - event2.type, - event2.code, - event2.value); - } - } + struct event_pairs first_event = {WII_GYRO, 1}, + second_event = {WII_IR, 2}; + print_multiple_events(2, controller_event_fptrs, first_event, second_event); break; } case NINTENDO_GYRO_AND_BUTTONS: { close_unneeded_files(2, controller_event_fptrs, WII_GYRO, WII_BUTTONS); - read(controller_event_fptrs[WII_GYRO], &event1, ievt_size); - read(controller_event_fptrs[WII_BUTTONS], &event2, ievt_size); - start_sec = event1.time.tv_sec; - int pid = fork(); - if (pid == 0) { - while (1) { - read(controller_event_fptrs[WII_GYRO], &event1, ievt_size); - printf("1 %zu.%-6zu %d %3d %9d\n", - event1.time.tv_sec - start_sec, - event1.time.tv_usec, - event1.type, - event1.code, - event1.value); - } - } else { - while (1) { - read(controller_event_fptrs[WII_BUTTONS], &event2, ievt_size); - printf("3 %zu.%-6zu %d %3d %9d\n", - event2.time.tv_sec - start_sec, - event2.time.tv_usec, - event2.type, - event2.code, - event2.value); - } - } + struct event_pairs first_event = {WII_GYRO, 1}, + second_event = {WII_BUTTONS, 3}; + print_multiple_events(2, controller_event_fptrs, first_event, second_event); break; } case NINTENDO_GYRO_AND_NUNCHUK: { close_unneeded_files(2, controller_event_fptrs, WII_GYRO, WII_NUNCHUK); - read(controller_event_fptrs[WII_GYRO], &event1, ievt_size); - read(controller_event_fptrs[WII_BUTTONS], &event2, ievt_size); - start_sec = event1.time.tv_sec; - int pid = fork(); - if (pid == 0) { - while (1) { - read(controller_event_fptrs[WII_GYRO], &event1, ievt_size); - printf("1 %zu.%-6zu %d %3d %9d\n", - event1.time.tv_sec - start_sec, - event1.time.tv_usec, - event1.type, - event1.code, - event1.value); - } - } else { - while (1) { - read(controller_event_fptrs[WII_BUTTONS], &event2, ievt_size); - printf("3 %zu.%-6zu %d %3d %9d\n", - event2.time.tv_sec - start_sec, - event2.time.tv_usec, - event2.type, - event2.code, - event2.value); - } - } + struct event_pairs first_event = {WII_GYRO, 1}, + second_event = {WII_NUNCHUK, 4}; + print_multiple_events(2, controller_event_fptrs, first_event, second_event); break; } case NINTENDO_IR_AND_BUTTONS: { close_unneeded_files(2, controller_event_fptrs, WII_IR, WII_BUTTONS); + struct event_pairs first_event = {WII_IR, 2}, + second_event = {WII_BUTTONS, 3}; + print_multiple_events(2, controller_event_fptrs, first_event, second_event); break; } case NINTENDO_IR_AND_NUNCHUK: { close_unneeded_files(2, controller_event_fptrs, WII_IR, WII_NUNCHUK); + struct event_pairs first_event = {WII_IR, 2}, + second_event = {WII_NUNCHUK, 4}; + print_multiple_events(2, controller_event_fptrs, first_event, second_event); break; } case NINTENDO_BUTTONS_AND_NUNCHUK: { close_unneeded_files(2, controller_event_fptrs, WII_BUTTONS, WII_NUNCHUK); + struct event_pairs first_event = {WII_BUTTONS, 3}, + second_event = {WII_NUNCHUK, 4}; + print_multiple_events(2, controller_event_fptrs, first_event, second_event); break; } case NINTENDO_GYRO_IR_AND_BUTTONS: { close_unneeded_files(3, controller_event_fptrs, WII_GYRO, WII_IR, WII_BUTTONS); + struct event_pairs first_event = {WII_GYRO, 1}, + second_event = {WII_IR, 2}, + third_event = {WII_BUTTONS, 3}; + print_multiple_events(3, controller_event_fptrs, first_event, second_event, third_event); break; } case NINTENDO_GYRO_IR_AND_NUNCHUK: { close_unneeded_files(3, controller_event_fptrs, WII_GYRO, WII_IR, WII_NUNCHUK); + struct event_pairs first_event = {WII_GYRO, 1}, + second_event = {WII_IR, 2}, + third_event = {WII_NUNCHUK, 4}; + print_multiple_events(3, controller_event_fptrs, first_event, second_event, third_event); break; } case NINTENDO_GYRO_BUTTONS_AND_NUNCHUK: { close_unneeded_files(3, controller_event_fptrs, WII_GYRO, WII_BUTTONS, WII_NUNCHUK); + struct event_pairs first_event = {WII_GYRO, 1}, + second_event = {WII_BUTTONS, 3}, + third_event = {WII_NUNCHUK, 4}; + print_multiple_events(3, controller_event_fptrs, first_event, second_event, third_event); break; } case NINTENDO_IR_BUTTONS_AND_NUNCHUK: { close_unneeded_files(3, controller_event_fptrs, WII_IR, WII_BUTTONS, WII_NUNCHUK); + struct event_pairs first_event = {WII_IR, 2}, + second_event = {WII_BUTTONS, 3}, + third_event = {WII_NUNCHUK, 4}; + print_multiple_events(3, controller_event_fptrs, first_event, second_event, third_event); break; } case NINTENDO_ALL_BITS: { close_unneeded_files(4, controller_event_fptrs, WII_GYRO, WII_IR, WII_BUTTONS, WII_NUNCHUK); + struct event_pairs first_event = {WII_GYRO, 1}, + second_event = {WII_IR, 2}, + third_event = {WII_BUTTONS, 3}, + fourth_event = {WII_NUNCHUK, 4}; + print_multiple_events(4, controller_event_fptrs, first_event, second_event, third_event, fourth_event); break; } default: { - fprintf(stderr, "ERROR: Do not know how you made it here.\n"); - exit(-1); + fprintf(stderr, "ERROR: You entered an invalid number!\n"); + goto DUMB_USER; break; } } -- cgit v1.2.1