Ascii Files management

From: Schmitt Louis Jean-Pierre <louis.schmitt_at_eif.ch>
Date: Wed, 20 Mar 2002 16:37:04 +0100

{
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

                        OUTIL POUR LA GESTION DES FICHIERS TEXTES INSTALLES EN MEMOIRE.
                        PERMET DE CREER UN ENREGISTREMENT DE TAILLE DYNAMIQUE ADAPTEE
                        A LA TAILLE DU FICHIER TEXTE.

=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D }

: EnrMessage01 ( n --- adr,len )

        CASE
                 FRENCH OF S" D=E9passemnt de num=E9ro de ligne dans un
Enregistrement" ENDOF
                 ENGLISH OF S" Overflow of line number of FileBuffer"
ENDOF
                 GERMAN OF S" Keine Zeile mit diesem Nummer in dem
FileBuffer" ENDOF=20
        ENDCASE
;

: EnrMessage02 ( n --- adr,len )

        CASE
                 FRENCH OF S" Taille fichier trop grande pour =EAtre charg=
=E9
dans un Enregistrement" ENDOF
                 ENGLISH OF S" Can not load the file, Size owerflow of the
FileBuffer." ENDOF
                 GERMAN OF S" Kan Dateie nich laden, FileBuffer zu kleine"
                        ENDOF=20
        ENDCASE
;

: EnrMessage03 ( n --- adr,len )

        CASE
                 FRENCH OF S" Transfert imposible, Buffer destination,
Taille insufisante" ENDOF
                 ENGLISH OF S" Can not move the Buffer, Destination Buffer
have Size owerflow " ENDOF
                 GERMAN OF S" Kan die Daten nicht ubergeben, Endbuffer zu
kleine" ENDOF=20
        ENDCASE
;

: CRLF <CRLF> 1+ W@ ; ( --- CRLF ) \ Retourne 0A0D

HEX

: ASCIIBUFFER ( <nom> taille --- adr0 ) \ Creation entete de
l'enregistrement

=09
        CREATE \ On cr=E9 la structure, on initialise le d=E9but de la liste,=
=20
        Here 24 + >R
        0 , ( here ) \ Compile un position de r=E9serve=09
        1 , ( here + 4 ) \ Compile le Num
        R@ , ( here + 8 ) \ Compile l'adresse de d=E9but de la premi=E8re
ligne=20
        R@ , ( here + 12 ) \ On compile l'adresse 0 de d=E9but de
liste
        R@ 2 + , ( here + 16 ) \ On compile la premi=E8re adresse libre dans la=
 liste
         DUP , ( here + 20 ) \ On compile la taille max
        2 , ( here + 24 ) \ On compile la taille courante=20
        1 , ( here + 28 ) \ On compile le compteur d'=E9l=E9ments
        0 C, ( here + 29 )
        0 C, ( here + 30 )
        0D C, ( here + 31 ) \ On compile une but=E9e basse pour la recherche
al=E9atoire dans
        0A C, ( here + 32 ) \ le buffer
        0D R@ C! \ On initialise le buffer avec une ligne vide
        0A R@ 1+ C! \=20
=09
        DUP ALLOT \ On r=E9serve la zone m=E9moire

        R> CELL + SWAP CELL - BLANK =09
        DOES> 24 + \ D=E9callage d'adresse sur le d=E9but de la liste
        =09
;

IMMEDIATE

DECIMAL

{ =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D POUR MEMOIRE, ON UTILISE LA MEME
STRUCTURE QUE POUR UNE ZLISTE =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D }=20

: BufLast@ 8CELL - 2@ ; ( adrr0 --- adrx0,n ) \ Retourne l'adresse de
d=E9but et le num de la derni=E8re ligne acc=E9d=E9e=20
: BufLast! 8CELL - 2! ; ( adrx0,n,adr0 --- ) \ Met =E0 jour l'adresse de
d=E9but et le num de la derni=E8re ligne acc=E9d=E9e=20

