+ /*
+ * Then, parse what's left, making indexes of the names and values.
+ */
+ state = pDefault;
+ for (j = 0; my_blob[j] != '\0'; ++j) {
+ switch (state) {
+ case pDefault:
+ switch (my_blob[j]) {
+ case '\\':
+ state = pEscaped;
+ break;
+ case ':':
+ my_blob[j] = '\0';
+ if (my_blob[j + 1] != '\0' && my_blob[j + 1] != ':')
+ state = pName;
+ break;
+ case ' ':
+ break;
+ default:
+ break;
+ }
+ case pEscaped:
+ break;
+ case pName:
+ state = pDefault;
+ /*
+ * Commented-out capabilities might be accessible (they are in
+ * ncurses).
+ */
+ if (my_blob[j] == '.' && my_blob[j + 1] == '.') {
+ j += 2;
+ }
+ if (my_blob[j + 1] != '\0') {
+ switch (my_blob[j + 2]) {
+ case '#':
+ my_numvalues[count_nums] = &my_blob[j + 3];
+ my_numcodes[count_nums++] = &my_blob[j];
+ my_blob[j + 2] = '\0';
+ state = pNumber;
+ j += 2;
+ break;
+ case '=':
+ my_strvalues[count_strs] = &my_blob[j + 3];
+ my_strcodes[count_strs++] = &my_blob[j];
+ my_blob[j + 2] = '\0';
+ state = pString;
+ j += 2;
+ break;
+ default:
+ if (my_blob[j + 2] == '@') {
+ /*
+ * We cannot get the type for a cancelled item
+ * directly, but can infer it assuming the input
+ * came from infocmp, which puts the data in a
+ * known order.
+ */
+ if (count_strs) {
+ my_strvalues[count_strs] = "";
+ my_strcodes[count_strs++] = &my_blob[j];
+ } else if (count_nums) {
+ my_numvalues[count_nums] = "";
+ my_numcodes[count_nums++] = &my_blob[j];
+ } else {
+ my_boolcodes[count_bools++] = &my_blob[j];
+ }
+ } else {
+ my_boolcodes[count_bools++] = &my_blob[j];
+ }
+ j++;
+ break;
+ }
+ }
+ break;
+ case pNumber:
+ if (!isdigit(UChar(my_blob[j]))) {
+ --j;
+ state = pDefault;
+ }
+ break;
+ case pString:
+ switch (my_blob[j]) {
+ case '\\':
+ if (my_blob[j + 1] == '\0') {
+ state = pDefault;
+ continue;
+ } else {
+ ++j;
+ }
+ break;
+ case '\n':
+ state = pNewline;
+ continue;
+ case ':':
+ --j;
+ state = pDefault;