1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Copyright 2012-2013 Alexis Laferrière <alexis.laf@xymus.net>
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
17 # Draws an arithmetic operation to the terminal
27 if ( abs(self) >= 10 )
28 c = 1+(int)log10f( (float)abs(self) );
37 fun as_operator
(a
, b
: Int): Int
39 if self == '+' then return a
+ b
40 if self == '-' then return a
- b
41 if self == '*' then return a
* b
42 if self == '/' then return a
/ b
43 if self == '%' then return a
% b
47 fun override_dispc
: Bool
49 return self == '+' or self == '-' or self == '*' or self == '/' or self == '%'
52 fun lines
(s
: Int): Array[Line]
55 return [new Line(new P
(0,s
/2),1,0,s
), new Line(new P
(s
/2,1),0,1,s-2
)]
56 else if self == '-' then
57 return [new Line(new P
(0,s
/2),1,0,s
)]
58 else if self == '*' then
59 var lines
= new Array[Line]
61 lines
.add
( new Line(new P
(1,y
), 1,0,s-2
) )
64 else if self == '/' then
65 return [new Line(new P
(s-1
,0), -1,1, s
)]
66 else if self == '%' then
68 var lines
= [new Line(new P
(s-1
,0),-1,1,s
)]
70 lines
.append
([ new Line( new P
(0,l
), 1,0,q4
), new Line( new P
(s-1
,s-1-l
), -1,0,q4
) ])
73 else if self == '1' then
74 return [new Line(new P
(s
/2,0), 0,1,s
),new Line(new P
(0,s-1
),1,0,s
),
75 new Line( new P
(s
/2,0),-1,1,s
/2)]
76 else if self == '2' then
77 return [new Line(new P
(0,0), 1,0,s
),new Line(new P
(s-1
,0),0,1,s
/2),
78 new Line( new P
(0,s-1
),1,0,s
), new Line( new P
(0,s
/2), 0,1,s
/2),
79 new Line( new P
(0,s
/2), 1,0,s
)]
80 else if self == '3' then
81 return [new Line(new P
(0,0), 1,0,s
),new Line(new P
(s-1
,0),0,1,s
),
82 new Line( new P
(0,s-1
),1,0,s
), new Line( new P
(0,s
/2), 1,0,s
)]
83 else if self == '4' then
84 return [new Line(new P
(s-1
,0),0,1,s
), new Line( new P
(0,0), 0,1,s
/2),
85 new Line( new P
(0,s
/2), 1,0,s
)]
86 else if self == '5' then
87 return [new Line(new P
(0,0), 1,0,s
),new Line(new P
(s-1
,s
/2),0,1,s
/2),
88 new Line( new P
(0,s-1
),1,0,s
), new Line( new P
(0,0), 0,1,s
/2),
89 new Line( new P
(0,s
/2), 1,0,s
)]
90 else if self == '6' then
91 return [new Line(new P
(0,0), 1,0,s
),new Line(new P
(s-1
,s
/2),0,1,s
/2),
92 new Line( new P
(0,s-1
),1,0,s
), new Line( new P
(0,0), 0,1,s
),
93 new Line( new P
(0,s
/2), 1,0,s
)]
94 else if self == '7' then
97 return [new Line(tl
, 1,0,s
), new Line(tr
,-1,1,s
)]
98 else if self == '8' then
99 return [new Line(new P
(0,0), 1,0,s
),new Line(new P
(s-1
,0),0,1,s
),
100 new Line( new P
(0,s-1
),1,0,s
), new Line( new P
(0,0), 0,1,s
),
101 new Line( new P
(0,s
/2), 1,0,s
)]
102 else if self == '9' then
103 return [new Line(new P
(0,0), 1,0,s
),new Line(new P
(s-1
,0),0,1,s
),
104 new Line( new P
(0,s-1
),1,0,s
), new Line( new P
(0,0), 0,1,s
/2),
105 new Line( new P
(0,s
/2), 1,0,s
)]
106 else if self == '0' then
107 return [new Line(new P
(0,0), 1,0,s
),new Line(new P
(s-1
,0),0,1,s
),
108 new Line( new P
(0,s-1
),1,0,s
), new Line( new P
(0,0), 0,1,s
)]
110 return new Array[Line]
120 # hack is to support a bug in the evaluation software
121 fun draw
(dispc
: Char, size
, gap
: Int, hack
: Bool)
123 var w
= size
* length
+(length-1
)*gap
125 var map
= new Array[Array[Char]]
127 map
[x
] = new Array[Char].filled_with
( ' ', h
)
131 for c
in self.chars
do
133 if c
.override_dispc
then
139 var lines
= c
.lines
( size
)
141 var x
= line
.o
.x
+ci
*size
144 for s
in [0..line
.len
[ do
145 assert map
.length
> x
and map
[x
].length
> y
else print
"setting {x},{y} as {local_dispc}"
146 map
[x
][y
] = local_dispc
156 for c
in [0..size
[ do
157 map
[c
][0] = map
[map
.length-size
+c
][0]
158 map
[map
.length-size
+c
][0] = ' '
185 if "NIT_TESTING".environ
== "true" then
193 printn
"Left operand: "
196 printn
"Right operand: "
199 printn
"Operator (+, -, *, /, %): "
200 op_char
= gets
.chars
[0]
202 printn
"Char to display: "
203 disp_char
= gets
.chars
[0]
205 printn
"Size of text: "
206 disp_size
= gets
.to_i
208 printn
"Space between digits: "
212 var result
= op_char
.as_operator
( a
, b
)
214 var len_a
= a
.n_chars
215 var len_b
= b
.n_chars
216 var len_res
= result
.n_chars
217 var max_len
= len_a
.max
( len_b
.max
( len_res
) ) + 1
220 var d
= max_len
- len_a
222 for i
in [0..d
[ do line_a
+= " "
224 line_a
.draw
( disp_char
, disp_size
, disp_gap
, false )
228 d
= max_len
- len_b-1
229 var line_b
= op_char
.to_s
230 for i
in [0..d
[ do line_b
+= " "
232 line_b
.draw
( disp_char
, disp_size
, disp_gap
, false )
236 for i
in [0..disp_size
*max_len
+(max_len-1
)*disp_gap
] do
243 d
= max_len
- len_res
245 for i
in [0..d
[ do line_res
+= " "
246 line_res
+= result
.to_s
247 line_res
.draw
( disp_char
, disp_size
, disp_gap
, false )