: +DECAL ( adrx --- adr+nx0 ) \ D=E9callage avant du pointeur d'adress=
e
de lignes dans un enregistrement.

        1-
        BEGIN
                   1+ DUP W@
                   CRLF =3D =20
        UNTIL
           2+
;

: -DECAL ( adrx --- adr-nx0 ) \ D=E9callage arri=E8re du
pointeur d'adresse de lignes dans un enregistrement

        2-
        BEGIN
                   1- DUP W@
                   CRLF =3D =20
        UNTIL
        =20
;

: BufferAccesTest ( Zadr0,n --- Zadr0,n ) \ Teste l'acc=E8s =E0 la liste

=09
        OVER ( zadr0,n --- zadr0,n,zadr0 )
        Zcounter @ ( zadr0,n,zadr0 --- zadr0,n,x )
        OVER ( zadr0,n,x --- zadr0,n,x,n )
        < ( zadr0,n,x,n --- zadr0,n,flag )
        OVER 1 < OR =20
        WABORT( EnrMessage01 ) ( zadr0,n,flag --- zadr0,n )

;

: GetBline ( Eadr0,n --- Eadr0,Enradrx ) \ Retourne l'adresse de d=E9but
d'une chaine num=E9ro n dans la liste.
                        \ L'acc=E8s est s=E9curis=E9. En fait cette fonction d=E9place le=
 pointeur de
liste sur l'adresse
                        \ de d=E9but d'une chaine n.

        BufferAccesTest ( Eadr0,n --- Eadr0,n )=20
>R DUP BufLast@ ( Eadr0,n --- Eadr0,Ladrx,nx )
        R> 2DUP ( Eadr0,Ladrx,nx --- Eadr0,Ladrx,nx,n )
> ( Eadr0,Ladrx,nx,n --- Eadr0,Ladrx,nx,n,flag ) \ test sens de=
 d=E9placement
        IF ( nx > n =3D d=E9placement arri=E8re .... )
                                ( Eadr0,Ladrx,nx,n, --- ... )
                ?DO
                                ( Eadr0,Ladrx --- ... )

                        2DUP 2+ >=3D
                        IF LEAVE THEN \ On quitte si but=E9e basse=20
                        -DECAL

                LOOP
                2+
        ELSE
                SWAP
                ?DO
                        +DECAL
                LOOP
        THEN
=09
=09
;=20

{
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

*************************************** VOCABULAIRE DE GESTION DES
ENREGISTREMENTS ***************************************

: COPY%LINE ( Ehandle,n --- adr,len, ) \ Retourne l'adresse et la
longueur de la ligne n de l'enregistrement=20
                        \ dont le handle est sp=E9cif=E9 par Ehandle.=20

: DELETE%LINE ( Ehandle,n --- adr,len, ) \ Efface une ligne n dans
l'enregistrement sp=E9cifi=E9 par Ehandle.
                        \ Retourne adr,len de la ligne supprim=E9e.=20

: INSERT%LINE ( adr,len,Ehandle,n --- ) \ Insert une ligne n dans
l'enregistrement sp=E9cifi=E9 par Ehandle
                =09
: REPLACE%LINE ( adr,len,Ehandle,n --- adr,len, ) \ Place la ligne
adr,len, =E0 la position n dans l'enregistrement=20
                        \ sp=E9cifi=E9 par EHANDLE.=20
                        \ L'ancienne ligne dans l'enregistrement est =E9cras=E9e. La ligne =E9cra=
s=E9e
est point=E9e par adr,len.
        =09
: APPEND%LINE ( adr,len,Ehandle --- ) \ Ajoute une ligne =E0 la suite
d'un enregistrement point=E9 par EHANDLE.
=09
: INIT%BUF ( Ehandle, --- ) \ Efface le contenu de l'enregistrement
sp=E9cifi=E9 par Ehandle, initialise tout
                        \ les pointeurs li=E9s =E0 l'enregistrement.
                =20
: FILE>BUF ( Filename,Ehandle --- ) \ Chargement de l'enregistrement
sp=E9cifi=E9 par EHANDLE =E0 partir
                        \ d'une m=E9moire de masse, ( disque dur, disquette, r=E9se=
au
etc... )
                        \ Filename est le chemin\nom du fichier source.
                        \ Cette fonction initialise compl=E9tement l'enregistrement
