|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T n
Length: 3505 (0xdb1)
Types: TextFile
Names: »nbrtxt.c«
└─⟦87ddcff64⟧ Bits:30001253 CPHDIST85 Tape, 1985 Autumn Conference Copenhagen
└─⟦this⟧ »cph85dist/astro/today/nbrtxt.c«
/*
* Integer to Readable ASCII Conversion Routine.
*
* Synopsis:
*
* char *nbrtxt(buffer, value, ordinal)
* char *buffer; -- The output buffer
* int value; -- The number to output
* int ordinal; -- Non-zero for ordinal number
*
*
* The value is converted to a readable number and put in the output
* buffer (null-terminated). A pointer to the first free location
* in the buffer (i.e., the null) is returned. The ordinal
* flag distinguishes between cardinal and ordinal numbers:
*
* nbrtxt(buffer, 1, 0) = "one"
* nbrtxt(buffer, 1, 1) = "first"
*
* The longest output string is:
*
* Twenty-seven thousand, three hundred and seventy-seventh.
*
*
*
* Copy a String
*
* Synopsis
*
* char *copyst(out, in)
* char *out; -- The output string
* char *in; -- The input string
*
* The input string is copied into the output string. Copyst returns
* a pointer to the null trailer.
*
*/
extern char *nbrtxt();
extern char *copyst();
static char *cardinal[] = {
"zero",
"one",
"two",
"three",
"four",
"five",
"six",
"seven",
"eight",
"nine",
"ten",
"eleven",
"twelve",
"thirteen",
"fourteen",
"fifteen",
"sixteen",
"seventeen",
"eighteen",
"nineteen"
};
static char *ordinal[] = {
"zeroth",
"first",
"second",
"third",
"fourth",
"fifth",
"sixth",
"seventh",
"eighth",
"ninth",
"tenth",
"eleventh",
"twelfth"
};
static char *twenties[] = {
"twen",
"thir",
"for",
"fif",
"six",
"seven",
"eigh",
"nine"
};
char *nbrtxt(buffer, datum, ordflag)
char *buffer; /* Output string buffer */
int datum; /* what to translate */
int ordflag; /* 0 if cardinal, 1 if ordinal */
/*
* Translate a number to a readable text string, punctuation and all.
* If ordflag is non-zero, ordinal numbers ("first, second") will
* be generated, rather than cardinal ("one, two").
* Note: nbrtxt() is recursive.
*/
{
register int value;
register char *op;
op = buffer;
value = datum;
if (value < 0) {
op = copyst(op, "minus ");
value = (-value);
if (value < 0) { /* Hack -32768 */
op = copyst(op, twenties[1]);
value = 2768;
}
}
if (value >= 1000) {
op = nbrtxt(op, value/1000, 0);
op = copyst(op, " thousand");
value = value % 1000;
if (value == 0) goto exit;
op = copyst(op, (value >= 100) ? ", " : " and ");
}
if (value >= 100) {
op = copyst(op, cardinal[value/100]);
op = copyst(op, " hundred");
value = value % 100;
if (value == 0) goto exit;
op = copyst(op, " ");
}
if (value >= 20) {
if (value == 90 && ordflag)
return(copyst(op, "nintieth"));
op = copyst(op, twenties[(value-20) / 10]);
value = value % 10;
if (value == 0) {
return(copyst(op, (ordflag) ? "tieth" : "ty"));
}
op = copyst(op, "ty-");
}
if (value <= 12) {
return(copyst(op,
(ordflag) ? ordinal[value] : cardinal[value]));
}
op = copyst(op, cardinal[value]); /* fourteen, fourteenth */
/*
* Here on 100, 14000, etc.
*/
exit: if (ordflag) op = copyst(op, "th");
return(op);
}
char *
copyst(buffer, string)
char *buffer;
char *string;
/*
* Copy a string into buffer. Return the free pointer.
*/
{
register char *ip;
register char *op;
ip = string;
op = buffer;
while ((*op = *ip++)) op++;
return (op);
}