From 70c4e502a932ab902c9bda3231f83c841f279ee1 Mon Sep 17 00:00:00 2001 From: Joshua Grams Date: Wed, 12 Apr 2006 16:55:57 +0000 Subject: [PATCH] platform-independent arg parsing --- Makefile | 2 +- args.c | 170 ++++++++++++++++++++++++++++++++++++++++++-------------------- args.h | 6 +-- main.c | 15 +++--- 4 files changed, 123 insertions(+), 70 deletions(-) diff --git a/Makefile b/Makefile index 6c0356a..90e50a6 100644 --- a/Makefile +++ b/Makefile @@ -85,7 +85,7 @@ sprite.o: sprite.h common.h vor: $(objects) @echo linking $@ from $^ - @$(CC) $(ldflags) -o $@ $^ + @$(CC) $^ $(ldflags) -o $@ include gfx.mk diff --git a/args.c b/args.c index 06efba3..11214a8 100644 --- a/args.c +++ b/args.c @@ -1,4 +1,5 @@ -#include +#include +#include #include "args.h" #include "config.h" @@ -12,31 +13,102 @@ int opt_fullscreen; int opt_music; int opt_sound; +static void +show_help(void) +{ + puts("Dodge the rocks until you die."); + putchar('\n'); + puts(" Gameplay Variations:"); + puts(" -b, --bounciness=N% Keep N% of speed when hitting edges (default 50%)"); + puts(" -g, --game-speed=N% 50-200% (default 100%)"); + putchar('\n'); + puts(" Look and Feel:"); + puts(" -f, --full-screen"); + puts(" -m, --music Enable music"); + puts(" -s, --silent No explosion sounds or music"); + putchar('\n'); + puts(" Informational:"); + puts(" -?, --help Give this help list"); + puts(" -V, --version Print program version"); + putchar('\n'); + puts("Mandatory or optional arguments to long options are also mandatory or optional"); + puts("for any corresponding short options."); + putchar('\n'); + puts("Report bugs to ."); +} + +int +short_opt(char c, char *arg) +{ + int i; -#ifndef WIN32 + switch(c) { + case 'b': if(!arg || sscanf(arg, "%d%%", &i) != 1 || i < 0 || i > 100) { + fprintf(stderr, "bad --bounciness (-b) value (should be 0-100%%)\n\n"); + return 0; + } + opt_bounciness = (float)i / 100; + *arg = 0; + break; + case 'f': opt_fullscreen = 1; break; + case 'g': if(!arg || sscanf(arg, "%d%%", &i) != 1 || i < 50 || i > 200) { + fprintf(stderr, "bad --game-speed (-g) value (should be 50-200%%)\n\n"); + return 0; + } + opt_gamespeed = (float)i / 100; + *arg = 0; + break; + case 'l': if(sscanf(arg, "%f", &opt_max_lead) != 1) { + fprintf(stderr, "bad --max-lead (-l) value (must be a number)\n\n"); + return 0; + } + opt_max_lead *= XSIZE; + *arg = 0; + break; + case 'm': opt_music = 1; break; + case 's': opt_sound = 0; opt_music = 0; break; + case 'V': + printf("Variations on Rockdodger %s\n", VERSION); + exit(0); + case '?': + case 'h': return 0; + default: + fprintf(stderr, "unknown option -%c\n\n", c); + return 0; + } + return 1; +} -error_t parse_opt(int, char*, struct argp_state *); +int +parse_short_opts(const char *s, char *arg) +{ + while(s[1]) if(!short_opt(*s++, NULL)) return 0; + return short_opt(*s, arg); +} -const char *argp_program_version = "Variations on Rockdodger " VERSION; -const char *argp_program_bug_address = ""; -static char doc[] = "Dodge the rocks until you die."; -static struct argp_option opts[] = { - {0, 0, 0, 0, "Gameplay Variations:"}, - {"bounciness", 'b', "N%", 0, "Keep N% of speed when hitting edges (default 50%)"}, - {"game-speed", 'g', "N%", 0, "50-100% (default 100%)"}, - {"max-lead", 'l', "#SCREENS", OPTION_HIDDEN, - "Max distance ahead you can get\n (default 1 screen; < 0 means no limit)"}, - {0, 0, 0, 0, "Look and Feel:"}, - {"full-screen", 'f', 0, 0, ""}, - {"music", 'm', 0, 0, "Enable music"}, - {"silent", 's', 0, 0, "No explosion sounds or music"}, - {0, 0, 0, 0, "Informational:", -1}, - {0} +static char *long_opts[] = { + "bounciness", "game-speed", + "full-screen", "music", "silent", + "help", "version" }; -struct argp argp = { opts, &parse_opt, 0, doc }; +static char short_opts[] = { + 'b', 'g', + 'f', 'm', 's', + 'h', 'V' +}; -#endif // !WIN32 +int +parse_long_opt(const char *s, char *arg) +{ + int i; + for(i=0; i 100) i = 100; - opt_bounciness = (float)i / 100; - break; - case 'f': opt_fullscreen = 1; break; - case 'g': if(!sscanf(arg, "%d%%", &i)) { - fprintf(stderr, "bad --gamespeed (-g) value (should be 50-100%%)\n"); - argp_state_help(state, stderr, ARGP_HELP_STD_HELP); - return EINVAL; - } - if(i < 0) i = 0; else if(i > 200) i = 100; - opt_gamespeed = (float)i / 100; - break; - case 'l': if(!sscanf(arg, "%f", &opt_max_lead)) { - fprintf(stderr, "bad --max-lead (-l) value (must be a number)\n"); - argp_state_help(state, stderr, ARGP_HELP_STD_HELP); - return EINVAL; - } - opt_max_lead *= XSIZE; - break; - case 'm': opt_music = 1; break; - case 's': opt_sound = 0; opt_music = 0; break; - default: return ARGP_ERR_UNKNOWN; + init_opts(); + for(i=1; i -#endif #include #include #include @@ -590,12 +587,15 @@ init_score_entry(void) void gameloop() { - Uint8 *keystate = SDL_GetKeyState(NULL); + SDL_Event e; + Uint8 *keystate; float tmp; for(;;) { - SDL_PumpEvents(); + while(SDL_PollEvent(&e)) { + if(e.type == SDL_QUIT) return; + } keystate = SDL_GetKeyState(NULL); if(!paused) { @@ -766,10 +766,7 @@ gameloop() { int main(int argc, char **argv) { - init_opts(); -#ifndef WIN32 - argp_parse(&argp, argc, argv, 0, 0, 0); -#endif + if(!parse_opts(argc, argv)) return 1; if(init()) { printf ("ta: '%s'\n",initerror); -- 1.7.10.4