1# Rules providing basic arithmetic operations
2
3HAIKU_PAD_9 = 0 1 2 3 4 5 6 7 8 ;
4
5# a > b <==> $(HAIKU_DIGIT_GREATER_$(a)[1$(b)])
6HAIKU_DIGIT_GREATER_0 = $(HAIKU_PAD_9) ;
7HAIKU_DIGIT_GREATER_1 = $(HAIKU_PAD_9) 1 ;
8HAIKU_DIGIT_GREATER_2 = $(HAIKU_PAD_9) 1 1 ;
9HAIKU_DIGIT_GREATER_3 = $(HAIKU_PAD_9) 1 1 1 ;
10HAIKU_DIGIT_GREATER_4 = $(HAIKU_PAD_9) 1 1 1 1 ;
11HAIKU_DIGIT_GREATER_5 = $(HAIKU_PAD_9) 1 1 1 1 1 ;
12HAIKU_DIGIT_GREATER_6 = $(HAIKU_PAD_9) 1 1 1 1 1 1 ;
13HAIKU_DIGIT_GREATER_7 = $(HAIKU_PAD_9) 1 1 1 1 1 1 1 ;
14HAIKU_DIGIT_GREATER_8 = $(HAIKU_PAD_9) 1 1 1 1 1 1 1 1 ;
15HAIKU_DIGIT_GREATER_9 = $(HAIKU_PAD_9) 1 1 1 1 1 1 1 1 1 ;
16
17# a + b == $(HAIKU_DIGIT_ADD_$(a)[1$(b)]) (carry ignored)
18HAIKU_DIGIT_ADD_0 = $(HAIKU_PAD_9) 0 1 2 3 4 5 6 7 8 9 ;
19HAIKU_DIGIT_ADD_1 = $(HAIKU_PAD_9) 1 2 3 4 5 6 7 8 9 0 ;
20HAIKU_DIGIT_ADD_2 = $(HAIKU_PAD_9) 2 3 4 5 6 7 8 9 0 1 ;
21HAIKU_DIGIT_ADD_3 = $(HAIKU_PAD_9) 3 4 5 6 7 8 9 0 1 2 ;
22HAIKU_DIGIT_ADD_4 = $(HAIKU_PAD_9) 4 5 6 7 8 9 0 1 2 3 ;
23HAIKU_DIGIT_ADD_5 = $(HAIKU_PAD_9) 5 6 7 8 9 0 1 2 3 4 ;
24HAIKU_DIGIT_ADD_6 = $(HAIKU_PAD_9) 6 7 8 9 0 1 2 3 4 5 ;
25HAIKU_DIGIT_ADD_7 = $(HAIKU_PAD_9) 7 8 9 0 1 2 3 4 5 6 ;
26HAIKU_DIGIT_ADD_8 = $(HAIKU_PAD_9) 8 9 0 1 2 3 4 5 6 7 ;
27HAIKU_DIGIT_ADD_9 = $(HAIKU_PAD_9) 9 0 1 2 3 4 5 6 7 8 ;
28
29# pragma mark - Number Operations
30
31rule AddNumAbs a : b
32{
33	# AddNum <a> : <b> ;
34
35	local result ;
36	local carry ;
37	while $(a) || $(b) || $(carry) {
38		# chop off the first digit
39		local da = $(a[1]:E=0) ;
40		local db = $(b[1]:E=0) ;
41		a = $(a[2-]) ;
42		b = $(b[2-]) ;
43
44		# add carry to the first digit
45		if $(carry) {
46			local daa = $(HAIKU_DIGIT_ADD_1[1$(da)]) ;
47			carry = $(HAIKU_DIGIT_GREATER_$(da)[1$(daa)]) ;
48			da = $(daa) ;
49		}
50
51		# add digits
52		local dr = $(HAIKU_DIGIT_ADD_$(da)[1$(db)]) ;
53		if $(HAIKU_DIGIT_GREATER_$(da)[1$(dr)]) {
54			carry = 1 ;
55		}
56
57		result += $(dr) ;
58	}
59
60	return $(result) ;
61}
62
63