compmenu.mod 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. IMPLEMENTATION MODULE compmenu;
  2. IMPORT IO,FIO,FIOR,Str,Storage,Window,SYSTEM;
  3. FROM Storage IMPORT ALLOCATE,DEALLOCATE;
  4. CONST fenetre = Window.WinDef(10,10,47,13,Window.Black,Window.White,
  5. FALSE,FALSE,FALSE,TRUE,Window.SingleFrame,
  6. Window.White,Window.Black);
  7. VAR ligne : ARRAY[0..100] OF CHAR;
  8. fichier : FIO.File;
  9. t_fenetre : Window.WinType;
  10. VAR menu_principal : BOOLEAN;
  11. type_menu : (PopUp,Pull_Down,LinePull);
  12. PROCEDURE compare(x,y:ARRAY OF CHAR): BOOLEAN;
  13. BEGIN
  14. RETURN Str.Compare(x,y) = 0;
  15. END compare;
  16. CONST message1 = "Il n'y a pas de fichier menu cr‚‚ !!";
  17. message2 = " Tapez sur une touche ";
  18. PROCEDURE erreur(x,y:ARRAY OF CHAR);
  19. BEGIN
  20. t_fenetre := Window.Open(fenetre);
  21. IO.WrStr(x);
  22. IO.WrLn;
  23. IO.WrStr(y);
  24. REPEAT UNTIL IO.KeyPressed();
  25. Window.Close(t_fenetre);
  26. HALT;
  27. END erreur;
  28. PROCEDURE init_menu(nom_de_fichier : FIO.PathStr);
  29. BEGIN
  30. FIO.EOF := FALSE;
  31. IF FIO.Exists(nom_de_fichier) THEN
  32. fichier := FIO.Open(nom_de_fichier);
  33. ELSE erreur(message1,message2);
  34. END;
  35. END init_menu;
  36. TYPE t_symbole = (t_decalage,t_mode,t_identificateur);
  37. VAR ptr1,ptr2,ptr3,ptr4,ptr5 : ADDRESS;
  38. main,p_compile,
  39. p_ligne_debut,
  40. p_ligne_suivante,p_courant,
  41. p_lis_symbole,p5 : ADDRESS;
  42. symbole : RECORD
  43. son_type : t_symbole;
  44. nom : ARRAY[0..79] OF CHAR;
  45. END;
  46. numero_ligne : CARDINAL;
  47. position : CARDINAL;
  48. PROCEDURE lis_symbole;
  49. (* liste des symboles :
  50. ! !! PopUp LinePull PullDown Help [ ] | < > '
  51. { } Key
  52. *)
  53. TYPE le_symbole = RECORD
  54. CASE : t_symbole OF
  55. | t_decalage : CARDINAL;
  56. | t_identificateur : ARRAY[0..35] OF CHAR;
  57. END;
  58. END;
  59. CONST blanc = " ";
  60. VAR ligne : ARRAY[0..127] OF CHAR;
  61. numero_item : CARDINAL;
  62. fin_ligne : CARDINAL;
  63. i : CARDINAL;
  64. BEGIN
  65. LOOP
  66. WHILE NOT FIO.EOF DO
  67. REPEAT
  68. FIO.RdStr(fichier,ligne);
  69. Str.Item(symbole,ligne,Str.CHARSET{" "},1);
  70. UNTIL (ligne[0]<>CHR(0)) AND NOT (compare(symbole,"!!"));
  71. fin_ligne := Str.Length(ligne);
  72. (* extraction des symboles de la phrase *)
  73. (****************************************)
  74. (*** calcul du d‚calage de chaque ligne *)
  75. decalage := 0;
  76. WHILE ligne[i] = blanc INC(decalage);
  77. (*** fin de ce calcul *******************)
  78. CASE ligne[i] OF
  79. symbole_suivant;
  80. SYSTEM.TRANSFER(p_lis_symbole,p_courant);
  81. (* fin de l'extraction des symboles *)
  82. (************************************)
  83. END; (* REPEAT *)
  84. END; (* LOOP *)
  85. END lis_symbole;
  86. PROCEDURE ligne_debut;
  87. BEGIN
  88. LOOP
  89. p_courant := SYSTEM.CurrentProcess();
  90. SYSTEM.TRANSFER(p_ligne_debut,p_lis_symbole);
  91. (***********************************)
  92. IF compare(symbole,"!") THEN
  93. IO.WrStr("ligne d‚but rencontr‚‚");IO.WrLn;
  94. (***********************)
  95. SYSTEM.TRANSFER(p_ligne_debut,p_lis_symbole);
  96. IF compare(symbole,"PopUp") THEN
  97. IO.WrStr("mode popup ");IO.WrLn;
  98. ELSIF compare(symbole,"LinePull") THEN
  99. IO.WrStr("mode LinePull");IO.WrLn
  100. ELSIF compare(symbole,"PullUp") THEN
  101. IO.WrStr("mode pullup");IO.WrLn;
  102. ELSE erreur("Erreur de syntaxe dans","ligne d‚but")
  103. END; (* IF *)
  104. (************)
  105. SYSTEM.TRANSFER(p_ligne_debut,p_lis_symbole);
  106. IF compare(symbole,"|") THEN
  107. IO.WrStr("pas de titre !!!");IO.WrLn;
  108. (* SUITE *)
  109. ELSIF compare(symbole[0],"[") AND
  110. compare(symbole[Str.Length(symbole)-1],"]") THEN
  111. Str.Item(symbole,symbole,Str.CHARSET{"[","]"},0);
  112. IO.WrStr("le titre est : ");IO.WrStr(symbole);IO.WrLn;
  113. ELSE erreur("Erreur de syntaxe dans","ligne d‚but")
  114. END; (* IF *)
  115. (****************)
  116. (***********************)
  117. ELSE erreur("Erreur de d‚finition du menu ","tapez sur une touche");
  118. END; (*IF*)
  119. (***********************************)
  120. END;(* LOOP *)
  121. END ligne_debut;
  122. PROCEDURE ligne_suivante;
  123. BEGIN
  124. LOOP
  125. END;(*LOOP *)
  126. END ligne_suivante;
  127. PROCEDURE compile;
  128. BEGIN
  129. Storage.ALLOCATE(ptr2,20000);
  130. SYSTEM.NEWPROCESS(ligne_debut,ptr2,20000,p_ligne_debut);
  131. SYSTEM.TRANSFER(p_compile,p_ligne_debut); (* DEFINITION du menu *)
  132. Storage.DEALLOCATE(ptr2,20000);
  133. LOOP
  134. IF FIO.EOF THEN SYSTEM.TRANSFER(p_compile,main) (* compilation finie *)
  135. ELSE SYSTEM.TRANSFER(p_compile,p_ligne_suivante); (* lignes suivantes du menu *)
  136. END; (*IF*)
  137. END;
  138. END compile;
  139. BEGIN
  140. init_menu("menu5.txt");
  141. Storage.ALLOCATE(ptr1,20000);
  142. Storage.ALLOCATE(ptr3,20000);
  143. Storage.ALLOCATE(ptr4,20000);
  144. main := SYSTEM.CurrentProcess();
  145. SYSTEM.NEWPROCESS(compile,ptr1,20000,p_compile);
  146. SYSTEM.NEWPROCESS(ligne_suivante,ptr3,20000,p_ligne_suivante);
  147. SYSTEM.NEWPROCESS(lis_symbole,ptr4,5000,p_lis_symbole);
  148. SYSTEM.TRANSFER(main,p_compile);
  149. Storage.DEALLOCATE(ptr1,20000);
  150. Storage.DEALLOCATE(ptr3,20000);
  151. Storage.DEALLOCATE(ptr4,20000);
  152. END compmenu.