Bibliothèque personnel c:\masm32\persolib

Lignes a ajouter au source

PUBLIC InfosFichiers   ;section déclarations

        InfosFichiers           WIN32_FIND_DATA <> ;section data

 Toutes les fonctions de traitement de chaines ne modifient que les registres utilisés pour la réponse

Les fonctions de chaines copient le fonctionnement VB,inutile de se demander si elles traitent les chaines terminées par un zéro , ou les chaines terminées par un retour ligne,les deux sont traités pareillement.Les fonctions utilisant leur propre tampon possède un byte a zéro avant le tampon.La scrutation des caractères peut ainsi s'arréter sur un zéro dans un sens ou dans l'autre,rendant impossible tout débordement

Librairies devant être présentes dans le source,lz32,user32,kernel32,masm32

ChargerFichierMem PROTO :DWORD,:DWORD

 

Adresse du nom de fichier,adresse de la structure FichMem en data

        FichMem    struc

               Hmem     dd ?

               Mpoint   dd ?

               Taille   dd ?

        FichMem    ends

Prend le chemin courant ,par défaut(utilise SetTestFichier).Test l'existence du fichier.Rajoute un zero ,en mémoire ,en fin de fichier.Referme le fichier après l'avoir lu.Succès Hmem,handle de mémoire,Mpoint pointeur sur le début,Taille,taille sans compter le zéro,eax différent zero.
 Echec ,eax FALSE 

Utilise les définitions externes suivantes (a ajouter dans les data du source)

InfosFichiers:WIN32_FIND_DATA

GetParaLigneCommande PROTO :DWORD,:DWORD

 

Numéro de 0 à N du paramètre voulu,adresse chaine ou écrire le paramètre
Accepte tous les paramètres de WIN98 ou XP,y compris le passage d'un nom long sans séparateur " dans un racourci vers le programme qui l'utilise.
Si le numéro est 0 renvoit le nom de l'éxécutable.

Retour eax = 0,plus de paramètres sinon,taille chaine écrite 

LongZtexte PROTO :DWORD,:DWORD

 

Adresse des données,maximum de longueur de recherche
Le caractère de terminaison est le zéro ou 13,retour ligne
 Retour eax = 0,échec ,eax >0 longueur  

RetrouveMessageErreur PROTO :DWORD

 

Placer simplement les deux lignes suivantes à l'endroit ou va se produire l'erreur

                .if eax == INVALID_HANDLE_VALUE   ou tout autre

                        InsTxt MsgERR000, ""            ; Nom de la fonction ayant echoué

                        invoke RetrouveMessageErreur, ADDR MsgERR000    ; la boite de message

                .endif

C'est tout , le message apparait en français et c'est écoeurant de facilité. 

chercherChaine PROTO :DWORD,:DWORD,:DWORD,:DWORD

 

Position de Début de recherche de 1 à N,adresse de la chaine ou s'effectue la recherche,adresse de la chaîne chercher,0 comparaison binaire ou 1 comparaison litéralle(minus = majus)

La longueur de recherche est limité a 256 bytes , la longueur de la chaine ou s'effectue la recherche s'arrête sur un zéro ou un retour ligne
Au retour eax = 0 échec,eax > 0,position du premier caractère trouvé,retiré un à cette valeur pour avoir la position relative du caractère à l'adresse de la chaîne.

ScrutationFichierTexte PROTO  :DWORD

 

adresse de la structure INFOSTEXTASCII

INFOSTEXTASCII struct

        Hfichier      dd 0                Handle , pointeur , taille d'un fichier texte en mémoire

        Pfichier      dd 0

        Tfichier      dd 0

        NBlignesODOA  dd 0       le nombre de lignes complètes

        NBlignes      dd 0               le nombre de lignes sans retour ligne,max 1

        NumeroLigne   dd 0           le numero de ligne voulue

        LenLigne      dd 0              longueur de la ligne NumeroLigne sans le 0D0A

        Pligne        dd 0               Le pointeur sur la ligne de numéro NumeroLigne après 2 ou 3

        InfoODOA      dd 0       ;se termine par 0D0A ? oui 1 s'applique a la ligne ou au fichier

        Tache         dd 0              de 1 à 4 (fonctions 1 to 4)

        Hresultat     dd 0   réservé,ne rien écrire

        Presultat     dd 0   réservé,ne rien écrire

        Tresultat     dd 0   réservé,ne rien écrire

        Hsortie       dd 0   éventuelle fichier de sortie,placer le handle içi

