{
Summary:
Various utility functions
## $Id: util.pas,v 1.6 2004/03/04 19:11:24 druid Exp $
}
unit util;
interface
uses
strip,
SysUtils,
ansiio;
function URange(min, value, max : longint) : longint;
function UMax(op1, op2 : longint) : longint;
function UMin(op1, op2 : longint) : longint;
function IS_SET(value, bit : cardinal) : boolean;
procedure SET_BIT(var value : cardinal; bit : cardinal);
procedure REMOVE_BIT(var value : cardinal; bit : cardinal);
function pad_integer(s, num : integer) : string;
function pad_integer_front(s, num : integer) : string;
function pad_string(const s : string; num : integer) : string;
function pad_string_front(const s : string; num : integer) : string;
function trail_number(s : integer) : string;
function findNumber(var s : string) : integer;
function add_chars(num : integer; const s : string; c : char) : string;
function cap(s : string) : string;
function one_argument(argument : string; var arg_first : string) : string;
function number_range(val_from, val_to : integer) : integer;
function number_percent : integer;
function rolldice(num, size : integer):integer;
function mudAnsi(color : integer) : string;
function isName(const name, substr : string) : boolean;
function isNameAny(const name, substr : string) : boolean;
function isNameStart(const name, substr : string) : boolean;
function isObjectName(const name, substr : string) : boolean;
function isNumber(const param : string) : boolean;
function DiffSeconds (const D1, D2 : TDateTime) : Integer;
function DiffMinutes (const D1, D2 : TDateTime) : Integer;
function DiffHours (const D1, D2 : TDateTime) : Integer;
function DiffDays (const D1, D2 : TDateTime) : Integer;
function makedrunk(param : string) : string;
function prep(const str : string) : string;
function removeQuotes(const str : string) : string;
function escape(const str : string) : string;
implementation
uses
FastStrings,
constants;
// returns value if min <= value <= max, or min when value < min
// or max when value > max
function URange(min, value, max : longint) : longint;
begin
if (value < min) then
URange := min
else
if (value > max) then
URange := max
else
URange := value;
end;
// returns the maximum of the two operands
function UMax(op1, op2 : longint) : longint;
begin
if (op1 > op2) then
UMax := op1
else
UMax := op2;
end;
// returns the minimum of the two operands
function UMin(op1, op2 : longint) : longint;
begin
if (op1 < op2) then
UMin := op1
else
UMin := op2;
end;
function IS_SET(value, bit : cardinal) : boolean;
begin
IS_SET := ((value and bit) = bit);
end;
procedure SET_BIT(var value : cardinal; bit : cardinal);
begin
value := value or bit;
end;
procedure REMOVE_BIT(var value : cardinal; bit : cardinal);
begin
if (IS_SET(value, bit)) then
dec(value, bit);
end;
function pad_integer(s, num : integer) : string;
var
g : string;
begin
g := inttostr(s);
Result := g + StringOfChar(' ', num-length(g));
end;
function pad_integer_front(s, num : integer) : string;
var
g : string;
begin
g := inttostr(s);
Result := StringOfChar(' ', num - length(g)) + g;
end;
function pad_string(const s : string; num : integer) : string;
begin
Result := s + StringOfChar(' ', num - length(s));
end;
function pad_string_front(const s : string; num : integer) : string;
begin
Result := StringOfChar(' ', num - length(s)) + s;
end;
function trail_number(s : integer):string;
var
g : string;
begin
g := IntToStr(s);
case (s mod 100) of
11 : g := g + 'th';
12 : g := g + 'th';
13 : g := g + 'th';
else
case (s mod 10) of
1 : g := g + 'st';
2 : g := g + 'nd';
3 : g := g + 'rd';
else
g := g + 'th';
end;
end;
Result := g;
end;
// Find number in <num>.* format
function findNumber(var s : string) : integer;
var
g : string;
begin
if (pos('.',s) = 0) then
Result := 1
else
begin
g := left(s, '.');
s := right(s, '.');
try
Result := strtoint(g);
except
Result := 1;
end;
end;
end;
function add_chars(num:integer; const s : string; c : char) : string;
begin
if (length(s)>num) then
begin
Result := s;
exit;
end;
Result := s + StringOfChar(c, num - length(s));
end;
function cap(s : string) : string;
var
g : integer;
begin
if (length(s) = 0) then
begin
Result := '';
exit;
end;
g := 0;
repeat
inc(g);
if (s[g] = '$') then
inc(g, 2);
until (byte(s[g]) in [33..126]) or (length(s) <= g);
s[g] := upcase(s[g]);
Result := s;
end;
function one_argument(argument : string; var arg_first : string) : string;
var
cEnd : char;
count : integer;
p : integer;
begin
count := 0;
cEnd := ' ';
p := 1;
argument := trim(argument);
arg_first := '';
if (length(argument) = 0) then
begin
Result := '';
exit;
end;
if (argument[p] = '''') or (argument[p] = '"') then
begin
cEnd := argument[p];
inc(p);
end;
while (p <= length(argument)) and (count < 256) do
begin
if (argument[p] = cEnd) or (argument[p] = #13) or (argument[p] = #10) then
begin
inc(p);
break;
end;
arg_first := concat(arg_first, argument[p]);
inc(p);
inc(count);
end;
while (p <= length(argument)) and ((argument[p] = ' ') or (argument[p] = #13) or (argument[p] = #10)) do
inc(p);
Result := copy(argument, p, length(argument) - p + 1);
end;
function number_range(val_from, val_to : integer) : integer;
begin
Result := random(val_to - val_from) + val_from;
end;
// Random number between 1 - 100
function number_percent() : integer;
begin
Result := random(100) + 1;
end;
function rolldice(num, size : integer) : integer;
var
s, a : integer;
begin
s := 0;
for a:=1 to num do
inc(s, random(size) + 1);
Result := s;
end;
function mudAnsi(color : integer) : string;
begin
if (color > 8) then
Result := '$B$' + inttostr(color - 8)
else
Result := '$A$' + inttostr(color);
end;
{ alias for isNameAny }
function isName(const name, substr : string) : boolean;
begin
Result := isNameAny(name, substr);
end;
{ tests wether substr occurs anywhere in name }
function isNameAny(const name, substr : string) : boolean;
begin
Result := (Pos(trim(uppercase(substr)), trim(uppercase(name)) ) > 0);
end;
{ tests wether substr occurs at the start of 'name' or at the start of the first noun in 'name' }
function isNameStart(const name, substr : string) : boolean;
{ list of articles, change this if you wish to recompile Grendel for a different language }
const
articles : array[0..1] of string = ('A', 'THE');
var
i : integer;
begin
Result := (Pos(trim(uppercase(substr)), trim(uppercase(name))) = 1);
if (Result = false) then
begin
for i := 0 to length(articles) - 1 do
begin
Result := (Pos(articles[i] + ' ' + trim(uppercase(substr)), trim(uppercase(name))) = 1);
if (Result) then
exit;
end;
end;
end;
{ tests wether substr occurs at the start of name }
function isNameStartNoun(const name, substr : string) : boolean;
begin
Result := (Pos(trim(uppercase(substr)), trim(uppercase(name))) = 1);
end;
{Xenon 16/Apr/2001: same as isName() but less strict }
function isObjectName(const name, substr : string) : boolean;
begin
Result := (Pos(trim(uppercase(substr)), trim(uppercase(name))) > 0);
end;
{Jago 17/Jan/2001 - utility function}
function isNumber(const param : string) : boolean;
begin
Result := True;
try
StrToInt(param);
except
Result := False;
end;
end;
// functions borrowed from the Delphi Fundamentals
const
OneDay = 1.0;
OneHour = OneDay / 24.0;
OneMinute = OneHour / 60.0;
OneSecond = OneMinute / 60.0;
OneMillisecond = OneSecond / 1000.0;
function DiffSeconds (const D1, D2 : TDateTime) : Integer;
begin
Result := Trunc ((D2 - D1) / OneSecond);
end;
function DiffMinutes (const D1, D2 : TDateTime) : Integer;
begin
Result := Trunc ((D2 - D1) / OneMinute);
end;
function DiffHours (const D1, D2 : TDateTime) : Integer;
begin
Result := Trunc ((D2 - D1) / OneHour);
end;
function DiffDays (const D1, D2 : TDateTime) : Integer;
begin
Result := Trunc (D2 - D1);
end;
// Drunken speech - Nemesis
function makedrunk(param : string) : string;
var
temp : char;
i, drunkpos : integer;
buf, drunkstring : string;
begin
for i:=1 to length(param) do
begin
drunkpos := 0;
param := uppercase(param);
temp := param[i];
if (temp = ' ') then
buf := ' '
else
if not (temp in ['A'..'Z']) then
buf := temp
else
begin
try
while (cap(temp) < 'Z') do
begin
inc(temp);
inc(drunkpos);
end;
except
drunkpos := -1;
end;
if (drunkpos >= 0) and (drunkpos <= 25) then
buf := drunkbuf[drunkpos]
else
buf := temp;
end;
drunkstring := drunkstring + buf;
end;
Result := drunkstring;
end;
function prep(const str : string) : string;
begin
Result := trim(uppercase(str));
end;
// Strip quotes from string
function removeQuotes(const str : string) : string;
var
s : string;
x : integer;
begin
if (length(str) = 0) then
begin
Result := '';
exit;
end;
x := 1;
s := '';
while (x <= length(str)) do
begin
if (str[x] = '\') then
inc(x);
s := s + str[x];
inc(x);
end;
if ((s[1] = '"') or (s[1] = '''')) then
s[1] := ' ';
if ((s[length(s)] = '"') or (s[length(s)] = '''')) then
s[length(s)] := ' ';
Result := Trim(s);
end;
function escape(const str : string) : string;
var
i : integer;
begin
Result := '';
for i := 1 to length(str) do
begin
if (str[i] in ['"','\']) then
Result := Result + '\';
Result := Result + str[i];
end;
end;
end.