Annotation of 43BSDTahoe/games/number.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1988 Regents of the University of California.
        !             3:  * All rights reserved.
        !             4:  *
        !             5:  * Redistribution and use in source and binary forms are permitted
        !             6:  * provided that the above copyright notice and this paragraph are
        !             7:  * duplicated in all such forms and that any documentation,
        !             8:  * advertising materials, and other materials related to such
        !             9:  * distribution and use acknowledge that the software was developed
        !            10:  * by the University of California, Berkeley.  The name of the
        !            11:  * University may not be used to endorse or promote products derived
        !            12:  * from this software without specific prior written permission.
        !            13:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
        !            14:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
        !            15:  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !            16:  */
        !            17: 
        !            18: #ifndef lint
        !            19: char copyright[] =
        !            20: "@(#) Copyright (c) 1988 Regents of the University of California.\n\
        !            21:  All rights reserved.\n";
        !            22: #endif /* not lint */
        !            23: 
        !            24: #ifndef lint
        !            25: static char sccsid[] = "@(#)number.c   4.5 (Berkeley) 6/27/88";
        !            26: #endif /* not lint */
        !            27: 
        !            28: #include <stdio.h>
        !            29: #include <ctype.h>
        !            30: 
        !            31: #define        YES             1
        !            32: #define        NO              0
        !            33: #define        EOS             '\0'
        !            34: #define        MAXNUM          65              /* biggest number we handle */
        !            35: 
        !            36: static char    *name1[] = {
        !            37:        "",             "one",          "two",          "three",
        !            38:        "four",         "five",         "six",          "seven",
        !            39:        "eight",        "nine",         "ten",          "eleven",
        !            40:        "twelve",       "thirteen",     "fourteen",     "fifteen",
        !            41:        "sixteen",      "seventeen",    "eighteen",     "nineteen",
        !            42: },
        !            43:                *name2[] = {
        !            44:        "",             "ten",          "twenty",       "thirty",
        !            45:        "forty",        "fifty",        "sixty",        "seventy",
        !            46:        "eighty",       "ninety",
        !            47: },
        !            48:                *name3[] = {
        !            49:        "hundred",      "thousand",     "million",      "billion",
        !            50:        "trillion",     "quadrillion",  "quintillion",  "sextillion",
        !            51:        "septillion",   "octillion",    "nonillion",    "decillion",
        !            52:        "undecillion",  "duodecillion", "tredecillion", "quattuordecillion",
        !            53:        "quindecillion",                "sexdecillion", 
        !            54:        "septendecillion",              "octodecillion",
        !            55:        "novemdecillion",               "vigintillion",
        !            56: };
        !            57: 
        !            58: main(argc,argv)
        !            59:        int     argc;
        !            60:        char    **argv;
        !            61: {
        !            62:        register int    cnt;
        !            63:        char    line[MAXNUM * 2 + 2];           /* MAXNUM '.' MAXNUM '\0' */
        !            64: 
        !            65:        if (argc > 1)
        !            66:                for (cnt = 1;cnt < argc;++cnt) {
        !            67:                        convert(argv[cnt]);
        !            68:                        puts("...");
        !            69:                }
        !            70:        else
        !            71:                while (fgets(line,sizeof(line),stdin)) {
        !            72:                        convert(line);
        !            73:                        puts("...");
        !            74:                }
        !            75:        exit(0);
        !            76: }
        !            77: 
        !            78: static
        !            79: convert(line)
        !            80:        char    *line;
        !            81: {
        !            82:        register int    len,
        !            83:                        ret;
        !            84:        register char   *C,
        !            85:                        *fraction;
        !            86: 
        !            87:        for (fraction = NULL, C = line;*C && *C != '\n';++C)
        !            88:                if (!isdigit(*C))
        !            89:                        switch(*C) {
        !            90:                        case '-':
        !            91:                                if (C != line)
        !            92:                                        usage(NO);
        !            93:                                break;
        !            94:                        case '.':
        !            95:                                if (!fraction) {
        !            96:                                        fraction = C + 1;
        !            97:                                        *C = EOS;
        !            98:                                        break;
        !            99:                                }
        !           100:                        default:
        !           101:                                usage(NO);
        !           102:                        }
        !           103:        *C = EOS;
        !           104:        if (*line == '-') {
        !           105:                puts("minus");
        !           106:                ++line;
        !           107:        }
        !           108:        ret = NO;
        !           109:        if (len = strlen(line)) {
        !           110:                if (len > MAXNUM)
        !           111:                        usage(YES);
        !           112:                ret = unit(len,line);
        !           113:        }
        !           114:        if (fraction && (len = strlen(fraction))) {
        !           115:                if (len > MAXNUM)
        !           116:                        usage(YES);
        !           117:                for (C = fraction;*C;++C)
        !           118:                        if (*C != '0') {
        !           119:                                if (ret)
        !           120:                                        puts("and");
        !           121:                                if (unit(len,fraction)) {
        !           122:                                        ++ret;
        !           123:                                        pfract(len);
        !           124:                                }
        !           125:                                break;
        !           126:                        }
        !           127:        }
        !           128:        if (!ret)
        !           129:                puts("zero.");
        !           130: }
        !           131: 
        !           132: static
        !           133: unit(len,C)
        !           134:        register int    len;
        !           135:        register char   *C;
        !           136: {
        !           137:        register int    off,
        !           138:                        ret;
        !           139: 
        !           140:        ret = NO;
        !           141:        if (len > 3) {
        !           142:                if (len % 3) {
        !           143:                        off = len % 3;
        !           144:                        len -= off;
        !           145:                        if (number(C,off)) {
        !           146:                                ret = YES;
        !           147:                                printf(" %s.\n",name3[len / 3]);
        !           148:                        }
        !           149:                        C += off;
        !           150:                }
        !           151:                for (;len > 3;C += 3) {
        !           152:                        len -= 3;
        !           153:                        if (number(C,3)) {
        !           154:                                ret = YES;
        !           155:                                printf(" %s.\n",name3[len / 3]);
        !           156:                        }
        !           157:                }
        !           158:        }
        !           159:        if (number(C,len)) {
        !           160:                puts(".");
        !           161:                ret = YES;
        !           162:        }
        !           163:        return(ret);
        !           164: }
        !           165: 
        !           166: static
        !           167: number(C,len)
        !           168:        register char   *C;
        !           169:        int     len;
        !           170: {
        !           171:        register int    val,
        !           172:                        ret;
        !           173: 
        !           174:        ret = 0;
        !           175:        switch(len) {
        !           176:        case 3:
        !           177:                if (*C != '0') {
        !           178:                        ++ret;
        !           179:                        printf("%s hundred",name1[*C - '0']);
        !           180:                }
        !           181:                ++C;
        !           182:                /*FALLTHROUGH*/
        !           183:        case 2:
        !           184:                val = (C[1] - '0') + (C[0] - '0') * 10;
        !           185:                if (val) {
        !           186:                        if (ret++)
        !           187:                                putchar(' ');
        !           188:                        if (val < 20)
        !           189:                                fputs(name1[val],stdout);
        !           190:                        else {
        !           191:                                fputs(name2[val / 10],stdout);
        !           192:                                if (val % 10)
        !           193:                                        printf("-%s",name1[val % 10]);
        !           194:                        }
        !           195:                }
        !           196:                break;
        !           197:        case 1:
        !           198:                if (*C != '0') {
        !           199:                        ++ret;
        !           200:                        fputs(name1[*C - '0'],stdout);
        !           201:                }
        !           202:        }
        !           203:        return(ret);
        !           204: }
        !           205: 
        !           206: static
        !           207: pfract(len)
        !           208:        register int    len;
        !           209: {
        !           210:        static char     *pref[] = { "", "ten-", "hundred-" };
        !           211: 
        !           212:        switch(len) {
        !           213:        case 1:
        !           214:                puts("tenths.");
        !           215:                break;
        !           216:        case 2:
        !           217:                puts("hundredths.");
        !           218:                break;
        !           219:        default:
        !           220:                printf("%s%sths.\n",pref[len % 3],name3[len / 3]);
        !           221:        }
        !           222: }
        !           223: 
        !           224: static
        !           225: usage(toobig)
        !           226:        int     toobig;
        !           227: {
        !           228:        if (toobig)
        !           229:                fprintf(stderr,"number: number too large, max %d digits.\n",MAXNUM);
        !           230:        fputs("usage: number # ...\n",stderr);
        !           231:        exit(-1);
        !           232: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.