static void convert(char *line) { int flen, len, rval; char *p, *fraction; flen = 0; fraction = NULL; for (p = line; *p != '\0' && *p != '\n'; ++p) { if (isblank(*p)) { if (p == line) { ++line; continue; } goto badnum; } if (isdigit(*p)) continue; switch (*p) { case '.': if (fraction != NULL) goto badnum; fraction = p + 1; *p = '\0'; break; case '-': if (p == line) break; /* FALLTHROUGH */ default: badnum: errx(1, "illegal number: %s", line); break; } } *p = '\0'; if ((len = strlen(line)) > MAXNUM || (fraction != NULL && ((flen = strlen(fraction)) > MAXNUM))) errx(1, "number too large, max %d digits.", MAXNUM); if (*line == '-') { (void)printf("minus%s", lflag ? " " : "\n"); ++line; --len; } rval = len > 0 ? unit(len, line) : 0; if (fraction != NULL && flen != 0) for (p = fraction; *p != '\0'; ++p) if (*p != '0') { if (rval) (void)printf("%sand%s", lflag ? " " : "", lflag ? " " : "\n"); if (unit(flen, fraction)) { if (lflag) (void)printf(" "); pfract(flen); rval = 1; } break; } if (!rval) (void)printf("zero%s", lflag ? "" : ".\n"); if (lflag) (void)printf("\n"); }
void convert(char *line) { int flen, len, rval; char *p, *fraction; /* strip trailing and leading whitespace */ len = strlen(line) - 1; while ((isblank((unsigned char)line[len])) || (line[len] == '\n')) line[len--] = '\0'; while ((isblank((unsigned char)line[0])) || (line[0] == '\n')) line++; if (strchr(line, 'e') || strchr(line, 'E')) convertexp(line); else { fraction = NULL; for (p = line; *p != '\0' && *p != '\n'; ++p) { if (isblank((unsigned char)*p)) goto badnum; if (isdigit((unsigned char)*p)) continue; switch (*p) { case '.': if (fraction != NULL) goto badnum; fraction = p + 1; *p = '\0'; break; case '-': case '+': if (p == line) break; /* FALLTHROUGH */ default: badnum: errx(1, "illegal number: %s", line); break; } } *p = '\0'; if ((len = strlen(line)) > MAXNUM || ((fraction != NULL) && (flen = strlen(fraction)) > MAXNUM)) errx(1, "number too long (max %d digits).", MAXNUM); if (*line == '-') { (void)printf("minus%s", lflag ? " " : "\n"); ++line; --len; } if (*line == '+') { (void)printf("plus%s", lflag ? " " : "\n"); ++line; --len; } rval = len > 0 ? unit(len, line) : 0; if (fraction != NULL && flen != 0) for (p = fraction; *p != '\0'; ++p) if (*p != '0') { if (rval) (void)printf("%sand%s", lflag ? " " : "", lflag ? " " : "\n"); if (unit(flen, fraction)) { if (lflag) (void)printf(" "); pfract(flen); rval = 1; } break; } if (!rval) (void)printf("zero%s", lflag ? "" : ".\n"); } }