xrpn 1.1.5 → 1.1.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/xrpn +1 -3
- data/lib/xrpn.rb +1 -1
- data/xcmd/abs +7 -0
- data/xcmd/acos +10 -0
- data/xcmd/adate +12 -0
- data/xcmd/adateiso +13 -0
- data/xcmd/add +9 -0
- data/xcmd/adv +7 -0
- data/xcmd/agsub +8 -0
- data/xcmd/aleng +8 -0
- data/xcmd/almcat +7 -0
- data/xcmd/almnow +7 -0
- data/xcmd/anum +10 -0
- data/xcmd/aoff +7 -0
- data/xcmd/aon +7 -0
- data/xcmd/appchr +13 -0
- data/xcmd/apprec +13 -0
- data/xcmd/arcl +22 -0
- data/xcmd/arcli +7 -0
- data/xcmd/arclrec +30 -0
- data/xcmd/arot +13 -0
- data/xcmd/ashf +7 -0
- data/xcmd/asin +10 -0
- data/xcmd/asroom +7 -0
- data/xcmd/asto +21 -0
- data/xcmd/asub +8 -0
- data/xcmd/atan +10 -0
- data/xcmd/atime +26 -0
- data/xcmd/atime24 +21 -0
- data/xcmd/atox +9 -0
- data/xcmd/aview +7 -0
- data/xcmd/aviewc +7 -0
- data/xcmd/beep +7 -0
- data/xcmd/bindec +8 -0
- data/xcmd/cat +26 -0
- data/xcmd/cf +7 -0
- data/xcmd/chs +7 -0
- data/xcmd/cla +7 -0
- data/xcmd/clalma +7 -0
- data/xcmd/clalmx +7 -0
- data/xcmd/cld +6 -0
- data/xcmd/clear +7 -0
- data/xcmd/clfl +13 -0
- data/xcmd/clk12 +7 -0
- data/xcmd/clk24 +7 -0
- data/xcmd/clkeys +7 -0
- data/xcmd/clock +7 -0
- data/xcmd/clp +8 -0
- data/xcmd/clralms +7 -0
- data/xcmd/clrg +7 -0
- data/xcmd/clrgx +12 -0
- data/xcmd/cls +12 -0
- data/xcmd/clst +10 -0
- data/xcmd/clx +8 -0
- data/xcmd/cmdadd +7 -0
- data/xcmd/cmddel +7 -0
- data/xcmd/correct +7 -0
- data/xcmd/cos +10 -0
- data/xcmd/crflas +9 -0
- data/xcmd/crfld +9 -0
- data/xcmd/cube +8 -0
- data/xcmd/d_r +8 -0
- data/xcmd/date +8 -0
- data/xcmd/dateplus +12 -0
- data/xcmd/ddate +11 -0
- data/xcmd/dec +7 -0
- data/xcmd/decbin +8 -0
- data/xcmd/dechex +8 -0
- data/xcmd/decoct +8 -0
- data/xcmd/deg +7 -0
- data/xcmd/degq +7 -0
- data/xcmd/delchr +14 -0
- data/xcmd/delrec +12 -0
- data/xcmd/divide +9 -0
- data/xcmd/dmy +7 -0
- data/xcmd/dot +7 -0
- data/xcmd/dow +9 -0
- data/xcmd/drop +7 -0
- data/xcmd/dropy +7 -0
- data/xcmd/dse +40 -0
- data/xcmd/ed +7 -0
- data/xcmd/emdir +7 -0
- data/xcmd/emdirx +14 -0
- data/xcmd/emroom +7 -0
- data/xcmd/end +9 -0
- data/xcmd/eng +9 -0
- data/xcmd/enter +8 -0
- data/xcmd/exp +9 -0
- data/xcmd/expx1 +9 -0
- data/xcmd/fact +9 -0
- data/xcmd/fc +7 -0
- data/xcmd/fcc +8 -0
- data/xcmd/fcs +8 -0
- data/xcmd/fix +9 -0
- data/xcmd/fixq +7 -0
- data/xcmd/flsize +7 -0
- data/xcmd/frc +8 -0
- data/xcmd/fs +7 -0
- data/xcmd/fsc +8 -0
- data/xcmd/fss +8 -0
- data/xcmd/geir +11 -0
- data/xcmd/getas +7 -0
- data/xcmd/getfile +12 -0
- data/xcmd/getfilea +11 -0
- data/xcmd/getkey +9 -0
- data/xcmd/getkeyx +10 -0
- data/xcmd/getp +13 -0
- data/xcmd/getr +13 -0
- data/xcmd/getrec +8 -0
- data/xcmd/getrx +17 -0
- data/xcmd/getsub +7 -0
- data/xcmd/getweb +12 -0
- data/xcmd/getx +12 -0
- data/xcmd/grad +7 -0
- data/xcmd/gsb +7 -0
- data/xcmd/gto +23 -0
- data/xcmd/help +14 -0
- data/xcmd/hexdec +8 -0
- data/xcmd/hms +12 -0
- data/xcmd/hmsminus +14 -0
- data/xcmd/hmsplus +13 -0
- data/xcmd/hr +11 -0
- data/xcmd/inschr +14 -0
- data/xcmd/insrec +12 -0
- data/xcmd/int +8 -0
- data/xcmd/invf +7 -0
- data/xcmd/isg +40 -0
- data/xcmd/lastx +8 -0
- data/xcmd/lbl +6 -0
- data/xcmd/lift +8 -0
- data/xcmd/ln +8 -0
- data/xcmd/ln1x +8 -0
- data/xcmd/log +8 -0
- data/xcmd/mdy +7 -0
- data/xcmd/mean +11 -0
- data/xcmd/mod +13 -0
- data/xcmd/multiply +9 -0
- data/xcmd/oct +7 -0
- data/xcmd/octdec +8 -0
- data/xcmd/off +8 -0
- data/xcmd/on +7 -0
- data/xcmd/p_r +13 -0
- data/xcmd/pack +7 -0
- data/xcmd/page +13 -0
- data/xcmd/pagedel +8 -0
- data/xcmd/pageq +7 -0
- data/xcmd/pageswap +8 -0
- data/xcmd/pasn +7 -0
- data/xcmd/pcat +14 -0
- data/xcmd/pclps +12 -0
- data/xcmd/percent +9 -0
- data/xcmd/percentch +9 -0
- data/xcmd/pi +8 -0
- data/xcmd/posa +23 -0
- data/xcmd/posfl +26 -0
- data/xcmd/pow +9 -0
- data/xcmd/pprg +27 -0
- data/xcmd/pprgx +33 -0
- data/xcmd/pra +7 -0
- data/xcmd/prflags +8 -0
- data/xcmd/prompt +8 -0
- data/xcmd/prp +7 -0
- data/xcmd/prregs +8 -0
- data/xcmd/prstk +10 -0
- data/xcmd/prx +7 -0
- data/xcmd/prxm +21 -0
- data/xcmd/pse +7 -0
- data/xcmd/psize +7 -0
- data/xcmd/purfl +14 -0
- data/xcmd/r_d +8 -0
- data/xcmd/r_p +18 -0
- data/xcmd/rad +7 -0
- data/xcmd/rand +10 -0
- data/xcmd/rcl +23 -0
- data/xcmd/rclaf +7 -0
- data/xcmd/rclflag +16 -0
- data/xcmd/rclpt +8 -0
- data/xcmd/rclpta +16 -0
- data/xcmd/rclsw +7 -0
- data/xcmd/rdn +7 -0
- data/xcmd/recip +8 -0
- data/xcmd/regmove +18 -0
- data/xcmd/regswap +19 -0
- data/xcmd/reload +7 -0
- data/xcmd/reszfl +7 -0
- data/xcmd/rnd +8 -0
- data/xcmd/root +9 -0
- data/xcmd/rtn +12 -0
- data/xcmd/rubycmd +7 -0
- data/xcmd/runsw +7 -0
- data/xcmd/rup +7 -0
- data/xcmd/saveas +7 -0
- data/xcmd/savep +7 -0
- data/xcmd/saver +24 -0
- data/xcmd/saverx +31 -0
- data/xcmd/savex +10 -0
- data/xcmd/savexm +7 -0
- data/xcmd/sci +9 -0
- data/xcmd/sdev +11 -0
- data/xcmd/seekpt +10 -0
- data/xcmd/seekpta +7 -0
- data/xcmd/sep +7 -0
- data/xcmd/setaf +7 -0
- data/xcmd/setsw +7 -0
- data/xcmd/sf +7 -0
- data/xcmd/shellcmd +7 -0
- data/xcmd/sign +19 -0
- data/xcmd/sin +10 -0
- data/xcmd/size +7 -0
- data/xcmd/sizeq +7 -0
- data/xcmd/sminus +20 -0
- data/xcmd/splus +20 -0
- data/xcmd/sqr +8 -0
- data/xcmd/sqrt +8 -0
- data/xcmd/sreg +7 -0
- data/xcmd/sregq +7 -0
- data/xcmd/stdivide +22 -0
- data/xcmd/stmultiply +22 -0
- data/xcmd/sto +21 -0
- data/xcmd/stoflag +13 -0
- data/xcmd/stop +7 -0
- data/xcmd/stopsw +7 -0
- data/xcmd/stplus +22 -0
- data/xcmd/stsubtract +22 -0
- data/xcmd/subtract +9 -0
- data/xcmd/sw +7 -0
- data/xcmd/swap +7 -0
- data/xcmd/swpt +7 -0
- data/xcmd/tan +10 -0
- data/xcmd/tenx +8 -0
- data/xcmd/time +8 -0
- data/xcmd/tx +7 -0
- data/xcmd/version +7 -0
- data/xcmd/view +7 -0
- data/xcmd/writefile +12 -0
- data/xcmd/xeq +21 -0
- data/xcmd/xeq0 +7 -0
- data/xcmd/xeqnn +9 -0
- data/xcmd/xeqy +7 -0
- data/xcmd/xf +20 -0
- data/xcmd/xgt0 +7 -0
- data/xcmd/xgteq0 +7 -0
- data/xcmd/xgteqnn +9 -0
- data/xcmd/xgteqy +7 -0
- data/xcmd/xgtnn +9 -0
- data/xcmd/xgty +7 -0
- data/xcmd/xlt0 +7 -0
- data/xcmd/xlteq0 +7 -0
- data/xcmd/xlteqnn +9 -0
- data/xcmd/xlteqy +7 -0
- data/xcmd/xltnn +9 -0
- data/xcmd/xlty +7 -0
- data/xcmd/xmexistq +15 -0
- data/xcmd/xmfileq +7 -0
- data/xcmd/xneq0 +7 -0
- data/xcmd/xneqnn +9 -0
- data/xcmd/xneqy +7 -0
- data/xcmd/xnn +21 -0
- data/xcmd/xtoa +7 -0
- data/xcmd/xy +7 -0
- data/xcmd/xyzalm +7 -0
- data/xlib/_xrpn_version +5 -0
- data/xlib/bei +18 -0
- data/xlib/check +26 -0
- data/xlib/conditional +10 -0
- data/xlib/convert_base +8 -0
- data/xlib/debug_mode +124 -0
- data/xlib/dtparse +10 -0
- data/xlib/error +10 -0
- data/xlib/fact +7 -0
- data/xlib/getpt +7 -0
- data/xlib/help +12 -0
- data/xlib/hp_41 +83 -0
- data/xlib/ind +21 -0
- data/xlib/load_xm +28 -0
- data/xlib/locate_prg +32 -0
- data/xlib/numeric +62 -0
- data/xlib/numformat +12 -0
- data/xlib/optparse +23 -0
- data/xlib/read_cmd +12 -0
- data/xlib/read_state +6 -0
- data/xlib/save_state +18 -0
- data/xlib/save_xm +5 -0
- data/xlib/setpt +5 -0
- data/xlib/string +28 -0
- data/xlib/theme +23 -0
- data/xlib/xrpn_class +34 -0
- data/xrpn.gemspec +2 -2
- metadata +287 -2
data/xlib/debug_mode
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
def debug_mode
|
2
|
+
prompt = TTY::Prompt.new
|
3
|
+
loop do
|
4
|
+
if $prompt
|
5
|
+
@line = prompt.ask(":")
|
6
|
+
break
|
7
|
+
else
|
8
|
+
puts "─" * 30
|
9
|
+
@p.prstk
|
10
|
+
print "> "
|
11
|
+
@ln = STDIN.getch
|
12
|
+
while IO.select([STDIN], [], [], 0) != nil # Flush STDIN (remove control chars)
|
13
|
+
STDIN.getch
|
14
|
+
end
|
15
|
+
if ["+", "-", "*", "/", "%"].include?(@ln)
|
16
|
+
print "\e[32m" + @ln + "\e[0m\n"
|
17
|
+
@ln = [@ln]
|
18
|
+
@line = hp_41(@ln)[0]
|
19
|
+
break
|
20
|
+
elsif @ln == "\r" # A simple ENTER
|
21
|
+
@line = "lift"
|
22
|
+
puts "\n"
|
23
|
+
break
|
24
|
+
end
|
25
|
+
print "\e[1G\e[K" # Clears from the beginning of line (removes getch prompt)
|
26
|
+
@line = prompt.ask(">", value: @ln)
|
27
|
+
unless @line == nil or @line.length == 1
|
28
|
+
@line = [@line]
|
29
|
+
@line = hp_41(@line)[0]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
case @line
|
33
|
+
when "q" # Quit
|
34
|
+
puts "\n"
|
35
|
+
exit
|
36
|
+
when "Q" # Save and quit
|
37
|
+
save_state()
|
38
|
+
puts "\n"
|
39
|
+
exit
|
40
|
+
when /> .*/
|
41
|
+
state = @line.sub(/> /, '')
|
42
|
+
save_state(state)
|
43
|
+
when /< .*/
|
44
|
+
state = @line.sub(/< /, '')
|
45
|
+
read_state(state)
|
46
|
+
when "c"
|
47
|
+
system("clear")
|
48
|
+
when "C"
|
49
|
+
@p.x = 0.0
|
50
|
+
@p.y = 0.0
|
51
|
+
@p.z = 0.0
|
52
|
+
@p.t = 0.0
|
53
|
+
@p.l = 0.0
|
54
|
+
@p.a = ""
|
55
|
+
@p.deg = "deg"
|
56
|
+
@p.i = 4
|
57
|
+
@p.s = 6
|
58
|
+
@p.srg = 11
|
59
|
+
@p.reg = {}
|
60
|
+
@p.flg = {}
|
61
|
+
system("clear")
|
62
|
+
when "R" # Reload all commands from the cmd directory
|
63
|
+
read_cmd
|
64
|
+
puts "Commands reloaded."
|
65
|
+
when "l" # Show current line
|
66
|
+
@line = @p.prg[@p.pg][@p.pc]
|
67
|
+
puts "Line #{@p.pc + 1}: \"#{@line}\"" # Line 1 is @p.prg[@p.pg][0]
|
68
|
+
when "n" # Show next line
|
69
|
+
if @p.pc + 1 > @p.prg[@p.pg].length
|
70
|
+
puts "End of program"
|
71
|
+
else
|
72
|
+
@line = @p.prg[@p.pg][@p.pc + 1]
|
73
|
+
puts "Line #{@p.pc + 2}: \"#{@line}\"" # Line 1 is @p.prg[@p.pg][0]
|
74
|
+
end
|
75
|
+
when "p" # Show previous line
|
76
|
+
if @p.pc - 1 < 0
|
77
|
+
puts "Beginning of program"
|
78
|
+
else
|
79
|
+
@line = @p.prg[@p.pg][@p.pc - 1]
|
80
|
+
puts "Line #{@p.pc}: \"#{@line}\"" # Line 1 is @p.prg[@p.pg][0]
|
81
|
+
end
|
82
|
+
when "S" # Go to next line without executing it
|
83
|
+
@p.pc += 1
|
84
|
+
if @p.pc > @p.prg[@p.pg].length
|
85
|
+
puts "End of program"
|
86
|
+
else
|
87
|
+
@line = @p.prg[@p.pg][@p.pc + 1]
|
88
|
+
puts "Line #{@p.pc + 2}: \"#{@line}\"" # Line 1 is @p.prg[@p.pg][0]
|
89
|
+
end
|
90
|
+
when "s" # Single-step the next program line
|
91
|
+
@p.pc += 1
|
92
|
+
if @p.pc == @p.prg[@p.pg].length
|
93
|
+
@line = "END"
|
94
|
+
break
|
95
|
+
end
|
96
|
+
@line = @p.prg[@p.pg][@p.pc]
|
97
|
+
puts "Line #{@p.pc + 1}: #{@line}" # Line 1 is @p.prg[@p.pg][0]
|
98
|
+
$sst = true
|
99
|
+
break
|
100
|
+
when "b" # Back-step one line
|
101
|
+
@p.pc -= 1 unless @p.pc == 0
|
102
|
+
when /^\+\+ /
|
103
|
+
@p.prg[@p.pg].insert(@p.pc + 1, @line.sub(/^\+\+ /, ''))
|
104
|
+
when "--"
|
105
|
+
@p.prg[@p.pg].delete_at(@p.pc)
|
106
|
+
when nil # A simple ENTER
|
107
|
+
@line = "lift"
|
108
|
+
break
|
109
|
+
when "r" # End debug mode
|
110
|
+
@p.pc += 1
|
111
|
+
@line = @p.prg[@p.pg][@p.pc]
|
112
|
+
@line = "end" if @line == nil
|
113
|
+
$debug = false
|
114
|
+
$sst = false
|
115
|
+
break unless @p.flg["44"]
|
116
|
+
else
|
117
|
+
break unless @p.flg["44"]
|
118
|
+
end
|
119
|
+
end
|
120
|
+
$prompt = false
|
121
|
+
end
|
122
|
+
|
123
|
+
|
124
|
+
# vim:ft=ruby:
|
data/xlib/dtparse
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
def dtparse(date)
|
2
|
+
@flg["31"] ? d = date.to_i : m = date.to_i
|
3
|
+
@flg["31"] ? m = ((date - date.to_i) * 100).to_i : d = ((date - date.to_i) * 100).to_i
|
4
|
+
y = (((date * 100) - (date * 100).to_i) * 10000).to_i
|
5
|
+
dt = "#{y.to_s}-#{m.to_s}-#{d.to_s}"
|
6
|
+
return Date.parse(dt)
|
7
|
+
end
|
8
|
+
|
9
|
+
|
10
|
+
# vim:ft=ruby:
|
data/xlib/error
ADDED
data/xlib/fact
ADDED
data/xlib/getpt
ADDED
data/xlib/help
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
def help
|
2
|
+
puts <<HELPTEXT
|
3
|
+
XRPN is a stack-based programming language. It uses Reverse Polish Notation for calculations.
|
4
|
+
The language is a superset of FOCAL, implementing the full set of HP-41CX calculator commands.
|
5
|
+
XRPN is on-the-fly extensible. Language functions can be upgraded or implemented while programs are running.
|
6
|
+
It runs programs in text files or manually in debug mode (if no text file is supplied or when a program stops)
|
7
|
+
XRPN implements indirect adressing, self-modification and features well beyond the FOCAL language.
|
8
|
+
For detailed information, visit the GitHub page: https://github.com/isene/xrpn
|
9
|
+
HELPTEXT
|
10
|
+
end
|
11
|
+
|
12
|
+
# vim:ft=ruby:
|
data/xlib/hp_41
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
def hp_41 (a)
|
2
|
+
a.map!{|x| x.sub( /^\s+/, "" )} # Remove spaces at start of line
|
3
|
+
a.map!{|x| x.sub( /^\d\d+[^0-9.]/, "" )} # Remove line numbers from program
|
4
|
+
a.map!{|x| x.sub( /\s+$/, "" )} # Remove trailing spaces
|
5
|
+
a.map!{|x| x.sub( /\s\s+/, "" )} # Remove multiple spaces
|
6
|
+
a.map!{|x| x.sub( /([a-zA-Z ]*)/, &:downcase)} # Downcase everything (use the /i below here)
|
7
|
+
a.map!{|x| x.sub( /ENTER\^/i, "enter" )}
|
8
|
+
a.map!{|x| x.sub( /R\^/i, "rup" )}
|
9
|
+
a.map!{|x| x.sub( /X\^2/i, "sqr" )}
|
10
|
+
a.map!{|x| x.sub( /X\*\*2/i, "sqr" )}
|
11
|
+
a.map!{|x| x.sub( /^E(\d+)/i, '1e\1' )}
|
12
|
+
a.map!{|x| x.sub( /1\/X/i, "recip" )}
|
13
|
+
a.map!{|x| x.sub( /HMS\+/i, "hmsplus" )}
|
14
|
+
a.map!{|x| x.sub( /HMS-/i, "hmsminus" )}
|
15
|
+
a.map!{|x| x.sub( /DATE\+/i, "dateplus" )}
|
16
|
+
a.map!{|x| x.sub( /Σ\+/i, "splus" )}
|
17
|
+
a.map!{|x| x.sub( /Σ-/i, "sminus" )}
|
18
|
+
a.map!{|x| x.sub( /S\+/i, "splus" )}
|
19
|
+
a.map!{|x| x.sub( /S-/i, "sminus" )}
|
20
|
+
a.map!{|x| x.sub( /SIGMA\+/i, "splus" )}
|
21
|
+
a.map!{|x| x.sub( /SIGMA-/i, "sminus" )}
|
22
|
+
a.map!{|x| x.sub( /SIGMAREG/, "sreg" )}
|
23
|
+
a.map!{|x| x.sub( /CLSIGMA/, "cls" )}
|
24
|
+
a.map!{|x| x.sub( /STO?\+/i, "stplus" )}
|
25
|
+
a.map!{|x| x.sub( /STO?-/i, "stsubtract" )}
|
26
|
+
a.map!{|x| x.sub( /STO?\*/i, "stmultiply" )}
|
27
|
+
a.map!{|x| x.sub( /STO?\//i, "stdivide" )}
|
28
|
+
a.map!{|x| x.sub( /%CH/i, "perch" )}
|
29
|
+
a.map!{|x| x.sub( /Y\^X/i, "pow" )}
|
30
|
+
a.map!{|x| x.sub( /Y\*\*X/i, "pow" )}
|
31
|
+
a.map!{|x| x.sub( /LN1\+X/i, "ln1x" )}
|
32
|
+
a.map!{|x| x.sub( /E\^X-1/i, "expx1" )} # Must come before next
|
33
|
+
a.map!{|x| x.sub( /E\^X/i, "exp" )}
|
34
|
+
a.map!{|x| x.sub( /E\*\*X-1/i, "expx1" )} # Must come before next
|
35
|
+
a.map!{|x| x.sub( /E\*\*X/i, "exp" )}
|
36
|
+
a.map!{|x| x.sub( /10\^X/i, "tenx" )}
|
37
|
+
a.map!{|x| x.sub( /10\*\*X/i, "tenx" )}
|
38
|
+
a.map!{|x| x.sub( /P-R/i, "p_r" )}
|
39
|
+
a.map!{|x| x.sub( /P->R/i, "p_r" )}
|
40
|
+
a.map!{|x| x.sub( /R-P/i, "r_p" )}
|
41
|
+
a.map!{|x| x.sub( /R->P/i, "r_p" )}
|
42
|
+
a.map!{|x| x.sub( /D-R/i, "d_r" )}
|
43
|
+
a.map!{|x| x.sub( /D->R/i, "d_r" )}
|
44
|
+
a.map!{|x| x.sub( /R-D/i, "r_d" )}
|
45
|
+
a.map!{|x| x.sub( /R->D/i, "r_d" )}
|
46
|
+
a.map!{|x| x.sub( /X<>Y/i, "xy" )}
|
47
|
+
a.map!{|x| x.sub( /X<>F/i, "xf" )}
|
48
|
+
a.map!{|x| x.sub( /X<>/i, "xnn" )}
|
49
|
+
a.map!{|x| x.sub( /X<>NN/i, "xnn" )}
|
50
|
+
a.map!{|x| x.sub( /FC\?C/i, "fcc?" )}
|
51
|
+
a.map!{|x| x.sub( /FS\?C/i, "fsc?" )}
|
52
|
+
a.map!{|x| x.sub( /X=Y\?/i, "xeqy?" )}
|
53
|
+
a.map!{|x| x.sub( /X#Y\?/i, "xneqy?" )}
|
54
|
+
a.map!{|x| x.sub( /X!=Y\?/i, "xneqy?" )}
|
55
|
+
a.map!{|x| x.sub( /X<>Y\?/i, "xneqy?" )}
|
56
|
+
a.map!{|x| x.sub( /X<Y\?/i, "xlty?" )}
|
57
|
+
a.map!{|x| x.sub( /X<=Y\?/i, "xlteqy?" )}
|
58
|
+
a.map!{|x| x.sub( /X>Y\?/i, "xgty?" )}
|
59
|
+
a.map!{|x| x.sub( /X>=Y\?/i, "xgteqy?" )}
|
60
|
+
a.map!{|x| x.sub( /X=0\?/i, "xeq0?" )}
|
61
|
+
a.map!{|x| x.sub( /X#0\?/i, "xneq0?" )}
|
62
|
+
a.map!{|x| x.sub( /X!=0\?/i, "xneq0?" )}
|
63
|
+
a.map!{|x| x.sub( /X<>0\?/i, "xneq0?" )}
|
64
|
+
a.map!{|x| x.sub( /X<0\?/i, "xlt0?" )}
|
65
|
+
a.map!{|x| x.sub( /X<=0\?/i, "xlteq0?" )}
|
66
|
+
a.map!{|x| x.sub( /X>0\?/i, "xgt0?" )}
|
67
|
+
a.map!{|x| x.sub( /X>=0\?/i, "xgteq0?" )}
|
68
|
+
a.map!{|x| x.sub( /X=NN\?/i, "xeqnn?" )}
|
69
|
+
a.map!{|x| x.sub( /X#NN\?/i, "xneqnn?" )}
|
70
|
+
a.map!{|x| x.sub( /X!=NN\?/i, "xneqnn?" )}
|
71
|
+
a.map!{|x| x.sub( /X<>NN\?/i, "xneqnn?" )}
|
72
|
+
a.map!{|x| x.sub( /X<NN\?/i, "xltnn?" )}
|
73
|
+
a.map!{|x| x.sub( /X<=NN\?/i, "xlteqnn?" )}
|
74
|
+
a.map!{|x| x.sub( /X>NN\?/i, "xgtnn?" )}
|
75
|
+
a.map!{|x| x.sub( /X>=NN\?/i, "xgteqnn?" )}
|
76
|
+
a.map!{|x| x.sub( /T\+X/i, "tx" )}
|
77
|
+
a.map!{|x| x.sub( /GOTO/i, "gto" )}
|
78
|
+
a.delete("")
|
79
|
+
a.compact!
|
80
|
+
return a
|
81
|
+
end
|
82
|
+
|
83
|
+
# vim:ft=ruby:
|
data/xlib/ind
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
def ind(l3)
|
2
|
+
case l3
|
3
|
+
when "x"
|
4
|
+
l2 = @p.x.to_i.to_s
|
5
|
+
when "y"
|
6
|
+
l2 = @p.y.to_i.to_s
|
7
|
+
when "z"
|
8
|
+
l2 = @p.z.to_i.to_s
|
9
|
+
when "t"
|
10
|
+
l2 = @p.t.to_i.to_s
|
11
|
+
when "l"
|
12
|
+
l2 = @p.l.to_i.to_s
|
13
|
+
else
|
14
|
+
l2 = @p.reg[l3].to_i.to_s
|
15
|
+
end
|
16
|
+
l2 = "%02d" % [l2] if l2 == l2.to_i.to_s
|
17
|
+
return l2
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
# vim:ft=ruby:
|
data/xlib/load_xm
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
def load_xm(f, pt=nil) # Raw file name and pointer
|
2
|
+
f = Dir.home + "/.xrpn/data/" + f
|
3
|
+
fl = [f + ".da", f + ".as"]
|
4
|
+
hit = false
|
5
|
+
fl.each do |file|
|
6
|
+
if File.exist?(file)
|
7
|
+
@xmcont = JSON.parse(File.read(file))
|
8
|
+
@xmfile = file
|
9
|
+
@xmcont[0][0] = file
|
10
|
+
unless pt == nil
|
11
|
+
@xmcont[0][3] = pt
|
12
|
+
save_xm
|
13
|
+
end
|
14
|
+
@xmcont[0][3] = 0.0 if @xmcont[0][3] < 0.0
|
15
|
+
@xmcont[0][3] = @xmcont.length.to_f - 2 if @xmcont[0][3] > @xmcont.length + 2
|
16
|
+
@xmcont[0][1] = "DA" if file.match(/da$/)
|
17
|
+
@xmcont[0][1] = "AS" if file.match(/as$/)
|
18
|
+
hit = true
|
19
|
+
end
|
20
|
+
end
|
21
|
+
if hit
|
22
|
+
puts "Loaded XM file: #{@a} (#{@xmcont[0][0]})"
|
23
|
+
else
|
24
|
+
puts "No such XM file: #{@a}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# vim:ft=ruby:
|
data/xlib/locate_prg
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
def locate_prg (l)
|
2
|
+
lbl = "lbl #{l}"
|
3
|
+
page = nil
|
4
|
+
pos = nil
|
5
|
+
prgm = []
|
6
|
+
if lbl.match(/".*"/)
|
7
|
+
@prg.each_index do |p|
|
8
|
+
pos = @prg[p].index {|e| e == lbl}
|
9
|
+
page = p unless pos == nil
|
10
|
+
break if pos != nil
|
11
|
+
end
|
12
|
+
else
|
13
|
+
@prg[@pg][@pc..-1].each_with_index do |e, i|
|
14
|
+
pos = i + @pc if e == lbl
|
15
|
+
break if pos != nil
|
16
|
+
end
|
17
|
+
pos = @prg[@pg].index {|e| e == lbl} if pos == nil
|
18
|
+
page = @pg
|
19
|
+
end
|
20
|
+
if pos != nil
|
21
|
+
l = pos
|
22
|
+
until l == @prg[page].length do
|
23
|
+
line = @prg[page][l]
|
24
|
+
prgm.push(line)
|
25
|
+
break if line == "END"
|
26
|
+
l += 1
|
27
|
+
end
|
28
|
+
end
|
29
|
+
return page, pos, prgm
|
30
|
+
end
|
31
|
+
|
32
|
+
# vim:ft=ruby:
|
data/xlib/numeric
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
class Numeric
|
2
|
+
|
3
|
+
def frc
|
4
|
+
f = BigDecimal(self.to_s) - BigDecimal(self.to_s).to_i
|
5
|
+
return BigDecimal(f.to_s).to_s('F').to_f
|
6
|
+
end
|
7
|
+
|
8
|
+
def to_rad
|
9
|
+
self * Math::PI / 180
|
10
|
+
end
|
11
|
+
def to_radg
|
12
|
+
self * Math::PI / 200
|
13
|
+
end
|
14
|
+
def to_deg
|
15
|
+
self * 180 / Math::PI
|
16
|
+
end
|
17
|
+
def to_grad
|
18
|
+
self * 200 / Math::PI
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_num(n=3, i=2, g=1, c=false, p=false)
|
22
|
+
# n: Threshold for when to show exponent
|
23
|
+
# i: Number og digits after the period
|
24
|
+
# g: Exponent grouping g=3 would always show exponent as a multiple of 3
|
25
|
+
# c: Use comma instead of period (European format)
|
26
|
+
# p: Separator per 3 digits (period if c=false, space when c=true)
|
27
|
+
# e: Exponent
|
28
|
+
# ge: Grouped exponent
|
29
|
+
# x: Absolute value of number less exponent
|
30
|
+
# s: String to be displayed
|
31
|
+
n = g if g > n
|
32
|
+
self != 0 ? e = Math::log10(self.abs).floor : e = 0
|
33
|
+
ge = g*(e/g).to_i
|
34
|
+
x = self.abs
|
35
|
+
x = (x / 10 ** ge) if e.abs >= n
|
36
|
+
s = x.to_i.to_s
|
37
|
+
self < 0 ? m = "-" : m = ""
|
38
|
+
s.sub!(/-/, '')
|
39
|
+
f = x.frc.to_s[0..(i + 1)].to_f
|
40
|
+
f = f.to_s.sub(/../, '')
|
41
|
+
i > 0 ? s.sub!(/(\d*\.)(\d{,#{i}}).*/, '\1\2') : s.sub!(/(\d*).*/, '\1')
|
42
|
+
if e.abs >= n # If exponent kicks in
|
43
|
+
s += "." + f.ljust(i, "0")
|
44
|
+
s += "e"
|
45
|
+
if ge < 0
|
46
|
+
s += "-"
|
47
|
+
s.sub!(/0\.(\d)/, '\1.')
|
48
|
+
end
|
49
|
+
ge = ge.abs
|
50
|
+
s += "%02d" % [ge]
|
51
|
+
else # No exponent
|
52
|
+
o = "," if p and not c
|
53
|
+
o = " " if p and c
|
54
|
+
s.gsub!(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1#{o}") if p
|
55
|
+
s += "." + f.to_s.ljust(i, "0")
|
56
|
+
end
|
57
|
+
s.sub!(/\./, ',') if c
|
58
|
+
return m + s
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# vim:ft=ruby:
|
data/xlib/numformat
ADDED
data/xlib/optparse
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# Handle the command line options
|
2
|
+
options = {}
|
3
|
+
optparse = OptionParser.new do |opts|
|
4
|
+
# Set a banner, displayed at the top of the help screen.
|
5
|
+
opts.banner = "Usage: xrpn [options]"
|
6
|
+
|
7
|
+
# Define the options, and what they do
|
8
|
+
opts.on('-f', '--file program', 'Specify the file to process') { |f| $rfile = f }
|
9
|
+
opts.on('-l', '--load program(s)', Array, 'File(s) to load, but not run') { |l| $lfile = l }
|
10
|
+
opts.on('-s', '--state STATE', 'Load a State file') { |s| $sfile = s }
|
11
|
+
opts.on('-c', '--check program', 'Program file to check for errors') { |c| check(c); exit }
|
12
|
+
opts.on('-x', '--X X-value', 'Set initial value in the X register') { |x| @x = x.to_f }
|
13
|
+
opts.on('-y', '--Y Y-value', 'Set initial value in the Y register') { |y| @y = y.to_f }
|
14
|
+
opts.on('-z', '--Z Z-value', 'Set initial value in the Z register') { |z| @z = z.to_f }
|
15
|
+
opts.on('-t', '--T T-value', 'Set initial value in the T register') { |t| @t = t.to_f }
|
16
|
+
opts.on('-a', '--Alpha Alpha-string', 'Set initial string in Alpha') { |a| @a = a.to_s }
|
17
|
+
opts.on('-h', 'Display SHORT help text') { puts opts; exit }
|
18
|
+
opts.on('--help', 'Display LONG help text') { help; puts; puts opts; exit}
|
19
|
+
opts.on('-v', '--version', 'Display the XRPN version number') { xrpn_version; exit }
|
20
|
+
end
|
21
|
+
optparse.parse!
|
22
|
+
|
23
|
+
# vim:ft=ruby:
|
data/xlib/read_cmd
ADDED
data/xlib/read_state
ADDED
data/xlib/save_state
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
def save_state (fn = "conf")
|
2
|
+
@p.flg["23"] = false
|
3
|
+
cont = "@p.x = #{@p.x}\n"
|
4
|
+
cont += "@p.y = #{@p.y}\n"
|
5
|
+
cont += "@p.z = #{@p.z}\n"
|
6
|
+
cont += "@p.t = #{@p.t}\n"
|
7
|
+
cont += "@p.l = #{@p.l}\n"
|
8
|
+
cont += "@p.a = \"#{@p.a}\"\n"
|
9
|
+
cont += "@p.i = #{@p.i}\n"
|
10
|
+
cont += "@p.s = #{@p.s}\n"
|
11
|
+
cont += "@p.srg = #{@p.srg}\n"
|
12
|
+
cont += "@p.reg = #{@p.reg}\n"
|
13
|
+
cont += "@p.flg = #{@p.flg}\n"
|
14
|
+
cont += "@p.prg = #{@p.prg}\n"
|
15
|
+
File.write(Dir.home + "/.xrpn/" + fn, cont)
|
16
|
+
end
|
17
|
+
|
18
|
+
# vim:ft=ruby:
|
data/xlib/save_xm
ADDED
data/xlib/setpt
ADDED
data/xlib/string
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
class String
|
2
|
+
|
3
|
+
def color (color_code, bold=false)
|
4
|
+
bold ? "\e[38;5;#{color_code};1m#{self}\e[0m" : "\e[38;5;#{color_code}m#{self}\e[0m"
|
5
|
+
end
|
6
|
+
|
7
|
+
def c_x(bold=false)
|
8
|
+
color($colors["X"], bold)
|
9
|
+
end
|
10
|
+
def c_y(bold=false)
|
11
|
+
color($colors["Y"], bold)
|
12
|
+
end
|
13
|
+
def c_z(bold=false)
|
14
|
+
color($colors["Z"], bold)
|
15
|
+
end
|
16
|
+
def c_t(bold=false)
|
17
|
+
color($colors["T"], bold)
|
18
|
+
end
|
19
|
+
def c_l(bold=false)
|
20
|
+
color($colors["L"], bold)
|
21
|
+
end
|
22
|
+
def c_a(bold=false)
|
23
|
+
color($colors["A"], bold)
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
# vim:ft=ruby:
|
data/xlib/theme
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
def theme(t ="dark")
|
2
|
+
if t == "light"
|
3
|
+
$colors = {
|
4
|
+
"X" => 232,
|
5
|
+
"Y" => 241,
|
6
|
+
"Z" => 244,
|
7
|
+
"T" => 247,
|
8
|
+
"L" => 130,
|
9
|
+
"A" => 39
|
10
|
+
}
|
11
|
+
else
|
12
|
+
$colors = {
|
13
|
+
"X" => 255,
|
14
|
+
"Y" => 246,
|
15
|
+
"Z" => 243,
|
16
|
+
"T" => 240,
|
17
|
+
"L" => 130,
|
18
|
+
"A" => 39
|
19
|
+
}
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# vim:ft=ruby:
|
data/xlib/xrpn_class
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# Define the basis for the RPN class
|
2
|
+
class XRPN
|
3
|
+
attr_accessor :nolift, :x, :y, :z, :t, :l, :a, :i, :s, :g, :deg, :srg, :reg, :flg, :clk24, :pg, :prg, :pc, :rtn, :xmfile, :xmcont
|
4
|
+
def initialize(file)
|
5
|
+
@nolift = false # Disable stacklift
|
6
|
+
@x = 0.0 # X register
|
7
|
+
@y = 0.0 # Y register
|
8
|
+
@z = 0.0 # Z register
|
9
|
+
@t = 0.0 # T register
|
10
|
+
@l = 0.0 # Last X register
|
11
|
+
@a = "" # Alpha register
|
12
|
+
@i = 4 # Fix (and Sci/Eng) nu,ber of digiet after period
|
13
|
+
@s = 9 # Threshold for when exponents kick in
|
14
|
+
@g = 1 # Exponent grouping (set to 3 when ENG mode is set)
|
15
|
+
@deg = "deg" # Degree mode (or "rad" for Radians or "grad" for 400°
|
16
|
+
@srg = 11 # Statistics registers start
|
17
|
+
@reg = {} # Registers are stored in a Hash
|
18
|
+
@flg = {} # Flags are stored in a Hash
|
19
|
+
@flg["28"] = true # Radix mark
|
20
|
+
@flg["29"] = true # Digit separator mark
|
21
|
+
@flg["31"] = false # Date format (MDY). "true" for DMY
|
22
|
+
@flg["44"] = false # Continuous ON
|
23
|
+
@clk24 = false # 24 hour time
|
24
|
+
@pg = 0 # Active Page
|
25
|
+
@prg = [] # Active Program
|
26
|
+
@prg[0] = File.read(file).split("\n") if $rfile
|
27
|
+
@pc = 0 # Active Program Counter (current step in the active program)
|
28
|
+
@rtn = [] # Return stack
|
29
|
+
@xmfile = "" # Current eXtended Memory file
|
30
|
+
@xmcont = [["", "", 0, 0.0]]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# vim:ft=ruby:
|
data/xrpn.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'xrpn'
|
3
|
-
s.version = '1.1.
|
3
|
+
s.version = '1.1.8'
|
4
4
|
s.licenses = ['Unlicense']
|
5
5
|
s.summary = "XRPN - The eXtended RPN (Reverse Polish Notation) programming language"
|
6
6
|
s.description = "A full programming language and environment extending the features of the venerable HP calculator programmable calculators. With XRPN you can accomplish a wide range of modern programming tasks as well as running existing HP-41 FOCAL programs directly. XRPN gives modern life to tens of thousands of old HP calculator programs and opens the possibilities to many, many more."
|
@@ -11,6 +11,6 @@ Gem::Specification.new do |s|
|
|
11
11
|
|
12
12
|
s.add_runtime_dependency 'tty-prompt', '~> 0.23'
|
13
13
|
|
14
|
-
s.files = ["bin/xrpn", "lib/xrpn.rb", "xrpn.gemspec"]
|
14
|
+
s.files = ["bin/xrpn", "lib/xrpn.rb", "xrpn.gemspec"] + Dir.glob("xcmd/*") + Dir.glob("xlib/*")
|
15
15
|
s.executables << 'xrpn'
|
16
16
|
end
|