/* * Helper function to parse a comma-separated list of strings into * a preference list array of values. Any missing values are added * to the end and duplicates are weeded. * XXX: assumes vals in 'mapping' are small +ve integers */ static void gprefs(void *sesskey, char *name, char *def, const struct keyval *mapping, int nvals, int *array) { char commalist[80]; int n; unsigned long seen = 0; /* bitmap for weeding dups etc */ gpps(sesskey, name, def, commalist, sizeof(commalist)); /* Grotty parsing of commalist. */ n = 0; do { int v; char *key; key = strtok(n==0 ? commalist : NULL, ","); /* sorry */ if (!key) break; if (((v = key2val(mapping, nvals, key)) != -1) && !(seen & 1<<v)) { array[n] = v; n++; seen |= 1<<v; } } while (n < nvals); /* Add any missing values (backward compatibility ect). */ { int i; for (i = 0; i < nvals; i++) { if (!(seen & 1<<mapping[i].v)) { array[n] = mapping[i].v; n++; } } } }
/* * Helper function to parse a comma-separated list of strings into * a preference list array of values. Any missing values are added * to the end and duplicates are weeded. * XXX: assumes vals in 'mapping' are small +ve integers */ static void gprefs(void *sesskey, char *name, char *def, const struct keyvalwhere *mapping, int nvals, int *array) { char commalist[256]; char *p, *q; int i, j, n, v, pos; unsigned long seen = 0; /* bitmap for weeding dups etc */ /* * Fetch the string which we'll parse as a comma-separated list. */ gpps(sesskey, name, def, commalist, sizeof(commalist)); /* * Go through that list and convert it into values. */ n = 0; p = commalist; while (1) { while (*p && *p == ',') p++; if (!*p) break; /* no more words */ q = p; while (*p && *p != ',') p++; if (*p) *p++ = '\0'; v = key2val(mapping, nvals, q); if (v != -1 && !(seen & (1 << v))) { seen |= (1 << v); array[n++] = v; } } /* * Now go through 'mapping' and add values that weren't mentioned * in the list we fetched. We may have to loop over it multiple * times so that we add values before other values whose default * positions depend on them. */ while (n < nvals) { for (i = 0; i < nvals; i++) { assert(mapping[i].v < 32); if (!(seen & (1 << mapping[i].v))) { /* * This element needs adding. But can we add it yet? */ if (mapping[i].vrel != -1 && !(seen & (1 << mapping[i].vrel))) continue; /* nope */ /* * OK, we can work out where to add this element, so * do so. */ if (mapping[i].vrel == -1) { pos = (mapping[i].where < 0 ? n : 0); } else { for (j = 0; j < n; j++) if (array[j] == mapping[i].vrel) break; assert(j < n); /* implied by (seen & (1<<vrel)) */ pos = (mapping[i].where < 0 ? j : j+1); } /* * And add it. */ for (j = n-1; j >= pos; j--) array[j+1] = array[j]; array[pos] = mapping[i].v; n++; } } } }