| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535 |
- (*#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.
|