ref: 61f08e7634e0e39148a784c0ce6efcc112ed5a7a
parent: 350683b25371ec6a7548b2e83b2be15eb629815f
author: Simon Tatham <anakin@pobox.com>
date: Thu May 20 04:22:49 EDT 2004
Now that we have string-encodable game parameters, let's support a command-line argument which is either a set of parameters or a params+seed game ID. [originally from svn r4234]
--- a/gtk.c
+++ b/gtk.c
@@ -762,7 +762,7 @@
gtk_widget_show(menuitem);
}
-static frontend *new_window(void)
+static frontend *new_window(char *game_id, char **error)
{
frontend *fe;
GtkBox *vbox;
@@ -774,6 +774,14 @@
time(&t);
fe->me = midend_new(fe, &t, sizeof(t));
+ if (game_id) {
+ *error = midend_game_id(fe->me, game_id, FALSE);
+ if (*error) {
+ midend_free(fe->me);
+ sfree(fe);
+ return NULL;
+ }
+ }
midend_new_game(fe->me);
fe->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
@@ -944,8 +952,16 @@
int main(int argc, char **argv)
{
+ char *pname = argv[0];
+ char *error;
+
gtk_init(&argc, &argv);
- (void) new_window();
+
+ if (!new_window(argc > 1 ? argv[1] : NULL, &error)) {
+ fprintf(stderr, "%s: %s\n", pname, error);
+ return 1;
+ }
+
gtk_main();
return 0;
--- a/midend.c
+++ b/midend.c
@@ -373,9 +373,62 @@
return NULL;
}
+char *midend_game_id(midend_data *me, char *id, int def_seed)
+{
+ char *error, *par, *seed;
+ game_params *params;
+
+ seed = strchr(id, ':');
+
+ if (seed) {
+ /*
+ * We have a colon separating parameters from game seed. So
+ * `par' now points to the parameters string, and `seed' to
+ * the seed string.
+ */
+ *seed++ = '\0';
+ par = id;
+ } else {
+ /*
+ * We only have one string. Depending on `def_seed', we
+ * take it to be either parameters or seed.
+ */
+ if (def_seed) {
+ seed = id;
+ par = NULL;
+ } else {
+ seed = NULL;
+ par = id;
+ }
+ }
+
+ if (par) {
+ params = decode_params(par);
+ error = validate_params(params);
+ if (error) {
+ free_params(params);
+ return error;
+ }
+ free_params(me->params);
+ me->params = params;
+ }
+
+ if (seed) {
+ error = validate_seed(me->params, seed);
+ if (error)
+ return error;
+
+ sfree(me->seed);
+ me->seed = dupstr(seed);
+ me->fresh_seed = TRUE;
+ }
+
+ return NULL;
+}
+
char *midend_set_config(midend_data *me, int which, config_item *cfg)
{
- char *error, *p;
+ char *error;
game_params *params;
switch (which) {
@@ -393,36 +446,9 @@
break;
case CFG_SEED:
-
- /*
- * The game ID will often (in fact, mostly) have a prefix
- * containing a string-encoded parameter specification
- * followed by a colon. So first find the colon, and then
- * split the string up.
- */
- p = strchr(cfg[0].sval, ':');
-
- if (p) {
- *p++ = '\0'; /* p now points to game seed */
- params = decode_params(cfg[0].sval);
- error = validate_params(params);
- if (error) {
- free_params(params);
- return error;
- }
- free_params(me->params);
- me->params = params;
- } else
- p = cfg[0].sval;
-
- error = validate_seed(me->params, p);
+ error = midend_game_id(me, cfg[0].sval, TRUE);
if (error)
return error;
-
- sfree(me->seed);
- me->seed = dupstr(p);
- me->fresh_seed = TRUE;
-
break;
}
--- a/puzzles.h
+++ b/puzzles.h
@@ -127,6 +127,7 @@
enum { CFG_SETTINGS, CFG_SEED };
config_item *midend_get_config(midend_data *me, int which, char **wintitle);
char *midend_set_config(midend_data *me, int which, config_item *cfg);
+char *midend_game_id(midend_data *me, char *id, int def_seed);
/*
* malloc.c
--- a/windows.c
+++ b/windows.c
@@ -7,6 +7,7 @@
#include <stdio.h>
#include <assert.h>
+#include <ctype.h>
#include <stdarg.h>
#include <stdlib.h>
#include <time.h>
@@ -309,7 +310,7 @@
}
}
-static frontend *new_window(HINSTANCE inst)
+static frontend *new_window(HINSTANCE inst, char *game_id, char **error)
{
frontend *fe;
int x, y;
@@ -322,6 +323,15 @@
time(&t);
fe->me = midend_new(fe, &t, sizeof(t));
+ if (game_id) {
+ *error = midend_game_id(fe->me, game_id, FALSE);
+ if (*error) {
+ midend_free(fe->me);
+ sfree(fe);
+ return NULL;
+ }
+ }
+
fe->inst = inst;
midend_new_game(fe->me);
midend_size(fe->me, &x, &y);
@@ -1008,6 +1018,7 @@
int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
{
MSG msg;
+ char *error;
InitCommonControls();
@@ -1028,7 +1039,15 @@
RegisterClass(&wndclass);
}
- new_window(inst);
+ while (*cmdline && isspace(*cmdline))
+ cmdline++;
+
+ if (!new_window(inst, *cmdline ? cmdline : NULL, &error)) {
+ char buf[128];
+ sprintf(buf, "%.100s Error", game_name);
+ MessageBox(NULL, error, buf, MB_OK|MB_ICONERROR);
+ return 1;
+ }
while (GetMessage(&msg, NULL, 0, 0)) {
DispatchMessage(&msg);