+static void write_key_value(FILE * file, char * key, uint32_t value)
+{
+ try_fwrite(key, strlen(key), 1, file, __func__);
+ try_fputc(' ', file, __func__);
+ char * line = try_malloc(11, __func__);
+ exit_trouble(-1 == sprintf(line, "%u", value), __func__, s[S_FCN_SPRINTF]);
+ try_fwrite(line, strlen(line), 1, file, __func__);
+ free(line);
+ try_fputc('\n', file, __func__);
+}
+
+
+
+static void write_key_string(FILE * file, char * key, char * string)
+{
+ try_fwrite(key, strlen(key), 1, file, __func__);
+ try_fputc(' ', file, __func__);
+ uint8_t contains_space = NULL != strchr(string, ' ');
+ if (contains_space)
+ {
+ try_fputc('\'', file, __func__);
+ }
+ try_fwrite(string, strlen(string), 1, file, __func__);
+ if (contains_space)
+ {
+ try_fputc('\'', file, __func__);
+ }
+ try_fputc('\n', file, __func__);
+}
+
+
+
+static void write_thing(FILE * file, struct Thing * t)
+{
+ struct Thing * o;
+ for (o = t->owns; o; o = o->next)
+ {
+ write_thing(file, o);
+ }
+ write_key_value(file, s[S_CMD_T_ID], t->id);
+ write_key_value(file, s[S_CMD_T_TYPE], t->type);
+ write_key_value(file, s[S_CMD_T_POSY], t->pos.y);
+ write_key_value(file, s[S_CMD_T_POSX], t->pos.x);
+ write_key_value(file, s[S_CMD_T_COMMAND], t->command);
+ write_key_value(file, s[S_CMD_T_ARGUMENT], t->arg);
+ write_key_value(file, s[S_CMD_T_PROGRESS], t->progress);
+ write_key_value(file, s[S_CMD_T_HP], t->lifepoints);
+ for (o = t->owns; o; o = o->next)
+ {
+ write_key_value(file, s[S_CMD_T_CARRIES], o->id);
+ }
+ try_fputc('\n', file, __func__);
+}
+
+
+