+gboolean parse_keyval_string(const gchar *group, const gchar *key, gchar **val)
+{
+ gchar *ret;
+
+ ret = g_key_file_get_value(ui.config_data, group, key, NULL);
+ if (ret==NULL) return FALSE;
+ if (strlen(ret) == 0) {
+ *val = NULL;
+ g_free(ret);
+ }
+ else *val = ret;
+ return TRUE;
+}
+
+gboolean parse_keyval_vorderlist(const gchar *group, const gchar *key, int *order)
+{
+ gchar *ret, *p;
+ int tmp[VBOX_MAIN_NITEMS];
+ int i, n, found, l;
+
+ ret = g_key_file_get_value(ui.config_data, group, key, NULL);
+ if (ret==NULL) return FALSE;
+
+ for (i=0; i<VBOX_MAIN_NITEMS; i++) tmp[i] = -1;
+ n = 0; p = ret;
+ while (*p==' ') p++;
+ while (*p!=0) {
+ if (n>VBOX_MAIN_NITEMS) return FALSE; // too many items
+ for (i=0; i<VBOX_MAIN_NITEMS; i++) {
+ if (!g_str_has_prefix(p, vorder_usernames[i])) continue;
+ l = strlen(vorder_usernames[i]);
+ if (p[l]==' '||p[l]==0) { p+=l; break; }
+ }
+ if (i>=VBOX_MAIN_NITEMS) { g_free(ret); return FALSE; } // parse error
+ // we found item #i
+ tmp[n++] = i;
+ while (*p==' ') p++;
+ }
+
+ for (n=0; n<VBOX_MAIN_NITEMS; n++) order[n] = tmp[n];
+ g_free(ret);
+ return TRUE;
+}
+