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
23 if ( abs(recv) >= 10 )
24 c = 1+(int)log10f( (float)abs(recv) );
33 fun as_operator
(a
, b
: Int): Int
35 if self == '+' then return a
+ b
36 if self == '-' then return a
- b
37 if self == '*' then return a
* b
38 if self == '/' then return a
/ b
39 if self == '%' then return a
% b
43 fun override_dispc
: Bool
45 return self == '+' or self == '-' or self == '*' or self == '/' or self == '%'
48 fun lines
(s
: Int): Array[Line]
51 return [new Line(new P
(0,s
/2),1,0,s
), new Line(new P
(s
/2,1),0,1,s-2
)]
52 else if self == '-' then
53 return [new Line(new P
(0,s
/2),1,0,s
)]
54 else if self == '*' then
55 var lines
= new Array[Line]
57 lines
.add
( new Line(new P
(1,y
), 1,0,s-2
) )
60 else if self == '/' then
61 return [new Line(new P
(s-1
,0), -1,1, s
)]
62 else if self == '%' then
64 var lines
= [new Line(new P
(s-1
,0),-1,1,s
)]
66 lines
.append
([ new Line( new P
(0,l
), 1,0,q4
), new Line( new P
(s-1
,s-1-l
), -1,0,q4
) ])
69 else if self == '1' then
70 return [new Line(new P
(s
/2,0), 0,1,s
),new Line(new P
(0,s-1
),1,0,s
),
71 new Line( new P
(s
/2,0),-1,1,s
/2)]
72 else if self == '2' then
73 return [new Line(new P
(0,0), 1,0,s
),new Line(new P
(s-1
,0),0,1,s
/2),
74 new Line( new P
(0,s-1
),1,0,s
), new Line( new P
(0,s
/2), 0,1,s
/2),
75 new Line( new P
(0,s
/2), 1,0,s
)]
76 else if self == '3' then
77 return [new Line(new P
(0,0), 1,0,s
),new Line(new P
(s-1
,0),0,1,s
),
78 new Line( new P
(0,s-1
),1,0,s
), new Line( new P
(0,s
/2), 1,0,s
)]
79 else if self == '4' then
80 return [new Line(new P
(s-1
,0),0,1,s
), new Line( new P
(0,0), 0,1,s
/2),
81 new Line( new P
(0,s
/2), 1,0,s
)]
82 else if self == '5' then
83 return [new Line(new P
(0,0), 1,0,s
),new Line(new P
(s-1
,s
/2),0,1,s
/2),
84 new Line( new P
(0,s-1
),1,0,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 == '6' 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
),
89 new Line( new P
(0,s
/2), 1,0,s
)]
90 else if self == '7' then
93 return [new Line(tl
, 1,0,s
), new Line(tr
,-1,1,s
)]
94 else if self == '8' then
95 return [new Line(new P
(0,0), 1,0,s
),new Line(new P
(s-1
,0),0,1,s
),
96 new Line( new P
(0,s-1
),1,0,s
), new Line( new P
(0,0), 0,1,s
),
97 new Line( new P
(0,s
/2), 1,0,s
)]
98 else if self == '9' 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
/2),
101 new Line( new P
(0,s
/2), 1,0,s
)]
102 else if self == '0' 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
)]
106 return new Array[Line]
116 # hack is to support a bug in the evaluation software
117 fun draw
(dispc
: Char, size
, gap
: Int, hack
: Bool)
119 var w
= size
* length
+(length-1
)*gap
121 var map
= new Array[Array[Char]]
123 map
[x
] = new Array[Char].filled_with
( ' ', h
)
127 for c
in self.chars
do
129 if c
.override_dispc
then
135 var lines
= c
.lines
( size
)
137 var x
= line
.o
.x
+ci
*size
140 for s
in [0..line
.len
[ do
141 assert map
.length
> x
and map
[x
].length
> y
else print
"setting {x},{y} as {local_dispc}"
142 map
[x
][y
] = local_dispc
152 for c
in [0..size
[ do
153 map
[c
][0] = map
[map
.length-size
+c
][0]
154 map
[map
.length-size
+c
][0] = ' '
181 if "NIT_TESTING".environ
== "true" then
189 printn
"Left operand: "
192 printn
"Right operand: "
195 printn
"Operator (+, -, *, /, %): "
196 op_char
= gets
.chars
[0]
198 printn
"Char to display: "
199 disp_char
= gets
.chars
[0]
201 printn
"Size of text: "
202 disp_size
= gets
.to_i
204 printn
"Space between digits: "
208 var result
= op_char
.as_operator
( a
, b
)
210 var len_a
= a
.n_chars
211 var len_b
= b
.n_chars
212 var len_res
= result
.n_chars
213 var max_len
= len_a
.max
( len_b
.max
( len_res
) ) + 1
216 var d
= max_len
- len_a
218 for i
in [0..d
[ do line_a
+= " "
220 line_a
.draw
( disp_char
, disp_size
, disp_gap
, false )
224 d
= max_len
- len_b-1
225 var line_b
= op_char
.to_s
226 for i
in [0..d
[ do line_b
+= " "
228 line_b
.draw
( disp_char
, disp_size
, disp_gap
, false )
232 for i
in [0..disp_size
*max_len
+(max_len-1
)*disp_gap
] do
239 d
= max_len
- len_res
241 for i
in [0..d
[ do line_res
+= " "
242 line_res
+= result
.to_s
243 line_res
.draw
( disp_char
, disp_size
, disp_gap
, false )