; Auto- indentage pour Sweetel2 ; ˝Xavier ROCHE '93 ; ; ~C:Indent%(L:V:AdrStr%(0),L:V:Len%(0),L:V:Ind&(0),Nb_ligne&,Max_ligne&) opt a+,o+,p+,o1+,o2+ Pointeur: equr d0 Inc: equr d1 AdrStr: equr a0 AdrLen: equr a1 AdrDec: equr a2 NewStr: equr a3 NewLen: equr d2 NewDec: equr d3 Compare: equr d4 Maxl: equr d5 Move.L 4(Sp),AdrStr ; Adr des adrs.L de chaines Move.L 8(Sp),AdrLen ; Adr des des longueurs.W Move.L 12(Sp),AdrDec ; Adr des d‚calages.W Move.W 16(Sp),Pointeur ; Nombre de lignes en gros Move.W 18(Sp),Maxl ; Nombre max de lignes en gros Subq.W #1,Pointeur ; dbra Ble Fin ; pas assez de lignes! Sub.W Pointeur,Maxl ; reste … remplir Moveq.L #0,Inc ; incr‚mentation (indentage) Loop: Move.W Inc,NewDec ; incr‚ment indentage actuel Move.L (AdrStr)+,NewStr ; adr actuelle chaine Move.W (AdrLen)+,NewLen ; longueur Beq Boucle ; len=0 Cmpi.W #4,NewLen ; len=>4? Blt.S SmallStr ; non! BigStr: ; Incr‚menter indentage Cmp.L #"NEXT",(NewStr) Beq Dec_indent Cmp.L #"UNTI",(NewStr) Beq Dec_indent Cmp.L #"ENDI",(NewStr) Beq.S Dec_indent Cmp.L #"RETU",(NewStr) Beq.S Dec_indent ; D‚cr‚menter indentage Cmp.L #"FORS",(NewStr) Beq.S Inc_indent Cmp.L #"REPE",(NewStr) Beq.S Inc_indent Cmp.L #"PROC",(NewStr) Beq.S Inc_indent Cmp.L #"FOR ",(NewStr) Beq.S Inc_indent ; Retrait Cmp.L #"ELSE",(NewStr) Beq.S Ret_indent SmallStr: Cmpi.W #3,NewLen ; len=>3? Blt.S Low2Str ; 2 char Move.L (NewStr),Compare Clr.B Compare ; 3 octets only! Lsr.L #8,Compare ; d‚calage pour comparaison Cmp.L #"FOR",Compare Beq.S Inc_indent Cmp.L #"IF ",Compare Beq.S Inc_indent Cmp.L #"DO ",Compare Beq.S Inc_indent Low2Str: Cmpi.W #2,NewLen Blt.S LowStr Cmp.W #"IF",Compare Beq.S Inc_indent LowStr: ; user indent Cmp.B #"{",(NewStr) Beq.S Inc_indent Cmp.B #"}",(NewStr) Beq.S Dec_indent Cmp.B #"\",(NewStr) Beq.S Stop Bra.S Boucle Inc_indent: Addq.W #2,Inc ; test‚ aprŠs! ;;Cmpi.W #40,Inc ; indentage >40 ? ;;Blt.S Boucle ;;Move.W #40,Inc ; limite max Bra.S Boucle Dec_indent: Subq.W #2,Inc ;;Bge.S Set ; >0 ;;Clr.W Inc ; minimum 0 en indent! Set: Move.W Inc,NewDec Bra.S Boucle Ret_indent: Subq.W #2,NewDec ; retrait Bge.S Boucle Clr.W NewDec Boucle: ; Tester si inc/dec est entre 0 et 40! Tst.W NewDec Bge.S BT2 Clr.W NewDec Bt2: Cmp.W #40,NewDec Blt.S BS Move.W #40,NewDec BS: Move.W NewDec,(AdrDec)+ ; enregistrer dec actuel Dbra Pointeur,Loop Stop: Tst.W MaxL ; reste … remplir? Ble.S Fin Fill: Move.W NewDec,(AdrDec)+ Dbra Maxl,Fill Fin: Clr.L D0 ; Ok RTS