void gli_startup(int argc, char *argv[]) { gli_baseline = 0; wininit(&argc, argv); if (argc > 1) glkunix_set_base_file(argv[argc-1]); gli_read_config(argc, argv); memcpy(gli_tstyles_def, gli_tstyles, sizeof(gli_tstyles_def)); memcpy(gli_gstyles_def, gli_gstyles, sizeof(gli_gstyles_def)); if (!gli_baseline) gli_baseline = gli_conf_propsize + 0.5; #ifdef USETTS gli_initialize_tts(); if (gli_conf_speak) gli_conf_quotes = 0; #endif gli_initialize_misc(); gli_initialize_fonts(); gli_initialize_windows(); gli_initialize_sound(); winopen(); gli_initialize_babel(); }
int main(int argc, char *argv[]) { int ix, jx, val; glkunix_startup_t startdata; /* Test for compile-time errors. If one of these spouts off, you must edit glk.h and recompile. */ if (sizeof(glui32) != 4) { printf("Compile-time error: glui32 is not a 32-bit value. Please fix glk.h.\n"); return 1; } if ((glui32)(-1) < 0) { printf("Compile-time error: glui32 is not unsigned. Please fix glk.h.\n"); return 1; } /* Now some argument-parsing. This is probably going to hurt. */ startdata.argc = 0; startdata.argv = (char **)malloc(argc * sizeof(char *)); /* Copy in the program name. */ startdata.argv[startdata.argc] = argv[0]; startdata.argc++; for (ix=1; ix<argc && !errflag; ix++) { glkunix_argumentlist_t *argform; int inarglist = FALSE; char *cx; for (argform = glkunix_arguments; argform->argtype != glkunix_arg_End && !errflag; argform++) { if (argform->name[0] == '\0') { if (argv[ix][0] != '-') { startdata.argv[startdata.argc] = argv[ix]; startdata.argc++; inarglist = TRUE; } } else if ((argform->argtype == glkunix_arg_NumberValue) && !strncmp(argv[ix], argform->name, strlen(argform->name)) && (cx = argv[ix] + strlen(argform->name)) && (atoi(cx) != 0 || cx[0] == '0')) { startdata.argv[startdata.argc] = argv[ix]; startdata.argc++; inarglist = TRUE; } else if (!strcmp(argv[ix], argform->name)) { int numeat = 0; if (argform->argtype == glkunix_arg_ValueFollows) { if (ix+1 >= argc) { printf("%s: %s must be followed by a value\n", argv[0], argform->name); errflag = TRUE; break; } numeat = 2; } else if (argform->argtype == glkunix_arg_NoValue) { numeat = 1; } else if (argform->argtype == glkunix_arg_ValueCanFollow) { if (ix+1 < argc && argv[ix+1][0] != '-') { numeat = 2; } else { numeat = 1; } } else if (argform->argtype == glkunix_arg_NumberValue) { if (ix+1 >= argc || (atoi(argv[ix+1]) == 0 && argv[ix+1][0] != '0')) { printf("%s: %s must be followed by a number\n", argv[0], argform->name); errflag = TRUE; break; } numeat = 2; } else { errflag = TRUE; break; } for (jx=0; jx<numeat; jx++) { startdata.argv[startdata.argc] = argv[ix]; startdata.argc++; if (jx+1 < numeat) ix++; } inarglist = TRUE; break; } } if (inarglist || errflag) continue; if (argv[ix][0] != '-') { printf("%s: unwanted argument: %s\n", argv[0], argv[ix]); errflag = TRUE; break; } if (extract_value(argc, argv, "?", ex_Void, &ix, &val, FALSE)) errflag = TRUE; else if (extract_value(argc, argv, "help", ex_Void, &ix, &val, FALSE)) errflag = TRUE; else if (extract_value(argc, argv, "version", ex_Void, &ix, &val, FALSE)) pref_printversion = val; else if (extract_value(argc, argv, "v", ex_Void, &ix, &val, FALSE)) pref_printversion = val; else if (extract_value(argc, argv, "fixmetrics", ex_Bool, &ix, &val, FALSE)) pref_fixedmetrics = val; else if (extract_value(argc, argv, "fm", ex_Bool, &ix, &val, FALSE)) pref_fixedmetrics = val; else if (extract_value(argc, argv, "width", ex_Int, &ix, &val, 80)) pref_screenwidth = val; else if (extract_value(argc, argv, "w", ex_Int, &ix, &val, 80)) pref_screenwidth = val; else if (extract_value(argc, argv, "height", ex_Int, &ix, &val, 50)) pref_screenheight = val; else if (extract_value(argc, argv, "h", ex_Int, &ix, &val, 50)) pref_screenheight = val; else if (extract_value(argc, argv, "stderr", ex_Bool, &ix, &val, FALSE)) pref_stderr = val; else if (extract_value(argc, argv, "support", ex_Str, &ix, &val, FALSE)) { if (!strcmp(extracted_string, "timer") || !strcmp(extracted_string, "timers")) pref_timersupport = TRUE; else if (!strcmp(extracted_string, "hyperlink") || !strcmp(extracted_string, "hyperlinks")) pref_hyperlinksupport = TRUE; else if (!strcmp(extracted_string, "graphics")) pref_graphicssupport = TRUE; else if (!strcmp(extracted_string, "graphicswin")) pref_graphicswinsupport = TRUE; else { printf("%s: -support value not recognized: %s\n", argv[0], extracted_string); errflag = TRUE; } } else if (extract_value(argc, argv, "resourcedir", ex_Str, &ix, &val, FALSE)) pref_resourceurl = construct_resourceurl(extracted_string, TRUE); else if (extract_value(argc, argv, "rd", ex_Str, &ix, &val, FALSE)) pref_resourceurl = construct_resourceurl(extracted_string, TRUE); else if (extract_value(argc, argv, "resourceurl", ex_Str, &ix, &val, FALSE)) pref_resourceurl = construct_resourceurl(extracted_string, FALSE); else if (extract_value(argc, argv, "ru", ex_Str, &ix, &val, FALSE)) pref_resourceurl = construct_resourceurl(extracted_string, FALSE); #if GIDEBUG_LIBRARY_SUPPORT else if (extract_value(argc, argv, "D", ex_Void, &ix, &val, FALSE)) gli_debugger = val; #endif /* GIDEBUG_LIBRARY_SUPPORT */ else { printf("%s: unknown option: %s\n", argv[0], argv[ix]); errflag = TRUE; } } if (errflag) { printf("usage: %s [ options ... ]\n", argv[0]); if (glkunix_arguments[0].argtype != glkunix_arg_End) { glkunix_argumentlist_t *argform; printf("game options:\n"); for (argform = glkunix_arguments; argform->argtype != glkunix_arg_End; argform++) { if (strlen(argform->name) == 0) printf(" %s\n", argform->desc); else if (argform->argtype == glkunix_arg_ValueFollows) printf(" %s val: %s\n", argform->name, argform->desc); else if (argform->argtype == glkunix_arg_NumberValue) printf(" %s val: %s\n", argform->name, argform->desc); else if (argform->argtype == glkunix_arg_ValueCanFollow) printf(" %s [val]: %s\n", argform->name, argform->desc); else printf(" %s: %s\n", argform->name, argform->desc); } } printf("library options:\n"); printf(" -fixmetrics BOOL: define screen size manually (default 'no')\n"); printf(" -width NUM: manual screen width (default 80)\n"); printf(" -height NUM: manual screen height (default 50)\n"); printf(" -support [timer, hyperlinks, graphics, graphicswin]: declare support for various input features\n"); printf(" -resourceurl STR: URL base for image/sound files\n"); printf(" -resourcedir STR: path to image/sound files (used to create file: URLs)\n"); printf(" -stderr BOOL: send errors to stderr rather than stdout (default 'no')\n"); #if GIDEBUG_LIBRARY_SUPPORT printf(" -D: turn on debug console\n"); #endif /* GIDEBUG_LIBRARY_SUPPORT */ printf(" -version: display Glk library version\n"); printf(" -help: display this list\n"); printf("NUM values can be any number. BOOL values can be 'yes' or 'no', or no value to toggle.\n"); return 1; } if (pref_printversion) { printf("RemGlk, library version %s.\n", LIBRARY_VERSION); printf("For more information, see http://eblong.com/zarf/glk/\n"); return 1; } gli_initialize_datainput(); data_metrics_t *metrics = data_metrics_alloc(pref_screenwidth, pref_screenheight); if (!pref_fixedmetrics) { data_event_t *data = data_event_read(); if (data->dtag != dtag_Init) gli_fatal_error("First input event must be 'init'"); if (data->supportcaps) { /* Set the suppport preference flags. (Bit of a layering violation, but the flags are simple.) */ if (data->supportcaps->timer) pref_timersupport = TRUE; if (data->supportcaps->hyperlinks) pref_hyperlinksupport = TRUE; if (data->supportcaps->graphics) pref_graphicssupport = TRUE; if (data->supportcaps->graphicswin) pref_graphicswinsupport = TRUE; } /* Copy the metrics into the permanent structure */ *metrics = *data->metrics; data_event_free(data); } /* Initialize things. */ gli_initialize_misc(); gli_initialize_windows(metrics); gli_initialize_events(); data_metrics_free(metrics); inittime = TRUE; if (!glkunix_startup_code(&startdata)) { glk_exit(); } inittime = FALSE; if (gli_debugger) gidebug_announce_cycle(gidebug_cycle_Start); /* Call the program main entry point, and then exit. */ glk_main(); glk_exit(); /* glk_exit() doesn't return, but the compiler may kvetch if main() doesn't seem to return a value. */ return 0; }
int main(int argc, char *argv[]) { int ix, jx, val; glkunix_startup_t startdata; setlocale (LC_CTYPE, ""); /* Test for compile-time errors. If one of these spouts off, you must edit glk.h and recompile. */ if (sizeof(glui32) != 4) { printf("Compile-time error: glui32 is not a 32-bit value. Please fix glk.h.\n"); return 1; } if ((glui32)(-1) < 0) { printf("Compile-time error: glui32 is not unsigned. Please fix glk.h.\n"); return 1; } /* Now some argument-parsing. This is probably going to hurt. */ startdata.argc = 0; startdata.argv = (char **)malloc(argc * sizeof(char *)); /* Copy in the program name. */ startdata.argv[startdata.argc] = argv[0]; startdata.argc++; for (ix=1; ix<argc && !errflag; ix++) { glkunix_argumentlist_t *argform; int inarglist = FALSE; char *cx; for (argform = glkunix_arguments; argform->argtype != glkunix_arg_End && !errflag; argform++) { if (argform->name[0] == '\0') { if (argv[ix][0] != '-') { startdata.argv[startdata.argc] = argv[ix]; startdata.argc++; inarglist = TRUE; } } else if ((argform->argtype == glkunix_arg_NumberValue) && !strncmp(argv[ix], argform->name, strlen(argform->name)) && (cx = argv[ix] + strlen(argform->name)) && (atoi(cx) != 0 || cx[0] == '0')) { startdata.argv[startdata.argc] = argv[ix]; startdata.argc++; inarglist = TRUE; } else if (!strcmp(argv[ix], argform->name)) { int numeat = 0; if (argform->argtype == glkunix_arg_ValueFollows) { if (ix+1 >= argc) { printf("%s: %s must be followed by a value\n", argv[0], argform->name); errflag = TRUE; break; } numeat = 2; } else if (argform->argtype == glkunix_arg_NoValue) { numeat = 1; } else if (argform->argtype == glkunix_arg_ValueCanFollow) { if (ix+1 < argc && argv[ix+1][0] != '-') { numeat = 2; } else { numeat = 1; } } else if (argform->argtype == glkunix_arg_NumberValue) { if (ix+1 >= argc || (atoi(argv[ix+1]) == 0 && argv[ix+1][0] != '0')) { printf("%s: %s must be followed by a number\n", argv[0], argform->name); errflag = TRUE; break; } numeat = 2; } else { errflag = TRUE; break; } for (jx=0; jx<numeat; jx++) { startdata.argv[startdata.argc] = argv[ix]; startdata.argc++; if (jx+1 < numeat) ix++; } inarglist = TRUE; break; } } if (inarglist || errflag) continue; if (argv[ix][0] != '-') { printf("%s: unwanted argument: %s\n", argv[0], argv[ix]); errflag = TRUE; break; } if (extract_value(argc, argv, "?", ex_Void, &ix, &val, FALSE)) errflag = TRUE; else if (extract_value(argc, argv, "help", ex_Void, &ix, &val, FALSE)) errflag = TRUE; else if (extract_value(argc, argv, "version", ex_Void, &ix, &val, FALSE)) pref_printversion = val; else if (extract_value(argc, argv, "v", ex_Void, &ix, &val, FALSE)) pref_printversion = val; else if (extract_value(argc, argv, "historylen", ex_Int, &ix, &val, 20)) pref_historylen = val; else if (extract_value(argc, argv, "hl", ex_Int, &ix, &val, 20)) pref_historylen = val; else if (extract_value(argc, argv, "width", ex_Int, &ix, &val, 80)) pref_screenwidth = val; else if (extract_value(argc, argv, "w", ex_Int, &ix, &val, 80)) pref_screenwidth = val; else if (extract_value(argc, argv, "height", ex_Int, &ix, &val, 24)) pref_screenheight = val; else if (extract_value(argc, argv, "h", ex_Int, &ix, &val, 24)) pref_screenheight = val; else if (extract_value(argc, argv, "ml", ex_Bool, &ix, &val, pref_messageline)) pref_messageline = val; else if (extract_value(argc, argv, "revgrid", ex_Bool, &ix, &val, pref_reverse_textgrids)) pref_reverse_textgrids = val; else if (extract_value(argc, argv, "border", ex_Bool, &ix, &val, pref_window_borders)) pref_window_borders = val; else if (extract_value(argc, argv, "defprompt", ex_Bool, &ix, &val, pref_prompt_defaults)) pref_prompt_defaults = val; #ifdef OPT_TIMED_INPUT else if (extract_value(argc, argv, "precise", ex_Bool, &ix, &val, pref_precise_timing)) pref_precise_timing = val; #endif /* !OPT_TIMED_INPUT */ else { printf("%s: unknown option: %s\n", argv[0], argv[ix]); errflag = TRUE; } } if (errflag) { printf("usage: %s [ options ... ]\n", argv[0]); if (glkunix_arguments[0].argtype != glkunix_arg_End) { glkunix_argumentlist_t *argform; printf("game options:\n"); for (argform = glkunix_arguments; argform->argtype != glkunix_arg_End; argform++) { printf(" %s\n", argform->desc); } } printf("library options:\n"); printf(" -width NUM: manual screen width (if not specified, will try to measure)\n"); printf(" -height NUM: manual screen height (ditto)\n"); printf(" -ml BOOL: use message line (default 'yes')\n"); printf(" -historylen NUM: length of command history (default 20)\n"); printf(" -revgrid BOOL: reverse text in grid (status) windows (default 'no')\n"); printf(" -border BOOL: draw borders between windows (default 'yes')\n"); printf(" -defprompt BOOL: provide defaults for file prompts (default 'yes')\n"); #ifdef OPT_TIMED_INPUT printf(" -precise BOOL: more precise timing for timed input (burns more CPU time) (default 'no')\n"); #endif /* !OPT_TIMED_INPUT */ printf(" -version: display Glk library version\n"); printf(" -help: display this list\n"); printf("NUM values can be any number. BOOL values can be 'yes' or 'no', or no value to toggle.\n"); return 1; } if (pref_printversion) { printf("GlkTerm, library version %s (%s).\n", LIBRARY_VERSION, LIBRARY_PORT); printf("For more information, see http://eblong.com/zarf/glk/index.html\n"); return 1; } /* We now start up curses. From now on, the program must exit through glk_exit(), so that endwin() is called. */ gli_setup_curses(); /* Initialize things. */ gli_initialize_misc(); gli_initialize_windows(); gli_initialize_events(); inittime = TRUE; if (!glkunix_startup_code(&startdata)) { glk_exit(); } inittime = FALSE; /* Call the program main entry point, and then exit. */ glk_main(); glk_exit(); /* glk_exit() doesn't return, but the compiler may kvetch if main() doesn't seem to return a value. */ return 0; }