ruby-calc 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,23 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ require "rake/extensiontask"
4
+ require "rake/testtask"
5
+
6
+ task build: :compile
7
+
8
+ Rake::ExtensionTask.new("calc") do |ext|
9
+ ext.lib_dir = "lib/calc"
10
+ end
11
+
12
+ Rake::TestTask.new do |t|
13
+ t.pattern = "test/test_*.rb"
14
+ t.libs << "test"
15
+ end
16
+
17
+ task test: :compile
18
+ task default: :test
19
+
20
+ task :indent do
21
+ system("indent -kr -l95 -nut -nce -psl ext/calc/*.[hc]")
22
+ system("rm ext/calc/*.[hc]~")
23
+ end
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "calc"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ require "pry"
10
+ Pry.start
@@ -0,0 +1,18 @@
1
+ #! /bin/sh
2
+ # installs calc into /usr/local
3
+
4
+ set -x
5
+
6
+ version=calc-${CALC_VERSION-2.12.5.4}
7
+ patch=$PWD/$(dirname $0)/makefile.patch
8
+
9
+ cd /tmp
10
+ wget -nv http://www.isthe.com/chongo/src/calc/${version}.tar.bz2
11
+ tar xjf ${version}.tar.bz2
12
+ cd $version
13
+ patch -p0 < $patch
14
+ if [ "$CI" = "true" ]; then
15
+ make && sudo make install
16
+ else
17
+ make && make check && sudo make install
18
+ fi
@@ -0,0 +1,48 @@
1
+ --- Makefile.orig 2015-11-06 17:52:22.984273873 +1030
2
+ +++ Makefile 2015-11-06 18:00:02.632273873 +1030
3
+ @@ -610,25 +610,25 @@
4
+ # LIBDIR= /usr/lib
5
+ # CALC_SHAREDIR= /usr/share/calc
6
+ #
7
+ -#BINDIR= /usr/local/bin
8
+ +BINDIR= /usr/local/bin
9
+ #BINDIR= /dev/env/DJDIR/bin
10
+ -BINDIR= /usr/bin
11
+ +#BINDIR= /usr/bin
12
+
13
+ -#LIBDIR= /usr/local/lib
14
+ +LIBDIR= /usr/local/lib
15
+ #LIBDIR= /dev/env/DJDIR/lib
16
+ -LIBDIR= /usr/lib
17
+ +#LIBDIR= /usr/lib
18
+
19
+ -#CALC_SHAREDIR= /usr/local/lib/calc
20
+ +CALC_SHAREDIR= /usr/local/lib/calc
21
+ #CALC_SHAREDIR= /dev/env/DJDIR/share/calc
22
+ -CALC_SHAREDIR= /usr/share/calc
23
+ +#CALC_SHAREDIR= /usr/share/calc
24
+
25
+ # NOTE: Do not set CALC_INCDIR to /usr/include or /usr/local/include!!!
26
+ # Always be sure that the CALC_INCDIR path ends in /calc to avoid
27
+ # conflicts with system or other application include files!!!
28
+ #
29
+ -#CALC_INCDIR= /usr/local/include/calc
30
+ +CALC_INCDIR= /usr/local/include/calc
31
+ #CALC_INCDIR= /dev/env/DJDIR/include/calc
32
+ -CALC_INCDIR= ${INCDIR}/calc
33
+ +#CALC_INCDIR= ${INCDIR}/calc
34
+
35
+ # By default, these values are based CALC_SHAREDIR, INCDIR, BINDIR
36
+ # ---------------------------------------------------------------
37
+ @@ -696,9 +696,9 @@
38
+ # Use MANDIR= to disable installation of the calc man (source) page.
39
+ #
40
+ #MANDIR=
41
+ -#MANDIR= /usr/local/man/man1
42
+ +MANDIR= /usr/local/man/man1
43
+ #MANDIR= /usr/man/man1
44
+ -MANDIR= /usr/share/man/man1
45
+ +#MANDIR= /usr/share/man/man1
46
+ #MANDIR= /dev/env/DJDIR/man/man1
47
+ #MANDIR= /usr/man/u_man/man1
48
+ #MANDIR= /usr/contrib/man/man1
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,374 @@
1
+ #! /usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "calc"
5
+
6
+ q = Calc::Q(1)
7
+ c = Calc::C(1, 1)
8
+ all = [Calc, q, c]
9
+ rat = [Calc, q]
10
+ builtins = Calc::Q(0)
11
+ builtins_done = Calc::Q(0)
12
+ exclude = [:singleton_method_added, :to_bn]
13
+
14
+ # this is a list of all calc builtin functions which we want to implement.
15
+ # doesn't include functions where there is a ruby way to do it already (files,
16
+ # strings, arrays, hashes, matrices).
17
+ # each array is a symbol for the method, then a list of things which should
18
+ # respond to it.
19
+ #
20
+ # rand/random related functions are also excluded as there are other ruby
21
+ # methods / libs for good random number generation.
22
+ [
23
+ [:abs, all],
24
+ # access - use File::Stat
25
+ [:acos, all],
26
+ [:acosh, all],
27
+ [:acot, all],
28
+ [:acoth, all],
29
+ [:acsc, all],
30
+ [:acsch, all],
31
+ [:agd, all],
32
+ # append - use Arrays
33
+ [:appr, all],
34
+ [:arg, all],
35
+ # argv - use ARGV
36
+ [:asec, all],
37
+ [:asech, all],
38
+ [:asin, all],
39
+ [:asinh, all],
40
+ # assoc - use {}
41
+ [:atan, all],
42
+ [:atan2, rat],
43
+ [:atanh, all],
44
+ [:avg, Calc],
45
+ # base - use Calc.config
46
+ # base2 - unlikely to implement as config item
47
+ [:bernoulli, rat],
48
+ [:bit, rat],
49
+ # blk - not sure why you'd need these in a ruby script
50
+ # blkcpy
51
+ # bklfree
52
+ # blocks
53
+ [:bround, all],
54
+ [:btrunc, rat],
55
+ # calc_tty
56
+ # calcleve
57
+ # calcpath
58
+ [:catalan, rat],
59
+ [:ceil, all],
60
+ [:cfappr, rat],
61
+ [:cfsim, rat],
62
+ [:char, rat],
63
+ # cmdbuf use ARGV
64
+ [:cmp, all],
65
+ [:comb, all],
66
+ # config - implement on Calc module
67
+ [:conj, all],
68
+ # copy - block stuff
69
+ [:cos, all],
70
+ [:cosh, all],
71
+ [:cot, all],
72
+ [:coth, all],
73
+ # count - use Array#count{} etc
74
+ # cp - use Vector#cross_product (from matrix lib)
75
+ [:csc, all],
76
+ [:csch, all],
77
+ # ctime - use Time.now / Time.now.ctime
78
+ # custom - n/a no plans to access custom compiled functions yet
79
+ # delete - use Array#delete
80
+ [:den, rat],
81
+ # det - use Matrix#det
82
+ [:digit, rat],
83
+ [:digits, rat],
84
+ # display - use Calc.config
85
+ # dp - use Vector#dot
86
+ # epsilon - use Calc.config
87
+ # errcount - only useful in command line calc
88
+ # errmax - only useful in command line calc
89
+ # errno - no libcalc interface
90
+ # error - use raise and ruby exceptions
91
+ [:estr, all],
92
+ [:euler, rat],
93
+ # eval - too hard for now :)
94
+ [:exp, all],
95
+ [:factor, rat],
96
+ [:fcnt, rat],
97
+ [:fib, rat],
98
+ # forall - use ruby loops
99
+ [:frem, rat],
100
+ [:fact, rat],
101
+ # fclose and other file related funcs: use File
102
+ # feof
103
+ # ferror
104
+ # fflush
105
+ # fgetc
106
+ # fgetfield
107
+ # fgetfile
108
+ # fgetline
109
+ # fgets
110
+ # fgetstr
111
+ # files
112
+ [:floor, rat],
113
+ # fopen
114
+ # fpathopen
115
+ # fprintf
116
+ # fputc
117
+ # fputs
118
+ # fputstr
119
+ # free - not necessary in ruby
120
+ [:freebernoulli, Calc],
121
+ [:freeeuler, Calc],
122
+ # freeglobals - not necessary
123
+ # freeredc - no REDC
124
+ # freestatics - not necessary
125
+ # freopen - more File stuff
126
+ # fscan
127
+ # fscanf
128
+ # fseek
129
+ # fsize
130
+ # ftell
131
+ [:frac, all],
132
+ [:gcd, rat],
133
+ [:gcdrem, rat],
134
+ [:gd, all],
135
+ # getenv - use ENV
136
+ # hash - not necessary
137
+ # head - use Array
138
+ [:highbit, rat],
139
+ [:hmean, Calc],
140
+ [:hnrmod, Calc],
141
+ [:hypot, rat],
142
+ [:ilog, all],
143
+ [:ilog10, all],
144
+ [:ilog2, all],
145
+ [:im, all],
146
+ # indices - use ruby Hash/Matrix
147
+ # inputlevel - calc / eval related
148
+ # insert - use Array
149
+ [:int, all],
150
+ [:inverse, all],
151
+ [:iroot, rat],
152
+ # mostly the is* don't make sense in ruby, since only numbers are mapped to
153
+ # ruby types. the ones we do have are named as predicates (iseven-> even?)
154
+ # isassoc
155
+ # isatty
156
+ # isblk
157
+ # isconfig
158
+ # isdefined
159
+ # iserror 1 where a value is an error
160
+ [:iseven, all],
161
+ # isfile
162
+ # ishash
163
+ # isident
164
+ [:isint, all],
165
+ # islist
166
+ # ismat
167
+ [:ismult, rat],
168
+ # isnull
169
+ # isnum
170
+ # isobj
171
+ # isobjtype
172
+ [:isodd, all],
173
+ # isoctet
174
+ [:isprime, rat],
175
+ # isptr
176
+ [:isqrt, rat],
177
+ # isrand
178
+ # israndom
179
+ [:isreal, rat],
180
+ [:isrel, rat],
181
+ # isstr
182
+ # issimple
183
+ [:issq, rat],
184
+ # istype
185
+ [:jacobi, rat],
186
+ # join - use Array#join
187
+ [:lcm, rat],
188
+ [:lcmfact, rat],
189
+ [:lfactor, rat],
190
+ # links - interesting but not necessary
191
+ # list - use Array
192
+ [:ln, all],
193
+ [:log, all],
194
+ [:lowbit, rat],
195
+ [:ltol, rat],
196
+ # makelist - use Array
197
+ # matdim, etc - use ruby Matrix library
198
+ # matfill
199
+ # matmax
200
+ # matmin
201
+ # matsum
202
+ # mattrace
203
+ # mattrans
204
+ [:max, Calc],
205
+ # memsize - not exposed by libcalc
206
+ [:meq, rat],
207
+ [:min, Calc],
208
+ [:minv, rat],
209
+ [:mmin, all],
210
+ [:mne, rat],
211
+ [:mod, all],
212
+ # modify - use Array/Matrix
213
+ # name - block stuff
214
+ [:near, rat],
215
+ # newerror - use ruby exceptions
216
+ [:nextcand, rat],
217
+ [:nextprime, rat],
218
+ [:norm, all],
219
+ # null - use ruby nil
220
+ [:num, rat],
221
+ # ord - use String#ord
222
+ # isupper etc - use String
223
+ # islower
224
+ # isalnum
225
+ # isalpha
226
+ # iscntrl
227
+ # isdigit
228
+ # isgraph
229
+ # isprint
230
+ # ispunct
231
+ # isspace
232
+ # isxdigit
233
+ # param - use ruby method arguments
234
+ [:perm, rat],
235
+ [:prevcand, rat],
236
+ [:prevprime, rat],
237
+ [:pfact, rat],
238
+ [:pi, Calc],
239
+ [:pix, rat],
240
+ [:places, rat],
241
+ [:pmod, rat],
242
+ [:polar, Calc],
243
+ [:poly, Calc],
244
+ # pop - use Array
245
+ [:popcnt, rat],
246
+ [:power, all],
247
+ # protect - block stuff
248
+ [:ptest, rat],
249
+ # printf - use ruby printf
250
+ # prompt - use gets (or highline, etc)
251
+ # push - use array
252
+ # putenv - use ENV
253
+ [:quo, all],
254
+ [:quomod, rat],
255
+ # rand - no random stuff needed
256
+ # randbit
257
+ # random
258
+ # randombit
259
+ # randperm
260
+ # rcin - no REDC
261
+ # rcmul - no REDC
262
+ # rcout - no REDC
263
+ # rcpow - no REDC
264
+ # rcsq - no REDC
265
+ [:re, all],
266
+ # remove - use Array
267
+ # reverse - use Array/Matrix
268
+ # rewind - use File
269
+ # rm - use File
270
+ [:root, all],
271
+ [:round, all],
272
+ # rsearch - use Matrix
273
+ # runtime - use Process#times
274
+ # saveval - not required
275
+ [:scale, all],
276
+ # scan - use ruby i/o methods
277
+ # scanf
278
+ # search - use Array/Matrix methods
279
+ [:sec, all],
280
+ [:sech, all],
281
+ # seed - for random stuff, not needed
282
+ # segment - list/matrix related
283
+ # select
284
+ # setbit - not sure whta this is for
285
+ [:sgn, all],
286
+ # sha1 - use ruby digest module (actually, don't use sha1)
287
+ [:sin, all],
288
+ [:sinh, all],
289
+ # size - related to non-numeric types
290
+ # sizeof - not necessary
291
+ # sleep - use ruby sleep
292
+ # sort - use ruby sort
293
+ [:sqrt, all],
294
+ # srand - no random stuff
295
+ # srandom
296
+ [:ssq, Calc],
297
+ # stoponerror - not in link library
298
+ # str - use to_s
299
+ # strtoupper - use ruby Strings instead of this stuff
300
+ # strtolower
301
+ # strcat
302
+ # strcmp
303
+ # strcasecmp
304
+ # strcpy
305
+ # strerror
306
+ # strlen
307
+ # strncmp
308
+ # strncasecmp
309
+ # strncpy
310
+ # strpos
311
+ # strprintf
312
+ # strscan
313
+ # strscanf
314
+ # substr
315
+ [:sum, Calc],
316
+ # swap - not necessary, use: a,b=b,a
317
+ # system - use ruby system
318
+ # systime - use Process#times
319
+ # tail - use Array
320
+ [:tan, all],
321
+ [:tanh, all],
322
+ # test - not needed; truthiness in ruby is different. for Q/C, use !zero?
323
+ # time - use Time.now.to_i
324
+ [:trunc, rat],
325
+ # ungetc - i/o stuff
326
+ # usertime - use Process#times
327
+ [:version, Calc],
328
+ [:xor, rat]
329
+ ].each do |func, (*things)|
330
+ builtins += 1
331
+ missing = [*things].reject do |thing|
332
+ thing.respond_to?(func)
333
+ end
334
+ if missing.any?
335
+ puts("Expected method #{ func } on " + missing.map do |thing|
336
+ thing.is_a?(Module) ? "module #{ thing }" : "class #{ thing.class }"
337
+ end.join(", "))
338
+ else
339
+ builtins_done += 1
340
+ end
341
+ end
342
+
343
+ # check for compatibility with built in ruby equivalents
344
+
345
+ rat_methods = Rational(1, 2).methods - exclude
346
+ com_methods = Complex(1, 2).methods - exclude
347
+ fix_methods = 1.methods - exclude
348
+ q_methods = Calc::Q(1).methods
349
+ c_methods = Calc::C(1, 1).methods
350
+
351
+ ((rat_methods & fix_methods) - q_methods).sort.each do |m|
352
+ puts "Calc::Q needs method #{ m } for Rational and Fixnum compatibility"
353
+ end
354
+
355
+ (rat_methods - fix_methods - q_methods).sort.each do |m|
356
+ puts "Calc::Q needs method #{ m } for Rational compatibility"
357
+ end
358
+
359
+ (fix_methods - rat_methods - q_methods).sort.each do |m|
360
+ puts "Calc::Q needs method #{ m } for Fixnum compatibility"
361
+ end
362
+
363
+ (com_methods - c_methods).sort.each do |m|
364
+ puts "Calc::C needs method #{ m } for Complex compatibility"
365
+ end
366
+
367
+ [
368
+ ["ruby-calc builtins", builtins_done, builtins],
369
+ ["Rational compatibility", (rat_methods & q_methods).size, rat_methods.size.to_f],
370
+ ["Fixnum compatibility", (fix_methods & q_methods).size, fix_methods.size.to_f],
371
+ ["Complex compatibility", (com_methods & c_methods).size, com_methods.size.to_f]
372
+ ].each do |goal, done, total|
373
+ printf "%25s: %3d/%3d (%3.1f%%)\n", goal, done, total, done / total * 100
374
+ end