1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
const MNA : array[Char] of Char
= #0#1#2#3#4#5#6#7#8#9#10#11#12#13#14#15 +
#16#17#18#19#20#21#22#23#24#25#26#27#28#29#30#31 +
' !"#$%&''()*+,-./0123456789:;<=>?' +
'@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_' +
'`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~'#127 +
''#129'
S'#141'Z'#143#144'''""S'#157'ZY' +
#160'¡¢£¤¥¦§¨©ª«¬*®¯°±²³´µ¶·¸¹º»¼½¾¿' +
'AAAAAAÆCEEEEIIIIDNOOOOO×OUUUUYÞß' +
'AAAAAAÆCEEEEIIIIDNOOOOO÷OUUUUYÞY';
function CJ9Buff(const Source,Dest:PAnsiChar;const Len:Integer):PAnsiChar;register;
asm
PUSH ESI // Sauvegarde ESI par nécesssité technique
PUSH EDI // Sauvegarde EDI par nécesssité technique
PUSH EBX // Sauvegarde EBX par nécesssité technique
PUSH EAX
CLD
XOR EBX,EBX // EBX := 0
CMP ECX,EBX // Len <= 0 ?
JLE @Out // Si oui, sauter
MOV ESI,EAX // Adresse de la source chaîne dans ESI
MOV EDI,EDX // Adresse de la destination dans EDI
LEA EBX,MNA // Adresse de MNA dans EBX
@Loop:
LODSB // AL <- [ESI] ; Inc(ESI)
XLAT // AL <- [EBX + AL]
STOSB // [EDI] <- AL ; Inc(EDI)
DEC ECX // On décrémente le compteur
JNE @Loop // si pas fini, boucle
@Out:
POP EAX // renvoie dans Result l'adresse de la chaîne
POP EBX
POP EDI
POP ESI
end;
function CJ9(const S:string):string;
var
Len: Integer;
begin
if S = '' then Result := '' else
begin
Len := Length(S);
SetLength(Result, Len);
CJ9Buff(PAnsiChar(S), PAnsiChar(Result), Len);
end;
end; |
Partager