INFOSTEXTASCII ends
 

 

 

 Tache = 1 crée un tableau (Hresultat) avec le pointeur sur les lignes,leurs longueurs
au retour de la Tache = 1,eax = 0 ,fichier non ASCII,sinon NBlignesODOA contient le nombre de lignes se terminant par un retour ligne .NBlignes donne le nombre de lignes sans retour ligne,en principe 0 ou 1.Cest la tache d'initialisation ,le fichier texte doit etre en mémoire..

 Tache = 2  indiqué le NumeroLigne,avant de l'appeler
renvoi LenLigne ,la longueur de la ligne numéro N sans le retour ligne,Pligne le pointeur sur la ligne.InfoODOA est a 1,si la ligne se termine par un retour ligne,0 autrement.Les résultats sont a prendre dans la structure

 Tache = 3 ,même chose que 2 + ecx = LenLigne,esi = Pligne

 

 Tache = 4 ,ferme tous les handles y compris l'éventuelle fichier de sortie

 

Cette fonction est réutilisée par MaitreTexte

CopierFichier PROTO :DWORD,:DWORD

 

adresse du chemin de fichier à copier, adresse du chemin du nouveau fichier

Les chemins sont en nom longs,sinon la fonction n'aurait pas d'intérêt

 retour eax = 0 échec,sinon différent de zéro

OuvrirLecture PROTO :DWORD

 

Adresse du chemin de fichier à ouvrir en lecture.

 retour eax = INVALID_HANDLE_VALUE échec , sinon handle du fichier

OuvrirEcriture PROTO  :DWORD

 

Adresse du chemin de fichier à ouvrir en écriture

retour eax = INVALID_HANDLE_VALUE échec , sinon handle du fichier

SetTestFichier PROTO :DWORD

 

adresse du chemin de fichier dont on veut tester l'existence

Si pas de chemin,on prend le chemin courant par défaut
 retour eax = 0 échec sinon adresse d'un chemin complet valide dans eax,génère un message si le fichier n'existe pas.

InfosFichiers (WIN32_FIND_DATA) contient des informations sur le fichier

Données externes devant se trouver en data
InfosFichiers:WIN32_FIND_DATA
 

 MaitreTexte PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD

 

 handle de la fenêtre appelante,adresse d'un nom de fichier désignant le fichier texte a analyser,adresse de INFOSTEXTASCII en data ,adresse d'un nom de fichier désignant le fichier de sortie ou NULL,adresse du proc à appeler (callback fonction) une fois que toutes les opérations sont finis

 Se charge de toutes les opérations nécessaires pour renseigner ScrutationFichierTexte , le proc appeler n'a plus qu'a utiliser les renseignements fournis par ScrutationFichierTexte positionné en tache 3 par défaut.

MaitreTexte réalise l'équivalent des instructions basiques (VB6) suivantes:
'--------------------------------------

NouveauFonction = "C:\test\sort.txt"

reference = FreeFile

Open NouveauFonction For Input As #reference

'---------------------------------

Dim nouvelleliste() As String

ReDim nouvelleliste(1)

Dim Etatsnouvelleliste() As Boolean

'---------------------------------

Nouveau = "c:\test\header.txt"

sortie = FreeFile

Open Nouveau For Output As #sortie

'---------------------------------

 nombre = 1

Do Until EOF(reference)

    Line Input #reference, ligne

    nouvelleliste(nombre) = ligne

    ligne = nouvelleliste(nombre)

    nombre = nombre + 1

    ReDim Preserve nouvelleliste(nombre)

passereference:

Loop

Close reference

 

   test = Len(ligne)

 

