(*#debug(line_num=>on)*) MODULE edit5; IMPORT Storage,IO,FIO,Str,Window,Lib,BiosIO; CONST m_texte = 720; fenetre_titre = Window.WinDef(0,0,79,0,Window.Black, Window.Cyan,FALSE,FALSE,FALSE, FALSE," ",Window.Black,Window.Black); fenetre_texte = Window.WinDef(0,1,79,23,Window.Black, Window.LightGray,TRUE,FALSE,FALSE, FALSE," ",Window.Black,Window.Black); fenetre_bas_ecran= Window.WinDef(0,24,79,25,Window.Black, Window.Cyan,FALSE,FALSE,FALSE, FALSE," ",Window.Black,Window.Black); menu_principal = " Menu principal : I)ns‚rer D)‚truire A)juster C)hercher B)loc Q)uitter"; TYPE t_m_texte = [0..m_texte]; t_ligne = ARRAY[0..78] OF CHAR; t_texte = ARRAY t_m_texte OF t_ligne; t_nom_fichier = ARRAY[0..63] OF CHAR; VAR texte : t_texte; (* structure contenant le texte *) n_texte : t_m_texte; (* nombre de lignes utilis‚es *) tampon_plein : BOOLEAN; (* indique si structure pleine *) fen_titre, (* nos 3 fenetres sur l'‚cran *) fen_texte, fen_bas_ecran : Window.WinType; fen_en_cours : Window.WinType; numero_ligne : t_m_texte; (* numero de ligne par rapport au debut du fichier *) colonne : [1..80]; (* position curseur sur ecran en x *) nom_fichier : t_nom_fichier; haut : t_m_texte ; (* position du d‚but de l'ecran dans le fichier *) insert : BOOLEAN; y_texte : [1..23]; (* position curseur sur ecran en y *) i_texte : t_m_texte;(* variable d'usage g‚n‚ral *) debut_bloc, fin_bloc : [0..m_texte+1]; largeur_tabulation : CARDINAL; delimiteurs, ascii, alpha : Str.CHARSET; PROCEDURE initialisations; VAR chaine : ARRAY[0..79] OF CHAR; BEGIN FIO.IOcheck := FALSE; Lib.EnableBreakCheck; tampon_plein := FALSE; fen_titre := Window.Open(fenetre_titre); fen_texte := Window.Open(fenetre_texte); fen_bas_ecran := Window.Open(fenetre_bas_ecran); insert := TRUE; Window.Use(fen_bas_ecran); chaine := (" Colonne : Ligne : Nom du fichier : Mode : "); Window.GotoXY(1,1); IO.WrStr(chaine); colonne := 1; numero_ligne := 0; haut := 0; largeur_tabulation := 8; ascii := Str.CHARSET{CHR(0)..CHR(255)}; delimiteurs := Str.CHARSET{CHR(0)..CHR(64),CHR(91)..CHR(96),CHR(123)..CHR(255)}; alpha := Str.CHARSET{CHR(65)..CHR(90),CHR(97)..CHR(122)};; debut_bloc := m_texte+1; fin_bloc := m_texte +1; Window.Use(fen_texte); END initialisations; PROCEDURE entete(chaine : ARRAY OF CHAR); BEGIN Window.Use(fen_titre); Window.GotoXY(1,1); Window.ClrEol; IO.WrStr(chaine); Window.Use(fen_texte); END entete; PROCEDURE bas_d_ecran; BEGIN Window.Use(fen_bas_ecran); Window.TextColor(Window.Red); Window.GotoXY(12,1); IO.WrCard(colonne,2); Window.GotoXY(23,1); IO.WrCard(numero_ligne+1,3); Window.GotoXY(45,1); IO.WrStr(nom_fichier); Window.GotoXY(65,1); IF insert THEN IO.WrStr("Insertion ") ELSE IO.WrStr("Remplacement"); END; Window.Use(fen_texte); END bas_d_ecran; PROCEDURE positionne_curseur; VAR l : CARDINAL; BEGIN IF numero_ligne > n_texte THEN numero_ligne := n_texte END; l := Str.Length(texte[numero_ligne]); IF colonne > l+1 THEN colonne := l+1; END; Window.GotoXY(colonne,numero_ligne+1-haut); bas_d_ecran; END positionne_curseur; PROCEDURE curseur_gauche; BEGIN IF colonne >1 THEN DEC(colonne) END; positionne_curseur; END curseur_gauche; PROCEDURE curseur_droite; BEGIN IF colonne < 80 THEN INC(colonne); END; positionne_curseur; END curseur_droite; PROCEDURE affiche_page; VAR j : CARDINAL; BEGIN Window.Clear; i_texte := haut; j := 1; WHILE (i_texte <= haut + 22) AND (i_texte <= n_texte) DO (* test de non d‚passement de la fenetre et de la fin du fichier *) Window.GotoXY(1,j); IO.WrStr(texte[i_texte]); INC(i_texte); INC(j); END; positionne_curseur; bas_d_ecran; END affiche_page; PROCEDURE curseur_haut; BEGIN IF (numero_ligne > 0) AND (haut > 0) THEN IF numero_ligne = haut THEN DEC(haut); Window.CursorOff; Window.GotoXY(1,1); Window.InsLine; IO.WrStr(texte[numero_ligne-1]); Window.CursorOn; END; END; IF numero_ligne > 0 THEN DEC(numero_ligne); END; positionne_curseur; END curseur_haut; PROCEDURE curseur_bas; BEGIN IF numero_ligne < n_texte THEN INC(numero_ligne) END; IF numero_ligne >= haut + 23 THEN INC(haut); Window.CursorOff; Window.GotoXY(1,1); Window.DelLine; Window.GotoXY(1,23); IO.WrStr(texte[numero_ligne]); Window.CursorOn; END; positionne_curseur; END curseur_bas; PROCEDURE page_haut; BEGIN IF haut >0 THEN (* evite le scintillement de l'‚cran *) IF numero_ligne >= 23 THEN DEC(numero_ligne,23); IF haut >= 23 THEN DEC(haut,23); ELSE haut := 1; END; ELSE numero_ligne := 0; haut := 0; END; affiche_page; END; END page_haut; PROCEDURE page_bas; BEGIN IF numero_ligne <= n_texte -23 THEN INC(numero_ligne,23); INC(haut,23); ELSE numero_ligne := n_texte; haut := n_texte; END; affiche_page; END page_bas; PROCEDURE augmente; BEGIN END augmente; PROCEDURE home; BEGIN colonne := 1; positionne_curseur; END home; PROCEDURE fin; BEGIN colonne := 80; positionne_curseur; END fin; PROCEDURE debut_de_fichier; BEGIN haut := 0; numero_ligne := 0; colonne := 1; affiche_page; END debut_de_fichier; PROCEDURE fin_de_fichier; BEGIN numero_ligne := n_texte; haut := numero_ligne -5; colonne := 80; affiche_page; END fin_de_fichier; PROCEDURE decale_haut; VAR l_num_ligne : t_m_texte; l_col : [0..80]; BEGIN l_num_ligne := numero_ligne; l_col := colonne; colonne := 1; numero_ligne := haut+23; curseur_bas; numero_ligne := l_num_ligne; colonne := l_col; positionne_curseur; END decale_haut; PROCEDURE decale_bas; VAR l_num_ligne : t_m_texte; l_col : [0..80]; BEGIN l_num_ligne := numero_ligne; l_col := colonne; colonne := 1; numero_ligne := haut; curseur_haut; numero_ligne := l_num_ligne; colonne := l_col; positionne_curseur; END decale_bas; PROCEDURE mot_droit; VAR i : CARDINAL; BEGIN (* 2 cas : si caractŠre actuel est d‚limiteur alors progresser jusqu'au premier caractŠre alphanum‚rique. si caractŠre actuel alphanum‚rique alors : 1: sauter tous les caractŠres alphanum‚riques puis 2: faire comme ci-dessus. *) i := Str.Length(texte[numero_ligne]); IF colonne = (i+1) THEN (* si curseur en bout de ligne alors si ligne en-dessous passer ligne suivante *) IF numero_ligne < n_texte THEN INC(numero_ligne); IF numero_ligne >= haut+23 THEN decale_haut; END; colonne := 1; i := Str.Length(texte[numero_ligne]); IF NOT( texte[numero_ligne][colonne-1] IN alpha) THEN WHILE texte[numero_ligne][colonne-1] IN delimiteurs DO INC(colonne); END; END; positionne_curseur; END; ELSE IF colonne < i THEN (* le curseur n'est pas en bout de ligne *) IF NOT (texte[numero_ligne][colonne] IN delimiteurs) THEN (* il faut sauter les caractŠres alphanum‚riques *) WHILE (colonne < i) AND NOT (texte[numero_ligne][colonne] IN delimiteurs) DO INC(colonne) END; END; WHILE (colonne < i) AND (texte[numero_ligne][colonne] IN delimiteurs) DO INC(colonne) END; END; INC(colonne); positionne_curseur; END; END mot_droit; PROCEDURE mot_gauche; BEGIN IF colonne < 2 THEN RETURN END; IF texte[numero_ligne][colonne-1] IN alpha THEN DEC(colonne) END; IF texte[numero_ligne][colonne-1] IN alpha THEN LOOP IF colonne < 2 THEN EXIT END; IF texte[numero_ligne][colonne-2] IN alpha THEN DEC(colonne) ELSE EXIT; END; END; ELSE LOOP IF colonne < 2 THEN EXIT END; IF texte[numero_ligne][colonne-2] IN delimiteurs THEN DEC(colonne) ELSE EXIT; END; END; IF colonne < 2 THEN positionne_curseur; RETURN END; DEC(colonne); LOOP IF colonne < 2 THEN EXIT END; IF texte[numero_ligne][colonne-2] IN alpha THEN DEC(colonne) ELSE EXIT; END; END; END; positionne_curseur; END mot_gauche; PROCEDURE tab; BEGIN INC(colonne,largeur_tabulation); positionne_curseur; END tab; PROCEDURE insere_car(car : CHAR); BEGIN END insere_car; PROCEDURE insere_rc; BEGIN END insere_rc; PROCEDURE detruit_car; BEGIN END detruit_car; PROCEDURE charger ( nom : t_nom_fichier) : BOOLEAN; TYPE (* t_ptr_buffer = NearADDRESS; *) t_buffer = ARRAY[0..1024*20] OF BYTE; VAR (* buffer : t_ptr_buffer; *) fichier : FIO.File; ok : BOOLEAN; ligne : ARRAY[0..255] OF CHAR; i : CARDINAL; BEGIN i := 0; FIO.EOF := FALSE; IF FIO.Exists(nom) THEN fichier := FIO.Open(nom); (* Storage.NearAllocate(buffer,SIZE(t_buffer)); FIO.AssignBuffer(fichier,buffer^); *) ok := FIO.IOresult() = 0; IF ok THEN LOOP FIO.RdStr(fichier,texte[i](*ligne*)); IF FIO.EOF THEN EXIT END; IF i > m_texte THEN EXIT END; (* Str.Slice(texte[i],ligne,0,78);*) INC(i); END; IF NOT FIO.EOF THEN entete("Le tampon est plein !!!!!"); tampon_plein := TRUE; ok := FALSE; END; n_texte := i - 1 ; END; (* Storage.NearDeallocate(buffer,SIZE(t_buffer));*) ELSE fichier := FIO.Create(nom); ok := FIO.IOresult() = 0; END; IF ok THEN FIO.Close(fichier) END; RETURN ok; END charger; PROCEDURE stocker(nom : t_nom_fichier; x,xx : CARDINAL): BOOLEAN; VAR fichier : FIO.File; ok : BOOLEAN; i : CARDINAL; BEGIN fichier := FIO.Create(nom); ok := FIO.IOresult() = 0; IF ok THEN FOR i := x TO xx DO FIO.WrStr(fichier,texte[i]); FIO.WrLn(fichier); END; FIO.Close(fichier); END; RETURN ok; END stocker; PROCEDURE menu; VAR x,y : Window.RelCoord; ok : BOOLEAN; BEGIN entete("Chargement du fichier : "); Window.Use(fen_titre); x:= Window.WhereX(); y := Window.WhereY(); REPEAT Window.GotoXY(x,y); IO.RdStr(nom_fichier) UNTIL Str.Length(nom_fichier) # 0; ok := charger(nom_fichier); Window.Use(fen_texte); entete(menu_principal); Window.Use(fen_texte); affiche_page; END menu; PROCEDURE test_touches; VAR car : CHAR; BEGIN LOOP car := BiosIO.RdKey(); CASE car OF | CHR(0) : car := BiosIO.RdKey(); CASE car OF | CHR(72) : curseur_haut; | CHR(80) : curseur_bas; | CHR(77) : curseur_droite; | CHR(75) : curseur_gauche; | CHR(71) : home; | CHR(79) : fin; | CHR(118) : fin_de_fichier; | CHR(132) : debut_de_fichier; | CHR(73) : page_haut; | CHR(81) : page_bas; | CHR(82) : insert := NOT insert; bas_d_ecran; | CHR(83) : detruit_car; END; | CHR(27) : EXIT; | CHR(5) : curseur_haut; | CHR(24) : curseur_bas; | CHR(4) : curseur_droite; | CHR(19) : curseur_gauche; | CHR(3) : page_bas; | CHR(18) : page_haut; | CHR(6) : mot_droit; | CHR(1) : mot_gauche; | CHR(26) : decale_haut; | CHR(23) : decale_bas; | CHR(9) : tab; | CHR(22) : insert := NOT insert; bas_d_ecran; | CHR(17) : car := BiosIO.RdKey(); CASE car OF | CHR(114),CHR(82),CHR(18) : debut_de_fichier; | CHR(99),CHR(67),CHR(3) : fin_de_fichier; END; | CHR(32)..CHR(255) : insere_car(car); | CHR(13) : insere_rc; | CHR(8) : detruit_car; END; END; END test_touches; BEGIN (* principal *) initialisations; menu; test_touches; END edit5.