diff --git a/commande/str0.asm b/commande/str0.asm deleted file mode 100644 index 2e6aefa..0000000 --- a/commande/str0.asm +++ /dev/null @@ -1,993 +0,0 @@ -model tiny,stdcall -p586N -locals -jumps -codeseg -option procalign:byte - -include "..\include\mem.h" -include "..\include\divers.h" - -org 0h - -header exe <"CE",1,0,0,offset exports,,,> - - -exporting -declare checksyntax -declare cmpitems -declare gettypeditem -declare gettyped -declare whatisitem -declare whatis -declare strtoadress -declare strisadress -declare strisname -declare strisbase -declare strtoint -declare left -declare right -declare middle -declare fill -declare replaceallchar -declare searchchar -declare invert -declare cmpstr -declare evalue -declare insert -declare delete -declare copy -declare concat -declare compressdelimiter -declare setnbitems -declare getitemsize -declare getitem -declare getpointeritem -declare getnbitems -declare getlength -declare setlength -declare uppercase -declare onecase -declare lowercase -declare invertcase -ende - -;Librairie qui prend en charge le format de STR ASCIIZ -;# nombre 8 -;? str 7 -;& nom 6 - -;High Low -;0 variable 4 hex -;1 byte 3 dec -;2 word 2 oct -;3 3 octets 1 bin -;4 dword 5 adresse -;5 5 octets 6 nom -;6 ... 7 str - ; 8 nombre - -;Renvoie carry si la syntaxe de ds:si n'est pas respect‚ par rapport a es:di -PROC checksyntax FAR - ARG @src:word,@dest:word,@delim:word - USES ax,bx,cx,dx,si,di,ds,es - LOCAL @@temp:word:256 - push ss - pop es - lea si,[@@temp] - mov di,[@dest] - call copy,[@src],si - call xch - call compressdelimiter,si,[@delim] - call getnbitems,si,[@delim] - mov bx,ax - call xch - call getnbitems,di,[@delim] - cmp bx,ax - jne @@notequalatall - xor cx,cx -@@itemer: - call xch - call whatisitem,si,cx,[@delim] - mov dx,ax - call xch - call whatisitem,di,cx,[@delim] - cmp ax,dx - jne @@prob - cmp al,6 - jb @@equal - call cmpitems - je @@equal -@@prob: - cmp dl,4 - ja @@nonumber - cmp dl,8 - je @@equal - ;cmp al,4 - ;jne @@notequalatall - cmp dh,ah - ja @@notequalatall - jmp @@equal -@@nonumber: - cmp al,7 - jne @@nostr - cmp ah,0 - jne @@notequalatall - jmp @@equal -@@nostr: - cmp al,6 - jne @@noname - cmp dl,6 - jne @@noname - cmp ah,0 - jne @@notequalatall - jmp @@equal -@@noname: - cmp al,8 - je @@equal - jmp @@notequalatall -@@equal: - inc cx - cmp cx,bx - jne @@itemer - cld -@@ackno: - ret -@@notequalatall: - stc - jmp @@ackno -endp checksyntax - -xch: - push es - push ds - pop es - pop ds - ret - - -;Compare les ‚l‚ments cx de deux chaine ds:si et es:di -PROC cmpitems FAR - ARG @src:word,@dest:word,@item:word,@delim:word - USES ax,cx,si,di,es - push ds - pop es - call getpointeritem,[@src],[@item],[@delim] - mov si,ax - call getitemsize,[@src],[@item],[@delim] - mov di,[@dest] - mov cx,ax - cld - rep cmpsb - clc - ret -endp cmpitems - - -;Renvoie l'‚l‚ment cx de ds:si dans edx si nb et dans es:di si str ou name -PROC gettypeditem FAR - ARG @src:word,@item:word,@delim:word - USES bx,cx,si,di - mov si,[@src] - mov cx,[@item] - call getpointeritem,si,cx,[@delim] - mov di,ax - inc cx - call getpointeritem,si,cx,[@delim] - mov si,ax - dec si - mov cl,0 - xchg cl,[ds:si] - call gettyped,di - xchg cl,[ds:si] - clc - ret -endp gettypeditem - - -;Renvoie eax si nb et dans ds:eax si str ou name -PROC gettyped FAR - ARG @src:word - USES si - mov si,[@src] - xor eax,eax - call whatis,si - cmp al,1 - je @@bin - cmp al,2 - je @@oct - cmp al,3 - je @@dec - cmp al,4 - je @@hex - cmp al,5 - je @@pointer - mov ax,si - jmp @@endofgettypeditem -@@bin: - call strtoint,si,2 - jmp @@endofgettypeditem -@@oct: - call strtoint,si,8 - jmp @@endofgettypeditem -@@dec: - call strtoint,si,10 - jmp @@endofgettypeditem -@@hex: - call strtoint,si,16 - jmp @@endofgettypeditem -@@pointer: - call strtoadress,si -@@endofgettypeditem: - clc - ret -endp gettyped - -;Renvoie dans ax le type de la str0 point‚e par ds:%0 ‚l‚ment %1 delim %3 -PROC whatisitem FAR - ARG @src:word,@item:word,@delim:word - USES bx,cx,si,di - mov si,[@src] - mov cx,[@item] - call getpointeritem,si,cx,[@delim] - mov di,ax - inc cx - call getpointeritem,si,cx,[@delim] - mov si,ax - dec si - mov cl,0 - xchg cl,[ds:si] - call whatis,di - xchg cl,[ds:si] - clc - ret -endp whatisitem - -;Renvoie dans ax le type de la str0 point‚e par ds:%0 -;High Low -;0 variable 4 hex -;1 byte 3 dec -;2 word 2 oct -;3 3 octets 1 bin -;4 dword 5 adresse -;5 5 octets 6 name -;6 ... 7 str -PROC whatis FAR - ARG @src:word - USES bx,cx,edx,si - mov si,[@src] - xor cx,cx - mov cl,2 - call strisbase,si,cx - jnc @@finbase - mov cl,8 - call strisbase,si,cx - jnc @@finbase - mov cl,10 - call strisbase,si,cx - jnc @@finbase - mov cl,16 - call strisbase,si,cx - jc @@testadress -@@finbase: - mov bx,cx - xor ch,ch - mov al,[cs:bx+offset basenn-2] - push eax - call strtoint,si,cx - mov edx,eax - pop eax - cmp edx,0000FFFFh - ja @@bits32 - cmp dx,00FFh - ja @@bits16 - mov ah,1 - jmp @@endofwhat -@@bits16: - mov ah,2 - jmp @@endofwhat -@@bits32: - mov ah,4 - jmp @@endofwhat -@@testadress: - call strisadress,si - jc @@testname - mov ax,0005h - jmp @@endofwhat -@@testname: - call strisname - jc @@testnumber - xor ah,ah - cmp [byte ptr si],'&' - je @@okname - call getlength,si - mov ah,al -@@okname: - mov al,06h - jmp @@endofwhat -@@testnumber: - cmp [byte ptr si],'#' - jne @@testvarstr - xor ah,ah - mov al,08h - jmp @@endofwhat -@@testvarstr: - xor ah,ah - cmp [byte ptr si],'?' - je @@okvarstr - call getlength,si - mov ah,al -@@okvarstr: - mov al,07h -@@endofwhat: - clc - ret -endp whatis - - - -;Renvoie non carry si la str ds:si point‚e peut ˆtre une adresse -PROC strtoadress FAR - ;push - stc - ;pop - ret -endp strtoadress - - -;Renvoie en es:di le pointeur str0 ds:si -PROC strisadress FAR - ;push - stc - ;pop - ret -endp strisadress - -;Renvoie non carry si la str ds:%0 point‚e peut ˆtre un nom de fichier -PROC strisname FAR - ARG @src:word - USES ax,si,di - mov si,[@src] -@@isname: - mov al,[si] - inc si - cmp al,0 - je @@itsok - mov di,offset non -@@verify: - mov ah,[cs:di] - inc di - cmp ah,0FFh - je @@isname - cmp ah,al - jne @@verify - stc - jmp @@itsdead -@@itsok: - clc -@@itsdead: - ret -endp strisname - -non db '/<>|"?*:\',01,0FFh - -;Renvoie non carry si le texte point‚ par %0 est de la base %1 -PROC strisbase FAR - ARG @src:word,@base:word - USES ax,cx,si,di,es - push cs - pop es - mov si,[@src] -@@isstrbase: - mov al,[si] - cmp al,0 - je @@okbase - mov cx,[@base] - xor ch,ch - mov di,cx - cmp al,[es:di-2+offset basen] - je @@verifbase - xor ch,ch - inc cl - mov di,offset base - cld - repne scasb - cmp cx,0 - je @@nobase - inc si - jmp @@isstrbase -@@okbase: - clc -@@endbase: - ret -@@verifbase: - cmp [byte ptr si+1],0 - je @@okbase -@@nobase: - stc - jmp @@endbase -endp strisbase - -base db '0123456789ABCDEF' -basen db 'b o d h' -basenn db 1,0,0,0,0,0,2,0,3,0,0,0,0,0,4 - - -;Converti un str %0 de base %1 en int dans eax -PROC strtoint FAR - ARG @src:word,@base:word - USES ebx,ecx,edx,si,edi,es - push cs - pop es - mov si,[@src] -@@gotos: - cmp [byte ptr si+1], 0 - je @@oklo - inc si - jmp @@gotos -@@oklo: - mov edi,1 - xor ebx,ebx -@@baseto: - cmp [@src],si - ja @@endbaseto - mov al,[si] - xor ecx,ecx - mov cl,[byte ptr @base] - inc cl - push di - mov di,offset base - cld - repne scasb - pop di - jne @@noop - sub cl,[byte ptr @base] - neg cl - mov eax,edi - mul ecx - add ebx,eax - mov eax,edi - mov cl,[byte ptr @base] - mul ecx - mov edi,eax -@@noop: - dec si - jmp @@baseto -@@endbaseto: - mov eax,ebx - clc - ret -endp strtoint - - -;Renvoie en ds:%1 la partie de %2 caractŠres a partir de la gauche de ds:%0 -PROC left FAR - ARG @src:word,@dest:word,@nb:word - USES ax,cx,si,di,es - push ds - pop es - mov si,[@src] - mov di,[@dest] - mov cx,[@nb] - cld - rep movsb - mov al,0 - stosb - clc - ret -endp left - -;Renvoie en ds:%1 la partie de %2 caractŠres a partir de la droite de ds:%0 -PROC right FAR - ARG @src:word,@dest:word,@nb:word - USES ax,cx,si,di,es - push ds - pop es - mov si,[@src] - mov di,[@dest] - call getlength,si - add si,ax - sub si,[@nb] - mov cx,[@nb] - cld - rep movsb - mov al,0 - stosb - clc - ret -endp right - -;Renvoie en ds:%1 la partie de %3 caractŠres a partir de la position %2 de ds:%0 -PROC middle FAR - ARG @src:word,@dest:word,@item:word,@nb:word - USES ax,cx,si,di,es - push ds - pop es - mov si,[@src] - mov di,[@dest] - mov cx,[@nb] - add si,[@item] - cld - rep movsb - mov al,0 - stosb - clc - ret -endp middle - -;Rempli de %3 caractŠres %2 a partir de la position %1 de ds:%0 -PROC fill FAR - ARG @src:word,@item:word,@char:word,@nb:word - USES ax,cx,si,di,es - push ds - pop es - mov di,[@src] - add di,[@item] - mov ax,[@char] - mov cx,[@nb] - cld - rep stosb - clc - ret -endp fill - -;Remplace tout les caractŠres %1 de ds:%0 par des caractŠres %2 -PROC replaceallchar FAR - ARG @src:word,@char1:word,@char2:word - USES ax,cx,dx,di,es - mov di,[@src] - call getlength,di - mov cx,ax - mov ax,[@char1] - mov dx,[@char2] - push ds - pop es -@@findandchange: - repne scasb - cmp cx,0 - je @@endofchange - mov [es:di-1],dl - jmp @@findandchange -@@endofchange: - clc - ret -endp replaceallchar - -;Recherche un caractŠre dl dans la chaŒne ds:%0 -PROC searchchar FAR - ARG @src:word,@char:word - USES cx,di,es - mov di,[@src] - call getlength,di - mov cx,ax - push ds - pop es - mov ax,[@char] - repne scasb - mov ax,di - dec ax - clc - ret -endp searchchar - -;Inverse la chaine point‚e en ds:%0 -PROC invert FAR - ARG @src:word - USES ax,cx,si,di - mov si,[@src] - call getlength,si - mov di,si - add di,ax - dec di -@@revert: - mov al,[si] - xchg al,[di] - mov [si],al - inc si - dec di - cmp si,di - ja @@finishinvert - dec di - cmp si,di - ja @@finishinvert - inc di - jmp @@revert -@@finishinvert: - clc - ret -endp invert - -;Compares 2 chaines de caractŠres DS:%0 et DS:%1 zerof si non equal -PROC cmpstr FAR - ARG @src:word,@dest:word - USES cx,dx,si,di - push ds - pop es - mov si,[@src] - mov di,[@dest] - call getlength,di - mov cx,ax - call getlength,si - cmp cx,ax - jne @@notequal - repe cmpsb -@@notequal: - ret -endp cmpstr - -;Compares 2 chaines de caractŠres DS:%0 et DS:%1 zerof si non equal et renvoie le nb de caractŠre egaux dans ax -PROC evalue FAR - ARG @src:word,@dest:word - USES cx,si,di,es - push ds - pop es - mov si,[@src] - mov di,[@dest] - call getlength ,di - mov cx,ax - repe cmpsb - pushf - jne @@noident - sub ax,cx - popf - clc - ret -@@noident: - sub ax,cx - dec ax - popf - clc - ret -endp evalue - -;Insert une chaine ds:%0 en ds:%1 a partir du caractŠre %2 -PROC insert FAR - ARG @src:word,@dest:word,@item:word - USES ax,cx,si,di,es - push es - pop ds - mov si,[@dest] - call getlength,si - mov cx,ax - add si,ax - mov di,si - call getlength,[@src] - add di,ax - sub cx,[@item] - inc cx - std - rep movsb - mov si,[@src] - mov di,[@dest] - add di,[@item] - mov cx,ax - cld - rep movsb - clc - ret -endp insert - - -;Detruit %2 caractŠres a partir du caractŠre %1 de DS:%0 -PROC delete FAR - ARG @src:word,@item:word,@size:word - USES ax,cx,dx,si,di,es - push ds - pop es - mov si,[@src] - call getlength,si - mov cx,ax - sub cx,[@size] - sub cx,[@item] - inc cx - add si,[@item] - mov di,si - add si,[@size] - cld - rep movsb - clc - ret -endp delete - -;Copie une chaine de ds:si en es:di -PROC copy FAR - ARG @src:word,@dest:word - USES ax,cx,si,di - mov si,[@src] - mov di,[@dest] - call getlength,si - mov cx,ax - cld - rep movsb - mov al,0 - stosb - clc - ret -endp copy - - -;ConcatŠne le chaine ds:si avec ds:di -PROC concat FAR - ARG @src:word,@dest:word - USES ax,cx,si,di,es - push ds - pop es - mov si,[@src] - call getlength,si - mov cx,ax - mov di,[@dest] - call getlength,di - add di,ax - cld - rep movsb - mov al,0 - stosb - clc - ret -endp concat - - -;D‚truit les d‚limiteur qui sont cons‚cutifs dans ds:%0 -> renvoie le nb d'item -PROC compressdelimiter FAR - ARG @src:word,@delim:word - USES cx,dx,si,di,es - mov di,[@src] - call getlength,di - mov cx,ax - push ds - pop es - mov ax,[@delim] - xor dx,dx -@@compressitems: - repne scasb - inc dx -@@againcomp: - cmp [di],al - jne @@nosup - call delete,di,0,1 - jmp @@againcomp -@@nosup: - cmp cx,0 - jne @@compressitems - mov ax,dx - clc - ret -endp compressdelimiter - -;Met le nombre d'‚l‚ments de ds:%0 à %1 -PROC setnbitems FAR - ARG @src:word,@size:word,@delim:word - USES ax,cx,di,es - mov di,[@src] - cmp [@size],0 - je @@onlyzero - call getnbitems,di,[@delim] - cmp [@size],ax - je @@noadjust - jb @@subsome - push ds - pop es - sub ax,[@size] - neg ax - mov cx,ax - call getlength,di - add di,ax - mov ax,[@delim] - mov ah,'a' - rep stosw - xor al,al - stosb - jmp @@noadjust -@@subsome: - call getpointeritem,[@src],[@size],[@delim] - dec ax - mov di,ax -@@onlyzero: - mov [byte ptr di],0 -@@noadjust: - clc - ret -endp setnbitems - -;Renvoie la taille ax de l'‚l‚ment %0 -PROC getitemsize FAR - ARG @src:word,@item:word,@delim:word - USES cx,dx - mov cx,[@item] - call getpointeritem,[@src],cx,[@delim] - mov dx,ax - inc cx - call getpointeritem,[@src],cx,[@delim] - sub ax,dx - dec ax - clc - ret -endp getitemsize - -;Renvoie en ds:%1 l'‚l‚ment %2 de ds:%0 -PROC getitem FAR - ARG @src:word,@dest:word,@item:word,@delim:word - USES ax,cx,si,di,es - push ds - pop es - call getpointeritem,[@src],[@item],[@delim] - mov si,ax - call getitemsize,[@src],[@item],[@delim] - mov di,[@dest] - mov cx,ax - cld - rep movsb - mov al,0 - stosb - clc - ret -endp getitem - -;renvoi un pointeur ax sur l'‚l‚ment %1 de ds:%0 -PROC getpointeritem FAR - ARG @src:word,@item:word,@delim:word - USES cx,dx,di,es - mov di,[@src] - cmp [@item],0 - je @@finishpointer - push ds - pop es - call getlength,di - mov cx,ax - push ds - pop es - mov ax,[@delim] - xor dx,dx -@@countnbitems: - cmp [@item],dx - je @@finishpointer - cld - repne scasb - inc dx - cmp cx,0 - jne @@countnbitems - inc di -@@finishpointer: - mov ax,di - clc - ret -endp getpointeritem - -;Renvoie le nombre d'‚l‚ments ax de ds:%0 -PROC getnbitems FAR - ARG @src:word,@delim:word - USES cx,dx,di,es - mov di,[@src] - call getlength,di - mov cx,ax - push ds - pop es - mov ax,[@delim] - xor dx,dx - cld -@@countitems: - repne scasb - inc dx - cmp cx,0 - jne @@countitems - mov ax,dx - clc - ret -endp getnbitems - -;renvoie la taille en octets AX de la chaine point‚e en ds:%0 -PROC getlength FAR - ARG @src:word - USES cx,di,es - push ds - pop es - mov di,[@src] - mov al,0 - mov cx,0FFFFh - cld - repne scasb - neg cx - dec cx - dec cx - mov ax,cx - clc - ret -endp getlength - -;Met la taille en octets de la chaine point‚e ds:%0 a %1 -PROC setlength FAR - ARG @src:word,@size:word - USES si - mov si,[@src] - add si,[@size] - mov [byte ptr si],0 - clc - ret -endp setlength - -;met en majuscule la chaine ds:%0 -PROC uppercase FAR - ARG @src:word - USES si,ax - mov si,[@src] -@@uppercase: - mov al,[ds:si] - inc si - cmp al,0 - je @@enduppercase - cmp al,'a' - jb @@uppercase - cmp al,'z' - ja @@uppercase - sub [byte ptr si-1],'a'-'A' - jmp @@uppercase -@@enduppercase: - clc - ret -endp uppercase - -;met en majuscule la premiŠre lettre chaine ds:%0 -PROC onecase FAR - ARG @src:word - USES ax - mov si,[@src] - mov al,[ds:si] - cmp al,'a' - jb @@oneenduppercase - cmp al,'z' - ja @@oneenduppercase - sub [byte ptr si],'a'-'A' -@@oneenduppercase: - clc - ret -endp onecase - -;met en minuscule la chaine ds:%0 -PROC lowercase FAR - ARG @src:word - USES si,ax - mov si,[@src] -@@lowercase: - mov al,[ds:si] - inc si - cmp al,0 - je @@endlowercase - cmp al,'A' - jb @@lowercase - cmp al,'Z' - ja @@lowercase - add [byte ptr si-1],'a'-'A' - jmp @@lowercase -@@endlowercase: - clc - ret -endp lowercase - -;Inverse la casse la chaine ds:%0 -PROC invertcase FAR - ARG @src:word - USES si,ax - mov si,[@src] -@@invertcase: - mov al,[ds:si] - inc si - cmp al,0 - je @@endinvertcase - cmp al,'A' - jb @@invertcase - cmp al,'Z' - jbe @@goinvertcase - cmp al,'a' - jb @@invertcase - cmp al,'z' - ja @@invertcase - sub [byte ptr si-1],'a'-'A' - jmp @@invertcase -@@goinvertcase: - add [byte ptr si-1],'a'-'A' - jmp @@invertcase -@@endinvertcase: - clc - ret -endp invertcase -