Added upstream from http://ftp.icm.edu.pl/pub/loglan/
[loglan.git] / examples / process / ring2.log
1 program ring;\r
2 (***************************************************************)\r
3 unit ecran : process(node: integer);\r
4 var fin : boolean;\r
5   unit koniec : procedure;\r
6   begin  fin:= true;\r
7   end koniec;\r
8   unit Bold : procedure;\r
9   begin\r
10     write( chr(27), "[1m")\r
11   end Bold;\r
12  \r
13   unit Blink : procedure;\r
14   begin\r
15     write( chr(27), "[5m")\r
16   end Blink;\r
17  \r
18   unit Reverse : procedure;\r
19   begin\r
20     write( chr(27), "[7m")\r
21   end Reverse;\r
22  \r
23   unit Normal : procedure;\r
24   begin\r
25     write( chr(27), "[0m")\r
26   end Normal;\r
27  \r
28   unit Underscore : procedure;\r
29   begin\r
30     write( chr(27), "[4m")\r
31   end Underscore;\r
32  \r
33  \r
34   unit inchar : IIuwgraph function : integer;\r
35     (*podaj nr znaku przeslanego z klawiatury *)\r
36     var i : integer;\r
37   begin\r
38     do\r
39       i := inkey;\r
40       if i <> 0 then exit fi;\r
41     od;\r
42     result := i;\r
43   end inchar;\r
44  \r
45   unit NewPage : procedure;\r
46   begin\r
47     write( chr(27), "[2J")\r
48   end NewPage;\r
49  \r
50   unit  SetCursor : procedure(row, column : integer);\r
51     var c,d,e,f  : char,\r
52         i,j : integer;\r
53   begin\r
54     i := row div 10;\r
55     j := row mod 10;\r
56     c := chr(48+i);\r
57     d := chr(48+j);\r
58     i := column div 10;\r
59     j := column mod 10;\r
60     e := chr(48+i);\r
61     f := chr(48+j);\r
62     write( chr(27), "[", c, d, ";", e, f, "H")\r
63   end SetCursor;\r
64   unit pisz :procedure( co, li,kol, jak: integer);\r
65   var i: integer;\r
66   begin\r
67           for i := 1 to 9000 do i :=i od;\r
68           call SetCursor(li,kol);\r
69           case jak\r
70           when 1 : call Normal;\r
71           when 2 : call Bold;\r
72           when 3 : call Reverse;\r
73           when 4 : call Underscore;\r
74           esac;\r
75           write(co);\r
76   end pisz;\r
77   var x: integer;\r
78   begin (*   ecran ************************)\r
79       fin := false;\r
80       call NewPage;\r
81       call SetCursor(2,30);call Bold;\r
82       write( "RING OF PROCESSES ");\r
83       return;\r
84       enable inchar;\r
85       do  accept pisz, koniec;\r
86           if fin then\r
87               call SetCursor(22,30); call Normal;\r
88               write("KONIEC"); x := inchar;exit\r
89           fi;\r
90       od;\r
91   end ecran;\r
92  \r
93 unit Pr : process(n,nr: integer, booo : boolean, next : Pr, E: ecran);\r
94 var prive, number, x_pos,w_pos: integer;\r
95     unit info : procedure(pp:Pr);\r
96     begin\r
97         next := pp;\r
98     end info;\r
99     unit send : procedure( x,n: integer);\r
100     begin\r
101           call E.pisz(x,5+2*nr+1,x_pos,1);\r
102  \r
103           x_pos := x_pos+4;\r
104           prive := x;number :=n;\r
105     end send;\r
106     unit work : procedure(output x : integer);\r
107     begin\r
108          x := random * 10;\r
109          call E.pisz(x,5+2*nr,w_pos,3);\r
110          w_pos := w_pos+4;\r
111     end work;\r
112 begin\r
113  \r
114      x_pos := 10;\r
115      w_pos := 10;\r
116      call E.pisz(nr,5+2*nr,2,2);\r
117 (*     number:= E.inchar;  *)\r
118      return;\r
119      if booo then\r
120         accept info;\r
121         call work(prive);\r
122         call next.send(prive,nr);\r
123      fi;\r
124      do\r
125         accept send;\r
126         if prive = 0 then\r
127             if number<>nr then call next.send(0,number) fi;\r
128             call E.pisz(0,5+2*nr,x_pos,4);\r
129             if number=nr then call E.koniec fi;\r
130             exit\r
131         fi;\r
132         call work(prive);\r
133         call next.send(prive,nr);\r
134  \r
135      od;\r
136  \r
137 end Pr;\r
138  \r
139 var Ar_Pr: arrayof Pr, pp,q : Pr, nb_pr ,i: integer, Ek: ecran;\r
140  \r
141 begin (* main  program *******************************************)\r
142      call ranset(5);\r
143      writeln;\r
144      write("Nb process = ");\r
145      readln(nb_pr);\r
146      array Ar_Pr dim (1:nb_pr);\r
147  \r
148      Ek := new ecran(0);\r
149      resume(Ek);\r
150      pp := new Pr(0,nb_pr,true,none, Ek);\r
151      q:=pp;\r
152      resume(pp);\r
153      for i :=nb_pr-1  downto 1\r
154      do\r
155        pp := new Pr(0,i,false,pp,Ek);\r
156        resume(pp);\r
157      od;\r
158  \r
159      call q.info(pp);\r
160 end ring;\r