pour les traitements a venir.
                =09
: BUF>FILE ( Ehandle,Filename --- ) \ Transfert de l'enregistrement
sp=E9cifi=E9 par EHANDLE vers la m=E9moire de
                        \ masse. ( disque dur, disquette, r=E9seau etc... )
                               =20
: FINDWORD ( adr,len,Ehandle --- Zstring$,n ) \ Cherche un mot dans un
Texte buffer, retourne n, num=E9ro de la
                        \ ligne ou le mot est trouv=E9. Zstring$ contient la ligne pour
exploitation s'il y a lieu

=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D }

: LFCOUNT ( addr0 --- addr0,n ) \ A partir d'une adresse de d=E9but de ligne=
,
retourne la longueur de celle-ci

        DUP DUP=20
        IF 65535 13=20
                SCAN DROP OVER -=20
        THEN=20
;

: BUFPLACE ( from n to -- ) \ D=E9place une chaine Ascii de adr1, vers adr2
et place les caract=E8res de contr=F4le 0A0D en
                \ fin de chaine.=09

   =09
           TUCK OVER + >R CMOVE =20
        CRLF R> W!
   =20

;

: INSERT%LINE ( adr,len,Ehandle,n --- ) \ Insert une ligne n dans
l'enregistrement sp=E9cifi=E9 par Ehandle
                        \ Met =E0 jour l'ent=EAte de l'enregistrement.=09

>R R@ \ Sauvegarde du num=E9ro de la ligne acc=E9d=E9e
=09
        GetBline ( adr,len,Zadr0,n --- adr,len,Zadr0,Zadrx )
        DUP >R \ Sauvegarde de l'adresse de d=E9but de cette ligne
=09
        OVER ( adr,len,Zadr0,Zadrx --- adr,len,Zadr0,Zadrx,Zadr0 )
        5CELL - @ ( adr,len,Zadr0,Zadrx,Zadr0 ---
adr,len,Zadr0,Zadrx,Zadrfree )
        2DUP SWAP - ( adr,len,Zadr0,Zadrx,Zadrfree,---
adr,len,Zadr0,Zadrx,Zadrfree,Zadrx, )
                                ( adr,len,Zadr0,Zadrx,Zadrfree,Zadrx,Zadrfree ---
adr,len,Zadr0,Zadrx,Zadrfree,decalx )
=09
        OVER ( adr,len,Zadr0,Zadrx,Zadrfree,decalx ---
adr,len,Zadr0,Zadrx,Zadrfree,decalx,Zadrfree )
          5 PICK
        + 2+ ( adr,len,Zadr0,Zadrx,Zadrfree,decalx,Zadrfree --- ???? len )
        SWAP ( adr,len,Zadr0,Zadrx,Zadrfree-1,decalx,free+nx ---
adr,len,Zadr0,Zadrx,Zadrfree-1,free+nx,decalx )
        +MOVE ( adr,len,Zadr0,Zadrx,Zadrfree-1,free+nx,decalx ---
adr,len,Zadr0,Zadrx )
=09

        SWAP ( adr,len,Zadr0,Zadrx --- adr,len,Zadrx,Zadr0 )
>R ( adr,len,Zadrx,Zadr0 --- adr,len,Zadrx )
        OVER >R ( adr,len,Zadrx, --- adr,Zadrx,len )
