![]() |
||
| Home | SwiftForth Archive | SwiftX Archive | |

{
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=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
This archive was generated by hypermail 2.2.0 : Fri Nov 21 2008 - 03:04:22 PST