-
- printv("desc = '%s'; sz = %d\n", desc, sz);
-
- for (i = 0; desc[i] && i < sz; ++i)
- if (!isdigit((unsigned char) *desc))
- return "non-digit in string";
- else if (desc[i] > m)
- return "too large digit in string";
- if (desc[i]) return "string too long";
- else if (i < sz) return "string too short";
- return NULL;
+ int area;
+
+ for (area = 0; *desc; ++desc) {
+ if (*desc >= 'a' && *desc <= 'z') area += *desc - 'a' + 1;
+ else if (*desc >= '0' && *desc <= m) ++area;
+ else {
+ static char s[] = "Invalid character '%""' in game description";
+ int n = sprintf(s, "Invalid character '%1c' in game description",
+ *desc);
+ assert(n + 1 <= lenof(s)); /* +1 for the terminating NUL */
+ return s;
+ }
+ if (area > sz) return "Too much data to fit in grid";
+ }
+ return (area < sz) ? "Not enough data to fill grid" : NULL;