Category : C Source Code
Archive   : TODAY10.ZIP
Filename : NBRTXT.C
Output of file : NBRTXT.C contained in archive : TODAY10.ZIP
* 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);
}
Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!
This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.
But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/