La fonction appeler(callback) n'a plus qu'a analyser les lignes

 "CALLBACK" PROTO :DWORD,:DWORD

 

 Handle de la fenêtre appelante,adresse de la structure INFOSTEXTASCII en data renseignée par MaitreTexte

 La tache par défaut est la tache 3.Onaccède aux lignes de la manière suivante:

mov ebx,Infotextascii ;(adresse du tableau)
mov (INFOSTEXTASCII ptr [ebx]).NumeroLigne,1
invoke ScrutationFichierTexte,Infotextascii ;(adresse du tableau)
esi pointe sur la phrase a analyser,ecx contient sa longueur

La callback doit se terminer en refermant tous les handles ouverts de la maniere suivante
               mov ebx,Infotextascii

                mov TEXTE.Tache,4               ;fermer tout,remise a zero structure dans data

                invoke ScrutationFichierTexte,Infotextascii             

 avec TEXTE TEXTEQU <(INFOSTEXTASCII ptr [ebx])>

 

La callback tirera un énorme avantage a réutilisé les fonctions , LongZtexte , chercherChaine , Trim , Mid , ChainesEgales,de cette librairie, qui reconnaissent toutes les chaines terminées par un zéro ou un retour ligne, ce qui est le cas içi.Lorsqu'il est nécessaire de créer une nouvelle chaine,ces fonctions renvoient l'adresse d'un tampon ou trouver la nouvelle chaine.Si vous avez l'habitude de VB , vous ne serez pas trop dépaysés. chercherChaine fonctionne comme Instr.

 

 TestFichier PROTO :DWORD

 

 adresse d'un nom de fichier

 Se contente de vérifier l'existence du fichier,échec 0,réussite 1 InfosFichiers rempli

Trim PROTO  :DWORD

 

 adresse d'une chaine de caractères terminée par un zero ou un 0dh,retour ligne

Suprime les espaces,tab en début et fin de chaine,échec eax=0,réussite eax adresse de la nouvelle chaine,ecx nombre de caractères de la chaine sans compter le zéro
Si la chaine ne comportait que des espaces,tab,retourne une chaine de longueur nulle,ecx=0

la chaine doit avoir une longueur maximum de MAX_PATH 

Mid PROTO  :DWORD ,:DWORD ,:DWORD

 

 adresse de chaine,position de 1 à N,nombre de caractères à extraire ou NULL

 extrait les caractères de la chaine,échec eax=0,réussite eax adresse de la nouvelle chaine terminée par un zéro,ecx,nombre de caracteres de la nouvelle chaine,sans compter le zéro.Si le nombre de caractères a extraire est NULL,extraction de position à fin de chaine.

La chaine initiale peut se terminer par un zéro ou un retour ligne,elle doit avoir une longueur max de MAX_PATH.

 ChainesEgales PROTO  :DWORD,:DWORD,:DWORD

 

 adresse chaine 1,adresse chaine 2,mode binaire ou littérale (0 ou 1)

Les deux chaines peuvent se terminer par un zéro ou un retour ligne.echec eax=0,réussite eax=1.

Les deux chaines sont déclarées égales si leurs longueurs sont identiques et si leurs caractères , dans le mode de comparaison choisi ,sont égaux .En mode littéral (1) ,minuscules = majuscules 

Copier PROTO  :DWORD,:DWORD

 

 Adresse du tampon recevant la copie,adresse de la chaine à copier

 échec eax,ecx NULL réussite:eax Adresse du tampon recevant la copie,ecx nombre de caractères copier,sans compter le zéro.Cela permet d'enchainer les copies,eax+ecx=nouvel emplacement de copies

La chaine à copier peut se terminer par un zero ou un retour ligne,la chaine a copier doit avoir une longueur max de MAX_PATH(260),le nombre de caractères max copier dans le tampon sera de MAX_PATH +1

LettreAvantLettreApresmot PROTO  :DWORD,  :DWORD

 

 

 adresse du mot terminer par un zero,adresse ou se situe ce mot dans une phrase

 Al contient le code du caractere avant le mot,AH contient le code du caractere après le mot.
Typiquement,la fonction s'utilise après chercherChaine