=09
        BUFPLACE ( adr,len,Zadrx, --- )

        R> ( --- len )
        R@ Zcounter 1+! 2+ ( len --- len+2 )
        R@ Ztaille +! ( len+2 --- )
        R@ Ztaille @ ( --- Taille )
        R@ + R@ FreeZadr ! ( taille --- )
        R> ( --- Ladr0 )
        R> ( Ladr0 --- Ladr0,Ladrx )
        SWAP ( Ladr0,Ladrx --- Ladrx,Ladr0 )=20
        R> ( Ladrx,Ladr0, --- Ladrx,Ladr0,n )
        SWAP ( Ladrx,Ladr0,n --- Ladrx,n,Ladr0 )
        BufLast! ( Ladrx,n,Ladr0 --- )
=09
;

: APPEND%LINE ( adr,len,Ehandle --- ) \ Ajoute une ligne =E0 la suite
d'un enregistrement point=E9 par EHANDLE.

        DUP Zcounter @
        INSERT%LINE

;

: COPY%LINE ( Ehandle,n --- adr,len, ) \ Retourne l'adresse et la
longueur de la ligne n de l'enregistrement=20
                        \ dont le handle est sp=E9cif=E9 par Ehandle.

=09
        2DUP 2>R
        GetBline NIP
        LFCOUNT 2DUP
        Zstring$ $!
        Over 2R> ( adrx,lenx --- adrx,lenx,adrx,Ehandle,n )
        SWAP ( adrx,lenx,adrx,Ehandle,n --- adrx,lenx,adrx,n,Ehandle )
        BufLast! ( adrx,lenx,adrx,n,Ehandle --- adrx,lenx, )

;

: DELETE%LINE ( Zadr0,n --- adr,len, ) \ Supprime une chaine dans un
Enregistrement, retourne la chaine supprim=E9e.

        DUP >R
        OVER SWAP GetBline LFCOUNT \ On met la ligne sur la pile ---
Zadr0,Zadrlx,lenx =09
   =09
        2dup Zstring$ $! 2+ >R \ On Sauve la ligne dans Ztring$ taille ligne
sur R --- Zadr0,Zadrx, )
=09
                                        \ Calcul adresse d=E9but du bloc =E0 d=E9placer

        DUP R@ + \ Dupplique Zadrx ajoute lenx +1 ---
Zadr0,Zadrx,Zadrdeb )

                                        \ Calcul de la taille du bloc =E0 d=E9placer

        2 PICK FreeZadr @ OVER - \ Prend Zadr0, Cherche freeZadr - 1 soustrait
Zadrdeb --- Zadr0,Zadrx,Zadrdeb,lenbx )
        -MOVE \ Transfert=20

                                        \ Reorganisation de la liste
        R> ( Zadr0 --- Zadr0,len+1 )
        SWAP ( Zadr0,len+1 --- len+1,Zadr0 )
>R ( len+1,Zadr0 --- len+1 )
        R@ Zcounter 1-! =20
        -1 * R@ Ztaille +!
        R@ Ztaille @=20
        R@ SWAP + R@ FreeZadr !
        R@ Zmaxtaille@ R@ Ztaille @ -
        R> FreeZadr @ SWAP BLANK
        R>
        2DUP GETBLINE =20
        NIP swap 2 ROLL =20
        BufLast! =20
        Zstring$=20

;

: REPLACE%LINE ( adr,len,Ehandle,n --- adr,len, ) \ Place la ligne
adr,len, =E0 la position n dans l'enregistrement=20
                        \ sp=E9cifi=E9 par EHANDLE.=20
                        \ L'ancienne ligne dans l'enregistrement est =E9cras=E9e. La ligne =E9cra=
s=E9e
est point=E9e par adr,len.
                =09
        2DUP DELETE%LINE 2DROP
        INSERT%LINE Zstring$

;

: INIT%BUF ( Ehandle, --- ) \ Efface le contenu de l'enregistrement
sp=E9cifi=E9 par Ehandle, initialise tout
                \ les pointeurs li=E9s =E0 l'enregistrement.
                \=20

=09
>R 1 R@ Zcounter ! \ Initialise le compteur de ligne =E0 1=20
        2 R@ Ztaille ! \ Initialise la taille de l'enregistrement =E0 2=20
        R@ 2+ R@ FreeZadr ! \ Initialise la premi=E8re adresse libre dans
