X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fmisc.c;h=e2c8d7e0bafbf52a8c11ebd91d38c67678fb5b72;hb=8cef2a63b6c56ba086183693d3f73f02862cbd8f;hp=8d36c27a186cc2e59c027580ffa742212cd8b73e;hpb=57562a0f29074feea1dc01ddf1b1d5e4e6d59730;p=rocksndiamonds.git diff --git a/src/misc.c b/src/misc.c index 8d36c27a..e2c8d7e0 100644 --- a/src/misc.c +++ b/src/misc.c @@ -84,7 +84,8 @@ void Delay(unsigned long delay) /* Sleep specified number of milliseconds */ sleep_milliseconds(delay); } -BOOL FrameReached(unsigned long *frame_counter_var, unsigned long frame_delay) +boolean FrameReached(unsigned long *frame_counter_var, + unsigned long frame_delay) { unsigned long actual_frame_counter = FrameCounter; @@ -96,7 +97,8 @@ BOOL FrameReached(unsigned long *frame_counter_var, unsigned long frame_delay) return(TRUE); } -BOOL DelayReached(unsigned long *counter_var, unsigned long delay) +boolean DelayReached(unsigned long *counter_var, + unsigned long delay) { unsigned long actual_counter = Counter(); @@ -193,6 +195,14 @@ void GetOptions(char *argv[]) { char **options_left = &argv[1]; + /* initialize global program options */ + options.display_name = NULL; + options.server_host = NULL; + options.server_port = 0; + options.serveronly = FALSE; + options.network = FALSE; + options.verbose = FALSE; + while (*options_left) { char option_str[MAX_OPTION_LEN]; @@ -233,6 +243,8 @@ void GetOptions(char *argv[]) "Options:\n" " -d, --display machine:0 X server display\n" " -l, --levels directory alternative level directory\n" + " -s, --serveronly only start network server\n" + " -n, --network network multiplayer game\n" " -v, --verbose verbose mode\n", program_name); exit(0); @@ -242,11 +254,11 @@ void GetOptions(char *argv[]) if (option_arg == NULL) Error(ERR_EXIT_HELP, "option '%s' requires an argument", option_str); - display_name = option_arg; + options.display_name = option_arg; if (option_arg == next_option) options_left++; - printf("--display == '%s'\n", display_name); + printf("--display == '%s'\n", options.display_name); } else if (strncmp(option, "-levels", option_len) == 0) { @@ -259,27 +271,39 @@ void GetOptions(char *argv[]) printf("--levels == '%s'\n", level_directory); } + else if (strncmp(option, "-network", option_len) == 0) + { + printf("--network\n"); + + options.network = TRUE; + } + else if (strncmp(option, "-serveronly", option_len) == 0) + { + printf("--serveronly\n"); + + options.serveronly = TRUE; + } else if (strncmp(option, "-verbose", option_len) == 0) { printf("--verbose\n"); - verbose = TRUE; + options.verbose = TRUE; } else if (*option == '-') Error(ERR_EXIT_HELP, "unrecognized option '%s'", option_str); - else if (server_host == NULL) + else if (options.server_host == NULL) { - server_host = *options_left; + options.server_host = *options_left; - printf("server.name == '%s'\n", server_host); + printf("server.name == '%s'\n", options.server_host); } - else if (server_port == 0) + else if (options.server_port == 0) { - server_port = atoi(*options_left); - if (server_port < 1024) - Error(ERR_EXIT_HELP, "bad port number '%d'", server_port); + options.server_port = atoi(*options_left); + if (options.server_port < 1024) + Error(ERR_EXIT_HELP, "bad port number '%d'", options.server_port); - printf("port == %d\n", server_port); + printf("port == %d\n", options.server_port); } else Error(ERR_EXIT_HELP, "too many arguments"); @@ -355,3 +379,96 @@ void Error(int mode, char *format_str, ...) CloseAllAndExit(1); } } + +void *checked_malloc(unsigned long size) +{ + void *ptr; + + ptr = malloc(size); + + if (ptr == NULL) + Error(ERR_EXIT, "cannot allocate %d bytes -- out of memory", size); + + return ptr; +} + +char *getKeySymName(KeySym key) +{ + static char key_name[20]; + static struct + { + KeySym keysym; + char *name; + } translate[] = + { + { XK_Left, "cursor left" }, + { XK_Right, "cursor right" }, + { XK_Up, "cursor up" }, + { XK_Down, "cursor down" }, + +#ifdef XK_KP_Left + { XK_KP_Left, "keypad left" }, + { XK_KP_Right, "keypad right" }, + { XK_KP_Up, "keypad up" }, + { XK_KP_Down, "keypad down" }, +#endif + + { XK_BackSpace, "backspace" }, + { XK_Delete, "delete" }, + { XK_Insert, "insert" }, + { XK_Tab, "tab" }, + { XK_Home, "home" }, + { XK_End, "end" }, + { XK_Page_Up, "page up" }, + { XK_Page_Down, "page down" }, + { XK_space, "space" }, + + { XK_Shift_L, "left shift" }, + { XK_Shift_R, "right shift" }, + { XK_Control_L, "left ctrl" }, + { XK_Control_R, "right ctrl" }, + { XK_Meta_L, "left meta" }, + { XK_Meta_R, "right meta" }, + { XK_Alt_L, "left alt" }, + { XK_Alt_R, "right alt" }, + { XK_Mode_switch, "mode switch" }, + { XK_Multi_key, "multi key" }, + + { 0, NULL } + }; + + if (key >= XK_A && key <= XK_Z) + { + sprintf(key_name, "%c", 'A' + (char)(key - XK_A)); + return key_name; + } + else if (key >= XK_a && key <= XK_z) + { + sprintf(key_name, "%c", 'a' + (char)(key - XK_a)); + return key_name; + } + else if (key >= XK_0 && key <= XK_9) + { + sprintf(key_name, "%c", '0' + (char)(key - XK_0)); + return key_name; + } + else if (key >= XK_KP_0 && key <= XK_KP_9) + { + sprintf(key_name, "keypad %c", '0' + (char)(key - XK_KP_0)); + return key_name; + } + else + { + int i = 0; + + do + { + if (key == translate[i].keysym) + return translate[i].name; + } + while (translate[++i].name); + + sprintf(key_name, "(unknown)"); + return key_name; + } +}