+ {
+ /*
+ * Allow environment-based extensions to the preset list by
+ * defining a variable along the lines of `SOLO_PRESETS=2x3
+ * Advanced:2x3da'. Colon-separated list of items,
+ * alternating between textual titles in the menu and
+ * encoded parameter strings.
+ */
+ char buf[80], *e, *p;
+ int j;
+
+ sprintf(buf, "%s_PRESETS", me->ourgame->name);
+ for (j = 0; buf[j]; j++)
+ buf[j] = toupper((unsigned char)buf[j]);
+
+ if ((e = getenv(buf)) != NULL) {
+ p = e = dupstr(e);
+
+ while (*p) {
+ char *name, *val;
+ game_params *preset;
+
+ name = p;
+ while (*p && *p != ':') p++;
+ if (*p) *p++ = '\0';
+ val = p;
+ while (*p && *p != ':') p++;
+ if (*p) *p++ = '\0';
+
+ preset = me->ourgame->default_params();
+ me->ourgame->decode_params(preset, val);
+
+ if (me->ourgame->validate_params(preset)) {
+ /* Drop this one from the list. */
+ me->ourgame->free_params(preset);
+ continue;
+ }
+
+ if (me->presetsize <= me->npresets) {
+ me->presetsize = me->npresets + 10;
+ me->presets = sresize(me->presets, me->presetsize,
+ game_params *);
+ me->preset_names = sresize(me->preset_names,
+ me->presetsize, char *);
+ }
+
+ me->presets[me->npresets] = preset;
+ me->preset_names[me->npresets] = name;
+ me->npresets++;
+ }
+ }
+ }
+