l'enregistrement
        R@ 1 R@ BUFLAST! \ Initialise le pointeur de la derni=E8re ligne acc=E9d=
=E9e
        R@ R@ Zmaxtaille@ BLANK \ Efface le contenu de l'enregistrement actuel
        13 R@ C! \ On compile <CRLF> pour construire une but=E9e basse pour=
 -DECAL
        10 R> 1+ C! =20

;

: FILE>BUF ( Filename,Ehandle --- ) \ Chargement de l'enregistrement
sp=E9cifi=E9 par EHANDLE =E0 partir
                \ d'une m=E9moire de masse, ( disque dur, disquette, r=E9sea=
u
etc... )
                \ Filename est le chemin\nom du fichier source.
                \ Cette fonction initialise compl=E9tement l'enregistrement
pour les traitements a venir.
=09

\ =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D On lit la taille du fichier=
 disque et on teste s'il peut
se loger dans l'Enregistrement =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
\ =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D si oui, on installe le=
 fichier.

        DUP INIT%BUF
        Ehandle ! R/O OPEN-FILE THROW >R ( c-addr u fam --- )
        R@ FILE-SIZE THROW D>S DUP
        Ehandle @ Zmaxtaille@ > WABORT( EnrMessage02 ) =09
        Ehandle @ SWAP R@=20
        READ-FILE ( c-addr u1 fileid --- u2 ior )
        THROW Ehandle @ Ztaille !
        R> CLOSE-FILE THROW
        Ehandle @ >R R@ Ztaille @ =20
        ( Ehandle ) R@ + 1+ ( Ehandle ) R@ =20
        FreeZadr !=20

=09

=09

\ =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D On initialise les pointeurs de=
 l'enregistrement selon le
fichier charg=E9 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D

=09
        PAD OFF
        EHandle @
        BEGIN
                     PAD 1+!
                     LFCOUNT=20
                + 2+ DUP
                Ehandle @=20
                FreeZadr @ >=3D
        UNTIL
        DROP PAD @ Ehandle @
        Zcounter !
=09

        13 R@ Ztaille @ R@ + C! \ Ajoute une fermeture de ligne LFCR
        10 R@ Ztaille @ R@ + 1+ C!
        2 R@ FREEZADR +!
        2 R> Ztaille +! =20

=09
;

: BUF! ( Ehandle1 to Ehandle2 --- ) \ Copie un enregistrement
Ehandle1 vers un enregistrement Ehandle2.
                \ Le contenu pr=E9c=E9dent de l'enregistrement destination est =E9cras=E9.

=09
        OVER Ztaille @ OVER Zmaxtaille@ > ( Ehandle1,Ehandle2, ---
Ehandle1,Ehandle2,flag )
        WABORT( EnrMessage03 ) ( Ehandle1,Ehandle2,flag --- Ehandle1,Ehandle2, )
        DUP INIT%BUF ( Ehandle1,Ehandle2, --- Ehandle1,Ehandle2, )
        OVER DUP Ztaille @ 2 PICK SWAP MOVE ( Ehandle1,Ehandle2, ---
Ehandle1,Ehandle2, )
        OVER Ztaille @ OVER Ztaille !
        OVER FreeZadr @ OVER FreeZadr !
        OVER Zcounter @ OVER Zcounter !
        2DROP

;
=09

: BUF>FILE ( Ehandle,Filename --- ) \ Transfert de l'enregistrement
sp=E9cifi=E9 par EHANDLE vers la m=E9moire de masse.
                \ ( disque dur, disquette, r=E9seau etc... )
        =09

        WORK$ ERASE$ WORK$ $!
        EHANDLE !
        WORK$ R/W CREATE-FILE 0<> ABORT" Erreur Fichier"
>R EHANDLE @ DUP Ztaille @ R@ WRITE-FILE THROW
        R> CLOSE-FILE THROW

