Unfortunately (here and where you xstrdup(*token) as first_index), this isn't quite what was there before: while <code>
char buffer[PLENTY];
int num = IntFromString(*token);
snprintf(buffer, PLENTY, "%d", num);
</code> might seem to be a long-winded way of copying *token to buffer, the situation is complicated by IntFromString() recognising a [kKmMgG%] suffix on *token and modifying the number it returns to match.  So you really do need to read the int, record it and print it into a fresh string; fortunately, a fixed-sized buffer is adequate.  For unsigned integral types, char[2 + 53 * sizeof(type) / 22] works; for signed, as here, you need another +1 for the sign.

To cope with all of this, I suggest you use <code>
char buf[3 + 53 * sizeof(long) / 22]; /* big enough to print any long */
const char *present = *token;
</code> then set present to buf after you've printed your int into it (it remains *token in the other types' cases) and use present in place of *token after that.