int code_to_int(char *s) { char a, b, c, d; if (isdigit(*s)) return atoi(s); if (!isalpha(*s)) return 0; switch (strlen(s)) { case 3: if (isalpha(*(s + 1)) && isdigit(*(s + 2))) { /* CCN */ a = tolower(*s) - 'a'; b = tolower(*(s + 1)) - 'a'; c = *(s + 2) - '0'; return a * 260 + b * 10 + c + 50000; } if (isdigit(*(s + 1)) && isdigit(*(s + 2))) { /* CNN */ a = letter_val(tolower(*s), letters2); b = *(s + 1) - '0'; c = *(s + 2) - '0'; return a * 100 + b * 10 + c + 56760; } return 0; case 4: /* CCNN */ if (isalpha(*(s + 1)) && isdigit(*(s + 2)) && isdigit(*(s + 3))) { a = letter_val(tolower(*s), letters2); b = letter_val(tolower(*(s + 1)), letters2); c = *(s + 2) - '0'; d = *(s + 3) - '0'; return a * 2000 + b * 100 + c * 10 + d + 10000; } if (isdigit(*(s + 1)) && isdigit(*(s + 2)) && isdigit(*(s + 3))) { a = letter_val(tolower(*s), letters2); b = *(s + 1) - '0'; c = *(s + 2) - '0'; d = *(s + 3) - '0'; return a * 1000 + b * 100 + c * 10 + d + 59000; } return 0; default: return 0; } }
static int xlsx_cell_get_coordinates (const char *s, int *row, int *col) { char colref[8]; int i, k, v; int err = 0; for (i=0; i<7; i++) { if (isalpha(s[i])) { colref[i] = s[i]; } else { break; } } colref[i] = '\0'; *row = atoi(s + i--); *col = 0; k = 1; while (i >= 0 && !err) { v = letter_val(colref[i]); if (v == 0) { err = E_DATA; } else { *col += k * v; k *= 26; } i--; } return err; }