;
=09

: FINDFIRSTWORD ( adr,len,Ehandle --- Zstring$,n ) \ Cherche un mot dans
un Texte buffer, retourne n, num=E9ro de la
                        \ ligne ou le mot est trouv=E9. Zstring$ contient la ligne pour
exploitation s'il y a lieu.
                        \ Si le mot est trouv=E9 n est diff=E9rent de z=E9ro si non n =3D 0
                        \ Le mot FINDFIRSTWORD initialise le pointeur BufLast sur la premi=E8re
ligne. On pourra se servir
                        \ de buflast pour proc=E9der =E0 une recherche s=E9quentielle dans le buf=
fer
de texte. Voir le mot
                        \ FINDNEXTWORD

        FindFlag OFF
        EHANDLE !
        WORK$ $!
        EHANDLE @ Zcounter @ 1
        ?DO
                EHANDLE @ I COPY%LINE ( Ehandle,n --- adr,len, )
                 WORK$ SEARCH(NC) NIP NIP
                IF
                           I FindFlag !
                        LEAVE
                THEN
        =09
        =09
        LOOP
        Zstring$=20
        FindFlag @=20
;

: FINDNEXTWORD ( adr,len,Ehandle --- Zstring$,n ) \ Cherche un mot dans un
texte buffer. La recherche commence
                        \ =E0 partir de la position suivante point=E9e par BUFLAST@. Si le mot
recherch=E9 est trouv=E9, alors
                        \ n est le num=E9ro de la ligne contenant ce mot. Zstring$ contient cette
ligne pour un traitement=20
                        \ =E9ventuel.

        FindFlag OFF
        EHANDLE !
        WORK$ $!
        EHANDLE @ Zcounter @=20
        EHANDLE @ BufLast@ NIP
        ?DO
                EHANDLE @ I COPY%LINE ( Ehandle,n --- adr,len, )
                 WORK$ SEARCH(NC)
                IF
                           I FindFlag !
                        LEAVE
                THEN
        LOOP
        Zstring$=20
        FindFlag @=20

;

 : TYPE%BUF ( Ehandle --- ) \ Affiche le contenu d' un enregistrement

   DUP Zcounter @
    0
   ?DO
   =20
        LFCOUNT 2DUP CR TYPE
        + 2+ =20
    LOOP
    DROP
;

\\

12000 ASCIIBUFFER Test1

12000 ASCIIBUFFER Test2

S" C:\CONFIG.FTH" Test1 FILE>BUF

\\

: AFFICHE
CR S" Zcounter =3D " TYPE Tester Zcounter @ .
CR S" FreeZadr =3D " TYPE Tester FreeZadr @ .
CR S" Buflast@ =3D " TYPE Tester BUFLAST@ . .
CR S" Ztaille =3D " TYPE Tester Ztaille @ .
CR CR CR
;

S" Test 1 pour voir le comportement" Tester APPEND%LINE
S" Test 2 pour voir le comportement" Tester APPEND%LINE
S" Test 3 pour voir le comportement" Tester APPEND%LINE
S" Test 4 pour voir le comportement" Tester APPEND%LINE
S" Test 5 pour voir le comportement" Tester APPEND%LINE
S" Test 6 pour voir le comportement" Tester APPEND%LINE
S" Test 7 pour voir le comportement" Tester APPEND%LINE

\\
----------------------------------------------------------------------
sftalk_at_forth.com The SwiftForth programming discussion email list
To unsubscribe, send subject "unsubscribe sftalk" to listar_at_forth.com
For help with listar commands, send subject "help" to listar_at_forth.com
Archives are located at http://www.forth.com/sftalk -- check them out!
Search the archives! Visit http://www.forth.com/search for details.
Received on Wed Mar 20 2002 - 07:38:35 PST


Subscribe to our e-mail list service. It's free for all SwiftForth and SwiftX users!

This archive was generated 09-Feb-2012. Archive updated nightly.