#if !efun_defined(query_num)
private string number_as_string( int n ) {
string ret;
if( !n )
return "zero";
if( n < 20 && n > 9 )
return ({"ten", "eleven", "twelve", "thirteen",
"fourteen", "fifteen", "sixteen", "seventeen",
"eighteen", "nineteen"})[n-10];
ret = ({"", "", "twenty", "thirty", "forty", "fifty", "sixty",
"seventy", "eighty", "ninety"})[n/10];
if( ( n %= 10 ) && ret != "")
ret += "-";
return ret + ({"", "one", "two", "three", "four", "five",
"six", "seven", "eight", "nine"})[n];
} /* number_as_string() */
/**
* This method turns a number into a string. It returns a string of the
* form "one hundred and twenty four".
* The limit argument is used to set the cut off point at which it will
* print "many".
*
* @param i the number to return as a string
* @param limit the largest number to process
* @return the number as a nice string
*/
string query_num( int n, int limit ) {
string ret, nve;
int i;
if( n < 0 ) {
nve = "minus ";
n *= -1;
} else {
nve = "";
}
if( limit && n > limit )
return nve + "many";
if( n > 99999 )
return nve + "many";
ret = 0;
if( ( i = n / 1000 ) ) {
n %= 1000;
if( !n )
return nve + number_as_string(i) + " thousand";
ret = number_as_string(i) + " thousand";
}
if( ( i = n / 100 ) ) {
n %= 100;
if( ret ) {
if( !n )
return nve + ret + " and " + number_as_string(i) + " hundred";
ret += ", " + number_as_string(i) + " hundred";
} else {
if( !n )
return nve + number_as_string(i) + " hundred";
ret = number_as_string(i) + " hundred";
}
}
if( ret )
return nve + ret + " and " + number_as_string(n);
return nve + number_as_string(n);
} /* query_num() */
#endif
#if !efun_defined(word_ordinal)
/**
* This method returns the ordinal of a number as a string (ie, "first",
* "thirtieth", etc.)
* @param n the number for which you want the ordinal
* @returns the ordinal of the number as a string
* @see query_num(), ordinal()
*/
string word_ordinal( int num ) {
string word = "";
int part, nve;
if( !num )
return "zeroth";
if( num < 0 ) {
nve = 1;
num *= -1;
}
switch( part = num % 100 ) {
case 0:
word = "th";
break;
case 1..12:
word = ({"first", "second", "third", "fourth", "fifth", "sixth",
"seventh", "eighth", "ninth", "tenth", "eleventh",
"twelfth"})[part-1];
break;
case 13..19:
word = query_num( num % 100, 0 ) + "th";
break;
default:
if( !( part % 10 ) ) {
word = ({"twentieth", "thirtieth", "fortieth", "fiftieth",
"sixtieth", "seventieth", "eightieth",
"ninetieth"})[part/10-2];
} else {
word = ({"twenty", "thirty", "forty", "fifty", "sixty",
"seventy", "eighty", "ninety"})[part/10-2]+"-"+
word_ordinal(part%10);
}
}
num = ( num / 100 ) * 100;
if( num ) {
if( part > 0 )
word = query_num( num, 0 ) + " and " + word;
else
word = query_num( num, 0 ) + word;
}
if( nve )
return "minus " + word;
return word;
} /* word_ordinal() */
#endif
#if !efun_defined(create_table)
#define _BOLD(xxxx) ("%^BOLD%^"+ xxxx +"%^RESET%^")
/**
* This method creates a nice table from the input array.
* To control whether or not the results should be sorted or
* capitalized, set the cap_flag to 1 to sort and capitalize,
* or to 2 to only capitalize the array.
* @param title a two element array containing the title of
* the table, and the singular name for an array element
* @param names the array to make the table out of
* @param cap_flag 1 to capitalize and sort the array, 2 to
* capitalize without sorting
* @return a nice table
* @example
* write( create_table( ({"Creators", "creator"}),
* DOMAIN_H->query_creators(), 1 )+"\n");
*/
varargs string create_table( string *title, string *names, int cap_flag ) {
int cols = TP->query_cols(), size;
string ret = "%^RESET%^", bit, count;
if( !arrayp(title) || !arrayp(names) || sizeof(title) != 2 )
return 0;
// Sort the list alphabetically.
if( cap_flag < 2 )
names = sort_array( names, 1 );
// If specified, capitalise the array of names.
if( cap_flag )
names = map( names, (: CAP($1) :) );
ret = sprintf("%|*'-'s", cols + 17,
"=======[ "+ _BOLD(title[0]) +" ]=======") + "\n";
ret += sprintf("%#-*s\n", cols, implode(names, "\n"));
if( stringp(title[1]) ) {
count = query_num( size = sizeof(names), 100 );
if( size == 1 )
bit = "is only";
else {
if( !size )
count = "no";
bit = "are";
title[1] = pluralize(title[1]);
}
ret += sprintf("%|*'-'s\n", cols, "[ There "+ bit +" "+
count +" "+ title[1] +" ]");
} else
ret += sprintf("%|*'-'s\n", cols, "");
return ret;
} /* create_table() */
#endif
#if !efun_defined(time_string)
varargs string time_string( int time, int flag ) {
int minutes, hours, days, years, i;
string *strs = ({ }), nve;
if( time < 0 ) {
if( flag == 1 )
nve = "-";
else
nve = "minus ";
time *= -1;
} else {
nve = "";
}
days = time / 86400;
time %= 86400;
hours = time / 3600;
time %= 3600;
minutes = time / 60;
time %= 60;
if( flag == 1 )
return nve + ( days ? days + ", " : "")+
sprintf("%02d:%02d.%02d", hours, minutes, time );
years = days / 365;
days %= 365;
if( flag ) {
if( years )
strs += ({ years+" year"+( years > 1 ? "s" : "") });
if( days )
strs += ({ days+" day"+( days > 1 ? "s" : "") });
if( hours )
strs += ({ hours+" hour"+( hours > 1 ? "s" : "") });
if( minutes )
strs += ({ minutes+" minute"+( minutes > 1 ? "s" : "") });
if( time || !sizeof(strs) )
strs += ({ time+" second"+( time > 1 ? "s" : "") });
} else {
if( years )
strs += ({ query_num( years, 0 )+" year"+
( years > 1 ? "s" : "") });
if( days )
strs += ({ query_num( days, 0 )+" day"+
( days > 1 ? "s" : "") });
if( hours )
strs += ({ query_num( hours, 0 )+" hour"+
( hours > 1 ? "s" : "") });
if( minutes )
strs += ({ query_num( minutes, 0 )+" minute"+
( minutes > 1 ? "s" : "") });
if( time || !sizeof(strs) )
strs += ({ query_num( time, 0 )+" second"+
( time > 1 ? "s" : "") });
}
i = sizeof( strs );
switch( i ) {
case 0 :
return "";
case 1 :
return nve + strs[0];
break;
default :
return nve + implode( strs[0..<2], ", " )+" and "+strs[<1];
break;
}
} /* time_string() */
#endif