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

unix.superglobalmegacorp.com

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