LEX 'CLLEX' * (c) Copyright PPC Paris 1986 ************************************************** * * EDIT F1 * F1 LEX 2326 01/01/00 00:00 * MERGE F2 * ************************************************** CON(2) #E1 Id CON(2) 255 Lowest Token CON(2) 0 Highest Token CON(5) 0 Next Lex-table offset NIBHEX F No speed table REL(4) 1+TxTbSt Offset to text table CON(4) 0 No message REL(5) POLHND Offset to poll handler TxTbSt NIBHEX 1FF Text Table End fLEX EQU #E208 Type de fichier = LEX pEDIT EQU #2B pMRGE2 EQU #2F CURRST EQU #2F55D Adresse fichier courant eFPROT EQU #3D "ERR: File Protect" PSHUPD EQU #08F0D POPUPD EQU #08F3E MGOSUB EQU #1AF01 MVMEM+ EQU #0133C MOVEU3 EQU #1B177 BSERR EQU #0939A LEX? LC(5) =fLEX ?A=C A RTNYES Retour avec Cy=1 si Lex RTN Retour avec Cy=0 sinon POLHND LC(2) =pEDIT ?C=B B GOYES hEDT10 LC(2) =pMRGE2 ?C=B B GOYES hMRG10 RTNSXM Poll non reconnu hEDT10 GOSUB LEX? Fichier Lex ? GOC hEDT20 Oui. On autorise EDIT RTNSXM Non. On ignore hEDT20 RTNCC Cy=0, pas d'erreur * * P = 0 * D1 = ^ en-tÁte de F2 * A(A) = type de F2 * CURRST = ^ en-tÁte de F1 * hMRG10 GOSUB LEX? F2 = LEX ? GOC hMRG20 oui RTNSXM non * * F2 est bien du type LEX * hMRG20 D1=D1+ 16 D1=D1+ 4 D1 := ^ protection de F1 A=DAT1 P D1=D1- 4 D1=D1- 16 LC(1) 2 A=A&C P ?A#0 P GOYES fprot * * F2 n'est pas privÅ * D0=(5) =CURRST CURRST = adresse de F1 C=DAT0 A D0=C D0 := ^ F1 D0=D0+ 16 D0 := type de F1 A=0 A A=DAT0 4 A(A) := type de F1 GOSUB LEX? GOC hMRG30 RTNSXM F1 n'est pas un LEX * * F1 est bien du type LEX * hMRG30 D0=D0+ 4 D0 := ^ protection de F1 A=DAT0 S ?A=0 S GOYES hMRG35 fprot LC(4) =eFPROT File protect GOTO bserr * * F1 n'est ni privÅ, ni sÅcurisÅ * hMRG35 AD1EX R1 := D1 (^ en-tÁte de F2) R1=A : D0=D0+ 12 D0 := ^ FILEND de F1 CD0EX R0 := D0 (^ FILEND de F1) R0=C GOSBVL =PSHUPD adr. de F2 È rÅactualiser A=R1 A(A) := ^ en-tÁte de F2 C=0 A LC(2) 32 Offset de FILEND A=C+A A D1=A D1 := ^ FILEND de F2 A=DAT1 A Taille de F2 LC(2) 5 A=A-C A Taille de F2 - 5 B=A A R2=A * * D1 = ^ FILEND de F2 * B(A) = A(A) = Longueur exacte de ce qu'on ajoute * R0 = ^ FILEND de F1 * R1 = ^ en-tÁte de F2 * R2 = Longueur exacte de ce qu'on rajoute * A=R0 D0 := ^ FILEND de F1 D0=A : C=R2 RSTK := taille È ajouter RSTK=C : C=A A RSTK := ^ FILEND de F1 RSTK=C : A=DAT0 A A(A) := taille de F1 CD0EX C(A) := ^ FILEND de F1 D0=C : C=C+A A C(A) := ^ fichier aprÉs F1 D0=D0- 16 D0 := ^ en-tÁte de F1 D0=D0- 16 : AD0EX A(A) := ^ en-tÁte de F1 ACEX A R3=A Sauvegarde de la fin de F1 * * A(A) = ^ fin du fichier F1 * B(A) = longueur È dÅplacer * C(A) = ^ en-tÁte de F1 * GOSBVL =MGOSUB CON(5) =MVMEM+ GONC hMRG50 bserr GOVLNG =BSERR * * A ce stade, un trou a ÅtÅ crÅÅ È la fin de F1 * pour y loger F2. Le travail suivant consiste * È y amener F2. * Note pour la comprÅhension gÅnÅrale : le * fichier F1 n'a pas bougÅ. Seul F2, peut-Átre... * C'est la raison pour laquelle seule l'adresse * de F2 a ÅtÅ placÅe dans la pile des GOSUBs. * hMRG50 C=RSTK C(A) := ^ FILEND de F1 R0=C R0 := ^ FILEND de F1 C=RSTK C(A) := taille de F2 R2=C R2 := taille de F2 GOSBVL =POPUPD l'adresse de F2 C=D A R1=C R1 := ^ FILEND de F2 * * R0 = ^ FILEND de F1 * R1 = ^ FILEND de F2 * R3 = ^ dÅbut du trou (^ fin de F1) * * DÅplacement du fichier È merger. * C=R3 D1=C D1 := Start of dest. C=0 A LC(2) 37 A=R1 A=A+C A D0=A D0 := Start of source (F2) C=R2 Block length (long. de F2) GOSBVL =MOVEU3 * * Une partie du fichier F2 a ÅtÅ maintenant amenÅe * dans le trou laissÅ È la fin de F1. Il ne reste * plus qu'È actualiser le chaÑnage des lex, et ce * sera terminÅ * C=R0 C(A) := ^ FILEND de F1 D0=C D0=D0+ 11 D0 := ^ Lex Chain GONC hMRG70 B.E.T. * * La boucle suivante parcourt la "lex-chain" * jusqu'È trouver une entree nulle, signifiant * ainsi la fin de la recherche. Le dernier lex * de F1 est trouvÅ. * hMRG60 CD0EX C(A) := ^ Lex-Chain C=C+A A D0=C D0=D0+ 6 D0 := Next-Lex du suivant hMRG70 A=DAT0 A ?A#0 A GOYES hMRG60 * * La boucle est terminÅe, D0 pointe sur le * "Next-Lex offset" du dernier lex de F1 * AD0EX A(A) := ^ next-lex D0=A C=R3 Adresse de la fin de F1 C=C-A A Offset dernier Lex-Chain DAT0=C A Actualisation * * Retour È l'appelant, avec la saine sensation * du travail bien fait. AllÅluia ! * XM=0 RTNCC END A bientÂt...