edit5.mod 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535
  1. (*#debug(line_num=>on)*)
  2. MODULE edit5;
  3. IMPORT Storage,IO,FIO,Str,Window,Lib,BiosIO;
  4. CONST m_texte = 720;
  5. fenetre_titre = Window.WinDef(0,0,79,0,Window.Black,
  6. Window.Cyan,FALSE,FALSE,FALSE,
  7. FALSE," ",Window.Black,Window.Black);
  8. fenetre_texte = Window.WinDef(0,1,79,23,Window.Black,
  9. Window.LightGray,TRUE,FALSE,FALSE,
  10. FALSE," ",Window.Black,Window.Black);
  11. fenetre_bas_ecran= Window.WinDef(0,24,79,25,Window.Black,
  12. Window.Cyan,FALSE,FALSE,FALSE,
  13. FALSE," ",Window.Black,Window.Black);
  14. menu_principal = " Menu principal : I)ns‚rer D)‚truire A)juster C)hercher B)loc Q)uitter";
  15. TYPE t_m_texte = [0..m_texte];
  16. t_ligne = ARRAY[0..78] OF CHAR;
  17. t_texte = ARRAY t_m_texte OF t_ligne;
  18. t_nom_fichier = ARRAY[0..63] OF CHAR;
  19. VAR texte : t_texte; (* structure contenant le texte *)
  20. n_texte : t_m_texte; (* nombre de lignes utilis‚es *)
  21. tampon_plein : BOOLEAN; (* indique si structure pleine *)
  22. fen_titre, (* nos 3 fenetres sur l'‚cran *)
  23. fen_texte,
  24. fen_bas_ecran : Window.WinType;
  25. fen_en_cours : Window.WinType;
  26. numero_ligne : t_m_texte; (* numero de ligne par rapport au debut du fichier *)
  27. colonne : [1..80]; (* position curseur sur ecran en x *)
  28. nom_fichier : t_nom_fichier;
  29. haut : t_m_texte ; (* position du d‚but de l'ecran dans le fichier *)
  30. insert : BOOLEAN;
  31. y_texte : [1..23]; (* position curseur sur ecran en y *)
  32. i_texte : t_m_texte;(* variable d'usage g‚n‚ral *)
  33. debut_bloc,
  34. fin_bloc : [0..m_texte+1];
  35. largeur_tabulation : CARDINAL;
  36. delimiteurs,
  37. ascii,
  38. alpha : Str.CHARSET;
  39. PROCEDURE initialisations;
  40. VAR chaine : ARRAY[0..79] OF CHAR;
  41. BEGIN
  42. FIO.IOcheck := FALSE;
  43. Lib.EnableBreakCheck;
  44. tampon_plein := FALSE;
  45. fen_titre := Window.Open(fenetre_titre);
  46. fen_texte := Window.Open(fenetre_texte);
  47. fen_bas_ecran := Window.Open(fenetre_bas_ecran);
  48. insert := TRUE;
  49. Window.Use(fen_bas_ecran);
  50. chaine := (" Colonne : Ligne : Nom du fichier : Mode : ");
  51. Window.GotoXY(1,1);
  52. IO.WrStr(chaine);
  53. colonne := 1;
  54. numero_ligne := 0;
  55. haut := 0;
  56. largeur_tabulation := 8;
  57. ascii := Str.CHARSET{CHR(0)..CHR(255)};
  58. delimiteurs := Str.CHARSET{CHR(0)..CHR(64),CHR(91)..CHR(96),CHR(123)..CHR(255)};
  59. alpha := Str.CHARSET{CHR(65)..CHR(90),CHR(97)..CHR(122)};;
  60. debut_bloc := m_texte+1;
  61. fin_bloc := m_texte +1;
  62. Window.Use(fen_texte);
  63. END initialisations;
  64. PROCEDURE entete(chaine : ARRAY OF CHAR);
  65. BEGIN
  66. Window.Use(fen_titre);
  67. Window.GotoXY(1,1);
  68. Window.ClrEol;
  69. IO.WrStr(chaine);
  70. Window.Use(fen_texte);
  71. END entete;
  72. PROCEDURE bas_d_ecran;
  73. BEGIN
  74. Window.Use(fen_bas_ecran);
  75. Window.TextColor(Window.Red);
  76. Window.GotoXY(12,1);
  77. IO.WrCard(colonne,2);
  78. Window.GotoXY(23,1);
  79. IO.WrCard(numero_ligne+1,3);
  80. Window.GotoXY(45,1);
  81. IO.WrStr(nom_fichier);
  82. Window.GotoXY(65,1);
  83. IF insert THEN
  84. IO.WrStr("Insertion ")
  85. ELSE
  86. IO.WrStr("Remplacement");
  87. END;
  88. Window.Use(fen_texte);
  89. END bas_d_ecran;
  90. PROCEDURE positionne_curseur;
  91. VAR
  92. l : CARDINAL;
  93. BEGIN
  94. IF numero_ligne > n_texte THEN
  95. numero_ligne := n_texte
  96. END;
  97. l := Str.Length(texte[numero_ligne]);
  98. IF colonne > l+1 THEN
  99. colonne := l+1;
  100. END;
  101. Window.GotoXY(colonne,numero_ligne+1-haut);
  102. bas_d_ecran;
  103. END positionne_curseur;
  104. PROCEDURE curseur_gauche;
  105. BEGIN
  106. IF colonne >1 THEN
  107. DEC(colonne)
  108. END;
  109. positionne_curseur;
  110. END curseur_gauche;
  111. PROCEDURE curseur_droite;
  112. BEGIN
  113. IF colonne < 80 THEN
  114. INC(colonne);
  115. END;
  116. positionne_curseur;
  117. END curseur_droite;
  118. PROCEDURE affiche_page;
  119. VAR j : CARDINAL;
  120. BEGIN
  121. Window.Clear;
  122. i_texte := haut;
  123. j := 1;
  124. WHILE (i_texte <= haut + 22) AND (i_texte <= n_texte) DO
  125. (* test de non d‚passement de la fenetre et de la fin du fichier *)
  126. Window.GotoXY(1,j);
  127. IO.WrStr(texte[i_texte]);
  128. INC(i_texte);
  129. INC(j);
  130. END;
  131. positionne_curseur;
  132. bas_d_ecran;
  133. END affiche_page;
  134. PROCEDURE curseur_haut;
  135. BEGIN
  136. IF (numero_ligne > 0) AND (haut > 0) THEN
  137. IF numero_ligne = haut THEN
  138. DEC(haut);
  139. Window.CursorOff;
  140. Window.GotoXY(1,1);
  141. Window.InsLine;
  142. IO.WrStr(texte[numero_ligne-1]);
  143. Window.CursorOn;
  144. END;
  145. END;
  146. IF numero_ligne > 0 THEN
  147. DEC(numero_ligne);
  148. END;
  149. positionne_curseur;
  150. END curseur_haut;
  151. PROCEDURE curseur_bas;
  152. BEGIN
  153. IF numero_ligne < n_texte THEN
  154. INC(numero_ligne)
  155. END;
  156. IF numero_ligne >= haut + 23 THEN
  157. INC(haut);
  158. Window.CursorOff;
  159. Window.GotoXY(1,1);
  160. Window.DelLine;
  161. Window.GotoXY(1,23);
  162. IO.WrStr(texte[numero_ligne]);
  163. Window.CursorOn;
  164. END;
  165. positionne_curseur;
  166. END curseur_bas;
  167. PROCEDURE page_haut;
  168. BEGIN
  169. IF haut >0 THEN (* evite le scintillement de l'‚cran *)
  170. IF numero_ligne >= 23 THEN
  171. DEC(numero_ligne,23);
  172. IF haut >= 23 THEN
  173. DEC(haut,23);
  174. ELSE
  175. haut := 1;
  176. END;
  177. ELSE
  178. numero_ligne := 0;
  179. haut := 0;
  180. END;
  181. affiche_page;
  182. END;
  183. END page_haut;
  184. PROCEDURE page_bas;
  185. BEGIN
  186. IF numero_ligne <= n_texte -23 THEN
  187. INC(numero_ligne,23);
  188. INC(haut,23);
  189. ELSE
  190. numero_ligne := n_texte;
  191. haut := n_texte;
  192. END;
  193. affiche_page;
  194. END page_bas;
  195. PROCEDURE augmente;
  196. BEGIN
  197. END augmente;
  198. PROCEDURE home;
  199. BEGIN
  200. colonne := 1;
  201. positionne_curseur;
  202. END home;
  203. PROCEDURE fin;
  204. BEGIN
  205. colonne := 80;
  206. positionne_curseur;
  207. END fin;
  208. PROCEDURE debut_de_fichier;
  209. BEGIN
  210. haut := 0;
  211. numero_ligne := 0;
  212. colonne := 1;
  213. affiche_page;
  214. END debut_de_fichier;
  215. PROCEDURE fin_de_fichier;
  216. BEGIN
  217. numero_ligne := n_texte;
  218. haut := numero_ligne -5;
  219. colonne := 80;
  220. affiche_page;
  221. END fin_de_fichier;
  222. PROCEDURE decale_haut;
  223. VAR l_num_ligne : t_m_texte;
  224. l_col : [0..80];
  225. BEGIN
  226. l_num_ligne := numero_ligne;
  227. l_col := colonne;
  228. colonne := 1;
  229. numero_ligne := haut+23;
  230. curseur_bas;
  231. numero_ligne := l_num_ligne;
  232. colonne := l_col;
  233. positionne_curseur;
  234. END decale_haut;
  235. PROCEDURE decale_bas;
  236. VAR l_num_ligne : t_m_texte;
  237. l_col : [0..80];
  238. BEGIN
  239. l_num_ligne := numero_ligne;
  240. l_col := colonne;
  241. colonne := 1;
  242. numero_ligne := haut;
  243. curseur_haut;
  244. numero_ligne := l_num_ligne;
  245. colonne := l_col;
  246. positionne_curseur;
  247. END decale_bas;
  248. PROCEDURE mot_droit;
  249. VAR i : CARDINAL;
  250. BEGIN
  251. (* 2 cas : si caractŠre actuel est d‚limiteur alors progresser jusqu'au
  252. premier caractŠre alphanum‚rique.
  253. si caractŠre actuel alphanum‚rique alors :
  254. 1: sauter tous les caractŠres alphanum‚riques puis
  255. 2: faire comme ci-dessus.
  256. *)
  257. i := Str.Length(texte[numero_ligne]);
  258. IF colonne = (i+1) THEN
  259. (* si curseur en bout de ligne alors si ligne en-dessous passer ligne suivante *)
  260. IF numero_ligne < n_texte THEN
  261. INC(numero_ligne);
  262. IF numero_ligne >= haut+23 THEN
  263. decale_haut;
  264. END;
  265. colonne := 1;
  266. i := Str.Length(texte[numero_ligne]);
  267. IF NOT( texte[numero_ligne][colonne-1] IN alpha) THEN
  268. WHILE texte[numero_ligne][colonne-1] IN delimiteurs DO
  269. INC(colonne);
  270. END;
  271. END;
  272. positionne_curseur;
  273. END;
  274. ELSE
  275. IF colonne < i THEN (* le curseur n'est pas en bout de ligne *)
  276. IF NOT (texte[numero_ligne][colonne] IN delimiteurs) THEN
  277. (* il faut sauter les caractŠres alphanum‚riques *)
  278. WHILE (colonne < i) AND NOT (texte[numero_ligne][colonne] IN delimiteurs) DO
  279. INC(colonne)
  280. END;
  281. END;
  282. WHILE (colonne < i) AND (texte[numero_ligne][colonne] IN delimiteurs) DO
  283. INC(colonne)
  284. END;
  285. END;
  286. INC(colonne);
  287. positionne_curseur;
  288. END;
  289. END mot_droit;
  290. PROCEDURE mot_gauche;
  291. BEGIN
  292. IF colonne < 2 THEN RETURN END;
  293. IF texte[numero_ligne][colonne-1] IN alpha THEN
  294. DEC(colonne)
  295. END;
  296. IF texte[numero_ligne][colonne-1] IN alpha THEN
  297. LOOP
  298. IF colonne < 2 THEN EXIT END;
  299. IF texte[numero_ligne][colonne-2] IN alpha THEN
  300. DEC(colonne)
  301. ELSE
  302. EXIT;
  303. END;
  304. END;
  305. ELSE
  306. LOOP
  307. IF colonne < 2 THEN EXIT END;
  308. IF texte[numero_ligne][colonne-2] IN delimiteurs THEN
  309. DEC(colonne)
  310. ELSE
  311. EXIT;
  312. END;
  313. END;
  314. IF colonne < 2 THEN
  315. positionne_curseur;
  316. RETURN
  317. END;
  318. DEC(colonne);
  319. LOOP
  320. IF colonne < 2 THEN EXIT END;
  321. IF texte[numero_ligne][colonne-2] IN alpha THEN
  322. DEC(colonne)
  323. ELSE
  324. EXIT;
  325. END;
  326. END;
  327. END;
  328. positionne_curseur;
  329. END mot_gauche;
  330. PROCEDURE tab;
  331. BEGIN
  332. INC(colonne,largeur_tabulation);
  333. positionne_curseur;
  334. END tab;
  335. PROCEDURE insere_car(car : CHAR);
  336. BEGIN
  337. END insere_car;
  338. PROCEDURE insere_rc;
  339. BEGIN
  340. END insere_rc;
  341. PROCEDURE detruit_car;
  342. BEGIN
  343. END detruit_car;
  344. PROCEDURE charger ( nom : t_nom_fichier) : BOOLEAN;
  345. TYPE (* t_ptr_buffer = NearADDRESS; *)
  346. t_buffer = ARRAY[0..1024*20] OF BYTE;
  347. VAR (* buffer : t_ptr_buffer; *)
  348. fichier : FIO.File;
  349. ok : BOOLEAN;
  350. ligne : ARRAY[0..255] OF CHAR;
  351. i : CARDINAL;
  352. BEGIN
  353. i := 0;
  354. FIO.EOF := FALSE;
  355. IF FIO.Exists(nom) THEN
  356. fichier := FIO.Open(nom);
  357. (* Storage.NearAllocate(buffer,SIZE(t_buffer));
  358. FIO.AssignBuffer(fichier,buffer^);
  359. *) ok := FIO.IOresult() = 0;
  360. IF ok THEN
  361. LOOP
  362. FIO.RdStr(fichier,texte[i](*ligne*));
  363. IF FIO.EOF THEN EXIT END;
  364. IF i > m_texte THEN EXIT END;
  365. (* Str.Slice(texte[i],ligne,0,78);*)
  366. INC(i);
  367. END;
  368. IF NOT FIO.EOF THEN
  369. entete("Le tampon est plein !!!!!");
  370. tampon_plein := TRUE;
  371. ok := FALSE;
  372. END;
  373. n_texte := i - 1 ;
  374. END;
  375. (* Storage.NearDeallocate(buffer,SIZE(t_buffer));*)
  376. ELSE
  377. fichier := FIO.Create(nom);
  378. ok := FIO.IOresult() = 0;
  379. END;
  380. IF ok THEN FIO.Close(fichier) END;
  381. RETURN ok;
  382. END charger;
  383. PROCEDURE stocker(nom : t_nom_fichier; x,xx : CARDINAL): BOOLEAN;
  384. VAR fichier : FIO.File;
  385. ok : BOOLEAN;
  386. i : CARDINAL;
  387. BEGIN
  388. fichier := FIO.Create(nom);
  389. ok := FIO.IOresult() = 0;
  390. IF ok THEN
  391. FOR i := x TO xx DO
  392. FIO.WrStr(fichier,texte[i]);
  393. FIO.WrLn(fichier);
  394. END;
  395. FIO.Close(fichier);
  396. END;
  397. RETURN ok;
  398. END stocker;
  399. PROCEDURE menu;
  400. VAR x,y : Window.RelCoord;
  401. ok : BOOLEAN;
  402. BEGIN
  403. entete("Chargement du fichier : ");
  404. Window.Use(fen_titre);
  405. x:= Window.WhereX();
  406. y := Window.WhereY();
  407. REPEAT
  408. Window.GotoXY(x,y);
  409. IO.RdStr(nom_fichier)
  410. UNTIL Str.Length(nom_fichier) # 0;
  411. ok := charger(nom_fichier);
  412. Window.Use(fen_texte);
  413. entete(menu_principal);
  414. Window.Use(fen_texte);
  415. affiche_page;
  416. END menu;
  417. PROCEDURE test_touches;
  418. VAR car : CHAR;
  419. BEGIN
  420. LOOP
  421. car := BiosIO.RdKey();
  422. CASE car OF
  423. | CHR(0) : car := BiosIO.RdKey();
  424. CASE car OF
  425. | CHR(72) : curseur_haut;
  426. | CHR(80) : curseur_bas;
  427. | CHR(77) : curseur_droite;
  428. | CHR(75) : curseur_gauche;
  429. | CHR(71) : home;
  430. | CHR(79) : fin;
  431. | CHR(118) : fin_de_fichier;
  432. | CHR(132) : debut_de_fichier;
  433. | CHR(73) : page_haut;
  434. | CHR(81) : page_bas;
  435. | CHR(82) : insert := NOT insert;
  436. bas_d_ecran;
  437. | CHR(83) : detruit_car;
  438. END;
  439. | CHR(27) : EXIT;
  440. | CHR(5) : curseur_haut;
  441. | CHR(24) : curseur_bas;
  442. | CHR(4) : curseur_droite;
  443. | CHR(19) : curseur_gauche;
  444. | CHR(3) : page_bas;
  445. | CHR(18) : page_haut;
  446. | CHR(6) : mot_droit;
  447. | CHR(1) : mot_gauche;
  448. | CHR(26) : decale_haut;
  449. | CHR(23) : decale_bas;
  450. | CHR(9) : tab;
  451. | CHR(22) : insert := NOT insert;
  452. bas_d_ecran;
  453. | CHR(17) : car := BiosIO.RdKey();
  454. CASE car OF
  455. | CHR(114),CHR(82),CHR(18) : debut_de_fichier;
  456. | CHR(99),CHR(67),CHR(3) : fin_de_fichier;
  457. END;
  458. | CHR(32)..CHR(255) : insere_car(car);
  459. | CHR(13) : insere_rc;
  460. | CHR(8) : detruit_car;
  461. END;
  462. END;
  463. END test_touches;
  464. BEGIN (* principal *)
  465. initialisations;
  466. menu;
  467. test_touches;
  468. END edit5.