Annotation of OpenXM_contrib/PHC/Ada/Math_Lib/Polynomials/standard_complex_poly_systems_io.adb, Revision 1.1.1.1
1.1 maekawa 1: with integer_io,Numbers_io; use integer_io,Numbers_io;
2: with Communications_with_User; use Communications_with_User;
3: with Symbol_Table,Symbol_Table_io;
4: with Standard_Complex_Polynomials; use Standard_Complex_Polynomials;
5:
6: package body Standard_Complex_Poly_Systems_io is
7:
8: -- SCANNING THE LINE FOR A NATURAL NUMBER :
9:
10: function Scan_Line ( file : in file_type ) return natural is
11:
12: m : natural := 0;
13: ch : character;
14:
15: begin
16: while not END_OF_LINE(file) loop
17: get(file,ch);
18: case ch is
19: when '0' => m := 10*m;
20: when '1' => m := 10*m + 1;
21: when '2' => m := 10*m + 2;
22: when '3' => m := 10*m + 3;
23: when '4' => m := 10*m + 4;
24: when '5' => m := 10*m + 5;
25: when '6' => m := 10*m + 6;
26: when '7' => m := 10*m + 7;
27: when '8' => m := 10*m + 8;
28: when '9' => m := 10*m + 9;
29: when others => null;
30: end case;
31: end loop;
32: return m;
33: end Scan_Line;
34:
35: -- EXCEPTION HANDLERS :
36:
37: procedure Write_Symbol_Table is
38:
39: -- DESCRIPTION :
40: -- Writes the current list of symbols on one line on standard output.
41:
42: begin
43: put("Current symbols : ");
44: for i in 1..Symbol_Table.Number loop
45: Symbol_Table_io.put(Symbol_Table.Get(i)); put(" ");
46: end loop;
47: new_line;
48: end Write_Symbol_Table;
49:
50: procedure Handler ( k : in natural ) is
51: begin
52: put(" raised while reading polynomial "); put(k,1);
53: put_line(".");
54: end Handler;
55:
56: -- THE INPUT OPERATIONS :
57:
58: procedure get ( n : in out natural; s : in out Poly_Sys ) is
59: begin
60: get(Standard_Input,n,s);
61: end get;
62:
63: procedure get ( n,m : in out natural; s : in out Poly_Sys ) is
64: begin
65: get(Standard_Input,n,m,s);
66: end get;
67:
68: procedure get ( file : in file_type;
69: n : in out natural; s : in out Poly_Sys ) is
70:
71: i : integer := s'first;
72:
73: begin
74: get(file,n);
75: while i <= s'first+n-1 loop
76: get(file,s(i));
77: i := i+1;
78: end loop;
79: exception
80: when ILLEGAL_CHARACTER => put("ILLEGAL_CHARACTER"); Handler(i); raise;
81: when ILLEGAL_SYMBOL => put("ILLEGAL_SYMBOL"); Handler(i); raise;
82: when ILLEGAL_OPERATION => put("ILLEGAL_OPERATION"); Handler(i); raise;
83: when INFINITE_NUMBER => put("INFINITE_NUMBER"); Handler(i); raise;
84: when OVERFLOW_OF_UNKNOWNS => put("OVERFLOW_OF_UNKNOWNS"); Handler(i);
85: Write_Symbol_Table; raise;
86: when BAD_BRACKET => put("BAD_BRACKET"); Handler(i); raise;
87: end get;
88:
89: procedure get ( file : in file_type;
90: n,m : in out natural; s : in out Poly_Sys ) is
91:
92: i : integer := s'first;
93:
94: begin
95: get(file,n);
96: m := Scan_Line(file);
97: while i <= s'first+n-1 loop
98: get(file,s(i));
99: i := i+1;
100: end loop;
101: exception
102: when ILLEGAL_CHARACTER => put("ILLEGAL_CHARACTER"); Handler(i); raise;
103: when ILLEGAL_SYMBOL => put("ILLEGAL_SYMBOL"); Handler(i); raise;
104: when ILLEGAL_OPERATION => put("ILLEGAL_OPERATION"); Handler(i); raise;
105: when INFINITE_NUMBER => put("INFINITE_NUMBER"); Handler(i); raise;
106: when OVERFLOW_OF_UNKNOWNS => put("OVERFLOW_OF_UNKNOWNS"); Handler(i);
107: Write_Symbol_Table; raise;
108: when BAD_BRACKET => put("BAD_BRACKET"); Handler(i); raise;
109: end get;
110:
111: procedure get ( s : in out Poly_Sys ) is
112: begin
113: get(Standard_Input,s);
114: end get;
115:
116: procedure get ( file : in file_type; s : in out Poly_Sys ) is
117:
118: i : integer := s'first;
119:
120: begin
121: while i <= s'last loop
122: get(file,s(i));
123: i := i+1;
124: end loop;
125: exception
126: when ILLEGAL_CHARACTER => put("ILLEGAL_CHARACTER"); Handler(i); raise;
127: when ILLEGAL_SYMBOL => put("ILLEGAL_SYMBOL"); Handler(i); raise;
128: when ILLEGAL_OPERATION => put("ILLEGAL_OPERATION"); Handler(i); raise;
129: when INFINITE_NUMBER => put("INFINITE_NUMBER"); Handler(i); raise;
130: when OVERFLOW_OF_UNKNOWNS => put("OVERFLOW_OF_UNKNOWNS"); Handler(i);
131: Write_Symbol_Table; raise;
132: when BAD_BRACKET => put("BAD_BRACKET"); Handler(i); raise;
133: end get;
134:
135: -- MORE USER FRIENDLY INPUT OPERATIONS :
136:
137: procedure get ( lp : in out Link_to_Poly_Sys ) is
138:
139: inpt : file_type;
140: n,m : natural;
141: onfile : character;
142:
143: begin
144: --------------------------------------------
145: -- GETTING THE DIMENSION OF THE PROBLEM --
146: --------------------------------------------
147: loop
148: put("Is the system on a file ? (y/n/i=info) ");
149: Ask_Alternative(onfile,"yni");
150: if onfile = 'i'
151: then new_line; Display_Format; new_line;
152: end if;
153: exit when onfile /= 'i';
154: end loop;
155: new_line;
156: if onfile = 'y'
157: then declare
158: procedure Read is
159: begin
160: put_line("Reading the name of the input file.");
161: Read_Name_and_Open_File(inpt);
162: get(inpt,n);
163: end Read;
164: begin
165: Read;
166: exception
167: when others => put_line("The data on the file is not correct.");
168: put_line("A natural number is expected first.");
169: put_line("Supply another file name."); Close(inpt);
170: Read;
171: end;
172: else put("Give the number of polynomials : "); Read_Natural(n);
173: end if;
174: ---------------------------------------
175: -- GETTING THE POLYNOMIAL SYSTEM : --
176: ---------------------------------------
177: if Symbol_Table.Empty
178: then Symbol_Table.Init(n);
179: end if;
180: lp := new Poly_Sys(1..n);
181: declare
182: procedure Read is
183: begin
184: if onfile = 'y'
185: then m := Scan_Line(inpt);
186: get(inpt,lp.all);
187: Close(inpt);
188: else put("Give the number of unknowns : "); Read_Natural(m);
189: put("Give "); put(n,2);
190: if n = 1
191: then put_line(" polynomial : ");
192: else put_line(" polynomials : ");
193: end if;
194: get(lp.all);
195: skip_line; -- skip end_of_line symbol
196: end if;
197: exception
198: when others => if onfile = 'y' then Close(inpt); end if;
199: put_line("Polynomial system read : "); put(lp.all,'*');
200: raise;
201: end Read;
202: begin
203: Read;
204: exception
205: when others =>
206: if onfile = 'y'
207: then put_line("The polynomials on the file are incorrect."
208: & " Try again...");
209: else put_line("The polynomials are incorrect. Try again...");
210: end if;
211: Clear(lp); Symbol_Table.Clear;
212: get(lp);
213: end;
214:
215: end get;
216:
217: procedure get ( file : in file_type; lp : in out Link_to_Poly_Sys ) is
218:
219: n : natural;
220:
221: begin
222: get(file,n);
223: lp := new Poly_Sys(1..n);
224: if Symbol_Table.Empty
225: then Symbol_Table.Init(n);
226: end if;
227: get(file,lp.all);
228: skip_line(file); -- skip end_of_line symbol
229: end get;
230:
231: -- THE OUTPUT OPERATIONS :
232:
233: procedure put ( n : in natural; s : in Poly_Sys; pow : in power := '*' ) is
234: begin
235: put(Standard_Output,n,s,pow);
236: end put;
237:
238: procedure put ( n,m : in natural; s : in Poly_Sys; pow : in power := '*' ) is
239: begin
240: put(Standard_Output,n,m,s,pow);
241: end put;
242:
243: procedure put ( file : in file_type; n : in natural; s : in Poly_Sys;
244: pow : in power := '*' ) is
245: begin
246: put(file,n,2); new_line(file);
247: put(file,s,pow);
248: end put;
249:
250: procedure put ( file : in file_type; n,m : in natural; s : in Poly_Sys;
251: pow : in power := '*' ) is
252: begin
253: put(file,n,2); put(file," "); put(file,m,2); new_line(file);
254: put(file,s,pow);
255: end put;
256:
257: procedure put ( s : in Poly_Sys; pow : in power ) is
258: begin
259: put(Standard_Output,s,pow);
260: end put;
261:
262: procedure put ( file : in file_type; s : in Poly_Sys; pow : in power ) is
263: begin
264: for i in s'range loop
265: put(file,s(i),pow); new_line(file);
266: end loop;
267: end put;
268:
269: procedure put ( s : in Poly_Sys ) is
270: begin
271: put(Standard_Output,s,'*');
272: end put;
273:
274: procedure put ( file : in file_type; s : in Poly_Sys ) is
275: begin
276: put(file,s,'*');
277: end put;
278:
279: procedure put_line ( s : in Poly_Sys ) is
280: begin
281: put_line(Standard_Output,s);
282: end put_line;
283:
284: procedure put_line ( file : in file_type; s : in Poly_Sys ) is
285: begin
286: put_line(file,s,'*');
287: end put_line;
288:
289: procedure put_line ( s : in Poly_Sys; pow : in Power ) is
290: begin
291: put_line(Standard_Output,s,pow);
292: end put_line;
293:
294: procedure put_line ( file : in file_type; s : in Poly_Sys; pow : in Power ) is
295: begin
296: put(file,s'length,2); new_line(file);
297: for i in s'range loop
298: put_line(file,s(i),pow);
299: end loop;
300: end put_line;
301:
302: procedure Display_Format is
303:
304: s : array(1..3) of string(1..65);
305:
306: begin
307: s(1):=" A complex polynomial system is denoted by the dimension";
308: s(2):="followed by as many complex multivariate polynomials as the";
309: s(3):="dimension. The dimension is a positive natural number. ";
310: for i in s'range loop
311: put_line(s(i));
312: end loop;
313: Standard_Complex_Polynomials_io.Display_Format;
314: end Display_Format;
315:
316: end Standard_Complex_Poly_Systems_io;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>