xrpn 1.1
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.
- checksums.yaml +7 -0
- data/bin/xrpn +110 -0
- data/cmd/abs +7 -0
- data/cmd/acos +10 -0
- data/cmd/adate +12 -0
- data/cmd/adateiso +13 -0
- data/cmd/add +9 -0
- data/cmd/adv +7 -0
- data/cmd/agsub +8 -0
- data/cmd/aleng +8 -0
- data/cmd/almcat +7 -0
- data/cmd/almnow +7 -0
- data/cmd/anum +10 -0
- data/cmd/aoff +7 -0
- data/cmd/aon +7 -0
- data/cmd/appchr +13 -0
- data/cmd/apprec +13 -0
- data/cmd/arcl +22 -0
- data/cmd/arcli +7 -0
- data/cmd/arclrec +30 -0
- data/cmd/arot +13 -0
- data/cmd/ashf +7 -0
- data/cmd/asin +10 -0
- data/cmd/asroom +7 -0
- data/cmd/asto +21 -0
- data/cmd/asub +8 -0
- data/cmd/atan +10 -0
- data/cmd/atime +26 -0
- data/cmd/atime24 +21 -0
- data/cmd/atox +9 -0
- data/cmd/aview +7 -0
- data/cmd/aviewc +7 -0
- data/cmd/beep +7 -0
- data/cmd/bindec +8 -0
- data/cmd/cat +26 -0
- data/cmd/cf +7 -0
- data/cmd/chs +7 -0
- data/cmd/cla +7 -0
- data/cmd/clalma +7 -0
- data/cmd/clalmx +7 -0
- data/cmd/cld +6 -0
- data/cmd/clear +7 -0
- data/cmd/clfl +13 -0
- data/cmd/clk12 +7 -0
- data/cmd/clk24 +7 -0
- data/cmd/clkeys +7 -0
- data/cmd/clock +7 -0
- data/cmd/clp +8 -0
- data/cmd/clralms +7 -0
- data/cmd/clrg +7 -0
- data/cmd/clrgx +12 -0
- data/cmd/cls +12 -0
- data/cmd/clst +10 -0
- data/cmd/clx +8 -0
- data/cmd/cmdadd +7 -0
- data/cmd/cmddel +7 -0
- data/cmd/correct +7 -0
- data/cmd/cos +10 -0
- data/cmd/crflas +9 -0
- data/cmd/crfld +9 -0
- data/cmd/cube +8 -0
- data/cmd/d_r +8 -0
- data/cmd/date +8 -0
- data/cmd/dateplus +12 -0
- data/cmd/ddate +11 -0
- data/cmd/dec +7 -0
- data/cmd/decbin +8 -0
- data/cmd/dechex +8 -0
- data/cmd/decoct +8 -0
- data/cmd/deg +7 -0
- data/cmd/degq +7 -0
- data/cmd/delchr +14 -0
- data/cmd/delrec +12 -0
- data/cmd/divide +9 -0
- data/cmd/dmy +7 -0
- data/cmd/dot +7 -0
- data/cmd/dow +9 -0
- data/cmd/drop +7 -0
- data/cmd/dropy +7 -0
- data/cmd/dse +40 -0
- data/cmd/ed +7 -0
- data/cmd/emdir +7 -0
- data/cmd/emdirx +14 -0
- data/cmd/emroom +7 -0
- data/cmd/end +9 -0
- data/cmd/eng +9 -0
- data/cmd/enter +8 -0
- data/cmd/exp +9 -0
- data/cmd/expx1 +9 -0
- data/cmd/fact +9 -0
- data/cmd/fc +7 -0
- data/cmd/fcc +8 -0
- data/cmd/fcs +8 -0
- data/cmd/fix +9 -0
- data/cmd/fixq +7 -0
- data/cmd/flsize +7 -0
- data/cmd/frc +8 -0
- data/cmd/fs +7 -0
- data/cmd/fsc +8 -0
- data/cmd/fss +8 -0
- data/cmd/geir +11 -0
- data/cmd/getas +7 -0
- data/cmd/getfile +12 -0
- data/cmd/getfilea +11 -0
- data/cmd/getkey +9 -0
- data/cmd/getkeyx +10 -0
- data/cmd/getp +13 -0
- data/cmd/getr +13 -0
- data/cmd/getrec +8 -0
- data/cmd/getrx +17 -0
- data/cmd/getsub +7 -0
- data/cmd/getweb +12 -0
- data/cmd/getx +12 -0
- data/cmd/grad +7 -0
- data/cmd/gsb +7 -0
- data/cmd/gto +23 -0
- data/cmd/help +14 -0
- data/cmd/hexdec +8 -0
- data/cmd/hms +12 -0
- data/cmd/hmsminus +14 -0
- data/cmd/hmsplus +13 -0
- data/cmd/hr +11 -0
- data/cmd/inschr +14 -0
- data/cmd/insrec +12 -0
- data/cmd/int +8 -0
- data/cmd/invf +7 -0
- data/cmd/isg +40 -0
- data/cmd/lastx +8 -0
- data/cmd/lbl +6 -0
- data/cmd/lift +8 -0
- data/cmd/ln +8 -0
- data/cmd/ln1x +8 -0
- data/cmd/log +8 -0
- data/cmd/mdy +7 -0
- data/cmd/mean +11 -0
- data/cmd/mod +13 -0
- data/cmd/multiply +9 -0
- data/cmd/oct +7 -0
- data/cmd/octdec +8 -0
- data/cmd/off +8 -0
- data/cmd/on +7 -0
- data/cmd/p_r +13 -0
- data/cmd/pack +7 -0
- data/cmd/page +13 -0
- data/cmd/pagedel +8 -0
- data/cmd/pageq +7 -0
- data/cmd/pageswap +8 -0
- data/cmd/pasn +7 -0
- data/cmd/pcat +14 -0
- data/cmd/pclps +12 -0
- data/cmd/percent +9 -0
- data/cmd/percentch +9 -0
- data/cmd/pi +8 -0
- data/cmd/posa +23 -0
- data/cmd/posfl +26 -0
- data/cmd/pow +9 -0
- data/cmd/pprg +27 -0
- data/cmd/pprgx +33 -0
- data/cmd/pra +7 -0
- data/cmd/prflags +8 -0
- data/cmd/prompt +8 -0
- data/cmd/prp +7 -0
- data/cmd/prregs +8 -0
- data/cmd/prstk +10 -0
- data/cmd/prx +7 -0
- data/cmd/prxm +21 -0
- data/cmd/pse +7 -0
- data/cmd/psize +7 -0
- data/cmd/purfl +14 -0
- data/cmd/r_d +8 -0
- data/cmd/r_p +18 -0
- data/cmd/rad +7 -0
- data/cmd/rand +10 -0
- data/cmd/rcl +23 -0
- data/cmd/rclaf +7 -0
- data/cmd/rclflag +16 -0
- data/cmd/rclpt +8 -0
- data/cmd/rclpta +16 -0
- data/cmd/rclsw +7 -0
- data/cmd/rdn +7 -0
- data/cmd/recip +8 -0
- data/cmd/regmove +18 -0
- data/cmd/regswap +19 -0
- data/cmd/reload +7 -0
- data/cmd/reszfl +7 -0
- data/cmd/rnd +8 -0
- data/cmd/root +9 -0
- data/cmd/rtn +12 -0
- data/cmd/rubycmd +7 -0
- data/cmd/runsw +7 -0
- data/cmd/rup +7 -0
- data/cmd/saveas +7 -0
- data/cmd/savep +7 -0
- data/cmd/saver +24 -0
- data/cmd/saverx +31 -0
- data/cmd/savex +10 -0
- data/cmd/savexm +7 -0
- data/cmd/sci +9 -0
- data/cmd/sdev +11 -0
- data/cmd/seekpt +10 -0
- data/cmd/seekpta +7 -0
- data/cmd/sep +7 -0
- data/cmd/setaf +7 -0
- data/cmd/setsw +7 -0
- data/cmd/sf +7 -0
- data/cmd/shellcmd +7 -0
- data/cmd/sign +19 -0
- data/cmd/sin +10 -0
- data/cmd/size +7 -0
- data/cmd/sizeq +7 -0
- data/cmd/sminus +20 -0
- data/cmd/splus +20 -0
- data/cmd/sqr +8 -0
- data/cmd/sqrt +8 -0
- data/cmd/sreg +7 -0
- data/cmd/sregq +7 -0
- data/cmd/stdivide +22 -0
- data/cmd/stmultiply +22 -0
- data/cmd/sto +21 -0
- data/cmd/stoflag +13 -0
- data/cmd/stop +7 -0
- data/cmd/stopsw +7 -0
- data/cmd/stplus +22 -0
- data/cmd/stsubtract +22 -0
- data/cmd/subtract +9 -0
- data/cmd/sw +7 -0
- data/cmd/swap +7 -0
- data/cmd/swpt +7 -0
- data/cmd/tan +10 -0
- data/cmd/tenx +8 -0
- data/cmd/time +8 -0
- data/cmd/tx +7 -0
- data/cmd/version +7 -0
- data/cmd/view +7 -0
- data/cmd/writefile +12 -0
- data/cmd/xeq +21 -0
- data/cmd/xeq0 +7 -0
- data/cmd/xeqnn +9 -0
- data/cmd/xeqy +7 -0
- data/cmd/xf +20 -0
- data/cmd/xgt0 +7 -0
- data/cmd/xgteq0 +7 -0
- data/cmd/xgteqnn +9 -0
- data/cmd/xgteqy +7 -0
- data/cmd/xgtnn +9 -0
- data/cmd/xgty +7 -0
- data/cmd/xlt0 +7 -0
- data/cmd/xlteq0 +7 -0
- data/cmd/xlteqnn +9 -0
- data/cmd/xlteqy +7 -0
- data/cmd/xltnn +9 -0
- data/cmd/xlty +7 -0
- data/cmd/xmexistq +15 -0
- data/cmd/xmfileq +7 -0
- data/cmd/xneq0 +7 -0
- data/cmd/xneqnn +9 -0
- data/cmd/xneqy +7 -0
- data/cmd/xnn +21 -0
- data/cmd/xtoa +7 -0
- data/cmd/xy +7 -0
- data/cmd/xyzalm +7 -0
- data/lib/_xrpn_version +5 -0
- data/lib/bei +18 -0
- data/lib/check +26 -0
- data/lib/conditional +10 -0
- data/lib/convert_base +8 -0
- data/lib/debug_mode +124 -0
- data/lib/dtparse +10 -0
- data/lib/error +10 -0
- data/lib/fact +7 -0
- data/lib/getpt +7 -0
- data/lib/help +12 -0
- data/lib/hp_41 +83 -0
- data/lib/ind +21 -0
- data/lib/load_xm +28 -0
- data/lib/locate_prg +32 -0
- data/lib/numeric +62 -0
- data/lib/numformat +12 -0
- data/lib/optparse +23 -0
- data/lib/read_cmd +12 -0
- data/lib/read_state +6 -0
- data/lib/save_state +18 -0
- data/lib/save_xm +5 -0
- data/lib/setpt +5 -0
- data/lib/string +28 -0
- data/lib/theme_dark +10 -0
- data/lib/theme_light +10 -0
- data/lib/xrpn_class +34 -0
- metadata +348 -0
data/lib/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/lib/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/lib/error
ADDED
data/lib/fact
ADDED
data/lib/getpt
ADDED
data/lib/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/lib/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/lib/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/lib/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/lib/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/lib/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/lib/numformat
ADDED
data/lib/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/lib/read_cmd
ADDED
data/lib/read_state
ADDED
data/lib/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/lib/save_xm
ADDED
data/lib/setpt
ADDED
data/lib/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/lib/theme_dark
ADDED
data/lib/theme_light
ADDED
data/lib/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:
|