📄 dbf_prscore.pas
字号:
Inc(Res.MemoryPos^, width);
end;
end else begin
// convert to string
width :=
{$ifdef SUPPORT_INT64}
GetStrFromInt64
{$else}
GetStrFromInt
{$endif}
(Val, Res.MemoryPos^);
// advance pointer
Inc(Param^.Res.MemoryPos^, width);
end;
// null-terminate
Res.MemoryPos^^ := #0;
end;
end;
procedure FuncIntToStr(Param: PExpressionRec);
begin
FuncIntToStr_Gen(Param, PInteger(Param^.Args[0])^);
end;
{$ifdef SUPPORT_INT64}
procedure FuncInt64ToStr(Param: PExpressionRec);
begin
FuncIntToStr_Gen(Param, PInt64(Param^.Args[0])^);
end;
{$endif}
procedure FuncDateToStr(Param: PExpressionRec);
var
TempStr: string;
begin
with Param^ do
begin
// create in temporary string
DateTimeToString(TempStr, 'yyyymmdd', PDateTimeRec(Args[0])^.DateTime);
// copy to buffer
Res.Append(PChar(TempStr), Length(TempStr));
end;
end;
procedure FuncSubString(Param: PExpressionRec);
var
srcLen, index, count: Integer;
begin
with Param^ do
begin
srcLen := StrLen(Args[0]);
index := PInteger(Args[1])^ - 1;
if Args[2] <> nil then
begin
count := PInteger(Args[2])^;
if index + count > srcLen then
count := srcLen - index;
end else
count := srcLen - index;
Res.Append(Args[0]+index, count)
end;
end;
procedure FuncUppercase(Param: PExpressionRec);
var
dest: PChar;
begin
with Param^ do
begin
// first copy
dest := (Res.MemoryPos)^;
Res.Append(Args[0], StrLen(Args[0]));
// make uppercase
AnsiStrUpper(dest);
end;
end;
procedure FuncLowercase(Param: PExpressionRec);
var
dest: PChar;
begin
with Param^ do
begin
// first copy
dest := (Res.MemoryPos)^;
Res.Append(Args[0], StrLen(Args[0]));
// make lowercase
AnsiStrLower(dest);
end;
end;
procedure FuncAdd_F_FF(Param: PExpressionRec);
begin
with Param^ do
PDouble(Res.MemoryPos^)^ := PDouble(Args[0])^ + PDouble(Args[1])^;
end;
procedure FuncAdd_F_FI(Param: PExpressionRec);
begin
with Param^ do
PDouble(Res.MemoryPos^)^ := PDouble(Args[0])^ + PInteger(Args[1])^;
end;
procedure FuncAdd_F_II(Param: PExpressionRec);
begin
with Param^ do
PInteger(Res.MemoryPos^)^ := PInteger(Args[0])^ + PInteger(Args[1])^;
end;
procedure FuncAdd_F_IF(Param: PExpressionRec);
begin
with Param^ do
PDouble(Res.MemoryPos^)^ := PInteger(Args[0])^ + PDouble(Args[1])^;
end;
{$ifdef SUPPORT_INT64}
procedure FuncAdd_F_FL(Param: PExpressionRec);
begin
with Param^ do
PDouble(Res.MemoryPos^)^ := PDouble(Args[0])^ + PInt64(Args[1])^;
end;
procedure FuncAdd_F_IL(Param: PExpressionRec);
begin
with Param^ do
PInt64(Res.MemoryPos^)^ := PInteger(Args[0])^ + PInt64(Args[1])^;
end;
procedure FuncAdd_F_LL(Param: PExpressionRec);
begin
with Param^ do
PInt64(Res.MemoryPos^)^ := PInt64(Args[0])^ + PInt64(Args[1])^;
end;
procedure FuncAdd_F_LF(Param: PExpressionRec);
begin
with Param^ do
PDouble(Res.MemoryPos^)^ := PInt64(Args[0])^ + PDouble(Args[1])^;
end;
procedure FuncAdd_F_LI(Param: PExpressionRec);
begin
with Param^ do
PInt64(Res.MemoryPos^)^ := PInt64(Args[0])^ + PInteger(Args[1])^;
end;
{$endif}
procedure FuncSub_F_FF(Param: PExpressionRec);
begin
with Param^ do
PDouble(Res.MemoryPos^)^ := PDouble(Args[0])^ - PDouble(Args[1])^;
end;
procedure FuncSub_F_FI(Param: PExpressionRec);
begin
with Param^ do
PDouble(Res.MemoryPos^)^ := PDouble(Args[0])^ - PInteger(Args[1])^;
end;
procedure FuncSub_F_II(Param: PExpressionRec);
begin
with Param^ do
PInteger(Res.MemoryPos^)^ := PInteger(Args[0])^ - PInteger(Args[1])^;
end;
procedure FuncSub_F_IF(Param: PExpressionRec);
begin
with Param^ do
PDouble(Res.MemoryPos^)^ := PInteger(Args[0])^ - PDouble(Args[1])^;
end;
{$ifdef SUPPORT_INT64}
procedure FuncSub_F_FL(Param: PExpressionRec);
begin
with Param^ do
PDouble(Res.MemoryPos^)^ := PDouble(Args[0])^ - PInt64(Args[1])^;
end;
procedure FuncSub_F_IL(Param: PExpressionRec);
begin
with Param^ do
PInt64(Res.MemoryPos^)^ := PInteger(Args[0])^ - PInt64(Args[1])^;
end;
procedure FuncSub_F_LL(Param: PExpressionRec);
begin
with Param^ do
PInt64(Res.MemoryPos^)^ := PInt64(Args[0])^ - PInt64(Args[1])^;
end;
procedure FuncSub_F_LF(Param: PExpressionRec);
begin
with Param^ do
PDouble(Res.MemoryPos^)^ := PInt64(Args[0])^ - PDouble(Args[1])^;
end;
procedure FuncSub_F_LI(Param: PExpressionRec);
begin
with Param^ do
PInt64(Res.MemoryPos^)^ := PInt64(Args[0])^ - PInteger(Args[1])^;
end;
{$endif}
procedure FuncMul_F_FF(Param: PExpressionRec);
begin
with Param^ do
PDouble(Res.MemoryPos^)^ := PDouble(Args[0])^ * PDouble(Args[1])^;
end;
procedure FuncMul_F_FI(Param: PExpressionRec);
begin
with Param^ do
PDouble(Res.MemoryPos^)^ := PDouble(Args[0])^ * PInteger(Args[1])^;
end;
procedure FuncMul_F_II(Param: PExpressionRec);
begin
with Param^ do
PInteger(Res.MemoryPos^)^ := PInteger(Args[0])^ * PInteger(Args[1])^;
end;
procedure FuncMul_F_IF(Param: PExpressionRec);
begin
with Param^ do
PDouble(Res.MemoryPos^)^ := PInteger(Args[0])^ * PDouble(Args[1])^;
end;
{$ifdef SUPPORT_INT64}
procedure FuncMul_F_FL(Param: PExpressionRec);
begin
with Param^ do
PDouble(Res.MemoryPos^)^ := PDouble(Args[0])^ * PInt64(Args[1])^;
end;
procedure FuncMul_F_IL(Param: PExpressionRec);
begin
with Param^ do
PInt64(Res.MemoryPos^)^ := PInteger(Args[0])^ * PInt64(Args[1])^;
end;
procedure FuncMul_F_LL(Param: PExpressionRec);
begin
with Param^ do
PInt64(Res.MemoryPos^)^ := PInt64(Args[0])^ * PInt64(Args[1])^;
end;
procedure FuncMul_F_LF(Param: PExpressionRec);
begin
with Param^ do
PDouble(Res.MemoryPos^)^ := PInt64(Args[0])^ * PDouble(Args[1])^;
end;
procedure FuncMul_F_LI(Param: PExpressionRec);
begin
with Param^ do
PInt64(Res.MemoryPos^)^ := PInt64(Args[0])^ * PInteger(Args[1])^;
end;
{$endif}
procedure FuncDiv_F_FF(Param: PExpressionRec);
begin
with Param^ do
PDouble(Res.MemoryPos^)^ := PDouble(Args[0])^ / PDouble(Args[1])^;
end;
procedure FuncDiv_F_FI(Param: PExpressionRec);
begin
with Param^ do
PDouble(Res.MemoryPos^)^ := PDouble(Args[0])^ / PInteger(Args[1])^;
end;
procedure FuncDiv_F_II(Param: PExpressionRec);
begin
with Param^ do
PInteger(Res.MemoryPos^)^ := PInteger(Args[0])^ div PInteger(Args[1])^;
end;
procedure FuncDiv_F_IF(Param: PExpressionRec);
begin
with Param^ do
PDouble(Res.MemoryPos^)^ := PInteger(Args[0])^ / PDouble(Args[1])^;
end;
{$ifdef SUPPORT_INT64}
procedure FuncDiv_F_FL(Param: PExpressionRec);
begin
with Param^ do
PDouble(Res.MemoryPos^)^ := PDouble(Args[0])^ / PInt64(Args[1])^;
end;
procedure FuncDiv_F_IL(Param: PExpressionRec);
begin
with Param^ do
PInt64(Res.MemoryPos^)^ := PInteger(Args[0])^ div PInt64(Args[1])^;
end;
procedure FuncDiv_F_LL(Param: PExpressionRec);
begin
with Param^ do
PInt64(Res.MemoryPos^)^ := PInt64(Args[0])^ div PInt64(Args[1])^;
end;
procedure FuncDiv_F_LF(Param: PExpressionRec);
begin
with Param^ do
PDouble(Res.MemoryPos^)^ := PInt64(Args[0])^ / PDouble(Args[1])^;
end;
procedure FuncDiv_F_LI(Param: PExpressionRec);
begin
with Param^ do
PInt64(Res.MemoryPos^)^ := PInt64(Args[0])^ div PInteger(Args[1])^;
end;
{$endif}
procedure FuncStrI_EQ(Param: PExpressionRec);
begin
with Param^ do
Res.MemoryPos^^ := Char(AnsiStrIComp(Args[0], Args[1]) = 0);
end;
procedure FuncStrIP_EQ(Param: PExpressionRec);
var
arg0len, arg1len: integer;
match: boolean;
str0, str1: string;
begin
with Param^ do
begin
arg1len := StrLen(Args[1]);
if Args[1][0] = '*' then
begin
if Args[1][arg1len-1] = '*' then
begin
str0 := AnsiStrUpper(Args[0]);
str1 := AnsiStrUpper(Args[1]+1);
setlength(str1, arg1len-2);
match := AnsiPos(str0, str1) = 0;
end else begin
arg0len := StrLen(Args[0]);
// at least length without asterisk
match := arg0len >= arg1len - 1;
if match then
match := AnsiStrLIComp(Args[0]+(arg0len-arg1len+1), Args[1]+1, arg1len-1) = 0;
end;
end else
if Args[1][arg1len-1] = '*' then
begin
arg0len := StrLen(Args[0]);
match := arg0len >= arg1len - 1;
if match then
match := AnsiStrLIComp(Args[0], Args[1], arg1len-1) = 0;
end else begin
match := AnsiStrIComp(Args[0], Args[1]) = 0;
end;
Res.MemoryPos^^ := Char(match);
end;
end;
procedure FuncStrI_NEQ(Param: PExpressionRec);
begin
with Param^ do
Res.MemoryPos^^ := Char(AnsiStrIComp(Args[0], Args[1]) <> 0);
end;
procedure FuncStrI_LT(Param: PExpressionRec);
begin
with Param^ do
Res.MemoryPos^^ := Char(AnsiStrIComp(Args[0], Args[1]) < 0);
end;
procedure FuncStrI_GT(Param: PExpressionRec);
begin
with Param^ do
Res.MemoryPos^^ := Char(AnsiStrIComp(Args[0], Args[1]) > 0);
end;
procedure FuncStrI_LTE(Param: PExpressionRec);
begin
with Param^ do
Res.MemoryPos^^ := Char(AnsiStrIComp(Args[0], Args[1]) <= 0);
end;
procedure FuncStrI_GTE(Param: PExpressionRec);
begin
with Param^ do
Res.MemoryPos^^ := Char(AnsiStrIComp(Args[0], Args[1]) >= 0);
end;
procedure FuncStrP_EQ(Param: PExpressionRec);
var
arg0len, arg1len: integer;
match: boolean;
begin
with Param^ do
begin
arg1len := StrLen(Args[1]);
if Args[1][0] = '*' then
begin
if Args[1][arg1len-1] = '*' then
begin
Args[1][arg1len-1] := #0;
match := AnsiStrPos(Args[0], Args[1]+1) <> nil;
Args[1][arg1len-1] := '*';
end else begin
arg0len := StrLen(Args[0]);
// at least length without asterisk
match := arg0len >= arg1len - 1;
if match then
match := AnsiStrLComp(Args[0]+(arg0len-arg1len+1), Args[1]+1, arg1len-1) = 0;
end;
end else
if Args[1][arg1len-1] = '*' then
begin
arg0len := StrLen(Args[0]);
match := arg0len >= arg1len - 1;
if match then
match := AnsiStrLComp(Args[0], Args[1], arg1len-1) = 0;
end else begin
match := AnsiStrComp(Args[0], Args[1]) = 0;
end;
Res.MemoryPos^^ := Char(match);
end;
end;
procedure FuncStr_EQ(Param: PExpressionRec);
begin
with Param^ do
Res.MemoryPos^^ := Char(AnsiStrComp(Args[0], Args[1]) = 0);
end;
procedure FuncStr_NEQ(Param: PExpressionRec);
begin
with Param^ do
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -