📄 ststrs.pas
字号:
jz @@Store { Yes, store character anyway }
inc bl { Increment SpaceCount }
cmp al, 32 { Is character a space? }
jz @@Store { Yes, store it for now }
xor ebx, ebx { Reset SpaceCount }
cmp al, 39 { Is it a quote? }
jz @@Quotes { Yep, enter quote loop }
cmp al, 34 { Is it a doublequote? }
jnz @@Store { Nope, store it }
@@Quotes:
mov ah, al { Save quote start }
@@NextQ:
mov [edi], al { Store quoted character }
inc edi
inc dh { Increment output length }
mov al, [esi] { Get next character }
inc esi
inc ch { Increment Ipos }
cmp ch, cl { At end of line? }
jae @@Store { If so, exit quote loop }
cmp al, ah { Matching end quote? }
jnz @@NextQ { Nope, stay in quote loop }
cmp al, 39 { Single quote? }
jz @@Store { Exit quote loop }
cmp byte ptr [esi-2],'\'{ Previous character an escape? }
jz @@NextQ { Stay in if so }
@@Store:
mov [edi], al { Store last character }
inc edi
inc dh { Increment output length }
inc ch { Increment input position }
jz @@StoreLen { Exit if past 255 }
cmp ch, cl { Compare Ipos to Ilen }
jbe @@Next { Repeat while characters left }
@@StoreLen:
xor eax, eax
mov al, dh
sub edi, eax
dec edi
mov [edi], dh { Store final length }
@@Done:
pop esi
pop edi
pop ebx
end;
function DetabS(const S : ShortString; TabSize : Byte) : ShortString;
{-Expand tabs in a string to blanks.}
register;
asm
push ebx
push edi
push esi
mov edi, ecx { EDI => output string }
mov esi, eax { ESI => input string }
xor ecx, ecx { Default input length = 0 }
and edx, 0FFh { Default output length = 0 in DH, DL is Tabsize }
xor eax, eax
mov cl, [esi] { Get input length }
inc esi
or edx, edx { TabSize = 0? }
jnz @@DefLength
mov ecx, edx { Return zero length string if TabSize = 0 }
@@DefLength:
mov [edi], cl { Store default output length }
inc edi
or ecx, ecx
jz @@Done { Done if empty input string }
mov ah, 09h { Store tab in AH }
mov bl, 255 { Maximum length of output }
@@Next:
mov al, [esi] { Next input character }
inc esi
cmp al, ah { Is it a tab? }
jz @@Tab { Yes, compute next tab stop }
mov [edi], al { No, store to output }
inc edi
inc dh { Increment output length }
cmp dh, bl { 255 characters max }
jz @@StoreLen
dec cl
jnz @@Next { Next character while Olen <= 255 }
jmp @@StoreLen { Loop termination }
@@Tab:
mov bh, cl { Save input counter }
mov al, dh { Current output length in AL }
and eax, 0FFh { Clear top byte }
div dl { OLen DIV TabSize in AL }
inc al { Round up to next tab position }
mul dl { Next tab position in AX }
or ah, ah { AX > 255? }
jnz @@StoreLen { Can't store it }
sub al, dh { Count of blanks to insert }
add dh, al { New output length in DH }
mov cl, al { Loop counter for blanks }
mov ax, 0920h { Tab in AH, Blank in AL }
rep stosb { Store blanks }
mov cl, bh { Restore input position }
dec cl
jnz @@Next { Back for next input }
@@StoreLen:
xor eax, eax
mov al, dh
sub edi, eax
dec edi
mov [edi], dh { Store final length }
@@Done:
pop esi
pop edi
pop ebx
end;
function ScrambleS(const S, Key : ShortString) : ShortString;
{-Encrypt / Decrypt string with enhanced XOR encryption.}
var
J, LKey, LStr : Byte;
I : Cardinal;
begin
Result := S;
LKey := Length(Key);
LStr := Length(S);
if LKey = 0 then Exit;
if LStr = 0 then Exit;
I := 1;
J := LKey;
while I <= LStr do begin
if J = 0 then
J := LKey;
if (S[I] <> Key[J]) then
Result[I] := Char(Byte(S[I]) xor Byte(Key[J]));
inc(I);
dec(J);
end;
end;
function SubstituteS(const S, FromStr, ToStr : ShortString) : ShortString;
{-Map the characters found in FromStr to the corresponding ones in ToStr.}
var
P : Cardinal;
I : Byte;
begin
Result := S;
if Length(FromStr) = Length(ToStr) then
for I := 1 to Length(Result) do begin
if StrChPosS(FromStr, S[I], P) then
Result[I] := ToStr[P];
end;
end;
function FilterS(const S, Filters : ShortString) : ShortString;
{-Remove characters from a string. The characters to remove are specified in
ChSet.}
var
I : Cardinal;
Len : Cardinal;
begin
Len := 0;
for I := 1 to Length(S) do
if not CharExistsS(Filters, S[I]) then begin
Inc(Len);
Result[Len] := S[I];
end;
Result[0] := Char(Len);
end;
{--------------- Word / Char manipulation -------------------------}
function CharExistsS(const S : ShortString; C : AnsiChar) : Boolean;
{-Determine whether a given character exists in a string. }
register;
asm
xor ecx, ecx
mov ch, [eax]
inc eax
or ch, ch
jz @@Done
jmp @@5
@@Loop:
cmp dl, [eax+3]
jne @@1
inc cl
jmp @@Done
@@1:
cmp dl, [eax+2]
jne @@2
inc cl
jmp @@Done
@@2:
cmp dl, [eax+1]
jne @@3
inc cl
jmp @@Done
@@3:
cmp dl, [eax+0]
jne @@4
inc cl
jmp @@Done
@@4:
add eax, 4
sub ch, 4
jna @@Done
@@5:
cmp ch, 4
jae @@Loop
cmp ch, 3
je @@1
cmp ch, 2
je @@2
cmp ch, 1
je @@3
@@Done:
xor eax, eax
mov al, cl
end;
function CharCountS(const S : ShortString; C : AnsiChar) : Byte;
{-Count the number of a given character in a string. }
register;
asm
xor ecx, ecx
mov ch, [eax]
inc eax
or ch, ch
jz @@Done
jmp @@5
@@Loop:
cmp dl, [eax+3]
jne @@1
inc cl
@@1:
cmp dl, [eax+2]
jne @@2
inc cl
@@2:
cmp dl, [eax+1]
jne @@3
inc cl
@@3:
cmp dl, [eax+0]
jne @@4
inc cl
@@4:
add eax, 4
sub ch, 4
jna @@Done
@@5:
cmp ch, 4
jae @@Loop
cmp ch, 3
je @@1
cmp ch, 2
je @@2
cmp ch, 1
je @@3
@@Done:
mov al, cl
end;
function WordCountS(const S, WordDelims : ShortString) : Cardinal;
{-Given an array of word delimiters, return the number of words in a string.}
var
I : Integer;
SLen : Byte;
begin
Result := 0;
I := 1;
SLen := Length(S);
while I <= SLen do begin
{skip over delimiters}
while (I <= SLen) and CharExistsS(WordDelims, S[I]) do
Inc(I);
{if we're not beyond end of S, we're at the start of a word}
if I <= SLen then
Inc(Result);
{find the end of the current word}
while (I <= SLen) and not CharExistsS(WordDelims, S[I]) do
Inc(I);
end;
end;
function WordPositionS(N : Cardinal; const S, WordDelims : ShortString;
var Pos : Cardinal) : Boolean;
{-Given an array of word delimiters, set Pos to the start position of the
N'th word in a string. Result indicates success/failure.}
var
I : Cardinal;
Count : Byte;
SLen : Byte absolute S;
begin
Count := 0;
I := 1;
Result := False;
while (I <= SLen) and (Count <> N) do begin
{skip over delimiters}
while (I <= SLen) and CharExistsS(WordDelims, S[I]) do
Inc(I);
{if we're not beyond end of S, we're at the start of a word}
if I <= SLen then
Inc(Count);
{if not finished, find the end of the current word}
if Count <> N then
while (I <= SLen) and not CharExistsS(WordDelims, S[I]) do
Inc(I)
else begin
Pos := I;
Result := True;
end;
end;
end;
function ExtractWordS(N : Cardinal; const S, WordDelims : ShortString) : ShortString;
{-Given an array of word delimiters, return the N'th word in a string.}
var
I : Cardinal;
Len : Byte;
SLen : Byte absolute S;
begin
Len := 0;
if WordPositionS(N, S, WordDelims, I) then
{find the end of the current word}
while (I <= SLen) and not CharExistsS(WordDelims, S[I]) do begin
{add the I'th character to result}
Inc(Len);
Result[Len] := S[I];
Inc(I);
end;
Result[0] := Char(Len);
end;
function AsciiCountS(const S, WordDelims : ShortString; Quote : AnsiChar) : Cardinal;
{-Return the number of words in a string.}
var
I : Cardinal;
InQuote : Boolean;
SLen : Byte absolute S;
begin
Result := 0;
I := 1;
InQuote := False;
while I <= SLen do begin
{skip over delimiters}
while (I <= SLen) and (S[i] <> Quote) and CharExistsS(WordDelims, S[I]) do
Inc(I);
{if we're not beyond end of S, we're at the start of a word}
if I <= SLen then
Inc(Result);
{find the end of the current word}
while (I <= SLen) and (InQuote or not CharExistsS(WordDelims, S[I])) do begin
if S[I] = Quote then
InQuote := not InQuote;
Inc(I);
end;
end;
end;
function AsciiPositionS(N : Cardinal; const S, WordDelims : ShortString;
Quote : AnsiChar; var Pos : Cardinal) : Boolean;
{-Return the position of the N'th word in a string.}
var
I : Cardinal;
Count : Byte;
InQuote : Boolean;
SLen : Byte absolute S;
begin
Count := 0;
InQuote := False;
Result := False;
I := 1;
while (I <= SLen) and (Count <> N) do begin
{skip over delimiters}
while (I <= SLen) and (S[I] <> Quote) and CharExistsS(WordDelims, S[I]) do
Inc(I);
{if we're not beyond end of S, we're at the start of a word}
if I <= SLen then
Inc(Count);
{if not finished, find the end of the current word}
if Count <> N then
while (I <= SLen) and (InQuote or not CharExistsS(WordDelims, S[I])) do begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -