diff options
author | murphy <murphy@rubychan.de> | 2006-10-15 15:10:04 +0000 |
---|---|---|
committer | murphy <murphy@rubychan.de> | 2006-10-15 15:10:04 +0000 |
commit | f5768c09019b303e82b7b7905b137b0e1df3823c (patch) | |
tree | a0bca63a318f848c6932070b4779226520fa040c /test/scanners | |
parent | dd1f6c2ed2fa76d8862233494519d797e9ffb488 (diff) | |
download | coderay-f5768c09019b303e82b7b7905b137b0e1df3823c.tar.gz |
Moved scanner tests into test/scanners.
Diffstat (limited to 'test/scanners')
73 files changed, 54369 insertions, 0 deletions
diff --git a/test/scanners/c/empty.in.c b/test/scanners/c/empty.in.c new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/test/scanners/c/empty.in.c diff --git a/test/scanners/c/empty.out.raydebug b/test/scanners/c/empty.out.raydebug new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/test/scanners/c/empty.out.raydebug diff --git a/test/scanners/c/error.in.c b/test/scanners/c/error.in.c new file mode 100644 index 0000000..9cad53e --- /dev/null +++ b/test/scanners/c/error.in.c @@ -0,0 +1 @@ +\\
diff --git a/test/scanners/c/error.out.raydebug b/test/scanners/c/error.out.raydebug new file mode 100644 index 0000000..a52becb --- /dev/null +++ b/test/scanners/c/error.out.raydebug @@ -0,0 +1 @@ +error(\\)\ diff --git a/test/scanners/c/error2.in.c b/test/scanners/c/error2.in.c new file mode 100644 index 0000000..1910281 --- /dev/null +++ b/test/scanners/c/error2.in.c @@ -0,0 +1 @@ +foo
\ No newline at end of file diff --git a/test/scanners/c/error2.out.raydebug b/test/scanners/c/error2.out.raydebug new file mode 100644 index 0000000..ccd2125 --- /dev/null +++ b/test/scanners/c/error2.out.raydebug @@ -0,0 +1 @@ +ident(foo)
\ No newline at end of file diff --git a/test/scanners/c/open-string.in.c b/test/scanners/c/open-string.in.c new file mode 100644 index 0000000..9d68933 --- /dev/null +++ b/test/scanners/c/open-string.in.c @@ -0,0 +1 @@ +"
\ No newline at end of file diff --git a/test/scanners/c/open-string.out.raydebug b/test/scanners/c/open-string.out.raydebug new file mode 100644 index 0000000..a6afd22 --- /dev/null +++ b/test/scanners/c/open-string.out.raydebug @@ -0,0 +1 @@ +string<delimiter(")>
\ No newline at end of file diff --git a/test/scanners/c/strange.in.c b/test/scanners/c/strange.in.c new file mode 100644 index 0000000..42f339d --- /dev/null +++ b/test/scanners/c/strange.in.c @@ -0,0 +1,90 @@ +#include "ruby.h" /*
+ /sLaSh *
+ oBfUsCaTeD RuBy *
+ cOpYrIgHt 2005 *
+bY SiMoN StRaNdGaArD *
+ #{X=320;Y=200;Z=20} */
+
+#define GUN1 42:
+#define GUN2 43:
+#define bo do
+#define when(gun) /**/
+#define DATA "p 'Hello embedded world'"
+#define DIRTY(argc,argv)\
+argc,argv,char=eval(\
+"#{DATA.read}\n[3,2,1]"\
+);sun=O.new\
+if(0)
+
+int
+sun[]={12,9,16,9,2,1,7,1,3,9,27,4, 13,2,11,5,4,1,25,
+5,0,1,14,9,15,4,26,9,23,2,17,6,31, 6,10,8,22,9,21,1,
+24,8,20,8,18,9,29,5,9,5,1,1,28,8,8,1,30, 9,6,8, 5,1,
+19,9,36,19,43, 9,34,11,50,19,48,18,49,9, 35,8,42,18,
+51,8,44,11,32, 11,47,9,37,1,39,9,38,19, 45,8,40,12,
+41,9,46,12,33,1,57,1,85,5,88,28,83,4,87, 6,62,28,89,
+9,80,28,60,21,52,21,72,29,54,21,75,8,70,29,58,28,65,
+9,91,8,74,29,79,2,77,1,53,1,81,5, 69,2,64,21, 86,29,
+67,9,59,1,61,5,73,6,76,28,56,21,68,29,78,29,63,5,66,
+28,90,29, 71,4,55,9,84,28,82,29,101,5, 103,9, 98,35,
+97,1,94,35,93,1,100,35,92,31,99,5,96,39,95,5,102,35};
+
+void run(int gun=0) { // [gun]=[:GUN1,:GUN2]
+ printf("run() %i\n", gun);
+ switch(gun) {
+ case GUN1 when(2)
+ printf("when2\n");
+ break; // end
+ case GUN2 when(3)
+ printf("when3\n");
+ break; // end
+ }
+}
+
+int main(int argc, char** argv) {
+ printf("hello world. number of arguments=%i\n", argc);
+ int fun=5;
+ bo {
+ fun -= 1; //.id - gun = fun
+ run(fun);
+ } while(fun>0);
+ ruby_init();
+ rb_eval_string(DATA);
+ return 0;
+}
+
+# if 0 // nobody reads un-defined code
+def goto*s;$s=[];Y.times{s=[];X.times{s<<[0]*3};$s<< s}end;A=0.5
+include Math;def u g,h,i,j,k,l;f,*m=((j-h).abs>(k-i).abs)?[proc{
+|n,o| g[o] [n ]=l },[h ,i ],[j,k]]:[proc{
+|p,q| g[ p][ q] =l} ,[ i,h ], [k,j]];b,a=m.sort
+c,d=a [1 ]-b [1 ],a [0 ]-b [0 ];d.times{|e|f.
+call( e+b[ 0] ,c* e/d+b [1])};end;V=0;def bo&u
+$u||= V; ;$u += 1+V ;; return u.call if$u>1;q=128.0
+;x=(V .. 255 ). map {| y|f1,z =sin(y.to_f*PI/q),
+sin(( y. to_f + 200 )*PI/( q));[(f1*30.0+110.0).
+to_i,((f1+z)*10.0+40.0).to_i,(z*20.0+120.0).to_i]};Y.times{|i|X.
+times{|j|i1=((i*0.3+150)*(j*1.1+50)/50.0).to_i;i2=((i*0.8+510)*(
+j*0.9+1060)/51.0).to_i;$s[i][j]=x[(i1*i2)%255].clone}};$a=(0..25).
+inject([]){|a,i|a<<(V..3).inject([]){|r,j|r<<$c[i*4+j]}};u.call;end
+I=LocalJumpError;def run*a,&b;return if a.size==V;if a[V]==666;$b=b
+elsif$b;$b.call;end;end;def main s,&u;$m=V;u.call rescue I;end
+def rb_eval_string(*a);end # you promised not to look here
+def ruby_init;q=2.0;l=((X**q)*A+(Y**q)*A)**A;V.upto(Y-4){|s|V.
+upto(X-4){|q|d=((q-X/A)**q+(s-Y/A)**q)**A;e=(cos(d*PI/(l/q))/q
++A)*3.0+1.0;v=2;f=v/e;a,p,b=$s[s],$s[s+1],$s[s+v];r=a[q][V]*e+
+p[q][V]+a[q+1][V]+b[q][V]+a[q+v][V]+b[q+v/v][V]+p[q+v][V]+b[q+
+v][V]*f;g=[a[q][V],b[q][V],a[q+v][V],b[q+v][V]];h=(g.max-g.min
+)*f;$s[s][q][V]=[[(r/(e+f+6.0)+A+(h*0.4)).to_i,255].min,V].max
+}};File.open("res.ppm","w+"){|f|f.write(# secret.greetings :-)
+"P3\n# res.ppm\n#{X} #{Y}\n255\n"+$s.map{|a|a.map{|b|b.join' '
+}.join(' ')+"\n"}.join)};end;def switch i,&b;b.call;return unless
+defined?($m);b=(X*0.01).to_i;d=1.0/40.0;e=0.09;c=(Y*0.01).to_i
+a=$a.map{|(f,g,h,j)|[f*d,g*e,h*d,j*e]};a.each{|(k,l,m,n)|u($s,(k*X
+).to_i+b+i,(l*Y).to_i+c+i,(m*X).to_i+b+i,(n*Y).to_i+c+i,[Z]*3)}
+a.each{|(o,q,r,s)|u($s,(o*(X-Z)).to_i+i,(q*(Y-Z)).to_i+i,(r*(X-
+Z)).to_i+i,(s*(Y-Z)).to_i+i,[(1<<8)-1]*3)};end;Q=Object;class
+Regexp;def []=(v,is);is.each{|s|Q.send(:remove_const,s)if Q.
+const_defined? s;Q.const_set(s,v)};end;end;def int*ptr;666
+end;class O;def []=(a,b=nil);$c=a;end;end;alias:void:goto
+#endif // pretend as if you havn't seen anything
diff --git a/test/scanners/c/strange.out.raydebug b/test/scanners/c/strange.out.raydebug new file mode 100644 index 0000000..8979a50 --- /dev/null +++ b/test/scanners/c/strange.out.raydebug @@ -0,0 +1,90 @@ +preprocessor(#include) include("ruby.h") comment(/* + /sLaSh * + oBfUsCaTeD RuBy * + cOpYrIgHt 2005 * +bY SiMoN StRaNdGaArD * + #{X=320;Y=200;Z=20} */) + +preprocessor(#define) ident(GUN1) integer(42)operator(:) +preprocessor(#define) ident(GUN2) integer(43)operator(:) +preprocessor(#define) ident(bo) reserved(do) +preprocessor(#define) ident(when)operator(()ident(gun)operator(\)) comment(/**/) +preprocessor(#define) ident(DATA) string<delimiter(")content(p 'Hello embedded world')delimiter(")> +preprocessor(#define) ident(DIRTY)operator(()ident(argc)operator(,)ident(argv)operator(\))\ +ident(argc)operator(,)ident(argv)operator(,)pre_type(char)operator(=)ident(eval)operator(()\ +string<delimiter(")content(#{DATA.read})char(\\n)content([3,2,1])delimiter(")>\ +operator(\);)ident(sun)operator(=)ident(O)operator(.)ident(new)\ +reserved(if)operator(()integer(0)operator(\)) + +pre_type(int) +ident(sun)operator([]={)integer(12)operator(,)integer(9)operator(,)integer(16)operator(,)integer(9)operator(,)integer(2)operator(,)integer(1)operator(,)integer(7)operator(,)integer(1)operator(,)integer(3)operator(,)integer(9)operator(,)integer(27)operator(,)integer(4)operator(,) integer(13)operator(,)integer(2)operator(,)integer(11)operator(,)integer(5)operator(,)integer(4)operator(,)integer(1)operator(,)integer(25)operator(,) +integer(5)operator(,)integer(0)operator(,)integer(1)operator(,)integer(14)operator(,)integer(9)operator(,)integer(15)operator(,)integer(4)operator(,)integer(26)operator(,)integer(9)operator(,)integer(23)operator(,)integer(2)operator(,)integer(17)operator(,)integer(6)operator(,)integer(31)operator(,) integer(6)operator(,)integer(10)operator(,)integer(8)operator(,)integer(22)operator(,)integer(9)operator(,)integer(21)operator(,)integer(1)operator(,) +integer(24)operator(,)integer(8)operator(,)integer(20)operator(,)integer(8)operator(,)integer(18)operator(,)integer(9)operator(,)integer(29)operator(,)integer(5)operator(,)integer(9)operator(,)integer(5)operator(,)integer(1)operator(,)integer(1)operator(,)integer(28)operator(,)integer(8)operator(,)integer(8)operator(,)integer(1)operator(,)integer(30)operator(,) integer(9)operator(,)integer(6)operator(,)integer(8)operator(,) integer(5)operator(,)integer(1)operator(,) +integer(19)operator(,)integer(9)operator(,)integer(36)operator(,)integer(19)operator(,)integer(43)operator(,) integer(9)operator(,)integer(34)operator(,)integer(11)operator(,)integer(50)operator(,)integer(19)operator(,)integer(48)operator(,)integer(18)operator(,)integer(49)operator(,)integer(9)operator(,) integer(35)operator(,)integer(8)operator(,)integer(42)operator(,)integer(18)operator(,) +integer(51)operator(,)integer(8)operator(,)integer(44)operator(,)integer(11)operator(,)integer(32)operator(,) integer(11)operator(,)integer(47)operator(,)integer(9)operator(,)integer(37)operator(,)integer(1)operator(,)integer(39)operator(,)integer(9)operator(,)integer(38)operator(,)integer(19)operator(,) integer(45)operator(,)integer(8)operator(,)integer(40)operator(,)integer(12)operator(,) +integer(41)operator(,)integer(9)operator(,)integer(46)operator(,)integer(12)operator(,)integer(33)operator(,)integer(1)operator(,)integer(57)operator(,)integer(1)operator(,)integer(85)operator(,)integer(5)operator(,)integer(88)operator(,)integer(28)operator(,)integer(83)operator(,)integer(4)operator(,)integer(87)operator(,) integer(6)operator(,)integer(62)operator(,)integer(28)operator(,)integer(89)operator(,) +integer(9)operator(,)integer(80)operator(,)integer(28)operator(,)integer(60)operator(,)integer(21)operator(,)integer(52)operator(,)integer(21)operator(,)integer(72)operator(,)integer(29)operator(,)integer(54)operator(,)integer(21)operator(,)integer(75)operator(,)integer(8)operator(,)integer(70)operator(,)integer(29)operator(,)integer(58)operator(,)integer(28)operator(,)integer(65)operator(,) +integer(9)operator(,)integer(91)operator(,)integer(8)operator(,)integer(74)operator(,)integer(29)operator(,)integer(79)operator(,)integer(2)operator(,)integer(77)operator(,)integer(1)operator(,)integer(53)operator(,)integer(1)operator(,)integer(81)operator(,)integer(5)operator(,) integer(69)operator(,)integer(2)operator(,)integer(64)operator(,)integer(21)operator(,) integer(86)operator(,)integer(29)operator(,) +integer(67)operator(,)integer(9)operator(,)integer(59)operator(,)integer(1)operator(,)integer(61)operator(,)integer(5)operator(,)integer(73)operator(,)integer(6)operator(,)integer(76)operator(,)integer(28)operator(,)integer(56)operator(,)integer(21)operator(,)integer(68)operator(,)integer(29)operator(,)integer(78)operator(,)integer(29)operator(,)integer(63)operator(,)integer(5)operator(,)integer(66)operator(,) +integer(28)operator(,)integer(90)operator(,)integer(29)operator(,) integer(71)operator(,)integer(4)operator(,)integer(55)operator(,)integer(9)operator(,)integer(84)operator(,)integer(28)operator(,)integer(82)operator(,)integer(29)operator(,)integer(101)operator(,)integer(5)operator(,) integer(103)operator(,)integer(9)operator(,) integer(98)operator(,)integer(35)operator(,) +integer(97)operator(,)integer(1)operator(,)integer(94)operator(,)integer(35)operator(,)integer(93)operator(,)integer(1)operator(,)integer(100)operator(,)integer(35)operator(,)integer(92)operator(,)integer(31)operator(,)integer(99)operator(,)integer(5)operator(,)integer(96)operator(,)integer(39)operator(,)integer(95)operator(,)integer(5)operator(,)integer(102)operator(,)integer(35)operator(};) + +pre_type(void) ident(run)operator(()pre_type(int) ident(gun)operator(=)integer(0)operator(\)) operator({) comment(// [gun]=[:GUN1,:GUN2]) + ident(printf)operator(()string<delimiter(")content(run(\) %i)char(\\n)delimiter(")>operator(,) ident(gun)operator(\);) + reserved(switch)operator(()ident(gun)operator(\)) operator({) + reserved(case) ident(GUN1) ident(when)operator(()integer(2)operator(\)) + ident(printf)operator(()string<delimiter(")content(when2)char(\\n)delimiter(")>operator(\);) + reserved(break)operator(;) comment(// end) + reserved(case) ident(GUN2) ident(when)operator(()integer(3)operator(\)) + ident(printf)operator(()string<delimiter(")content(when3)char(\\n)delimiter(")>operator(\);) + reserved(break)operator(;) comment(// end) + operator(}) +operator(}) + +pre_type(int) ident(main)operator(()pre_type(int) ident(argc)operator(,) pre_type(char)operator(**) ident(argv)operator(\)) operator({) + ident(printf)operator(()string<delimiter(")content(hello world. number of arguments=%i)char(\\n)delimiter(")>operator(,) ident(argc)operator(\);) + pre_type(int) ident(fun)operator(=)integer(5)operator(;) + ident(bo) operator({) + ident(fun) operator(-=) integer(1)operator(;) comment(//.id - gun = fun) + ident(run)operator(()ident(fun)operator(\);) + operator(}) reserved(while)operator(()ident(fun)operator(>)integer(0)operator(\);) + ident(ruby_init)operator((\);) + ident(rb_eval_string)operator(()ident(DATA)operator(\);) + reserved(return) integer(0)operator(;) +operator(}) + +comment(# if 0 // nobody reads un-defined code +def goto*s;$s=[];Y.times{s=[];X.times{s<<[0]*3};$s<< s}end;A=0.5 +include Math;def u g,h,i,j,k,l;f,*m=((j-h\).abs>(k-i\).abs\)?[proc{ +|n,o| g[o] [n ]=l },[h ,i ],[j,k]]:[proc{ +|p,q| g[ p][ q] =l} ,[ i,h ], [k,j]];b,a=m.sort +c,d=a [1 ]-b [1 ],a [0 ]-b [0 ];d.times{|e|f. +call( e+b[ 0] ,c* e/d+b [1]\)};end;V=0;def bo&u +$u||= V; ;$u += 1+V ;; return u.call if$u>1;q=128.0 +;x=(V .. 255 \). map {| y|f1,z =sin(y.to_f*PI/q\), +sin(( y. to_f + 200 \)*PI/( q\)\);[(f1*30.0+110.0\). +to_i,((f1+z\)*10.0+40.0\).to_i,(z*20.0+120.0\).to_i]};Y.times{|i|X. +times{|j|i1=((i*0.3+150\)*(j*1.1+50\)/50.0\).to_i;i2=((i*0.8+510\)*( +j*0.9+1060\)/51.0\).to_i;$s[i][j]=x[(i1*i2\)%255].clone}};$a=(0..25\). +inject([]\){|a,i|a<<(V..3\).inject([]\){|r,j|r<<$c[i*4+j]}};u.call;end +I=LocalJumpError;def run*a,&b;return if a.size==V;if a[V]==666;$b=b +elsif$b;$b.call;end;end;def main s,&u;$m=V;u.call rescue I;end +def rb_eval_string(*a\);end # you promised not to look here +def ruby_init;q=2.0;l=((X**q\)*A+(Y**q\)*A\)**A;V.upto(Y-4\){|s|V. +upto(X-4\){|q|d=((q-X/A\)**q+(s-Y/A\)**q\)**A;e=(cos(d*PI/(l/q\)\)/q ++A\)*3.0+1.0;v=2;f=v/e;a,p,b=$s[s],$s[s+1],$s[s+v];r=a[q][V]*e+ +p[q][V]+a[q+1][V]+b[q][V]+a[q+v][V]+b[q+v/v][V]+p[q+v][V]+b[q+ +v][V]*f;g=[a[q][V],b[q][V],a[q+v][V],b[q+v][V]];h=(g.max-g.min +\)*f;$s[s][q][V]=[[(r/(e+f+6.0\)+A+(h*0.4\)\).to_i,255].min,V].max +}};File.open("res.ppm","w+"\){|f|f.write(# secret.greetings :-\) +"P3\\n# res.ppm\\n#{X} #{Y}\\n255\\n"+$s.map{|a|a.map{|b|b.join' ' +}.join(' '\)+"\\n"}.join\)};end;def switch i,&b;b.call;return unless +defined?($m\);b=(X*0.01\).to_i;d=1.0/40.0;e=0.09;c=(Y*0.01\).to_i +a=$a.map{|(f,g,h,j\)|[f*d,g*e,h*d,j*e]};a.each{|(k,l,m,n\)|u($s,(k*X +\).to_i+b+i,(l*Y\).to_i+c+i,(m*X\).to_i+b+i,(n*Y\).to_i+c+i,[Z]*3\)} +a.each{|(o,q,r,s\)|u($s,(o*(X-Z\)\).to_i+i,(q*(Y-Z\)\).to_i+i,(r*(X- +Z\)\).to_i+i,(s*(Y-Z\)\).to_i+i,[(1<<8\)-1]*3\)};end;Q=Object;class +Regexp;def []=(v,is\);is.each{|s|Q.send(:remove_const,s\)if Q. +const_defined? s;Q.const_set(s,v\)};end;end;def int*ptr;666 +end;class O;def []=(a,b=nil\);$c=a;end;end;alias:void:goto +#endif // pretend as if you havn't seen anything) diff --git a/test/scanners/c/suite.rb b/test/scanners/c/suite.rb new file mode 100644 index 0000000..fc94ad3 --- /dev/null +++ b/test/scanners/c/suite.rb @@ -0,0 +1,2 @@ +class C < CodeRay::TestCase +end diff --git a/test/scanners/coderay_suite.rb b/test/scanners/coderay_suite.rb new file mode 100644 index 0000000..80b6119 --- /dev/null +++ b/test/scanners/coderay_suite.rb @@ -0,0 +1,218 @@ +$mydir = File.dirname(__FILE__) +$:.unshift File.join($mydir, '..', '..', 'lib') + +require 'coderay' + +$stdout.sync = true + +# from Ruby Facets (http://facets.rubyforge.org/) +class Array + def shuffle! + s = size + each_index do |j| + i = ::Kernel.rand(s-j) + self[j], self[j+i] = at(j+i), at(j) unless i.zero? + end + self + end +end + +module CodeRay + + require 'test/unit' + + class TestCase < Test::Unit::TestCase + + class << self + def inherited child + CodeRay::TestSuite << child.suite + end + + # Calls its block with the working directory set to the examples + # for this test case. + def dir + examples = File.join $mydir, lang.to_s + Dir.chdir examples do + yield + end + end + + def lang + @lang ||= name.downcase.to_sym + end + + def extension extension = nil + if extension + @extension = extension.to_s + else + @extension ||= lang.to_s + end + end + end + + def extension + @extension ||= 'in.' + self.class.extension + end + + def test_ALL + puts + puts " >> Running #{self.class.name} <<" + puts + scanner = CodeRay::Scanners[self.class.lang].new + tokenizer = CodeRay::Encoders[:debug].new + highlighter = CodeRay::Encoders[:html].new( + :tab_width => 2, + :line_numbers => :inline, + :wrap => :page, + :hint => :debug, + :css => :class + ) + + max = ENV.fetch('max', 500).to_i + unless ENV['norandom'] + print "Random test" + if ENV['showprogress'] + print ': ' + progress = '' + end + for size in 0..max + if ENV['showprogress'] + print "\b" * progress.size + progress = '(%d)' % size + print progress + end + srand size + 17 + scanner.string = Array.new(size) { rand 256 }.pack 'c*' + scanner.tokenize + end + puts ', finished.' + end + + self.class.dir do + for input in Dir["*.#{extension}"] + next if ENV['testonly'] and ENV['testonly'] != File.basename(input, ".#{extension}") + print "testing #{input}: " + name = File.basename(input, ".#{extension}") + output = name + '.out.' + tokenizer.file_extension + code = File.open(input, 'rb') { |f| break f.read } + + unless ENV['noincremental'] + print 'incremental' + if ENV['showprogress'] + print ': ' + progress = '' + end + for size in 0..max + break if size > code.size + if ENV['showprogress'] + print "\b" * progress.size + progress = '(%d)' % size + print progress + end + scanner.string = code[0,size] + scanner.tokenize + end + print ', ' + end + + unless ENV['noshuffled'] or code.size < [0].pack('Q').size + print 'shuffled' + if ENV['showprogress'] + print ': ' + progress = '' + end + code_bits = code[0,max].unpack('Q*') # split into quadwords... + (max / 4).times do |i| + if ENV['showprogress'] + print "\b" * progress.size + progress = '(%d)' % i + print progress + end + srand i + code_bits.shuffle! # ...mix... + scanner.string = code_bits.pack('Q*') # ...and join again + scanner.tokenize + end + + # highlighted = highlighter.encode_tokens scanner.tokenize + # File.open(name + '.shuffled.html', 'w') { |f| f.write highlighted } + print ', ' + end + + print 'complete, ' + scanner.string = code + tokens = scanner.tokens + result = tokenizer.encode_tokens tokens + + if File.exist? output + expected = File.open(output, 'rb') { |f| break f.read } + ok = expected == result + computed = output.sub('.out.', '.computed.') + unless ok + File.open(computed, 'wb') { |f| f.write result } + print `gvimdiff #{output} #{computed}` if ENV['diff'] + end + assert(ok, "Scan error: #{computed} != #{output}") unless ENV['diff'] or ENV['noassert'] + else + File.open(output, 'wb') do |f| f.write result end + puts "New test: #{output}" + end + + print 'highlighting, ' + highlighted = highlighter.encode_tokens tokens + File.open(name + '.actual.html', 'w') { |f| f.write highlighted } + + puts 'finished.' + end + end unless ENV['noexamples'] + end + + end + + require 'test/unit/testsuite' + + class TestSuite + @suite = Test::Unit::TestSuite.new 'CodeRay::Scanners' + class << self + + def << sub_suite + @suite << sub_suite + end + + def load_suite name + begin + suite = File.join($mydir, name, 'suite.rb') + require suite + rescue LoadError + $stderr.puts <<-ERR + + !! Suite #{suite} not found + + ERR + false + end + end + + def load + if subsuite = ARGV.find { |a| break $1 if a[/^([^-].*)/] } || ENV['lang'] + load_suite(subsuite) or exit + else + Dir[File.join($mydir, '*', '')].sort.each { |suite| load_suite File.basename(suite) } + end + end + + def run + load + $VERBOSE = true + if ARGV.include? '-f' + require 'test/unit/ui/fox/testrunner' + Test::Unit::UI::Fox::TestRunner + else + require 'test/unit/ui/console/testrunner' + Test::Unit::UI::Console::TestRunner + end.run @suite + end + end + end + +end
\ No newline at end of file diff --git a/test/scanners/delphi/pluto.in.pas b/test/scanners/delphi/pluto.in.pas new file mode 100644 index 0000000..b7aaad7 --- /dev/null +++ b/test/scanners/delphi/pluto.in.pas @@ -0,0 +1,10829 @@ +unit FindTH;
+
+interface
+
+uses
+ Classes, windows, Dialogs, ComCtrls, CompEx, SysUtils, YTools, YTypes,
+ clock, plutoconst, StdCtrls, Masks, Forms, XReg;
+
+const
+ RegMoleVersion = '1.1';
+
+type
+ TFindThreadProgress = (fpNone, fpEvery512th, fpEach);
+
+ TRegFindThread = class(TThread)
+ private
+ SearchText: string;
+ SearchFor: TSearchOptions;
+ Progress: TFindThreadProgress;
+ FindNodeText: string;
+ TimeElapsed: Double;
+ syncIcon: Integer;
+ syncStatusText: string;
+ CurrentPath: string;
+ KeysScanned: Integer;
+ Mask: TMask;
+ dwordVal: DWORD;
+ SearchForValues: Boolean;
+
+ procedure Find;
+
+ //Synchronizers
+ procedure Start;
+ procedure Add;
+ procedure UpdateStatus;
+ procedure Finish;
+ protected
+ procedure Execute; override;
+ public
+ SpecialPath: string;
+ FindNode: TTreeNode;
+ ListTV: TTreeView;
+ ObjectsFound, KeysFound, ValuesFound, DataFound: Integer;
+ Ranges: TRanges;
+ destructor Destroy; override;
+ constructor CreateIt(PriorityLevel: TThreadPriority; s: string;
+ SearchFor: TSearchOptions; Progress: TFindThreadProgress);
+ end;
+
+implementation
+
+uses
+ ValuesU, StrUtils;
+
+{ TRegFindThread }
+
+procedure TRegFindThread.Add;
+var
+ Node: TTreeNode;
+begin
+ with ListTV do begin
+ //Items.BeginUpdate;
+ Node := TTreeNode.Create(Items);
+ SetTNImage(Node, syncIcon);
+ Items.AddNode(Node, FindNode, Copy(CurrentPath, 1, 255), nil,
+ naAddChildFirst);
+ if not FindNode.Expanded and (FindNode.Count = 1) then //First Node
+ FindNode.Expand(False);
+ //Items.EndUpdate;
+ end;
+end;
+
+constructor TRegFindThread.CreateIt(PriorityLevel: TThreadPriority; s: string;
+ SearchFor: TSearchOptions; Progress: TFindThreadProgress);
+begin
+ inherited Create(True); // Create thread suspended
+ Priority := PriorityLevel; // Set Priority Level
+ FreeOnTerminate := True; // Thread Free Itself when terminated
+
+ SearchText := s;
+ Ranges := nil;
+ Self.SearchFor := SearchFor;
+ Self.Progress := Progress;
+end;
+
+destructor TRegFindThread.Destroy;
+begin
+ if Assigned(FindNode) then
+ FindNode.Data := nil;
+ inherited;
+end;
+
+procedure TRegFindThread.Execute;
+begin
+ Synchronize(Start);
+ Find;
+ Synchronize(Finish);
+end;
+
+procedure TRegFindThread.Find;
+var
+ SpecialKey: HKEY;
+
+ procedure Add(const Path: string; const Icon: Integer);
+ var
+ zCurrentPath: string;
+ begin
+ zCurrentPath := CurrentPath;
+
+ CurrentPath := Path;
+ syncIcon := Icon;
+ Synchronize(Self.Add);
+
+ CurrentPath := zCurrentPath;
+ end;
+
+ procedure AddValueName(const ValueName: string; Typ: TRegDataType);
+ begin
+ Add(CurrentPath + '\\' + ValueName, IconOfDataType(Typ));
+ end;
+
+ procedure AddValueData(const ValueName: string; Context: TRegContext);
+ begin
+ Add(CurrentPath + '\\' + ValueName + ' = ' + DataPreviewOfContext(Context),
+ IconOfDataType(Context.Typ));
+ end;
+
+ function FoundInStr(const Data: string): Boolean;
+ begin
+ Result := False;
+ if SearchText = '' then
+ Exit;
+
+ if (Data = '') and not (sfWildCards in SearchFor) then
+ Exit;
+
+ if sfWildCards in SearchFor then begin
+ if Assigned(Mask) then
+ Result := Mask.Matches(Data);
+ end else begin
+ {if not (sfFileNames in SearchFor) then begin
+ if TextBegin(SearchText, UntilChar(Data, '~')) and FileExists(Data) then
+ Result := SameFileName(SearchText, GetFileNew(Data));
+ Exit;
+ end; }
+
+ if [sfParts, sfIgnoreCase] <= SearchFor then
+ if SfUseLocales in SearchFor then
+ Result := 0<PosEx(SearchText, AnsiLowerCase(Data))
+ else
+ Result := 0<PosExText(SearchText, Data)
+ else if sfParts in SearchFor then
+ Result := 0<PosEx(SearchText, Data)
+ else if sfIgnoreCase in SearchFor then
+ if SfUseLocales in SearchFor then
+ Result := (AnsiLowerCase(Data) = SearchText)
+ else
+ Result := SameText(Data, SearchText)
+ else
+ Result := (SearchText = Data);
+ end;
+ end;
+
+ function FoundInByteA(const Data: TByteA): Boolean;
+ begin
+ Result := FoundInStr(StrOfByteA(Data));
+ end;
+
+ procedure ScanValues(Key: HKEY; Info: TRegKeyInfo);
+ var
+ i: Integer;
+ MaxLen, NameLen, Len, Typ: Cardinal;
+ Buffer: PByte;
+ ValueName: PChar;
+
+ procedure ScanValue(const ValueName: string; const Typ: TRegDataType;
+ const Data: string);
+ begin
+ if (sfSpecialTypes in SearchFor) and not InRanges(Ranges, Typ) then
+ Exit;
+
+ case Typ of
+ rdString, rdExpandString: if sfString in SearchFor then begin
+ if FoundInStr(Data) then begin
+ Inc(DataFound);
+ AddValueData(ValueName,
+ RegContext(Typ, TByteA(Copy(Data, 1, Length(Data)-1))));
+ end;
+ end;
+
+ rdCardinal, rdCardBigEndian: if sfDWord in SearchFor then begin
+ if (Length(Data) >= SizeOf(Cardinal)) and
+ (dwordVal = PCardinal(Copy(Data, 1, SizeOf(Cardinal)))^) then begin
+ Inc(DataFound);
+ AddValueData(ValueName,
+ RegContext(Typ, ByteAOfStr(Data)));
+ end;
+ end;
+
+ else
+ if sfOtherTypes in SearchFor then begin
+ if FoundInStr(Data) then begin
+ Inc(DataFound);
+ AddValueData(ValueName,
+ RegContext(Typ, ByteAOfStr(Data)));
+ end;
+ end;
+ end;
+ end;
+
+ begin
+ MaxLen := Info.MaxValueLen + 1; //Include Nullbyte
+
+ Buffer := nil;
+ if sfValueData in SearchFor then
+ GetMem(Buffer, Info.MaxDataLen);
+
+ GetMem(ValueName, MaxLen);
+ for i := 0 to Info.NumValues-1 do begin
+ NameLen := MaxLen;
+ Len := Info.MaxDataLen;
+ if not Success(RegEnumValue(Key, i, ValueName, NameLen, nil, @Typ,
+ Buffer, @Len)) then
+ Continue;
+
+ if sfValueNames in SearchFor then
+ if FoundInStr(ValueName) then begin
+ Inc(ValuesFound);
+ AddValueName(ValueName, Typ);
+ end;
+
+ if sfValueData in SearchFor then
+ ScanValue(ValueName, Typ, string(Copy(TByteA(Buffer), 0, Len)));
+ end;
+
+ FreeMem(ValueName, MaxLen);
+ if sfValueData in SearchFor then
+ FreeMem(Buffer, Info.MaxDataLen);
+ end;
+
+ procedure ScanKey(Key: HKEY; const KeyName: string = '');
+ var
+ p: PChar;
+ i, z: Integer;
+ l, Len: DWORD;
+ NewKey: HKEY;
+ Info: TRegKeyInfo;
+ begin
+ if Terminated then Exit;
+
+ Inc(KeysScanned);
+ if Progress <> fpNone then
+ if (Progress = fpEach) or
+ ((Progress = fpEvery512th) and ((KeysScanned and $1FF) = 0)) then begin
+ syncStatusText := '(' + IntToStr(KeysScanned) + ' k) ' + CurrentPath;
+ Synchronize(UpdateStatus);
+ end;
+
+ with Info do
+ if not Success(RegQueryInfoKey(Key, nil, nil, nil, @NumSubKeys,
+ @MaxSubKeyLen, nil, @NumValues, @MaxValueLen, @MaxDataLen,
+ nil, nil)) then
+ Exit;
+
+ if (Info.NumValues > 0) and SearchForValues then
+ ScanValues(Key, Info);
+
+ if Info.NumSubKeys <= 0 then
+ Exit;
+
+ Len := Info.MaxSubKeyLen + 1;
+ GetMem(p, Len);
+
+ for i := 0 to Info.NumSubKeys-1 do begin
+ l := Len;
+ RegEnumKeyEx(Key, i, p, l, nil, nil, nil, nil);
+ if sfKeys in SearchFor then
+ if FoundInStr(p) then begin
+ Inc(KeysFound);
+ Add(CurrentPath + '\' + p, iconKeyMiddle);
+ end;
+
+ if Success(RegOpenKey(Key, p, NewKey)) then begin
+ z := Length(CurrentPath);
+ CurrentPath := CurrentPath + '\' + p;
+
+ try
+ ScanKey(NewKey, p);
+ finally
+ RegCloseKey(NewKey);
+ end;
+
+ SetLength(CurrentPath, z);
+ end;
+
+ if Terminated then Break;
+ end;
+
+ FreeMem(p, Len);
+ end;
+
+begin
+ with TClock.Create do begin
+ FindNode.Text := FindNodeText + ': ';
+
+ try
+ if sfHKU in SearchFor then begin
+ CurrentPath := 'HKU';
+ ScanKey(HKEY_USERS);
+ end;
+ if sfHKLM in SearchFor then begin
+ CurrentPath := 'HKLM';
+ ScanKey(HKEY_LOCAL_MACHINE);
+ end;
+ if sfHKDD in SearchFor then begin
+ CurrentPath := 'HKDD';
+ ScanKey(HKEY_DYN_DATA);
+ end;
+
+ if SpecialPath <> '' then begin
+ if Success(RegOpenKey(HKEYOfStr(ExRegRoot(SpecialPath)),
+ PChar(ExRegKey(SpecialPath)), SpecialKey)) then begin
+ CurrentPath := LWPSolve(SpecialPath);
+ ScanKey(SpecialKey);
+ RegCloseKey(SpecialKey);
+ end else
+ ShowMessage('Could not open' + EOL +
+ Quote(SpecialPath));
+ end;
+ except
+ syncStatusText := '(' + IntToStr(KeysScanned) + ' k) ' + CurrentPath +
+ 'Error --> Terminated.';
+ Synchronize(UpdateStatus);
+ Sleep(1000);
+ end;
+
+ TimeElapsed := SecondsPassed;
+ Free; end;
+end;
+
+function StrOfSearchOptions(const Options: TSearchOptions): string;
+
+ procedure Add(const s: string);
+ begin
+ Result := Result + s;
+ end;
+
+ procedure AddOption(const Option: string; const Flag: TSearchVar;
+ const Optional: Boolean = False);
+ begin
+ if Flag in Options then
+ Add(Option)
+ else
+ if not Optional then
+ Add('^' + Option);
+ end;
+
+begin
+ Result := '';
+
+ Add('[');
+ AddOption('H', sfAsHex, True);
+ AddOption('W ', sfWildcards, True);
+
+ AddOption('C', sfIgnoreCase);
+ AddOption('L', sfUseLocales);
+ AddOption('P ', sfParts);
+
+ AddOption('K', sfKeys);
+ AddOption('N', sfValueNames);
+ AddOption('D ', sfValueData);
+
+ AddOption('S', sfString);
+ AddOption('D', sfDWORD);
+ AddOption('O', sfOtherTypes);
+ AddOption('?', sfSpecialTypes);
+
+ Add('] [');
+
+ if [sfHKU, sfHKLM, sfHKDD] <= Options then
+ Add('ALL')
+ else begin
+ AddOption('HKU ', sfHKU, True);
+ AddOption('HKLM ', sfHKLM, True);
+ AddOption('HKDD ', sfHKDD, True);
+ Result := TrimRight(Result);
+ end;
+
+ Add(']');
+end;
+
+procedure TRegFindThread.Start;
+begin
+ Mask := nil;
+ KeysFound := 0;
+ ValuesFound := 0;
+ DataFound := 0;
+ KeysScanned := 0;
+
+ //Prepare for options
+ if sfAsHex in SearchFor then begin
+ SearchText := string(ByteAOfHex(SearchText));
+ SearchFor := SearchFor - [sfDWord, sfIgnoreCase];
+ end else begin
+ if SfUseLocales in SearchFor then
+ SearchText := AnsiLowerCase(SearchText);
+
+ dwordVal := 0;
+ if sfDWord in SearchFor then
+ if IsValidInteger(SearchText) then
+ dwordVal := StrToInt(SearchText)
+ else
+ Exclude(SearchFor, sfDWord);
+
+ if sfWildCards in SearchFor then
+ try
+ Mask := TMask.Create(SearchText);
+ except
+ Mask.Free;
+ Mask := nil;
+ end;
+ end;
+
+ SearchForValues := (sfValueNames in SearchFor)
+ or (sfValueData in SearchFor);
+
+ FindNodeText := 'Find ' + Quote(FriendlyStr(SearchText)) + ' ' +
+ StrOfSearchOptions(SearchFor);
+
+ with ListTV.Items do begin
+ BeginUpdate;
+ FindNode := AddChildObject(nil, FindNodeText + '...', nil);
+ FindNode.Data := Self;
+ SetTNImage(FindNode, iconHostReg);
+ EndUpdate;
+ end;
+end;
+
+procedure TRegFindThread.UpdateStatus;
+begin
+ FindNode.Text := FindNodeText + ' ' + syncStatusText;
+end;
+
+procedure TRegFindThread.Finish;
+var
+ Found: string;
+begin
+ ObjectsFound := KeysFound + ValuesFound + DataFound;
+
+ Found := StrNumerus(ObjectsFound, 'object', 'objects', 'No');
+ if ObjectsFound < 2 then
+ Found := Found + ' found.'
+ else begin
+ Found := Found + ' found: ';
+ if KeysFound > 0 then
+ Found := Found + StrNumerus(KeysFound, 'KeyName, ', 'KeyNames, ', 'No');
+ if ValuesFound > 0 then
+ Found := Found + StrNumerus(ValuesFound, 'ValueName, ', 'ValueNames, ',
+ 'No');
+ if DataFound > 0 then
+ Found := Found + StrNumerus(DataFound, 'Data', 'Datas', 'No');
+
+ if RightStr(Found, 2) = ', ' then
+ Delete(Found, Length(Found) - 1, 2);
+ end;
+
+ FindNode.Text := FindNodeText + Format(' OK (%0.1f s) %s',
+ [TimeElapsed, Found]);
+end;
+
+end.
+unit FindWinU;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
+ ComCtrls, StdCtrls, ExtCtrls, Clipbrd, NewPanels, plutoconst, FindTH, YTools,
+ PrefTools, Menus, XReg, RangeEdit;
+
+type
+ TFindWin = class(TForm)
+ ListTV: TTreeView;
+ FindP: TPanel;
+ FindE: TEdit;
+ ColorPanel1: TColorPanel;
+ ResultsPopup: TPopupMenu;
+ Copy1: TMenuItem;
+ ColorPanel2: TColorPanel;
+ FindPrefP: TPanel;
+ CommonGB: TGroupBox;
+ Label4: TLabel;
+ SfWildCardsCB: TCheckBox;
+ SfPartsCB: TCheckBox;
+ SfIgnoreCaseCB: TCheckBox;
+ SfAsHexCB: TCheckBox;
+ SfAsDWord: TCheckBox;
+ SfUseLocalesCB: TCheckBox;
+ FindGB: TGroupBox;
+ SfHKUCB: TCheckBox;
+ SfHKLMCB: TCheckBox;
+ SfHKDDCB: TCheckBox;
+ SfRootKeyRB: TRadioButton;
+ SfCurKeyRB: TRadioButton;
+ SfCLSIDCB: TCheckBox;
+ SfInterfaceCB: TCheckBox;
+ SfKeysCb: TCheckBox;
+ SfValuesCB: TCheckBox;
+ SfDataCB: TCheckBox;
+ SfStringCB: TCheckBox;
+ SfOtherCB: TCheckBox;
+ SfDWordCB: TCheckBox;
+ Panel2: TPanel;
+ GroupBox1: TGroupBox;
+ Label1: TLabel;
+ ThreadPriorityComB: TComboBox;
+ ProgressRG: TRadioGroup;
+ Panel5: TPanel;
+ BorderPanel1: TBorderPanel;
+ MoleLogoI: TImage;
+ TypeRangeE: TRangeEdit;
+ SfTypesCB: TCheckBox;
+ Panel1: TPanel;
+ TransparentCB: TPrefCheckBox;
+ StayOnTopCB: TPrefCheckBox;
+ FindB: TButton;
+ FindPrefB: TButton;
+ procedure FindBClick(Sender: TObject);
+ procedure ListTVKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
+ procedure FindEKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
+ procedure ActivateIt(Sender: TObject);
+ procedure DeActivateIt(Sender: TObject);
+ procedure FormDeactivate(Sender: TObject);
+ procedure FormActivate(Sender: TObject);
+ procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
+ procedure SfWildCardsCBClick(Sender: TObject);
+ procedure StayOnTopCBClick(Sender: TObject);
+ procedure SfRootKeysUpdate(Sender: TObject);
+ procedure FindPrefBClick(Sender: TObject);
+
+ procedure CloseFindPrefP;
+ procedure OpenFindPrefP;
+ procedure FindEChange(Sender: TObject);
+ procedure SfDataCBClick(Sender: TObject);
+ procedure ListTVDblClick(Sender: TObject);
+ procedure SfAsHexCBClick(Sender: TObject);
+ procedure Copy1Click(Sender: TObject);
+ procedure SfIgnoreCaseCBClick(Sender: TObject);
+ procedure FormCreate(Sender: TObject);
+ procedure FormShow(Sender: TObject);
+ procedure SfTypesCBClick(Sender: TObject);
+ end;
+
+const
+ fpbOpen = 0;
+ fpbCloseCaption = 'Params &<<';
+
+ fpbClosed = 1;
+ fpbOpenCaption = 'Params &>>';
+
+var
+ FindWin: TFindWin;
+
+implementation
+
+uses plutomain, PrefU, ValuesU;
+
+{$R *.DFM}
+
+procedure TFindWin.FindBClick(Sender: TObject);
+var
+ SearchFor: TSearchOptions;
+ FindThread: TRegFindThread;
+
+ procedure AddOption(CheckBox: TCustomCheckBox; Flag: TSearchVar);
+ begin
+ with CheckBox as TCheckBox do
+ if Enabled and Checked then
+ Include(SearchFor, Flag);
+ end;
+
+begin
+ SearchFor := [];
+
+ AddOption(SfKeysCB, sfKeys);
+
+ AddOption(SfValuesCB, sfValueNames);
+ AddOption(SfDataCB, sfValueData);
+
+ AddOption(SfStringCB, sfString);
+ AddOption(SfDWordCB, sfDWord);
+ AddOption(SfOtherCB, sfOtherTypes);
+
+ if SfRootKeyRB.Checked then begin
+ AddOption(SfHKUCB, sfHKU);
+ AddOption(SfHKLMCB, sfHKLM);
+ AddOption(SfHKDDCB, sfHKDD);
+ end;
+
+ AddOption(SfAsHexCB, sfAsHex);
+ AddOption(SfWildCardsCB, sfWildCards);
+ AddOption(SfPartsCB, sfParts);
+ AddOption(SfIgnoreCaseCB, sfIgnoreCase);
+ AddOption(SfUseLocalesCB, sfUseLocales);
+
+ {AddOption(SfCLSIDCB, sfCLSID);
+ AddOption(SfInterfaceCB, sfInterface);}
+
+ if SfTypesCB.Checked and not TypeRangeE.RangeMaximal then
+ Include(SearchFor, sfSpecialTypes);
+
+ FindThread := TRegFindThread.CreateIt(
+ TThreadPriority(ThreadPriorityComB.ItemIndex), FindE.Text, SearchFor,
+ TFindThreadProgress(ProgressRG.ItemIndex));
+
+ FindThread.ListTV := ListTV;
+
+ if sfSpecialTypes in SearchFor then
+ FindThread.Ranges := TypeRangeE.Value;
+
+ if SfCurKeyRB.Checked then
+ FindThread.SpecialPath :=
+ LWPSolve(StrOfRegPath(CurKey(uhNonSystemShortcuts)));
+
+ FindThread.Resume;
+ CloseFindPrefP;
+end;
+
+procedure TFindWin.ListTVKeyDown(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+var
+ Node: TTreeNode;
+
+ procedure TerminateFindThread;
+ var
+ FindThread: TRegFindThread;
+ begin
+ if (Node.Level = 0) then begin
+ FindThread := TRegFindThread(Node.Data);
+ if not Assigned(FindThread) then
+ Node.Delete
+ else
+ try
+ FindThread.Terminate;
+ except
+ Node.Text := 'Error: couldn''t terminate thread!';
+ end;
+ end else
+ Node.Delete;
+ end;
+
+begin
+ Node := ListTV.Selected;
+ if not Assigned(Node) then
+ Exit;
+
+ case Key of
+ VK_F12: if Assigned(Node.Parent) then
+ Node.Parent.AlphaSort;
+
+ VK_RETURN: ListTVDblClick(Sender);
+
+ VK_DELETE: TerminateFindThread;
+ end;
+end;
+
+procedure TFindWin.FindEKeyDown(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+begin
+ if Key = VK_RETURN then
+ FindBClick(Sender);
+
+ if Key = VK_UP then begin
+ CloseFindPrefP;
+ Key := 0;
+ end else if Key = VK_Down then begin
+ OpenFindPrefP;
+ Key := 0;
+ end;
+end;
+
+procedure TFindWin.ActivateIt(Sender: TObject);
+begin
+ ActivateThis(Sender);
+end;
+
+procedure TFindWin.DeActivateIt(Sender: TObject);
+begin
+ DeActivateThis(Sender);
+end;
+
+procedure TFindWin.FormDeactivate(Sender: TObject);
+begin
+ if Assigned(ActiveControl) and (ActiveControl.Tag = EditControlFlag) then
+ DeActivateThis(ActiveControl);
+
+ AlphaBlend := TransparentCB.Checked;
+end;
+
+procedure TFindWin.FormActivate(Sender: TObject);
+begin
+ if Assigned(ActiveControl) and (ActiveControl.Tag = EditControlFlag) then
+ ActivateThis(ActiveControl);
+
+ AlphaBlend := False;
+end;
+
+procedure TFindWin.FormKeyDown(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+begin
+ if Key = VK_ESCAPE then
+ Close;
+ MainWin.FormKeyDown(Sender, Key, Shift);
+end;
+
+procedure TFindWin.SfWildCardsCBClick(Sender: TObject);
+begin
+ SfPartsCB.Enabled := not SfWildcardsCB.Checked;
+ SfIgnoreCaseCB.Enabled := not SfWildcardsCB.Checked;
+ SfUseLocalesCB.Enabled := SfIgnoreCaseCB.Checked and not SfWildcardsCB.Checked;
+end;
+
+procedure TFindWin.StayOnTopCBClick(Sender: TObject);
+begin
+ if StayOnTopCB.Checked then
+ FormStyle := fsStayOnTop
+ else
+ FormStyle := fsNormal;
+end;
+
+procedure TFindWin.SfRootKeysUpdate(Sender: TObject);
+begin
+ with SfRootKeyRB do begin
+ SfHKLMCB.Enabled := Checked;
+ SfHKUCB.Enabled := Checked;
+ SfHKDDCB.Enabled := Checked;
+ end;
+end;
+
+procedure TFindWin.FindPrefBClick(Sender: TObject);
+begin
+ case FindPrefB.Tag of
+ fpbOpen:
+ CloseFindPrefP;
+ fpbClosed:
+ OpenFindPrefP;
+ else
+ ShowMessage('Fehler: FindPrefB hat unbekanntes Tag');
+ end;
+end;
+
+procedure TFindWin.CloseFindPrefP;
+begin
+ with FindPrefB do begin
+ Tag := fpbClosed;
+ Caption := fpbOpenCaption;
+ end;
+ FindPrefP.Visible := False;
+ ListTV.Repaint;
+end;
+
+procedure TFindWin.OpenFindPrefP;
+begin
+ with FindPrefB do begin
+ Tag := fpbOpen;
+ Caption := fpbCloseCaption;
+ end;
+ FindPrefP.Visible := True;
+ ListTV.Repaint;
+end;
+
+procedure TFindWin.FindEChange(Sender: TObject);
+begin
+ if IsValidInteger(FindE.Text) then
+ SfDWORDCB.Caption := 'D&WORD OK'
+ else
+ SfDWORDCB.Caption := 'D&WORD ??';
+
+ SfAsHexCB.Enabled := (FindE.Text <> '')
+ and not CharIn(FindE.Text, AllChars - HexadecimalChars - [' ']);
+ SfAsDWord.Enabled := SfAsHexCB.Enabled and (Length(TrimAll(FindE.Text)) < 8);
+end;
+
+procedure TFindWin.SfDataCBClick(Sender: TObject);
+begin
+ with SfDataCB do begin
+ SfStringCB.Enabled := Checked;
+ SfDWordCB.Enabled := Checked;
+ SfOtherCB.Enabled := Checked;
+ end;
+end;
+
+procedure TFindWin.ListTVDblClick(Sender: TObject);
+var
+ Node: TTreeNode;
+begin
+ Node := ListTV.Selected;
+ if not Assigned(Node) or (Node.Level = 0) then
+ Exit;
+
+ MainWin.GotoKey(UntilLastChar(Node.Text, '='))
+end;
+
+procedure TFindWin.SfAsHexCBClick(Sender: TObject);
+begin
+ with SfAsHexCB do begin
+ SfIgnoreCaseCB.Enabled := Checked;
+ SfWildCardsCB.Enabled := Checked;
+ end;
+end;
+
+procedure TFindWin.Copy1Click(Sender: TObject);
+var
+ Node: TTreeNode;
+begin
+ Node := ListTV.Selected;
+ if not Assigned(Node) then
+ Exit;
+
+ Clipboard.AsText := Node.Text;
+end;
+
+procedure TFindWin.SfIgnoreCaseCBClick(Sender: TObject);
+begin
+ SfUseLocalesCB.Enabled := SfIgnoreCaseCB.Checked;
+end;
+
+procedure TFindWin.FormCreate(Sender: TObject);
+var
+ ImageFile: string;
+begin
+ Caption := 'Pluto.RegMole ' + RegMoleVersion +
+ ' - The fastest registry search engine for Win9x';
+
+ ImageFile := PlutoDir + 'mole.bmp';
+ if FileExists(ImageFile) then
+ MoleLogoI.Picture.LoadFromFile(ImageFile);
+
+ Width := Screen.WorkAreaWidth - 100;
+
+ CloseFindPrefP;
+end;
+
+procedure TFindWin.FormShow(Sender: TObject);
+begin
+ Top := Screen.WorkAreaHeight - 450;
+ Height := Screen.WorkAreaHeight - Top;
+ Left := (Screen.WorkAreaWidth - Width) div 2;
+end;
+
+procedure TFindWin.SfTypesCBClick(Sender: TObject);
+begin
+ TypeRangeE.Enabled := SfTypesCB.Checked;
+end;
+
+end.
+unit Plutoconst;
+
+interface
+
+uses ComCtrls, Classes, XReg, UniKey, YTools;
+
+var
+ Started: Boolean = False;
+ MurphyMode: Boolean = False;
+ PlutoKey: TUniKey;
+
+const
+ Version = '1.6 -nium Alpha';
+ Overnight = True;
+ Codename = 'Phoenix';
+ //Generation.Version-Release-Beta
+ // GG.VVRRBB
+ VersionNum: Double = 1.600000;
+ //Must be Double!
+
+const
+ iconKey = 0;
+
+ iconFirstHKEY = 2;
+ iconHKLM = iconFirstHKEY;
+ iconHKU = iconFirstHKEY + 2;
+
+ iconFirstShortcut = iconFirstHKEY + 4;
+ iconHKCC = iconFirstShortcut;
+ iconHKCU = iconFirstShortcut + 2;
+ iconHKCR = iconFirstShortcut + 4;
+ iconHKDD = iconFirstShortcut + 6;
+ iconHKPD = iconFirstShortcut + 8;
+ iconHKWM = iconFirstShortcut + 10;
+ iconHKWU = iconFirstShortcut + 12;
+ iconShortcut = iconFirstShortcut + 14;
+ nHKeyIcons = 16;
+
+ iconFirstType = iconFirstShortcut + nHKeyIcons;
+ iconNone = iconFirstType + 0;
+ iconString = iconFirstType + 1;
+ iconExpandString =iconFirstType + 2;
+ iconBinary = iconFirstType + 3;
+ iconCardinal = iconFirstType + 4;
+ iconCardBigEndian=iconFirstType + 5;
+ iconLink = iconFirstType + 6;
+ iconMultiString = iconFirstType + 7;
+ iconResList = iconFirstType + 8;
+ iconFullResDesc = iconFirstType + 9;
+ iconResReqList = iconFirstType + 10;
+ iconUnknownType = iconFirstType + 11;
+ nTypeIcons = 12;
+
+ iconFirstValue = iconFirstType + nTypeIcons;
+ iconValueElse = iconFirstValue;
+ iconValueEdit = iconFirstValue + 1;
+ iconValueEditBinary = iconFirstValue + 2;
+ iconValueZeromize = iconFirstValue + 3;
+ iconValueDublicate = iconFirstValue + 4;
+ iconMainValue = iconFirstValue + 5;
+ iconTakeAsMainValue = iconFirstValue + 6;
+ nValueIcons = 7;
+
+ iconFirstKey = iconFirstValue + nValueIcons;
+ iconKeyInfos = iconFirstKey;
+ iconSubKey = iconFirstKey + 1;
+ iconKeyDublicate = iconFirstKey + 2;
+ iconKeyFind = iconFirstKey + 3;
+ iconKeyTrace = iconFirstKey + 4;
+ nKeyIcons = 5;
+
+ iconFirstContextMenues = iconFirstKey + nKeyIcons;
+ iconRename = iconFirstContextMenues;
+ iconDelete = iconFirstContextMenues + 1;
+ nContextMenuesIcon = 2;
+
+ iconFirstIni = iconFirstContextMenues + nContextMenuesIcon;
+ iconIniSection = iconFirstIni;
+ nIniIcons = 1;
+
+ iconFirstHost = iconFirstIni + nIniIcons;
+ iconHostReg = iconFirstHost;
+ iconHostIni = iconFirstHost + 1;
+ iconHostUni = iconFirstHost + 2;
+ iconHostUni2 = iconFirstHost + 3;
+ nHostIcons = 4;
+
+ iconFirstOther = iconFirstHost + nHostIcons;
+
+ iconSortArrowAsc = iconFirstOther + 0;
+ iconSortArrowDesc = iconFirstOther + 1;
+ iconKeyMiddle = iconFirstOther + 2;
+ iconLock = iconFirstOther + 3;
+
+ //iconDefect = iconFirstOther;
+
+ { WorkWin.ChangeImages }
+ iconFirstChange = 0;
+ iconCKeyPlus = iconFirstChange;
+ iconCKeyMinus = iconFirstChange + 1;
+ iconCValuePlus = iconFirstChange + 2;
+ iconCValueMinus = iconFirstChange + 3;
+ iconCContext = iconFirstChange + 4;
+ iconOldContext = iconFirstChange + 5;
+ iconNewContext = iconFirstChange + 6;
+ iconGroup = iconFirstChange + 7;
+ iconGroupBlinking = iconFirstChange + 8;
+ nChangeIcons = 7;
+
+ DefaultValueFlag = Pointer(1);
+ MultiEditFlag = Pointer(2);
+
+ NoValueCaption = '[No Value]';
+
+ EditControlFlag = 100;
+
+ MaxPreviewLen = 255;
+ RegMaxDataSize = $FFFF; //64 KB
+
+const
+ BoolStrFileName = 'Boolean Strings.txt';
+ ShortcutsFileName = 'Shortcuts.ini';
+ StandardShortcutsFileName = 'StandardShortcuts.ini';
+ SisyFilterFileName = 'sisy filter.txt';
+
+ clDarkGray = $00404040;
+ clBrightRed = $00BBBBFF;
+ clVeryBrightRed = $00DDDDFF;
+ clBrightBlue = $00FFBBBB;
+ clBrightGreen = $00BBFFBB;
+ clCyan = $00FFFF44;
+ clBrightCyan = $00FFFFBB;
+ clVeryBrightCyan = $00FFFFDD;
+ clBrightYellow = $00BBFFFF;
+ clVeryBrightYellow = $00DDFFFF;
+ clBrightPurple = $00FFBBFF;
+ clBrightSilver = $00DDDDDD;
+ clGold = $0055CCEE;
+
+ clVeryBrightBlue = $00FFDDDD;
+
+type
+ TValueListColumn = (vlcName, vlcSize, vlcType, vlcData);
+
+const
+ ValueListColumnRange = [Low(TValueListColumn)..High(TValueListColumn)];
+
+type
+ TSearchVar = (sfKeys, sfValueNames, sfValueData,
+ sfAsHex, sfAsDWord,
+ sfWildCards, sfParts, sfIgnoreCase, SfUseLocales,
+ sfHKU, sfHKLM, sfHKDD,// sfCLSID, sfInterface,
+ sfString, sfDWord, sfOtherTypes, sfSpecialTypes);
+
+ TSearchOptions = set of TSearchVar;
+
+ //be carefull: used in with!
+ TKeyShortcut = record
+ Alias: string;
+ RealPath: string;
+ Node: TTreeNode;
+ end;
+ PKeyShortcut = ^TKeyShortcut;
+ TShortcutA = array of TKeyShortcut;
+
+ TOpenNode = function (Reg: TXRegistry; Node: TTreeNode): Boolean;
+ TCheckNode = procedure (Node: TTreeNode; OnlyOnce: Boolean = True);
+
+ //NodeInfo System
+ TNodeFlag = (nfDefect, nfReadOnly, nfChecked,
+ nfCopy, nfCut, nfPaste);
+ TNodeFlags = set of TNodeFlag;
+
+ TUniHostType = (uhNone,
+ uhReg, uhIni, uhRegFile,
+ uhUserShortcut, uhStandardShortcut, uhSystemShortcut);
+ TUniHostTypes = set of TUniHostType;
+
+const
+ uhShortcuts = [uhUserShortcut, uhStandardShortcut, uhSystemShortcut];
+ uhNonSystemShortcuts = [uhUserShortcut, uhStandardShortcut];
+
+ NodeFlagStrings: array[TNodeFlag] of string = (
+ 'nfDefect', 'nfReadOnly', 'nfChecked',
+ 'nfCopy', 'nfCut', 'nfPaste');
+
+ HostTypeStrings: array[TUniHostType] of string = ('uhNone',
+ 'uhReg', 'uhIni', 'uhRegFile',
+ 'uhUserShortcut', 'uhStandardShortcut', 'uhSystemShortcut');
+
+type
+ TNodeInfo = packed class
+ public
+ HostType: TUniHostType;
+ Flags: TNodeFlags;
+ constructor Create(HostType: TUniHostType = uhNone; Flags: TNodeFlags = []);
+
+ procedure IncludeFlag(Flag: TNodeFlag);
+ procedure ExcludeFlag(Flag: TNodeFlag);
+
+ function IsHost: Boolean;
+ function IsShortcut: Boolean;
+
+ function ReadOnly: Boolean;
+ function Checked: Boolean;
+ function Defect: Boolean;
+ end;
+
+function NodeInfo(Node: TTreeNode): TNodeInfo;
+procedure ReportStatus(const s: string);
+
+const
+ PlatformStrings: array[0..2] of string =
+ ('VER_PLATFORM_WIN32s', 'VER_PLATFORM_WIN32_WINDOWS', 'VER_PLATFORM_WIN32_NT');
+
+var
+ PlutoDir: string = '';
+
+implementation
+
+uses SysUtils;
+
+function NodeInfo(Node: TTreeNode): TNodeInfo;
+begin
+ if not Assigned(Node) then begin
+ Result := nil;
+ Exit end;
+
+ if not Assigned(Node.Data) then
+ Node.Data := TNodeInfo.Create;
+ Result := TNodeInfo(Node.Data);
+end;
+
+{ TNodeInfo }
+
+constructor TNodeInfo.Create(HostType: TUniHostType; Flags: TNodeFlags);
+begin
+ inherited Create;
+ Self.HostType := HostType;
+ Self.Flags := Flags;
+end;
+
+function TNodeInfo.Checked: Boolean;
+begin
+ Result := nfChecked in Flags;
+end;
+
+function TNodeInfo.ReadOnly: Boolean;
+begin
+ Result := nfReadOnly in Flags;
+end;
+
+function TNodeInfo.Defect: Boolean;
+begin
+ Result := nfDefect in Flags;
+end;
+
+procedure TNodeInfo.IncludeFlag(Flag: TNodeFlag);
+begin
+ Include(Flags, Flag);
+end;
+
+procedure TNodeInfo.ExcludeFlag(Flag: TNodeFlag);
+begin
+ Exclude(Flags, Flag);
+end;
+
+function TNodeInfo.IsHost: Boolean;
+begin
+ Result := HostType <> uhNone;
+end;
+
+function TNodeInfo.IsShortcut: Boolean;
+begin
+ Result := HostType in uhShortcuts;
+end;
+
+function GetPlutoDir: string;
+begin
+ Result := LWPSlash(GetParam('-imports=', MyDir));
+ if not DirectoryExists(Result) then begin
+ ReportStatus('PlutoDir "' + Result + '" not found -> setting to default (MyDir).');
+ Result := MyDir;
+ end;
+ ReportStatus('PlutoDir=' + Result);
+end;
+
+var
+ ReportSL: TStringList;
+ ReportFileName: string;
+
+procedure ReportStatus(const s: string);
+begin
+ ReportSL.Add(s);
+ try
+ ReportSL.SaveToFile(ReportFileName);
+ except end;
+end;
+
+initialization
+ ReportFileName := MyDir + 'loadreport.txt';
+ ReportSL := TStringList.Create;
+ PlutoDir := GetPlutoDir;
+
+end.
+//winampviscolor <viscolor.txt>:
+unit plutomain;
+{$DEFINE UNIKEY}
+{$DEFINE CYCFS}
+
+{===============================================================================
+
+ cYcnus.Pluto 1.57 Beta 14
+ by Murphy
+
+ ©2000-2003 by cYcnus
+ visit www.cYcnus.de
+
+ murphy@cYcnus.de (Kornelius Kalnbach)
+
+ this programm is published under the terms of the GPL
+
+===============================================================================}
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
+ StdCtrls, ImgList, ComCtrls, ExtCtrls, Menus, Clipbrd, IniFiles,
+ ShellAPI, Grids,
+ //Components
+ NewPanels,
+ //Units
+ YTools, YTypes, UniKey, XReg,
+ //Pluto
+ Plutoconst,
+ SpyTH, SisyphusTH;
+
+const
+ NoPreBlinkHint = #1;
+
+type
+ TMainWin = class(TForm)
+ StatusBar: TStatusBar;
+ StatusBarPU: TPopupMenu;
+ CopyPath: TMenuItem;
+ InsertPath: TMenuItem;
+ ShowRealPathMI: TMenuItem;
+ PathP: TPanel;
+ N1: TMenuItem;
+ MainMenu1: TMainMenu;
+ Desktop1: TMenuItem;
+ Pluto1: TMenuItem;
+ RegEdit1: TMenuItem;
+ Free1: TMenuItem;
+ BigVal1: TMenuItem;
+ Hilfe1: TMenuItem;
+ History1: TMenuItem;
+ SplashScreen1: TMenuItem;
+ wwwcYcnusde1: TMenuItem;
+ Credits1: TMenuItem;
+ Optionen1: TMenuItem;
+ PrefMI: TMenuItem;
+ EditBoolStrMI: TMenuItem;
+ N4: TMenuItem;
+ ImageList1: TImageList;
+ Plutoini1: TMenuItem;
+ About1: TMenuItem;
+ kornycYcnusde1: TMenuItem;
+ ools1: TMenuItem;
+ NotePad1: TMenuItem;
+ RegEdit2: TMenuItem;
+ SysEdit1: TMenuItem;
+ WordPad1: TMenuItem;
+ N3: TMenuItem;
+ N5: TMenuItem;
+ Suchen1: TMenuItem;
+ Find1: TMenuItem;
+ File1: TMenuItem;
+ ExitPluto1: TMenuItem;
+ OpenProgramFolder1: TMenuItem;
+ N6: TMenuItem;
+ OpenWinDir1: TMenuItem;
+ HintBlinkT: TTimer;
+ FindCLSID1: TMenuItem;
+ Clipboard1: TMenuItem;
+ GotoCLSID1: TMenuItem;
+ CommandLineParameters1: TMenuItem;
+ plutocYcnusde1: TMenuItem;
+ N7: TMenuItem;
+ heinzcYcnusde1: TMenuItem;
+ kornycYcnusde2: TMenuItem;
+ N8: TMenuItem;
+ ExternalHexEditMI: TMenuItem;
+ Cleanup1: TMenuItem;
+ DeleteTempFolder1: TMenuItem;
+ Debug1: TMenuItem;
+ CurrentDir1: TMenuItem;
+ RepairPluto155bBug1: TMenuItem;
+ BackupRegistryscanreg1: TMenuItem;
+ Username1: TMenuItem;
+ SupportMI: TMenuItem;
+ MurphyMI: TMenuItem;
+ ToDoMI: TMenuItem;
+ Beta1: TMenuItem;
+ UniKeycYcnusde1: TMenuItem;
+ YToolscYcnusde1: TMenuItem;
+ YPanelscYcnusde1: TMenuItem;
+ Usedenginescomponents1: TMenuItem;
+ PrefToolscYcnusde1: TMenuItem;
+ BugReportsRequests1: TMenuItem;
+ murphycYcnusde1: TMenuItem;
+ Credits2: TMenuItem;
+ News1: TMenuItem;
+ cYcnus1: TMenuItem;
+ Contact1: TMenuItem;
+ N2: TMenuItem;
+ IjustwantCONTACT1: TMenuItem;
+ N9: TMenuItem;
+ AnotherPluto1: TMenuItem;
+ UniKeyDemoMI: TMenuItem;
+ Path1: TMenuItem;
+ RegisterPlugIns1: TMenuItem;
+ UniPluginOD: TOpenDialog;
+ SwapLM_CUB: TButton;
+ PathE: TEdit;
+ ShowLoadreport1: TMenuItem;
+ KillPluto1: TMenuItem;
+ ShowPlatform1: TMenuItem;
+ MSConfig1: TMenuItem;
+ TimetoRelaxMI: TMenuItem;
+ N10: TMenuItem;
+
+ procedure FormCreate(Sender: TObject);
+ procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
+ procedure FormClose(Sender: TObject; var Action: TCloseAction);
+ procedure InsertPathClick(Sender: TObject);
+
+ procedure StatusBarResize(Sender: TObject);
+ procedure StatusBarDblClick(Sender: TObject);
+ procedure StatusBarUpdate;
+ procedure CopyPathClick(Sender: TObject);
+
+ procedure SetStatus;
+ procedure GotoKey(Key: string);
+ procedure FindCLSID;
+ procedure GotoCLSID;
+ procedure UserGotoKey;
+ procedure ShowRealPathMIClick(Sender: TObject);
+ procedure PathEKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
+ procedure PathEChange(Sender: TObject);
+ procedure PathEExit(Sender: TObject);
+
+ procedure AppActivate(Sender: TObject);
+ procedure PathEKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
+ procedure ActivateIt(Sender: TObject);
+ procedure FormActivate(Sender: TObject);
+ procedure FormDeactivate(Sender: TObject);
+ procedure Pluto1Click(Sender: TObject);
+ procedure RegEdit1Click(Sender: TObject);
+ procedure Free1Click(Sender: TObject);
+ procedure BigVal1Click(Sender: TObject);
+ procedure SplashScreen1Click(Sender: TObject);
+ procedure HistoryClick(Sender: TObject);
+ procedure Credits1Click(Sender: TObject);
+
+ function Greeting(Name: string = NoPreBlinkHint): string;
+ procedure PrefMIClick(Sender: TObject);
+ procedure EditBoolStrMIClick(Sender: TObject);
+ procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
+ procedure SisyTerminate(Sender: TObject);
+ procedure OnSisyChange(Sender: TSisyThread; Change: TSisyChange);
+ procedure OnSisyValuePlus(Sender: TSisyThread; Change: TSisyChange);
+ procedure OnSisyValueMinus(Sender: TSisyThread; Change: TSisyChange);
+ procedure OnSisyContextChange(Sender: TSisyThread; Change: TSisyChange);
+
+ procedure Plutoini1Click(Sender: TObject);
+ procedure RegEdit2Click(Sender: TObject);
+ procedure SysEdit1Click(Sender: TObject);
+ procedure NotePad1Click(Sender: TObject);
+ procedure WordPad1Click(Sender: TObject);
+ procedure OpenWinDir1Click(Sender: TObject);
+ procedure OpenProgramFolder1Click(Sender: TObject);
+ procedure ExitPluto1Click(Sender: TObject);
+ procedure Find1Click(Sender: TObject);
+ procedure FormPaint(Sender: TObject);
+
+ procedure Load;
+ procedure StatusBarDrawPanel(StatusBar: TStatusBar;
+ Panel: TStatusPanel; const Rect: TRect);
+ procedure PathEKeyPress(Sender: TObject; var Key: Char);
+ procedure HintBlinkTTimer(Sender: TObject);
+ procedure FindCLSID1Click(Sender: TObject);
+ procedure GotoCLSID1Click(Sender: TObject);
+ procedure CommandLineParameters1Click(Sender: TObject);
+ procedure WebLinkMIClick(Sender: TObject);
+ procedure DeleteTempFolder1Click(Sender: TObject);
+ procedure CurrentDir1Click(Sender: TObject);
+ procedure RepairPluto155bBug1Click(Sender: TObject);
+ procedure BackupRegistryscanreg1Click(Sender: TObject);
+ procedure SisyStarted(Sender: TObject);
+ procedure StopHintBlinking;
+ procedure Username1Click(Sender: TObject);
+ procedure SupportMIClick(Sender: TObject);
+ procedure ToDoMIClick(Sender: TObject);
+ procedure MailLinkMIClick(Sender: TObject);
+ procedure IjustwantCONTACT1Click(Sender: TObject);
+ procedure ExternalHexEditMIClick(Sender: TObject);
+ procedure AnotherPluto1Click(Sender: TObject);
+ procedure Path1Click(Sender: TObject);
+ procedure RegisterPlugIns1Click(Sender: TObject);
+ procedure FormResize(Sender: TObject);
+ procedure SwapLM_CUBClick(Sender: TObject);
+ procedure ShowLoadreport1Click(Sender: TObject);
+ procedure KillPluto1Click(Sender: TObject);
+ procedure ShowPlatform1Click(Sender: TObject);
+ procedure MSConfig1Click(Sender: TObject);
+ procedure TimetoRelaxMIClick(Sender: TObject);
+ private
+ DoAutoComplete: Boolean;
+ MainWinLoaded: Boolean;
+ DontSavePrefs: Boolean;
+ PreBlinkHint: string;
+ end;
+
+var
+ MainWin: TMainWin;
+
+ StatusBar: TStatusBar;
+ MainReg: TXRegistry;
+
+ SpyThread: TRegSpyThread;
+ Sisys: TList;
+
+function TempDir: string;
+function PlutoUniPath: string;
+function PlutoIniFileName: string;
+
+function PathOfNode(Node: TTreeNode): string;
+function CurKey(AllowedShortcutTypes: TUniHostTypes = []): TRegPath;
+
+procedure ArrangePlutoStyle;
+procedure ArrangeRegEdStyle;
+procedure ArrangeFreeStyle;
+procedure ArrangeBigValStyle;
+
+procedure ActivateThis(Sender: TObject);
+procedure DeActivateThis(Sender: TObject);
+
+procedure SwapFonts(Sender: TWinControl);
+
+procedure AddHint(const Hint: string; Blinking: Boolean = False);
+procedure AddToLastHint(Appendix: string);
+procedure ChangeLastHint(NewHint: string);
+
+implementation
+
+uses
+ //Forms
+ FindWinU, valuesU, TreeU, WorkU, splash, PrefU,
+ //Units
+ Clock, Start, keybrd, CompEx, Colors, FindAllThread,
+ PrefTools;
+
+{$R *.DFM}
+
+var
+ SavedPlutoIniFileName: string = '';
+
+procedure AddHint(const Hint: string; Blinking: Boolean = False);
+begin
+ if Assigned(WorkWin) then
+ WorkWin.AddAHint(Hint);
+
+ with MainWin do begin
+ StopHintBlinking;
+
+ if Blinking then begin
+ HintBlinkT.Enabled := True;
+ if PreBlinkHint = NoPreBlinkHint then
+ PreBlinkHint := StatusBar.Panels[0].Text;
+ StatusBar.Panels[0].Text := WorkWin.LastHint;
+ end;
+ end;
+end;
+
+procedure AddToLastHint(Appendix: string);
+begin
+ with WorkWin.HintLB.Items do begin
+ if Count = 0 then
+ Exit;
+
+ Strings[Count-1] := Strings[Count-1] + Appendix;
+ end;
+ Application.ProcessMessages;
+// Sleep(1000);
+end;
+
+procedure ChangeLastHint(NewHint: string);
+begin
+ with WorkWin.HintLB.Items do begin
+ if Count = 0 then
+ Exit;
+
+ Strings[Count-1] := NewHint;
+ end;
+ Application.ProcessMessages;
+// Sleep(1000);
+end;
+
+function CurKey(AllowedShortcutTypes: TUniHostTypes = []): TRegPath;
+var
+ s: string;
+ Item: TListItem;
+begin
+ if Assigned(RegTV.Selected) then begin
+ s := PathOfNode(RegTV.Selected);
+ if AllowedShortcutTypes <> [] then
+ s := TraceKey(s, AllowedShortcutTypes);
+ Result.Root := ExRegRoot(s);
+ Result.Key := ExRegKey(s);
+
+ Item := ValueList.ItemFocused;
+ if Assigned(Item) then
+ Result.Value := RealValueName(Item);
+ Result.ValueSet := Assigned(Item);
+ end;
+end;
+
+function PathOfNode(Node: TTreeNode): string;
+begin
+ Result := '';
+
+ if not Assigned(Node) then
+ Exit;
+
+ if Assigned(Node.Parent) then
+ Result := LWPSlash(PathOfNode(Node.Parent)) + Node.Text
+ else
+ Result := Node.Text;
+end;
+
+procedure TMainWin.AppActivate(Sender: TObject);
+var
+ ActForm: TCustomForm;
+
+ procedure TryShow(Win: TCustomForm);
+ begin
+ if Assigned(Win) and Win.Visible then
+ Win.Show;
+ end;
+
+begin
+ ActForm := Screen.ActiveCustomForm; //LastActiveForm;
+ TryShow(ValuesWin);
+ TryShow(WorkWin);
+ TryShow(TreeWin);
+ TryShow(FindWin);
+ TryShow(SplashWin);
+ TryShow(MainWin);
+ TryShow(ActForm);
+end;
+
+procedure TMainWin.FormCreate(Sender: TObject);
+
+ procedure InitHKEYString(var H: THKEYString; const Long, Short: string;
+ Handle: Integer = 0; IsDefault: Boolean = False);
+ begin
+ H.Long := Long;
+ H.Short := Short;
+ H.Handle := Handle;
+ H.IsDefault := IsDefault;
+ end;
+
+begin
+{$IFDEF UNIKEY}
+{$IFDEF CYCFS}
+ RegisterUniClass('Y:\programme\unikey\cyc_fs.uni');
+{$ENDIF}
+{$ENDIF}
+
+ Application.OnActivate := AppActivate;
+ PlutoMain.StatusBar := StatusBar;
+
+ //Creating
+ MainReg := TXRegistry.Create;
+
+ //Initialize
+ Caption := 'cYcnus.Pluto ' + Version;
+ PreBlinkHint := NoPreBlinkHint;
+
+ SetLength(HKEYStrings, Length(HKEYStrings) + 2);
+ InitHKEYString(HKEYStrings[LastDefaultHKEYString + 1],
+ 'HKEY_WindowsMachine', 'HKWM');
+
+ InitHKEYString(HKEYStrings[LastDefaultHKEYString + 2],
+ 'HKEY_WindowsUser', 'HKWU');
+
+ Application.HintHidePause := -1; //that's approximately 136 years :D
+
+ StatusBar.Panels[0].Width := Screen.Width div 6;
+
+ MurphyMI.Visible := MurphyMode;
+
+{$IFDEF UNIKEY}
+ UniPluginOD.InitialDir := MyDir;
+{$ELSE}
+ UniKeyDemoMI.Visible := False;
+{$ENDIF}
+end;
+
+procedure TMainWin.GotoKey(Key: string);
+var
+ Full: TregPath;
+ Node: TTreeNode;
+ keySA: TStrA;
+ i: integer;
+
+ function NodeOfRoot(Root: string): TTreeNode;
+ var
+ i: Integer;
+ begin
+ Result := nil;
+ Root := LongHKEY(Root);
+
+ for i := 0 to RootNodes.Count-1 do
+ if SameText(TTreeNode(RootNodes[i]).Text, Root) then begin
+ Result := TTreeNode(RootNodes[i]);
+ Break; end;
+
+ for i := 0 to High(Shortcuts) do
+ if SameText(Shortcuts[i].Alias, Full.Root) then begin
+ Result := Shortcuts[i].Node;
+ Break; end;
+ end;
+
+begin
+ keySA := nil;
+
+ //Get FullPath of the Key
+ Key := TrimLeft(Key);
+ if TextAtPos(Key, 1, 'Reg:') then
+ Key := TrimLeft(FromChar(Key, ':'));
+ Key := UnQuote(Key);
+
+ Full := RegPathOfStr(Key);
+ if Trim(Full.Root) = '' then begin
+ AddHint('Empty Path.', True);
+ Exit; end;
+
+ //Get Root Node
+ Node := NodeOfRoot(Full.Root);
+ if not Assigned(Node) then begin
+ if not PathE.Focused then
+ AddHint('Key not found:' + EOL + Key);
+ Exit; end;
+
+ //Create an array of all SubKeys
+ keySA := Split(Full.Key, '\');
+
+ //Avoid SmartExpand
+ TreeWin.DoSmartExpand := False; begin
+
+ //Open all SubKeys
+ for i := 0 to High(keySA) do begin
+ //Open the Node if neccessary
+ if not Node.Expanded then begin
+ if not Node.Selected then
+ RegTV.Selected := Node;
+ CheckNode(Node, False);
+ //TreeWin.RegTVChange(Self, Node);
+ Node.Expand(False);
+ end;
+
+ //Get Node of the SubKey
+ Node := FindNodeText(Node, keySA[i]);
+ if not Assigned(Node) then begin
+ if not PathE.Focused then
+ AddHint('Goto Key not found: ' + KeySA[i], True);
+ Exit;
+ end;
+ end;
+
+ end; TreeWin.DoSmartExpand := True;
+
+ if Node <> RegTV.Selected then begin
+ RegTV.Selected := Node;
+ TreeWin.RegTVChange(Self, Node);
+ end;
+
+ Application.ProcessMessages;
+
+ if Full.ValueSet then
+ ValuesWin.FocusItem(Full.Value, not (Active and PathE.Focused))
+ else begin
+ if not (Active and PathE.Focused) then //if not user is currently editing the path
+ TreeWin.FocusControl(RegTV);
+
+ if LastChar(Full.Key) = '\' then
+ Node.Expand(False);
+ end;
+end;
+
+procedure SwapFonts(Sender: TWinControl);
+
+ function OtherFont(N: TFontName): TFontName;
+ begin
+ Result := 'Courier New';
+ if N = Result then
+ Result := 'Arial';
+ end;
+
+begin
+ TEdit(Sender).Font.Name := OtherFont(TTreeView(Sender).Font.Name);
+end;
+
+procedure ActivateThis(Sender: TObject);
+begin
+ if not Assigned(Sender) then
+ Exit;
+
+ with TEdit(Sender) do begin
+ if Tag <> EditControlFlag then
+ Exit;
+ Color := RealColor(clVeryBrightBlue);
+ Font.Color := clBlack;
+ end;
+end;
+
+procedure DeActivateThis(Sender: TObject);
+begin
+ if not Assigned(Sender) then
+ Exit;
+
+ with TEdit(Sender) do begin
+ if Tag <> EditControlFlag then
+ Exit;
+ Color := RealColor(clDarkGray);
+ Font.Color := clWhite;
+ end;
+end;
+
+procedure CreateSisyThreads;
+var
+ i: Integer;
+
+ procedure CreateSisyThread(const Name: string; const KeyName: string;
+ Key: HKEY; StatusLabel: TLabel);
+ var
+ Sisy: TSisyThread;
+ begin
+ ChangeLastHint('Creating ' + Name + '...');
+ Sisy := TSisyThread.CreateIt(Name, KeyName, Key, StatusLabel, PlutoKey);
+ Sisy.OnChange := MainWin.OnSisyChange;
+// Sisy.OnSpecialChange[cValuePlus] := MainWin.OnSisyValuePlus;
+// Sisy.OnSpecialChange[cValueMinus] := MainWin.OnSisyValueMinus;
+// Sisy.OnSpecialChange[cContextChange] := MainWin.OnSisyContextChange;
+ Sisys.Add(Sisy);
+ AddToLastHint('OK');
+ end;
+
+begin
+ AddHint('Starting Sisyphus ' + SisyVersion + '...');
+
+ Sisys := TSisyList.Create;
+ WorkWin.LoadSisyFilter;
+
+ CreateSisyThread('Sisy HKU', 'HKU', HKU, WorkWin.SisyHKUL);
+ CreateSisyThread('Sisy HKLM', 'HKLM', HKLM, WorkWin.SisyHKLML);
+
+ ChangeLastHint('Initializing Sisyphus...');
+ for i := 0 to Sisys.Count-1 do
+ with TSisyThread(Sisys[i]) do begin
+ if Name = 'Sisy HKU' then
+ with WorkWin.SisyHKUCB do begin
+ Settings.KeyName := StrOfUni(Uni.Path);
+ Settings.Load;
+ Settings.AutoSave := True;
+ if Checked then
+ Resume;
+ end
+ else if Name = 'Sisy HKLM' then
+ with WorkWin.SisyHKLMCB do begin
+ Settings.KeyName := StrOfUni(Uni.Path);
+ Settings.Load;
+ Settings.AutoSave := True;
+ if Checked then
+ Resume;
+ end;
+ OnStarted := MainWin.SisyStarted;
+ end;
+end;
+
+procedure CreateSpyThread;
+begin
+ AddHint('Creating SpyThread...');
+ SpyThread := TRegSpyThread.CreateIt(tpLowest);
+ WorkWin.SpyDelayIEChange(MainWin);
+ WorkWin.SpyTestLClick(MainWin);
+ AddToLastHint('OK');
+end;
+
+procedure ShowParams;
+var
+ SL: TStringList;
+begin
+ if Switch('params?') then begin
+ SL := TStringList.Create;
+ GetParams(SL);
+ ShowMessage(SL.Text);
+ SL.Free;
+ end;
+end;
+
+procedure GotoParamKey;
+var
+ s: string;
+begin
+ s := ParamStr(1);
+ if (s <> '')
+ and (s[1] <> '-') then begin //Params have '-' as prefix
+ AddHint('Goto Key ' + Quote(s) + '...');
+ MainWin.GotoKey(s);
+ end else begin
+ RegTV.Selected := RegTV.TopItem;
+ end;
+end;
+
+procedure TMainWin.Load;
+begin
+ TreeWin.Load;
+ WorkWin.LoadBoolStr;
+
+ CreateSpyThread;
+ CreateSisyThreads;
+
+ AddHint(Greeting, True);
+
+ ShowParams;
+ GotoParamKey;
+
+ if Assigned(SplashWin) and SplashWin.Visible then
+ SplashWin.SetFocus;
+end;
+
+procedure TMainWin.CopyPathClick(Sender: TObject);
+begin
+ Clipboard.AsText := StatusBar.Panels[1].Text;
+end;
+
+procedure TMainWin.FormKeyDown(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+begin
+ if (ssAlt in shift) and (Key = VK_F4) then begin
+ Key := 0;
+ Close;
+ Exit; end;
+
+ if ssCtrl in Shift then
+ case Key of
+ Byte('W'): begin
+ MainPC.ActivePage := WorkWin.WorkPage;
+ if Assigned(MainPC.ActivePage) then
+ WorkWin.FocusControl(TWinControl(ShowPC.ActivePage.Tag))
+ end;
+
+ Byte('H'): MainPC.ActivePage := WorkWin.HintPage;
+
+ Byte('L'): MainWin.FindCLSID;
+ end;
+
+ if Shift = [] then
+ case Key of
+ VK_F6: TreeWin.FocusControl(RegTV);
+
+ VK_F7: with ValueList do begin
+ ValuesWin.FocusControl(ValueList);
+ if (Selected = nil) and (Items.Count > 0) then begin
+ Selected := Items[0];
+ ItemFocused := Selected;
+ end;
+ end;
+
+ VK_F8: WorkWin.FocusControl(MainPC);
+ end;
+
+ if Key = VK_SCROLL then begin
+ TreeWin.CheckRegTVHotTrack;
+ ValuesWin.CheckValueListHotTrack;
+ end;
+end;
+
+procedure TMainWin.StatusBarResize(Sender: TObject);
+begin
+ with StatusBar do
+ Panels[1].Width :=
+ Width - (Panels[0].Width + Panels[2].Width + Panels[3].Width);
+end;
+
+procedure TMainWin.StatusBarDblClick(Sender: TObject);
+begin
+ ShowRealPathMIClick(Sender);
+end;
+
+procedure TMainWin.InsertPathClick(Sender: TObject);
+begin
+ GotoKey(Clipboard.AsText);
+end;
+
+procedure TMainWin.SetStatus;
+begin
+ StatusBarUpdate;
+end;
+
+procedure TMainWin.StatusBarUpdate;
+var
+ Inf: TRegKeyInfo;
+begin
+ OpenCurKey;
+ MainReg.GetKeyInfo(Inf);
+ MainReg.CloseKey;
+
+ StatusBar.Panels[2].Text := StrNumerus(Inf.NumSubKeys, 'key', 'keys', 'no');
+ StatusBar.Panels[3].Text := StrNumerus(Inf.NumValues, 'value', 'values', 'no');
+
+ if ShowRealPathMI.Checked then
+ StatusBar.Panels[1].Text := StrOfRegPath(CurKey(uhShortcuts))
+ else
+ StatusBar.Panels[1].Text := StrOfRegPath(CurKey(uhNonSystemShortcuts));
+
+ if not PathE.Focused then
+ PathE.Text := StrOfRegPath(CurKey);
+end;
+
+procedure TMainWin.ShowRealPathMIClick(Sender: TObject);
+begin
+ ShowRealPathMI.Checked := not ShowRealPathMI.Checked;
+ StatusBarUpdate;
+end;
+
+procedure TMainWin.PathEKeyDown(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+var
+ Pos: Integer;
+ s: string;
+begin
+ DoAutoComplete := not (Key in [VK_DELETE, VK_BACK, VK_ESCAPE]);
+
+ case Key of
+ VK_BACK:
+ begin
+ s := PathE.Text;
+ Pos := PathE.SelStart;
+
+ if ssCtrl in Shift then
+ repeat
+ Dec(Pos);
+ until (Pos < 1) or (s[Pos] = '\')
+ else if PathE.SelLength = 0 then
+ Exit;
+
+ PathE.Text := Copy(s, 1, Pos);
+ PathE.SelStart := Length(s);
+ Key := 0;
+ UserGotoKey;
+ end;
+
+ VK_ESCAPE:
+ with PathE do begin
+ if SelLength = 0 then
+ Exit;
+ Text := StrOfRegPath(CurKey);
+ SelStart := Length(Text);
+ end;
+
+ VK_RETURN: begin
+ if CurKey.ValueSet then
+ ValuesWin.ValueListDblClick(Self);
+ Key := 0;
+ end;
+
+ VK_RIGHT: begin
+ if not (ssCtrl in Shift) then
+ Exit;
+
+ Key := 0;
+
+ s := PathE.Text;
+ Pos := PathE.SelStart + 1;
+ repeat
+ Inc(Pos);
+ until (Pos > Length(s)) or (s[Pos] = '\');
+
+ PathE.SelStart := Pos - 1;
+ end;
+
+ VK_LEFT: begin
+ if not (ssCtrl in Shift) then
+ Exit;
+
+ with PathE do begin
+ Key := 0;
+
+ s := Text;
+ Pos := SelStart;
+ repeat
+ Dec(Pos);
+ until (Pos < 1) or (s[Pos] = '\');
+
+ if Pos < 1 then
+ Pos := 1;
+
+ SelStart := Pos - 1;
+ end;
+ end;
+ end;
+end;
+
+procedure TMainWin.UserGotoKey;
+begin
+ GotoKey(PathE.Text);
+end;
+
+procedure TMainWin.PathEChange(Sender: TObject);
+var
+ Prefix, Suffix, Key, Path, Root: string;
+ i, p, Len: Integer;
+ SL: TStringList;
+ CompleteKind: (ckRoots, ckKeys, ckValues);
+
+ procedure GetRootNames(Strings: TStrings);
+ var
+ Node: TTreeNode;
+ begin
+ SL.Clear;
+ Node := RegTV.Items.GetFirstNode;
+ while Assigned(Node) do begin
+ SL.Add(Node.Text);
+ Node := Node.GetNextSibling;
+ end;
+ end;
+
+begin
+ if not DoAutoComplete then
+ Exit;
+
+ Key := PathE.Text;
+ Root := TraceKey(ExRegRoot(Key));
+
+ if not CharIn(Key, '\') then
+ CompleteKind := ckRoots
+ else if ExRegValueSet(Key) then
+ CompleteKind := ckValues
+ else
+ CompleteKind := ckKeys;
+
+ case CompleteKind of
+ ckRoots: begin
+ Prefix := '';
+ Suffix := Key;
+ end;
+
+ ckKeys: begin
+ Path := ExRegFullKey(Key);
+ Prefix := UntilLastChar(Path, '\');
+ Suffix := FromLastChar(Path, '\');
+ end;
+
+ ckValues: begin
+ p := Pos('\\', Key);
+ Prefix := Copy(Key, 1, p - 1);
+ Suffix := Copy(Key, p + 2, Length(Key) - p - 1);
+ end;
+
+ else
+ end;
+
+ SL := TStringList.Create;
+
+ if CompleteKind in [ckKeys, ckValues] then
+ with MainReg do begin
+ RootKey := HKEYOfStr(ExRegRoot(Root));
+ OpenKey(ExRegKey(Root));
+ OpenKey(ExRegKey(Prefix));
+
+ if CompleteKind = ckValues then begin
+ if not HasValues then
+ Exit;
+ GetValueNames(SL);
+ end else if CompleteKind = ckKeys then begin
+ if not HasSubKeys then
+ Exit;
+ GetKeyNames(SL);
+ end;
+
+ CloseKey;
+ end
+ else begin
+ GetRootNames(SL);
+ end;
+
+ if Suffix = '' then begin
+ if (SL.Count > 0) and not StrIn(SL, '') then
+ Suffix := SL[0];
+ end else begin
+ for i := 0 to SL.Count-1 do
+ if TextAtBegin(SL[i], Suffix) then begin
+ Suffix := SL[i];
+ Break; end;
+ end;
+
+ Len := Length(PathE.Text);
+
+ if CompleteKind = ckValues then
+ Prefix := Prefix + '\\'
+ else if CompleteKind = ckKeys then
+ Prefix := Prefix + '\';
+
+ with PathE do begin
+ DoAutoComplete := False; //Avoid Recursion
+ Text := Prefix + Suffix;
+ DoAutoComplete := True;
+
+ SelStart := Len;
+ SelLength := Length(Text) - Len;
+ end;
+
+ SL.Free;
+end;
+
+procedure TMainWin.PathEExit(Sender: TObject);
+begin
+ DeActivateThis(PathE);
+ DoAutoComplete := False;
+end;
+
+procedure ArrangePlutoStyle;
+begin
+ with ValuesWin do begin
+ Height := MainWin.ClientHeight div 3;
+ Top := MainWin.ClientHeight - Height - 43;
+ Left := 0;
+ Width := MainWin.ClientWidth - 4;
+ //Align := alBottom;
+ end;
+
+ with WorkWin do begin
+ Top := 0;
+ Width := Max(MainWin.ClientWidth div 3, WorkWin.Constraints.MinWidth);
+ Left := ValuesWin.Width - Width;
+ Height := MainWin.ClientHeight - 43 - ValuesWin.Height;
+ //Align := alRight;
+ end;
+
+ with TreeWin do begin
+ Top := 0;
+ Height := WorkWin.Height;
+ Left := 0;
+ Width := ValuesWin.Width - WorkWin.Width;
+ end;
+
+ {TreeWin.Align := alNone;
+ WorkWin.Align := alNone;
+ ValuesWin.Align := alNone;}
+end;
+
+procedure ArrangeFreeStyle;
+const
+ Space = 10;
+begin
+ with ValuesWin do begin
+ Height := Screen.Height div 3;
+ Align := alBottom;
+ end;
+
+ with WorkWin do begin
+ Width := Max(Screen.WorkAreaWidth div 3, Constraints.MinWidth + 2 * Space);
+ Align := alRight;
+ end;
+
+ with TreeWin do begin
+ Align := alClient;
+ end;
+
+ TreeWin.Align := alNone;
+ WorkWin.Align := alNone;
+ ValuesWin.Align := alNone;
+
+ with ValuesWin do begin
+ Height := Height - 2 * Space;
+ Width := Width - 2 * Space;
+ Top := Top + Space;
+ Left := Left + Space;
+ end;
+
+ with TreeWin do begin
+ Height := Height - 1 * Space;
+ Width := Width - 1 * Space;
+ Top := Top + Space;
+ Left := Left + Space;
+ end;
+
+ with WorkWin do begin
+ Height := Height - 1 * Space;
+ Width := Width - 2 * Space;
+ Top := Top + Space;
+ Left := Left + Space;
+ end;
+end;
+
+procedure ArrangeBigValStyle;
+var
+ MinHeight: Integer;
+begin
+ MinHeight := WorkWin.Constraints.MinHeight +
+ MainWin.Constraints.MinHeight;
+
+ with ValuesWin do begin
+ Height := Screen.WorkAreaHeight - Max(Screen.Height div 3, MinHeight);
+ Align := alBottom;
+ end;
+
+ with WorkWin do begin
+ Width := Screen.WorkAreaWidth div 3;
+ Align := alRight;
+ end;
+
+ with TreeWin do begin
+ Align := alClient;
+ end;
+
+ TreeWin.Align := alNone;
+ WorkWin.Align := alNone;
+ ValuesWin.Align := alNone;
+end;
+
+procedure ArrangeRegEdStyle;
+begin
+ with TreeWin do begin
+ Width := Screen.WorkAreaWidth div 4;
+ Align := alLeft;
+ end;
+
+ with ValuesWin do begin
+ Align := alClient;
+ Align := alNone;
+ Height := Height - WorkWin.Constraints.MinHeight;
+ end;
+
+ with WorkWin do begin
+ Top := ValuesWin.Top + ValuesWin.Height;
+ Left := ValuesWin.Left;
+ Height := Constraints.MinHeight;
+ Width := ValuesWin.Width;
+ end;
+
+ TreeWin.Align := alNone;
+end;
+
+procedure TMainWin.PathEKeyUp(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+begin
+ if not (Key in [VK_DELETE, VK_BACK, VK_ESCAPE]) then
+ UserGotoKey;
+end;
+
+procedure TMainWin.ActivateIt(Sender: TObject);
+begin
+ ActivateThis(Sender);
+end;
+
+procedure TMainWin.FormActivate(Sender: TObject);
+begin
+ if Assigned(ActiveControl) and (ActiveControl.Tag = EditControlFlag) then
+ ActivateThis(ActiveControl);
+end;
+
+procedure TMainWin.FormDeactivate(Sender: TObject);
+begin
+ if Assigned(ActiveControl) and (ActiveControl.Tag = EditControlFlag) then
+ DeActivateThis(ActiveControl);
+end;
+
+procedure TMainWin.Pluto1Click(Sender: TObject);
+begin
+ ArrangePlutoStyle;
+end;
+
+procedure TMainWin.RegEdit1Click(Sender: TObject);
+begin
+ ArrangeRegEdStyle;
+end;
+
+procedure TMainWin.Free1Click(Sender: TObject);
+begin
+ ArrangeFreeStyle;
+end;
+
+procedure TMainWin.BigVal1Click(Sender: TObject);
+begin
+ ArrangeBigValStyle;
+end;
+
+procedure TMainWin.SplashScreen1Click(Sender: TObject);
+begin
+ SplashWin.Show;
+end;
+
+procedure TMainWin.HistoryClick(Sender: TObject);
+begin
+ NotePad(PlutoDir + 'version.txt');
+end;
+
+procedure TMainWin.WebLinkMIClick(Sender: TObject);
+begin
+ Browse('http://' + TMenuItem(Sender).Caption);
+end;
+
+procedure TMainWin.SupportMIClick(Sender: TObject);
+begin
+ Browse('http://cYcnus.de/php/phpbb/viewforum.php?f=1');
+end;
+
+procedure TMainWin.Credits1Click(Sender: TObject);
+var
+ FileName: string;
+begin
+ FileName := PlutoDir + 'credits deluxe.htm';
+ if FileExists(FileName) then
+ ExecFile(FileName)
+ else begin
+ FileName := PlutoDir + 'credits.htm';
+ if FileExists(FileName) then
+ ExecFile(FileName);
+ end;
+end;
+
+function GetCLSIDFromClipboard: string;
+var
+ CLSID: string;
+begin
+ CLSID := BetweenChars(Clipboard.AsText, '{', '}', True);
+ if CLSID = '' then begin
+ Result := Clipboard.AsText;
+ InputQuery('No CLSID in Clipboard.',
+ 'Use following format:' + EOL +
+ '{00000000-0000-0000-0000-000000000000}', Result);
+ Exit; end else
+ Result := CLSID;
+end;
+
+procedure TMainWin.FindCLSID;
+var
+ CLSID, Desc: string;
+begin
+ CLSID := GetCLSIDFromClipboard;
+ Desc := RegNameOfCLSID(CLSID);
+ if Desc <> '' then
+ InputQuery('Your CLSID is...', CLSID, Desc)
+ else
+ ShowMessage('CLSID not found: ' + CLSID + '.');
+end;
+
+procedure TMainWin.GotoCLSID;
+var
+ CLSID, Desc: string;
+begin
+ CLSID := GetCLSIDFromClipboard;
+ Desc := RegNameOfCLSID(CLSID);
+ if Desc <> '' then begin
+ GotoKey('HKCR\CLSID\' + CLSID);
+ TreeWin.FocusControl(RegTV);
+ end else
+ ShowMessage('CLSID not found: ' + CLSID + '.');
+end;
+
+function TMainWin.Greeting(Name: string = NoPreBlinkHint): string;
+const
+ Alias: array[0..4] of string =
+ ('Licenser', 'Murphy', 'Sleeper', 'Leon', 'Great Admin');
+ RealNames: array[0..4] of string =
+ ('Heinz', 'Korny', 'Sven', 'Simon', 'Korny ;-)');
+var
+ i: Integer;
+ s: string;
+begin
+ if Name = NoPreBlinkHint then
+ Name := PrefWin.UserNameE.Text;
+
+ if Trim(Name) = '' then
+ s := 'No name?'
+ else if SameText(Trim(Name), 'Pluto-User') then
+ s := 'Hi!'
+ else
+ for i := 0 to 4 do
+ if SameText(Name, Alias[i]) then begin
+ s := 'Hi ' + RealNames[i] + '! This is a cYcnus.EasterEgg';
+ Break; end
+ else if Length(Name) > 20 then
+ s := 'Hi ' + Name +
+ '. What a name.'
+ else
+ s := 'Hi ' + Name + '!';
+
+ Result := s;
+end;
+
+procedure TMainWin.PrefMIClick(Sender: TObject);
+begin
+ PrefWin.Show;
+end;
+
+function TempDir: string;
+begin
+ Result := PlutoDir + 'temp\';
+ if not (DirectoryExists(Result) or CreateDir(Result)) then
+ Result := PlutoDir;
+end;
+
+function PlutoIniFileName: string;
+
+ function Default: string;
+ begin
+ Result := MyDir + 'pluto.ini';
+ end;
+
+begin
+ Result := SavedPlutoIniFileName;
+ if Result <> '' then
+ Exit;
+
+// Result := Params.ReadString('ini', '');
+
+ if IsValidFileName(Result) then
+ Result := PlutoDir + Result
+ else
+ Result := Default;
+
+ SavedPlutoIniFileName := Result; //Faster in future calls
+end;
+
+function PlutoUniPath: string;
+begin
+ //Result := 'Reg: HKCU\Software\Pluto\';
+ Result := 'Ini <' + PlutoIniFileName + '>:';
+end;
+
+procedure TMainWin.EditBoolStrMIClick(Sender: TObject);
+begin
+ NotePad(PlutoDir + BoolStrFileName);
+ ShowMessage('Click OK when you finished editing.' + EOL +
+ '(Pluto will reload the Boolean Strings.)');
+ WorkWin.LoadBoolStr;
+end;
+
+procedure TMainWin.SisyStarted(Sender: TObject);
+{var
+ NextSisyIndex: Integer;
+ NextSisy: TSisyThread; }
+begin
+ {NextSisy := nil;
+
+ with TSisyThread(Sender) do begin
+ //AddHint(Format('%s started after %0.1f seconds', [Name, SecsPerRound]), True);
+
+ with Sisys do begin
+ NextSisyIndex := IndexOf(Sender) + 1;
+ if NextSisyIndex < Count then
+ NextSisy := Items[NextSisyIndex];
+ end;
+
+ if Assigned(NextSisy) then
+ with NextSisy do
+ if not Started and Suspended then
+ Resume;
+ end; }
+end;
+
+procedure TMainWin.SisyTerminate(Sender: TObject);
+begin
+ if Assigned(Sisys) then
+ Sisys.Delete(Sisys.IndexOf(Sender));
+ AddHint('Sisyphus ' + Quote(TSisyThread(Sender).Name) + ' destroyed.');
+end;
+
+procedure TMainWin.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
+var
+ i: Integer;
+
+ procedure TerminateThread(Thread: TThread; Name: string);
+ const
+ ThreadTimeOut = 3000;
+ begin
+ if Assigned(Thread) then
+ with Thread do begin
+ Priority := tpNormal;
+ Terminate;
+ while Suspended do Resume; // ensure running
+ if 0 <> WaitForSingleObject(Handle, ThreadTimeOut) then begin
+ ShowMessage('Timeout: Killing Thread: ' + Name + EOL +
+ 'This is a critical error and may cause memory leaks and crashes.' + EOL +
+ 'We recommend to reboot your system before you continue.');
+ Windows.TerminateThread(Handle, 0);
+ end else
+ Thread.Free;
+ end;
+ end;
+
+begin
+ CanClose := False;
+
+ try
+ AddHint('Stopping SisyphusThreads...');
+ if Assigned(Sisys) then
+ for i := 0 to Sisys.Count-1 do
+ TSisyThread(Sisys[i]).Suspend;
+ AddToLastHint('OK');
+
+ AddHint('Wait for SpyThread...');
+ TerminateThread(SpyThread, 'SpyThread');
+ AddToLastHint('OK');
+
+ AddHint('Wait for SisyphusThreads...');
+ if Assigned(Sisys) then
+ for i := 0 to Sisys.Count-1 do begin
+ ChangeLastHint('Wait for SisyphusThreads...' + TSisyThread(Sisys[i]).Name);
+ TerminateThread(TSisyThread(Sisys[i]), TSisyThread(Sisys[i]).Name);
+ end;
+ ChangeLastHint('Wait for SisyphusThreads...OK');
+ except
+ with WorkWin.HintLB.Items do
+ ShowMessage('Error while trying to terminate threads.' + EOL +
+ 'Last Message:' + EOL +
+ Strings[Count - 1]);
+ CanClose := True;
+ end;
+
+ AddHint('Terminating successfull.');
+ CanClose := True;
+end;
+
+procedure TMainWin.FormClose(Sender: TObject; var Action: TCloseAction);
+
+ procedure TryClose(Win: TCustomForm);
+ begin
+ if Assigned(Win) and Win.Visible then
+ Win.Close;
+ end;
+
+begin
+ MainReg.Free;
+
+ Action := caFree;
+
+ if DontSavePrefs then
+ Exit;
+
+ AddHint('Saving settings...');
+
+ try
+ TryClose(WorkWin);
+ TryClose(ValuesWin);
+ TryClose(TreeWin);
+ TryClose(FindWin);
+ TryClose(SplashWin);
+ TryClose(PrefWin);
+ except
+ DontSavePrefs := True; //try again without pref saving
+ end;
+
+ with PlutoKey.GetKey('Window') do
+ try
+ WriteBool('Maximized', WindowState = wsMaximized);
+ if WindowState = wsNormal then begin
+ WriteInteger('Left', Left);
+ WriteInteger('Top', Top);
+ WriteInteger('Width', Width);
+ WriteInteger('Height', Height);
+ end;
+ finally
+ Free;
+ end;
+end;
+
+procedure TMainWin.Plutoini1Click(Sender: TObject);
+begin
+ NotePad(PlutoIniFileName);
+ ShowMessage('Click OK when you finished editing.' + EOL +
+ '(Pluto will reload ' + PlutoIniFileName + ')');
+ PrefWin.PrefHost.Load;
+end;
+
+procedure TMainWin.RegEdit2Click(Sender: TObject);
+begin
+ RegEdit;
+end;
+
+procedure TMainWin.SysEdit1Click(Sender: TObject);
+begin
+ SysEdit;
+end;
+
+procedure TMainWin.NotePad1Click(Sender: TObject);
+begin
+ NotePad;
+end;
+
+procedure TMainWin.WordPad1Click(Sender: TObject);
+begin
+ WordPad;
+end;
+
+procedure TMainWin.OpenWinDir1Click(Sender: TObject);
+begin
+ ExploreFolder(WinDir);
+end;
+
+procedure TMainWin.OpenProgramFolder1Click(Sender: TObject);
+begin
+ ExploreFolder(MyDir);
+end;
+
+procedure TMainWin.ExitPluto1Click(Sender: TObject);
+begin
+ Close;
+end;
+
+procedure TMainWin.Find1Click(Sender: TObject);
+begin
+ FindWin.SfRootKeyRB.Checked := True;
+ FindWin.Show;
+end;
+
+procedure TMainWin.FormPaint(Sender: TObject);
+begin
+ if Started and not MainWinLoaded then begin
+ MainWinLoaded := True;
+ Load;
+ end;
+end;
+
+procedure TMainWin.StatusBarDrawPanel(StatusBar: TStatusBar;
+ Panel: TStatusPanel; const Rect: TRect);
+begin
+ with StatusBar.Canvas do begin
+ Brush.Color := clBlack;
+ FillRect(Rect);
+ with Font do begin
+ Name := 'MS Sans Serif';
+ Style := [];
+ case Panel.Index of
+ 0: if HintBlinkT.Enabled then
+ Color := clBrightRed
+ else
+ Color := clBrightSilver;
+ 1: Color := clWhite;
+ 2: Color := clCyan;
+ 3: Color := clBrightPurple;
+ end;
+ end;
+
+ if Panel.Alignment = taRightJustify then
+ TextOut(Rect.Right - TextWidth(Panel.Text), Rect.Top, Panel.Text)
+ else
+ TextOut(Rect.Left, Rect.Top, Panel.Text);
+ end;
+end;
+
+procedure TMainWin.PathEKeyPress(Sender: TObject; var Key: Char);
+begin
+ if Key = #127 then //Silly key management
+ Key := #0;
+end;
+
+procedure TMainWin.HintBlinkTTimer(Sender: TObject);
+begin
+ StatusBar.Panels[0].Text := 'Ready';
+ StopHintBlinking;
+end;
+
+procedure TMainWin.StopHintBlinking;
+begin
+ HintBlinkT.Enabled := False;
+ PreBlinkHint := NoPreBlinkHint;
+end;
+
+procedure TMainWin.FindCLSID1Click(Sender: TObject);
+begin
+ FindCLSID;
+end;
+
+procedure TMainWin.GotoCLSID1Click(Sender: TObject);
+begin
+ GotoCLSID;
+end;
+
+procedure TMainWin.CommandLineParameters1Click(Sender: TObject);
+begin
+ NotePad(PlutoDir + 'Params.txt');
+end;
+
+procedure TMainWin.DeleteTempFolder1Click(Sender: TObject);
+begin
+ if mrYes = MessageDlg('Deleting ' + Quote(TempDir + '*.*' + EOL, '"') +
+ 'Are you sure?', mtConfirmation, [mbYes, mbCancel], 0) then
+ DeleteFiles(TempDir + '*.*', False);
+end;
+
+procedure TMainWin.CurrentDir1Click(Sender: TObject);
+begin
+ ShowMessage('MyDir: ' + MyDir + EOL +
+ 'PlutoDir: ' + PlutoDir + EOL +
+ 'CurrentDir: ' + GetCurrentDir + EOL +
+ 'Params: ' + EOL +
+ GetParams(EOL));
+end;
+
+procedure TMainWin.RepairPluto155bBug1Click(Sender: TObject);
+var
+ Msg: string;
+ Reg: TXRegistry;
+begin
+ Reg := TXRegistry.Create;
+
+ try
+ Reg.RootKey := HKCU;
+ Reg.OpenKey('Software');
+ Msg := '';
+ if Reg.KeyExists('Sisyphus') then
+ Msg := Msg + 'HKCU\Software\Sisyphus' + EOL;
+ if Reg.KeyExists('Main') then
+ Msg := Msg + 'HKCU\Software\Main' + EOL;
+ if Reg.KeyExists('Spy') then
+ Msg := Msg + 'HKCU\Software\Spy' + EOL;
+ if Reg.KeyExists('View') then
+ Msg := Msg + 'HKCU\Software\View' + EOL;
+ if Msg = '' then begin
+ ShowMessage('No bug detected :-)');
+ end else begin
+ Msg :=
+ 'Hi folks!' + EOL +
+ 'We are very sorry: A bug in Pluto made some components in the Edit' + EOL +
+ 'window save their values to the regsitry instead of the ini file.' + EOL +
+ 'If you want to repair that, you have to delete the following keys:' + EOL +
+ EOL +
+ Msg +
+ EOL +
+ 'This is not dangerous at all, but if you are interested in having' + EOL +
+ 'a clean registry, you should delete this useless keys.' + EOL +
+ EOL +
+ 'You surely noticed that this key names are rubish because they are' + EOL +
+ 'in the level that is normally used by programs.' + EOL +
+ 'If you have programs installed that use this keys for their' + EOL +
+ 'preferences, you may get problems when deleting the keys!' + EOL +
+ EOL +
+ 'So, now you have to decide what to do:' + EOL +
+ EOL +
+ 'Yes: Delete the keys. You have to confirm the deleting of each key.' + EOL +
+ 'No: Jump to the Software key and delete manually.' + EOL +
+ 'Cancel: Do nothing.' + EOL +
+ 'Yes to All: Delete all keys.';
+
+ case MessageDlg(Msg, mtWarning, [mbYes, mbNo, mbYesToAll, mbCancel], 0) of
+ mrYes: begin
+ if Reg.KeyExists('Main')
+ and (mrYes=MessageDlg('Delete HKU\Software\Main ?',
+ mtWarning, [mbYes, mbNo], 0)) then
+ Reg.DeleteKey('Main');
+
+ if Reg.KeyExists('Sisyphus')
+ and (mrYes=MessageDlg('Delete HKU\Software\Sisyphus ?',
+ mtWarning, [mbYes, mbNo], 0)) then
+ Reg.DeleteKey('Sisyphus');
+
+ if Reg.KeyExists('Spy')
+ and (mrYes=MessageDlg('Delete HKU\Software\Spy ?',
+ mtWarning, [mbYes, mbNo], 0)) then
+ Reg.DeleteKey('Spy');
+
+ if Reg.KeyExists('View')
+ and (mrYes=MessageDlg('Delete HKU\Software\View ?',
+ mtWarning, [mbYes, mbNo], 0)) then
+ Reg.DeleteKey('View');
+ end;
+
+ mrYesToAll: begin
+ Reg.DeleteKey('Main');
+ Reg.DeleteKey('Sisyphus');
+ Reg.DeleteKey('Spy');
+ Reg.DeleteKey('View');
+ end;
+
+ mrNo: begin
+ TreeWin.SetFocus;
+ GotoKey('HKCU\Software\');
+ end;
+ end;
+ end;
+
+ finally
+ Reg.Free;
+ end;
+end;
+
+procedure TMainWin.BackupRegistryscanreg1Click(Sender: TObject);
+begin
+ ExecFile('scanreg');
+end;
+
+procedure TMainWin.Username1Click(Sender: TObject);
+begin
+ ShowMessage(UserName);
+end;
+
+procedure TMainWin.ToDoMIClick(Sender: TObject);
+begin
+ NotePad(PlutoDir + 'ToDo.txt');
+end;
+
+procedure TMainWin.MailLinkMIClick(Sender: TObject);
+begin
+ MailTo(TMenuItem(Sender).Caption);
+end;
+
+procedure TMainWin.IjustwantCONTACT1Click(Sender: TObject);
+begin
+ MailTo('pluto@cYcnus.de');
+end;
+
+procedure TMainWin.ExternalHexEditMIClick(Sender: TObject);
+begin
+ ExecFile(PrefWin.ExternalHexEditE.Text);
+end;
+
+procedure TMainWin.AnotherPluto1Click(Sender: TObject);
+begin
+ ExecFile(Application.ExeName);
+end;
+
+procedure TMainWin.Path1Click(Sender: TObject);
+begin
+{$IFDEF UNIKEY}
+ UserUniPath := InputBox('UniKey', 'Input an UniPath.' + EOL +
+ EOL +
+ 'No idea? Try one of these: ' + EOL +
+ 'WinAmpVisColor <viscolor.txt>:' + EOL +
+ 'Params:' + EOL +
+ 'Reg: HKCU' + EOL +
+ 'Ini <' + MyDir + 'pluto.ini>:' + EOL +
+ 'Ini <' + MyDir + 'pluto.ini>:[View]' + EOL,
+ UserUniPath);
+{$ENDIF}
+end;
+
+procedure TMainWin.RegisterPlugIns1Click(Sender: TObject);
+begin
+{$IFDEF UNIKEY}
+ if UniPluginOD.Execute then
+ RegisterUniClass(UniPluginOD.FileName);
+{$ENDIF}
+end;
+
+procedure TMainWin.FormResize(Sender: TObject);
+begin
+ ArrangeIcons;
+ ArrangePlutoStyle;
+ WorkWin.WindowState := wsNormal;
+ ValuesWin.WindowState := wsNormal;
+ TreeWin.WindowState := wsNormal;
+end;
+
+procedure TMainWin.SwapLM_CUBClick(Sender: TObject);
+var
+ Path: string;
+begin
+ Path := TraceKey(PathE.Text, uhShortcuts);
+ if SwapHKU_HKLM(Path) then begin
+ PathE.Text := Path;
+ UserGotoKey;
+ end;
+end;
+
+procedure TMainWin.ShowLoadreport1Click(Sender: TObject);
+begin
+ NotePad(MyDir + 'loadreport.txt');
+end;
+
+procedure TMainWin.KillPluto1Click(Sender: TObject);
+begin
+ Application.Terminate;
+end;
+
+procedure TMainWin.ShowPlatform1Click(Sender: TObject);
+begin
+ ShowMessage(Format('Platform: %s' + EOL +
+ 'Versin: %d.%d Build %d',
+ [PlatformStrings[Win32Platform],
+ Win32MajorVersion, Win32MinorVersion, Win32BuildNumber]));
+end;
+
+procedure TMainWin.MSConfig1Click(Sender: TObject);
+begin
+ ExecFile('msconfig');
+end;
+
+procedure TMainWin.TimetoRelaxMIClick(Sender: TObject);
+var
+ RelaxFile: string;
+begin
+ with PlutoKey.GetKey('Main') do
+ try
+ RelaxFile := ReadString('Relax');
+ finally
+ Free;
+ end;
+
+ if RelaxFile = '' then
+ ShowMessage('This menu item can be used for something that lets you relax,' + EOL +
+ 'for example Diablo2, you favorite song or the latest news about the' + EOL +
+ 'decreasing AOL member numbers.' + EOL +
+ EOL +
+ 'Feel free to use everything you want.' + EOL +
+ 'Open the pluto.ini (CTRL+I) and add a new value "Relax" in the "Main"' + EOL +
+ 'section.' + EOL +
+ EOL +
+ 'And don''t forget:' + EOL +
+ 'R E L A X ! ! !')
+ else
+ ExecFile(RelaxFile);
+end;
+
+procedure TMainWin.OnSisyChange(Sender: TSisyThread; Change: TSisyChange);
+
+ procedure UpdateValue;
+ var
+ Reg: TXRegistry;
+ Index: Integer;
+ begin
+ if not SameRegPath(ExRegFullKey(Change.Path), PathOfNode(RegTV.Selected)) then
+ Exit;
+
+ Reg := TXRegistry.Create;
+ try
+ Reg.RootKey := HKEYOfStr(ExRegRoot(Change.Path));
+ if Reg.OpenKey(ExRegKey(Change.Path)) then
+ with ValuesWin do begin
+ Index := FindItemByRealName(ExRegValue(Change.Path));
+ if Index > -1 then begin
+ if Change.Typ = cValueMinus then
+ ValueList.Items.Delete(Index)
+ else if Change.Typ = cContextChange then
+ UpdateValue(Reg, ValueList.Items[Index]);
+ end else if Change.Typ = cValuePlus then
+ AddValue(Reg, ExRegValue(Change.Path));
+ end;
+ finally
+ Reg.Free;
+ end;
+ end;
+
+begin
+ AddHint(Sender.Name + ' notified ' + Change.Path);
+ if Change.Typ in [cValueMinus, cValuePlus, cContextChange] then
+ UpdateValue;
+end;
+
+procedure TMainWin.OnSisyValuePlus(Sender: TSisyThread; Change: TSisyChange);
+var
+ Reg: TXRegistry;
+begin
+ if not SameRegPath(ExRegFullKey(Change.Path), PathOfNode(RegTV.Selected)) then
+ Exit;
+
+ Reg := TXRegistry.Create;
+ try
+ Reg.RootKey := HKEYOfStr(ExRegRoot(Change.Path));
+ if Reg.OpenKey(ExRegKey(Change.Path)) then
+ ValuesWin.AddValue(Reg, ExRegValue(Change.Path));
+ finally
+ Reg.Free;
+ end;
+end;
+
+procedure TMainWin.OnSisyValueMinus(Sender: TSisyThread; Change: TSisyChange);
+var
+ Reg: TXRegistry;
+ Index: Integer;
+begin
+ if not SameRegPath(ExRegFullKey(Change.Path), PathOfNode(RegTV.Selected)) then
+ Exit;
+
+ Reg := TXRegistry.Create;
+ try
+ Reg.RootKey := HKEYOfStr(ExRegRoot(Change.Path));
+ if Reg.OpenKey(ExRegKey(Change.Path)) then
+ with ValuesWin do begin
+ Index := FindItemByRealName(ExRegValue(Change.Path));
+ if Index > -1 then
+ ValueList.Items.Delete(Index);
+ end;
+ finally
+ Reg.Free;
+ end;
+end;
+
+procedure TMainWin.OnSisyContextChange(Sender: TSisyThread; Change: TSisyChange);
+var
+ Reg: TXRegistry;
+ Index: Integer;
+begin
+ if not SameRegPath(ExRegFullKey(Change.Path), PathOfNode(RegTV.Selected)) then
+ Exit;
+
+ Reg := TXRegistry.Create;
+ try
+ Reg.RootKey := HKEYOfStr(ExRegRoot(Change.Path));
+ if Reg.OpenKey(ExRegKey(Change.Path)) then
+ with ValuesWin do begin
+ Index := FindItemByRealName(ExRegValue(Change.Path));
+ if Index > -1 then
+ UpdateValue(Reg, ValueList.Items[Index]);
+ end;
+ finally
+ Reg.Free;
+ end;
+end;
+
+end.
+unit PrefU;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, ComCtrls, ExtCtrls, StdCtrls, PlutoConst, NewPanels, PrefTools,
+ YTools, YTypes, start, XReg, LinkLabel;
+
+type
+ TPrefWin = class(TForm)
+ PrefPC: TPageControl;
+ CommonPage: TTabSheet;
+ KeyPage: TTabSheet;
+ DataPage: TTabSheet;
+ KeysBP: TBorderPanel;
+ GroupBox3: TGroupBox;
+ MainPrevBP: TBorderPanel;
+ GroupBox4: TGroupBox;
+ BorderPanel6: TBorderPanel;
+ GroupBox6: TGroupBox;
+ SortKeysCB: TPrefCheckBox;
+ PrefHost: TPrefHost;
+ MainPreviewCB: TPrefCheckBox;
+ SplashScreenCB: TPrefCheckBox;
+ PrefValuesPC: TPageControl;
+ StringPage: TTabSheet;
+ MultiStringPage: TTabSheet;
+ IntPage: TTabSheet;
+ BinaryPage: TTabSheet;
+ BorderPanel8: TBorderPanel;
+ GroupBox8: TGroupBox;
+ ShowDwordAsHex: TPrefCheckBox;
+ BorderPanel7: TBorderPanel;
+ GroupBox7: TGroupBox;
+ CountZeroByteCB: TPrefCheckBox;
+ BorderPanel1: TBorderPanel;
+ GroupBox2: TGroupBox;
+ UseExtendedModelCB: TPrefCheckBox;
+ BorderPanel2: TBorderPanel;
+ GroupBox1: TGroupBox;
+ ShowAsBinaryCB: TPrefCheckBox;
+ ShowBinaryAsRG: TPrefRadioGroup;
+ Smart4BBCB: TPrefCheckBox;
+ DWordPreviewL: TLabel;
+ Label4: TLabel;
+ Label5: TLabel;
+ Label6: TLabel;
+ Label7: TLabel;
+ UserNameE: TPrefEdit;
+ Label8: TLabel;
+ MainPreviewE: TPrefEdit;
+ Label12: TLabel;
+ DefaultIconPreviewCB: TPrefCheckBox;
+ KeyInfoPreviewCB: TPrefCheckBox;
+ SelectExternalHexEditOD: TOpenDialog;
+ BorderPanel3: TBorderPanel;
+ GroupBox9: TGroupBox;
+ IntegrationPage: TTabSheet;
+ BorderPanel4: TBorderPanel;
+ GroupBox5: TGroupBox;
+ Label11: TLabel;
+ SelectExternalHexEditB: TButton;
+ RunExternalHexEditB: TButton;
+ ExternalHexEditE: TPrefEdit;
+ Label13: TLabel;
+ BorderPanel5: TBorderPanel;
+ GroupBox10: TGroupBox;
+ Label15: TLabel;
+ RegisterAppCB: TCheckBox;
+ Label3: TLabel;
+ Memo1: TMemo;
+ ExpandStringsRG: TPrefRadioGroup;
+ QuotersE: TPrefEdit;
+ Label1: TLabel;
+ StringPreviewL: TLabel;
+ ShowLineCountCB: TPrefCheckBox;
+ ShowTreeViewLinesCB: TPrefCheckBox;
+ ValuePage: TTabSheet;
+ BorderPanel10: TBorderPanel;
+ GroupBox12: TGroupBox;
+ ShowListViewGridCB: TPrefCheckBox;
+ Label9: TLabel;
+ DefaultValueNameE: TPrefEdit;
+ Label10: TLabel;
+ GotoPlutoKeyB: TButton;
+ ColorPanel2: TColorPanel;
+ LinkLabel1: TLinkLabel;
+ SmartExpandCB: TPrefCheckBox;
+ KeysSingleClickCB: TPrefCheckBox;
+ ValuesSingleClickCB: TPrefCheckBox;
+ ShowProgressCB: TPrefCheckBox;
+ ColorPanel1: TColorPanel;
+ Label2: TLabel;
+ ReloadB: TButton;
+ DefaultB: TButton;
+ SaveB: TButton;
+ procedure PrefPCDrawTab(Control: TCustomTabControl;
+ TabIndex: Integer; const Rect: TRect; Active: Boolean);
+ procedure PrefHostLoaded(Sender: TObject);
+ procedure StandardPreviewChange(Sender: TObject);
+ procedure DataPreviewChange(Sender: TObject);
+ procedure UserNameEChange(Sender: TObject);
+ procedure FormKeyDown(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+ procedure FormDeactivate(Sender: TObject);
+ procedure FormActivate(Sender: TObject);
+ procedure PrefValuesPCDrawTab(Control: TCustomTabControl;
+ TabIndex: Integer; const Rect: TRect; Active: Boolean);
+ procedure ShowDwordAsHexClick(Sender: TObject);
+ procedure MainPreviewEChange(Sender: TObject);
+ procedure FormCreate(Sender: TObject);
+ procedure ActivateIt(Sender: TObject);
+ procedure DeActivateIt(Sender: TObject);
+ procedure ReloadBClick(Sender: TObject);
+ procedure RunExternalHexEditBClick(Sender: TObject);
+ procedure SelectExternalHexEditBClick(Sender: TObject);
+ procedure ExternalHexEditEChange(Sender: TObject);
+ procedure DefaultBClick(Sender: TObject);
+ procedure RegisterAppCBClick(Sender: TObject);
+ procedure SaveBClick(Sender: TObject);
+ procedure StringPreviewChange(Sender: TObject);
+ procedure ShowTreeViewLinesCBClick(Sender: TObject);
+ procedure ShowListViewGridCBClick(Sender: TObject);
+ procedure DefaultValueNameEChange(Sender: TObject);
+ procedure LoadPrefs;
+ procedure UseExtendedModelCBClick(Sender: TObject);
+ procedure IntegrationPageShow(Sender: TObject);
+ procedure GotoPlutoKeyBClick(Sender: TObject);
+ procedure FormShow(Sender: TObject);
+ procedure KeysSingleClickCBClick(Sender: TObject);
+ procedure ValuesSingleClickCBClick(Sender: TObject);
+ procedure QuotersEChange(Sender: TObject);
+ procedure SplashScreenCBClick(Sender: TObject);
+ procedure SaveBMouseMove(Sender: TObject; Shift: TShiftState; X,
+ Y: Integer);
+ public
+ StringQuoterBegin, StringQuoterEnd: string;
+ end;
+
+var
+ PrefWin: TPrefWin;
+
+implementation
+
+uses
+ TreeU, ValuesU, Splash, plutomain, WorkU;
+
+{$R *.dfm}
+
+procedure TPrefWin.PrefPCDrawTab(Control: TCustomTabControl;
+ TabIndex: Integer; const Rect: TRect; Active: Boolean);
+var
+ PC: TPageControl;
+ Page: TTabSheet;
+begin
+ PC := TPageControl(Control);
+ Page := PC.Pages[TabIndex];
+ with PC.Canvas.Font do begin
+ if Page.Caption = 'Common' then
+ Color := clWhite
+ else if Page.Caption = 'Keys' then
+ Color := clBrightCyan
+ else if Page.Caption = 'Values' then
+ Color := clBrightPurple
+ else if Page.Caption = 'Data' then
+ Color := clBrightBlue
+ else if Page.Caption = 'System' then
+ Color := clBrightYellow
+ else
+ Color := clWhite;
+ end;
+
+ with PC.Canvas do
+ if Active then begin
+ Font.Style := [fsBold];
+ Brush.Color := clDarkGray;
+ FillRect(Rect);
+ TextOut(Rect.Left + 5, Rect.Top + 3, Page.Caption);
+ end else begin
+ Font.Style := [];
+ Brush.Color := clDarkGray;
+ FillRect(Rect);
+ TextOut(Rect.Left + 3, Rect.Top + 2, Page.Caption);
+ end;
+end;
+
+procedure TPrefWin.PrefHostLoaded(Sender: TObject);
+begin
+ PrefHost.KeyName := PlutoUniPath;
+end;
+
+procedure TPrefWin.StandardPreviewChange(Sender: TObject);
+begin
+ if Started then
+ RegTV.Repaint;
+end;
+
+procedure TPrefWin.DataPreviewChange(Sender: TObject);
+begin
+ if not Started then
+ Exit;
+
+ ValuesWin.UpdateValues;
+ RegTV.Repaint;
+end;
+
+procedure TPrefWin.UserNameEChange(Sender: TObject);
+begin
+ StatusBar.Panels[0].Text := MainWin.Greeting;
+end;
+
+procedure TPrefWin.FormKeyDown(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+begin
+ if Key = VK_ESCAPE then
+ Close;
+
+ if Key = VK_SCROLL then
+ MainWin.FormKeyDown(Sender, Key, Shift);
+end;
+
+procedure TPrefWin.FormDeactivate(Sender: TObject);
+begin
+ if ActiveControl.Tag = EditControlFlag then
+ DeActivateThis(ActiveControl);
+
+ AlphaBlendValue := 127;
+end;
+
+procedure TPrefWin.FormActivate(Sender: TObject);
+begin
+ if Started and (ActiveControl.Tag = EditControlFlag) then
+ ActivateThis(ActiveControl);
+
+ AlphaBlendValue := 255;
+end;
+
+procedure TPrefWin.PrefValuesPCDrawTab(Control: TCustomTabControl;
+ TabIndex: Integer; const Rect: TRect; Active: Boolean);
+var
+ PC: TPageControl;
+ Page: TTabSheet;
+begin
+ PC := TPageControl(Control);
+ Page := PC.Pages[TabIndex];
+ with PC.Canvas.Font do begin
+ if Page = StringPage then
+ Color := clBrightRed
+ else if Page = MultiStringPage then
+ Color := clBrightPurple
+ else if Page = IntPage then
+ Color := clBrightBlue
+ else if Page = BinaryPage then
+ Color := clBrightGreen;
+ end;
+
+ with PC.Canvas do
+ if Active then begin
+ Font.Style := [fsBold];
+ Brush.Color := clDarkGray;
+ FillRect(Rect);
+ TextOut(Rect.Left + 18 + 5, Rect.Top + 3, Page.Caption);
+ PC.Images.Draw(PC.Canvas, Rect.Left + 4, Rect.Top + 2, Page.ImageIndex);
+ end else begin
+ Font.Style := [];
+ Brush.Color := clDarkGray;
+ FillRect(Rect);
+ TextOut(Rect.Left + 18 + 3, Rect.Top + 2, Page.Caption);
+ PC.Images.Draw(PC.Canvas, Rect.Left + 1, Rect.Top + 1, Page.ImageIndex);
+ end;
+end;
+
+procedure TPrefWin.ShowDwordAsHexClick(Sender: TObject);
+begin
+ DWordPreviewL.Caption := 'Preview: ' + ValuesU.DataPreviewOfContext(
+ RegContext(rdCardinal, Reverse(ByteAOfHex(HexOfCard(1234567890, 8)))));
+ DataPreviewChange(Self);
+end;
+
+procedure TPrefWin.MainPreviewEChange(Sender: TObject);
+begin
+ if MainPreviewE.Text = '' then
+ MainPreviewCB.Caption := '&Show Preview for Default Value'
+ else
+ MainPreviewCB.Caption := '&Show Preview for ' +
+ Quote(MainPreviewE.Text);
+
+ StandardPreviewChange(Self);
+end;
+
+procedure TPrefWin.FormCreate(Sender: TObject);
+begin
+ UserNameE.DefaultValue := UserName;
+ MainPreviewEChange(Self);
+ PrefPC.ActivePageIndex := 0;
+ PrefValuesPC.ActivePageIndex := 0;
+end;
+
+procedure TPrefWin.ActivateIt(Sender: TObject);
+begin
+ ActivateThis(Sender);
+end;
+
+procedure TPrefWin.DeActivateIt(Sender: TObject);
+begin
+ DeActivateThis(Sender);
+end;
+
+procedure TPrefWin.ReloadBClick(Sender: TObject);
+begin
+ LoadPrefs;
+end;
+
+procedure TPrefWin.RunExternalHexEditBClick(Sender: TObject);
+var
+ FileName, TestValue: string;
+begin
+ FileName := TempDir + '~test.bin';
+ TestValue := 'This is only a test.' + EOL +
+ 'Everything seems to be OK.';
+ if SaveByteA(ByteAOfStr(TestValue), FileName) then
+ ExecFileWith(ExternalHexEditE.Text, FileName)
+ else
+ ShowMessage('Could not write into file:' + EOL +
+ FileName);
+end;
+
+procedure TPrefWin.SelectExternalHexEditBClick(Sender: TObject);
+begin
+ with SelectExternalHexEditOD do begin
+ InitialDir := ExtractPath(ExternalHexEditE.Text);
+ FileName := ExtractFileName(ExternalHexEditE.Text);
+ if Execute and FileExists(FileName) then
+ ExternalHexEditE.Text := FileName;
+ end;
+end;
+
+procedure TPrefWin.ExternalHexEditEChange(Sender: TObject);
+begin
+ RunExternalHexEditB.Enabled := FileExists(ExternalHexEditE.Text);
+ if Assigned(WorkWin) then
+ WorkWin.ExternalEditB.Enabled := RunExternalHexEditB.Enabled;
+ if Assigned(MainWin) then
+ MainWin.ExternalHexEditMI.Enabled := RunExternalHexEditB.Enabled;
+end;
+
+procedure TPrefWin.DefaultBClick(Sender: TObject);
+begin
+ if mrYes=MessageDlg('Do you really want to reset the preferences' + EOL +
+ 'to their defaults?' + EOL +
+ '(This can not be undone.)', mtWarning, [mbYes, mbCancel], 0) then begin
+ CopyFile(PChar(PlutoIniFileName), PChar(PlutoIniFileName + '.backup'), False);
+ //PrefHost.KeyName := 'Ini <' + PlutoIniFileName + '.backup>:';
+ //PrefHost.Save;
+ //PrefHost.KeyName := PlutoUniPath;
+ PrefHost.BackUp;
+ end;
+end;
+
+procedure TPrefWin.RegisterAppCBClick(Sender: TObject);
+begin
+ with TXRegistry.Create do
+ try
+ RootKey := HKLM;
+ OpenKey('Software\Microsoft\Windows\CurrentVersion\App Paths');
+ if RegisterAppCB.Checked then begin
+ OpenKey('pluto.exe', True);
+ WriteString('', GetFileNew(Application.ExeName));
+ end else
+ DeleteKey('pluto.exe');
+ finally
+ Free;
+ end;
+end;
+
+procedure TPrefWin.SaveBClick(Sender: TObject);
+begin
+ PrefHost.Save;
+end;
+
+procedure TPrefWin.StringPreviewChange(Sender: TObject);
+begin
+ StringPreviewL.Caption := 'Preview: ' + ValuesU.DataPreviewOfContext(
+ RegContext(rdString, ByteAOfStr('%windir%')));
+ DataPreviewChange(Self);
+end;
+
+procedure TPrefWin.ShowTreeViewLinesCBClick(Sender: TObject);
+begin
+ with RegTV do begin
+ ShowLines := ShowTreeViewLinesCB.Checked;
+ ShowButtons := ShowLines;
+ end;
+ StandardPreviewChange(Sender);
+end;
+
+procedure TPrefWin.ShowListViewGridCBClick(Sender: TObject);
+begin
+ ValueList.GridLines := ShowListViewGridCB.Checked;
+end;
+
+procedure TPrefWin.DefaultValueNameEChange(Sender: TObject);
+begin
+ DefaultValueCaption := DefaultValueNameE.Text;
+ if Started then
+ TreeWin.RegTVChange(Self, RegTV.Selected);
+end;
+
+procedure TPrefWin.LoadPrefs;
+begin
+ PrefHost.Load;
+end;
+
+procedure TPrefWin.UseExtendedModelCBClick(Sender: TObject);
+begin
+ WorkWin.MultiStringTypeRG.ItemIndex := Integer(UseExtendedModelCB.Checked);
+ DataPreviewChange(Sender);
+end;
+
+procedure TPrefWin.IntegrationPageShow(Sender: TObject);
+begin
+ with TXRegistry.Create do
+ try
+ RootKey := HKLM;
+ OpenKey('Software\Microsoft\Windows\CurrentVersion\App Paths\pluto.exe');
+ RegisterAppCB.Checked := SameFileName(GetFileNew(ReadString('')),
+ GetFileNew(Application.ExeName));
+ finally
+ Free;
+ end;
+end;
+
+procedure TPrefWin.GotoPlutoKeyBClick(Sender: TObject);
+begin
+ MainWin.GotoKey('HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\pluto.exe');
+end;
+
+procedure TPrefWin.FormShow(Sender: TObject);
+begin
+ PrefHost.Load;
+end;
+
+procedure TPrefWin.KeysSingleClickCBClick(Sender: TObject);
+begin
+ TreeWin.CheckRegTVHotTrack;
+end;
+
+procedure TPrefWin.ValuesSingleClickCBClick(Sender: TObject);
+begin
+ ValuesWin.CheckValueListHotTrack;
+end;
+
+procedure TPrefWin.QuotersEChange(Sender: TObject);
+var
+ QBegin, QEnd: string;
+begin
+ with QuotersE do begin
+ if Text = '' then
+ QBegin := ''
+ else
+ QBegin := Text[1];
+ if Length(Text) < 2 then
+ QEnd := QBegin
+ else
+ QEnd := Text[2];
+ end;
+
+ if (QBegin <> StringQuoterBegin) or (QEnd <> StringQuoterEnd) then begin
+ StringQuoterBegin := QBegin;
+ StringQuoterEnd := QEnd;
+ StringPreviewChange(Self);
+ end;
+end;
+
+procedure TPrefWin.SplashScreenCBClick(Sender: TObject);
+begin
+ if Started and Assigned(SplashWin) then
+ SplashWin.SplashScreenCB.Checked := SplashScreenCB.Checked;
+end;
+
+procedure TPrefWin.SaveBMouseMove(Sender: TObject; Shift: TShiftState; X,
+ Y: Integer);
+begin
+ Label2.Font.Color := clBrightRed;
+ Application.ProcessMessages;
+ Sleep(200);
+ Label2.Font.Color := clWhite;
+end;
+
+end.
+unit RegScanner;
+
+interface
+
+uses
+ Windows, SysUtils, Dialogs, Classes,
+ YTools, YTypes, XReg, Clock;
+
+type
+ TRegScanThread = class;
+
+ TRegScanKeyEvent = procedure (Sender: TRegScanThread; const KeyName: string; Key: HKEY; Info: TRegKeyInfo) of object;
+ TRegScanValueEvent = procedure (Sender: TRegScanThread; const ValueName: string; Context: TRegContext) of object;
+
+ TRegScanTask = record
+ Root: string;
+ Key: HKEY;
+ end;
+ TRegScanTasks = array of TRegScanTask;
+
+ TRegScanThread = class(TThread)
+ private
+ Keys, KeysOK, Values, ValuesOK: Integer;
+ DoScanValues: Boolean;
+ FOnKey: TRegScanKeyEvent;
+ FOnValue: TRegScanValueEvent;
+ FOnFaileKey: TRegScanKeyEvent;
+ protected
+ procedure ScanKey(Key: HKEY; const KeyName: string = ''); virtual;
+ procedure ScanValues(Key: HKEY; Info: TRegKeyInfo); virtual;
+
+ public
+ Path: string;
+ CurrentTask: TRegScanTask;
+ Tasks: TRegScanTasks;
+ destructor Destroy; override;
+ procedure Execute; override;
+ procedure ScanAll;
+ function CurrentPath: string;
+ published
+ constructor CreateIt(PriorityLevel: TThreadPriority;
+ DoScanValues: Boolean = True; Tasks: TRegScanTasks = nil);
+
+ property OnKey: TRegScanKeyEvent read FOnKey write FOnKey;
+ property OnValue: TRegScanValueEvent read FOnValue write FOnValue;
+ property OnFaileKey: TRegScanKeyEvent read FOnFaileKey write FOnFaileKey;
+ end;
+
+implementation
+
+{ TRegScanThread }
+
+constructor TRegScanThread.CreateIt(PriorityLevel: TThreadPriority;
+ DoScanValues: Boolean = True; Tasks: TRegScanTasks = nil);
+begin
+ inherited Create(True);
+ Priority := PriorityLevel;
+ FreeOnTerminate := False;
+ Self.DoScanValues := DoScanValues;
+ Self.Tasks := Tasks;
+end;
+
+destructor TRegScanThread.Destroy;
+begin
+ inherited;
+end;
+
+procedure TRegScanThread.ScanAll;
+var
+ i: Integer;
+begin
+ Keys := 0;
+ KeysOK := 0;
+ Values := 0;
+ ValuesOK := 0;
+
+ for i := 0 to High(Tasks) do begin
+ CurrentTask := Tasks[i];
+ with CurrentTask do begin
+ Inc(Keys);
+ ScanKey(Key);
+ end;
+
+ if Terminated then Break;
+ end;
+end;
+
+procedure TRegScanThread.ScanValues(Key: HKEY; Info: TRegKeyInfo);
+var
+ i: Integer;
+ MaxLen, NameLen, Len, Typ: Cardinal;
+ p: PChar;
+ Buffer: TByteA;
+
+ procedure ScanValue(ValueName: string; Typ: TRegDataType; Data: TByteA);
+ begin
+ if Assigned(OnValue) then
+ OnValue(Self, ValueName, RegContext(Typ, Data));
+ Inc(ValuesOK);
+ end;
+
+begin
+ MaxLen := Info.MaxValueLen + 1; //Include Nullbyte
+ SetLength(Buffer, Info.MaxDataLen);
+ GetMem(p, MaxLen);
+
+ Inc(Values, Info.NumValues);
+ for i := 0 to Info.NumValues-1 do begin
+ NameLen := MaxLen;
+ Len := Info.MaxDataLen;
+ if Success(RegEnumValue(Key, i, p, NameLen, nil, @Typ, Pointer(Buffer),
+ @Len)) then
+ ScanValue(Copy(p, 0, NameLen), Typ, Copy(Buffer, 0, Len))
+ else
+ Yield;
+ end;
+ FreeMem(p, MaxLen);
+end;
+
+procedure TRegScanThread.ScanKey(Key: HKEY; const KeyName: string = '');
+var
+ i: Integer;
+ NewHKEY: HKEY;
+ Info: TRegKeyInfo;
+ l, Len: DWORD;
+ p: PChar;
+ z: Integer;
+begin
+ if Terminated then Exit;
+
+ with Info do begin
+ if not Success(RegQueryInfoKey(Key, nil, nil, nil, @NumSubKeys,
+ @MaxSubKeyLen, nil, @NumValues, @MaxValueLen, @MaxDataLen,
+ nil, nil)) then
+ Exit;
+
+ if Assigned(OnKey) then
+ OnKey(Self, KeyName, Key, Info);
+ if DoScanValues and (NumValues > 0) then
+ ScanValues(Key, Info);
+
+ if Info.NumSubKeys > 0 then begin
+ Inc(Keys, NumSubKeys);
+
+ Len := MaxSubKeyLen + 1;
+ GetMem(p, Len);
+
+ for i := 0 to NumSubKeys-1 do begin
+ l := Len;
+ RegEnumKeyEx(Key, i, p, l, nil, nil, nil, nil);
+ if Success(RegOpenKey(Key, p, NewHKEY)) then begin
+ z := Length(Path);
+ Path := Path + '\' + p;
+ ScanKey(NewHKEY, p);
+ RegCloseKey(NewHKEY);
+ SetLength(Path, z);
+ end else
+ if Assigned(OnFaileKey) then
+ OnFaileKey(Self, p, Key, Info);
+
+ if Terminated then
+ Break;
+ end;
+ FreeMem(p, Len);
+ end;
+ end;
+
+ Inc(KeysOK);
+end;
+
+procedure TRegScanThread.Execute;
+var
+ Secs: Double;
+begin
+ with TClock.Create do begin
+ ScanAll;
+ Secs := SecondsPassed;
+ Free;
+ end;
+
+ WriteLn('finished.');
+ WriteLn( Format('Keys: %6d counted (%3d failed)', [Keys, Keys - KeysOK]));
+ if DoScanValues then
+ WriteLn(Format('Values: %6d counted (%3d failed)', [Values, Values - ValuesOK]));
+ WriteLn('t ' + Format('%.2f', [Secs]) + ' seconds');
+ if Secs > 0 then
+ WriteLn('r ' + Format('%.0f', [Keys / Secs]) + ' k/s');
+end;
+
+function TRegScanThread.CurrentPath: string;
+begin
+ Result := CurrentTask.Root + Path;
+end;
+
+end.
+unit RegTV;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
+ ComCtrls;
+
+type
+ TRegTV = class(TTreeView)
+ private
+ { Private-Deklarationen }
+ protected
+ { Protected-Deklarationen }
+ public
+ { Public-Deklarationen }
+ published
+ { Published-Deklarationen }
+ end;
+
+procedure Register;
+
+implementation
+
+procedure Register;
+begin
+ RegisterComponents('pluto', [TRegTV]);
+end;
+
+end.
+unit Sisyphus;
+
+interface
+
+uses
+ Windows, Classes, SysUtils, XReg, YTools, YTypes, Clock;
+
+type
+ TSpyValue = class
+ Name: string;
+ Next: TSpyValue;
+ //DIC: TByteA;
+ Typ: TXRegDataType;
+ Data: TByteA;
+ constructor Create(AName: string);
+ end;
+
+ TSpyKey = class
+ public
+ Parent: TSpyKey;
+ Name: string;
+ Next: TSpyKey;
+ Keys: TSpyKey;
+ Values: TSpyValue;
+ procedure Spy(AHKEY: HKEY);
+ function Path: string;
+ constructor Create(AParent: TSpyKey; AName: string);
+ destructor Destroy; override;
+ end;
+
+var
+ Reg: TXRegistry;
+ HKLMSpyKey, HKUSpyKey: TSpyKey;
+ Started: Boolean = False;
+
+implementation
+
+uses
+ Plutomain;
+
+procedure AddChange(M: string);
+begin
+ Yield;
+ //AddHint(M);
+end;
+
+{ TSpyValue }
+
+constructor TSpyValue.Create(AName: string);
+begin
+ Name := AName;
+ Next := nil;
+end;
+
+{ TSpyKey }
+
+constructor TSpyKey.Create(AParent: TSpyKey; AName: string);
+begin
+ Name := AName;
+ Parent := AParent;
+
+ Next := nil;
+ Keys := nil;
+ Values := nil;
+end;
+
+destructor TSpyKey.Destroy;
+var
+ Value, NextValue: TSpyValue;
+ Key, NextKey: TSpyKey;
+begin
+ Value := Values;
+ while Value <> nil do begin
+ NextValue := Value.Next;
+ Value.Free;
+ Value := NextValue;
+ end;
+
+ Key := Keys;
+ while Key <> nil do begin
+ NextKey := Key.Next;
+ Key.Free;
+ Key := NextKey;
+ end;
+
+ inherited;
+end;
+
+function TSpyKey.Path: string;
+begin
+ if Assigned(Parent) then
+ Result := Parent.Path + '\'
+ else
+ Result := 'Reg: ';
+
+ Result := Result + Name;
+end;
+
+procedure TSpyKey.Spy(AHKEY: HKEY);
+var
+ SL: TStringList;
+
+ procedure CompareValues;
+ var
+ i: Integer;
+ Value, LastValue, NewValue, SearchValue: TSpyValue;
+ begin
+ //OK, this part is a little bit complicate. So I will comment very much.
+ //First, two terms are important:
+ //<REAL> means the list of values that will be read from the registry now:
+ Reg.GetValueNames(SL);
+ //So <REAL> is TStringList.
+
+ //<CURRENT> means the image that was saved before.
+ //Here, it is a linear list of TSpyValue objects. That means that you can
+ //only get X.Next and not X.Prev! However, I use "X.Prev" to simplify
+ //some comments.
+
+ //!!! Comparing means: Make <CURRENT> fit <REAL> !!!
+
+ //If <CURRENT> wasn't saved before, it is just empty.
+
+ //!!! There is no difference in comparing and saving in this method !!!
+
+ //Building means: Comparing with an empty image.
+
+ //We go through <REAL> and make <CURRENT> fit it
+
+ //The following rules are important:
+ //Value = "The currently interesting value.
+ //LastValue = "The value with X.Next = Value" = "Value.Pref"
+
+ LastValue := nil; // := "Values.Prev"
+ Value := Values; // := "LastValue.Next"
+
+ //Now compare step by step
+ for i := 0 to SL.Count-1 do begin
+ if Assigned(Value) and (SL[i] = Value.Name) then begin
+ //cV= Normally (0.9999) everything's the same
+ LastValue := Value;
+ Value := Value.Next;
+ end else begin //Something's different? Yes, the IMPORTANT rest (0.0001))
+ //Because the list finally must exactly fit SL, the "SL[i] value" hast
+ //to be inserted right here. But first let's look...
+
+ //Maybe it was just moved? So search for it...
+ NewValue := nil;
+ if Assigned(Value) then begin
+ SearchValue := Value;
+ while Assigned(SearchValue.Next) do
+ if (SearchValue.Next.Name = SL[i]) then begin
+ //cV\
+ NewValue := SearchValue.Next;
+ AddChange('cV\ ' + Path);
+ SearchValue.Next := SearchValue.Next.Next;
+ Break; end;
+ end;
+
+ if not Assigned(NewValue) then begin
+ //cV+ No, not found! So it is new...
+ NewValue := TSpyValue.Create(SL[i]);
+ AddChange('cV+ ' + Path + '\\' + NewValue.Name);
+ with NewValue do begin
+ Typ := Reg.GetDataType(SL[i]);
+ Data := Reg.ReadBin(SL[i]);
+ end;
+ end;
+
+ //The new object now must be placed after the last value
+ if Assigned(LastValue) then begin
+ LastValue.Next := NewValue;
+ end else begin
+ //If it's the first value, we don't have LastValue defined
+ //So we have to set the "Root" to it
+ Values := NewValue;
+ end;
+ //Now the rest of <CURRENT> has to be placed after the new value
+ NewValue.Next := Value;
+ //And LastValue also has to refreshed: It is "Value.Pref" = NewValue!
+ LastValue := NewValue;
+ end;
+ end;
+
+ //Because the whole <CURRENT> before Value is exactly <REAL>, the rest
+ //(if there is one) must have been deleted!
+
+ //So first let's ensure that <CURRENT> ends here:
+ if Assigned(LastValue) then begin
+ LastValue.Next := nil;
+ end else begin
+ //Another time: <CURRENT> is empty now, so set Values instead
+ Values := nil;
+ end;
+
+ //Now, the first value that maybe was "cut" off is Value:
+ while Assigned(Value) do begin
+ //cV- So, here really something HAS been deleted
+ LastValue := Value;
+ Value := Value.Next;
+ AddChange('cV- ' + Path + '\\' + LastValue.Name);
+ LastValue.Free;
+ end;
+ end;
+
+ procedure CompareData;
+ var
+ Value: TSpyValue;
+ Typ: TXRegDataType;
+ Data: TByteA;
+ begin
+ //So, finally <CURRENT> = <REAL>. That means we now can compare the data:
+ Value := Values;
+ while Assigned(Value) do begin
+ Typ := Reg.GetDataType(Value.Name);
+ Data := Reg.ReadBin(Value.Name);
+ if Typ <> Value.Typ then begin
+ //cT#
+ AddChange('cT# ' + Path + '\\' + Value.Name);
+ Value.Typ := Typ;
+ end;
+ if not SameByteA(Data, Value.Data) then begin
+ //cD#
+ AddChange('cD# ' + Path + '\\' + Value.Name);
+ Value.Data := Data;
+ end;
+
+ Value := Value.Next;
+ end;
+ end;
+
+ procedure CompareKeys;
+ var
+ i: Integer;
+ Key, LastKey, NewKey, SearchKey: TSpyKey;
+ NewHKEY: HKEY;
+ begin
+ //OK, this part is a little bit complicate. So I will comment very much.
+ //First, two terms are important:
+ //<REAL> means the list of keys that will be read from the registry now:
+ Reg.GetKeyNames(SL);
+ //So <REAL> is TStringList.
+
+ //<CURRENT> means the image that was saved before.
+ //Here, it is a linear list of TSpyKey objects. That means that you can
+ //only get X.Next and not X.Prev! However, I use "X.Prev" to simplify
+ //some comments.
+
+ //!!! Comparing means: Make <CURRENT> fit <REAL> !!!
+
+ //If <CURRENT> wasn't saved before, it is just empty.
+
+ //!!! There is no difference in comparing and saving in this method !!!
+
+ //Building means: Comparing with an empty image.
+
+ //We go through <REAL> and make <CURRENT> fit it
+
+ //The following rules are important:
+ //Key = "The currently interesting key.
+ //LastKey = "The key with X.Next = Key" = "Key.Pref"
+
+ LastKey := nil; // := "Keys.Prev"
+ Key := Keys; // := "LastKey.Next"
+
+ //Now compare step by step
+ for i := 0 to SL.Count-1 do begin
+ if Assigned(Key) and (SL[i] = Key.Name) then begin
+ //cK= Normally (0.9999) everything's the same
+ RegOpenKey(AHKEY, PChar(SL[i]), NewHKEY);
+ Key.Spy(NewHKEY);
+ LastKey := Key;
+ Key := Key.Next;
+ end else begin //Something's different? Yes, the IMPORTANT rest (0.0001))
+ //Because the list finally must exactly fit SL, the "SL[i] key" hast
+ //to be inserted right here. But first let's look...
+
+ //Maybe it was just moved? So search for it...
+ NewKey := nil;
+ if Assigned(Key) then begin
+ SearchKey := Key;
+ while Assigned(SearchKey.Next) do
+ if (SearchKey.Next.Name = SL[i]) then begin
+ //cK\
+ NewKey := SearchKey.Next;
+ AddChange('cK\ ' + Path);
+ SearchKey.Next := SearchKey.Next.Next;
+ Break; end;
+ end;
+
+ if not Assigned(NewKey) then begin
+ //cK+ No, not found! So it is new...
+ NewKey := TSpyKey.Create(Self, SL[i]);
+ AddChange('cK+ ' + Path + '\' + NewKey.Name);
+
+ RegOpenKey(AHKEY, PChar(SL[i]), NewHKEY);
+ NewKey.Spy(NewHKEY);
+ end;
+
+ //The new object now must be placed after the last key
+ if Assigned(LastKey) then begin
+ LastKey.Next := NewKey;
+ end else begin
+ //If it's the first key, we don't have LastKey defined
+ //So we have to set the "Root" to it
+ Keys := NewKey;
+ end;
+ //Now the rest of <CURRENT> has to be placed after the new key
+ NewKey.Next := Key;
+ //And LastKey also has to refreshed: It is "Key.Pref" = NewKey!
+ LastKey := NewKey;
+ end;
+ end;
+
+ //Because the whole <CURRENT> before Key is exactly <REAL>, the rest
+ //(if there is one) must have been deleted!
+
+ //So first let's ensure that <CURRENT> ends here:
+ if Assigned(LastKey) then begin
+ LastKey.Next := nil;
+ end else begin
+ //Another time: <CURRENT> is empty now, so set Keys instead
+ Keys := nil;
+ end;
+
+ //Now, the first key that maybe was "cut" off is Key:
+ while Assigned(Key) do begin
+ //cV- So, here really something HAS been deleted
+ LastKey := Key;
+ Key := Key.Next;
+ AddChange('cK- ' + Path + '\' + LastKey.Name);
+ LastKey.Free;
+ end;
+ end;
+
+
+begin
+ SL := TStringList.Create;
+
+ try
+ Reg.CurrentKey := AHKEY;
+
+ CompareValues;
+
+ CompareData;
+
+ CompareKeys;
+
+ finally
+ RegCloseKey(AHKEY);
+ end;
+
+ SL.Free;
+end;
+
+initialization
+ Reg := TXRegistry.Create;
+ HKLMSpyKey := TSpyKey.Create(nil, 'HKEY_LOCAL_MACHINE');
+ HKUSpyKey := TSpyKey.Create(nil, 'HKEY_USERS');
+
+finalization
+ Reg.Free;
+ HKLMSpyKey.Free;
+ HKUSpyKey.Free;
+
+end.
+unit SisyphusTH;
+
+interface
+
+uses
+ Windows, Classes, StdCtrls, Dialogs, SysUtils, XReg, YTools, YTypes, Clock,
+ ComCtrls, PlutoConst, UniKey, CompEx;
+
+const
+ SisyVersion = '1.2 b3';
+ StatusPoints = 25;
+
+type
+ TSisyChangeType = (cNone, cError,
+ cKeyPlus, cKeyMinus,
+ cValuePlus, cValueMinus,
+ cContextChange);
+
+const
+ SisyChangeStrings: array[TSisyChangeType] of string =
+ ('?', 'Error',
+ 'cK+', 'cK-',
+ 'cV+', 'cV-',
+ 'cC');
+
+type
+ TSpyValue = class
+ Name: string;
+ Next: TSpyValue;
+ Context: TRegContext;
+ constructor Create(const Name: string; Context: TRegContext);
+ end;
+
+ TSisyThread = class;
+
+ TSpyKey = class
+ public
+ Parent: TSpyKey;
+ Name: string;
+ Next: TSpyKey;
+ Keys: TSpyKey;
+ Values: TSpyValue;
+ procedure Spy(AHKEY: HKEY; Sisy: TSisyThread);
+ function Path: string;
+ constructor Create(AParent: TSpyKey; AName: string);
+ destructor Destroy; override;
+ end;
+
+ TSisyChange = class
+ public
+ Typ: TSisyChangeType;
+ Path: string;
+ Old, New: TRegContext;
+ constructor Create(ATyp: TSisyChangeType; const APath: string;
+ AOldContext: TRegContext; ANewContext: TRegContext);
+ procedure ReportToPluto;
+ end;
+
+ TSisyChangeEvent = procedure (Sender: TSisyThread; Change: TSisyChange) of object;
+ TSisyThread = class(TThread)
+ private
+ Reg: TXRegistry;
+ Key: TSpyKey;
+ KeyHKEY: HKEY;
+ CurrentChange: TSisyChange;
+ FOnChange: TSisyChangeEvent;
+ FOnSpecialChanges: array[TSisyChangeType] of TSisyChangeEvent;
+ procedure FreeKey;
+ procedure IncKeyCount;
+ procedure IncKeyIndex;
+ function GetSpecialChange(ChangeType: TSisyChangeType): TSisyChangeEvent;
+ procedure SetSpecialChange(ChangeType: TSisyChangeType;
+ const Value: TSisyChangeEvent);
+ protected
+ procedure AddValueChange(Typ: TSisyChangeType; const Path: string;
+ Old, New: TRegContext);
+ procedure AddKeyChange(Typ: TSisyChangeType; const Path: string);
+ procedure Execute; override;
+ procedure ShowInfo;
+ procedure NotifyChange;
+ procedure ReportCurrentChange;
+ public
+ CurrentSpyKey: TSpyKey;
+ StatusLabel: TLabel;
+ Name: string;
+ Started: Boolean;
+ DoReport: Boolean;
+ SecsPerRound: Double;
+ InfoForShow: string;
+ OnStarted: TNotifyEvent;
+ KeyCount: Integer;
+ PrevKeyCount: Integer;
+ KeyIndex: Integer;
+ TheClock: TClock;
+ Uni: TUniKey;
+ MaxValueCountToScan, MaxKeyCountToScan, MaxDataLenToScan: Cardinal;
+ constructor CreateIt(const AName, AKeyName: string; AHKEY: HKEY;
+ ALabel: TLabel; AUniKey: TUniKey);
+ destructor Destroy; override;
+
+ property OnChange: TSisyChangeEvent read FOnChange write FOnChange;
+ property OnSpecialChange[ChangeType: TSisyChangeType]: TSisyChangeEvent
+ read GetSpecialChange write SetSpecialChange;
+ end;
+
+ TSisyList = class(TList)
+ protected
+ function GetSisy(Index: Integer): TSisyThread;
+ procedure PutSisy(Index: Integer; Sisy: TSisyThread);
+ public
+ procedure Suspend;
+ procedure Resume;
+ property Items[Index: Integer]: TSisyThread read GetSisy write PutSisy; default;
+ end;
+
+procedure SetSisyChangeState(Node: TTreeNode; Active: Boolean);
+function SisyChangeActivated(Node: TTreeNode): Boolean;
+
+var
+ SisyFilter: TStringList;
+
+implementation
+
+uses plutomain, workU, ValuesU;
+
+procedure SetSisyChangeState(Node: TTreeNode; Active: Boolean);
+begin
+ Node.Data := Pointer(not Active);
+end;
+
+function SisyChangeActivated(Node: TTreeNode): Boolean;
+begin
+ Result := Node.Data = Pointer(False);
+end;
+
+{ TSisyThread }
+
+constructor TSisyThread.CreateIt(const AName, AKeyName: string;
+ AHKEY: HKEY; ALabel: TLabel; AUniKey: TUniKey);
+begin
+ inherited Create(True); // Create thread suspended
+
+ Started := False;
+ DoReport := True;
+ KeyCount := 0;
+ FreeOnTerminate := False; // Thread frees itself not when terminated
+
+ KeyHKEY := AHKEY;
+ Name := AName;
+ StatusLabel := ALabel;
+ StatusLabel.Caption := 'Zzzzzzz...';
+
+ Reg := TXRegistry.Create;
+ TheClock := TClock.Create;
+
+ Uni := AUniKey.GetKey(Name);
+ Priority := TThreadPriority(Uni.ReadInteger('Priority', Integer(tpLowest)));
+ PrevKeyCount := Uni.ReadInteger('KeyCount', 0);
+
+ MaxKeyCountToScan := Cardinal(Uni.ReadInteger('ScanTuner: MaxKeys', -1));
+ MaxValueCountToScan := Cardinal(Uni.ReadInteger('ScanTuner: MaxValues', -1));
+ MaxDataLenToScan := Cardinal(Uni.ReadInteger('ScanTuner: MaxDataLen', -1));
+
+ Key := TSpyKey.Create(nil, AKeyName);
+end;
+
+procedure TSisyThread.FreeKey;
+begin
+ Reg.Free;
+ TheClock.Free;
+ Key.Free;
+end;
+
+destructor TSisyThread.Destroy;
+begin
+ Synchronize(FreeKey);
+ inherited;
+end;
+
+procedure TSisyThread.Execute;
+begin
+ InfoForShow := Name + ' initializing...';
+ Synchronize(ShowInfo);
+
+ TheClock.Restart;
+ Started := False;
+ while not Terminated do
+ try
+ KeyIndex := 0;
+
+ { ===================== }
+ Key.Spy(KeyHKEY, Self);
+ { ===================== }
+
+ if Terminated then
+ Continue; //= Exit
+
+ SecsPerRound := TheClock.SecondsPassed;
+ TheClock.Restart;
+ if not Started then begin
+ Started := True;
+ Uni.WriteInteger('KeyCount', KeyCount);
+ if Assigned(OnStarted) then
+ OnStarted(Self);
+ end;
+ except
+ ShowMessage('Error in Sisyphus');
+ end;
+end;
+
+procedure TSisyThread.AddValueChange(Typ: TSisyChangeType; const Path: string;
+ Old, New: TRegContext);
+
+ procedure TryNotify(Event: TSisyCHangeEvent);
+ begin
+
+ end;
+
+begin
+ if not (Started and DoReport) then
+ Exit;
+
+ CurrentChange := TSisyChange.Create(Typ, Path, Old, New);
+ Synchronize(ReportCurrentChange);
+ Synchronize(NotifyChange);
+
+// CurrentChange.Free; //this makes Pluto itself
+end;
+
+procedure TSisyThread.AddKeyChange(Typ: TSisyChangeType; const Path: string);
+begin
+ AddValueChange(Typ, Path, ZeroRegContext, ZeroRegContext);
+end;
+
+procedure TSisyThread.ShowInfo;
+begin
+ if Assigned(StatusLabel) then
+ StatusLabel.Caption := InfoForShow;
+end;
+
+procedure TSisyThread.ReportCurrentChange;
+begin
+ if Assigned(CurrentChange) then
+ CurrentChange.ReportToPluto;
+end;
+
+procedure TSisyThread.IncKeyCount;
+var
+ c: Integer;
+begin
+ if Started then
+ Exit;
+
+ Inc(KeyCount);
+
+ if (KeyCount and $1FF) = 0 then begin
+ if KeyCount > PrevKeyCount then
+ PrevKeyCount := KeyCount;
+
+ c := 0;
+ if PrevkeyCount > 0 then
+ c := Round((KeyCount * StatusPoints) / PrevKeyCount);
+ InfoForShow := '|' + MulStr('.', c) + MulStr(' ', StatusPoints - c) + '|' +
+ Format(' (%0.1f s) %d/%d k ',
+ [TheClock.SecondsPassed, KeyCount, PrevKeyCount]);
+
+ Synchronize(ShowInfo);
+ end;
+end;
+
+procedure TSisyThread.IncKeyIndex;
+var
+ c: Integer;
+begin
+ if not Started then
+ Exit;
+
+ Inc(KeyIndex);
+
+ if ((KeyIndex and $1FF) = 0) and (KeyCount > 0) then begin
+ if KeyIndex > KeyCount then
+ KeyCount := KeyIndex;
+
+ c := 0;
+ if KeyCount > 0 then
+ c := Round((KeyIndex * StatusPoints) / KeyCount);
+
+ InfoForShow := '|' + MulStr(':', c) + MulStr('.', StatusPoints - c) + '|' +
+ Format(' (%0.1f s) %d/%d k ', [SecsPerRound, KeyIndex, KeyCount]);
+
+ Synchronize(ShowInfo);
+ end;
+end;
+
+function TSisyThread.GetSpecialChange(ChangeType: TSisyChangeType):
+ TSisyChangeEvent;
+begin
+ Result := FOnSpecialChanges[ChangeType];
+end;
+
+procedure TSisyThread.SetSpecialChange(ChangeType: TSisyChangeType;
+ const Value: TSisyChangeEvent);
+begin
+ FOnSpecialChanges[ChangeType] := Value;
+end;
+
+procedure TSisyThread.NotifyChange;
+var
+ Event: TSisyChangeEvent;
+begin
+ Event := FOnSpecialChanges[CurrentChange.Typ];
+ if Assigned(Event) then
+ Event(Self, CurrentChange);
+
+ if Assigned(FOnChange) then
+ FOnChange(Self, CurrentChange);
+end;
+
+{ TSpyValue }
+
+constructor TSpyValue.Create(const Name: string; Context: TRegContext);
+begin
+ Self.Name := Name;
+ Next := nil;
+ Self.Context := Context;
+end;
+
+{ TSpyKey }
+
+constructor TSpyKey.Create(AParent: TSpyKey; AName: string);
+begin
+ Name := AName;
+ Parent := AParent;
+
+ Next := nil;
+ Keys := nil;
+ Values := nil;
+end;
+
+destructor TSpyKey.Destroy;
+var
+ Value, NextValue: TSpyValue;
+ Key, NextKey: TSpyKey;
+begin
+ Value := Values;
+ while Assigned(Value) do begin
+ NextValue := Value.Next;
+ Value.Free;
+ Value := NextValue;
+ end;
+
+ Key := Keys;
+ while Assigned(Key) do begin
+ NextKey := Key.Next;
+ Key.Free;
+ Key := NextKey;
+ end;
+
+ inherited;
+end;
+
+function TSpyKey.Path: string;
+begin
+ if Assigned(Parent) then
+ Result := Parent.Path + '\'
+ else
+ Result := '';
+
+ Result := Result + Name;
+end;
+
+procedure TSpyKey.Spy(AHKEY: HKEY; Sisy: TSisyThread);
+var
+ SL: TStringList;
+ LastKey: TSpyKey;
+
+ procedure CompareValues;
+ var
+ i: Integer;
+ Value, LastValue, NewValue, SearchValue, SearchValue_Prev: TSpyValue;
+ begin
+ //OK, this part is a little bit complicate. So I will comment very much.
+ //First, two terms are important:
+ //<REAL> means the list of values that will be read from the registry now:
+ Sisy.Reg.GetValueNames(SL);
+ if Cardinal(SL.Count) > Sisy.MaxValueCountToScan then
+ Exit;
+ //So <REAL> is TStringList.
+
+ //<CURRENT> means the image that was saved before.
+ //Here, it is a linear list of TSpyValue objects. That means that you can
+ //only get X.Next and not X.Prev! However, I use "X.Prev" to simplify
+ //some comments.
+
+ //!!! Comparing means: Make <CURRENT> fit <REAL> !!!
+
+ //If <CURRENT> wasn't saved before, it is just empty.
+
+ //!!! There is no difference in comparing and saving in this method !!!
+
+ //Building means: Comparing with an empty image.
+
+ //We go through <REAL> and make <CURRENT> fit it
+
+ //The following rules are important:
+ //Value = "The currently interesting value.
+ //LastValue = "The value with X.Next = Value" = "Value.Pref"
+
+ LastValue := nil; // := "Values.Prev"
+ Value := Values; // := "LastValue.Next"
+
+ //Now compare step by step
+ for i := 0 to SL.Count-1 do begin
+ if Assigned(Value) and (SL[i] = Value.Name) then begin
+ //cV= Normally (0.9999) everything's the same
+ LastValue := Value;
+ Value := Value.Next;
+ end else begin //Something's different? Yes, the IMPORTANT rest (0.0001))
+ //Because the list finally must exactly fit SL, the "SL[i] value" hast
+ //to be inserted right here. But first let's look...
+
+ //Maybe it was just moved? So search for it...
+ NewValue := nil;
+ if Assigned(Value) then begin
+ SearchValue_Prev := Value;
+ SearchValue := Value.Next;
+ while Assigned(SearchValue) do begin
+ if SearchValue.Name = SL[i] then begin //we found our moved value
+ SearchValue_Prev.Next := SearchValue.Next; //delete it from <CURRENT>
+ NewValue := SearchValue; //save that we found it
+ Break end;
+ SearchValue_Prev := SearchValue;
+ SearchValue := SearchValue.Next;
+ end;
+ end;
+
+ if not Assigned(NewValue) then begin
+ //cV+ No, not found! So it is new...
+ NewValue := TSpyValue.Create(SL[i], Sisy.Reg.ReadContext(SL[i]));
+ { ================ cV+ ================ }
+ if Sisy.Started and Sisy.Reg.ValueReallyExists(SL[i]) then
+ Sisy.AddValueChange(cValuePlus, Path + '\\' + NewValue.Name,
+ ZeroRegContext, NewValue.Context);
+ end;
+
+ //The new object now must be placed after the last value
+ if Assigned(LastValue) then
+ LastValue.Next := NewValue
+ else
+ //If it's the first value, we don't have LastValue defined
+ //So we have to set the "Root" to it
+ Values := NewValue;
+
+ //Now the rest of <CURRENT> has to be placed after the new value
+ NewValue.Next := Value;
+ //And LastValue also has to refreshed: It is "Value.Pref" = NewValue!
+ LastValue := NewValue;
+ end;
+ end;
+
+ //Because the whole <CURRENT> before Value is exactly <REAL>, the rest
+ //(if there is one) must have been deleted!
+
+ //So first let's ensure that <CURRENT> ends here:
+ if Assigned(LastValue) then
+ LastValue.Next := nil
+ else
+ //Another time: <CURRENT> is empty now, so set Values instead
+ Values := nil;
+
+ //Now, the first value that maybe was "cut" off is Value:
+ while Assigned(Value) do begin
+ //cV- So, here really something HAS been deleted
+ LastValue := Value;
+ Value := Value.Next;
+ { ================ cV- ================ }
+ if Sisy.Started and not Sisy.Reg.ValueReallyExists(LastValue.Name) then
+ Sisy.AddValueChange(cValueMinus, Path + '\\' + LastValue.Name,
+ LastValue.Context, ZeroRegContext);
+ LastValue.Free;
+ end;
+ end;
+
+ procedure CompareData;
+ var
+ Value: TSpyValue;
+ Context: TRegContext;
+ Size: Cardinal;
+ begin
+ Context := ZeroRegContext; //Initialize
+ //So, finally <CURRENT> = <REAL>. That means we now can compare the data:
+ Value := Values;
+ while Assigned(Value) and not Sisy.Terminated do begin
+ Size := Sisy.Reg.GetDataSize(Value.Name);
+ if (Size = Cardinal(-1)) or
+ (Size <= Sisy.MaxDataLenToScan) then begin
+ Context := Sisy.Reg.ReadContext(Value.Name);
+ if not SameContext(Context, Value.Context) then begin
+ { ================ cC ================ }
+ Sisy.AddValueChange(cContextChange, Path + '\\' + Value.Name,
+ Value.Context, Context);
+ Value.Context := Context;
+ end;
+ end;
+
+ Value := Value.Next;
+ end;
+ end;
+
+ procedure CompareKeys;
+ var
+ i: Integer;
+ Key, LastKey, NewKey, SearchKey, SearchKey_Prev: TSpyKey;
+ SavedDoReport: Boolean;
+ NewHKEY: HKEY;
+ begin
+ //OK, this part is a little bit complicate. So I will comment very much.
+ //First, two terms are important:
+ //<REAL> means the list of keys that will be read from the registry now:
+
+ Sisy.Reg.GetKeyNames(SL);
+ if Cardinal(SL.Count) > Sisy.MaxKeyCountToScan then
+ Exit;
+ //So <REAL> is TStringList.
+
+ //<CURRENT> means the image that was saved before.
+ //Here, it is a linear list of TSpyKey objects. That means that you can
+ //only get X.Next and not X.Prev! However, I use "X.Prev" to simplify
+ //some comments.
+
+ //!!! Comparing means: Make <CURRENT> fit <REAL> !!!
+
+ //If <CURRENT> wasn't saved before, it is just empty.
+
+ //!!! There is no difference in comparing and saving in this method !!!
+
+ //Building means: Comparing with an empty image.
+
+ //We go through <REAL> and make <CURRENT> fit it
+
+ //The following rules are important:
+ //Key = "The currently interesting key.
+ //LastKey = "The key with X.Next = Key" = "Key.Pref"
+
+ LastKey := nil; // := "Keys.Prev"
+ Key := Keys; // := "LastKey.Next"
+
+ //Now compare step by step
+ for i := 0 to SL.Count-1 do begin
+ if Assigned(Key) and (SL[i] = Key.Name) then begin
+ //cK= Normally (0.9999) everything's the same
+ if Success(RegOpenKey(AHKEY, PChar(SL[i]), NewHKEY)) then
+ try
+ Key.Spy(NewHKEY, Sisy);
+ finally
+ RegCloseKey(NewHKEY);
+ end;
+ if Sisy.Terminated then
+ Exit;
+
+ LastKey := Key;
+ Key := Key.Next;
+ end else begin //Something's different? Yes, the IMPORTANT rest (0.0001))
+ //Because the list finally must exactly fit SL, the "SL[i] key" has
+ //to be inserted right here. But first let's look...
+
+ //Maybe it was just moved? So search for it...
+ NewKey := nil;
+ if Assigned(Key) then begin
+ SearchKey_Prev := Key;
+ SearchKey := Key.Next;
+ while Assigned(SearchKey) do begin
+ if SearchKey.Name = SL[i] then begin //we found our moved key
+ SearchKey_Prev.Next := SearchKey.Next; //delete it from <CURRENT>
+ NewKey := SearchKey; //save that we found it
+ Break end;
+ SearchKey_Prev := SearchKey;
+ SearchKey := SearchKey.Next;
+ end;
+ end;
+
+ if not Assigned(NewKey) then begin //if we didn't find it
+ //cK+ No, not found! So it is new...
+ NewKey := TSpyKey.Create(Self, SL[i]);
+ Sisy.IncKeyCount;
+ Sisy.Reg.CurrentKey := AHKEY;
+ { ================ cK+ ================ }
+ if Sisy.Started and Sisy.Reg.KeyExists(SL[i]) then
+ Sisy.AddKeyChange(cKeyPlus, Path + '\' + NewKey.Name);
+
+ SavedDoReport := Sisy.DoReport;
+ if Success(RegOpenKey(AHKEY, PChar(SL[i]), NewHKEY)) then
+ try
+ Sisy.DoReport := False;
+ NewKey.Spy(NewHKEY, Sisy); //<-- recursion itself
+ finally
+ RegCloseKey(NewHKEY);
+ Sisy.DoReport := SavedDoReport;
+ end;
+
+ if Sisy.Terminated then
+ Exit;
+ end;
+
+ //The new key now must be placed after the last key
+ if Assigned(LastKey) then
+ LastKey.Next := NewKey
+ else
+ //If it's the first key, we don't have LastKey defined
+ //So we have to set the "Root" to it
+ Keys := NewKey;
+
+ //Now the rest of <CURRENT> has to be placed after the new key
+ NewKey.Next := Key;
+ //And LastKey also has to refreshed: It is "Key.Pref" = NewKey!
+ LastKey := NewKey;
+ end;
+ end;
+
+ //Because the whole <CURRENT> before Key is exactly <REAL>, the rest
+ //(if there is one) must have been deleted!
+
+ //So first let's ensure that <CURRENT> ends here:
+ if Assigned(LastKey) then
+ LastKey.Next := nil
+ else
+ //Another time: <CURRENT> is empty now, so set Keys instead
+ Keys := nil;
+
+ //Now, the first key that maybe was "cut" off is Key:
+ while Assigned(Key) do begin
+ //cV- So, here really something HAS been deleted
+ LastKey := Key;
+ Key := Key.Next;
+ Sisy.Reg.CurrentKey := AHKEY;
+ { ================ cK- ================ }
+ if Sisy.Started and not Sisy.Reg.KeyExists(LastKey.Name) then
+ Sisy.AddKeyChange(cKeyMinus, Path + '\' + LastKey.Name);
+ LastKey.Free;
+ end;
+ end;
+
+
+begin
+ if Sisy.Terminated or (AHKEY = 0) then
+ Exit;
+ LastKey := Sisy.CurrentSpyKey;
+ Sisy.CurrentSpyKey := Self;
+
+ Sisy.IncKeyIndex;
+
+ SL := TStringList.Create;
+ try
+ Sisy.Reg.CurrentKey := AHKEY;
+ CompareValues;
+ if Sisy.Started then CompareData;
+ CompareKeys;
+ finally
+ Sisy.Reg.CurrentKey := 0;
+ SL.Free;
+ Sisy.CurrentSpyKey := LastKey;
+ end;
+end;
+
+{ TSisyChange }
+
+constructor TSisyChange.Create(ATyp: TSisyChangeType; const APath: string;
+ AOldContext: TRegContext; ANewContext: TRegContext);
+begin
+ inherited Create;
+ Typ := ATyp;
+ Path := APath;
+ Old := AOldContext;
+ New := ANewContext;
+end;
+
+procedure TSisyChange.ReportToPluto;
+var
+ Node, RootNode: TTreeNode;
+ Root, SubPath: string;
+ NewNode: Boolean;
+ i: Integer;
+
+ function IconOfSisyChangeType(Typ: TSisyChangeType): Integer;
+ begin
+ Result := -1;
+ case Typ of
+ //cNone, cError: Result := -1;
+ cKeyPlus..cContextChange: Result := Integer(Typ) - 2;
+ end;
+ end;
+
+ function FindNode(Text: string): TTreeNode;
+ begin
+ Result := WorkWin.SisyTV.Items.GetFirstNode;
+ while Assigned(Result) do begin
+ if SameText(Result.Text, Text) then
+ Exit;
+ Result := Result.GetNextSibling;
+ end;
+ end;
+
+begin
+ if not WorkWin.SisyListCB.Checked then
+ Exit;
+
+ if Typ in [cContextChange, cValueMinus, cValuePlus] then begin
+ Root := ExRegFullKey(Path);
+ SubPath := ExRegValue(Path);
+ end else begin
+ Root := UntilLastChar(ExRegFullKey(Path), '\');
+ SubPath := FromLastChar(ExRegFullKey(Path), '\');
+ end;
+
+ with WorkWin do
+ for i := 0 to SisyFilter.Count-1 do begin
+ if TextAtPos(Root, 1, SisyFilter[i]) then begin
+ //show that it's working
+ with FilterChangesB do begin
+ Caption := 'Filter..!';
+ Repaint;
+ Caption := 'Filter...';
+ Repaint;
+ end;
+ Exit; end;
+ end;
+
+ with WorkWin.SisyTV.Items do begin
+ BeginUpdate;
+ try
+ RootNode := FindNode(Root);
+ NewNode := not Assigned(RootNode);
+ if NewNode then begin
+ RootNode := AddChild(nil, Root);
+ RootNode.ImageIndex := iconGroup;
+ end else if not SisyChangeActivated(RootNode) then begin
+ EndUpdate;
+ Exit end;
+
+ Node := AddChildObject(RootNode, SubPath, Self);
+ Node.ImageIndex := IconOfSisyChangeType(Typ);
+ if Typ = cContextChange then begin
+ AddChild(Node, DataPreviewOfContext(Old)).ImageIndex := iconOldContext;
+ AddChild(Node, DataPreviewOfContext(New)).ImageIndex := iconNewContext;
+ end;
+ finally
+ EndUpdate;
+ end;
+ end;
+
+ if NewNode and WorkWin.SisyExpandGroupsCB.Checked then
+ RootNode.Expand(False);
+
+ if not RootNode.Expanded then
+ RootNode.ImageIndex := iconGroupBlinking;
+end;
+
+{ TSisyList }
+
+function TSisyList.GetSisy(Index: Integer): TSisyThread;
+begin
+ Result := Get(Index);
+end;
+
+procedure TSisyList.PutSisy(Index: Integer; Sisy: TSisyThread);
+begin
+ Put(Index, Sisy);
+end;
+
+procedure TSisyList.Resume;
+var
+ i: Integer;
+begin
+ for i := 0 to Count-1 do
+ Items[i].Resume;
+end;
+
+procedure TSisyList.Suspend;
+var
+ i: Integer;
+begin
+ for i := 0 to Count-1 do
+ Items[i].Resume;
+end;
+
+initialization
+ SisyFilter := TStringList.Create;
+ SisyFilter.Sorted := True;
+ SisyFilter.Duplicates := dupIgnore;
+
+finalization
+ SisyFilter.Free;
+
+end.
+unit splash;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
+ ExtCtrls, StdCtrls, ImgList, YTools, IniFiles, LinkLabel, PrefTools,
+ PlutoConst;
+
+type
+ TSplashWin = class(TForm)
+ Image1: TImage;
+ StartB: TButton;
+ SplashScreenCB: TPrefCheckBox;
+ LinkLabel1: TLinkLabel;
+ LinkLabel2: TLinkLabel;
+ LogoL: TLabel;
+ procedure StartBClick(Sender: TObject);
+ procedure FormShow(Sender: TObject);
+ procedure FormCreate(Sender: TObject);
+ procedure FormHide(Sender: TObject);
+ procedure FormKeyDown(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+ procedure SplashScreenCBClick(Sender: TObject);
+ end;
+
+var
+ SplashWin: TSplashWin;
+
+implementation
+
+uses plutomain, TreeU, WorkU, PrefU;
+
+{$R *.DFM}
+
+procedure TSplashWin.StartBClick(Sender: TObject);
+begin
+ Close;
+end;
+
+procedure TSplashWin.FormShow(Sender: TObject);
+const
+ Messages: array[0..12] of string = ('Let''s see...',
+ 'Ready',
+ 'Hello World!',
+ 'Start',
+ 'OK',
+ 'Pluto!',
+ 'Go Go Go',
+ 'Everything''s OK',
+ 'Yes!',
+ 'God save the Queen',
+ 'Oh yeah',
+ 'Yabadabadoo!',
+ 'Don''t worry, be happy!'
+ );
+var
+ ImageFile: string;
+begin
+ Left := (Screen.Width - Width) div 2;
+ Top := (Screen.Height - Height) div 2;
+
+ StartB.Caption := Messages[Random(Length(Messages))];
+ SplashWin.SplashScreenCB.Load;
+
+ Caption := 'cYcnus.Pluto ' + Version + ' says ' + MainWin.Greeting;
+
+ try
+ ImageFile := PlutoDir + 'logo deluxe.bmp';
+ if FileEx(ImageFile) then begin
+ with Image1.Picture do
+ if Graphic = nil then
+ LoadFromFile(ImageFile);
+ if not Switch('MurphyMode') then
+ LogoL.Visible := False;
+ Exit;
+ end;
+
+ ImageFile := PlutoDir + 'logo.bmp';
+ if FileEx(ImageFile) then begin
+ with Image1.Picture do
+ if Graphic = nil then
+ LoadFromFile(ImageFile);
+ end;
+ except
+ ShowMessage('Could not load Splash Screen image!');
+ end;
+end;
+
+procedure TSplashWin.FormCreate(Sender: TObject);
+begin
+ Hide;
+ Randomize;
+end;
+
+procedure TSplashWin.FormHide(Sender: TObject);
+begin
+ //Image1.Picture.Bitmap.FreeImage;
+end;
+
+procedure TSplashWin.FormKeyDown(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+begin
+ if Key = VK_ESCAPE then
+ Close;
+end;
+
+procedure TSplashWin.SplashScreenCBClick(Sender: TObject);
+begin
+ if Started then
+ PrefWin.SplashScreenCB.Checked := SplashScreenCB.Checked;
+end;
+
+end.
+unit SpyTH;
+
+interface
+
+uses
+ Classes, Windows, Dialogs, ComCtrls, CompEx, SysUtils, YTools, clock,
+ plutoconst, StdCtrls, forms, XReg, stringcomp;
+
+type
+ TChildren = array of TTreeNode;
+
+ TRegSpyThread = class(TThread)
+ private
+ Reg: TXRegistry;
+ CurNode: TTreeNode;
+ Dead: Boolean;
+ Dif: TSLComp;
+ CurChildren: TChildren;
+ protected
+ procedure Execute; override;
+
+ procedure SaveCheckNode;
+ procedure SaveGetDif;
+ procedure SaveDeleteDead;
+ procedure SaveGetChildren;
+ procedure SaveAddNew;
+ public
+ Restart: Boolean;
+ Mess: string;
+ Delay: Integer;
+ function Alive(Node: TTreeNode): Boolean;
+ procedure Spy;
+ procedure Reload(Node: TTreeNode);
+ procedure ReloadValues;
+ procedure AddTrace(Trace: string);
+ constructor CreateIt(PriorityLevel: TThreadPriority);
+ destructor Destroy; override;
+ end;
+
+implementation
+
+uses plutomain, TreeU, WorkU, ValuesU;
+
+{ TRegSpyThread }
+
+constructor TRegSpyThread.CreateIt(PriorityLevel: TThreadPriority);
+begin
+ inherited Create(True); // Create thread suspended
+ Priority := PriorityLevel; // Set Priority Level
+ FreeOnTerminate := False; // Thread frees itself when terminated
+ Reg := TXRegistry.Create;
+ Delay := 100;
+end;
+
+procedure TRegSpyThread.Execute;
+begin
+ while not Terminated do begin
+ Restart := False;
+ try
+ if not Terminated then
+ Sleep(Delay);
+ if not Terminated then
+ Spy;
+ except end;
+ end;
+end;
+
+function TRegSpyThread.Alive(Node: TTreeNode): Boolean;
+begin
+ Result := False;
+
+ if Restart then
+ Exit;
+
+ if Terminated then
+ Exit;
+
+ if Assigned(Node) then
+ try
+ if (Node.Text = '') then
+ Exit;
+
+ if not Assigned(Node) then
+ Exit;
+
+ Result := True;
+ except
+ Exit;
+ end;
+end;
+
+procedure TRegSpyThread.SaveCheckNode;
+begin
+ Dead := not Alive(CurNode);
+ if Dead then
+ Exit;
+
+ CheckNode(CurNode, False);
+end;
+
+procedure TRegSpyThread.SaveGetDif;
+var
+ Real, Cur: TStringList;
+begin
+ Dead := not Alive(CurNode);
+ if Dead then
+ Exit;
+
+ dif := nil;
+
+ if not CurNode.Expanded then begin
+ Dead := True;
+ Exit; end;
+
+ if not OpenNodeOK(Reg, CurNode) then
+ Exit;
+
+ Real := TStringList.Create;
+
+ Reg.GetKeyNames(Real);
+ Reg.CloseKey;
+
+ Cur := GetChildNames(CurNode);
+
+ if (Cur.Count = 0) and (Real.Count = 0) then
+ Dead := True;
+
+ dif := TSLComp.Create(Cur, Real, False);
+
+ Cur.Free;
+ Real.Free;
+end;
+
+procedure TRegSpyThread.SaveDeleteDead;
+var
+ TN: TTreeNode;
+ i: Integer;
+begin
+ Dead := not Alive(CurNode);
+ if Dead then
+ Exit;
+
+ if not Assigned(dif) or not Assigned(dif.OnlyA) then
+ Exit;
+
+ if CurNode.Expanded then
+ for i := 0 to dif.OnlyA.Count-1 do begin
+ TN := FindNode(CurNode, dif.OnlyA[i]);
+ if Assigned(TN) then begin
+ RegTV.Selected := GetNextBest(TN);
+ TN.Delete;
+ AddTrace('Key deleted: ' + dif.OnlyA[i]);
+ end;
+ end
+ else
+ Exit;
+end;
+
+procedure TRegSpyThread.SaveGetChildren;
+var
+ i: Integer;
+ TN: TTreeNode;
+begin
+ Dead := not Alive(CurNode);
+ if Dead then
+ Exit;
+
+ CurChildren := nil;
+ SetLength(CurChildren, CurNode.Count);
+
+ i := 0;
+ TN := CurNode.GetFirstChild;
+ while Assigned(TN) do begin
+ if i <= High(CurChildren) then
+ CurChildren[i] := TN
+ else
+ ShowMessage('Error: Too much children');
+ Inc(i);
+ TN := CurNode.GetNextChild(TN)
+ end;
+end;
+
+procedure TRegSpyThread.SaveAddNew;
+var
+ i: Integer;
+begin
+ Dead := not Alive(CurNode);
+ if Dead then
+ Exit;
+
+ if not Assigned(Dif) or not Assigned(Dif.OnlyB) or (Dif.OnlyB.Count = 0) then
+ Exit;
+
+ for i := 0 to Dif.OnlyB.Count-1 do begin //Erstellt/hinbenannt
+ RegTV.Items.AddChild(CurNode, Dif.OnlyB[i]);
+ AddTrace('New Key: ' + dif.OnlyB[i]);
+ MainWin.StatusBarUpdate;
+ //AddHint('Neuer Schlüssel: ' + CurNode.Text + '\' + Dif.OnlyB[i]);
+ end;
+end;
+
+procedure TRegSpyThread.Reload(Node: TTreeNode);
+var
+ i: Integer;
+ TN: TTreeNode;
+ zCurNode: TTreeNode;
+ MyChildren: TChildren;
+begin
+ if Terminated or Restart then
+ Exit;
+
+ CurNode := Node;
+
+ zCurNode := CurNode;
+ try
+ //Mess := 'SaveCheckNode';
+ Synchronize(SaveCheckNode);
+ if Dead or Terminated then
+ Exit;
+
+ //Mess := 'SaveGetDif';
+ Synchronize(SaveGetDif);
+ if Dead or Terminated then
+ Exit;
+
+ //Mess := 'SaveDeleteDead';
+ Synchronize(SaveDeleteDead);
+ if Dead or Terminated then
+ Exit;
+
+ //Mess := 'SaveGetChildren';
+ Synchronize(SaveGetChildren);
+ if Dead or Terminated then
+ Exit;
+
+ //Mess := 'SaveGetChildren';
+ Synchronize(SaveAddNew);
+ if Dead or Terminated then
+ Exit;
+
+ Dif.Free;
+
+ //Mess := 'MyChildren';
+ SetLength(MyChildren, Length(CurChildren));
+ for i := 0 to High(MyChildren) do
+ MyChildren[i] := CurChildren[i];
+
+ for i := 0 to High(MyChildren) do begin
+ TN := MyChildren[i];
+ if Alive(TN) then
+ //if TN.Expanded then
+ //if NodeVisible(TN) then
+ Reload(TN);
+ //else
+ //Break;
+ if Restart or Terminated then
+ Break;
+ end;
+ MyChildren := nil;
+
+ except
+ if Terminated then
+ Exit;
+ AddHint('Error in Spy: ' + Mess);
+ WorkWin.Label7.Caption := 'ERROR';
+ end;
+ CurNode := zCurNode;
+end;
+
+function FindItemByRealName(LV: TListView; Text: string): TListItem;
+var
+ i: Integer;
+begin
+ Result := nil;
+ for i := 0 to LV.Items.Count-1 do
+ if LV.Items[i].Caption = Text then begin
+ Result := LV.Items[i];
+ Exit; end;
+ for i := 0 to LV.Items.Count-1 do
+ if SameText(RealValueName(LV.Items[i]), Text) then begin
+ Result := LV.Items[i];
+ Break; end;
+end;
+
+procedure TRegSpyThread.ReloadValues;
+var
+ Item: TListItem;
+ Real, Cur: TStringList;
+ Dif: TSLComp;
+ i: integer;
+begin
+ if Terminated or Restart then
+ Exit;
+
+ if not OpenNodeOK(Reg, RegTV.Selected) then
+ Exit;
+
+ Real := TStringList.Create;
+ Reg.GetValueNames(Real);
+
+ Cur := TStringList.Create;
+ with ValueList.Items do
+ for i := 0 to Count-1 do
+ Cur.Add(RealValueName(Item[i]));
+
+ Dif := TSLComp.Create(Cur, Real, False);
+ Real.Free;
+ Cur.Free;
+
+ for i := 0 to Dif.OnlyA.Count-1 do begin //Gelöscht/wegbenannt
+ Item := FindItemByRealName(ValueList, Dif.OnlyA[i]);
+ if Assigned(Item) then begin
+ Item.Delete;
+ AddTrace('Value deleted: ' + Dif.OnlyA[i]);
+ end;
+ end;
+
+ for i := 0 to ValueList.Items.Count-1 do begin //Daten
+ Item := ValueList.Items[i];
+ {if Item.SubItems.Count < 2 then begin
+ ShowMessage('Fehler in Sync.');
+ Exit end; }
+ if ValuesWin.UpdateValue(Reg, Item) then
+ AddTrace('Value Changed: ' + Item.Caption + ' = ' +
+ ValueDataPreview(Reg.ReadContext(RealValueName(Item))));
+ end;
+
+ for i := 0 to dif.OnlyB.Count-1 do begin //Erstellt/hinbenannt
+ ValuesWin.AddValue(Reg, dif.OnlyB[i]);
+ AddTrace('New Value: ' + Dif.OnlyB[i]);
+ end;
+
+ Reg.CloseKey;
+ Dif.Free;
+end;
+
+procedure TRegSpyThread.Spy;
+var
+ i: Integer;
+ a: Real;
+begin
+ with TClock.Create do begin
+ for i := 0 to RootNodes.Count-1 do
+ Reload(TTreeNode(RootNodes[i]));
+ for i := 0 to High(Shortcuts) do
+ Reload(Shortcuts[i].Node);
+ Synchronize(ReloadValues);
+ a := SecondsPassed * 1000;
+ Free; end;
+
+ if a > 0 then
+ WorkWin.Label7.Caption := 'Spy: ' + Format('%0.2f', [a]) + ' s';
+end;
+
+procedure TRegSpyThread.AddTrace(Trace: string);
+begin
+ with WorkWin do
+ if ListTracesCB.Checked then
+ SpyLB.Items.Add(Trace);
+end;
+
+destructor TRegSpyThread.Destroy;
+begin
+ Dif.Free;
+ Reg.Free;
+ inherited;
+end;
+
+end.
+unit TreeU;
+{$DEFINE UNIKEY}
+{$DEFINE CYCFS}
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ ComCtrls, Menus, Clipbrd, keybrd, Dialogs, YTools, PlutoConst, CompEx,
+ IniFiles, XReg, Colors, Clock,
+ ToolWin, RegFiles {$IFDEF UNIKEY}, UniKey, ImgList {$ENDIF};
+
+type
+ TTreeWin = class(TForm)
+ RegTVPU: TPopupMenu;
+ NewSubKeyMI: TMenuItem;
+ NewKeyMI: TMenuItem;
+ CreateShortcutMI: TMenuItem;
+ TraceMI: TMenuItem;
+ N3: TMenuItem;
+ DeleteMI: TMenuItem;
+ DublicateMI: TMenuItem;
+ N4: TMenuItem;
+ FindMI: TMenuItem;
+ RegTV: TTreeView;
+ PastePathMI: TMenuItem;
+ N1: TMenuItem;
+ InsertPathMI: TMenuItem;
+ RenameMI: TMenuItem;
+ CopyPathMI: TMenuItem;
+ CutPathMI: TMenuItem;
+ EditShortcutMI: TMenuItem;
+ N2: TMenuItem;
+ Export1: TMenuItem;
+ SubKeylist1: TMenuItem;
+ ValueNameslist1: TMenuItem;
+ KeyInfosMI: TMenuItem;
+ N5: TMenuItem;
+ ExportAsReg: TMenuItem;
+ ExportD: TSaveDialog;
+ procedure FormCreate(Sender: TObject);
+ procedure RegTVClick(Sender: TObject);
+ procedure RegTVChange(Sender: TObject; Node: TTreeNode);
+ procedure RegTVChanging(Sender: TObject; Node: TTreeNode; var AllowChange: Boolean);
+ procedure RegTVCollapsing(Sender: TObject; Node: TTreeNode; var AllowCollapse: Boolean);
+ procedure RegTVCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
+ procedure RegTVDblClick(Sender: TObject);
+ procedure RegTVDeletion(Sender: TObject; Node: TTreeNode);
+ procedure RegTVDragDrop(Sender, Source: TObject; X, Y: Integer);
+ procedure RegTVDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
+ procedure RegTVEdited(Sender: TObject; Node: TTreeNode; var S: String);
+ procedure RegTVEditing(Sender: TObject; Node: TTreeNode; var AllowEdit: Boolean);
+ procedure RegTVEndDrag(Sender, Target: TObject; X, Y: Integer);
+ procedure RegTVEnter(Sender: TObject);
+ procedure RegTVExpanded(Sender: TObject; Node: TTreeNode);
+ procedure RegTVExpanding(Sender: TObject; Node: TTreeNode; var AllowExpansion: Boolean);
+ procedure RegTVGetSelectedIndex(Sender: TObject; Node: TTreeNode);
+ procedure RegTVKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
+ procedure RegTVMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
+ procedure RegTVStartDrag(Sender: TObject; var DragObject: TDragObject);
+
+ function CreateKey(Subkey: Boolean): Boolean;
+ procedure CloneKey;
+ procedure DeleteKey;
+ procedure NewShortcut;
+ procedure MoveKey(const Src, Trg: TRegPath; CopyWanted: Boolean);
+ procedure MoveValues(SrcNode, TrgNode: TTreeNode; CopyWanted: Boolean);
+
+ procedure NewSubKeyMIClick(Sender: TObject);
+ procedure NewKeyMIClick(Sender: TObject);
+ procedure CreateShortcutMIClick(Sender: TObject);
+ procedure TraceMIClick(Sender: TObject);
+ procedure DeleteMIClick(Sender: TObject);
+ procedure DublicateMIClick(Sender: TObject);
+ procedure FindMIClick(Sender: TObject);
+ procedure RegTVPUPopup(Sender: TObject);
+ procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
+ procedure RegTVKeyPress(Sender: TObject; var Key: Char);
+ procedure RegTVAdvancedCustomDrawItem(Sender: TCustomTreeView;
+ Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage;
+ var PaintImages, DefaultDraw: Boolean);
+ procedure RenameMIClick(Sender: TObject);
+ procedure CopyPathMIClick(Sender: TObject);
+ procedure InsertPathMIClick(Sender: TObject);
+ procedure RegTVGetImageIndex(Sender: TObject; Node: TTreeNode);
+ procedure CheckRegTVHotTrack;
+ procedure PasteKeyMIClick(Sender: TObject);
+ procedure CutPathMIClick(Sender: TObject);
+
+ procedure OpenNextLevel(Node: TTreeNode);
+ procedure EditShortcutMIClick(Sender: TObject);
+ procedure SubKeylist1Click(Sender: TObject);
+ procedure ValueNameslist1Click(Sender: TObject);
+ procedure KeyInfosMIClick(Sender: TObject);
+ function GetKeyInfos: string;
+ procedure ExportAsRegClick(Sender: TObject);
+ procedure FormClose(Sender: TObject; var Action: TCloseAction);
+
+ procedure Load;
+ procedure Reg4WriterTerminate(Sender: TObject);
+ private
+ DragNode: TTreeNode;
+ NoAsterisk: Boolean; //To prevent NumPadMULTIPLY and asterisk errors
+ UserCopyKeyFlag: Boolean;
+ SpaceCount: Integer; //EasterEgg
+ public
+ CantWrite: Boolean;
+ DoSmartExpand: Boolean;
+ end;
+
+procedure CheckNode(Node: TTreeNode; OnlyOnce: Boolean = True;
+ TakeNodeSelected: Boolean = False);
+
+function AddShortcut(Alias, RealPath: string; Icon: Integer;
+ AHostType: TUniHostType = uhUserShortcut; WriteIni: Boolean = False): TTreeNode;
+function ShortcutIndex(Node: TTreeNode): Integer;
+
+function TraceKey(const Path: string; AllowedShortcutTypes: TUniHostTypes =
+ uhNonSystemShortcuts): string;
+
+type
+ TOpenNodeMode = (onNodeNil, onError, onReadOnly, onFull);
+
+const
+ onOK = [onFull, onReadOnly];
+
+function OpenNode(Reg: TXRegistry; Node: TTreeNode): TOpenNodeMode;
+function OpenNodeOK(Reg: TXRegistry; Node: TTreeNode): Boolean;
+function OpenCurKey: Boolean;
+function OpenCurParent: Boolean;
+
+var
+ TreeWin: TTreeWin;
+
+ RegTV: TTreeView; //Shortcut for other units, equals TreeWin.RegTV
+
+{$IFDEF UNIKEY}
+ UserUniPath: string {$IFDEF CYCFS} = 'cYcFS <y:\programme\cYcFS\test>'{$ENDIF};
+{$ENDIF}
+ Shortcuts: TShortcutA;
+ RootNodes: TList; //list of TTreeNode;
+
+implementation
+
+uses
+ PlutoMain, ValuesU, FindWinU, WorkU, PrefU, ShellEx, Types;
+
+{$R *.dfm}
+
+{$IFDEF UNIKEY}
+function UniOfNode(Node: TTreeNode): TUniKey;
+var
+ UniPath: TUniPath;
+begin
+ UniPath := UniOfStr(UserUniPath);
+ UniPath.Path := Join(Copy(NodePath(Node), 1, MaxInt), '/');
+ Result := TUniKey.CreateU(UniPath, reTryToSolve);
+end;
+{$ENDIF}
+
+procedure TTreeWin.FormCreate(Sender: TObject);
+begin
+ TreeU.RegTV := RegTV;
+
+ DragNode := nil;
+ NoAsterisk := False;
+ DoSmartExpand := True;
+ UserCopyKeyFlag := True;
+ SpaceCount := 0; //EasterEgg
+
+ RegTV.Items.Clear;
+ CheckRegTVHotTrack;
+
+ KeyInfosMI.ImageIndex := iconKeyInfos;
+
+ NewSubKeyMI.ImageIndex := iconSubKey;
+ NewKeyMI.ImageIndex := iconKey;
+ CreateShortcutMI.ImageIndex := iconShortcut;
+
+ RenameMI.ImageIndex := iconRename;
+ DeleteMI.ImageIndex := iconDelete;
+ DublicateMI.ImageIndex := iconKeyDublicate;
+
+ FindMI.ImageIndex := iconKeyFind;
+ TraceMI.ImageIndex := iconKeyTrace;
+end;
+
+procedure TTreeWin.RegTVClick(Sender: TObject);
+begin
+ if KeyIsDown(VK_CONTROL) then begin
+ TraceMIClick(Sender);
+ Exit; end;
+end;
+
+procedure TTreeWin.RegTVChange(Sender: TObject; Node: TTreeNode);
+var
+ Reg: TXRegistry;
+ OpenRe: TOpenNodeMode;
+
+{$IFDEF UNIKEY}
+ Uni: TUniKey;
+ ValueNames: TStringList;
+ Item: TListItem;
+ i: Integer;
+
+ procedure AppendSubItemData(SubItems: TStrings; Uni: TUniKey;
+ const ValueName: string);
+ var
+ SL: TStringList;
+
+ procedure Add(const s: string);
+ begin
+ SubItems.Append(s);
+ end;
+
+ begin
+ SL := nil;
+ try
+ Add('beta');
+
+ case Uni.GetDataType(ValueName) of
+
+ udString, udExpandString: begin
+ Add('String');
+ Add(Uni.ReadString(ValueName));
+ end;
+
+ udCardinal, udCardBigEndian, udInteger: begin
+ Add('Numeric');
+ Add(IntToStr(Uni.ReadInteger(ValueName)));
+ end;
+
+ udBinary, udNone: begin
+ Add('Binary');
+ Add(FriendlyStr(Uni.ReadBinary(ValueName)));
+ end;
+
+ udBoolean: begin
+ Add('Boolean');
+ Add(StrOfBool(Uni.ReadBool(ValueName)));
+ end;
+
+ udStringList: begin
+ Add('List');
+ if not Assigned(SL) then
+ SL := TStringList.Create
+ else
+ SL.Clear;
+ Uni.ReadStringList(ValueName, SL);
+ Add(Join(SL, MultiStringSeparator));
+ end;
+
+ udColor: begin
+ Add('Color');
+ Add(ColorToString(Uni.ReadColor(ValueName)));
+ end;
+
+ else
+ Add('Unsupported Data Type: ' +
+ IntToStr(Cardinal(Uni.GetDataType(ValueName))));
+ end; //case
+
+ finally
+ SL.Free;
+ end;
+ end;
+
+
+{$ENDIF}
+
+begin
+ SpaceCount := 0; //Easteregg
+
+ CheckNode(Node, False);
+ CantWrite := False;
+
+ try
+ SpyThread.Suspend;
+ Reg := TXRegistry.Create;
+ try
+
+{$IFDEF UNIKEY}
+ if RootOfNode(Node).ImageIndex = iconHostUni then begin
+ ValueNames := TStringList.Create;
+ ValueList.Clear;
+
+ Uni := UniOfNode(Node);
+ {Uni := CreateUniSubKey(UserUniPath, Copy(NodePath(Node), 1, MaxInt),
+ reFaile); }
+ if Assigned(Uni) then
+ try
+ Uni.GetValueNames(ValueNames);
+
+ for i := 0 to ValueNames.Count-1 do begin
+ Item := ValuesWin.AddValue(Reg, ValueNames[i], False);
+ Item.ImageIndex := iconHostUni2;
+ AppendSubItemData(Item.SubItems, Uni, ValueNames[i]);
+ end;
+
+ finally
+ Uni.Free;
+ ValueNames.Free;
+ end;
+
+ end else begin
+{$ENDIF}
+
+ OpenRe := OpenNode(Reg, Node);
+ if OpenRe in onOK then begin
+ ValuesWin.LoadValues(Reg);
+ if OpenRe = onReadOnly then begin
+ AddHint('Read only', True);
+ CantWrite := True;
+ end;
+ end else if OpenRe = onError then begin
+ ValueList.Clear;
+ CantWrite := True;
+ if Node.Level = 0 then begin
+ AddHint('Shortcut target not found', True);
+ end else
+ AddHint('Key not found: ' + Node.Text, True);
+ end;
+
+{$IFDEF UNIKEY}
+ end;
+{$ENDIF}
+
+ finally
+ Reg.Free;
+ end;
+
+ CantWrite := CantWrite or not Assigned(Node)
+ or NodeInfo( Node ).ReadOnly //Node itself
+ or NodeInfo(RootOfNode(Node)).ReadOnly //or host
+ or (SameText(CurKey(uhNonSystemShortcuts).Root, 'HKEY_DYN_DATA'));
+
+ MainWin.SetStatus;
+ WorkWin.InfoMemo.Text := GetKeyInfos;
+ finally
+ SpyThread.Restart := True;
+ SpyThread.Resume;
+ end;
+end;
+
+procedure TTreeWin.RegTVChanging(Sender: TObject; Node: TTreeNode;
+ var AllowChange: Boolean);
+begin
+ CantWrite := False;
+ AllowChange := Assigned(Node);
+ // CheckNode(Node, True);
+end;
+
+procedure TTreeWin.RegTVCollapsing(Sender: TObject; Node: TTreeNode;
+ var AllowCollapse: Boolean);
+begin
+ SpyThread.Restart := True;
+ Node.DeleteChildren;
+ RegTVChange(Sender, Node);
+end;
+
+procedure TTreeWin.RegTVCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode;
+ State: TCustomDrawState; var DefaultDraw: Boolean);
+var
+ Info: TNodeInfo;
+begin
+ {if Node.Text = '' then begin
+ ShowMessage('Error: Key has empty name.');
+ Node.Delete;
+ Exit; end;}
+
+ Info := NodeInfo(Node);
+ with TTreeView(Sender).Canvas.Font do begin
+ if Info.Defect then begin
+ Style := [];
+ Color := $AAAAAA
+ end else begin
+ case Info.HostType of
+
+ uhReg: begin
+ Style := [fsBold];
+ Color := clCyan;
+ end;
+
+ {uhIni: begin
+ Style := [fsBold];
+ Color := clBrightYellow;
+ end;
+
+ uhRegFile: begin
+ Style := [fsBold];
+ Color := clBrightGreen;
+ end; }
+
+ uhSystemShortcut: begin
+ Style := [];
+ Color := clBrightCyan;
+ end;
+
+ uhStandardShortcut: begin
+ Style := [fsBold];
+ Color := $EEEEEE;
+ end;
+
+ uhUserShortcut: begin
+ Style := [];
+ Color := $EEEEEE;
+ end;
+
+ else
+ Style := [];
+ if Info.ReadOnly then
+ Color := clBrightRed
+ else
+ Color := clWhite;
+ end;
+
+ end;
+ end;
+end;
+
+procedure TTreeWin.RegTVDblClick(Sender: TObject);
+var
+ Node: TTreeNode;
+ MouseX: Integer;
+ NodeRect: TRect;
+begin
+ Node := RegTV.Selected;
+ if not Assigned(Node) then
+ Exit;
+
+ MouseX := RegTV.ScreenToClient(Mouse.CursorPos).X;
+ NodeRect := Node.DisplayRect(True);
+ if MouseX > NodeRect.Right then begin
+ with ValuesWin do begin
+ FocusItem(PrefWin.MainPreviewE.Text);
+ ValueListDblClick(Self);
+ end;
+ end;
+end;
+
+procedure TTreeWin.RegTVDeletion(Sender: TObject; Node: TTreeNode);
+begin
+ if Assigned(SpyThread) then
+ SpyThread.Restart := True;
+ if Node.Selected then
+ RegTV.Selected := GetNextBest(Node);
+ NodeInfo(Node).Free;
+end;
+
+procedure TTreeWin.RegTVDragDrop(Sender, Source: TObject; X, Y: Integer);
+
+ procedure DragKey;
+ var
+ Src, Trg: TRegPath;
+ Node: TTreeNode;
+ begin
+ Src := RegPathOfStr(TraceKey(PathOfNode(DragNode)));
+ Trg := RegPathOfStr(TraceKey(PathOfNode(RegTV.DropTarget)));
+ Trg.Key := Trg.Key + '\' + DragNode.Text;
+
+ MoveKey(Src, Trg, KeyIsDown(VK_CONTROL));
+
+ Node := RegTV.DropTarget;
+ if Node.Expanded then
+ Node.Collapse(False);
+ Node.Expanded := False;
+ CheckNode(Node, False, True);
+ Node.Expand(False);
+ end;
+
+ procedure DragValues;
+ begin
+ MoveValues(RegTV.Selected, RegTV.DropTarget, KeyIsDown(VK_CONTROL));
+ end;
+
+begin
+ if Source is TTreeView then
+ DragKey
+ else if Source is TListView then
+ DragValues;
+end;
+
+procedure TTreeWin.RegTVDragOver(Sender, Source: TObject; X, Y: Integer;
+ State: TDragState; var Accept: Boolean);
+begin
+ Accept := False;
+ if not Assigned(RegTV.DropTarget) then
+ Exit;
+
+ if Source is TTreeView then begin
+ if not Assigned(DragNode) then
+ Exit;
+ if not KeyIsDown(VK_CONTROL) then begin
+ if (DragNode = RegTV.DropTarget)
+ or RegTV.DropTarget.HasAsParent(DragNode) then
+ Exit; //avoid recursive moving
+ end;
+ end else if Source is TListView then begin
+ //accept
+ end;
+ Accept := True;
+end;
+
+procedure TTreeWin.RegTVEdited(Sender: TObject; Node: TTreeNode; var S: string);
+var
+ old, tmp: string;
+ i: Integer;
+ Shortcut: PKeyShortcut;
+begin
+ if s = Node.Text then
+ Exit;
+
+ Old := Node.Text;
+
+ if NodeInfo(Node).HostType = uhUserShortcut then begin
+ i := ShortcutIndex(Node);
+ if i = -1 then begin
+ ShowMessage('Shortcut not found!');
+ s := old;
+ Exit; end;
+
+ Shortcut := @Shortcuts[i];
+ Shortcut.Alias := s;
+
+ with TIniFile.Create(PlutoDir + 'Shortcuts.ini') do
+ try
+ DeleteKey('Shortcuts', Old);
+ WriteString('Shortcuts', Shortcut.Alias, Shortcut.RealPath);
+ finally
+ Free;
+ end;
+ Node.Text := s;
+ RegTVChange(Self, Node);
+ Exit; end;
+
+ if s = '' then begin
+ ShowMessage('KeyNames cannot be empty.');
+ s := old;
+ Exit; end;
+
+ SpyThread.Suspend;
+ SpyThread.Restart := True;
+ Node.Text := s;
+
+ if Length(s) > RegMaxKeyLen then begin
+ s := Copy(s, 1, RegMaxKeyLen);
+ if MessageDlg(
+ 'The maximum size of a key name is ' + IntToStr(RegMaxKeyLen) + ' characters.' + EOL +
+ 'Shorten the key name to:' + EOL +
+ Quote(StringWrap(s, 80)),
+ mtConfirmation, [mbOK, mbCancel], 0) <> mrOK then begin
+ s := Old;
+ SpyThread.Resume;
+ Exit;
+ end;
+ end;
+
+ if CharIn(s, [#0..#31, '\']) then begin
+ s := ReplaceChars(s, [#0..#31], '#');
+ s := ReplaceChars(s, '\', '-');
+
+ if MessageDlg('The following characters are not allowed in KeyNames:' + EOL +
+ '- Control chars (0-31)' + EOL +
+ '- ' + Quote('\') + EOL +
+ 'The following name is allowed:' + EOL +
+ s + EOL +
+ 'Use this name instead?',
+ mtConfirmation, [mbYes, mbNo], 0) <> mrYes then begin
+ s := Old;
+ SpyThread.Resume;
+ Exit;
+ end;
+ end;
+
+ try
+ OpenCurParent;
+ if not SameText(s, Old) then begin
+ if not MainReg.KeyExists(s) or
+ (mrIgnore = MessageDlg(
+ 'Key already exists.' + EOL +
+ 'Click Ignore to overwrite the key.',
+ mtConfirmation, [mbCancel, mbIgnore], 0)
+ ) then begin
+ MainReg.DeleteKey(s);
+ MainReg.MoveKey(Old, s, True);
+ Node.Text := Old;
+ end else begin
+ s := Old;
+ end;
+ end else begin //change CharCase
+ tmp := MainReg.GetFreeKeyName;
+ AddHint('Forced change of case using temporary key ' + Quote(tmp));
+ MainReg.MoveKey(Old, tmp, True);
+ MainReg.MoveKey(tmp, s, True);
+ end;
+ finally
+ MainReg.CloseKey;
+ end;
+
+ Node.Text := s;
+ SpyThread.Resume;
+ RegTVChange(Sender, Node);
+end;
+
+procedure TTreeWin.RegTVEditing(Sender: TObject; Node: TTreeNode;
+ var AllowEdit: Boolean);
+begin
+ CheckNode(Node, False);
+ if RegTV.Selected <> Node then
+ Exit;
+ AllowEdit := (NodeInfo(Node).HostType in [uhNone, uhUserShortcut])
+ and (not CantWrite)
+ and OpenCurKey;
+ MainReg.CloseKey;
+end;
+
+procedure TTreeWin.RegTVEndDrag(Sender, Target: TObject; X, Y: Integer);
+begin
+ DragNode := nil;
+end;
+
+procedure TTreeWin.RegTVEnter(Sender: TObject);
+begin
+ if not Started then
+ Exit;
+ ValueList.ItemFocused := nil;
+ MainWin.SetStatus;
+end;
+
+procedure TTreeWin.RegTVExpanded(Sender: TObject; Node: TTreeNode);
+begin
+ if not DoSmartExpand or not PrefWin.SmartExpandCB.Checked then
+ Exit;
+
+ if not Assigned(Node) then
+ Exit;
+
+ RegTVChange(Sender, Node);
+
+ //SmartExpand
+ if (Node.Count > 0) and (ValueList.Items.Count = 0) then begin
+ RegTV.Selected := Node.GetFirstChild;
+ RegTVChange(Sender, RegTV.Selected);
+ end;
+
+ if Node.Count = 1 then
+ Node.GetFirstChild.Expand(False);
+end;
+
+procedure TTreeWin.RegTVExpanding(Sender: TObject; Node: TTreeNode;
+ var AllowExpansion: Boolean);
+var
+ SL: TStringList;
+ Reg: TXRegistry;
+ Clock: TClock;
+{$IFDEF UNIKEY}
+ Uni: TUniKey;
+{$ENDIF}
+
+ procedure AddKeys(TreeView: TTreeView; Node: TTreeNode; SL: TStrings);
+ var
+ i: Integer;
+ begin
+ for i := 0 to SL.Count-1 do
+ TreeView.Items.AddNode(TTreeNode.Create(TreeView.Items), Node, SL[i],
+ nil, naAddChild);
+ end;
+
+ procedure AddKeysProgressive(TreeView: TTreeView; Node: TTreeNode;
+ SL: TStrings);
+ var
+ i, delta: Integer;
+ GaugeRect, FullRect: TRect;
+ GaugeWidth: Integer;
+ begin
+ delta := SL.Count div 100;
+ GaugeWidth := 100;
+ with TreeView.Canvas do begin
+ FullRect := Node.DisplayRect(True);
+ with FullRect do begin
+ Left := Right + 40;
+ Right := Left + GaugeWidth + 2;
+ Inc(Top, 5);
+ Dec(Bottom, 5);
+ end;
+ with Pen do begin
+ Width := 1;
+ Style := psSolid;
+ end;
+ Pen.Color := clBrightBlue;
+ Brush.Style := bsClear;
+ Rectangle(FullRect);
+ Pen.Style := psClear;
+ end;
+
+ GaugeRect := FullRect;
+ with GaugeRect do begin
+ Inc(Left);
+ Inc(Top);
+ Dec(Bottom);
+ end;
+
+ for i := 0 to SL.Count-1 do begin
+ TreeView.Items.AddNode(TTreeNode.Create(TreeView.Items), Node, SL[i],
+ nil, naAddChild);
+
+ if ((i + 1) mod delta) = 0 then begin
+ with TreeView.Canvas do begin
+ GaugeRect.Right := GaugeRect.Left + (GaugeWidth * i) div SL.Count;
+ Brush.Color := GadientAqua(90 + Round(100 * ((i+1) / SL.Count)));
+ FillRect(GaugeRect);
+ end;
+ end;
+ end;
+
+ with TreeView.Canvas do begin
+ Pen.Color := clVeryBrightBlue;
+ Pen.Style := psSolid;
+ Brush.Color := GadientAqua(200);
+ Rectangle(FullRect);
+ Brush.Style := bsClear;
+ end;
+ end;
+
+begin
+ if Node.Expanded then
+ Exit;
+
+ SpyThread.Suspend;
+ SL := TStringList.Create;
+ Clock := TClock.Create;
+
+ try
+
+{$IFDEF UNIKEY}
+ if RootOfNode(Node).ImageIndex = iconHostUni then begin
+ Uni := UniOfNode(Node);
+ if Assigned(Uni) then
+ try
+ Uni.GetKeyNames(SL);
+ finally
+ Uni.Free;
+ end;
+
+ end else begin
+{$ENDIF}
+
+ Reg := TXRegistry.Create;
+ try
+ if OpenNodeOK(Reg, Node) then
+ Reg.GetKeyNames(SL);
+ finally
+ Reg.Free;
+ end;
+
+{$IFDEF UNIKEY}
+ end;
+{$ENDIF}
+
+ Node.DeleteChildren;
+ if PrefWin.ShowProgressCB.Checked and (SL.Count > 100) then
+ AddKeysProgressive(RegTV, Node, SL)
+ else
+ AddKeys(RegTV, Node, SL);
+
+ if PrefWin.SortKeysCB.Checked then
+ Node.AlphaSort;
+
+ if MurphyMode then begin
+ Clock.Stop;
+ AddHint(Format('[MM] Key opened after %0.2f s.', [Clock.SecondsPassed]));
+ end;
+ finally
+ Clock.Free;
+ SL.Free;
+ SpyThread.Resume;
+ end;
+end;
+
+procedure TTreeWin.RegTVGetSelectedIndex(Sender: TObject; Node: TTreeNode);
+begin
+ Node.SelectedIndex := Node.ImageIndex;
+end;
+
+procedure TTreeWin.RegTVKeyDown(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+var
+ Node: TTreeNode;
+begin
+ if Key = VK_SCROLL then
+ CheckRegTVHotTrack;
+
+ if RegTV.IsEditing then
+ Exit;
+
+ Node := RegTV.Selected;
+ if not Assigned(Node) then
+ Exit;
+
+ if ssShift in Shift then
+ case Key of
+ VK_DOWN: begin
+ Node := Node.GetNextSibling;
+ if Assigned(Node) then
+ RegTV.Selected := Node;
+ Key := 0; end;
+
+ VK_UP: begin
+ Node := Node.GetPrevSibling;
+ if Assigned(Node) then
+ RegTV.Selected := Node;
+ Key := 0; end;
+
+ VK_RIGHT: Key := VK_MULTIPLY;
+ VK_LEFT: Key := VK_DIVIDE;
+ end;
+
+ if Assigned(Node.Parent) then begin
+ case Key of
+ VK_END:
+ begin
+ RegTV.Selected := Node.Parent.GetLastChild;
+ Key := 0; end;
+
+ VK_HOME:
+ begin
+ RegTV.Selected := Node.Parent.GetFirstChild;
+ Key := 0; end;
+ end;
+ end;
+
+ case Key of
+ 0: Exit;
+ VK_RETURN: ValuesWin.FocusControl(ValueList);
+ VK_DELETE: DeleteMIClick(Sender);
+ VK_SPACE: begin
+ JumpToSel(RegTV);
+ Inc(SpaceCount);
+ if SpaceCount > 10 then begin
+ ShowMessage('YES!');
+ SpaceCount := 0;
+ end;
+ end;
+ VK_F9: SwapFonts(RegTV);
+
+ VK_F12:
+ if ssShift in Shift then begin
+ if Assigned(Node.Parent) then Node.Parent.AlphaSort;
+ end else
+ if Node.Expanded then Node.AlphaSort;
+
+ VK_LEFT, VK_SUBTRACT:
+ begin
+ if Node.Expanded then
+ Node.Collapse(False)
+ else if Assigned(Node.Parent) then
+ RegTV.Selected := Node.Parent;
+ Key := 0; end;
+
+ VK_RIGHT, VK_ADD:
+ begin
+ if not Node.HasChildren then
+ TreeWin.RegTV.Items.AddChild(Node, '');
+ if Node.Expanded then
+ RegTV.Selected := Node.GetFirstChild
+ else
+ Node.Expand(False);
+ Key := 0; end;
+
+ VK_MULTIPLY:
+ begin
+ NoAsterisk := True;
+ OpenNextLevel(Node);
+ JumpToSel(RegTV);
+ AddHint('Press the Multiply Key again to open the next level.');
+ Key := 0; end;
+
+ VK_DIVIDE:
+ begin
+ DoSmartExpand := False;
+ Node.Collapse(true);
+ DoSmartExpand := True;
+ Key := 0; end;
+ end;
+
+ if ssctrl in Shift then
+ case Key of
+ Ord('C'): CopyPathMIClick(Sender);
+ Ord('X'): CutPathMIClick(Sender);
+ Ord('V'): PasteKeyMIClick(Sender);
+ end;
+end;
+
+procedure TTreeWin.RegTVMouseDown(Sender: TObject; Button: TMouseButton;
+ Shift: TShiftState; X, Y: Integer);
+var
+ Node: TTreeNode;
+ RelX, RelY: Integer;
+ NodeRect: TRect;
+begin
+ CheckRegTVHotTrack;
+
+ if not Active then
+ Exit;
+
+ RelX := RegTV.ScreenToClient(Mouse.CursorPos).X;
+ RelY := RegTV.ScreenToClient(Mouse.CursorPos).Y;
+ Node := RegTV.GetNodeAt(RelX, RelY);
+ if not Assigned(Node) then
+ Exit;
+
+ if not Node.Selected then
+ Node.Selected := True;
+
+ if Button = mbLeft then begin
+ NodeRect := RegTV.Selected.DisplayRect(True);
+ if RegTV.HotTrack
+ or (RelX < NodeRect.Left) and (RelX > NodeRect.Left - 20) then begin
+ //4px more to the left (friendlier for the user)
+ if not Node.HasChildren then
+ RegTV.Items.AddChild(Node, '');
+ DoSmartExpand := False;
+ with Node do
+ if not Expanded then
+ Expand(False)
+ else
+ Collapse(False);
+ DoSmartExpand := True;
+ end;
+ end;
+end;
+
+procedure TTreeWin.RegTVStartDrag(Sender: TObject; var DragObject: TDragObject);
+begin
+ DragNode := RegTV.Selected;
+ if NodeInfo(DragNode).IsHost then
+ DragNode := nil;
+end;
+
+function OpenNodeError(Reg: TXRegistry; Node: TTreeNode;
+ out Mode: TOpenNodeMode): Integer;
+var
+ Key: string;
+begin
+ Result := ERROR_SUCCESS;
+ Mode := onNodeNil;
+ if not Assigned(Node) then
+ Exit;
+
+ Reg.CloseKey;
+ Key := TraceKey(PathOfNode(Node));
+ Reg.RootKey := HKEYOfStr(ExRegRoot(Key));
+ Result := Reg.OpenKeyError(ExRegKey(Key), False, True);
+ if Success(Result) then
+ if Reg.RootKey = HKDD then
+ Mode := onReadOnly
+ else
+ Mode := onFull
+ else if Reg.OpenKeyReadOnly(ExRegKey(Key)) then
+ Mode := onReadOnly
+ else
+ Mode := onError;
+end;
+
+function OpenNode(Reg: TXRegistry; Node: TTreeNode): TOpenNodeMode;
+begin
+ OpenNodeError(Reg, Node, Result);
+end;
+
+function OpenNodeOK(Reg: TXRegistry; Node: TTreeNode): Boolean;
+begin
+ Result := OpenNode(Reg, Node) in onOK;
+end;
+
+function OpenCurKey: Boolean;
+begin
+ Result := OpenNodeOK(MainReg, RegTV.Selected);
+end;
+
+function OpenCurParent: Boolean;
+begin
+ Result := Assigned(RegTV.Selected)
+ and OpenNodeOK(MainReg, RegTV.Selected.Parent);
+end;
+
+function TTreeWin.CreateKey(Subkey: Boolean): Boolean;
+var
+ Node, NewNode: TTreeNode;
+ KeyName: string;
+ i: integer;
+begin
+ Result := False;
+
+ if CantWrite then
+ Exit;
+
+ Node := RegTV.Selected;
+ if not Assigned(Node) then
+ Exit;
+
+ if not Subkey then begin
+ //key shall be created on same level...
+ if Node.Level = 0 then begin
+ Node := RegTV.Selected;
+ if TraceKey(PathOfNode(Node)) <> PathOfNode(Node) then
+ //check for shortcut: shortcuts are unequal to their trace
+ if mrOK = MessageDlg(
+ 'You are trying to create a Key in the shortcut''s level.' + EOL +
+ 'Pluto needs to jump to the target of the shortcut to do this.',
+ mtConfirmation, [mbOK, mbCancel], 0) then begin
+ MainWin.GotoKey(TraceKey(PathOfNode(Node)));
+ Node := RegTV.Selected.Parent;
+ end else Exit
+ else begin
+ ShowMessage('Key is a HKEY.' + EOL +
+ 'It is not possible to create Keys on HKEY level.');
+ Exit; end;
+ end else
+ Node := Node.Parent; //set reference key to parent
+ end;
+
+ try
+
+ case OpenNode(MainReg, Node) of
+
+ onFull: begin
+ KeyName := 'New'; //find best free name
+ i := 0;
+ while MainReg.KeyExists(KeyName) do begin
+ Inc(i);
+ KeyName := 'New ' + IntToStr(i);
+ end;
+
+ Result := MainReg.CreateKey(KeyName) and MainReg.KeyExists(KeyName);
+ // ^-- CREATE KEY
+
+ if not Result then // <-- FAILED
+ ShowMessage('Could not create key!');
+ end;
+
+ onReadOnly: ShowMessage('Key is read-only.');
+
+ else
+ ShowMessage('Error: Couldn''t open key.');
+
+ end; //case
+
+ finally
+ MainReg.CloseKey;
+ end;
+
+ if not Result then
+ Exit;
+
+ if not Node.Expanded then begin //find the node, if Parent not Expanded
+ CheckNode(Node, False);
+ DoSmartExpand := False;
+ Node.Expand(False);
+ DoSmartExpand := True;
+ NewNode := FindNode(Node, KeyName);
+ end else
+ NewNode := RegTV.Items.AddChild(Node, KeyName); //else create a new node
+
+ Result := Assigned(NewNode);
+ if not Result then
+ ShowMessage('Error: Could not find created key.');
+
+ if Result then begin
+ RegTV.Selected := NewNode;
+ RegTV.Selected.EditText;
+ end;
+end;
+
+procedure TTreeWin.CloneKey;
+var
+ Node: TTreeNode;
+ Full: TRegPath;
+ MainKey, SubKey, NewKey, zKey: string;
+ i: integer;
+begin
+ Node := RegTV.Selected;
+
+ if CantWrite then
+ Exit;
+
+ if NodeInfo(Node).IsHost then
+ Exit;
+
+ Full := CurKey(uhNonSystemShortcuts);
+ MainKey := LWPSolve(Full.Key);
+ SubKey := FromLastChar(MainKey, '\');
+ MainKey := UntilLastChar(MainKey, '\');
+ if SubKey = '' then begin //Directly beyound HKEY
+ SubKey := MainKey;
+ MainKey := '';
+ end;
+
+ try
+ MainReg.RootKey := HKEYOfStr(Full.Root);
+ if not MainReg.OpenKey(MainKey, False) then begin
+ ShowMessage('Error: Couldn''t not open Key: ' + MainKey);
+ Exit end;
+ if Copy(SubKey, 1, 3) <> 'New' then
+ NewKey := 'New ' + SubKey
+ else
+ NewKey := SubKey;
+
+ zKey := Trim(FromLastChar(NewKey, ' '));
+
+ i := StrToIntDef(zKey, 0);
+ if IsValidInteger(zKey) then
+ zKey := Trim(UntilLastChar(NewKey, ' '))
+ else
+ zKey := NewKey;
+
+ while MainReg.KeyExists(NewKey) do begin
+ Inc(i);
+ NewKey := zKey + ' ' + IntToStr(i);
+ end;
+
+ MainReg.MoveKey(SubKey, NewKey, False);
+ finally
+ MainReg.CloseKey;
+ end;
+
+ Node := RegTV.Items.Add(Node, NewKey);
+ RegTV.Selected := Node;
+ Node.EditText;
+end;
+
+procedure TTreeWin.NewShortcut;
+var
+ Node, ShortCutNode: TTreeNode;
+ ScName, ScRealPath: string;
+ i: Integer;
+begin
+ Node := RegTV.Selected;
+ if not Assigned(Node) then
+ Exit;
+
+ if Node.Level = 0 then
+ ScName := 'new ' + Node.Text
+ else
+ ScName := '' + Node.Text;
+
+ ScRealPath := TraceKey(PathOfNode(Node));
+ if not InputQuery('New shortcut to ', ScRealPath, ScName) then
+ Exit;
+
+ for i := 0 to High(ShortCuts) do
+ if SameText(ScName, ShortCuts[i].Alias) then begin
+ ShowMessage('Name already in use.');
+ NewShortcut;
+ Exit; end;
+
+ ShortCutNode := AddShortcut(ScName, ScRealPath, iconShortcut, uhUserShortcut,
+ True);
+ CheckNode(Node, False);
+ RegTV.Selected := ShortCutNode;
+end;
+
+function AddShortcut(Alias, RealPath: string; Icon: Integer;
+ AHostType: TUniHostType = uhUserShortcut;
+ WriteIni: Boolean = False): TTreeNode;
+var
+ Last: Integer;
+begin
+ RealPath := TraceKey(RealPath); //Important: do this BEFORE adding a new,
+ //empty shortcut to ShortCuts
+
+ SetLength(ShortCuts, Length(ShortCuts) + 1);
+ Last := High(Shortcuts);
+ ShortCuts[Last].Alias := Alias;
+ ShortCuts[Last].RealPath := RealPath;
+
+ Result := RegTV.Items.Add(nil, Alias);
+ ShortCuts[Last].Node := Result;
+
+ if Alias = 'HKEY_WindowsMachine' then
+ Icon := iconHKWM
+ else if Alias = 'HKEY_WindowsUser' then
+ Icon := iconHKWU;
+ SetTNImage(Result, Icon);
+
+ NodeInfo(Result).HostType := AHostType;
+
+ if WriteIni then
+ with TIniFile.Create(PlutoDir + 'Shortcuts.ini') do
+ try
+ WriteString('Shortcuts', Alias, RealPath);
+ finally
+ Free;
+ end;
+end;
+
+procedure TTreeWin.DeleteKey;
+var
+ i: Integer;
+ Node, Node2: TTreeNode;
+begin
+ Node := RegTV.Selected;
+
+
+ i := ShortcutIndex(Node);
+ if (i > -1) then begin
+ if (mrYes = MessageDlg('This is a Pluto shortcut to a real key.'#13#10 +
+ 'Do you really want to delete the shortcut?',
+ mtConfirmation, [mbYes, mbCancel], 0)) then begin
+ SpyThread.Suspend;
+ SpyThread.Restart := True;
+ with TIniFile.Create(PlutoDir + 'Shortcuts.ini') do
+ try
+ DeleteKey('Shortcuts', Shortcuts[i].Alias);
+ finally
+ Free;
+ end;
+ Shortcuts[i] := Shortcuts[High(Shortcuts)];
+ SetLength(Shortcuts, Length(Shortcuts)-1);
+ RegTV.Selected := GetNextBest(Node);
+ Node.Delete;
+ RegTVChange(Self, RegTV.Selected);
+ SpyThread.Resume;
+ end;
+ Exit; end;
+
+ if CantWrite then
+ Exit;
+
+ if NodeInfo(Node).IsHost then
+ Exit;
+
+ SpyThread.Suspend;
+ SpyThread.Restart := True;
+
+ Node2 := GetNextBest(Node);
+
+ if MessageDlg('Do you really want to delete this key?', mtConfirmation,
+ [mbYes, mbCancel], 0) = mrYes then
+ try
+ if OpenCurParent then begin
+ if not MainReg.DeleteKey(Node.Text) then //<-- DELETE KEY
+ ShowMessage('Key could not be deleted.')
+ else begin
+ RegTV.Selected := Node2;
+ if Assigned(Node.Parent) and (Node2 = Node.Parent) then
+ Node.Parent.Collapse(False);
+ Node.Delete;
+ end;
+ end;
+ finally
+ MainReg.CloseKey;
+ end;
+
+ RegTVChange(Self, Node2);
+
+ SpyThread.Resume;
+end;
+
+procedure TTreeWin.MoveKey(const Src, Trg: TRegPath; CopyWanted: Boolean);
+var
+ TrgReg: TXRegistry;
+begin
+ with MainReg do begin
+ RootKey := HKEYOfStr(Src.Root);
+ OpenKey('');
+
+ if not KeyExists(Src.Key) then begin
+ ShowMessage('Source not found.');
+ Exit; end;
+ end;
+
+ TrgReg := TXRegistry.Create;
+ with TrgReg do begin
+ RootKey := HKEYOfStr(Trg.Root);
+ OpenKey('');
+ if KeyExists(Trg.Key) then begin
+ ShowMessage('Target already existing.');
+ TrgReg.Free;
+ Exit; end;
+ end;
+
+ if not CopyWanted then
+ if mrYes <> MessageDlg('From source: ' + StrOfRegPath(Src) + EOL +
+ 'To target: ' + StrOfRegPath(Trg) + EOL +
+ 'Do you really want to move this key?',
+ mtConfirmation, [mbYes, mbCancel], 0)
+ then
+ Exit;
+
+ try
+ MainReg.MoveKey(Src.Key, TrgReg, Trg.Key, not CopyWanted); //<-- MOVE KEY
+ except
+ end;
+
+ if not TrgReg.OpenKey(Trg.Key, False) then
+ ShowMessage('Could not move key!')
+ else
+ if not CopyWanted then
+ DragNode.Delete;
+
+
+ TrgReg.Free;
+
+ MainReg.CloseKey;
+end;
+
+procedure TTreeWin.MoveValues(SrcNode, TrgNode: TTreeNode;
+ CopyWanted: Boolean);
+var
+ SrcReg, TrgReg: TXRegistry;
+ i: Integer;
+ ValueName: string;
+ AnswerToAll: Integer;
+
+ function AskForReplacing(const ValueName: string): Integer;
+ begin
+ if AnswerToAll = -1 then begin
+ Result := MessageDlg(
+ 'Value ' + Quote(ValueName) + 'already exists in target key.' + EOL +
+ 'Do you want to replace it?',
+ mtWarning, [mbNo, mbYes, mbNoToAll, mbYesToAll, mbAbort], 0);
+ if Result in [mrNoToAll, mrYesToAll] then begin
+ if Result = mrYesToAll then
+ Result := mrYes
+ else if Result = mrNoToAll then
+ Result := mrNo;
+ AnswerToAll := Result;
+ end;
+ end else Result := AnswerToAll;
+ end;
+
+begin
+ AnswerToAll := -1;
+
+ if not CopyWanted then
+ if mrYes<>MessageDlg(
+ Format(
+ 'Do you really want to move %s' + EOL +
+ 'from: %s' + EOL +
+ 'to: %s',
+ [StrNumerus(ValueList.SelCount, 'value', 'values'),
+ PathOfNode(SrcNode), PathOfNode(TrgNode)]
+ ), mtConfirmation, [mbYes, mbAbort], 0) then
+ Exit;
+
+ SrcReg := TXRegistry.Create;
+ try
+ if not (OpenNode(SrcReg, SrcNode) in onOK) then
+ MessageDlg('Couldn''t open source key: ' + PathOfNode(SrcNode),
+ mtError, [mbOK], 0);
+
+ TrgReg := TXRegistry.Create;
+ try
+ if not (OpenNode(TrgReg, TrgNode) in onOK) then
+ MessageDlg('Couldn''t open target key: ' + PathOfNode(TrgNode),
+ mtError, [mbOK], 0);
+
+ with ValueList.Items do begin
+ for i := 0 to Count-1 do begin
+ if not Item[i].Selected then
+ Continue;
+ ValueName := RealValueName(Item[i]);
+
+ if TrgReg.ValueExists(ValueName) then begin
+ case AskForReplacing(ValueName) of
+ mrYes: ;
+ mrNo: Continue;
+ mrAbort: Break;
+ end;
+ end;
+
+ TrgReg.WriteContext(ValueName, SrcReg.ReadContext(ValueName));
+ if not CopyWanted then
+ SrcReg.DeleteValue(ValueName);
+ end;
+ end;
+
+ finally
+ TrgReg.Free;
+ end;
+
+ finally
+ SrcReg.Free;
+ end;
+
+ if not CopyWanted then
+ ValuesWin.Reload;
+end;
+
+procedure TTreeWin.NewSubKeyMIClick(Sender: TObject);
+begin
+ CreateKey(True);
+end;
+
+procedure TTreeWin.NewKeyMIClick(Sender: TObject);
+begin
+ CreateKey(False);
+end;
+
+procedure TTreeWin.CreateShortcutMIClick(Sender: TObject);
+begin
+ NewShortcut;
+end;
+
+procedure TTreeWin.TraceMIClick(Sender: TObject);
+begin
+ if NodeInfo(RegTV.Selected).IsShortcut then
+ MainWin.GotoKey(TraceKey(PathOfNode(RegTV.Selected)));
+end;
+
+procedure TTreeWin.DeleteMIClick(Sender: TObject);
+begin
+ if not RegTV.IsEditing then
+ DeleteKey;
+end;
+
+procedure TTreeWin.DublicateMIClick(Sender: TObject);
+begin
+ CloneKey;
+end;
+
+procedure TTreeWin.FindMIClick(Sender: TObject);
+begin
+ FindWin.SfCurKeyRB.Checked := True;
+ FindWin.Show;
+end;
+
+procedure TTreeWin.RegTVPUPopup(Sender: TObject);
+begin
+ RegTVChange(Sender, RegTV.Selected);
+ with NodeInfo(RegTV.Selected) do begin
+ NewSubKeyMI.Enabled := not CantWrite;
+ NewKeyMI.Enabled := not CantWrite and (not IsHost or IsShortcut);
+ DublicateMI.Enabled := not CantWrite and not IsHost;
+
+ with DeleteMI do
+ if HostType = uhUserShortcut then begin
+ Caption := '&Delete Shortcut';
+ Enabled := True;
+ end else begin
+ Caption := '&Delete';
+ Enabled := not CantWrite and not IsHost;
+ end;
+
+ RenameMI.Enabled := not CantWrite and (HostType in [uhNone, uhUserShortcut]);
+ TraceMI.Visible := IsShortcut;
+ EditShortcutMI.Visible := HostType = uhUserShortcut;
+ end;
+end;
+
+procedure CheckNode(Node: TTreeNode; OnlyOnce: Boolean = True;
+ TakeNodeSelected: Boolean = False);
+var
+ CurIcon, NewIcon: Integer;
+ Reg: TXRegistry;
+ OpenMode: TOpenNodeMode;
+ Info: TNodeInfo;
+{$IFDEF UNIKEY}
+ Uni: TUniKey;
+{$ENDIF}
+ KeyHasChildren: Boolean;
+
+ procedure SetShortcutIcon(Node: TTreeNode);
+ var
+ Full: string;
+ i: Integer;
+ begin
+ Full := TraceKey(PathOfNode(Node));
+ for i := Low(Shortcuts) to High(Shortcuts) do
+ if Full = Shortcuts[i].RealPath then begin
+ CurIcon := Shortcuts[i].Node.ImageIndex;
+ Exit; end;
+ if Node.ImageIndex in [iconShortcut, iconShortcut + 1] then
+ CurIcon := iconKey + (CurIcon - iconShortcut);
+ end;
+
+begin
+ if not Assigned(Node) then
+ Exit;
+
+ Info := NodeInfo(Node);
+ if OnlyOnce and Info.Checked then
+ Exit;
+
+ CurIcon := Node.ImageIndex;
+ if (CurIcon > iconFirstType) then begin
+{$IFDEF UNIKEY}
+ if RootOfNode(Node).ImageIndex <> iconHostUni then begin
+ SetShortcutIcon(Node);
+ CurIcon := (CurIcon div 2) * 2;
+ end;
+{$ELSE}
+ Exit;
+{$ENDIF}
+ end else begin
+ SetShortcutIcon(Node);
+ CurIcon := (CurIcon div 2) * 2;
+ end;
+ NewIcon := CurIcon;
+
+ Info.ExcludeFlag(nfDefect);
+ Info.ExcludeFlag(nfReadOnly);
+
+{$IFDEF UNIKEY}
+ KeyHasChildren := False;
+
+ if RootOfNode(Node).ImageIndex = iconHostUni then begin
+ Uni := UniOfNode(Node);
+ if Assigned(Uni) then
+ try
+ KeyHasChildren := Uni.HasKeys;
+ if usReadOnly >= Uni.Skills then
+ OpenMode := onReadOnly
+ else
+ OpenMode := onFull;
+ finally
+ Uni.Free;
+ end
+ else
+ OpenMode := onError;
+ end else begin
+{$ENDIF}
+ Reg := TXRegistry.Create;
+ try
+ OpenMode := OpenNode(Reg, Node);
+ KeyHasChildren := Reg.HasSubKeys;
+ finally
+ Reg.Free;
+ end;
+{$IFDEF UNIKEY}
+ end;
+{$ENDIF}
+
+ if OpenMode = onReadOnly then
+ Info.IncludeFlag(nfReadOnly);
+
+ if OpenMode in onOK then begin
+ //OK, could open
+ if not Node.Expanded then begin //Collapsed
+ if KeyHasChildren then begin //HasSubKeys
+ if not Node.HasChildren then begin
+ //Update: Ensure HasChildren
+ if TakeNodeSelected or Node.Selected then
+ TreeWin.RegTV.Items.AddChild(Node, '');
+ end;
+ //Ensure Plus-Icon
+ NewIcon := CurIcon + 1;
+ end else begin
+ //Has still Children?
+ if Node.HasChildren then
+ Node.DeleteChildren;
+ end;
+
+ end else begin //Expanded
+ //HasSubKeys?
+ if KeyHasChildren then begin
+ //OK
+ NewIcon := CurIcon + 1;
+ end else begin
+ //not OK --> update
+ Node.Collapse(True);
+ Node.DeleteChildren;
+ end;
+ end;
+
+ //not OK, couldn't open
+ end else begin //defect
+ if Node.HasChildren then
+ Node.DeleteChildren;
+ Info.IncludeFlag(nfDefect);
+ end;
+
+ if Node.ImageIndex <> iconHostUni then //don't change icon of UniHosts
+ Node.ImageIndex := NewIcon;
+
+ Info.IncludeFlag(nfChecked);
+end;
+
+procedure TTreeWin.FormKeyDown(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+begin
+ MainWin.FormKeyDown(Sender, Key, Shift);
+end;
+
+function ShortcutIndex(Node: TTreeNode): Integer;
+//If Node is a Shortcut,
+//S. returns its index in the Shortcuts array
+//else -1
+begin
+ if Node.Level > 0 then begin
+ Result := -1;
+ Exit; end;
+
+ for Result := 0 to High(Shortcuts) do
+ if Shortcuts[Result].Node = Node then begin
+ Exit;
+ end;
+
+ Result := -1;
+end;
+
+function TraceKey(const Path: string; AllowedShortcutTypes: TUniHostTypes =
+ uhNonSystemShortcuts): string;
+var
+ i: Integer;
+ isAim: Boolean;
+
+ function NodeOkForTracing(Node: TTreeNode): Boolean;
+ begin
+ Result := Assigned(Node) and
+ (NodeInfo(Node).HostType in AllowedShortcutTypes);
+ end;
+
+begin
+ Result := MakeLongHKEY(Path);
+ repeat
+ isAim := True;
+ for i := 0 to High(ShortCuts) do begin
+ with Shortcuts[i] do
+ if NodeOkForTracing(Node) and
+ SameText(UntilChar(Result, '\'), Alias) then begin
+ if Alias = RealPath then
+ Break;
+ Delete(Result, 1, Length(Alias));
+ Result := RealPath + Result;
+ isAim := False;
+ Break; end;
+ end;
+ until isAim;
+end;
+
+procedure TTreeWin.RegTVKeyPress(Sender: TObject; var Key: Char);
+begin
+ if (Key = '*') and NoAsterisk then begin
+ Key := #0;
+ NoAsterisk := False;
+ end;
+end;
+
+procedure TTreeWin.RegTVAdvancedCustomDrawItem(Sender: TCustomTreeView;
+ Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage;
+ var PaintImages, DefaultDraw: Boolean);
+var
+ Rect: TRect;
+ MainValueName: string;
+ Reg: TXRegistry;
+ Info: TRegKeyInfo;
+ PreviewPosX: Integer;
+
+ procedure DefaultIconPreview(Reg: TXRegistry);
+ var
+ Icon: HICON;
+ IconFile: string;
+ begin
+ if (Node.Level = 0) and not RegTV.ShowLines then
+ Exit;
+
+ IconFile := Reg.ReadDefaultIcon;
+ if IconFile = '' then
+ Exit;
+
+ Icon := GetIconFromFile(ExpandString(IconFile));
+ if Icon = 0 then
+ Exit;
+
+ with Rect do begin
+ Dec(Left, TTreeView(Sender).Indent + 16);
+ DrawIconEx(Sender.Canvas.Handle, Left, Top,
+ Icon, 16, 16,
+ 0, 0, DI_NORMAL);
+ DestroyIcon(Icon);
+ end;
+ end;
+
+ procedure AddPreview(const PreviewText: string; Color: TColor);
+ begin
+ with Sender.Canvas do begin
+ SetTextColor(Handle, Color);
+ ExtTextOut(Handle, PreviewPosX, Rect.Top + 1, TextFlags, nil,
+ PChar(PreviewText), Length(PreviewText), nil);
+ Inc(PreviewPosX, TextWidth(PreviewText));
+ end;
+ end;
+
+begin
+ if Stage <> cdPostPaint then
+ Exit;
+
+ MainValueName := PrefWin.MainPreviewE.Text;
+
+ Rect := Node.DisplayRect(True);
+ PreviewPosX := Rect.Right + 5;
+
+ Reg := TXRegistry.Create(KEY_READ);
+ try
+ if OpenNodeOK(Reg, Node) then begin
+// Sender.Canvas.Font.Style := [];
+ if PrefWin.KeyInfoPreviewCB.Checked and Reg.GetKeyInfo(Info) then
+ with Info do begin
+ if NumSubKeys > 0 then
+ AddPreview(IntToStr(NumSubKeys) + 'k ', clCyan);
+ if NumValues > 0 then
+ AddPreview(IntToStr(NumValues) + 'v ', clBrightPurple);
+ end;
+
+ if PrefWin.MainPreviewCB.Checked then
+ if Reg.ValueReallyExists(MainValueName) then
+ AddPreview(DataPreviewOfContext(Reg.ReadContext(MainValueName)), $00AAFFFF);
+ {clBrightYellow}
+ if PrefWin.DefaultIconPreviewCB.Checked then
+ DefaultIconPreview(Reg);
+ end;
+ finally
+ Reg.Free;
+ end;
+
+ {if nfCopy in NodeInfo(Node).Flags then begin
+ //Node.StateIndex := 2;
+ Brush.Style := bsClear;
+ with Font do begin
+ Style := [fsItalic, fsBold];
+ Color := clRed;
+ end;
+ //TextOut(Rect.Left - 10, Rect.Top + 3, 'c');
+ end;}
+end;
+
+procedure TTreeWin.RenameMIClick(Sender: TObject);
+begin
+ RegTV.Selected.EditText;
+end;
+
+procedure TTreeWin.CopyPathMIClick(Sender: TObject);
+begin
+ UserCopyKeyFlag := True;
+ MainWin.CopyPathClick(Sender);
+end;
+
+procedure TTreeWin.InsertPathMIClick(Sender: TObject);
+begin
+ MainWin.InsertPathClick(Sender);
+end;
+
+procedure TTreeWin.RegTVGetImageIndex(Sender: TObject; Node: TTreeNode);
+begin
+ if not NodeInfo(Node).Checked then
+ CheckNode(Node);
+end;
+
+procedure TTreeWin.CheckRegTVHotTrack;
+const
+ FindCursorOfSwitch: array[Boolean] of TCursor = (crArrow, crHandPoint);
+var
+ NewHotTrack: Boolean;
+begin
+ NewHotTrack := ScrollON xor PrefWin.KeysSingleClickCB.Checked;
+ if NewHotTrack = RegTV.HotTrack then Exit;
+
+ with RegTV do begin
+ HotTrack := NewHotTrack;
+ Cursor := FindCursorOfSwitch[HotTrack];
+ Mouse.CursorPos := Mouse.CursorPos; //update cursor
+ end;
+end;
+
+procedure TTreeWin.PasteKeyMIClick(Sender: TObject);
+var
+ Src, Trg: TRegPath;
+ Node: TTreeNode;
+begin
+ Src := RegPathOfStr(Clipboard.AsText);
+ Trg := CurKey(uhNonSystemShortcuts);
+ Trg.Key := Trg.Key + '\' + FromLastChar(Src.Key, '\', True);
+
+ MoveKey(Src, Trg, UserCopyKeyFlag);
+
+ Node := RegTV.Selected;
+ if Node.Expanded then
+ Node.Collapse(False);
+ Node.Expanded := False;
+ CheckNode(Node, False);
+ Node.Expand(False);
+
+ if not UserCopyKeyFlag then
+ RegTV.Repaint; // CheckNode(Node, False);
+
+ UserCopyKeyFlag := True;
+end;
+
+procedure TTreeWin.CutPathMIClick(Sender: TObject);
+begin
+ UserCopyKeyFlag := False;
+ MainWin.CopyPathClick(Sender);
+end;
+
+procedure TTreeWin.OpenNextLevel(Node: TTreeNode);
+
+ procedure ExpandKeys(Node: TTreeNode);
+ begin
+ CheckNode(Node, False, True);
+ if not Node.HasChildren then
+ Exit;
+ if not Node.Expanded then
+ Node.Expand(False)
+ else begin
+ Node := Node.GetFirstChild;
+ while Assigned(Node) do begin
+ ExpandKeys(Node);
+ Node := Node.GetNextSibling; end;
+ end;
+ end;
+
+begin
+ DoSmartExpand := False;
+ ExpandKeys(Node);
+ DoSmartExpand := True;
+end;
+
+procedure TTreeWin.EditShortcutMIClick(Sender: TObject);
+var
+ NewPath: string;
+ i: Integer;
+ Node: TTreeNode;
+ Shortcut: PKeyShortcut;
+begin
+ Node := RegTV.Selected;
+ if NodeInfo(Node).HostType <> uhUserShortcut then
+ Exit;
+
+ i := ShortcutIndex(Node);
+ if i = -1 then
+ Exit;
+
+ with TIniFile.Create(PlutoDir + 'Shortcuts.ini') do
+ try
+ NewPath := ReadString('Shortcuts', Shortcuts[i].Alias, '');
+ finally
+ Free;
+ end;
+
+ if not InputQuery('Edit Shortcut', 'Shortcut to...', NewPath) then
+ Exit;
+
+ Node.Collapse(False);
+ Shortcut := @Shortcuts[i];
+ Shortcut.RealPath := TraceKey(NewPath);
+ with TIniFile.Create(PlutoDir + 'Shortcuts.ini') do
+ try
+ WriteString('Shortcuts', Shortcut.Alias, Shortcut.RealPath);
+ finally
+ Free;
+ end;
+
+ RegTVChange(Self, Node);
+end;
+
+procedure TTreeWin.SubKeylist1Click(Sender: TObject);
+var
+ SL: TStringList;
+begin
+ SL := TStringList.Create;
+ if OpenCurKey then
+ try
+ MainReg.GetKeyNames(SL);
+ if PrefWin.SortKeysCB.Checked then
+ SL.Sort;
+ Clipboard.AsText := SL.Text;
+ finally
+ MainReg.CloseKey;
+ SL.Free;
+ end;
+end;
+
+procedure TTreeWin.ValueNameslist1Click(Sender: TObject);
+var
+ SL: TStringList;
+begin
+ SL := TStringList.Create;
+ if OpenCurKey then
+ try
+ MainReg.GetValueNames(SL);
+ if PrefWin.SortKeysCB.Checked then
+ SL.Sort;
+ Clipboard.AsText := SL.Text;
+ finally
+ MainReg.CloseKey;
+ SL.Free;
+ end;
+end;
+
+procedure TTreeWin.KeyInfosMIClick(Sender: TObject);
+begin
+ MessageDlg(GetKeyInfos, mtInformation, [mbOK], 0);
+end;
+
+function TTreeWin.GetKeyInfos: string;
+const
+ sErrorMsg = 'Error! No: %d Msg: %s';
+
+var
+ Node: TTreeNode;
+ Reg: TXRegistry;
+ Mode: TOpenNodeMode;
+ Error: Integer;
+ Info: TNodeInfo;
+ Flag: TNodeFlag;
+
+ procedure Add(const S: string);
+ begin
+ Result := Result + S;
+ end;
+
+ procedure AddLn(const S: string = '');
+ begin
+ Add(S + EOL);
+ end;
+
+ procedure AddNodeInfo(Key: HKEY);
+ var
+ KeyInfo: TRegKeyInfo;
+ Res: Integer;
+ KeyAge: TDateTime;
+ begin
+ FillChar(KeyInfo, SizeOf(TRegKeyInfo), 0);
+ with KeyInfo do begin
+ Res := RegQueryInfoKey(Reg.CurrentKey, nil, nil, nil, @NumSubKeys,
+ @MaxSubKeyLen, nil, @NumValues, @MaxValueLen,
+ @MaxDataLen, nil, @LastWriteTime);
+
+ if Res = ERROR_SUCCESS then begin
+ Add(Format(
+ 'Subkeys: %0:d' + EOL +
+ 'Values: %2:d' + EOL +
+ 'Max subkeys length: %1:d' + EOL +
+ 'Max value name length: %3:d' + EOL +
+ 'Max data length: %4:d' + EOL +
+ '',
+ [NumSubKeys, MaxSubKeyLen, NumValues, MaxValueLen, MaxDataLen]));
+ KeyAge := DateTimeOfFileTime(LastWriteTime);
+ if KeyAge > 0 then
+ AddLn('Last write time: ' + DateTimeToStr(KeyAge));
+ end else
+ AddLn('Couldn''t get key info.' + EOL +
+ 'Error Code: ' + IntToStr(Res) + EOL +
+ 'Message: ' + SysErrorMessage(Res));
+ end;
+ end;
+
+begin
+ Result := '';
+ Node := RegTV.Selected;
+
+ Reg := TXRegistry.Create(KEY_READ);
+ try
+ try
+ Error := OpenNodeError(Reg, RegTV.Selected, Mode);
+
+ case Mode of
+ onFull: AddLn('Full Access');
+ onReadOnly: AddLn('Read only');
+ onError:
+ AddLn(Format(sErrorMsg, [Error, SysErrorMessage(Error)]));
+ onNodeNil: AddLn('Node is nil!');
+
+ else
+ AddLn('Unknown Mode: ' + IntToStr(Integer(Mode)));
+ end;
+
+ if Mode in onOK then
+ AddNodeInfo(Reg.CurrentKey);
+
+ except
+ on E: Exception do begin
+ Error := GetLastError;
+ if Error <> ERROR_SUCCESS then
+ AddLn(Format('Error! No: %d Msg: %s', [Error, SysErrorMessage(Error)]))
+ else
+ AddLn(E.Message);
+ end;
+ end;
+ finally
+ Reg.Free;
+ end;
+
+ if MurphyMode then begin
+ AddLn('[MM] ImageIndex: ' + IntToStr(Node.ImageIndex));
+ Info := NodeInfo(Node);
+
+ if Info.HostType in [uhNone..High(HostTypeStrings)] then
+ AddLn('[MM] HostType: ' + HostTypeStrings[Info.HostType])
+ else
+ AddLn('[MM] Unknown HostType: ' + IntToStr(Integer(Info.HostType)));
+ Add('[MM] Flags: ');
+ for Flag := Low(TNodeFlag) to High(TNodeFlag) do
+ if Flag in Info.Flags then
+ Add(NodeFlagStrings[Flag] + ' ');
+ AddLn;
+ end;
+end;
+
+procedure TTreeWin.ExportAsRegClick(Sender: TObject);
+var
+ Node: TTreeNode;
+ Reg: TXRegistry;
+
+ procedure ExportAsReg4(Reg: TXRegistry; const FileName: string);
+ var
+ Reg4Writer: TReg4Writer;
+ begin
+ Reg4Writer := TReg4Writer.Create(tpNormal, FileName,
+ TraceKey(PathOfNode(Node)), Reg.DeliverKey);
+ with Reg4Writer do begin
+ OnTerminate := Reg4WriterTerminate;
+ try
+ AddHint(Format('starting .reg-export: %s...',
+ [Root + '\' + Path]));
+ Resume;
+ except
+ Free;
+ end;
+ end;
+ AddToLastHint('started.');
+ end;
+
+
+ procedure ExportAsHive(Reg: TXRegistry; const FileName: string);
+ begin
+ if Reg.SaveKey('', FileName) then
+ AddHint('hive export successfull.')
+ else
+ AddHint(Format('hive export failed: %s',
+ [SysErrorMessage(LastSuccessRes)]));
+ end;
+
+begin
+ Node := RegTV.Selected;
+ with ExportD do begin
+ FileName := MakeValidFileName(Node.Text, 'key');
+
+ if Execute then begin
+ Reg := TXRegistry.Create;
+ try
+ if OpenNodeOK(Reg, Node) then begin
+ if FileExists(FileName) and (mrYes=MessageDlg(
+ 'File already exists.' + EOL +
+ 'Delete existing file?',
+ mtWarning, [mbYes, mbNo], 0)) then begin
+ FileSetAttr(FileName, 0);
+ DeleteFile(FileName);
+ end;
+ case FilterIndex of
+ 1: ExportAsReg4(Reg, FileName);
+ 2: ExportAsHive(Reg, FileName);
+ else
+ ShowMessage(Format('Wrong Filter: %d', [FilterIndex]));
+ end;
+ end;
+ finally
+ Reg.Free;
+ end;
+ end;
+ end;
+end;
+
+procedure TTreeWin.FormClose(Sender: TObject; var Action: TCloseAction);
+begin
+// Action := caNone;
+end;
+
+procedure TTreeWin.Load;
+var
+ NodeHKLM, NodeHKU, NodeHKDD, NodeHKPD: TTreeNode;
+ NodeHostReg: TTreeNode;
+
+ procedure LoadShortcuts(FileName: string; HostType: TUniHostType);
+ var
+ i: Integer;
+ SL: TStringList;
+ ShortcutIni: TIniFile;
+ begin
+ if not FileEx(FileName) then begin
+ AddToLastHint('not found:');
+ AddHint(FileName);
+ Exit end;
+
+ ShortcutIni := TIniFile.Create(FileName);
+ SL := TStringList.Create;
+
+ try
+ ShortcutIni.ReadSectionValues('Shortcuts', SL);
+ for i := 0 to SL.Count-1 do
+ AddShortcut(SL.Names[i], SL.Values[SL.Names[i]], iconShortcut,
+ HostType);
+ AddToLastHint('OK');
+ finally
+ SL.Free;
+ ShortcutIni.Free;
+ end;
+ end;
+
+begin
+ NodeHostReg := nil;
+
+ AddHint('Creating Hosts...');
+ RootNodes := TList.Create;
+ ChangeLastHint('Creating Hosts...HKEY_LOCAL_MACHINE');
+ NodeHKLM := RegTV.Items.AddChild(NodeHostReg, 'HKEY_LOCAL_MACHINE');
+ SetTNImage(NodeHKLM, iconHKLM);
+ NodeInfo(NodeHKLM).HostType := uhReg;
+ RootNodes.Add(NodeHKLM);
+
+ ChangeLastHint('Creating Hosts...HKEY_USERS');
+ NodeHKU := RegTV.Items.AddChild(NodeHostReg, 'HKEY_USERS');
+ SetTNImage(NodeHKU, iconHKU);
+ NodeInfo(NodeHKU).HostType := uhReg;
+ RootNodes.Add(NodeHKU);
+
+ ChangeLastHint('Creating Hosts...HKEY_CURRENT_USER');
+ if RegRealPath('HKEY_CURRENT_USER') = 'HKEY_CURRENT_USER' then
+ //could not dereference hkcu
+ AddShortcut('HKEY_CURRENT_USER', 'HKEY_CURRENT_USER',
+ iconHKCU, uhReg)
+ else
+ AddShortcut('HKEY_CURRENT_USER', RegRealPath('HKEY_CURRENT_USER'),
+ iconHKCU, uhSystemShortcut);
+
+ ChangeLastHint('Creating Hosts...HKEY_CURRENT_CONFIG');
+ AddShortcut('HKEY_CURRENT_CONFIG', RegRealPath('HKEY_CURRENT_CONFIG'),
+ iconHKCC, uhSystemShortcut);
+
+ ChangeLastHint('Creating Hosts...HKEY_CLASSES_ROOT');
+ AddShortcut('HKEY_CLASSES_ROOT', RegRealPath('HKEY_CLASSES_ROOT'),
+ iconHKCR, uhSystemShortcut);
+
+ MainReg.RootKey := HKEY_DYN_DATA;
+ if MainReg.OpenKeyReadOnly('') then begin
+ MainReg.CloseKey;
+ ChangeLastHint('Creating Hosts...HKEY_DYN_DATA');
+ NodeHKDD := RegTV.Items.AddChild(nil, 'HKEY_DYN_DATA');
+ NodeInfo(NodeHKDD).HostType := uhReg;
+ NodeInfo(NodeHKDD).IncludeFlag(nfReadOnly);
+ SetTNImage(NodeHKDD, iconHKDD);
+ RootNodes.Add(NodeHKDD);
+ end;
+
+ MainReg.RootKey := HKEY_PERFORMANCE_DATA;
+ if MainReg.OpenKeyReadOnly('') then begin
+ MainReg.CloseKey;
+ ChangeLastHint('Creating Hosts...HKEY_PERFORMANCE_DATA');
+ NodeHKPD := RegTV.Items.AddChild(nil, 'HKEY_PERFORMANCE_DATA');
+ NodeInfo(NodeHKPD).HostType := uhReg;
+ SetTNImage(NodeHKPD, iconHKPD);
+ RootNodes.Add(NodeHKPD);
+ end;
+
+ ChangeLastHint('Creating Host...OK');
+
+ AddHint('Loading Standard Shortcuts...');
+ LoadShortcuts(PlutoDir + StandardShortcutsFileName, uhStandardShortcut);
+
+ AddHint('Loading User Shortcuts...');
+ LoadShortcuts(PlutoDir + ShortcutsFileName, uhUserShortcut);
+
+{$IFDEF UNIKEY}
+ AddShortcut('Uni', '', iconHostUni);
+{$ENDIF}
+end;
+
+procedure TTreeWin.Reg4WriterTerminate(Sender: TObject);
+begin
+ with Sender as TRegFileWriter do
+ AddHint(Format('.reg-export finished (%0.2f s): %s',
+ [Clk.SecsPassed, Root + '\' + Path]));
+end;
+
+end.
+unit valuesU;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ ComCtrls, Menus, Clipbrd, XReg, CompEx, Math, YTools, Dialogs, YTypes,
+ PlutoConst, keybrd, ImgList, clock;
+
+type
+ TValuesWin = class(TForm)
+ ValueListPU: TPopupMenu;
+ NewStringMI: TMenuItem;
+ NewDWORDMI: TMenuItem;
+ NewBinaryMI: TMenuItem;
+ ConvertToMI: TMenuItem;
+ ConvStringMI: TMenuItem;
+ ConvDWORDMI: TMenuItem;
+ ConvBinaryMI: TMenuItem;
+ ValueList: TListView;
+ DeleteMI: TMenuItem;
+ N1: TMenuItem;
+ RenameMI: TMenuItem;
+ NewElseMI: TMenuItem;
+ NewMultiStringMI: TMenuItem;
+ REGNONE1: TMenuItem;
+ LINK1: TMenuItem;
+ NewExpandStringMI: TMenuItem;
+ N3BINARY1: TMenuItem;
+ N4DWORD1: TMenuItem;
+ N4DWORDLITTLEEDIAN1: TMenuItem;
+ NewBigEndianMI: TMenuItem;
+ N6LINK1: TMenuItem;
+ N7MULTISZ1: TMenuItem;
+ RESOURCELIST1: TMenuItem;
+ N9FULLRESOURCEDESCRIPTOR1: TMenuItem;
+ ARESOURCEREQUIREMENTSLIST1: TMenuItem;
+ NewDefaultValueMI: TMenuItem;
+ EditMI: TMenuItem;
+ EditBinaryMI: TMenuItem;
+ N3: TMenuItem;
+ CopyDataPreviewMI: TMenuItem;
+ DublicateMI: TMenuItem;
+ MultiString1: TMenuItem;
+ ZeromizeMI: TMenuItem;
+ N4: TMenuItem;
+ CopyPathMI: TMenuItem;
+ TakeAsMainValueMI: TMenuItem;
+ SelectAllMI: TMenuItem;
+ InvertSelectionMI: TMenuItem;
+ procedure FormCreate(Sender: TObject);
+ procedure InitListColumnTags;
+
+ procedure NewStringMIClick(Sender: TObject);
+ procedure NewDWORDMIClick(Sender: TObject);
+ procedure NewBinaryMIClick(Sender: TObject);
+ procedure ConvertValue(Sender: TObject);
+
+ procedure CreateValue(Typ: TRegDataType);
+ procedure ZeromizeValue;
+ procedure DeleteValue;
+ procedure CloneValue;
+ function TryRenameValue(OldName: string; var NewName: string): Boolean;
+
+ procedure ValueListChange(Sender: TObject; Item: TListItem; Change: TItemChange);
+ procedure ValueListCustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
+ procedure ValueListDblClick(Sender: TObject);
+ procedure ValueListEditing(Sender: TObject; Item: TListItem; var AllowEdit: Boolean);
+ procedure ValueListEdited(Sender: TObject; Item: TListItem; var S: String);
+ procedure ValueListKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
+ procedure ValueListResize(Sender: TObject);
+
+ function UpdateValue(Reg: TXRegistry; Item: TListItem): Boolean;
+ procedure UpdateValues(SelectedOnly: Boolean = False);
+ procedure Reload(JumpToNewValue: Boolean = False; ValueName: string = '');
+ procedure LoadValues(Reg: TXRegistry);
+
+ function AddValue(Reg: TXRegistry; const ValueName: string; AppendInfos: Boolean = True): TListItem;
+ procedure ValueListPUPopup(Sender: TObject);
+ procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
+ procedure ValueListDeletion(Sender: TObject; Item: TListItem);
+ procedure DeleteMIClick(Sender: TObject);
+ procedure RenameMIClick(Sender: TObject);
+ procedure NewBigEndianMIClick(Sender: TObject);
+ procedure NewExpandStringMIClick(Sender: TObject);
+ procedure NewMultiStringMIClick(Sender: TObject);
+ procedure NewStrangeTypeMIClick(Sender: TObject);
+ procedure NewDefaultValueMIClick(Sender: TObject);
+ procedure ValueListChanging(Sender: TObject; Item: TListItem; Change: TItemChange; var AllowChange: Boolean);
+ procedure ValueListMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
+ procedure EditBinaryMIClick(Sender: TObject);
+ procedure EditMIClick(Sender: TObject);
+ procedure ValueListCustomDrawSubItem(Sender: TCustomListView; Item: TListItem; SubItem: Integer; State: TCustomDrawState; var DefaultDraw: Boolean);
+ procedure ValueListCompare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer);
+ procedure ValueListColumnClick(Sender: TObject; Column: TListColumn);
+ procedure DublicateMIClick(Sender: TObject);
+ procedure CopyDataPreviewMIClick(Sender: TObject);
+ procedure CopyDataPreview;
+ procedure ZeromizeMIClick(Sender: TObject);
+ procedure CopyPathMIClick(Sender: TObject);
+
+ function FindItemByRealName(const ValueName: string): Integer;
+
+ function FocusItem(ARealValueName: string;
+ FocusValueList: Boolean = False): Boolean;
+ procedure TakeAsMainValueMIClick(Sender: TObject);
+ procedure FormShow(Sender: TObject);
+ procedure FormClose(Sender: TObject; var Action: TCloseAction);
+ procedure ValueListClick(Sender: TObject);
+ procedure CheckValueListHotTrack;
+ procedure SelectAllMIClick(Sender: TObject);
+ procedure InvertSelectionMIClick(Sender: TObject);
+ procedure FormDestroy(Sender: TObject);
+ private
+ ValueLabelClicked: Boolean;
+ SortBy: TValueListColumn;
+ SortByColumn: TListColumn;
+ SubItemIndex: array[TValueListColumn] of Integer;
+ public
+ ValueNames: TStringList;
+ ValuesCommon: Boolean;
+ ValueCommonType: TRegDataType;
+ end;
+
+var
+ ValuesWin: TValuesWin;
+ ValueList: TListView;
+
+ DefaultValueCaption: string = '';
+
+function ItemIsDefaultValue(Item: TListItem): Boolean;
+function RealValueName(Item: TListItem): string;
+procedure SetRealValueName(Item: TListItem; Caption: string);
+function IconOfDataType(Typ: TRegDataType): Integer;
+function IsMainValue(Item: TListItem): Boolean;
+
+function ColorOfDataType(DataType: TRegDataType;
+ DefaultColor: TColor = clWhite): TColor;
+function DataPreviewOfContext(Context: TRegContext): string;
+
+function ValueDataSize(Context: TRegContext): string;
+function ValueDataType(Context: TRegContext): string;
+function ValueDataPreview(Context: TRegContext): string;
+function ValueTypeIcon(Context: TRegContext): Integer;
+
+function StrOfRegDataType(Typ: TRegDataType): string;
+
+implementation
+
+uses PlutoMain, TreeU, WorkU, PrefU;
+
+{$R *.dfm}
+
+function ItemIsDefaultValue(Item: TListItem): Boolean;
+begin
+ Result := Item.Data = Pointer(DefaultValueFlag);
+end;
+
+function RealValueName(Item: TListItem): string;
+begin
+ if ItemIsDefaultValue(Item) then
+ Result := ''
+ else
+ Result := Item.Caption;
+end;
+
+procedure SetRealValueName(Item: TListItem; Caption: string);
+begin
+ if Caption = '' then begin
+ Item.Caption := DefaultValueCaption;
+ Item.Data := Pointer(DefaultValueFlag);
+ end else begin
+ Item.Caption := Caption;
+ Item.Data := nil;
+ end;
+end;
+
+function IsMainValue(Item: TListItem): Boolean;
+begin
+ Result := False;
+ if csDestroying in PrefWin.ComponentState then
+ Exit;
+
+ Result := RealValueName(Item) = PrefWin.MainPreviewE.Text;
+end;
+
+function ColorOfDataType(DataType: TRegDataType;
+ DefaultColor: TColor = clWhite): TColor;
+begin
+ if DataType in rdStringTypes then Result := clBrightRed
+ else if DataType = rdMultiString then Result := clBrightPurple
+ else if DataType in rdCardTypes then Result := clBrightBlue
+ else if DataType = rdBinary then Result := clBrightGreen
+ else Result := DefaultColor;
+end;
+
+function StrOfRegDataType(Typ: TRegDataType): string;
+const
+ RegDataTypeStrings: array[rdNone..rdLastType] of string = (
+ 'NONE',
+ 'SZ',
+ 'EXPAND_SZ',
+ 'BINARY',
+ 'DWORD',
+ 'DWORD_BIG_ENDIAN',
+ 'LINK',
+ 'MULTI_SZ',
+ 'RESOURCE_LIST',
+ 'FULL_RESOURCE_DESCRIPTOR',
+ 'RESOURCE_REQUIREMENTS_LIST',
+ 'QUAD_WORD'
+ );
+begin
+ if Typ in [rdNone..rdLastType] then
+ Result := RegDataTypeStrings[Typ]
+ else
+ Result := IntToStr(Typ);
+end;
+
+procedure TValuesWin.NewStringMIClick(Sender: TObject);
+begin
+ CreateValue(rdString);
+end;
+
+procedure TValuesWin.NewDWORDMIClick(Sender: TObject);
+begin
+ CreateValue(rdCardinal);
+end;
+
+procedure TValuesWin.NewBinaryMIClick(Sender: TObject);
+begin
+ CreateValue(rdBinary);
+end;
+
+procedure TValuesWin.CreateValue(Typ: TRegDataType);
+var
+ Item: TListItem;
+ ValueName: string;
+ i: Integer;
+ SL: TStringList;
+begin
+ if csDestroying in (TreeWin.ComponentState + MainWin.ComponentState) then
+ Exit;
+
+ if TreeWin.CantWrite then
+ Exit;
+
+ with MainReg do begin
+ try
+ OpenCurKey;
+
+ ValueName := 'New'; // find free name
+ i := 0;
+ while ValueExists(ValueName) do begin
+ Inc(i);
+ ValueName := 'New ' + IntToStr(i);
+ end;
+
+ case Typ of
+ rdString: begin
+ WriteString(ValueName, '');
+ end;
+ rdExpandString: begin
+ WriteExpandString(ValueName, '');
+ end;
+ rdCardinal: begin
+ WriteCardinal(ValueName, 0);
+ end;
+ rdCardBigEndian: begin
+ WriteCardinal(ValueName, 0, True);
+ end;
+ rdMultiString: begin
+ SL := TStringList.Create;
+ WriteMultiString(ValueName, SL);
+ SL.Free;
+ end;
+ rdBinary: begin
+ WriteBin(ValueName, nil);
+ end;
+ else
+ WriteBinType(ValueName, nil, Typ);
+ end;
+
+ if not ValueExists(ValueName) then begin
+ ShowMessage('Could not create Value.');
+ CloseKey;
+ Exit; end;
+
+ ValuesWin.AddValue(MainReg, ValueName);
+ finally
+ CloseKey;
+ end;
+ end;
+
+ Item := FindItem(ValueList, ValueName);
+
+ if not Assigned(Item) then begin
+ ShowMessage('Error, Value not found: ' + ValueName);
+ Exit; end;
+
+ SelectItemOnly(ValueList, Item);
+ MainWin.StatusBarUpdate;
+ ValueLabelClicked := True;
+ Item.EditCaption;
+end;
+
+procedure TValuesWin.FormCreate(Sender: TObject);
+begin
+ ValuesU.ValueList := ValueList;
+
+ DefaultValueCaption := PrefWin.DefaultValueNameE.Text;
+ ValueLabelClicked := False;
+ SortBy := vlcName;
+ SortByColumn := nil;
+
+ ValueListResize(Sender);
+ ValueList.Items.Clear;
+ CheckValueListHotTrack;
+
+ ValueNames := TStringList.Create;
+ ValuesCommon := False;
+ ValueCommonType := 0;
+
+ NewDefaultValueMI.ImageIndex := iconMainValue;
+ NewStringMI.ImageIndex := iconString;
+ NewDWORDMI.ImageIndex := iconCardinal;
+ NewBinaryMI.ImageIndex := iconBinary;
+ NewMultiStringMI.ImageIndex := iconMultiString;
+ NewElseMI.ImageIndex := iconValueElse;
+
+ DublicateMI.ImageIndex := iconValueDublicate;
+ DeleteMI.ImageIndex := iconDelete;
+ ZeromizeMI.ImageIndex := iconValueZeromize;
+
+ EditMI.ImageIndex := iconValueEdit;
+ EditBinaryMI.ImageIndex := iconValueEditBinary;
+ RenameMI.ImageIndex := iconRename;
+
+ TakeAsMainValueMI.ImageIndex := iconTakeAsMainValue;
+end;
+
+procedure TValuesWin.ConvertValue(Sender: TObject);
+{var
+ Allow: Boolean;
+ OldActive: Integer; }
+begin
+{ TargetPage := ShowPC.Pages[TMenuItem(Sender).Tag];
+
+ OldActive := ShowPC.ActivePageIndex;
+ ShowPC.ActivePageIndex := TMenuItem(Sender).Tag;
+ WorkWin.ShowPCChanging(Sender, Allow);
+ if not Allow then
+ ShowPC.ActivePageIndex := OldActive; }
+end;
+
+function ValueDataSize(Context: TRegContext): string;
+var
+ Typ: TRegDataType;
+ Size: Integer;
+// ValueName: string;
+// SL: TStringList;
+begin
+ Result := '';
+
+ if csDestroying in PrefWin.ComponentState then
+ Exit;
+
+// ValueName := RealValueName(Item);
+ Typ := Context.Typ;
+ Size := Length(Context.Data);
+
+ if Typ in rdStringTypes then
+ if not PrefWin.CountZeroByteCB.Checked then
+ Dec(Size);
+
+ if Typ = rdMultiString then
+ if PrefWin.ShowLineCountCB.Checked then begin
+ Size := CharCount(StrOfByteA(Context.Data), #0) - 2;
+{ SL := TStringList.Create;
+ try
+ Reg.ReadMultiString(ValueName, SL, PrefWin.UseExtendedModelCB.Checked);
+ Size := SL.Count;
+ finally
+ SL.Free;
+ end; }
+ Result := '#';
+ end;
+
+ Result := Result + IntToStr(Size);
+end;
+
+function ValueDataType(Context: TRegContext): string;
+begin
+ Result := StrOfRegDataType(Context.Typ);
+end;
+
+function DataPreviewOfContext(Context: TRegContext): string;
+
+ function DWORDPreview(Value: Integer): string;
+ begin
+ if PrefWin.ShowDwordAsHex.Checked then
+ Result := IntToStr(Value) + ' = $' + IntToHex(Value, 8)
+ else
+ Result := IntToStr(Value)
+ end;
+
+ function BinaryPreview(Context: TRegContext): string;
+ var
+ z: string;
+
+ function DWORDStringOfByteA(a: TByteA; AddBinary: Boolean = False): string;
+ var
+ piece: TByteA;
+ i: Integer;
+ begin
+ Result := '';
+
+ i := 0;
+ while (i <= High(a)) and (Length(Result) < MaxPreviewLen) do begin
+ piece := Copy(a, i, 4);
+ if AddBinary then
+ Result := Result + FriendlyStr(piece) + '=';
+ SetLength(piece, 4);
+ Result := Result + IntToStr(PInteger(piece)^) + ' ';
+ Inc(i, SizeOf(Integer));
+ end;
+ end;
+
+ begin
+ with Context do begin
+ Data := Copy(Data, 0, MaxPreviewLen);
+ case PrefWin.ShowBinaryAsRG.ItemIndex of
+ 0: z := FriendlyStr(Data);
+ 1: z := DWORDStringOfByteA(Data);
+ 2: z := DWORDStringOfByteA(Data, True);
+ 3: z := BinOfByteA(Data, 8, ' ');
+ 4: z := HexOfByteA(Data, 0);
+ 5: z := HexOfByteA(Data, 1);
+ 6: z := HexOfByteA(Data, 2);
+ 7: z := HexOfByteA(Data, 4);
+ end;
+ end;
+
+ Result := Copy(z, 1, MaxPreviewLen);
+ end;
+
+ function StringPreview(Context: TRegContext): string;
+ var
+ s: string;
+ Expanded: string;
+ DoExpand: Boolean;
+ begin
+ s := PChar(Context.Data);
+ with PrefWin do
+ Result := StringQuoterBegin + FriendlyStr(s) + StringQuoterEnd;
+ if s = '' then
+ Exit;
+
+ case PrefWin.ExpandStringsRG.ItemIndex of
+ 0: DoExpand := False;
+ 1: DoExpand := (Context.Typ = rdExpandString) and (CharCount(s, '%') >= 2);
+ 2: DoExpand := True;
+ else
+ ShowMessage('Error: Unknown PrefWin.ExpandStringsRG.ItemIndex!');
+ PrefWin.ExpandStringsRG.ItemIndex := 0;
+ Exit;
+ end;
+
+ if DoExpand then begin
+ Expanded := ExpandString(s);
+ if s <> Expanded then
+ Result := Result + ' <' + Expanded + '>';
+ end;
+ end;
+
+ function IntegerPreview(Context: TRegContext): string;
+ begin
+ if Length(Context.Data) >= SizeOf(Cardinal) then begin
+ Result := DWORDPreview(PInteger(Context.Data)^);
+ end else
+ Result := BinaryPreview(Context);
+ end;
+
+ function MultiStringPreview(Context: TRegContext): string;
+ var
+ z: string;
+ SL: TStringList;
+ i: Integer;
+ begin
+ z := '';
+
+ SL := TStringList.Create;
+ try
+ RegMultiStringOfByteA(Context.Data, SL, PrefWin.UseExtendedModelCB.Checked);
+
+ for i := 0 to SL.Count-1 do
+ z := z + SL[i] + ' ';
+ finally
+ SL.Free;
+ end;
+
+ Result := Copy(FriendlyStr(z), 1, MaxPreviewLen);
+ end;
+
+begin
+ Result := '';
+
+ if csDestroying in PrefWin.ComponentState then
+ Exit;
+
+ if (Context.Data = nil) or (Length(Context.Data) > RegMaxDataSize) then
+ Exit;
+
+ if Length(Context.Data) > MaxPreviewLen then
+ SetLength(Context.Data, MaxPreviewLen);
+
+ if PrefWin.ShowAsBinaryCB.Checked then begin
+ Result := BinaryPreview(Context);
+ Exit; end;
+
+ case Context.Typ of
+ rdExpandString, rdString: Result := StringPreview(Context);
+ rdCardinal, rdCardBigEndian: Result := IntegerPreview(Context);
+ rdMultiString: Result := MultiStringPreview(Context);
+ else
+ if PrefWin.Smart4BBCB.Checked and (Length(Context.Data) = 4) then
+ Result := IntegerPreview(Context)
+ else
+ Result := BinaryPreview(Context);
+ end;
+end;
+
+function ValueDataPreview(Context: TRegContext): string;
+begin
+ Result := DataPreviewOfContext(Context);
+end;
+
+function IconOfDataType(Typ: TRegDataType): Integer;
+begin
+ if Typ in [rdNone..rdLastType] then
+ Result := iconFirstType + Ord(Typ)
+ else
+ Result := iconUnknownType;
+end;
+
+function ValueTypeIcon(Context: TRegContext): Integer;
+begin
+ Result := IconOfDataType(Context.Typ);
+end;
+
+function TValuesWin.UpdateValue(Reg: TXRegistry; Item: TListItem): Boolean;
+//Return Value: True if something has changed
+var
+ Size, Typ, Data: string;
+ Icon: Integer;
+ Context: TRegContext;
+begin
+ Result := False;
+ if not Assigned(Item) then
+ Exit;
+
+ Context := Reg.ReadContext(RealValueName(Item));
+ Data := ValueDataPreview(Context);
+ Size := ValueDataSize(Context);
+ Typ := ValueDataType(Context);
+ Icon := ValueTypeIcon(Context);
+
+ if Icon <> Item.ImageIndex then begin
+ Item.ImageIndex := Icon;
+ Result := True;
+ end;
+
+ while Item.SubItems.Count < Integer(High(TValueListColumn)) do
+ Item.SubItems.Add('');
+
+ if Size <> Item.SubItems[SubItemIndex[vlcSize]] then begin
+ Result := True;
+ Item.SubItems[SubItemIndex[vlcSize]] := Size;
+ end;
+
+ if Typ <> Item.SubItems[SubItemIndex[vlcType]] then begin
+ Result := True;
+ Item.SubItems[SubItemIndex[vlcType]] := Typ;
+ end;
+
+ if (Data <> Item.SubItems[SubItemIndex[vlcData]]) then begin
+ Result := True;
+ Item.SubItems[SubItemIndex[vlcData]] := Data;
+ if IsMainValue(Item) then
+ RegTV.Repaint;
+ end;
+end;
+
+procedure AppendNewValueInfos(Item: TListItem; Context: TRegContext);
+begin
+ Item.ImageIndex := ValueTypeIcon(Context);
+ with Item.SubItems do begin
+ Append(ValueDataSize(Context));
+ Append(ValueDataType(Context));
+ Append(ValueDataPreview(Context));
+ end;
+end;
+
+function TValuesWin.AddValue(Reg: TXRegistry; const ValueName: string;
+ AppendInfos: Boolean = True): TListItem;
+begin
+ Result := ValueList.Items.AddItem(nil, -1);
+ Result.Indent := -1;
+ SetRealValueName(Result, ValueName);
+ if AppendInfos then
+ AppendNewValueInfos(Result, Reg.ReadContext(ValueName));
+end;
+
+procedure TValuesWin.ValueListChange(Sender: TObject; Item: TListItem;
+ Change: TItemChange);
+var
+ ValueName: string;
+ Reg: TXRegistry;
+
+ function ComputeValuesCommon(Reg: TXRegistry; var DataType: TRegDataType): Boolean;
+ var
+ i: Integer;
+ ItemType: TRegDataType;
+ begin
+ Result := False;
+
+ i := 0;
+ DataType := 0;
+ while i < ValueList.Items.Count do begin
+ Item := ValueList.Items[i];
+ if not Item.Selected then begin
+ Inc(i);
+ Continue; end;
+
+ ValueName := RealValueName(Item);
+ if Reg.ValueReallyExists(ValueName) then begin
+
+ ItemType := Reg.GetDataType(ValueName);
+ if not Result then begin
+ DataType := ItemType;
+ Result := True;
+ end else if ItemType <> DataType then begin
+ Result := False;
+ DataType := 0;
+ Break; end;
+
+ with ValueNames do
+ if Item.Focused then
+ Insert(0, ValueName)
+ else
+ Add(ValueName);
+
+ end else begin
+ ShowMessage('Value has been deleted!');
+ DataType := 0;
+ Result := False;
+ Reload;
+ Break; end;
+
+ Inc(i);
+ end;
+ end;
+
+begin
+ if not Assigned(Item) or ValueList.IsEditing or not ValueList.Enabled then
+ Exit;
+
+ if Change <> ctState then
+ Exit;
+
+ if csDestroying in WorkWin.ComponentState then
+ Exit;
+
+ if (ValueList.SelCount = 0) then begin
+ ValueNames.Clear;
+ WorkWin.ReInitShowPC;
+ Exit; end;
+
+ if not Item.Focused then
+ Exit;
+
+ WorkWin.ReInitShowPC;
+
+ ValueNames.Clear;
+ Reg := TXRegistry.Create;
+ try
+ if OpenNodeOK(Reg, RegTV.Selected) then begin
+ ValuesCommon := ComputeValuesCommon(Reg, ValueCommonType);
+ if ValuesCommon then
+ WorkWin.ShowValues(Reg);
+ end;
+ finally
+ Reg.Free;
+ end;
+
+ if csDestroying in MainWin.ComponentState then
+ Exit;
+
+ if ActiveControl = ValueList then
+ MainWin.SetStatus;
+end;
+
+procedure TValuesWin.ValueListCustomDrawItem(Sender: TCustomListView;
+ Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
+begin
+ with ValueList.Canvas.Font do begin
+ if Item.Focused then
+ Style := Style + [fsBold];
+ if ItemIsDefaultValue(Item) then
+ Color := clBrightYellow
+ else
+ Color := ColorOfDataType(TRegDataType(Item.ImageIndex - iconFirstType));
+ end;
+end;
+
+procedure TValuesWin.ValueListDblClick(Sender: TObject);
+begin
+ ValueListChange(Sender, ValueList.ItemFocused, ctState);
+ MainPC.ActivePage := WorkWin.WorkPage;
+
+ if not Assigned(ValueList.ItemFocused) then
+ Exit;
+
+ if csDestroying in WorkWin.ComponentState then
+ Exit;
+
+ WorkWin.EditData;
+end;
+
+procedure TValuesWin.ValueListEditing(Sender: TObject; Item: TListItem;
+ var AllowEdit: Boolean);
+begin
+ if not ValueLabelClicked then begin
+ AllowEdit := False;
+ Exit; end;
+
+ if ItemIsDefaultValue(Item) then //unschön, aber beste Lösung bisher
+ Keyboard.SimKey(VK_DELETE);
+end;
+
+procedure TValuesWin.ValueListEdited(Sender: TObject; Item: TListItem;
+ var S: string);
+var
+ Old: string;
+ OldCaption: string;
+begin
+ OldCaption := Item.Caption;
+ Old := RealValueName(Item);
+
+ if s = Old then begin
+ if ItemIsDefaultValue(Item) then
+ s := DefaultValueCaption;
+ Exit; end;
+
+ SpyThread.Suspend;
+ try
+ Item.Caption := s;
+
+ if TryRenameValue(Old, s) then begin
+ SetRealValueName(Item, s); //Sichere Zuweisung des Standard-Flags
+ s := Item.Caption; //Anschließend externer Aufruf "Item.Caption := s"!
+ end else begin
+ s := OldCaption;
+ end;
+
+ finally
+ SpyThread.Restart := True;
+ SpyThread.Resume;
+ end;
+end;
+
+procedure TValuesWin.ValueListKeyDown(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+var
+ T: string;
+ Item: TListItem;
+begin
+ if ValueList.IsEditing then
+ Exit;
+
+ if csDestroying in TreeWin.ComponentState then
+ Exit;
+
+ Item := ValueList.ItemFocused;
+
+ case Key of
+ VK_SPACE: JumpToSel(ValueList);
+
+ VK_F9: SwapFonts(ValueList);
+
+ VK_F5: Reload;
+
+ VK_F12: begin //Sort
+ if Assigned(Item) then
+ T := Item.Caption;
+ ValueList.SortType := TSortType(2 - (Integer(ValueList.SortType)));
+ if ValueList.SortType = stNone then
+ TreeWin.RegTVChange(Sender, RegTV.Selected);
+ ValueList.ItemFocused := FindItem(ValueList, T);
+ if Assigned(ValueList.ItemFocused) then
+ ValueList.ItemFocused.MakeVisible(True);
+ end;
+
+ VK_DELETE: DeleteMIClick(Sender);
+
+ VK_RETURN: ValueListDblCLick(Sender);
+
+ Ord('C'):
+ if not ValueList.IsEditing then
+ CopyPathMIClick(Sender);
+
+ VK_SCROLL: CheckValueListHotTrack;
+ end;
+end;
+
+procedure TValuesWin.ValueListResize(Sender: TObject);
+begin
+ with ValueList do
+ Columns[3].Width := ClientWidth - (0 +
+ Columns[0].Width + Columns[1].Width + Columns[2].Width);
+end;
+
+procedure TValuesWin.DeleteValue;
+var
+ Item, NewSel: TListItem;
+ YesToAll: Boolean;
+ i: Integer;
+
+ procedure DeleteIt(Item: TListItem);
+ begin
+ OpenCurKey;
+ if MainReg.DeleteValue(RealValueName(Item))
+ and not MainReg.ValueReallyExists(RealValueName(Item)) then begin
+ Item.Delete;
+ end else begin
+ ShowMessage('Could not delete Value ' + Quote(RealValueName(Item)));
+ Inc(i);
+ end;
+ MainReg.CloseKey;
+
+ if IsMainValue(Item) then
+ RegTV.Repaint;
+ end;
+
+begin
+ SpyThread.Suspend;
+
+ NewSel := GetNextBestNotSelected(ValueList.ItemFocused);
+
+ YesToAll := False;
+ i := 0;
+ while i < ValueList.Items.Count do begin
+ Item := ValueList.Items[i];
+ if not Item.Selected then begin
+ Inc(i);
+ Continue; end;
+
+ if YesToAll then
+ DeleteIt(Item)
+ else begin
+ case MessageDlg('Do you really want to delete the Value ' +
+ Quote(RealValueName(Item)) + '?',
+ mtConfirmation, [mbYes, mbYesToAll, mbNo, mbCancel], 0) of
+ mrYes: DeleteIt(Item);
+ mrYesToAll: YesToAll := True;
+ mrCancel: Exit;
+ mrNo: begin
+ Item.Selected := False;
+ NewSel := Item;
+ end;
+ end;
+ end;
+ end;
+
+ if Assigned(NewSel) then begin
+ ValueList.ItemFocused := NewSel;
+ NewSel.Selected := True;
+ end else
+ WorkWin.ReInitShowPC;
+
+ SpyThread.Restart := True;
+ SpyThread.Resume;
+end;
+
+procedure TValuesWin.ZeromizeValue;
+var
+ Item: TListItem;
+ YesToAll: Boolean;
+ i: Integer;
+
+ procedure ZeromizeIt(Item: TListItem);
+ begin
+ with MainReg do begin
+ OpenCurKey;
+ ZeromizeValue(RealValueName(Item));
+ UpdateValue(MainReg, Item);
+ CloseKey;
+ end;
+ end;
+
+begin
+ SpyThread.Suspend;
+
+ YesToAll := False;
+ i := 0;
+ while i < ValueList.Items.Count do begin
+ Item := ValueList.Items[i];
+ if not Item.Selected then begin
+ Inc(i);
+ Continue; end;
+
+ if YesToAll then
+ ZeromizeIt(Item)
+ else
+ case MessageDlg('Do you really want to zeromize ValueData of ' +
+ Quote(RealValueName(Item)) + ' ?',
+ mtConfirmation, [mbYes, mbYesToAll, mbNo, mbCancel], 0) of
+
+ mrYes: begin
+ ZeromizeIt(Item);
+ Inc(i);
+ end;
+
+ mrYesToAll: begin
+ YesToAll := True;
+ ZeromizeIt(Item);
+ end;
+ mrCancel: Exit;
+ end;
+
+ if IsMainValue(Item) then
+ RegTV.Repaint;
+ end;
+
+
+ SpyThread.Resume;
+end;
+
+procedure TValuesWin.ValueListPUPopup(Sender: TObject);
+var
+ Writable, ValueOK, OnlyOneValue, OneValueOK: Boolean;
+ Item: TListItem;
+begin
+ if Assigned(ValueList.ItemFocused) then
+ ValueList.ItemFocused.Selected := True;
+
+ if csDestroying in (TreeWin.ComponentState + PrefWin.ComponentState) then
+ Exit;
+
+ Writable := not TreeWin.CantWrite;
+ NewDefaultValueMI.Visible := Writable;
+ NewStringMI.Visible := Writable;
+ NewDWORDMI.Visible := Writable;
+ NewBinaryMI.Visible := Writable;
+ NewMultiStringMI.Visible := Writable;
+ NewElseMI.Visible := Writable;
+
+ ValueOK := Writable and (ValueList.ItemFocused <> nil);
+ OnlyOneValue := ValueList.SelCount = 1;
+ OneValueOK := OnlyOneValue and ValueOK;
+
+ EditMI.Visible := ValueOK;
+ EditBinaryMI.Visible := ValueOK;
+ DublicateMI.Visible := OneValueOK;
+ CopyPathMI.Visible := OnlyOneValue;
+ CopyDataPreviewMI.Visible := OnlyOneValue;
+ TakeAsMainValueMI.Visible := OnlyOneValue;
+ RenameMI.Visible := OneValueOK;
+ DeleteMI.Visible := ValueOK;
+ ZeromizeMI.Visible := ValueOK;
+
+ Item := ValueList.ItemFocused;
+ if not Assigned(Item) then
+ Exit;
+
+ TakeAsMainValueMI.Checked := RealValueName(Item) = PrefWin.MainPreviewE.Text;
+end;
+
+procedure TValuesWin.FormKeyDown(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+begin
+ if ValueList.IsEditing then
+ Exit;
+
+ if csDestroying in MainWin.ComponentState then
+ Exit;
+ MainWin.FormKeyDown(Sender, Key, Shift);
+end;
+
+procedure TValuesWin.ValueListDeletion(Sender: TObject; Item: TListItem);
+begin
+ if Assigned(SpyThread) then
+ SpyThread.Restart := True;
+
+ if csDestroying in WorkWin.ComponentState then
+ Exit;
+
+ if Assigned(ShowPC.ActivePage)
+ and Item.Selected and Item.Focused then begin
+ ValueList.ItemFocused := GetNextBest(Item);
+ WorkWin.ReInitShowPC;
+ end;
+end;
+
+procedure TValuesWin.DeleteMIClick(Sender: TObject);
+begin
+ if ValueList.IsEditing then
+ Exit;
+
+ DeleteValue;
+end;
+
+procedure TValuesWin.RenameMIClick(Sender: TObject);
+begin
+ if Assigned(ValueList.ItemFocused) then begin
+ ValueLabelClicked := True;
+ ValueList.ItemFocused.EditCaption;
+ ValueLabelClicked := False;
+ end;
+end;
+
+procedure TValuesWin.NewBigEndianMIClick(Sender: TObject);
+begin
+ CreateValue(rdCardBigEndian);
+end;
+
+procedure TValuesWin.NewExpandStringMIClick(Sender: TObject);
+begin
+ CreateValue(rdExpandString);
+end;
+
+procedure TValuesWin.NewMultiStringMIClick(Sender: TObject);
+begin
+ CreateValue(rdMultiString);
+end;
+
+procedure TValuesWin.NewStrangeTypeMIClick(Sender: TObject);
+begin
+ CreateValue(TRegDataType(TMenuItem(Sender).Tag));
+end;
+
+procedure TValuesWin.NewDefaultValueMIClick(Sender: TObject);
+var
+ DefaultItem: TListItem;
+ i: Integer;
+begin
+ if csDestroying in (TreeWin.ComponentState + MainWin.ComponentState) then
+ Exit;
+ if TreeWin.CantWrite then
+ Exit;
+
+ with MainReg do begin
+ try
+ OpenCurKey;
+
+ if StandardValueExists then begin
+ ShowMessage('Default Value already exists.');
+ CloseKey;
+ Exit; end;
+
+ WriteString('', '');
+
+ if not StandardValueExists then begin
+ ShowMessage('Could not create Default Value.');
+ CloseKey;
+ Exit; end;
+
+ ValuesWin.AddValue(MainReg, '');
+ finally
+ CloseKey;
+ end;
+ end;
+
+ with ValueList.Items do begin
+ DefaultItem := nil;
+ for i := 0 to Count-1 do
+ if ItemIsDefaultValue(Item[i]) then
+ Break;
+
+ if i < Count then
+ DefaultItem := Item[i];
+ end;
+
+ if not Assigned(DefaultItem) then
+ ShowMessage('Error: Lost Default Value!')
+ else begin
+ SelectItemOnly(ValueList, DefaultItem);
+ MainWin.StatusBarUpdate;
+ ValueListDblClick(Sender);
+ end;
+end;
+
+procedure TValuesWin.ValueListChanging(Sender: TObject; Item: TListItem;
+ Change: TItemChange; var AllowChange: Boolean);
+begin
+ if Item = nil then
+ AllowChange := False;
+end;
+
+procedure TValuesWin.ValueListMouseDown(Sender: TObject; Button: TMouseButton;
+ Shift: TShiftState; X, Y: Integer);
+begin
+ ValueLabelClicked := False;
+ with ValueList do
+ if ([htOnIcon, htOnLabel] * GetHitTestInfoAt(X, Y)) <> [] then
+ ValueLabelClicked := True;
+end;
+
+procedure TValuesWin.EditBinaryMIClick(Sender: TObject);
+begin
+ if csDestroying in WorkWin.ComponentState then
+ Exit;
+
+ WorkWin.ShowAsBinary := True;
+ ValueListChange(Sender, ValueList.ItemFocused, ctState);
+ ValueListDblClick(Sender);
+end;
+
+procedure TValuesWin.EditMIClick(Sender: TObject);
+begin
+ ValueListDblClick(Sender);
+end;
+
+procedure TValuesWin.ValueListCustomDrawSubItem(Sender: TCustomListView;
+ Item: TListItem; SubItem: Integer; State: TCustomDrawState;
+ var DefaultDraw: Boolean);
+begin
+ with ValueList.Canvas.Font do begin
+ Style := [];
+ if SubItem = 1 then
+ Color := clSilver
+ else
+ Color := ColorOfDataType(TRegDataType(Item.ImageIndex - iconFirstType));
+ end;
+end;
+
+procedure TValuesWin.ValueListCompare(Sender: TObject; Item1, Item2: TListItem;
+ Data: Integer; var Compare: Integer);
+begin
+ case SortBy of
+ vlcName: Compare := AnsiCompareText(RealValueName(Item1), RealValueName(Item2));
+ vlcSize: Compare := Integer(
+ StrToIntDef(Item1.SubItems[SubItemIndex[vlcSize]], -1) >
+ StrToIntDef(Item2.SubItems[SubItemIndex[vlcSize]], -1));
+ vlcData: Compare := Integer(Item1.SubItems[SubItemIndex[vlcData]] >
+ Item2.SubItems[SubItemIndex[vlcData]]);
+ vlcType: Compare := Integer(Item1.ImageIndex > Item2.ImageIndex);
+ end;
+
+ if Assigned(SortByColumn)
+ and (SortByColumn.ImageIndex = iconSortArrowDesc) then
+ Compare := 1 - Compare;
+end;
+
+procedure TValuesWin.ValueListColumnClick(Sender: TObject; Column: TListColumn);
+begin
+ case Column.ImageIndex of
+ iconSortArrowAsc: Column.ImageIndex := iconSortArrowDesc;
+ iconSortArrowDesc: Column.ImageIndex := -1;
+ else
+ if Assigned(SortByColumn) then
+ SortByColumn.ImageIndex := -1;
+ if TValueListColumn(Column.Tag) in ValueListColumnRange then
+ SortBy := TValueListColumn(Column.Tag)
+ else
+ ShowMessage('Unknown Column Tag');
+ Column.ImageIndex := iconSortArrowAsc;
+ end;
+
+ if Column.ImageIndex = -1 then
+ ValueList.SortType := stNone
+ else begin
+ ValueList.SortType := stData;
+ SortByColumn := Column;
+ end;
+
+ Update;
+ ValueList.AlphaSort;
+end;
+
+procedure TValuesWin.CloneValue;
+var
+ OldName, NewName: string;
+
+ function GetNewName(Reg: TXRegistry; const OldName: string): string;
+ var
+ i: Integer;
+ Prefix: string;
+ begin
+ if OldName = '' then
+ Result := 'New Default Value'
+ else if Copy(OldName, 1, 4) <> 'New ' then
+ Result := 'New ' + OldName
+ else
+ Result := OldName;
+
+ Prefix := Result;
+ i := 1;
+ while Reg.ValueExists(Result) do begin
+ Result := Prefix + ' ' + IntToStr(i);
+ Inc(i);
+ end;
+ end;
+
+begin
+ if csDestroying in TreeWin.ComponentState then
+ Exit;
+
+ if TreeWin.CantWrite then
+ Exit;
+
+ OldName := RealValueName(ValueList.ItemFocused);
+
+ try
+ OpenCurKey;
+
+ NewName := GetNewName(MainReg, OldName);
+ MainReg.CopyValue(OldName, NewName);
+ AddValue(MainReg, NewName);
+ finally
+ MainReg.CloseKey;
+ end;
+end;
+
+procedure TValuesWin.DublicateMIClick(Sender: TObject);
+begin
+ CloneValue;
+end;
+
+procedure TValuesWin.CopyDataPreviewMIClick(Sender: TObject);
+begin
+ if ValueList.IsEditing then
+ Exit;
+
+ CopyDataPreview;
+end;
+
+procedure TValuesWin.CopyDataPreview;
+begin
+ OpenCurKey;
+ Clipboard.AsText := DataPreviewOfContext(MainReg.ReadContext(
+ RealValueName(ValueList.ItemFocused)));
+ MainReg.CloseKey;
+end;
+
+procedure TValuesWin.UpdateValues(SelectedOnly: Boolean = False);
+var
+ i: Integer;
+ Reg: TXRegistry;
+begin
+ if not Started then
+ Exit;
+
+ SpyThread.Suspend;
+
+ Reg := TXRegistry.Create;
+ try
+ if OpenNodeOK(Reg, RegTV.Selected) then
+ with ValueList.Items do begin
+ for i := 0 to Count-1 do begin
+ if SelectedOnly and not Item[i].Selected then
+ Continue;
+ UpdateValue(Reg, Item[i]);
+ end;
+ end;
+ finally
+ Reg.Free;
+ end;
+
+ SpyThread.Resume;
+end;
+
+function TValuesWin.TryRenameValue(OldName: string;
+ var NewName: string): Boolean;
+var
+ x: string;
+begin
+ Result := False;
+ if OldName = NewName then
+ Exit;
+
+ if (Length(NewName) > RegMaxValueNameLen) then begin
+ NewName := Copy(NewName, 1, RegMaxValueNameLen);
+ if MessageDlg(
+ 'The maximum size of a value name is ' + IntToStr(RegMaxValueNameLen) + ' characters.' + EOL +
+ 'Shorten the value name to:' + EOL +
+ Quote(StringWrap(NewName, 80)),
+ mtConfirmation, [mbOK, mbCancel], 0) <> mrOK then
+ Exit;
+ end;
+
+ if CharIn(NewName, [#0..#31]) then begin
+ NewName := ReplaceChars(NewName, [#0..#31], '#');
+ if MessageDlg('The following chars are not allowed in ValueNames:' + EOL +
+ '- Control chars (#0..#31)' + EOL +
+ 'The following name is allowed:' + EOL +
+ NewName + EOL +
+ 'Use this name instead?',
+ mtConfirmation, [mbYes, mbNo], 0) <> mrYes then
+ Exit;
+ end;
+
+ if not OpenCurKey then
+ Exit;
+
+ if SameText(OldName, NewName) then begin //CharCase ändern
+ x := MainReg.GetFreeValueName;
+ MainReg.RenameValue(OldName, x);
+ MainReg.RenameValue(x, NewName);
+ end else begin
+ if not MainReg.ValueReallyExists(NewName) then begin
+ MainReg.RenameValue(OldName, NewName);
+ end else begin
+ if NewName = '' then
+ ShowMessage('Default value already exists.')
+ else
+ ShowMessage('Value ' + Quote(NewName) + ' already exists.');
+ Exit; end;
+ end;
+ MainReg.CloseKey;
+
+ if TextIn(NewName, 'default') then
+ AddHint('You can create default values by empty string ValueNames.');
+
+ Result := True;
+end;
+
+procedure TValuesWin.ZeromizeMIClick(Sender: TObject);
+begin
+ ZeromizeValue;
+end;
+
+procedure TValuesWin.CopyPathMIClick(Sender: TObject);
+begin
+ if ValueList.IsEditing then
+ Exit;
+
+ if csDestroying in MainWin.ComponentState then
+ Exit;
+
+ MainWin.CopyPathClick(Sender);
+end;
+
+function TValuesWin.FindItemByRealName(const ValueName: string): Integer;
+begin
+ with ValueList.Items do begin
+ for Result := 0 to Count-1 do
+ if SameText(RealValueName(Item[Result]), ValueName) then
+ Exit;
+ end;
+ Result := -1;
+end;
+
+function TValuesWin.FocusItem(ARealValueName: string;
+ FocusValueList: Boolean = False): Boolean;
+var
+ i: Integer;
+begin
+ with ValueList do begin
+ i := FindItemByRealName(ARealValueName);
+
+ if (i > -1) and (i < Items.Count) then
+ Selected := Items[i]
+ else
+ Selected := nil;
+
+ ItemFocused := Selected;
+
+ Result := Assigned(Selected);
+ if Result then
+ JumpToSel(ValueList);
+
+ if FocusValueList then
+ FocusControl(ValueList);
+ end;
+end;
+
+procedure TValuesWin.TakeAsMainValueMIClick(Sender: TObject);
+var
+ Item: TListItem;
+ ValueName: string;
+begin
+ if csDestroying in PrefWin.ComponentState then
+ Exit;
+
+ Item := ValueList.ItemFocused;
+ if not Assigned(Item) then
+ Exit;
+
+ ValueName := RealValueName(Item);
+ with PrefWin.MainPreviewE do
+ if ValueName = Text then
+ Text := ''
+ else
+ Text := ValueName;
+end;
+
+procedure TValuesWin.InitListColumnTags;
+var
+ i: Integer;
+begin
+ for i := 0 to ValueList.Columns.Count-1 do
+ with ValueList.Columns.Items[i] do begin
+ Tag := -1;
+ if Caption = 'Name' then
+ Tag := Integer(vlcName)
+ else if Caption = 'Size' then
+ Tag := Integer(vlcSize)
+ else if Caption = 'Type' then
+ Tag := Integer(vlcType)
+ else if Caption = 'Data' then
+ Tag := Integer(vlcData)
+ else
+ ShowMessage(Format('Error: Unknown ValueList.Columns[%d].Caption = "%s"',
+ [Index, Caption]));
+ if Tag > -1 then
+ SubItemIndex[TValueListColumn(Tag)] := Index - 1;
+ end;
+end;
+
+procedure TValuesWin.FormShow(Sender: TObject);
+begin
+ InitListColumnTags;
+end;
+
+procedure TValuesWin.Reload(JumpToNewValue: Boolean = False;
+ ValueName: string = '');
+var
+ Sel: TListItem;
+ SelIndex: Integer;
+ SelRealValueName: string;
+begin
+ if csDestroying in TreeWin.ComponentState then
+ Exit;
+
+ SelIndex := -1;
+ if JumpToNewValue then
+ SelRealValueName := ValueName
+ else begin
+ Sel := ValueList.ItemFocused;
+ if Assigned(Sel) then
+ SelIndex := Sel.Index;
+
+ if SelIndex > -1 then
+ SelRealValueName := RealValueName(ValueList.Items[SelIndex]);
+ end;
+
+ TreeWin.RegTVChange(Self, RegTV.Selected);
+
+ if SelIndex > -1 then
+ if not FocusItem(SelRealValueName, True) then begin
+ SelIndex := GetBestIndex(ValueList, SelIndex);
+ if SelIndex > -1 then
+ with ValueList do begin
+ Selected := Items[SelIndex];
+ ItemFocused := Selected;
+ end;
+ end;
+end;
+
+procedure TValuesWin.LoadValues(Reg: TXRegistry);
+var
+ SL: TStringList;
+ i: Integer;
+ Clock: TClock;
+begin
+ if csDestroying in WorkWin.ComponentState then
+ Exit;
+
+ with ValueList.Items do begin
+ Clock := TClock.Create(1, tfSecs);
+ ValueList.Enabled := False;
+ BeginUpdate;
+ try
+ Clear;
+ WorkWin.ReInitShowPC;
+
+ SL := TStringList.Create;
+ try
+ Reg.GetValueNames(SL);
+ for i := 0 to SL.Count-1 do
+ ValuesWin.AddValue(Reg, SL[i]);
+ finally
+ SL.Free;
+ end;
+
+ finally
+ EndUpdate;
+ ValueList.Enabled := True;
+ Clock.Stop;
+ if MurphyMode then
+ AddHint(Format('Values loaded after %0.2f secs.', [Clock.SecsPassed]));
+ Clock.Free;
+ end;
+ end;
+end;
+
+procedure TValuesWin.FormClose(Sender: TObject; var Action: TCloseAction);
+begin
+// Action := caNone;
+end;
+
+procedure TValuesWin.ValueListClick(Sender: TObject);
+begin
+ CheckValueListHotTrack;
+ if ValueList.HotTrack then
+ ValueListDblClick(Sender);
+end;
+
+procedure TValuesWin.CheckValueListHotTrack;
+const
+ StyleOfSwitch: array[Boolean] of TListHotTrackStyles = (
+ [], [htHandPoint, htUnderlineHot] );
+var
+ NewHotTrack: Boolean;
+begin
+ if csDestroying in PrefWin.ComponentState then
+ Exit;
+
+ NewHotTrack := ScrollON xor PrefWin.ValuesSingleClickCB.Checked;
+ if NewHotTrack = ValueList.HotTrack then Exit;
+
+ with ValueList do begin
+ HotTrack := NewHotTrack;
+ HotTrackStyles := StyleOfSwitch[HotTrack];
+ Mouse.CursorPos := Mouse.CursorPos;
+ end;
+end;
+
+procedure TValuesWin.SelectAllMIClick(Sender: TObject);
+var
+ i: Integer;
+begin
+ with ValueList.Items do
+ for i := 0 to Count-1 do
+ Item[i].Selected := True;
+end;
+
+procedure TValuesWin.InvertSelectionMIClick(Sender: TObject);
+var
+ i: Integer;
+begin
+ with ValueList.Items do
+ for i := 0 to Count-1 do
+ Item[i].Selected := not Item[i].Selected;
+end;
+
+procedure TValuesWin.FormDestroy(Sender: TObject);
+begin
+ ValueNames.Free;
+end;
+
+end.
+unit WorkU;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, StdCtrls, ComCtrls, NewPanels, Grids, Clipbrd,
+ IntEdit, ExtCtrls, Menus, YTools, CompEx, PlutoConst,
+ XReg, Clock, Colors, ShellAPI, IniFiles, Math,
+ keybrd, Buttons, YTypes, LinkLabel, start,
+ PrefTools, ImgList, PHexMemo, PipelineTh, DropSource, DropTarget,
+ CrackTools;
+
+type
+ TColorStringFmt = (csfThreeSpacedDecimals);
+
+ TWorkWin = class(TForm)
+ StringPU: TPopupMenu;
+ SpaceMI: TMenuItem;
+ FileMI: TMenuItem;
+ FileOpenD: TOpenDialog;
+ MainPC: TPageControl;
+ HintPage: TTabSheet;
+ Splitter1: TSplitter;
+ HintLB: TListBox;
+ InfoMemo: TMemo;
+ WorkPage: TTabSheet;
+ WorkP: TPanel;
+ ShowPC: TPageControl;
+ StringPage: TTabSheet;
+ BorderPanel1: TBorderPanel;
+ StringE: TEdit;
+ OKStringB: TButton;
+ BoolStrCB: TCheckBox;
+ CancelStringB: TButton;
+ StringAsColorP: TPanel;
+ StringAsFileP: TBorderPanel;
+ IconImage: TImage;
+ IntPage: TTabSheet;
+ BorderPanel5: TBorderPanel;
+ OKIntB: TButton;
+ CardBoolCB: TCheckBox;
+ CancelIntB: TButton;
+ BinaryPage: TTabSheet;
+ BorderPanel6: TBorderPanel;
+ Panel2: TPanel;
+ Label5: TLabel;
+ OffsetHE: THexEdit;
+ OKBinaryB: TButton;
+ CancelBinaryB: TButton;
+ StringTypeRG: TRadioGroup;
+ SpyPage: TTabSheet;
+ BorderPanel2: TBorderPanel;
+ SpyResumeB: TButton;
+ SpySuspendB: TButton;
+ SpyLB: TListBox;
+ Label4: TLabel;
+ Label7: TLabel;
+ CardTypeRG: TRadioGroup;
+ MultiStringPage: TTabSheet;
+ BorderPanel7: TBorderPanel;
+ OKMultiStringB: TButton;
+ CancelMultiStringB: TButton;
+ MultiStringM: TMemo;
+ DataTypeComB: TComboBox;
+ CardinalE: TCardEdit;
+ ColorDlg: TColorDialog;
+ MultiStringOpenD: TOpenDialog;
+ MultiStringSaveD: TSaveDialog;
+ MultiStringPU: TPopupMenu;
+ LadenMI: TMenuItem;
+ SpeichernMI: TMenuItem;
+ Hinzufgen1: TMenuItem;
+ N1: TMenuItem;
+ SisyPage: TTabSheet;
+ SpyClearTracesB: TButton;
+ Label11: TLabel;
+ HexEdit1: THexEdit;
+ Label12: TLabel;
+ Label13: TLabel;
+ SortMultiStringMI: TMenuItem;
+ SpyTestL: TLabel;
+ Panel3: TPanel;
+ CurValueE: TEdit;
+ BorderPanel8: TBorderPanel;
+ BorderPanel9: TBorderPanel;
+ SisyTV: TTreeView;
+ TabImages: TImageList;
+ ChangeImages: TImageList;
+ Panel7: TPanel;
+ ColorPanel1: TColorPanel;
+ Splitter2: TSplitter;
+ SpyDelayIE: TPrefIntEdit;
+ ListTracesCB: TPrefCheckBox;
+ Panel5: TPanel;
+ Panel8: TPanel;
+ SisyExpandGroupsCB: TPrefCheckBox;
+ ClearChangesB: TButton;
+ FilterChangesB: TButton;
+ SisyTVPU: TPopupMenu;
+ SisyGotoKeyMI: TMenuItem;
+ SisyDeleteChangeMI: TMenuItem;
+ SisyActivateChangeMI: TMenuItem;
+ N3: TMenuItem;
+ SisyCopyPathMI: TMenuItem;
+ N4: TMenuItem;
+ Panel9: TPanel;
+ ExternalEditB: TButton;
+ LoadExternalB: TButton;
+ ReloadStringB: TButton;
+ BinaryHM: TPHexMemo;
+ PipelineCB: TCheckBox;
+ ReloadDWordB: TButton;
+ ReloadBinaryB: TButton;
+ ReloadMultiStringB: TButton;
+ DescL: TLabel;
+ SisyHKUCB: TPrefCheckBox;
+ SisyHKLMCB: TPrefCheckBox;
+ SisyHKUL: TLabel;
+ SisyHKLML: TLabel;
+ SisyListCB: TPrefCheckBox;
+ CardSpecial0B: TButton;
+ CardSpecial1B: TButton;
+ CardSpecial_1B: TButton;
+ CardSpecial7FB: TButton;
+ SisyPU: TPopupMenu;
+ Idle1: TMenuItem;
+ Lowest1: TMenuItem;
+ Lower1: TMenuItem;
+ Normal1: TMenuItem;
+ Higher1: TMenuItem;
+ Highes1: TMenuItem;
+ SisyShowCurrentPathMI: TMenuItem;
+ N5: TMenuItem;
+ MultiStringTypeRG: TRadioGroup;
+ SeparatorE: TEdit;
+ Label1: TLabel;
+ MultiStringCountL: TLabel;
+ DropFileTarget: TDropFileTarget;
+ CryptoPage: TTabSheet;
+ BorderPanel3: TBorderPanel;
+ CryptoE: TEdit;
+ OKCryptoB: TButton;
+ CancelCryptoB: TButton;
+ ReloadCryptoB: TButton;
+ CryptoTypeRG: TRadioGroup;
+ Label2: TLabel;
+ LinkLabel2: TLinkLabel;
+ procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
+ procedure SpyResumeBClick(Sender: TObject);
+ procedure SpySuspendBClick(Sender: TObject);
+ procedure ArrPlutoBClick(Sender: TObject);
+ procedure ArrRegEdBClick(Sender: TObject);
+ procedure ArrFreeBClick(Sender: TObject);
+ procedure ArrBigValBClick(Sender: TObject);
+
+ procedure SpaceMIClick(Sender: TObject);
+ procedure FileMIClick(Sender: TObject);
+ procedure HintLBClick(Sender: TObject);
+ procedure MainPCDrawTab(Control: TCustomTabControl; TabIndex: Integer; const Rect: TRect; Active: Boolean);
+ procedure ValueMIClick(Sender: TObject);
+ procedure StringEKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
+ procedure StringEChange(Sender: TObject);
+ procedure OKStringBClick(Sender: TObject);
+ procedure BoolStrCBClick(Sender: TObject);
+ procedure CardinalEChange(Sender: TObject);
+ procedure CardBoolCBClick(Sender: TObject);
+ procedure CardinalEKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
+ procedure OKIntBClick(Sender: TObject);
+ procedure ShowPCChange(Sender: TObject);
+ procedure ShowPCChanging(Sender: TObject; var AllowChange: Boolean);
+ procedure ShowPCDrawTab(Control: TCustomTabControl; TabIndex: Integer; const Rect: TRect; Active: Boolean);
+ procedure ShowPCMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
+ procedure FormCreate(Sender: TObject);
+ procedure OKBinaryBClick(Sender: TObject);
+ procedure HexGrid1Click(Sender: TObject);
+ procedure HexGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
+ procedure BoolStrPopup(Sender: TObject);
+ procedure StringPageEnter(Sender: TObject);
+ procedure IntPageEnter(Sender: TObject);
+ procedure BinaryPageEnter(Sender: TObject);
+ procedure ReInitShowPC;
+ procedure ActivateIt(Sender: TObject);
+ procedure DeActivateIt(Sender: TObject);
+ procedure FormDeactivate(Sender: TObject);
+ procedure FormActivate(Sender: TObject);
+ procedure MultiStringMChange(Sender: TObject);
+ procedure OKMultiStringBClick(Sender: TObject);
+ procedure StringAsColorPDblClick(Sender: TObject);
+ procedure MultiStringMEnter(Sender: TObject);
+ procedure LadenMIClick(Sender: TObject);
+ procedure SpeichernMIClick(Sender: TObject);
+ procedure Hinzufgen1Click(Sender: TObject);
+ procedure CancelBClick(Sender: TObject);
+ procedure HexGrid1Enter(Sender: TObject);
+ procedure SpyClearTracesBClick(Sender: TObject);
+ procedure SpyLBKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
+ //procedure BinLMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
+ procedure BinLClick(Sender: TObject);
+ procedure HexGrid1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
+ procedure ValueViewChanged(Sender: TObject);
+ procedure HexEdit1Change(Sender: TObject);
+ procedure SortMultiStringMIClick(Sender: TObject);
+ procedure SpyTestLClick(Sender: TObject);
+ procedure FocusForEditing;
+ procedure CurValueEKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
+ procedure CurValueEEnter(Sender: TObject);
+
+ procedure AddAHint(const Hint: string);
+ procedure SisyTVGetSelectedIndex(Sender: TObject; Node: TTreeNode);
+ procedure SisyTVDblClick(Sender: TObject);
+ procedure SisyTVKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
+ procedure SisyCBClick(Sender: TObject);
+ procedure BinaryHMLineChange(NewLine: Cardinal);
+ procedure OffsetHEChange(Sender: TObject);
+ procedure SpyDelayIEChange(Sender: TObject);
+ procedure SisyTVExpanded(Sender: TObject; Node: TTreeNode);
+ procedure ClearChangesBClick(Sender: TObject);
+ procedure FilterChangesBClick(Sender: TObject);
+ procedure SisyTVPUPopup(Sender: TObject);
+ procedure SisyActivateChangeMIClick(Sender: TObject);
+ procedure SisyDeleteChangeMIClick(Sender: TObject);
+ procedure SisyCopyPathMIClick(Sender: TObject);
+ procedure ExternalEditBClick(Sender: TObject);
+ procedure LoadExternalBClick(Sender: TObject);
+ procedure ReloadBClick(Sender: TObject);
+ procedure PipelineCBClick(Sender: TObject);
+ procedure BinaryHMEnter(Sender: TObject);
+ procedure xUseExtendedModelCBClick(Sender: TObject);
+ procedure SeparatorEChange(Sender: TObject);
+ procedure HintLBKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
+ procedure DWORDSpecialBClick(Sender: TObject);
+ procedure Button1Click(Sender: TObject);
+ procedure SisyPUPopup(Sender: TObject);
+ procedure SisyPriorityMIClick(Sender: TObject);
+ procedure SisyShowCurrentPathMIClick(Sender: TObject);
+ procedure DropFileTargetDrop(Sender: TObject; ShiftState: TShiftState;
+ Point: TPoint; var Effect: Integer);
+ procedure FormClose(Sender: TObject; var Action: TCloseAction);
+ procedure FormResize(Sender: TObject);
+ procedure IconImageDblClick(Sender: TObject);
+ procedure SisyTVCustomDrawItem(Sender: TCustomTreeView;
+ Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
+ procedure SisyTVMouseDown(Sender: TObject; Button: TMouseButton;
+ Shift: TShiftState; X, Y: Integer);
+ procedure OKCryptoBClick(Sender: TObject);
+ procedure CryptoEKeyDown(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+ private
+ PipelineThread: TPipelineThread;
+ BoolStr: array of array[Boolean] of string;
+ HexEditAutoChange: Boolean;
+ TargetPage: TTabSheet;
+ procedure DeleteChange(Node: TTreeNode);
+ procedure DeactivateChange(Node: TTreeNode);
+ procedure CopySelectedChangeName;
+ procedure ClearChanges;
+ public
+ ShowAsBinary: Boolean;
+ function LastHint: string;
+ function LoadBoolStr: Boolean;
+ function LoadSisyFilter: Boolean;
+ procedure ShowValues(Reg: TXRegistry);
+ procedure UpdateWriteButtons;
+ procedure EditData;
+ end;
+
+var
+ WorkWin: TWorkWin;
+ ShowPC: TPageControl;
+ MainPC: TPageControl;
+
+implementation
+
+uses TreeU, ValuesU, plutomain, splash, SisyphusTH, PrefU, ShellEx;
+
+{$R *.dfm}
+
+function ColorOfString(s: string; Format: TColorStringFmt;
+ Default: TColor = clBlack): TColor;
+var
+ SA: TStrA;
+ i: Integer;
+begin
+ Result := Default;
+ SA := nil;
+
+ case Format of
+ csfThreeSpacedDecimals: begin
+ SA := Split(s, ' ');
+ if Length(SA) <> 3 then
+ Exit;
+ for i := 0 to 2 do
+ if not (IsValidInteger(SA[i]) and (StrToIntDef(SA[i], -1) in [0..255])) then
+ Exit;
+ Result := ColorOfRGB(StrToIntDef(SA[0], 0),
+ StrToIntDef(SA[1], 0),
+ StrToIntDef(SA[2], 0));
+ end;
+ end;
+end;
+
+function StringOfColor(Color: TColor; Format: TColorStringFmt): string;
+var
+ RGB: TRGB;
+begin
+ Result := '';
+
+ RGB := RGBOfColor(Color);
+ case Format of
+ csfThreeSpacedDecimals: begin
+ with RGB do
+ Result := IntToStr(R) + ' ' + IntToStr(G) + ' ' + IntToStr(B);
+ end;
+ end;
+end;
+
+function TWorkWin.LastHint: string;
+begin
+ with HintLB.Items do
+ if Count > 0 then
+ Result := Strings[Count-1]
+ else
+ Result := '';
+end;
+
+procedure TWorkWin.AddAHint(const Hint: string);
+begin
+ if not Assigned(HintLB) then
+ Exit;
+
+ with HintLB.Items do begin
+ if Count > 0 then begin
+ if StrAtBegin(LastHint, Hint) then begin //same hint again
+ with HintLB do
+ Tag := Tag + 1;
+ Strings[Count-1] := Format('%s (%d)', [Hint, HintLB.Tag]);
+ Exit end else
+ HintLB.Tag := 1;
+ end;
+ Add(Hint);
+ end;
+ Application.ProcessMessages; //draw
+// Sleep(1000); //wait to read hints
+end;
+
+procedure TWorkWin.ReInitShowPC;
+begin
+ with CurValueE do begin
+ Text := NoValueCaption;
+ Font.Color := clSilver;
+ Enabled := False;
+ end;
+
+ ShowPC.ActivePage := nil;
+
+ StringE.Text := '';
+ StringTypeRG.ItemIndex := 0;
+
+ MultiStringTypeRG.Buttons[1].Enabled := False;
+
+ CardinalE.Value := 0;
+ CardTypeRG.ItemIndex := 0;
+
+ BinaryHM.Data := nil;
+ PipelineCB.Checked := False;
+
+ DataTypeComB.ItemIndex := Integer(rdBinary);
+
+ MultiStringM.Clear;
+end;
+
+procedure TWorkWin.FormKeyDown(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+begin
+ MainWin.FormKeyDown(Sender, Key, Shift);
+end;
+
+procedure TWorkWin.SpyResumeBClick(Sender: TObject);
+begin
+ SpyThread.Resume;
+ SpyTestLClick(Sender);
+end;
+
+procedure TWorkWin.SpySuspendBClick(Sender: TObject);
+begin
+ SpyThread.Suspend;
+ SpyTestLClick(Sender);
+end;
+
+procedure TWorkWin.ArrPlutoBClick(Sender: TObject);
+begin
+ ArrangePlutoStyle;
+end;
+
+procedure TWorkWin.ArrRegEdBClick(Sender: TObject);
+begin
+ ArrangeRegEdStyle;
+end;
+
+procedure TWorkWin.ArrFreeBClick(Sender: TObject);
+begin
+ ArrangeFreeStyle;
+end;
+
+procedure TWorkWin.ArrBigValBClick(Sender: TObject);
+begin
+ ArrangeBigValStyle;
+end;
+
+procedure TWorkWin.SpaceMIClick(Sender: TObject);
+begin
+ StringE.Text := '';
+end;
+
+procedure TWorkWin.HintLBClick(Sender: TObject);
+begin
+ StatusBar.Panels[0].Text := GetSel(HintLB);
+ WorkWin.InfoMemo.Text := StatusBar.Panels[0].Text;
+end;
+
+procedure TWorkWin.MainPCDrawTab(Control: TCustomTabControl; TabIndex: Integer;
+ const Rect: TRect; Active: Boolean);
+var
+ PC: TPageControl;
+ Page: TTabSheet;
+begin
+ PC := TPageControl(Control);
+ Page := PC.Pages[TabIndex];
+ with PC.Canvas.Font do begin
+ if Page.Caption = 'Hint' then
+ Color := clBrightRed
+ else if Page.Caption = 'Edit' then
+ Color := clBrightGreen
+ else if Page.Caption = 'Spy' then
+ Color := clBrightBlue
+ else if Page.Caption = 'Sisyphus' then
+ Color := clBrightCyan
+ else
+ Color := clWhite;
+ end;
+
+ with PC.Canvas do
+ if Active then begin
+ Font.Style := [fsBold];
+ Brush.Color := clDarkGray;
+ FillRect(Rect);
+ TextOut(Rect.Left + 18 + 5, Rect.Top + 3, Page.Caption);
+ PC.Images.Draw(PC.Canvas, Rect.Left + 4, Rect.Top + 2, Page.ImageIndex);
+ end else begin
+ Font.Style := [];
+ Brush.Color := clDarkGray;
+ FillRect(Rect);
+ TextOut(Rect.Left + 18 + 3, Rect.Top + 2, Page.Caption);
+ PC.Images.Draw(PC.Canvas, Rect.Left + 1, Rect.Top + 1, Page.ImageIndex);
+ end;
+end;
+
+procedure TWorkWin.ValueMIClick(Sender: TObject);
+begin
+ StringE.Text := UntilStr(TMenuItem(Sender).Caption,' = ');
+ OKStringBClick(Sender);
+end;
+
+procedure TWorkWin.StringEKeyDown(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+begin
+ if key = VK_RETURN then begin
+ OKStringBClick(Sender);
+ ValuesWin.FocusControl(ValueList);
+ end;
+ if key = VK_ESCAPE then
+ CancelBClick(Sender);
+end;
+
+procedure TWorkWin.StringEChange(Sender: TObject);
+var
+ i: Integer;
+ State: TCheckBoxState;
+ Desc: string;
+begin
+ IconImage.Picture := nil;
+
+ with StringAsColorP do begin
+ Color := ColorOfString(StringE.Text, csfThreeSpacedDecimals, -1);
+ Visible := Color <> -1;
+ end;
+
+ try
+ with IconImage.Picture.Icon do begin
+ ReleaseHandle;
+ Handle := GetIconFromFile(StringE.Text);
+ StringAsFileP.Visible := Handle <> 0;
+ end;
+ except
+ end;
+
+ State := cbGrayed;
+ for i := 0 to High(BoolStr) do begin
+ if StringE.Text = BoolStr[i][False] then
+ State := cbUnchecked
+ else if StringE.Text = BoolStr[i][True] then
+ State := cbChecked
+ else
+ Continue;
+ Break;
+ end;
+
+ BoolStrCB.Visible := State in [cbChecked, cbUnchecked];
+ BoolStrCB.State := State;
+
+ Desc := StringE.Text;
+ Desc := RegNameOfCLSID(Desc);
+ with DescL do begin
+ Visible := (Desc <> '');
+ if Visible then
+ Caption := 'CLSID is: ' + Desc;
+ end;
+end;
+
+procedure TWorkWin.OKStringBClick(Sender: TObject);
+var
+ i: Integer;
+begin
+ try
+ OpenCurKey;
+ with ValuesWin.ValueNames do
+ for i := 0 to Count-1 do begin
+ case StringTypeRG.ItemIndex of
+ 0: MainReg.WriteString(Strings[i], StringE.Text);
+ 1: MainReg.WriteExpandString(Strings[i], StringE.Text);
+ end;
+ end;
+ ValuesWin.UpdateValues(True);
+ finally
+ MainReg.CloseKey;
+ end;
+ ValuesWin.ValueListDblClick(Sender);
+end;
+
+procedure TWorkWin.BoolStrCBClick(Sender: TObject);
+var
+ i: Integer;
+begin
+ for i := 0 to High(BoolStr) do begin
+ if (BoolStr[i, False] = StringE.Text)
+ or (BoolStr[i, True] = StringE.Text) then
+ Break;
+ end;
+
+ if i > High(BoolStr) then
+ Exit;
+
+ StringE.Text := BoolStr[i][BoolStrCB.Checked];
+end;
+
+procedure TWorkWin.CardinalEChange(Sender: TObject);
+begin
+ HexEditAutoChange := True;
+ with CardBoolCB do begin
+ Enabled := True;
+ case CardinalE.Value of
+ 1: Checked := True;
+ 0: Checked := False;
+ else
+ Enabled := False;
+ end;
+ end;
+ HexEdit1.Value := CardinalE.Value;
+ HexEditAutoChange := False;
+end;
+
+procedure TWorkWin.CardBoolCBClick(Sender: TObject);
+begin
+ if HexEditAutoChange then
+ Exit;
+ CardinalE.Value := Ord(CardBoolCB.Checked);
+end;
+
+procedure TWorkWin.CardinalEKeyDown(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+begin
+ if key = VK_RETURN then begin
+ OKIntBClick(Sender);
+ ValuesWin.FocusControl(ValueList);
+ end;
+
+ if key = VK_ESCAPE then
+ CancelBClick(Sender);
+end;
+
+procedure TWorkWin.OKIntBClick(Sender: TObject);
+var
+ i: Integer;
+
+ procedure Write4BB(const ValueName: string; Value: Cardinal);
+ var
+ Typ: TRegDataType;
+ begin
+ if MainReg.ValueReallyExists(ValueName) then
+ Typ := MainReg.GetDataType(ValueName)
+ else
+ Typ := rdBinary;
+
+ if Typ in rdCardTypes then
+ Typ := rdBinary;
+
+ MainReg.WriteBinType(ValueName, ByteAOfInt(CardinalE.Value), Typ);
+ end;
+
+begin
+ try
+ OpenCurKey;
+ with ValuesWin.ValueNames do
+ for i := 0 to Count-1 do begin
+ case CardTypeRG.ItemIndex of
+ 0: MainReg.WriteCardinal(Strings[i], CardinalE.Value);
+ 1: MainReg.WriteCardinal(Strings[i], CardinalE.Value, True);
+ 2: Write4BB(Strings[i], CardinalE.Value);
+ end;
+ end;
+ ValuesWin.UpdateValues(True);
+ finally
+ MainReg.CloseKey;
+ end;
+end;
+
+procedure TWorkWin.ShowPCChange(Sender: TObject);
+begin
+ FocusControl(TObject(ShowPC.ActivePage.Tag) as TWinControl);
+end;
+
+procedure TWorkWin.ShowPCChanging(Sender: TObject; var AllowChange: Boolean);
+
+ function ByteAOfDWORD(a: DWORD): TByteA;
+ begin
+ SetLength(Result, SizeOf(DWORD));
+ Move(a, Pointer(Result)^, SizeOf(DWORD));
+ end;
+
+var
+ SourcePage: TTabSheet;
+ ValueName: string;
+begin
+ SourcePage := ShowPC.ActivePage;
+ if SourcePage = IntPage then begin
+
+ if TargetPage = StringPage then begin
+ AddHint('Converting: DWORD --> String');
+ StringE.Text := CardinalE.Text;
+ end else if TargetPage = BinaryPage then begin
+ AddHint('Converting: DWORD --> Binary');
+ BinaryHM.Data := ByteAOfDWORD(CardinalE.Value);
+ end else
+ AllowChange := False;
+
+ end else if SourcePage = StringPage then begin
+ if TargetPage = IntPage then begin
+ if IsValidCardinal(StringE.Text) then begin
+ AddHint('Converting: String --> DWORD');
+ CardinalE.Text := StringE.Text;
+ end else begin
+ AddHint('This no valid DWORD; Converting aborted.', True);
+ AllowChange := False;
+ end;
+ end else if TargetPage = BinaryPage then begin
+ AddHint('Converting: String --> Binary');
+ BinaryHM.Data := TByteA(StringE.Text);
+ end else if TargetPage = MultiStringPage then begin
+ AddHint('Converting: String --> MultiString');
+ if SeparatorE.Text = '' then
+ MultiStringM.Text := StringE.Text;
+ SeparatorEChange(Sender);
+ end else
+ AllowChange := False;
+
+ end else if SourcePage = BinaryPage then begin
+ if TargetPage = StringPage then begin
+ AddHint('Converting: Binary --> String');
+ StringE.Text := FriendlyStr(string(BinaryHM.Data));
+ end else if TargetPage = IntPage then begin
+ if Length(BinaryHM.Data) >= SizeOf(DWORD) then begin
+ AddHint('Converting: Binary --> DWORD');
+ CardinalE.Value := PDWORD(BinaryHM.Data)^;
+ end else begin
+ AddHint('Binary value not long enough (4 Byte); Converting aborted.', True);
+ AllowChange := False;
+ end;
+ end else if TargetPage = CryptoPage then begin
+ if ValuesWin.ValueNames.Count = 1 then begin
+ ValueName := ValuesWin.ValueNames[0];
+ with CryptoTypeRG do begin
+ ItemIndex := -1;
+ if SameText(ValueName, 'ScreenSave_Data') then begin
+ ItemIndex := 0;
+ CryptoE.Text := DecodeScreenSaver(BinaryHM.Data);
+ end else if SameText(ValueName, 'parm1enc')
+ or SameText(ValueName, 'parm2enc') then begin
+ ItemIndex := 1;
+ CryptoE.Text := DecodeSharedFolder(BinaryHM.Data);
+ end;
+ end;
+ if CryptoTypeRG.ItemIndex = -1 then
+ AllowChange := False;
+ end;
+ end else
+ AllowChange := False;
+
+ end else if SourcePage = MultiStringPage then begin
+ if TargetPage = StringPage then begin
+ AddHint('Converting: MultiString --> String ');
+ if SeparatorE.Text = '' then
+ StringE.Text := MultiStringM.Text
+ else
+ StringE.Text := Join(MultiStringM.Lines, SeparatorE.Text);
+ //end else if TargetPage = BinaryPage then begin
+ end else
+ AllowChange := False;
+
+ end else
+ AllowChange := False;
+end;
+
+procedure TWorkWin.ShowPCDrawTab(Control: TCustomTabControl; TabIndex: Integer;
+ const Rect: TRect; Active: Boolean);
+var
+ PC: TPageControl;
+ Page: TTabSheet;
+begin
+ PC := TPageControl(Control);
+ Page := PC.Pages[TabIndex];
+ with PC.Canvas.Font do begin
+ if Page = StringPage then
+ Color := clBrightRed
+ else if Page = MultiStringPage then
+ Color := clBrightPurple
+ else if Page = IntPage then
+ Color := clBrightBlue
+ else if Page = BinaryPage then
+ Color := clBrightGreen
+ else if Page = CryptoPage then
+ Color := clBrightCyan;
+ end;
+
+ with PC.Canvas do begin
+ if Active then
+ Brush.Color := clGray
+ else
+ Brush.Color := clDarkGray;
+ FillRect(Rect);
+ TextOut(Rect.Left + 18 + 3, Rect.Top, Page.Caption);
+ MainWin.ImageList1.Draw(Control.Canvas, Rect.Left - 1, Rect.Top - 1, Page.ImageIndex);
+ end;
+end;
+
+procedure TWorkWin.ShowPCMouseDown(Sender: TObject; Button: TMouseButton;
+ Shift: TShiftState; X, Y: Integer);
+begin
+ with ShowPC do
+ if htOnItem in GetHitTestInfoAt(X, Y) then
+ TargetPage := Pages[IndexOfTabAt(X, Y)];
+end;
+
+procedure TWorkWin.FormCreate(Sender: TObject);
+var
+ i: Integer;
+begin
+ WorkU.ShowPC := ShowPC;
+ WorkU.MainPC := MainPC;
+
+ //Zeromize
+ ShowPC.ActivePage := nil;
+ InfoMemo.Text := '';
+ MultiStringM.Clear;
+ SisyTV.Items.Clear;
+ CurValueE.Text := NoValueCaption;
+ HexEditAutoChange := False;
+ TargetPage := nil;
+
+ //Tagging
+ StringPage.Tag := Integer(StringE);
+ IntPage.Tag := Integer(CardinalE);
+ BinaryPage.Tag := Integer(BinaryHM);
+ MultiStringPage.Tag := Integer(MultiStringM);
+ ShowAsBinary := False;
+
+ if not Win9x then
+ CryptoPage.TabVisible := False;
+
+ MainPC.ActivePage := HintPage;
+ ShowPC.ActivePage := nil;
+
+ DropFileTarget.register(StringE);
+
+ with StringTypeRG do
+ for i := 0 to ControlCount-1 do
+ (Controls[i] as TRadioButton).OnKeyDown := StringEKeyDown;
+
+ ExternalEditB.Enabled := FileEx(PrefWin.ExternalHexEditE.Text);
+
+ PipelineThread := TPipelineThread.CreateIt(tpIdle, '', BinaryHM);
+ PipelineThread.OnChange := LoadExternalBClick;
+end;
+
+procedure TWorkWin.OKBinaryBClick(Sender: TObject);
+var
+ Typ: Cardinal;
+ i: Integer;
+begin
+ try
+ Typ := StrToIntDef(UntilChar(DataTypeComB.Text, ' '), Integer(rdBinary));
+ OpenCurKey;
+ with ValuesWin.ValueNames do
+ for i := 0 to Count-1 do
+ MainReg.WriteBinType(Strings[i], BinaryHM.Data, Typ);
+ ValuesWin.UpdateValues(True);
+ finally
+ MainReg.CloseKey;
+ end;
+end;
+
+procedure TWorkWin.HexGrid1Click(Sender: TObject);
+begin
+ {with BinaryHM do begin
+ with BinL, Font do
+ if ActiveByte < ByteCount then
+ Color := clBrightGreen
+ else begin
+ Color := clSilver;
+ Caption := '00000000';
+ end;
+ BinL.Caption := IntToBinFill(CurrentByte, 8);
+ end; }
+end;
+
+procedure TWorkWin.HexGrid1KeyDown(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+begin
+ if key = VK_RETURN then begin
+ OKBinaryBClick(Sender);
+ ValuesWin.FocusControl(ValueList);
+ end;
+ if key = VK_ESCAPE then
+ CancelBClick(Sender);
+end;
+
+procedure TWorkWin.BoolStrPopup(Sender: TObject);
+begin
+ StringE.Text := TMenuItem(Sender).Caption;
+end;
+
+procedure TWorkWin.StringPageEnter(Sender: TObject);
+begin
+ FocusControl(StringE);
+end;
+
+procedure TWorkWin.IntPageEnter(Sender: TObject);
+begin
+ FocusControl(CardinalE);
+end;
+
+procedure TWorkWin.BinaryPageEnter(Sender: TObject);
+begin
+ FocusControl(BinaryHM);
+end;
+
+procedure TWorkWin.ActivateIt(Sender: TObject);
+begin
+ ActivateThis(Sender);
+end;
+
+procedure TWorkWin.DeActivateIt(Sender: TObject);
+begin
+ DeActivateThis(Sender);
+end;
+
+procedure TWorkWin.FormDeactivate(Sender: TObject);
+begin
+ if Assigned(ActiveControl) and (ActiveControl.Tag = EditControlFlag) then
+ TEdit(ActiveControl).OnExit(Sender);
+end;
+
+procedure TWorkWin.FormActivate(Sender: TObject);
+begin
+ if Assigned(ActiveControl) and (ActiveControl.Tag = EditControlFlag) then
+ TEdit(ActiveControl).OnEnter(Sender);
+end;
+
+procedure TWorkWin.MultiStringMChange(Sender: TObject);
+begin
+ MultiStringCountL.Caption := StrNumerus(MultiStringM.Lines.Count,
+ 'Line', 'Lines', 'No');
+end;
+
+procedure TWorkWin.OKMultiStringBClick(Sender: TObject);
+var
+ UseExtendedModel: Boolean;
+ i: Integer;
+ JoinedText: string;
+begin
+ if (MultiStringTypeRG.ItemIndex = 1) then begin
+ if ValuesWin.ValueCommonType = rdMultiString then
+ if mrYes<>MessageDlg('Do you want to change the type of this value?' + EOL +
+ 'MultiString --> String', mtWarning, [mbYes, mbCancel], 0) then
+ Exit;
+
+ try
+ OpenCurKey;
+ JoinedText := Join(MultiStringM.Lines, SeparatorE.Text);
+ with ValuesWin.ValueNames do
+ for i := 0 to Count-1 do
+ MainReg.WriteString(Strings[i], JoinedText);
+ ValuesWin.UpdateValues(True);
+ finally
+ MainReg.CloseKey;
+ end;
+ Exit; end;
+
+ UseExtendedModel := True;
+ if ContainsEmptyLines(MultiStringM.Lines) then
+ case MessageDlg('This text contains empty lines.' + EOL +
+ 'These are not allowed in the standard MultiString model.' + EOL +
+ 'Do you want to delete them?' + EOL +
+ EOL +
+ 'Yes: Delete empty lines' + EOL +
+ 'No: Use the Extended Model',
+ mtWarning, [mbYes, mbNo, mbCancel], 0) of
+
+ mrNo: UseExtendedModel := True;
+
+ mrYes: begin
+ with MultiStringM do begin
+ Lines.BeginUpdate;
+ DeleteEmptyLines(Lines);
+ Lines.EndUpdate;
+ end;
+ end;
+
+ else Exit;
+
+ end;
+
+ try
+ OpenCurKey;
+ with ValuesWin.ValueNames do
+ for i := 0 to Count-1 do begin
+ if MainReg.GetDataType(Strings[i]) <> rdMultiString then
+ if mrYes <> MessageDlg('Do you want to change the type of this value?' + EOL +
+ '--> MultiString', mtWarning, [mbYes, mbCancel], 0) then
+ Exit;
+ if UseExtendedModel then
+ MainReg.WriteStringList(Strings[i], MultiStringM.Lines)
+ else
+ MainReg.WriteMultiString(Strings[i], MultiStringM.Lines);
+ end;
+ ValuesWin.UpdateValues(True);
+ finally
+ MainReg.CloseKey;
+ end;
+
+ ValuesWin.ValueListDblClick(Sender);
+end;
+
+procedure TWorkWin.StringAsColorPDblClick(Sender: TObject);
+begin
+ if ColorDlg.Execute then
+ StringE.Text := StringOfColor(ColorDlg.Color, csfThreeSpacedDecimals);
+end;
+
+procedure TWorkWin.MultiStringMEnter(Sender: TObject);
+begin
+ MultiStringM.SelectAll;
+ ActivateIt(MultiStringM);
+end;
+
+procedure TWorkWin.LadenMIClick(Sender: TObject);
+begin
+ with MultiStringOpenD do begin
+ InitialDir := ExtractFileDrive(MyDir);
+ if Execute then
+ MultiStringM.Lines.LoadFromFile(FileName);
+ end;
+end;
+
+procedure TWorkWin.SpeichernMIClick(Sender: TObject);
+begin
+ with MultiStringSaveD do begin
+ InitialDir := ExtractFileDrive(MyDir);
+ if Execute then
+ MultiStringM.Lines.SaveToFile(FileName);
+ end;
+end;
+
+procedure TWorkWin.Hinzufgen1Click(Sender: TObject);
+var
+ SL: TStringList;
+begin
+ with MultiStringOpenD do begin
+ InitialDir := ExtractFileDrive(MyDir);
+ if Execute then begin
+ SL := TStringList.Create;
+ SL.LoadFromFile(FileName);
+ MultiStringM.Lines.AddStrings(SL);
+ SL.Free;
+ end;
+ end;
+end;
+
+procedure TWorkWin.CancelBClick(Sender: TObject);
+begin
+ ValuesWin.FocusControl(ValueList);
+ ValuesWin.ValueListChange(Sender, ValueList.Selected, ctState);
+end;
+
+procedure TWorkWin.HexGrid1Enter(Sender: TObject);
+begin
+ HexGrid1Click(Sender);
+end;
+
+procedure TWorkWin.SpyClearTracesBClick(Sender: TObject);
+begin
+ SpyLB.Clear;
+end;
+
+procedure TWorkWin.SpyLBKeyDown(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+begin
+ if (ssShift in Shift) and (key = VK_DELETE) then begin
+ key := 0;
+ SpyLB.Clear;
+ Exit; end;
+
+ if key = VK_F9 then begin
+ key := 0;
+ SwapFonts(SpyLB);
+ Exit; end;
+end;
+
+procedure TWorkWin.BinLClick(Sender: TObject);
+begin
+ // with HexGrid1 do
+ // Byt[ActiveByte] := IntOfBin(BinL.Caption);
+end;
+
+procedure TWorkWin.HexGrid1KeyUp(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+begin
+ //HexGrid1Click(Sender);
+end;
+
+procedure TWorkWin.ValueViewChanged(Sender: TObject);
+var
+ i: Integer;
+begin
+ if not Started then
+ Exit;
+
+ SpyThread.Suspend;
+ OpenCurKey;
+ for i := 0 to ValueList.Items.Count-1 do
+ ValuesWin.UpdateValue(MainReg, ValueList.Items[i]);
+
+ MainReg.CloseKey;
+ SpyThread.Resume;
+end;
+
+procedure TWorkWin.HexEdit1Change(Sender: TObject);
+begin
+ if not HexEditAutoChange then
+ CardinalE.Value := HexEdit1.Value;
+end;
+
+procedure TWorkWin.SortMultiStringMIClick(Sender: TObject);
+var
+ SL: TStringList;
+begin
+ SL := TStringList.Create;
+ with SL do begin
+ Assign(MultiStringM.Lines);
+ Sort;
+ end;
+ MultiStringM.Lines.Assign(SL);
+ SL.Free;
+end;
+
+procedure TWorkWin.SpyTestLClick(Sender: TObject);
+begin
+ SpyTestL.Caption := StrOfBool(SpyThread.Suspended, 'No Spy.', 'Spy active.');
+end;
+
+procedure TWorkWin.FocusForEditing;
+begin
+ FocusControl(MainPC);
+end;
+
+function TWorkWin.LoadBoolStr: Boolean;
+var
+ SL: TStringList;
+ FileName: string;
+ i, p: Integer;
+begin
+ Result := True;
+
+ AddHint('Loading Boolean Strings...');
+
+ FileName := PlutoDir + BoolStrFileName;
+ if not FileEx(FileName) then begin
+ AddToLastHint('not found:');
+ AddHint(FileName);
+ Result := False;
+ end else begin
+ SL := TStringList.Create;
+ try
+ SL.LoadFromFile(FileName);
+ DeleteCommentLines(SL);
+ BoolStr := nil;
+ SetLength(BoolStr, SL.Count);
+ for i := 0 to SL.Count-1 do begin
+ //Split the string by the '|'-sign
+ p := Pos('|', SL[i]);
+ BoolStr[i][False] := Copy(SL[i], 1, p-1);
+ BoolStr[i][True] := Copy(SL[i], p+1, Length(SL[i]) - p);
+ end;
+ finally
+ SL.Free;
+ AddToLastHint('OK');
+ end;
+ end;
+end;
+
+function TWorkWin.LoadSisyFilter: Boolean;
+var
+ SL: TStringList;
+ FileName: string;
+ i: Integer;
+begin
+ Result := True;
+
+ FileName := PlutoDir + SisyFilterFileName;
+ if not FileEx(FileName) then
+ Result := False
+ else begin
+ AddHint('Loading Sisyphus Filter Settings...');
+ SL := TStringList.Create;
+ try
+ SL.LoadFromFile(FileName);
+ DeleteCommentLines(SL, '#');
+ for i := 0 to SL.Count-1 do
+ SL[i] := TrimLeft(SL[i]);
+
+ SisyFilter.Clear;
+ SisyFilter.AddStrings(SL);
+ finally
+ SL.Free;
+ AddToLastHint('OK');
+ end;
+ end;
+end;
+
+procedure TWorkWin.SisyTVGetSelectedIndex(Sender: TObject; Node: TTreeNode);
+begin
+ Node.SelectedIndex := Node.ImageIndex;
+end;
+
+procedure TWorkWin.SisyTVDblClick(Sender: TObject);
+var
+ Node: TTreeNode;
+ Path: string;
+begin
+ Node := SisyTV.Selected;
+ if not Assigned(Node) then
+ Exit;
+
+ Path := RootOfNode(Node).Text;
+
+ if Node.Level > 0 then begin
+ if Node.Level = 2 then
+ Node := Node.Parent;
+ if Node.HasChildren then
+ Path := Path + '\\' + Node.Text //Value
+ else
+ Path := Path + '\' + Node.Text //SubKey
+ end;
+
+ MainWin.GotoKey(Path);
+end;
+
+procedure TWorkWin.DeleteChange(Node: TTreeNode);
+var
+ SubNode: TTreeNode;
+
+ procedure FreeSisyChangeNode(Node: TTreeNode);
+ begin
+ try
+ with (TObject(Node.Data) as TSisyChange) do
+ Free;
+ except
+ ReportFmt('errors', 'Context could not be freed: "%s"', [Node.Text]);
+ end;
+
+ Node.Delete;
+ end;
+
+begin
+ if not Assigned(Node) then
+ Exit;
+
+ if Node.Level = 2 then
+ Node := Node.Parent;
+
+ if Node.Level = 0 then begin
+ SisyTV.Selected := GetNextBest(RootOfNode(Node));
+ SubNode := Node.GetFirstChild;
+ while Assigned(SubNode) do begin
+ FreeSisyChangeNode(SubNode);
+ SubNode := Node.GetFirstChild; end;
+ Node.Delete;
+ end else begin
+ SisyTV.Selected := GetNextBest(Node);
+ FreeSisyChangeNode(Node);
+ end;
+end;
+
+procedure TWorkWin.DeactivateChange(Node: TTreeNode);
+begin
+ Node := RootOfNode(Node);
+
+ if not Assigned(Node) then
+ Exit;
+
+ if SisyChangeActivated(Node) then begin
+ SetSisyChangeState(Node, False);
+ Node.Cut := True;
+ end else begin
+ SetSisyChangeState(Node, True);
+ Node.Cut := False;
+ end;
+ SisyTV.Repaint;
+end;
+
+procedure TWorkWin.CopySelectedChangeName;
+var
+ Node: TTreeNode;
+begin
+ Node := SisyTV.Selected;
+ if not Assigned(Node) then
+ Exit;
+
+ Clipboard.AsText := Node.Text;
+end;
+
+procedure TWorkWin.SisyTVKeyDown(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+var
+ Node: TTreeNode;
+begin
+ Node := RootOfNode(SisyTV.Selected);
+ if not Assigned(Node) then
+ Exit;
+
+ {if Key = VK_RETURN then
+ SisyTVDblCLick(Sender);
+
+ if Key = VK_DELETE then
+ if (ssCtrl in Shift) and (Key = VK_DELETE) then
+ DeactivateChange(Node)
+ else
+ DeleteChange(Node);
+
+ if (ssCtrl in Shift) and (Char(Key) = 'C') then
+ CopySelectedChangeName;}
+end;
+
+procedure TWorkWin.SisyCBClick(Sender: TObject);
+begin
+ if not Started then
+ Exit;
+
+ with TCheckBox(Sender), TSisyThread(Sisys[Tag]) do begin
+ if Checked then
+ Resume
+ else
+ Suspend;
+ end;
+end;
+
+procedure TWorkWin.CurValueEEnter(Sender: TObject);
+begin
+ CurValueE.Text := RealValueName(ValueList.ItemFocused);
+ CurValueE.SelectAll;
+end;
+
+procedure TWorkWin.CurValueEKeyDown(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+
+ procedure RenameValue(NewName: string);
+ var
+ Item: TListItem;
+ begin
+ Item := ValueList.ItemFocused;
+ if ValuesWin.TryRenameValue(CurKey.Value, NewName) then
+ SetRealValueName(Item, NewName);
+ end;
+
+begin
+ if Key = VK_RETURN then begin
+ SpyThread.Suspend;
+ try
+ RenameValue(CurValueE.Text);
+ ValuesWin.ValueListDblClick(Self);
+ FocusControl(CurValueE);
+ finally
+ SpyThread.Restart := True;
+ SpyThread.Resume;
+ end;
+ Key := 0;
+ //CurValueE.SelectAll;
+ end else if Key = VK_ESCAPE then begin
+ ValuesWin.ValueListDblClick(Self);
+ end;
+end;
+
+procedure TWorkWin.BinaryHMLineChange(NewLine: Cardinal);
+begin
+ OffsetHE.Value := BinaryHM.Pos;
+ // BinaryAsIntL.Value := Integer(BinaryHM.CurentCard);
+end;
+
+procedure TWorkWin.OffsetHEChange(Sender: TObject);
+begin
+ BinaryHM.Pos := OffsetHE.Value;
+end;
+
+procedure TWorkWin.SpyDelayIEChange(Sender: TObject);
+begin
+ if Assigned(SpyThread) then
+ SpyThread.Delay := SpyDelayIE.Value;
+end;
+
+procedure TWorkWin.SisyTVExpanded(Sender: TObject; Node: TTreeNode);
+begin
+ if Node.ImageIndex = 8 then
+ Node.ImageIndex := 7;
+end;
+
+procedure TWorkWin.ClearChanges;
+var
+ Node: TTreeNode;
+begin
+ with SisyTV.Items do begin
+ Node := GetFirstNode;
+ while Assigned(Node) do begin
+ DeleteChange(Node);
+ Node := GetFirstNode;
+ end;
+ end;
+end;
+
+procedure TWorkWin.ClearChangesBClick(Sender: TObject);
+begin
+ if mrOK <> MessageDlg('Do you really want to clear all changes?',
+ mtWarning, [mbOK, mbCancel], 0) then
+ Exit;
+
+ ClearChanges;
+end;
+
+procedure TWorkWin.FilterChangesBClick(Sender: TObject);
+begin
+ NotePad(PlutoDir + SisyFilterFileName);
+ ShowMessage('Click OK when you finished editing.' + EOL +
+ '(Pluto will reload the filter settings then.)');
+ LoadSisyFilter;
+end;
+
+procedure TWorkWin.SisyTVPUPopup(Sender: TObject);
+var
+ KeySelected: Boolean;
+ Node: TTreeNode;
+begin
+ Node := SisyTV.Selected;
+ KeySelected := Assigned(Node);
+
+ SisyGoToKeyMI.Enabled := KeySelected;
+ SisyDeleteChangeMI.Enabled := KeySelected;
+ SisyActivateChangeMI.Enabled := KeySelected;
+ SisyCopyPathMI.Enabled := KeySelected;
+ if not KeySelected then
+ Exit;
+
+ SisyActivateChangeMI.Checked := SisyChangeActivated(RootOfNode(Node));
+end;
+
+procedure TWorkWin.SisyActivateChangeMIClick(Sender: TObject);
+begin
+ DeactivateChange(SisyTV.Selected)
+end;
+
+procedure TWorkWin.SisyDeleteChangeMIClick(Sender: TObject);
+begin
+ DeleteChange(SisyTV.Selected)
+end;
+
+procedure TWorkWin.SisyCopyPathMIClick(Sender: TObject);
+begin
+ CopySelectedChangeName;
+end;
+
+procedure TWorkWin.FileMIClick(Sender: TObject);
+var
+ s: string;
+begin
+ with FileOpenD do begin
+ s := ExtractPath(StringE.Text);
+ if s <> '' then
+ InitialDir := s
+ else
+ InitialDir := MyDir;
+
+ s := ExtractFileName(StringE.Text);
+ s := DeleteChars(s, '/');
+ if s <> '' then
+ FileName := s;
+
+ if Execute then
+ StringE.Text := FileName;
+ end;
+end;
+
+procedure TWorkWin.ExternalEditBClick(Sender: TObject);
+var
+ FileName: string;
+begin
+ FileName := TempDir + '~' + DeleteChars(CurValueE.Text, FileNameEnemies) +
+ '.bin';
+ if SaveByteA(BinaryHM.Data, FileName) then
+ ExecFileWith(PrefWin.ExternalHexEditE.Text, FileName)
+ else
+ ShowMessage('Could not write into file:' + EOL + FileName);
+
+ PipelineThread.FileName := FileName;
+end;
+
+procedure TWorkWin.LoadExternalBClick(Sender: TObject);
+var
+ FileName: string;
+ Data: TByteA;
+ i: Integer;
+begin
+ Data := nil;
+
+ FileName := TempDir + '~' + CurValueE.Text + '.bin';
+ if not FileEx(FileName) then begin
+ {ShowMessage('File not found:' + EOL +
+ FileName);}
+ Exit;
+ end;
+
+ Data := LoadByteA(FileName);
+ if Length(Data) = Length(BinaryHM.Data) then begin
+ for i := 0 to High(Data) do
+ if Data[i] <> BinaryHM.Data[i] then begin
+ BinaryHM.Data := Data;
+ Exit;
+ end;
+ end else
+ BinaryHM.Data := Data;
+end;
+
+procedure TWorkWin.PipelineCBClick(Sender: TObject);
+begin
+ with PipelineThread, PipelineCB do
+ if Checked then begin
+ if Suspended then
+ Resume;
+ end else
+ if not Suspended then
+ Suspend;
+end;
+
+procedure TWorkWin.ReloadBClick(Sender: TObject);
+begin
+ ValuesWin.ValueListDblClick(Self);
+end;
+
+procedure TWorkWin.BinaryHMEnter(Sender: TObject);
+begin
+ PipelineCB.Checked := False;
+end;
+
+procedure TWorkWin.xUseExtendedModelCBClick(Sender: TObject);
+begin
+ PrefWin.UseExtendedModelCB.Load;
+end;
+
+procedure TWorkWin.SeparatorEChange(Sender: TObject);
+begin
+ if not SeparatorE.Enabled then
+ Exit;
+
+ if SeparatorE.Text = '' then begin
+ if StringE.Text = '' then
+ Exit
+ else
+ MultiStringM.Text := StringE.Text;
+ MultiStringTypeRG.Buttons[1].Enabled := False;
+ MultiStringTypeRG.ItemIndex := 0;
+ end else begin
+ if StringE.Text = '' then
+ StringE.Text := Join(MultiStringM.Lines, SeparatorE.Text);
+ MultiStringTypeRG.Buttons[1].Enabled := True;
+ MultiStringTypeRG.ItemIndex := 1;
+ Split(StringE.Text, SeparatorE.Text, MultiStringM.Lines, False);
+ end;
+end;
+
+procedure TWorkWin.HintLBKeyDown(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+begin
+ if (Key = Byte('C')) and (ssCtrl in Shift) then
+ with HintLb do
+ if ItemIndex >= 0 then
+ Clipboard.AsText := Items[ItemIndex];
+end;
+
+procedure TWorkWin.DWORDSpecialBClick(Sender: TObject);
+begin
+ CardinalE.Value := StrToIntDef((Sender as TButton).Caption, 0);
+end;
+
+procedure TWorkWin.Button1Click(Sender: TObject);
+begin
+ ShowPC.SelectNextPage(True);
+end;
+
+procedure TWorkWin.SisyPUPopup(Sender: TObject);
+begin
+ with SisyPU, TSisyThread(Sisys[PopupComponent.Tag]) do
+ Items[Integer(Priority)].Checked := True;
+end;
+
+procedure TWorkWin.SisyPriorityMIClick(Sender: TObject);
+begin
+ with TSisyThread(Sisys[SisyPU.PopupComponent.Tag]) do begin
+ Priority := TThreadPriority(TMenuItem(Sender).MenuIndex);
+ if Priority <= tpNormal then
+ Uni.WriteInteger('Priority', Integer(Priority));
+ end;
+end;
+
+procedure TWorkWin.SisyShowCurrentPathMIClick(Sender: TObject);
+begin
+ with SisyPU, TSisyThread(Sisys[PopupComponent.Tag]) do begin
+ Suspend;
+ ShowMessage(CurrentSpyKey.Path);
+ Resume;
+ end;
+end;
+
+procedure TWorkWin.DropFileTargetDrop(Sender: TObject;
+ ShiftState: TShiftState; Point: TPoint; var Effect: Integer);
+begin
+ StringE.Text := DropFileTarget.Files[0];
+end;
+
+procedure TWorkWin.FormClose(Sender: TObject; var Action: TCloseAction);
+begin
+// Action := caNone;
+ DropFileTarget.Unregister;
+ ClearChanges;
+end;
+
+procedure TWorkWin.FormResize(Sender: TObject);
+begin
+ Realign;
+end;
+
+procedure TWorkWin.IconImageDblClick(Sender: TObject);
+var
+ Filename: string;
+begin
+ FileName := GetFileNew(StringE.Text);
+ if FileName <> '' then
+ ExecFile(FileName);
+end;
+
+procedure TWorkWin.ShowValues(Reg: TXRegistry);
+var
+ MainValueName: string;
+ ValueCommonType: TRegDataType;
+
+ procedure ShowValueAsBinary(const ValueName: string;
+ Smart4BB: Boolean = True);
+ begin
+ if Smart4BB
+ and PrefWin.Smart4BBCB.Checked
+ and (Reg.GetDataSize(ValueName) = 4) then begin
+ CardinalE.Value := Reg.ReadCardinal(ValueName);
+ CardTypeRG.ItemIndex := 2;
+ ShowPC.ActivePage := IntPage;
+ Exit; end;
+ BinaryHM.Data := Reg.ReadBin(ValueName);
+ DataTypeComB.ItemIndex := ValueCommonType;
+ if IsValidDataType(ValueCommonType) then
+ DataTypeComB.ItemIndex := ValueCommonType
+ else begin
+ DataTypeComB.Text := IntToStr(ValueCommonType);
+ AddHint('Value has unknown data type (' + DataTypeComB.Text + '): ' +
+ Quote(ValueName));
+ end;
+ ShowPC.ActivePage := BinaryPage;
+ end;
+
+begin
+ with ValuesWin do begin
+ if not Assigned(ValueNames) or (ValueNames.Count = 0) then
+ raise EReadError.Create('ValueNameList error');
+ MainValueName := ValueNames[0];
+ end;
+ ValueCommonType := ValuesWin.ValueCommonType;
+
+ with CurValueE do begin
+ Enabled := True;
+ if ValuesWin.ValueNames.Count = 1 then
+ Text := MainValueName
+ else
+ Text := Copy(ValuesWin.ValueNames.CommaText, 1, 255);
+
+ Font.Color := ColorOfDataType(ValueCommonType);
+ end;
+
+ if KeyIsDown(VK_MENU) or ShowAsBinary then begin
+ ShowValueAsBinary(MainValueName, False);
+ end else if ValueCommonType in rdStringTypes then begin
+ StringE.Text := Reg.ReadString(MainValueName);
+ case ValueCommonType of
+ rdString: StringTypeRG.ItemIndex := 0;
+ rdExpandString: StringTypeRG.ItemIndex := 1;
+ end;
+ ShowPC.ActivePage := StringPage;
+ end else if ValueCommonType in rdCardTypes then begin
+ CardinalE.Value := Reg.ReadCardinal(MainValueName);
+ case ValueCommonType of
+ rdCardinal: StringTypeRG.ItemIndex := 0;
+ rdCardBigEndian: StringTypeRG.ItemIndex := 1;
+ end;
+ ShowPC.ActivePage := IntPage;
+ end else if ValueCommonType = rdMultiString then begin
+ MultiStringM.Clear;
+ Reg.ReadMultiString(MainValueName, MultiStringM.Lines, PrefWin.UseExtendedModelCB.Checked);
+ SeparatorEChange(Self);
+ MultiStringTypeRG.ItemIndex := 0;
+ ShowPC.ActivePage := MultiStringPage;
+ end else begin
+ ShowValueAsBinary(MainValueName);
+ end;
+
+ ShowAsBinary := False;
+
+ UpdateWriteButtons;
+end;
+
+procedure TWorkWin.UpdateWriteButtons;
+const
+ BtnTextOfMultiEdit: array[Boolean] of string = ('Write', 'Write all');
+var
+ BtnText: string;
+begin
+ BtnText := BtnTextOfMultiEdit[ValuesWin.ValueNames.Count > 1];
+ OKStringB.Caption := BtnText;
+ OKIntB.Caption := BtnText;
+ OKMultiStringB.Caption := BtnText;
+ OKBinaryB.Caption := BtnText;
+end;
+
+procedure TWorkWin.EditData;
+begin
+ AddHint('Edit');
+ MainPC.ActivePage := WorkPage;
+
+ with ShowPC do
+ if ActivePage = nil then
+ Exit
+ else if ActivePage = WorkWin.StringPage then begin
+ FocusControl(StringE);
+ StringE.SelectAll;
+ end
+ else if ActivePage = WorkWin.IntPage then
+ FocusControl(CardinalE)
+ else if ActivePage = WorkWin.MultiStringPage then
+ FocusControl(MultiStringM)
+ else if ActivePage = WorkWin.BinaryPage then
+ FocusControl(BinaryHM)
+ else
+ ShowMessage('Error: ShowPC.ActivePage!');
+end;
+
+procedure TWorkWin.SisyTVCustomDrawItem(Sender: TCustomTreeView;
+ Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
+begin
+ with TTreeView(Sender).Canvas.Font do begin
+ if Node.Cut then
+ Color := $AAAAAA
+ else
+ Color := clWhite;
+ end;
+end;
+
+procedure TWorkWin.SisyTVMouseDown(Sender: TObject; Button: TMouseButton;
+ Shift: TShiftState; X, Y: Integer);
+var
+ Node: TTreeNode;
+ RelX, RelY: Integer;
+begin
+ with SisyTV do begin
+ RelX := ScreenToClient(Mouse.CursorPos).X;
+ RelY := ScreenToClient(Mouse.CursorPos).Y;
+ Node := GetNodeAt(RelX, RelY);
+ end;
+ if not Assigned(Node) then
+ Exit;
+
+ if not Node.Selected then
+ Node.Selected := True;
+end;
+
+procedure TWorkWin.OKCryptoBClick(Sender: TObject);
+var
+ i: Integer;
+begin
+ try
+ OpenCurKey;
+ with ValuesWin.ValueNames do
+ for i := 0 to Count-1 do begin
+ case CryptoTypeRG.ItemIndex of
+ 0: MainReg.WriteBin(Strings[i], EncodeScreenSaver(CryptoE.Text));
+ 1: MainReg.WriteBin(Strings[i], EncodeSharedFolder(CryptoE.Text));
+ end;
+ end;
+ ValuesWin.UpdateValues(True);
+ finally
+ MainReg.CloseKey;
+ end;
+ ValuesWin.ValueListDblClick(Sender);
+end;
+
+procedure TWorkWin.CryptoEKeyDown(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+begin
+ if Key = VK_RETURN then begin
+ OKCryptoBClick(Sender);
+ ValuesWin.FocusControl(ValueList);
+ end;
+ if Key = VK_ESCAPE then
+ CancelBClick(Sender);
+end;
+
+end.
diff --git a/test/scanners/delphi/pluto.out.raydebug b/test/scanners/delphi/pluto.out.raydebug new file mode 100644 index 0000000..032e8d4 --- /dev/null +++ b/test/scanners/delphi/pluto.out.raydebug @@ -0,0 +1,10829 @@ +reserved(unit) ident(FindTH)operator(;) + +reserved(interface) + +reserved(uses) + ident(Classes)operator(,) ident(windows)operator(,) ident(Dialogs)operator(,) ident(ComCtrls)operator(,) ident(CompEx)operator(,) ident(SysUtils)operator(,) ident(YTools)operator(,) ident(YTypes)operator(,) + ident(clock)operator(,) ident(plutoconst)operator(,) ident(StdCtrls)operator(,) ident(Masks)operator(,) ident(Forms)operator(,) ident(XReg)operator(;) + +reserved(const) + ident(RegMoleVersion) operator(=) string<delimiter(')content(1.1)delimiter(')>operator(;) + +reserved(type) + ident(TFindThreadProgress) operator(=) operator(()ident(fpNone)operator(,) ident(fpEvery512th)operator(,) ident(fpEach)operator(\);) + + ident(TRegFindThread) operator(=) reserved(class)operator(()ident(TThread)operator(\)) + directive(private) + ident(SearchText)operator(:) reserved(string)operator(;) + ident(SearchFor)operator(:) ident(TSearchOptions)operator(;) + ident(Progress)operator(:) ident(TFindThreadProgress)operator(;) + ident(FindNodeText)operator(:) reserved(string)operator(;) + ident(TimeElapsed)operator(:) ident(Double)operator(;) + ident(syncIcon)operator(:) ident(Integer)operator(;) + ident(syncStatusText)operator(:) reserved(string)operator(;) + ident(CurrentPath)operator(:) reserved(string)operator(;) + ident(KeysScanned)operator(:) ident(Integer)operator(;) + ident(Mask)operator(:) ident(TMask)operator(;) + ident(dwordVal)operator(:) ident(DWORD)operator(;) + ident(SearchForValues)operator(:) ident(Boolean)operator(;) + + reserved(procedure) ident(Find)operator(;) + + comment(//Synchronizers) + reserved(procedure) ident(Start)operator(;) + reserved(procedure) ident(Add)operator(;) + reserved(procedure) ident(UpdateStatus)operator(;) + reserved(procedure) ident(Finish)operator(;) + directive(protected) + reserved(procedure) ident(Execute)operator(;) directive(override)operator(;) + directive(public) + ident(SpecialPath)operator(:) reserved(string)operator(;) + ident(FindNode)operator(:) ident(TTreeNode)operator(;) + ident(ListTV)operator(:) ident(TTreeView)operator(;) + ident(ObjectsFound)operator(,) ident(KeysFound)operator(,) ident(ValuesFound)operator(,) ident(DataFound)operator(:) ident(Integer)operator(;) + ident(Ranges)operator(:) ident(TRanges)operator(;) + reserved(destructor) ident(Destroy)operator(;) directive(override)operator(;) + reserved(constructor) ident(CreateIt)operator(()ident(PriorityLevel)operator(:) ident(TThreadPriority)operator(;) ident(s)operator(:) reserved(string)operator(;) + ident(SearchFor)operator(:) ident(TSearchOptions)operator(;) ident(Progress)operator(:) ident(TFindThreadProgress)operator(\);) + reserved(end)operator(;) + +reserved(implementation) + +reserved(uses) + ident(ValuesU)operator(,) ident(StrUtils)operator(;) + +comment({ TRegFindThread }) + +reserved(procedure) ident(TRegFindThread)operator(.)ident(Add)operator(;) +reserved(var) + ident(Node)operator(:) ident(TTreeNode)operator(;) +reserved(begin) + reserved(with) ident(ListTV) reserved(do) reserved(begin) + comment(//Items.BeginUpdate;) + ident(Node) operator(:=) ident(TTreeNode)operator(.)ident(Create)operator(()ident(Items)operator(\);) + ident(SetTNImage)operator(()ident(Node)operator(,) ident(syncIcon)operator(\);) + ident(Items)operator(.)ident(AddNode)operator(()ident(Node)operator(,) ident(FindNode)operator(,) ident(Copy)operator(()ident(CurrentPath)operator(,) integer(1)operator(,) integer(255)operator(\),) reserved(nil)operator(,) + ident(naAddChildFirst)operator(\);) + reserved(if) reserved(not) ident(FindNode)operator(.)ident(Expanded) reserved(and) operator(()ident(FindNode)operator(.)ident(Count) operator(=) integer(1)operator(\)) reserved(then) comment(//First Node) + ident(FindNode)operator(.)ident(Expand)operator(()ident(False)operator(\);) + comment(//Items.EndUpdate;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(constructor) ident(TRegFindThread)operator(.)ident(CreateIt)operator(()ident(PriorityLevel)operator(:) ident(TThreadPriority)operator(;) ident(s)operator(:) reserved(string)operator(;) + ident(SearchFor)operator(:) ident(TSearchOptions)operator(;) ident(Progress)operator(:) ident(TFindThreadProgress)operator(\);) +reserved(begin) + reserved(inherited) ident(Create)operator(()ident(True)operator(\);) comment(// Create thread suspended) + ident(Priority) operator(:=) ident(PriorityLevel)operator(;) comment(// Set Priority Level) + ident(FreeOnTerminate) operator(:=) ident(True)operator(;) comment(// Thread Free Itself when terminated) + + ident(SearchText) operator(:=) ident(s)operator(;) + ident(Ranges) operator(:=) reserved(nil)operator(;) + ident(Self)operator(.)ident(SearchFor) operator(:=) ident(SearchFor)operator(;) + ident(Self)operator(.)ident(Progress) operator(:=) ident(Progress)operator(;) +reserved(end)operator(;) + +reserved(destructor) ident(TRegFindThread)operator(.)ident(Destroy)operator(;) +reserved(begin) + reserved(if) ident(Assigned)operator(()ident(FindNode)operator(\)) reserved(then) + ident(FindNode)operator(.)ident(Data) operator(:=) reserved(nil)operator(;) + reserved(inherited)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TRegFindThread)operator(.)ident(Execute)operator(;) +reserved(begin) + ident(Synchronize)operator(()ident(Start)operator(\);) + ident(Find)operator(;) + ident(Synchronize)operator(()ident(Finish)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TRegFindThread)operator(.)ident(Find)operator(;) +reserved(var) + ident(SpecialKey)operator(:) ident(HKEY)operator(;) + + reserved(procedure) ident(Add)operator(()reserved(const) ident(Path)operator(:) reserved(string)operator(;) reserved(const) ident(Icon)operator(:) ident(Integer)operator(\);) + reserved(var) + ident(zCurrentPath)operator(:) reserved(string)operator(;) + reserved(begin) + ident(zCurrentPath) operator(:=) ident(CurrentPath)operator(;) + + ident(CurrentPath) operator(:=) ident(Path)operator(;) + ident(syncIcon) operator(:=) ident(Icon)operator(;) + ident(Synchronize)operator(()ident(Self)operator(.)ident(Add)operator(\);) + + ident(CurrentPath) operator(:=) ident(zCurrentPath)operator(;) + reserved(end)operator(;) + + reserved(procedure) ident(AddValueName)operator(()reserved(const) ident(ValueName)operator(:) reserved(string)operator(;) ident(Typ)operator(:) ident(TRegDataType)operator(\);) + reserved(begin) + ident(Add)operator(()ident(CurrentPath) operator(+) string<delimiter(')content(\\\\)delimiter(')> operator(+) ident(ValueName)operator(,) ident(IconOfDataType)operator(()ident(Typ)operator(\)\);) + reserved(end)operator(;) + + reserved(procedure) ident(AddValueData)operator(()reserved(const) ident(ValueName)operator(:) reserved(string)operator(;) ident(Context)operator(:) ident(TRegContext)operator(\);) + reserved(begin) + ident(Add)operator(()ident(CurrentPath) operator(+) string<delimiter(')content(\\\\)delimiter(')> operator(+) ident(ValueName) operator(+) string<delimiter(')content( = )delimiter(')> operator(+) ident(DataPreviewOfContext)operator(()ident(Context)operator(\),) + ident(IconOfDataType)operator(()ident(Context)operator(.)ident(Typ)operator(\)\);) + reserved(end)operator(;) + + reserved(function) ident(FoundInStr)operator(()reserved(const) ident(Data)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) + reserved(begin) + ident(Result) operator(:=) ident(False)operator(;) + reserved(if) ident(SearchText) operator(=) string<delimiter(')delimiter(')> reserved(then) + ident(Exit)operator(;) + + reserved(if) operator(()ident(Data) operator(=) string<delimiter(')delimiter(')>operator(\)) reserved(and) reserved(not) operator(()ident(sfWildCards) reserved(in) ident(SearchFor)operator(\)) reserved(then) + ident(Exit)operator(;) + + reserved(if) ident(sfWildCards) reserved(in) ident(SearchFor) reserved(then) reserved(begin) + reserved(if) ident(Assigned)operator(()ident(Mask)operator(\)) reserved(then) + ident(Result) operator(:=) ident(Mask)operator(.)ident(Matches)operator(()ident(Data)operator(\);) + reserved(end) reserved(else) reserved(begin) + comment({if not (sfFileNames in SearchFor\) then begin + if TextBegin(SearchText, UntilChar(Data, '~'\)\) and FileExists(Data\) then + Result := SameFileName(SearchText, GetFileNew(Data\)\); + Exit; + end; }) + + reserved(if) operator([)ident(sfParts)operator(,) ident(sfIgnoreCase)operator(]) operator(<=) ident(SearchFor) reserved(then) + reserved(if) ident(SfUseLocales) reserved(in) ident(SearchFor) reserved(then) + ident(Result) operator(:=) integer(0)operator(<)ident(PosEx)operator(()ident(SearchText)operator(,) ident(AnsiLowerCase)operator(()ident(Data)operator(\)\)) + reserved(else) + ident(Result) operator(:=) integer(0)operator(<)ident(PosExText)operator(()ident(SearchText)operator(,) ident(Data)operator(\)) + reserved(else) reserved(if) ident(sfParts) reserved(in) ident(SearchFor) reserved(then) + ident(Result) operator(:=) integer(0)operator(<)ident(PosEx)operator(()ident(SearchText)operator(,) ident(Data)operator(\)) + reserved(else) reserved(if) ident(sfIgnoreCase) reserved(in) ident(SearchFor) reserved(then) + reserved(if) ident(SfUseLocales) reserved(in) ident(SearchFor) reserved(then) + ident(Result) operator(:=) operator(()ident(AnsiLowerCase)operator(()ident(Data)operator(\)) operator(=) ident(SearchText)operator(\)) + reserved(else) + ident(Result) operator(:=) ident(SameText)operator(()ident(Data)operator(,) ident(SearchText)operator(\)) + reserved(else) + ident(Result) operator(:=) operator(()ident(SearchText) operator(=) ident(Data)operator(\);) + reserved(end)operator(;) + reserved(end)operator(;) + + reserved(function) ident(FoundInByteA)operator(()reserved(const) ident(Data)operator(:) ident(TByteA)operator(\):) ident(Boolean)operator(;) + reserved(begin) + ident(Result) operator(:=) ident(FoundInStr)operator(()ident(StrOfByteA)operator(()ident(Data)operator(\)\);) + reserved(end)operator(;) + + reserved(procedure) ident(ScanValues)operator(()ident(Key)operator(:) ident(HKEY)operator(;) ident(Info)operator(:) ident(TRegKeyInfo)operator(\);) + reserved(var) + ident(i)operator(:) ident(Integer)operator(;) + ident(MaxLen)operator(,) ident(NameLen)operator(,) ident(Len)operator(,) ident(Typ)operator(:) ident(Cardinal)operator(;) + ident(Buffer)operator(:) ident(PByte)operator(;) + ident(ValueName)operator(:) ident(PChar)operator(;) + + reserved(procedure) ident(ScanValue)operator(()reserved(const) ident(ValueName)operator(:) reserved(string)operator(;) reserved(const) ident(Typ)operator(:) ident(TRegDataType)operator(;) + reserved(const) ident(Data)operator(:) reserved(string)operator(\);) + reserved(begin) + reserved(if) operator(()ident(sfSpecialTypes) reserved(in) ident(SearchFor)operator(\)) reserved(and) reserved(not) ident(InRanges)operator(()ident(Ranges)operator(,) ident(Typ)operator(\)) reserved(then) + ident(Exit)operator(;) + + reserved(case) ident(Typ) reserved(of) + ident(rdString)operator(,) ident(rdExpandString)operator(:) reserved(if) ident(sfString) reserved(in) ident(SearchFor) reserved(then) reserved(begin) + reserved(if) ident(FoundInStr)operator(()ident(Data)operator(\)) reserved(then) reserved(begin) + ident(Inc)operator(()ident(DataFound)operator(\);) + ident(AddValueData)operator(()ident(ValueName)operator(,) + ident(RegContext)operator(()ident(Typ)operator(,) ident(TByteA)operator(()ident(Copy)operator(()ident(Data)operator(,) integer(1)operator(,) ident(Length)operator(()ident(Data)operator(\)-)integer(1)operator(\)\)\)\);) + reserved(end)operator(;) + reserved(end)operator(;) + + ident(rdCardinal)operator(,) ident(rdCardBigEndian)operator(:) reserved(if) ident(sfDWord) reserved(in) ident(SearchFor) reserved(then) reserved(begin) + reserved(if) operator(()ident(Length)operator(()ident(Data)operator(\)) operator(>=) ident(SizeOf)operator(()ident(Cardinal)operator(\)\)) reserved(and) + operator(()ident(dwordVal) operator(=) ident(PCardinal)operator(()ident(Copy)operator(()ident(Data)operator(,) integer(1)operator(,) ident(SizeOf)operator(()ident(Cardinal)operator(\)\)\)^\)) reserved(then) reserved(begin) + ident(Inc)operator(()ident(DataFound)operator(\);) + ident(AddValueData)operator(()ident(ValueName)operator(,) + ident(RegContext)operator(()ident(Typ)operator(,) ident(ByteAOfStr)operator(()ident(Data)operator(\)\)\);) + reserved(end)operator(;) + reserved(end)operator(;) + + reserved(else) + reserved(if) ident(sfOtherTypes) reserved(in) ident(SearchFor) reserved(then) reserved(begin) + reserved(if) ident(FoundInStr)operator(()ident(Data)operator(\)) reserved(then) reserved(begin) + ident(Inc)operator(()ident(DataFound)operator(\);) + ident(AddValueData)operator(()ident(ValueName)operator(,) + ident(RegContext)operator(()ident(Typ)operator(,) ident(ByteAOfStr)operator(()ident(Data)operator(\)\)\);) + reserved(end)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + reserved(begin) + ident(MaxLen) operator(:=) ident(Info)operator(.)ident(MaxValueLen) operator(+) integer(1)operator(;) comment(//Include Nullbyte) + + ident(Buffer) operator(:=) reserved(nil)operator(;) + reserved(if) ident(sfValueData) reserved(in) ident(SearchFor) reserved(then) + ident(GetMem)operator(()ident(Buffer)operator(,) ident(Info)operator(.)ident(MaxDataLen)operator(\);) + + ident(GetMem)operator(()ident(ValueName)operator(,) ident(MaxLen)operator(\);) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(Info)operator(.)ident(NumValues)operator(-)integer(1) reserved(do) reserved(begin) + ident(NameLen) operator(:=) ident(MaxLen)operator(;) + ident(Len) operator(:=) ident(Info)operator(.)ident(MaxDataLen)operator(;) + reserved(if) reserved(not) ident(Success)operator(()ident(RegEnumValue)operator(()ident(Key)operator(,) ident(i)operator(,) ident(ValueName)operator(,) ident(NameLen)operator(,) reserved(nil)operator(,) operator(@)ident(Typ)operator(,) + ident(Buffer)operator(,) operator(@)ident(Len)operator(\)\)) reserved(then) + ident(Continue)operator(;) + + reserved(if) ident(sfValueNames) reserved(in) ident(SearchFor) reserved(then) + reserved(if) ident(FoundInStr)operator(()ident(ValueName)operator(\)) reserved(then) reserved(begin) + ident(Inc)operator(()ident(ValuesFound)operator(\);) + ident(AddValueName)operator(()ident(ValueName)operator(,) ident(Typ)operator(\);) + reserved(end)operator(;) + + reserved(if) ident(sfValueData) reserved(in) ident(SearchFor) reserved(then) + ident(ScanValue)operator(()ident(ValueName)operator(,) ident(Typ)operator(,) reserved(string)operator(()ident(Copy)operator(()ident(TByteA)operator(()ident(Buffer)operator(\),) integer(0)operator(,) ident(Len)operator(\)\)\);) + reserved(end)operator(;) + + ident(FreeMem)operator(()ident(ValueName)operator(,) ident(MaxLen)operator(\);) + reserved(if) ident(sfValueData) reserved(in) ident(SearchFor) reserved(then) + ident(FreeMem)operator(()ident(Buffer)operator(,) ident(Info)operator(.)ident(MaxDataLen)operator(\);) + reserved(end)operator(;) + + reserved(procedure) ident(ScanKey)operator(()ident(Key)operator(:) ident(HKEY)operator(;) reserved(const) ident(KeyName)operator(:) reserved(string) operator(=) string<delimiter(')delimiter(')>operator(\);) + reserved(var) + ident(p)operator(:) ident(PChar)operator(;) + ident(i)operator(,) ident(z)operator(:) ident(Integer)operator(;) + ident(l)operator(,) ident(Len)operator(:) ident(DWORD)operator(;) + ident(NewKey)operator(:) ident(HKEY)operator(;) + ident(Info)operator(:) ident(TRegKeyInfo)operator(;) + reserved(begin) + reserved(if) ident(Terminated) reserved(then) ident(Exit)operator(;) + + ident(Inc)operator(()ident(KeysScanned)operator(\);) + reserved(if) ident(Progress) operator(<>) ident(fpNone) reserved(then) + reserved(if) operator(()ident(Progress) operator(=) ident(fpEach)operator(\)) reserved(or) + operator((()ident(Progress) operator(=) ident(fpEvery512th)operator(\)) reserved(and) operator((()ident(KeysScanned) reserved(and) hex($1FF)operator(\)) operator(=) integer(0)operator(\)\)) reserved(then) reserved(begin) + ident(syncStatusText) operator(:=) char<delimiter(')content(()delimiter(')> operator(+) ident(IntToStr)operator(()ident(KeysScanned)operator(\)) operator(+) string<delimiter(')content( k\) )delimiter(')> operator(+) ident(CurrentPath)operator(;) + ident(Synchronize)operator(()ident(UpdateStatus)operator(\);) + reserved(end)operator(;) + + reserved(with) ident(Info) reserved(do) + reserved(if) reserved(not) ident(Success)operator(()ident(RegQueryInfoKey)operator(()ident(Key)operator(,) reserved(nil)operator(,) reserved(nil)operator(,) reserved(nil)operator(,) operator(@)ident(NumSubKeys)operator(,) + operator(@)ident(MaxSubKeyLen)operator(,) reserved(nil)operator(,) operator(@)ident(NumValues)operator(,) operator(@)ident(MaxValueLen)operator(,) operator(@)ident(MaxDataLen)operator(,) + reserved(nil)operator(,) reserved(nil)operator(\)\)) reserved(then) + ident(Exit)operator(;) + + reserved(if) operator(()ident(Info)operator(.)ident(NumValues) operator(>) integer(0)operator(\)) reserved(and) ident(SearchForValues) reserved(then) + ident(ScanValues)operator(()ident(Key)operator(,) ident(Info)operator(\);) + + reserved(if) ident(Info)operator(.)ident(NumSubKeys) operator(<=) integer(0) reserved(then) + ident(Exit)operator(;) + + ident(Len) operator(:=) ident(Info)operator(.)ident(MaxSubKeyLen) operator(+) integer(1)operator(;) + ident(GetMem)operator(()ident(p)operator(,) ident(Len)operator(\);) + + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(Info)operator(.)ident(NumSubKeys)operator(-)integer(1) reserved(do) reserved(begin) + ident(l) operator(:=) ident(Len)operator(;) + ident(RegEnumKeyEx)operator(()ident(Key)operator(,) ident(i)operator(,) ident(p)operator(,) ident(l)operator(,) reserved(nil)operator(,) reserved(nil)operator(,) reserved(nil)operator(,) reserved(nil)operator(\);) + reserved(if) ident(sfKeys) reserved(in) ident(SearchFor) reserved(then) + reserved(if) ident(FoundInStr)operator(()ident(p)operator(\)) reserved(then) reserved(begin) + ident(Inc)operator(()ident(KeysFound)operator(\);) + ident(Add)operator(()ident(CurrentPath) operator(+) char<delimiter(')content(\\)delimiter(')> operator(+) ident(p)operator(,) ident(iconKeyMiddle)operator(\);) + reserved(end)operator(;) + + reserved(if) ident(Success)operator(()ident(RegOpenKey)operator(()ident(Key)operator(,) ident(p)operator(,) ident(NewKey)operator(\)\)) reserved(then) reserved(begin) + ident(z) operator(:=) ident(Length)operator(()ident(CurrentPath)operator(\);) + ident(CurrentPath) operator(:=) ident(CurrentPath) operator(+) char<delimiter(')content(\\)delimiter(')> operator(+) ident(p)operator(;) + + reserved(try) + ident(ScanKey)operator(()ident(NewKey)operator(,) ident(p)operator(\);) + reserved(finally) + ident(RegCloseKey)operator(()ident(NewKey)operator(\);) + reserved(end)operator(;) + + ident(SetLength)operator(()ident(CurrentPath)operator(,) ident(z)operator(\);) + reserved(end)operator(;) + + reserved(if) ident(Terminated) reserved(then) ident(Break)operator(;) + reserved(end)operator(;) + + ident(FreeMem)operator(()ident(p)operator(,) ident(Len)operator(\);) + reserved(end)operator(;) + +reserved(begin) + reserved(with) ident(TClock)operator(.)ident(Create) reserved(do) reserved(begin) + ident(FindNode)operator(.)ident(Text) operator(:=) ident(FindNodeText) operator(+) string<delimiter(')content(: )delimiter(')>operator(;) + + reserved(try) + reserved(if) ident(sfHKU) reserved(in) ident(SearchFor) reserved(then) reserved(begin) + ident(CurrentPath) operator(:=) string<delimiter(')content(HKU)delimiter(')>operator(;) + ident(ScanKey)operator(()ident(HKEY_USERS)operator(\);) + reserved(end)operator(;) + reserved(if) ident(sfHKLM) reserved(in) ident(SearchFor) reserved(then) reserved(begin) + ident(CurrentPath) operator(:=) string<delimiter(')content(HKLM)delimiter(')>operator(;) + ident(ScanKey)operator(()ident(HKEY_LOCAL_MACHINE)operator(\);) + reserved(end)operator(;) + reserved(if) ident(sfHKDD) reserved(in) ident(SearchFor) reserved(then) reserved(begin) + ident(CurrentPath) operator(:=) string<delimiter(')content(HKDD)delimiter(')>operator(;) + ident(ScanKey)operator(()ident(HKEY_DYN_DATA)operator(\);) + reserved(end)operator(;) + + reserved(if) ident(SpecialPath) operator(<>) string<delimiter(')delimiter(')> reserved(then) reserved(begin) + reserved(if) ident(Success)operator(()ident(RegOpenKey)operator(()ident(HKEYOfStr)operator(()ident(ExRegRoot)operator(()ident(SpecialPath)operator(\)\),) + ident(PChar)operator(()ident(ExRegKey)operator(()ident(SpecialPath)operator(\)\),) ident(SpecialKey)operator(\)\)) reserved(then) reserved(begin) + ident(CurrentPath) operator(:=) ident(LWPSolve)operator(()ident(SpecialPath)operator(\);) + ident(ScanKey)operator(()ident(SpecialKey)operator(\);) + ident(RegCloseKey)operator(()ident(SpecialKey)operator(\);) + reserved(end) reserved(else) + ident(ShowMessage)operator(()string<delimiter(')content(Could not open)delimiter(')> operator(+) ident(EOL) operator(+) + ident(Quote)operator(()ident(SpecialPath)operator(\)\);) + reserved(end)operator(;) + reserved(except) + ident(syncStatusText) operator(:=) char<delimiter(')content(()delimiter(')> operator(+) ident(IntToStr)operator(()ident(KeysScanned)operator(\)) operator(+) string<delimiter(')content( k\) )delimiter(')> operator(+) ident(CurrentPath) operator(+) + string<delimiter(')content(Error --> Terminated.)delimiter(')>operator(;) + ident(Synchronize)operator(()ident(UpdateStatus)operator(\);) + ident(Sleep)operator(()integer(1000)operator(\);) + reserved(end)operator(;) + + ident(TimeElapsed) operator(:=) ident(SecondsPassed)operator(;) + ident(Free)operator(;) reserved(end)operator(;) +reserved(end)operator(;) + +reserved(function) ident(StrOfSearchOptions)operator(()reserved(const) ident(Options)operator(:) ident(TSearchOptions)operator(\):) reserved(string)operator(;) + + reserved(procedure) ident(Add)operator(()reserved(const) ident(s)operator(:) reserved(string)operator(\);) + reserved(begin) + ident(Result) operator(:=) ident(Result) operator(+) ident(s)operator(;) + reserved(end)operator(;) + + reserved(procedure) ident(AddOption)operator(()reserved(const) ident(Option)operator(:) reserved(string)operator(;) reserved(const) ident(Flag)operator(:) ident(TSearchVar)operator(;) + reserved(const) ident(Optional)operator(:) ident(Boolean) operator(=) ident(False)operator(\);) + reserved(begin) + reserved(if) ident(Flag) reserved(in) ident(Options) reserved(then) + ident(Add)operator(()ident(Option)operator(\)) + reserved(else) + reserved(if) reserved(not) ident(Optional) reserved(then) + ident(Add)operator(()char<delimiter(')content(^)delimiter(')> operator(+) ident(Option)operator(\);) + reserved(end)operator(;) + +reserved(begin) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + + ident(Add)operator(()char<delimiter(')content([)delimiter(')>operator(\);) + ident(AddOption)operator(()char<delimiter(')content(H)delimiter(')>operator(,) ident(sfAsHex)operator(,) ident(True)operator(\);) + ident(AddOption)operator(()string<delimiter(')content(W )delimiter(')>operator(,) ident(sfWildcards)operator(,) ident(True)operator(\);) + + ident(AddOption)operator(()char<delimiter(')content(C)delimiter(')>operator(,) ident(sfIgnoreCase)operator(\);) + ident(AddOption)operator(()char<delimiter(')content(L)delimiter(')>operator(,) ident(sfUseLocales)operator(\);) + ident(AddOption)operator(()string<delimiter(')content(P )delimiter(')>operator(,) ident(sfParts)operator(\);) + + ident(AddOption)operator(()char<delimiter(')content(K)delimiter(')>operator(,) ident(sfKeys)operator(\);) + ident(AddOption)operator(()char<delimiter(')content(N)delimiter(')>operator(,) ident(sfValueNames)operator(\);) + ident(AddOption)operator(()string<delimiter(')content(D )delimiter(')>operator(,) ident(sfValueData)operator(\);) + + ident(AddOption)operator(()char<delimiter(')content(S)delimiter(')>operator(,) ident(sfString)operator(\);) + ident(AddOption)operator(()char<delimiter(')content(D)delimiter(')>operator(,) ident(sfDWORD)operator(\);) + ident(AddOption)operator(()char<delimiter(')content(O)delimiter(')>operator(,) ident(sfOtherTypes)operator(\);) + ident(AddOption)operator(()char<delimiter(')content(?)delimiter(')>operator(,) ident(sfSpecialTypes)operator(\);) + + ident(Add)operator(()string<delimiter(')content(] [)delimiter(')>operator(\);) + + reserved(if) operator([)ident(sfHKU)operator(,) ident(sfHKLM)operator(,) ident(sfHKDD)operator(]) operator(<=) ident(Options) reserved(then) + ident(Add)operator(()string<delimiter(')content(ALL)delimiter(')>operator(\)) + reserved(else) reserved(begin) + ident(AddOption)operator(()string<delimiter(')content(HKU )delimiter(')>operator(,) ident(sfHKU)operator(,) ident(True)operator(\);) + ident(AddOption)operator(()string<delimiter(')content(HKLM )delimiter(')>operator(,) ident(sfHKLM)operator(,) ident(True)operator(\);) + ident(AddOption)operator(()string<delimiter(')content(HKDD )delimiter(')>operator(,) ident(sfHKDD)operator(,) ident(True)operator(\);) + ident(Result) operator(:=) ident(TrimRight)operator(()ident(Result)operator(\);) + reserved(end)operator(;) + + ident(Add)operator(()char<delimiter(')content(])delimiter(')>operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TRegFindThread)operator(.)ident(Start)operator(;) +reserved(begin) + ident(Mask) operator(:=) reserved(nil)operator(;) + ident(KeysFound) operator(:=) integer(0)operator(;) + ident(ValuesFound) operator(:=) integer(0)operator(;) + ident(DataFound) operator(:=) integer(0)operator(;) + ident(KeysScanned) operator(:=) integer(0)operator(;) + + comment(//Prepare for options) + reserved(if) ident(sfAsHex) reserved(in) ident(SearchFor) reserved(then) reserved(begin) + ident(SearchText) operator(:=) reserved(string)operator(()ident(ByteAOfHex)operator(()ident(SearchText)operator(\)\);) + ident(SearchFor) operator(:=) ident(SearchFor) operator(-) operator([)ident(sfDWord)operator(,) ident(sfIgnoreCase)operator(];) + reserved(end) reserved(else) reserved(begin) + reserved(if) ident(SfUseLocales) reserved(in) ident(SearchFor) reserved(then) + ident(SearchText) operator(:=) ident(AnsiLowerCase)operator(()ident(SearchText)operator(\);) + + ident(dwordVal) operator(:=) integer(0)operator(;) + reserved(if) ident(sfDWord) reserved(in) ident(SearchFor) reserved(then) + reserved(if) ident(IsValidInteger)operator(()ident(SearchText)operator(\)) reserved(then) + ident(dwordVal) operator(:=) ident(StrToInt)operator(()ident(SearchText)operator(\)) + reserved(else) + ident(Exclude)operator(()ident(SearchFor)operator(,) ident(sfDWord)operator(\);) + + reserved(if) ident(sfWildCards) reserved(in) ident(SearchFor) reserved(then) + reserved(try) + ident(Mask) operator(:=) ident(TMask)operator(.)ident(Create)operator(()ident(SearchText)operator(\);) + reserved(except) + ident(Mask)operator(.)ident(Free)operator(;) + ident(Mask) operator(:=) reserved(nil)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + ident(SearchForValues) operator(:=) operator(()ident(sfValueNames) reserved(in) ident(SearchFor)operator(\)) + reserved(or) operator(()ident(sfValueData) reserved(in) ident(SearchFor)operator(\);) + + ident(FindNodeText) operator(:=) string<delimiter(')content(Find )delimiter(')> operator(+) ident(Quote)operator(()ident(FriendlyStr)operator(()ident(SearchText)operator(\)\)) operator(+) char<delimiter(')content( )delimiter(')> operator(+) + ident(StrOfSearchOptions)operator(()ident(SearchFor)operator(\);) + + reserved(with) ident(ListTV)operator(.)ident(Items) reserved(do) reserved(begin) + ident(BeginUpdate)operator(;) + ident(FindNode) operator(:=) ident(AddChildObject)operator(()reserved(nil)operator(,) ident(FindNodeText) operator(+) string<delimiter(')content(...)delimiter(')>operator(,) reserved(nil)operator(\);) + ident(FindNode)operator(.)ident(Data) operator(:=) ident(Self)operator(;) + ident(SetTNImage)operator(()ident(FindNode)operator(,) ident(iconHostReg)operator(\);) + ident(EndUpdate)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TRegFindThread)operator(.)ident(UpdateStatus)operator(;) +reserved(begin) + ident(FindNode)operator(.)ident(Text) operator(:=) ident(FindNodeText) operator(+) char<delimiter(')content( )delimiter(')> operator(+) ident(syncStatusText)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TRegFindThread)operator(.)ident(Finish)operator(;) +reserved(var) + ident(Found)operator(:) reserved(string)operator(;) +reserved(begin) + ident(ObjectsFound) operator(:=) ident(KeysFound) operator(+) ident(ValuesFound) operator(+) ident(DataFound)operator(;) + + ident(Found) operator(:=) ident(StrNumerus)operator(()ident(ObjectsFound)operator(,) string<delimiter(')content(object)delimiter(')>operator(,) string<delimiter(')content(objects)delimiter(')>operator(,) string<delimiter(')content(No)delimiter(')>operator(\);) + reserved(if) ident(ObjectsFound) operator(<) integer(2) reserved(then) + ident(Found) operator(:=) ident(Found) operator(+) string<delimiter(')content( found.)delimiter(')> + reserved(else) reserved(begin) + ident(Found) operator(:=) ident(Found) operator(+) string<delimiter(')content( found: )delimiter(')>operator(;) + reserved(if) ident(KeysFound) operator(>) integer(0) reserved(then) + ident(Found) operator(:=) ident(Found) operator(+) ident(StrNumerus)operator(()ident(KeysFound)operator(,) string<delimiter(')content(KeyName, )delimiter(')>operator(,) string<delimiter(')content(KeyNames, )delimiter(')>operator(,) string<delimiter(')content(No)delimiter(')>operator(\);) + reserved(if) ident(ValuesFound) operator(>) integer(0) reserved(then) + ident(Found) operator(:=) ident(Found) operator(+) ident(StrNumerus)operator(()ident(ValuesFound)operator(,) string<delimiter(')content(ValueName, )delimiter(')>operator(,) string<delimiter(')content(ValueNames, )delimiter(')>operator(,) + string<delimiter(')content(No)delimiter(')>operator(\);) + reserved(if) ident(DataFound) operator(>) integer(0) reserved(then) + ident(Found) operator(:=) ident(Found) operator(+) ident(StrNumerus)operator(()ident(DataFound)operator(,) string<delimiter(')content(Data)delimiter(')>operator(,) string<delimiter(')content(Datas)delimiter(')>operator(,) string<delimiter(')content(No)delimiter(')>operator(\);) + + reserved(if) ident(RightStr)operator(()ident(Found)operator(,) integer(2)operator(\)) operator(=) string<delimiter(')content(, )delimiter(')> reserved(then) + ident(Delete)operator(()ident(Found)operator(,) ident(Length)operator(()ident(Found)operator(\)) operator(-) integer(1)operator(,) integer(2)operator(\);) + reserved(end)operator(;) + + ident(FindNode)operator(.)ident(Text) operator(:=) ident(FindNodeText) operator(+) ident(Format)operator(()string<delimiter(')content( OK (%0.1f s\) %s)delimiter(')>operator(,) + operator([)ident(TimeElapsed)operator(,) ident(Found)operator(]\);) +reserved(end)operator(;) + +reserved(end)operator(.) +reserved(unit) ident(FindWinU)operator(;) + +reserved(interface) + +reserved(uses) + ident(Windows)operator(,) ident(Messages)operator(,) ident(SysUtils)operator(,) ident(Classes)operator(,) ident(Graphics)operator(,) ident(Controls)operator(,) ident(Forms)operator(,) ident(Dialogs)operator(,) + ident(ComCtrls)operator(,) ident(StdCtrls)operator(,) ident(ExtCtrls)operator(,) ident(Clipbrd)operator(,) ident(NewPanels)operator(,) ident(plutoconst)operator(,) ident(FindTH)operator(,) ident(YTools)operator(,) + ident(PrefTools)operator(,) ident(Menus)operator(,) ident(XReg)operator(,) ident(RangeEdit)operator(;) + +reserved(type) + ident(TFindWin) operator(=) reserved(class)operator(()ident(TForm)operator(\)) + ident(ListTV)operator(:) ident(TTreeView)operator(;) + ident(FindP)operator(:) ident(TPanel)operator(;) + ident(FindE)operator(:) ident(TEdit)operator(;) + ident(ColorPanel1)operator(:) ident(TColorPanel)operator(;) + ident(ResultsPopup)operator(:) ident(TPopupMenu)operator(;) + ident(Copy1)operator(:) ident(TMenuItem)operator(;) + ident(ColorPanel2)operator(:) ident(TColorPanel)operator(;) + ident(FindPrefP)operator(:) ident(TPanel)operator(;) + ident(CommonGB)operator(:) ident(TGroupBox)operator(;) + ident(Label4)operator(:) ident(TLabel)operator(;) + ident(SfWildCardsCB)operator(:) ident(TCheckBox)operator(;) + ident(SfPartsCB)operator(:) ident(TCheckBox)operator(;) + ident(SfIgnoreCaseCB)operator(:) ident(TCheckBox)operator(;) + ident(SfAsHexCB)operator(:) ident(TCheckBox)operator(;) + ident(SfAsDWord)operator(:) ident(TCheckBox)operator(;) + ident(SfUseLocalesCB)operator(:) ident(TCheckBox)operator(;) + ident(FindGB)operator(:) ident(TGroupBox)operator(;) + ident(SfHKUCB)operator(:) ident(TCheckBox)operator(;) + ident(SfHKLMCB)operator(:) ident(TCheckBox)operator(;) + ident(SfHKDDCB)operator(:) ident(TCheckBox)operator(;) + ident(SfRootKeyRB)operator(:) ident(TRadioButton)operator(;) + ident(SfCurKeyRB)operator(:) ident(TRadioButton)operator(;) + ident(SfCLSIDCB)operator(:) ident(TCheckBox)operator(;) + ident(SfInterfaceCB)operator(:) ident(TCheckBox)operator(;) + ident(SfKeysCb)operator(:) ident(TCheckBox)operator(;) + ident(SfValuesCB)operator(:) ident(TCheckBox)operator(;) + ident(SfDataCB)operator(:) ident(TCheckBox)operator(;) + ident(SfStringCB)operator(:) ident(TCheckBox)operator(;) + ident(SfOtherCB)operator(:) ident(TCheckBox)operator(;) + ident(SfDWordCB)operator(:) ident(TCheckBox)operator(;) + ident(Panel2)operator(:) ident(TPanel)operator(;) + ident(GroupBox1)operator(:) ident(TGroupBox)operator(;) + ident(Label1)operator(:) ident(TLabel)operator(;) + ident(ThreadPriorityComB)operator(:) ident(TComboBox)operator(;) + ident(ProgressRG)operator(:) ident(TRadioGroup)operator(;) + ident(Panel5)operator(:) ident(TPanel)operator(;) + ident(BorderPanel1)operator(:) ident(TBorderPanel)operator(;) + ident(MoleLogoI)operator(:) ident(TImage)operator(;) + ident(TypeRangeE)operator(:) ident(TRangeEdit)operator(;) + ident(SfTypesCB)operator(:) ident(TCheckBox)operator(;) + ident(Panel1)operator(:) ident(TPanel)operator(;) + ident(TransparentCB)operator(:) ident(TPrefCheckBox)operator(;) + ident(StayOnTopCB)operator(:) ident(TPrefCheckBox)operator(;) + ident(FindB)operator(:) ident(TButton)operator(;) + ident(FindPrefB)operator(:) ident(TButton)operator(;) + reserved(procedure) ident(FindBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(ListTVKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) ident(Shift)operator(:) ident(TShiftState)operator(\);) + reserved(procedure) ident(FindEKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) ident(Shift)operator(:) ident(TShiftState)operator(\);) + reserved(procedure) ident(ActivateIt)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(DeActivateIt)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(FormDeactivate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(FormActivate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(FormKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) ident(Shift)operator(:) ident(TShiftState)operator(\);) + reserved(procedure) ident(SfWildCardsCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(StayOnTopCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(SfRootKeysUpdate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(FindPrefBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + + reserved(procedure) ident(CloseFindPrefP)operator(;) + reserved(procedure) ident(OpenFindPrefP)operator(;) + reserved(procedure) ident(FindEChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(SfDataCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(ListTVDblClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(SfAsHexCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(Copy1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(SfIgnoreCaseCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(FormCreate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(FormShow)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(SfTypesCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(end)operator(;) + +reserved(const) + ident(fpbOpen) operator(=) integer(0)operator(;) + ident(fpbCloseCaption) operator(=) string<delimiter(')content(Params &<<)delimiter(')>operator(;) + + ident(fpbClosed) operator(=) integer(1)operator(;) + ident(fpbOpenCaption) operator(=) string<delimiter(')content(Params &>>)delimiter(')>operator(;) + +reserved(var) + ident(FindWin)operator(:) ident(TFindWin)operator(;) + +reserved(implementation) + +reserved(uses) ident(plutomain)operator(,) ident(PrefU)operator(,) ident(ValuesU)operator(;) + +preprocessor({$R *.DFM}) + +reserved(procedure) ident(TFindWin)operator(.)ident(FindBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(SearchFor)operator(:) ident(TSearchOptions)operator(;) + ident(FindThread)operator(:) ident(TRegFindThread)operator(;) + + reserved(procedure) ident(AddOption)operator(()ident(CheckBox)operator(:) ident(TCustomCheckBox)operator(;) ident(Flag)operator(:) ident(TSearchVar)operator(\);) + reserved(begin) + reserved(with) ident(CheckBox) reserved(as) ident(TCheckBox) reserved(do) + reserved(if) ident(Enabled) reserved(and) ident(Checked) reserved(then) + ident(Include)operator(()ident(SearchFor)operator(,) ident(Flag)operator(\);) + reserved(end)operator(;) + +reserved(begin) + ident(SearchFor) operator(:=) operator([];) + + ident(AddOption)operator(()ident(SfKeysCB)operator(,) ident(sfKeys)operator(\);) + + ident(AddOption)operator(()ident(SfValuesCB)operator(,) ident(sfValueNames)operator(\);) + ident(AddOption)operator(()ident(SfDataCB)operator(,) ident(sfValueData)operator(\);) + + ident(AddOption)operator(()ident(SfStringCB)operator(,) ident(sfString)operator(\);) + ident(AddOption)operator(()ident(SfDWordCB)operator(,) ident(sfDWord)operator(\);) + ident(AddOption)operator(()ident(SfOtherCB)operator(,) ident(sfOtherTypes)operator(\);) + + reserved(if) ident(SfRootKeyRB)operator(.)ident(Checked) reserved(then) reserved(begin) + ident(AddOption)operator(()ident(SfHKUCB)operator(,) ident(sfHKU)operator(\);) + ident(AddOption)operator(()ident(SfHKLMCB)operator(,) ident(sfHKLM)operator(\);) + ident(AddOption)operator(()ident(SfHKDDCB)operator(,) ident(sfHKDD)operator(\);) + reserved(end)operator(;) + + ident(AddOption)operator(()ident(SfAsHexCB)operator(,) ident(sfAsHex)operator(\);) + ident(AddOption)operator(()ident(SfWildCardsCB)operator(,) ident(sfWildCards)operator(\);) + ident(AddOption)operator(()ident(SfPartsCB)operator(,) ident(sfParts)operator(\);) + ident(AddOption)operator(()ident(SfIgnoreCaseCB)operator(,) ident(sfIgnoreCase)operator(\);) + ident(AddOption)operator(()ident(SfUseLocalesCB)operator(,) ident(sfUseLocales)operator(\);) + + comment({AddOption(SfCLSIDCB, sfCLSID\); + AddOption(SfInterfaceCB, sfInterface\);}) + + reserved(if) ident(SfTypesCB)operator(.)ident(Checked) reserved(and) reserved(not) ident(TypeRangeE)operator(.)ident(RangeMaximal) reserved(then) + ident(Include)operator(()ident(SearchFor)operator(,) ident(sfSpecialTypes)operator(\);) + + ident(FindThread) operator(:=) ident(TRegFindThread)operator(.)ident(CreateIt)operator(() + ident(TThreadPriority)operator(()ident(ThreadPriorityComB)operator(.)ident(ItemIndex)operator(\),) ident(FindE)operator(.)ident(Text)operator(,) ident(SearchFor)operator(,) + ident(TFindThreadProgress)operator(()ident(ProgressRG)operator(.)ident(ItemIndex)operator(\)\);) + + ident(FindThread)operator(.)ident(ListTV) operator(:=) ident(ListTV)operator(;) + + reserved(if) ident(sfSpecialTypes) reserved(in) ident(SearchFor) reserved(then) + ident(FindThread)operator(.)ident(Ranges) operator(:=) ident(TypeRangeE)operator(.)ident(Value)operator(;) + + reserved(if) ident(SfCurKeyRB)operator(.)ident(Checked) reserved(then) + ident(FindThread)operator(.)ident(SpecialPath) operator(:=) + ident(LWPSolve)operator(()ident(StrOfRegPath)operator(()ident(CurKey)operator(()ident(uhNonSystemShortcuts)operator(\)\)\);) + + ident(FindThread)operator(.)ident(Resume)operator(;) + ident(CloseFindPrefP)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TFindWin)operator(.)ident(ListTVKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) + ident(Shift)operator(:) ident(TShiftState)operator(\);) +reserved(var) + ident(Node)operator(:) ident(TTreeNode)operator(;) + + reserved(procedure) ident(TerminateFindThread)operator(;) + reserved(var) + ident(FindThread)operator(:) ident(TRegFindThread)operator(;) + reserved(begin) + reserved(if) operator(()ident(Node)operator(.)ident(Level) operator(=) integer(0)operator(\)) reserved(then) reserved(begin) + ident(FindThread) operator(:=) ident(TRegFindThread)operator(()ident(Node)operator(.)ident(Data)operator(\);) + reserved(if) reserved(not) ident(Assigned)operator(()ident(FindThread)operator(\)) reserved(then) + ident(Node)operator(.)ident(Delete) + reserved(else) + reserved(try) + ident(FindThread)operator(.)ident(Terminate)operator(;) + reserved(except) + ident(Node)operator(.)ident(Text) operator(:=) string<delimiter(')content(Error: couldn)char('')content(t terminate thread!)delimiter(')>operator(;) + reserved(end)operator(;) + reserved(end) reserved(else) + ident(Node)operator(.)ident(Delete)operator(;) + reserved(end)operator(;) + +reserved(begin) + ident(Node) operator(:=) ident(ListTV)operator(.)ident(Selected)operator(;) + reserved(if) reserved(not) ident(Assigned)operator(()ident(Node)operator(\)) reserved(then) + ident(Exit)operator(;) + + reserved(case) ident(Key) reserved(of) + ident(VK_F12)operator(:) reserved(if) ident(Assigned)operator(()ident(Node)operator(.)ident(Parent)operator(\)) reserved(then) + ident(Node)operator(.)ident(Parent)operator(.)ident(AlphaSort)operator(;) + + ident(VK_RETURN)operator(:) ident(ListTVDblClick)operator(()ident(Sender)operator(\);) + + ident(VK_DELETE)operator(:) ident(TerminateFindThread)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TFindWin)operator(.)ident(FindEKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) + ident(Shift)operator(:) ident(TShiftState)operator(\);) +reserved(begin) + reserved(if) ident(Key) operator(=) ident(VK_RETURN) reserved(then) + ident(FindBClick)operator(()ident(Sender)operator(\);) + + reserved(if) ident(Key) operator(=) ident(VK_UP) reserved(then) reserved(begin) + ident(CloseFindPrefP)operator(;) + ident(Key) operator(:=) integer(0)operator(;) + reserved(end) reserved(else) reserved(if) ident(Key) operator(=) ident(VK_Down) reserved(then) reserved(begin) + ident(OpenFindPrefP)operator(;) + ident(Key) operator(:=) integer(0)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TFindWin)operator(.)ident(ActivateIt)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ActivateThis)operator(()ident(Sender)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TFindWin)operator(.)ident(DeActivateIt)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(DeActivateThis)operator(()ident(Sender)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TFindWin)operator(.)ident(FormDeactivate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) ident(Assigned)operator(()ident(ActiveControl)operator(\)) reserved(and) operator(()ident(ActiveControl)operator(.)ident(Tag) operator(=) ident(EditControlFlag)operator(\)) reserved(then) + ident(DeActivateThis)operator(()ident(ActiveControl)operator(\);) + + ident(AlphaBlend) operator(:=) ident(TransparentCB)operator(.)ident(Checked)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TFindWin)operator(.)ident(FormActivate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) ident(Assigned)operator(()ident(ActiveControl)operator(\)) reserved(and) operator(()ident(ActiveControl)operator(.)ident(Tag) operator(=) ident(EditControlFlag)operator(\)) reserved(then) + ident(ActivateThis)operator(()ident(ActiveControl)operator(\);) + + ident(AlphaBlend) operator(:=) ident(False)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TFindWin)operator(.)ident(FormKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) + ident(Shift)operator(:) ident(TShiftState)operator(\);) +reserved(begin) + reserved(if) ident(Key) operator(=) ident(VK_ESCAPE) reserved(then) + ident(Close)operator(;) + ident(MainWin)operator(.)ident(FormKeyDown)operator(()ident(Sender)operator(,) ident(Key)operator(,) ident(Shift)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TFindWin)operator(.)ident(SfWildCardsCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(SfPartsCB)operator(.)ident(Enabled) operator(:=) reserved(not) ident(SfWildcardsCB)operator(.)ident(Checked)operator(;) + ident(SfIgnoreCaseCB)operator(.)ident(Enabled) operator(:=) reserved(not) ident(SfWildcardsCB)operator(.)ident(Checked)operator(;) + ident(SfUseLocalesCB)operator(.)ident(Enabled) operator(:=) ident(SfIgnoreCaseCB)operator(.)ident(Checked) reserved(and) reserved(not) ident(SfWildcardsCB)operator(.)ident(Checked)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TFindWin)operator(.)ident(StayOnTopCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) ident(StayOnTopCB)operator(.)ident(Checked) reserved(then) + ident(FormStyle) operator(:=) ident(fsStayOnTop) + reserved(else) + ident(FormStyle) operator(:=) ident(fsNormal)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TFindWin)operator(.)ident(SfRootKeysUpdate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(with) ident(SfRootKeyRB) reserved(do) reserved(begin) + ident(SfHKLMCB)operator(.)ident(Enabled) operator(:=) ident(Checked)operator(;) + ident(SfHKUCB)operator(.)ident(Enabled) operator(:=) ident(Checked)operator(;) + ident(SfHKDDCB)operator(.)ident(Enabled) operator(:=) ident(Checked)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TFindWin)operator(.)ident(FindPrefBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(case) ident(FindPrefB)operator(.)ident(Tag) reserved(of) + ident(fpbOpen)operator(:) + ident(CloseFindPrefP)operator(;) + ident(fpbClosed)operator(:) + ident(OpenFindPrefP)operator(;) + reserved(else) + ident(ShowMessage)operator(()string<delimiter(')content(Fehler: FindPrefB hat unbekanntes Tag)delimiter(')>operator(\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TFindWin)operator(.)ident(CloseFindPrefP)operator(;) +reserved(begin) + reserved(with) ident(FindPrefB) reserved(do) reserved(begin) + ident(Tag) operator(:=) ident(fpbClosed)operator(;) + ident(Caption) operator(:=) ident(fpbOpenCaption)operator(;) + reserved(end)operator(;) + ident(FindPrefP)operator(.)ident(Visible) operator(:=) ident(False)operator(;) + ident(ListTV)operator(.)ident(Repaint)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TFindWin)operator(.)ident(OpenFindPrefP)operator(;) +reserved(begin) + reserved(with) ident(FindPrefB) reserved(do) reserved(begin) + ident(Tag) operator(:=) ident(fpbOpen)operator(;) + ident(Caption) operator(:=) ident(fpbCloseCaption)operator(;) + reserved(end)operator(;) + ident(FindPrefP)operator(.)ident(Visible) operator(:=) ident(True)operator(;) + ident(ListTV)operator(.)ident(Repaint)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TFindWin)operator(.)ident(FindEChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) ident(IsValidInteger)operator(()ident(FindE)operator(.)ident(Text)operator(\)) reserved(then) + ident(SfDWORDCB)operator(.)ident(Caption) operator(:=) string<delimiter(')content(D&WORD OK)delimiter(')> + reserved(else) + ident(SfDWORDCB)operator(.)ident(Caption) operator(:=) string<delimiter(')content(D&WORD ??)delimiter(')>operator(;) + + ident(SfAsHexCB)operator(.)ident(Enabled) operator(:=) operator(()ident(FindE)operator(.)ident(Text) operator(<>) string<delimiter(')delimiter(')>operator(\)) + reserved(and) reserved(not) ident(CharIn)operator(()ident(FindE)operator(.)ident(Text)operator(,) ident(AllChars) operator(-) ident(HexadecimalChars) operator(-) operator([)char<delimiter(')content( )delimiter(')>operator(]\);) + ident(SfAsDWord)operator(.)ident(Enabled) operator(:=) ident(SfAsHexCB)operator(.)ident(Enabled) reserved(and) operator(()ident(Length)operator(()ident(TrimAll)operator(()ident(FindE)operator(.)ident(Text)operator(\)\)) operator(<) integer(8)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TFindWin)operator(.)ident(SfDataCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(with) ident(SfDataCB) reserved(do) reserved(begin) + ident(SfStringCB)operator(.)ident(Enabled) operator(:=) ident(Checked)operator(;) + ident(SfDWordCB)operator(.)ident(Enabled) operator(:=) ident(Checked)operator(;) + ident(SfOtherCB)operator(.)ident(Enabled) operator(:=) ident(Checked)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TFindWin)operator(.)ident(ListTVDblClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(Node)operator(:) ident(TTreeNode)operator(;) +reserved(begin) + ident(Node) operator(:=) ident(ListTV)operator(.)ident(Selected)operator(;) + reserved(if) reserved(not) ident(Assigned)operator(()ident(Node)operator(\)) reserved(or) operator(()ident(Node)operator(.)ident(Level) operator(=) integer(0)operator(\)) reserved(then) + ident(Exit)operator(;) + + ident(MainWin)operator(.)ident(GotoKey)operator(()ident(UntilLastChar)operator(()ident(Node)operator(.)ident(Text)operator(,) char<delimiter(')content(=)delimiter(')>operator(\)\)) +reserved(end)operator(;) + +reserved(procedure) ident(TFindWin)operator(.)ident(SfAsHexCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(with) ident(SfAsHexCB) reserved(do) reserved(begin) + ident(SfIgnoreCaseCB)operator(.)ident(Enabled) operator(:=) ident(Checked)operator(;) + ident(SfWildCardsCB)operator(.)ident(Enabled) operator(:=) ident(Checked)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TFindWin)operator(.)ident(Copy1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(Node)operator(:) ident(TTreeNode)operator(;) +reserved(begin) + ident(Node) operator(:=) ident(ListTV)operator(.)ident(Selected)operator(;) + reserved(if) reserved(not) ident(Assigned)operator(()ident(Node)operator(\)) reserved(then) + ident(Exit)operator(;) + + ident(Clipboard)operator(.)ident(AsText) operator(:=) ident(Node)operator(.)ident(Text)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TFindWin)operator(.)ident(SfIgnoreCaseCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(SfUseLocalesCB)operator(.)ident(Enabled) operator(:=) ident(SfIgnoreCaseCB)operator(.)ident(Checked)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TFindWin)operator(.)ident(FormCreate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(ImageFile)operator(:) reserved(string)operator(;) +reserved(begin) + ident(Caption) operator(:=) string<delimiter(')content(Pluto.RegMole )delimiter(')> operator(+) ident(RegMoleVersion) operator(+) + string<delimiter(')content( - The fastest registry search engine for Win9x)delimiter(')>operator(;) + + ident(ImageFile) operator(:=) ident(PlutoDir) operator(+) string<delimiter(')content(mole.bmp)delimiter(')>operator(;) + reserved(if) ident(FileExists)operator(()ident(ImageFile)operator(\)) reserved(then) + ident(MoleLogoI)operator(.)ident(Picture)operator(.)ident(LoadFromFile)operator(()ident(ImageFile)operator(\);) + + ident(Width) operator(:=) ident(Screen)operator(.)ident(WorkAreaWidth) operator(-) integer(100)operator(;) + + ident(CloseFindPrefP)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TFindWin)operator(.)ident(FormShow)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(Top) operator(:=) ident(Screen)operator(.)ident(WorkAreaHeight) operator(-) integer(450)operator(;) + ident(Height) operator(:=) ident(Screen)operator(.)ident(WorkAreaHeight) operator(-) ident(Top)operator(;) + ident(Left) operator(:=) operator(()ident(Screen)operator(.)ident(WorkAreaWidth) operator(-) ident(Width)operator(\)) reserved(div) integer(2)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TFindWin)operator(.)ident(SfTypesCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(TypeRangeE)operator(.)ident(Enabled) operator(:=) ident(SfTypesCB)operator(.)ident(Checked)operator(;) +reserved(end)operator(;) + +reserved(end)operator(.) +reserved(unit) ident(Plutoconst)operator(;) + +reserved(interface) + +reserved(uses) ident(ComCtrls)operator(,) ident(Classes)operator(,) ident(XReg)operator(,) ident(UniKey)operator(,) ident(YTools)operator(;) + +reserved(var) + ident(Started)operator(:) ident(Boolean) operator(=) ident(False)operator(;) + ident(MurphyMode)operator(:) ident(Boolean) operator(=) ident(False)operator(;) + ident(PlutoKey)operator(:) ident(TUniKey)operator(;) + +reserved(const) + ident(Version) operator(=) string<delimiter(')content(1.6 -nium Alpha)delimiter(')>operator(;) + ident(Overnight) operator(=) ident(True)operator(;) + ident(Codename) operator(=) string<delimiter(')content(Phoenix)delimiter(')>operator(;) + comment(//Generation.Version-Release-Beta) + comment(// GG.VVRRBB) + ident(VersionNum)operator(:) ident(Double) operator(=) float(1.600000)operator(;) + comment(//Must be Double!) + +reserved(const) + ident(iconKey) operator(=) integer(0)operator(;) + + ident(iconFirstHKEY) operator(=) integer(2)operator(;) + ident(iconHKLM) operator(=) ident(iconFirstHKEY)operator(;) + ident(iconHKU) operator(=) ident(iconFirstHKEY) operator(+) integer(2)operator(;) + + ident(iconFirstShortcut) operator(=) ident(iconFirstHKEY) operator(+) integer(4)operator(;) + ident(iconHKCC) operator(=) ident(iconFirstShortcut)operator(;) + ident(iconHKCU) operator(=) ident(iconFirstShortcut) operator(+) integer(2)operator(;) + ident(iconHKCR) operator(=) ident(iconFirstShortcut) operator(+) integer(4)operator(;) + ident(iconHKDD) operator(=) ident(iconFirstShortcut) operator(+) integer(6)operator(;) + ident(iconHKPD) operator(=) ident(iconFirstShortcut) operator(+) integer(8)operator(;) + ident(iconHKWM) operator(=) ident(iconFirstShortcut) operator(+) integer(10)operator(;) + ident(iconHKWU) operator(=) ident(iconFirstShortcut) operator(+) integer(12)operator(;) + ident(iconShortcut) operator(=) ident(iconFirstShortcut) operator(+) integer(14)operator(;) + ident(nHKeyIcons) operator(=) integer(16)operator(;) + + ident(iconFirstType) operator(=) ident(iconFirstShortcut) operator(+) ident(nHKeyIcons)operator(;) + ident(iconNone) operator(=) ident(iconFirstType) operator(+) integer(0)operator(;) + ident(iconString) operator(=) ident(iconFirstType) operator(+) integer(1)operator(;) + ident(iconExpandString) operator(=)ident(iconFirstType) operator(+) integer(2)operator(;) + ident(iconBinary) operator(=) ident(iconFirstType) operator(+) integer(3)operator(;) + ident(iconCardinal) operator(=) ident(iconFirstType) operator(+) integer(4)operator(;) + ident(iconCardBigEndian)operator(=)ident(iconFirstType) operator(+) integer(5)operator(;) + ident(iconLink) operator(=) ident(iconFirstType) operator(+) integer(6)operator(;) + ident(iconMultiString) operator(=) ident(iconFirstType) operator(+) integer(7)operator(;) + ident(iconResList) operator(=) ident(iconFirstType) operator(+) integer(8)operator(;) + ident(iconFullResDesc) operator(=) ident(iconFirstType) operator(+) integer(9)operator(;) + ident(iconResReqList) operator(=) ident(iconFirstType) operator(+) integer(10)operator(;) + ident(iconUnknownType) operator(=) ident(iconFirstType) operator(+) integer(11)operator(;) + ident(nTypeIcons) operator(=) integer(12)operator(;) + + ident(iconFirstValue) operator(=) ident(iconFirstType) operator(+) ident(nTypeIcons)operator(;) + ident(iconValueElse) operator(=) ident(iconFirstValue)operator(;) + ident(iconValueEdit) operator(=) ident(iconFirstValue) operator(+) integer(1)operator(;) + ident(iconValueEditBinary) operator(=) ident(iconFirstValue) operator(+) integer(2)operator(;) + ident(iconValueZeromize) operator(=) ident(iconFirstValue) operator(+) integer(3)operator(;) + ident(iconValueDublicate) operator(=) ident(iconFirstValue) operator(+) integer(4)operator(;) + ident(iconMainValue) operator(=) ident(iconFirstValue) operator(+) integer(5)operator(;) + ident(iconTakeAsMainValue) operator(=) ident(iconFirstValue) operator(+) integer(6)operator(;) + ident(nValueIcons) operator(=) integer(7)operator(;) + + ident(iconFirstKey) operator(=) ident(iconFirstValue) operator(+) ident(nValueIcons)operator(;) + ident(iconKeyInfos) operator(=) ident(iconFirstKey)operator(;) + ident(iconSubKey) operator(=) ident(iconFirstKey) operator(+) integer(1)operator(;) + ident(iconKeyDublicate) operator(=) ident(iconFirstKey) operator(+) integer(2)operator(;) + ident(iconKeyFind) operator(=) ident(iconFirstKey) operator(+) integer(3)operator(;) + ident(iconKeyTrace) operator(=) ident(iconFirstKey) operator(+) integer(4)operator(;) + ident(nKeyIcons) operator(=) integer(5)operator(;) + + ident(iconFirstContextMenues) operator(=) ident(iconFirstKey) operator(+) ident(nKeyIcons)operator(;) + ident(iconRename) operator(=) ident(iconFirstContextMenues)operator(;) + ident(iconDelete) operator(=) ident(iconFirstContextMenues) operator(+) integer(1)operator(;) + ident(nContextMenuesIcon) operator(=) integer(2)operator(;) + + ident(iconFirstIni) operator(=) ident(iconFirstContextMenues) operator(+) ident(nContextMenuesIcon)operator(;) + ident(iconIniSection) operator(=) ident(iconFirstIni)operator(;) + ident(nIniIcons) operator(=) integer(1)operator(;) + + ident(iconFirstHost) operator(=) ident(iconFirstIni) operator(+) ident(nIniIcons)operator(;) + ident(iconHostReg) operator(=) ident(iconFirstHost)operator(;) + ident(iconHostIni) operator(=) ident(iconFirstHost) operator(+) integer(1)operator(;) + ident(iconHostUni) operator(=) ident(iconFirstHost) operator(+) integer(2)operator(;) + ident(iconHostUni2) operator(=) ident(iconFirstHost) operator(+) integer(3)operator(;) + ident(nHostIcons) operator(=) integer(4)operator(;) + + ident(iconFirstOther) operator(=) ident(iconFirstHost) operator(+) ident(nHostIcons)operator(;) + + ident(iconSortArrowAsc) operator(=) ident(iconFirstOther) operator(+) integer(0)operator(;) + ident(iconSortArrowDesc) operator(=) ident(iconFirstOther) operator(+) integer(1)operator(;) + ident(iconKeyMiddle) operator(=) ident(iconFirstOther) operator(+) integer(2)operator(;) + ident(iconLock) operator(=) ident(iconFirstOther) operator(+) integer(3)operator(;) + + comment(//iconDefect = iconFirstOther;) + + comment({ WorkWin.ChangeImages }) + ident(iconFirstChange) operator(=) integer(0)operator(;) + ident(iconCKeyPlus) operator(=) ident(iconFirstChange)operator(;) + ident(iconCKeyMinus) operator(=) ident(iconFirstChange) operator(+) integer(1)operator(;) + ident(iconCValuePlus) operator(=) ident(iconFirstChange) operator(+) integer(2)operator(;) + ident(iconCValueMinus) operator(=) ident(iconFirstChange) operator(+) integer(3)operator(;) + ident(iconCContext) operator(=) ident(iconFirstChange) operator(+) integer(4)operator(;) + ident(iconOldContext) operator(=) ident(iconFirstChange) operator(+) integer(5)operator(;) + ident(iconNewContext) operator(=) ident(iconFirstChange) operator(+) integer(6)operator(;) + ident(iconGroup) operator(=) ident(iconFirstChange) operator(+) integer(7)operator(;) + ident(iconGroupBlinking) operator(=) ident(iconFirstChange) operator(+) integer(8)operator(;) + ident(nChangeIcons) operator(=) integer(7)operator(;) + + ident(DefaultValueFlag) operator(=) ident(Pointer)operator(()integer(1)operator(\);) + ident(MultiEditFlag) operator(=) ident(Pointer)operator(()integer(2)operator(\);) + + ident(NoValueCaption) operator(=) string<delimiter(')content([No Value])delimiter(')>operator(;) + + ident(EditControlFlag) operator(=) integer(100)operator(;) + + ident(MaxPreviewLen) operator(=) integer(255)operator(;) + ident(RegMaxDataSize) operator(=) hex($FFFF)operator(;) comment(//64 KB) + +reserved(const) + ident(BoolStrFileName) operator(=) string<delimiter(')content(Boolean Strings.txt)delimiter(')>operator(;) + ident(ShortcutsFileName) operator(=) string<delimiter(')content(Shortcuts.ini)delimiter(')>operator(;) + ident(StandardShortcutsFileName) operator(=) string<delimiter(')content(StandardShortcuts.ini)delimiter(')>operator(;) + ident(SisyFilterFileName) operator(=) string<delimiter(')content(sisy filter.txt)delimiter(')>operator(;) + + ident(clDarkGray) operator(=) hex($00404040)operator(;) + ident(clBrightRed) operator(=) hex($00BBBBFF)operator(;) + ident(clVeryBrightRed) operator(=) hex($00DDDDFF)operator(;) + ident(clBrightBlue) operator(=) hex($00FFBBBB)operator(;) + ident(clBrightGreen) operator(=) hex($00BBFFBB)operator(;) + ident(clCyan) operator(=) hex($00FFFF44)operator(;) + ident(clBrightCyan) operator(=) hex($00FFFFBB)operator(;) + ident(clVeryBrightCyan) operator(=) hex($00FFFFDD)operator(;) + ident(clBrightYellow) operator(=) hex($00BBFFFF)operator(;) + ident(clVeryBrightYellow) operator(=) hex($00DDFFFF)operator(;) + ident(clBrightPurple) operator(=) hex($00FFBBFF)operator(;) + ident(clBrightSilver) operator(=) hex($00DDDDDD)operator(;) + ident(clGold) operator(=) hex($0055CCEE)operator(;) + + ident(clVeryBrightBlue) operator(=) hex($00FFDDDD)operator(;) + +reserved(type) + ident(TValueListColumn) operator(=) operator(()ident(vlcName)operator(,) ident(vlcSize)operator(,) ident(vlcType)operator(,) ident(vlcData)operator(\);) + +reserved(const) + ident(ValueListColumnRange) operator(=) operator([)ident(Low)operator(()ident(TValueListColumn)operator(\)..)ident(High)operator(()ident(TValueListColumn)operator(\)];) + +reserved(type) + ident(TSearchVar) operator(=) operator(()ident(sfKeys)operator(,) ident(sfValueNames)operator(,) ident(sfValueData)operator(,) + ident(sfAsHex)operator(,) ident(sfAsDWord)operator(,) + ident(sfWildCards)operator(,) ident(sfParts)operator(,) ident(sfIgnoreCase)operator(,) ident(SfUseLocales)operator(,) + ident(sfHKU)operator(,) ident(sfHKLM)operator(,) ident(sfHKDD)operator(,//) ident(sfCLSID)operator(,) ident(sfInterface)operator(,) + ident(sfString)operator(,) ident(sfDWord)operator(,) ident(sfOtherTypes)operator(,) ident(sfSpecialTypes)operator(\);) + + ident(TSearchOptions) operator(=) reserved(set) reserved(of) ident(TSearchVar)operator(;) + + comment(//be carefull: used in with!) + ident(TKeyShortcut) operator(=) reserved(record) + ident(Alias)operator(:) reserved(string)operator(;) + ident(RealPath)operator(:) reserved(string)operator(;) + ident(Node)operator(:) ident(TTreeNode)operator(;) + reserved(end)operator(;) + ident(PKeyShortcut) operator(=) operator(^)ident(TKeyShortcut)operator(;) + ident(TShortcutA) operator(=) reserved(array) reserved(of) ident(TKeyShortcut)operator(;) + + ident(TOpenNode) operator(=) reserved(function) operator(()ident(Reg)operator(:) ident(TXRegistry)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(\):) ident(Boolean)operator(;) + ident(TCheckNode) operator(=) reserved(procedure) operator(()ident(Node)operator(:) ident(TTreeNode)operator(;) ident(OnlyOnce)operator(:) ident(Boolean) operator(=) ident(True)operator(\);) + + comment(//NodeInfo System) + ident(TNodeFlag) operator(=) operator(()ident(nfDefect)operator(,) ident(nfReadOnly)operator(,) ident(nfChecked)operator(,) + ident(nfCopy)operator(,) ident(nfCut)operator(,) ident(nfPaste)operator(\);) + ident(TNodeFlags) operator(=) reserved(set) reserved(of) ident(TNodeFlag)operator(;) + + ident(TUniHostType) operator(=) operator(()ident(uhNone)operator(,) + ident(uhReg)operator(,) ident(uhIni)operator(,) ident(uhRegFile)operator(,) + ident(uhUserShortcut)operator(,) ident(uhStandardShortcut)operator(,) ident(uhSystemShortcut)operator(\);) + ident(TUniHostTypes) operator(=) reserved(set) reserved(of) ident(TUniHostType)operator(;) + +reserved(const) + ident(uhShortcuts) operator(=) operator([)ident(uhUserShortcut)operator(,) ident(uhStandardShortcut)operator(,) ident(uhSystemShortcut)operator(];) + ident(uhNonSystemShortcuts) operator(=) operator([)ident(uhUserShortcut)operator(,) ident(uhStandardShortcut)operator(];) + + ident(NodeFlagStrings)operator(:) reserved(array)operator([)ident(TNodeFlag)operator(]) reserved(of) reserved(string) operator(=) operator(() + string<delimiter(')content(nfDefect)delimiter(')>operator(,) string<delimiter(')content(nfReadOnly)delimiter(')>operator(,) string<delimiter(')content(nfChecked)delimiter(')>operator(,) + string<delimiter(')content(nfCopy)delimiter(')>operator(,) string<delimiter(')content(nfCut)delimiter(')>operator(,) string<delimiter(')content(nfPaste)delimiter(')>operator(\);) + + ident(HostTypeStrings)operator(:) reserved(array)operator([)ident(TUniHostType)operator(]) reserved(of) reserved(string) operator(=) operator(()string<delimiter(')content(uhNone)delimiter(')>operator(,) + string<delimiter(')content(uhReg)delimiter(')>operator(,) string<delimiter(')content(uhIni)delimiter(')>operator(,) string<delimiter(')content(uhRegFile)delimiter(')>operator(,) + string<delimiter(')content(uhUserShortcut)delimiter(')>operator(,) string<delimiter(')content(uhStandardShortcut)delimiter(')>operator(,) string<delimiter(')content(uhSystemShortcut)delimiter(')>operator(\);) + +reserved(type) + ident(TNodeInfo) operator(=) reserved(packed) reserved(class) + directive(public) + ident(HostType)operator(:) ident(TUniHostType)operator(;) + ident(Flags)operator(:) ident(TNodeFlags)operator(;) + reserved(constructor) ident(Create)operator(()ident(HostType)operator(:) ident(TUniHostType) operator(=) ident(uhNone)operator(;) ident(Flags)operator(:) ident(TNodeFlags) operator(=) operator([]\);) + + reserved(procedure) ident(IncludeFlag)operator(()ident(Flag)operator(:) ident(TNodeFlag)operator(\);) + reserved(procedure) ident(ExcludeFlag)operator(()ident(Flag)operator(:) ident(TNodeFlag)operator(\);) + + reserved(function) ident(IsHost)operator(:) ident(Boolean)operator(;) + reserved(function) ident(IsShortcut)operator(:) ident(Boolean)operator(;) + + reserved(function) ident(ReadOnly)operator(:) ident(Boolean)operator(;) + reserved(function) ident(Checked)operator(:) ident(Boolean)operator(;) + reserved(function) ident(Defect)operator(:) ident(Boolean)operator(;) + reserved(end)operator(;) + +reserved(function) ident(NodeInfo)operator(()ident(Node)operator(:) ident(TTreeNode)operator(\):) ident(TNodeInfo)operator(;) +reserved(procedure) ident(ReportStatus)operator(()reserved(const) ident(s)operator(:) reserved(string)operator(\);) + +reserved(const) + ident(PlatformStrings)operator(:) reserved(array)operator([)integer(0)operator(..)integer(2)operator(]) reserved(of) reserved(string) operator(=) + operator(()string<delimiter(')content(VER_PLATFORM_WIN32s)delimiter(')>operator(,) string<delimiter(')content(VER_PLATFORM_WIN32_WINDOWS)delimiter(')>operator(,) string<delimiter(')content(VER_PLATFORM_WIN32_NT)delimiter(')>operator(\);) + +reserved(var) + ident(PlutoDir)operator(:) reserved(string) operator(=) string<delimiter(')delimiter(')>operator(;) + +reserved(implementation) + +reserved(uses) ident(SysUtils)operator(;) + +reserved(function) ident(NodeInfo)operator(()ident(Node)operator(:) ident(TTreeNode)operator(\):) ident(TNodeInfo)operator(;) +reserved(begin) + reserved(if) reserved(not) ident(Assigned)operator(()ident(Node)operator(\)) reserved(then) reserved(begin) + ident(Result) operator(:=) reserved(nil)operator(;) + ident(Exit) reserved(end)operator(;) + + reserved(if) reserved(not) ident(Assigned)operator(()ident(Node)operator(.)ident(Data)operator(\)) reserved(then) + ident(Node)operator(.)ident(Data) operator(:=) ident(TNodeInfo)operator(.)ident(Create)operator(;) + ident(Result) operator(:=) ident(TNodeInfo)operator(()ident(Node)operator(.)ident(Data)operator(\);) +reserved(end)operator(;) + +comment({ TNodeInfo }) + +reserved(constructor) ident(TNodeInfo)operator(.)ident(Create)operator(()ident(HostType)operator(:) ident(TUniHostType)operator(;) ident(Flags)operator(:) ident(TNodeFlags)operator(\);) +reserved(begin) + reserved(inherited) ident(Create)operator(;) + ident(Self)operator(.)ident(HostType) operator(:=) ident(HostType)operator(;) + ident(Self)operator(.)ident(Flags) operator(:=) ident(Flags)operator(;) +reserved(end)operator(;) + +reserved(function) ident(TNodeInfo)operator(.)ident(Checked)operator(:) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(nfChecked) reserved(in) ident(Flags)operator(;) +reserved(end)operator(;) + +reserved(function) ident(TNodeInfo)operator(.)ident(ReadOnly)operator(:) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(nfReadOnly) reserved(in) ident(Flags)operator(;) +reserved(end)operator(;) + +reserved(function) ident(TNodeInfo)operator(.)ident(Defect)operator(:) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(nfDefect) reserved(in) ident(Flags)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TNodeInfo)operator(.)ident(IncludeFlag)operator(()ident(Flag)operator(:) ident(TNodeFlag)operator(\);) +reserved(begin) + ident(Include)operator(()ident(Flags)operator(,) ident(Flag)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TNodeInfo)operator(.)ident(ExcludeFlag)operator(()ident(Flag)operator(:) ident(TNodeFlag)operator(\);) +reserved(begin) + ident(Exclude)operator(()ident(Flags)operator(,) ident(Flag)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(TNodeInfo)operator(.)ident(IsHost)operator(:) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(HostType) operator(<>) ident(uhNone)operator(;) +reserved(end)operator(;) + +reserved(function) ident(TNodeInfo)operator(.)ident(IsShortcut)operator(:) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(HostType) reserved(in) ident(uhShortcuts)operator(;) +reserved(end)operator(;) + +reserved(function) ident(GetPlutoDir)operator(:) reserved(string)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(LWPSlash)operator(()ident(GetParam)operator(()string<delimiter(')content(-imports=)delimiter(')>operator(,) ident(MyDir)operator(\)\);) + reserved(if) reserved(not) ident(DirectoryExists)operator(()ident(Result)operator(\)) reserved(then) reserved(begin) + ident(ReportStatus)operator(()string<delimiter(')content(PlutoDir ")delimiter(')> operator(+) ident(Result) operator(+) string<delimiter(')content(" not found -> setting to default (MyDir\).)delimiter(')>operator(\);) + ident(Result) operator(:=) ident(MyDir)operator(;) + reserved(end)operator(;) + ident(ReportStatus)operator(()string<delimiter(')content(PlutoDir=)delimiter(')> operator(+) ident(Result)operator(\);) +reserved(end)operator(;) + +reserved(var) + ident(ReportSL)operator(:) ident(TStringList)operator(;) + ident(ReportFileName)operator(:) reserved(string)operator(;) + +reserved(procedure) ident(ReportStatus)operator(()reserved(const) ident(s)operator(:) reserved(string)operator(\);) +reserved(begin) + ident(ReportSL)operator(.)ident(Add)operator(()ident(s)operator(\);) + reserved(try) + ident(ReportSL)operator(.)ident(SaveToFile)operator(()ident(ReportFileName)operator(\);) + reserved(except) reserved(end)operator(;) +reserved(end)operator(;) + +reserved(initialization) + ident(ReportFileName) operator(:=) ident(MyDir) operator(+) string<delimiter(')content(loadreport.txt)delimiter(')>operator(;) + ident(ReportSL) operator(:=) ident(TStringList)operator(.)ident(Create)operator(;) + ident(PlutoDir) operator(:=) ident(GetPlutoDir)operator(;) + +reserved(end)operator(.) +comment(//winampviscolor <viscolor.txt>:) +reserved(unit) ident(plutomain)operator(;) +preprocessor({$DEFINE UNIKEY}) +preprocessor({$DEFINE CYCFS}) + +comment({=============================================================================== + + cYcnus.Pluto 1.57 Beta 14 + by Murphy + + ©2000-2003 by cYcnus + visit www.cYcnus.de + + murphy@cYcnus.de (Kornelius Kalnbach\) + + this programm is published under the terms of the GPL + +===============================================================================}) + +reserved(interface) + +reserved(uses) + ident(Windows)operator(,) ident(Messages)operator(,) ident(SysUtils)operator(,) ident(Classes)operator(,) ident(Graphics)operator(,) ident(Controls)operator(,) ident(Forms)operator(,) ident(Dialogs)operator(,) + ident(StdCtrls)operator(,) ident(ImgList)operator(,) ident(ComCtrls)operator(,) ident(ExtCtrls)operator(,) ident(Menus)operator(,) ident(Clipbrd)operator(,) ident(IniFiles)operator(,) + ident(ShellAPI)operator(,) ident(Grids)operator(,) + comment(//Components) + ident(NewPanels)operator(,) + comment(//Units) + ident(YTools)operator(,) ident(YTypes)operator(,) ident(UniKey)operator(,) ident(XReg)operator(,) + comment(//Pluto) + ident(Plutoconst)operator(,) + ident(SpyTH)operator(,) ident(SisyphusTH)operator(;) + +reserved(const) + ident(NoPreBlinkHint) operator(=) char(#1)operator(;) + +reserved(type) + ident(TMainWin) operator(=) reserved(class)operator(()ident(TForm)operator(\)) + ident(StatusBar)operator(:) ident(TStatusBar)operator(;) + ident(StatusBarPU)operator(:) ident(TPopupMenu)operator(;) + ident(CopyPath)operator(:) ident(TMenuItem)operator(;) + ident(InsertPath)operator(:) ident(TMenuItem)operator(;) + ident(ShowRealPathMI)operator(:) ident(TMenuItem)operator(;) + ident(PathP)operator(:) ident(TPanel)operator(;) + ident(N1)operator(:) ident(TMenuItem)operator(;) + ident(MainMenu1)operator(:) ident(TMainMenu)operator(;) + ident(Desktop1)operator(:) ident(TMenuItem)operator(;) + ident(Pluto1)operator(:) ident(TMenuItem)operator(;) + ident(RegEdit1)operator(:) ident(TMenuItem)operator(;) + ident(Free1)operator(:) ident(TMenuItem)operator(;) + ident(BigVal1)operator(:) ident(TMenuItem)operator(;) + ident(Hilfe1)operator(:) ident(TMenuItem)operator(;) + ident(History1)operator(:) ident(TMenuItem)operator(;) + ident(SplashScreen1)operator(:) ident(TMenuItem)operator(;) + ident(wwwcYcnusde1)operator(:) ident(TMenuItem)operator(;) + ident(Credits1)operator(:) ident(TMenuItem)operator(;) + ident(Optionen1)operator(:) ident(TMenuItem)operator(;) + ident(PrefMI)operator(:) ident(TMenuItem)operator(;) + ident(EditBoolStrMI)operator(:) ident(TMenuItem)operator(;) + ident(N4)operator(:) ident(TMenuItem)operator(;) + ident(ImageList1)operator(:) ident(TImageList)operator(;) + ident(Plutoini1)operator(:) ident(TMenuItem)operator(;) + ident(About1)operator(:) ident(TMenuItem)operator(;) + ident(kornycYcnusde1)operator(:) ident(TMenuItem)operator(;) + ident(ools1)operator(:) ident(TMenuItem)operator(;) + ident(NotePad1)operator(:) ident(TMenuItem)operator(;) + ident(RegEdit2)operator(:) ident(TMenuItem)operator(;) + ident(SysEdit1)operator(:) ident(TMenuItem)operator(;) + ident(WordPad1)operator(:) ident(TMenuItem)operator(;) + ident(N3)operator(:) ident(TMenuItem)operator(;) + ident(N5)operator(:) ident(TMenuItem)operator(;) + ident(Suchen1)operator(:) ident(TMenuItem)operator(;) + ident(Find1)operator(:) ident(TMenuItem)operator(;) + ident(File1)operator(:) ident(TMenuItem)operator(;) + ident(ExitPluto1)operator(:) ident(TMenuItem)operator(;) + ident(OpenProgramFolder1)operator(:) ident(TMenuItem)operator(;) + ident(N6)operator(:) ident(TMenuItem)operator(;) + ident(OpenWinDir1)operator(:) ident(TMenuItem)operator(;) + ident(HintBlinkT)operator(:) ident(TTimer)operator(;) + ident(FindCLSID1)operator(:) ident(TMenuItem)operator(;) + ident(Clipboard1)operator(:) ident(TMenuItem)operator(;) + ident(GotoCLSID1)operator(:) ident(TMenuItem)operator(;) + ident(CommandLineParameters1)operator(:) ident(TMenuItem)operator(;) + ident(plutocYcnusde1)operator(:) ident(TMenuItem)operator(;) + ident(N7)operator(:) ident(TMenuItem)operator(;) + ident(heinzcYcnusde1)operator(:) ident(TMenuItem)operator(;) + ident(kornycYcnusde2)operator(:) ident(TMenuItem)operator(;) + ident(N8)operator(:) ident(TMenuItem)operator(;) + ident(ExternalHexEditMI)operator(:) ident(TMenuItem)operator(;) + ident(Cleanup1)operator(:) ident(TMenuItem)operator(;) + ident(DeleteTempFolder1)operator(:) ident(TMenuItem)operator(;) + ident(Debug1)operator(:) ident(TMenuItem)operator(;) + ident(CurrentDir1)operator(:) ident(TMenuItem)operator(;) + ident(RepairPluto155bBug1)operator(:) ident(TMenuItem)operator(;) + ident(BackupRegistryscanreg1)operator(:) ident(TMenuItem)operator(;) + ident(Username1)operator(:) ident(TMenuItem)operator(;) + ident(SupportMI)operator(:) ident(TMenuItem)operator(;) + ident(MurphyMI)operator(:) ident(TMenuItem)operator(;) + ident(ToDoMI)operator(:) ident(TMenuItem)operator(;) + ident(Beta1)operator(:) ident(TMenuItem)operator(;) + ident(UniKeycYcnusde1)operator(:) ident(TMenuItem)operator(;) + ident(YToolscYcnusde1)operator(:) ident(TMenuItem)operator(;) + ident(YPanelscYcnusde1)operator(:) ident(TMenuItem)operator(;) + ident(Usedenginescomponents1)operator(:) ident(TMenuItem)operator(;) + ident(PrefToolscYcnusde1)operator(:) ident(TMenuItem)operator(;) + ident(BugReportsRequests1)operator(:) ident(TMenuItem)operator(;) + ident(murphycYcnusde1)operator(:) ident(TMenuItem)operator(;) + ident(Credits2)operator(:) ident(TMenuItem)operator(;) + ident(News1)operator(:) ident(TMenuItem)operator(;) + ident(cYcnus1)operator(:) ident(TMenuItem)operator(;) + ident(Contact1)operator(:) ident(TMenuItem)operator(;) + ident(N2)operator(:) ident(TMenuItem)operator(;) + ident(IjustwantCONTACT1)operator(:) ident(TMenuItem)operator(;) + ident(N9)operator(:) ident(TMenuItem)operator(;) + ident(AnotherPluto1)operator(:) ident(TMenuItem)operator(;) + ident(UniKeyDemoMI)operator(:) ident(TMenuItem)operator(;) + ident(Path1)operator(:) ident(TMenuItem)operator(;) + ident(RegisterPlugIns1)operator(:) ident(TMenuItem)operator(;) + ident(UniPluginOD)operator(:) ident(TOpenDialog)operator(;) + ident(SwapLM_CUB)operator(:) ident(TButton)operator(;) + ident(PathE)operator(:) ident(TEdit)operator(;) + ident(ShowLoadreport1)operator(:) ident(TMenuItem)operator(;) + ident(KillPluto1)operator(:) ident(TMenuItem)operator(;) + ident(ShowPlatform1)operator(:) ident(TMenuItem)operator(;) + ident(MSConfig1)operator(:) ident(TMenuItem)operator(;) + ident(TimetoRelaxMI)operator(:) ident(TMenuItem)operator(;) + ident(N10)operator(:) ident(TMenuItem)operator(;) + + reserved(procedure) ident(FormCreate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(FormKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) ident(Shift)operator(:) ident(TShiftState)operator(\);) + reserved(procedure) ident(FormClose)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Action)operator(:) ident(TCloseAction)operator(\);) + reserved(procedure) ident(InsertPathClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + + reserved(procedure) ident(StatusBarResize)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(StatusBarDblClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(StatusBarUpdate)operator(;) + reserved(procedure) ident(CopyPathClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + + reserved(procedure) ident(SetStatus)operator(;) + reserved(procedure) ident(GotoKey)operator(()ident(Key)operator(:) reserved(string)operator(\);) + reserved(procedure) ident(FindCLSID)operator(;) + reserved(procedure) ident(GotoCLSID)operator(;) + reserved(procedure) ident(UserGotoKey)operator(;) + reserved(procedure) ident(ShowRealPathMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(PathEKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) ident(Shift)operator(:) ident(TShiftState)operator(\);) + reserved(procedure) ident(PathEChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(PathEExit)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + + reserved(procedure) ident(AppActivate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(PathEKeyUp)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) ident(Shift)operator(:) ident(TShiftState)operator(\);) + reserved(procedure) ident(ActivateIt)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(FormActivate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(FormDeactivate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(Pluto1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(RegEdit1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(Free1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(BigVal1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(SplashScreen1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(HistoryClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(Credits1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + + reserved(function) ident(Greeting)operator(()ident(Name)operator(:) reserved(string) operator(=) ident(NoPreBlinkHint)operator(\):) reserved(string)operator(;) + reserved(procedure) ident(PrefMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(EditBoolStrMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(FormCloseQuery)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(CanClose)operator(:) ident(Boolean)operator(\);) + reserved(procedure) ident(SisyTerminate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(OnSisyChange)operator(()ident(Sender)operator(:) ident(TSisyThread)operator(;) ident(Change)operator(:) ident(TSisyChange)operator(\);) + reserved(procedure) ident(OnSisyValuePlus)operator(()ident(Sender)operator(:) ident(TSisyThread)operator(;) ident(Change)operator(:) ident(TSisyChange)operator(\);) + reserved(procedure) ident(OnSisyValueMinus)operator(()ident(Sender)operator(:) ident(TSisyThread)operator(;) ident(Change)operator(:) ident(TSisyChange)operator(\);) + reserved(procedure) ident(OnSisyContextChange)operator(()ident(Sender)operator(:) ident(TSisyThread)operator(;) ident(Change)operator(:) ident(TSisyChange)operator(\);) + + reserved(procedure) ident(Plutoini1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(RegEdit2Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(SysEdit1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(NotePad1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(WordPad1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(OpenWinDir1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(OpenProgramFolder1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(ExitPluto1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(Find1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(FormPaint)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + + reserved(procedure) ident(Load)operator(;) + reserved(procedure) ident(StatusBarDrawPanel)operator(()ident(StatusBar)operator(:) ident(TStatusBar)operator(;) + ident(Panel)operator(:) ident(TStatusPanel)operator(;) reserved(const) ident(Rect)operator(:) ident(TRect)operator(\);) + reserved(procedure) ident(PathEKeyPress)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Char)operator(\);) + reserved(procedure) ident(HintBlinkTTimer)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(FindCLSID1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(GotoCLSID1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(CommandLineParameters1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(WebLinkMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(DeleteTempFolder1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(CurrentDir1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(RepairPluto155bBug1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(BackupRegistryscanreg1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(SisyStarted)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(StopHintBlinking)operator(;) + reserved(procedure) ident(Username1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(SupportMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(ToDoMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(MailLinkMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(IjustwantCONTACT1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(ExternalHexEditMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(AnotherPluto1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(Path1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(RegisterPlugIns1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(FormResize)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(SwapLM_CUBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(ShowLoadreport1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(KillPluto1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(ShowPlatform1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(MSConfig1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(TimetoRelaxMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + directive(private) + ident(DoAutoComplete)operator(:) ident(Boolean)operator(;) + ident(MainWinLoaded)operator(:) ident(Boolean)operator(;) + ident(DontSavePrefs)operator(:) ident(Boolean)operator(;) + ident(PreBlinkHint)operator(:) reserved(string)operator(;) + reserved(end)operator(;) + +reserved(var) + ident(MainWin)operator(:) ident(TMainWin)operator(;) + + ident(StatusBar)operator(:) ident(TStatusBar)operator(;) + ident(MainReg)operator(:) ident(TXRegistry)operator(;) + + ident(SpyThread)operator(:) ident(TRegSpyThread)operator(;) + ident(Sisys)operator(:) ident(TList)operator(;) + +reserved(function) ident(TempDir)operator(:) reserved(string)operator(;) +reserved(function) ident(PlutoUniPath)operator(:) reserved(string)operator(;) +reserved(function) ident(PlutoIniFileName)operator(:) reserved(string)operator(;) + +reserved(function) ident(PathOfNode)operator(()ident(Node)operator(:) ident(TTreeNode)operator(\):) reserved(string)operator(;) +reserved(function) ident(CurKey)operator(()ident(AllowedShortcutTypes)operator(:) ident(TUniHostTypes) operator(=) operator([]\):) ident(TRegPath)operator(;) + +reserved(procedure) ident(ArrangePlutoStyle)operator(;) +reserved(procedure) ident(ArrangeRegEdStyle)operator(;) +reserved(procedure) ident(ArrangeFreeStyle)operator(;) +reserved(procedure) ident(ArrangeBigValStyle)operator(;) + +reserved(procedure) ident(ActivateThis)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(procedure) ident(DeActivateThis)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + +reserved(procedure) ident(SwapFonts)operator(()ident(Sender)operator(:) ident(TWinControl)operator(\);) + +reserved(procedure) ident(AddHint)operator(()reserved(const) ident(Hint)operator(:) reserved(string)operator(;) ident(Blinking)operator(:) ident(Boolean) operator(=) ident(False)operator(\);) +reserved(procedure) ident(AddToLastHint)operator(()ident(Appendix)operator(:) reserved(string)operator(\);) +reserved(procedure) ident(ChangeLastHint)operator(()ident(NewHint)operator(:) reserved(string)operator(\);) + +reserved(implementation) + +reserved(uses) + comment(//Forms) + ident(FindWinU)operator(,) ident(valuesU)operator(,) ident(TreeU)operator(,) ident(WorkU)operator(,) ident(splash)operator(,) ident(PrefU)operator(,) + comment(//Units) + ident(Clock)operator(,) ident(Start)operator(,) ident(keybrd)operator(,) ident(CompEx)operator(,) ident(Colors)operator(,) ident(FindAllThread)operator(,) + ident(PrefTools)operator(;) + +preprocessor({$R *.DFM}) + +reserved(var) + ident(SavedPlutoIniFileName)operator(:) reserved(string) operator(=) string<delimiter(')delimiter(')>operator(;) + +reserved(procedure) ident(AddHint)operator(()reserved(const) ident(Hint)operator(:) reserved(string)operator(;) ident(Blinking)operator(:) ident(Boolean) operator(=) ident(False)operator(\);) +reserved(begin) + reserved(if) ident(Assigned)operator(()ident(WorkWin)operator(\)) reserved(then) + ident(WorkWin)operator(.)ident(AddAHint)operator(()ident(Hint)operator(\);) + + reserved(with) ident(MainWin) reserved(do) reserved(begin) + ident(StopHintBlinking)operator(;) + + reserved(if) ident(Blinking) reserved(then) reserved(begin) + ident(HintBlinkT)operator(.)ident(Enabled) operator(:=) ident(True)operator(;) + reserved(if) ident(PreBlinkHint) operator(=) ident(NoPreBlinkHint) reserved(then) + ident(PreBlinkHint) operator(:=) ident(StatusBar)operator(.)ident(Panels)operator([)integer(0)operator(].)ident(Text)operator(;) + ident(StatusBar)operator(.)ident(Panels)operator([)integer(0)operator(].)ident(Text) operator(:=) ident(WorkWin)operator(.)ident(LastHint)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(AddToLastHint)operator(()ident(Appendix)operator(:) reserved(string)operator(\);) +reserved(begin) + reserved(with) ident(WorkWin)operator(.)ident(HintLB)operator(.)ident(Items) reserved(do) reserved(begin) + reserved(if) ident(Count) operator(=) integer(0) reserved(then) + ident(Exit)operator(;) + + ident(Strings)operator([)ident(Count)operator(-)integer(1)operator(]) operator(:=) ident(Strings)operator([)ident(Count)operator(-)integer(1)operator(]) operator(+) ident(Appendix)operator(;) + reserved(end)operator(;) + ident(Application)operator(.)ident(ProcessMessages)operator(;) +comment(// Sleep(1000\);) +reserved(end)operator(;) + +reserved(procedure) ident(ChangeLastHint)operator(()ident(NewHint)operator(:) reserved(string)operator(\);) +reserved(begin) + reserved(with) ident(WorkWin)operator(.)ident(HintLB)operator(.)ident(Items) reserved(do) reserved(begin) + reserved(if) ident(Count) operator(=) integer(0) reserved(then) + ident(Exit)operator(;) + + ident(Strings)operator([)ident(Count)operator(-)integer(1)operator(]) operator(:=) ident(NewHint)operator(;) + reserved(end)operator(;) + ident(Application)operator(.)ident(ProcessMessages)operator(;) +comment(// Sleep(1000\);) +reserved(end)operator(;) + +reserved(function) ident(CurKey)operator(()ident(AllowedShortcutTypes)operator(:) ident(TUniHostTypes) operator(=) operator([]\):) ident(TRegPath)operator(;) +reserved(var) + ident(s)operator(:) reserved(string)operator(;) + ident(Item)operator(:) ident(TListItem)operator(;) +reserved(begin) + reserved(if) ident(Assigned)operator(()ident(RegTV)operator(.)ident(Selected)operator(\)) reserved(then) reserved(begin) + ident(s) operator(:=) ident(PathOfNode)operator(()ident(RegTV)operator(.)ident(Selected)operator(\);) + reserved(if) ident(AllowedShortcutTypes) operator(<>) operator([]) reserved(then) + ident(s) operator(:=) ident(TraceKey)operator(()ident(s)operator(,) ident(AllowedShortcutTypes)operator(\);) + ident(Result)operator(.)ident(Root) operator(:=) ident(ExRegRoot)operator(()ident(s)operator(\);) + ident(Result)operator(.)ident(Key) operator(:=) ident(ExRegKey)operator(()ident(s)operator(\);) + + ident(Item) operator(:=) ident(ValueList)operator(.)ident(ItemFocused)operator(;) + reserved(if) ident(Assigned)operator(()ident(Item)operator(\)) reserved(then) + ident(Result)operator(.)ident(Value) operator(:=) ident(RealValueName)operator(()ident(Item)operator(\);) + ident(Result)operator(.)ident(ValueSet) operator(:=) ident(Assigned)operator(()ident(Item)operator(\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(function) ident(PathOfNode)operator(()ident(Node)operator(:) ident(TTreeNode)operator(\):) reserved(string)operator(;) +reserved(begin) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + + reserved(if) reserved(not) ident(Assigned)operator(()ident(Node)operator(\)) reserved(then) + ident(Exit)operator(;) + + reserved(if) ident(Assigned)operator(()ident(Node)operator(.)ident(Parent)operator(\)) reserved(then) + ident(Result) operator(:=) ident(LWPSlash)operator(()ident(PathOfNode)operator(()ident(Node)operator(.)ident(Parent)operator(\)\)) operator(+) ident(Node)operator(.)ident(Text) + reserved(else) + ident(Result) operator(:=) ident(Node)operator(.)ident(Text)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(AppActivate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(ActForm)operator(:) ident(TCustomForm)operator(;) + + reserved(procedure) ident(TryShow)operator(()ident(Win)operator(:) ident(TCustomForm)operator(\);) + reserved(begin) + reserved(if) ident(Assigned)operator(()ident(Win)operator(\)) reserved(and) ident(Win)operator(.)ident(Visible) reserved(then) + ident(Win)operator(.)ident(Show)operator(;) + reserved(end)operator(;) + +reserved(begin) + ident(ActForm) operator(:=) ident(Screen)operator(.)ident(ActiveCustomForm)operator(;) comment(//LastActiveForm;) + ident(TryShow)operator(()ident(ValuesWin)operator(\);) + ident(TryShow)operator(()ident(WorkWin)operator(\);) + ident(TryShow)operator(()ident(TreeWin)operator(\);) + ident(TryShow)operator(()ident(FindWin)operator(\);) + ident(TryShow)operator(()ident(SplashWin)operator(\);) + ident(TryShow)operator(()ident(MainWin)operator(\);) + ident(TryShow)operator(()ident(ActForm)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(FormCreate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + + reserved(procedure) ident(InitHKEYString)operator(()reserved(var) ident(H)operator(:) ident(THKEYString)operator(;) reserved(const) ident(Long)operator(,) ident(Short)operator(:) reserved(string)operator(;) + ident(Handle)operator(:) ident(Integer) operator(=) integer(0)operator(;) ident(IsDefault)operator(:) ident(Boolean) operator(=) ident(False)operator(\);) + reserved(begin) + ident(H)operator(.)ident(Long) operator(:=) ident(Long)operator(;) + ident(H)operator(.)ident(Short) operator(:=) ident(Short)operator(;) + ident(H)operator(.)ident(Handle) operator(:=) ident(Handle)operator(;) + ident(H)operator(.)ident(IsDefault) operator(:=) ident(IsDefault)operator(;) + reserved(end)operator(;) + +reserved(begin) +preprocessor({$IFDEF UNIKEY}) +preprocessor({$IFDEF CYCFS}) + ident(RegisterUniClass)operator(()string<delimiter(')content(Y:\\programme\\unikey\\cyc_fs.uni)delimiter(')>operator(\);) +preprocessor({$ENDIF}) +preprocessor({$ENDIF}) + + ident(Application)operator(.)ident(OnActivate) operator(:=) ident(AppActivate)operator(;) + ident(PlutoMain)operator(.)ident(StatusBar) operator(:=) ident(StatusBar)operator(;) + + comment(//Creating) + ident(MainReg) operator(:=) ident(TXRegistry)operator(.)ident(Create)operator(;) + + comment(//Initialize) + ident(Caption) operator(:=) string<delimiter(')content(cYcnus.Pluto )delimiter(')> operator(+) ident(Version)operator(;) + ident(PreBlinkHint) operator(:=) ident(NoPreBlinkHint)operator(;) + + ident(SetLength)operator(()ident(HKEYStrings)operator(,) ident(Length)operator(()ident(HKEYStrings)operator(\)) operator(+) integer(2)operator(\);) + ident(InitHKEYString)operator(()ident(HKEYStrings)operator([)ident(LastDefaultHKEYString) operator(+) integer(1)operator(],) + string<delimiter(')content(HKEY_WindowsMachine)delimiter(')>operator(,) string<delimiter(')content(HKWM)delimiter(')>operator(\);) + + ident(InitHKEYString)operator(()ident(HKEYStrings)operator([)ident(LastDefaultHKEYString) operator(+) integer(2)operator(],) + string<delimiter(')content(HKEY_WindowsUser)delimiter(')>operator(,) string<delimiter(')content(HKWU)delimiter(')>operator(\);) + + ident(Application)operator(.)ident(HintHidePause) operator(:=) operator(-)integer(1)operator(;) comment(//that's approximately 136 years :D) + + ident(StatusBar)operator(.)ident(Panels)operator([)integer(0)operator(].)ident(Width) operator(:=) ident(Screen)operator(.)ident(Width) reserved(div) integer(6)operator(;) + + ident(MurphyMI)operator(.)ident(Visible) operator(:=) ident(MurphyMode)operator(;) + +preprocessor({$IFDEF UNIKEY}) + ident(UniPluginOD)operator(.)ident(InitialDir) operator(:=) ident(MyDir)operator(;) +preprocessor({$ELSE}) + ident(UniKeyDemoMI)operator(.)ident(Visible) operator(:=) ident(False)operator(;) +preprocessor({$ENDIF}) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(GotoKey)operator(()ident(Key)operator(:) reserved(string)operator(\);) +reserved(var) + ident(Full)operator(:) ident(TregPath)operator(;) + ident(Node)operator(:) ident(TTreeNode)operator(;) + ident(keySA)operator(:) ident(TStrA)operator(;) + ident(i)operator(:) ident(integer)operator(;) + + reserved(function) ident(NodeOfRoot)operator(()ident(Root)operator(:) reserved(string)operator(\):) ident(TTreeNode)operator(;) + reserved(var) + ident(i)operator(:) ident(Integer)operator(;) + reserved(begin) + ident(Result) operator(:=) reserved(nil)operator(;) + ident(Root) operator(:=) ident(LongHKEY)operator(()ident(Root)operator(\);) + + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(RootNodes)operator(.)ident(Count)operator(-)integer(1) reserved(do) + reserved(if) ident(SameText)operator(()ident(TTreeNode)operator(()ident(RootNodes)operator([)ident(i)operator(]\).)ident(Text)operator(,) ident(Root)operator(\)) reserved(then) reserved(begin) + ident(Result) operator(:=) ident(TTreeNode)operator(()ident(RootNodes)operator([)ident(i)operator(]\);) + ident(Break)operator(;) reserved(end)operator(;) + + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(High)operator(()ident(Shortcuts)operator(\)) reserved(do) + reserved(if) ident(SameText)operator(()ident(Shortcuts)operator([)ident(i)operator(].)ident(Alias)operator(,) ident(Full)operator(.)ident(Root)operator(\)) reserved(then) reserved(begin) + ident(Result) operator(:=) ident(Shortcuts)operator([)ident(i)operator(].)ident(Node)operator(;) + ident(Break)operator(;) reserved(end)operator(;) + reserved(end)operator(;) + +reserved(begin) + ident(keySA) operator(:=) reserved(nil)operator(;) + + comment(//Get FullPath of the Key) + ident(Key) operator(:=) ident(TrimLeft)operator(()ident(Key)operator(\);) + reserved(if) ident(TextAtPos)operator(()ident(Key)operator(,) integer(1)operator(,) string<delimiter(')content(Reg:)delimiter(')>operator(\)) reserved(then) + ident(Key) operator(:=) ident(TrimLeft)operator(()ident(FromChar)operator(()ident(Key)operator(,) char<delimiter(')content(:)delimiter(')>operator(\)\);) + ident(Key) operator(:=) ident(UnQuote)operator(()ident(Key)operator(\);) + + ident(Full) operator(:=) ident(RegPathOfStr)operator(()ident(Key)operator(\);) + reserved(if) ident(Trim)operator(()ident(Full)operator(.)ident(Root)operator(\)) operator(=) string<delimiter(')delimiter(')> reserved(then) reserved(begin) + ident(AddHint)operator(()string<delimiter(')content(Empty Path.)delimiter(')>operator(,) ident(True)operator(\);) + ident(Exit)operator(;) reserved(end)operator(;) + + comment(//Get Root Node) + ident(Node) operator(:=) ident(NodeOfRoot)operator(()ident(Full)operator(.)ident(Root)operator(\);) + reserved(if) reserved(not) ident(Assigned)operator(()ident(Node)operator(\)) reserved(then) reserved(begin) + reserved(if) reserved(not) ident(PathE)operator(.)ident(Focused) reserved(then) + ident(AddHint)operator(()string<delimiter(')content(Key not found:)delimiter(')> operator(+) ident(EOL) operator(+) ident(Key)operator(\);) + ident(Exit)operator(;) reserved(end)operator(;) + + comment(//Create an array of all SubKeys) + ident(keySA) operator(:=) ident(Split)operator(()ident(Full)operator(.)ident(Key)operator(,) char<delimiter(')content(\\)delimiter(')>operator(\);) + + comment(//Avoid SmartExpand) + ident(TreeWin)operator(.)ident(DoSmartExpand) operator(:=) ident(False)operator(;) reserved(begin) + + comment(//Open all SubKeys) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(High)operator(()ident(keySA)operator(\)) reserved(do) reserved(begin) + comment(//Open the Node if neccessary) + reserved(if) reserved(not) ident(Node)operator(.)ident(Expanded) reserved(then) reserved(begin) + reserved(if) reserved(not) ident(Node)operator(.)ident(Selected) reserved(then) + ident(RegTV)operator(.)ident(Selected) operator(:=) ident(Node)operator(;) + ident(CheckNode)operator(()ident(Node)operator(,) ident(False)operator(\);) + comment(//TreeWin.RegTVChange(Self, Node\);) + ident(Node)operator(.)ident(Expand)operator(()ident(False)operator(\);) + reserved(end)operator(;) + + comment(//Get Node of the SubKey) + ident(Node) operator(:=) ident(FindNodeText)operator(()ident(Node)operator(,) ident(keySA)operator([)ident(i)operator(]\);) + reserved(if) reserved(not) ident(Assigned)operator(()ident(Node)operator(\)) reserved(then) reserved(begin) + reserved(if) reserved(not) ident(PathE)operator(.)ident(Focused) reserved(then) + ident(AddHint)operator(()string<delimiter(')content(Goto Key not found: )delimiter(')> operator(+) ident(KeySA)operator([)ident(i)operator(],) ident(True)operator(\);) + ident(Exit)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + reserved(end)operator(;) ident(TreeWin)operator(.)ident(DoSmartExpand) operator(:=) ident(True)operator(;) + + reserved(if) ident(Node) operator(<>) ident(RegTV)operator(.)ident(Selected) reserved(then) reserved(begin) + ident(RegTV)operator(.)ident(Selected) operator(:=) ident(Node)operator(;) + ident(TreeWin)operator(.)ident(RegTVChange)operator(()ident(Self)operator(,) ident(Node)operator(\);) + reserved(end)operator(;) + + ident(Application)operator(.)ident(ProcessMessages)operator(;) + + reserved(if) ident(Full)operator(.)ident(ValueSet) reserved(then) + ident(ValuesWin)operator(.)ident(FocusItem)operator(()ident(Full)operator(.)ident(Value)operator(,) reserved(not) operator(()ident(Active) reserved(and) ident(PathE)operator(.)ident(Focused)operator(\)\)) + reserved(else) reserved(begin) + reserved(if) reserved(not) operator(()ident(Active) reserved(and) ident(PathE)operator(.)ident(Focused)operator(\)) reserved(then) comment(//if not user is currently editing the path) + ident(TreeWin)operator(.)ident(FocusControl)operator(()ident(RegTV)operator(\);) + + reserved(if) ident(LastChar)operator(()ident(Full)operator(.)ident(Key)operator(\)) operator(=) char<delimiter(')content(\\)delimiter(')> reserved(then) + ident(Node)operator(.)ident(Expand)operator(()ident(False)operator(\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(SwapFonts)operator(()ident(Sender)operator(:) ident(TWinControl)operator(\);) + + reserved(function) ident(OtherFont)operator(()ident(N)operator(:) ident(TFontName)operator(\):) ident(TFontName)operator(;) + reserved(begin) + ident(Result) operator(:=) string<delimiter(')content(Courier New)delimiter(')>operator(;) + reserved(if) ident(N) operator(=) ident(Result) reserved(then) + ident(Result) operator(:=) string<delimiter(')content(Arial)delimiter(')>operator(;) + reserved(end)operator(;) + +reserved(begin) + ident(TEdit)operator(()ident(Sender)operator(\).)ident(Font)operator(.)ident(Name) operator(:=) ident(OtherFont)operator(()ident(TTreeView)operator(()ident(Sender)operator(\).)ident(Font)operator(.)ident(Name)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(ActivateThis)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) reserved(not) ident(Assigned)operator(()ident(Sender)operator(\)) reserved(then) + ident(Exit)operator(;) + + reserved(with) ident(TEdit)operator(()ident(Sender)operator(\)) reserved(do) reserved(begin) + reserved(if) ident(Tag) operator(<>) ident(EditControlFlag) reserved(then) + ident(Exit)operator(;) + ident(Color) operator(:=) ident(RealColor)operator(()ident(clVeryBrightBlue)operator(\);) + ident(Font)operator(.)ident(Color) operator(:=) ident(clBlack)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(DeActivateThis)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) reserved(not) ident(Assigned)operator(()ident(Sender)operator(\)) reserved(then) + ident(Exit)operator(;) + + reserved(with) ident(TEdit)operator(()ident(Sender)operator(\)) reserved(do) reserved(begin) + reserved(if) ident(Tag) operator(<>) ident(EditControlFlag) reserved(then) + ident(Exit)operator(;) + ident(Color) operator(:=) ident(RealColor)operator(()ident(clDarkGray)operator(\);) + ident(Font)operator(.)ident(Color) operator(:=) ident(clWhite)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(CreateSisyThreads)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) + + reserved(procedure) ident(CreateSisyThread)operator(()reserved(const) ident(Name)operator(:) reserved(string)operator(;) reserved(const) ident(KeyName)operator(:) reserved(string)operator(;) + ident(Key)operator(:) ident(HKEY)operator(;) ident(StatusLabel)operator(:) ident(TLabel)operator(\);) + reserved(var) + ident(Sisy)operator(:) ident(TSisyThread)operator(;) + reserved(begin) + ident(ChangeLastHint)operator(()string<delimiter(')content(Creating )delimiter(')> operator(+) ident(Name) operator(+) string<delimiter(')content(...)delimiter(')>operator(\);) + ident(Sisy) operator(:=) ident(TSisyThread)operator(.)ident(CreateIt)operator(()ident(Name)operator(,) ident(KeyName)operator(,) ident(Key)operator(,) ident(StatusLabel)operator(,) ident(PlutoKey)operator(\);) + ident(Sisy)operator(.)ident(OnChange) operator(:=) ident(MainWin)operator(.)ident(OnSisyChange)operator(;) +comment(// Sisy.OnSpecialChange[cValuePlus] := MainWin.OnSisyValuePlus;) +comment(// Sisy.OnSpecialChange[cValueMinus] := MainWin.OnSisyValueMinus;) +comment(// Sisy.OnSpecialChange[cContextChange] := MainWin.OnSisyContextChange;) + ident(Sisys)operator(.)ident(Add)operator(()ident(Sisy)operator(\);) + ident(AddToLastHint)operator(()string<delimiter(')content(OK)delimiter(')>operator(\);) + reserved(end)operator(;) + +reserved(begin) + ident(AddHint)operator(()string<delimiter(')content(Starting Sisyphus )delimiter(')> operator(+) ident(SisyVersion) operator(+) string<delimiter(')content(...)delimiter(')>operator(\);) + + ident(Sisys) operator(:=) ident(TSisyList)operator(.)ident(Create)operator(;) + ident(WorkWin)operator(.)ident(LoadSisyFilter)operator(;) + + ident(CreateSisyThread)operator(()string<delimiter(')content(Sisy HKU)delimiter(')>operator(,) string<delimiter(')content(HKU)delimiter(')>operator(,) ident(HKU)operator(,) ident(WorkWin)operator(.)ident(SisyHKUL)operator(\);) + ident(CreateSisyThread)operator(()string<delimiter(')content(Sisy HKLM)delimiter(')>operator(,) string<delimiter(')content(HKLM)delimiter(')>operator(,) ident(HKLM)operator(,) ident(WorkWin)operator(.)ident(SisyHKLML)operator(\);) + + ident(ChangeLastHint)operator(()string<delimiter(')content(Initializing Sisyphus...)delimiter(')>operator(\);) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(Sisys)operator(.)ident(Count)operator(-)integer(1) reserved(do) + reserved(with) ident(TSisyThread)operator(()ident(Sisys)operator([)ident(i)operator(]\)) reserved(do) reserved(begin) + reserved(if) ident(Name) operator(=) string<delimiter(')content(Sisy HKU)delimiter(')> reserved(then) + reserved(with) ident(WorkWin)operator(.)ident(SisyHKUCB) reserved(do) reserved(begin) + ident(Settings)operator(.)ident(KeyName) operator(:=) ident(StrOfUni)operator(()ident(Uni)operator(.)ident(Path)operator(\);) + ident(Settings)operator(.)ident(Load)operator(;) + ident(Settings)operator(.)ident(AutoSave) operator(:=) ident(True)operator(;) + reserved(if) ident(Checked) reserved(then) + ident(Resume)operator(;) + reserved(end) + reserved(else) reserved(if) ident(Name) operator(=) string<delimiter(')content(Sisy HKLM)delimiter(')> reserved(then) + reserved(with) ident(WorkWin)operator(.)ident(SisyHKLMCB) reserved(do) reserved(begin) + ident(Settings)operator(.)ident(KeyName) operator(:=) ident(StrOfUni)operator(()ident(Uni)operator(.)ident(Path)operator(\);) + ident(Settings)operator(.)ident(Load)operator(;) + ident(Settings)operator(.)ident(AutoSave) operator(:=) ident(True)operator(;) + reserved(if) ident(Checked) reserved(then) + ident(Resume)operator(;) + reserved(end)operator(;) + ident(OnStarted) operator(:=) ident(MainWin)operator(.)ident(SisyStarted)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(CreateSpyThread)operator(;) +reserved(begin) + ident(AddHint)operator(()string<delimiter(')content(Creating SpyThread...)delimiter(')>operator(\);) + ident(SpyThread) operator(:=) ident(TRegSpyThread)operator(.)ident(CreateIt)operator(()ident(tpLowest)operator(\);) + ident(WorkWin)operator(.)ident(SpyDelayIEChange)operator(()ident(MainWin)operator(\);) + ident(WorkWin)operator(.)ident(SpyTestLClick)operator(()ident(MainWin)operator(\);) + ident(AddToLastHint)operator(()string<delimiter(')content(OK)delimiter(')>operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(ShowParams)operator(;) +reserved(var) + ident(SL)operator(:) ident(TStringList)operator(;) +reserved(begin) + reserved(if) ident(Switch)operator(()string<delimiter(')content(params?)delimiter(')>operator(\)) reserved(then) reserved(begin) + ident(SL) operator(:=) ident(TStringList)operator(.)ident(Create)operator(;) + ident(GetParams)operator(()ident(SL)operator(\);) + ident(ShowMessage)operator(()ident(SL)operator(.)ident(Text)operator(\);) + ident(SL)operator(.)ident(Free)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(GotoParamKey)operator(;) +reserved(var) + ident(s)operator(:) reserved(string)operator(;) +reserved(begin) + ident(s) operator(:=) ident(ParamStr)operator(()integer(1)operator(\);) + reserved(if) operator(()ident(s) operator(<>) string<delimiter(')delimiter(')>operator(\)) + reserved(and) operator(()ident(s)operator([)integer(1)operator(]) operator(<>) char<delimiter(')content(-)delimiter(')>operator(\)) reserved(then) reserved(begin) comment(//Params have '-' as prefix) + ident(AddHint)operator(()string<delimiter(')content(Goto Key )delimiter(')> operator(+) ident(Quote)operator(()ident(s)operator(\)) operator(+) string<delimiter(')content(...)delimiter(')>operator(\);) + ident(MainWin)operator(.)ident(GotoKey)operator(()ident(s)operator(\);) + reserved(end) reserved(else) reserved(begin) + ident(RegTV)operator(.)ident(Selected) operator(:=) ident(RegTV)operator(.)ident(TopItem)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(Load)operator(;) +reserved(begin) + ident(TreeWin)operator(.)ident(Load)operator(;) + ident(WorkWin)operator(.)ident(LoadBoolStr)operator(;) + + ident(CreateSpyThread)operator(;) + ident(CreateSisyThreads)operator(;) + + ident(AddHint)operator(()ident(Greeting)operator(,) ident(True)operator(\);) + + ident(ShowParams)operator(;) + ident(GotoParamKey)operator(;) + + reserved(if) ident(Assigned)operator(()ident(SplashWin)operator(\)) reserved(and) ident(SplashWin)operator(.)ident(Visible) reserved(then) + ident(SplashWin)operator(.)ident(SetFocus)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(CopyPathClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(Clipboard)operator(.)ident(AsText) operator(:=) ident(StatusBar)operator(.)ident(Panels)operator([)integer(1)operator(].)ident(Text)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(FormKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) + ident(Shift)operator(:) ident(TShiftState)operator(\);) +reserved(begin) + reserved(if) operator(()ident(ssAlt) reserved(in) ident(shift)operator(\)) reserved(and) operator(()ident(Key) operator(=) ident(VK_F4)operator(\)) reserved(then) reserved(begin) + ident(Key) operator(:=) integer(0)operator(;) + ident(Close)operator(;) + ident(Exit)operator(;) reserved(end)operator(;) + + reserved(if) ident(ssCtrl) reserved(in) ident(Shift) reserved(then) + reserved(case) ident(Key) reserved(of) + ident(Byte)operator(()char<delimiter(')content(W)delimiter(')>operator(\):) reserved(begin) + ident(MainPC)operator(.)ident(ActivePage) operator(:=) ident(WorkWin)operator(.)ident(WorkPage)operator(;) + reserved(if) ident(Assigned)operator(()ident(MainPC)operator(.)ident(ActivePage)operator(\)) reserved(then) + ident(WorkWin)operator(.)ident(FocusControl)operator(()ident(TWinControl)operator(()ident(ShowPC)operator(.)ident(ActivePage)operator(.)ident(Tag)operator(\)\)) + reserved(end)operator(;) + + ident(Byte)operator(()char<delimiter(')content(H)delimiter(')>operator(\):) ident(MainPC)operator(.)ident(ActivePage) operator(:=) ident(WorkWin)operator(.)ident(HintPage)operator(;) + + ident(Byte)operator(()char<delimiter(')content(L)delimiter(')>operator(\):) ident(MainWin)operator(.)ident(FindCLSID)operator(;) + reserved(end)operator(;) + + reserved(if) ident(Shift) operator(=) operator([]) reserved(then) + reserved(case) ident(Key) reserved(of) + ident(VK_F6)operator(:) ident(TreeWin)operator(.)ident(FocusControl)operator(()ident(RegTV)operator(\);) + + ident(VK_F7)operator(:) reserved(with) ident(ValueList) reserved(do) reserved(begin) + ident(ValuesWin)operator(.)ident(FocusControl)operator(()ident(ValueList)operator(\);) + reserved(if) operator(()ident(Selected) operator(=) reserved(nil)operator(\)) reserved(and) operator(()ident(Items)operator(.)ident(Count) operator(>) integer(0)operator(\)) reserved(then) reserved(begin) + ident(Selected) operator(:=) ident(Items)operator([)integer(0)operator(];) + ident(ItemFocused) operator(:=) ident(Selected)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + ident(VK_F8)operator(:) ident(WorkWin)operator(.)ident(FocusControl)operator(()ident(MainPC)operator(\);) + reserved(end)operator(;) + + reserved(if) ident(Key) operator(=) ident(VK_SCROLL) reserved(then) reserved(begin) + ident(TreeWin)operator(.)ident(CheckRegTVHotTrack)operator(;) + ident(ValuesWin)operator(.)ident(CheckValueListHotTrack)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(StatusBarResize)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(with) ident(StatusBar) reserved(do) + ident(Panels)operator([)integer(1)operator(].)ident(Width) operator(:=) + ident(Width) operator(-) operator(()ident(Panels)operator([)integer(0)operator(].)ident(Width) operator(+) ident(Panels)operator([)integer(2)operator(].)ident(Width) operator(+) ident(Panels)operator([)integer(3)operator(].)ident(Width)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(StatusBarDblClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ShowRealPathMIClick)operator(()ident(Sender)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(InsertPathClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(GotoKey)operator(()ident(Clipboard)operator(.)ident(AsText)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(SetStatus)operator(;) +reserved(begin) + ident(StatusBarUpdate)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(StatusBarUpdate)operator(;) +reserved(var) + ident(Inf)operator(:) ident(TRegKeyInfo)operator(;) +reserved(begin) + ident(OpenCurKey)operator(;) + ident(MainReg)operator(.)ident(GetKeyInfo)operator(()ident(Inf)operator(\);) + ident(MainReg)operator(.)ident(CloseKey)operator(;) + + ident(StatusBar)operator(.)ident(Panels)operator([)integer(2)operator(].)ident(Text) operator(:=) ident(StrNumerus)operator(()ident(Inf)operator(.)ident(NumSubKeys)operator(,) string<delimiter(')content(key)delimiter(')>operator(,) string<delimiter(')content(keys)delimiter(')>operator(,) string<delimiter(')content(no)delimiter(')>operator(\);) + ident(StatusBar)operator(.)ident(Panels)operator([)integer(3)operator(].)ident(Text) operator(:=) ident(StrNumerus)operator(()ident(Inf)operator(.)ident(NumValues)operator(,) string<delimiter(')content(value)delimiter(')>operator(,) string<delimiter(')content(values)delimiter(')>operator(,) string<delimiter(')content(no)delimiter(')>operator(\);) + + reserved(if) ident(ShowRealPathMI)operator(.)ident(Checked) reserved(then) + ident(StatusBar)operator(.)ident(Panels)operator([)integer(1)operator(].)ident(Text) operator(:=) ident(StrOfRegPath)operator(()ident(CurKey)operator(()ident(uhShortcuts)operator(\)\)) + reserved(else) + ident(StatusBar)operator(.)ident(Panels)operator([)integer(1)operator(].)ident(Text) operator(:=) ident(StrOfRegPath)operator(()ident(CurKey)operator(()ident(uhNonSystemShortcuts)operator(\)\);) + + reserved(if) reserved(not) ident(PathE)operator(.)ident(Focused) reserved(then) + ident(PathE)operator(.)ident(Text) operator(:=) ident(StrOfRegPath)operator(()ident(CurKey)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(ShowRealPathMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ShowRealPathMI)operator(.)ident(Checked) operator(:=) reserved(not) ident(ShowRealPathMI)operator(.)ident(Checked)operator(;) + ident(StatusBarUpdate)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(PathEKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) + ident(Shift)operator(:) ident(TShiftState)operator(\);) +reserved(var) + ident(Pos)operator(:) ident(Integer)operator(;) + ident(s)operator(:) reserved(string)operator(;) +reserved(begin) + ident(DoAutoComplete) operator(:=) reserved(not) operator(()ident(Key) reserved(in) operator([)ident(VK_DELETE)operator(,) ident(VK_BACK)operator(,) ident(VK_ESCAPE)operator(]\);) + + reserved(case) ident(Key) reserved(of) + ident(VK_BACK)operator(:) + reserved(begin) + ident(s) operator(:=) ident(PathE)operator(.)ident(Text)operator(;) + ident(Pos) operator(:=) ident(PathE)operator(.)ident(SelStart)operator(;) + + reserved(if) ident(ssCtrl) reserved(in) ident(Shift) reserved(then) + reserved(repeat) + ident(Dec)operator(()ident(Pos)operator(\);) + reserved(until) operator(()ident(Pos) operator(<) integer(1)operator(\)) reserved(or) operator(()ident(s)operator([)ident(Pos)operator(]) operator(=) char<delimiter(')content(\\)delimiter(')>operator(\)) + reserved(else) reserved(if) ident(PathE)operator(.)ident(SelLength) operator(=) integer(0) reserved(then) + ident(Exit)operator(;) + + ident(PathE)operator(.)ident(Text) operator(:=) ident(Copy)operator(()ident(s)operator(,) integer(1)operator(,) ident(Pos)operator(\);) + ident(PathE)operator(.)ident(SelStart) operator(:=) ident(Length)operator(()ident(s)operator(\);) + ident(Key) operator(:=) integer(0)operator(;) + ident(UserGotoKey)operator(;) + reserved(end)operator(;) + + ident(VK_ESCAPE)operator(:) + reserved(with) ident(PathE) reserved(do) reserved(begin) + reserved(if) ident(SelLength) operator(=) integer(0) reserved(then) + ident(Exit)operator(;) + ident(Text) operator(:=) ident(StrOfRegPath)operator(()ident(CurKey)operator(\);) + ident(SelStart) operator(:=) ident(Length)operator(()ident(Text)operator(\);) + reserved(end)operator(;) + + ident(VK_RETURN)operator(:) reserved(begin) + reserved(if) ident(CurKey)operator(.)ident(ValueSet) reserved(then) + ident(ValuesWin)operator(.)ident(ValueListDblClick)operator(()ident(Self)operator(\);) + ident(Key) operator(:=) integer(0)operator(;) + reserved(end)operator(;) + + ident(VK_RIGHT)operator(:) reserved(begin) + reserved(if) reserved(not) operator(()ident(ssCtrl) reserved(in) ident(Shift)operator(\)) reserved(then) + ident(Exit)operator(;) + + ident(Key) operator(:=) integer(0)operator(;) + + ident(s) operator(:=) ident(PathE)operator(.)ident(Text)operator(;) + ident(Pos) operator(:=) ident(PathE)operator(.)ident(SelStart) operator(+) integer(1)operator(;) + reserved(repeat) + ident(Inc)operator(()ident(Pos)operator(\);) + reserved(until) operator(()ident(Pos) operator(>) ident(Length)operator(()ident(s)operator(\)\)) reserved(or) operator(()ident(s)operator([)ident(Pos)operator(]) operator(=) char<delimiter(')content(\\)delimiter(')>operator(\);) + + ident(PathE)operator(.)ident(SelStart) operator(:=) ident(Pos) operator(-) integer(1)operator(;) + reserved(end)operator(;) + + ident(VK_LEFT)operator(:) reserved(begin) + reserved(if) reserved(not) operator(()ident(ssCtrl) reserved(in) ident(Shift)operator(\)) reserved(then) + ident(Exit)operator(;) + + reserved(with) ident(PathE) reserved(do) reserved(begin) + ident(Key) operator(:=) integer(0)operator(;) + + ident(s) operator(:=) ident(Text)operator(;) + ident(Pos) operator(:=) ident(SelStart)operator(;) + reserved(repeat) + ident(Dec)operator(()ident(Pos)operator(\);) + reserved(until) operator(()ident(Pos) operator(<) integer(1)operator(\)) reserved(or) operator(()ident(s)operator([)ident(Pos)operator(]) operator(=) char<delimiter(')content(\\)delimiter(')>operator(\);) + + reserved(if) ident(Pos) operator(<) integer(1) reserved(then) + ident(Pos) operator(:=) integer(1)operator(;) + + ident(SelStart) operator(:=) ident(Pos) operator(-) integer(1)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(UserGotoKey)operator(;) +reserved(begin) + ident(GotoKey)operator(()ident(PathE)operator(.)ident(Text)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(PathEChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(Prefix)operator(,) ident(Suffix)operator(,) ident(Key)operator(,) ident(Path)operator(,) ident(Root)operator(:) reserved(string)operator(;) + ident(i)operator(,) ident(p)operator(,) ident(Len)operator(:) ident(Integer)operator(;) + ident(SL)operator(:) ident(TStringList)operator(;) + ident(CompleteKind)operator(:) operator(()ident(ckRoots)operator(,) ident(ckKeys)operator(,) ident(ckValues)operator(\);) + + reserved(procedure) ident(GetRootNames)operator(()ident(Strings)operator(:) ident(TStrings)operator(\);) + reserved(var) + ident(Node)operator(:) ident(TTreeNode)operator(;) + reserved(begin) + ident(SL)operator(.)ident(Clear)operator(;) + ident(Node) operator(:=) ident(RegTV)operator(.)ident(Items)operator(.)ident(GetFirstNode)operator(;) + reserved(while) ident(Assigned)operator(()ident(Node)operator(\)) reserved(do) reserved(begin) + ident(SL)operator(.)ident(Add)operator(()ident(Node)operator(.)ident(Text)operator(\);) + ident(Node) operator(:=) ident(Node)operator(.)ident(GetNextSibling)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + +reserved(begin) + reserved(if) reserved(not) ident(DoAutoComplete) reserved(then) + ident(Exit)operator(;) + + ident(Key) operator(:=) ident(PathE)operator(.)ident(Text)operator(;) + ident(Root) operator(:=) ident(TraceKey)operator(()ident(ExRegRoot)operator(()ident(Key)operator(\)\);) + + reserved(if) reserved(not) ident(CharIn)operator(()ident(Key)operator(,) char<delimiter(')content(\\)delimiter(')>operator(\)) reserved(then) + ident(CompleteKind) operator(:=) ident(ckRoots) + reserved(else) reserved(if) ident(ExRegValueSet)operator(()ident(Key)operator(\)) reserved(then) + ident(CompleteKind) operator(:=) ident(ckValues) + reserved(else) + ident(CompleteKind) operator(:=) ident(ckKeys)operator(;) + + reserved(case) ident(CompleteKind) reserved(of) + ident(ckRoots)operator(:) reserved(begin) + ident(Prefix) operator(:=) string<delimiter(')delimiter(')>operator(;) + ident(Suffix) operator(:=) ident(Key)operator(;) + reserved(end)operator(;) + + ident(ckKeys)operator(:) reserved(begin) + ident(Path) operator(:=) ident(ExRegFullKey)operator(()ident(Key)operator(\);) + ident(Prefix) operator(:=) ident(UntilLastChar)operator(()ident(Path)operator(,) char<delimiter(')content(\\)delimiter(')>operator(\);) + ident(Suffix) operator(:=) ident(FromLastChar)operator(()ident(Path)operator(,) char<delimiter(')content(\\)delimiter(')>operator(\);) + reserved(end)operator(;) + + ident(ckValues)operator(:) reserved(begin) + ident(p) operator(:=) ident(Pos)operator(()string<delimiter(')content(\\\\)delimiter(')>operator(,) ident(Key)operator(\);) + ident(Prefix) operator(:=) ident(Copy)operator(()ident(Key)operator(,) integer(1)operator(,) ident(p) operator(-) integer(1)operator(\);) + ident(Suffix) operator(:=) ident(Copy)operator(()ident(Key)operator(,) ident(p) operator(+) integer(2)operator(,) ident(Length)operator(()ident(Key)operator(\)) operator(-) ident(p) operator(-) integer(1)operator(\);) + reserved(end)operator(;) + + reserved(else) + reserved(end)operator(;) + + ident(SL) operator(:=) ident(TStringList)operator(.)ident(Create)operator(;) + + reserved(if) ident(CompleteKind) reserved(in) operator([)ident(ckKeys)operator(,) ident(ckValues)operator(]) reserved(then) + reserved(with) ident(MainReg) reserved(do) reserved(begin) + ident(RootKey) operator(:=) ident(HKEYOfStr)operator(()ident(ExRegRoot)operator(()ident(Root)operator(\)\);) + ident(OpenKey)operator(()ident(ExRegKey)operator(()ident(Root)operator(\)\);) + ident(OpenKey)operator(()ident(ExRegKey)operator(()ident(Prefix)operator(\)\);) + + reserved(if) ident(CompleteKind) operator(=) ident(ckValues) reserved(then) reserved(begin) + reserved(if) reserved(not) ident(HasValues) reserved(then) + ident(Exit)operator(;) + ident(GetValueNames)operator(()ident(SL)operator(\);) + reserved(end) reserved(else) reserved(if) ident(CompleteKind) operator(=) ident(ckKeys) reserved(then) reserved(begin) + reserved(if) reserved(not) ident(HasSubKeys) reserved(then) + ident(Exit)operator(;) + ident(GetKeyNames)operator(()ident(SL)operator(\);) + reserved(end)operator(;) + + ident(CloseKey)operator(;) + reserved(end) + reserved(else) reserved(begin) + ident(GetRootNames)operator(()ident(SL)operator(\);) + reserved(end)operator(;) + + reserved(if) ident(Suffix) operator(=) string<delimiter(')delimiter(')> reserved(then) reserved(begin) + reserved(if) operator(()ident(SL)operator(.)ident(Count) operator(>) integer(0)operator(\)) reserved(and) reserved(not) ident(StrIn)operator(()ident(SL)operator(,) string<delimiter(')delimiter(')>operator(\)) reserved(then) + ident(Suffix) operator(:=) ident(SL)operator([)integer(0)operator(];) + reserved(end) reserved(else) reserved(begin) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(SL)operator(.)ident(Count)operator(-)integer(1) reserved(do) + reserved(if) ident(TextAtBegin)operator(()ident(SL)operator([)ident(i)operator(],) ident(Suffix)operator(\)) reserved(then) reserved(begin) + ident(Suffix) operator(:=) ident(SL)operator([)ident(i)operator(];) + ident(Break)operator(;) reserved(end)operator(;) + reserved(end)operator(;) + + ident(Len) operator(:=) ident(Length)operator(()ident(PathE)operator(.)ident(Text)operator(\);) + + reserved(if) ident(CompleteKind) operator(=) ident(ckValues) reserved(then) + ident(Prefix) operator(:=) ident(Prefix) operator(+) string<delimiter(')content(\\\\)delimiter(')> + reserved(else) reserved(if) ident(CompleteKind) operator(=) ident(ckKeys) reserved(then) + ident(Prefix) operator(:=) ident(Prefix) operator(+) char<delimiter(')content(\\)delimiter(')>operator(;) + + reserved(with) ident(PathE) reserved(do) reserved(begin) + ident(DoAutoComplete) operator(:=) ident(False)operator(;) comment(//Avoid Recursion) + ident(Text) operator(:=) ident(Prefix) operator(+) ident(Suffix)operator(;) + ident(DoAutoComplete) operator(:=) ident(True)operator(;) + + ident(SelStart) operator(:=) ident(Len)operator(;) + ident(SelLength) operator(:=) ident(Length)operator(()ident(Text)operator(\)) operator(-) ident(Len)operator(;) + reserved(end)operator(;) + + ident(SL)operator(.)ident(Free)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(PathEExit)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(DeActivateThis)operator(()ident(PathE)operator(\);) + ident(DoAutoComplete) operator(:=) ident(False)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(ArrangePlutoStyle)operator(;) +reserved(begin) + reserved(with) ident(ValuesWin) reserved(do) reserved(begin) + ident(Height) operator(:=) ident(MainWin)operator(.)ident(ClientHeight) reserved(div) integer(3)operator(;) + ident(Top) operator(:=) ident(MainWin)operator(.)ident(ClientHeight) operator(-) ident(Height) operator(-) integer(43)operator(;) + ident(Left) operator(:=) integer(0)operator(;) + ident(Width) operator(:=) ident(MainWin)operator(.)ident(ClientWidth) operator(-) integer(4)operator(;) + comment(//Align := alBottom;) + reserved(end)operator(;) + + reserved(with) ident(WorkWin) reserved(do) reserved(begin) + ident(Top) operator(:=) integer(0)operator(;) + ident(Width) operator(:=) ident(Max)operator(()ident(MainWin)operator(.)ident(ClientWidth) reserved(div) integer(3)operator(,) ident(WorkWin)operator(.)ident(Constraints)operator(.)ident(MinWidth)operator(\);) + ident(Left) operator(:=) ident(ValuesWin)operator(.)ident(Width) operator(-) ident(Width)operator(;) + ident(Height) operator(:=) ident(MainWin)operator(.)ident(ClientHeight) operator(-) integer(43) operator(-) ident(ValuesWin)operator(.)ident(Height)operator(;) + comment(//Align := alRight;) + reserved(end)operator(;) + + reserved(with) ident(TreeWin) reserved(do) reserved(begin) + ident(Top) operator(:=) integer(0)operator(;) + ident(Height) operator(:=) ident(WorkWin)operator(.)ident(Height)operator(;) + ident(Left) operator(:=) integer(0)operator(;) + ident(Width) operator(:=) ident(ValuesWin)operator(.)ident(Width) operator(-) ident(WorkWin)operator(.)ident(Width)operator(;) + reserved(end)operator(;) + + comment({TreeWin.Align := alNone; + WorkWin.Align := alNone; + ValuesWin.Align := alNone;}) +reserved(end)operator(;) + +reserved(procedure) ident(ArrangeFreeStyle)operator(;) +reserved(const) + ident(Space) operator(=) integer(10)operator(;) +reserved(begin) + reserved(with) ident(ValuesWin) reserved(do) reserved(begin) + ident(Height) operator(:=) ident(Screen)operator(.)ident(Height) reserved(div) integer(3)operator(;) + ident(Align) operator(:=) ident(alBottom)operator(;) + reserved(end)operator(;) + + reserved(with) ident(WorkWin) reserved(do) reserved(begin) + ident(Width) operator(:=) ident(Max)operator(()ident(Screen)operator(.)ident(WorkAreaWidth) reserved(div) integer(3)operator(,) ident(Constraints)operator(.)ident(MinWidth) operator(+) integer(2) operator(*) ident(Space)operator(\);) + ident(Align) operator(:=) ident(alRight)operator(;) + reserved(end)operator(;) + + reserved(with) ident(TreeWin) reserved(do) reserved(begin) + ident(Align) operator(:=) ident(alClient)operator(;) + reserved(end)operator(;) + + ident(TreeWin)operator(.)ident(Align) operator(:=) ident(alNone)operator(;) + ident(WorkWin)operator(.)ident(Align) operator(:=) ident(alNone)operator(;) + ident(ValuesWin)operator(.)ident(Align) operator(:=) ident(alNone)operator(;) + + reserved(with) ident(ValuesWin) reserved(do) reserved(begin) + ident(Height) operator(:=) ident(Height) operator(-) integer(2) operator(*) ident(Space)operator(;) + ident(Width) operator(:=) ident(Width) operator(-) integer(2) operator(*) ident(Space)operator(;) + ident(Top) operator(:=) ident(Top) operator(+) ident(Space)operator(;) + ident(Left) operator(:=) ident(Left) operator(+) ident(Space)operator(;) + reserved(end)operator(;) + + reserved(with) ident(TreeWin) reserved(do) reserved(begin) + ident(Height) operator(:=) ident(Height) operator(-) integer(1) operator(*) ident(Space)operator(;) + ident(Width) operator(:=) ident(Width) operator(-) integer(1) operator(*) ident(Space)operator(;) + ident(Top) operator(:=) ident(Top) operator(+) ident(Space)operator(;) + ident(Left) operator(:=) ident(Left) operator(+) ident(Space)operator(;) + reserved(end)operator(;) + + reserved(with) ident(WorkWin) reserved(do) reserved(begin) + ident(Height) operator(:=) ident(Height) operator(-) integer(1) operator(*) ident(Space)operator(;) + ident(Width) operator(:=) ident(Width) operator(-) integer(2) operator(*) ident(Space)operator(;) + ident(Top) operator(:=) ident(Top) operator(+) ident(Space)operator(;) + ident(Left) operator(:=) ident(Left) operator(+) ident(Space)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(ArrangeBigValStyle)operator(;) +reserved(var) + ident(MinHeight)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(MinHeight) operator(:=) ident(WorkWin)operator(.)ident(Constraints)operator(.)ident(MinHeight) operator(+) + ident(MainWin)operator(.)ident(Constraints)operator(.)ident(MinHeight)operator(;) + + reserved(with) ident(ValuesWin) reserved(do) reserved(begin) + ident(Height) operator(:=) ident(Screen)operator(.)ident(WorkAreaHeight) operator(-) ident(Max)operator(()ident(Screen)operator(.)ident(Height) reserved(div) integer(3)operator(,) ident(MinHeight)operator(\);) + ident(Align) operator(:=) ident(alBottom)operator(;) + reserved(end)operator(;) + + reserved(with) ident(WorkWin) reserved(do) reserved(begin) + ident(Width) operator(:=) ident(Screen)operator(.)ident(WorkAreaWidth) reserved(div) integer(3)operator(;) + ident(Align) operator(:=) ident(alRight)operator(;) + reserved(end)operator(;) + + reserved(with) ident(TreeWin) reserved(do) reserved(begin) + ident(Align) operator(:=) ident(alClient)operator(;) + reserved(end)operator(;) + + ident(TreeWin)operator(.)ident(Align) operator(:=) ident(alNone)operator(;) + ident(WorkWin)operator(.)ident(Align) operator(:=) ident(alNone)operator(;) + ident(ValuesWin)operator(.)ident(Align) operator(:=) ident(alNone)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(ArrangeRegEdStyle)operator(;) +reserved(begin) + reserved(with) ident(TreeWin) reserved(do) reserved(begin) + ident(Width) operator(:=) ident(Screen)operator(.)ident(WorkAreaWidth) reserved(div) integer(4)operator(;) + ident(Align) operator(:=) ident(alLeft)operator(;) + reserved(end)operator(;) + + reserved(with) ident(ValuesWin) reserved(do) reserved(begin) + ident(Align) operator(:=) ident(alClient)operator(;) + ident(Align) operator(:=) ident(alNone)operator(;) + ident(Height) operator(:=) ident(Height) operator(-) ident(WorkWin)operator(.)ident(Constraints)operator(.)ident(MinHeight)operator(;) + reserved(end)operator(;) + + reserved(with) ident(WorkWin) reserved(do) reserved(begin) + ident(Top) operator(:=) ident(ValuesWin)operator(.)ident(Top) operator(+) ident(ValuesWin)operator(.)ident(Height)operator(;) + ident(Left) operator(:=) ident(ValuesWin)operator(.)ident(Left)operator(;) + ident(Height) operator(:=) ident(Constraints)operator(.)ident(MinHeight)operator(;) + ident(Width) operator(:=) ident(ValuesWin)operator(.)ident(Width)operator(;) + reserved(end)operator(;) + + ident(TreeWin)operator(.)ident(Align) operator(:=) ident(alNone)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(PathEKeyUp)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) + ident(Shift)operator(:) ident(TShiftState)operator(\);) +reserved(begin) + reserved(if) reserved(not) operator(()ident(Key) reserved(in) operator([)ident(VK_DELETE)operator(,) ident(VK_BACK)operator(,) ident(VK_ESCAPE)operator(]\)) reserved(then) + ident(UserGotoKey)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(ActivateIt)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ActivateThis)operator(()ident(Sender)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(FormActivate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) ident(Assigned)operator(()ident(ActiveControl)operator(\)) reserved(and) operator(()ident(ActiveControl)operator(.)ident(Tag) operator(=) ident(EditControlFlag)operator(\)) reserved(then) + ident(ActivateThis)operator(()ident(ActiveControl)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(FormDeactivate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) ident(Assigned)operator(()ident(ActiveControl)operator(\)) reserved(and) operator(()ident(ActiveControl)operator(.)ident(Tag) operator(=) ident(EditControlFlag)operator(\)) reserved(then) + ident(DeActivateThis)operator(()ident(ActiveControl)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(Pluto1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ArrangePlutoStyle)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(RegEdit1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ArrangeRegEdStyle)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(Free1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ArrangeFreeStyle)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(BigVal1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ArrangeBigValStyle)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(SplashScreen1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(SplashWin)operator(.)ident(Show)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(HistoryClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(NotePad)operator(()ident(PlutoDir) operator(+) string<delimiter(')content(version.txt)delimiter(')>operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(WebLinkMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(Browse)operator(()string<delimiter(')content(http://)delimiter(')> operator(+) ident(TMenuItem)operator(()ident(Sender)operator(\).)ident(Caption)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(SupportMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(Browse)operator(()string<delimiter(')content(http://cYcnus.de/php/phpbb/viewforum.php?f=1)delimiter(')>operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(Credits1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(FileName)operator(:) reserved(string)operator(;) +reserved(begin) + ident(FileName) operator(:=) ident(PlutoDir) operator(+) string<delimiter(')content(credits deluxe.htm)delimiter(')>operator(;) + reserved(if) ident(FileExists)operator(()ident(FileName)operator(\)) reserved(then) + ident(ExecFile)operator(()ident(FileName)operator(\)) + reserved(else) reserved(begin) + ident(FileName) operator(:=) ident(PlutoDir) operator(+) string<delimiter(')content(credits.htm)delimiter(')>operator(;) + reserved(if) ident(FileExists)operator(()ident(FileName)operator(\)) reserved(then) + ident(ExecFile)operator(()ident(FileName)operator(\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(function) ident(GetCLSIDFromClipboard)operator(:) reserved(string)operator(;) +reserved(var) + ident(CLSID)operator(:) reserved(string)operator(;) +reserved(begin) + ident(CLSID) operator(:=) ident(BetweenChars)operator(()ident(Clipboard)operator(.)ident(AsText)operator(,) char<delimiter(')content({)delimiter(')>operator(,) char<delimiter(')content(})delimiter(')>operator(,) ident(True)operator(\);) + reserved(if) ident(CLSID) operator(=) string<delimiter(')delimiter(')> reserved(then) reserved(begin) + ident(Result) operator(:=) ident(Clipboard)operator(.)ident(AsText)operator(;) + ident(InputQuery)operator(()string<delimiter(')content(No CLSID in Clipboard.)delimiter(')>operator(,) + string<delimiter(')content(Use following format:)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content({00000000-0000-0000-0000-000000000000})delimiter(')>operator(,) ident(Result)operator(\);) + ident(Exit)operator(;) reserved(end) reserved(else) + ident(Result) operator(:=) ident(CLSID)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(FindCLSID)operator(;) +reserved(var) + ident(CLSID)operator(,) ident(Desc)operator(:) reserved(string)operator(;) +reserved(begin) + ident(CLSID) operator(:=) ident(GetCLSIDFromClipboard)operator(;) + ident(Desc) operator(:=) ident(RegNameOfCLSID)operator(()ident(CLSID)operator(\);) + reserved(if) ident(Desc) operator(<>) string<delimiter(')delimiter(')> reserved(then) + ident(InputQuery)operator(()string<delimiter(')content(Your CLSID is...)delimiter(')>operator(,) ident(CLSID)operator(,) ident(Desc)operator(\)) + reserved(else) + ident(ShowMessage)operator(()string<delimiter(')content(CLSID not found: )delimiter(')> operator(+) ident(CLSID) operator(+) char<delimiter(')content(.)delimiter(')>operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(GotoCLSID)operator(;) +reserved(var) + ident(CLSID)operator(,) ident(Desc)operator(:) reserved(string)operator(;) +reserved(begin) + ident(CLSID) operator(:=) ident(GetCLSIDFromClipboard)operator(;) + ident(Desc) operator(:=) ident(RegNameOfCLSID)operator(()ident(CLSID)operator(\);) + reserved(if) ident(Desc) operator(<>) string<delimiter(')delimiter(')> reserved(then) reserved(begin) + ident(GotoKey)operator(()string<delimiter(')content(HKCR\\CLSID\\)delimiter(')> operator(+) ident(CLSID)operator(\);) + ident(TreeWin)operator(.)ident(FocusControl)operator(()ident(RegTV)operator(\);) + reserved(end) reserved(else) + ident(ShowMessage)operator(()string<delimiter(')content(CLSID not found: )delimiter(')> operator(+) ident(CLSID) operator(+) char<delimiter(')content(.)delimiter(')>operator(\);) +reserved(end)operator(;) + +reserved(function) ident(TMainWin)operator(.)ident(Greeting)operator(()ident(Name)operator(:) reserved(string) operator(=) ident(NoPreBlinkHint)operator(\):) reserved(string)operator(;) +reserved(const) + ident(Alias)operator(:) reserved(array)operator([)integer(0)operator(..)integer(4)operator(]) reserved(of) reserved(string) operator(=) + operator(()string<delimiter(')content(Licenser)delimiter(')>operator(,) string<delimiter(')content(Murphy)delimiter(')>operator(,) string<delimiter(')content(Sleeper)delimiter(')>operator(,) string<delimiter(')content(Leon)delimiter(')>operator(,) string<delimiter(')content(Great Admin)delimiter(')>operator(\);) + ident(RealNames)operator(:) reserved(array)operator([)integer(0)operator(..)integer(4)operator(]) reserved(of) reserved(string) operator(=) + operator(()string<delimiter(')content(Heinz)delimiter(')>operator(,) string<delimiter(')content(Korny)delimiter(')>operator(,) string<delimiter(')content(Sven)delimiter(')>operator(,) string<delimiter(')content(Simon)delimiter(')>operator(,) string<delimiter(')content(Korny ;-\))delimiter(')>operator(\);) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) + ident(s)operator(:) reserved(string)operator(;) +reserved(begin) + reserved(if) ident(Name) operator(=) ident(NoPreBlinkHint) reserved(then) + ident(Name) operator(:=) ident(PrefWin)operator(.)ident(UserNameE)operator(.)ident(Text)operator(;) + + reserved(if) ident(Trim)operator(()ident(Name)operator(\)) operator(=) string<delimiter(')delimiter(')> reserved(then) + ident(s) operator(:=) string<delimiter(')content(No name?)delimiter(')> + reserved(else) reserved(if) ident(SameText)operator(()ident(Trim)operator(()ident(Name)operator(\),) string<delimiter(')content(Pluto-User)delimiter(')>operator(\)) reserved(then) + ident(s) operator(:=) string<delimiter(')content(Hi!)delimiter(')> + reserved(else) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) integer(4) reserved(do) + reserved(if) ident(SameText)operator(()ident(Name)operator(,) ident(Alias)operator([)ident(i)operator(]\)) reserved(then) reserved(begin) + ident(s) operator(:=) string<delimiter(')content(Hi )delimiter(')> operator(+) ident(RealNames)operator([)ident(i)operator(]) operator(+) string<delimiter(')content(! This is a cYcnus.EasterEgg)delimiter(')>operator(;) + ident(Break)operator(;) reserved(end) + reserved(else) reserved(if) ident(Length)operator(()ident(Name)operator(\)) operator(>) integer(20) reserved(then) + ident(s) operator(:=) string<delimiter(')content(Hi )delimiter(')> operator(+) ident(Name) operator(+) + string<delimiter(')content(. What a name.)delimiter(')> + reserved(else) + ident(s) operator(:=) string<delimiter(')content(Hi )delimiter(')> operator(+) ident(Name) operator(+) char<delimiter(')content(!)delimiter(')>operator(;) + + ident(Result) operator(:=) ident(s)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(PrefMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(PrefWin)operator(.)ident(Show)operator(;) +reserved(end)operator(;) + +reserved(function) ident(TempDir)operator(:) reserved(string)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(PlutoDir) operator(+) string<delimiter(')content(temp\\)delimiter(')>operator(;) + reserved(if) reserved(not) operator(()ident(DirectoryExists)operator(()ident(Result)operator(\)) reserved(or) ident(CreateDir)operator(()ident(Result)operator(\)\)) reserved(then) + ident(Result) operator(:=) ident(PlutoDir)operator(;) +reserved(end)operator(;) + +reserved(function) ident(PlutoIniFileName)operator(:) reserved(string)operator(;) + + reserved(function) ident(Default)operator(:) reserved(string)operator(;) + reserved(begin) + ident(Result) operator(:=) ident(MyDir) operator(+) string<delimiter(')content(pluto.ini)delimiter(')>operator(;) + reserved(end)operator(;) + +reserved(begin) + ident(Result) operator(:=) ident(SavedPlutoIniFileName)operator(;) + reserved(if) ident(Result) operator(<>) string<delimiter(')delimiter(')> reserved(then) + ident(Exit)operator(;) + +comment(// Result := Params.ReadString('ini', ''\);) + + reserved(if) ident(IsValidFileName)operator(()ident(Result)operator(\)) reserved(then) + ident(Result) operator(:=) ident(PlutoDir) operator(+) ident(Result) + reserved(else) + ident(Result) operator(:=) ident(Default)operator(;) + + ident(SavedPlutoIniFileName) operator(:=) ident(Result)operator(;) comment(//Faster in future calls) +reserved(end)operator(;) + +reserved(function) ident(PlutoUniPath)operator(:) reserved(string)operator(;) +reserved(begin) + comment(//Result := 'Reg: HKCU\\Software\\Pluto\\';) + ident(Result) operator(:=) string<delimiter(')content(Ini <)delimiter(')> operator(+) ident(PlutoIniFileName) operator(+) string<delimiter(')content(>:)delimiter(')>operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(EditBoolStrMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(NotePad)operator(()ident(PlutoDir) operator(+) ident(BoolStrFileName)operator(\);) + ident(ShowMessage)operator(()string<delimiter(')content(Click OK when you finished editing.)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content((Pluto will reload the Boolean Strings.\))delimiter(')>operator(\);) + ident(WorkWin)operator(.)ident(LoadBoolStr)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(SisyStarted)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +comment({var + NextSisyIndex: Integer; + NextSisy: TSisyThread; }) +reserved(begin) + comment({NextSisy := nil; + + with TSisyThread(Sender\) do begin + //AddHint(Format('%s started after %0.1f seconds', [Name, SecsPerRound]\), True\); + + with Sisys do begin + NextSisyIndex := IndexOf(Sender\) + 1; + if NextSisyIndex < Count then + NextSisy := Items[NextSisyIndex]; + end; + + if Assigned(NextSisy\) then + with NextSisy do + if not Started and Suspended then + Resume; + end; }) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(SisyTerminate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) ident(Assigned)operator(()ident(Sisys)operator(\)) reserved(then) + ident(Sisys)operator(.)ident(Delete)operator(()ident(Sisys)operator(.)ident(IndexOf)operator(()ident(Sender)operator(\)\);) + ident(AddHint)operator(()string<delimiter(')content(Sisyphus )delimiter(')> operator(+) ident(Quote)operator(()ident(TSisyThread)operator(()ident(Sender)operator(\).)ident(Name)operator(\)) operator(+) string<delimiter(')content( destroyed.)delimiter(')>operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(FormCloseQuery)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(CanClose)operator(:) ident(Boolean)operator(\);) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) + + reserved(procedure) ident(TerminateThread)operator(()ident(Thread)operator(:) ident(TThread)operator(;) ident(Name)operator(:) reserved(string)operator(\);) + reserved(const) + ident(ThreadTimeOut) operator(=) integer(3000)operator(;) + reserved(begin) + reserved(if) ident(Assigned)operator(()ident(Thread)operator(\)) reserved(then) + reserved(with) ident(Thread) reserved(do) reserved(begin) + ident(Priority) operator(:=) ident(tpNormal)operator(;) + ident(Terminate)operator(;) + reserved(while) ident(Suspended) reserved(do) ident(Resume)operator(;) comment(// ensure running) + reserved(if) integer(0) operator(<>) ident(WaitForSingleObject)operator(()ident(Handle)operator(,) ident(ThreadTimeOut)operator(\)) reserved(then) reserved(begin) + ident(ShowMessage)operator(()string<delimiter(')content(Timeout: Killing Thread: )delimiter(')> operator(+) ident(Name) operator(+) ident(EOL) operator(+) + string<delimiter(')content(This is a critical error and may cause memory leaks and crashes.)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(We recommend to reboot your system before you continue.)delimiter(')>operator(\);) + ident(Windows)operator(.)ident(TerminateThread)operator(()ident(Handle)operator(,) integer(0)operator(\);) + reserved(end) reserved(else) + ident(Thread)operator(.)ident(Free)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + +reserved(begin) + ident(CanClose) operator(:=) ident(False)operator(;) + + reserved(try) + ident(AddHint)operator(()string<delimiter(')content(Stopping SisyphusThreads...)delimiter(')>operator(\);) + reserved(if) ident(Assigned)operator(()ident(Sisys)operator(\)) reserved(then) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(Sisys)operator(.)ident(Count)operator(-)integer(1) reserved(do) + ident(TSisyThread)operator(()ident(Sisys)operator([)ident(i)operator(]\).)ident(Suspend)operator(;) + ident(AddToLastHint)operator(()string<delimiter(')content(OK)delimiter(')>operator(\);) + + ident(AddHint)operator(()string<delimiter(')content(Wait for SpyThread...)delimiter(')>operator(\);) + ident(TerminateThread)operator(()ident(SpyThread)operator(,) string<delimiter(')content(SpyThread)delimiter(')>operator(\);) + ident(AddToLastHint)operator(()string<delimiter(')content(OK)delimiter(')>operator(\);) + + ident(AddHint)operator(()string<delimiter(')content(Wait for SisyphusThreads...)delimiter(')>operator(\);) + reserved(if) ident(Assigned)operator(()ident(Sisys)operator(\)) reserved(then) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(Sisys)operator(.)ident(Count)operator(-)integer(1) reserved(do) reserved(begin) + ident(ChangeLastHint)operator(()string<delimiter(')content(Wait for SisyphusThreads...)delimiter(')> operator(+) ident(TSisyThread)operator(()ident(Sisys)operator([)ident(i)operator(]\).)ident(Name)operator(\);) + ident(TerminateThread)operator(()ident(TSisyThread)operator(()ident(Sisys)operator([)ident(i)operator(]\),) ident(TSisyThread)operator(()ident(Sisys)operator([)ident(i)operator(]\).)ident(Name)operator(\);) + reserved(end)operator(;) + ident(ChangeLastHint)operator(()string<delimiter(')content(Wait for SisyphusThreads...OK)delimiter(')>operator(\);) + reserved(except) + reserved(with) ident(WorkWin)operator(.)ident(HintLB)operator(.)ident(Items) reserved(do) + ident(ShowMessage)operator(()string<delimiter(')content(Error while trying to terminate threads.)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(Last Message:)delimiter(')> operator(+) ident(EOL) operator(+) + ident(Strings)operator([)ident(Count) operator(-) integer(1)operator(]\);) + ident(CanClose) operator(:=) ident(True)operator(;) + reserved(end)operator(;) + + ident(AddHint)operator(()string<delimiter(')content(Terminating successfull.)delimiter(')>operator(\);) + ident(CanClose) operator(:=) ident(True)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(FormClose)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Action)operator(:) ident(TCloseAction)operator(\);) + + reserved(procedure) ident(TryClose)operator(()ident(Win)operator(:) ident(TCustomForm)operator(\);) + reserved(begin) + reserved(if) ident(Assigned)operator(()ident(Win)operator(\)) reserved(and) ident(Win)operator(.)ident(Visible) reserved(then) + ident(Win)operator(.)ident(Close)operator(;) + reserved(end)operator(;) + +reserved(begin) + ident(MainReg)operator(.)ident(Free)operator(;) + + ident(Action) operator(:=) ident(caFree)operator(;) + + reserved(if) ident(DontSavePrefs) reserved(then) + ident(Exit)operator(;) + + ident(AddHint)operator(()string<delimiter(')content(Saving settings...)delimiter(')>operator(\);) + + reserved(try) + ident(TryClose)operator(()ident(WorkWin)operator(\);) + ident(TryClose)operator(()ident(ValuesWin)operator(\);) + ident(TryClose)operator(()ident(TreeWin)operator(\);) + ident(TryClose)operator(()ident(FindWin)operator(\);) + ident(TryClose)operator(()ident(SplashWin)operator(\);) + ident(TryClose)operator(()ident(PrefWin)operator(\);) + reserved(except) + ident(DontSavePrefs) operator(:=) ident(True)operator(;) comment(//try again without pref saving) + reserved(end)operator(;) + + reserved(with) ident(PlutoKey)operator(.)ident(GetKey)operator(()string<delimiter(')content(Window)delimiter(')>operator(\)) reserved(do) + reserved(try) + ident(WriteBool)operator(()string<delimiter(')content(Maximized)delimiter(')>operator(,) ident(WindowState) operator(=) ident(wsMaximized)operator(\);) + reserved(if) ident(WindowState) operator(=) ident(wsNormal) reserved(then) reserved(begin) + ident(WriteInteger)operator(()string<delimiter(')content(Left)delimiter(')>operator(,) ident(Left)operator(\);) + ident(WriteInteger)operator(()string<delimiter(')content(Top)delimiter(')>operator(,) ident(Top)operator(\);) + ident(WriteInteger)operator(()string<delimiter(')content(Width)delimiter(')>operator(,) ident(Width)operator(\);) + ident(WriteInteger)operator(()string<delimiter(')content(Height)delimiter(')>operator(,) ident(Height)operator(\);) + reserved(end)operator(;) + reserved(finally) + ident(Free)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(Plutoini1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(NotePad)operator(()ident(PlutoIniFileName)operator(\);) + ident(ShowMessage)operator(()string<delimiter(')content(Click OK when you finished editing.)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content((Pluto will reload )delimiter(')> operator(+) ident(PlutoIniFileName) operator(+) char<delimiter(')content(\))delimiter(')>operator(\);) + ident(PrefWin)operator(.)ident(PrefHost)operator(.)ident(Load)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(RegEdit2Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(RegEdit)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(SysEdit1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(SysEdit)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(NotePad1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(NotePad)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(WordPad1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(WordPad)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(OpenWinDir1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ExploreFolder)operator(()ident(WinDir)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(OpenProgramFolder1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ExploreFolder)operator(()ident(MyDir)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(ExitPluto1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(Close)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(Find1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(FindWin)operator(.)ident(SfRootKeyRB)operator(.)ident(Checked) operator(:=) ident(True)operator(;) + ident(FindWin)operator(.)ident(Show)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(FormPaint)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) ident(Started) reserved(and) reserved(not) ident(MainWinLoaded) reserved(then) reserved(begin) + ident(MainWinLoaded) operator(:=) ident(True)operator(;) + ident(Load)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(StatusBarDrawPanel)operator(()ident(StatusBar)operator(:) ident(TStatusBar)operator(;) + ident(Panel)operator(:) ident(TStatusPanel)operator(;) reserved(const) ident(Rect)operator(:) ident(TRect)operator(\);) +reserved(begin) + reserved(with) ident(StatusBar)operator(.)ident(Canvas) reserved(do) reserved(begin) + ident(Brush)operator(.)ident(Color) operator(:=) ident(clBlack)operator(;) + ident(FillRect)operator(()ident(Rect)operator(\);) + reserved(with) ident(Font) reserved(do) reserved(begin) + ident(Name) operator(:=) string<delimiter(')content(MS Sans Serif)delimiter(')>operator(;) + ident(Style) operator(:=) operator([];) + reserved(case) ident(Panel)operator(.)ident(Index) reserved(of) + integer(0)operator(:) reserved(if) ident(HintBlinkT)operator(.)ident(Enabled) reserved(then) + ident(Color) operator(:=) ident(clBrightRed) + reserved(else) + ident(Color) operator(:=) ident(clBrightSilver)operator(;) + integer(1)operator(:) ident(Color) operator(:=) ident(clWhite)operator(;) + integer(2)operator(:) ident(Color) operator(:=) ident(clCyan)operator(;) + integer(3)operator(:) ident(Color) operator(:=) ident(clBrightPurple)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + reserved(if) ident(Panel)operator(.)ident(Alignment) operator(=) ident(taRightJustify) reserved(then) + ident(TextOut)operator(()ident(Rect)operator(.)ident(Right) operator(-) ident(TextWidth)operator(()ident(Panel)operator(.)ident(Text)operator(\),) ident(Rect)operator(.)ident(Top)operator(,) ident(Panel)operator(.)ident(Text)operator(\)) + reserved(else) + ident(TextOut)operator(()ident(Rect)operator(.)ident(Left)operator(,) ident(Rect)operator(.)ident(Top)operator(,) ident(Panel)operator(.)ident(Text)operator(\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(PathEKeyPress)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Char)operator(\);) +reserved(begin) + reserved(if) ident(Key) operator(=) char(#127) reserved(then) comment(//Silly key management) + ident(Key) operator(:=) char(#0)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(HintBlinkTTimer)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(StatusBar)operator(.)ident(Panels)operator([)integer(0)operator(].)ident(Text) operator(:=) string<delimiter(')content(Ready)delimiter(')>operator(;) + ident(StopHintBlinking)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(StopHintBlinking)operator(;) +reserved(begin) + ident(HintBlinkT)operator(.)ident(Enabled) operator(:=) ident(False)operator(;) + ident(PreBlinkHint) operator(:=) ident(NoPreBlinkHint)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(FindCLSID1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(FindCLSID)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(GotoCLSID1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(GotoCLSID)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(CommandLineParameters1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(NotePad)operator(()ident(PlutoDir) operator(+) string<delimiter(')content(Params.txt)delimiter(')>operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(DeleteTempFolder1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) ident(mrYes) operator(=) ident(MessageDlg)operator(()string<delimiter(')content(Deleting )delimiter(')> operator(+) ident(Quote)operator(()ident(TempDir) operator(+) string<delimiter(')content(*.*)delimiter(')> operator(+) ident(EOL)operator(,) char<delimiter(')content(")delimiter(')>operator(\)) operator(+) + string<delimiter(')content(Are you sure?)delimiter(')>operator(,) ident(mtConfirmation)operator(,) operator([)ident(mbYes)operator(,) ident(mbCancel)operator(],) integer(0)operator(\)) reserved(then) + ident(DeleteFiles)operator(()ident(TempDir) operator(+) string<delimiter(')content(*.*)delimiter(')>operator(,) ident(False)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(CurrentDir1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ShowMessage)operator(()string<delimiter(')content(MyDir: )delimiter(')> operator(+) ident(MyDir) operator(+) ident(EOL) operator(+) + string<delimiter(')content(PlutoDir: )delimiter(')> operator(+) ident(PlutoDir) operator(+) ident(EOL) operator(+) + string<delimiter(')content(CurrentDir: )delimiter(')> operator(+) ident(GetCurrentDir) operator(+) ident(EOL) operator(+) + string<delimiter(')content(Params: )delimiter(')> operator(+) ident(EOL) operator(+) + ident(GetParams)operator(()ident(EOL)operator(\)\);) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(RepairPluto155bBug1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(Msg)operator(:) reserved(string)operator(;) + ident(Reg)operator(:) ident(TXRegistry)operator(;) +reserved(begin) + ident(Reg) operator(:=) ident(TXRegistry)operator(.)ident(Create)operator(;) + + reserved(try) + ident(Reg)operator(.)ident(RootKey) operator(:=) ident(HKCU)operator(;) + ident(Reg)operator(.)ident(OpenKey)operator(()string<delimiter(')content(Software)delimiter(')>operator(\);) + ident(Msg) operator(:=) string<delimiter(')delimiter(')>operator(;) + reserved(if) ident(Reg)operator(.)ident(KeyExists)operator(()string<delimiter(')content(Sisyphus)delimiter(')>operator(\)) reserved(then) + ident(Msg) operator(:=) ident(Msg) operator(+) string<delimiter(')content(HKCU\\Software\\Sisyphus)delimiter(')> operator(+) ident(EOL)operator(;) + reserved(if) ident(Reg)operator(.)ident(KeyExists)operator(()string<delimiter(')content(Main)delimiter(')>operator(\)) reserved(then) + ident(Msg) operator(:=) ident(Msg) operator(+) string<delimiter(')content(HKCU\\Software\\Main)delimiter(')> operator(+) ident(EOL)operator(;) + reserved(if) ident(Reg)operator(.)ident(KeyExists)operator(()string<delimiter(')content(Spy)delimiter(')>operator(\)) reserved(then) + ident(Msg) operator(:=) ident(Msg) operator(+) string<delimiter(')content(HKCU\\Software\\Spy)delimiter(')> operator(+) ident(EOL)operator(;) + reserved(if) ident(Reg)operator(.)ident(KeyExists)operator(()string<delimiter(')content(View)delimiter(')>operator(\)) reserved(then) + ident(Msg) operator(:=) ident(Msg) operator(+) string<delimiter(')content(HKCU\\Software\\View)delimiter(')> operator(+) ident(EOL)operator(;) + reserved(if) ident(Msg) operator(=) string<delimiter(')delimiter(')> reserved(then) reserved(begin) + ident(ShowMessage)operator(()string<delimiter(')content(No bug detected :-\))delimiter(')>operator(\);) + reserved(end) reserved(else) reserved(begin) + ident(Msg) operator(:=) + string<delimiter(')content(Hi folks!)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(We are very sorry: A bug in Pluto made some components in the Edit)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(window save their values to the regsitry instead of the ini file.)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(If you want to repair that, you have to delete the following keys:)delimiter(')> operator(+) ident(EOL) operator(+) + ident(EOL) operator(+) + ident(Msg) operator(+) + ident(EOL) operator(+) + string<delimiter(')content(This is not dangerous at all, but if you are interested in having)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(a clean registry, you should delete this useless keys.)delimiter(')> operator(+) ident(EOL) operator(+) + ident(EOL) operator(+) + string<delimiter(')content(You surely noticed that this key names are rubish because they are)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(in the level that is normally used by programs.)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(If you have programs installed that use this keys for their)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(preferences, you may get problems when deleting the keys!)delimiter(')> operator(+) ident(EOL) operator(+) + ident(EOL) operator(+) + string<delimiter(')content(So, now you have to decide what to do:)delimiter(')> operator(+) ident(EOL) operator(+) + ident(EOL) operator(+) + string<delimiter(')content(Yes: Delete the keys. You have to confirm the deleting of each key.)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(No: Jump to the Software key and delete manually.)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(Cancel: Do nothing.)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(Yes to All: Delete all keys.)delimiter(')>operator(;) + + reserved(case) ident(MessageDlg)operator(()ident(Msg)operator(,) ident(mtWarning)operator(,) operator([)ident(mbYes)operator(,) ident(mbNo)operator(,) ident(mbYesToAll)operator(,) ident(mbCancel)operator(],) integer(0)operator(\)) reserved(of) + ident(mrYes)operator(:) reserved(begin) + reserved(if) ident(Reg)operator(.)ident(KeyExists)operator(()string<delimiter(')content(Main)delimiter(')>operator(\)) + reserved(and) operator(()ident(mrYes)operator(=)ident(MessageDlg)operator(()string<delimiter(')content(Delete HKU\\Software\\Main ?)delimiter(')>operator(,) + ident(mtWarning)operator(,) operator([)ident(mbYes)operator(,) ident(mbNo)operator(],) integer(0)operator(\)\)) reserved(then) + ident(Reg)operator(.)ident(DeleteKey)operator(()string<delimiter(')content(Main)delimiter(')>operator(\);) + + reserved(if) ident(Reg)operator(.)ident(KeyExists)operator(()string<delimiter(')content(Sisyphus)delimiter(')>operator(\)) + reserved(and) operator(()ident(mrYes)operator(=)ident(MessageDlg)operator(()string<delimiter(')content(Delete HKU\\Software\\Sisyphus ?)delimiter(')>operator(,) + ident(mtWarning)operator(,) operator([)ident(mbYes)operator(,) ident(mbNo)operator(],) integer(0)operator(\)\)) reserved(then) + ident(Reg)operator(.)ident(DeleteKey)operator(()string<delimiter(')content(Sisyphus)delimiter(')>operator(\);) + + reserved(if) ident(Reg)operator(.)ident(KeyExists)operator(()string<delimiter(')content(Spy)delimiter(')>operator(\)) + reserved(and) operator(()ident(mrYes)operator(=)ident(MessageDlg)operator(()string<delimiter(')content(Delete HKU\\Software\\Spy ?)delimiter(')>operator(,) + ident(mtWarning)operator(,) operator([)ident(mbYes)operator(,) ident(mbNo)operator(],) integer(0)operator(\)\)) reserved(then) + ident(Reg)operator(.)ident(DeleteKey)operator(()string<delimiter(')content(Spy)delimiter(')>operator(\);) + + reserved(if) ident(Reg)operator(.)ident(KeyExists)operator(()string<delimiter(')content(View)delimiter(')>operator(\)) + reserved(and) operator(()ident(mrYes)operator(=)ident(MessageDlg)operator(()string<delimiter(')content(Delete HKU\\Software\\View ?)delimiter(')>operator(,) + ident(mtWarning)operator(,) operator([)ident(mbYes)operator(,) ident(mbNo)operator(],) integer(0)operator(\)\)) reserved(then) + ident(Reg)operator(.)ident(DeleteKey)operator(()string<delimiter(')content(View)delimiter(')>operator(\);) + reserved(end)operator(;) + + ident(mrYesToAll)operator(:) reserved(begin) + ident(Reg)operator(.)ident(DeleteKey)operator(()string<delimiter(')content(Main)delimiter(')>operator(\);) + ident(Reg)operator(.)ident(DeleteKey)operator(()string<delimiter(')content(Sisyphus)delimiter(')>operator(\);) + ident(Reg)operator(.)ident(DeleteKey)operator(()string<delimiter(')content(Spy)delimiter(')>operator(\);) + ident(Reg)operator(.)ident(DeleteKey)operator(()string<delimiter(')content(View)delimiter(')>operator(\);) + reserved(end)operator(;) + + ident(mrNo)operator(:) reserved(begin) + ident(TreeWin)operator(.)ident(SetFocus)operator(;) + ident(GotoKey)operator(()string<delimiter(')content(HKCU\\Software\\)delimiter(')>operator(\);) + reserved(end)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + reserved(finally) + ident(Reg)operator(.)ident(Free)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(BackupRegistryscanreg1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ExecFile)operator(()string<delimiter(')content(scanreg)delimiter(')>operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(Username1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ShowMessage)operator(()ident(UserName)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(ToDoMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(NotePad)operator(()ident(PlutoDir) operator(+) string<delimiter(')content(ToDo.txt)delimiter(')>operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(MailLinkMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(MailTo)operator(()ident(TMenuItem)operator(()ident(Sender)operator(\).)ident(Caption)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(IjustwantCONTACT1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(MailTo)operator(()string<delimiter(')content(pluto@cYcnus.de)delimiter(')>operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(ExternalHexEditMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ExecFile)operator(()ident(PrefWin)operator(.)ident(ExternalHexEditE)operator(.)ident(Text)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(AnotherPluto1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ExecFile)operator(()ident(Application)operator(.)ident(ExeName)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(Path1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) +preprocessor({$IFDEF UNIKEY}) + ident(UserUniPath) operator(:=) ident(InputBox)operator(()string<delimiter(')content(UniKey)delimiter(')>operator(,) string<delimiter(')content(Input an UniPath.)delimiter(')> operator(+) ident(EOL) operator(+) + ident(EOL) operator(+) + string<delimiter(')content(No idea? Try one of these: )delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(WinAmpVisColor <viscolor.txt>:)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(Params:)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(Reg: HKCU)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(Ini <)delimiter(')> operator(+) ident(MyDir) operator(+) string<delimiter(')content(pluto.ini>:)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(Ini <)delimiter(')> operator(+) ident(MyDir) operator(+) string<delimiter(')content(pluto.ini>:[View])delimiter(')> operator(+) ident(EOL)operator(,) + ident(UserUniPath)operator(\);) +preprocessor({$ENDIF}) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(RegisterPlugIns1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) +preprocessor({$IFDEF UNIKEY}) + reserved(if) ident(UniPluginOD)operator(.)ident(Execute) reserved(then) + ident(RegisterUniClass)operator(()ident(UniPluginOD)operator(.)ident(FileName)operator(\);) +preprocessor({$ENDIF}) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(FormResize)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ArrangeIcons)operator(;) + ident(ArrangePlutoStyle)operator(;) + ident(WorkWin)operator(.)ident(WindowState) operator(:=) ident(wsNormal)operator(;) + ident(ValuesWin)operator(.)ident(WindowState) operator(:=) ident(wsNormal)operator(;) + ident(TreeWin)operator(.)ident(WindowState) operator(:=) ident(wsNormal)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(SwapLM_CUBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(Path)operator(:) reserved(string)operator(;) +reserved(begin) + ident(Path) operator(:=) ident(TraceKey)operator(()ident(PathE)operator(.)ident(Text)operator(,) ident(uhShortcuts)operator(\);) + reserved(if) ident(SwapHKU_HKLM)operator(()ident(Path)operator(\)) reserved(then) reserved(begin) + ident(PathE)operator(.)ident(Text) operator(:=) ident(Path)operator(;) + ident(UserGotoKey)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(ShowLoadreport1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(NotePad)operator(()ident(MyDir) operator(+) string<delimiter(')content(loadreport.txt)delimiter(')>operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(KillPluto1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(Application)operator(.)ident(Terminate)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(ShowPlatform1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ShowMessage)operator(()ident(Format)operator(()string<delimiter(')content(Platform: %s)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(Versin: %d.%d Build %d)delimiter(')>operator(,) + operator([)ident(PlatformStrings)operator([)ident(Win32Platform)operator(],) + ident(Win32MajorVersion)operator(,) ident(Win32MinorVersion)operator(,) ident(Win32BuildNumber)operator(]\)\);) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(MSConfig1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ExecFile)operator(()string<delimiter(')content(msconfig)delimiter(')>operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(TimetoRelaxMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(RelaxFile)operator(:) reserved(string)operator(;) +reserved(begin) + reserved(with) ident(PlutoKey)operator(.)ident(GetKey)operator(()string<delimiter(')content(Main)delimiter(')>operator(\)) reserved(do) + reserved(try) + ident(RelaxFile) operator(:=) ident(ReadString)operator(()string<delimiter(')content(Relax)delimiter(')>operator(\);) + reserved(finally) + ident(Free)operator(;) + reserved(end)operator(;) + + reserved(if) ident(RelaxFile) operator(=) string<delimiter(')delimiter(')> reserved(then) + ident(ShowMessage)operator(()string<delimiter(')content(This menu item can be used for something that lets you relax,)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(for example Diablo2, you favorite song or the latest news about the)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(decreasing AOL member numbers.)delimiter(')> operator(+) ident(EOL) operator(+) + ident(EOL) operator(+) + string<delimiter(')content(Feel free to use everything you want.)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(Open the pluto.ini (CTRL+I\) and add a new value "Relax" in the "Main")delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(section.)delimiter(')> operator(+) ident(EOL) operator(+) + ident(EOL) operator(+) + string<delimiter(')content(And don)char('')content(t forget:)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(R E L A X ! ! !)delimiter(')>operator(\)) + reserved(else) + ident(ExecFile)operator(()ident(RelaxFile)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(OnSisyChange)operator(()ident(Sender)operator(:) ident(TSisyThread)operator(;) ident(Change)operator(:) ident(TSisyChange)operator(\);) + + reserved(procedure) ident(UpdateValue)operator(;) + reserved(var) + ident(Reg)operator(:) ident(TXRegistry)operator(;) + ident(Index)operator(:) ident(Integer)operator(;) + reserved(begin) + reserved(if) reserved(not) ident(SameRegPath)operator(()ident(ExRegFullKey)operator(()ident(Change)operator(.)ident(Path)operator(\),) ident(PathOfNode)operator(()ident(RegTV)operator(.)ident(Selected)operator(\)\)) reserved(then) + ident(Exit)operator(;) + + ident(Reg) operator(:=) ident(TXRegistry)operator(.)ident(Create)operator(;) + reserved(try) + ident(Reg)operator(.)ident(RootKey) operator(:=) ident(HKEYOfStr)operator(()ident(ExRegRoot)operator(()ident(Change)operator(.)ident(Path)operator(\)\);) + reserved(if) ident(Reg)operator(.)ident(OpenKey)operator(()ident(ExRegKey)operator(()ident(Change)operator(.)ident(Path)operator(\)\)) reserved(then) + reserved(with) ident(ValuesWin) reserved(do) reserved(begin) + ident(Index) operator(:=) ident(FindItemByRealName)operator(()ident(ExRegValue)operator(()ident(Change)operator(.)ident(Path)operator(\)\);) + reserved(if) ident(Index) operator(>) operator(-)integer(1) reserved(then) reserved(begin) + reserved(if) ident(Change)operator(.)ident(Typ) operator(=) ident(cValueMinus) reserved(then) + ident(ValueList)operator(.)ident(Items)operator(.)ident(Delete)operator(()ident(Index)operator(\)) + reserved(else) reserved(if) ident(Change)operator(.)ident(Typ) operator(=) ident(cContextChange) reserved(then) + ident(UpdateValue)operator(()ident(Reg)operator(,) ident(ValueList)operator(.)ident(Items)operator([)ident(Index)operator(]\);) + reserved(end) reserved(else) reserved(if) ident(Change)operator(.)ident(Typ) operator(=) ident(cValuePlus) reserved(then) + ident(AddValue)operator(()ident(Reg)operator(,) ident(ExRegValue)operator(()ident(Change)operator(.)ident(Path)operator(\)\);) + reserved(end)operator(;) + reserved(finally) + ident(Reg)operator(.)ident(Free)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + +reserved(begin) + ident(AddHint)operator(()ident(Sender)operator(.)ident(Name) operator(+) string<delimiter(')content( notified )delimiter(')> operator(+) ident(Change)operator(.)ident(Path)operator(\);) + reserved(if) ident(Change)operator(.)ident(Typ) reserved(in) operator([)ident(cValueMinus)operator(,) ident(cValuePlus)operator(,) ident(cContextChange)operator(]) reserved(then) + ident(UpdateValue)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(OnSisyValuePlus)operator(()ident(Sender)operator(:) ident(TSisyThread)operator(;) ident(Change)operator(:) ident(TSisyChange)operator(\);) +reserved(var) + ident(Reg)operator(:) ident(TXRegistry)operator(;) +reserved(begin) + reserved(if) reserved(not) ident(SameRegPath)operator(()ident(ExRegFullKey)operator(()ident(Change)operator(.)ident(Path)operator(\),) ident(PathOfNode)operator(()ident(RegTV)operator(.)ident(Selected)operator(\)\)) reserved(then) + ident(Exit)operator(;) + + ident(Reg) operator(:=) ident(TXRegistry)operator(.)ident(Create)operator(;) + reserved(try) + ident(Reg)operator(.)ident(RootKey) operator(:=) ident(HKEYOfStr)operator(()ident(ExRegRoot)operator(()ident(Change)operator(.)ident(Path)operator(\)\);) + reserved(if) ident(Reg)operator(.)ident(OpenKey)operator(()ident(ExRegKey)operator(()ident(Change)operator(.)ident(Path)operator(\)\)) reserved(then) + ident(ValuesWin)operator(.)ident(AddValue)operator(()ident(Reg)operator(,) ident(ExRegValue)operator(()ident(Change)operator(.)ident(Path)operator(\)\);) + reserved(finally) + ident(Reg)operator(.)ident(Free)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(OnSisyValueMinus)operator(()ident(Sender)operator(:) ident(TSisyThread)operator(;) ident(Change)operator(:) ident(TSisyChange)operator(\);) +reserved(var) + ident(Reg)operator(:) ident(TXRegistry)operator(;) + ident(Index)operator(:) ident(Integer)operator(;) +reserved(begin) + reserved(if) reserved(not) ident(SameRegPath)operator(()ident(ExRegFullKey)operator(()ident(Change)operator(.)ident(Path)operator(\),) ident(PathOfNode)operator(()ident(RegTV)operator(.)ident(Selected)operator(\)\)) reserved(then) + ident(Exit)operator(;) + + ident(Reg) operator(:=) ident(TXRegistry)operator(.)ident(Create)operator(;) + reserved(try) + ident(Reg)operator(.)ident(RootKey) operator(:=) ident(HKEYOfStr)operator(()ident(ExRegRoot)operator(()ident(Change)operator(.)ident(Path)operator(\)\);) + reserved(if) ident(Reg)operator(.)ident(OpenKey)operator(()ident(ExRegKey)operator(()ident(Change)operator(.)ident(Path)operator(\)\)) reserved(then) + reserved(with) ident(ValuesWin) reserved(do) reserved(begin) + ident(Index) operator(:=) ident(FindItemByRealName)operator(()ident(ExRegValue)operator(()ident(Change)operator(.)ident(Path)operator(\)\);) + reserved(if) ident(Index) operator(>) operator(-)integer(1) reserved(then) + ident(ValueList)operator(.)ident(Items)operator(.)ident(Delete)operator(()ident(Index)operator(\);) + reserved(end)operator(;) + reserved(finally) + ident(Reg)operator(.)ident(Free)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TMainWin)operator(.)ident(OnSisyContextChange)operator(()ident(Sender)operator(:) ident(TSisyThread)operator(;) ident(Change)operator(:) ident(TSisyChange)operator(\);) +reserved(var) + ident(Reg)operator(:) ident(TXRegistry)operator(;) + ident(Index)operator(:) ident(Integer)operator(;) +reserved(begin) + reserved(if) reserved(not) ident(SameRegPath)operator(()ident(ExRegFullKey)operator(()ident(Change)operator(.)ident(Path)operator(\),) ident(PathOfNode)operator(()ident(RegTV)operator(.)ident(Selected)operator(\)\)) reserved(then) + ident(Exit)operator(;) + + ident(Reg) operator(:=) ident(TXRegistry)operator(.)ident(Create)operator(;) + reserved(try) + ident(Reg)operator(.)ident(RootKey) operator(:=) ident(HKEYOfStr)operator(()ident(ExRegRoot)operator(()ident(Change)operator(.)ident(Path)operator(\)\);) + reserved(if) ident(Reg)operator(.)ident(OpenKey)operator(()ident(ExRegKey)operator(()ident(Change)operator(.)ident(Path)operator(\)\)) reserved(then) + reserved(with) ident(ValuesWin) reserved(do) reserved(begin) + ident(Index) operator(:=) ident(FindItemByRealName)operator(()ident(ExRegValue)operator(()ident(Change)operator(.)ident(Path)operator(\)\);) + reserved(if) ident(Index) operator(>) operator(-)integer(1) reserved(then) + ident(UpdateValue)operator(()ident(Reg)operator(,) ident(ValueList)operator(.)ident(Items)operator([)ident(Index)operator(]\);) + reserved(end)operator(;) + reserved(finally) + ident(Reg)operator(.)ident(Free)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(end)operator(.) +reserved(unit) ident(PrefU)operator(;) + +reserved(interface) + +reserved(uses) + ident(Windows)operator(,) ident(Messages)operator(,) ident(SysUtils)operator(,) ident(Variants)operator(,) ident(Classes)operator(,) ident(Graphics)operator(,) ident(Controls)operator(,) ident(Forms)operator(,) + ident(Dialogs)operator(,) ident(ComCtrls)operator(,) ident(ExtCtrls)operator(,) ident(StdCtrls)operator(,) ident(PlutoConst)operator(,) ident(NewPanels)operator(,) ident(PrefTools)operator(,) + ident(YTools)operator(,) ident(YTypes)operator(,) ident(start)operator(,) ident(XReg)operator(,) ident(LinkLabel)operator(;) + +reserved(type) + ident(TPrefWin) operator(=) reserved(class)operator(()ident(TForm)operator(\)) + ident(PrefPC)operator(:) ident(TPageControl)operator(;) + ident(CommonPage)operator(:) ident(TTabSheet)operator(;) + ident(KeyPage)operator(:) ident(TTabSheet)operator(;) + ident(DataPage)operator(:) ident(TTabSheet)operator(;) + ident(KeysBP)operator(:) ident(TBorderPanel)operator(;) + ident(GroupBox3)operator(:) ident(TGroupBox)operator(;) + ident(MainPrevBP)operator(:) ident(TBorderPanel)operator(;) + ident(GroupBox4)operator(:) ident(TGroupBox)operator(;) + ident(BorderPanel6)operator(:) ident(TBorderPanel)operator(;) + ident(GroupBox6)operator(:) ident(TGroupBox)operator(;) + ident(SortKeysCB)operator(:) ident(TPrefCheckBox)operator(;) + ident(PrefHost)operator(:) ident(TPrefHost)operator(;) + ident(MainPreviewCB)operator(:) ident(TPrefCheckBox)operator(;) + ident(SplashScreenCB)operator(:) ident(TPrefCheckBox)operator(;) + ident(PrefValuesPC)operator(:) ident(TPageControl)operator(;) + ident(StringPage)operator(:) ident(TTabSheet)operator(;) + ident(MultiStringPage)operator(:) ident(TTabSheet)operator(;) + ident(IntPage)operator(:) ident(TTabSheet)operator(;) + ident(BinaryPage)operator(:) ident(TTabSheet)operator(;) + ident(BorderPanel8)operator(:) ident(TBorderPanel)operator(;) + ident(GroupBox8)operator(:) ident(TGroupBox)operator(;) + ident(ShowDwordAsHex)operator(:) ident(TPrefCheckBox)operator(;) + ident(BorderPanel7)operator(:) ident(TBorderPanel)operator(;) + ident(GroupBox7)operator(:) ident(TGroupBox)operator(;) + ident(CountZeroByteCB)operator(:) ident(TPrefCheckBox)operator(;) + ident(BorderPanel1)operator(:) ident(TBorderPanel)operator(;) + ident(GroupBox2)operator(:) ident(TGroupBox)operator(;) + ident(UseExtendedModelCB)operator(:) ident(TPrefCheckBox)operator(;) + ident(BorderPanel2)operator(:) ident(TBorderPanel)operator(;) + ident(GroupBox1)operator(:) ident(TGroupBox)operator(;) + ident(ShowAsBinaryCB)operator(:) ident(TPrefCheckBox)operator(;) + ident(ShowBinaryAsRG)operator(:) ident(TPrefRadioGroup)operator(;) + ident(Smart4BBCB)operator(:) ident(TPrefCheckBox)operator(;) + ident(DWordPreviewL)operator(:) ident(TLabel)operator(;) + ident(Label4)operator(:) ident(TLabel)operator(;) + ident(Label5)operator(:) ident(TLabel)operator(;) + ident(Label6)operator(:) ident(TLabel)operator(;) + ident(Label7)operator(:) ident(TLabel)operator(;) + ident(UserNameE)operator(:) ident(TPrefEdit)operator(;) + ident(Label8)operator(:) ident(TLabel)operator(;) + ident(MainPreviewE)operator(:) ident(TPrefEdit)operator(;) + ident(Label12)operator(:) ident(TLabel)operator(;) + ident(DefaultIconPreviewCB)operator(:) ident(TPrefCheckBox)operator(;) + ident(KeyInfoPreviewCB)operator(:) ident(TPrefCheckBox)operator(;) + ident(SelectExternalHexEditOD)operator(:) ident(TOpenDialog)operator(;) + ident(BorderPanel3)operator(:) ident(TBorderPanel)operator(;) + ident(GroupBox9)operator(:) ident(TGroupBox)operator(;) + ident(IntegrationPage)operator(:) ident(TTabSheet)operator(;) + ident(BorderPanel4)operator(:) ident(TBorderPanel)operator(;) + ident(GroupBox5)operator(:) ident(TGroupBox)operator(;) + ident(Label11)operator(:) ident(TLabel)operator(;) + ident(SelectExternalHexEditB)operator(:) ident(TButton)operator(;) + ident(RunExternalHexEditB)operator(:) ident(TButton)operator(;) + ident(ExternalHexEditE)operator(:) ident(TPrefEdit)operator(;) + ident(Label13)operator(:) ident(TLabel)operator(;) + ident(BorderPanel5)operator(:) ident(TBorderPanel)operator(;) + ident(GroupBox10)operator(:) ident(TGroupBox)operator(;) + ident(Label15)operator(:) ident(TLabel)operator(;) + ident(RegisterAppCB)operator(:) ident(TCheckBox)operator(;) + ident(Label3)operator(:) ident(TLabel)operator(;) + ident(Memo1)operator(:) ident(TMemo)operator(;) + ident(ExpandStringsRG)operator(:) ident(TPrefRadioGroup)operator(;) + ident(QuotersE)operator(:) ident(TPrefEdit)operator(;) + ident(Label1)operator(:) ident(TLabel)operator(;) + ident(StringPreviewL)operator(:) ident(TLabel)operator(;) + ident(ShowLineCountCB)operator(:) ident(TPrefCheckBox)operator(;) + ident(ShowTreeViewLinesCB)operator(:) ident(TPrefCheckBox)operator(;) + ident(ValuePage)operator(:) ident(TTabSheet)operator(;) + ident(BorderPanel10)operator(:) ident(TBorderPanel)operator(;) + ident(GroupBox12)operator(:) ident(TGroupBox)operator(;) + ident(ShowListViewGridCB)operator(:) ident(TPrefCheckBox)operator(;) + ident(Label9)operator(:) ident(TLabel)operator(;) + ident(DefaultValueNameE)operator(:) ident(TPrefEdit)operator(;) + ident(Label10)operator(:) ident(TLabel)operator(;) + ident(GotoPlutoKeyB)operator(:) ident(TButton)operator(;) + ident(ColorPanel2)operator(:) ident(TColorPanel)operator(;) + ident(LinkLabel1)operator(:) ident(TLinkLabel)operator(;) + ident(SmartExpandCB)operator(:) ident(TPrefCheckBox)operator(;) + ident(KeysSingleClickCB)operator(:) ident(TPrefCheckBox)operator(;) + ident(ValuesSingleClickCB)operator(:) ident(TPrefCheckBox)operator(;) + ident(ShowProgressCB)operator(:) ident(TPrefCheckBox)operator(;) + ident(ColorPanel1)operator(:) ident(TColorPanel)operator(;) + ident(Label2)operator(:) ident(TLabel)operator(;) + ident(ReloadB)operator(:) ident(TButton)operator(;) + ident(DefaultB)operator(:) ident(TButton)operator(;) + ident(SaveB)operator(:) ident(TButton)operator(;) + reserved(procedure) ident(PrefPCDrawTab)operator(()ident(Control)operator(:) ident(TCustomTabControl)operator(;) + ident(TabIndex)operator(:) ident(Integer)operator(;) reserved(const) ident(Rect)operator(:) ident(TRect)operator(;) ident(Active)operator(:) ident(Boolean)operator(\);) + reserved(procedure) ident(PrefHostLoaded)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(StandardPreviewChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(DataPreviewChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(UserNameEChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(FormKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) + ident(Shift)operator(:) ident(TShiftState)operator(\);) + reserved(procedure) ident(FormDeactivate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(FormActivate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(PrefValuesPCDrawTab)operator(()ident(Control)operator(:) ident(TCustomTabControl)operator(;) + ident(TabIndex)operator(:) ident(Integer)operator(;) reserved(const) ident(Rect)operator(:) ident(TRect)operator(;) ident(Active)operator(:) ident(Boolean)operator(\);) + reserved(procedure) ident(ShowDwordAsHexClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(MainPreviewEChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(FormCreate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(ActivateIt)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(DeActivateIt)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(ReloadBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(RunExternalHexEditBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(SelectExternalHexEditBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(ExternalHexEditEChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(DefaultBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(RegisterAppCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(SaveBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(StringPreviewChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(ShowTreeViewLinesCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(ShowListViewGridCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(DefaultValueNameEChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(LoadPrefs)operator(;) + reserved(procedure) ident(UseExtendedModelCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(IntegrationPageShow)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(GotoPlutoKeyBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(FormShow)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(KeysSingleClickCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(ValuesSingleClickCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(QuotersEChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(SplashScreenCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(SaveBMouseMove)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Shift)operator(:) ident(TShiftState)operator(;) ident(X)operator(,) + ident(Y)operator(:) ident(Integer)operator(\);) + directive(public) + ident(StringQuoterBegin)operator(,) ident(StringQuoterEnd)operator(:) reserved(string)operator(;) + reserved(end)operator(;) + +reserved(var) + ident(PrefWin)operator(:) ident(TPrefWin)operator(;) + +reserved(implementation) + +reserved(uses) + ident(TreeU)operator(,) ident(ValuesU)operator(,) ident(Splash)operator(,) ident(plutomain)operator(,) ident(WorkU)operator(;) + +preprocessor({$R *.dfm}) + +reserved(procedure) ident(TPrefWin)operator(.)ident(PrefPCDrawTab)operator(()ident(Control)operator(:) ident(TCustomTabControl)operator(;) + ident(TabIndex)operator(:) ident(Integer)operator(;) reserved(const) ident(Rect)operator(:) ident(TRect)operator(;) ident(Active)operator(:) ident(Boolean)operator(\);) +reserved(var) + ident(PC)operator(:) ident(TPageControl)operator(;) + ident(Page)operator(:) ident(TTabSheet)operator(;) +reserved(begin) + ident(PC) operator(:=) ident(TPageControl)operator(()ident(Control)operator(\);) + ident(Page) operator(:=) ident(PC)operator(.)ident(Pages)operator([)ident(TabIndex)operator(];) + reserved(with) ident(PC)operator(.)ident(Canvas)operator(.)ident(Font) reserved(do) reserved(begin) + reserved(if) ident(Page)operator(.)ident(Caption) operator(=) string<delimiter(')content(Common)delimiter(')> reserved(then) + ident(Color) operator(:=) ident(clWhite) + reserved(else) reserved(if) ident(Page)operator(.)ident(Caption) operator(=) string<delimiter(')content(Keys)delimiter(')> reserved(then) + ident(Color) operator(:=) ident(clBrightCyan) + reserved(else) reserved(if) ident(Page)operator(.)ident(Caption) operator(=) string<delimiter(')content(Values)delimiter(')> reserved(then) + ident(Color) operator(:=) ident(clBrightPurple) + reserved(else) reserved(if) ident(Page)operator(.)ident(Caption) operator(=) string<delimiter(')content(Data)delimiter(')> reserved(then) + ident(Color) operator(:=) ident(clBrightBlue) + reserved(else) reserved(if) ident(Page)operator(.)ident(Caption) operator(=) string<delimiter(')content(System)delimiter(')> reserved(then) + ident(Color) operator(:=) ident(clBrightYellow) + reserved(else) + ident(Color) operator(:=) ident(clWhite)operator(;) + reserved(end)operator(;) + + reserved(with) ident(PC)operator(.)ident(Canvas) reserved(do) + reserved(if) ident(Active) reserved(then) reserved(begin) + ident(Font)operator(.)ident(Style) operator(:=) operator([)ident(fsBold)operator(];) + ident(Brush)operator(.)ident(Color) operator(:=) ident(clDarkGray)operator(;) + ident(FillRect)operator(()ident(Rect)operator(\);) + ident(TextOut)operator(()ident(Rect)operator(.)ident(Left) operator(+) integer(5)operator(,) ident(Rect)operator(.)ident(Top) operator(+) integer(3)operator(,) ident(Page)operator(.)ident(Caption)operator(\);) + reserved(end) reserved(else) reserved(begin) + ident(Font)operator(.)ident(Style) operator(:=) operator([];) + ident(Brush)operator(.)ident(Color) operator(:=) ident(clDarkGray)operator(;) + ident(FillRect)operator(()ident(Rect)operator(\);) + ident(TextOut)operator(()ident(Rect)operator(.)ident(Left) operator(+) integer(3)operator(,) ident(Rect)operator(.)ident(Top) operator(+) integer(2)operator(,) ident(Page)operator(.)ident(Caption)operator(\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(PrefHostLoaded)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(PrefHost)operator(.)ident(KeyName) operator(:=) ident(PlutoUniPath)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(StandardPreviewChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) ident(Started) reserved(then) + ident(RegTV)operator(.)ident(Repaint)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(DataPreviewChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) reserved(not) ident(Started) reserved(then) + ident(Exit)operator(;) + + ident(ValuesWin)operator(.)ident(UpdateValues)operator(;) + ident(RegTV)operator(.)ident(Repaint)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(UserNameEChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(StatusBar)operator(.)ident(Panels)operator([)integer(0)operator(].)ident(Text) operator(:=) ident(MainWin)operator(.)ident(Greeting)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(FormKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) + ident(Shift)operator(:) ident(TShiftState)operator(\);) +reserved(begin) + reserved(if) ident(Key) operator(=) ident(VK_ESCAPE) reserved(then) + ident(Close)operator(;) + + reserved(if) ident(Key) operator(=) ident(VK_SCROLL) reserved(then) + ident(MainWin)operator(.)ident(FormKeyDown)operator(()ident(Sender)operator(,) ident(Key)operator(,) ident(Shift)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(FormDeactivate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) ident(ActiveControl)operator(.)ident(Tag) operator(=) ident(EditControlFlag) reserved(then) + ident(DeActivateThis)operator(()ident(ActiveControl)operator(\);) + + ident(AlphaBlendValue) operator(:=) integer(127)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(FormActivate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) ident(Started) reserved(and) operator(()ident(ActiveControl)operator(.)ident(Tag) operator(=) ident(EditControlFlag)operator(\)) reserved(then) + ident(ActivateThis)operator(()ident(ActiveControl)operator(\);) + + ident(AlphaBlendValue) operator(:=) integer(255)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(PrefValuesPCDrawTab)operator(()ident(Control)operator(:) ident(TCustomTabControl)operator(;) + ident(TabIndex)operator(:) ident(Integer)operator(;) reserved(const) ident(Rect)operator(:) ident(TRect)operator(;) ident(Active)operator(:) ident(Boolean)operator(\);) +reserved(var) + ident(PC)operator(:) ident(TPageControl)operator(;) + ident(Page)operator(:) ident(TTabSheet)operator(;) +reserved(begin) + ident(PC) operator(:=) ident(TPageControl)operator(()ident(Control)operator(\);) + ident(Page) operator(:=) ident(PC)operator(.)ident(Pages)operator([)ident(TabIndex)operator(];) + reserved(with) ident(PC)operator(.)ident(Canvas)operator(.)ident(Font) reserved(do) reserved(begin) + reserved(if) ident(Page) operator(=) ident(StringPage) reserved(then) + ident(Color) operator(:=) ident(clBrightRed) + reserved(else) reserved(if) ident(Page) operator(=) ident(MultiStringPage) reserved(then) + ident(Color) operator(:=) ident(clBrightPurple) + reserved(else) reserved(if) ident(Page) operator(=) ident(IntPage) reserved(then) + ident(Color) operator(:=) ident(clBrightBlue) + reserved(else) reserved(if) ident(Page) operator(=) ident(BinaryPage) reserved(then) + ident(Color) operator(:=) ident(clBrightGreen)operator(;) + reserved(end)operator(;) + + reserved(with) ident(PC)operator(.)ident(Canvas) reserved(do) + reserved(if) ident(Active) reserved(then) reserved(begin) + ident(Font)operator(.)ident(Style) operator(:=) operator([)ident(fsBold)operator(];) + ident(Brush)operator(.)ident(Color) operator(:=) ident(clDarkGray)operator(;) + ident(FillRect)operator(()ident(Rect)operator(\);) + ident(TextOut)operator(()ident(Rect)operator(.)ident(Left) operator(+) integer(18) operator(+) integer(5)operator(,) ident(Rect)operator(.)ident(Top) operator(+) integer(3)operator(,) ident(Page)operator(.)ident(Caption)operator(\);) + ident(PC)operator(.)ident(Images)operator(.)ident(Draw)operator(()ident(PC)operator(.)ident(Canvas)operator(,) ident(Rect)operator(.)ident(Left) operator(+) integer(4)operator(,) ident(Rect)operator(.)ident(Top) operator(+) integer(2)operator(,) ident(Page)operator(.)ident(ImageIndex)operator(\);) + reserved(end) reserved(else) reserved(begin) + ident(Font)operator(.)ident(Style) operator(:=) operator([];) + ident(Brush)operator(.)ident(Color) operator(:=) ident(clDarkGray)operator(;) + ident(FillRect)operator(()ident(Rect)operator(\);) + ident(TextOut)operator(()ident(Rect)operator(.)ident(Left) operator(+) integer(18) operator(+) integer(3)operator(,) ident(Rect)operator(.)ident(Top) operator(+) integer(2)operator(,) ident(Page)operator(.)ident(Caption)operator(\);) + ident(PC)operator(.)ident(Images)operator(.)ident(Draw)operator(()ident(PC)operator(.)ident(Canvas)operator(,) ident(Rect)operator(.)ident(Left) operator(+) integer(1)operator(,) ident(Rect)operator(.)ident(Top) operator(+) integer(1)operator(,) ident(Page)operator(.)ident(ImageIndex)operator(\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(ShowDwordAsHexClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(DWordPreviewL)operator(.)ident(Caption) operator(:=) string<delimiter(')content(Preview: )delimiter(')> operator(+) ident(ValuesU)operator(.)ident(DataPreviewOfContext)operator(() + ident(RegContext)operator(()ident(rdCardinal)operator(,) ident(Reverse)operator(()ident(ByteAOfHex)operator(()ident(HexOfCard)operator(()integer(1234567890)operator(,) integer(8)operator(\)\)\)\)\);) + ident(DataPreviewChange)operator(()ident(Self)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(MainPreviewEChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) ident(MainPreviewE)operator(.)ident(Text) operator(=) string<delimiter(')delimiter(')> reserved(then) + ident(MainPreviewCB)operator(.)ident(Caption) operator(:=) string<delimiter(')content(&Show Preview for Default Value)delimiter(')> + reserved(else) + ident(MainPreviewCB)operator(.)ident(Caption) operator(:=) string<delimiter(')content(&Show Preview for )delimiter(')> operator(+) + ident(Quote)operator(()ident(MainPreviewE)operator(.)ident(Text)operator(\);) + + ident(StandardPreviewChange)operator(()ident(Self)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(FormCreate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(UserNameE)operator(.)ident(DefaultValue) operator(:=) ident(UserName)operator(;) + ident(MainPreviewEChange)operator(()ident(Self)operator(\);) + ident(PrefPC)operator(.)ident(ActivePageIndex) operator(:=) integer(0)operator(;) + ident(PrefValuesPC)operator(.)ident(ActivePageIndex) operator(:=) integer(0)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(ActivateIt)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ActivateThis)operator(()ident(Sender)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(DeActivateIt)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(DeActivateThis)operator(()ident(Sender)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(ReloadBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(LoadPrefs)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(RunExternalHexEditBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(FileName)operator(,) ident(TestValue)operator(:) reserved(string)operator(;) +reserved(begin) + ident(FileName) operator(:=) ident(TempDir) operator(+) string<delimiter(')content(~test.bin)delimiter(')>operator(;) + ident(TestValue) operator(:=) string<delimiter(')content(This is only a test.)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(Everything seems to be OK.)delimiter(')>operator(;) + reserved(if) ident(SaveByteA)operator(()ident(ByteAOfStr)operator(()ident(TestValue)operator(\),) ident(FileName)operator(\)) reserved(then) + ident(ExecFileWith)operator(()ident(ExternalHexEditE)operator(.)ident(Text)operator(,) ident(FileName)operator(\)) + reserved(else) + ident(ShowMessage)operator(()string<delimiter(')content(Could not write into file:)delimiter(')> operator(+) ident(EOL) operator(+) + ident(FileName)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(SelectExternalHexEditBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(with) ident(SelectExternalHexEditOD) reserved(do) reserved(begin) + ident(InitialDir) operator(:=) ident(ExtractPath)operator(()ident(ExternalHexEditE)operator(.)ident(Text)operator(\);) + ident(FileName) operator(:=) ident(ExtractFileName)operator(()ident(ExternalHexEditE)operator(.)ident(Text)operator(\);) + reserved(if) ident(Execute) reserved(and) ident(FileExists)operator(()ident(FileName)operator(\)) reserved(then) + ident(ExternalHexEditE)operator(.)ident(Text) operator(:=) ident(FileName)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(ExternalHexEditEChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(RunExternalHexEditB)operator(.)ident(Enabled) operator(:=) ident(FileExists)operator(()ident(ExternalHexEditE)operator(.)ident(Text)operator(\);) + reserved(if) ident(Assigned)operator(()ident(WorkWin)operator(\)) reserved(then) + ident(WorkWin)operator(.)ident(ExternalEditB)operator(.)ident(Enabled) operator(:=) ident(RunExternalHexEditB)operator(.)ident(Enabled)operator(;) + reserved(if) ident(Assigned)operator(()ident(MainWin)operator(\)) reserved(then) + ident(MainWin)operator(.)ident(ExternalHexEditMI)operator(.)ident(Enabled) operator(:=) ident(RunExternalHexEditB)operator(.)ident(Enabled)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(DefaultBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) ident(mrYes)operator(=)ident(MessageDlg)operator(()string<delimiter(')content(Do you really want to reset the preferences)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(to their defaults?)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content((This can not be undone.\))delimiter(')>operator(,) ident(mtWarning)operator(,) operator([)ident(mbYes)operator(,) ident(mbCancel)operator(],) integer(0)operator(\)) reserved(then) reserved(begin) + ident(CopyFile)operator(()ident(PChar)operator(()ident(PlutoIniFileName)operator(\),) ident(PChar)operator(()ident(PlutoIniFileName) operator(+) string<delimiter(')content(.backup)delimiter(')>operator(\),) ident(False)operator(\);) + comment(//PrefHost.KeyName := 'Ini <' + PlutoIniFileName + '.backup>:';) + comment(//PrefHost.Save;) + comment(//PrefHost.KeyName := PlutoUniPath;) + ident(PrefHost)operator(.)ident(BackUp)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(RegisterAppCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(with) ident(TXRegistry)operator(.)ident(Create) reserved(do) + reserved(try) + ident(RootKey) operator(:=) ident(HKLM)operator(;) + ident(OpenKey)operator(()string<delimiter(')content(Software\\Microsoft\\Windows\\CurrentVersion\\App Paths)delimiter(')>operator(\);) + reserved(if) ident(RegisterAppCB)operator(.)ident(Checked) reserved(then) reserved(begin) + ident(OpenKey)operator(()string<delimiter(')content(pluto.exe)delimiter(')>operator(,) ident(True)operator(\);) + ident(WriteString)operator(()string<delimiter(')delimiter(')>operator(,) ident(GetFileNew)operator(()ident(Application)operator(.)ident(ExeName)operator(\)\);) + reserved(end) reserved(else) + ident(DeleteKey)operator(()string<delimiter(')content(pluto.exe)delimiter(')>operator(\);) + reserved(finally) + ident(Free)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(SaveBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(PrefHost)operator(.)ident(Save)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(StringPreviewChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(StringPreviewL)operator(.)ident(Caption) operator(:=) string<delimiter(')content(Preview: )delimiter(')> operator(+) ident(ValuesU)operator(.)ident(DataPreviewOfContext)operator(() + ident(RegContext)operator(()ident(rdString)operator(,) ident(ByteAOfStr)operator(()string<delimiter(')content(%windir%)delimiter(')>operator(\)\)\);) + ident(DataPreviewChange)operator(()ident(Self)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(ShowTreeViewLinesCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(with) ident(RegTV) reserved(do) reserved(begin) + ident(ShowLines) operator(:=) ident(ShowTreeViewLinesCB)operator(.)ident(Checked)operator(;) + ident(ShowButtons) operator(:=) ident(ShowLines)operator(;) + reserved(end)operator(;) + ident(StandardPreviewChange)operator(()ident(Sender)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(ShowListViewGridCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ValueList)operator(.)ident(GridLines) operator(:=) ident(ShowListViewGridCB)operator(.)ident(Checked)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(DefaultValueNameEChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(DefaultValueCaption) operator(:=) ident(DefaultValueNameE)operator(.)ident(Text)operator(;) + reserved(if) ident(Started) reserved(then) + ident(TreeWin)operator(.)ident(RegTVChange)operator(()ident(Self)operator(,) ident(RegTV)operator(.)ident(Selected)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(LoadPrefs)operator(;) +reserved(begin) + ident(PrefHost)operator(.)ident(Load)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(UseExtendedModelCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(WorkWin)operator(.)ident(MultiStringTypeRG)operator(.)ident(ItemIndex) operator(:=) ident(Integer)operator(()ident(UseExtendedModelCB)operator(.)ident(Checked)operator(\);) + ident(DataPreviewChange)operator(()ident(Sender)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(IntegrationPageShow)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(with) ident(TXRegistry)operator(.)ident(Create) reserved(do) + reserved(try) + ident(RootKey) operator(:=) ident(HKLM)operator(;) + ident(OpenKey)operator(()string<delimiter(')content(Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\pluto.exe)delimiter(')>operator(\);) + ident(RegisterAppCB)operator(.)ident(Checked) operator(:=) ident(SameFileName)operator(()ident(GetFileNew)operator(()ident(ReadString)operator(()string<delimiter(')delimiter(')>operator(\)\),) + ident(GetFileNew)operator(()ident(Application)operator(.)ident(ExeName)operator(\)\);) + reserved(finally) + ident(Free)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(GotoPlutoKeyBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(MainWin)operator(.)ident(GotoKey)operator(()string<delimiter(')content(HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\pluto.exe)delimiter(')>operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(FormShow)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(PrefHost)operator(.)ident(Load)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(KeysSingleClickCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(TreeWin)operator(.)ident(CheckRegTVHotTrack)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(ValuesSingleClickCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ValuesWin)operator(.)ident(CheckValueListHotTrack)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(QuotersEChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(QBegin)operator(,) ident(QEnd)operator(:) reserved(string)operator(;) +reserved(begin) + reserved(with) ident(QuotersE) reserved(do) reserved(begin) + reserved(if) ident(Text) operator(=) string<delimiter(')delimiter(')> reserved(then) + ident(QBegin) operator(:=) string<delimiter(')delimiter(')> + reserved(else) + ident(QBegin) operator(:=) ident(Text)operator([)integer(1)operator(];) + reserved(if) ident(Length)operator(()ident(Text)operator(\)) operator(<) integer(2) reserved(then) + ident(QEnd) operator(:=) ident(QBegin) + reserved(else) + ident(QEnd) operator(:=) ident(Text)operator([)integer(2)operator(];) + reserved(end)operator(;) + + reserved(if) operator(()ident(QBegin) operator(<>) ident(StringQuoterBegin)operator(\)) reserved(or) operator(()ident(QEnd) operator(<>) ident(StringQuoterEnd)operator(\)) reserved(then) reserved(begin) + ident(StringQuoterBegin) operator(:=) ident(QBegin)operator(;) + ident(StringQuoterEnd) operator(:=) ident(QEnd)operator(;) + ident(StringPreviewChange)operator(()ident(Self)operator(\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(SplashScreenCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) ident(Started) reserved(and) ident(Assigned)operator(()ident(SplashWin)operator(\)) reserved(then) + ident(SplashWin)operator(.)ident(SplashScreenCB)operator(.)ident(Checked) operator(:=) ident(SplashScreenCB)operator(.)ident(Checked)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TPrefWin)operator(.)ident(SaveBMouseMove)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Shift)operator(:) ident(TShiftState)operator(;) ident(X)operator(,) + ident(Y)operator(:) ident(Integer)operator(\);) +reserved(begin) + ident(Label2)operator(.)ident(Font)operator(.)ident(Color) operator(:=) ident(clBrightRed)operator(;) + ident(Application)operator(.)ident(ProcessMessages)operator(;) + ident(Sleep)operator(()integer(200)operator(\);) + ident(Label2)operator(.)ident(Font)operator(.)ident(Color) operator(:=) ident(clWhite)operator(;) +reserved(end)operator(;) + +reserved(end)operator(.) +reserved(unit) ident(RegScanner)operator(;) + +reserved(interface) + +reserved(uses) + ident(Windows)operator(,) ident(SysUtils)operator(,) ident(Dialogs)operator(,) ident(Classes)operator(,) + ident(YTools)operator(,) ident(YTypes)operator(,) ident(XReg)operator(,) ident(Clock)operator(;) + +reserved(type) + ident(TRegScanThread) operator(=) reserved(class)operator(;) + + ident(TRegScanKeyEvent) operator(=) reserved(procedure) operator(()ident(Sender)operator(:) ident(TRegScanThread)operator(;) reserved(const) ident(KeyName)operator(:) reserved(string)operator(;) ident(Key)operator(:) ident(HKEY)operator(;) ident(Info)operator(:) ident(TRegKeyInfo)operator(\)) reserved(of) reserved(object)operator(;) + ident(TRegScanValueEvent) operator(=) reserved(procedure) operator(()ident(Sender)operator(:) ident(TRegScanThread)operator(;) reserved(const) ident(ValueName)operator(:) reserved(string)operator(;) ident(Context)operator(:) ident(TRegContext)operator(\)) reserved(of) reserved(object)operator(;) + + ident(TRegScanTask) operator(=) reserved(record) + ident(Root)operator(:) reserved(string)operator(;) + ident(Key)operator(:) ident(HKEY)operator(;) + reserved(end)operator(;) + ident(TRegScanTasks) operator(=) reserved(array) reserved(of) ident(TRegScanTask)operator(;) + + ident(TRegScanThread) operator(=) reserved(class)operator(()ident(TThread)operator(\)) + directive(private) + ident(Keys)operator(,) ident(KeysOK)operator(,) ident(Values)operator(,) ident(ValuesOK)operator(:) ident(Integer)operator(;) + ident(DoScanValues)operator(:) ident(Boolean)operator(;) + ident(FOnKey)operator(:) ident(TRegScanKeyEvent)operator(;) + ident(FOnValue)operator(:) ident(TRegScanValueEvent)operator(;) + ident(FOnFaileKey)operator(:) ident(TRegScanKeyEvent)operator(;) + directive(protected) + reserved(procedure) ident(ScanKey)operator(()ident(Key)operator(:) ident(HKEY)operator(;) reserved(const) ident(KeyName)operator(:) reserved(string) operator(=) string<delimiter(')delimiter(')>operator(\);) directive(virtual)operator(;) + reserved(procedure) ident(ScanValues)operator(()ident(Key)operator(:) ident(HKEY)operator(;) ident(Info)operator(:) ident(TRegKeyInfo)operator(\);) directive(virtual)operator(;) + + directive(public) + ident(Path)operator(:) reserved(string)operator(;) + ident(CurrentTask)operator(:) ident(TRegScanTask)operator(;) + ident(Tasks)operator(:) ident(TRegScanTasks)operator(;) + reserved(destructor) ident(Destroy)operator(;) directive(override)operator(;) + reserved(procedure) ident(Execute)operator(;) directive(override)operator(;) + reserved(procedure) ident(ScanAll)operator(;) + reserved(function) ident(CurrentPath)operator(:) reserved(string)operator(;) + directive(published) + reserved(constructor) ident(CreateIt)operator(()ident(PriorityLevel)operator(:) ident(TThreadPriority)operator(;) + ident(DoScanValues)operator(:) ident(Boolean) operator(=) ident(True)operator(;) ident(Tasks)operator(:) ident(TRegScanTasks) operator(=) reserved(nil)operator(\);) + + reserved(property) ident(OnKey)operator(:) ident(TRegScanKeyEvent) directive(read) ident(FOnKey) directive(write) ident(FOnKey)operator(;) + reserved(property) ident(OnValue)operator(:) ident(TRegScanValueEvent) directive(read) ident(FOnValue) directive(write) ident(FOnValue)operator(;) + reserved(property) ident(OnFaileKey)operator(:) ident(TRegScanKeyEvent) directive(read) ident(FOnFaileKey) directive(write) ident(FOnFaileKey)operator(;) + reserved(end)operator(;) + +reserved(implementation) + +comment({ TRegScanThread }) + +reserved(constructor) ident(TRegScanThread)operator(.)ident(CreateIt)operator(()ident(PriorityLevel)operator(:) ident(TThreadPriority)operator(;) + ident(DoScanValues)operator(:) ident(Boolean) operator(=) ident(True)operator(;) ident(Tasks)operator(:) ident(TRegScanTasks) operator(=) reserved(nil)operator(\);) +reserved(begin) + reserved(inherited) ident(Create)operator(()ident(True)operator(\);) + ident(Priority) operator(:=) ident(PriorityLevel)operator(;) + ident(FreeOnTerminate) operator(:=) ident(False)operator(;) + ident(Self)operator(.)ident(DoScanValues) operator(:=) ident(DoScanValues)operator(;) + ident(Self)operator(.)ident(Tasks) operator(:=) ident(Tasks)operator(;) +reserved(end)operator(;) + +reserved(destructor) ident(TRegScanThread)operator(.)ident(Destroy)operator(;) +reserved(begin) + reserved(inherited)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TRegScanThread)operator(.)ident(ScanAll)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Keys) operator(:=) integer(0)operator(;) + ident(KeysOK) operator(:=) integer(0)operator(;) + ident(Values) operator(:=) integer(0)operator(;) + ident(ValuesOK) operator(:=) integer(0)operator(;) + + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(High)operator(()ident(Tasks)operator(\)) reserved(do) reserved(begin) + ident(CurrentTask) operator(:=) ident(Tasks)operator([)ident(i)operator(];) + reserved(with) ident(CurrentTask) reserved(do) reserved(begin) + ident(Inc)operator(()ident(Keys)operator(\);) + ident(ScanKey)operator(()ident(Key)operator(\);) + reserved(end)operator(;) + + reserved(if) ident(Terminated) reserved(then) ident(Break)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TRegScanThread)operator(.)ident(ScanValues)operator(()ident(Key)operator(:) ident(HKEY)operator(;) ident(Info)operator(:) ident(TRegKeyInfo)operator(\);) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) + ident(MaxLen)operator(,) ident(NameLen)operator(,) ident(Len)operator(,) ident(Typ)operator(:) ident(Cardinal)operator(;) + ident(p)operator(:) ident(PChar)operator(;) + ident(Buffer)operator(:) ident(TByteA)operator(;) + + reserved(procedure) ident(ScanValue)operator(()ident(ValueName)operator(:) reserved(string)operator(;) ident(Typ)operator(:) ident(TRegDataType)operator(;) ident(Data)operator(:) ident(TByteA)operator(\);) + reserved(begin) + reserved(if) ident(Assigned)operator(()ident(OnValue)operator(\)) reserved(then) + ident(OnValue)operator(()ident(Self)operator(,) ident(ValueName)operator(,) ident(RegContext)operator(()ident(Typ)operator(,) ident(Data)operator(\)\);) + ident(Inc)operator(()ident(ValuesOK)operator(\);) + reserved(end)operator(;) + +reserved(begin) + ident(MaxLen) operator(:=) ident(Info)operator(.)ident(MaxValueLen) operator(+) integer(1)operator(;) comment(//Include Nullbyte) + ident(SetLength)operator(()ident(Buffer)operator(,) ident(Info)operator(.)ident(MaxDataLen)operator(\);) + ident(GetMem)operator(()ident(p)operator(,) ident(MaxLen)operator(\);) + + ident(Inc)operator(()ident(Values)operator(,) ident(Info)operator(.)ident(NumValues)operator(\);) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(Info)operator(.)ident(NumValues)operator(-)integer(1) reserved(do) reserved(begin) + ident(NameLen) operator(:=) ident(MaxLen)operator(;) + ident(Len) operator(:=) ident(Info)operator(.)ident(MaxDataLen)operator(;) + reserved(if) ident(Success)operator(()ident(RegEnumValue)operator(()ident(Key)operator(,) ident(i)operator(,) ident(p)operator(,) ident(NameLen)operator(,) reserved(nil)operator(,) operator(@)ident(Typ)operator(,) ident(Pointer)operator(()ident(Buffer)operator(\),) + operator(@)ident(Len)operator(\)\)) reserved(then) + ident(ScanValue)operator(()ident(Copy)operator(()ident(p)operator(,) integer(0)operator(,) ident(NameLen)operator(\),) ident(Typ)operator(,) ident(Copy)operator(()ident(Buffer)operator(,) integer(0)operator(,) ident(Len)operator(\)\)) + reserved(else) + ident(Yield)operator(;) + reserved(end)operator(;) + ident(FreeMem)operator(()ident(p)operator(,) ident(MaxLen)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TRegScanThread)operator(.)ident(ScanKey)operator(()ident(Key)operator(:) ident(HKEY)operator(;) reserved(const) ident(KeyName)operator(:) reserved(string) operator(=) string<delimiter(')delimiter(')>operator(\);) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) + ident(NewHKEY)operator(:) ident(HKEY)operator(;) + ident(Info)operator(:) ident(TRegKeyInfo)operator(;) + ident(l)operator(,) ident(Len)operator(:) ident(DWORD)operator(;) + ident(p)operator(:) ident(PChar)operator(;) + ident(z)operator(:) ident(Integer)operator(;) +reserved(begin) + reserved(if) ident(Terminated) reserved(then) ident(Exit)operator(;) + + reserved(with) ident(Info) reserved(do) reserved(begin) + reserved(if) reserved(not) ident(Success)operator(()ident(RegQueryInfoKey)operator(()ident(Key)operator(,) reserved(nil)operator(,) reserved(nil)operator(,) reserved(nil)operator(,) operator(@)ident(NumSubKeys)operator(,) + operator(@)ident(MaxSubKeyLen)operator(,) reserved(nil)operator(,) operator(@)ident(NumValues)operator(,) operator(@)ident(MaxValueLen)operator(,) operator(@)ident(MaxDataLen)operator(,) + reserved(nil)operator(,) reserved(nil)operator(\)\)) reserved(then) + ident(Exit)operator(;) + + reserved(if) ident(Assigned)operator(()ident(OnKey)operator(\)) reserved(then) + ident(OnKey)operator(()ident(Self)operator(,) ident(KeyName)operator(,) ident(Key)operator(,) ident(Info)operator(\);) + reserved(if) ident(DoScanValues) reserved(and) operator(()ident(NumValues) operator(>) integer(0)operator(\)) reserved(then) + ident(ScanValues)operator(()ident(Key)operator(,) ident(Info)operator(\);) + + reserved(if) ident(Info)operator(.)ident(NumSubKeys) operator(>) integer(0) reserved(then) reserved(begin) + ident(Inc)operator(()ident(Keys)operator(,) ident(NumSubKeys)operator(\);) + + ident(Len) operator(:=) ident(MaxSubKeyLen) operator(+) integer(1)operator(;) + ident(GetMem)operator(()ident(p)operator(,) ident(Len)operator(\);) + + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(NumSubKeys)operator(-)integer(1) reserved(do) reserved(begin) + ident(l) operator(:=) ident(Len)operator(;) + ident(RegEnumKeyEx)operator(()ident(Key)operator(,) ident(i)operator(,) ident(p)operator(,) ident(l)operator(,) reserved(nil)operator(,) reserved(nil)operator(,) reserved(nil)operator(,) reserved(nil)operator(\);) + reserved(if) ident(Success)operator(()ident(RegOpenKey)operator(()ident(Key)operator(,) ident(p)operator(,) ident(NewHKEY)operator(\)\)) reserved(then) reserved(begin) + ident(z) operator(:=) ident(Length)operator(()ident(Path)operator(\);) + ident(Path) operator(:=) ident(Path) operator(+) char<delimiter(')content(\\)delimiter(')> operator(+) ident(p)operator(;) + ident(ScanKey)operator(()ident(NewHKEY)operator(,) ident(p)operator(\);) + ident(RegCloseKey)operator(()ident(NewHKEY)operator(\);) + ident(SetLength)operator(()ident(Path)operator(,) ident(z)operator(\);) + reserved(end) reserved(else) + reserved(if) ident(Assigned)operator(()ident(OnFaileKey)operator(\)) reserved(then) + ident(OnFaileKey)operator(()ident(Self)operator(,) ident(p)operator(,) ident(Key)operator(,) ident(Info)operator(\);) + + reserved(if) ident(Terminated) reserved(then) + ident(Break)operator(;) + reserved(end)operator(;) + ident(FreeMem)operator(()ident(p)operator(,) ident(Len)operator(\);) + reserved(end)operator(;) + reserved(end)operator(;) + + ident(Inc)operator(()ident(KeysOK)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TRegScanThread)operator(.)ident(Execute)operator(;) +reserved(var) + ident(Secs)operator(:) ident(Double)operator(;) +reserved(begin) + reserved(with) ident(TClock)operator(.)ident(Create) reserved(do) reserved(begin) + ident(ScanAll)operator(;) + ident(Secs) operator(:=) ident(SecondsPassed)operator(;) + ident(Free)operator(;) + reserved(end)operator(;) + + ident(WriteLn)operator(()string<delimiter(')content(finished.)delimiter(')>operator(\);) + ident(WriteLn)operator(() ident(Format)operator(()string<delimiter(')content(Keys: %6d counted (%3d failed\))delimiter(')>operator(,) operator([)ident(Keys)operator(,) ident(Keys) operator(-) ident(KeysOK)operator(]\)\);) + reserved(if) ident(DoScanValues) reserved(then) + ident(WriteLn)operator(()ident(Format)operator(()string<delimiter(')content(Values: %6d counted (%3d failed\))delimiter(')>operator(,) operator([)ident(Values)operator(,) ident(Values) operator(-) ident(ValuesOK)operator(]\)\);) + ident(WriteLn)operator(()string<delimiter(')content(t )delimiter(')> operator(+) ident(Format)operator(()string<delimiter(')content(%.2f)delimiter(')>operator(,) operator([)ident(Secs)operator(]\)) operator(+) string<delimiter(')content( seconds)delimiter(')>operator(\);) + reserved(if) ident(Secs) operator(>) integer(0) reserved(then) + ident(WriteLn)operator(()string<delimiter(')content(r )delimiter(')> operator(+) ident(Format)operator(()string<delimiter(')content(%.0f)delimiter(')>operator(,) operator([)ident(Keys) operator(/) ident(Secs)operator(]\)) operator(+) string<delimiter(')content( k/s)delimiter(')>operator(\);) +reserved(end)operator(;) + +reserved(function) ident(TRegScanThread)operator(.)ident(CurrentPath)operator(:) reserved(string)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(CurrentTask)operator(.)ident(Root) operator(+) ident(Path)operator(;) +reserved(end)operator(;) + +reserved(end)operator(.) +reserved(unit) ident(RegTV)operator(;) + +reserved(interface) + +reserved(uses) + ident(Windows)operator(,) ident(Messages)operator(,) ident(SysUtils)operator(,) ident(Classes)operator(,) ident(Graphics)operator(,) ident(Controls)operator(,) ident(Forms)operator(,) ident(Dialogs)operator(,) + ident(ComCtrls)operator(;) + +reserved(type) + ident(TRegTV) operator(=) reserved(class)operator(()ident(TTreeView)operator(\)) + directive(private) + comment({ Private-Deklarationen }) + directive(protected) + comment({ Protected-Deklarationen }) + directive(public) + comment({ Public-Deklarationen }) + directive(published) + comment({ Published-Deklarationen }) + reserved(end)operator(;) + +reserved(procedure) ident(Register)operator(;) + +reserved(implementation) + +reserved(procedure) ident(Register)operator(;) +reserved(begin) + ident(RegisterComponents)operator(()string<delimiter(')content(pluto)delimiter(')>operator(,) operator([)ident(TRegTV)operator(]\);) +reserved(end)operator(;) + +reserved(end)operator(.) +reserved(unit) ident(Sisyphus)operator(;) + +reserved(interface) + +reserved(uses) + ident(Windows)operator(,) ident(Classes)operator(,) ident(SysUtils)operator(,) ident(XReg)operator(,) ident(YTools)operator(,) ident(YTypes)operator(,) ident(Clock)operator(;) + +reserved(type) + ident(TSpyValue) operator(=) reserved(class) + ident(Name)operator(:) reserved(string)operator(;) + ident(Next)operator(:) ident(TSpyValue)operator(;) + comment(//DIC: TByteA;) + ident(Typ)operator(:) ident(TXRegDataType)operator(;) + ident(Data)operator(:) ident(TByteA)operator(;) + reserved(constructor) ident(Create)operator(()ident(AName)operator(:) reserved(string)operator(\);) + reserved(end)operator(;) + + ident(TSpyKey) operator(=) reserved(class) + directive(public) + ident(Parent)operator(:) ident(TSpyKey)operator(;) + ident(Name)operator(:) reserved(string)operator(;) + ident(Next)operator(:) ident(TSpyKey)operator(;) + ident(Keys)operator(:) ident(TSpyKey)operator(;) + ident(Values)operator(:) ident(TSpyValue)operator(;) + reserved(procedure) ident(Spy)operator(()ident(AHKEY)operator(:) ident(HKEY)operator(\);) + reserved(function) ident(Path)operator(:) reserved(string)operator(;) + reserved(constructor) ident(Create)operator(()ident(AParent)operator(:) ident(TSpyKey)operator(;) ident(AName)operator(:) reserved(string)operator(\);) + reserved(destructor) ident(Destroy)operator(;) directive(override)operator(;) + reserved(end)operator(;) + +reserved(var) + ident(Reg)operator(:) ident(TXRegistry)operator(;) + ident(HKLMSpyKey)operator(,) ident(HKUSpyKey)operator(:) ident(TSpyKey)operator(;) + ident(Started)operator(:) ident(Boolean) operator(=) ident(False)operator(;) + +reserved(implementation) + +reserved(uses) + ident(Plutomain)operator(;) + +reserved(procedure) ident(AddChange)operator(()ident(M)operator(:) reserved(string)operator(\);) +reserved(begin) + ident(Yield)operator(;) + comment(//AddHint(M\);) +reserved(end)operator(;) + +comment({ TSpyValue }) + +reserved(constructor) ident(TSpyValue)operator(.)ident(Create)operator(()ident(AName)operator(:) reserved(string)operator(\);) +reserved(begin) + ident(Name) operator(:=) ident(AName)operator(;) + ident(Next) operator(:=) reserved(nil)operator(;) +reserved(end)operator(;) + +comment({ TSpyKey }) + +reserved(constructor) ident(TSpyKey)operator(.)ident(Create)operator(()ident(AParent)operator(:) ident(TSpyKey)operator(;) ident(AName)operator(:) reserved(string)operator(\);) +reserved(begin) + ident(Name) operator(:=) ident(AName)operator(;) + ident(Parent) operator(:=) ident(AParent)operator(;) + + ident(Next) operator(:=) reserved(nil)operator(;) + ident(Keys) operator(:=) reserved(nil)operator(;) + ident(Values) operator(:=) reserved(nil)operator(;) +reserved(end)operator(;) + +reserved(destructor) ident(TSpyKey)operator(.)ident(Destroy)operator(;) +reserved(var) + ident(Value)operator(,) ident(NextValue)operator(:) ident(TSpyValue)operator(;) + ident(Key)operator(,) ident(NextKey)operator(:) ident(TSpyKey)operator(;) +reserved(begin) + ident(Value) operator(:=) ident(Values)operator(;) + reserved(while) ident(Value) operator(<>) reserved(nil) reserved(do) reserved(begin) + ident(NextValue) operator(:=) ident(Value)operator(.)ident(Next)operator(;) + ident(Value)operator(.)ident(Free)operator(;) + ident(Value) operator(:=) ident(NextValue)operator(;) + reserved(end)operator(;) + + ident(Key) operator(:=) ident(Keys)operator(;) + reserved(while) ident(Key) operator(<>) reserved(nil) reserved(do) reserved(begin) + ident(NextKey) operator(:=) ident(Key)operator(.)ident(Next)operator(;) + ident(Key)operator(.)ident(Free)operator(;) + ident(Key) operator(:=) ident(NextKey)operator(;) + reserved(end)operator(;) + + reserved(inherited)operator(;) +reserved(end)operator(;) + +reserved(function) ident(TSpyKey)operator(.)ident(Path)operator(:) reserved(string)operator(;) +reserved(begin) + reserved(if) ident(Assigned)operator(()ident(Parent)operator(\)) reserved(then) + ident(Result) operator(:=) ident(Parent)operator(.)ident(Path) operator(+) char<delimiter(')content(\\)delimiter(')> + reserved(else) + ident(Result) operator(:=) string<delimiter(')content(Reg: )delimiter(')>operator(;) + + ident(Result) operator(:=) ident(Result) operator(+) ident(Name)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TSpyKey)operator(.)ident(Spy)operator(()ident(AHKEY)operator(:) ident(HKEY)operator(\);) +reserved(var) + ident(SL)operator(:) ident(TStringList)operator(;) + + reserved(procedure) ident(CompareValues)operator(;) + reserved(var) + ident(i)operator(:) ident(Integer)operator(;) + ident(Value)operator(,) ident(LastValue)operator(,) ident(NewValue)operator(,) ident(SearchValue)operator(:) ident(TSpyValue)operator(;) + reserved(begin) + comment(//OK, this part is a little bit complicate. So I will comment very much.) + comment(//First, two terms are important:) + comment(//<REAL> means the list of values that will be read from the registry now:) + ident(Reg)operator(.)ident(GetValueNames)operator(()ident(SL)operator(\);) + comment(//So <REAL> is TStringList.) + + comment(//<CURRENT> means the image that was saved before.) + comment(//Here, it is a linear list of TSpyValue objects. That means that you can) + comment(//only get X.Next and not X.Prev! However, I use "X.Prev" to simplify) + comment(//some comments.) + + comment(//!!! Comparing means: Make <CURRENT> fit <REAL> !!!) + + comment(//If <CURRENT> wasn't saved before, it is just empty.) + + comment(//!!! There is no difference in comparing and saving in this method !!!) + + comment(//Building means: Comparing with an empty image.) + + comment(//We go through <REAL> and make <CURRENT> fit it) + + comment(//The following rules are important:) + comment(//Value = "The currently interesting value.) + comment(//LastValue = "The value with X.Next = Value" = "Value.Pref") + + ident(LastValue) operator(:=) reserved(nil)operator(;) comment(// := "Values.Prev") + ident(Value) operator(:=) ident(Values)operator(;) comment(// := "LastValue.Next") + + comment(//Now compare step by step) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(SL)operator(.)ident(Count)operator(-)integer(1) reserved(do) reserved(begin) + reserved(if) ident(Assigned)operator(()ident(Value)operator(\)) reserved(and) operator(()ident(SL)operator([)ident(i)operator(]) operator(=) ident(Value)operator(.)ident(Name)operator(\)) reserved(then) reserved(begin) + comment(//cV= Normally (0.9999\) everything's the same) + ident(LastValue) operator(:=) ident(Value)operator(;) + ident(Value) operator(:=) ident(Value)operator(.)ident(Next)operator(;) + reserved(end) reserved(else) reserved(begin) comment(//Something's different? Yes, the IMPORTANT rest (0.0001\)\)) + comment(//Because the list finally must exactly fit SL, the "SL[i] value" hast) + comment(//to be inserted right here. But first let's look...) + + comment(//Maybe it was just moved? So search for it...) + ident(NewValue) operator(:=) reserved(nil)operator(;) + reserved(if) ident(Assigned)operator(()ident(Value)operator(\)) reserved(then) reserved(begin) + ident(SearchValue) operator(:=) ident(Value)operator(;) + reserved(while) ident(Assigned)operator(()ident(SearchValue)operator(.)ident(Next)operator(\)) reserved(do) + reserved(if) operator(()ident(SearchValue)operator(.)ident(Next)operator(.)ident(Name) operator(=) ident(SL)operator([)ident(i)operator(]\)) reserved(then) reserved(begin) + comment(//cV\\) + ident(NewValue) operator(:=) ident(SearchValue)operator(.)ident(Next)operator(;) + ident(AddChange)operator(()string<delimiter(')content(cV\\ )delimiter(')> operator(+) ident(Path)operator(\);) + ident(SearchValue)operator(.)ident(Next) operator(:=) ident(SearchValue)operator(.)ident(Next)operator(.)ident(Next)operator(;) + ident(Break)operator(;) reserved(end)operator(;) + reserved(end)operator(;) + + reserved(if) reserved(not) ident(Assigned)operator(()ident(NewValue)operator(\)) reserved(then) reserved(begin) + comment(//cV+ No, not found! So it is new...) + ident(NewValue) operator(:=) ident(TSpyValue)operator(.)ident(Create)operator(()ident(SL)operator([)ident(i)operator(]\);) + ident(AddChange)operator(()string<delimiter(')content(cV+ )delimiter(')> operator(+) ident(Path) operator(+) string<delimiter(')content(\\\\)delimiter(')> operator(+) ident(NewValue)operator(.)ident(Name)operator(\);) + reserved(with) ident(NewValue) reserved(do) reserved(begin) + ident(Typ) operator(:=) ident(Reg)operator(.)ident(GetDataType)operator(()ident(SL)operator([)ident(i)operator(]\);) + ident(Data) operator(:=) ident(Reg)operator(.)ident(ReadBin)operator(()ident(SL)operator([)ident(i)operator(]\);) + reserved(end)operator(;) + reserved(end)operator(;) + + comment(//The new object now must be placed after the last value) + reserved(if) ident(Assigned)operator(()ident(LastValue)operator(\)) reserved(then) reserved(begin) + ident(LastValue)operator(.)ident(Next) operator(:=) ident(NewValue)operator(;) + reserved(end) reserved(else) reserved(begin) + comment(//If it's the first value, we don't have LastValue defined) + comment(//So we have to set the "Root" to it) + ident(Values) operator(:=) ident(NewValue)operator(;) + reserved(end)operator(;) + comment(//Now the rest of <CURRENT> has to be placed after the new value) + ident(NewValue)operator(.)ident(Next) operator(:=) ident(Value)operator(;) + comment(//And LastValue also has to refreshed: It is "Value.Pref" = NewValue!) + ident(LastValue) operator(:=) ident(NewValue)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + comment(//Because the whole <CURRENT> before Value is exactly <REAL>, the rest) + comment(//(if there is one\) must have been deleted!) + + comment(//So first let's ensure that <CURRENT> ends here:) + reserved(if) ident(Assigned)operator(()ident(LastValue)operator(\)) reserved(then) reserved(begin) + ident(LastValue)operator(.)ident(Next) operator(:=) reserved(nil)operator(;) + reserved(end) reserved(else) reserved(begin) + comment(//Another time: <CURRENT> is empty now, so set Values instead) + ident(Values) operator(:=) reserved(nil)operator(;) + reserved(end)operator(;) + + comment(//Now, the first value that maybe was "cut" off is Value:) + reserved(while) ident(Assigned)operator(()ident(Value)operator(\)) reserved(do) reserved(begin) + comment(//cV- So, here really something HAS been deleted) + ident(LastValue) operator(:=) ident(Value)operator(;) + ident(Value) operator(:=) ident(Value)operator(.)ident(Next)operator(;) + ident(AddChange)operator(()string<delimiter(')content(cV- )delimiter(')> operator(+) ident(Path) operator(+) string<delimiter(')content(\\\\)delimiter(')> operator(+) ident(LastValue)operator(.)ident(Name)operator(\);) + ident(LastValue)operator(.)ident(Free)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + reserved(procedure) ident(CompareData)operator(;) + reserved(var) + ident(Value)operator(:) ident(TSpyValue)operator(;) + ident(Typ)operator(:) ident(TXRegDataType)operator(;) + ident(Data)operator(:) ident(TByteA)operator(;) + reserved(begin) + comment(//So, finally <CURRENT> = <REAL>. That means we now can compare the data:) + ident(Value) operator(:=) ident(Values)operator(;) + reserved(while) ident(Assigned)operator(()ident(Value)operator(\)) reserved(do) reserved(begin) + ident(Typ) operator(:=) ident(Reg)operator(.)ident(GetDataType)operator(()ident(Value)operator(.)ident(Name)operator(\);) + ident(Data) operator(:=) ident(Reg)operator(.)ident(ReadBin)operator(()ident(Value)operator(.)ident(Name)operator(\);) + reserved(if) ident(Typ) operator(<>) ident(Value)operator(.)ident(Typ) reserved(then) reserved(begin) + comment(//cT#) + ident(AddChange)operator(()string<delimiter(')content(cT# )delimiter(')> operator(+) ident(Path) operator(+) string<delimiter(')content(\\\\)delimiter(')> operator(+) ident(Value)operator(.)ident(Name)operator(\);) + ident(Value)operator(.)ident(Typ) operator(:=) ident(Typ)operator(;) + reserved(end)operator(;) + reserved(if) reserved(not) ident(SameByteA)operator(()ident(Data)operator(,) ident(Value)operator(.)ident(Data)operator(\)) reserved(then) reserved(begin) + comment(//cD#) + ident(AddChange)operator(()string<delimiter(')content(cD# )delimiter(')> operator(+) ident(Path) operator(+) string<delimiter(')content(\\\\)delimiter(')> operator(+) ident(Value)operator(.)ident(Name)operator(\);) + ident(Value)operator(.)ident(Data) operator(:=) ident(Data)operator(;) + reserved(end)operator(;) + + ident(Value) operator(:=) ident(Value)operator(.)ident(Next)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + reserved(procedure) ident(CompareKeys)operator(;) + reserved(var) + ident(i)operator(:) ident(Integer)operator(;) + ident(Key)operator(,) ident(LastKey)operator(,) ident(NewKey)operator(,) ident(SearchKey)operator(:) ident(TSpyKey)operator(;) + ident(NewHKEY)operator(:) ident(HKEY)operator(;) + reserved(begin) + comment(//OK, this part is a little bit complicate. So I will comment very much.) + comment(//First, two terms are important:) + comment(//<REAL> means the list of keys that will be read from the registry now:) + ident(Reg)operator(.)ident(GetKeyNames)operator(()ident(SL)operator(\);) + comment(//So <REAL> is TStringList.) + + comment(//<CURRENT> means the image that was saved before.) + comment(//Here, it is a linear list of TSpyKey objects. That means that you can) + comment(//only get X.Next and not X.Prev! However, I use "X.Prev" to simplify) + comment(//some comments.) + + comment(//!!! Comparing means: Make <CURRENT> fit <REAL> !!!) + + comment(//If <CURRENT> wasn't saved before, it is just empty.) + + comment(//!!! There is no difference in comparing and saving in this method !!!) + + comment(//Building means: Comparing with an empty image.) + + comment(//We go through <REAL> and make <CURRENT> fit it) + + comment(//The following rules are important:) + comment(//Key = "The currently interesting key.) + comment(//LastKey = "The key with X.Next = Key" = "Key.Pref") + + ident(LastKey) operator(:=) reserved(nil)operator(;) comment(// := "Keys.Prev") + ident(Key) operator(:=) ident(Keys)operator(;) comment(// := "LastKey.Next") + + comment(//Now compare step by step) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(SL)operator(.)ident(Count)operator(-)integer(1) reserved(do) reserved(begin) + reserved(if) ident(Assigned)operator(()ident(Key)operator(\)) reserved(and) operator(()ident(SL)operator([)ident(i)operator(]) operator(=) ident(Key)operator(.)ident(Name)operator(\)) reserved(then) reserved(begin) + comment(//cK= Normally (0.9999\) everything's the same) + ident(RegOpenKey)operator(()ident(AHKEY)operator(,) ident(PChar)operator(()ident(SL)operator([)ident(i)operator(]\),) ident(NewHKEY)operator(\);) + ident(Key)operator(.)ident(Spy)operator(()ident(NewHKEY)operator(\);) + ident(LastKey) operator(:=) ident(Key)operator(;) + ident(Key) operator(:=) ident(Key)operator(.)ident(Next)operator(;) + reserved(end) reserved(else) reserved(begin) comment(//Something's different? Yes, the IMPORTANT rest (0.0001\)\)) + comment(//Because the list finally must exactly fit SL, the "SL[i] key" hast) + comment(//to be inserted right here. But first let's look...) + + comment(//Maybe it was just moved? So search for it...) + ident(NewKey) operator(:=) reserved(nil)operator(;) + reserved(if) ident(Assigned)operator(()ident(Key)operator(\)) reserved(then) reserved(begin) + ident(SearchKey) operator(:=) ident(Key)operator(;) + reserved(while) ident(Assigned)operator(()ident(SearchKey)operator(.)ident(Next)operator(\)) reserved(do) + reserved(if) operator(()ident(SearchKey)operator(.)ident(Next)operator(.)ident(Name) operator(=) ident(SL)operator([)ident(i)operator(]\)) reserved(then) reserved(begin) + comment(//cK\\) + ident(NewKey) operator(:=) ident(SearchKey)operator(.)ident(Next)operator(;) + ident(AddChange)operator(()string<delimiter(')content(cK\\ )delimiter(')> operator(+) ident(Path)operator(\);) + ident(SearchKey)operator(.)ident(Next) operator(:=) ident(SearchKey)operator(.)ident(Next)operator(.)ident(Next)operator(;) + ident(Break)operator(;) reserved(end)operator(;) + reserved(end)operator(;) + + reserved(if) reserved(not) ident(Assigned)operator(()ident(NewKey)operator(\)) reserved(then) reserved(begin) + comment(//cK+ No, not found! So it is new...) + ident(NewKey) operator(:=) ident(TSpyKey)operator(.)ident(Create)operator(()ident(Self)operator(,) ident(SL)operator([)ident(i)operator(]\);) + ident(AddChange)operator(()string<delimiter(')content(cK+ )delimiter(')> operator(+) ident(Path) operator(+) char<delimiter(')content(\\)delimiter(')> operator(+) ident(NewKey)operator(.)ident(Name)operator(\);) + + ident(RegOpenKey)operator(()ident(AHKEY)operator(,) ident(PChar)operator(()ident(SL)operator([)ident(i)operator(]\),) ident(NewHKEY)operator(\);) + ident(NewKey)operator(.)ident(Spy)operator(()ident(NewHKEY)operator(\);) + reserved(end)operator(;) + + comment(//The new object now must be placed after the last key) + reserved(if) ident(Assigned)operator(()ident(LastKey)operator(\)) reserved(then) reserved(begin) + ident(LastKey)operator(.)ident(Next) operator(:=) ident(NewKey)operator(;) + reserved(end) reserved(else) reserved(begin) + comment(//If it's the first key, we don't have LastKey defined) + comment(//So we have to set the "Root" to it) + ident(Keys) operator(:=) ident(NewKey)operator(;) + reserved(end)operator(;) + comment(//Now the rest of <CURRENT> has to be placed after the new key) + ident(NewKey)operator(.)ident(Next) operator(:=) ident(Key)operator(;) + comment(//And LastKey also has to refreshed: It is "Key.Pref" = NewKey!) + ident(LastKey) operator(:=) ident(NewKey)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + comment(//Because the whole <CURRENT> before Key is exactly <REAL>, the rest) + comment(//(if there is one\) must have been deleted!) + + comment(//So first let's ensure that <CURRENT> ends here:) + reserved(if) ident(Assigned)operator(()ident(LastKey)operator(\)) reserved(then) reserved(begin) + ident(LastKey)operator(.)ident(Next) operator(:=) reserved(nil)operator(;) + reserved(end) reserved(else) reserved(begin) + comment(//Another time: <CURRENT> is empty now, so set Keys instead) + ident(Keys) operator(:=) reserved(nil)operator(;) + reserved(end)operator(;) + + comment(//Now, the first key that maybe was "cut" off is Key:) + reserved(while) ident(Assigned)operator(()ident(Key)operator(\)) reserved(do) reserved(begin) + comment(//cV- So, here really something HAS been deleted) + ident(LastKey) operator(:=) ident(Key)operator(;) + ident(Key) operator(:=) ident(Key)operator(.)ident(Next)operator(;) + ident(AddChange)operator(()string<delimiter(')content(cK- )delimiter(')> operator(+) ident(Path) operator(+) char<delimiter(')content(\\)delimiter(')> operator(+) ident(LastKey)operator(.)ident(Name)operator(\);) + ident(LastKey)operator(.)ident(Free)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + +reserved(begin) + ident(SL) operator(:=) ident(TStringList)operator(.)ident(Create)operator(;) + + reserved(try) + ident(Reg)operator(.)ident(CurrentKey) operator(:=) ident(AHKEY)operator(;) + + ident(CompareValues)operator(;) + + ident(CompareData)operator(;) + + ident(CompareKeys)operator(;) + + reserved(finally) + ident(RegCloseKey)operator(()ident(AHKEY)operator(\);) + reserved(end)operator(;) + + ident(SL)operator(.)ident(Free)operator(;) +reserved(end)operator(;) + +reserved(initialization) + ident(Reg) operator(:=) ident(TXRegistry)operator(.)ident(Create)operator(;) + ident(HKLMSpyKey) operator(:=) ident(TSpyKey)operator(.)ident(Create)operator(()reserved(nil)operator(,) string<delimiter(')content(HKEY_LOCAL_MACHINE)delimiter(')>operator(\);) + ident(HKUSpyKey) operator(:=) ident(TSpyKey)operator(.)ident(Create)operator(()reserved(nil)operator(,) string<delimiter(')content(HKEY_USERS)delimiter(')>operator(\);) + +reserved(finalization) + ident(Reg)operator(.)ident(Free)operator(;) + ident(HKLMSpyKey)operator(.)ident(Free)operator(;) + ident(HKUSpyKey)operator(.)ident(Free)operator(;) + +reserved(end)operator(.) +reserved(unit) ident(SisyphusTH)operator(;) + +reserved(interface) + +reserved(uses) + ident(Windows)operator(,) ident(Classes)operator(,) ident(StdCtrls)operator(,) ident(Dialogs)operator(,) ident(SysUtils)operator(,) ident(XReg)operator(,) ident(YTools)operator(,) ident(YTypes)operator(,) ident(Clock)operator(,) + ident(ComCtrls)operator(,) ident(PlutoConst)operator(,) ident(UniKey)operator(,) ident(CompEx)operator(;) + +reserved(const) + ident(SisyVersion) operator(=) string<delimiter(')content(1.2 b3)delimiter(')>operator(;) + ident(StatusPoints) operator(=) integer(25)operator(;) + +reserved(type) + ident(TSisyChangeType) operator(=) operator(()ident(cNone)operator(,) ident(cError)operator(,) + ident(cKeyPlus)operator(,) ident(cKeyMinus)operator(,) + ident(cValuePlus)operator(,) ident(cValueMinus)operator(,) + ident(cContextChange)operator(\);) + +reserved(const) + ident(SisyChangeStrings)operator(:) reserved(array)operator([)ident(TSisyChangeType)operator(]) reserved(of) reserved(string) operator(=) + operator(()char<delimiter(')content(?)delimiter(')>operator(,) string<delimiter(')content(Error)delimiter(')>operator(,) + string<delimiter(')content(cK+)delimiter(')>operator(,) string<delimiter(')content(cK-)delimiter(')>operator(,) + string<delimiter(')content(cV+)delimiter(')>operator(,) string<delimiter(')content(cV-)delimiter(')>operator(,) + string<delimiter(')content(cC)delimiter(')>operator(\);) + +reserved(type) + ident(TSpyValue) operator(=) reserved(class) + ident(Name)operator(:) reserved(string)operator(;) + ident(Next)operator(:) ident(TSpyValue)operator(;) + ident(Context)operator(:) ident(TRegContext)operator(;) + reserved(constructor) ident(Create)operator(()reserved(const) ident(Name)operator(:) reserved(string)operator(;) ident(Context)operator(:) ident(TRegContext)operator(\);) + reserved(end)operator(;) + + ident(TSisyThread) operator(=) reserved(class)operator(;) + + ident(TSpyKey) operator(=) reserved(class) + directive(public) + ident(Parent)operator(:) ident(TSpyKey)operator(;) + ident(Name)operator(:) reserved(string)operator(;) + ident(Next)operator(:) ident(TSpyKey)operator(;) + ident(Keys)operator(:) ident(TSpyKey)operator(;) + ident(Values)operator(:) ident(TSpyValue)operator(;) + reserved(procedure) ident(Spy)operator(()ident(AHKEY)operator(:) ident(HKEY)operator(;) ident(Sisy)operator(:) ident(TSisyThread)operator(\);) + reserved(function) ident(Path)operator(:) reserved(string)operator(;) + reserved(constructor) ident(Create)operator(()ident(AParent)operator(:) ident(TSpyKey)operator(;) ident(AName)operator(:) reserved(string)operator(\);) + reserved(destructor) ident(Destroy)operator(;) directive(override)operator(;) + reserved(end)operator(;) + + ident(TSisyChange) operator(=) reserved(class) + directive(public) + ident(Typ)operator(:) ident(TSisyChangeType)operator(;) + ident(Path)operator(:) reserved(string)operator(;) + ident(Old)operator(,) ident(New)operator(:) ident(TRegContext)operator(;) + reserved(constructor) ident(Create)operator(()ident(ATyp)operator(:) ident(TSisyChangeType)operator(;) reserved(const) ident(APath)operator(:) reserved(string)operator(;) + ident(AOldContext)operator(:) ident(TRegContext)operator(;) ident(ANewContext)operator(:) ident(TRegContext)operator(\);) + reserved(procedure) ident(ReportToPluto)operator(;) + reserved(end)operator(;) + + ident(TSisyChangeEvent) operator(=) reserved(procedure) operator(()ident(Sender)operator(:) ident(TSisyThread)operator(;) ident(Change)operator(:) ident(TSisyChange)operator(\)) reserved(of) reserved(object)operator(;) + ident(TSisyThread) operator(=) reserved(class)operator(()ident(TThread)operator(\)) + directive(private) + ident(Reg)operator(:) ident(TXRegistry)operator(;) + ident(Key)operator(:) ident(TSpyKey)operator(;) + ident(KeyHKEY)operator(:) ident(HKEY)operator(;) + ident(CurrentChange)operator(:) ident(TSisyChange)operator(;) + ident(FOnChange)operator(:) ident(TSisyChangeEvent)operator(;) + ident(FOnSpecialChanges)operator(:) reserved(array)operator([)ident(TSisyChangeType)operator(]) reserved(of) ident(TSisyChangeEvent)operator(;) + reserved(procedure) ident(FreeKey)operator(;) + reserved(procedure) ident(IncKeyCount)operator(;) + reserved(procedure) ident(IncKeyIndex)operator(;) + reserved(function) ident(GetSpecialChange)operator(()ident(ChangeType)operator(:) ident(TSisyChangeType)operator(\):) ident(TSisyChangeEvent)operator(;) + reserved(procedure) ident(SetSpecialChange)operator(()ident(ChangeType)operator(:) ident(TSisyChangeType)operator(;) + reserved(const) ident(Value)operator(:) ident(TSisyChangeEvent)operator(\);) + directive(protected) + reserved(procedure) ident(AddValueChange)operator(()ident(Typ)operator(:) ident(TSisyChangeType)operator(;) reserved(const) ident(Path)operator(:) reserved(string)operator(;) + ident(Old)operator(,) ident(New)operator(:) ident(TRegContext)operator(\);) + reserved(procedure) ident(AddKeyChange)operator(()ident(Typ)operator(:) ident(TSisyChangeType)operator(;) reserved(const) ident(Path)operator(:) reserved(string)operator(\);) + reserved(procedure) ident(Execute)operator(;) directive(override)operator(;) + reserved(procedure) ident(ShowInfo)operator(;) + reserved(procedure) ident(NotifyChange)operator(;) + reserved(procedure) ident(ReportCurrentChange)operator(;) + directive(public) + ident(CurrentSpyKey)operator(:) ident(TSpyKey)operator(;) + ident(StatusLabel)operator(:) ident(TLabel)operator(;) + ident(Name)operator(:) reserved(string)operator(;) + ident(Started)operator(:) ident(Boolean)operator(;) + ident(DoReport)operator(:) ident(Boolean)operator(;) + ident(SecsPerRound)operator(:) ident(Double)operator(;) + ident(InfoForShow)operator(:) reserved(string)operator(;) + ident(OnStarted)operator(:) ident(TNotifyEvent)operator(;) + ident(KeyCount)operator(:) ident(Integer)operator(;) + ident(PrevKeyCount)operator(:) ident(Integer)operator(;) + ident(KeyIndex)operator(:) ident(Integer)operator(;) + ident(TheClock)operator(:) ident(TClock)operator(;) + ident(Uni)operator(:) ident(TUniKey)operator(;) + ident(MaxValueCountToScan)operator(,) ident(MaxKeyCountToScan)operator(,) ident(MaxDataLenToScan)operator(:) ident(Cardinal)operator(;) + reserved(constructor) ident(CreateIt)operator(()reserved(const) ident(AName)operator(,) ident(AKeyName)operator(:) reserved(string)operator(;) ident(AHKEY)operator(:) ident(HKEY)operator(;) + ident(ALabel)operator(:) ident(TLabel)operator(;) ident(AUniKey)operator(:) ident(TUniKey)operator(\);) + reserved(destructor) ident(Destroy)operator(;) directive(override)operator(;) + + reserved(property) ident(OnChange)operator(:) ident(TSisyChangeEvent) directive(read) ident(FOnChange) directive(write) ident(FOnChange)operator(;) + reserved(property) ident(OnSpecialChange)operator([)ident(ChangeType)operator(:) ident(TSisyChangeType)operator(]:) ident(TSisyChangeEvent) + directive(read) ident(GetSpecialChange) directive(write) ident(SetSpecialChange)operator(;) + reserved(end)operator(;) + + ident(TSisyList) operator(=) reserved(class)operator(()ident(TList)operator(\)) + directive(protected) + reserved(function) ident(GetSisy)operator(()ident(Index)operator(:) ident(Integer)operator(\):) ident(TSisyThread)operator(;) + reserved(procedure) ident(PutSisy)operator(()ident(Index)operator(:) ident(Integer)operator(;) ident(Sisy)operator(:) ident(TSisyThread)operator(\);) + directive(public) + reserved(procedure) ident(Suspend)operator(;) + reserved(procedure) ident(Resume)operator(;) + reserved(property) ident(Items)operator([)ident(Index)operator(:) ident(Integer)operator(]:) ident(TSisyThread) directive(read) ident(GetSisy) directive(write) ident(PutSisy)operator(;) ident(default)operator(;) + reserved(end)operator(;) + +reserved(procedure) ident(SetSisyChangeState)operator(()ident(Node)operator(:) ident(TTreeNode)operator(;) ident(Active)operator(:) ident(Boolean)operator(\);) +reserved(function) ident(SisyChangeActivated)operator(()ident(Node)operator(:) ident(TTreeNode)operator(\):) ident(Boolean)operator(;) + +reserved(var) + ident(SisyFilter)operator(:) ident(TStringList)operator(;) + +reserved(implementation) + +reserved(uses) ident(plutomain)operator(,) ident(workU)operator(,) ident(ValuesU)operator(;) + +reserved(procedure) ident(SetSisyChangeState)operator(()ident(Node)operator(:) ident(TTreeNode)operator(;) ident(Active)operator(:) ident(Boolean)operator(\);) +reserved(begin) + ident(Node)operator(.)ident(Data) operator(:=) ident(Pointer)operator(()reserved(not) ident(Active)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(SisyChangeActivated)operator(()ident(Node)operator(:) ident(TTreeNode)operator(\):) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(Node)operator(.)ident(Data) operator(=) ident(Pointer)operator(()ident(False)operator(\);) +reserved(end)operator(;) + +comment({ TSisyThread }) + +reserved(constructor) ident(TSisyThread)operator(.)ident(CreateIt)operator(()reserved(const) ident(AName)operator(,) ident(AKeyName)operator(:) reserved(string)operator(;) + ident(AHKEY)operator(:) ident(HKEY)operator(;) ident(ALabel)operator(:) ident(TLabel)operator(;) ident(AUniKey)operator(:) ident(TUniKey)operator(\);) +reserved(begin) + reserved(inherited) ident(Create)operator(()ident(True)operator(\);) comment(// Create thread suspended) + + ident(Started) operator(:=) ident(False)operator(;) + ident(DoReport) operator(:=) ident(True)operator(;) + ident(KeyCount) operator(:=) integer(0)operator(;) + ident(FreeOnTerminate) operator(:=) ident(False)operator(;) comment(// Thread frees itself not when terminated) + + ident(KeyHKEY) operator(:=) ident(AHKEY)operator(;) + ident(Name) operator(:=) ident(AName)operator(;) + ident(StatusLabel) operator(:=) ident(ALabel)operator(;) + ident(StatusLabel)operator(.)ident(Caption) operator(:=) string<delimiter(')content(Zzzzzzz...)delimiter(')>operator(;) + + ident(Reg) operator(:=) ident(TXRegistry)operator(.)ident(Create)operator(;) + ident(TheClock) operator(:=) ident(TClock)operator(.)ident(Create)operator(;) + + ident(Uni) operator(:=) ident(AUniKey)operator(.)ident(GetKey)operator(()ident(Name)operator(\);) + ident(Priority) operator(:=) ident(TThreadPriority)operator(()ident(Uni)operator(.)ident(ReadInteger)operator(()string<delimiter(')content(Priority)delimiter(')>operator(,) ident(Integer)operator(()ident(tpLowest)operator(\)\)\);) + ident(PrevKeyCount) operator(:=) ident(Uni)operator(.)ident(ReadInteger)operator(()string<delimiter(')content(KeyCount)delimiter(')>operator(,) integer(0)operator(\);) + + ident(MaxKeyCountToScan) operator(:=) ident(Cardinal)operator(()ident(Uni)operator(.)ident(ReadInteger)operator(()string<delimiter(')content(ScanTuner: MaxKeys)delimiter(')>operator(,) operator(-)integer(1)operator(\)\);) + ident(MaxValueCountToScan) operator(:=) ident(Cardinal)operator(()ident(Uni)operator(.)ident(ReadInteger)operator(()string<delimiter(')content(ScanTuner: MaxValues)delimiter(')>operator(,) operator(-)integer(1)operator(\)\);) + ident(MaxDataLenToScan) operator(:=) ident(Cardinal)operator(()ident(Uni)operator(.)ident(ReadInteger)operator(()string<delimiter(')content(ScanTuner: MaxDataLen)delimiter(')>operator(,) operator(-)integer(1)operator(\)\);) + + ident(Key) operator(:=) ident(TSpyKey)operator(.)ident(Create)operator(()reserved(nil)operator(,) ident(AKeyName)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TSisyThread)operator(.)ident(FreeKey)operator(;) +reserved(begin) + ident(Reg)operator(.)ident(Free)operator(;) + ident(TheClock)operator(.)ident(Free)operator(;) + ident(Key)operator(.)ident(Free)operator(;) +reserved(end)operator(;) + +reserved(destructor) ident(TSisyThread)operator(.)ident(Destroy)operator(;) +reserved(begin) + ident(Synchronize)operator(()ident(FreeKey)operator(\);) + reserved(inherited)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TSisyThread)operator(.)ident(Execute)operator(;) +reserved(begin) + ident(InfoForShow) operator(:=) ident(Name) operator(+) string<delimiter(')content( initializing...)delimiter(')>operator(;) + ident(Synchronize)operator(()ident(ShowInfo)operator(\);) + + ident(TheClock)operator(.)ident(Restart)operator(;) + ident(Started) operator(:=) ident(False)operator(;) + reserved(while) reserved(not) ident(Terminated) reserved(do) + reserved(try) + ident(KeyIndex) operator(:=) integer(0)operator(;) + + comment({ ===================== }) + ident(Key)operator(.)ident(Spy)operator(()ident(KeyHKEY)operator(,) ident(Self)operator(\);) + comment({ ===================== }) + + reserved(if) ident(Terminated) reserved(then) + ident(Continue)operator(;) comment(//= Exit) + + ident(SecsPerRound) operator(:=) ident(TheClock)operator(.)ident(SecondsPassed)operator(;) + ident(TheClock)operator(.)ident(Restart)operator(;) + reserved(if) reserved(not) ident(Started) reserved(then) reserved(begin) + ident(Started) operator(:=) ident(True)operator(;) + ident(Uni)operator(.)ident(WriteInteger)operator(()string<delimiter(')content(KeyCount)delimiter(')>operator(,) ident(KeyCount)operator(\);) + reserved(if) ident(Assigned)operator(()ident(OnStarted)operator(\)) reserved(then) + ident(OnStarted)operator(()ident(Self)operator(\);) + reserved(end)operator(;) + reserved(except) + ident(ShowMessage)operator(()string<delimiter(')content(Error in Sisyphus)delimiter(')>operator(\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TSisyThread)operator(.)ident(AddValueChange)operator(()ident(Typ)operator(:) ident(TSisyChangeType)operator(;) reserved(const) ident(Path)operator(:) reserved(string)operator(;) + ident(Old)operator(,) ident(New)operator(:) ident(TRegContext)operator(\);) + + reserved(procedure) ident(TryNotify)operator(()ident(Event)operator(:) ident(TSisyCHangeEvent)operator(\);) + reserved(begin) + + reserved(end)operator(;) + +reserved(begin) + reserved(if) reserved(not) operator(()ident(Started) reserved(and) ident(DoReport)operator(\)) reserved(then) + ident(Exit)operator(;) + + ident(CurrentChange) operator(:=) ident(TSisyChange)operator(.)ident(Create)operator(()ident(Typ)operator(,) ident(Path)operator(,) ident(Old)operator(,) ident(New)operator(\);) + ident(Synchronize)operator(()ident(ReportCurrentChange)operator(\);) + ident(Synchronize)operator(()ident(NotifyChange)operator(\);) + +comment(// CurrentChange.Free; //this makes Pluto itself) +reserved(end)operator(;) + +reserved(procedure) ident(TSisyThread)operator(.)ident(AddKeyChange)operator(()ident(Typ)operator(:) ident(TSisyChangeType)operator(;) reserved(const) ident(Path)operator(:) reserved(string)operator(\);) +reserved(begin) + ident(AddValueChange)operator(()ident(Typ)operator(,) ident(Path)operator(,) ident(ZeroRegContext)operator(,) ident(ZeroRegContext)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TSisyThread)operator(.)ident(ShowInfo)operator(;) +reserved(begin) + reserved(if) ident(Assigned)operator(()ident(StatusLabel)operator(\)) reserved(then) + ident(StatusLabel)operator(.)ident(Caption) operator(:=) ident(InfoForShow)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TSisyThread)operator(.)ident(ReportCurrentChange)operator(;) +reserved(begin) + reserved(if) ident(Assigned)operator(()ident(CurrentChange)operator(\)) reserved(then) + ident(CurrentChange)operator(.)ident(ReportToPluto)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TSisyThread)operator(.)ident(IncKeyCount)operator(;) +reserved(var) + ident(c)operator(:) ident(Integer)operator(;) +reserved(begin) + reserved(if) ident(Started) reserved(then) + ident(Exit)operator(;) + + ident(Inc)operator(()ident(KeyCount)operator(\);) + + reserved(if) operator(()ident(KeyCount) reserved(and) hex($1FF)operator(\)) operator(=) integer(0) reserved(then) reserved(begin) + reserved(if) ident(KeyCount) operator(>) ident(PrevKeyCount) reserved(then) + ident(PrevKeyCount) operator(:=) ident(KeyCount)operator(;) + + ident(c) operator(:=) integer(0)operator(;) + reserved(if) ident(PrevkeyCount) operator(>) integer(0) reserved(then) + ident(c) operator(:=) ident(Round)operator((()ident(KeyCount) operator(*) ident(StatusPoints)operator(\)) operator(/) ident(PrevKeyCount)operator(\);) + ident(InfoForShow) operator(:=) char<delimiter(')content(|)delimiter(')> operator(+) ident(MulStr)operator(()char<delimiter(')content(.)delimiter(')>operator(,) ident(c)operator(\)) operator(+) ident(MulStr)operator(()char<delimiter(')content( )delimiter(')>operator(,) ident(StatusPoints) operator(-) ident(c)operator(\)) operator(+) char<delimiter(')content(|)delimiter(')> operator(+) + ident(Format)operator(()string<delimiter(')content( (%0.1f s\) %d/%d k )delimiter(')>operator(,) + operator([)ident(TheClock)operator(.)ident(SecondsPassed)operator(,) ident(KeyCount)operator(,) ident(PrevKeyCount)operator(]\);) + + ident(Synchronize)operator(()ident(ShowInfo)operator(\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TSisyThread)operator(.)ident(IncKeyIndex)operator(;) +reserved(var) + ident(c)operator(:) ident(Integer)operator(;) +reserved(begin) + reserved(if) reserved(not) ident(Started) reserved(then) + ident(Exit)operator(;) + + ident(Inc)operator(()ident(KeyIndex)operator(\);) + + reserved(if) operator((()ident(KeyIndex) reserved(and) hex($1FF)operator(\)) operator(=) integer(0)operator(\)) reserved(and) operator(()ident(KeyCount) operator(>) integer(0)operator(\)) reserved(then) reserved(begin) + reserved(if) ident(KeyIndex) operator(>) ident(KeyCount) reserved(then) + ident(KeyCount) operator(:=) ident(KeyIndex)operator(;) + + ident(c) operator(:=) integer(0)operator(;) + reserved(if) ident(KeyCount) operator(>) integer(0) reserved(then) + ident(c) operator(:=) ident(Round)operator((()ident(KeyIndex) operator(*) ident(StatusPoints)operator(\)) operator(/) ident(KeyCount)operator(\);) + + ident(InfoForShow) operator(:=) char<delimiter(')content(|)delimiter(')> operator(+) ident(MulStr)operator(()char<delimiter(')content(:)delimiter(')>operator(,) ident(c)operator(\)) operator(+) ident(MulStr)operator(()char<delimiter(')content(.)delimiter(')>operator(,) ident(StatusPoints) operator(-) ident(c)operator(\)) operator(+) char<delimiter(')content(|)delimiter(')> operator(+) + ident(Format)operator(()string<delimiter(')content( (%0.1f s\) %d/%d k )delimiter(')>operator(,) operator([)ident(SecsPerRound)operator(,) ident(KeyIndex)operator(,) ident(KeyCount)operator(]\);) + + ident(Synchronize)operator(()ident(ShowInfo)operator(\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(function) ident(TSisyThread)operator(.)ident(GetSpecialChange)operator(()ident(ChangeType)operator(:) ident(TSisyChangeType)operator(\):) + ident(TSisyChangeEvent)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(FOnSpecialChanges)operator([)ident(ChangeType)operator(];) +reserved(end)operator(;) + +reserved(procedure) ident(TSisyThread)operator(.)ident(SetSpecialChange)operator(()ident(ChangeType)operator(:) ident(TSisyChangeType)operator(;) + reserved(const) ident(Value)operator(:) ident(TSisyChangeEvent)operator(\);) +reserved(begin) + ident(FOnSpecialChanges)operator([)ident(ChangeType)operator(]) operator(:=) ident(Value)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TSisyThread)operator(.)ident(NotifyChange)operator(;) +reserved(var) + ident(Event)operator(:) ident(TSisyChangeEvent)operator(;) +reserved(begin) + ident(Event) operator(:=) ident(FOnSpecialChanges)operator([)ident(CurrentChange)operator(.)ident(Typ)operator(];) + reserved(if) ident(Assigned)operator(()ident(Event)operator(\)) reserved(then) + ident(Event)operator(()ident(Self)operator(,) ident(CurrentChange)operator(\);) + + reserved(if) ident(Assigned)operator(()ident(FOnChange)operator(\)) reserved(then) + ident(FOnChange)operator(()ident(Self)operator(,) ident(CurrentChange)operator(\);) +reserved(end)operator(;) + +comment({ TSpyValue }) + +reserved(constructor) ident(TSpyValue)operator(.)ident(Create)operator(()reserved(const) ident(Name)operator(:) reserved(string)operator(;) ident(Context)operator(:) ident(TRegContext)operator(\);) +reserved(begin) + ident(Self)operator(.)ident(Name) operator(:=) ident(Name)operator(;) + ident(Next) operator(:=) reserved(nil)operator(;) + ident(Self)operator(.)ident(Context) operator(:=) ident(Context)operator(;) +reserved(end)operator(;) + +comment({ TSpyKey }) + +reserved(constructor) ident(TSpyKey)operator(.)ident(Create)operator(()ident(AParent)operator(:) ident(TSpyKey)operator(;) ident(AName)operator(:) reserved(string)operator(\);) +reserved(begin) + ident(Name) operator(:=) ident(AName)operator(;) + ident(Parent) operator(:=) ident(AParent)operator(;) + + ident(Next) operator(:=) reserved(nil)operator(;) + ident(Keys) operator(:=) reserved(nil)operator(;) + ident(Values) operator(:=) reserved(nil)operator(;) +reserved(end)operator(;) + +reserved(destructor) ident(TSpyKey)operator(.)ident(Destroy)operator(;) +reserved(var) + ident(Value)operator(,) ident(NextValue)operator(:) ident(TSpyValue)operator(;) + ident(Key)operator(,) ident(NextKey)operator(:) ident(TSpyKey)operator(;) +reserved(begin) + ident(Value) operator(:=) ident(Values)operator(;) + reserved(while) ident(Assigned)operator(()ident(Value)operator(\)) reserved(do) reserved(begin) + ident(NextValue) operator(:=) ident(Value)operator(.)ident(Next)operator(;) + ident(Value)operator(.)ident(Free)operator(;) + ident(Value) operator(:=) ident(NextValue)operator(;) + reserved(end)operator(;) + + ident(Key) operator(:=) ident(Keys)operator(;) + reserved(while) ident(Assigned)operator(()ident(Key)operator(\)) reserved(do) reserved(begin) + ident(NextKey) operator(:=) ident(Key)operator(.)ident(Next)operator(;) + ident(Key)operator(.)ident(Free)operator(;) + ident(Key) operator(:=) ident(NextKey)operator(;) + reserved(end)operator(;) + + reserved(inherited)operator(;) +reserved(end)operator(;) + +reserved(function) ident(TSpyKey)operator(.)ident(Path)operator(:) reserved(string)operator(;) +reserved(begin) + reserved(if) ident(Assigned)operator(()ident(Parent)operator(\)) reserved(then) + ident(Result) operator(:=) ident(Parent)operator(.)ident(Path) operator(+) char<delimiter(')content(\\)delimiter(')> + reserved(else) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + + ident(Result) operator(:=) ident(Result) operator(+) ident(Name)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TSpyKey)operator(.)ident(Spy)operator(()ident(AHKEY)operator(:) ident(HKEY)operator(;) ident(Sisy)operator(:) ident(TSisyThread)operator(\);) +reserved(var) + ident(SL)operator(:) ident(TStringList)operator(;) + ident(LastKey)operator(:) ident(TSpyKey)operator(;) + + reserved(procedure) ident(CompareValues)operator(;) + reserved(var) + ident(i)operator(:) ident(Integer)operator(;) + ident(Value)operator(,) ident(LastValue)operator(,) ident(NewValue)operator(,) ident(SearchValue)operator(,) ident(SearchValue_Prev)operator(:) ident(TSpyValue)operator(;) + reserved(begin) + comment(//OK, this part is a little bit complicate. So I will comment very much.) + comment(//First, two terms are important:) + comment(//<REAL> means the list of values that will be read from the registry now:) + ident(Sisy)operator(.)ident(Reg)operator(.)ident(GetValueNames)operator(()ident(SL)operator(\);) + reserved(if) ident(Cardinal)operator(()ident(SL)operator(.)ident(Count)operator(\)) operator(>) ident(Sisy)operator(.)ident(MaxValueCountToScan) reserved(then) + ident(Exit)operator(;) + comment(//So <REAL> is TStringList.) + + comment(//<CURRENT> means the image that was saved before.) + comment(//Here, it is a linear list of TSpyValue objects. That means that you can) + comment(//only get X.Next and not X.Prev! However, I use "X.Prev" to simplify) + comment(//some comments.) + + comment(//!!! Comparing means: Make <CURRENT> fit <REAL> !!!) + + comment(//If <CURRENT> wasn't saved before, it is just empty.) + + comment(//!!! There is no difference in comparing and saving in this method !!!) + + comment(//Building means: Comparing with an empty image.) + + comment(//We go through <REAL> and make <CURRENT> fit it) + + comment(//The following rules are important:) + comment(//Value = "The currently interesting value.) + comment(//LastValue = "The value with X.Next = Value" = "Value.Pref") + + ident(LastValue) operator(:=) reserved(nil)operator(;) comment(// := "Values.Prev") + ident(Value) operator(:=) ident(Values)operator(;) comment(// := "LastValue.Next") + + comment(//Now compare step by step) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(SL)operator(.)ident(Count)operator(-)integer(1) reserved(do) reserved(begin) + reserved(if) ident(Assigned)operator(()ident(Value)operator(\)) reserved(and) operator(()ident(SL)operator([)ident(i)operator(]) operator(=) ident(Value)operator(.)ident(Name)operator(\)) reserved(then) reserved(begin) + comment(//cV= Normally (0.9999\) everything's the same) + ident(LastValue) operator(:=) ident(Value)operator(;) + ident(Value) operator(:=) ident(Value)operator(.)ident(Next)operator(;) + reserved(end) reserved(else) reserved(begin) comment(//Something's different? Yes, the IMPORTANT rest (0.0001\)\)) + comment(//Because the list finally must exactly fit SL, the "SL[i] value" hast) + comment(//to be inserted right here. But first let's look...) + + comment(//Maybe it was just moved? So search for it...) + ident(NewValue) operator(:=) reserved(nil)operator(;) + reserved(if) ident(Assigned)operator(()ident(Value)operator(\)) reserved(then) reserved(begin) + ident(SearchValue_Prev) operator(:=) ident(Value)operator(;) + ident(SearchValue) operator(:=) ident(Value)operator(.)ident(Next)operator(;) + reserved(while) ident(Assigned)operator(()ident(SearchValue)operator(\)) reserved(do) reserved(begin) + reserved(if) ident(SearchValue)operator(.)ident(Name) operator(=) ident(SL)operator([)ident(i)operator(]) reserved(then) reserved(begin) comment(//we found our moved value) + ident(SearchValue_Prev)operator(.)ident(Next) operator(:=) ident(SearchValue)operator(.)ident(Next)operator(;) comment(//delete it from <CURRENT>) + ident(NewValue) operator(:=) ident(SearchValue)operator(;) comment(//save that we found it) + ident(Break) reserved(end)operator(;) + ident(SearchValue_Prev) operator(:=) ident(SearchValue)operator(;) + ident(SearchValue) operator(:=) ident(SearchValue)operator(.)ident(Next)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + reserved(if) reserved(not) ident(Assigned)operator(()ident(NewValue)operator(\)) reserved(then) reserved(begin) + comment(//cV+ No, not found! So it is new...) + ident(NewValue) operator(:=) ident(TSpyValue)operator(.)ident(Create)operator(()ident(SL)operator([)ident(i)operator(],) ident(Sisy)operator(.)ident(Reg)operator(.)ident(ReadContext)operator(()ident(SL)operator([)ident(i)operator(]\)\);) + comment({ ================ cV+ ================ }) + reserved(if) ident(Sisy)operator(.)ident(Started) reserved(and) ident(Sisy)operator(.)ident(Reg)operator(.)ident(ValueReallyExists)operator(()ident(SL)operator([)ident(i)operator(]\)) reserved(then) + ident(Sisy)operator(.)ident(AddValueChange)operator(()ident(cValuePlus)operator(,) ident(Path) operator(+) string<delimiter(')content(\\\\)delimiter(')> operator(+) ident(NewValue)operator(.)ident(Name)operator(,) + ident(ZeroRegContext)operator(,) ident(NewValue)operator(.)ident(Context)operator(\);) + reserved(end)operator(;) + + comment(//The new object now must be placed after the last value) + reserved(if) ident(Assigned)operator(()ident(LastValue)operator(\)) reserved(then) + ident(LastValue)operator(.)ident(Next) operator(:=) ident(NewValue) + reserved(else) + comment(//If it's the first value, we don't have LastValue defined) + comment(//So we have to set the "Root" to it) + ident(Values) operator(:=) ident(NewValue)operator(;) + + comment(//Now the rest of <CURRENT> has to be placed after the new value) + ident(NewValue)operator(.)ident(Next) operator(:=) ident(Value)operator(;) + comment(//And LastValue also has to refreshed: It is "Value.Pref" = NewValue!) + ident(LastValue) operator(:=) ident(NewValue)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + comment(//Because the whole <CURRENT> before Value is exactly <REAL>, the rest) + comment(//(if there is one\) must have been deleted!) + + comment(//So first let's ensure that <CURRENT> ends here:) + reserved(if) ident(Assigned)operator(()ident(LastValue)operator(\)) reserved(then) + ident(LastValue)operator(.)ident(Next) operator(:=) reserved(nil) + reserved(else) + comment(//Another time: <CURRENT> is empty now, so set Values instead) + ident(Values) operator(:=) reserved(nil)operator(;) + + comment(//Now, the first value that maybe was "cut" off is Value:) + reserved(while) ident(Assigned)operator(()ident(Value)operator(\)) reserved(do) reserved(begin) + comment(//cV- So, here really something HAS been deleted) + ident(LastValue) operator(:=) ident(Value)operator(;) + ident(Value) operator(:=) ident(Value)operator(.)ident(Next)operator(;) + comment({ ================ cV- ================ }) + reserved(if) ident(Sisy)operator(.)ident(Started) reserved(and) reserved(not) ident(Sisy)operator(.)ident(Reg)operator(.)ident(ValueReallyExists)operator(()ident(LastValue)operator(.)ident(Name)operator(\)) reserved(then) + ident(Sisy)operator(.)ident(AddValueChange)operator(()ident(cValueMinus)operator(,) ident(Path) operator(+) string<delimiter(')content(\\\\)delimiter(')> operator(+) ident(LastValue)operator(.)ident(Name)operator(,) + ident(LastValue)operator(.)ident(Context)operator(,) ident(ZeroRegContext)operator(\);) + ident(LastValue)operator(.)ident(Free)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + reserved(procedure) ident(CompareData)operator(;) + reserved(var) + ident(Value)operator(:) ident(TSpyValue)operator(;) + ident(Context)operator(:) ident(TRegContext)operator(;) + ident(Size)operator(:) ident(Cardinal)operator(;) + reserved(begin) + ident(Context) operator(:=) ident(ZeroRegContext)operator(;) comment(//Initialize) + comment(//So, finally <CURRENT> = <REAL>. That means we now can compare the data:) + ident(Value) operator(:=) ident(Values)operator(;) + reserved(while) ident(Assigned)operator(()ident(Value)operator(\)) reserved(and) reserved(not) ident(Sisy)operator(.)ident(Terminated) reserved(do) reserved(begin) + ident(Size) operator(:=) ident(Sisy)operator(.)ident(Reg)operator(.)ident(GetDataSize)operator(()ident(Value)operator(.)ident(Name)operator(\);) + reserved(if) operator(()ident(Size) operator(=) ident(Cardinal)operator((-)integer(1)operator(\)\)) reserved(or) + operator(()ident(Size) operator(<=) ident(Sisy)operator(.)ident(MaxDataLenToScan)operator(\)) reserved(then) reserved(begin) + ident(Context) operator(:=) ident(Sisy)operator(.)ident(Reg)operator(.)ident(ReadContext)operator(()ident(Value)operator(.)ident(Name)operator(\);) + reserved(if) reserved(not) ident(SameContext)operator(()ident(Context)operator(,) ident(Value)operator(.)ident(Context)operator(\)) reserved(then) reserved(begin) + comment({ ================ cC ================ }) + ident(Sisy)operator(.)ident(AddValueChange)operator(()ident(cContextChange)operator(,) ident(Path) operator(+) string<delimiter(')content(\\\\)delimiter(')> operator(+) ident(Value)operator(.)ident(Name)operator(,) + ident(Value)operator(.)ident(Context)operator(,) ident(Context)operator(\);) + ident(Value)operator(.)ident(Context) operator(:=) ident(Context)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + ident(Value) operator(:=) ident(Value)operator(.)ident(Next)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + reserved(procedure) ident(CompareKeys)operator(;) + reserved(var) + ident(i)operator(:) ident(Integer)operator(;) + ident(Key)operator(,) ident(LastKey)operator(,) ident(NewKey)operator(,) ident(SearchKey)operator(,) ident(SearchKey_Prev)operator(:) ident(TSpyKey)operator(;) + ident(SavedDoReport)operator(:) ident(Boolean)operator(;) + ident(NewHKEY)operator(:) ident(HKEY)operator(;) + reserved(begin) + comment(//OK, this part is a little bit complicate. So I will comment very much.) + comment(//First, two terms are important:) + comment(//<REAL> means the list of keys that will be read from the registry now:) + + ident(Sisy)operator(.)ident(Reg)operator(.)ident(GetKeyNames)operator(()ident(SL)operator(\);) + reserved(if) ident(Cardinal)operator(()ident(SL)operator(.)ident(Count)operator(\)) operator(>) ident(Sisy)operator(.)ident(MaxKeyCountToScan) reserved(then) + ident(Exit)operator(;) + comment(//So <REAL> is TStringList.) + + comment(//<CURRENT> means the image that was saved before.) + comment(//Here, it is a linear list of TSpyKey objects. That means that you can) + comment(//only get X.Next and not X.Prev! However, I use "X.Prev" to simplify) + comment(//some comments.) + + comment(//!!! Comparing means: Make <CURRENT> fit <REAL> !!!) + + comment(//If <CURRENT> wasn't saved before, it is just empty.) + + comment(//!!! There is no difference in comparing and saving in this method !!!) + + comment(//Building means: Comparing with an empty image.) + + comment(//We go through <REAL> and make <CURRENT> fit it) + + comment(//The following rules are important:) + comment(//Key = "The currently interesting key.) + comment(//LastKey = "The key with X.Next = Key" = "Key.Pref") + + ident(LastKey) operator(:=) reserved(nil)operator(;) comment(// := "Keys.Prev") + ident(Key) operator(:=) ident(Keys)operator(;) comment(// := "LastKey.Next") + + comment(//Now compare step by step) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(SL)operator(.)ident(Count)operator(-)integer(1) reserved(do) reserved(begin) + reserved(if) ident(Assigned)operator(()ident(Key)operator(\)) reserved(and) operator(()ident(SL)operator([)ident(i)operator(]) operator(=) ident(Key)operator(.)ident(Name)operator(\)) reserved(then) reserved(begin) + comment(//cK= Normally (0.9999\) everything's the same) + reserved(if) ident(Success)operator(()ident(RegOpenKey)operator(()ident(AHKEY)operator(,) ident(PChar)operator(()ident(SL)operator([)ident(i)operator(]\),) ident(NewHKEY)operator(\)\)) reserved(then) + reserved(try) + ident(Key)operator(.)ident(Spy)operator(()ident(NewHKEY)operator(,) ident(Sisy)operator(\);) + reserved(finally) + ident(RegCloseKey)operator(()ident(NewHKEY)operator(\);) + reserved(end)operator(;) + reserved(if) ident(Sisy)operator(.)ident(Terminated) reserved(then) + ident(Exit)operator(;) + + ident(LastKey) operator(:=) ident(Key)operator(;) + ident(Key) operator(:=) ident(Key)operator(.)ident(Next)operator(;) + reserved(end) reserved(else) reserved(begin) comment(//Something's different? Yes, the IMPORTANT rest (0.0001\)\)) + comment(//Because the list finally must exactly fit SL, the "SL[i] key" has) + comment(//to be inserted right here. But first let's look...) + + comment(//Maybe it was just moved? So search for it...) + ident(NewKey) operator(:=) reserved(nil)operator(;) + reserved(if) ident(Assigned)operator(()ident(Key)operator(\)) reserved(then) reserved(begin) + ident(SearchKey_Prev) operator(:=) ident(Key)operator(;) + ident(SearchKey) operator(:=) ident(Key)operator(.)ident(Next)operator(;) + reserved(while) ident(Assigned)operator(()ident(SearchKey)operator(\)) reserved(do) reserved(begin) + reserved(if) ident(SearchKey)operator(.)ident(Name) operator(=) ident(SL)operator([)ident(i)operator(]) reserved(then) reserved(begin) comment(//we found our moved key) + ident(SearchKey_Prev)operator(.)ident(Next) operator(:=) ident(SearchKey)operator(.)ident(Next)operator(;) comment(//delete it from <CURRENT>) + ident(NewKey) operator(:=) ident(SearchKey)operator(;) comment(//save that we found it) + ident(Break) reserved(end)operator(;) + ident(SearchKey_Prev) operator(:=) ident(SearchKey)operator(;) + ident(SearchKey) operator(:=) ident(SearchKey)operator(.)ident(Next)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + reserved(if) reserved(not) ident(Assigned)operator(()ident(NewKey)operator(\)) reserved(then) reserved(begin) comment(//if we didn't find it) + comment(//cK+ No, not found! So it is new...) + ident(NewKey) operator(:=) ident(TSpyKey)operator(.)ident(Create)operator(()ident(Self)operator(,) ident(SL)operator([)ident(i)operator(]\);) + ident(Sisy)operator(.)ident(IncKeyCount)operator(;) + ident(Sisy)operator(.)ident(Reg)operator(.)ident(CurrentKey) operator(:=) ident(AHKEY)operator(;) + comment({ ================ cK+ ================ }) + reserved(if) ident(Sisy)operator(.)ident(Started) reserved(and) ident(Sisy)operator(.)ident(Reg)operator(.)ident(KeyExists)operator(()ident(SL)operator([)ident(i)operator(]\)) reserved(then) + ident(Sisy)operator(.)ident(AddKeyChange)operator(()ident(cKeyPlus)operator(,) ident(Path) operator(+) char<delimiter(')content(\\)delimiter(')> operator(+) ident(NewKey)operator(.)ident(Name)operator(\);) + + ident(SavedDoReport) operator(:=) ident(Sisy)operator(.)ident(DoReport)operator(;) + reserved(if) ident(Success)operator(()ident(RegOpenKey)operator(()ident(AHKEY)operator(,) ident(PChar)operator(()ident(SL)operator([)ident(i)operator(]\),) ident(NewHKEY)operator(\)\)) reserved(then) + reserved(try) + ident(Sisy)operator(.)ident(DoReport) operator(:=) ident(False)operator(;) + ident(NewKey)operator(.)ident(Spy)operator(()ident(NewHKEY)operator(,) ident(Sisy)operator(\);) comment(//<-- recursion itself) + reserved(finally) + ident(RegCloseKey)operator(()ident(NewHKEY)operator(\);) + ident(Sisy)operator(.)ident(DoReport) operator(:=) ident(SavedDoReport)operator(;) + reserved(end)operator(;) + + reserved(if) ident(Sisy)operator(.)ident(Terminated) reserved(then) + ident(Exit)operator(;) + reserved(end)operator(;) + + comment(//The new key now must be placed after the last key) + reserved(if) ident(Assigned)operator(()ident(LastKey)operator(\)) reserved(then) + ident(LastKey)operator(.)ident(Next) operator(:=) ident(NewKey) + reserved(else) + comment(//If it's the first key, we don't have LastKey defined) + comment(//So we have to set the "Root" to it) + ident(Keys) operator(:=) ident(NewKey)operator(;) + + comment(//Now the rest of <CURRENT> has to be placed after the new key) + ident(NewKey)operator(.)ident(Next) operator(:=) ident(Key)operator(;) + comment(//And LastKey also has to refreshed: It is "Key.Pref" = NewKey!) + ident(LastKey) operator(:=) ident(NewKey)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + comment(//Because the whole <CURRENT> before Key is exactly <REAL>, the rest) + comment(//(if there is one\) must have been deleted!) + + comment(//So first let's ensure that <CURRENT> ends here:) + reserved(if) ident(Assigned)operator(()ident(LastKey)operator(\)) reserved(then) + ident(LastKey)operator(.)ident(Next) operator(:=) reserved(nil) + reserved(else) + comment(//Another time: <CURRENT> is empty now, so set Keys instead) + ident(Keys) operator(:=) reserved(nil)operator(;) + + comment(//Now, the first key that maybe was "cut" off is Key:) + reserved(while) ident(Assigned)operator(()ident(Key)operator(\)) reserved(do) reserved(begin) + comment(//cV- So, here really something HAS been deleted) + ident(LastKey) operator(:=) ident(Key)operator(;) + ident(Key) operator(:=) ident(Key)operator(.)ident(Next)operator(;) + ident(Sisy)operator(.)ident(Reg)operator(.)ident(CurrentKey) operator(:=) ident(AHKEY)operator(;) + comment({ ================ cK- ================ }) + reserved(if) ident(Sisy)operator(.)ident(Started) reserved(and) reserved(not) ident(Sisy)operator(.)ident(Reg)operator(.)ident(KeyExists)operator(()ident(LastKey)operator(.)ident(Name)operator(\)) reserved(then) + ident(Sisy)operator(.)ident(AddKeyChange)operator(()ident(cKeyMinus)operator(,) ident(Path) operator(+) char<delimiter(')content(\\)delimiter(')> operator(+) ident(LastKey)operator(.)ident(Name)operator(\);) + ident(LastKey)operator(.)ident(Free)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + +reserved(begin) + reserved(if) ident(Sisy)operator(.)ident(Terminated) reserved(or) operator(()ident(AHKEY) operator(=) integer(0)operator(\)) reserved(then) + ident(Exit)operator(;) + ident(LastKey) operator(:=) ident(Sisy)operator(.)ident(CurrentSpyKey)operator(;) + ident(Sisy)operator(.)ident(CurrentSpyKey) operator(:=) ident(Self)operator(;) + + ident(Sisy)operator(.)ident(IncKeyIndex)operator(;) + + ident(SL) operator(:=) ident(TStringList)operator(.)ident(Create)operator(;) + reserved(try) + ident(Sisy)operator(.)ident(Reg)operator(.)ident(CurrentKey) operator(:=) ident(AHKEY)operator(;) + ident(CompareValues)operator(;) + reserved(if) ident(Sisy)operator(.)ident(Started) reserved(then) ident(CompareData)operator(;) + ident(CompareKeys)operator(;) + reserved(finally) + ident(Sisy)operator(.)ident(Reg)operator(.)ident(CurrentKey) operator(:=) integer(0)operator(;) + ident(SL)operator(.)ident(Free)operator(;) + ident(Sisy)operator(.)ident(CurrentSpyKey) operator(:=) ident(LastKey)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +comment({ TSisyChange }) + +reserved(constructor) ident(TSisyChange)operator(.)ident(Create)operator(()ident(ATyp)operator(:) ident(TSisyChangeType)operator(;) reserved(const) ident(APath)operator(:) reserved(string)operator(;) + ident(AOldContext)operator(:) ident(TRegContext)operator(;) ident(ANewContext)operator(:) ident(TRegContext)operator(\);) +reserved(begin) + reserved(inherited) ident(Create)operator(;) + ident(Typ) operator(:=) ident(ATyp)operator(;) + ident(Path) operator(:=) ident(APath)operator(;) + ident(Old) operator(:=) ident(AOldContext)operator(;) + ident(New) operator(:=) ident(ANewContext)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TSisyChange)operator(.)ident(ReportToPluto)operator(;) +reserved(var) + ident(Node)operator(,) ident(RootNode)operator(:) ident(TTreeNode)operator(;) + ident(Root)operator(,) ident(SubPath)operator(:) reserved(string)operator(;) + ident(NewNode)operator(:) ident(Boolean)operator(;) + ident(i)operator(:) ident(Integer)operator(;) + + reserved(function) ident(IconOfSisyChangeType)operator(()ident(Typ)operator(:) ident(TSisyChangeType)operator(\):) ident(Integer)operator(;) + reserved(begin) + ident(Result) operator(:=) operator(-)integer(1)operator(;) + reserved(case) ident(Typ) reserved(of) + comment(//cNone, cError: Result := -1;) + ident(cKeyPlus)operator(..)ident(cContextChange)operator(:) ident(Result) operator(:=) ident(Integer)operator(()ident(Typ)operator(\)) operator(-) integer(2)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + reserved(function) ident(FindNode)operator(()ident(Text)operator(:) reserved(string)operator(\):) ident(TTreeNode)operator(;) + reserved(begin) + ident(Result) operator(:=) ident(WorkWin)operator(.)ident(SisyTV)operator(.)ident(Items)operator(.)ident(GetFirstNode)operator(;) + reserved(while) ident(Assigned)operator(()ident(Result)operator(\)) reserved(do) reserved(begin) + reserved(if) ident(SameText)operator(()ident(Result)operator(.)ident(Text)operator(,) ident(Text)operator(\)) reserved(then) + ident(Exit)operator(;) + ident(Result) operator(:=) ident(Result)operator(.)ident(GetNextSibling)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + +reserved(begin) + reserved(if) reserved(not) ident(WorkWin)operator(.)ident(SisyListCB)operator(.)ident(Checked) reserved(then) + ident(Exit)operator(;) + + reserved(if) ident(Typ) reserved(in) operator([)ident(cContextChange)operator(,) ident(cValueMinus)operator(,) ident(cValuePlus)operator(]) reserved(then) reserved(begin) + ident(Root) operator(:=) ident(ExRegFullKey)operator(()ident(Path)operator(\);) + ident(SubPath) operator(:=) ident(ExRegValue)operator(()ident(Path)operator(\);) + reserved(end) reserved(else) reserved(begin) + ident(Root) operator(:=) ident(UntilLastChar)operator(()ident(ExRegFullKey)operator(()ident(Path)operator(\),) char<delimiter(')content(\\)delimiter(')>operator(\);) + ident(SubPath) operator(:=) ident(FromLastChar)operator(()ident(ExRegFullKey)operator(()ident(Path)operator(\),) char<delimiter(')content(\\)delimiter(')>operator(\);) + reserved(end)operator(;) + + reserved(with) ident(WorkWin) reserved(do) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(SisyFilter)operator(.)ident(Count)operator(-)integer(1) reserved(do) reserved(begin) + reserved(if) ident(TextAtPos)operator(()ident(Root)operator(,) integer(1)operator(,) ident(SisyFilter)operator([)ident(i)operator(]\)) reserved(then) reserved(begin) + comment(//show that it's working) + reserved(with) ident(FilterChangesB) reserved(do) reserved(begin) + ident(Caption) operator(:=) string<delimiter(')content(Filter..!)delimiter(')>operator(;) + ident(Repaint)operator(;) + ident(Caption) operator(:=) string<delimiter(')content(Filter...)delimiter(')>operator(;) + ident(Repaint)operator(;) + reserved(end)operator(;) + ident(Exit)operator(;) reserved(end)operator(;) + reserved(end)operator(;) + + reserved(with) ident(WorkWin)operator(.)ident(SisyTV)operator(.)ident(Items) reserved(do) reserved(begin) + ident(BeginUpdate)operator(;) + reserved(try) + ident(RootNode) operator(:=) ident(FindNode)operator(()ident(Root)operator(\);) + ident(NewNode) operator(:=) reserved(not) ident(Assigned)operator(()ident(RootNode)operator(\);) + reserved(if) ident(NewNode) reserved(then) reserved(begin) + ident(RootNode) operator(:=) ident(AddChild)operator(()reserved(nil)operator(,) ident(Root)operator(\);) + ident(RootNode)operator(.)ident(ImageIndex) operator(:=) ident(iconGroup)operator(;) + reserved(end) reserved(else) reserved(if) reserved(not) ident(SisyChangeActivated)operator(()ident(RootNode)operator(\)) reserved(then) reserved(begin) + ident(EndUpdate)operator(;) + ident(Exit) reserved(end)operator(;) + + ident(Node) operator(:=) ident(AddChildObject)operator(()ident(RootNode)operator(,) ident(SubPath)operator(,) ident(Self)operator(\);) + ident(Node)operator(.)ident(ImageIndex) operator(:=) ident(IconOfSisyChangeType)operator(()ident(Typ)operator(\);) + reserved(if) ident(Typ) operator(=) ident(cContextChange) reserved(then) reserved(begin) + ident(AddChild)operator(()ident(Node)operator(,) ident(DataPreviewOfContext)operator(()ident(Old)operator(\)\).)ident(ImageIndex) operator(:=) ident(iconOldContext)operator(;) + ident(AddChild)operator(()ident(Node)operator(,) ident(DataPreviewOfContext)operator(()ident(New)operator(\)\).)ident(ImageIndex) operator(:=) ident(iconNewContext)operator(;) + reserved(end)operator(;) + reserved(finally) + ident(EndUpdate)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + reserved(if) ident(NewNode) reserved(and) ident(WorkWin)operator(.)ident(SisyExpandGroupsCB)operator(.)ident(Checked) reserved(then) + ident(RootNode)operator(.)ident(Expand)operator(()ident(False)operator(\);) + + reserved(if) reserved(not) ident(RootNode)operator(.)ident(Expanded) reserved(then) + ident(RootNode)operator(.)ident(ImageIndex) operator(:=) ident(iconGroupBlinking)operator(;) +reserved(end)operator(;) + +comment({ TSisyList }) + +reserved(function) ident(TSisyList)operator(.)ident(GetSisy)operator(()ident(Index)operator(:) ident(Integer)operator(\):) ident(TSisyThread)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(Get)operator(()ident(Index)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TSisyList)operator(.)ident(PutSisy)operator(()ident(Index)operator(:) ident(Integer)operator(;) ident(Sisy)operator(:) ident(TSisyThread)operator(\);) +reserved(begin) + ident(Put)operator(()ident(Index)operator(,) ident(Sisy)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TSisyList)operator(.)ident(Resume)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(Count)operator(-)integer(1) reserved(do) + ident(Items)operator([)ident(i)operator(].)ident(Resume)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TSisyList)operator(.)ident(Suspend)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(Count)operator(-)integer(1) reserved(do) + ident(Items)operator([)ident(i)operator(].)ident(Resume)operator(;) +reserved(end)operator(;) + +reserved(initialization) + ident(SisyFilter) operator(:=) ident(TStringList)operator(.)ident(Create)operator(;) + ident(SisyFilter)operator(.)ident(Sorted) operator(:=) ident(True)operator(;) + ident(SisyFilter)operator(.)ident(Duplicates) operator(:=) ident(dupIgnore)operator(;) + +reserved(finalization) + ident(SisyFilter)operator(.)ident(Free)operator(;) + +reserved(end)operator(.) +reserved(unit) ident(splash)operator(;) + +reserved(interface) + +reserved(uses) + ident(Windows)operator(,) ident(Messages)operator(,) ident(SysUtils)operator(,) ident(Classes)operator(,) ident(Graphics)operator(,) ident(Controls)operator(,) ident(Forms)operator(,) ident(Dialogs)operator(,) + ident(ExtCtrls)operator(,) ident(StdCtrls)operator(,) ident(ImgList)operator(,) ident(YTools)operator(,) ident(IniFiles)operator(,) ident(LinkLabel)operator(,) ident(PrefTools)operator(,) + ident(PlutoConst)operator(;) + +reserved(type) + ident(TSplashWin) operator(=) reserved(class)operator(()ident(TForm)operator(\)) + ident(Image1)operator(:) ident(TImage)operator(;) + ident(StartB)operator(:) ident(TButton)operator(;) + ident(SplashScreenCB)operator(:) ident(TPrefCheckBox)operator(;) + ident(LinkLabel1)operator(:) ident(TLinkLabel)operator(;) + ident(LinkLabel2)operator(:) ident(TLinkLabel)operator(;) + ident(LogoL)operator(:) ident(TLabel)operator(;) + reserved(procedure) ident(StartBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(FormShow)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(FormCreate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(FormHide)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(FormKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) + ident(Shift)operator(:) ident(TShiftState)operator(\);) + reserved(procedure) ident(SplashScreenCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(end)operator(;) + +reserved(var) + ident(SplashWin)operator(:) ident(TSplashWin)operator(;) + +reserved(implementation) + +reserved(uses) ident(plutomain)operator(,) ident(TreeU)operator(,) ident(WorkU)operator(,) ident(PrefU)operator(;) + +preprocessor({$R *.DFM}) + +reserved(procedure) ident(TSplashWin)operator(.)ident(StartBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(Close)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TSplashWin)operator(.)ident(FormShow)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(const) + ident(Messages)operator(:) reserved(array)operator([)integer(0)operator(..)integer(12)operator(]) reserved(of) reserved(string) operator(=) operator(()string<delimiter(')content(Let)char('')content(s see...)delimiter(')>operator(,) + string<delimiter(')content(Ready)delimiter(')>operator(,) + string<delimiter(')content(Hello World!)delimiter(')>operator(,) + string<delimiter(')content(Start)delimiter(')>operator(,) + string<delimiter(')content(OK)delimiter(')>operator(,) + string<delimiter(')content(Pluto!)delimiter(')>operator(,) + string<delimiter(')content(Go Go Go)delimiter(')>operator(,) + string<delimiter(')content(Everything)char('')content(s OK)delimiter(')>operator(,) + string<delimiter(')content(Yes!)delimiter(')>operator(,) + string<delimiter(')content(God save the Queen)delimiter(')>operator(,) + string<delimiter(')content(Oh yeah)delimiter(')>operator(,) + string<delimiter(')content(Yabadabadoo!)delimiter(')>operator(,) + string<delimiter(')content(Don)char('')content(t worry, be happy!)delimiter(')> + operator(\);) +reserved(var) + ident(ImageFile)operator(:) reserved(string)operator(;) +reserved(begin) + ident(Left) operator(:=) operator(()ident(Screen)operator(.)ident(Width) operator(-) ident(Width)operator(\)) reserved(div) integer(2)operator(;) + ident(Top) operator(:=) operator(()ident(Screen)operator(.)ident(Height) operator(-) ident(Height)operator(\)) reserved(div) integer(2)operator(;) + + ident(StartB)operator(.)ident(Caption) operator(:=) ident(Messages)operator([)ident(Random)operator(()ident(Length)operator(()ident(Messages)operator(\)\)];) + ident(SplashWin)operator(.)ident(SplashScreenCB)operator(.)ident(Load)operator(;) + + ident(Caption) operator(:=) string<delimiter(')content(cYcnus.Pluto )delimiter(')> operator(+) ident(Version) operator(+) string<delimiter(')content( says )delimiter(')> operator(+) ident(MainWin)operator(.)ident(Greeting)operator(;) + + reserved(try) + ident(ImageFile) operator(:=) ident(PlutoDir) operator(+) string<delimiter(')content(logo deluxe.bmp)delimiter(')>operator(;) + reserved(if) ident(FileEx)operator(()ident(ImageFile)operator(\)) reserved(then) reserved(begin) + reserved(with) ident(Image1)operator(.)ident(Picture) reserved(do) + reserved(if) ident(Graphic) operator(=) reserved(nil) reserved(then) + ident(LoadFromFile)operator(()ident(ImageFile)operator(\);) + reserved(if) reserved(not) ident(Switch)operator(()string<delimiter(')content(MurphyMode)delimiter(')>operator(\)) reserved(then) + ident(LogoL)operator(.)ident(Visible) operator(:=) ident(False)operator(;) + ident(Exit)operator(;) + reserved(end)operator(;) + + ident(ImageFile) operator(:=) ident(PlutoDir) operator(+) string<delimiter(')content(logo.bmp)delimiter(')>operator(;) + reserved(if) ident(FileEx)operator(()ident(ImageFile)operator(\)) reserved(then) reserved(begin) + reserved(with) ident(Image1)operator(.)ident(Picture) reserved(do) + reserved(if) ident(Graphic) operator(=) reserved(nil) reserved(then) + ident(LoadFromFile)operator(()ident(ImageFile)operator(\);) + reserved(end)operator(;) + reserved(except) + ident(ShowMessage)operator(()string<delimiter(')content(Could not load Splash Screen image!)delimiter(')>operator(\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TSplashWin)operator(.)ident(FormCreate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(Hide)operator(;) + ident(Randomize)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TSplashWin)operator(.)ident(FormHide)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + comment(//Image1.Picture.Bitmap.FreeImage;) +reserved(end)operator(;) + +reserved(procedure) ident(TSplashWin)operator(.)ident(FormKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) + ident(Shift)operator(:) ident(TShiftState)operator(\);) +reserved(begin) + reserved(if) ident(Key) operator(=) ident(VK_ESCAPE) reserved(then) + ident(Close)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TSplashWin)operator(.)ident(SplashScreenCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) ident(Started) reserved(then) + ident(PrefWin)operator(.)ident(SplashScreenCB)operator(.)ident(Checked) operator(:=) ident(SplashScreenCB)operator(.)ident(Checked)operator(;) +reserved(end)operator(;) + +reserved(end)operator(.) +reserved(unit) ident(SpyTH)operator(;) + +reserved(interface) + +reserved(uses) + ident(Classes)operator(,) ident(Windows)operator(,) ident(Dialogs)operator(,) ident(ComCtrls)operator(,) ident(CompEx)operator(,) ident(SysUtils)operator(,) ident(YTools)operator(,) ident(clock)operator(,) + ident(plutoconst)operator(,) ident(StdCtrls)operator(,) ident(forms)operator(,) ident(XReg)operator(,) ident(stringcomp)operator(;) + +reserved(type) + ident(TChildren) operator(=) reserved(array) reserved(of) ident(TTreeNode)operator(;) + + ident(TRegSpyThread) operator(=) reserved(class)operator(()ident(TThread)operator(\)) + directive(private) + ident(Reg)operator(:) ident(TXRegistry)operator(;) + ident(CurNode)operator(:) ident(TTreeNode)operator(;) + ident(Dead)operator(:) ident(Boolean)operator(;) + ident(Dif)operator(:) ident(TSLComp)operator(;) + ident(CurChildren)operator(:) ident(TChildren)operator(;) + directive(protected) + reserved(procedure) ident(Execute)operator(;) directive(override)operator(;) + + reserved(procedure) ident(SaveCheckNode)operator(;) + reserved(procedure) ident(SaveGetDif)operator(;) + reserved(procedure) ident(SaveDeleteDead)operator(;) + reserved(procedure) ident(SaveGetChildren)operator(;) + reserved(procedure) ident(SaveAddNew)operator(;) + directive(public) + ident(Restart)operator(:) ident(Boolean)operator(;) + ident(Mess)operator(:) reserved(string)operator(;) + ident(Delay)operator(:) ident(Integer)operator(;) + reserved(function) ident(Alive)operator(()ident(Node)operator(:) ident(TTreeNode)operator(\):) ident(Boolean)operator(;) + reserved(procedure) ident(Spy)operator(;) + reserved(procedure) ident(Reload)operator(()ident(Node)operator(:) ident(TTreeNode)operator(\);) + reserved(procedure) ident(ReloadValues)operator(;) + reserved(procedure) ident(AddTrace)operator(()ident(Trace)operator(:) reserved(string)operator(\);) + reserved(constructor) ident(CreateIt)operator(()ident(PriorityLevel)operator(:) ident(TThreadPriority)operator(\);) + reserved(destructor) ident(Destroy)operator(;) directive(override)operator(;) + reserved(end)operator(;) + +reserved(implementation) + +reserved(uses) ident(plutomain)operator(,) ident(TreeU)operator(,) ident(WorkU)operator(,) ident(ValuesU)operator(;) + +comment({ TRegSpyThread }) + +reserved(constructor) ident(TRegSpyThread)operator(.)ident(CreateIt)operator(()ident(PriorityLevel)operator(:) ident(TThreadPriority)operator(\);) +reserved(begin) + reserved(inherited) ident(Create)operator(()ident(True)operator(\);) comment(// Create thread suspended) + ident(Priority) operator(:=) ident(PriorityLevel)operator(;) comment(// Set Priority Level) + ident(FreeOnTerminate) operator(:=) ident(False)operator(;) comment(// Thread frees itself when terminated) + ident(Reg) operator(:=) ident(TXRegistry)operator(.)ident(Create)operator(;) + ident(Delay) operator(:=) integer(100)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TRegSpyThread)operator(.)ident(Execute)operator(;) +reserved(begin) + reserved(while) reserved(not) ident(Terminated) reserved(do) reserved(begin) + ident(Restart) operator(:=) ident(False)operator(;) + reserved(try) + reserved(if) reserved(not) ident(Terminated) reserved(then) + ident(Sleep)operator(()ident(Delay)operator(\);) + reserved(if) reserved(not) ident(Terminated) reserved(then) + ident(Spy)operator(;) + reserved(except) reserved(end)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(function) ident(TRegSpyThread)operator(.)ident(Alive)operator(()ident(Node)operator(:) ident(TTreeNode)operator(\):) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(False)operator(;) + + reserved(if) ident(Restart) reserved(then) + ident(Exit)operator(;) + + reserved(if) ident(Terminated) reserved(then) + ident(Exit)operator(;) + + reserved(if) ident(Assigned)operator(()ident(Node)operator(\)) reserved(then) + reserved(try) + reserved(if) operator(()ident(Node)operator(.)ident(Text) operator(=) string<delimiter(')delimiter(')>operator(\)) reserved(then) + ident(Exit)operator(;) + + reserved(if) reserved(not) ident(Assigned)operator(()ident(Node)operator(\)) reserved(then) + ident(Exit)operator(;) + + ident(Result) operator(:=) ident(True)operator(;) + reserved(except) + ident(Exit)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TRegSpyThread)operator(.)ident(SaveCheckNode)operator(;) +reserved(begin) + ident(Dead) operator(:=) reserved(not) ident(Alive)operator(()ident(CurNode)operator(\);) + reserved(if) ident(Dead) reserved(then) + ident(Exit)operator(;) + + ident(CheckNode)operator(()ident(CurNode)operator(,) ident(False)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TRegSpyThread)operator(.)ident(SaveGetDif)operator(;) +reserved(var) + ident(Real)operator(,) ident(Cur)operator(:) ident(TStringList)operator(;) +reserved(begin) + ident(Dead) operator(:=) reserved(not) ident(Alive)operator(()ident(CurNode)operator(\);) + reserved(if) ident(Dead) reserved(then) + ident(Exit)operator(;) + + ident(dif) operator(:=) reserved(nil)operator(;) + + reserved(if) reserved(not) ident(CurNode)operator(.)ident(Expanded) reserved(then) reserved(begin) + ident(Dead) operator(:=) ident(True)operator(;) + ident(Exit)operator(;) reserved(end)operator(;) + + reserved(if) reserved(not) ident(OpenNodeOK)operator(()ident(Reg)operator(,) ident(CurNode)operator(\)) reserved(then) + ident(Exit)operator(;) + + ident(Real) operator(:=) ident(TStringList)operator(.)ident(Create)operator(;) + + ident(Reg)operator(.)ident(GetKeyNames)operator(()ident(Real)operator(\);) + ident(Reg)operator(.)ident(CloseKey)operator(;) + + ident(Cur) operator(:=) ident(GetChildNames)operator(()ident(CurNode)operator(\);) + + reserved(if) operator(()ident(Cur)operator(.)ident(Count) operator(=) integer(0)operator(\)) reserved(and) operator(()ident(Real)operator(.)ident(Count) operator(=) integer(0)operator(\)) reserved(then) + ident(Dead) operator(:=) ident(True)operator(;) + + ident(dif) operator(:=) ident(TSLComp)operator(.)ident(Create)operator(()ident(Cur)operator(,) ident(Real)operator(,) ident(False)operator(\);) + + ident(Cur)operator(.)ident(Free)operator(;) + ident(Real)operator(.)ident(Free)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TRegSpyThread)operator(.)ident(SaveDeleteDead)operator(;) +reserved(var) + ident(TN)operator(:) ident(TTreeNode)operator(;) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Dead) operator(:=) reserved(not) ident(Alive)operator(()ident(CurNode)operator(\);) + reserved(if) ident(Dead) reserved(then) + ident(Exit)operator(;) + + reserved(if) reserved(not) ident(Assigned)operator(()ident(dif)operator(\)) reserved(or) reserved(not) ident(Assigned)operator(()ident(dif)operator(.)ident(OnlyA)operator(\)) reserved(then) + ident(Exit)operator(;) + + reserved(if) ident(CurNode)operator(.)ident(Expanded) reserved(then) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(dif)operator(.)ident(OnlyA)operator(.)ident(Count)operator(-)integer(1) reserved(do) reserved(begin) + ident(TN) operator(:=) ident(FindNode)operator(()ident(CurNode)operator(,) ident(dif)operator(.)ident(OnlyA)operator([)ident(i)operator(]\);) + reserved(if) ident(Assigned)operator(()ident(TN)operator(\)) reserved(then) reserved(begin) + ident(RegTV)operator(.)ident(Selected) operator(:=) ident(GetNextBest)operator(()ident(TN)operator(\);) + ident(TN)operator(.)ident(Delete)operator(;) + ident(AddTrace)operator(()string<delimiter(')content(Key deleted: )delimiter(')> operator(+) ident(dif)operator(.)ident(OnlyA)operator([)ident(i)operator(]\);) + reserved(end)operator(;) + reserved(end) + reserved(else) + ident(Exit)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TRegSpyThread)operator(.)ident(SaveGetChildren)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) + ident(TN)operator(:) ident(TTreeNode)operator(;) +reserved(begin) + ident(Dead) operator(:=) reserved(not) ident(Alive)operator(()ident(CurNode)operator(\);) + reserved(if) ident(Dead) reserved(then) + ident(Exit)operator(;) + + ident(CurChildren) operator(:=) reserved(nil)operator(;) + ident(SetLength)operator(()ident(CurChildren)operator(,) ident(CurNode)operator(.)ident(Count)operator(\);) + + ident(i) operator(:=) integer(0)operator(;) + ident(TN) operator(:=) ident(CurNode)operator(.)ident(GetFirstChild)operator(;) + reserved(while) ident(Assigned)operator(()ident(TN)operator(\)) reserved(do) reserved(begin) + reserved(if) ident(i) operator(<=) ident(High)operator(()ident(CurChildren)operator(\)) reserved(then) + ident(CurChildren)operator([)ident(i)operator(]) operator(:=) ident(TN) + reserved(else) + ident(ShowMessage)operator(()string<delimiter(')content(Error: Too much children)delimiter(')>operator(\);) + ident(Inc)operator(()ident(i)operator(\);) + ident(TN) operator(:=) ident(CurNode)operator(.)ident(GetNextChild)operator(()ident(TN)operator(\)) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TRegSpyThread)operator(.)ident(SaveAddNew)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Dead) operator(:=) reserved(not) ident(Alive)operator(()ident(CurNode)operator(\);) + reserved(if) ident(Dead) reserved(then) + ident(Exit)operator(;) + + reserved(if) reserved(not) ident(Assigned)operator(()ident(Dif)operator(\)) reserved(or) reserved(not) ident(Assigned)operator(()ident(Dif)operator(.)ident(OnlyB)operator(\)) reserved(or) operator(()ident(Dif)operator(.)ident(OnlyB)operator(.)ident(Count) operator(=) integer(0)operator(\)) reserved(then) + ident(Exit)operator(;) + + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(Dif)operator(.)ident(OnlyB)operator(.)ident(Count)operator(-)integer(1) reserved(do) reserved(begin) comment(//Erstellt/hinbenannt) + ident(RegTV)operator(.)ident(Items)operator(.)ident(AddChild)operator(()ident(CurNode)operator(,) ident(Dif)operator(.)ident(OnlyB)operator([)ident(i)operator(]\);) + ident(AddTrace)operator(()string<delimiter(')content(New Key: )delimiter(')> operator(+) ident(dif)operator(.)ident(OnlyB)operator([)ident(i)operator(]\);) + ident(MainWin)operator(.)ident(StatusBarUpdate)operator(;) + comment(//AddHint('Neuer Schlüssel: ' + CurNode.Text + '\\' + Dif.OnlyB[i]\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TRegSpyThread)operator(.)ident(Reload)operator(()ident(Node)operator(:) ident(TTreeNode)operator(\);) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) + ident(TN)operator(:) ident(TTreeNode)operator(;) + ident(zCurNode)operator(:) ident(TTreeNode)operator(;) + ident(MyChildren)operator(:) ident(TChildren)operator(;) +reserved(begin) + reserved(if) ident(Terminated) reserved(or) ident(Restart) reserved(then) + ident(Exit)operator(;) + + ident(CurNode) operator(:=) ident(Node)operator(;) + + ident(zCurNode) operator(:=) ident(CurNode)operator(;) + reserved(try) + comment(//Mess := 'SaveCheckNode';) + ident(Synchronize)operator(()ident(SaveCheckNode)operator(\);) + reserved(if) ident(Dead) reserved(or) ident(Terminated) reserved(then) + ident(Exit)operator(;) + + comment(//Mess := 'SaveGetDif';) + ident(Synchronize)operator(()ident(SaveGetDif)operator(\);) + reserved(if) ident(Dead) reserved(or) ident(Terminated) reserved(then) + ident(Exit)operator(;) + + comment(//Mess := 'SaveDeleteDead';) + ident(Synchronize)operator(()ident(SaveDeleteDead)operator(\);) + reserved(if) ident(Dead) reserved(or) ident(Terminated) reserved(then) + ident(Exit)operator(;) + + comment(//Mess := 'SaveGetChildren';) + ident(Synchronize)operator(()ident(SaveGetChildren)operator(\);) + reserved(if) ident(Dead) reserved(or) ident(Terminated) reserved(then) + ident(Exit)operator(;) + + comment(//Mess := 'SaveGetChildren';) + ident(Synchronize)operator(()ident(SaveAddNew)operator(\);) + reserved(if) ident(Dead) reserved(or) ident(Terminated) reserved(then) + ident(Exit)operator(;) + + ident(Dif)operator(.)ident(Free)operator(;) + + comment(//Mess := 'MyChildren';) + ident(SetLength)operator(()ident(MyChildren)operator(,) ident(Length)operator(()ident(CurChildren)operator(\)\);) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(High)operator(()ident(MyChildren)operator(\)) reserved(do) + ident(MyChildren)operator([)ident(i)operator(]) operator(:=) ident(CurChildren)operator([)ident(i)operator(];) + + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(High)operator(()ident(MyChildren)operator(\)) reserved(do) reserved(begin) + ident(TN) operator(:=) ident(MyChildren)operator([)ident(i)operator(];) + reserved(if) ident(Alive)operator(()ident(TN)operator(\)) reserved(then) + comment(//if TN.Expanded then) + comment(//if NodeVisible(TN\) then) + ident(Reload)operator(()ident(TN)operator(\);) + comment(//else) + comment(//Break;) + reserved(if) ident(Restart) reserved(or) ident(Terminated) reserved(then) + ident(Break)operator(;) + reserved(end)operator(;) + ident(MyChildren) operator(:=) reserved(nil)operator(;) + + reserved(except) + reserved(if) ident(Terminated) reserved(then) + ident(Exit)operator(;) + ident(AddHint)operator(()string<delimiter(')content(Error in Spy: )delimiter(')> operator(+) ident(Mess)operator(\);) + ident(WorkWin)operator(.)ident(Label7)operator(.)ident(Caption) operator(:=) string<delimiter(')content(ERROR)delimiter(')>operator(;) + reserved(end)operator(;) + ident(CurNode) operator(:=) ident(zCurNode)operator(;) +reserved(end)operator(;) + +reserved(function) ident(FindItemByRealName)operator(()ident(LV)operator(:) ident(TListView)operator(;) ident(Text)operator(:) reserved(string)operator(\):) ident(TListItem)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) reserved(nil)operator(;) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(LV)operator(.)ident(Items)operator(.)ident(Count)operator(-)integer(1) reserved(do) + reserved(if) ident(LV)operator(.)ident(Items)operator([)ident(i)operator(].)ident(Caption) operator(=) ident(Text) reserved(then) reserved(begin) + ident(Result) operator(:=) ident(LV)operator(.)ident(Items)operator([)ident(i)operator(];) + ident(Exit)operator(;) reserved(end)operator(;) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(LV)operator(.)ident(Items)operator(.)ident(Count)operator(-)integer(1) reserved(do) + reserved(if) ident(SameText)operator(()ident(RealValueName)operator(()ident(LV)operator(.)ident(Items)operator([)ident(i)operator(]\),) ident(Text)operator(\)) reserved(then) reserved(begin) + ident(Result) operator(:=) ident(LV)operator(.)ident(Items)operator([)ident(i)operator(];) + ident(Break)operator(;) reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TRegSpyThread)operator(.)ident(ReloadValues)operator(;) +reserved(var) + ident(Item)operator(:) ident(TListItem)operator(;) + ident(Real)operator(,) ident(Cur)operator(:) ident(TStringList)operator(;) + ident(Dif)operator(:) ident(TSLComp)operator(;) + ident(i)operator(:) ident(integer)operator(;) +reserved(begin) + reserved(if) ident(Terminated) reserved(or) ident(Restart) reserved(then) + ident(Exit)operator(;) + + reserved(if) reserved(not) ident(OpenNodeOK)operator(()ident(Reg)operator(,) ident(RegTV)operator(.)ident(Selected)operator(\)) reserved(then) + ident(Exit)operator(;) + + ident(Real) operator(:=) ident(TStringList)operator(.)ident(Create)operator(;) + ident(Reg)operator(.)ident(GetValueNames)operator(()ident(Real)operator(\);) + + ident(Cur) operator(:=) ident(TStringList)operator(.)ident(Create)operator(;) + reserved(with) ident(ValueList)operator(.)ident(Items) reserved(do) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(Count)operator(-)integer(1) reserved(do) + ident(Cur)operator(.)ident(Add)operator(()ident(RealValueName)operator(()ident(Item)operator([)ident(i)operator(]\)\);) + + ident(Dif) operator(:=) ident(TSLComp)operator(.)ident(Create)operator(()ident(Cur)operator(,) ident(Real)operator(,) ident(False)operator(\);) + ident(Real)operator(.)ident(Free)operator(;) + ident(Cur)operator(.)ident(Free)operator(;) + + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(Dif)operator(.)ident(OnlyA)operator(.)ident(Count)operator(-)integer(1) reserved(do) reserved(begin) comment(//Gelöscht/wegbenannt) + ident(Item) operator(:=) ident(FindItemByRealName)operator(()ident(ValueList)operator(,) ident(Dif)operator(.)ident(OnlyA)operator([)ident(i)operator(]\);) + reserved(if) ident(Assigned)operator(()ident(Item)operator(\)) reserved(then) reserved(begin) + ident(Item)operator(.)ident(Delete)operator(;) + ident(AddTrace)operator(()string<delimiter(')content(Value deleted: )delimiter(')> operator(+) ident(Dif)operator(.)ident(OnlyA)operator([)ident(i)operator(]\);) + reserved(end)operator(;) + reserved(end)operator(;) + + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(ValueList)operator(.)ident(Items)operator(.)ident(Count)operator(-)integer(1) reserved(do) reserved(begin) comment(//Daten) + ident(Item) operator(:=) ident(ValueList)operator(.)ident(Items)operator([)ident(i)operator(];) + comment({if Item.SubItems.Count < 2 then begin + ShowMessage('Fehler in Sync.'\); + Exit end; }) + reserved(if) ident(ValuesWin)operator(.)ident(UpdateValue)operator(()ident(Reg)operator(,) ident(Item)operator(\)) reserved(then) + ident(AddTrace)operator(()string<delimiter(')content(Value Changed: )delimiter(')> operator(+) ident(Item)operator(.)ident(Caption) operator(+) string<delimiter(')content( = )delimiter(')> operator(+) + ident(ValueDataPreview)operator(()ident(Reg)operator(.)ident(ReadContext)operator(()ident(RealValueName)operator(()ident(Item)operator(\)\)\)\);) + reserved(end)operator(;) + + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(dif)operator(.)ident(OnlyB)operator(.)ident(Count)operator(-)integer(1) reserved(do) reserved(begin) comment(//Erstellt/hinbenannt) + ident(ValuesWin)operator(.)ident(AddValue)operator(()ident(Reg)operator(,) ident(dif)operator(.)ident(OnlyB)operator([)ident(i)operator(]\);) + ident(AddTrace)operator(()string<delimiter(')content(New Value: )delimiter(')> operator(+) ident(Dif)operator(.)ident(OnlyB)operator([)ident(i)operator(]\);) + reserved(end)operator(;) + + ident(Reg)operator(.)ident(CloseKey)operator(;) + ident(Dif)operator(.)ident(Free)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TRegSpyThread)operator(.)ident(Spy)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) + ident(a)operator(:) ident(Real)operator(;) +reserved(begin) + reserved(with) ident(TClock)operator(.)ident(Create) reserved(do) reserved(begin) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(RootNodes)operator(.)ident(Count)operator(-)integer(1) reserved(do) + ident(Reload)operator(()ident(TTreeNode)operator(()ident(RootNodes)operator([)ident(i)operator(]\)\);) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(High)operator(()ident(Shortcuts)operator(\)) reserved(do) + ident(Reload)operator(()ident(Shortcuts)operator([)ident(i)operator(].)ident(Node)operator(\);) + ident(Synchronize)operator(()ident(ReloadValues)operator(\);) + ident(a) operator(:=) ident(SecondsPassed) operator(*) integer(1000)operator(;) + ident(Free)operator(;) reserved(end)operator(;) + + reserved(if) ident(a) operator(>) integer(0) reserved(then) + ident(WorkWin)operator(.)ident(Label7)operator(.)ident(Caption) operator(:=) string<delimiter(')content(Spy: )delimiter(')> operator(+) ident(Format)operator(()string<delimiter(')content(%0.2f)delimiter(')>operator(,) operator([)ident(a)operator(]\)) operator(+) string<delimiter(')content( s)delimiter(')>operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TRegSpyThread)operator(.)ident(AddTrace)operator(()ident(Trace)operator(:) reserved(string)operator(\);) +reserved(begin) + reserved(with) ident(WorkWin) reserved(do) + reserved(if) ident(ListTracesCB)operator(.)ident(Checked) reserved(then) + ident(SpyLB)operator(.)ident(Items)operator(.)ident(Add)operator(()ident(Trace)operator(\);) +reserved(end)operator(;) + +reserved(destructor) ident(TRegSpyThread)operator(.)ident(Destroy)operator(;) +reserved(begin) + ident(Dif)operator(.)ident(Free)operator(;) + ident(Reg)operator(.)ident(Free)operator(;) + reserved(inherited)operator(;) +reserved(end)operator(;) + +reserved(end)operator(.) +reserved(unit) ident(TreeU)operator(;) +preprocessor({$DEFINE UNIKEY}) +preprocessor({$DEFINE CYCFS}) + +reserved(interface) + +reserved(uses) + ident(Windows)operator(,) ident(Messages)operator(,) ident(SysUtils)operator(,) ident(Variants)operator(,) ident(Classes)operator(,) ident(Graphics)operator(,) ident(Controls)operator(,) ident(Forms)operator(,) + ident(ComCtrls)operator(,) ident(Menus)operator(,) ident(Clipbrd)operator(,) ident(keybrd)operator(,) ident(Dialogs)operator(,) ident(YTools)operator(,) ident(PlutoConst)operator(,) ident(CompEx)operator(,) + ident(IniFiles)operator(,) ident(XReg)operator(,) ident(Colors)operator(,) ident(Clock)operator(,) + ident(ToolWin)operator(,) ident(RegFiles) preprocessor({$IFDEF UNIKEY})operator(,) ident(UniKey)operator(,) ident(ImgList) preprocessor({$ENDIF})operator(;) + +reserved(type) + ident(TTreeWin) operator(=) reserved(class)operator(()ident(TForm)operator(\)) + ident(RegTVPU)operator(:) ident(TPopupMenu)operator(;) + ident(NewSubKeyMI)operator(:) ident(TMenuItem)operator(;) + ident(NewKeyMI)operator(:) ident(TMenuItem)operator(;) + ident(CreateShortcutMI)operator(:) ident(TMenuItem)operator(;) + ident(TraceMI)operator(:) ident(TMenuItem)operator(;) + ident(N3)operator(:) ident(TMenuItem)operator(;) + ident(DeleteMI)operator(:) ident(TMenuItem)operator(;) + ident(DublicateMI)operator(:) ident(TMenuItem)operator(;) + ident(N4)operator(:) ident(TMenuItem)operator(;) + ident(FindMI)operator(:) ident(TMenuItem)operator(;) + ident(RegTV)operator(:) ident(TTreeView)operator(;) + ident(PastePathMI)operator(:) ident(TMenuItem)operator(;) + ident(N1)operator(:) ident(TMenuItem)operator(;) + ident(InsertPathMI)operator(:) ident(TMenuItem)operator(;) + ident(RenameMI)operator(:) ident(TMenuItem)operator(;) + ident(CopyPathMI)operator(:) ident(TMenuItem)operator(;) + ident(CutPathMI)operator(:) ident(TMenuItem)operator(;) + ident(EditShortcutMI)operator(:) ident(TMenuItem)operator(;) + ident(N2)operator(:) ident(TMenuItem)operator(;) + ident(Export1)operator(:) ident(TMenuItem)operator(;) + ident(SubKeylist1)operator(:) ident(TMenuItem)operator(;) + ident(ValueNameslist1)operator(:) ident(TMenuItem)operator(;) + ident(KeyInfosMI)operator(:) ident(TMenuItem)operator(;) + ident(N5)operator(:) ident(TMenuItem)operator(;) + ident(ExportAsReg)operator(:) ident(TMenuItem)operator(;) + ident(ExportD)operator(:) ident(TSaveDialog)operator(;) + reserved(procedure) ident(FormCreate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(RegTVClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(RegTVChange)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(\);) + reserved(procedure) ident(RegTVChanging)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(;) reserved(var) ident(AllowChange)operator(:) ident(Boolean)operator(\);) + reserved(procedure) ident(RegTVCollapsing)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(;) reserved(var) ident(AllowCollapse)operator(:) ident(Boolean)operator(\);) + reserved(procedure) ident(RegTVCustomDrawItem)operator(()ident(Sender)operator(:) ident(TCustomTreeView)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(;) ident(State)operator(:) ident(TCustomDrawState)operator(;) reserved(var) ident(DefaultDraw)operator(:) ident(Boolean)operator(\);) + reserved(procedure) ident(RegTVDblClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(RegTVDeletion)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(\);) + reserved(procedure) ident(RegTVDragDrop)operator(()ident(Sender)operator(,) ident(Source)operator(:) ident(TObject)operator(;) ident(X)operator(,) ident(Y)operator(:) ident(Integer)operator(\);) + reserved(procedure) ident(RegTVDragOver)operator(()ident(Sender)operator(,) ident(Source)operator(:) ident(TObject)operator(;) ident(X)operator(,) ident(Y)operator(:) ident(Integer)operator(;) ident(State)operator(:) ident(TDragState)operator(;) reserved(var) ident(Accept)operator(:) ident(Boolean)operator(\);) + reserved(procedure) ident(RegTVEdited)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(;) reserved(var) ident(S)operator(:) ident(String)operator(\);) + reserved(procedure) ident(RegTVEditing)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(;) reserved(var) ident(AllowEdit)operator(:) ident(Boolean)operator(\);) + reserved(procedure) ident(RegTVEndDrag)operator(()ident(Sender)operator(,) ident(Target)operator(:) ident(TObject)operator(;) ident(X)operator(,) ident(Y)operator(:) ident(Integer)operator(\);) + reserved(procedure) ident(RegTVEnter)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(RegTVExpanded)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(\);) + reserved(procedure) ident(RegTVExpanding)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(;) reserved(var) ident(AllowExpansion)operator(:) ident(Boolean)operator(\);) + reserved(procedure) ident(RegTVGetSelectedIndex)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(\);) + reserved(procedure) ident(RegTVKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) ident(Shift)operator(:) ident(TShiftState)operator(\);) + reserved(procedure) ident(RegTVMouseDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Button)operator(:) ident(TMouseButton)operator(;) ident(Shift)operator(:) ident(TShiftState)operator(;) ident(X)operator(,) ident(Y)operator(:) ident(Integer)operator(\);) + reserved(procedure) ident(RegTVStartDrag)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(DragObject)operator(:) ident(TDragObject)operator(\);) + + reserved(function) ident(CreateKey)operator(()ident(Subkey)operator(:) ident(Boolean)operator(\):) ident(Boolean)operator(;) + reserved(procedure) ident(CloneKey)operator(;) + reserved(procedure) ident(DeleteKey)operator(;) + reserved(procedure) ident(NewShortcut)operator(;) + reserved(procedure) ident(MoveKey)operator(()reserved(const) ident(Src)operator(,) ident(Trg)operator(:) ident(TRegPath)operator(;) ident(CopyWanted)operator(:) ident(Boolean)operator(\);) + reserved(procedure) ident(MoveValues)operator(()ident(SrcNode)operator(,) ident(TrgNode)operator(:) ident(TTreeNode)operator(;) ident(CopyWanted)operator(:) ident(Boolean)operator(\);) + + reserved(procedure) ident(NewSubKeyMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(NewKeyMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(CreateShortcutMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(TraceMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(DeleteMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(DublicateMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(FindMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(RegTVPUPopup)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(FormKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) ident(Shift)operator(:) ident(TShiftState)operator(\);) + reserved(procedure) ident(RegTVKeyPress)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Char)operator(\);) + reserved(procedure) ident(RegTVAdvancedCustomDrawItem)operator(()ident(Sender)operator(:) ident(TCustomTreeView)operator(;) + ident(Node)operator(:) ident(TTreeNode)operator(;) ident(State)operator(:) ident(TCustomDrawState)operator(;) ident(Stage)operator(:) ident(TCustomDrawStage)operator(;) + reserved(var) ident(PaintImages)operator(,) ident(DefaultDraw)operator(:) ident(Boolean)operator(\);) + reserved(procedure) ident(RenameMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(CopyPathMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(InsertPathMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(RegTVGetImageIndex)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(\);) + reserved(procedure) ident(CheckRegTVHotTrack)operator(;) + reserved(procedure) ident(PasteKeyMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(CutPathMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + + reserved(procedure) ident(OpenNextLevel)operator(()ident(Node)operator(:) ident(TTreeNode)operator(\);) + reserved(procedure) ident(EditShortcutMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(SubKeylist1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(ValueNameslist1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(KeyInfosMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(function) ident(GetKeyInfos)operator(:) reserved(string)operator(;) + reserved(procedure) ident(ExportAsRegClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(FormClose)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Action)operator(:) ident(TCloseAction)operator(\);) + + reserved(procedure) ident(Load)operator(;) + reserved(procedure) ident(Reg4WriterTerminate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + directive(private) + ident(DragNode)operator(:) ident(TTreeNode)operator(;) + ident(NoAsterisk)operator(:) ident(Boolean)operator(;) comment(//To prevent NumPadMULTIPLY and asterisk errors) + ident(UserCopyKeyFlag)operator(:) ident(Boolean)operator(;) + ident(SpaceCount)operator(:) ident(Integer)operator(;) comment(//EasterEgg) + directive(public) + ident(CantWrite)operator(:) ident(Boolean)operator(;) + ident(DoSmartExpand)operator(:) ident(Boolean)operator(;) + reserved(end)operator(;) + +reserved(procedure) ident(CheckNode)operator(()ident(Node)operator(:) ident(TTreeNode)operator(;) ident(OnlyOnce)operator(:) ident(Boolean) operator(=) ident(True)operator(;) + ident(TakeNodeSelected)operator(:) ident(Boolean) operator(=) ident(False)operator(\);) + +reserved(function) ident(AddShortcut)operator(()ident(Alias)operator(,) ident(RealPath)operator(:) reserved(string)operator(;) ident(Icon)operator(:) ident(Integer)operator(;) + ident(AHostType)operator(:) ident(TUniHostType) operator(=) ident(uhUserShortcut)operator(;) ident(WriteIni)operator(:) ident(Boolean) operator(=) ident(False)operator(\):) ident(TTreeNode)operator(;) +reserved(function) ident(ShortcutIndex)operator(()ident(Node)operator(:) ident(TTreeNode)operator(\):) ident(Integer)operator(;) + +reserved(function) ident(TraceKey)operator(()reserved(const) ident(Path)operator(:) reserved(string)operator(;) ident(AllowedShortcutTypes)operator(:) ident(TUniHostTypes) operator(=) + ident(uhNonSystemShortcuts)operator(\):) reserved(string)operator(;) + +reserved(type) + ident(TOpenNodeMode) operator(=) operator(()ident(onNodeNil)operator(,) ident(onError)operator(,) ident(onReadOnly)operator(,) ident(onFull)operator(\);) + +reserved(const) + ident(onOK) operator(=) operator([)ident(onFull)operator(,) ident(onReadOnly)operator(];) + +reserved(function) ident(OpenNode)operator(()ident(Reg)operator(:) ident(TXRegistry)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(\):) ident(TOpenNodeMode)operator(;) +reserved(function) ident(OpenNodeOK)operator(()ident(Reg)operator(:) ident(TXRegistry)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(\):) ident(Boolean)operator(;) +reserved(function) ident(OpenCurKey)operator(:) ident(Boolean)operator(;) +reserved(function) ident(OpenCurParent)operator(:) ident(Boolean)operator(;) + +reserved(var) + ident(TreeWin)operator(:) ident(TTreeWin)operator(;) + + ident(RegTV)operator(:) ident(TTreeView)operator(;) comment(//Shortcut for other units, equals TreeWin.RegTV) + +preprocessor({$IFDEF UNIKEY}) + ident(UserUniPath)operator(:) reserved(string) preprocessor({$IFDEF CYCFS}) operator(=) string<delimiter(')content(cYcFS <y:\\programme\\cYcFS\\test>)delimiter(')>preprocessor({$ENDIF})operator(;) +preprocessor({$ENDIF}) + ident(Shortcuts)operator(:) ident(TShortcutA)operator(;) + ident(RootNodes)operator(:) ident(TList)operator(;) comment(//list of TTreeNode;) + +reserved(implementation) + +reserved(uses) + ident(PlutoMain)operator(,) ident(ValuesU)operator(,) ident(FindWinU)operator(,) ident(WorkU)operator(,) ident(PrefU)operator(,) ident(ShellEx)operator(,) ident(Types)operator(;) + +preprocessor({$R *.dfm}) + +preprocessor({$IFDEF UNIKEY}) +reserved(function) ident(UniOfNode)operator(()ident(Node)operator(:) ident(TTreeNode)operator(\):) ident(TUniKey)operator(;) +reserved(var) + ident(UniPath)operator(:) ident(TUniPath)operator(;) +reserved(begin) + ident(UniPath) operator(:=) ident(UniOfStr)operator(()ident(UserUniPath)operator(\);) + ident(UniPath)operator(.)ident(Path) operator(:=) ident(Join)operator(()ident(Copy)operator(()ident(NodePath)operator(()ident(Node)operator(\),) integer(1)operator(,) ident(MaxInt)operator(\),) char<delimiter(')content(/)delimiter(')>operator(\);) + ident(Result) operator(:=) ident(TUniKey)operator(.)ident(CreateU)operator(()ident(UniPath)operator(,) ident(reTryToSolve)operator(\);) +reserved(end)operator(;) +preprocessor({$ENDIF}) + +reserved(procedure) ident(TTreeWin)operator(.)ident(FormCreate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(TreeU)operator(.)ident(RegTV) operator(:=) ident(RegTV)operator(;) + + ident(DragNode) operator(:=) reserved(nil)operator(;) + ident(NoAsterisk) operator(:=) ident(False)operator(;) + ident(DoSmartExpand) operator(:=) ident(True)operator(;) + ident(UserCopyKeyFlag) operator(:=) ident(True)operator(;) + ident(SpaceCount) operator(:=) integer(0)operator(;) comment(//EasterEgg) + + ident(RegTV)operator(.)ident(Items)operator(.)ident(Clear)operator(;) + ident(CheckRegTVHotTrack)operator(;) + + ident(KeyInfosMI)operator(.)ident(ImageIndex) operator(:=) ident(iconKeyInfos)operator(;) + + ident(NewSubKeyMI)operator(.)ident(ImageIndex) operator(:=) ident(iconSubKey)operator(;) + ident(NewKeyMI)operator(.)ident(ImageIndex) operator(:=) ident(iconKey)operator(;) + ident(CreateShortcutMI)operator(.)ident(ImageIndex) operator(:=) ident(iconShortcut)operator(;) + + ident(RenameMI)operator(.)ident(ImageIndex) operator(:=) ident(iconRename)operator(;) + ident(DeleteMI)operator(.)ident(ImageIndex) operator(:=) ident(iconDelete)operator(;) + ident(DublicateMI)operator(.)ident(ImageIndex) operator(:=) ident(iconKeyDublicate)operator(;) + + ident(FindMI)operator(.)ident(ImageIndex) operator(:=) ident(iconKeyFind)operator(;) + ident(TraceMI)operator(.)ident(ImageIndex) operator(:=) ident(iconKeyTrace)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(RegTVClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) ident(KeyIsDown)operator(()ident(VK_CONTROL)operator(\)) reserved(then) reserved(begin) + ident(TraceMIClick)operator(()ident(Sender)operator(\);) + ident(Exit)operator(;) reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(RegTVChange)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(\);) +reserved(var) + ident(Reg)operator(:) ident(TXRegistry)operator(;) + ident(OpenRe)operator(:) ident(TOpenNodeMode)operator(;) + +preprocessor({$IFDEF UNIKEY}) + ident(Uni)operator(:) ident(TUniKey)operator(;) + ident(ValueNames)operator(:) ident(TStringList)operator(;) + ident(Item)operator(:) ident(TListItem)operator(;) + ident(i)operator(:) ident(Integer)operator(;) + + reserved(procedure) ident(AppendSubItemData)operator(()ident(SubItems)operator(:) ident(TStrings)operator(;) ident(Uni)operator(:) ident(TUniKey)operator(;) + reserved(const) ident(ValueName)operator(:) reserved(string)operator(\);) + reserved(var) + ident(SL)operator(:) ident(TStringList)operator(;) + + reserved(procedure) ident(Add)operator(()reserved(const) ident(s)operator(:) reserved(string)operator(\);) + reserved(begin) + ident(SubItems)operator(.)ident(Append)operator(()ident(s)operator(\);) + reserved(end)operator(;) + + reserved(begin) + ident(SL) operator(:=) reserved(nil)operator(;) + reserved(try) + ident(Add)operator(()string<delimiter(')content(beta)delimiter(')>operator(\);) + + reserved(case) ident(Uni)operator(.)ident(GetDataType)operator(()ident(ValueName)operator(\)) reserved(of) + + ident(udString)operator(,) ident(udExpandString)operator(:) reserved(begin) + ident(Add)operator(()string<delimiter(')content(String)delimiter(')>operator(\);) + ident(Add)operator(()ident(Uni)operator(.)ident(ReadString)operator(()ident(ValueName)operator(\)\);) + reserved(end)operator(;) + + ident(udCardinal)operator(,) ident(udCardBigEndian)operator(,) ident(udInteger)operator(:) reserved(begin) + ident(Add)operator(()string<delimiter(')content(Numeric)delimiter(')>operator(\);) + ident(Add)operator(()ident(IntToStr)operator(()ident(Uni)operator(.)ident(ReadInteger)operator(()ident(ValueName)operator(\)\)\);) + reserved(end)operator(;) + + ident(udBinary)operator(,) ident(udNone)operator(:) reserved(begin) + ident(Add)operator(()string<delimiter(')content(Binary)delimiter(')>operator(\);) + ident(Add)operator(()ident(FriendlyStr)operator(()ident(Uni)operator(.)ident(ReadBinary)operator(()ident(ValueName)operator(\)\)\);) + reserved(end)operator(;) + + ident(udBoolean)operator(:) reserved(begin) + ident(Add)operator(()string<delimiter(')content(Boolean)delimiter(')>operator(\);) + ident(Add)operator(()ident(StrOfBool)operator(()ident(Uni)operator(.)ident(ReadBool)operator(()ident(ValueName)operator(\)\)\);) + reserved(end)operator(;) + + ident(udStringList)operator(:) reserved(begin) + ident(Add)operator(()string<delimiter(')content(List)delimiter(')>operator(\);) + reserved(if) reserved(not) ident(Assigned)operator(()ident(SL)operator(\)) reserved(then) + ident(SL) operator(:=) ident(TStringList)operator(.)ident(Create) + reserved(else) + ident(SL)operator(.)ident(Clear)operator(;) + ident(Uni)operator(.)ident(ReadStringList)operator(()ident(ValueName)operator(,) ident(SL)operator(\);) + ident(Add)operator(()ident(Join)operator(()ident(SL)operator(,) ident(MultiStringSeparator)operator(\)\);) + reserved(end)operator(;) + + ident(udColor)operator(:) reserved(begin) + ident(Add)operator(()string<delimiter(')content(Color)delimiter(')>operator(\);) + ident(Add)operator(()ident(ColorToString)operator(()ident(Uni)operator(.)ident(ReadColor)operator(()ident(ValueName)operator(\)\)\);) + reserved(end)operator(;) + + reserved(else) + ident(Add)operator(()string<delimiter(')content(Unsupported Data Type: )delimiter(')> operator(+) + ident(IntToStr)operator(()ident(Cardinal)operator(()ident(Uni)operator(.)ident(GetDataType)operator(()ident(ValueName)operator(\)\)\)\);) + reserved(end)operator(;) comment(//case) + + reserved(finally) + ident(SL)operator(.)ident(Free)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + +preprocessor({$ENDIF}) + +reserved(begin) + ident(SpaceCount) operator(:=) integer(0)operator(;) comment(//Easteregg) + + ident(CheckNode)operator(()ident(Node)operator(,) ident(False)operator(\);) + ident(CantWrite) operator(:=) ident(False)operator(;) + + reserved(try) + ident(SpyThread)operator(.)ident(Suspend)operator(;) + ident(Reg) operator(:=) ident(TXRegistry)operator(.)ident(Create)operator(;) + reserved(try) + +preprocessor({$IFDEF UNIKEY}) + reserved(if) ident(RootOfNode)operator(()ident(Node)operator(\).)ident(ImageIndex) operator(=) ident(iconHostUni) reserved(then) reserved(begin) + ident(ValueNames) operator(:=) ident(TStringList)operator(.)ident(Create)operator(;) + ident(ValueList)operator(.)ident(Clear)operator(;) + + ident(Uni) operator(:=) ident(UniOfNode)operator(()ident(Node)operator(\);) + comment({Uni := CreateUniSubKey(UserUniPath, Copy(NodePath(Node\), 1, MaxInt\), + reFaile\); }) + reserved(if) ident(Assigned)operator(()ident(Uni)operator(\)) reserved(then) + reserved(try) + ident(Uni)operator(.)ident(GetValueNames)operator(()ident(ValueNames)operator(\);) + + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(ValueNames)operator(.)ident(Count)operator(-)integer(1) reserved(do) reserved(begin) + ident(Item) operator(:=) ident(ValuesWin)operator(.)ident(AddValue)operator(()ident(Reg)operator(,) ident(ValueNames)operator([)ident(i)operator(],) ident(False)operator(\);) + ident(Item)operator(.)ident(ImageIndex) operator(:=) ident(iconHostUni2)operator(;) + ident(AppendSubItemData)operator(()ident(Item)operator(.)ident(SubItems)operator(,) ident(Uni)operator(,) ident(ValueNames)operator([)ident(i)operator(]\);) + reserved(end)operator(;) + + reserved(finally) + ident(Uni)operator(.)ident(Free)operator(;) + ident(ValueNames)operator(.)ident(Free)operator(;) + reserved(end)operator(;) + + reserved(end) reserved(else) reserved(begin) +preprocessor({$ENDIF}) + + ident(OpenRe) operator(:=) ident(OpenNode)operator(()ident(Reg)operator(,) ident(Node)operator(\);) + reserved(if) ident(OpenRe) reserved(in) ident(onOK) reserved(then) reserved(begin) + ident(ValuesWin)operator(.)ident(LoadValues)operator(()ident(Reg)operator(\);) + reserved(if) ident(OpenRe) operator(=) ident(onReadOnly) reserved(then) reserved(begin) + ident(AddHint)operator(()string<delimiter(')content(Read only)delimiter(')>operator(,) ident(True)operator(\);) + ident(CantWrite) operator(:=) ident(True)operator(;) + reserved(end)operator(;) + reserved(end) reserved(else) reserved(if) ident(OpenRe) operator(=) ident(onError) reserved(then) reserved(begin) + ident(ValueList)operator(.)ident(Clear)operator(;) + ident(CantWrite) operator(:=) ident(True)operator(;) + reserved(if) ident(Node)operator(.)ident(Level) operator(=) integer(0) reserved(then) reserved(begin) + ident(AddHint)operator(()string<delimiter(')content(Shortcut target not found)delimiter(')>operator(,) ident(True)operator(\);) + reserved(end) reserved(else) + ident(AddHint)operator(()string<delimiter(')content(Key not found: )delimiter(')> operator(+) ident(Node)operator(.)ident(Text)operator(,) ident(True)operator(\);) + reserved(end)operator(;) + +preprocessor({$IFDEF UNIKEY}) + reserved(end)operator(;) +preprocessor({$ENDIF}) + + reserved(finally) + ident(Reg)operator(.)ident(Free)operator(;) + reserved(end)operator(;) + + ident(CantWrite) operator(:=) ident(CantWrite) reserved(or) reserved(not) ident(Assigned)operator(()ident(Node)operator(\)) + reserved(or) ident(NodeInfo)operator(() ident(Node) operator(\).)ident(ReadOnly) comment(//Node itself) + reserved(or) ident(NodeInfo)operator(()ident(RootOfNode)operator(()ident(Node)operator(\)\).)ident(ReadOnly) comment(//or host) + reserved(or) operator(()ident(SameText)operator(()ident(CurKey)operator(()ident(uhNonSystemShortcuts)operator(\).)ident(Root)operator(,) string<delimiter(')content(HKEY_DYN_DATA)delimiter(')>operator(\)\);) + + ident(MainWin)operator(.)ident(SetStatus)operator(;) + ident(WorkWin)operator(.)ident(InfoMemo)operator(.)ident(Text) operator(:=) ident(GetKeyInfos)operator(;) + reserved(finally) + ident(SpyThread)operator(.)ident(Restart) operator(:=) ident(True)operator(;) + ident(SpyThread)operator(.)ident(Resume)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(RegTVChanging)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(;) + reserved(var) ident(AllowChange)operator(:) ident(Boolean)operator(\);) +reserved(begin) + ident(CantWrite) operator(:=) ident(False)operator(;) + ident(AllowChange) operator(:=) ident(Assigned)operator(()ident(Node)operator(\);) + comment(// CheckNode(Node, True\);) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(RegTVCollapsing)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(;) + reserved(var) ident(AllowCollapse)operator(:) ident(Boolean)operator(\);) +reserved(begin) + ident(SpyThread)operator(.)ident(Restart) operator(:=) ident(True)operator(;) + ident(Node)operator(.)ident(DeleteChildren)operator(;) + ident(RegTVChange)operator(()ident(Sender)operator(,) ident(Node)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(RegTVCustomDrawItem)operator(()ident(Sender)operator(:) ident(TCustomTreeView)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(;) + ident(State)operator(:) ident(TCustomDrawState)operator(;) reserved(var) ident(DefaultDraw)operator(:) ident(Boolean)operator(\);) +reserved(var) + ident(Info)operator(:) ident(TNodeInfo)operator(;) +reserved(begin) + comment({if Node.Text = '' then begin + ShowMessage('Error: Key has empty name.'\); + Node.Delete; + Exit; end;}) + + ident(Info) operator(:=) ident(NodeInfo)operator(()ident(Node)operator(\);) + reserved(with) ident(TTreeView)operator(()ident(Sender)operator(\).)ident(Canvas)operator(.)ident(Font) reserved(do) reserved(begin) + reserved(if) ident(Info)operator(.)ident(Defect) reserved(then) reserved(begin) + ident(Style) operator(:=) operator([];) + ident(Color) operator(:=) hex($AAAAAA) + reserved(end) reserved(else) reserved(begin) + reserved(case) ident(Info)operator(.)ident(HostType) reserved(of) + + ident(uhReg)operator(:) reserved(begin) + ident(Style) operator(:=) operator([)ident(fsBold)operator(];) + ident(Color) operator(:=) ident(clCyan)operator(;) + reserved(end)operator(;) + + comment({uhIni: begin + Style := [fsBold]; + Color := clBrightYellow; + end; + + uhRegFile: begin + Style := [fsBold]; + Color := clBrightGreen; + end; }) + + ident(uhSystemShortcut)operator(:) reserved(begin) + ident(Style) operator(:=) operator([];) + ident(Color) operator(:=) ident(clBrightCyan)operator(;) + reserved(end)operator(;) + + ident(uhStandardShortcut)operator(:) reserved(begin) + ident(Style) operator(:=) operator([)ident(fsBold)operator(];) + ident(Color) operator(:=) hex($EEEEEE)operator(;) + reserved(end)operator(;) + + ident(uhUserShortcut)operator(:) reserved(begin) + ident(Style) operator(:=) operator([];) + ident(Color) operator(:=) hex($EEEEEE)operator(;) + reserved(end)operator(;) + + reserved(else) + ident(Style) operator(:=) operator([];) + reserved(if) ident(Info)operator(.)ident(ReadOnly) reserved(then) + ident(Color) operator(:=) ident(clBrightRed) + reserved(else) + ident(Color) operator(:=) ident(clWhite)operator(;) + reserved(end)operator(;) + + reserved(end)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(RegTVDblClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(Node)operator(:) ident(TTreeNode)operator(;) + ident(MouseX)operator(:) ident(Integer)operator(;) + ident(NodeRect)operator(:) ident(TRect)operator(;) +reserved(begin) + ident(Node) operator(:=) ident(RegTV)operator(.)ident(Selected)operator(;) + reserved(if) reserved(not) ident(Assigned)operator(()ident(Node)operator(\)) reserved(then) + ident(Exit)operator(;) + + ident(MouseX) operator(:=) ident(RegTV)operator(.)ident(ScreenToClient)operator(()ident(Mouse)operator(.)ident(CursorPos)operator(\).)ident(X)operator(;) + ident(NodeRect) operator(:=) ident(Node)operator(.)ident(DisplayRect)operator(()ident(True)operator(\);) + reserved(if) ident(MouseX) operator(>) ident(NodeRect)operator(.)ident(Right) reserved(then) reserved(begin) + reserved(with) ident(ValuesWin) reserved(do) reserved(begin) + ident(FocusItem)operator(()ident(PrefWin)operator(.)ident(MainPreviewE)operator(.)ident(Text)operator(\);) + ident(ValueListDblClick)operator(()ident(Self)operator(\);) + reserved(end)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(RegTVDeletion)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(\);) +reserved(begin) + reserved(if) ident(Assigned)operator(()ident(SpyThread)operator(\)) reserved(then) + ident(SpyThread)operator(.)ident(Restart) operator(:=) ident(True)operator(;) + reserved(if) ident(Node)operator(.)ident(Selected) reserved(then) + ident(RegTV)operator(.)ident(Selected) operator(:=) ident(GetNextBest)operator(()ident(Node)operator(\);) + ident(NodeInfo)operator(()ident(Node)operator(\).)ident(Free)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(RegTVDragDrop)operator(()ident(Sender)operator(,) ident(Source)operator(:) ident(TObject)operator(;) ident(X)operator(,) ident(Y)operator(:) ident(Integer)operator(\);) + + reserved(procedure) ident(DragKey)operator(;) + reserved(var) + ident(Src)operator(,) ident(Trg)operator(:) ident(TRegPath)operator(;) + ident(Node)operator(:) ident(TTreeNode)operator(;) + reserved(begin) + ident(Src) operator(:=) ident(RegPathOfStr)operator(()ident(TraceKey)operator(()ident(PathOfNode)operator(()ident(DragNode)operator(\)\)\);) + ident(Trg) operator(:=) ident(RegPathOfStr)operator(()ident(TraceKey)operator(()ident(PathOfNode)operator(()ident(RegTV)operator(.)ident(DropTarget)operator(\)\)\);) + ident(Trg)operator(.)ident(Key) operator(:=) ident(Trg)operator(.)ident(Key) operator(+) char<delimiter(')content(\\)delimiter(')> operator(+) ident(DragNode)operator(.)ident(Text)operator(;) + + ident(MoveKey)operator(()ident(Src)operator(,) ident(Trg)operator(,) ident(KeyIsDown)operator(()ident(VK_CONTROL)operator(\)\);) + + ident(Node) operator(:=) ident(RegTV)operator(.)ident(DropTarget)operator(;) + reserved(if) ident(Node)operator(.)ident(Expanded) reserved(then) + ident(Node)operator(.)ident(Collapse)operator(()ident(False)operator(\);) + ident(Node)operator(.)ident(Expanded) operator(:=) ident(False)operator(;) + ident(CheckNode)operator(()ident(Node)operator(,) ident(False)operator(,) ident(True)operator(\);) + ident(Node)operator(.)ident(Expand)operator(()ident(False)operator(\);) + reserved(end)operator(;) + + reserved(procedure) ident(DragValues)operator(;) + reserved(begin) + ident(MoveValues)operator(()ident(RegTV)operator(.)ident(Selected)operator(,) ident(RegTV)operator(.)ident(DropTarget)operator(,) ident(KeyIsDown)operator(()ident(VK_CONTROL)operator(\)\);) + reserved(end)operator(;) + +reserved(begin) + reserved(if) ident(Source) reserved(is) ident(TTreeView) reserved(then) + ident(DragKey) + reserved(else) reserved(if) ident(Source) reserved(is) ident(TListView) reserved(then) + ident(DragValues)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(RegTVDragOver)operator(()ident(Sender)operator(,) ident(Source)operator(:) ident(TObject)operator(;) ident(X)operator(,) ident(Y)operator(:) ident(Integer)operator(;) + ident(State)operator(:) ident(TDragState)operator(;) reserved(var) ident(Accept)operator(:) ident(Boolean)operator(\);) +reserved(begin) + ident(Accept) operator(:=) ident(False)operator(;) + reserved(if) reserved(not) ident(Assigned)operator(()ident(RegTV)operator(.)ident(DropTarget)operator(\)) reserved(then) + ident(Exit)operator(;) + + reserved(if) ident(Source) reserved(is) ident(TTreeView) reserved(then) reserved(begin) + reserved(if) reserved(not) ident(Assigned)operator(()ident(DragNode)operator(\)) reserved(then) + ident(Exit)operator(;) + reserved(if) reserved(not) ident(KeyIsDown)operator(()ident(VK_CONTROL)operator(\)) reserved(then) reserved(begin) + reserved(if) operator(()ident(DragNode) operator(=) ident(RegTV)operator(.)ident(DropTarget)operator(\)) + reserved(or) ident(RegTV)operator(.)ident(DropTarget)operator(.)ident(HasAsParent)operator(()ident(DragNode)operator(\)) reserved(then) + ident(Exit)operator(;) comment(//avoid recursive moving) + reserved(end)operator(;) + reserved(end) reserved(else) reserved(if) ident(Source) reserved(is) ident(TListView) reserved(then) reserved(begin) + comment(//accept) + reserved(end)operator(;) + ident(Accept) operator(:=) ident(True)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(RegTVEdited)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(;) reserved(var) ident(S)operator(:) reserved(string)operator(\);) +reserved(var) + ident(old)operator(,) ident(tmp)operator(:) reserved(string)operator(;) + ident(i)operator(:) ident(Integer)operator(;) + ident(Shortcut)operator(:) ident(PKeyShortcut)operator(;) +reserved(begin) + reserved(if) ident(s) operator(=) ident(Node)operator(.)ident(Text) reserved(then) + ident(Exit)operator(;) + + ident(Old) operator(:=) ident(Node)operator(.)ident(Text)operator(;) + + reserved(if) ident(NodeInfo)operator(()ident(Node)operator(\).)ident(HostType) operator(=) ident(uhUserShortcut) reserved(then) reserved(begin) + ident(i) operator(:=) ident(ShortcutIndex)operator(()ident(Node)operator(\);) + reserved(if) ident(i) operator(=) operator(-)integer(1) reserved(then) reserved(begin) + ident(ShowMessage)operator(()string<delimiter(')content(Shortcut not found!)delimiter(')>operator(\);) + ident(s) operator(:=) ident(old)operator(;) + ident(Exit)operator(;) reserved(end)operator(;) + + ident(Shortcut) operator(:=) operator(@)ident(Shortcuts)operator([)ident(i)operator(];) + ident(Shortcut)operator(.)ident(Alias) operator(:=) ident(s)operator(;) + + reserved(with) ident(TIniFile)operator(.)ident(Create)operator(()ident(PlutoDir) operator(+) string<delimiter(')content(Shortcuts.ini)delimiter(')>operator(\)) reserved(do) + reserved(try) + ident(DeleteKey)operator(()string<delimiter(')content(Shortcuts)delimiter(')>operator(,) ident(Old)operator(\);) + ident(WriteString)operator(()string<delimiter(')content(Shortcuts)delimiter(')>operator(,) ident(Shortcut)operator(.)ident(Alias)operator(,) ident(Shortcut)operator(.)ident(RealPath)operator(\);) + reserved(finally) + ident(Free)operator(;) + reserved(end)operator(;) + ident(Node)operator(.)ident(Text) operator(:=) ident(s)operator(;) + ident(RegTVChange)operator(()ident(Self)operator(,) ident(Node)operator(\);) + ident(Exit)operator(;) reserved(end)operator(;) + + reserved(if) ident(s) operator(=) string<delimiter(')delimiter(')> reserved(then) reserved(begin) + ident(ShowMessage)operator(()string<delimiter(')content(KeyNames cannot be empty.)delimiter(')>operator(\);) + ident(s) operator(:=) ident(old)operator(;) + ident(Exit)operator(;) reserved(end)operator(;) + + ident(SpyThread)operator(.)ident(Suspend)operator(;) + ident(SpyThread)operator(.)ident(Restart) operator(:=) ident(True)operator(;) + ident(Node)operator(.)ident(Text) operator(:=) ident(s)operator(;) + + reserved(if) ident(Length)operator(()ident(s)operator(\)) operator(>) ident(RegMaxKeyLen) reserved(then) reserved(begin) + ident(s) operator(:=) ident(Copy)operator(()ident(s)operator(,) integer(1)operator(,) ident(RegMaxKeyLen)operator(\);) + reserved(if) ident(MessageDlg)operator(() + string<delimiter(')content(The maximum size of a key name is )delimiter(')> operator(+) ident(IntToStr)operator(()ident(RegMaxKeyLen)operator(\)) operator(+) string<delimiter(')content( characters.)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(Shorten the key name to:)delimiter(')> operator(+) ident(EOL) operator(+) + ident(Quote)operator(()ident(StringWrap)operator(()ident(s)operator(,) integer(80)operator(\)\),) + ident(mtConfirmation)operator(,) operator([)ident(mbOK)operator(,) ident(mbCancel)operator(],) integer(0)operator(\)) operator(<>) ident(mrOK) reserved(then) reserved(begin) + ident(s) operator(:=) ident(Old)operator(;) + ident(SpyThread)operator(.)ident(Resume)operator(;) + ident(Exit)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + reserved(if) ident(CharIn)operator(()ident(s)operator(,) operator([)char(#0)operator(..)char(#31)operator(,) char<delimiter(')content(\\)delimiter(')>operator(]\)) reserved(then) reserved(begin) + ident(s) operator(:=) ident(ReplaceChars)operator(()ident(s)operator(,) operator([)char(#0)operator(..)char(#31)operator(],) char<delimiter(')content(#)delimiter(')>operator(\);) + ident(s) operator(:=) ident(ReplaceChars)operator(()ident(s)operator(,) char<delimiter(')content(\\)delimiter(')>operator(,) char<delimiter(')content(-)delimiter(')>operator(\);) + + reserved(if) ident(MessageDlg)operator(()string<delimiter(')content(The following characters are not allowed in KeyNames:)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(- Control chars (0-31\))delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(- )delimiter(')> operator(+) ident(Quote)operator(()char<delimiter(')content(\\)delimiter(')>operator(\)) operator(+) ident(EOL) operator(+) + string<delimiter(')content(The following name is allowed:)delimiter(')> operator(+) ident(EOL) operator(+) + ident(s) operator(+) ident(EOL) operator(+) + string<delimiter(')content(Use this name instead?)delimiter(')>operator(,) + ident(mtConfirmation)operator(,) operator([)ident(mbYes)operator(,) ident(mbNo)operator(],) integer(0)operator(\)) operator(<>) ident(mrYes) reserved(then) reserved(begin) + ident(s) operator(:=) ident(Old)operator(;) + ident(SpyThread)operator(.)ident(Resume)operator(;) + ident(Exit)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + reserved(try) + ident(OpenCurParent)operator(;) + reserved(if) reserved(not) ident(SameText)operator(()ident(s)operator(,) ident(Old)operator(\)) reserved(then) reserved(begin) + reserved(if) reserved(not) ident(MainReg)operator(.)ident(KeyExists)operator(()ident(s)operator(\)) reserved(or) + operator(()ident(mrIgnore) operator(=) ident(MessageDlg)operator(() + string<delimiter(')content(Key already exists.)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(Click Ignore to overwrite the key.)delimiter(')>operator(,) + ident(mtConfirmation)operator(,) operator([)ident(mbCancel)operator(,) ident(mbIgnore)operator(],) integer(0)operator(\)) + operator(\)) reserved(then) reserved(begin) + ident(MainReg)operator(.)ident(DeleteKey)operator(()ident(s)operator(\);) + ident(MainReg)operator(.)ident(MoveKey)operator(()ident(Old)operator(,) ident(s)operator(,) ident(True)operator(\);) + ident(Node)operator(.)ident(Text) operator(:=) ident(Old)operator(;) + reserved(end) reserved(else) reserved(begin) + ident(s) operator(:=) ident(Old)operator(;) + reserved(end)operator(;) + reserved(end) reserved(else) reserved(begin) comment(//change CharCase) + ident(tmp) operator(:=) ident(MainReg)operator(.)ident(GetFreeKeyName)operator(;) + ident(AddHint)operator(()string<delimiter(')content(Forced change of case using temporary key )delimiter(')> operator(+) ident(Quote)operator(()ident(tmp)operator(\)\);) + ident(MainReg)operator(.)ident(MoveKey)operator(()ident(Old)operator(,) ident(tmp)operator(,) ident(True)operator(\);) + ident(MainReg)operator(.)ident(MoveKey)operator(()ident(tmp)operator(,) ident(s)operator(,) ident(True)operator(\);) + reserved(end)operator(;) + reserved(finally) + ident(MainReg)operator(.)ident(CloseKey)operator(;) + reserved(end)operator(;) + + ident(Node)operator(.)ident(Text) operator(:=) ident(s)operator(;) + ident(SpyThread)operator(.)ident(Resume)operator(;) + ident(RegTVChange)operator(()ident(Sender)operator(,) ident(Node)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(RegTVEditing)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(;) + reserved(var) ident(AllowEdit)operator(:) ident(Boolean)operator(\);) +reserved(begin) + ident(CheckNode)operator(()ident(Node)operator(,) ident(False)operator(\);) + reserved(if) ident(RegTV)operator(.)ident(Selected) operator(<>) ident(Node) reserved(then) + ident(Exit)operator(;) + ident(AllowEdit) operator(:=) operator(()ident(NodeInfo)operator(()ident(Node)operator(\).)ident(HostType) reserved(in) operator([)ident(uhNone)operator(,) ident(uhUserShortcut)operator(]\)) + reserved(and) operator(()reserved(not) ident(CantWrite)operator(\)) + reserved(and) ident(OpenCurKey)operator(;) + ident(MainReg)operator(.)ident(CloseKey)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(RegTVEndDrag)operator(()ident(Sender)operator(,) ident(Target)operator(:) ident(TObject)operator(;) ident(X)operator(,) ident(Y)operator(:) ident(Integer)operator(\);) +reserved(begin) + ident(DragNode) operator(:=) reserved(nil)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(RegTVEnter)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) reserved(not) ident(Started) reserved(then) + ident(Exit)operator(;) + ident(ValueList)operator(.)ident(ItemFocused) operator(:=) reserved(nil)operator(;) + ident(MainWin)operator(.)ident(SetStatus)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(RegTVExpanded)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(\);) +reserved(begin) + reserved(if) reserved(not) ident(DoSmartExpand) reserved(or) reserved(not) ident(PrefWin)operator(.)ident(SmartExpandCB)operator(.)ident(Checked) reserved(then) + ident(Exit)operator(;) + + reserved(if) reserved(not) ident(Assigned)operator(()ident(Node)operator(\)) reserved(then) + ident(Exit)operator(;) + + ident(RegTVChange)operator(()ident(Sender)operator(,) ident(Node)operator(\);) + + comment(//SmartExpand) + reserved(if) operator(()ident(Node)operator(.)ident(Count) operator(>) integer(0)operator(\)) reserved(and) operator(()ident(ValueList)operator(.)ident(Items)operator(.)ident(Count) operator(=) integer(0)operator(\)) reserved(then) reserved(begin) + ident(RegTV)operator(.)ident(Selected) operator(:=) ident(Node)operator(.)ident(GetFirstChild)operator(;) + ident(RegTVChange)operator(()ident(Sender)operator(,) ident(RegTV)operator(.)ident(Selected)operator(\);) + reserved(end)operator(;) + + reserved(if) ident(Node)operator(.)ident(Count) operator(=) integer(1) reserved(then) + ident(Node)operator(.)ident(GetFirstChild)operator(.)ident(Expand)operator(()ident(False)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(RegTVExpanding)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(;) + reserved(var) ident(AllowExpansion)operator(:) ident(Boolean)operator(\);) +reserved(var) + ident(SL)operator(:) ident(TStringList)operator(;) + ident(Reg)operator(:) ident(TXRegistry)operator(;) + ident(Clock)operator(:) ident(TClock)operator(;) +preprocessor({$IFDEF UNIKEY}) + ident(Uni)operator(:) ident(TUniKey)operator(;) +preprocessor({$ENDIF}) + + reserved(procedure) ident(AddKeys)operator(()ident(TreeView)operator(:) ident(TTreeView)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(;) ident(SL)operator(:) ident(TStrings)operator(\);) + reserved(var) + ident(i)operator(:) ident(Integer)operator(;) + reserved(begin) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(SL)operator(.)ident(Count)operator(-)integer(1) reserved(do) + ident(TreeView)operator(.)ident(Items)operator(.)ident(AddNode)operator(()ident(TTreeNode)operator(.)ident(Create)operator(()ident(TreeView)operator(.)ident(Items)operator(\),) ident(Node)operator(,) ident(SL)operator([)ident(i)operator(],) + reserved(nil)operator(,) ident(naAddChild)operator(\);) + reserved(end)operator(;) + + reserved(procedure) ident(AddKeysProgressive)operator(()ident(TreeView)operator(:) ident(TTreeView)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(;) + ident(SL)operator(:) ident(TStrings)operator(\);) + reserved(var) + ident(i)operator(,) ident(delta)operator(:) ident(Integer)operator(;) + ident(GaugeRect)operator(,) ident(FullRect)operator(:) ident(TRect)operator(;) + ident(GaugeWidth)operator(:) ident(Integer)operator(;) + reserved(begin) + ident(delta) operator(:=) ident(SL)operator(.)ident(Count) reserved(div) integer(100)operator(;) + ident(GaugeWidth) operator(:=) integer(100)operator(;) + reserved(with) ident(TreeView)operator(.)ident(Canvas) reserved(do) reserved(begin) + ident(FullRect) operator(:=) ident(Node)operator(.)ident(DisplayRect)operator(()ident(True)operator(\);) + reserved(with) ident(FullRect) reserved(do) reserved(begin) + ident(Left) operator(:=) ident(Right) operator(+) integer(40)operator(;) + ident(Right) operator(:=) ident(Left) operator(+) ident(GaugeWidth) operator(+) integer(2)operator(;) + ident(Inc)operator(()ident(Top)operator(,) integer(5)operator(\);) + ident(Dec)operator(()ident(Bottom)operator(,) integer(5)operator(\);) + reserved(end)operator(;) + reserved(with) ident(Pen) reserved(do) reserved(begin) + ident(Width) operator(:=) integer(1)operator(;) + ident(Style) operator(:=) ident(psSolid)operator(;) + reserved(end)operator(;) + ident(Pen)operator(.)ident(Color) operator(:=) ident(clBrightBlue)operator(;) + ident(Brush)operator(.)ident(Style) operator(:=) ident(bsClear)operator(;) + ident(Rectangle)operator(()ident(FullRect)operator(\);) + ident(Pen)operator(.)ident(Style) operator(:=) ident(psClear)operator(;) + reserved(end)operator(;) + + ident(GaugeRect) operator(:=) ident(FullRect)operator(;) + reserved(with) ident(GaugeRect) reserved(do) reserved(begin) + ident(Inc)operator(()ident(Left)operator(\);) + ident(Inc)operator(()ident(Top)operator(\);) + ident(Dec)operator(()ident(Bottom)operator(\);) + reserved(end)operator(;) + + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(SL)operator(.)ident(Count)operator(-)integer(1) reserved(do) reserved(begin) + ident(TreeView)operator(.)ident(Items)operator(.)ident(AddNode)operator(()ident(TTreeNode)operator(.)ident(Create)operator(()ident(TreeView)operator(.)ident(Items)operator(\),) ident(Node)operator(,) ident(SL)operator([)ident(i)operator(],) + reserved(nil)operator(,) ident(naAddChild)operator(\);) + + reserved(if) operator((()ident(i) operator(+) integer(1)operator(\)) reserved(mod) ident(delta)operator(\)) operator(=) integer(0) reserved(then) reserved(begin) + reserved(with) ident(TreeView)operator(.)ident(Canvas) reserved(do) reserved(begin) + ident(GaugeRect)operator(.)ident(Right) operator(:=) ident(GaugeRect)operator(.)ident(Left) operator(+) operator(()ident(GaugeWidth) operator(*) ident(i)operator(\)) reserved(div) ident(SL)operator(.)ident(Count)operator(;) + ident(Brush)operator(.)ident(Color) operator(:=) ident(GadientAqua)operator(()integer(90) operator(+) ident(Round)operator(()integer(100) operator(*) operator((()ident(i)operator(+)integer(1)operator(\)) operator(/) ident(SL)operator(.)ident(Count)operator(\)\)\);) + ident(FillRect)operator(()ident(GaugeRect)operator(\);) + reserved(end)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + reserved(with) ident(TreeView)operator(.)ident(Canvas) reserved(do) reserved(begin) + ident(Pen)operator(.)ident(Color) operator(:=) ident(clVeryBrightBlue)operator(;) + ident(Pen)operator(.)ident(Style) operator(:=) ident(psSolid)operator(;) + ident(Brush)operator(.)ident(Color) operator(:=) ident(GadientAqua)operator(()integer(200)operator(\);) + ident(Rectangle)operator(()ident(FullRect)operator(\);) + ident(Brush)operator(.)ident(Style) operator(:=) ident(bsClear)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + +reserved(begin) + reserved(if) ident(Node)operator(.)ident(Expanded) reserved(then) + ident(Exit)operator(;) + + ident(SpyThread)operator(.)ident(Suspend)operator(;) + ident(SL) operator(:=) ident(TStringList)operator(.)ident(Create)operator(;) + ident(Clock) operator(:=) ident(TClock)operator(.)ident(Create)operator(;) + + reserved(try) + +preprocessor({$IFDEF UNIKEY}) + reserved(if) ident(RootOfNode)operator(()ident(Node)operator(\).)ident(ImageIndex) operator(=) ident(iconHostUni) reserved(then) reserved(begin) + ident(Uni) operator(:=) ident(UniOfNode)operator(()ident(Node)operator(\);) + reserved(if) ident(Assigned)operator(()ident(Uni)operator(\)) reserved(then) + reserved(try) + ident(Uni)operator(.)ident(GetKeyNames)operator(()ident(SL)operator(\);) + reserved(finally) + ident(Uni)operator(.)ident(Free)operator(;) + reserved(end)operator(;) + + reserved(end) reserved(else) reserved(begin) +preprocessor({$ENDIF}) + + ident(Reg) operator(:=) ident(TXRegistry)operator(.)ident(Create)operator(;) + reserved(try) + reserved(if) ident(OpenNodeOK)operator(()ident(Reg)operator(,) ident(Node)operator(\)) reserved(then) + ident(Reg)operator(.)ident(GetKeyNames)operator(()ident(SL)operator(\);) + reserved(finally) + ident(Reg)operator(.)ident(Free)operator(;) + reserved(end)operator(;) + +preprocessor({$IFDEF UNIKEY}) + reserved(end)operator(;) +preprocessor({$ENDIF}) + + ident(Node)operator(.)ident(DeleteChildren)operator(;) + reserved(if) ident(PrefWin)operator(.)ident(ShowProgressCB)operator(.)ident(Checked) reserved(and) operator(()ident(SL)operator(.)ident(Count) operator(>) integer(100)operator(\)) reserved(then) + ident(AddKeysProgressive)operator(()ident(RegTV)operator(,) ident(Node)operator(,) ident(SL)operator(\)) + reserved(else) + ident(AddKeys)operator(()ident(RegTV)operator(,) ident(Node)operator(,) ident(SL)operator(\);) + + reserved(if) ident(PrefWin)operator(.)ident(SortKeysCB)operator(.)ident(Checked) reserved(then) + ident(Node)operator(.)ident(AlphaSort)operator(;) + + reserved(if) ident(MurphyMode) reserved(then) reserved(begin) + ident(Clock)operator(.)ident(Stop)operator(;) + ident(AddHint)operator(()ident(Format)operator(()string<delimiter(')content([MM] Key opened after %0.2f s.)delimiter(')>operator(,) operator([)ident(Clock)operator(.)ident(SecondsPassed)operator(]\)\);) + reserved(end)operator(;) + reserved(finally) + ident(Clock)operator(.)ident(Free)operator(;) + ident(SL)operator(.)ident(Free)operator(;) + ident(SpyThread)operator(.)ident(Resume)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(RegTVGetSelectedIndex)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(\);) +reserved(begin) + ident(Node)operator(.)ident(SelectedIndex) operator(:=) ident(Node)operator(.)ident(ImageIndex)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(RegTVKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) + ident(Shift)operator(:) ident(TShiftState)operator(\);) +reserved(var) + ident(Node)operator(:) ident(TTreeNode)operator(;) +reserved(begin) + reserved(if) ident(Key) operator(=) ident(VK_SCROLL) reserved(then) + ident(CheckRegTVHotTrack)operator(;) + + reserved(if) ident(RegTV)operator(.)ident(IsEditing) reserved(then) + ident(Exit)operator(;) + + ident(Node) operator(:=) ident(RegTV)operator(.)ident(Selected)operator(;) + reserved(if) reserved(not) ident(Assigned)operator(()ident(Node)operator(\)) reserved(then) + ident(Exit)operator(;) + + reserved(if) ident(ssShift) reserved(in) ident(Shift) reserved(then) + reserved(case) ident(Key) reserved(of) + ident(VK_DOWN)operator(:) reserved(begin) + ident(Node) operator(:=) ident(Node)operator(.)ident(GetNextSibling)operator(;) + reserved(if) ident(Assigned)operator(()ident(Node)operator(\)) reserved(then) + ident(RegTV)operator(.)ident(Selected) operator(:=) ident(Node)operator(;) + ident(Key) operator(:=) integer(0)operator(;) reserved(end)operator(;) + + ident(VK_UP)operator(:) reserved(begin) + ident(Node) operator(:=) ident(Node)operator(.)ident(GetPrevSibling)operator(;) + reserved(if) ident(Assigned)operator(()ident(Node)operator(\)) reserved(then) + ident(RegTV)operator(.)ident(Selected) operator(:=) ident(Node)operator(;) + ident(Key) operator(:=) integer(0)operator(;) reserved(end)operator(;) + + ident(VK_RIGHT)operator(:) ident(Key) operator(:=) ident(VK_MULTIPLY)operator(;) + ident(VK_LEFT)operator(:) ident(Key) operator(:=) ident(VK_DIVIDE)operator(;) + reserved(end)operator(;) + + reserved(if) ident(Assigned)operator(()ident(Node)operator(.)ident(Parent)operator(\)) reserved(then) reserved(begin) + reserved(case) ident(Key) reserved(of) + ident(VK_END)operator(:) + reserved(begin) + ident(RegTV)operator(.)ident(Selected) operator(:=) ident(Node)operator(.)ident(Parent)operator(.)ident(GetLastChild)operator(;) + ident(Key) operator(:=) integer(0)operator(;) reserved(end)operator(;) + + ident(VK_HOME)operator(:) + reserved(begin) + ident(RegTV)operator(.)ident(Selected) operator(:=) ident(Node)operator(.)ident(Parent)operator(.)ident(GetFirstChild)operator(;) + ident(Key) operator(:=) integer(0)operator(;) reserved(end)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + reserved(case) ident(Key) reserved(of) + integer(0)operator(:) ident(Exit)operator(;) + ident(VK_RETURN)operator(:) ident(ValuesWin)operator(.)ident(FocusControl)operator(()ident(ValueList)operator(\);) + ident(VK_DELETE)operator(:) ident(DeleteMIClick)operator(()ident(Sender)operator(\);) + ident(VK_SPACE)operator(:) reserved(begin) + ident(JumpToSel)operator(()ident(RegTV)operator(\);) + ident(Inc)operator(()ident(SpaceCount)operator(\);) + reserved(if) ident(SpaceCount) operator(>) integer(10) reserved(then) reserved(begin) + ident(ShowMessage)operator(()string<delimiter(')content(YES!)delimiter(')>operator(\);) + ident(SpaceCount) operator(:=) integer(0)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + ident(VK_F9)operator(:) ident(SwapFonts)operator(()ident(RegTV)operator(\);) + + ident(VK_F12)operator(:) + reserved(if) ident(ssShift) reserved(in) ident(Shift) reserved(then) reserved(begin) + reserved(if) ident(Assigned)operator(()ident(Node)operator(.)ident(Parent)operator(\)) reserved(then) ident(Node)operator(.)ident(Parent)operator(.)ident(AlphaSort)operator(;) + reserved(end) reserved(else) + reserved(if) ident(Node)operator(.)ident(Expanded) reserved(then) ident(Node)operator(.)ident(AlphaSort)operator(;) + + ident(VK_LEFT)operator(,) ident(VK_SUBTRACT)operator(:) + reserved(begin) + reserved(if) ident(Node)operator(.)ident(Expanded) reserved(then) + ident(Node)operator(.)ident(Collapse)operator(()ident(False)operator(\)) + reserved(else) reserved(if) ident(Assigned)operator(()ident(Node)operator(.)ident(Parent)operator(\)) reserved(then) + ident(RegTV)operator(.)ident(Selected) operator(:=) ident(Node)operator(.)ident(Parent)operator(;) + ident(Key) operator(:=) integer(0)operator(;) reserved(end)operator(;) + + ident(VK_RIGHT)operator(,) ident(VK_ADD)operator(:) + reserved(begin) + reserved(if) reserved(not) ident(Node)operator(.)ident(HasChildren) reserved(then) + ident(TreeWin)operator(.)ident(RegTV)operator(.)ident(Items)operator(.)ident(AddChild)operator(()ident(Node)operator(,) string<delimiter(')delimiter(')>operator(\);) + reserved(if) ident(Node)operator(.)ident(Expanded) reserved(then) + ident(RegTV)operator(.)ident(Selected) operator(:=) ident(Node)operator(.)ident(GetFirstChild) + reserved(else) + ident(Node)operator(.)ident(Expand)operator(()ident(False)operator(\);) + ident(Key) operator(:=) integer(0)operator(;) reserved(end)operator(;) + + ident(VK_MULTIPLY)operator(:) + reserved(begin) + ident(NoAsterisk) operator(:=) ident(True)operator(;) + ident(OpenNextLevel)operator(()ident(Node)operator(\);) + ident(JumpToSel)operator(()ident(RegTV)operator(\);) + ident(AddHint)operator(()string<delimiter(')content(Press the Multiply Key again to open the next level.)delimiter(')>operator(\);) + ident(Key) operator(:=) integer(0)operator(;) reserved(end)operator(;) + + ident(VK_DIVIDE)operator(:) + reserved(begin) + ident(DoSmartExpand) operator(:=) ident(False)operator(;) + ident(Node)operator(.)ident(Collapse)operator(()ident(true)operator(\);) + ident(DoSmartExpand) operator(:=) ident(True)operator(;) + ident(Key) operator(:=) integer(0)operator(;) reserved(end)operator(;) + reserved(end)operator(;) + + reserved(if) ident(ssctrl) reserved(in) ident(Shift) reserved(then) + reserved(case) ident(Key) reserved(of) + ident(Ord)operator(()char<delimiter(')content(C)delimiter(')>operator(\):) ident(CopyPathMIClick)operator(()ident(Sender)operator(\);) + ident(Ord)operator(()char<delimiter(')content(X)delimiter(')>operator(\):) ident(CutPathMIClick)operator(()ident(Sender)operator(\);) + ident(Ord)operator(()char<delimiter(')content(V)delimiter(')>operator(\):) ident(PasteKeyMIClick)operator(()ident(Sender)operator(\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(RegTVMouseDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Button)operator(:) ident(TMouseButton)operator(;) + ident(Shift)operator(:) ident(TShiftState)operator(;) ident(X)operator(,) ident(Y)operator(:) ident(Integer)operator(\);) +reserved(var) + ident(Node)operator(:) ident(TTreeNode)operator(;) + ident(RelX)operator(,) ident(RelY)operator(:) ident(Integer)operator(;) + ident(NodeRect)operator(:) ident(TRect)operator(;) +reserved(begin) + ident(CheckRegTVHotTrack)operator(;) + + reserved(if) reserved(not) ident(Active) reserved(then) + ident(Exit)operator(;) + + ident(RelX) operator(:=) ident(RegTV)operator(.)ident(ScreenToClient)operator(()ident(Mouse)operator(.)ident(CursorPos)operator(\).)ident(X)operator(;) + ident(RelY) operator(:=) ident(RegTV)operator(.)ident(ScreenToClient)operator(()ident(Mouse)operator(.)ident(CursorPos)operator(\).)ident(Y)operator(;) + ident(Node) operator(:=) ident(RegTV)operator(.)ident(GetNodeAt)operator(()ident(RelX)operator(,) ident(RelY)operator(\);) + reserved(if) reserved(not) ident(Assigned)operator(()ident(Node)operator(\)) reserved(then) + ident(Exit)operator(;) + + reserved(if) reserved(not) ident(Node)operator(.)ident(Selected) reserved(then) + ident(Node)operator(.)ident(Selected) operator(:=) ident(True)operator(;) + + reserved(if) ident(Button) operator(=) ident(mbLeft) reserved(then) reserved(begin) + ident(NodeRect) operator(:=) ident(RegTV)operator(.)ident(Selected)operator(.)ident(DisplayRect)operator(()ident(True)operator(\);) + reserved(if) ident(RegTV)operator(.)ident(HotTrack) + reserved(or) operator(()ident(RelX) operator(<) ident(NodeRect)operator(.)ident(Left)operator(\)) reserved(and) operator(()ident(RelX) operator(>) ident(NodeRect)operator(.)ident(Left) operator(-) integer(20)operator(\)) reserved(then) reserved(begin) + comment(//4px more to the left (friendlier for the user\)) + reserved(if) reserved(not) ident(Node)operator(.)ident(HasChildren) reserved(then) + ident(RegTV)operator(.)ident(Items)operator(.)ident(AddChild)operator(()ident(Node)operator(,) string<delimiter(')delimiter(')>operator(\);) + ident(DoSmartExpand) operator(:=) ident(False)operator(;) + reserved(with) ident(Node) reserved(do) + reserved(if) reserved(not) ident(Expanded) reserved(then) + ident(Expand)operator(()ident(False)operator(\)) + reserved(else) + ident(Collapse)operator(()ident(False)operator(\);) + ident(DoSmartExpand) operator(:=) ident(True)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(RegTVStartDrag)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(DragObject)operator(:) ident(TDragObject)operator(\);) +reserved(begin) + ident(DragNode) operator(:=) ident(RegTV)operator(.)ident(Selected)operator(;) + reserved(if) ident(NodeInfo)operator(()ident(DragNode)operator(\).)ident(IsHost) reserved(then) + ident(DragNode) operator(:=) reserved(nil)operator(;) +reserved(end)operator(;) + +reserved(function) ident(OpenNodeError)operator(()ident(Reg)operator(:) ident(TXRegistry)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(;) + reserved(out) ident(Mode)operator(:) ident(TOpenNodeMode)operator(\):) ident(Integer)operator(;) +reserved(var) + ident(Key)operator(:) reserved(string)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(ERROR_SUCCESS)operator(;) + ident(Mode) operator(:=) ident(onNodeNil)operator(;) + reserved(if) reserved(not) ident(Assigned)operator(()ident(Node)operator(\)) reserved(then) + ident(Exit)operator(;) + + ident(Reg)operator(.)ident(CloseKey)operator(;) + ident(Key) operator(:=) ident(TraceKey)operator(()ident(PathOfNode)operator(()ident(Node)operator(\)\);) + ident(Reg)operator(.)ident(RootKey) operator(:=) ident(HKEYOfStr)operator(()ident(ExRegRoot)operator(()ident(Key)operator(\)\);) + ident(Result) operator(:=) ident(Reg)operator(.)ident(OpenKeyError)operator(()ident(ExRegKey)operator(()ident(Key)operator(\),) ident(False)operator(,) ident(True)operator(\);) + reserved(if) ident(Success)operator(()ident(Result)operator(\)) reserved(then) + reserved(if) ident(Reg)operator(.)ident(RootKey) operator(=) ident(HKDD) reserved(then) + ident(Mode) operator(:=) ident(onReadOnly) + reserved(else) + ident(Mode) operator(:=) ident(onFull) + reserved(else) reserved(if) ident(Reg)operator(.)ident(OpenKeyReadOnly)operator(()ident(ExRegKey)operator(()ident(Key)operator(\)\)) reserved(then) + ident(Mode) operator(:=) ident(onReadOnly) + reserved(else) + ident(Mode) operator(:=) ident(onError)operator(;) +reserved(end)operator(;) + +reserved(function) ident(OpenNode)operator(()ident(Reg)operator(:) ident(TXRegistry)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(\):) ident(TOpenNodeMode)operator(;) +reserved(begin) + ident(OpenNodeError)operator(()ident(Reg)operator(,) ident(Node)operator(,) ident(Result)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(OpenNodeOK)operator(()ident(Reg)operator(:) ident(TXRegistry)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(\):) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(OpenNode)operator(()ident(Reg)operator(,) ident(Node)operator(\)) reserved(in) ident(onOK)operator(;) +reserved(end)operator(;) + +reserved(function) ident(OpenCurKey)operator(:) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(OpenNodeOK)operator(()ident(MainReg)operator(,) ident(RegTV)operator(.)ident(Selected)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(OpenCurParent)operator(:) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(Assigned)operator(()ident(RegTV)operator(.)ident(Selected)operator(\)) + reserved(and) ident(OpenNodeOK)operator(()ident(MainReg)operator(,) ident(RegTV)operator(.)ident(Selected)operator(.)ident(Parent)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(TTreeWin)operator(.)ident(CreateKey)operator(()ident(Subkey)operator(:) ident(Boolean)operator(\):) ident(Boolean)operator(;) +reserved(var) + ident(Node)operator(,) ident(NewNode)operator(:) ident(TTreeNode)operator(;) + ident(KeyName)operator(:) reserved(string)operator(;) + ident(i)operator(:) ident(integer)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(False)operator(;) + + reserved(if) ident(CantWrite) reserved(then) + ident(Exit)operator(;) + + ident(Node) operator(:=) ident(RegTV)operator(.)ident(Selected)operator(;) + reserved(if) reserved(not) ident(Assigned)operator(()ident(Node)operator(\)) reserved(then) + ident(Exit)operator(;) + + reserved(if) reserved(not) ident(Subkey) reserved(then) reserved(begin) + comment(//key shall be created on same level...) + reserved(if) ident(Node)operator(.)ident(Level) operator(=) integer(0) reserved(then) reserved(begin) + ident(Node) operator(:=) ident(RegTV)operator(.)ident(Selected)operator(;) + reserved(if) ident(TraceKey)operator(()ident(PathOfNode)operator(()ident(Node)operator(\)\)) operator(<>) ident(PathOfNode)operator(()ident(Node)operator(\)) reserved(then) + comment(//check for shortcut: shortcuts are unequal to their trace) + reserved(if) ident(mrOK) operator(=) ident(MessageDlg)operator(() + string<delimiter(')content(You are trying to create a Key in the shortcut)char('')content(s level.)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(Pluto needs to jump to the target of the shortcut to do this.)delimiter(')>operator(,) + ident(mtConfirmation)operator(,) operator([)ident(mbOK)operator(,) ident(mbCancel)operator(],) integer(0)operator(\)) reserved(then) reserved(begin) + ident(MainWin)operator(.)ident(GotoKey)operator(()ident(TraceKey)operator(()ident(PathOfNode)operator(()ident(Node)operator(\)\)\);) + ident(Node) operator(:=) ident(RegTV)operator(.)ident(Selected)operator(.)ident(Parent)operator(;) + reserved(end) reserved(else) ident(Exit) + reserved(else) reserved(begin) + ident(ShowMessage)operator(()string<delimiter(')content(Key is a HKEY.)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(It is not possible to create Keys on HKEY level.)delimiter(')>operator(\);) + ident(Exit)operator(;) reserved(end)operator(;) + reserved(end) reserved(else) + ident(Node) operator(:=) ident(Node)operator(.)ident(Parent)operator(;) comment(//set reference key to parent) + reserved(end)operator(;) + + reserved(try) + + reserved(case) ident(OpenNode)operator(()ident(MainReg)operator(,) ident(Node)operator(\)) reserved(of) + + ident(onFull)operator(:) reserved(begin) + ident(KeyName) operator(:=) string<delimiter(')content(New)delimiter(')>operator(;) comment(//find best free name) + ident(i) operator(:=) integer(0)operator(;) + reserved(while) ident(MainReg)operator(.)ident(KeyExists)operator(()ident(KeyName)operator(\)) reserved(do) reserved(begin) + ident(Inc)operator(()ident(i)operator(\);) + ident(KeyName) operator(:=) string<delimiter(')content(New )delimiter(')> operator(+) ident(IntToStr)operator(()ident(i)operator(\);) + reserved(end)operator(;) + + ident(Result) operator(:=) ident(MainReg)operator(.)ident(CreateKey)operator(()ident(KeyName)operator(\)) reserved(and) ident(MainReg)operator(.)ident(KeyExists)operator(()ident(KeyName)operator(\);) + comment(// ^-- CREATE KEY) + + reserved(if) reserved(not) ident(Result) reserved(then) comment(// <-- FAILED) + ident(ShowMessage)operator(()string<delimiter(')content(Could not create key!)delimiter(')>operator(\);) + reserved(end)operator(;) + + ident(onReadOnly)operator(:) ident(ShowMessage)operator(()string<delimiter(')content(Key is read-only.)delimiter(')>operator(\);) + + reserved(else) + ident(ShowMessage)operator(()string<delimiter(')content(Error: Couldn)char('')content(t open key.)delimiter(')>operator(\);) + + reserved(end)operator(;) comment(//case) + + reserved(finally) + ident(MainReg)operator(.)ident(CloseKey)operator(;) + reserved(end)operator(;) + + reserved(if) reserved(not) ident(Result) reserved(then) + ident(Exit)operator(;) + + reserved(if) reserved(not) ident(Node)operator(.)ident(Expanded) reserved(then) reserved(begin) comment(//find the node, if Parent not Expanded) + ident(CheckNode)operator(()ident(Node)operator(,) ident(False)operator(\);) + ident(DoSmartExpand) operator(:=) ident(False)operator(;) + ident(Node)operator(.)ident(Expand)operator(()ident(False)operator(\);) + ident(DoSmartExpand) operator(:=) ident(True)operator(;) + ident(NewNode) operator(:=) ident(FindNode)operator(()ident(Node)operator(,) ident(KeyName)operator(\);) + reserved(end) reserved(else) + ident(NewNode) operator(:=) ident(RegTV)operator(.)ident(Items)operator(.)ident(AddChild)operator(()ident(Node)operator(,) ident(KeyName)operator(\);) comment(//else create a new node) + + ident(Result) operator(:=) ident(Assigned)operator(()ident(NewNode)operator(\);) + reserved(if) reserved(not) ident(Result) reserved(then) + ident(ShowMessage)operator(()string<delimiter(')content(Error: Could not find created key.)delimiter(')>operator(\);) + + reserved(if) ident(Result) reserved(then) reserved(begin) + ident(RegTV)operator(.)ident(Selected) operator(:=) ident(NewNode)operator(;) + ident(RegTV)operator(.)ident(Selected)operator(.)ident(EditText)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(CloneKey)operator(;) +reserved(var) + ident(Node)operator(:) ident(TTreeNode)operator(;) + ident(Full)operator(:) ident(TRegPath)operator(;) + ident(MainKey)operator(,) ident(SubKey)operator(,) ident(NewKey)operator(,) ident(zKey)operator(:) reserved(string)operator(;) + ident(i)operator(:) ident(integer)operator(;) +reserved(begin) + ident(Node) operator(:=) ident(RegTV)operator(.)ident(Selected)operator(;) + + reserved(if) ident(CantWrite) reserved(then) + ident(Exit)operator(;) + + reserved(if) ident(NodeInfo)operator(()ident(Node)operator(\).)ident(IsHost) reserved(then) + ident(Exit)operator(;) + + ident(Full) operator(:=) ident(CurKey)operator(()ident(uhNonSystemShortcuts)operator(\);) + ident(MainKey) operator(:=) ident(LWPSolve)operator(()ident(Full)operator(.)ident(Key)operator(\);) + ident(SubKey) operator(:=) ident(FromLastChar)operator(()ident(MainKey)operator(,) char<delimiter(')content(\\)delimiter(')>operator(\);) + ident(MainKey) operator(:=) ident(UntilLastChar)operator(()ident(MainKey)operator(,) char<delimiter(')content(\\)delimiter(')>operator(\);) + reserved(if) ident(SubKey) operator(=) string<delimiter(')delimiter(')> reserved(then) reserved(begin) comment(//Directly beyound HKEY) + ident(SubKey) operator(:=) ident(MainKey)operator(;) + ident(MainKey) operator(:=) string<delimiter(')delimiter(')>operator(;) + reserved(end)operator(;) + + reserved(try) + ident(MainReg)operator(.)ident(RootKey) operator(:=) ident(HKEYOfStr)operator(()ident(Full)operator(.)ident(Root)operator(\);) + reserved(if) reserved(not) ident(MainReg)operator(.)ident(OpenKey)operator(()ident(MainKey)operator(,) ident(False)operator(\)) reserved(then) reserved(begin) + ident(ShowMessage)operator(()string<delimiter(')content(Error: Couldn)char('')content(t not open Key: )delimiter(')> operator(+) ident(MainKey)operator(\);) + ident(Exit) reserved(end)operator(;) + reserved(if) ident(Copy)operator(()ident(SubKey)operator(,) integer(1)operator(,) integer(3)operator(\)) operator(<>) string<delimiter(')content(New)delimiter(')> reserved(then) + ident(NewKey) operator(:=) string<delimiter(')content(New )delimiter(')> operator(+) ident(SubKey) + reserved(else) + ident(NewKey) operator(:=) ident(SubKey)operator(;) + + ident(zKey) operator(:=) ident(Trim)operator(()ident(FromLastChar)operator(()ident(NewKey)operator(,) char<delimiter(')content( )delimiter(')>operator(\)\);) + + ident(i) operator(:=) ident(StrToIntDef)operator(()ident(zKey)operator(,) integer(0)operator(\);) + reserved(if) ident(IsValidInteger)operator(()ident(zKey)operator(\)) reserved(then) + ident(zKey) operator(:=) ident(Trim)operator(()ident(UntilLastChar)operator(()ident(NewKey)operator(,) char<delimiter(')content( )delimiter(')>operator(\)\)) + reserved(else) + ident(zKey) operator(:=) ident(NewKey)operator(;) + + reserved(while) ident(MainReg)operator(.)ident(KeyExists)operator(()ident(NewKey)operator(\)) reserved(do) reserved(begin) + ident(Inc)operator(()ident(i)operator(\);) + ident(NewKey) operator(:=) ident(zKey) operator(+) char<delimiter(')content( )delimiter(')> operator(+) ident(IntToStr)operator(()ident(i)operator(\);) + reserved(end)operator(;) + + ident(MainReg)operator(.)ident(MoveKey)operator(()ident(SubKey)operator(,) ident(NewKey)operator(,) ident(False)operator(\);) + reserved(finally) + ident(MainReg)operator(.)ident(CloseKey)operator(;) + reserved(end)operator(;) + + ident(Node) operator(:=) ident(RegTV)operator(.)ident(Items)operator(.)ident(Add)operator(()ident(Node)operator(,) ident(NewKey)operator(\);) + ident(RegTV)operator(.)ident(Selected) operator(:=) ident(Node)operator(;) + ident(Node)operator(.)ident(EditText)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(NewShortcut)operator(;) +reserved(var) + ident(Node)operator(,) ident(ShortCutNode)operator(:) ident(TTreeNode)operator(;) + ident(ScName)operator(,) ident(ScRealPath)operator(:) reserved(string)operator(;) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Node) operator(:=) ident(RegTV)operator(.)ident(Selected)operator(;) + reserved(if) reserved(not) ident(Assigned)operator(()ident(Node)operator(\)) reserved(then) + ident(Exit)operator(;) + + reserved(if) ident(Node)operator(.)ident(Level) operator(=) integer(0) reserved(then) + ident(ScName) operator(:=) string<delimiter(')content(new )delimiter(')> operator(+) ident(Node)operator(.)ident(Text) + reserved(else) + ident(ScName) operator(:=) string<delimiter(')delimiter(')> operator(+) ident(Node)operator(.)ident(Text)operator(;) + + ident(ScRealPath) operator(:=) ident(TraceKey)operator(()ident(PathOfNode)operator(()ident(Node)operator(\)\);) + reserved(if) reserved(not) ident(InputQuery)operator(()string<delimiter(')content(New shortcut to )delimiter(')>operator(,) ident(ScRealPath)operator(,) ident(ScName)operator(\)) reserved(then) + ident(Exit)operator(;) + + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(High)operator(()ident(ShortCuts)operator(\)) reserved(do) + reserved(if) ident(SameText)operator(()ident(ScName)operator(,) ident(ShortCuts)operator([)ident(i)operator(].)ident(Alias)operator(\)) reserved(then) reserved(begin) + ident(ShowMessage)operator(()string<delimiter(')content(Name already in use.)delimiter(')>operator(\);) + ident(NewShortcut)operator(;) + ident(Exit)operator(;) reserved(end)operator(;) + + ident(ShortCutNode) operator(:=) ident(AddShortcut)operator(()ident(ScName)operator(,) ident(ScRealPath)operator(,) ident(iconShortcut)operator(,) ident(uhUserShortcut)operator(,) + ident(True)operator(\);) + ident(CheckNode)operator(()ident(Node)operator(,) ident(False)operator(\);) + ident(RegTV)operator(.)ident(Selected) operator(:=) ident(ShortCutNode)operator(;) +reserved(end)operator(;) + +reserved(function) ident(AddShortcut)operator(()ident(Alias)operator(,) ident(RealPath)operator(:) reserved(string)operator(;) ident(Icon)operator(:) ident(Integer)operator(;) + ident(AHostType)operator(:) ident(TUniHostType) operator(=) ident(uhUserShortcut)operator(;) + ident(WriteIni)operator(:) ident(Boolean) operator(=) ident(False)operator(\):) ident(TTreeNode)operator(;) +reserved(var) + ident(Last)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(RealPath) operator(:=) ident(TraceKey)operator(()ident(RealPath)operator(\);) comment(//Important: do this BEFORE adding a new,) + comment(//empty shortcut to ShortCuts) + + ident(SetLength)operator(()ident(ShortCuts)operator(,) ident(Length)operator(()ident(ShortCuts)operator(\)) operator(+) integer(1)operator(\);) + ident(Last) operator(:=) ident(High)operator(()ident(Shortcuts)operator(\);) + ident(ShortCuts)operator([)ident(Last)operator(].)ident(Alias) operator(:=) ident(Alias)operator(;) + ident(ShortCuts)operator([)ident(Last)operator(].)ident(RealPath) operator(:=) ident(RealPath)operator(;) + + ident(Result) operator(:=) ident(RegTV)operator(.)ident(Items)operator(.)ident(Add)operator(()reserved(nil)operator(,) ident(Alias)operator(\);) + ident(ShortCuts)operator([)ident(Last)operator(].)ident(Node) operator(:=) ident(Result)operator(;) + + reserved(if) ident(Alias) operator(=) string<delimiter(')content(HKEY_WindowsMachine)delimiter(')> reserved(then) + ident(Icon) operator(:=) ident(iconHKWM) + reserved(else) reserved(if) ident(Alias) operator(=) string<delimiter(')content(HKEY_WindowsUser)delimiter(')> reserved(then) + ident(Icon) operator(:=) ident(iconHKWU)operator(;) + ident(SetTNImage)operator(()ident(Result)operator(,) ident(Icon)operator(\);) + + ident(NodeInfo)operator(()ident(Result)operator(\).)ident(HostType) operator(:=) ident(AHostType)operator(;) + + reserved(if) ident(WriteIni) reserved(then) + reserved(with) ident(TIniFile)operator(.)ident(Create)operator(()ident(PlutoDir) operator(+) string<delimiter(')content(Shortcuts.ini)delimiter(')>operator(\)) reserved(do) + reserved(try) + ident(WriteString)operator(()string<delimiter(')content(Shortcuts)delimiter(')>operator(,) ident(Alias)operator(,) ident(RealPath)operator(\);) + reserved(finally) + ident(Free)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(DeleteKey)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) + ident(Node)operator(,) ident(Node2)operator(:) ident(TTreeNode)operator(;) +reserved(begin) + ident(Node) operator(:=) ident(RegTV)operator(.)ident(Selected)operator(;) + + + ident(i) operator(:=) ident(ShortcutIndex)operator(()ident(Node)operator(\);) + reserved(if) operator(()ident(i) operator(>) operator(-)integer(1)operator(\)) reserved(then) reserved(begin) + reserved(if) operator(()ident(mrYes) operator(=) ident(MessageDlg)operator(()string<delimiter(')content(This is a Pluto shortcut to a real key.)delimiter(')>char(#13)char(#10) operator(+) + string<delimiter(')content(Do you really want to delete the shortcut?)delimiter(')>operator(,) + ident(mtConfirmation)operator(,) operator([)ident(mbYes)operator(,) ident(mbCancel)operator(],) integer(0)operator(\)\)) reserved(then) reserved(begin) + ident(SpyThread)operator(.)ident(Suspend)operator(;) + ident(SpyThread)operator(.)ident(Restart) operator(:=) ident(True)operator(;) + reserved(with) ident(TIniFile)operator(.)ident(Create)operator(()ident(PlutoDir) operator(+) string<delimiter(')content(Shortcuts.ini)delimiter(')>operator(\)) reserved(do) + reserved(try) + ident(DeleteKey)operator(()string<delimiter(')content(Shortcuts)delimiter(')>operator(,) ident(Shortcuts)operator([)ident(i)operator(].)ident(Alias)operator(\);) + reserved(finally) + ident(Free)operator(;) + reserved(end)operator(;) + ident(Shortcuts)operator([)ident(i)operator(]) operator(:=) ident(Shortcuts)operator([)ident(High)operator(()ident(Shortcuts)operator(\)];) + ident(SetLength)operator(()ident(Shortcuts)operator(,) ident(Length)operator(()ident(Shortcuts)operator(\)-)integer(1)operator(\);) + ident(RegTV)operator(.)ident(Selected) operator(:=) ident(GetNextBest)operator(()ident(Node)operator(\);) + ident(Node)operator(.)ident(Delete)operator(;) + ident(RegTVChange)operator(()ident(Self)operator(,) ident(RegTV)operator(.)ident(Selected)operator(\);) + ident(SpyThread)operator(.)ident(Resume)operator(;) + reserved(end)operator(;) + ident(Exit)operator(;) reserved(end)operator(;) + + reserved(if) ident(CantWrite) reserved(then) + ident(Exit)operator(;) + + reserved(if) ident(NodeInfo)operator(()ident(Node)operator(\).)ident(IsHost) reserved(then) + ident(Exit)operator(;) + + ident(SpyThread)operator(.)ident(Suspend)operator(;) + ident(SpyThread)operator(.)ident(Restart) operator(:=) ident(True)operator(;) + + ident(Node2) operator(:=) ident(GetNextBest)operator(()ident(Node)operator(\);) + + reserved(if) ident(MessageDlg)operator(()string<delimiter(')content(Do you really want to delete this key?)delimiter(')>operator(,) ident(mtConfirmation)operator(,) + operator([)ident(mbYes)operator(,) ident(mbCancel)operator(],) integer(0)operator(\)) operator(=) ident(mrYes) reserved(then) + reserved(try) + reserved(if) ident(OpenCurParent) reserved(then) reserved(begin) + reserved(if) reserved(not) ident(MainReg)operator(.)ident(DeleteKey)operator(()ident(Node)operator(.)ident(Text)operator(\)) reserved(then) comment(//<-- DELETE KEY) + ident(ShowMessage)operator(()string<delimiter(')content(Key could not be deleted.)delimiter(')>operator(\)) + reserved(else) reserved(begin) + ident(RegTV)operator(.)ident(Selected) operator(:=) ident(Node2)operator(;) + reserved(if) ident(Assigned)operator(()ident(Node)operator(.)ident(Parent)operator(\)) reserved(and) operator(()ident(Node2) operator(=) ident(Node)operator(.)ident(Parent)operator(\)) reserved(then) + ident(Node)operator(.)ident(Parent)operator(.)ident(Collapse)operator(()ident(False)operator(\);) + ident(Node)operator(.)ident(Delete)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + reserved(finally) + ident(MainReg)operator(.)ident(CloseKey)operator(;) + reserved(end)operator(;) + + ident(RegTVChange)operator(()ident(Self)operator(,) ident(Node2)operator(\);) + + ident(SpyThread)operator(.)ident(Resume)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(MoveKey)operator(()reserved(const) ident(Src)operator(,) ident(Trg)operator(:) ident(TRegPath)operator(;) ident(CopyWanted)operator(:) ident(Boolean)operator(\);) +reserved(var) + ident(TrgReg)operator(:) ident(TXRegistry)operator(;) +reserved(begin) + reserved(with) ident(MainReg) reserved(do) reserved(begin) + ident(RootKey) operator(:=) ident(HKEYOfStr)operator(()ident(Src)operator(.)ident(Root)operator(\);) + ident(OpenKey)operator(()string<delimiter(')delimiter(')>operator(\);) + + reserved(if) reserved(not) ident(KeyExists)operator(()ident(Src)operator(.)ident(Key)operator(\)) reserved(then) reserved(begin) + ident(ShowMessage)operator(()string<delimiter(')content(Source not found.)delimiter(')>operator(\);) + ident(Exit)operator(;) reserved(end)operator(;) + reserved(end)operator(;) + + ident(TrgReg) operator(:=) ident(TXRegistry)operator(.)ident(Create)operator(;) + reserved(with) ident(TrgReg) reserved(do) reserved(begin) + ident(RootKey) operator(:=) ident(HKEYOfStr)operator(()ident(Trg)operator(.)ident(Root)operator(\);) + ident(OpenKey)operator(()string<delimiter(')delimiter(')>operator(\);) + reserved(if) ident(KeyExists)operator(()ident(Trg)operator(.)ident(Key)operator(\)) reserved(then) reserved(begin) + ident(ShowMessage)operator(()string<delimiter(')content(Target already existing.)delimiter(')>operator(\);) + ident(TrgReg)operator(.)ident(Free)operator(;) + ident(Exit)operator(;) reserved(end)operator(;) + reserved(end)operator(;) + + reserved(if) reserved(not) ident(CopyWanted) reserved(then) + reserved(if) ident(mrYes) operator(<>) ident(MessageDlg)operator(()string<delimiter(')content(From source: )delimiter(')> operator(+) ident(StrOfRegPath)operator(()ident(Src)operator(\)) operator(+) ident(EOL) operator(+) + string<delimiter(')content(To target: )delimiter(')> operator(+) ident(StrOfRegPath)operator(()ident(Trg)operator(\)) operator(+) ident(EOL) operator(+) + string<delimiter(')content(Do you really want to move this key?)delimiter(')>operator(,) + ident(mtConfirmation)operator(,) operator([)ident(mbYes)operator(,) ident(mbCancel)operator(],) integer(0)operator(\)) + reserved(then) + ident(Exit)operator(;) + + reserved(try) + ident(MainReg)operator(.)ident(MoveKey)operator(()ident(Src)operator(.)ident(Key)operator(,) ident(TrgReg)operator(,) ident(Trg)operator(.)ident(Key)operator(,) reserved(not) ident(CopyWanted)operator(\);) comment(//<-- MOVE KEY) + reserved(except) + reserved(end)operator(;) + + reserved(if) reserved(not) ident(TrgReg)operator(.)ident(OpenKey)operator(()ident(Trg)operator(.)ident(Key)operator(,) ident(False)operator(\)) reserved(then) + ident(ShowMessage)operator(()string<delimiter(')content(Could not move key!)delimiter(')>operator(\)) + reserved(else) + reserved(if) reserved(not) ident(CopyWanted) reserved(then) + ident(DragNode)operator(.)ident(Delete)operator(;) + + + ident(TrgReg)operator(.)ident(Free)operator(;) + + ident(MainReg)operator(.)ident(CloseKey)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(MoveValues)operator(()ident(SrcNode)operator(,) ident(TrgNode)operator(:) ident(TTreeNode)operator(;) + ident(CopyWanted)operator(:) ident(Boolean)operator(\);) +reserved(var) + ident(SrcReg)operator(,) ident(TrgReg)operator(:) ident(TXRegistry)operator(;) + ident(i)operator(:) ident(Integer)operator(;) + ident(ValueName)operator(:) reserved(string)operator(;) + ident(AnswerToAll)operator(:) ident(Integer)operator(;) + + reserved(function) ident(AskForReplacing)operator(()reserved(const) ident(ValueName)operator(:) reserved(string)operator(\):) ident(Integer)operator(;) + reserved(begin) + reserved(if) ident(AnswerToAll) operator(=) operator(-)integer(1) reserved(then) reserved(begin) + ident(Result) operator(:=) ident(MessageDlg)operator(() + string<delimiter(')content(Value )delimiter(')> operator(+) ident(Quote)operator(()ident(ValueName)operator(\)) operator(+) string<delimiter(')content(already exists in target key.)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(Do you want to replace it?)delimiter(')>operator(,) + ident(mtWarning)operator(,) operator([)ident(mbNo)operator(,) ident(mbYes)operator(,) ident(mbNoToAll)operator(,) ident(mbYesToAll)operator(,) ident(mbAbort)operator(],) integer(0)operator(\);) + reserved(if) ident(Result) reserved(in) operator([)ident(mrNoToAll)operator(,) ident(mrYesToAll)operator(]) reserved(then) reserved(begin) + reserved(if) ident(Result) operator(=) ident(mrYesToAll) reserved(then) + ident(Result) operator(:=) ident(mrYes) + reserved(else) reserved(if) ident(Result) operator(=) ident(mrNoToAll) reserved(then) + ident(Result) operator(:=) ident(mrNo)operator(;) + ident(AnswerToAll) operator(:=) ident(Result)operator(;) + reserved(end)operator(;) + reserved(end) reserved(else) ident(Result) operator(:=) ident(AnswerToAll)operator(;) + reserved(end)operator(;) + +reserved(begin) + ident(AnswerToAll) operator(:=) operator(-)integer(1)operator(;) + + reserved(if) reserved(not) ident(CopyWanted) reserved(then) + reserved(if) ident(mrYes)operator(<>)ident(MessageDlg)operator(() + ident(Format)operator(() + string<delimiter(')content(Do you really want to move %s)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(from: %s)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(to: %s)delimiter(')>operator(,) + operator([)ident(StrNumerus)operator(()ident(ValueList)operator(.)ident(SelCount)operator(,) string<delimiter(')content(value)delimiter(')>operator(,) string<delimiter(')content(values)delimiter(')>operator(\),) + ident(PathOfNode)operator(()ident(SrcNode)operator(\),) ident(PathOfNode)operator(()ident(TrgNode)operator(\)]) + operator(\),) ident(mtConfirmation)operator(,) operator([)ident(mbYes)operator(,) ident(mbAbort)operator(],) integer(0)operator(\)) reserved(then) + ident(Exit)operator(;) + + ident(SrcReg) operator(:=) ident(TXRegistry)operator(.)ident(Create)operator(;) + reserved(try) + reserved(if) reserved(not) operator(()ident(OpenNode)operator(()ident(SrcReg)operator(,) ident(SrcNode)operator(\)) reserved(in) ident(onOK)operator(\)) reserved(then) + ident(MessageDlg)operator(()string<delimiter(')content(Couldn)char('')content(t open source key: )delimiter(')> operator(+) ident(PathOfNode)operator(()ident(SrcNode)operator(\),) + ident(mtError)operator(,) operator([)ident(mbOK)operator(],) integer(0)operator(\);) + + ident(TrgReg) operator(:=) ident(TXRegistry)operator(.)ident(Create)operator(;) + reserved(try) + reserved(if) reserved(not) operator(()ident(OpenNode)operator(()ident(TrgReg)operator(,) ident(TrgNode)operator(\)) reserved(in) ident(onOK)operator(\)) reserved(then) + ident(MessageDlg)operator(()string<delimiter(')content(Couldn)char('')content(t open target key: )delimiter(')> operator(+) ident(PathOfNode)operator(()ident(TrgNode)operator(\),) + ident(mtError)operator(,) operator([)ident(mbOK)operator(],) integer(0)operator(\);) + + reserved(with) ident(ValueList)operator(.)ident(Items) reserved(do) reserved(begin) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(Count)operator(-)integer(1) reserved(do) reserved(begin) + reserved(if) reserved(not) ident(Item)operator([)ident(i)operator(].)ident(Selected) reserved(then) + ident(Continue)operator(;) + ident(ValueName) operator(:=) ident(RealValueName)operator(()ident(Item)operator([)ident(i)operator(]\);) + + reserved(if) ident(TrgReg)operator(.)ident(ValueExists)operator(()ident(ValueName)operator(\)) reserved(then) reserved(begin) + reserved(case) ident(AskForReplacing)operator(()ident(ValueName)operator(\)) reserved(of) + ident(mrYes)operator(:) operator(;) + ident(mrNo)operator(:) ident(Continue)operator(;) + ident(mrAbort)operator(:) ident(Break)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + ident(TrgReg)operator(.)ident(WriteContext)operator(()ident(ValueName)operator(,) ident(SrcReg)operator(.)ident(ReadContext)operator(()ident(ValueName)operator(\)\);) + reserved(if) reserved(not) ident(CopyWanted) reserved(then) + ident(SrcReg)operator(.)ident(DeleteValue)operator(()ident(ValueName)operator(\);) + reserved(end)operator(;) + reserved(end)operator(;) + + reserved(finally) + ident(TrgReg)operator(.)ident(Free)operator(;) + reserved(end)operator(;) + + reserved(finally) + ident(SrcReg)operator(.)ident(Free)operator(;) + reserved(end)operator(;) + + reserved(if) reserved(not) ident(CopyWanted) reserved(then) + ident(ValuesWin)operator(.)ident(Reload)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(NewSubKeyMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(CreateKey)operator(()ident(True)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(NewKeyMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(CreateKey)operator(()ident(False)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(CreateShortcutMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(NewShortcut)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(TraceMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) ident(NodeInfo)operator(()ident(RegTV)operator(.)ident(Selected)operator(\).)ident(IsShortcut) reserved(then) + ident(MainWin)operator(.)ident(GotoKey)operator(()ident(TraceKey)operator(()ident(PathOfNode)operator(()ident(RegTV)operator(.)ident(Selected)operator(\)\)\);) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(DeleteMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) reserved(not) ident(RegTV)operator(.)ident(IsEditing) reserved(then) + ident(DeleteKey)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(DublicateMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(CloneKey)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(FindMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(FindWin)operator(.)ident(SfCurKeyRB)operator(.)ident(Checked) operator(:=) ident(True)operator(;) + ident(FindWin)operator(.)ident(Show)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(RegTVPUPopup)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(RegTVChange)operator(()ident(Sender)operator(,) ident(RegTV)operator(.)ident(Selected)operator(\);) + reserved(with) ident(NodeInfo)operator(()ident(RegTV)operator(.)ident(Selected)operator(\)) reserved(do) reserved(begin) + ident(NewSubKeyMI)operator(.)ident(Enabled) operator(:=) reserved(not) ident(CantWrite)operator(;) + ident(NewKeyMI)operator(.)ident(Enabled) operator(:=) reserved(not) ident(CantWrite) reserved(and) operator(()reserved(not) ident(IsHost) reserved(or) ident(IsShortcut)operator(\);) + ident(DublicateMI)operator(.)ident(Enabled) operator(:=) reserved(not) ident(CantWrite) reserved(and) reserved(not) ident(IsHost)operator(;) + + reserved(with) ident(DeleteMI) reserved(do) + reserved(if) ident(HostType) operator(=) ident(uhUserShortcut) reserved(then) reserved(begin) + ident(Caption) operator(:=) string<delimiter(')content(&Delete Shortcut)delimiter(')>operator(;) + ident(Enabled) operator(:=) ident(True)operator(;) + reserved(end) reserved(else) reserved(begin) + ident(Caption) operator(:=) string<delimiter(')content(&Delete)delimiter(')>operator(;) + ident(Enabled) operator(:=) reserved(not) ident(CantWrite) reserved(and) reserved(not) ident(IsHost)operator(;) + reserved(end)operator(;) + + ident(RenameMI)operator(.)ident(Enabled) operator(:=) reserved(not) ident(CantWrite) reserved(and) operator(()ident(HostType) reserved(in) operator([)ident(uhNone)operator(,) ident(uhUserShortcut)operator(]\);) + ident(TraceMI)operator(.)ident(Visible) operator(:=) ident(IsShortcut)operator(;) + ident(EditShortcutMI)operator(.)ident(Visible) operator(:=) ident(HostType) operator(=) ident(uhUserShortcut)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(CheckNode)operator(()ident(Node)operator(:) ident(TTreeNode)operator(;) ident(OnlyOnce)operator(:) ident(Boolean) operator(=) ident(True)operator(;) + ident(TakeNodeSelected)operator(:) ident(Boolean) operator(=) ident(False)operator(\);) +reserved(var) + ident(CurIcon)operator(,) ident(NewIcon)operator(:) ident(Integer)operator(;) + ident(Reg)operator(:) ident(TXRegistry)operator(;) + ident(OpenMode)operator(:) ident(TOpenNodeMode)operator(;) + ident(Info)operator(:) ident(TNodeInfo)operator(;) +preprocessor({$IFDEF UNIKEY}) + ident(Uni)operator(:) ident(TUniKey)operator(;) +preprocessor({$ENDIF}) + ident(KeyHasChildren)operator(:) ident(Boolean)operator(;) + + reserved(procedure) ident(SetShortcutIcon)operator(()ident(Node)operator(:) ident(TTreeNode)operator(\);) + reserved(var) + ident(Full)operator(:) reserved(string)operator(;) + ident(i)operator(:) ident(Integer)operator(;) + reserved(begin) + ident(Full) operator(:=) ident(TraceKey)operator(()ident(PathOfNode)operator(()ident(Node)operator(\)\);) + reserved(for) ident(i) operator(:=) ident(Low)operator(()ident(Shortcuts)operator(\)) reserved(to) ident(High)operator(()ident(Shortcuts)operator(\)) reserved(do) + reserved(if) ident(Full) operator(=) ident(Shortcuts)operator([)ident(i)operator(].)ident(RealPath) reserved(then) reserved(begin) + ident(CurIcon) operator(:=) ident(Shortcuts)operator([)ident(i)operator(].)ident(Node)operator(.)ident(ImageIndex)operator(;) + ident(Exit)operator(;) reserved(end)operator(;) + reserved(if) ident(Node)operator(.)ident(ImageIndex) reserved(in) operator([)ident(iconShortcut)operator(,) ident(iconShortcut) operator(+) integer(1)operator(]) reserved(then) + ident(CurIcon) operator(:=) ident(iconKey) operator(+) operator(()ident(CurIcon) operator(-) ident(iconShortcut)operator(\);) + reserved(end)operator(;) + +reserved(begin) + reserved(if) reserved(not) ident(Assigned)operator(()ident(Node)operator(\)) reserved(then) + ident(Exit)operator(;) + + ident(Info) operator(:=) ident(NodeInfo)operator(()ident(Node)operator(\);) + reserved(if) ident(OnlyOnce) reserved(and) ident(Info)operator(.)ident(Checked) reserved(then) + ident(Exit)operator(;) + + ident(CurIcon) operator(:=) ident(Node)operator(.)ident(ImageIndex)operator(;) + reserved(if) operator(()ident(CurIcon) operator(>) ident(iconFirstType)operator(\)) reserved(then) reserved(begin) +preprocessor({$IFDEF UNIKEY}) + reserved(if) ident(RootOfNode)operator(()ident(Node)operator(\).)ident(ImageIndex) operator(<>) ident(iconHostUni) reserved(then) reserved(begin) + ident(SetShortcutIcon)operator(()ident(Node)operator(\);) + ident(CurIcon) operator(:=) operator(()ident(CurIcon) reserved(div) integer(2)operator(\)) operator(*) integer(2)operator(;) + reserved(end)operator(;) +preprocessor({$ELSE}) + ident(Exit)operator(;) +preprocessor({$ENDIF}) + reserved(end) reserved(else) reserved(begin) + ident(SetShortcutIcon)operator(()ident(Node)operator(\);) + ident(CurIcon) operator(:=) operator(()ident(CurIcon) reserved(div) integer(2)operator(\)) operator(*) integer(2)operator(;) + reserved(end)operator(;) + ident(NewIcon) operator(:=) ident(CurIcon)operator(;) + + ident(Info)operator(.)ident(ExcludeFlag)operator(()ident(nfDefect)operator(\);) + ident(Info)operator(.)ident(ExcludeFlag)operator(()ident(nfReadOnly)operator(\);) + +preprocessor({$IFDEF UNIKEY}) + ident(KeyHasChildren) operator(:=) ident(False)operator(;) + + reserved(if) ident(RootOfNode)operator(()ident(Node)operator(\).)ident(ImageIndex) operator(=) ident(iconHostUni) reserved(then) reserved(begin) + ident(Uni) operator(:=) ident(UniOfNode)operator(()ident(Node)operator(\);) + reserved(if) ident(Assigned)operator(()ident(Uni)operator(\)) reserved(then) + reserved(try) + ident(KeyHasChildren) operator(:=) ident(Uni)operator(.)ident(HasKeys)operator(;) + reserved(if) ident(usReadOnly) operator(>=) ident(Uni)operator(.)ident(Skills) reserved(then) + ident(OpenMode) operator(:=) ident(onReadOnly) + reserved(else) + ident(OpenMode) operator(:=) ident(onFull)operator(;) + reserved(finally) + ident(Uni)operator(.)ident(Free)operator(;) + reserved(end) + reserved(else) + ident(OpenMode) operator(:=) ident(onError)operator(;) + reserved(end) reserved(else) reserved(begin) +preprocessor({$ENDIF}) + ident(Reg) operator(:=) ident(TXRegistry)operator(.)ident(Create)operator(;) + reserved(try) + ident(OpenMode) operator(:=) ident(OpenNode)operator(()ident(Reg)operator(,) ident(Node)operator(\);) + ident(KeyHasChildren) operator(:=) ident(Reg)operator(.)ident(HasSubKeys)operator(;) + reserved(finally) + ident(Reg)operator(.)ident(Free)operator(;) + reserved(end)operator(;) +preprocessor({$IFDEF UNIKEY}) + reserved(end)operator(;) +preprocessor({$ENDIF}) + + reserved(if) ident(OpenMode) operator(=) ident(onReadOnly) reserved(then) + ident(Info)operator(.)ident(IncludeFlag)operator(()ident(nfReadOnly)operator(\);) + + reserved(if) ident(OpenMode) reserved(in) ident(onOK) reserved(then) reserved(begin) + comment(//OK, could open) + reserved(if) reserved(not) ident(Node)operator(.)ident(Expanded) reserved(then) reserved(begin) comment(//Collapsed) + reserved(if) ident(KeyHasChildren) reserved(then) reserved(begin) comment(//HasSubKeys) + reserved(if) reserved(not) ident(Node)operator(.)ident(HasChildren) reserved(then) reserved(begin) + comment(//Update: Ensure HasChildren) + reserved(if) ident(TakeNodeSelected) reserved(or) ident(Node)operator(.)ident(Selected) reserved(then) + ident(TreeWin)operator(.)ident(RegTV)operator(.)ident(Items)operator(.)ident(AddChild)operator(()ident(Node)operator(,) string<delimiter(')delimiter(')>operator(\);) + reserved(end)operator(;) + comment(//Ensure Plus-Icon) + ident(NewIcon) operator(:=) ident(CurIcon) operator(+) integer(1)operator(;) + reserved(end) reserved(else) reserved(begin) + comment(//Has still Children?) + reserved(if) ident(Node)operator(.)ident(HasChildren) reserved(then) + ident(Node)operator(.)ident(DeleteChildren)operator(;) + reserved(end)operator(;) + + reserved(end) reserved(else) reserved(begin) comment(//Expanded) + comment(//HasSubKeys?) + reserved(if) ident(KeyHasChildren) reserved(then) reserved(begin) + comment(//OK) + ident(NewIcon) operator(:=) ident(CurIcon) operator(+) integer(1)operator(;) + reserved(end) reserved(else) reserved(begin) + comment(//not OK --> update) + ident(Node)operator(.)ident(Collapse)operator(()ident(True)operator(\);) + ident(Node)operator(.)ident(DeleteChildren)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + comment(//not OK, couldn't open) + reserved(end) reserved(else) reserved(begin) comment(//defect) + reserved(if) ident(Node)operator(.)ident(HasChildren) reserved(then) + ident(Node)operator(.)ident(DeleteChildren)operator(;) + ident(Info)operator(.)ident(IncludeFlag)operator(()ident(nfDefect)operator(\);) + reserved(end)operator(;) + + reserved(if) ident(Node)operator(.)ident(ImageIndex) operator(<>) ident(iconHostUni) reserved(then) comment(//don't change icon of UniHosts) + ident(Node)operator(.)ident(ImageIndex) operator(:=) ident(NewIcon)operator(;) + + ident(Info)operator(.)ident(IncludeFlag)operator(()ident(nfChecked)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(FormKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) + ident(Shift)operator(:) ident(TShiftState)operator(\);) +reserved(begin) + ident(MainWin)operator(.)ident(FormKeyDown)operator(()ident(Sender)operator(,) ident(Key)operator(,) ident(Shift)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(ShortcutIndex)operator(()ident(Node)operator(:) ident(TTreeNode)operator(\):) ident(Integer)operator(;) +comment(//If Node is a Shortcut,) +comment(//S. returns its index in the Shortcuts array) +comment(//else -1) +reserved(begin) + reserved(if) ident(Node)operator(.)ident(Level) operator(>) integer(0) reserved(then) reserved(begin) + ident(Result) operator(:=) operator(-)integer(1)operator(;) + ident(Exit)operator(;) reserved(end)operator(;) + + reserved(for) ident(Result) operator(:=) integer(0) reserved(to) ident(High)operator(()ident(Shortcuts)operator(\)) reserved(do) + reserved(if) ident(Shortcuts)operator([)ident(Result)operator(].)ident(Node) operator(=) ident(Node) reserved(then) reserved(begin) + ident(Exit)operator(;) + reserved(end)operator(;) + + ident(Result) operator(:=) operator(-)integer(1)operator(;) +reserved(end)operator(;) + +reserved(function) ident(TraceKey)operator(()reserved(const) ident(Path)operator(:) reserved(string)operator(;) ident(AllowedShortcutTypes)operator(:) ident(TUniHostTypes) operator(=) + ident(uhNonSystemShortcuts)operator(\):) reserved(string)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) + ident(isAim)operator(:) ident(Boolean)operator(;) + + reserved(function) ident(NodeOkForTracing)operator(()ident(Node)operator(:) ident(TTreeNode)operator(\):) ident(Boolean)operator(;) + reserved(begin) + ident(Result) operator(:=) ident(Assigned)operator(()ident(Node)operator(\)) reserved(and) + operator(()ident(NodeInfo)operator(()ident(Node)operator(\).)ident(HostType) reserved(in) ident(AllowedShortcutTypes)operator(\);) + reserved(end)operator(;) + +reserved(begin) + ident(Result) operator(:=) ident(MakeLongHKEY)operator(()ident(Path)operator(\);) + reserved(repeat) + ident(isAim) operator(:=) ident(True)operator(;) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(High)operator(()ident(ShortCuts)operator(\)) reserved(do) reserved(begin) + reserved(with) ident(Shortcuts)operator([)ident(i)operator(]) reserved(do) + reserved(if) ident(NodeOkForTracing)operator(()ident(Node)operator(\)) reserved(and) + ident(SameText)operator(()ident(UntilChar)operator(()ident(Result)operator(,) char<delimiter(')content(\\)delimiter(')>operator(\),) ident(Alias)operator(\)) reserved(then) reserved(begin) + reserved(if) ident(Alias) operator(=) ident(RealPath) reserved(then) + ident(Break)operator(;) + ident(Delete)operator(()ident(Result)operator(,) integer(1)operator(,) ident(Length)operator(()ident(Alias)operator(\)\);) + ident(Result) operator(:=) ident(RealPath) operator(+) ident(Result)operator(;) + ident(isAim) operator(:=) ident(False)operator(;) + ident(Break)operator(;) reserved(end)operator(;) + reserved(end)operator(;) + reserved(until) ident(isAim)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(RegTVKeyPress)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Char)operator(\);) +reserved(begin) + reserved(if) operator(()ident(Key) operator(=) char<delimiter(')content(*)delimiter(')>operator(\)) reserved(and) ident(NoAsterisk) reserved(then) reserved(begin) + ident(Key) operator(:=) char(#0)operator(;) + ident(NoAsterisk) operator(:=) ident(False)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(RegTVAdvancedCustomDrawItem)operator(()ident(Sender)operator(:) ident(TCustomTreeView)operator(;) + ident(Node)operator(:) ident(TTreeNode)operator(;) ident(State)operator(:) ident(TCustomDrawState)operator(;) ident(Stage)operator(:) ident(TCustomDrawStage)operator(;) + reserved(var) ident(PaintImages)operator(,) ident(DefaultDraw)operator(:) ident(Boolean)operator(\);) +reserved(var) + ident(Rect)operator(:) ident(TRect)operator(;) + ident(MainValueName)operator(:) reserved(string)operator(;) + ident(Reg)operator(:) ident(TXRegistry)operator(;) + ident(Info)operator(:) ident(TRegKeyInfo)operator(;) + ident(PreviewPosX)operator(:) ident(Integer)operator(;) + + reserved(procedure) ident(DefaultIconPreview)operator(()ident(Reg)operator(:) ident(TXRegistry)operator(\);) + reserved(var) + ident(Icon)operator(:) ident(HICON)operator(;) + ident(IconFile)operator(:) reserved(string)operator(;) + reserved(begin) + reserved(if) operator(()ident(Node)operator(.)ident(Level) operator(=) integer(0)operator(\)) reserved(and) reserved(not) ident(RegTV)operator(.)ident(ShowLines) reserved(then) + ident(Exit)operator(;) + + ident(IconFile) operator(:=) ident(Reg)operator(.)ident(ReadDefaultIcon)operator(;) + reserved(if) ident(IconFile) operator(=) string<delimiter(')delimiter(')> reserved(then) + ident(Exit)operator(;) + + ident(Icon) operator(:=) ident(GetIconFromFile)operator(()ident(ExpandString)operator(()ident(IconFile)operator(\)\);) + reserved(if) ident(Icon) operator(=) integer(0) reserved(then) + ident(Exit)operator(;) + + reserved(with) ident(Rect) reserved(do) reserved(begin) + ident(Dec)operator(()ident(Left)operator(,) ident(TTreeView)operator(()ident(Sender)operator(\).)ident(Indent) operator(+) integer(16)operator(\);) + ident(DrawIconEx)operator(()ident(Sender)operator(.)ident(Canvas)operator(.)ident(Handle)operator(,) ident(Left)operator(,) ident(Top)operator(,) + ident(Icon)operator(,) integer(16)operator(,) integer(16)operator(,) + integer(0)operator(,) integer(0)operator(,) ident(DI_NORMAL)operator(\);) + ident(DestroyIcon)operator(()ident(Icon)operator(\);) + reserved(end)operator(;) + reserved(end)operator(;) + + reserved(procedure) ident(AddPreview)operator(()reserved(const) ident(PreviewText)operator(:) reserved(string)operator(;) ident(Color)operator(:) ident(TColor)operator(\);) + reserved(begin) + reserved(with) ident(Sender)operator(.)ident(Canvas) reserved(do) reserved(begin) + ident(SetTextColor)operator(()ident(Handle)operator(,) ident(Color)operator(\);) + ident(ExtTextOut)operator(()ident(Handle)operator(,) ident(PreviewPosX)operator(,) ident(Rect)operator(.)ident(Top) operator(+) integer(1)operator(,) ident(TextFlags)operator(,) reserved(nil)operator(,) + ident(PChar)operator(()ident(PreviewText)operator(\),) ident(Length)operator(()ident(PreviewText)operator(\),) reserved(nil)operator(\);) + ident(Inc)operator(()ident(PreviewPosX)operator(,) ident(TextWidth)operator(()ident(PreviewText)operator(\)\);) + reserved(end)operator(;) + reserved(end)operator(;) + +reserved(begin) + reserved(if) ident(Stage) operator(<>) ident(cdPostPaint) reserved(then) + ident(Exit)operator(;) + + ident(MainValueName) operator(:=) ident(PrefWin)operator(.)ident(MainPreviewE)operator(.)ident(Text)operator(;) + + ident(Rect) operator(:=) ident(Node)operator(.)ident(DisplayRect)operator(()ident(True)operator(\);) + ident(PreviewPosX) operator(:=) ident(Rect)operator(.)ident(Right) operator(+) integer(5)operator(;) + + ident(Reg) operator(:=) ident(TXRegistry)operator(.)ident(Create)operator(()ident(KEY_READ)operator(\);) + reserved(try) + reserved(if) ident(OpenNodeOK)operator(()ident(Reg)operator(,) ident(Node)operator(\)) reserved(then) reserved(begin) +comment(// Sender.Canvas.Font.Style := [];) + reserved(if) ident(PrefWin)operator(.)ident(KeyInfoPreviewCB)operator(.)ident(Checked) reserved(and) ident(Reg)operator(.)ident(GetKeyInfo)operator(()ident(Info)operator(\)) reserved(then) + reserved(with) ident(Info) reserved(do) reserved(begin) + reserved(if) ident(NumSubKeys) operator(>) integer(0) reserved(then) + ident(AddPreview)operator(()ident(IntToStr)operator(()ident(NumSubKeys)operator(\)) operator(+) string<delimiter(')content(k )delimiter(')>operator(,) ident(clCyan)operator(\);) + reserved(if) ident(NumValues) operator(>) integer(0) reserved(then) + ident(AddPreview)operator(()ident(IntToStr)operator(()ident(NumValues)operator(\)) operator(+) string<delimiter(')content(v )delimiter(')>operator(,) ident(clBrightPurple)operator(\);) + reserved(end)operator(;) + + reserved(if) ident(PrefWin)operator(.)ident(MainPreviewCB)operator(.)ident(Checked) reserved(then) + reserved(if) ident(Reg)operator(.)ident(ValueReallyExists)operator(()ident(MainValueName)operator(\)) reserved(then) + ident(AddPreview)operator(()ident(DataPreviewOfContext)operator(()ident(Reg)operator(.)ident(ReadContext)operator(()ident(MainValueName)operator(\)\),) hex($00AAFFFF)operator(\);) + comment({clBrightYellow}) + reserved(if) ident(PrefWin)operator(.)ident(DefaultIconPreviewCB)operator(.)ident(Checked) reserved(then) + ident(DefaultIconPreview)operator(()ident(Reg)operator(\);) + reserved(end)operator(;) + reserved(finally) + ident(Reg)operator(.)ident(Free)operator(;) + reserved(end)operator(;) + + comment({if nfCopy in NodeInfo(Node\).Flags then begin + //Node.StateIndex := 2; + Brush.Style := bsClear; + with Font do begin + Style := [fsItalic, fsBold]; + Color := clRed; + end; + //TextOut(Rect.Left - 10, Rect.Top + 3, 'c'\); + end;}) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(RenameMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(RegTV)operator(.)ident(Selected)operator(.)ident(EditText)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(CopyPathMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(UserCopyKeyFlag) operator(:=) ident(True)operator(;) + ident(MainWin)operator(.)ident(CopyPathClick)operator(()ident(Sender)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(InsertPathMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(MainWin)operator(.)ident(InsertPathClick)operator(()ident(Sender)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(RegTVGetImageIndex)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(\);) +reserved(begin) + reserved(if) reserved(not) ident(NodeInfo)operator(()ident(Node)operator(\).)ident(Checked) reserved(then) + ident(CheckNode)operator(()ident(Node)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(CheckRegTVHotTrack)operator(;) +reserved(const) + ident(FindCursorOfSwitch)operator(:) reserved(array)operator([)ident(Boolean)operator(]) reserved(of) ident(TCursor) operator(=) operator(()ident(crArrow)operator(,) ident(crHandPoint)operator(\);) +reserved(var) + ident(NewHotTrack)operator(:) ident(Boolean)operator(;) +reserved(begin) + ident(NewHotTrack) operator(:=) ident(ScrollON) reserved(xor) ident(PrefWin)operator(.)ident(KeysSingleClickCB)operator(.)ident(Checked)operator(;) + reserved(if) ident(NewHotTrack) operator(=) ident(RegTV)operator(.)ident(HotTrack) reserved(then) ident(Exit)operator(;) + + reserved(with) ident(RegTV) reserved(do) reserved(begin) + ident(HotTrack) operator(:=) ident(NewHotTrack)operator(;) + ident(Cursor) operator(:=) ident(FindCursorOfSwitch)operator([)ident(HotTrack)operator(];) + ident(Mouse)operator(.)ident(CursorPos) operator(:=) ident(Mouse)operator(.)ident(CursorPos)operator(;) comment(//update cursor) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(PasteKeyMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(Src)operator(,) ident(Trg)operator(:) ident(TRegPath)operator(;) + ident(Node)operator(:) ident(TTreeNode)operator(;) +reserved(begin) + ident(Src) operator(:=) ident(RegPathOfStr)operator(()ident(Clipboard)operator(.)ident(AsText)operator(\);) + ident(Trg) operator(:=) ident(CurKey)operator(()ident(uhNonSystemShortcuts)operator(\);) + ident(Trg)operator(.)ident(Key) operator(:=) ident(Trg)operator(.)ident(Key) operator(+) char<delimiter(')content(\\)delimiter(')> operator(+) ident(FromLastChar)operator(()ident(Src)operator(.)ident(Key)operator(,) char<delimiter(')content(\\)delimiter(')>operator(,) ident(True)operator(\);) + + ident(MoveKey)operator(()ident(Src)operator(,) ident(Trg)operator(,) ident(UserCopyKeyFlag)operator(\);) + + ident(Node) operator(:=) ident(RegTV)operator(.)ident(Selected)operator(;) + reserved(if) ident(Node)operator(.)ident(Expanded) reserved(then) + ident(Node)operator(.)ident(Collapse)operator(()ident(False)operator(\);) + ident(Node)operator(.)ident(Expanded) operator(:=) ident(False)operator(;) + ident(CheckNode)operator(()ident(Node)operator(,) ident(False)operator(\);) + ident(Node)operator(.)ident(Expand)operator(()ident(False)operator(\);) + + reserved(if) reserved(not) ident(UserCopyKeyFlag) reserved(then) + ident(RegTV)operator(.)ident(Repaint)operator(;) comment(// CheckNode(Node, False\);) + + ident(UserCopyKeyFlag) operator(:=) ident(True)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(CutPathMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(UserCopyKeyFlag) operator(:=) ident(False)operator(;) + ident(MainWin)operator(.)ident(CopyPathClick)operator(()ident(Sender)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(OpenNextLevel)operator(()ident(Node)operator(:) ident(TTreeNode)operator(\);) + + reserved(procedure) ident(ExpandKeys)operator(()ident(Node)operator(:) ident(TTreeNode)operator(\);) + reserved(begin) + ident(CheckNode)operator(()ident(Node)operator(,) ident(False)operator(,) ident(True)operator(\);) + reserved(if) reserved(not) ident(Node)operator(.)ident(HasChildren) reserved(then) + ident(Exit)operator(;) + reserved(if) reserved(not) ident(Node)operator(.)ident(Expanded) reserved(then) + ident(Node)operator(.)ident(Expand)operator(()ident(False)operator(\)) + reserved(else) reserved(begin) + ident(Node) operator(:=) ident(Node)operator(.)ident(GetFirstChild)operator(;) + reserved(while) ident(Assigned)operator(()ident(Node)operator(\)) reserved(do) reserved(begin) + ident(ExpandKeys)operator(()ident(Node)operator(\);) + ident(Node) operator(:=) ident(Node)operator(.)ident(GetNextSibling)operator(;) reserved(end)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + +reserved(begin) + ident(DoSmartExpand) operator(:=) ident(False)operator(;) + ident(ExpandKeys)operator(()ident(Node)operator(\);) + ident(DoSmartExpand) operator(:=) ident(True)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(EditShortcutMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(NewPath)operator(:) reserved(string)operator(;) + ident(i)operator(:) ident(Integer)operator(;) + ident(Node)operator(:) ident(TTreeNode)operator(;) + ident(Shortcut)operator(:) ident(PKeyShortcut)operator(;) +reserved(begin) + ident(Node) operator(:=) ident(RegTV)operator(.)ident(Selected)operator(;) + reserved(if) ident(NodeInfo)operator(()ident(Node)operator(\).)ident(HostType) operator(<>) ident(uhUserShortcut) reserved(then) + ident(Exit)operator(;) + + ident(i) operator(:=) ident(ShortcutIndex)operator(()ident(Node)operator(\);) + reserved(if) ident(i) operator(=) operator(-)integer(1) reserved(then) + ident(Exit)operator(;) + + reserved(with) ident(TIniFile)operator(.)ident(Create)operator(()ident(PlutoDir) operator(+) string<delimiter(')content(Shortcuts.ini)delimiter(')>operator(\)) reserved(do) + reserved(try) + ident(NewPath) operator(:=) ident(ReadString)operator(()string<delimiter(')content(Shortcuts)delimiter(')>operator(,) ident(Shortcuts)operator([)ident(i)operator(].)ident(Alias)operator(,) string<delimiter(')delimiter(')>operator(\);) + reserved(finally) + ident(Free)operator(;) + reserved(end)operator(;) + + reserved(if) reserved(not) ident(InputQuery)operator(()string<delimiter(')content(Edit Shortcut)delimiter(')>operator(,) string<delimiter(')content(Shortcut to...)delimiter(')>operator(,) ident(NewPath)operator(\)) reserved(then) + ident(Exit)operator(;) + + ident(Node)operator(.)ident(Collapse)operator(()ident(False)operator(\);) + ident(Shortcut) operator(:=) operator(@)ident(Shortcuts)operator([)ident(i)operator(];) + ident(Shortcut)operator(.)ident(RealPath) operator(:=) ident(TraceKey)operator(()ident(NewPath)operator(\);) + reserved(with) ident(TIniFile)operator(.)ident(Create)operator(()ident(PlutoDir) operator(+) string<delimiter(')content(Shortcuts.ini)delimiter(')>operator(\)) reserved(do) + reserved(try) + ident(WriteString)operator(()string<delimiter(')content(Shortcuts)delimiter(')>operator(,) ident(Shortcut)operator(.)ident(Alias)operator(,) ident(Shortcut)operator(.)ident(RealPath)operator(\);) + reserved(finally) + ident(Free)operator(;) + reserved(end)operator(;) + + ident(RegTVChange)operator(()ident(Self)operator(,) ident(Node)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(SubKeylist1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(SL)operator(:) ident(TStringList)operator(;) +reserved(begin) + ident(SL) operator(:=) ident(TStringList)operator(.)ident(Create)operator(;) + reserved(if) ident(OpenCurKey) reserved(then) + reserved(try) + ident(MainReg)operator(.)ident(GetKeyNames)operator(()ident(SL)operator(\);) + reserved(if) ident(PrefWin)operator(.)ident(SortKeysCB)operator(.)ident(Checked) reserved(then) + ident(SL)operator(.)ident(Sort)operator(;) + ident(Clipboard)operator(.)ident(AsText) operator(:=) ident(SL)operator(.)ident(Text)operator(;) + reserved(finally) + ident(MainReg)operator(.)ident(CloseKey)operator(;) + ident(SL)operator(.)ident(Free)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(ValueNameslist1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(SL)operator(:) ident(TStringList)operator(;) +reserved(begin) + ident(SL) operator(:=) ident(TStringList)operator(.)ident(Create)operator(;) + reserved(if) ident(OpenCurKey) reserved(then) + reserved(try) + ident(MainReg)operator(.)ident(GetValueNames)operator(()ident(SL)operator(\);) + reserved(if) ident(PrefWin)operator(.)ident(SortKeysCB)operator(.)ident(Checked) reserved(then) + ident(SL)operator(.)ident(Sort)operator(;) + ident(Clipboard)operator(.)ident(AsText) operator(:=) ident(SL)operator(.)ident(Text)operator(;) + reserved(finally) + ident(MainReg)operator(.)ident(CloseKey)operator(;) + ident(SL)operator(.)ident(Free)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(KeyInfosMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(MessageDlg)operator(()ident(GetKeyInfos)operator(,) ident(mtInformation)operator(,) operator([)ident(mbOK)operator(],) integer(0)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(TTreeWin)operator(.)ident(GetKeyInfos)operator(:) reserved(string)operator(;) +reserved(const) + ident(sErrorMsg) operator(=) string<delimiter(')content(Error! No: %d Msg: %s)delimiter(')>operator(;) + +reserved(var) + ident(Node)operator(:) ident(TTreeNode)operator(;) + ident(Reg)operator(:) ident(TXRegistry)operator(;) + ident(Mode)operator(:) ident(TOpenNodeMode)operator(;) + ident(Error)operator(:) ident(Integer)operator(;) + ident(Info)operator(:) ident(TNodeInfo)operator(;) + ident(Flag)operator(:) ident(TNodeFlag)operator(;) + + reserved(procedure) ident(Add)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\);) + reserved(begin) + ident(Result) operator(:=) ident(Result) operator(+) ident(S)operator(;) + reserved(end)operator(;) + + reserved(procedure) ident(AddLn)operator(()reserved(const) ident(S)operator(:) reserved(string) operator(=) string<delimiter(')delimiter(')>operator(\);) + reserved(begin) + ident(Add)operator(()ident(S) operator(+) ident(EOL)operator(\);) + reserved(end)operator(;) + + reserved(procedure) ident(AddNodeInfo)operator(()ident(Key)operator(:) ident(HKEY)operator(\);) + reserved(var) + ident(KeyInfo)operator(:) ident(TRegKeyInfo)operator(;) + ident(Res)operator(:) ident(Integer)operator(;) + ident(KeyAge)operator(:) ident(TDateTime)operator(;) + reserved(begin) + ident(FillChar)operator(()ident(KeyInfo)operator(,) ident(SizeOf)operator(()ident(TRegKeyInfo)operator(\),) integer(0)operator(\);) + reserved(with) ident(KeyInfo) reserved(do) reserved(begin) + ident(Res) operator(:=) ident(RegQueryInfoKey)operator(()ident(Reg)operator(.)ident(CurrentKey)operator(,) reserved(nil)operator(,) reserved(nil)operator(,) reserved(nil)operator(,) operator(@)ident(NumSubKeys)operator(,) + operator(@)ident(MaxSubKeyLen)operator(,) reserved(nil)operator(,) operator(@)ident(NumValues)operator(,) operator(@)ident(MaxValueLen)operator(,) + operator(@)ident(MaxDataLen)operator(,) reserved(nil)operator(,) operator(@)ident(LastWriteTime)operator(\);) + + reserved(if) ident(Res) operator(=) ident(ERROR_SUCCESS) reserved(then) reserved(begin) + ident(Add)operator(()ident(Format)operator(() + string<delimiter(')content(Subkeys: %0:d)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(Values: %2:d)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(Max subkeys length: %1:d)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(Max value name length: %3:d)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(Max data length: %4:d)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')delimiter(')>operator(,) + operator([)ident(NumSubKeys)operator(,) ident(MaxSubKeyLen)operator(,) ident(NumValues)operator(,) ident(MaxValueLen)operator(,) ident(MaxDataLen)operator(]\)\);) + ident(KeyAge) operator(:=) ident(DateTimeOfFileTime)operator(()ident(LastWriteTime)operator(\);) + reserved(if) ident(KeyAge) operator(>) integer(0) reserved(then) + ident(AddLn)operator(()string<delimiter(')content(Last write time: )delimiter(')> operator(+) ident(DateTimeToStr)operator(()ident(KeyAge)operator(\)\);) + reserved(end) reserved(else) + ident(AddLn)operator(()string<delimiter(')content(Couldn)char('')content(t get key info.)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(Error Code: )delimiter(')> operator(+) ident(IntToStr)operator(()ident(Res)operator(\)) operator(+) ident(EOL) operator(+) + string<delimiter(')content(Message: )delimiter(')> operator(+) ident(SysErrorMessage)operator(()ident(Res)operator(\)\);) + reserved(end)operator(;) + reserved(end)operator(;) + +reserved(begin) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + ident(Node) operator(:=) ident(RegTV)operator(.)ident(Selected)operator(;) + + ident(Reg) operator(:=) ident(TXRegistry)operator(.)ident(Create)operator(()ident(KEY_READ)operator(\);) + reserved(try) + reserved(try) + ident(Error) operator(:=) ident(OpenNodeError)operator(()ident(Reg)operator(,) ident(RegTV)operator(.)ident(Selected)operator(,) ident(Mode)operator(\);) + + reserved(case) ident(Mode) reserved(of) + ident(onFull)operator(:) ident(AddLn)operator(()string<delimiter(')content(Full Access)delimiter(')>operator(\);) + ident(onReadOnly)operator(:) ident(AddLn)operator(()string<delimiter(')content(Read only)delimiter(')>operator(\);) + ident(onError)operator(:) + ident(AddLn)operator(()ident(Format)operator(()ident(sErrorMsg)operator(,) operator([)ident(Error)operator(,) ident(SysErrorMessage)operator(()ident(Error)operator(\)]\)\);) + ident(onNodeNil)operator(:) ident(AddLn)operator(()string<delimiter(')content(Node is nil!)delimiter(')>operator(\);) + + reserved(else) + ident(AddLn)operator(()string<delimiter(')content(Unknown Mode: )delimiter(')> operator(+) ident(IntToStr)operator(()ident(Integer)operator(()ident(Mode)operator(\)\)\);) + reserved(end)operator(;) + + reserved(if) ident(Mode) reserved(in) ident(onOK) reserved(then) + ident(AddNodeInfo)operator(()ident(Reg)operator(.)ident(CurrentKey)operator(\);) + + reserved(except) + directive(on) ident(E)operator(:) ident(Exception) reserved(do) reserved(begin) + ident(Error) operator(:=) ident(GetLastError)operator(;) + reserved(if) ident(Error) operator(<>) ident(ERROR_SUCCESS) reserved(then) + ident(AddLn)operator(()ident(Format)operator(()string<delimiter(')content(Error! No: %d Msg: %s)delimiter(')>operator(,) operator([)ident(Error)operator(,) ident(SysErrorMessage)operator(()ident(Error)operator(\)]\)\)) + reserved(else) + ident(AddLn)operator(()ident(E)operator(.)ident(Message)operator(\);) + reserved(end)operator(;) + reserved(end)operator(;) + reserved(finally) + ident(Reg)operator(.)ident(Free)operator(;) + reserved(end)operator(;) + + reserved(if) ident(MurphyMode) reserved(then) reserved(begin) + ident(AddLn)operator(()string<delimiter(')content([MM] ImageIndex: )delimiter(')> operator(+) ident(IntToStr)operator(()ident(Node)operator(.)ident(ImageIndex)operator(\)\);) + ident(Info) operator(:=) ident(NodeInfo)operator(()ident(Node)operator(\);) + + reserved(if) ident(Info)operator(.)ident(HostType) reserved(in) operator([)ident(uhNone)operator(..)ident(High)operator(()ident(HostTypeStrings)operator(\)]) reserved(then) + ident(AddLn)operator(()string<delimiter(')content([MM] HostType: )delimiter(')> operator(+) ident(HostTypeStrings)operator([)ident(Info)operator(.)ident(HostType)operator(]\)) + reserved(else) + ident(AddLn)operator(()string<delimiter(')content([MM] Unknown HostType: )delimiter(')> operator(+) ident(IntToStr)operator(()ident(Integer)operator(()ident(Info)operator(.)ident(HostType)operator(\)\)\);) + ident(Add)operator(()string<delimiter(')content([MM] Flags: )delimiter(')>operator(\);) + reserved(for) ident(Flag) operator(:=) ident(Low)operator(()ident(TNodeFlag)operator(\)) reserved(to) ident(High)operator(()ident(TNodeFlag)operator(\)) reserved(do) + reserved(if) ident(Flag) reserved(in) ident(Info)operator(.)ident(Flags) reserved(then) + ident(Add)operator(()ident(NodeFlagStrings)operator([)ident(Flag)operator(]) operator(+) char<delimiter(')content( )delimiter(')>operator(\);) + ident(AddLn)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(ExportAsRegClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(Node)operator(:) ident(TTreeNode)operator(;) + ident(Reg)operator(:) ident(TXRegistry)operator(;) + + reserved(procedure) ident(ExportAsReg4)operator(()ident(Reg)operator(:) ident(TXRegistry)operator(;) reserved(const) ident(FileName)operator(:) reserved(string)operator(\);) + reserved(var) + ident(Reg4Writer)operator(:) ident(TReg4Writer)operator(;) + reserved(begin) + ident(Reg4Writer) operator(:=) ident(TReg4Writer)operator(.)ident(Create)operator(()ident(tpNormal)operator(,) ident(FileName)operator(,) + ident(TraceKey)operator(()ident(PathOfNode)operator(()ident(Node)operator(\)\),) ident(Reg)operator(.)ident(DeliverKey)operator(\);) + reserved(with) ident(Reg4Writer) reserved(do) reserved(begin) + ident(OnTerminate) operator(:=) ident(Reg4WriterTerminate)operator(;) + reserved(try) + ident(AddHint)operator(()ident(Format)operator(()string<delimiter(')content(starting .reg-export: %s...)delimiter(')>operator(,) + operator([)ident(Root) operator(+) char<delimiter(')content(\\)delimiter(')> operator(+) ident(Path)operator(]\)\);) + ident(Resume)operator(;) + reserved(except) + ident(Free)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + ident(AddToLastHint)operator(()string<delimiter(')content(started.)delimiter(')>operator(\);) + reserved(end)operator(;) + + + reserved(procedure) ident(ExportAsHive)operator(()ident(Reg)operator(:) ident(TXRegistry)operator(;) reserved(const) ident(FileName)operator(:) reserved(string)operator(\);) + reserved(begin) + reserved(if) ident(Reg)operator(.)ident(SaveKey)operator(()string<delimiter(')delimiter(')>operator(,) ident(FileName)operator(\)) reserved(then) + ident(AddHint)operator(()string<delimiter(')content(hive export successfull.)delimiter(')>operator(\)) + reserved(else) + ident(AddHint)operator(()ident(Format)operator(()string<delimiter(')content(hive export failed: %s)delimiter(')>operator(,) + operator([)ident(SysErrorMessage)operator(()ident(LastSuccessRes)operator(\)]\)\);) + reserved(end)operator(;) + +reserved(begin) + ident(Node) operator(:=) ident(RegTV)operator(.)ident(Selected)operator(;) + reserved(with) ident(ExportD) reserved(do) reserved(begin) + ident(FileName) operator(:=) ident(MakeValidFileName)operator(()ident(Node)operator(.)ident(Text)operator(,) string<delimiter(')content(key)delimiter(')>operator(\);) + + reserved(if) ident(Execute) reserved(then) reserved(begin) + ident(Reg) operator(:=) ident(TXRegistry)operator(.)ident(Create)operator(;) + reserved(try) + reserved(if) ident(OpenNodeOK)operator(()ident(Reg)operator(,) ident(Node)operator(\)) reserved(then) reserved(begin) + reserved(if) ident(FileExists)operator(()ident(FileName)operator(\)) reserved(and) operator(()ident(mrYes)operator(=)ident(MessageDlg)operator(() + string<delimiter(')content(File already exists.)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(Delete existing file?)delimiter(')>operator(,) + ident(mtWarning)operator(,) operator([)ident(mbYes)operator(,) ident(mbNo)operator(],) integer(0)operator(\)\)) reserved(then) reserved(begin) + ident(FileSetAttr)operator(()ident(FileName)operator(,) integer(0)operator(\);) + ident(DeleteFile)operator(()ident(FileName)operator(\);) + reserved(end)operator(;) + reserved(case) ident(FilterIndex) reserved(of) + integer(1)operator(:) ident(ExportAsReg4)operator(()ident(Reg)operator(,) ident(FileName)operator(\);) + integer(2)operator(:) ident(ExportAsHive)operator(()ident(Reg)operator(,) ident(FileName)operator(\);) + reserved(else) + ident(ShowMessage)operator(()ident(Format)operator(()string<delimiter(')content(Wrong Filter: %d)delimiter(')>operator(,) operator([)ident(FilterIndex)operator(]\)\);) + reserved(end)operator(;) + reserved(end)operator(;) + reserved(finally) + ident(Reg)operator(.)ident(Free)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(FormClose)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Action)operator(:) ident(TCloseAction)operator(\);) +reserved(begin) +comment(// Action := caNone;) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(Load)operator(;) +reserved(var) + ident(NodeHKLM)operator(,) ident(NodeHKU)operator(,) ident(NodeHKDD)operator(,) ident(NodeHKPD)operator(:) ident(TTreeNode)operator(;) + ident(NodeHostReg)operator(:) ident(TTreeNode)operator(;) + + reserved(procedure) ident(LoadShortcuts)operator(()ident(FileName)operator(:) reserved(string)operator(;) ident(HostType)operator(:) ident(TUniHostType)operator(\);) + reserved(var) + ident(i)operator(:) ident(Integer)operator(;) + ident(SL)operator(:) ident(TStringList)operator(;) + ident(ShortcutIni)operator(:) ident(TIniFile)operator(;) + reserved(begin) + reserved(if) reserved(not) ident(FileEx)operator(()ident(FileName)operator(\)) reserved(then) reserved(begin) + ident(AddToLastHint)operator(()string<delimiter(')content(not found:)delimiter(')>operator(\);) + ident(AddHint)operator(()ident(FileName)operator(\);) + ident(Exit) reserved(end)operator(;) + + ident(ShortcutIni) operator(:=) ident(TIniFile)operator(.)ident(Create)operator(()ident(FileName)operator(\);) + ident(SL) operator(:=) ident(TStringList)operator(.)ident(Create)operator(;) + + reserved(try) + ident(ShortcutIni)operator(.)ident(ReadSectionValues)operator(()string<delimiter(')content(Shortcuts)delimiter(')>operator(,) ident(SL)operator(\);) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(SL)operator(.)ident(Count)operator(-)integer(1) reserved(do) + ident(AddShortcut)operator(()ident(SL)operator(.)ident(Names)operator([)ident(i)operator(],) ident(SL)operator(.)ident(Values)operator([)ident(SL)operator(.)ident(Names)operator([)ident(i)operator(]],) ident(iconShortcut)operator(,) + ident(HostType)operator(\);) + ident(AddToLastHint)operator(()string<delimiter(')content(OK)delimiter(')>operator(\);) + reserved(finally) + ident(SL)operator(.)ident(Free)operator(;) + ident(ShortcutIni)operator(.)ident(Free)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + +reserved(begin) + ident(NodeHostReg) operator(:=) reserved(nil)operator(;) + + ident(AddHint)operator(()string<delimiter(')content(Creating Hosts...)delimiter(')>operator(\);) + ident(RootNodes) operator(:=) ident(TList)operator(.)ident(Create)operator(;) + ident(ChangeLastHint)operator(()string<delimiter(')content(Creating Hosts...HKEY_LOCAL_MACHINE)delimiter(')>operator(\);) + ident(NodeHKLM) operator(:=) ident(RegTV)operator(.)ident(Items)operator(.)ident(AddChild)operator(()ident(NodeHostReg)operator(,) string<delimiter(')content(HKEY_LOCAL_MACHINE)delimiter(')>operator(\);) + ident(SetTNImage)operator(()ident(NodeHKLM)operator(,) ident(iconHKLM)operator(\);) + ident(NodeInfo)operator(()ident(NodeHKLM)operator(\).)ident(HostType) operator(:=) ident(uhReg)operator(;) + ident(RootNodes)operator(.)ident(Add)operator(()ident(NodeHKLM)operator(\);) + + ident(ChangeLastHint)operator(()string<delimiter(')content(Creating Hosts...HKEY_USERS)delimiter(')>operator(\);) + ident(NodeHKU) operator(:=) ident(RegTV)operator(.)ident(Items)operator(.)ident(AddChild)operator(()ident(NodeHostReg)operator(,) string<delimiter(')content(HKEY_USERS)delimiter(')>operator(\);) + ident(SetTNImage)operator(()ident(NodeHKU)operator(,) ident(iconHKU)operator(\);) + ident(NodeInfo)operator(()ident(NodeHKU)operator(\).)ident(HostType) operator(:=) ident(uhReg)operator(;) + ident(RootNodes)operator(.)ident(Add)operator(()ident(NodeHKU)operator(\);) + + ident(ChangeLastHint)operator(()string<delimiter(')content(Creating Hosts...HKEY_CURRENT_USER)delimiter(')>operator(\);) + reserved(if) ident(RegRealPath)operator(()string<delimiter(')content(HKEY_CURRENT_USER)delimiter(')>operator(\)) operator(=) string<delimiter(')content(HKEY_CURRENT_USER)delimiter(')> reserved(then) + comment(//could not dereference hkcu) + ident(AddShortcut)operator(()string<delimiter(')content(HKEY_CURRENT_USER)delimiter(')>operator(,) string<delimiter(')content(HKEY_CURRENT_USER)delimiter(')>operator(,) + ident(iconHKCU)operator(,) ident(uhReg)operator(\)) + reserved(else) + ident(AddShortcut)operator(()string<delimiter(')content(HKEY_CURRENT_USER)delimiter(')>operator(,) ident(RegRealPath)operator(()string<delimiter(')content(HKEY_CURRENT_USER)delimiter(')>operator(\),) + ident(iconHKCU)operator(,) ident(uhSystemShortcut)operator(\);) + + ident(ChangeLastHint)operator(()string<delimiter(')content(Creating Hosts...HKEY_CURRENT_CONFIG)delimiter(')>operator(\);) + ident(AddShortcut)operator(()string<delimiter(')content(HKEY_CURRENT_CONFIG)delimiter(')>operator(,) ident(RegRealPath)operator(()string<delimiter(')content(HKEY_CURRENT_CONFIG)delimiter(')>operator(\),) + ident(iconHKCC)operator(,) ident(uhSystemShortcut)operator(\);) + + ident(ChangeLastHint)operator(()string<delimiter(')content(Creating Hosts...HKEY_CLASSES_ROOT)delimiter(')>operator(\);) + ident(AddShortcut)operator(()string<delimiter(')content(HKEY_CLASSES_ROOT)delimiter(')>operator(,) ident(RegRealPath)operator(()string<delimiter(')content(HKEY_CLASSES_ROOT)delimiter(')>operator(\),) + ident(iconHKCR)operator(,) ident(uhSystemShortcut)operator(\);) + + ident(MainReg)operator(.)ident(RootKey) operator(:=) ident(HKEY_DYN_DATA)operator(;) + reserved(if) ident(MainReg)operator(.)ident(OpenKeyReadOnly)operator(()string<delimiter(')delimiter(')>operator(\)) reserved(then) reserved(begin) + ident(MainReg)operator(.)ident(CloseKey)operator(;) + ident(ChangeLastHint)operator(()string<delimiter(')content(Creating Hosts...HKEY_DYN_DATA)delimiter(')>operator(\);) + ident(NodeHKDD) operator(:=) ident(RegTV)operator(.)ident(Items)operator(.)ident(AddChild)operator(()reserved(nil)operator(,) string<delimiter(')content(HKEY_DYN_DATA)delimiter(')>operator(\);) + ident(NodeInfo)operator(()ident(NodeHKDD)operator(\).)ident(HostType) operator(:=) ident(uhReg)operator(;) + ident(NodeInfo)operator(()ident(NodeHKDD)operator(\).)ident(IncludeFlag)operator(()ident(nfReadOnly)operator(\);) + ident(SetTNImage)operator(()ident(NodeHKDD)operator(,) ident(iconHKDD)operator(\);) + ident(RootNodes)operator(.)ident(Add)operator(()ident(NodeHKDD)operator(\);) + reserved(end)operator(;) + + ident(MainReg)operator(.)ident(RootKey) operator(:=) ident(HKEY_PERFORMANCE_DATA)operator(;) + reserved(if) ident(MainReg)operator(.)ident(OpenKeyReadOnly)operator(()string<delimiter(')delimiter(')>operator(\)) reserved(then) reserved(begin) + ident(MainReg)operator(.)ident(CloseKey)operator(;) + ident(ChangeLastHint)operator(()string<delimiter(')content(Creating Hosts...HKEY_PERFORMANCE_DATA)delimiter(')>operator(\);) + ident(NodeHKPD) operator(:=) ident(RegTV)operator(.)ident(Items)operator(.)ident(AddChild)operator(()reserved(nil)operator(,) string<delimiter(')content(HKEY_PERFORMANCE_DATA)delimiter(')>operator(\);) + ident(NodeInfo)operator(()ident(NodeHKPD)operator(\).)ident(HostType) operator(:=) ident(uhReg)operator(;) + ident(SetTNImage)operator(()ident(NodeHKPD)operator(,) ident(iconHKPD)operator(\);) + ident(RootNodes)operator(.)ident(Add)operator(()ident(NodeHKPD)operator(\);) + reserved(end)operator(;) + + ident(ChangeLastHint)operator(()string<delimiter(')content(Creating Host...OK)delimiter(')>operator(\);) + + ident(AddHint)operator(()string<delimiter(')content(Loading Standard Shortcuts...)delimiter(')>operator(\);) + ident(LoadShortcuts)operator(()ident(PlutoDir) operator(+) ident(StandardShortcutsFileName)operator(,) ident(uhStandardShortcut)operator(\);) + + ident(AddHint)operator(()string<delimiter(')content(Loading User Shortcuts...)delimiter(')>operator(\);) + ident(LoadShortcuts)operator(()ident(PlutoDir) operator(+) ident(ShortcutsFileName)operator(,) ident(uhUserShortcut)operator(\);) + +preprocessor({$IFDEF UNIKEY}) + ident(AddShortcut)operator(()string<delimiter(')content(Uni)delimiter(')>operator(,) string<delimiter(')delimiter(')>operator(,) ident(iconHostUni)operator(\);) +preprocessor({$ENDIF}) +reserved(end)operator(;) + +reserved(procedure) ident(TTreeWin)operator(.)ident(Reg4WriterTerminate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(with) ident(Sender) reserved(as) ident(TRegFileWriter) reserved(do) + ident(AddHint)operator(()ident(Format)operator(()string<delimiter(')content(.reg-export finished (%0.2f s\): %s)delimiter(')>operator(,) + operator([)ident(Clk)operator(.)ident(SecsPassed)operator(,) ident(Root) operator(+) char<delimiter(')content(\\)delimiter(')> operator(+) ident(Path)operator(]\)\);) +reserved(end)operator(;) + +reserved(end)operator(.) +reserved(unit) ident(valuesU)operator(;) + +reserved(interface) + +reserved(uses) + ident(Windows)operator(,) ident(Messages)operator(,) ident(SysUtils)operator(,) ident(Variants)operator(,) ident(Classes)operator(,) ident(Graphics)operator(,) ident(Controls)operator(,) ident(Forms)operator(,) + ident(ComCtrls)operator(,) ident(Menus)operator(,) ident(Clipbrd)operator(,) ident(XReg)operator(,) ident(CompEx)operator(,) ident(Math)operator(,) ident(YTools)operator(,) ident(Dialogs)operator(,) ident(YTypes)operator(,) + ident(PlutoConst)operator(,) ident(keybrd)operator(,) ident(ImgList)operator(,) ident(clock)operator(;) + +reserved(type) + ident(TValuesWin) operator(=) reserved(class)operator(()ident(TForm)operator(\)) + ident(ValueListPU)operator(:) ident(TPopupMenu)operator(;) + ident(NewStringMI)operator(:) ident(TMenuItem)operator(;) + ident(NewDWORDMI)operator(:) ident(TMenuItem)operator(;) + ident(NewBinaryMI)operator(:) ident(TMenuItem)operator(;) + ident(ConvertToMI)operator(:) ident(TMenuItem)operator(;) + ident(ConvStringMI)operator(:) ident(TMenuItem)operator(;) + ident(ConvDWORDMI)operator(:) ident(TMenuItem)operator(;) + ident(ConvBinaryMI)operator(:) ident(TMenuItem)operator(;) + ident(ValueList)operator(:) ident(TListView)operator(;) + ident(DeleteMI)operator(:) ident(TMenuItem)operator(;) + ident(N1)operator(:) ident(TMenuItem)operator(;) + ident(RenameMI)operator(:) ident(TMenuItem)operator(;) + ident(NewElseMI)operator(:) ident(TMenuItem)operator(;) + ident(NewMultiStringMI)operator(:) ident(TMenuItem)operator(;) + ident(REGNONE1)operator(:) ident(TMenuItem)operator(;) + ident(LINK1)operator(:) ident(TMenuItem)operator(;) + ident(NewExpandStringMI)operator(:) ident(TMenuItem)operator(;) + ident(N3BINARY1)operator(:) ident(TMenuItem)operator(;) + ident(N4DWORD1)operator(:) ident(TMenuItem)operator(;) + ident(N4DWORDLITTLEEDIAN1)operator(:) ident(TMenuItem)operator(;) + ident(NewBigEndianMI)operator(:) ident(TMenuItem)operator(;) + ident(N6LINK1)operator(:) ident(TMenuItem)operator(;) + ident(N7MULTISZ1)operator(:) ident(TMenuItem)operator(;) + ident(RESOURCELIST1)operator(:) ident(TMenuItem)operator(;) + ident(N9FULLRESOURCEDESCRIPTOR1)operator(:) ident(TMenuItem)operator(;) + ident(ARESOURCEREQUIREMENTSLIST1)operator(:) ident(TMenuItem)operator(;) + ident(NewDefaultValueMI)operator(:) ident(TMenuItem)operator(;) + ident(EditMI)operator(:) ident(TMenuItem)operator(;) + ident(EditBinaryMI)operator(:) ident(TMenuItem)operator(;) + ident(N3)operator(:) ident(TMenuItem)operator(;) + ident(CopyDataPreviewMI)operator(:) ident(TMenuItem)operator(;) + ident(DublicateMI)operator(:) ident(TMenuItem)operator(;) + ident(MultiString1)operator(:) ident(TMenuItem)operator(;) + ident(ZeromizeMI)operator(:) ident(TMenuItem)operator(;) + ident(N4)operator(:) ident(TMenuItem)operator(;) + ident(CopyPathMI)operator(:) ident(TMenuItem)operator(;) + ident(TakeAsMainValueMI)operator(:) ident(TMenuItem)operator(;) + ident(SelectAllMI)operator(:) ident(TMenuItem)operator(;) + ident(InvertSelectionMI)operator(:) ident(TMenuItem)operator(;) + reserved(procedure) ident(FormCreate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(InitListColumnTags)operator(;) + + reserved(procedure) ident(NewStringMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(NewDWORDMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(NewBinaryMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(ConvertValue)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + + reserved(procedure) ident(CreateValue)operator(()ident(Typ)operator(:) ident(TRegDataType)operator(\);) + reserved(procedure) ident(ZeromizeValue)operator(;) + reserved(procedure) ident(DeleteValue)operator(;) + reserved(procedure) ident(CloneValue)operator(;) + reserved(function) ident(TryRenameValue)operator(()ident(OldName)operator(:) reserved(string)operator(;) reserved(var) ident(NewName)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) + + reserved(procedure) ident(ValueListChange)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Item)operator(:) ident(TListItem)operator(;) ident(Change)operator(:) ident(TItemChange)operator(\);) + reserved(procedure) ident(ValueListCustomDrawItem)operator(()ident(Sender)operator(:) ident(TCustomListView)operator(;) ident(Item)operator(:) ident(TListItem)operator(;) ident(State)operator(:) ident(TCustomDrawState)operator(;) reserved(var) ident(DefaultDraw)operator(:) ident(Boolean)operator(\);) + reserved(procedure) ident(ValueListDblClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(ValueListEditing)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Item)operator(:) ident(TListItem)operator(;) reserved(var) ident(AllowEdit)operator(:) ident(Boolean)operator(\);) + reserved(procedure) ident(ValueListEdited)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Item)operator(:) ident(TListItem)operator(;) reserved(var) ident(S)operator(:) ident(String)operator(\);) + reserved(procedure) ident(ValueListKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) ident(Shift)operator(:) ident(TShiftState)operator(\);) + reserved(procedure) ident(ValueListResize)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + + reserved(function) ident(UpdateValue)operator(()ident(Reg)operator(:) ident(TXRegistry)operator(;) ident(Item)operator(:) ident(TListItem)operator(\):) ident(Boolean)operator(;) + reserved(procedure) ident(UpdateValues)operator(()ident(SelectedOnly)operator(:) ident(Boolean) operator(=) ident(False)operator(\);) + reserved(procedure) ident(Reload)operator(()ident(JumpToNewValue)operator(:) ident(Boolean) operator(=) ident(False)operator(;) ident(ValueName)operator(:) reserved(string) operator(=) string<delimiter(')delimiter(')>operator(\);) + reserved(procedure) ident(LoadValues)operator(()ident(Reg)operator(:) ident(TXRegistry)operator(\);) + + reserved(function) ident(AddValue)operator(()ident(Reg)operator(:) ident(TXRegistry)operator(;) reserved(const) ident(ValueName)operator(:) reserved(string)operator(;) ident(AppendInfos)operator(:) ident(Boolean) operator(=) ident(True)operator(\):) ident(TListItem)operator(;) + reserved(procedure) ident(ValueListPUPopup)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(FormKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) ident(Shift)operator(:) ident(TShiftState)operator(\);) + reserved(procedure) ident(ValueListDeletion)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Item)operator(:) ident(TListItem)operator(\);) + reserved(procedure) ident(DeleteMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(RenameMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(NewBigEndianMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(NewExpandStringMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(NewMultiStringMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(NewStrangeTypeMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(NewDefaultValueMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(ValueListChanging)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Item)operator(:) ident(TListItem)operator(;) ident(Change)operator(:) ident(TItemChange)operator(;) reserved(var) ident(AllowChange)operator(:) ident(Boolean)operator(\);) + reserved(procedure) ident(ValueListMouseDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Button)operator(:) ident(TMouseButton)operator(;) ident(Shift)operator(:) ident(TShiftState)operator(;) ident(X)operator(,) ident(Y)operator(:) ident(Integer)operator(\);) + reserved(procedure) ident(EditBinaryMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(EditMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(ValueListCustomDrawSubItem)operator(()ident(Sender)operator(:) ident(TCustomListView)operator(;) ident(Item)operator(:) ident(TListItem)operator(;) ident(SubItem)operator(:) ident(Integer)operator(;) ident(State)operator(:) ident(TCustomDrawState)operator(;) reserved(var) ident(DefaultDraw)operator(:) ident(Boolean)operator(\);) + reserved(procedure) ident(ValueListCompare)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Item1)operator(,) ident(Item2)operator(:) ident(TListItem)operator(;) ident(Data)operator(:) ident(Integer)operator(;) reserved(var) ident(Compare)operator(:) ident(Integer)operator(\);) + reserved(procedure) ident(ValueListColumnClick)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Column)operator(:) ident(TListColumn)operator(\);) + reserved(procedure) ident(DublicateMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(CopyDataPreviewMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(CopyDataPreview)operator(;) + reserved(procedure) ident(ZeromizeMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(CopyPathMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + + reserved(function) ident(FindItemByRealName)operator(()reserved(const) ident(ValueName)operator(:) reserved(string)operator(\):) ident(Integer)operator(;) + + reserved(function) ident(FocusItem)operator(()ident(ARealValueName)operator(:) reserved(string)operator(;) + ident(FocusValueList)operator(:) ident(Boolean) operator(=) ident(False)operator(\):) ident(Boolean)operator(;) + reserved(procedure) ident(TakeAsMainValueMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(FormShow)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(FormClose)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Action)operator(:) ident(TCloseAction)operator(\);) + reserved(procedure) ident(ValueListClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(CheckValueListHotTrack)operator(;) + reserved(procedure) ident(SelectAllMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(InvertSelectionMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(FormDestroy)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + directive(private) + ident(ValueLabelClicked)operator(:) ident(Boolean)operator(;) + ident(SortBy)operator(:) ident(TValueListColumn)operator(;) + ident(SortByColumn)operator(:) ident(TListColumn)operator(;) + ident(SubItemIndex)operator(:) reserved(array)operator([)ident(TValueListColumn)operator(]) reserved(of) ident(Integer)operator(;) + directive(public) + ident(ValueNames)operator(:) ident(TStringList)operator(;) + ident(ValuesCommon)operator(:) ident(Boolean)operator(;) + ident(ValueCommonType)operator(:) ident(TRegDataType)operator(;) + reserved(end)operator(;) + +reserved(var) + ident(ValuesWin)operator(:) ident(TValuesWin)operator(;) + ident(ValueList)operator(:) ident(TListView)operator(;) + + ident(DefaultValueCaption)operator(:) reserved(string) operator(=) string<delimiter(')delimiter(')>operator(;) + +reserved(function) ident(ItemIsDefaultValue)operator(()ident(Item)operator(:) ident(TListItem)operator(\):) ident(Boolean)operator(;) +reserved(function) ident(RealValueName)operator(()ident(Item)operator(:) ident(TListItem)operator(\):) reserved(string)operator(;) +reserved(procedure) ident(SetRealValueName)operator(()ident(Item)operator(:) ident(TListItem)operator(;) ident(Caption)operator(:) reserved(string)operator(\);) +reserved(function) ident(IconOfDataType)operator(()ident(Typ)operator(:) ident(TRegDataType)operator(\):) ident(Integer)operator(;) +reserved(function) ident(IsMainValue)operator(()ident(Item)operator(:) ident(TListItem)operator(\):) ident(Boolean)operator(;) + +reserved(function) ident(ColorOfDataType)operator(()ident(DataType)operator(:) ident(TRegDataType)operator(;) + ident(DefaultColor)operator(:) ident(TColor) operator(=) ident(clWhite)operator(\):) ident(TColor)operator(;) +reserved(function) ident(DataPreviewOfContext)operator(()ident(Context)operator(:) ident(TRegContext)operator(\):) reserved(string)operator(;) + +reserved(function) ident(ValueDataSize)operator(()ident(Context)operator(:) ident(TRegContext)operator(\):) reserved(string)operator(;) +reserved(function) ident(ValueDataType)operator(()ident(Context)operator(:) ident(TRegContext)operator(\):) reserved(string)operator(;) +reserved(function) ident(ValueDataPreview)operator(()ident(Context)operator(:) ident(TRegContext)operator(\):) reserved(string)operator(;) +reserved(function) ident(ValueTypeIcon)operator(()ident(Context)operator(:) ident(TRegContext)operator(\):) ident(Integer)operator(;) + +reserved(function) ident(StrOfRegDataType)operator(()ident(Typ)operator(:) ident(TRegDataType)operator(\):) reserved(string)operator(;) + +reserved(implementation) + +reserved(uses) ident(PlutoMain)operator(,) ident(TreeU)operator(,) ident(WorkU)operator(,) ident(PrefU)operator(;) + +preprocessor({$R *.dfm}) + +reserved(function) ident(ItemIsDefaultValue)operator(()ident(Item)operator(:) ident(TListItem)operator(\):) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(Item)operator(.)ident(Data) operator(=) ident(Pointer)operator(()ident(DefaultValueFlag)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(RealValueName)operator(()ident(Item)operator(:) ident(TListItem)operator(\):) reserved(string)operator(;) +reserved(begin) + reserved(if) ident(ItemIsDefaultValue)operator(()ident(Item)operator(\)) reserved(then) + ident(Result) operator(:=) string<delimiter(')delimiter(')> + reserved(else) + ident(Result) operator(:=) ident(Item)operator(.)ident(Caption)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(SetRealValueName)operator(()ident(Item)operator(:) ident(TListItem)operator(;) ident(Caption)operator(:) reserved(string)operator(\);) +reserved(begin) + reserved(if) ident(Caption) operator(=) string<delimiter(')delimiter(')> reserved(then) reserved(begin) + ident(Item)operator(.)ident(Caption) operator(:=) ident(DefaultValueCaption)operator(;) + ident(Item)operator(.)ident(Data) operator(:=) ident(Pointer)operator(()ident(DefaultValueFlag)operator(\);) + reserved(end) reserved(else) reserved(begin) + ident(Item)operator(.)ident(Caption) operator(:=) ident(Caption)operator(;) + ident(Item)operator(.)ident(Data) operator(:=) reserved(nil)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(function) ident(IsMainValue)operator(()ident(Item)operator(:) ident(TListItem)operator(\):) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(False)operator(;) + reserved(if) ident(csDestroying) reserved(in) ident(PrefWin)operator(.)ident(ComponentState) reserved(then) + ident(Exit)operator(;) + + ident(Result) operator(:=) ident(RealValueName)operator(()ident(Item)operator(\)) operator(=) ident(PrefWin)operator(.)ident(MainPreviewE)operator(.)ident(Text)operator(;) +reserved(end)operator(;) + +reserved(function) ident(ColorOfDataType)operator(()ident(DataType)operator(:) ident(TRegDataType)operator(;) + ident(DefaultColor)operator(:) ident(TColor) operator(=) ident(clWhite)operator(\):) ident(TColor)operator(;) +reserved(begin) + reserved(if) ident(DataType) reserved(in) ident(rdStringTypes) reserved(then) ident(Result) operator(:=) ident(clBrightRed) + reserved(else) reserved(if) ident(DataType) operator(=) ident(rdMultiString) reserved(then) ident(Result) operator(:=) ident(clBrightPurple) + reserved(else) reserved(if) ident(DataType) reserved(in) ident(rdCardTypes) reserved(then) ident(Result) operator(:=) ident(clBrightBlue) + reserved(else) reserved(if) ident(DataType) operator(=) ident(rdBinary) reserved(then) ident(Result) operator(:=) ident(clBrightGreen) + reserved(else) ident(Result) operator(:=) ident(DefaultColor)operator(;) +reserved(end)operator(;) + +reserved(function) ident(StrOfRegDataType)operator(()ident(Typ)operator(:) ident(TRegDataType)operator(\):) reserved(string)operator(;) +reserved(const) + ident(RegDataTypeStrings)operator(:) reserved(array)operator([)ident(rdNone)operator(..)ident(rdLastType)operator(]) reserved(of) reserved(string) operator(=) operator(() + string<delimiter(')content(NONE)delimiter(')>operator(,) + string<delimiter(')content(SZ)delimiter(')>operator(,) + string<delimiter(')content(EXPAND_SZ)delimiter(')>operator(,) + string<delimiter(')content(BINARY)delimiter(')>operator(,) + string<delimiter(')content(DWORD)delimiter(')>operator(,) + string<delimiter(')content(DWORD_BIG_ENDIAN)delimiter(')>operator(,) + string<delimiter(')content(LINK)delimiter(')>operator(,) + string<delimiter(')content(MULTI_SZ)delimiter(')>operator(,) + string<delimiter(')content(RESOURCE_LIST)delimiter(')>operator(,) + string<delimiter(')content(FULL_RESOURCE_DESCRIPTOR)delimiter(')>operator(,) + string<delimiter(')content(RESOURCE_REQUIREMENTS_LIST)delimiter(')>operator(,) + string<delimiter(')content(QUAD_WORD)delimiter(')> + operator(\);) +reserved(begin) + reserved(if) ident(Typ) reserved(in) operator([)ident(rdNone)operator(..)ident(rdLastType)operator(]) reserved(then) + ident(Result) operator(:=) ident(RegDataTypeStrings)operator([)ident(Typ)operator(]) + reserved(else) + ident(Result) operator(:=) ident(IntToStr)operator(()ident(Typ)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(NewStringMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(CreateValue)operator(()ident(rdString)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(NewDWORDMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(CreateValue)operator(()ident(rdCardinal)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(NewBinaryMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(CreateValue)operator(()ident(rdBinary)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(CreateValue)operator(()ident(Typ)operator(:) ident(TRegDataType)operator(\);) +reserved(var) + ident(Item)operator(:) ident(TListItem)operator(;) + ident(ValueName)operator(:) reserved(string)operator(;) + ident(i)operator(:) ident(Integer)operator(;) + ident(SL)operator(:) ident(TStringList)operator(;) +reserved(begin) + reserved(if) ident(csDestroying) reserved(in) operator(()ident(TreeWin)operator(.)ident(ComponentState) operator(+) ident(MainWin)operator(.)ident(ComponentState)operator(\)) reserved(then) + ident(Exit)operator(;) + + reserved(if) ident(TreeWin)operator(.)ident(CantWrite) reserved(then) + ident(Exit)operator(;) + + reserved(with) ident(MainReg) reserved(do) reserved(begin) + reserved(try) + ident(OpenCurKey)operator(;) + + ident(ValueName) operator(:=) string<delimiter(')content(New)delimiter(')>operator(;) comment(// find free name) + ident(i) operator(:=) integer(0)operator(;) + reserved(while) ident(ValueExists)operator(()ident(ValueName)operator(\)) reserved(do) reserved(begin) + ident(Inc)operator(()ident(i)operator(\);) + ident(ValueName) operator(:=) string<delimiter(')content(New )delimiter(')> operator(+) ident(IntToStr)operator(()ident(i)operator(\);) + reserved(end)operator(;) + + reserved(case) ident(Typ) reserved(of) + ident(rdString)operator(:) reserved(begin) + ident(WriteString)operator(()ident(ValueName)operator(,) string<delimiter(')delimiter(')>operator(\);) + reserved(end)operator(;) + ident(rdExpandString)operator(:) reserved(begin) + ident(WriteExpandString)operator(()ident(ValueName)operator(,) string<delimiter(')delimiter(')>operator(\);) + reserved(end)operator(;) + ident(rdCardinal)operator(:) reserved(begin) + ident(WriteCardinal)operator(()ident(ValueName)operator(,) integer(0)operator(\);) + reserved(end)operator(;) + ident(rdCardBigEndian)operator(:) reserved(begin) + ident(WriteCardinal)operator(()ident(ValueName)operator(,) integer(0)operator(,) ident(True)operator(\);) + reserved(end)operator(;) + ident(rdMultiString)operator(:) reserved(begin) + ident(SL) operator(:=) ident(TStringList)operator(.)ident(Create)operator(;) + ident(WriteMultiString)operator(()ident(ValueName)operator(,) ident(SL)operator(\);) + ident(SL)operator(.)ident(Free)operator(;) + reserved(end)operator(;) + ident(rdBinary)operator(:) reserved(begin) + ident(WriteBin)operator(()ident(ValueName)operator(,) reserved(nil)operator(\);) + reserved(end)operator(;) + reserved(else) + ident(WriteBinType)operator(()ident(ValueName)operator(,) reserved(nil)operator(,) ident(Typ)operator(\);) + reserved(end)operator(;) + + reserved(if) reserved(not) ident(ValueExists)operator(()ident(ValueName)operator(\)) reserved(then) reserved(begin) + ident(ShowMessage)operator(()string<delimiter(')content(Could not create Value.)delimiter(')>operator(\);) + ident(CloseKey)operator(;) + ident(Exit)operator(;) reserved(end)operator(;) + + ident(ValuesWin)operator(.)ident(AddValue)operator(()ident(MainReg)operator(,) ident(ValueName)operator(\);) + reserved(finally) + ident(CloseKey)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + ident(Item) operator(:=) ident(FindItem)operator(()ident(ValueList)operator(,) ident(ValueName)operator(\);) + + reserved(if) reserved(not) ident(Assigned)operator(()ident(Item)operator(\)) reserved(then) reserved(begin) + ident(ShowMessage)operator(()string<delimiter(')content(Error, Value not found: )delimiter(')> operator(+) ident(ValueName)operator(\);) + ident(Exit)operator(;) reserved(end)operator(;) + + ident(SelectItemOnly)operator(()ident(ValueList)operator(,) ident(Item)operator(\);) + ident(MainWin)operator(.)ident(StatusBarUpdate)operator(;) + ident(ValueLabelClicked) operator(:=) ident(True)operator(;) + ident(Item)operator(.)ident(EditCaption)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(FormCreate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ValuesU)operator(.)ident(ValueList) operator(:=) ident(ValueList)operator(;) + + ident(DefaultValueCaption) operator(:=) ident(PrefWin)operator(.)ident(DefaultValueNameE)operator(.)ident(Text)operator(;) + ident(ValueLabelClicked) operator(:=) ident(False)operator(;) + ident(SortBy) operator(:=) ident(vlcName)operator(;) + ident(SortByColumn) operator(:=) reserved(nil)operator(;) + + ident(ValueListResize)operator(()ident(Sender)operator(\);) + ident(ValueList)operator(.)ident(Items)operator(.)ident(Clear)operator(;) + ident(CheckValueListHotTrack)operator(;) + + ident(ValueNames) operator(:=) ident(TStringList)operator(.)ident(Create)operator(;) + ident(ValuesCommon) operator(:=) ident(False)operator(;) + ident(ValueCommonType) operator(:=) integer(0)operator(;) + + ident(NewDefaultValueMI)operator(.)ident(ImageIndex) operator(:=) ident(iconMainValue)operator(;) + ident(NewStringMI)operator(.)ident(ImageIndex) operator(:=) ident(iconString)operator(;) + ident(NewDWORDMI)operator(.)ident(ImageIndex) operator(:=) ident(iconCardinal)operator(;) + ident(NewBinaryMI)operator(.)ident(ImageIndex) operator(:=) ident(iconBinary)operator(;) + ident(NewMultiStringMI)operator(.)ident(ImageIndex) operator(:=) ident(iconMultiString)operator(;) + ident(NewElseMI)operator(.)ident(ImageIndex) operator(:=) ident(iconValueElse)operator(;) + + ident(DublicateMI)operator(.)ident(ImageIndex) operator(:=) ident(iconValueDublicate)operator(;) + ident(DeleteMI)operator(.)ident(ImageIndex) operator(:=) ident(iconDelete)operator(;) + ident(ZeromizeMI)operator(.)ident(ImageIndex) operator(:=) ident(iconValueZeromize)operator(;) + + ident(EditMI)operator(.)ident(ImageIndex) operator(:=) ident(iconValueEdit)operator(;) + ident(EditBinaryMI)operator(.)ident(ImageIndex) operator(:=) ident(iconValueEditBinary)operator(;) + ident(RenameMI)operator(.)ident(ImageIndex) operator(:=) ident(iconRename)operator(;) + + ident(TakeAsMainValueMI)operator(.)ident(ImageIndex) operator(:=) ident(iconTakeAsMainValue)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(ConvertValue)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +comment({var + Allow: Boolean; + OldActive: Integer; }) +reserved(begin) +comment({ TargetPage := ShowPC.Pages[TMenuItem(Sender\).Tag]; + + OldActive := ShowPC.ActivePageIndex; + ShowPC.ActivePageIndex := TMenuItem(Sender\).Tag; + WorkWin.ShowPCChanging(Sender, Allow\); + if not Allow then + ShowPC.ActivePageIndex := OldActive; }) +reserved(end)operator(;) + +reserved(function) ident(ValueDataSize)operator(()ident(Context)operator(:) ident(TRegContext)operator(\):) reserved(string)operator(;) +reserved(var) + ident(Typ)operator(:) ident(TRegDataType)operator(;) + ident(Size)operator(:) ident(Integer)operator(;) +comment(// ValueName: string;) +comment(// SL: TStringList;) +reserved(begin) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + + reserved(if) ident(csDestroying) reserved(in) ident(PrefWin)operator(.)ident(ComponentState) reserved(then) + ident(Exit)operator(;) + +comment(// ValueName := RealValueName(Item\);) + ident(Typ) operator(:=) ident(Context)operator(.)ident(Typ)operator(;) + ident(Size) operator(:=) ident(Length)operator(()ident(Context)operator(.)ident(Data)operator(\);) + + reserved(if) ident(Typ) reserved(in) ident(rdStringTypes) reserved(then) + reserved(if) reserved(not) ident(PrefWin)operator(.)ident(CountZeroByteCB)operator(.)ident(Checked) reserved(then) + ident(Dec)operator(()ident(Size)operator(\);) + + reserved(if) ident(Typ) operator(=) ident(rdMultiString) reserved(then) + reserved(if) ident(PrefWin)operator(.)ident(ShowLineCountCB)operator(.)ident(Checked) reserved(then) reserved(begin) + ident(Size) operator(:=) ident(CharCount)operator(()ident(StrOfByteA)operator(()ident(Context)operator(.)ident(Data)operator(\),) char(#0)operator(\)) operator(-) integer(2)operator(;) +comment({ SL := TStringList.Create; + try + Reg.ReadMultiString(ValueName, SL, PrefWin.UseExtendedModelCB.Checked\); + Size := SL.Count; + finally + SL.Free; + end; }) + ident(Result) operator(:=) char<delimiter(')content(#)delimiter(')>operator(;) + reserved(end)operator(;) + + ident(Result) operator(:=) ident(Result) operator(+) ident(IntToStr)operator(()ident(Size)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(ValueDataType)operator(()ident(Context)operator(:) ident(TRegContext)operator(\):) reserved(string)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(StrOfRegDataType)operator(()ident(Context)operator(.)ident(Typ)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(DataPreviewOfContext)operator(()ident(Context)operator(:) ident(TRegContext)operator(\):) reserved(string)operator(;) + + reserved(function) ident(DWORDPreview)operator(()ident(Value)operator(:) ident(Integer)operator(\):) reserved(string)operator(;) + reserved(begin) + reserved(if) ident(PrefWin)operator(.)ident(ShowDwordAsHex)operator(.)ident(Checked) reserved(then) + ident(Result) operator(:=) ident(IntToStr)operator(()ident(Value)operator(\)) operator(+) string<delimiter(')content( = $)delimiter(')> operator(+) ident(IntToHex)operator(()ident(Value)operator(,) integer(8)operator(\)) + reserved(else) + ident(Result) operator(:=) ident(IntToStr)operator(()ident(Value)operator(\)) + reserved(end)operator(;) + + reserved(function) ident(BinaryPreview)operator(()ident(Context)operator(:) ident(TRegContext)operator(\):) reserved(string)operator(;) + reserved(var) + ident(z)operator(:) reserved(string)operator(;) + + reserved(function) ident(DWORDStringOfByteA)operator(()ident(a)operator(:) ident(TByteA)operator(;) ident(AddBinary)operator(:) ident(Boolean) operator(=) ident(False)operator(\):) reserved(string)operator(;) + reserved(var) + ident(piece)operator(:) ident(TByteA)operator(;) + ident(i)operator(:) ident(Integer)operator(;) + reserved(begin) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + + ident(i) operator(:=) integer(0)operator(;) + reserved(while) operator(()ident(i) operator(<=) ident(High)operator(()ident(a)operator(\)\)) reserved(and) operator(()ident(Length)operator(()ident(Result)operator(\)) operator(<) ident(MaxPreviewLen)operator(\)) reserved(do) reserved(begin) + ident(piece) operator(:=) ident(Copy)operator(()ident(a)operator(,) ident(i)operator(,) integer(4)operator(\);) + reserved(if) ident(AddBinary) reserved(then) + ident(Result) operator(:=) ident(Result) operator(+) ident(FriendlyStr)operator(()ident(piece)operator(\)) operator(+) char<delimiter(')content(=)delimiter(')>operator(;) + ident(SetLength)operator(()ident(piece)operator(,) integer(4)operator(\);) + ident(Result) operator(:=) ident(Result) operator(+) ident(IntToStr)operator(()ident(PInteger)operator(()ident(piece)operator(\)^\)) operator(+) string<delimiter(')content( )delimiter(')>operator(;) + ident(Inc)operator(()ident(i)operator(,) ident(SizeOf)operator(()ident(Integer)operator(\)\);) + reserved(end)operator(;) + reserved(end)operator(;) + + reserved(begin) + reserved(with) ident(Context) reserved(do) reserved(begin) + ident(Data) operator(:=) ident(Copy)operator(()ident(Data)operator(,) integer(0)operator(,) ident(MaxPreviewLen)operator(\);) + reserved(case) ident(PrefWin)operator(.)ident(ShowBinaryAsRG)operator(.)ident(ItemIndex) reserved(of) + integer(0)operator(:) ident(z) operator(:=) ident(FriendlyStr)operator(()ident(Data)operator(\);) + integer(1)operator(:) ident(z) operator(:=) ident(DWORDStringOfByteA)operator(()ident(Data)operator(\);) + integer(2)operator(:) ident(z) operator(:=) ident(DWORDStringOfByteA)operator(()ident(Data)operator(,) ident(True)operator(\);) + integer(3)operator(:) ident(z) operator(:=) ident(BinOfByteA)operator(()ident(Data)operator(,) integer(8)operator(,) string<delimiter(')content( )delimiter(')>operator(\);) + integer(4)operator(:) ident(z) operator(:=) ident(HexOfByteA)operator(()ident(Data)operator(,) integer(0)operator(\);) + integer(5)operator(:) ident(z) operator(:=) ident(HexOfByteA)operator(()ident(Data)operator(,) integer(1)operator(\);) + integer(6)operator(:) ident(z) operator(:=) ident(HexOfByteA)operator(()ident(Data)operator(,) integer(2)operator(\);) + integer(7)operator(:) ident(z) operator(:=) ident(HexOfByteA)operator(()ident(Data)operator(,) integer(4)operator(\);) + reserved(end)operator(;) + reserved(end)operator(;) + + ident(Result) operator(:=) ident(Copy)operator(()ident(z)operator(,) integer(1)operator(,) ident(MaxPreviewLen)operator(\);) + reserved(end)operator(;) + + reserved(function) ident(StringPreview)operator(()ident(Context)operator(:) ident(TRegContext)operator(\):) reserved(string)operator(;) + reserved(var) + ident(s)operator(:) reserved(string)operator(;) + ident(Expanded)operator(:) reserved(string)operator(;) + ident(DoExpand)operator(:) ident(Boolean)operator(;) + reserved(begin) + ident(s) operator(:=) ident(PChar)operator(()ident(Context)operator(.)ident(Data)operator(\);) + reserved(with) ident(PrefWin) reserved(do) + ident(Result) operator(:=) ident(StringQuoterBegin) operator(+) ident(FriendlyStr)operator(()ident(s)operator(\)) operator(+) ident(StringQuoterEnd)operator(;) + reserved(if) ident(s) operator(=) string<delimiter(')delimiter(')> reserved(then) + ident(Exit)operator(;) + + reserved(case) ident(PrefWin)operator(.)ident(ExpandStringsRG)operator(.)ident(ItemIndex) reserved(of) + integer(0)operator(:) ident(DoExpand) operator(:=) ident(False)operator(;) + integer(1)operator(:) ident(DoExpand) operator(:=) operator(()ident(Context)operator(.)ident(Typ) operator(=) ident(rdExpandString)operator(\)) reserved(and) operator(()ident(CharCount)operator(()ident(s)operator(,) char<delimiter(')content(%)delimiter(')>operator(\)) operator(>=) integer(2)operator(\);) + integer(2)operator(:) ident(DoExpand) operator(:=) ident(True)operator(;) + reserved(else) + ident(ShowMessage)operator(()string<delimiter(')content(Error: Unknown PrefWin.ExpandStringsRG.ItemIndex!)delimiter(')>operator(\);) + ident(PrefWin)operator(.)ident(ExpandStringsRG)operator(.)ident(ItemIndex) operator(:=) integer(0)operator(;) + ident(Exit)operator(;) + reserved(end)operator(;) + + reserved(if) ident(DoExpand) reserved(then) reserved(begin) + ident(Expanded) operator(:=) ident(ExpandString)operator(()ident(s)operator(\);) + reserved(if) ident(s) operator(<>) ident(Expanded) reserved(then) + ident(Result) operator(:=) ident(Result) operator(+) string<delimiter(')content( <)delimiter(')> operator(+) ident(Expanded) operator(+) char<delimiter(')content(>)delimiter(')>operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + reserved(function) ident(IntegerPreview)operator(()ident(Context)operator(:) ident(TRegContext)operator(\):) reserved(string)operator(;) + reserved(begin) + reserved(if) ident(Length)operator(()ident(Context)operator(.)ident(Data)operator(\)) operator(>=) ident(SizeOf)operator(()ident(Cardinal)operator(\)) reserved(then) reserved(begin) + ident(Result) operator(:=) ident(DWORDPreview)operator(()ident(PInteger)operator(()ident(Context)operator(.)ident(Data)operator(\)^\);) + reserved(end) reserved(else) + ident(Result) operator(:=) ident(BinaryPreview)operator(()ident(Context)operator(\);) + reserved(end)operator(;) + + reserved(function) ident(MultiStringPreview)operator(()ident(Context)operator(:) ident(TRegContext)operator(\):) reserved(string)operator(;) + reserved(var) + ident(z)operator(:) reserved(string)operator(;) + ident(SL)operator(:) ident(TStringList)operator(;) + ident(i)operator(:) ident(Integer)operator(;) + reserved(begin) + ident(z) operator(:=) string<delimiter(')delimiter(')>operator(;) + + ident(SL) operator(:=) ident(TStringList)operator(.)ident(Create)operator(;) + reserved(try) + ident(RegMultiStringOfByteA)operator(()ident(Context)operator(.)ident(Data)operator(,) ident(SL)operator(,) ident(PrefWin)operator(.)ident(UseExtendedModelCB)operator(.)ident(Checked)operator(\);) + + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(SL)operator(.)ident(Count)operator(-)integer(1) reserved(do) + ident(z) operator(:=) ident(z) operator(+) ident(SL)operator([)ident(i)operator(]) operator(+) string<delimiter(')content( )delimiter(')>operator(;) + reserved(finally) + ident(SL)operator(.)ident(Free)operator(;) + reserved(end)operator(;) + + ident(Result) operator(:=) ident(Copy)operator(()ident(FriendlyStr)operator(()ident(z)operator(\),) integer(1)operator(,) ident(MaxPreviewLen)operator(\);) + reserved(end)operator(;) + +reserved(begin) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + + reserved(if) ident(csDestroying) reserved(in) ident(PrefWin)operator(.)ident(ComponentState) reserved(then) + ident(Exit)operator(;) + + reserved(if) operator(()ident(Context)operator(.)ident(Data) operator(=) reserved(nil)operator(\)) reserved(or) operator(()ident(Length)operator(()ident(Context)operator(.)ident(Data)operator(\)) operator(>) ident(RegMaxDataSize)operator(\)) reserved(then) + ident(Exit)operator(;) + + reserved(if) ident(Length)operator(()ident(Context)operator(.)ident(Data)operator(\)) operator(>) ident(MaxPreviewLen) reserved(then) + ident(SetLength)operator(()ident(Context)operator(.)ident(Data)operator(,) ident(MaxPreviewLen)operator(\);) + + reserved(if) ident(PrefWin)operator(.)ident(ShowAsBinaryCB)operator(.)ident(Checked) reserved(then) reserved(begin) + ident(Result) operator(:=) ident(BinaryPreview)operator(()ident(Context)operator(\);) + ident(Exit)operator(;) reserved(end)operator(;) + + reserved(case) ident(Context)operator(.)ident(Typ) reserved(of) + ident(rdExpandString)operator(,) ident(rdString)operator(:) ident(Result) operator(:=) ident(StringPreview)operator(()ident(Context)operator(\);) + ident(rdCardinal)operator(,) ident(rdCardBigEndian)operator(:) ident(Result) operator(:=) ident(IntegerPreview)operator(()ident(Context)operator(\);) + ident(rdMultiString)operator(:) ident(Result) operator(:=) ident(MultiStringPreview)operator(()ident(Context)operator(\);) + reserved(else) + reserved(if) ident(PrefWin)operator(.)ident(Smart4BBCB)operator(.)ident(Checked) reserved(and) operator(()ident(Length)operator(()ident(Context)operator(.)ident(Data)operator(\)) operator(=) integer(4)operator(\)) reserved(then) + ident(Result) operator(:=) ident(IntegerPreview)operator(()ident(Context)operator(\)) + reserved(else) + ident(Result) operator(:=) ident(BinaryPreview)operator(()ident(Context)operator(\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(function) ident(ValueDataPreview)operator(()ident(Context)operator(:) ident(TRegContext)operator(\):) reserved(string)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(DataPreviewOfContext)operator(()ident(Context)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(IconOfDataType)operator(()ident(Typ)operator(:) ident(TRegDataType)operator(\):) ident(Integer)operator(;) +reserved(begin) + reserved(if) ident(Typ) reserved(in) operator([)ident(rdNone)operator(..)ident(rdLastType)operator(]) reserved(then) + ident(Result) operator(:=) ident(iconFirstType) operator(+) ident(Ord)operator(()ident(Typ)operator(\)) + reserved(else) + ident(Result) operator(:=) ident(iconUnknownType)operator(;) +reserved(end)operator(;) + +reserved(function) ident(ValueTypeIcon)operator(()ident(Context)operator(:) ident(TRegContext)operator(\):) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(IconOfDataType)operator(()ident(Context)operator(.)ident(Typ)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(TValuesWin)operator(.)ident(UpdateValue)operator(()ident(Reg)operator(:) ident(TXRegistry)operator(;) ident(Item)operator(:) ident(TListItem)operator(\):) ident(Boolean)operator(;) +comment(//Return Value: True if something has changed) +reserved(var) + ident(Size)operator(,) ident(Typ)operator(,) ident(Data)operator(:) reserved(string)operator(;) + ident(Icon)operator(:) ident(Integer)operator(;) + ident(Context)operator(:) ident(TRegContext)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(False)operator(;) + reserved(if) reserved(not) ident(Assigned)operator(()ident(Item)operator(\)) reserved(then) + ident(Exit)operator(;) + + ident(Context) operator(:=) ident(Reg)operator(.)ident(ReadContext)operator(()ident(RealValueName)operator(()ident(Item)operator(\)\);) + ident(Data) operator(:=) ident(ValueDataPreview)operator(()ident(Context)operator(\);) + ident(Size) operator(:=) ident(ValueDataSize)operator(()ident(Context)operator(\);) + ident(Typ) operator(:=) ident(ValueDataType)operator(()ident(Context)operator(\);) + ident(Icon) operator(:=) ident(ValueTypeIcon)operator(()ident(Context)operator(\);) + + reserved(if) ident(Icon) operator(<>) ident(Item)operator(.)ident(ImageIndex) reserved(then) reserved(begin) + ident(Item)operator(.)ident(ImageIndex) operator(:=) ident(Icon)operator(;) + ident(Result) operator(:=) ident(True)operator(;) + reserved(end)operator(;) + + reserved(while) ident(Item)operator(.)ident(SubItems)operator(.)ident(Count) operator(<) ident(Integer)operator(()ident(High)operator(()ident(TValueListColumn)operator(\)\)) reserved(do) + ident(Item)operator(.)ident(SubItems)operator(.)ident(Add)operator(()string<delimiter(')delimiter(')>operator(\);) + + reserved(if) ident(Size) operator(<>) ident(Item)operator(.)ident(SubItems)operator([)ident(SubItemIndex)operator([)ident(vlcSize)operator(]]) reserved(then) reserved(begin) + ident(Result) operator(:=) ident(True)operator(;) + ident(Item)operator(.)ident(SubItems)operator([)ident(SubItemIndex)operator([)ident(vlcSize)operator(]]) operator(:=) ident(Size)operator(;) + reserved(end)operator(;) + + reserved(if) ident(Typ) operator(<>) ident(Item)operator(.)ident(SubItems)operator([)ident(SubItemIndex)operator([)ident(vlcType)operator(]]) reserved(then) reserved(begin) + ident(Result) operator(:=) ident(True)operator(;) + ident(Item)operator(.)ident(SubItems)operator([)ident(SubItemIndex)operator([)ident(vlcType)operator(]]) operator(:=) ident(Typ)operator(;) + reserved(end)operator(;) + + reserved(if) operator(()ident(Data) operator(<>) ident(Item)operator(.)ident(SubItems)operator([)ident(SubItemIndex)operator([)ident(vlcData)operator(]]\)) reserved(then) reserved(begin) + ident(Result) operator(:=) ident(True)operator(;) + ident(Item)operator(.)ident(SubItems)operator([)ident(SubItemIndex)operator([)ident(vlcData)operator(]]) operator(:=) ident(Data)operator(;) + reserved(if) ident(IsMainValue)operator(()ident(Item)operator(\)) reserved(then) + ident(RegTV)operator(.)ident(Repaint)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(AppendNewValueInfos)operator(()ident(Item)operator(:) ident(TListItem)operator(;) ident(Context)operator(:) ident(TRegContext)operator(\);) +reserved(begin) + ident(Item)operator(.)ident(ImageIndex) operator(:=) ident(ValueTypeIcon)operator(()ident(Context)operator(\);) + reserved(with) ident(Item)operator(.)ident(SubItems) reserved(do) reserved(begin) + ident(Append)operator(()ident(ValueDataSize)operator(()ident(Context)operator(\)\);) + ident(Append)operator(()ident(ValueDataType)operator(()ident(Context)operator(\)\);) + ident(Append)operator(()ident(ValueDataPreview)operator(()ident(Context)operator(\)\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(function) ident(TValuesWin)operator(.)ident(AddValue)operator(()ident(Reg)operator(:) ident(TXRegistry)operator(;) reserved(const) ident(ValueName)operator(:) reserved(string)operator(;) + ident(AppendInfos)operator(:) ident(Boolean) operator(=) ident(True)operator(\):) ident(TListItem)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(ValueList)operator(.)ident(Items)operator(.)ident(AddItem)operator(()reserved(nil)operator(,) operator(-)integer(1)operator(\);) + ident(Result)operator(.)ident(Indent) operator(:=) operator(-)integer(1)operator(;) + ident(SetRealValueName)operator(()ident(Result)operator(,) ident(ValueName)operator(\);) + reserved(if) ident(AppendInfos) reserved(then) + ident(AppendNewValueInfos)operator(()ident(Result)operator(,) ident(Reg)operator(.)ident(ReadContext)operator(()ident(ValueName)operator(\)\);) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(ValueListChange)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Item)operator(:) ident(TListItem)operator(;) + ident(Change)operator(:) ident(TItemChange)operator(\);) +reserved(var) + ident(ValueName)operator(:) reserved(string)operator(;) + ident(Reg)operator(:) ident(TXRegistry)operator(;) + + reserved(function) ident(ComputeValuesCommon)operator(()ident(Reg)operator(:) ident(TXRegistry)operator(;) reserved(var) ident(DataType)operator(:) ident(TRegDataType)operator(\):) ident(Boolean)operator(;) + reserved(var) + ident(i)operator(:) ident(Integer)operator(;) + ident(ItemType)operator(:) ident(TRegDataType)operator(;) + reserved(begin) + ident(Result) operator(:=) ident(False)operator(;) + + ident(i) operator(:=) integer(0)operator(;) + ident(DataType) operator(:=) integer(0)operator(;) + reserved(while) ident(i) operator(<) ident(ValueList)operator(.)ident(Items)operator(.)ident(Count) reserved(do) reserved(begin) + ident(Item) operator(:=) ident(ValueList)operator(.)ident(Items)operator([)ident(i)operator(];) + reserved(if) reserved(not) ident(Item)operator(.)ident(Selected) reserved(then) reserved(begin) + ident(Inc)operator(()ident(i)operator(\);) + ident(Continue)operator(;) reserved(end)operator(;) + + ident(ValueName) operator(:=) ident(RealValueName)operator(()ident(Item)operator(\);) + reserved(if) ident(Reg)operator(.)ident(ValueReallyExists)operator(()ident(ValueName)operator(\)) reserved(then) reserved(begin) + + ident(ItemType) operator(:=) ident(Reg)operator(.)ident(GetDataType)operator(()ident(ValueName)operator(\);) + reserved(if) reserved(not) ident(Result) reserved(then) reserved(begin) + ident(DataType) operator(:=) ident(ItemType)operator(;) + ident(Result) operator(:=) ident(True)operator(;) + reserved(end) reserved(else) reserved(if) ident(ItemType) operator(<>) ident(DataType) reserved(then) reserved(begin) + ident(Result) operator(:=) ident(False)operator(;) + ident(DataType) operator(:=) integer(0)operator(;) + ident(Break)operator(;) reserved(end)operator(;) + + reserved(with) ident(ValueNames) reserved(do) + reserved(if) ident(Item)operator(.)ident(Focused) reserved(then) + ident(Insert)operator(()integer(0)operator(,) ident(ValueName)operator(\)) + reserved(else) + ident(Add)operator(()ident(ValueName)operator(\);) + + reserved(end) reserved(else) reserved(begin) + ident(ShowMessage)operator(()string<delimiter(')content(Value has been deleted!)delimiter(')>operator(\);) + ident(DataType) operator(:=) integer(0)operator(;) + ident(Result) operator(:=) ident(False)operator(;) + ident(Reload)operator(;) + ident(Break)operator(;) reserved(end)operator(;) + + ident(Inc)operator(()ident(i)operator(\);) + reserved(end)operator(;) + reserved(end)operator(;) + +reserved(begin) + reserved(if) reserved(not) ident(Assigned)operator(()ident(Item)operator(\)) reserved(or) ident(ValueList)operator(.)ident(IsEditing) reserved(or) reserved(not) ident(ValueList)operator(.)ident(Enabled) reserved(then) + ident(Exit)operator(;) + + reserved(if) ident(Change) operator(<>) ident(ctState) reserved(then) + ident(Exit)operator(;) + + reserved(if) ident(csDestroying) reserved(in) ident(WorkWin)operator(.)ident(ComponentState) reserved(then) + ident(Exit)operator(;) + + reserved(if) operator(()ident(ValueList)operator(.)ident(SelCount) operator(=) integer(0)operator(\)) reserved(then) reserved(begin) + ident(ValueNames)operator(.)ident(Clear)operator(;) + ident(WorkWin)operator(.)ident(ReInitShowPC)operator(;) + ident(Exit)operator(;) reserved(end)operator(;) + + reserved(if) reserved(not) ident(Item)operator(.)ident(Focused) reserved(then) + ident(Exit)operator(;) + + ident(WorkWin)operator(.)ident(ReInitShowPC)operator(;) + + ident(ValueNames)operator(.)ident(Clear)operator(;) + ident(Reg) operator(:=) ident(TXRegistry)operator(.)ident(Create)operator(;) + reserved(try) + reserved(if) ident(OpenNodeOK)operator(()ident(Reg)operator(,) ident(RegTV)operator(.)ident(Selected)operator(\)) reserved(then) reserved(begin) + ident(ValuesCommon) operator(:=) ident(ComputeValuesCommon)operator(()ident(Reg)operator(,) ident(ValueCommonType)operator(\);) + reserved(if) ident(ValuesCommon) reserved(then) + ident(WorkWin)operator(.)ident(ShowValues)operator(()ident(Reg)operator(\);) + reserved(end)operator(;) + reserved(finally) + ident(Reg)operator(.)ident(Free)operator(;) + reserved(end)operator(;) + + reserved(if) ident(csDestroying) reserved(in) ident(MainWin)operator(.)ident(ComponentState) reserved(then) + ident(Exit)operator(;) + + reserved(if) ident(ActiveControl) operator(=) ident(ValueList) reserved(then) + ident(MainWin)operator(.)ident(SetStatus)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(ValueListCustomDrawItem)operator(()ident(Sender)operator(:) ident(TCustomListView)operator(;) + ident(Item)operator(:) ident(TListItem)operator(;) ident(State)operator(:) ident(TCustomDrawState)operator(;) reserved(var) ident(DefaultDraw)operator(:) ident(Boolean)operator(\);) +reserved(begin) + reserved(with) ident(ValueList)operator(.)ident(Canvas)operator(.)ident(Font) reserved(do) reserved(begin) + reserved(if) ident(Item)operator(.)ident(Focused) reserved(then) + ident(Style) operator(:=) ident(Style) operator(+) operator([)ident(fsBold)operator(];) + reserved(if) ident(ItemIsDefaultValue)operator(()ident(Item)operator(\)) reserved(then) + ident(Color) operator(:=) ident(clBrightYellow) + reserved(else) + ident(Color) operator(:=) ident(ColorOfDataType)operator(()ident(TRegDataType)operator(()ident(Item)operator(.)ident(ImageIndex) operator(-) ident(iconFirstType)operator(\)\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(ValueListDblClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ValueListChange)operator(()ident(Sender)operator(,) ident(ValueList)operator(.)ident(ItemFocused)operator(,) ident(ctState)operator(\);) + ident(MainPC)operator(.)ident(ActivePage) operator(:=) ident(WorkWin)operator(.)ident(WorkPage)operator(;) + + reserved(if) reserved(not) ident(Assigned)operator(()ident(ValueList)operator(.)ident(ItemFocused)operator(\)) reserved(then) + ident(Exit)operator(;) + + reserved(if) ident(csDestroying) reserved(in) ident(WorkWin)operator(.)ident(ComponentState) reserved(then) + ident(Exit)operator(;) + + ident(WorkWin)operator(.)ident(EditData)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(ValueListEditing)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Item)operator(:) ident(TListItem)operator(;) + reserved(var) ident(AllowEdit)operator(:) ident(Boolean)operator(\);) +reserved(begin) + reserved(if) reserved(not) ident(ValueLabelClicked) reserved(then) reserved(begin) + ident(AllowEdit) operator(:=) ident(False)operator(;) + ident(Exit)operator(;) reserved(end)operator(;) + + reserved(if) ident(ItemIsDefaultValue)operator(()ident(Item)operator(\)) reserved(then) comment(//unschön, aber beste Lösung bisher) + ident(Keyboard)operator(.)ident(SimKey)operator(()ident(VK_DELETE)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(ValueListEdited)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Item)operator(:) ident(TListItem)operator(;) + reserved(var) ident(S)operator(:) reserved(string)operator(\);) +reserved(var) + ident(Old)operator(:) reserved(string)operator(;) + ident(OldCaption)operator(:) reserved(string)operator(;) +reserved(begin) + ident(OldCaption) operator(:=) ident(Item)operator(.)ident(Caption)operator(;) + ident(Old) operator(:=) ident(RealValueName)operator(()ident(Item)operator(\);) + + reserved(if) ident(s) operator(=) ident(Old) reserved(then) reserved(begin) + reserved(if) ident(ItemIsDefaultValue)operator(()ident(Item)operator(\)) reserved(then) + ident(s) operator(:=) ident(DefaultValueCaption)operator(;) + ident(Exit)operator(;) reserved(end)operator(;) + + ident(SpyThread)operator(.)ident(Suspend)operator(;) + reserved(try) + ident(Item)operator(.)ident(Caption) operator(:=) ident(s)operator(;) + + reserved(if) ident(TryRenameValue)operator(()ident(Old)operator(,) ident(s)operator(\)) reserved(then) reserved(begin) + ident(SetRealValueName)operator(()ident(Item)operator(,) ident(s)operator(\);) comment(//Sichere Zuweisung des Standard-Flags) + ident(s) operator(:=) ident(Item)operator(.)ident(Caption)operator(;) comment(//Anschließend externer Aufruf "Item.Caption := s"!) + reserved(end) reserved(else) reserved(begin) + ident(s) operator(:=) ident(OldCaption)operator(;) + reserved(end)operator(;) + + reserved(finally) + ident(SpyThread)operator(.)ident(Restart) operator(:=) ident(True)operator(;) + ident(SpyThread)operator(.)ident(Resume)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(ValueListKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) + ident(Shift)operator(:) ident(TShiftState)operator(\);) +reserved(var) + ident(T)operator(:) reserved(string)operator(;) + ident(Item)operator(:) ident(TListItem)operator(;) +reserved(begin) + reserved(if) ident(ValueList)operator(.)ident(IsEditing) reserved(then) + ident(Exit)operator(;) + + reserved(if) ident(csDestroying) reserved(in) ident(TreeWin)operator(.)ident(ComponentState) reserved(then) + ident(Exit)operator(;) + + ident(Item) operator(:=) ident(ValueList)operator(.)ident(ItemFocused)operator(;) + + reserved(case) ident(Key) reserved(of) + ident(VK_SPACE)operator(:) ident(JumpToSel)operator(()ident(ValueList)operator(\);) + + ident(VK_F9)operator(:) ident(SwapFonts)operator(()ident(ValueList)operator(\);) + + ident(VK_F5)operator(:) ident(Reload)operator(;) + + ident(VK_F12)operator(:) reserved(begin) comment(//Sort) + reserved(if) ident(Assigned)operator(()ident(Item)operator(\)) reserved(then) + ident(T) operator(:=) ident(Item)operator(.)ident(Caption)operator(;) + ident(ValueList)operator(.)ident(SortType) operator(:=) ident(TSortType)operator(()integer(2) operator(-) operator(()ident(Integer)operator(()ident(ValueList)operator(.)ident(SortType)operator(\)\)\);) + reserved(if) ident(ValueList)operator(.)ident(SortType) operator(=) ident(stNone) reserved(then) + ident(TreeWin)operator(.)ident(RegTVChange)operator(()ident(Sender)operator(,) ident(RegTV)operator(.)ident(Selected)operator(\);) + ident(ValueList)operator(.)ident(ItemFocused) operator(:=) ident(FindItem)operator(()ident(ValueList)operator(,) ident(T)operator(\);) + reserved(if) ident(Assigned)operator(()ident(ValueList)operator(.)ident(ItemFocused)operator(\)) reserved(then) + ident(ValueList)operator(.)ident(ItemFocused)operator(.)ident(MakeVisible)operator(()ident(True)operator(\);) + reserved(end)operator(;) + + ident(VK_DELETE)operator(:) ident(DeleteMIClick)operator(()ident(Sender)operator(\);) + + ident(VK_RETURN)operator(:) ident(ValueListDblCLick)operator(()ident(Sender)operator(\);) + + ident(Ord)operator(()char<delimiter(')content(C)delimiter(')>operator(\):) + reserved(if) reserved(not) ident(ValueList)operator(.)ident(IsEditing) reserved(then) + ident(CopyPathMIClick)operator(()ident(Sender)operator(\);) + + ident(VK_SCROLL)operator(:) ident(CheckValueListHotTrack)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(ValueListResize)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(with) ident(ValueList) reserved(do) + ident(Columns)operator([)integer(3)operator(].)ident(Width) operator(:=) ident(ClientWidth) operator(-) operator(()integer(0) operator(+) + ident(Columns)operator([)integer(0)operator(].)ident(Width) operator(+) ident(Columns)operator([)integer(1)operator(].)ident(Width) operator(+) ident(Columns)operator([)integer(2)operator(].)ident(Width)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(DeleteValue)operator(;) +reserved(var) + ident(Item)operator(,) ident(NewSel)operator(:) ident(TListItem)operator(;) + ident(YesToAll)operator(:) ident(Boolean)operator(;) + ident(i)operator(:) ident(Integer)operator(;) + + reserved(procedure) ident(DeleteIt)operator(()ident(Item)operator(:) ident(TListItem)operator(\);) + reserved(begin) + ident(OpenCurKey)operator(;) + reserved(if) ident(MainReg)operator(.)ident(DeleteValue)operator(()ident(RealValueName)operator(()ident(Item)operator(\)\)) + reserved(and) reserved(not) ident(MainReg)operator(.)ident(ValueReallyExists)operator(()ident(RealValueName)operator(()ident(Item)operator(\)\)) reserved(then) reserved(begin) + ident(Item)operator(.)ident(Delete)operator(;) + reserved(end) reserved(else) reserved(begin) + ident(ShowMessage)operator(()string<delimiter(')content(Could not delete Value )delimiter(')> operator(+) ident(Quote)operator(()ident(RealValueName)operator(()ident(Item)operator(\)\)\);) + ident(Inc)operator(()ident(i)operator(\);) + reserved(end)operator(;) + ident(MainReg)operator(.)ident(CloseKey)operator(;) + + reserved(if) ident(IsMainValue)operator(()ident(Item)operator(\)) reserved(then) + ident(RegTV)operator(.)ident(Repaint)operator(;) + reserved(end)operator(;) + +reserved(begin) + ident(SpyThread)operator(.)ident(Suspend)operator(;) + + ident(NewSel) operator(:=) ident(GetNextBestNotSelected)operator(()ident(ValueList)operator(.)ident(ItemFocused)operator(\);) + + ident(YesToAll) operator(:=) ident(False)operator(;) + ident(i) operator(:=) integer(0)operator(;) + reserved(while) ident(i) operator(<) ident(ValueList)operator(.)ident(Items)operator(.)ident(Count) reserved(do) reserved(begin) + ident(Item) operator(:=) ident(ValueList)operator(.)ident(Items)operator([)ident(i)operator(];) + reserved(if) reserved(not) ident(Item)operator(.)ident(Selected) reserved(then) reserved(begin) + ident(Inc)operator(()ident(i)operator(\);) + ident(Continue)operator(;) reserved(end)operator(;) + + reserved(if) ident(YesToAll) reserved(then) + ident(DeleteIt)operator(()ident(Item)operator(\)) + reserved(else) reserved(begin) + reserved(case) ident(MessageDlg)operator(()string<delimiter(')content(Do you really want to delete the Value )delimiter(')> operator(+) + ident(Quote)operator(()ident(RealValueName)operator(()ident(Item)operator(\)\)) operator(+) char<delimiter(')content(?)delimiter(')>operator(,) + ident(mtConfirmation)operator(,) operator([)ident(mbYes)operator(,) ident(mbYesToAll)operator(,) ident(mbNo)operator(,) ident(mbCancel)operator(],) integer(0)operator(\)) reserved(of) + ident(mrYes)operator(:) ident(DeleteIt)operator(()ident(Item)operator(\);) + ident(mrYesToAll)operator(:) ident(YesToAll) operator(:=) ident(True)operator(;) + ident(mrCancel)operator(:) ident(Exit)operator(;) + ident(mrNo)operator(:) reserved(begin) + ident(Item)operator(.)ident(Selected) operator(:=) ident(False)operator(;) + ident(NewSel) operator(:=) ident(Item)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + reserved(if) ident(Assigned)operator(()ident(NewSel)operator(\)) reserved(then) reserved(begin) + ident(ValueList)operator(.)ident(ItemFocused) operator(:=) ident(NewSel)operator(;) + ident(NewSel)operator(.)ident(Selected) operator(:=) ident(True)operator(;) + reserved(end) reserved(else) + ident(WorkWin)operator(.)ident(ReInitShowPC)operator(;) + + ident(SpyThread)operator(.)ident(Restart) operator(:=) ident(True)operator(;) + ident(SpyThread)operator(.)ident(Resume)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(ZeromizeValue)operator(;) +reserved(var) + ident(Item)operator(:) ident(TListItem)operator(;) + ident(YesToAll)operator(:) ident(Boolean)operator(;) + ident(i)operator(:) ident(Integer)operator(;) + + reserved(procedure) ident(ZeromizeIt)operator(()ident(Item)operator(:) ident(TListItem)operator(\);) + reserved(begin) + reserved(with) ident(MainReg) reserved(do) reserved(begin) + ident(OpenCurKey)operator(;) + ident(ZeromizeValue)operator(()ident(RealValueName)operator(()ident(Item)operator(\)\);) + ident(UpdateValue)operator(()ident(MainReg)operator(,) ident(Item)operator(\);) + ident(CloseKey)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + +reserved(begin) + ident(SpyThread)operator(.)ident(Suspend)operator(;) + + ident(YesToAll) operator(:=) ident(False)operator(;) + ident(i) operator(:=) integer(0)operator(;) + reserved(while) ident(i) operator(<) ident(ValueList)operator(.)ident(Items)operator(.)ident(Count) reserved(do) reserved(begin) + ident(Item) operator(:=) ident(ValueList)operator(.)ident(Items)operator([)ident(i)operator(];) + reserved(if) reserved(not) ident(Item)operator(.)ident(Selected) reserved(then) reserved(begin) + ident(Inc)operator(()ident(i)operator(\);) + ident(Continue)operator(;) reserved(end)operator(;) + + reserved(if) ident(YesToAll) reserved(then) + ident(ZeromizeIt)operator(()ident(Item)operator(\)) + reserved(else) + reserved(case) ident(MessageDlg)operator(()string<delimiter(')content(Do you really want to zeromize ValueData of )delimiter(')> operator(+) + ident(Quote)operator(()ident(RealValueName)operator(()ident(Item)operator(\)\)) operator(+) string<delimiter(')content( ?)delimiter(')>operator(,) + ident(mtConfirmation)operator(,) operator([)ident(mbYes)operator(,) ident(mbYesToAll)operator(,) ident(mbNo)operator(,) ident(mbCancel)operator(],) integer(0)operator(\)) reserved(of) + + ident(mrYes)operator(:) reserved(begin) + ident(ZeromizeIt)operator(()ident(Item)operator(\);) + ident(Inc)operator(()ident(i)operator(\);) + reserved(end)operator(;) + + ident(mrYesToAll)operator(:) reserved(begin) + ident(YesToAll) operator(:=) ident(True)operator(;) + ident(ZeromizeIt)operator(()ident(Item)operator(\);) + reserved(end)operator(;) + ident(mrCancel)operator(:) ident(Exit)operator(;) + reserved(end)operator(;) + + reserved(if) ident(IsMainValue)operator(()ident(Item)operator(\)) reserved(then) + ident(RegTV)operator(.)ident(Repaint)operator(;) + reserved(end)operator(;) + + + ident(SpyThread)operator(.)ident(Resume)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(ValueListPUPopup)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(Writable)operator(,) ident(ValueOK)operator(,) ident(OnlyOneValue)operator(,) ident(OneValueOK)operator(:) ident(Boolean)operator(;) + ident(Item)operator(:) ident(TListItem)operator(;) +reserved(begin) + reserved(if) ident(Assigned)operator(()ident(ValueList)operator(.)ident(ItemFocused)operator(\)) reserved(then) + ident(ValueList)operator(.)ident(ItemFocused)operator(.)ident(Selected) operator(:=) ident(True)operator(;) + + reserved(if) ident(csDestroying) reserved(in) operator(()ident(TreeWin)operator(.)ident(ComponentState) operator(+) ident(PrefWin)operator(.)ident(ComponentState)operator(\)) reserved(then) + ident(Exit)operator(;) + + ident(Writable) operator(:=) reserved(not) ident(TreeWin)operator(.)ident(CantWrite)operator(;) + ident(NewDefaultValueMI)operator(.)ident(Visible) operator(:=) ident(Writable)operator(;) + ident(NewStringMI)operator(.)ident(Visible) operator(:=) ident(Writable)operator(;) + ident(NewDWORDMI)operator(.)ident(Visible) operator(:=) ident(Writable)operator(;) + ident(NewBinaryMI)operator(.)ident(Visible) operator(:=) ident(Writable)operator(;) + ident(NewMultiStringMI)operator(.)ident(Visible) operator(:=) ident(Writable)operator(;) + ident(NewElseMI)operator(.)ident(Visible) operator(:=) ident(Writable)operator(;) + + ident(ValueOK) operator(:=) ident(Writable) reserved(and) operator(()ident(ValueList)operator(.)ident(ItemFocused) operator(<>) reserved(nil)operator(\);) + ident(OnlyOneValue) operator(:=) ident(ValueList)operator(.)ident(SelCount) operator(=) integer(1)operator(;) + ident(OneValueOK) operator(:=) ident(OnlyOneValue) reserved(and) ident(ValueOK)operator(;) + + ident(EditMI)operator(.)ident(Visible) operator(:=) ident(ValueOK)operator(;) + ident(EditBinaryMI)operator(.)ident(Visible) operator(:=) ident(ValueOK)operator(;) + ident(DublicateMI)operator(.)ident(Visible) operator(:=) ident(OneValueOK)operator(;) + ident(CopyPathMI)operator(.)ident(Visible) operator(:=) ident(OnlyOneValue)operator(;) + ident(CopyDataPreviewMI)operator(.)ident(Visible) operator(:=) ident(OnlyOneValue)operator(;) + ident(TakeAsMainValueMI)operator(.)ident(Visible) operator(:=) ident(OnlyOneValue)operator(;) + ident(RenameMI)operator(.)ident(Visible) operator(:=) ident(OneValueOK)operator(;) + ident(DeleteMI)operator(.)ident(Visible) operator(:=) ident(ValueOK)operator(;) + ident(ZeromizeMI)operator(.)ident(Visible) operator(:=) ident(ValueOK)operator(;) + + ident(Item) operator(:=) ident(ValueList)operator(.)ident(ItemFocused)operator(;) + reserved(if) reserved(not) ident(Assigned)operator(()ident(Item)operator(\)) reserved(then) + ident(Exit)operator(;) + + ident(TakeAsMainValueMI)operator(.)ident(Checked) operator(:=) ident(RealValueName)operator(()ident(Item)operator(\)) operator(=) ident(PrefWin)operator(.)ident(MainPreviewE)operator(.)ident(Text)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(FormKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) + ident(Shift)operator(:) ident(TShiftState)operator(\);) +reserved(begin) + reserved(if) ident(ValueList)operator(.)ident(IsEditing) reserved(then) + ident(Exit)operator(;) + + reserved(if) ident(csDestroying) reserved(in) ident(MainWin)operator(.)ident(ComponentState) reserved(then) + ident(Exit)operator(;) + ident(MainWin)operator(.)ident(FormKeyDown)operator(()ident(Sender)operator(,) ident(Key)operator(,) ident(Shift)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(ValueListDeletion)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Item)operator(:) ident(TListItem)operator(\);) +reserved(begin) + reserved(if) ident(Assigned)operator(()ident(SpyThread)operator(\)) reserved(then) + ident(SpyThread)operator(.)ident(Restart) operator(:=) ident(True)operator(;) + + reserved(if) ident(csDestroying) reserved(in) ident(WorkWin)operator(.)ident(ComponentState) reserved(then) + ident(Exit)operator(;) + + reserved(if) ident(Assigned)operator(()ident(ShowPC)operator(.)ident(ActivePage)operator(\)) + reserved(and) ident(Item)operator(.)ident(Selected) reserved(and) ident(Item)operator(.)ident(Focused) reserved(then) reserved(begin) + ident(ValueList)operator(.)ident(ItemFocused) operator(:=) ident(GetNextBest)operator(()ident(Item)operator(\);) + ident(WorkWin)operator(.)ident(ReInitShowPC)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(DeleteMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) ident(ValueList)operator(.)ident(IsEditing) reserved(then) + ident(Exit)operator(;) + + ident(DeleteValue)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(RenameMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) ident(Assigned)operator(()ident(ValueList)operator(.)ident(ItemFocused)operator(\)) reserved(then) reserved(begin) + ident(ValueLabelClicked) operator(:=) ident(True)operator(;) + ident(ValueList)operator(.)ident(ItemFocused)operator(.)ident(EditCaption)operator(;) + ident(ValueLabelClicked) operator(:=) ident(False)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(NewBigEndianMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(CreateValue)operator(()ident(rdCardBigEndian)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(NewExpandStringMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(CreateValue)operator(()ident(rdExpandString)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(NewMultiStringMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(CreateValue)operator(()ident(rdMultiString)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(NewStrangeTypeMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(CreateValue)operator(()ident(TRegDataType)operator(()ident(TMenuItem)operator(()ident(Sender)operator(\).)ident(Tag)operator(\)\);) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(NewDefaultValueMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(DefaultItem)operator(:) ident(TListItem)operator(;) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + reserved(if) ident(csDestroying) reserved(in) operator(()ident(TreeWin)operator(.)ident(ComponentState) operator(+) ident(MainWin)operator(.)ident(ComponentState)operator(\)) reserved(then) + ident(Exit)operator(;) + reserved(if) ident(TreeWin)operator(.)ident(CantWrite) reserved(then) + ident(Exit)operator(;) + + reserved(with) ident(MainReg) reserved(do) reserved(begin) + reserved(try) + ident(OpenCurKey)operator(;) + + reserved(if) ident(StandardValueExists) reserved(then) reserved(begin) + ident(ShowMessage)operator(()string<delimiter(')content(Default Value already exists.)delimiter(')>operator(\);) + ident(CloseKey)operator(;) + ident(Exit)operator(;) reserved(end)operator(;) + + ident(WriteString)operator(()string<delimiter(')delimiter(')>operator(,) string<delimiter(')delimiter(')>operator(\);) + + reserved(if) reserved(not) ident(StandardValueExists) reserved(then) reserved(begin) + ident(ShowMessage)operator(()string<delimiter(')content(Could not create Default Value.)delimiter(')>operator(\);) + ident(CloseKey)operator(;) + ident(Exit)operator(;) reserved(end)operator(;) + + ident(ValuesWin)operator(.)ident(AddValue)operator(()ident(MainReg)operator(,) string<delimiter(')delimiter(')>operator(\);) + reserved(finally) + ident(CloseKey)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + reserved(with) ident(ValueList)operator(.)ident(Items) reserved(do) reserved(begin) + ident(DefaultItem) operator(:=) reserved(nil)operator(;) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(Count)operator(-)integer(1) reserved(do) + reserved(if) ident(ItemIsDefaultValue)operator(()ident(Item)operator([)ident(i)operator(]\)) reserved(then) + ident(Break)operator(;) + + reserved(if) ident(i) operator(<) ident(Count) reserved(then) + ident(DefaultItem) operator(:=) ident(Item)operator([)ident(i)operator(];) + reserved(end)operator(;) + + reserved(if) reserved(not) ident(Assigned)operator(()ident(DefaultItem)operator(\)) reserved(then) + ident(ShowMessage)operator(()string<delimiter(')content(Error: Lost Default Value!)delimiter(')>operator(\)) + reserved(else) reserved(begin) + ident(SelectItemOnly)operator(()ident(ValueList)operator(,) ident(DefaultItem)operator(\);) + ident(MainWin)operator(.)ident(StatusBarUpdate)operator(;) + ident(ValueListDblClick)operator(()ident(Sender)operator(\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(ValueListChanging)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Item)operator(:) ident(TListItem)operator(;) + ident(Change)operator(:) ident(TItemChange)operator(;) reserved(var) ident(AllowChange)operator(:) ident(Boolean)operator(\);) +reserved(begin) + reserved(if) ident(Item) operator(=) reserved(nil) reserved(then) + ident(AllowChange) operator(:=) ident(False)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(ValueListMouseDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Button)operator(:) ident(TMouseButton)operator(;) + ident(Shift)operator(:) ident(TShiftState)operator(;) ident(X)operator(,) ident(Y)operator(:) ident(Integer)operator(\);) +reserved(begin) + ident(ValueLabelClicked) operator(:=) ident(False)operator(;) + reserved(with) ident(ValueList) reserved(do) + reserved(if) operator(([)ident(htOnIcon)operator(,) ident(htOnLabel)operator(]) operator(*) ident(GetHitTestInfoAt)operator(()ident(X)operator(,) ident(Y)operator(\)\)) operator(<>) operator([]) reserved(then) + ident(ValueLabelClicked) operator(:=) ident(True)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(EditBinaryMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) ident(csDestroying) reserved(in) ident(WorkWin)operator(.)ident(ComponentState) reserved(then) + ident(Exit)operator(;) + + ident(WorkWin)operator(.)ident(ShowAsBinary) operator(:=) ident(True)operator(;) + ident(ValueListChange)operator(()ident(Sender)operator(,) ident(ValueList)operator(.)ident(ItemFocused)operator(,) ident(ctState)operator(\);) + ident(ValueListDblClick)operator(()ident(Sender)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(EditMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ValueListDblClick)operator(()ident(Sender)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(ValueListCustomDrawSubItem)operator(()ident(Sender)operator(:) ident(TCustomListView)operator(;) + ident(Item)operator(:) ident(TListItem)operator(;) ident(SubItem)operator(:) ident(Integer)operator(;) ident(State)operator(:) ident(TCustomDrawState)operator(;) + reserved(var) ident(DefaultDraw)operator(:) ident(Boolean)operator(\);) +reserved(begin) + reserved(with) ident(ValueList)operator(.)ident(Canvas)operator(.)ident(Font) reserved(do) reserved(begin) + ident(Style) operator(:=) operator([];) + reserved(if) ident(SubItem) operator(=) integer(1) reserved(then) + ident(Color) operator(:=) ident(clSilver) + reserved(else) + ident(Color) operator(:=) ident(ColorOfDataType)operator(()ident(TRegDataType)operator(()ident(Item)operator(.)ident(ImageIndex) operator(-) ident(iconFirstType)operator(\)\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(ValueListCompare)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Item1)operator(,) ident(Item2)operator(:) ident(TListItem)operator(;) + ident(Data)operator(:) ident(Integer)operator(;) reserved(var) ident(Compare)operator(:) ident(Integer)operator(\);) +reserved(begin) + reserved(case) ident(SortBy) reserved(of) + ident(vlcName)operator(:) ident(Compare) operator(:=) ident(AnsiCompareText)operator(()ident(RealValueName)operator(()ident(Item1)operator(\),) ident(RealValueName)operator(()ident(Item2)operator(\)\);) + ident(vlcSize)operator(:) ident(Compare) operator(:=) ident(Integer)operator(() + ident(StrToIntDef)operator(()ident(Item1)operator(.)ident(SubItems)operator([)ident(SubItemIndex)operator([)ident(vlcSize)operator(]],) operator(-)integer(1)operator(\)) operator(>) + ident(StrToIntDef)operator(()ident(Item2)operator(.)ident(SubItems)operator([)ident(SubItemIndex)operator([)ident(vlcSize)operator(]],) operator(-)integer(1)operator(\)\);) + ident(vlcData)operator(:) ident(Compare) operator(:=) ident(Integer)operator(()ident(Item1)operator(.)ident(SubItems)operator([)ident(SubItemIndex)operator([)ident(vlcData)operator(]]) operator(>) + ident(Item2)operator(.)ident(SubItems)operator([)ident(SubItemIndex)operator([)ident(vlcData)operator(]]\);) + ident(vlcType)operator(:) ident(Compare) operator(:=) ident(Integer)operator(()ident(Item1)operator(.)ident(ImageIndex) operator(>) ident(Item2)operator(.)ident(ImageIndex)operator(\);) + reserved(end)operator(;) + + reserved(if) ident(Assigned)operator(()ident(SortByColumn)operator(\)) + reserved(and) operator(()ident(SortByColumn)operator(.)ident(ImageIndex) operator(=) ident(iconSortArrowDesc)operator(\)) reserved(then) + ident(Compare) operator(:=) integer(1) operator(-) ident(Compare)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(ValueListColumnClick)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Column)operator(:) ident(TListColumn)operator(\);) +reserved(begin) + reserved(case) ident(Column)operator(.)ident(ImageIndex) reserved(of) + ident(iconSortArrowAsc)operator(:) ident(Column)operator(.)ident(ImageIndex) operator(:=) ident(iconSortArrowDesc)operator(;) + ident(iconSortArrowDesc)operator(:) ident(Column)operator(.)ident(ImageIndex) operator(:=) operator(-)integer(1)operator(;) + reserved(else) + reserved(if) ident(Assigned)operator(()ident(SortByColumn)operator(\)) reserved(then) + ident(SortByColumn)operator(.)ident(ImageIndex) operator(:=) operator(-)integer(1)operator(;) + reserved(if) ident(TValueListColumn)operator(()ident(Column)operator(.)ident(Tag)operator(\)) reserved(in) ident(ValueListColumnRange) reserved(then) + ident(SortBy) operator(:=) ident(TValueListColumn)operator(()ident(Column)operator(.)ident(Tag)operator(\)) + reserved(else) + ident(ShowMessage)operator(()string<delimiter(')content(Unknown Column Tag)delimiter(')>operator(\);) + ident(Column)operator(.)ident(ImageIndex) operator(:=) ident(iconSortArrowAsc)operator(;) + reserved(end)operator(;) + + reserved(if) ident(Column)operator(.)ident(ImageIndex) operator(=) operator(-)integer(1) reserved(then) + ident(ValueList)operator(.)ident(SortType) operator(:=) ident(stNone) + reserved(else) reserved(begin) + ident(ValueList)operator(.)ident(SortType) operator(:=) ident(stData)operator(;) + ident(SortByColumn) operator(:=) ident(Column)operator(;) + reserved(end)operator(;) + + ident(Update)operator(;) + ident(ValueList)operator(.)ident(AlphaSort)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(CloneValue)operator(;) +reserved(var) + ident(OldName)operator(,) ident(NewName)operator(:) reserved(string)operator(;) + + reserved(function) ident(GetNewName)operator(()ident(Reg)operator(:) ident(TXRegistry)operator(;) reserved(const) ident(OldName)operator(:) reserved(string)operator(\):) reserved(string)operator(;) + reserved(var) + ident(i)operator(:) ident(Integer)operator(;) + ident(Prefix)operator(:) reserved(string)operator(;) + reserved(begin) + reserved(if) ident(OldName) operator(=) string<delimiter(')delimiter(')> reserved(then) + ident(Result) operator(:=) string<delimiter(')content(New Default Value)delimiter(')> + reserved(else) reserved(if) ident(Copy)operator(()ident(OldName)operator(,) integer(1)operator(,) integer(4)operator(\)) operator(<>) string<delimiter(')content(New )delimiter(')> reserved(then) + ident(Result) operator(:=) string<delimiter(')content(New )delimiter(')> operator(+) ident(OldName) + reserved(else) + ident(Result) operator(:=) ident(OldName)operator(;) + + ident(Prefix) operator(:=) ident(Result)operator(;) + ident(i) operator(:=) integer(1)operator(;) + reserved(while) ident(Reg)operator(.)ident(ValueExists)operator(()ident(Result)operator(\)) reserved(do) reserved(begin) + ident(Result) operator(:=) ident(Prefix) operator(+) char<delimiter(')content( )delimiter(')> operator(+) ident(IntToStr)operator(()ident(i)operator(\);) + ident(Inc)operator(()ident(i)operator(\);) + reserved(end)operator(;) + reserved(end)operator(;) + +reserved(begin) + reserved(if) ident(csDestroying) reserved(in) ident(TreeWin)operator(.)ident(ComponentState) reserved(then) + ident(Exit)operator(;) + + reserved(if) ident(TreeWin)operator(.)ident(CantWrite) reserved(then) + ident(Exit)operator(;) + + ident(OldName) operator(:=) ident(RealValueName)operator(()ident(ValueList)operator(.)ident(ItemFocused)operator(\);) + + reserved(try) + ident(OpenCurKey)operator(;) + + ident(NewName) operator(:=) ident(GetNewName)operator(()ident(MainReg)operator(,) ident(OldName)operator(\);) + ident(MainReg)operator(.)ident(CopyValue)operator(()ident(OldName)operator(,) ident(NewName)operator(\);) + ident(AddValue)operator(()ident(MainReg)operator(,) ident(NewName)operator(\);) + reserved(finally) + ident(MainReg)operator(.)ident(CloseKey)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(DublicateMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(CloneValue)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(CopyDataPreviewMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) ident(ValueList)operator(.)ident(IsEditing) reserved(then) + ident(Exit)operator(;) + + ident(CopyDataPreview)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(CopyDataPreview)operator(;) +reserved(begin) + ident(OpenCurKey)operator(;) + ident(Clipboard)operator(.)ident(AsText) operator(:=) ident(DataPreviewOfContext)operator(()ident(MainReg)operator(.)ident(ReadContext)operator(() + ident(RealValueName)operator(()ident(ValueList)operator(.)ident(ItemFocused)operator(\)\)\);) + ident(MainReg)operator(.)ident(CloseKey)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(UpdateValues)operator(()ident(SelectedOnly)operator(:) ident(Boolean) operator(=) ident(False)operator(\);) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) + ident(Reg)operator(:) ident(TXRegistry)operator(;) +reserved(begin) + reserved(if) reserved(not) ident(Started) reserved(then) + ident(Exit)operator(;) + + ident(SpyThread)operator(.)ident(Suspend)operator(;) + + ident(Reg) operator(:=) ident(TXRegistry)operator(.)ident(Create)operator(;) + reserved(try) + reserved(if) ident(OpenNodeOK)operator(()ident(Reg)operator(,) ident(RegTV)operator(.)ident(Selected)operator(\)) reserved(then) + reserved(with) ident(ValueList)operator(.)ident(Items) reserved(do) reserved(begin) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(Count)operator(-)integer(1) reserved(do) reserved(begin) + reserved(if) ident(SelectedOnly) reserved(and) reserved(not) ident(Item)operator([)ident(i)operator(].)ident(Selected) reserved(then) + ident(Continue)operator(;) + ident(UpdateValue)operator(()ident(Reg)operator(,) ident(Item)operator([)ident(i)operator(]\);) + reserved(end)operator(;) + reserved(end)operator(;) + reserved(finally) + ident(Reg)operator(.)ident(Free)operator(;) + reserved(end)operator(;) + + ident(SpyThread)operator(.)ident(Resume)operator(;) +reserved(end)operator(;) + +reserved(function) ident(TValuesWin)operator(.)ident(TryRenameValue)operator(()ident(OldName)operator(:) reserved(string)operator(;) + reserved(var) ident(NewName)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) +reserved(var) + ident(x)operator(:) reserved(string)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(False)operator(;) + reserved(if) ident(OldName) operator(=) ident(NewName) reserved(then) + ident(Exit)operator(;) + + reserved(if) operator(()ident(Length)operator(()ident(NewName)operator(\)) operator(>) ident(RegMaxValueNameLen)operator(\)) reserved(then) reserved(begin) + ident(NewName) operator(:=) ident(Copy)operator(()ident(NewName)operator(,) integer(1)operator(,) ident(RegMaxValueNameLen)operator(\);) + reserved(if) ident(MessageDlg)operator(() + string<delimiter(')content(The maximum size of a value name is )delimiter(')> operator(+) ident(IntToStr)operator(()ident(RegMaxValueNameLen)operator(\)) operator(+) string<delimiter(')content( characters.)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(Shorten the value name to:)delimiter(')> operator(+) ident(EOL) operator(+) + ident(Quote)operator(()ident(StringWrap)operator(()ident(NewName)operator(,) integer(80)operator(\)\),) + ident(mtConfirmation)operator(,) operator([)ident(mbOK)operator(,) ident(mbCancel)operator(],) integer(0)operator(\)) operator(<>) ident(mrOK) reserved(then) + ident(Exit)operator(;) + reserved(end)operator(;) + + reserved(if) ident(CharIn)operator(()ident(NewName)operator(,) operator([)char(#0)operator(..)char(#31)operator(]\)) reserved(then) reserved(begin) + ident(NewName) operator(:=) ident(ReplaceChars)operator(()ident(NewName)operator(,) operator([)char(#0)operator(..)char(#31)operator(],) char<delimiter(')content(#)delimiter(')>operator(\);) + reserved(if) ident(MessageDlg)operator(()string<delimiter(')content(The following chars are not allowed in ValueNames:)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(- Control chars (#0..#31\))delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(The following name is allowed:)delimiter(')> operator(+) ident(EOL) operator(+) + ident(NewName) operator(+) ident(EOL) operator(+) + string<delimiter(')content(Use this name instead?)delimiter(')>operator(,) + ident(mtConfirmation)operator(,) operator([)ident(mbYes)operator(,) ident(mbNo)operator(],) integer(0)operator(\)) operator(<>) ident(mrYes) reserved(then) + ident(Exit)operator(;) + reserved(end)operator(;) + + reserved(if) reserved(not) ident(OpenCurKey) reserved(then) + ident(Exit)operator(;) + + reserved(if) ident(SameText)operator(()ident(OldName)operator(,) ident(NewName)operator(\)) reserved(then) reserved(begin) comment(//CharCase ändern) + ident(x) operator(:=) ident(MainReg)operator(.)ident(GetFreeValueName)operator(;) + ident(MainReg)operator(.)ident(RenameValue)operator(()ident(OldName)operator(,) ident(x)operator(\);) + ident(MainReg)operator(.)ident(RenameValue)operator(()ident(x)operator(,) ident(NewName)operator(\);) + reserved(end) reserved(else) reserved(begin) + reserved(if) reserved(not) ident(MainReg)operator(.)ident(ValueReallyExists)operator(()ident(NewName)operator(\)) reserved(then) reserved(begin) + ident(MainReg)operator(.)ident(RenameValue)operator(()ident(OldName)operator(,) ident(NewName)operator(\);) + reserved(end) reserved(else) reserved(begin) + reserved(if) ident(NewName) operator(=) string<delimiter(')delimiter(')> reserved(then) + ident(ShowMessage)operator(()string<delimiter(')content(Default value already exists.)delimiter(')>operator(\)) + reserved(else) + ident(ShowMessage)operator(()string<delimiter(')content(Value )delimiter(')> operator(+) ident(Quote)operator(()ident(NewName)operator(\)) operator(+) string<delimiter(')content( already exists.)delimiter(')>operator(\);) + ident(Exit)operator(;) reserved(end)operator(;) + reserved(end)operator(;) + ident(MainReg)operator(.)ident(CloseKey)operator(;) + + reserved(if) ident(TextIn)operator(()ident(NewName)operator(,) string<delimiter(')content(default)delimiter(')>operator(\)) reserved(then) + ident(AddHint)operator(()string<delimiter(')content(You can create default values by empty string ValueNames.)delimiter(')>operator(\);) + + ident(Result) operator(:=) ident(True)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(ZeromizeMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ZeromizeValue)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(CopyPathMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) ident(ValueList)operator(.)ident(IsEditing) reserved(then) + ident(Exit)operator(;) + + reserved(if) ident(csDestroying) reserved(in) ident(MainWin)operator(.)ident(ComponentState) reserved(then) + ident(Exit)operator(;) + + ident(MainWin)operator(.)ident(CopyPathClick)operator(()ident(Sender)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(TValuesWin)operator(.)ident(FindItemByRealName)operator(()reserved(const) ident(ValueName)operator(:) reserved(string)operator(\):) ident(Integer)operator(;) +reserved(begin) + reserved(with) ident(ValueList)operator(.)ident(Items) reserved(do) reserved(begin) + reserved(for) ident(Result) operator(:=) integer(0) reserved(to) ident(Count)operator(-)integer(1) reserved(do) + reserved(if) ident(SameText)operator(()ident(RealValueName)operator(()ident(Item)operator([)ident(Result)operator(]\),) ident(ValueName)operator(\)) reserved(then) + ident(Exit)operator(;) + reserved(end)operator(;) + ident(Result) operator(:=) operator(-)integer(1)operator(;) +reserved(end)operator(;) + +reserved(function) ident(TValuesWin)operator(.)ident(FocusItem)operator(()ident(ARealValueName)operator(:) reserved(string)operator(;) + ident(FocusValueList)operator(:) ident(Boolean) operator(=) ident(False)operator(\):) ident(Boolean)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + reserved(with) ident(ValueList) reserved(do) reserved(begin) + ident(i) operator(:=) ident(FindItemByRealName)operator(()ident(ARealValueName)operator(\);) + + reserved(if) operator(()ident(i) operator(>) operator(-)integer(1)operator(\)) reserved(and) operator(()ident(i) operator(<) ident(Items)operator(.)ident(Count)operator(\)) reserved(then) + ident(Selected) operator(:=) ident(Items)operator([)ident(i)operator(]) + reserved(else) + ident(Selected) operator(:=) reserved(nil)operator(;) + + ident(ItemFocused) operator(:=) ident(Selected)operator(;) + + ident(Result) operator(:=) ident(Assigned)operator(()ident(Selected)operator(\);) + reserved(if) ident(Result) reserved(then) + ident(JumpToSel)operator(()ident(ValueList)operator(\);) + + reserved(if) ident(FocusValueList) reserved(then) + ident(FocusControl)operator(()ident(ValueList)operator(\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(TakeAsMainValueMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(Item)operator(:) ident(TListItem)operator(;) + ident(ValueName)operator(:) reserved(string)operator(;) +reserved(begin) + reserved(if) ident(csDestroying) reserved(in) ident(PrefWin)operator(.)ident(ComponentState) reserved(then) + ident(Exit)operator(;) + + ident(Item) operator(:=) ident(ValueList)operator(.)ident(ItemFocused)operator(;) + reserved(if) reserved(not) ident(Assigned)operator(()ident(Item)operator(\)) reserved(then) + ident(Exit)operator(;) + + ident(ValueName) operator(:=) ident(RealValueName)operator(()ident(Item)operator(\);) + reserved(with) ident(PrefWin)operator(.)ident(MainPreviewE) reserved(do) + reserved(if) ident(ValueName) operator(=) ident(Text) reserved(then) + ident(Text) operator(:=) string<delimiter(')delimiter(')> + reserved(else) + ident(Text) operator(:=) ident(ValueName)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(InitListColumnTags)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(ValueList)operator(.)ident(Columns)operator(.)ident(Count)operator(-)integer(1) reserved(do) + reserved(with) ident(ValueList)operator(.)ident(Columns)operator(.)ident(Items)operator([)ident(i)operator(]) reserved(do) reserved(begin) + ident(Tag) operator(:=) operator(-)integer(1)operator(;) + reserved(if) ident(Caption) operator(=) string<delimiter(')content(Name)delimiter(')> reserved(then) + ident(Tag) operator(:=) ident(Integer)operator(()ident(vlcName)operator(\)) + reserved(else) reserved(if) ident(Caption) operator(=) string<delimiter(')content(Size)delimiter(')> reserved(then) + ident(Tag) operator(:=) ident(Integer)operator(()ident(vlcSize)operator(\)) + reserved(else) reserved(if) ident(Caption) operator(=) string<delimiter(')content(Type)delimiter(')> reserved(then) + ident(Tag) operator(:=) ident(Integer)operator(()ident(vlcType)operator(\)) + reserved(else) reserved(if) ident(Caption) operator(=) string<delimiter(')content(Data)delimiter(')> reserved(then) + ident(Tag) operator(:=) ident(Integer)operator(()ident(vlcData)operator(\)) + reserved(else) + ident(ShowMessage)operator(()ident(Format)operator(()string<delimiter(')content(Error: Unknown ValueList.Columns[%d].Caption = "%s")delimiter(')>operator(,) + operator([)ident(Index)operator(,) ident(Caption)operator(]\)\);) + reserved(if) ident(Tag) operator(>) operator(-)integer(1) reserved(then) + ident(SubItemIndex)operator([)ident(TValueListColumn)operator(()ident(Tag)operator(\)]) operator(:=) ident(Index) operator(-) integer(1)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(FormShow)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(InitListColumnTags)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(Reload)operator(()ident(JumpToNewValue)operator(:) ident(Boolean) operator(=) ident(False)operator(;) + ident(ValueName)operator(:) reserved(string) operator(=) string<delimiter(')delimiter(')>operator(\);) +reserved(var) + ident(Sel)operator(:) ident(TListItem)operator(;) + ident(SelIndex)operator(:) ident(Integer)operator(;) + ident(SelRealValueName)operator(:) reserved(string)operator(;) +reserved(begin) + reserved(if) ident(csDestroying) reserved(in) ident(TreeWin)operator(.)ident(ComponentState) reserved(then) + ident(Exit)operator(;) + + ident(SelIndex) operator(:=) operator(-)integer(1)operator(;) + reserved(if) ident(JumpToNewValue) reserved(then) + ident(SelRealValueName) operator(:=) ident(ValueName) + reserved(else) reserved(begin) + ident(Sel) operator(:=) ident(ValueList)operator(.)ident(ItemFocused)operator(;) + reserved(if) ident(Assigned)operator(()ident(Sel)operator(\)) reserved(then) + ident(SelIndex) operator(:=) ident(Sel)operator(.)ident(Index)operator(;) + + reserved(if) ident(SelIndex) operator(>) operator(-)integer(1) reserved(then) + ident(SelRealValueName) operator(:=) ident(RealValueName)operator(()ident(ValueList)operator(.)ident(Items)operator([)ident(SelIndex)operator(]\);) + reserved(end)operator(;) + + ident(TreeWin)operator(.)ident(RegTVChange)operator(()ident(Self)operator(,) ident(RegTV)operator(.)ident(Selected)operator(\);) + + reserved(if) ident(SelIndex) operator(>) operator(-)integer(1) reserved(then) + reserved(if) reserved(not) ident(FocusItem)operator(()ident(SelRealValueName)operator(,) ident(True)operator(\)) reserved(then) reserved(begin) + ident(SelIndex) operator(:=) ident(GetBestIndex)operator(()ident(ValueList)operator(,) ident(SelIndex)operator(\);) + reserved(if) ident(SelIndex) operator(>) operator(-)integer(1) reserved(then) + reserved(with) ident(ValueList) reserved(do) reserved(begin) + ident(Selected) operator(:=) ident(Items)operator([)ident(SelIndex)operator(];) + ident(ItemFocused) operator(:=) ident(Selected)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(LoadValues)operator(()ident(Reg)operator(:) ident(TXRegistry)operator(\);) +reserved(var) + ident(SL)operator(:) ident(TStringList)operator(;) + ident(i)operator(:) ident(Integer)operator(;) + ident(Clock)operator(:) ident(TClock)operator(;) +reserved(begin) + reserved(if) ident(csDestroying) reserved(in) ident(WorkWin)operator(.)ident(ComponentState) reserved(then) + ident(Exit)operator(;) + + reserved(with) ident(ValueList)operator(.)ident(Items) reserved(do) reserved(begin) + ident(Clock) operator(:=) ident(TClock)operator(.)ident(Create)operator(()integer(1)operator(,) ident(tfSecs)operator(\);) + ident(ValueList)operator(.)ident(Enabled) operator(:=) ident(False)operator(;) + ident(BeginUpdate)operator(;) + reserved(try) + ident(Clear)operator(;) + ident(WorkWin)operator(.)ident(ReInitShowPC)operator(;) + + ident(SL) operator(:=) ident(TStringList)operator(.)ident(Create)operator(;) + reserved(try) + ident(Reg)operator(.)ident(GetValueNames)operator(()ident(SL)operator(\);) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(SL)operator(.)ident(Count)operator(-)integer(1) reserved(do) + ident(ValuesWin)operator(.)ident(AddValue)operator(()ident(Reg)operator(,) ident(SL)operator([)ident(i)operator(]\);) + reserved(finally) + ident(SL)operator(.)ident(Free)operator(;) + reserved(end)operator(;) + + reserved(finally) + ident(EndUpdate)operator(;) + ident(ValueList)operator(.)ident(Enabled) operator(:=) ident(True)operator(;) + ident(Clock)operator(.)ident(Stop)operator(;) + reserved(if) ident(MurphyMode) reserved(then) + ident(AddHint)operator(()ident(Format)operator(()string<delimiter(')content(Values loaded after %0.2f secs.)delimiter(')>operator(,) operator([)ident(Clock)operator(.)ident(SecsPassed)operator(]\)\);) + ident(Clock)operator(.)ident(Free)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(FormClose)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Action)operator(:) ident(TCloseAction)operator(\);) +reserved(begin) +comment(// Action := caNone;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(ValueListClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(CheckValueListHotTrack)operator(;) + reserved(if) ident(ValueList)operator(.)ident(HotTrack) reserved(then) + ident(ValueListDblClick)operator(()ident(Sender)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(CheckValueListHotTrack)operator(;) +reserved(const) + ident(StyleOfSwitch)operator(:) reserved(array)operator([)ident(Boolean)operator(]) reserved(of) ident(TListHotTrackStyles) operator(=) operator(() + operator([],) operator([)ident(htHandPoint)operator(,) ident(htUnderlineHot)operator(]) operator(\);) +reserved(var) + ident(NewHotTrack)operator(:) ident(Boolean)operator(;) +reserved(begin) + reserved(if) ident(csDestroying) reserved(in) ident(PrefWin)operator(.)ident(ComponentState) reserved(then) + ident(Exit)operator(;) + + ident(NewHotTrack) operator(:=) ident(ScrollON) reserved(xor) ident(PrefWin)operator(.)ident(ValuesSingleClickCB)operator(.)ident(Checked)operator(;) + reserved(if) ident(NewHotTrack) operator(=) ident(ValueList)operator(.)ident(HotTrack) reserved(then) ident(Exit)operator(;) + + reserved(with) ident(ValueList) reserved(do) reserved(begin) + ident(HotTrack) operator(:=) ident(NewHotTrack)operator(;) + ident(HotTrackStyles) operator(:=) ident(StyleOfSwitch)operator([)ident(HotTrack)operator(];) + ident(Mouse)operator(.)ident(CursorPos) operator(:=) ident(Mouse)operator(.)ident(CursorPos)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(SelectAllMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + reserved(with) ident(ValueList)operator(.)ident(Items) reserved(do) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(Count)operator(-)integer(1) reserved(do) + ident(Item)operator([)ident(i)operator(].)ident(Selected) operator(:=) ident(True)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(InvertSelectionMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + reserved(with) ident(ValueList)operator(.)ident(Items) reserved(do) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(Count)operator(-)integer(1) reserved(do) + ident(Item)operator([)ident(i)operator(].)ident(Selected) operator(:=) reserved(not) ident(Item)operator([)ident(i)operator(].)ident(Selected)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TValuesWin)operator(.)ident(FormDestroy)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ValueNames)operator(.)ident(Free)operator(;) +reserved(end)operator(;) + +reserved(end)operator(.) +reserved(unit) ident(WorkU)operator(;) + +reserved(interface) + +reserved(uses) + ident(Windows)operator(,) ident(Messages)operator(,) ident(SysUtils)operator(,) ident(Variants)operator(,) ident(Classes)operator(,) ident(Graphics)operator(,) ident(Controls)operator(,) ident(Forms)operator(,) + ident(Dialogs)operator(,) ident(StdCtrls)operator(,) ident(ComCtrls)operator(,) ident(NewPanels)operator(,) ident(Grids)operator(,) ident(Clipbrd)operator(,) + ident(IntEdit)operator(,) ident(ExtCtrls)operator(,) ident(Menus)operator(,) ident(YTools)operator(,) ident(CompEx)operator(,) ident(PlutoConst)operator(,) + ident(XReg)operator(,) ident(Clock)operator(,) ident(Colors)operator(,) ident(ShellAPI)operator(,) ident(IniFiles)operator(,) ident(Math)operator(,) + ident(keybrd)operator(,) ident(Buttons)operator(,) ident(YTypes)operator(,) ident(LinkLabel)operator(,) ident(start)operator(,) + ident(PrefTools)operator(,) ident(ImgList)operator(,) ident(PHexMemo)operator(,) ident(PipelineTh)operator(,) ident(DropSource)operator(,) ident(DropTarget)operator(,) + ident(CrackTools)operator(;) + +reserved(type) + ident(TColorStringFmt) operator(=) operator(()ident(csfThreeSpacedDecimals)operator(\);) + + ident(TWorkWin) operator(=) reserved(class)operator(()ident(TForm)operator(\)) + ident(StringPU)operator(:) ident(TPopupMenu)operator(;) + ident(SpaceMI)operator(:) ident(TMenuItem)operator(;) + ident(FileMI)operator(:) ident(TMenuItem)operator(;) + ident(FileOpenD)operator(:) ident(TOpenDialog)operator(;) + ident(MainPC)operator(:) ident(TPageControl)operator(;) + ident(HintPage)operator(:) ident(TTabSheet)operator(;) + ident(Splitter1)operator(:) ident(TSplitter)operator(;) + ident(HintLB)operator(:) ident(TListBox)operator(;) + ident(InfoMemo)operator(:) ident(TMemo)operator(;) + ident(WorkPage)operator(:) ident(TTabSheet)operator(;) + ident(WorkP)operator(:) ident(TPanel)operator(;) + ident(ShowPC)operator(:) ident(TPageControl)operator(;) + ident(StringPage)operator(:) ident(TTabSheet)operator(;) + ident(BorderPanel1)operator(:) ident(TBorderPanel)operator(;) + ident(StringE)operator(:) ident(TEdit)operator(;) + ident(OKStringB)operator(:) ident(TButton)operator(;) + ident(BoolStrCB)operator(:) ident(TCheckBox)operator(;) + ident(CancelStringB)operator(:) ident(TButton)operator(;) + ident(StringAsColorP)operator(:) ident(TPanel)operator(;) + ident(StringAsFileP)operator(:) ident(TBorderPanel)operator(;) + ident(IconImage)operator(:) ident(TImage)operator(;) + ident(IntPage)operator(:) ident(TTabSheet)operator(;) + ident(BorderPanel5)operator(:) ident(TBorderPanel)operator(;) + ident(OKIntB)operator(:) ident(TButton)operator(;) + ident(CardBoolCB)operator(:) ident(TCheckBox)operator(;) + ident(CancelIntB)operator(:) ident(TButton)operator(;) + ident(BinaryPage)operator(:) ident(TTabSheet)operator(;) + ident(BorderPanel6)operator(:) ident(TBorderPanel)operator(;) + ident(Panel2)operator(:) ident(TPanel)operator(;) + ident(Label5)operator(:) ident(TLabel)operator(;) + ident(OffsetHE)operator(:) ident(THexEdit)operator(;) + ident(OKBinaryB)operator(:) ident(TButton)operator(;) + ident(CancelBinaryB)operator(:) ident(TButton)operator(;) + ident(StringTypeRG)operator(:) ident(TRadioGroup)operator(;) + ident(SpyPage)operator(:) ident(TTabSheet)operator(;) + ident(BorderPanel2)operator(:) ident(TBorderPanel)operator(;) + ident(SpyResumeB)operator(:) ident(TButton)operator(;) + ident(SpySuspendB)operator(:) ident(TButton)operator(;) + ident(SpyLB)operator(:) ident(TListBox)operator(;) + ident(Label4)operator(:) ident(TLabel)operator(;) + ident(Label7)operator(:) ident(TLabel)operator(;) + ident(CardTypeRG)operator(:) ident(TRadioGroup)operator(;) + ident(MultiStringPage)operator(:) ident(TTabSheet)operator(;) + ident(BorderPanel7)operator(:) ident(TBorderPanel)operator(;) + ident(OKMultiStringB)operator(:) ident(TButton)operator(;) + ident(CancelMultiStringB)operator(:) ident(TButton)operator(;) + ident(MultiStringM)operator(:) ident(TMemo)operator(;) + ident(DataTypeComB)operator(:) ident(TComboBox)operator(;) + ident(CardinalE)operator(:) ident(TCardEdit)operator(;) + ident(ColorDlg)operator(:) ident(TColorDialog)operator(;) + ident(MultiStringOpenD)operator(:) ident(TOpenDialog)operator(;) + ident(MultiStringSaveD)operator(:) ident(TSaveDialog)operator(;) + ident(MultiStringPU)operator(:) ident(TPopupMenu)operator(;) + ident(LadenMI)operator(:) ident(TMenuItem)operator(;) + ident(SpeichernMI)operator(:) ident(TMenuItem)operator(;) + ident(Hinzufgen1)operator(:) ident(TMenuItem)operator(;) + ident(N1)operator(:) ident(TMenuItem)operator(;) + ident(SisyPage)operator(:) ident(TTabSheet)operator(;) + ident(SpyClearTracesB)operator(:) ident(TButton)operator(;) + ident(Label11)operator(:) ident(TLabel)operator(;) + ident(HexEdit1)operator(:) ident(THexEdit)operator(;) + ident(Label12)operator(:) ident(TLabel)operator(;) + ident(Label13)operator(:) ident(TLabel)operator(;) + ident(SortMultiStringMI)operator(:) ident(TMenuItem)operator(;) + ident(SpyTestL)operator(:) ident(TLabel)operator(;) + ident(Panel3)operator(:) ident(TPanel)operator(;) + ident(CurValueE)operator(:) ident(TEdit)operator(;) + ident(BorderPanel8)operator(:) ident(TBorderPanel)operator(;) + ident(BorderPanel9)operator(:) ident(TBorderPanel)operator(;) + ident(SisyTV)operator(:) ident(TTreeView)operator(;) + ident(TabImages)operator(:) ident(TImageList)operator(;) + ident(ChangeImages)operator(:) ident(TImageList)operator(;) + ident(Panel7)operator(:) ident(TPanel)operator(;) + ident(ColorPanel1)operator(:) ident(TColorPanel)operator(;) + ident(Splitter2)operator(:) ident(TSplitter)operator(;) + ident(SpyDelayIE)operator(:) ident(TPrefIntEdit)operator(;) + ident(ListTracesCB)operator(:) ident(TPrefCheckBox)operator(;) + ident(Panel5)operator(:) ident(TPanel)operator(;) + ident(Panel8)operator(:) ident(TPanel)operator(;) + ident(SisyExpandGroupsCB)operator(:) ident(TPrefCheckBox)operator(;) + ident(ClearChangesB)operator(:) ident(TButton)operator(;) + ident(FilterChangesB)operator(:) ident(TButton)operator(;) + ident(SisyTVPU)operator(:) ident(TPopupMenu)operator(;) + ident(SisyGotoKeyMI)operator(:) ident(TMenuItem)operator(;) + ident(SisyDeleteChangeMI)operator(:) ident(TMenuItem)operator(;) + ident(SisyActivateChangeMI)operator(:) ident(TMenuItem)operator(;) + ident(N3)operator(:) ident(TMenuItem)operator(;) + ident(SisyCopyPathMI)operator(:) ident(TMenuItem)operator(;) + ident(N4)operator(:) ident(TMenuItem)operator(;) + ident(Panel9)operator(:) ident(TPanel)operator(;) + ident(ExternalEditB)operator(:) ident(TButton)operator(;) + ident(LoadExternalB)operator(:) ident(TButton)operator(;) + ident(ReloadStringB)operator(:) ident(TButton)operator(;) + ident(BinaryHM)operator(:) ident(TPHexMemo)operator(;) + ident(PipelineCB)operator(:) ident(TCheckBox)operator(;) + ident(ReloadDWordB)operator(:) ident(TButton)operator(;) + ident(ReloadBinaryB)operator(:) ident(TButton)operator(;) + ident(ReloadMultiStringB)operator(:) ident(TButton)operator(;) + ident(DescL)operator(:) ident(TLabel)operator(;) + ident(SisyHKUCB)operator(:) ident(TPrefCheckBox)operator(;) + ident(SisyHKLMCB)operator(:) ident(TPrefCheckBox)operator(;) + ident(SisyHKUL)operator(:) ident(TLabel)operator(;) + ident(SisyHKLML)operator(:) ident(TLabel)operator(;) + ident(SisyListCB)operator(:) ident(TPrefCheckBox)operator(;) + ident(CardSpecial0B)operator(:) ident(TButton)operator(;) + ident(CardSpecial1B)operator(:) ident(TButton)operator(;) + ident(CardSpecial_1B)operator(:) ident(TButton)operator(;) + ident(CardSpecial7FB)operator(:) ident(TButton)operator(;) + ident(SisyPU)operator(:) ident(TPopupMenu)operator(;) + ident(Idle1)operator(:) ident(TMenuItem)operator(;) + ident(Lowest1)operator(:) ident(TMenuItem)operator(;) + ident(Lower1)operator(:) ident(TMenuItem)operator(;) + ident(Normal1)operator(:) ident(TMenuItem)operator(;) + ident(Higher1)operator(:) ident(TMenuItem)operator(;) + ident(Highes1)operator(:) ident(TMenuItem)operator(;) + ident(SisyShowCurrentPathMI)operator(:) ident(TMenuItem)operator(;) + ident(N5)operator(:) ident(TMenuItem)operator(;) + ident(MultiStringTypeRG)operator(:) ident(TRadioGroup)operator(;) + ident(SeparatorE)operator(:) ident(TEdit)operator(;) + ident(Label1)operator(:) ident(TLabel)operator(;) + ident(MultiStringCountL)operator(:) ident(TLabel)operator(;) + ident(DropFileTarget)operator(:) ident(TDropFileTarget)operator(;) + ident(CryptoPage)operator(:) ident(TTabSheet)operator(;) + ident(BorderPanel3)operator(:) ident(TBorderPanel)operator(;) + ident(CryptoE)operator(:) ident(TEdit)operator(;) + ident(OKCryptoB)operator(:) ident(TButton)operator(;) + ident(CancelCryptoB)operator(:) ident(TButton)operator(;) + ident(ReloadCryptoB)operator(:) ident(TButton)operator(;) + ident(CryptoTypeRG)operator(:) ident(TRadioGroup)operator(;) + ident(Label2)operator(:) ident(TLabel)operator(;) + ident(LinkLabel2)operator(:) ident(TLinkLabel)operator(;) + reserved(procedure) ident(FormKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) ident(Shift)operator(:) ident(TShiftState)operator(\);) + reserved(procedure) ident(SpyResumeBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(SpySuspendBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(ArrPlutoBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(ArrRegEdBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(ArrFreeBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(ArrBigValBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + + reserved(procedure) ident(SpaceMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(FileMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(HintLBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(MainPCDrawTab)operator(()ident(Control)operator(:) ident(TCustomTabControl)operator(;) ident(TabIndex)operator(:) ident(Integer)operator(;) reserved(const) ident(Rect)operator(:) ident(TRect)operator(;) ident(Active)operator(:) ident(Boolean)operator(\);) + reserved(procedure) ident(ValueMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(StringEKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) ident(Shift)operator(:) ident(TShiftState)operator(\);) + reserved(procedure) ident(StringEChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(OKStringBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(BoolStrCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(CardinalEChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(CardBoolCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(CardinalEKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) ident(Shift)operator(:) ident(TShiftState)operator(\);) + reserved(procedure) ident(OKIntBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(ShowPCChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(ShowPCChanging)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(AllowChange)operator(:) ident(Boolean)operator(\);) + reserved(procedure) ident(ShowPCDrawTab)operator(()ident(Control)operator(:) ident(TCustomTabControl)operator(;) ident(TabIndex)operator(:) ident(Integer)operator(;) reserved(const) ident(Rect)operator(:) ident(TRect)operator(;) ident(Active)operator(:) ident(Boolean)operator(\);) + reserved(procedure) ident(ShowPCMouseDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Button)operator(:) ident(TMouseButton)operator(;) ident(Shift)operator(:) ident(TShiftState)operator(;) ident(X)operator(,) ident(Y)operator(:) ident(Integer)operator(\);) + reserved(procedure) ident(FormCreate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(OKBinaryBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(HexGrid1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(HexGrid1KeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) ident(Shift)operator(:) ident(TShiftState)operator(\);) + reserved(procedure) ident(BoolStrPopup)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(StringPageEnter)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(IntPageEnter)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(BinaryPageEnter)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(ReInitShowPC)operator(;) + reserved(procedure) ident(ActivateIt)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(DeActivateIt)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(FormDeactivate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(FormActivate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(MultiStringMChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(OKMultiStringBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(StringAsColorPDblClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(MultiStringMEnter)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(LadenMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(SpeichernMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(Hinzufgen1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(CancelBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(HexGrid1Enter)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(SpyClearTracesBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(SpyLBKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) ident(Shift)operator(:) ident(TShiftState)operator(\);) + comment(//procedure BinLMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer\);) + reserved(procedure) ident(BinLClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(HexGrid1KeyUp)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) ident(Shift)operator(:) ident(TShiftState)operator(\);) + reserved(procedure) ident(ValueViewChanged)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(HexEdit1Change)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(SortMultiStringMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(SpyTestLClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(FocusForEditing)operator(;) + reserved(procedure) ident(CurValueEKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) ident(Shift)operator(:) ident(TShiftState)operator(\);) + reserved(procedure) ident(CurValueEEnter)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + + reserved(procedure) ident(AddAHint)operator(()reserved(const) ident(Hint)operator(:) reserved(string)operator(\);) + reserved(procedure) ident(SisyTVGetSelectedIndex)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(\);) + reserved(procedure) ident(SisyTVDblClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(SisyTVKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) ident(Shift)operator(:) ident(TShiftState)operator(\);) + reserved(procedure) ident(SisyCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(BinaryHMLineChange)operator(()ident(NewLine)operator(:) ident(Cardinal)operator(\);) + reserved(procedure) ident(OffsetHEChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(SpyDelayIEChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(SisyTVExpanded)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(\);) + reserved(procedure) ident(ClearChangesBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(FilterChangesBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(SisyTVPUPopup)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(SisyActivateChangeMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(SisyDeleteChangeMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(SisyCopyPathMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(ExternalEditBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(LoadExternalBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(ReloadBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(PipelineCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(BinaryHMEnter)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(xUseExtendedModelCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(SeparatorEChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(HintLBKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) ident(Shift)operator(:) ident(TShiftState)operator(\);) + reserved(procedure) ident(DWORDSpecialBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(Button1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(SisyPUPopup)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(SisyPriorityMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(SisyShowCurrentPathMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(DropFileTargetDrop)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(ShiftState)operator(:) ident(TShiftState)operator(;) + ident(Point)operator(:) ident(TPoint)operator(;) reserved(var) ident(Effect)operator(:) ident(Integer)operator(\);) + reserved(procedure) ident(FormClose)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Action)operator(:) ident(TCloseAction)operator(\);) + reserved(procedure) ident(FormResize)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(IconImageDblClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(SisyTVCustomDrawItem)operator(()ident(Sender)operator(:) ident(TCustomTreeView)operator(;) + ident(Node)operator(:) ident(TTreeNode)operator(;) ident(State)operator(:) ident(TCustomDrawState)operator(;) reserved(var) ident(DefaultDraw)operator(:) ident(Boolean)operator(\);) + reserved(procedure) ident(SisyTVMouseDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Button)operator(:) ident(TMouseButton)operator(;) + ident(Shift)operator(:) ident(TShiftState)operator(;) ident(X)operator(,) ident(Y)operator(:) ident(Integer)operator(\);) + reserved(procedure) ident(OKCryptoBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) + reserved(procedure) ident(CryptoEKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) + ident(Shift)operator(:) ident(TShiftState)operator(\);) + directive(private) + ident(PipelineThread)operator(:) ident(TPipelineThread)operator(;) + ident(BoolStr)operator(:) reserved(array) reserved(of) reserved(array)operator([)ident(Boolean)operator(]) reserved(of) reserved(string)operator(;) + ident(HexEditAutoChange)operator(:) ident(Boolean)operator(;) + ident(TargetPage)operator(:) ident(TTabSheet)operator(;) + reserved(procedure) ident(DeleteChange)operator(()ident(Node)operator(:) ident(TTreeNode)operator(\);) + reserved(procedure) ident(DeactivateChange)operator(()ident(Node)operator(:) ident(TTreeNode)operator(\);) + reserved(procedure) ident(CopySelectedChangeName)operator(;) + reserved(procedure) ident(ClearChanges)operator(;) + directive(public) + ident(ShowAsBinary)operator(:) ident(Boolean)operator(;) + reserved(function) ident(LastHint)operator(:) reserved(string)operator(;) + reserved(function) ident(LoadBoolStr)operator(:) ident(Boolean)operator(;) + reserved(function) ident(LoadSisyFilter)operator(:) ident(Boolean)operator(;) + reserved(procedure) ident(ShowValues)operator(()ident(Reg)operator(:) ident(TXRegistry)operator(\);) + reserved(procedure) ident(UpdateWriteButtons)operator(;) + reserved(procedure) ident(EditData)operator(;) + reserved(end)operator(;) + +reserved(var) + ident(WorkWin)operator(:) ident(TWorkWin)operator(;) + ident(ShowPC)operator(:) ident(TPageControl)operator(;) + ident(MainPC)operator(:) ident(TPageControl)operator(;) + +reserved(implementation) + +reserved(uses) ident(TreeU)operator(,) ident(ValuesU)operator(,) ident(plutomain)operator(,) ident(splash)operator(,) ident(SisyphusTH)operator(,) ident(PrefU)operator(,) ident(ShellEx)operator(;) + +preprocessor({$R *.dfm}) + +reserved(function) ident(ColorOfString)operator(()ident(s)operator(:) reserved(string)operator(;) ident(Format)operator(:) ident(TColorStringFmt)operator(;) + ident(Default)operator(:) ident(TColor) operator(=) ident(clBlack)operator(\):) ident(TColor)operator(;) +reserved(var) + ident(SA)operator(:) ident(TStrA)operator(;) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(Default)operator(;) + ident(SA) operator(:=) reserved(nil)operator(;) + + reserved(case) ident(Format) reserved(of) + ident(csfThreeSpacedDecimals)operator(:) reserved(begin) + ident(SA) operator(:=) ident(Split)operator(()ident(s)operator(,) char<delimiter(')content( )delimiter(')>operator(\);) + reserved(if) ident(Length)operator(()ident(SA)operator(\)) operator(<>) integer(3) reserved(then) + ident(Exit)operator(;) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) integer(2) reserved(do) + reserved(if) reserved(not) operator(()ident(IsValidInteger)operator(()ident(SA)operator([)ident(i)operator(]\)) reserved(and) operator(()ident(StrToIntDef)operator(()ident(SA)operator([)ident(i)operator(],) operator(-)integer(1)operator(\)) reserved(in) operator([)integer(0)operator(..)integer(255)operator(]\)\)) reserved(then) + ident(Exit)operator(;) + ident(Result) operator(:=) ident(ColorOfRGB)operator(()ident(StrToIntDef)operator(()ident(SA)operator([)integer(0)operator(],) integer(0)operator(\),) + ident(StrToIntDef)operator(()ident(SA)operator([)integer(1)operator(],) integer(0)operator(\),) + ident(StrToIntDef)operator(()ident(SA)operator([)integer(2)operator(],) integer(0)operator(\)\);) + reserved(end)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(function) ident(StringOfColor)operator(()ident(Color)operator(:) ident(TColor)operator(;) ident(Format)operator(:) ident(TColorStringFmt)operator(\):) reserved(string)operator(;) +reserved(var) + ident(RGB)operator(:) ident(TRGB)operator(;) +reserved(begin) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + + ident(RGB) operator(:=) ident(RGBOfColor)operator(()ident(Color)operator(\);) + reserved(case) ident(Format) reserved(of) + ident(csfThreeSpacedDecimals)operator(:) reserved(begin) + reserved(with) ident(RGB) reserved(do) + ident(Result) operator(:=) ident(IntToStr)operator(()ident(R)operator(\)) operator(+) char<delimiter(')content( )delimiter(')> operator(+) ident(IntToStr)operator(()ident(G)operator(\)) operator(+) char<delimiter(')content( )delimiter(')> operator(+) ident(IntToStr)operator(()ident(B)operator(\);) + reserved(end)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(function) ident(TWorkWin)operator(.)ident(LastHint)operator(:) reserved(string)operator(;) +reserved(begin) + reserved(with) ident(HintLB)operator(.)ident(Items) reserved(do) + reserved(if) ident(Count) operator(>) integer(0) reserved(then) + ident(Result) operator(:=) ident(Strings)operator([)ident(Count)operator(-)integer(1)operator(]) + reserved(else) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(AddAHint)operator(()reserved(const) ident(Hint)operator(:) reserved(string)operator(\);) +reserved(begin) + reserved(if) reserved(not) ident(Assigned)operator(()ident(HintLB)operator(\)) reserved(then) + ident(Exit)operator(;) + + reserved(with) ident(HintLB)operator(.)ident(Items) reserved(do) reserved(begin) + reserved(if) ident(Count) operator(>) integer(0) reserved(then) reserved(begin) + reserved(if) ident(StrAtBegin)operator(()ident(LastHint)operator(,) ident(Hint)operator(\)) reserved(then) reserved(begin) comment(//same hint again) + reserved(with) ident(HintLB) reserved(do) + ident(Tag) operator(:=) ident(Tag) operator(+) integer(1)operator(;) + ident(Strings)operator([)ident(Count)operator(-)integer(1)operator(]) operator(:=) ident(Format)operator(()string<delimiter(')content(%s (%d\))delimiter(')>operator(,) operator([)ident(Hint)operator(,) ident(HintLB)operator(.)ident(Tag)operator(]\);) + ident(Exit) reserved(end) reserved(else) + ident(HintLB)operator(.)ident(Tag) operator(:=) integer(1)operator(;) + reserved(end)operator(;) + ident(Add)operator(()ident(Hint)operator(\);) + reserved(end)operator(;) + ident(Application)operator(.)ident(ProcessMessages)operator(;) comment(//draw) +comment(// Sleep(1000\); //wait to read hints) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(ReInitShowPC)operator(;) +reserved(begin) + reserved(with) ident(CurValueE) reserved(do) reserved(begin) + ident(Text) operator(:=) ident(NoValueCaption)operator(;) + ident(Font)operator(.)ident(Color) operator(:=) ident(clSilver)operator(;) + ident(Enabled) operator(:=) ident(False)operator(;) + reserved(end)operator(;) + + ident(ShowPC)operator(.)ident(ActivePage) operator(:=) reserved(nil)operator(;) + + ident(StringE)operator(.)ident(Text) operator(:=) string<delimiter(')delimiter(')>operator(;) + ident(StringTypeRG)operator(.)ident(ItemIndex) operator(:=) integer(0)operator(;) + + ident(MultiStringTypeRG)operator(.)ident(Buttons)operator([)integer(1)operator(].)ident(Enabled) operator(:=) ident(False)operator(;) + + ident(CardinalE)operator(.)ident(Value) operator(:=) integer(0)operator(;) + ident(CardTypeRG)operator(.)ident(ItemIndex) operator(:=) integer(0)operator(;) + + ident(BinaryHM)operator(.)ident(Data) operator(:=) reserved(nil)operator(;) + ident(PipelineCB)operator(.)ident(Checked) operator(:=) ident(False)operator(;) + + ident(DataTypeComB)operator(.)ident(ItemIndex) operator(:=) ident(Integer)operator(()ident(rdBinary)operator(\);) + + ident(MultiStringM)operator(.)ident(Clear)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(FormKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) + ident(Shift)operator(:) ident(TShiftState)operator(\);) +reserved(begin) + ident(MainWin)operator(.)ident(FormKeyDown)operator(()ident(Sender)operator(,) ident(Key)operator(,) ident(Shift)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(SpyResumeBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(SpyThread)operator(.)ident(Resume)operator(;) + ident(SpyTestLClick)operator(()ident(Sender)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(SpySuspendBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(SpyThread)operator(.)ident(Suspend)operator(;) + ident(SpyTestLClick)operator(()ident(Sender)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(ArrPlutoBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ArrangePlutoStyle)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(ArrRegEdBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ArrangeRegEdStyle)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(ArrFreeBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ArrangeFreeStyle)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(ArrBigValBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ArrangeBigValStyle)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(SpaceMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(StringE)operator(.)ident(Text) operator(:=) string<delimiter(')delimiter(')>operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(HintLBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(StatusBar)operator(.)ident(Panels)operator([)integer(0)operator(].)ident(Text) operator(:=) ident(GetSel)operator(()ident(HintLB)operator(\);) + ident(WorkWin)operator(.)ident(InfoMemo)operator(.)ident(Text) operator(:=) ident(StatusBar)operator(.)ident(Panels)operator([)integer(0)operator(].)ident(Text)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(MainPCDrawTab)operator(()ident(Control)operator(:) ident(TCustomTabControl)operator(;) ident(TabIndex)operator(:) ident(Integer)operator(;) + reserved(const) ident(Rect)operator(:) ident(TRect)operator(;) ident(Active)operator(:) ident(Boolean)operator(\);) +reserved(var) + ident(PC)operator(:) ident(TPageControl)operator(;) + ident(Page)operator(:) ident(TTabSheet)operator(;) +reserved(begin) + ident(PC) operator(:=) ident(TPageControl)operator(()ident(Control)operator(\);) + ident(Page) operator(:=) ident(PC)operator(.)ident(Pages)operator([)ident(TabIndex)operator(];) + reserved(with) ident(PC)operator(.)ident(Canvas)operator(.)ident(Font) reserved(do) reserved(begin) + reserved(if) ident(Page)operator(.)ident(Caption) operator(=) string<delimiter(')content(Hint)delimiter(')> reserved(then) + ident(Color) operator(:=) ident(clBrightRed) + reserved(else) reserved(if) ident(Page)operator(.)ident(Caption) operator(=) string<delimiter(')content(Edit)delimiter(')> reserved(then) + ident(Color) operator(:=) ident(clBrightGreen) + reserved(else) reserved(if) ident(Page)operator(.)ident(Caption) operator(=) string<delimiter(')content(Spy)delimiter(')> reserved(then) + ident(Color) operator(:=) ident(clBrightBlue) + reserved(else) reserved(if) ident(Page)operator(.)ident(Caption) operator(=) string<delimiter(')content(Sisyphus)delimiter(')> reserved(then) + ident(Color) operator(:=) ident(clBrightCyan) + reserved(else) + ident(Color) operator(:=) ident(clWhite)operator(;) + reserved(end)operator(;) + + reserved(with) ident(PC)operator(.)ident(Canvas) reserved(do) + reserved(if) ident(Active) reserved(then) reserved(begin) + ident(Font)operator(.)ident(Style) operator(:=) operator([)ident(fsBold)operator(];) + ident(Brush)operator(.)ident(Color) operator(:=) ident(clDarkGray)operator(;) + ident(FillRect)operator(()ident(Rect)operator(\);) + ident(TextOut)operator(()ident(Rect)operator(.)ident(Left) operator(+) integer(18) operator(+) integer(5)operator(,) ident(Rect)operator(.)ident(Top) operator(+) integer(3)operator(,) ident(Page)operator(.)ident(Caption)operator(\);) + ident(PC)operator(.)ident(Images)operator(.)ident(Draw)operator(()ident(PC)operator(.)ident(Canvas)operator(,) ident(Rect)operator(.)ident(Left) operator(+) integer(4)operator(,) ident(Rect)operator(.)ident(Top) operator(+) integer(2)operator(,) ident(Page)operator(.)ident(ImageIndex)operator(\);) + reserved(end) reserved(else) reserved(begin) + ident(Font)operator(.)ident(Style) operator(:=) operator([];) + ident(Brush)operator(.)ident(Color) operator(:=) ident(clDarkGray)operator(;) + ident(FillRect)operator(()ident(Rect)operator(\);) + ident(TextOut)operator(()ident(Rect)operator(.)ident(Left) operator(+) integer(18) operator(+) integer(3)operator(,) ident(Rect)operator(.)ident(Top) operator(+) integer(2)operator(,) ident(Page)operator(.)ident(Caption)operator(\);) + ident(PC)operator(.)ident(Images)operator(.)ident(Draw)operator(()ident(PC)operator(.)ident(Canvas)operator(,) ident(Rect)operator(.)ident(Left) operator(+) integer(1)operator(,) ident(Rect)operator(.)ident(Top) operator(+) integer(1)operator(,) ident(Page)operator(.)ident(ImageIndex)operator(\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(ValueMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(StringE)operator(.)ident(Text) operator(:=) ident(UntilStr)operator(()ident(TMenuItem)operator(()ident(Sender)operator(\).)ident(Caption)operator(,)string<delimiter(')content( = )delimiter(')>operator(\);) + ident(OKStringBClick)operator(()ident(Sender)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(StringEKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) + ident(Shift)operator(:) ident(TShiftState)operator(\);) +reserved(begin) + reserved(if) ident(key) operator(=) ident(VK_RETURN) reserved(then) reserved(begin) + ident(OKStringBClick)operator(()ident(Sender)operator(\);) + ident(ValuesWin)operator(.)ident(FocusControl)operator(()ident(ValueList)operator(\);) + reserved(end)operator(;) + reserved(if) ident(key) operator(=) ident(VK_ESCAPE) reserved(then) + ident(CancelBClick)operator(()ident(Sender)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(StringEChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) + ident(State)operator(:) ident(TCheckBoxState)operator(;) + ident(Desc)operator(:) reserved(string)operator(;) +reserved(begin) + ident(IconImage)operator(.)ident(Picture) operator(:=) reserved(nil)operator(;) + + reserved(with) ident(StringAsColorP) reserved(do) reserved(begin) + ident(Color) operator(:=) ident(ColorOfString)operator(()ident(StringE)operator(.)ident(Text)operator(,) ident(csfThreeSpacedDecimals)operator(,) operator(-)integer(1)operator(\);) + ident(Visible) operator(:=) ident(Color) operator(<>) operator(-)integer(1)operator(;) + reserved(end)operator(;) + + reserved(try) + reserved(with) ident(IconImage)operator(.)ident(Picture)operator(.)ident(Icon) reserved(do) reserved(begin) + ident(ReleaseHandle)operator(;) + ident(Handle) operator(:=) ident(GetIconFromFile)operator(()ident(StringE)operator(.)ident(Text)operator(\);) + ident(StringAsFileP)operator(.)ident(Visible) operator(:=) ident(Handle) operator(<>) integer(0)operator(;) + reserved(end)operator(;) + reserved(except) + reserved(end)operator(;) + + ident(State) operator(:=) ident(cbGrayed)operator(;) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(High)operator(()ident(BoolStr)operator(\)) reserved(do) reserved(begin) + reserved(if) ident(StringE)operator(.)ident(Text) operator(=) ident(BoolStr)operator([)ident(i)operator(][)ident(False)operator(]) reserved(then) + ident(State) operator(:=) ident(cbUnchecked) + reserved(else) reserved(if) ident(StringE)operator(.)ident(Text) operator(=) ident(BoolStr)operator([)ident(i)operator(][)ident(True)operator(]) reserved(then) + ident(State) operator(:=) ident(cbChecked) + reserved(else) + ident(Continue)operator(;) + ident(Break)operator(;) + reserved(end)operator(;) + + ident(BoolStrCB)operator(.)ident(Visible) operator(:=) ident(State) reserved(in) operator([)ident(cbChecked)operator(,) ident(cbUnchecked)operator(];) + ident(BoolStrCB)operator(.)ident(State) operator(:=) ident(State)operator(;) + + ident(Desc) operator(:=) ident(StringE)operator(.)ident(Text)operator(;) + ident(Desc) operator(:=) ident(RegNameOfCLSID)operator(()ident(Desc)operator(\);) + reserved(with) ident(DescL) reserved(do) reserved(begin) + ident(Visible) operator(:=) operator(()ident(Desc) operator(<>) string<delimiter(')delimiter(')>operator(\);) + reserved(if) ident(Visible) reserved(then) + ident(Caption) operator(:=) string<delimiter(')content(CLSID is: )delimiter(')> operator(+) ident(Desc)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(OKStringBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + reserved(try) + ident(OpenCurKey)operator(;) + reserved(with) ident(ValuesWin)operator(.)ident(ValueNames) reserved(do) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(Count)operator(-)integer(1) reserved(do) reserved(begin) + reserved(case) ident(StringTypeRG)operator(.)ident(ItemIndex) reserved(of) + integer(0)operator(:) ident(MainReg)operator(.)ident(WriteString)operator(()ident(Strings)operator([)ident(i)operator(],) ident(StringE)operator(.)ident(Text)operator(\);) + integer(1)operator(:) ident(MainReg)operator(.)ident(WriteExpandString)operator(()ident(Strings)operator([)ident(i)operator(],) ident(StringE)operator(.)ident(Text)operator(\);) + reserved(end)operator(;) + reserved(end)operator(;) + ident(ValuesWin)operator(.)ident(UpdateValues)operator(()ident(True)operator(\);) + reserved(finally) + ident(MainReg)operator(.)ident(CloseKey)operator(;) + reserved(end)operator(;) + ident(ValuesWin)operator(.)ident(ValueListDblClick)operator(()ident(Sender)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(BoolStrCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(High)operator(()ident(BoolStr)operator(\)) reserved(do) reserved(begin) + reserved(if) operator(()ident(BoolStr)operator([)ident(i)operator(,) ident(False)operator(]) operator(=) ident(StringE)operator(.)ident(Text)operator(\)) + reserved(or) operator(()ident(BoolStr)operator([)ident(i)operator(,) ident(True)operator(]) operator(=) ident(StringE)operator(.)ident(Text)operator(\)) reserved(then) + ident(Break)operator(;) + reserved(end)operator(;) + + reserved(if) ident(i) operator(>) ident(High)operator(()ident(BoolStr)operator(\)) reserved(then) + ident(Exit)operator(;) + + ident(StringE)operator(.)ident(Text) operator(:=) ident(BoolStr)operator([)ident(i)operator(][)ident(BoolStrCB)operator(.)ident(Checked)operator(];) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(CardinalEChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(HexEditAutoChange) operator(:=) ident(True)operator(;) + reserved(with) ident(CardBoolCB) reserved(do) reserved(begin) + ident(Enabled) operator(:=) ident(True)operator(;) + reserved(case) ident(CardinalE)operator(.)ident(Value) reserved(of) + integer(1)operator(:) ident(Checked) operator(:=) ident(True)operator(;) + integer(0)operator(:) ident(Checked) operator(:=) ident(False)operator(;) + reserved(else) + ident(Enabled) operator(:=) ident(False)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + ident(HexEdit1)operator(.)ident(Value) operator(:=) ident(CardinalE)operator(.)ident(Value)operator(;) + ident(HexEditAutoChange) operator(:=) ident(False)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(CardBoolCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) ident(HexEditAutoChange) reserved(then) + ident(Exit)operator(;) + ident(CardinalE)operator(.)ident(Value) operator(:=) ident(Ord)operator(()ident(CardBoolCB)operator(.)ident(Checked)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(CardinalEKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) + ident(Shift)operator(:) ident(TShiftState)operator(\);) +reserved(begin) + reserved(if) ident(key) operator(=) ident(VK_RETURN) reserved(then) reserved(begin) + ident(OKIntBClick)operator(()ident(Sender)operator(\);) + ident(ValuesWin)operator(.)ident(FocusControl)operator(()ident(ValueList)operator(\);) + reserved(end)operator(;) + + reserved(if) ident(key) operator(=) ident(VK_ESCAPE) reserved(then) + ident(CancelBClick)operator(()ident(Sender)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(OKIntBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) + + reserved(procedure) ident(Write4BB)operator(()reserved(const) ident(ValueName)operator(:) reserved(string)operator(;) ident(Value)operator(:) ident(Cardinal)operator(\);) + reserved(var) + ident(Typ)operator(:) ident(TRegDataType)operator(;) + reserved(begin) + reserved(if) ident(MainReg)operator(.)ident(ValueReallyExists)operator(()ident(ValueName)operator(\)) reserved(then) + ident(Typ) operator(:=) ident(MainReg)operator(.)ident(GetDataType)operator(()ident(ValueName)operator(\)) + reserved(else) + ident(Typ) operator(:=) ident(rdBinary)operator(;) + + reserved(if) ident(Typ) reserved(in) ident(rdCardTypes) reserved(then) + ident(Typ) operator(:=) ident(rdBinary)operator(;) + + ident(MainReg)operator(.)ident(WriteBinType)operator(()ident(ValueName)operator(,) ident(ByteAOfInt)operator(()ident(CardinalE)operator(.)ident(Value)operator(\),) ident(Typ)operator(\);) + reserved(end)operator(;) + +reserved(begin) + reserved(try) + ident(OpenCurKey)operator(;) + reserved(with) ident(ValuesWin)operator(.)ident(ValueNames) reserved(do) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(Count)operator(-)integer(1) reserved(do) reserved(begin) + reserved(case) ident(CardTypeRG)operator(.)ident(ItemIndex) reserved(of) + integer(0)operator(:) ident(MainReg)operator(.)ident(WriteCardinal)operator(()ident(Strings)operator([)ident(i)operator(],) ident(CardinalE)operator(.)ident(Value)operator(\);) + integer(1)operator(:) ident(MainReg)operator(.)ident(WriteCardinal)operator(()ident(Strings)operator([)ident(i)operator(],) ident(CardinalE)operator(.)ident(Value)operator(,) ident(True)operator(\);) + integer(2)operator(:) ident(Write4BB)operator(()ident(Strings)operator([)ident(i)operator(],) ident(CardinalE)operator(.)ident(Value)operator(\);) + reserved(end)operator(;) + reserved(end)operator(;) + ident(ValuesWin)operator(.)ident(UpdateValues)operator(()ident(True)operator(\);) + reserved(finally) + ident(MainReg)operator(.)ident(CloseKey)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(ShowPCChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(FocusControl)operator(()ident(TObject)operator(()ident(ShowPC)operator(.)ident(ActivePage)operator(.)ident(Tag)operator(\)) reserved(as) ident(TWinControl)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(ShowPCChanging)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(AllowChange)operator(:) ident(Boolean)operator(\);) + + reserved(function) ident(ByteAOfDWORD)operator(()ident(a)operator(:) ident(DWORD)operator(\):) ident(TByteA)operator(;) + reserved(begin) + ident(SetLength)operator(()ident(Result)operator(,) ident(SizeOf)operator(()ident(DWORD)operator(\)\);) + ident(Move)operator(()ident(a)operator(,) ident(Pointer)operator(()ident(Result)operator(\)^,) ident(SizeOf)operator(()ident(DWORD)operator(\)\);) + reserved(end)operator(;) + +reserved(var) + ident(SourcePage)operator(:) ident(TTabSheet)operator(;) + ident(ValueName)operator(:) reserved(string)operator(;) +reserved(begin) + ident(SourcePage) operator(:=) ident(ShowPC)operator(.)ident(ActivePage)operator(;) + reserved(if) ident(SourcePage) operator(=) ident(IntPage) reserved(then) reserved(begin) + + reserved(if) ident(TargetPage) operator(=) ident(StringPage) reserved(then) reserved(begin) + ident(AddHint)operator(()string<delimiter(')content(Converting: DWORD --> String)delimiter(')>operator(\);) + ident(StringE)operator(.)ident(Text) operator(:=) ident(CardinalE)operator(.)ident(Text)operator(;) + reserved(end) reserved(else) reserved(if) ident(TargetPage) operator(=) ident(BinaryPage) reserved(then) reserved(begin) + ident(AddHint)operator(()string<delimiter(')content(Converting: DWORD --> Binary)delimiter(')>operator(\);) + ident(BinaryHM)operator(.)ident(Data) operator(:=) ident(ByteAOfDWORD)operator(()ident(CardinalE)operator(.)ident(Value)operator(\);) + reserved(end) reserved(else) + ident(AllowChange) operator(:=) ident(False)operator(;) + + reserved(end) reserved(else) reserved(if) ident(SourcePage) operator(=) ident(StringPage) reserved(then) reserved(begin) + reserved(if) ident(TargetPage) operator(=) ident(IntPage) reserved(then) reserved(begin) + reserved(if) ident(IsValidCardinal)operator(()ident(StringE)operator(.)ident(Text)operator(\)) reserved(then) reserved(begin) + ident(AddHint)operator(()string<delimiter(')content(Converting: String --> DWORD)delimiter(')>operator(\);) + ident(CardinalE)operator(.)ident(Text) operator(:=) ident(StringE)operator(.)ident(Text)operator(;) + reserved(end) reserved(else) reserved(begin) + ident(AddHint)operator(()string<delimiter(')content(This no valid DWORD; Converting aborted.)delimiter(')>operator(,) ident(True)operator(\);) + ident(AllowChange) operator(:=) ident(False)operator(;) + reserved(end)operator(;) + reserved(end) reserved(else) reserved(if) ident(TargetPage) operator(=) ident(BinaryPage) reserved(then) reserved(begin) + ident(AddHint)operator(()string<delimiter(')content(Converting: String --> Binary)delimiter(')>operator(\);) + ident(BinaryHM)operator(.)ident(Data) operator(:=) ident(TByteA)operator(()ident(StringE)operator(.)ident(Text)operator(\);) + reserved(end) reserved(else) reserved(if) ident(TargetPage) operator(=) ident(MultiStringPage) reserved(then) reserved(begin) + ident(AddHint)operator(()string<delimiter(')content(Converting: String --> MultiString)delimiter(')>operator(\);) + reserved(if) ident(SeparatorE)operator(.)ident(Text) operator(=) string<delimiter(')delimiter(')> reserved(then) + ident(MultiStringM)operator(.)ident(Text) operator(:=) ident(StringE)operator(.)ident(Text)operator(;) + ident(SeparatorEChange)operator(()ident(Sender)operator(\);) + reserved(end) reserved(else) + ident(AllowChange) operator(:=) ident(False)operator(;) + + reserved(end) reserved(else) reserved(if) ident(SourcePage) operator(=) ident(BinaryPage) reserved(then) reserved(begin) + reserved(if) ident(TargetPage) operator(=) ident(StringPage) reserved(then) reserved(begin) + ident(AddHint)operator(()string<delimiter(')content(Converting: Binary --> String)delimiter(')>operator(\);) + ident(StringE)operator(.)ident(Text) operator(:=) ident(FriendlyStr)operator(()reserved(string)operator(()ident(BinaryHM)operator(.)ident(Data)operator(\)\);) + reserved(end) reserved(else) reserved(if) ident(TargetPage) operator(=) ident(IntPage) reserved(then) reserved(begin) + reserved(if) ident(Length)operator(()ident(BinaryHM)operator(.)ident(Data)operator(\)) operator(>=) ident(SizeOf)operator(()ident(DWORD)operator(\)) reserved(then) reserved(begin) + ident(AddHint)operator(()string<delimiter(')content(Converting: Binary --> DWORD)delimiter(')>operator(\);) + ident(CardinalE)operator(.)ident(Value) operator(:=) ident(PDWORD)operator(()ident(BinaryHM)operator(.)ident(Data)operator(\)^;) + reserved(end) reserved(else) reserved(begin) + ident(AddHint)operator(()string<delimiter(')content(Binary value not long enough (4 Byte\); Converting aborted.)delimiter(')>operator(,) ident(True)operator(\);) + ident(AllowChange) operator(:=) ident(False)operator(;) + reserved(end)operator(;) + reserved(end) reserved(else) reserved(if) ident(TargetPage) operator(=) ident(CryptoPage) reserved(then) reserved(begin) + reserved(if) ident(ValuesWin)operator(.)ident(ValueNames)operator(.)ident(Count) operator(=) integer(1) reserved(then) reserved(begin) + ident(ValueName) operator(:=) ident(ValuesWin)operator(.)ident(ValueNames)operator([)integer(0)operator(];) + reserved(with) ident(CryptoTypeRG) reserved(do) reserved(begin) + ident(ItemIndex) operator(:=) operator(-)integer(1)operator(;) + reserved(if) ident(SameText)operator(()ident(ValueName)operator(,) string<delimiter(')content(ScreenSave_Data)delimiter(')>operator(\)) reserved(then) reserved(begin) + ident(ItemIndex) operator(:=) integer(0)operator(;) + ident(CryptoE)operator(.)ident(Text) operator(:=) ident(DecodeScreenSaver)operator(()ident(BinaryHM)operator(.)ident(Data)operator(\);) + reserved(end) reserved(else) reserved(if) ident(SameText)operator(()ident(ValueName)operator(,) string<delimiter(')content(parm1enc)delimiter(')>operator(\)) + reserved(or) ident(SameText)operator(()ident(ValueName)operator(,) string<delimiter(')content(parm2enc)delimiter(')>operator(\)) reserved(then) reserved(begin) + ident(ItemIndex) operator(:=) integer(1)operator(;) + ident(CryptoE)operator(.)ident(Text) operator(:=) ident(DecodeSharedFolder)operator(()ident(BinaryHM)operator(.)ident(Data)operator(\);) + reserved(end)operator(;) + reserved(end)operator(;) + reserved(if) ident(CryptoTypeRG)operator(.)ident(ItemIndex) operator(=) operator(-)integer(1) reserved(then) + ident(AllowChange) operator(:=) ident(False)operator(;) + reserved(end)operator(;) + reserved(end) reserved(else) + ident(AllowChange) operator(:=) ident(False)operator(;) + + reserved(end) reserved(else) reserved(if) ident(SourcePage) operator(=) ident(MultiStringPage) reserved(then) reserved(begin) + reserved(if) ident(TargetPage) operator(=) ident(StringPage) reserved(then) reserved(begin) + ident(AddHint)operator(()string<delimiter(')content(Converting: MultiString --> String )delimiter(')>operator(\);) + reserved(if) ident(SeparatorE)operator(.)ident(Text) operator(=) string<delimiter(')delimiter(')> reserved(then) + ident(StringE)operator(.)ident(Text) operator(:=) ident(MultiStringM)operator(.)ident(Text) + reserved(else) + ident(StringE)operator(.)ident(Text) operator(:=) ident(Join)operator(()ident(MultiStringM)operator(.)ident(Lines)operator(,) ident(SeparatorE)operator(.)ident(Text)operator(\);) + comment(//end else if TargetPage = BinaryPage then begin) + reserved(end) reserved(else) + ident(AllowChange) operator(:=) ident(False)operator(;) + + reserved(end) reserved(else) + ident(AllowChange) operator(:=) ident(False)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(ShowPCDrawTab)operator(()ident(Control)operator(:) ident(TCustomTabControl)operator(;) ident(TabIndex)operator(:) ident(Integer)operator(;) + reserved(const) ident(Rect)operator(:) ident(TRect)operator(;) ident(Active)operator(:) ident(Boolean)operator(\);) +reserved(var) + ident(PC)operator(:) ident(TPageControl)operator(;) + ident(Page)operator(:) ident(TTabSheet)operator(;) +reserved(begin) + ident(PC) operator(:=) ident(TPageControl)operator(()ident(Control)operator(\);) + ident(Page) operator(:=) ident(PC)operator(.)ident(Pages)operator([)ident(TabIndex)operator(];) + reserved(with) ident(PC)operator(.)ident(Canvas)operator(.)ident(Font) reserved(do) reserved(begin) + reserved(if) ident(Page) operator(=) ident(StringPage) reserved(then) + ident(Color) operator(:=) ident(clBrightRed) + reserved(else) reserved(if) ident(Page) operator(=) ident(MultiStringPage) reserved(then) + ident(Color) operator(:=) ident(clBrightPurple) + reserved(else) reserved(if) ident(Page) operator(=) ident(IntPage) reserved(then) + ident(Color) operator(:=) ident(clBrightBlue) + reserved(else) reserved(if) ident(Page) operator(=) ident(BinaryPage) reserved(then) + ident(Color) operator(:=) ident(clBrightGreen) + reserved(else) reserved(if) ident(Page) operator(=) ident(CryptoPage) reserved(then) + ident(Color) operator(:=) ident(clBrightCyan)operator(;) + reserved(end)operator(;) + + reserved(with) ident(PC)operator(.)ident(Canvas) reserved(do) reserved(begin) + reserved(if) ident(Active) reserved(then) + ident(Brush)operator(.)ident(Color) operator(:=) ident(clGray) + reserved(else) + ident(Brush)operator(.)ident(Color) operator(:=) ident(clDarkGray)operator(;) + ident(FillRect)operator(()ident(Rect)operator(\);) + ident(TextOut)operator(()ident(Rect)operator(.)ident(Left) operator(+) integer(18) operator(+) integer(3)operator(,) ident(Rect)operator(.)ident(Top)operator(,) ident(Page)operator(.)ident(Caption)operator(\);) + ident(MainWin)operator(.)ident(ImageList1)operator(.)ident(Draw)operator(()ident(Control)operator(.)ident(Canvas)operator(,) ident(Rect)operator(.)ident(Left) operator(-) integer(1)operator(,) ident(Rect)operator(.)ident(Top) operator(-) integer(1)operator(,) ident(Page)operator(.)ident(ImageIndex)operator(\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(ShowPCMouseDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Button)operator(:) ident(TMouseButton)operator(;) + ident(Shift)operator(:) ident(TShiftState)operator(;) ident(X)operator(,) ident(Y)operator(:) ident(Integer)operator(\);) +reserved(begin) + reserved(with) ident(ShowPC) reserved(do) + reserved(if) ident(htOnItem) reserved(in) ident(GetHitTestInfoAt)operator(()ident(X)operator(,) ident(Y)operator(\)) reserved(then) + ident(TargetPage) operator(:=) ident(Pages)operator([)ident(IndexOfTabAt)operator(()ident(X)operator(,) ident(Y)operator(\)];) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(FormCreate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(WorkU)operator(.)ident(ShowPC) operator(:=) ident(ShowPC)operator(;) + ident(WorkU)operator(.)ident(MainPC) operator(:=) ident(MainPC)operator(;) + + comment(//Zeromize) + ident(ShowPC)operator(.)ident(ActivePage) operator(:=) reserved(nil)operator(;) + ident(InfoMemo)operator(.)ident(Text) operator(:=) string<delimiter(')delimiter(')>operator(;) + ident(MultiStringM)operator(.)ident(Clear)operator(;) + ident(SisyTV)operator(.)ident(Items)operator(.)ident(Clear)operator(;) + ident(CurValueE)operator(.)ident(Text) operator(:=) ident(NoValueCaption)operator(;) + ident(HexEditAutoChange) operator(:=) ident(False)operator(;) + ident(TargetPage) operator(:=) reserved(nil)operator(;) + + comment(//Tagging) + ident(StringPage)operator(.)ident(Tag) operator(:=) ident(Integer)operator(()ident(StringE)operator(\);) + ident(IntPage)operator(.)ident(Tag) operator(:=) ident(Integer)operator(()ident(CardinalE)operator(\);) + ident(BinaryPage)operator(.)ident(Tag) operator(:=) ident(Integer)operator(()ident(BinaryHM)operator(\);) + ident(MultiStringPage)operator(.)ident(Tag) operator(:=) ident(Integer)operator(()ident(MultiStringM)operator(\);) + ident(ShowAsBinary) operator(:=) ident(False)operator(;) + + reserved(if) reserved(not) ident(Win9x) reserved(then) + ident(CryptoPage)operator(.)ident(TabVisible) operator(:=) ident(False)operator(;) + + ident(MainPC)operator(.)ident(ActivePage) operator(:=) ident(HintPage)operator(;) + ident(ShowPC)operator(.)ident(ActivePage) operator(:=) reserved(nil)operator(;) + + ident(DropFileTarget)operator(.)directive(register)operator(()ident(StringE)operator(\);) + + reserved(with) ident(StringTypeRG) reserved(do) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(ControlCount)operator(-)integer(1) reserved(do) + operator(()ident(Controls)operator([)ident(i)operator(]) reserved(as) ident(TRadioButton)operator(\).)ident(OnKeyDown) operator(:=) ident(StringEKeyDown)operator(;) + + ident(ExternalEditB)operator(.)ident(Enabled) operator(:=) ident(FileEx)operator(()ident(PrefWin)operator(.)ident(ExternalHexEditE)operator(.)ident(Text)operator(\);) + + ident(PipelineThread) operator(:=) ident(TPipelineThread)operator(.)ident(CreateIt)operator(()ident(tpIdle)operator(,) string<delimiter(')delimiter(')>operator(,) ident(BinaryHM)operator(\);) + ident(PipelineThread)operator(.)ident(OnChange) operator(:=) ident(LoadExternalBClick)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(OKBinaryBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(Typ)operator(:) ident(Cardinal)operator(;) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + reserved(try) + ident(Typ) operator(:=) ident(StrToIntDef)operator(()ident(UntilChar)operator(()ident(DataTypeComB)operator(.)ident(Text)operator(,) char<delimiter(')content( )delimiter(')>operator(\),) ident(Integer)operator(()ident(rdBinary)operator(\)\);) + ident(OpenCurKey)operator(;) + reserved(with) ident(ValuesWin)operator(.)ident(ValueNames) reserved(do) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(Count)operator(-)integer(1) reserved(do) + ident(MainReg)operator(.)ident(WriteBinType)operator(()ident(Strings)operator([)ident(i)operator(],) ident(BinaryHM)operator(.)ident(Data)operator(,) ident(Typ)operator(\);) + ident(ValuesWin)operator(.)ident(UpdateValues)operator(()ident(True)operator(\);) + reserved(finally) + ident(MainReg)operator(.)ident(CloseKey)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(HexGrid1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + comment({with BinaryHM do begin + with BinL, Font do + if ActiveByte < ByteCount then + Color := clBrightGreen + else begin + Color := clSilver; + Caption := '00000000'; + end; + BinL.Caption := IntToBinFill(CurrentByte, 8\); + end; }) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(HexGrid1KeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) + ident(Shift)operator(:) ident(TShiftState)operator(\);) +reserved(begin) + reserved(if) ident(key) operator(=) ident(VK_RETURN) reserved(then) reserved(begin) + ident(OKBinaryBClick)operator(()ident(Sender)operator(\);) + ident(ValuesWin)operator(.)ident(FocusControl)operator(()ident(ValueList)operator(\);) + reserved(end)operator(;) + reserved(if) ident(key) operator(=) ident(VK_ESCAPE) reserved(then) + ident(CancelBClick)operator(()ident(Sender)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(BoolStrPopup)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(StringE)operator(.)ident(Text) operator(:=) ident(TMenuItem)operator(()ident(Sender)operator(\).)ident(Caption)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(StringPageEnter)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(FocusControl)operator(()ident(StringE)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(IntPageEnter)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(FocusControl)operator(()ident(CardinalE)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(BinaryPageEnter)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(FocusControl)operator(()ident(BinaryHM)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(ActivateIt)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ActivateThis)operator(()ident(Sender)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(DeActivateIt)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(DeActivateThis)operator(()ident(Sender)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(FormDeactivate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) ident(Assigned)operator(()ident(ActiveControl)operator(\)) reserved(and) operator(()ident(ActiveControl)operator(.)ident(Tag) operator(=) ident(EditControlFlag)operator(\)) reserved(then) + ident(TEdit)operator(()ident(ActiveControl)operator(\).)ident(OnExit)operator(()ident(Sender)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(FormActivate)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) ident(Assigned)operator(()ident(ActiveControl)operator(\)) reserved(and) operator(()ident(ActiveControl)operator(.)ident(Tag) operator(=) ident(EditControlFlag)operator(\)) reserved(then) + ident(TEdit)operator(()ident(ActiveControl)operator(\).)ident(OnEnter)operator(()ident(Sender)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(MultiStringMChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(MultiStringCountL)operator(.)ident(Caption) operator(:=) ident(StrNumerus)operator(()ident(MultiStringM)operator(.)ident(Lines)operator(.)ident(Count)operator(,) + string<delimiter(')content(Line)delimiter(')>operator(,) string<delimiter(')content(Lines)delimiter(')>operator(,) string<delimiter(')content(No)delimiter(')>operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(OKMultiStringBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(UseExtendedModel)operator(:) ident(Boolean)operator(;) + ident(i)operator(:) ident(Integer)operator(;) + ident(JoinedText)operator(:) reserved(string)operator(;) +reserved(begin) + reserved(if) operator(()ident(MultiStringTypeRG)operator(.)ident(ItemIndex) operator(=) integer(1)operator(\)) reserved(then) reserved(begin) + reserved(if) ident(ValuesWin)operator(.)ident(ValueCommonType) operator(=) ident(rdMultiString) reserved(then) + reserved(if) ident(mrYes)operator(<>)ident(MessageDlg)operator(()string<delimiter(')content(Do you want to change the type of this value?)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(MultiString --> String)delimiter(')>operator(,) ident(mtWarning)operator(,) operator([)ident(mbYes)operator(,) ident(mbCancel)operator(],) integer(0)operator(\)) reserved(then) + ident(Exit)operator(;) + + reserved(try) + ident(OpenCurKey)operator(;) + ident(JoinedText) operator(:=) ident(Join)operator(()ident(MultiStringM)operator(.)ident(Lines)operator(,) ident(SeparatorE)operator(.)ident(Text)operator(\);) + reserved(with) ident(ValuesWin)operator(.)ident(ValueNames) reserved(do) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(Count)operator(-)integer(1) reserved(do) + ident(MainReg)operator(.)ident(WriteString)operator(()ident(Strings)operator([)ident(i)operator(],) ident(JoinedText)operator(\);) + ident(ValuesWin)operator(.)ident(UpdateValues)operator(()ident(True)operator(\);) + reserved(finally) + ident(MainReg)operator(.)ident(CloseKey)operator(;) + reserved(end)operator(;) + ident(Exit)operator(;) reserved(end)operator(;) + + ident(UseExtendedModel) operator(:=) ident(True)operator(;) + reserved(if) ident(ContainsEmptyLines)operator(()ident(MultiStringM)operator(.)ident(Lines)operator(\)) reserved(then) + reserved(case) ident(MessageDlg)operator(()string<delimiter(')content(This text contains empty lines.)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(These are not allowed in the standard MultiString model.)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(Do you want to delete them?)delimiter(')> operator(+) ident(EOL) operator(+) + ident(EOL) operator(+) + string<delimiter(')content(Yes: Delete empty lines)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(No: Use the Extended Model)delimiter(')>operator(,) + ident(mtWarning)operator(,) operator([)ident(mbYes)operator(,) ident(mbNo)operator(,) ident(mbCancel)operator(],) integer(0)operator(\)) reserved(of) + + ident(mrNo)operator(:) ident(UseExtendedModel) operator(:=) ident(True)operator(;) + + ident(mrYes)operator(:) reserved(begin) + reserved(with) ident(MultiStringM) reserved(do) reserved(begin) + ident(Lines)operator(.)ident(BeginUpdate)operator(;) + ident(DeleteEmptyLines)operator(()ident(Lines)operator(\);) + ident(Lines)operator(.)ident(EndUpdate)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + reserved(else) ident(Exit)operator(;) + + reserved(end)operator(;) + + reserved(try) + ident(OpenCurKey)operator(;) + reserved(with) ident(ValuesWin)operator(.)ident(ValueNames) reserved(do) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(Count)operator(-)integer(1) reserved(do) reserved(begin) + reserved(if) ident(MainReg)operator(.)ident(GetDataType)operator(()ident(Strings)operator([)ident(i)operator(]\)) operator(<>) ident(rdMultiString) reserved(then) + reserved(if) ident(mrYes) operator(<>) ident(MessageDlg)operator(()string<delimiter(')content(Do you want to change the type of this value?)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(--> MultiString)delimiter(')>operator(,) ident(mtWarning)operator(,) operator([)ident(mbYes)operator(,) ident(mbCancel)operator(],) integer(0)operator(\)) reserved(then) + ident(Exit)operator(;) + reserved(if) ident(UseExtendedModel) reserved(then) + ident(MainReg)operator(.)ident(WriteStringList)operator(()ident(Strings)operator([)ident(i)operator(],) ident(MultiStringM)operator(.)ident(Lines)operator(\)) + reserved(else) + ident(MainReg)operator(.)ident(WriteMultiString)operator(()ident(Strings)operator([)ident(i)operator(],) ident(MultiStringM)operator(.)ident(Lines)operator(\);) + reserved(end)operator(;) + ident(ValuesWin)operator(.)ident(UpdateValues)operator(()ident(True)operator(\);) + reserved(finally) + ident(MainReg)operator(.)ident(CloseKey)operator(;) + reserved(end)operator(;) + + ident(ValuesWin)operator(.)ident(ValueListDblClick)operator(()ident(Sender)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(StringAsColorPDblClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) ident(ColorDlg)operator(.)ident(Execute) reserved(then) + ident(StringE)operator(.)ident(Text) operator(:=) ident(StringOfColor)operator(()ident(ColorDlg)operator(.)ident(Color)operator(,) ident(csfThreeSpacedDecimals)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(MultiStringMEnter)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(MultiStringM)operator(.)ident(SelectAll)operator(;) + ident(ActivateIt)operator(()ident(MultiStringM)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(LadenMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(with) ident(MultiStringOpenD) reserved(do) reserved(begin) + ident(InitialDir) operator(:=) ident(ExtractFileDrive)operator(()ident(MyDir)operator(\);) + reserved(if) ident(Execute) reserved(then) + ident(MultiStringM)operator(.)ident(Lines)operator(.)ident(LoadFromFile)operator(()ident(FileName)operator(\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(SpeichernMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(with) ident(MultiStringSaveD) reserved(do) reserved(begin) + ident(InitialDir) operator(:=) ident(ExtractFileDrive)operator(()ident(MyDir)operator(\);) + reserved(if) ident(Execute) reserved(then) + ident(MultiStringM)operator(.)ident(Lines)operator(.)ident(SaveToFile)operator(()ident(FileName)operator(\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(Hinzufgen1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(SL)operator(:) ident(TStringList)operator(;) +reserved(begin) + reserved(with) ident(MultiStringOpenD) reserved(do) reserved(begin) + ident(InitialDir) operator(:=) ident(ExtractFileDrive)operator(()ident(MyDir)operator(\);) + reserved(if) ident(Execute) reserved(then) reserved(begin) + ident(SL) operator(:=) ident(TStringList)operator(.)ident(Create)operator(;) + ident(SL)operator(.)ident(LoadFromFile)operator(()ident(FileName)operator(\);) + ident(MultiStringM)operator(.)ident(Lines)operator(.)ident(AddStrings)operator(()ident(SL)operator(\);) + ident(SL)operator(.)ident(Free)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(CancelBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ValuesWin)operator(.)ident(FocusControl)operator(()ident(ValueList)operator(\);) + ident(ValuesWin)operator(.)ident(ValueListChange)operator(()ident(Sender)operator(,) ident(ValueList)operator(.)ident(Selected)operator(,) ident(ctState)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(HexGrid1Enter)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(HexGrid1Click)operator(()ident(Sender)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(SpyClearTracesBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(SpyLB)operator(.)ident(Clear)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(SpyLBKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) + ident(Shift)operator(:) ident(TShiftState)operator(\);) +reserved(begin) + reserved(if) operator(()ident(ssShift) reserved(in) ident(Shift)operator(\)) reserved(and) operator(()ident(key) operator(=) ident(VK_DELETE)operator(\)) reserved(then) reserved(begin) + ident(key) operator(:=) integer(0)operator(;) + ident(SpyLB)operator(.)ident(Clear)operator(;) + ident(Exit)operator(;) reserved(end)operator(;) + + reserved(if) ident(key) operator(=) ident(VK_F9) reserved(then) reserved(begin) + ident(key) operator(:=) integer(0)operator(;) + ident(SwapFonts)operator(()ident(SpyLB)operator(\);) + ident(Exit)operator(;) reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(BinLClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + comment(// with HexGrid1 do) + comment(// Byt[ActiveByte] := IntOfBin(BinL.Caption\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(HexGrid1KeyUp)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) + ident(Shift)operator(:) ident(TShiftState)operator(\);) +reserved(begin) + comment(//HexGrid1Click(Sender\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(ValueViewChanged)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + reserved(if) reserved(not) ident(Started) reserved(then) + ident(Exit)operator(;) + + ident(SpyThread)operator(.)ident(Suspend)operator(;) + ident(OpenCurKey)operator(;) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(ValueList)operator(.)ident(Items)operator(.)ident(Count)operator(-)integer(1) reserved(do) + ident(ValuesWin)operator(.)ident(UpdateValue)operator(()ident(MainReg)operator(,) ident(ValueList)operator(.)ident(Items)operator([)ident(i)operator(]\);) + + ident(MainReg)operator(.)ident(CloseKey)operator(;) + ident(SpyThread)operator(.)ident(Resume)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(HexEdit1Change)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) reserved(not) ident(HexEditAutoChange) reserved(then) + ident(CardinalE)operator(.)ident(Value) operator(:=) ident(HexEdit1)operator(.)ident(Value)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(SortMultiStringMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(SL)operator(:) ident(TStringList)operator(;) +reserved(begin) + ident(SL) operator(:=) ident(TStringList)operator(.)ident(Create)operator(;) + reserved(with) ident(SL) reserved(do) reserved(begin) + ident(Assign)operator(()ident(MultiStringM)operator(.)ident(Lines)operator(\);) + ident(Sort)operator(;) + reserved(end)operator(;) + ident(MultiStringM)operator(.)ident(Lines)operator(.)ident(Assign)operator(()ident(SL)operator(\);) + ident(SL)operator(.)ident(Free)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(SpyTestLClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(SpyTestL)operator(.)ident(Caption) operator(:=) ident(StrOfBool)operator(()ident(SpyThread)operator(.)ident(Suspended)operator(,) string<delimiter(')content(No Spy.)delimiter(')>operator(,) string<delimiter(')content(Spy active.)delimiter(')>operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(FocusForEditing)operator(;) +reserved(begin) + ident(FocusControl)operator(()ident(MainPC)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(TWorkWin)operator(.)ident(LoadBoolStr)operator(:) ident(Boolean)operator(;) +reserved(var) + ident(SL)operator(:) ident(TStringList)operator(;) + ident(FileName)operator(:) reserved(string)operator(;) + ident(i)operator(,) ident(p)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(True)operator(;) + + ident(AddHint)operator(()string<delimiter(')content(Loading Boolean Strings...)delimiter(')>operator(\);) + + ident(FileName) operator(:=) ident(PlutoDir) operator(+) ident(BoolStrFileName)operator(;) + reserved(if) reserved(not) ident(FileEx)operator(()ident(FileName)operator(\)) reserved(then) reserved(begin) + ident(AddToLastHint)operator(()string<delimiter(')content(not found:)delimiter(')>operator(\);) + ident(AddHint)operator(()ident(FileName)operator(\);) + ident(Result) operator(:=) ident(False)operator(;) + reserved(end) reserved(else) reserved(begin) + ident(SL) operator(:=) ident(TStringList)operator(.)ident(Create)operator(;) + reserved(try) + ident(SL)operator(.)ident(LoadFromFile)operator(()ident(FileName)operator(\);) + ident(DeleteCommentLines)operator(()ident(SL)operator(\);) + ident(BoolStr) operator(:=) reserved(nil)operator(;) + ident(SetLength)operator(()ident(BoolStr)operator(,) ident(SL)operator(.)ident(Count)operator(\);) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(SL)operator(.)ident(Count)operator(-)integer(1) reserved(do) reserved(begin) + comment(//Split the string by the '|'-sign) + ident(p) operator(:=) ident(Pos)operator(()char<delimiter(')content(|)delimiter(')>operator(,) ident(SL)operator([)ident(i)operator(]\);) + ident(BoolStr)operator([)ident(i)operator(][)ident(False)operator(]) operator(:=) ident(Copy)operator(()ident(SL)operator([)ident(i)operator(],) integer(1)operator(,) ident(p)operator(-)integer(1)operator(\);) + ident(BoolStr)operator([)ident(i)operator(][)ident(True)operator(]) operator(:=) ident(Copy)operator(()ident(SL)operator([)ident(i)operator(],) ident(p)operator(+)integer(1)operator(,) ident(Length)operator(()ident(SL)operator([)ident(i)operator(]\)) operator(-) ident(p)operator(\);) + reserved(end)operator(;) + reserved(finally) + ident(SL)operator(.)ident(Free)operator(;) + ident(AddToLastHint)operator(()string<delimiter(')content(OK)delimiter(')>operator(\);) + reserved(end)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(function) ident(TWorkWin)operator(.)ident(LoadSisyFilter)operator(:) ident(Boolean)operator(;) +reserved(var) + ident(SL)operator(:) ident(TStringList)operator(;) + ident(FileName)operator(:) reserved(string)operator(;) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(True)operator(;) + + ident(FileName) operator(:=) ident(PlutoDir) operator(+) ident(SisyFilterFileName)operator(;) + reserved(if) reserved(not) ident(FileEx)operator(()ident(FileName)operator(\)) reserved(then) + ident(Result) operator(:=) ident(False) + reserved(else) reserved(begin) + ident(AddHint)operator(()string<delimiter(')content(Loading Sisyphus Filter Settings...)delimiter(')>operator(\);) + ident(SL) operator(:=) ident(TStringList)operator(.)ident(Create)operator(;) + reserved(try) + ident(SL)operator(.)ident(LoadFromFile)operator(()ident(FileName)operator(\);) + ident(DeleteCommentLines)operator(()ident(SL)operator(,) char<delimiter(')content(#)delimiter(')>operator(\);) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(SL)operator(.)ident(Count)operator(-)integer(1) reserved(do) + ident(SL)operator([)ident(i)operator(]) operator(:=) ident(TrimLeft)operator(()ident(SL)operator([)ident(i)operator(]\);) + + ident(SisyFilter)operator(.)ident(Clear)operator(;) + ident(SisyFilter)operator(.)ident(AddStrings)operator(()ident(SL)operator(\);) + reserved(finally) + ident(SL)operator(.)ident(Free)operator(;) + ident(AddToLastHint)operator(()string<delimiter(')content(OK)delimiter(')>operator(\);) + reserved(end)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(SisyTVGetSelectedIndex)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(\);) +reserved(begin) + ident(Node)operator(.)ident(SelectedIndex) operator(:=) ident(Node)operator(.)ident(ImageIndex)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(SisyTVDblClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(Node)operator(:) ident(TTreeNode)operator(;) + ident(Path)operator(:) reserved(string)operator(;) +reserved(begin) + ident(Node) operator(:=) ident(SisyTV)operator(.)ident(Selected)operator(;) + reserved(if) reserved(not) ident(Assigned)operator(()ident(Node)operator(\)) reserved(then) + ident(Exit)operator(;) + + ident(Path) operator(:=) ident(RootOfNode)operator(()ident(Node)operator(\).)ident(Text)operator(;) + + reserved(if) ident(Node)operator(.)ident(Level) operator(>) integer(0) reserved(then) reserved(begin) + reserved(if) ident(Node)operator(.)ident(Level) operator(=) integer(2) reserved(then) + ident(Node) operator(:=) ident(Node)operator(.)ident(Parent)operator(;) + reserved(if) ident(Node)operator(.)ident(HasChildren) reserved(then) + ident(Path) operator(:=) ident(Path) operator(+) string<delimiter(')content(\\\\)delimiter(')> operator(+) ident(Node)operator(.)ident(Text) comment(//Value) + reserved(else) + ident(Path) operator(:=) ident(Path) operator(+) char<delimiter(')content(\\)delimiter(')> operator(+) ident(Node)operator(.)ident(Text) comment(//SubKey) + reserved(end)operator(;) + + ident(MainWin)operator(.)ident(GotoKey)operator(()ident(Path)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(DeleteChange)operator(()ident(Node)operator(:) ident(TTreeNode)operator(\);) +reserved(var) + ident(SubNode)operator(:) ident(TTreeNode)operator(;) + + reserved(procedure) ident(FreeSisyChangeNode)operator(()ident(Node)operator(:) ident(TTreeNode)operator(\);) + reserved(begin) + reserved(try) + reserved(with) operator(()ident(TObject)operator(()ident(Node)operator(.)ident(Data)operator(\)) reserved(as) ident(TSisyChange)operator(\)) reserved(do) + ident(Free)operator(;) + reserved(except) + ident(ReportFmt)operator(()string<delimiter(')content(errors)delimiter(')>operator(,) string<delimiter(')content(Context could not be freed: "%s")delimiter(')>operator(,) operator([)ident(Node)operator(.)ident(Text)operator(]\);) + reserved(end)operator(;) + + ident(Node)operator(.)ident(Delete)operator(;) + reserved(end)operator(;) + +reserved(begin) + reserved(if) reserved(not) ident(Assigned)operator(()ident(Node)operator(\)) reserved(then) + ident(Exit)operator(;) + + reserved(if) ident(Node)operator(.)ident(Level) operator(=) integer(2) reserved(then) + ident(Node) operator(:=) ident(Node)operator(.)ident(Parent)operator(;) + + reserved(if) ident(Node)operator(.)ident(Level) operator(=) integer(0) reserved(then) reserved(begin) + ident(SisyTV)operator(.)ident(Selected) operator(:=) ident(GetNextBest)operator(()ident(RootOfNode)operator(()ident(Node)operator(\)\);) + ident(SubNode) operator(:=) ident(Node)operator(.)ident(GetFirstChild)operator(;) + reserved(while) ident(Assigned)operator(()ident(SubNode)operator(\)) reserved(do) reserved(begin) + ident(FreeSisyChangeNode)operator(()ident(SubNode)operator(\);) + ident(SubNode) operator(:=) ident(Node)operator(.)ident(GetFirstChild)operator(;) reserved(end)operator(;) + ident(Node)operator(.)ident(Delete)operator(;) + reserved(end) reserved(else) reserved(begin) + ident(SisyTV)operator(.)ident(Selected) operator(:=) ident(GetNextBest)operator(()ident(Node)operator(\);) + ident(FreeSisyChangeNode)operator(()ident(Node)operator(\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(DeactivateChange)operator(()ident(Node)operator(:) ident(TTreeNode)operator(\);) +reserved(begin) + ident(Node) operator(:=) ident(RootOfNode)operator(()ident(Node)operator(\);) + + reserved(if) reserved(not) ident(Assigned)operator(()ident(Node)operator(\)) reserved(then) + ident(Exit)operator(;) + + reserved(if) ident(SisyChangeActivated)operator(()ident(Node)operator(\)) reserved(then) reserved(begin) + ident(SetSisyChangeState)operator(()ident(Node)operator(,) ident(False)operator(\);) + ident(Node)operator(.)ident(Cut) operator(:=) ident(True)operator(;) + reserved(end) reserved(else) reserved(begin) + ident(SetSisyChangeState)operator(()ident(Node)operator(,) ident(True)operator(\);) + ident(Node)operator(.)ident(Cut) operator(:=) ident(False)operator(;) + reserved(end)operator(;) + ident(SisyTV)operator(.)ident(Repaint)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(CopySelectedChangeName)operator(;) +reserved(var) + ident(Node)operator(:) ident(TTreeNode)operator(;) +reserved(begin) + ident(Node) operator(:=) ident(SisyTV)operator(.)ident(Selected)operator(;) + reserved(if) reserved(not) ident(Assigned)operator(()ident(Node)operator(\)) reserved(then) + ident(Exit)operator(;) + + ident(Clipboard)operator(.)ident(AsText) operator(:=) ident(Node)operator(.)ident(Text)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(SisyTVKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) + ident(Shift)operator(:) ident(TShiftState)operator(\);) +reserved(var) + ident(Node)operator(:) ident(TTreeNode)operator(;) +reserved(begin) + ident(Node) operator(:=) ident(RootOfNode)operator(()ident(SisyTV)operator(.)ident(Selected)operator(\);) + reserved(if) reserved(not) ident(Assigned)operator(()ident(Node)operator(\)) reserved(then) + ident(Exit)operator(;) + + comment({if Key = VK_RETURN then + SisyTVDblCLick(Sender\); + + if Key = VK_DELETE then + if (ssCtrl in Shift\) and (Key = VK_DELETE\) then + DeactivateChange(Node\) + else + DeleteChange(Node\); + + if (ssCtrl in Shift\) and (Char(Key\) = 'C'\) then + CopySelectedChangeName;}) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(SisyCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) reserved(not) ident(Started) reserved(then) + ident(Exit)operator(;) + + reserved(with) ident(TCheckBox)operator(()ident(Sender)operator(\),) ident(TSisyThread)operator(()ident(Sisys)operator([)ident(Tag)operator(]\)) reserved(do) reserved(begin) + reserved(if) ident(Checked) reserved(then) + ident(Resume) + reserved(else) + ident(Suspend)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(CurValueEEnter)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(CurValueE)operator(.)ident(Text) operator(:=) ident(RealValueName)operator(()ident(ValueList)operator(.)ident(ItemFocused)operator(\);) + ident(CurValueE)operator(.)ident(SelectAll)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(CurValueEKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) + ident(Shift)operator(:) ident(TShiftState)operator(\);) + + reserved(procedure) ident(RenameValue)operator(()ident(NewName)operator(:) reserved(string)operator(\);) + reserved(var) + ident(Item)operator(:) ident(TListItem)operator(;) + reserved(begin) + ident(Item) operator(:=) ident(ValueList)operator(.)ident(ItemFocused)operator(;) + reserved(if) ident(ValuesWin)operator(.)ident(TryRenameValue)operator(()ident(CurKey)operator(.)ident(Value)operator(,) ident(NewName)operator(\)) reserved(then) + ident(SetRealValueName)operator(()ident(Item)operator(,) ident(NewName)operator(\);) + reserved(end)operator(;) + +reserved(begin) + reserved(if) ident(Key) operator(=) ident(VK_RETURN) reserved(then) reserved(begin) + ident(SpyThread)operator(.)ident(Suspend)operator(;) + reserved(try) + ident(RenameValue)operator(()ident(CurValueE)operator(.)ident(Text)operator(\);) + ident(ValuesWin)operator(.)ident(ValueListDblClick)operator(()ident(Self)operator(\);) + ident(FocusControl)operator(()ident(CurValueE)operator(\);) + reserved(finally) + ident(SpyThread)operator(.)ident(Restart) operator(:=) ident(True)operator(;) + ident(SpyThread)operator(.)ident(Resume)operator(;) + reserved(end)operator(;) + ident(Key) operator(:=) integer(0)operator(;) + comment(//CurValueE.SelectAll;) + reserved(end) reserved(else) reserved(if) ident(Key) operator(=) ident(VK_ESCAPE) reserved(then) reserved(begin) + ident(ValuesWin)operator(.)ident(ValueListDblClick)operator(()ident(Self)operator(\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(BinaryHMLineChange)operator(()ident(NewLine)operator(:) ident(Cardinal)operator(\);) +reserved(begin) + ident(OffsetHE)operator(.)ident(Value) operator(:=) ident(BinaryHM)operator(.)ident(Pos)operator(;) + comment(// BinaryAsIntL.Value := Integer(BinaryHM.CurentCard\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(OffsetHEChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(BinaryHM)operator(.)ident(Pos) operator(:=) ident(OffsetHE)operator(.)ident(Value)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(SpyDelayIEChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) ident(Assigned)operator(()ident(SpyThread)operator(\)) reserved(then) + ident(SpyThread)operator(.)ident(Delay) operator(:=) ident(SpyDelayIE)operator(.)ident(Value)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(SisyTVExpanded)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Node)operator(:) ident(TTreeNode)operator(\);) +reserved(begin) + reserved(if) ident(Node)operator(.)ident(ImageIndex) operator(=) integer(8) reserved(then) + ident(Node)operator(.)ident(ImageIndex) operator(:=) integer(7)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(ClearChanges)operator(;) +reserved(var) + ident(Node)operator(:) ident(TTreeNode)operator(;) +reserved(begin) + reserved(with) ident(SisyTV)operator(.)ident(Items) reserved(do) reserved(begin) + ident(Node) operator(:=) ident(GetFirstNode)operator(;) + reserved(while) ident(Assigned)operator(()ident(Node)operator(\)) reserved(do) reserved(begin) + ident(DeleteChange)operator(()ident(Node)operator(\);) + ident(Node) operator(:=) ident(GetFirstNode)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(ClearChangesBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) ident(mrOK) operator(<>) ident(MessageDlg)operator(()string<delimiter(')content(Do you really want to clear all changes?)delimiter(')>operator(,) + ident(mtWarning)operator(,) operator([)ident(mbOK)operator(,) ident(mbCancel)operator(],) integer(0)operator(\)) reserved(then) + ident(Exit)operator(;) + + ident(ClearChanges)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(FilterChangesBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(NotePad)operator(()ident(PlutoDir) operator(+) ident(SisyFilterFileName)operator(\);) + ident(ShowMessage)operator(()string<delimiter(')content(Click OK when you finished editing.)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content((Pluto will reload the filter settings then.\))delimiter(')>operator(\);) + ident(LoadSisyFilter)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(SisyTVPUPopup)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(KeySelected)operator(:) ident(Boolean)operator(;) + ident(Node)operator(:) ident(TTreeNode)operator(;) +reserved(begin) + ident(Node) operator(:=) ident(SisyTV)operator(.)ident(Selected)operator(;) + ident(KeySelected) operator(:=) ident(Assigned)operator(()ident(Node)operator(\);) + + ident(SisyGoToKeyMI)operator(.)ident(Enabled) operator(:=) ident(KeySelected)operator(;) + ident(SisyDeleteChangeMI)operator(.)ident(Enabled) operator(:=) ident(KeySelected)operator(;) + ident(SisyActivateChangeMI)operator(.)ident(Enabled) operator(:=) ident(KeySelected)operator(;) + ident(SisyCopyPathMI)operator(.)ident(Enabled) operator(:=) ident(KeySelected)operator(;) + reserved(if) reserved(not) ident(KeySelected) reserved(then) + ident(Exit)operator(;) + + ident(SisyActivateChangeMI)operator(.)ident(Checked) operator(:=) ident(SisyChangeActivated)operator(()ident(RootOfNode)operator(()ident(Node)operator(\)\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(SisyActivateChangeMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(DeactivateChange)operator(()ident(SisyTV)operator(.)ident(Selected)operator(\)) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(SisyDeleteChangeMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(DeleteChange)operator(()ident(SisyTV)operator(.)ident(Selected)operator(\)) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(SisyCopyPathMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(CopySelectedChangeName)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(FileMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(s)operator(:) reserved(string)operator(;) +reserved(begin) + reserved(with) ident(FileOpenD) reserved(do) reserved(begin) + ident(s) operator(:=) ident(ExtractPath)operator(()ident(StringE)operator(.)ident(Text)operator(\);) + reserved(if) ident(s) operator(<>) string<delimiter(')delimiter(')> reserved(then) + ident(InitialDir) operator(:=) ident(s) + reserved(else) + ident(InitialDir) operator(:=) ident(MyDir)operator(;) + + ident(s) operator(:=) ident(ExtractFileName)operator(()ident(StringE)operator(.)ident(Text)operator(\);) + ident(s) operator(:=) ident(DeleteChars)operator(()ident(s)operator(,) char<delimiter(')content(/)delimiter(')>operator(\);) + reserved(if) ident(s) operator(<>) string<delimiter(')delimiter(')> reserved(then) + ident(FileName) operator(:=) ident(s)operator(;) + + reserved(if) ident(Execute) reserved(then) + ident(StringE)operator(.)ident(Text) operator(:=) ident(FileName)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(ExternalEditBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(FileName)operator(:) reserved(string)operator(;) +reserved(begin) + ident(FileName) operator(:=) ident(TempDir) operator(+) char<delimiter(')content(~)delimiter(')> operator(+) ident(DeleteChars)operator(()ident(CurValueE)operator(.)ident(Text)operator(,) ident(FileNameEnemies)operator(\)) operator(+) + string<delimiter(')content(.bin)delimiter(')>operator(;) + reserved(if) ident(SaveByteA)operator(()ident(BinaryHM)operator(.)ident(Data)operator(,) ident(FileName)operator(\)) reserved(then) + ident(ExecFileWith)operator(()ident(PrefWin)operator(.)ident(ExternalHexEditE)operator(.)ident(Text)operator(,) ident(FileName)operator(\)) + reserved(else) + ident(ShowMessage)operator(()string<delimiter(')content(Could not write into file:)delimiter(')> operator(+) ident(EOL) operator(+) ident(FileName)operator(\);) + + ident(PipelineThread)operator(.)ident(FileName) operator(:=) ident(FileName)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(LoadExternalBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(FileName)operator(:) reserved(string)operator(;) + ident(Data)operator(:) ident(TByteA)operator(;) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Data) operator(:=) reserved(nil)operator(;) + + ident(FileName) operator(:=) ident(TempDir) operator(+) char<delimiter(')content(~)delimiter(')> operator(+) ident(CurValueE)operator(.)ident(Text) operator(+) string<delimiter(')content(.bin)delimiter(')>operator(;) + reserved(if) reserved(not) ident(FileEx)operator(()ident(FileName)operator(\)) reserved(then) reserved(begin) + comment({ShowMessage('File not found:' + EOL + + FileName\);}) + ident(Exit)operator(;) + reserved(end)operator(;) + + ident(Data) operator(:=) ident(LoadByteA)operator(()ident(FileName)operator(\);) + reserved(if) ident(Length)operator(()ident(Data)operator(\)) operator(=) ident(Length)operator(()ident(BinaryHM)operator(.)ident(Data)operator(\)) reserved(then) reserved(begin) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(High)operator(()ident(Data)operator(\)) reserved(do) + reserved(if) ident(Data)operator([)ident(i)operator(]) operator(<>) ident(BinaryHM)operator(.)ident(Data)operator([)ident(i)operator(]) reserved(then) reserved(begin) + ident(BinaryHM)operator(.)ident(Data) operator(:=) ident(Data)operator(;) + ident(Exit)operator(;) + reserved(end)operator(;) + reserved(end) reserved(else) + ident(BinaryHM)operator(.)ident(Data) operator(:=) ident(Data)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(PipelineCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(with) ident(PipelineThread)operator(,) ident(PipelineCB) reserved(do) + reserved(if) ident(Checked) reserved(then) reserved(begin) + reserved(if) ident(Suspended) reserved(then) + ident(Resume)operator(;) + reserved(end) reserved(else) + reserved(if) reserved(not) ident(Suspended) reserved(then) + ident(Suspend)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(ReloadBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ValuesWin)operator(.)ident(ValueListDblClick)operator(()ident(Self)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(BinaryHMEnter)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(PipelineCB)operator(.)ident(Checked) operator(:=) ident(False)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(xUseExtendedModelCBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(PrefWin)operator(.)ident(UseExtendedModelCB)operator(.)ident(Load)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(SeparatorEChange)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(if) reserved(not) ident(SeparatorE)operator(.)ident(Enabled) reserved(then) + ident(Exit)operator(;) + + reserved(if) ident(SeparatorE)operator(.)ident(Text) operator(=) string<delimiter(')delimiter(')> reserved(then) reserved(begin) + reserved(if) ident(StringE)operator(.)ident(Text) operator(=) string<delimiter(')delimiter(')> reserved(then) + ident(Exit) + reserved(else) + ident(MultiStringM)operator(.)ident(Text) operator(:=) ident(StringE)operator(.)ident(Text)operator(;) + ident(MultiStringTypeRG)operator(.)ident(Buttons)operator([)integer(1)operator(].)ident(Enabled) operator(:=) ident(False)operator(;) + ident(MultiStringTypeRG)operator(.)ident(ItemIndex) operator(:=) integer(0)operator(;) + reserved(end) reserved(else) reserved(begin) + reserved(if) ident(StringE)operator(.)ident(Text) operator(=) string<delimiter(')delimiter(')> reserved(then) + ident(StringE)operator(.)ident(Text) operator(:=) ident(Join)operator(()ident(MultiStringM)operator(.)ident(Lines)operator(,) ident(SeparatorE)operator(.)ident(Text)operator(\);) + ident(MultiStringTypeRG)operator(.)ident(Buttons)operator([)integer(1)operator(].)ident(Enabled) operator(:=) ident(True)operator(;) + ident(MultiStringTypeRG)operator(.)ident(ItemIndex) operator(:=) integer(1)operator(;) + ident(Split)operator(()ident(StringE)operator(.)ident(Text)operator(,) ident(SeparatorE)operator(.)ident(Text)operator(,) ident(MultiStringM)operator(.)ident(Lines)operator(,) ident(False)operator(\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(HintLBKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) + ident(Shift)operator(:) ident(TShiftState)operator(\);) +reserved(begin) + reserved(if) operator(()ident(Key) operator(=) ident(Byte)operator(()char<delimiter(')content(C)delimiter(')>operator(\)\)) reserved(and) operator(()ident(ssCtrl) reserved(in) ident(Shift)operator(\)) reserved(then) + reserved(with) ident(HintLb) reserved(do) + reserved(if) ident(ItemIndex) operator(>=) integer(0) reserved(then) + ident(Clipboard)operator(.)ident(AsText) operator(:=) ident(Items)operator([)ident(ItemIndex)operator(];) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(DWORDSpecialBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(CardinalE)operator(.)ident(Value) operator(:=) ident(StrToIntDef)operator((()ident(Sender) reserved(as) ident(TButton)operator(\).)ident(Caption)operator(,) integer(0)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(Button1Click)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(ShowPC)operator(.)ident(SelectNextPage)operator(()ident(True)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(SisyPUPopup)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(with) ident(SisyPU)operator(,) ident(TSisyThread)operator(()ident(Sisys)operator([)ident(PopupComponent)operator(.)ident(Tag)operator(]\)) reserved(do) + ident(Items)operator([)ident(Integer)operator(()ident(Priority)operator(\)].)ident(Checked) operator(:=) ident(True)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(SisyPriorityMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(with) ident(TSisyThread)operator(()ident(Sisys)operator([)ident(SisyPU)operator(.)ident(PopupComponent)operator(.)ident(Tag)operator(]\)) reserved(do) reserved(begin) + ident(Priority) operator(:=) ident(TThreadPriority)operator(()ident(TMenuItem)operator(()ident(Sender)operator(\).)ident(MenuIndex)operator(\);) + reserved(if) ident(Priority) operator(<=) ident(tpNormal) reserved(then) + ident(Uni)operator(.)ident(WriteInteger)operator(()string<delimiter(')content(Priority)delimiter(')>operator(,) ident(Integer)operator(()ident(Priority)operator(\)\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(SisyShowCurrentPathMIClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + reserved(with) ident(SisyPU)operator(,) ident(TSisyThread)operator(()ident(Sisys)operator([)ident(PopupComponent)operator(.)ident(Tag)operator(]\)) reserved(do) reserved(begin) + ident(Suspend)operator(;) + ident(ShowMessage)operator(()ident(CurrentSpyKey)operator(.)ident(Path)operator(\);) + ident(Resume)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(DropFileTargetDrop)operator(()ident(Sender)operator(:) ident(TObject)operator(;) + ident(ShiftState)operator(:) ident(TShiftState)operator(;) ident(Point)operator(:) ident(TPoint)operator(;) reserved(var) ident(Effect)operator(:) ident(Integer)operator(\);) +reserved(begin) + ident(StringE)operator(.)ident(Text) operator(:=) ident(DropFileTarget)operator(.)ident(Files)operator([)integer(0)operator(];) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(FormClose)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Action)operator(:) ident(TCloseAction)operator(\);) +reserved(begin) +comment(// Action := caNone;) + ident(DropFileTarget)operator(.)ident(Unregister)operator(;) + ident(ClearChanges)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(FormResize)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(begin) + ident(Realign)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(IconImageDblClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(Filename)operator(:) reserved(string)operator(;) +reserved(begin) + ident(FileName) operator(:=) ident(GetFileNew)operator(()ident(StringE)operator(.)ident(Text)operator(\);) + reserved(if) ident(FileName) operator(<>) string<delimiter(')delimiter(')> reserved(then) + ident(ExecFile)operator(()ident(FileName)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(ShowValues)operator(()ident(Reg)operator(:) ident(TXRegistry)operator(\);) +reserved(var) + ident(MainValueName)operator(:) reserved(string)operator(;) + ident(ValueCommonType)operator(:) ident(TRegDataType)operator(;) + + reserved(procedure) ident(ShowValueAsBinary)operator(()reserved(const) ident(ValueName)operator(:) reserved(string)operator(;) + ident(Smart4BB)operator(:) ident(Boolean) operator(=) ident(True)operator(\);) + reserved(begin) + reserved(if) ident(Smart4BB) + reserved(and) ident(PrefWin)operator(.)ident(Smart4BBCB)operator(.)ident(Checked) + reserved(and) operator(()ident(Reg)operator(.)ident(GetDataSize)operator(()ident(ValueName)operator(\)) operator(=) integer(4)operator(\)) reserved(then) reserved(begin) + ident(CardinalE)operator(.)ident(Value) operator(:=) ident(Reg)operator(.)ident(ReadCardinal)operator(()ident(ValueName)operator(\);) + ident(CardTypeRG)operator(.)ident(ItemIndex) operator(:=) integer(2)operator(;) + ident(ShowPC)operator(.)ident(ActivePage) operator(:=) ident(IntPage)operator(;) + ident(Exit)operator(;) reserved(end)operator(;) + ident(BinaryHM)operator(.)ident(Data) operator(:=) ident(Reg)operator(.)ident(ReadBin)operator(()ident(ValueName)operator(\);) + ident(DataTypeComB)operator(.)ident(ItemIndex) operator(:=) ident(ValueCommonType)operator(;) + reserved(if) ident(IsValidDataType)operator(()ident(ValueCommonType)operator(\)) reserved(then) + ident(DataTypeComB)operator(.)ident(ItemIndex) operator(:=) ident(ValueCommonType) + reserved(else) reserved(begin) + ident(DataTypeComB)operator(.)ident(Text) operator(:=) ident(IntToStr)operator(()ident(ValueCommonType)operator(\);) + ident(AddHint)operator(()string<delimiter(')content(Value has unknown data type ()delimiter(')> operator(+) ident(DataTypeComB)operator(.)ident(Text) operator(+) string<delimiter(')content(\): )delimiter(')> operator(+) + ident(Quote)operator(()ident(ValueName)operator(\)\);) + reserved(end)operator(;) + ident(ShowPC)operator(.)ident(ActivePage) operator(:=) ident(BinaryPage)operator(;) + reserved(end)operator(;) + +reserved(begin) + reserved(with) ident(ValuesWin) reserved(do) reserved(begin) + reserved(if) reserved(not) ident(Assigned)operator(()ident(ValueNames)operator(\)) reserved(or) operator(()ident(ValueNames)operator(.)ident(Count) operator(=) integer(0)operator(\)) reserved(then) + reserved(raise) ident(EReadError)operator(.)ident(Create)operator(()string<delimiter(')content(ValueNameList error)delimiter(')>operator(\);) + ident(MainValueName) operator(:=) ident(ValueNames)operator([)integer(0)operator(];) + reserved(end)operator(;) + ident(ValueCommonType) operator(:=) ident(ValuesWin)operator(.)ident(ValueCommonType)operator(;) + + reserved(with) ident(CurValueE) reserved(do) reserved(begin) + ident(Enabled) operator(:=) ident(True)operator(;) + reserved(if) ident(ValuesWin)operator(.)ident(ValueNames)operator(.)ident(Count) operator(=) integer(1) reserved(then) + ident(Text) operator(:=) ident(MainValueName) + reserved(else) + ident(Text) operator(:=) ident(Copy)operator(()ident(ValuesWin)operator(.)ident(ValueNames)operator(.)ident(CommaText)operator(,) integer(1)operator(,) integer(255)operator(\);) + + ident(Font)operator(.)ident(Color) operator(:=) ident(ColorOfDataType)operator(()ident(ValueCommonType)operator(\);) + reserved(end)operator(;) + + reserved(if) ident(KeyIsDown)operator(()ident(VK_MENU)operator(\)) reserved(or) ident(ShowAsBinary) reserved(then) reserved(begin) + ident(ShowValueAsBinary)operator(()ident(MainValueName)operator(,) ident(False)operator(\);) + reserved(end) reserved(else) reserved(if) ident(ValueCommonType) reserved(in) ident(rdStringTypes) reserved(then) reserved(begin) + ident(StringE)operator(.)ident(Text) operator(:=) ident(Reg)operator(.)ident(ReadString)operator(()ident(MainValueName)operator(\);) + reserved(case) ident(ValueCommonType) reserved(of) + ident(rdString)operator(:) ident(StringTypeRG)operator(.)ident(ItemIndex) operator(:=) integer(0)operator(;) + ident(rdExpandString)operator(:) ident(StringTypeRG)operator(.)ident(ItemIndex) operator(:=) integer(1)operator(;) + reserved(end)operator(;) + ident(ShowPC)operator(.)ident(ActivePage) operator(:=) ident(StringPage)operator(;) + reserved(end) reserved(else) reserved(if) ident(ValueCommonType) reserved(in) ident(rdCardTypes) reserved(then) reserved(begin) + ident(CardinalE)operator(.)ident(Value) operator(:=) ident(Reg)operator(.)ident(ReadCardinal)operator(()ident(MainValueName)operator(\);) + reserved(case) ident(ValueCommonType) reserved(of) + ident(rdCardinal)operator(:) ident(StringTypeRG)operator(.)ident(ItemIndex) operator(:=) integer(0)operator(;) + ident(rdCardBigEndian)operator(:) ident(StringTypeRG)operator(.)ident(ItemIndex) operator(:=) integer(1)operator(;) + reserved(end)operator(;) + ident(ShowPC)operator(.)ident(ActivePage) operator(:=) ident(IntPage)operator(;) + reserved(end) reserved(else) reserved(if) ident(ValueCommonType) operator(=) ident(rdMultiString) reserved(then) reserved(begin) + ident(MultiStringM)operator(.)ident(Clear)operator(;) + ident(Reg)operator(.)ident(ReadMultiString)operator(()ident(MainValueName)operator(,) ident(MultiStringM)operator(.)ident(Lines)operator(,) ident(PrefWin)operator(.)ident(UseExtendedModelCB)operator(.)ident(Checked)operator(\);) + ident(SeparatorEChange)operator(()ident(Self)operator(\);) + ident(MultiStringTypeRG)operator(.)ident(ItemIndex) operator(:=) integer(0)operator(;) + ident(ShowPC)operator(.)ident(ActivePage) operator(:=) ident(MultiStringPage)operator(;) + reserved(end) reserved(else) reserved(begin) + ident(ShowValueAsBinary)operator(()ident(MainValueName)operator(\);) + reserved(end)operator(;) + + ident(ShowAsBinary) operator(:=) ident(False)operator(;) + + ident(UpdateWriteButtons)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(UpdateWriteButtons)operator(;) +reserved(const) + ident(BtnTextOfMultiEdit)operator(:) reserved(array)operator([)ident(Boolean)operator(]) reserved(of) reserved(string) operator(=) operator(()string<delimiter(')content(Write)delimiter(')>operator(,) string<delimiter(')content(Write all)delimiter(')>operator(\);) +reserved(var) + ident(BtnText)operator(:) reserved(string)operator(;) +reserved(begin) + ident(BtnText) operator(:=) ident(BtnTextOfMultiEdit)operator([)ident(ValuesWin)operator(.)ident(ValueNames)operator(.)ident(Count) operator(>) integer(1)operator(];) + ident(OKStringB)operator(.)ident(Caption) operator(:=) ident(BtnText)operator(;) + ident(OKIntB)operator(.)ident(Caption) operator(:=) ident(BtnText)operator(;) + ident(OKMultiStringB)operator(.)ident(Caption) operator(:=) ident(BtnText)operator(;) + ident(OKBinaryB)operator(.)ident(Caption) operator(:=) ident(BtnText)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(EditData)operator(;) +reserved(begin) + ident(AddHint)operator(()string<delimiter(')content(Edit)delimiter(')>operator(\);) + ident(MainPC)operator(.)ident(ActivePage) operator(:=) ident(WorkPage)operator(;) + + reserved(with) ident(ShowPC) reserved(do) + reserved(if) ident(ActivePage) operator(=) reserved(nil) reserved(then) + ident(Exit) + reserved(else) reserved(if) ident(ActivePage) operator(=) ident(WorkWin)operator(.)ident(StringPage) reserved(then) reserved(begin) + ident(FocusControl)operator(()ident(StringE)operator(\);) + ident(StringE)operator(.)ident(SelectAll)operator(;) + reserved(end) + reserved(else) reserved(if) ident(ActivePage) operator(=) ident(WorkWin)operator(.)ident(IntPage) reserved(then) + ident(FocusControl)operator(()ident(CardinalE)operator(\)) + reserved(else) reserved(if) ident(ActivePage) operator(=) ident(WorkWin)operator(.)ident(MultiStringPage) reserved(then) + ident(FocusControl)operator(()ident(MultiStringM)operator(\)) + reserved(else) reserved(if) ident(ActivePage) operator(=) ident(WorkWin)operator(.)ident(BinaryPage) reserved(then) + ident(FocusControl)operator(()ident(BinaryHM)operator(\)) + reserved(else) + ident(ShowMessage)operator(()string<delimiter(')content(Error: ShowPC.ActivePage!)delimiter(')>operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(SisyTVCustomDrawItem)operator(()ident(Sender)operator(:) ident(TCustomTreeView)operator(;) + ident(Node)operator(:) ident(TTreeNode)operator(;) ident(State)operator(:) ident(TCustomDrawState)operator(;) reserved(var) ident(DefaultDraw)operator(:) ident(Boolean)operator(\);) +reserved(begin) + reserved(with) ident(TTreeView)operator(()ident(Sender)operator(\).)ident(Canvas)operator(.)ident(Font) reserved(do) reserved(begin) + reserved(if) ident(Node)operator(.)ident(Cut) reserved(then) + ident(Color) operator(:=) hex($AAAAAA) + reserved(else) + ident(Color) operator(:=) ident(clWhite)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(SisyTVMouseDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) ident(Button)operator(:) ident(TMouseButton)operator(;) + ident(Shift)operator(:) ident(TShiftState)operator(;) ident(X)operator(,) ident(Y)operator(:) ident(Integer)operator(\);) +reserved(var) + ident(Node)operator(:) ident(TTreeNode)operator(;) + ident(RelX)operator(,) ident(RelY)operator(:) ident(Integer)operator(;) +reserved(begin) + reserved(with) ident(SisyTV) reserved(do) reserved(begin) + ident(RelX) operator(:=) ident(ScreenToClient)operator(()ident(Mouse)operator(.)ident(CursorPos)operator(\).)ident(X)operator(;) + ident(RelY) operator(:=) ident(ScreenToClient)operator(()ident(Mouse)operator(.)ident(CursorPos)operator(\).)ident(Y)operator(;) + ident(Node) operator(:=) ident(GetNodeAt)operator(()ident(RelX)operator(,) ident(RelY)operator(\);) + reserved(end)operator(;) + reserved(if) reserved(not) ident(Assigned)operator(()ident(Node)operator(\)) reserved(then) + ident(Exit)operator(;) + + reserved(if) reserved(not) ident(Node)operator(.)ident(Selected) reserved(then) + ident(Node)operator(.)ident(Selected) operator(:=) ident(True)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(OKCryptoBClick)operator(()ident(Sender)operator(:) ident(TObject)operator(\);) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + reserved(try) + ident(OpenCurKey)operator(;) + reserved(with) ident(ValuesWin)operator(.)ident(ValueNames) reserved(do) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(Count)operator(-)integer(1) reserved(do) reserved(begin) + reserved(case) ident(CryptoTypeRG)operator(.)ident(ItemIndex) reserved(of) + integer(0)operator(:) ident(MainReg)operator(.)ident(WriteBin)operator(()ident(Strings)operator([)ident(i)operator(],) ident(EncodeScreenSaver)operator(()ident(CryptoE)operator(.)ident(Text)operator(\)\);) + integer(1)operator(:) ident(MainReg)operator(.)ident(WriteBin)operator(()ident(Strings)operator([)ident(i)operator(],) ident(EncodeSharedFolder)operator(()ident(CryptoE)operator(.)ident(Text)operator(\)\);) + reserved(end)operator(;) + reserved(end)operator(;) + ident(ValuesWin)operator(.)ident(UpdateValues)operator(()ident(True)operator(\);) + reserved(finally) + ident(MainReg)operator(.)ident(CloseKey)operator(;) + reserved(end)operator(;) + ident(ValuesWin)operator(.)ident(ValueListDblClick)operator(()ident(Sender)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TWorkWin)operator(.)ident(CryptoEKeyDown)operator(()ident(Sender)operator(:) ident(TObject)operator(;) reserved(var) ident(Key)operator(:) ident(Word)operator(;) + ident(Shift)operator(:) ident(TShiftState)operator(\);) +reserved(begin) + reserved(if) ident(Key) operator(=) ident(VK_RETURN) reserved(then) reserved(begin) + ident(OKCryptoBClick)operator(()ident(Sender)operator(\);) + ident(ValuesWin)operator(.)ident(FocusControl)operator(()ident(ValueList)operator(\);) + reserved(end)operator(;) + reserved(if) ident(Key) operator(=) ident(VK_ESCAPE) reserved(then) + ident(CancelBClick)operator(()ident(Sender)operator(\);) +reserved(end)operator(;) + +reserved(end)operator(.) diff --git a/test/scanners/delphi/suite.rb b/test/scanners/delphi/suite.rb new file mode 100644 index 0000000..ace3fd2 --- /dev/null +++ b/test/scanners/delphi/suite.rb @@ -0,0 +1,3 @@ +class Delphi < CodeRay::TestCase + extension :pas +end diff --git a/test/scanners/delphi/ytools.in.pas b/test/scanners/delphi/ytools.in.pas new file mode 100644 index 0000000..8670459 --- /dev/null +++ b/test/scanners/delphi/ytools.in.pas @@ -0,0 +1,2708 @@ +// vim:ft=pascal
+
+unit YTools;
+
+{===============================================================================
+
+ cYcnus.YTools 1.0.3 Beta for Delphi 4+
+ by licenser and Murphy
+
+ ©2000-2003 by cYcnus
+ visit www.cYcnus.de
+
+ licenser@cYcnus.de (Heinz N. Gies)
+ murphy@cYcnus.de (Kornelius Kalnbach)
+
+ this unit is published under the terms of the GPL
+
+===============================================================================}
+
+interface
+
+uses
+ Windows, SysUtils, Classes, YTypes;
+
+const
+ BackSpace = #8;
+ Tab = #9;
+ LF = #10; //Line Feed
+ CR = #13; //Carriage Return
+ Space = #32;
+ EOLChars = [CR, LF];
+{$IFNDEF VER140}
+ sLineBreak = #13#10;
+ SwitchChars = ['/', '-'];
+{$ENDIF}
+ EOL = sLineBreak;
+ MaxCard = High(Cardinal);
+ AllChars = [#0..#255];
+ Alphabetical = ['A'..'Z', 'a'..'z'];
+ DecimalChars = ['0'..'9'];
+ AlphaNumerical = Alphabetical + DecimalChars;
+ StrangeChars = [#0..#31, #127, #129, #141..#144, #157, #158];
+
+ HexadecimalChars = DecimalChars + ['A'..'F', 'a'..'f'];
+ OctalChars = ['0'..'7'];
+ BinaryChars = ['0', '1'];
+
+ QuoteChars = ['''', '"'];
+ WildCards = ['*', '?'];
+ FileNameEnemies = WildCards + ['\', '/', ':', '<', '>', '|'];
+
+ HexChar: array[THex] of Char = (
+ '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
+ LowerHexChar: array[THex] of Char = (
+ '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');
+ BaseNChar: array[TBaseN] of Char = (
+ '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H',
+ 'I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
+
+ cYcnusOverlayColor = $050001;
+
+ faFindEveryFile = faReadOnly + faHidden + faSysFile + faArchive;
+
+ platWin9x = [VER_PLATFORM_WIN32s, VER_PLATFORM_WIN32_WINDOWS];
+
+
+{ Debugging }
+procedure ClearReport(const ReportName: string);
+procedure Report(const ReportName, Text: string);
+procedure ReportFmt(const ReportName, Fmt: string; const Args: array of const);
+
+{ Params }
+procedure GetParams(Strings: TStrings); overload;
+function GetParams(const Separator: string = ' '): string; overload;
+
+function ParamNum(const S: string): Integer;
+function ParamPrefixNum(const Prefix: string): Integer;
+function Param(const S: string): Boolean;
+function ParamPrefix(const Prefix: string): Boolean;
+
+function Switch(const Switch: string; const PrefixChars: TCharSet = SwitchChars;
+ IgnoreCase: Boolean = True): Boolean;
+function GetParam(const Prefix: string = ''; const Default: string = ''): string;
+
+{ Dirs & UserName}
+function GetMyDir(FullPath: Boolean = False): string;
+function WinDir: string;
+function SysDir: string;
+function UserName: string;
+
+{ Strings & Chars}
+function FirstChar(const S: string): Char;
+function LastChar(const S: string): Char;
+
+function CharPos(C: Char; const S: string; Offset: Integer = 1): Integer; overload;
+function CharPos(C: TCharSet; const S: string; Offset: Integer = 1): Integer; overload;
+function CharPosR(C: Char; const S: string; Offset: Integer = -1): Integer;
+function PosEx(const SubStr, S: string; Offset: Integer = 1): Integer;
+function PosExText(const SubStr, S: string; Offset: Integer = 1): Integer;
+function PosExAnsiText(const SubStr, S: string; Offset: Integer = 1): Integer;
+
+function UntilChar(const S: string; Brake: Char): string; overload;
+function UntilChar(const S: string; Brake: TCharSet): string; overload;
+function UntilLastChar(const S: string; Brake: Char;
+ IgnoreNoBrake: Boolean = True): string;
+
+function FromChar(const S: string; Brake: Char): string; overload;
+function FromChar(const S: string; Brake: TCharSet): string; overload;
+function FromLastChar(const S: string; Brake: Char;
+ IgnoreNoBrake: Boolean = False): string;
+
+function BetweenChars(const S: string; Start, Finish: Char;
+ Inclusive: Boolean = False): string;
+
+function UntilStr(const S: string; Brake: string): string;
+function FromStr(const S: string; Brake: string): string;
+
+function StringWrap(const S: string; Width: Integer; const LineEnd: string = EOL): string;
+
+{ Splitting & Combining }
+function Split(const S, Separator: string; IgnoreMultiSep: Boolean = True;
+ MinCount: Integer = 0): TStrA; overload;
+procedure Split(const S, Separator: string; Strings: TStrings;
+ IgnoreMultiSep: Boolean = True); overload;
+function Split(const S: string; Separators: TCharSet;
+ IgnoreMultiSep: Boolean = True; MinCount: Integer = 0): TStrA; overload;
+
+procedure TileStr(const S: string; BrakeStart: Integer; BrakeEnd: Integer;
+ out Left, Right: string);
+
+function Join(Strings: TStrings; Separator: string = ' '): string; overload;
+function Join(StrA: TStrA; Separator: string = ' '): string; overload;
+
+function MulStr(const S: string; Count: Integer): string;
+
+{ Strings ausrichten }
+function AlignR(const S: string; Width: Integer; Filler: Char = ' '): string;
+function MaxStr(const S: string; MaxLen: Integer): string;
+
+{ Stringing }
+function TrimAll(const S: string): string;
+
+function ControlChar(C: Char): Boolean;
+function FriendlyChar(C: Char): Char;
+
+function FriendlyStr(const S: string): string; overload;
+function FriendlyStr(a: TByteA): string; overload;
+
+function Quote(const S: string; Quoter: Char = '"'): string;
+function UnQuote(const S: string): string;
+function DeQuote(const S: string): string;
+
+function StrNumerus(const Value: Integer; const Singular, Plural: string;
+ const Zero: string = '0'): string;
+
+function MakeStr(const Items: array of const; Separator: string = ''): string;
+procedure ShowText(const Items: array of const; Separator: string = '');
+
+{ Delete }
+function DeleteChars(const S: string; C: Char): string; overload;
+function DeleteChars(const S: string; C: TCharSet): string; overload;
+function ExtractChars(const S: string; C: TCharSet): string;
+
+{ Find }
+function CharCount(const S: string; C: Char): Integer;
+
+function CharIn(const S: string; C: Char): Boolean; overload;
+function CharIn(const S: string; C: TCharSet): Boolean; overload;
+
+function StrAtPos(const S: string; Pos: Integer; const Str: string): Boolean;
+function StrAtBegin(const S, Str: string): Boolean;
+function StrIn(const S, SubStr: string): Boolean; overload;
+function StrIn(A: TStrA; const S: string): Boolean; overload;
+function StrIn(SL: TStrings; const S: string): Boolean; overload;
+function StrIndex(A: TStrA; const S: string): Integer; overload;
+function StrIndex(SL: TStrings; const S: string): Integer; overload;
+
+function TextAtPos(const S: string; Pos: Integer; const Text: string): Boolean;
+function TextAtBegin(const S, Text: string): Boolean;
+function TextIn(const S, Text: string): Boolean; overload;
+function TextIn(A: TStrA; const Text: string): Boolean; overload;
+function TextIn(SL: TStrings; const Text: string): Boolean; overload;
+function TextIndex(A: TStrA; const Text: string): Integer; overload;
+function TextIndex(SL: TStrings; const Text: string): Integer; overload;
+
+{ Replace }
+function ReplaceChars(const S: string; Old, New: Char): string; overload;
+function ReplaceChars(const S: string; Old: TCharSet; New: Char): string; overload;
+
+function Replace(const S, Old, New: string): string;
+
+{ TStrings }
+function SLOfFile(const FileName: string): TStringList;
+function ContainsEmptyLines(SL: TStrings): Boolean;
+procedure DeleteEmptyLines(SL: TStrings);
+procedure DeleteCommentLines(SL: TStrings; const CommentSign: string = '//');
+procedure WriteSL(Strings: TStrings; const Prefix: string = '';
+ const Suffix: string = '');
+
+function FindLine(SL: TStrings; const S: string): Integer;
+
+procedure QuickSortSL(SL: TStringList);
+
+{ TStrA }
+function IncStrA(StrA: TStrA): Integer;
+
+{ TByteA }
+function StrOfByteA(a: TByteA): string;
+function ByteAOfStr(const S: string): TByteA;
+function ByteAOfInt(i: Integer): TByteA;
+function IntOfByteA(A: TByteA): Integer;
+function ByteAOfHex(const Hex: string): TByteA;
+
+function SameByteA(const A, B: TByteA): Boolean;
+function Reverse(a: TByteA): TByteA;
+function SaveByteA(Data: TByteA; const FileName: string; Overwrite: Boolean = True): Boolean;
+function LoadByteA(const FileName: string): TByteA;
+
+function Endian(i: Integer): Integer;
+
+{ Files }
+function SizeOfFile(const FileName: string): Integer;
+function FileEx(const FileName: string; AllowFolders: Boolean = False): Boolean;
+function LWPSolve(const Dir: string): string;
+function LWPSlash(const Dir: string): string;
+
+function ExtractDrive(const FileName: string): string;
+function ExtractPath(const FileName: string): string;
+function ExtractPrefix(const FileName: string): string;
+function ExtractSuffix(const FileName: string): string;
+
+function IsValidFileName(const FileName: string): Boolean;
+function MakeValidFileName(FileName: string; const Default: string = 'File'): string;
+
+{ Converting }
+function IsValidInteger(const S: string): Boolean;
+function IsValidCardinal(const S: string): Boolean;
+
+function StrOfBool(flag: Boolean; const TrueStr: string = 'True';
+ const FalseStr: string = 'False'): string;
+function StrOfInt(i: Integer): string;
+function CardOfStr(const S: string): Cardinal;
+
+function HexOrd(Hex: Char): THex;
+function ByteOfHex(Hex: THexByteStr): Byte;
+
+function DecOfHex(const Hex: string): string;
+function HexOfByte(b: Byte): THexByteStr;
+function HexOfCard(i: Cardinal): string; overload;
+function HexOfCard(i: Cardinal; Digits: Integer): string; overload;
+
+function PascalHexArray(a: TByteA; Name: string): string;
+
+function HexOfByteA(a: TByteA; Blocks: Integer = 1;
+ const Splitter: string = ' '): string;
+function BinOfByteA(a: TByteA; Blocks: Integer = 4;
+ const Splitter: string = ' '): string;
+
+function CardOfHex(Hex: string): Cardinal;
+function IntOfBin(Bin: string): Cardinal;
+
+function BinOfIntFill(n: cardinal; MinCount: Integer = 8): string;
+function BinOfInt(n: cardinal): string;
+
+function BaseNOfInt(I: Cardinal; B: TBaseN): string;
+function IntOfBaseN(V: string; B: TBaseN): Cardinal;
+
+{ Ranges }
+function KeepIn(i, Bottom, Top: Variant): Variant;
+function InRange(Value, Bottom, Top: Variant): Boolean;
+function InStrictRange(Value, Bottom, Top: Variant): Boolean;
+function Min(const A, B: Integer): Integer; overload;
+function Min(const A: TIntA): Integer; overload;
+function Max(const A, B: Integer): Integer; overload;
+function Max(const A: TIntA): Integer; overload;
+
+const
+ RangesSeparator = ',';
+ RangeInnerSeparator = '-';
+ RangeInfinite = '*';
+ RangeSpecialChars = [RangesSeparator, RangeInnerSeparator, RangeInfinite];
+
+function RangesOfStr(const S: string): TRanges;
+function InRanges(Ranges: TRanges; TestValue: Cardinal): Boolean;
+
+function Success(Res: Integer; ResultOnSuccess: Integer = ERROR_SUCCESS): Boolean;
+function Failure(Res: Integer; ResultOnSuccess: Integer = ERROR_SUCCESS): Boolean;
+
+function ExpandString(const S: string): string;
+
+{ Files }
+procedure DeleteFiles(const Mask: string; ScanSubDirs: Boolean = True;
+ Attributes: Integer = faFindEveryFile);
+procedure FileNew(const FileName: string);
+function DateTimeOfFileTime(const FileTime: TFileTime): TDateTime;
+
+{ FileNames }
+function GetFileNew(FileName: string; NoFloppyDrives: Boolean = True): string;
+
+{ Finding Files }
+function FindAll(Strings: TStrings; const Mask: string;
+ ScanSubDirs: Boolean = True; Attributes: Integer = faFindEveryFile;
+ FileReturn: TFileNameFunc = nil): Boolean;
+function FindAllFirst(const Mask: string; ScanSubDirs: Boolean = True;
+ Attributes: Integer = faFindEveryFile): string;
+
+function FullOSInfo: string;
+function Win32PlatformStr: string;
+function Win9x: Boolean;
+function WinNT: Boolean;
+function Win2000: Boolean;
+function WinXP: Boolean;
+
+var
+ MyDir: string = '';
+ LastSuccessRes: Integer = 0;
+
+{ Backward compatibility }
+{$IFNDEF VER130}
+function SameText(const S1, S2: string): Boolean;
+{$ENDIF}
+
+implementation
+{$IFNDEF VER140}
+uses FileCtrl;
+{$ENDIF}
+
+{$IFNDEF VER130}
+function SameText(const S1, S2: string): Boolean;
+begin
+ Result := CompareText(S1, S2) = 0;
+end;
+{$ENDIF}
+
+procedure Report(const ReportName, Text: string);
+var
+ F: TextFile;
+ FileName: string;
+begin
+ FileName := MyDir + ReportName + '.rep';
+ Assign(F, FileName);
+ try
+ if not FileExists(FileName) then
+ Rewrite(F)
+ else
+ Append(F);
+ WriteLn(F, Text);
+ finally
+ Close(F);
+ end;
+end;
+
+procedure ClearReport(const ReportName: string);
+var
+ FileName: string;
+begin
+ FileName := MyDir + ReportName + '.rep';
+ DeleteFile(FileName);
+end;
+
+procedure ReportFmt(const ReportName, Fmt: string; const Args: array of const);
+begin
+ Report(ReportName, Format(Fmt, Args));
+end;
+
+procedure GetParams(Strings: TStrings);
+var
+ P: PChar;
+ Param: string;
+
+ function GetParamStr(var P: PChar; var Param: string): Boolean;
+ var
+ Quoted: Boolean;
+ begin
+ Param := '';
+
+ repeat
+ while (P[0] <> #0) and (P[0] <= ' ') do
+ Inc(P);
+
+ Quoted := False;
+ while P[0] <> #0 do begin
+ if P[0] = '"' then begin
+ Quoted := not Quoted;
+ Inc(P);
+ Continue; end;
+ if (P[0] <= ' ') and not Quoted then
+ Break;
+ Param := Param + P[0];
+ Inc(P);
+ end;
+ until (Param <> '') or (P[0] = #0);
+
+ Result := Param <> '';
+ end;
+
+begin
+ Strings.Clear;
+ P := GetCommandLine;
+ GetParamStr(P, Param);
+ while GetParamStr(P, Param) do
+ Strings.Add(Param);
+end;
+
+function GetParams(const Separator: string = ' '): string;
+var
+ SL: TStringList;
+begin
+ SL := TStringList.Create;
+ GetParams(SL);
+ Result := Join(SL, Separator);
+ SL.Free;
+end;
+
+function Switch(const Switch: string; const PrefixChars: TCharSet = SwitchChars;
+ IgnoreCase: Boolean = True): Boolean;
+//= SysUtils.FindCmdLineSwitch
+var
+ i: Integer;
+ s: string;
+begin
+ Result := True;
+
+ for i := 1 to ParamCount do begin
+ s := ParamStr(i);
+
+ if (s <> '') and (s[1] in PrefixChars) then begin
+ //i know that always s <> '', but this is saver
+ s := Copy(s, 2, MaxInt);
+ if (s = Switch) or (IgnoreCase and (0=AnsiCompareText(s, Switch))) then
+ Exit;
+ end;
+ end;
+
+ Result := False;
+end;
+
+function ParamNum(const S: string): Integer;
+begin
+ for Result := 1 to ParamCount do
+ if 0=AnsiCompareText(ParamStr(Result), S) then
+ Exit;
+
+ Result := 0;
+end;
+
+function ParamPrefixNum(const Prefix: string): Integer;
+var
+ Len: Integer;
+begin
+ Len := Length(Prefix);
+ for Result := 1 to ParamCount do
+ if 0=AnsiCompareText(Copy(ParamStr(Result), 1, Len), Prefix) then
+ Exit;
+
+ Result := 0;
+end;
+
+function Param(const S: string): Boolean;
+begin
+ Result := ParamNum(S) > 0;
+end;
+
+function ParamPrefix(const Prefix: string): Boolean;
+begin
+ Result := ParamPrefixNum(Prefix) > 0;
+end;
+
+function GetParam(const Prefix: string = ''; const Default: string = ''): string;
+var
+ i: Integer;
+begin
+ Result := Default;
+
+ if Prefix = '' then begin
+ Result := ParamStr(1);
+ Exit; end;
+
+ i := ParamPrefixNum(Prefix);
+ if i > 0 then
+ Result := Copy(ParamStr(i), Length(Prefix) + 1, MaxInt);
+end;
+
+function GetMyDir(FullPath: Boolean = False): string;
+var
+ Buffer: array[0..260] of Char;
+begin
+ Result := '';
+ SetString(Result, Buffer, GetModuleFileName(0, Buffer, SizeOf(Buffer)));
+ if FullPath then
+ Result := GetFileNew(Result);
+ Result := ExtractPath(Result);
+end;
+
+function WinDir: string;
+var
+ Res: PChar;
+begin
+ Result := '\';
+ GetMem(Res, MAX_PATH);
+ GetWindowsDirectory(Res, MAX_PATH);
+ Result := Res + '\';
+ FreeMem(Res, MAX_PATH);
+end;
+
+function SysDir: string;
+var
+ Res: PChar;
+begin
+ Result := '\';
+ GetMem(Res, MAX_PATH);
+ GetSystemDirectory(Res, MAX_PATH);
+ Result := Res + '\';
+ FreeMem(Res, MAX_PATH);
+end;
+
+function UserName: string;
+var
+ Len: Cardinal;
+ Res: PChar;
+begin
+ Result := '';
+ GetMem(Res, MAX_PATH);
+ Len := MAX_PATH;
+ GetUserName(Res, Len);
+ Result := Res;
+ FreeMem(Res, MAX_PATH);
+end;
+
+function FirstChar(const S: string): Char;
+begin
+ if s = '' then
+ Result := #0
+ else
+ Result := s[1];
+end;
+
+function LastChar(const S: string): Char;
+begin
+ if s = '' then
+ Result := #0
+ else
+ Result := s[Length(s)];
+end;
+
+function CharPos(C: Char; const S: string; Offset: Integer = 1): Integer;
+var
+ MaxPosToSearch: Integer;
+begin
+ Result := Offset;
+ MaxPosToSearch := Length(S);
+
+ while Result <= MaxPosToSearch do begin
+ if S[Result] = C then
+ Exit;
+ Inc(Result);
+ end;
+
+ Result := 0;
+end;
+
+function CharPos(C: TCharSet; const S: string; Offset: Integer = 1): Integer;
+var
+ MaxPosToSearch: Integer;
+begin
+ Result := Offset;
+ MaxPosToSearch := Length(S);
+
+ while Result <= MaxPosToSearch do begin
+ if S[Result] in C then
+ Exit;
+ Inc(Result);
+ end;
+
+ Result := 0;
+end;
+
+function CharPosR(C: Char; const S: string; Offset: Integer = -1): Integer;
+begin
+ if Offset < 0 then
+ Result := Length(S) + 1 - Offset
+ else
+ Result := Offset;
+ if Result > Length(S) then
+ Result := Length(S);
+
+ while Result > 0 do begin
+ if S[Result] = C then
+ Exit;
+ Dec(Result);
+ end;
+end;
+
+function PosEx(const SubStr, S: string; Offset: Integer = 1): Integer;
+var
+ MaxPosToSearch, LenSubStr, i: Integer;
+begin
+ if SubStr = '' then begin
+ Result := 0;
+ Exit; end;
+
+ if Offset < 1 then
+ Result := 1
+ else
+ Result := Offset;
+
+ LenSubStr := Length(SubStr);
+ MaxPosToSearch := Length(S) - LenSubStr + 1;
+
+ while Result <= MaxPosToSearch do begin
+ if S[Result] = SubStr[1] then begin
+ i := 1;
+
+ while (i < LenSubStr)
+ and (S[Result + i] = SubStr[i + 1]) do
+ Inc(i);
+
+ if i = LenSubStr then
+ Exit;
+ end;
+ Inc(Result);
+ end;
+
+ Result := 0;
+end;
+
+function PosExText(const SubStr, S: string; Offset: Integer = 1): Integer;
+var
+ MaxPosToSearch, LenSubStr, i: Integer;
+
+ function SameChar(a, b: Char): Boolean;
+ begin
+ Result := UpCase(a) = UpCase(b)
+ end;
+
+begin
+ if SubStr = '' then begin
+ Result := 0;
+ Exit; end;
+
+ if Offset < 1 then
+ Result := 1
+ else
+ Result := Offset;
+
+ LenSubStr := Length(SubStr);
+ MaxPosToSearch := Length(S) - LenSubStr + 1;
+
+ while Result <= MaxPosToSearch do begin
+ if SameChar(S[Result], SubStr[1]) then begin
+ i := 1;
+
+ while (i < LenSubStr)
+ and (SameChar(S[Result + i], SubStr[i + 1])) do
+ Inc(i);
+
+ if i = LenSubStr then
+ Exit;
+ end;
+ Inc(Result);
+ end;
+
+ Result := 0;
+end;
+
+function PosExAnsiText(const SubStr, S: string; Offset: Integer = 1): Integer;
+var
+ MaxPosToSearch, LenSubStr, i: Integer;
+
+ function SameChar(a, b: Char): Boolean;
+ begin
+ Result := CharLower(PChar(a)) = CharLower(PChar(b));
+ end;
+
+begin
+ if SubStr = '' then begin
+ Result := 0;
+ Exit; end;
+
+ if Offset < 1 then
+ Result := 1
+ else
+ Result := Offset;
+
+ LenSubStr := Length(SubStr);
+ MaxPosToSearch := Length(S) - LenSubStr + 1;
+
+ while Result <= MaxPosToSearch do begin
+ if SameChar(S[Result], SubStr[1]) then begin
+ i := 1;
+
+ while (i < LenSubStr)
+ and (SameChar(S[Result + i], SubStr[i + 1])) do
+ Inc(i);
+
+ if i = LenSubStr then
+ Exit;
+ end;
+ Inc(Result);
+ end;
+
+ Result := 0;
+end;
+
+function UntilChar(const S: string; Brake: Char): string;
+var
+ p: Integer;
+begin
+ p := CharPos(Brake, S);
+
+ if p > 0 then
+ Result := Copy(S, 1, p - 1)
+ else
+ Result := S;
+end;
+
+function UntilChar(const S: string; Brake: TCharSet): string;
+var
+ p: Integer;
+begin
+ Result := '';
+ p := CharPos(Brake, S);
+
+ if p > 0 then
+ Result := Copy(S, 1, p - 1)
+ else
+ Result := S;
+end;
+
+function UntilLastChar(const S: string; Brake: Char;
+ IgnoreNoBrake: Boolean = True): string;
+var
+ p: Integer;
+begin
+ Result := '';
+ p := CharPosR(Brake, S);
+
+ if p > 0 then
+ Result := Copy(S, 1, p - 1)
+ else if IgnoreNoBrake then
+ Result := S;
+end;
+
+function FromChar(const S: string; Brake: Char): string;
+var
+ p: Integer;
+begin
+ Result := '';
+ p := CharPos(Brake, S);
+
+ if p > 0 then
+ Result := Copy(S, p + 1, Length(S) - p);
+end;
+
+function FromChar(const S: string; Brake: TCharSet): string;
+var
+ p: Integer;
+begin
+ Result := '';
+ p := CharPos(Brake, S);
+
+ if p > 0 then
+ Result := Copy(S, p + 1, Length(S) - p);
+end;
+
+function FromLastChar(const S: string; Brake: Char;
+ IgnoreNoBrake: Boolean = False): string;
+var
+ p: Integer;
+begin
+ Result := '';
+ p := CharPosR(Brake, S);
+
+ if p > 0 then
+ Result := Copy(S, p + 1, Length(S) - p)
+ else if IgnoreNoBrake then
+ Result := S;
+end;
+
+function BetweenChars(const S: string; Start, Finish: Char;
+ Inclusive: Boolean = False): string;
+var
+ p, fin: Integer;
+begin
+ Result := '';
+
+ p := CharPos(Start, S);
+ if p = 0 then
+ Exit;
+
+ fin := CharPos(Finish, S, p + 1);
+ if fin = 0 then
+ Exit;
+
+ if not Inclusive then begin
+ Inc(p);
+ Dec(fin);
+ end;
+
+ Result := Copy(S, p, fin - p + 1);
+end;
+
+function UntilStr(const S: string; Brake: string): string;
+var
+ p: Integer;
+begin
+ if Length(Brake) = 1 then begin
+ Result := UntilChar(S, Brake[1]);
+ Exit; end;
+
+ p := PosEx(Brake, S);
+
+ if p > 0 then
+ Result := Copy(S, 1, p - 1)
+ else
+ Result := S;
+end;
+
+function FromStr(const S: string; Brake: string): string;
+var
+ p: Integer;
+begin
+ if Length(Brake) = 1 then begin
+ Result := FromChar(S, Brake[1]);
+ Exit; end;
+
+ Result := '';
+ p := PosEx(Brake, s);
+
+ if p > 0 then begin
+ Inc(p, Length(Brake));
+ Result := Copy(S, p, Length(S) - p + 1);
+ end;
+end;
+
+function StringWrap(const S: string; Width: Integer; const LineEnd: string = EOL): string;
+var
+ i: Integer;
+begin
+ Result := '';
+ if (S = '') or (Width < 1) then
+ Exit;
+
+ i := 1;
+ while True do begin
+ Result := Result + Copy(S, i, Width);
+ Inc(i, Width);
+ if i <= Length(S) then
+ Result := Result + LineEnd
+ else
+ Exit;
+ end;
+end;
+
+function Split(const S, Separator: string; IgnoreMultiSep: Boolean = True;
+ MinCount: Integer = 0): TStrA;
+var
+ p, fin, SepLen: Integer;
+
+ procedure Add(const S: string);
+ begin
+ if IgnoreMultiSep and (S = '') then
+ Exit;
+ SetLength(Result, Length(Result) + 1);
+ Result[High(Result)] := S;
+ end;
+
+begin
+ if S = '' then begin
+ if Length(Result) < MinCount then
+ SetLength(Result, MinCount);
+ Exit; end;
+
+ Result := nil;
+ SepLen := Length(Separator);
+
+ p := 1;
+ fin := PosEx(Separator, S);
+ while fin > 0 do begin
+ Add(Copy(S, p, fin - p));
+ p := fin + SepLen;
+ fin := PosEx(Separator, S, p);
+ end;
+ Add(Copy(S, p, Length(S) - p + 1));
+
+ if Length(Result) < MinCount then
+ SetLength(Result, MinCount);
+end;
+
+procedure Split(const S, Separator: string; Strings: TStrings;
+ IgnoreMultiSep: Boolean = True);
+var
+ p, fin, SepLen: Integer;
+
+ procedure Add(const S: string);
+ begin
+ if IgnoreMultiSep and (S = '') then
+ Exit;
+ Strings.Add(S);
+ end;
+
+begin
+ if S = '' then
+ Exit;
+
+ Strings.BeginUpdate;
+ SepLen := Length(Separator);
+ p := 1;
+ fin := PosEx(Separator, S);
+ while fin > 0 do begin
+ Add(Copy(S, p, fin - p));
+ p := fin + SepLen;
+ fin := PosEx(Separator, S, p);
+ end;
+ Add(Copy(S, p, Length(S) - p + 1));
+ Strings.EndUpdate;
+end;
+
+function Split(const S: string; Separators: TCharSet;
+ IgnoreMultiSep: Boolean = True; MinCount: Integer = 0): TStrA;
+var
+ p, fin: Integer;
+
+ procedure Add(const S: string);
+ begin
+ if IgnoreMultiSep and (S = '') then
+ Exit;
+ SetLength(Result, Length(Result) + 1);
+ Result[High(Result)] := S;
+ end;
+
+begin
+ if S = '' then begin
+ if Length(Result) < MinCount then
+ SetLength(Result, MinCount);
+ Exit; end;
+
+ Result := nil;
+
+ p := 1;
+ fin := CharPos(Separators, S);
+ while fin > 0 do begin
+ Add(Copy(S, p, fin - p));
+ p := fin + 1;
+ fin := CharPos(Separators, S, p);
+ end;
+ Add(Copy(S, p, Length(S) - p + 1));
+
+ if Length(Result) < MinCount then
+ SetLength(Result, MinCount);
+end;
+
+procedure TileStr(const S: string; BrakeStart: Integer; BrakeEnd: Integer;
+ out Left, Right: string);
+begin
+ Left := Copy(S, 1, BrakeStart-1);
+ Right := Copy(S, BrakeEnd + 1, MaxInt);
+end;
+
+function Join(Strings: TStrings; Separator: string = ' '): string;
+var
+ i, imax: Integer;
+begin
+ Result := '';
+ imax := Strings.Count-1;
+ for i := 0 to imax do begin
+ Result := Result + Strings[i];
+ if i < imax then
+ Result := Result + Separator;
+ end;
+end;
+
+function Join(StrA: TStrA; Separator: string = ' '): string; overload;
+var
+ i: Integer;
+begin
+ Result := '';
+ for i := 0 to High(StrA) do begin
+ Result := Result + StrA[i];
+ if i < High(StrA) then
+ Result := Result + Separator;
+ end;
+end;
+
+function MulStr(const S: string; Count: Integer): string;
+var
+ P: PChar;
+ Len, i: Integer;
+begin
+ Result := '';
+ if Count = 0 then
+ Exit;
+
+ Len := Length(S);
+ SetLength(Result, Len * Count);
+
+ P := Pointer(Result);
+ for i := 1 to Count do begin
+ Move(Pointer(S)^, P^, Len);
+ Inc(P, Len);
+ end;
+end;
+
+function AlignR(const S: string; Width: Integer; Filler: Char = ' '): string;
+begin
+ Result := MulStr(Filler, Width - Length(S)) + S;
+end;
+
+function MaxStr(const S: string; MaxLen: Integer): string;
+var
+ Len: Integer;
+begin
+ Len := Length(S);
+ if Len <= MaxLen then begin
+ Result := S;
+ Exit end;
+
+ Result := Copy(S, 1, MaxLen - 3) + '...';
+end;
+
+function TrimAll(const S: string): string;
+var
+ i: Integer;
+begin
+ for i := 1 to Length(S) do
+ if S[i] > #32 then
+ Result := Result + S[i];
+end;
+
+function ControlChar(C: Char): Boolean;
+begin
+ Result := C in StrangeChars;
+end;
+
+function FriendlyChar(C: Char): Char;
+begin
+ case C of
+ #0: Result := '.';
+ #1..#31: Result := '?';
+ #255: Result := '#';
+ else
+ Result := C;
+ end;
+end;
+
+function FriendlyStr(const S: string): string;
+var
+ i: Integer;
+begin
+ SetLength(Result, Length(S));
+ for i := 1 to Length(S) do
+ Result[i] := FriendlyChar(S[i]);
+end;
+
+function FriendlyStr(a: TByteA): string;
+var
+ i: Integer;
+begin
+ SetLength(Result, Length(a));
+ for i := 0 to High(a) do
+ Result[i + 1] := FriendlyChar(Char(a[i]));
+end;
+
+function Quote(const S: string; Quoter: Char = '"'): string;
+begin
+ Result := S;
+
+ if FirstChar(S) <> Quoter then
+ Result := Quoter + Result;
+
+ if LastChar(S) <> Quoter then
+ Result := Result + Quoter;
+end;
+
+function DeQuote(const S: string): string;
+begin
+ Result := '';
+ if Length(S) > 2 then
+ Result := Copy(S, 2, Length(S) - 2);
+end;
+
+function UnQuote(const S: string): string;
+var
+ Start, Len: Integer;
+begin
+ Start := 1;
+ Len := Length(S);
+
+ if (S <> '') and (S[1] in ([#0..#32] + QuoteChars)) then begin
+ if (LastChar(S) = S[1]) then
+ Dec(Len);
+ Inc(Start);
+ end;
+
+ Result := Copy(S, Start, Len - Start + 1);
+end;
+
+function StrNumerus(const Value: Integer; const Singular, Plural: string;
+ const Zero: string = '0'): string;
+begin
+ if Abs(Value) = 1 then
+ Result := IntToStr(Value) + ' ' + Singular
+ else if Value = 0 then
+ Result := Zero + ' ' + Plural
+ else
+ Result := IntToStr(Value) + ' ' + Plural;
+end;
+
+function MakeStr(const Items: array of const; Separator: string = ''): string;
+const
+ BoolStrings: array[Boolean] of string = ('False', 'True');
+
+var
+ i: Integer;
+
+ function StrOfP(P: Pointer): string;
+ begin
+ if P = nil then
+ Result := '[nil]'
+ else
+ Result := '[' + IntToStr(Cardinal(P)) + ']';
+ end;
+
+ procedure Add(const S: string);
+ begin
+ Result := Result + s + Separator;
+ end;
+
+begin
+ Result := '';
+ for i := 0 to High(Items) do
+ with Items[i] do
+ case VType of
+ vtString: Add(VString^);
+ vtInteger: Add(IntToStr(VInteger));
+ vtBoolean: Add(BoolStrings[VBoolean]);
+ vtChar: Add(VChar);
+ vtPChar: Add(VPChar);
+ vtExtended: Add(FloatToStr(VExtended^));
+ vtObject: if VObject is TComponent then
+ Add(TComponent(VObject).Name)
+ else
+ Add(VObject.ClassName);
+ vtClass: Add(VClass.ClassName);
+ vtAnsiString: Add(string(VAnsiString));
+ vtCurrency: Add(CurrToStr(VCurrency^));
+ vtInt64: Add(IntToStr(VInt64^));
+ vtVariant: Add(string(VVariant^));
+
+ vtWideChar: Add(VWideChar);
+ vtPWideChar: Add(VPWideChar);
+ vtInterface: Add(StrOfP(VInterface));
+ vtPointer: Add(StrOfP(VPointer));
+ vtWideString: Add(WideString(VWideString));
+ end;
+ if Result <> '' then
+ SetLength(result, Length(Result) - Length(Separator));
+end;
+
+procedure ShowText(const Items: array of const; Separator: string = '');
+var
+ Text: string;
+begin
+ Text := MakeStr(Items, Separator);
+
+ MessageBox(0, PChar(Text), 'Info', MB_OK and MB_APPLMODAL);
+end;
+
+function DeleteChars(const S: string; C: Char): string;
+var
+ i: Integer;
+begin
+ Result := '';
+ for i := 1 to Length(S) do
+ if S[i] <> C then
+ Result := Result + S[i];
+end;
+
+function DeleteChars(const S: string; C: TCharSet): string;
+var
+ i: Integer;
+begin
+ Result := '';
+ for i := 1 to Length(S) do
+ if not (S[i] in C) then
+ Result := Result + S[i];
+end;
+
+function ExtractChars(const S: string; C: TCharSet): string;
+var
+ i: Integer;
+begin
+ Result := '';
+ for i := 1 to Length(S) do
+ if S[i] in C then
+ Result := Result + S[i];
+end;
+
+function CharCount(const S: string; C: Char): Integer;
+var
+ i: Integer;
+begin
+ Result := 0;
+ for i := 1 to Length(S) do
+ if S[i] = C then
+ Inc(Result);
+end;
+
+function StrAtPos(const S: string; Pos: Integer; const Str: string): Boolean;
+begin
+ Result := (Str <> '') and (Str = Copy(S, Pos, Length(Str)));
+end;
+
+function TextAtPos(const S: string; Pos: Integer; const Text: string): Boolean;
+begin
+ Result := (Text <> '') and SameText(Text, Copy(S, Pos, Length(Text)));
+end;
+
+function StrAtBegin(const S, Str: string): Boolean;
+begin
+ Result := StrAtPos(S, 1, Str);
+end;
+
+function TextAtBegin(const S, Text: string): Boolean;
+begin
+ Result := TextAtPos(S, 1, Text);
+end;
+
+function CharIn(const S: string; C: Char): Boolean;
+var
+ i: Integer;
+begin
+ Result := True;
+ for i := 1 to Length(S) do
+ if S[i] = C then Exit;
+ Result := False;
+end;
+
+function CharIn(const S: string; C: TCharSet): Boolean;
+var
+ i: Integer;
+begin
+ Result := False;
+ for i := 1 to Length(S) do begin
+ Result := S[i] in C;
+ if Result then
+ Exit;
+ end;
+end;
+
+function StrIn(const S, SubStr: string): Boolean;
+begin
+ Result := PosEx(SubStr, S) > 0;
+end;
+
+function StrIn(SL: TStrings; const S: string): Boolean;
+var
+ i: Integer;
+begin
+ Result := False;
+ for i := 0 to SL.Count-1 do begin
+ Result := (S = SL[i]);
+ if Result then
+ Exit;
+ end;
+end;
+
+function StrIn(A: TStrA; const S: string): Boolean;
+var
+ i: Integer;
+begin
+ Result := False;
+ for i := Low(A) to High(A) do begin
+ Result := (S = A[i]);
+ if Result then
+ Exit;
+ end;
+end;
+
+function TextIn(const S, Text: string): Boolean;
+begin
+ Result := PosExText(Text, S) > 0;
+end;
+
+function TextIn(SL: TStrings; const Text: string): Boolean;
+var
+ i: Integer;
+begin
+ Result := False;
+ for i := 0 to SL.Count-1 do begin
+ Result := SameText(Text, SL[i]);
+ if Result then
+ Exit;
+ end;
+end;
+
+function TextIn(A: TStrA; const Text: string): Boolean;
+var
+ i: Integer;
+begin
+ Result := False;
+ for i := Low(A) to High(A) do begin
+ Result := SameText(Text, A[i]);
+ if Result then
+ Exit;
+ end;
+end;
+
+function StrIndex(SL: TStrings; const S: string): Integer;
+begin
+ for Result := 0 to SL.Count-1 do
+ if S = SL[Result] then
+ Exit;
+ Result := -1;
+end;
+
+function StrIndex(A: TStrA; const S: string): Integer;
+begin
+ for Result := Low(A) to High(A) do
+ if S = A[Result] then
+ Exit;
+ Result := -1;
+end;
+
+function TextIndex(SL: TStrings; const Text: string): Integer;
+begin
+ for Result := 0 to SL.Count-1 do
+ if SameText(Text, SL[Result]) then
+ Exit;
+ Result := -1;
+end;
+
+function TextIndex(A: TStrA; const Text: string): Integer;
+begin
+ for Result := Low(A) to High(A) do
+ if SameText(Text, A[Result]) then
+ Exit;
+ Result := -1;
+end;
+
+function ReplaceChars(const S: string; Old, New: Char): string;
+var
+ i: Integer;
+begin
+ Result := S;
+ for i := 1 to Length(Result) do
+ if Result[i] = Old then
+ Result[i] := New;
+end;
+
+function ReplaceChars(const S: string; Old: TCharSet; New: Char): string;
+var
+ i: Integer;
+begin
+ Result := S;
+ for i := 1 to Length(Result) do
+ if Result[i] in Old then
+ Result[i] := New;
+end;
+
+function Replace(const S, Old, New: string): string;
+var
+ oldp, ps: Integer;
+begin
+ ps := 1;
+ Result := '';
+ while True do begin
+ oldp := ps;
+ ps := PosEx(Old, S, oldp);
+ if ps = 0 then begin
+ Result := Result + Copy(S, oldp, Length(S) - oldp + 1);
+ Exit; end;
+ Result := Result + Copy(S, oldp, ps - oldp) + New;
+ Inc(ps, Length(Old));
+ end;
+end;
+
+function SLOfFile(const FileName: string): TStringList;
+begin
+ Result := TStringList.Create;
+ if FileExists(FileName) then
+ Result.LoadFromFile(FileName);
+end;
+
+function ContainsEmptyLines(SL: TStrings): Boolean;
+begin
+ Result := StrIn(SL, '');
+end;
+
+procedure DeleteEmptyLines(SL: TStrings);
+var
+ i: Integer;
+begin
+ i := 0;
+ while i < SL.Count do begin
+ if SL[i] = '' then
+ SL.Delete(i)
+ else
+ Inc(i);
+ end;
+end;
+
+procedure DeleteCommentLines(SL: TStrings; const CommentSign: string = '//');
+var
+ i: Integer;
+begin
+ i := 0;
+ while i < SL.Count do begin
+ if (SL[i] = '') or (StrAtBegin(TrimLeft(SL[i]), CommentSign)) then
+ SL.Delete(i)
+ else
+ Inc(i);
+ end;
+end;
+
+function FindLine(SL: TStrings; const S: string): Integer;
+begin
+ for Result := 0 to SL.Count-1 do
+ if TextAtBegin(SL[Result], S) then
+ Exit;
+ Result := -1;
+end;
+
+procedure QuickSortSL(SL: TStringList);
+
+ procedure Sort(l, r: Integer);
+ var
+ i,j: Integer;
+ z,x: string;
+ begin
+ i := l;
+ j := r;
+ x := SL[(j + i) div 2];
+ repeat
+ while SL[i] < x do Inc(i);
+ while SL[j] > x do Dec(j);
+ if i <= j then begin
+ z := SL[i];
+ SL[i] := SL[j];
+ SL[j] := z;
+ Inc(i); Dec(j);
+ end;
+ until i > j;
+ if j > l then Sort(l, j);
+ if i < r then Sort(i, r);
+ end;
+
+begin
+ if SL.Count > 0 then
+ Sort(0, SL.Count-1);
+end;
+
+function IncStrA(StrA: TStrA): Integer;
+begin
+ SetLength(StrA, Length(StrA) + 1);
+ Result := High(StrA);
+end;
+
+function StrOfByteA(a: TByteA): string;
+begin
+ Result := string(Copy(a, 0, Length(a)));
+end;
+
+function ByteAOfStr(const S: string): TByteA;
+begin
+ Result := TByteA(Copy(S, 1, Length(s)));
+end;
+
+function ByteAOfInt(i: Integer): TByteA;
+begin
+ SetLength(Result, SizeOf(Integer));
+ Move(i, Pointer(Result)^, SizeOf(Integer));
+end;
+
+function IntOfByteA(A: TByteA): Integer;
+begin
+ Result := 0;
+ Move(Pointer(A)^, Result, Min(Length(A), SizeOf(Integer)));
+end;
+
+function ByteAOfHex(const Hex: string): TByteA;
+var
+ i: Integer;
+ h: string;
+begin
+ h := ExtractChars(Hex, HexadecimalChars);
+ SetLength(Result, Length(h) div 2);
+ for i := 0 to High(Result) do
+ Result[i] := ByteOfHex(Copy(h, (i shl 1) + 1, 2));
+end;
+
+function SizeOfFile(const FileName: string): Integer;
+var
+ F: file;
+begin
+ AssignFile(F, FileName);
+ {$I-}Reset(F, 1);{$I+}
+ if IOResult = 0 then begin
+ Result := FileSize(F);
+ CloseFile(F);
+ end else
+ Result := 0;
+end;
+
+function FileEx(const FileName: string; AllowFolders: Boolean = False): Boolean;
+var
+ FindData: TWin32FindData;
+begin
+ if FileName = '' then begin
+ Result := False;
+ Exit; end;
+
+ Result := (AllowFolders and DirectoryExists(FileName)) or
+ (FindFirstFile(PChar(FileName), FindData) <> INVALID_HANDLE_VALUE);
+ Result := Result and not CharIn(FileName, WildCards);
+ Result := Result and (AllowFolders
+ or ((FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0));
+end;
+
+function LWPSolve(const Dir: string): string;
+begin
+ if (Dir <> '') and (Dir[Length(Dir)] = '\') then begin
+ Result := Copy(Dir, 1, Length(Dir) - 1);
+ end else
+ Result := Dir;
+end;
+
+function LWPSlash(const Dir: string): string;
+begin
+ if (Dir <> '') and (Dir[Length(Dir)] = '\') then begin
+ Result := Copy(Dir, 1, Length(Dir));
+ end else
+ Result := Dir + '\';
+end;
+
+function ExtractDrive(const FileName: string): string;
+begin
+ Result := '';
+ if (Length(FileName) >= 2) and (FileName[2] = ':') then
+ Result := UpperCase(FileName[1] + ':\');
+end;
+
+function ExtractPath(const FileName: string): string;
+var
+ p: Integer;
+begin
+ p := CharPosR('\', FileName);
+ if P > 0 then
+ Result := Copy(FileName, 1, p)
+ else
+ Result := FileName;
+end;
+
+function ExtractPrefix(const FileName: string): string;
+begin
+ Result := UntilLastChar(ExtractFileName(FileName), '.');
+end;
+
+function ExtractSuffix(const FileName: string): string;
+begin
+ Result := FromLastChar(ExtractFileName(FileName), '.');
+end;
+
+function SameByteA(const A, B: TByteA): Boolean;
+begin
+ Result := (A = B) or ((Length(A) = Length(B)) and CompareMem(A, B, Length(A)));
+end;
+
+function Reverse(A: TByteA): TByteA;
+var
+ i: Integer;
+begin
+ SetLength(Result, Length(A));
+
+ for i := 0 to High(A) do
+ Result[High(Result) - i] := A[i];
+end;
+
+function Endian(i: Integer): Integer;
+type
+ EndianArray = packed array[0..3] of Byte;
+var
+ a, b: EndianArray;
+begin
+ a := EndianArray(i);
+ b[0] := a[3];
+ b[1] := a[2];
+ b[2] := a[1];
+ b[3] := a[0];
+ Result := Integer(b);
+end;
+
+function SaveByteA(Data: TByteA; const FileName: string;
+ Overwrite: Boolean = True): Boolean;
+var
+ F: file;
+begin
+ if FileExists(FileName) and not Overwrite then begin
+ Result := False;
+ Exit end;
+
+ AssignFile(F, FileName);
+ {$I-}Rewrite(F, 1);{$I+}
+ if IOResult = 0 then begin
+ if Length(Data) > 0 then
+ BlockWrite(F, Data[0], Length(Data));
+ CloseFile(F);
+ Result := True;
+ end else
+ Result := False;
+end;
+
+function LoadByteA(const FileName: string): TByteA;
+var
+ F: file;
+begin
+ AssignFile(F, FileName);
+ {$I-}Reset(F, 1);{$I+}
+ if IOResult = 0 then begin
+ SetLength(Result, FileSize(F));
+ if Length(Result) > 0 then
+ BlockRead(F, Result[0], FileSize(F));
+ CloseFile(F);
+ end else
+ SetLength(Result, 0);
+end;
+
+function IsValidFileName(const FileName: string): Boolean;
+begin
+ Result := (FileName <> '') and not CharIn(FileName, FileNameEnemies)
+ and CharIn(Trim(FileName), AllChars - ['.']);
+end;
+
+function MakeValidFileName(FileName: string; const Default: string = 'File'): string;
+begin
+ if FileName = '' then
+ FileName := Default;
+
+ if CharIn(FileName, FileNameEnemies) then
+ Result := ReplaceChars(FileName, FileNameEnemies, '_')
+ else if not CharIn(Trim(FileName), AllChars - ['.']) then
+ Result := Default
+ else
+ Result := FileName;
+end;
+
+function IsValidInteger(const S: string): Boolean;
+{const
+ LowInt = '2147483648';
+ HighInt = '2147483647';
+var
+ len, RealLen, i, o: Integer;
+ c: Char;
+begin
+ Result := False;
+ if S = '' then
+ Exit;
+
+ len := Length(S);
+ o := 1;
+
+ if S[1] = '-' then begin
+ if len = 1 then
+ Exit;
+ Inc(o);
+ while (o <= len) and (S[o] = '0') do
+ Inc(o);
+ if o > len then
+ Exit;
+ if o < len then begin
+ RealLen := len - o + 1;
+ if RealLen > Length(LowInt) then
+ Exit
+ else if RealLen = Length(LowInt) then begin
+ for i := 1 to Length(LowInt) do begin
+ c := S[i + o - 1];
+ if (c < '0') or (c > LowInt[i]) then
+ Exit;
+ if c in ['0'..Char((Byte(LowInt[i])-1))] then
+ Break;
+ end;
+ Inc(o, i);
+ end;
+ end;
+ end else begin
+ while (o <= len) and (S[o] = '0') do
+ Inc(o);
+ if o <= len then begin
+ RealLen := len - o + 1;
+ if RealLen > Length(HighInt) then
+ Exit
+ else if RealLen = Length(HighInt) then begin
+ for i := 1 to Length(HighInt) do begin
+ c := S[i + o - 1];
+ if (c < '0') or (c > HighInt[i]) then
+ Exit;
+ if c in ['0'..Char((Byte(HighInt[i])-1))] then
+ Break;
+ end;
+ Inc(o, i);
+ end;
+ end;
+ end;
+
+ for i := o to len do
+ if not (S[i] in ['0'..'9']) then
+ Exit;
+
+ Result := True; }
+var
+ i: Int64;
+begin
+ i := StrToInt64Def(S, High(Int64));
+ Result := (i >= Low(Integer)) and (i <= High(Integer));
+end;
+
+function IsValidCardinal(const S: string): Boolean;
+{const
+ HighCard = '4294967295';
+var
+ len, RealLen, i, o: Integer;
+begin
+ Result := False;
+ if S = '' then
+ Exit;
+
+ len := Length(S);
+ o := 1;
+
+ while (o <= len) and (S[o] = '0') do
+ Inc(o);
+ if o <= len then begin
+ RealLen := len - o + 1;
+ if RealLen > Length(HighCard) then
+ Exit
+ else if RealLen = Length(HighCard) then begin
+ for i := 1 to Length(HighCard) do begin
+ if S[i + o - 1] > HighCard[i] then
+ Exit;
+ if S[i + o - 1] in ['0'..Char((Byte(HighCard[i])-1))] then
+ Break;
+ end;
+ Inc(o, i);
+ end;
+ end;
+
+ for i := o to len do
+ if not (S[i] in ['0'..'9']) then
+ Exit;
+
+ Result := True; }
+var
+ i: Int64;
+begin
+ i := StrToInt64Def(S, -1);
+ Result := (i >= 0) and (i <= High(Cardinal));
+end;
+
+function StrOfBool(flag: Boolean; const TrueStr: string = 'True';
+ const FalseStr: string = 'False'): string;
+begin
+ if Flag then
+ Result := TrueStr
+ else
+ Result := FalseStr;
+end;
+
+function StrOfInt(i: Integer): string;
+begin
+{ if i = 0 then begin
+ Result := '0';
+ Exit end;
+
+ while i > 0 do begin
+ Result := Char(Byte('0') + (i mod 10)) + Result;
+ i := i div 10;
+ end;}
+ Result := IntToStr(i);
+end;
+
+function CardOfStr(const S: string): Cardinal;
+var
+ Res: Int64;
+begin
+ Res := StrToInt64Def(S, -1);
+ if Res > High(Cardinal) then
+ Res := High(Cardinal)
+ else if Res < 0 then
+ Res := 0;
+ Result := Cardinal(Res);
+end;
+
+function HexOrd(Hex: Char): THex;
+begin
+ case Hex of
+ '0'..'9':
+ Result := Byte(Hex) - 48;
+ 'A'..'F':
+ Result := Byte(Hex) - 55;
+ 'a'..'f':
+ Result := Byte(Hex) - 87;
+ else
+ Result := 0;
+ end;
+end;
+
+function ByteOfHex(Hex: THexByteStr): Byte;
+begin
+ Result := (HexOrd(Hex[1]) shl 4) + HexOrd(Hex[2]);
+end;
+
+function DecOfHex(const Hex: string): string;
+begin
+ Result := IntToStr(CardOfHex(Hex));
+end;
+
+function HexOfByte(b: Byte): THexByteStr;
+begin
+ Result := HexChar[(b and $F0) shr 4]
+ + HexChar[ b and $0F ];
+end;
+
+{function HexOfCard2(c: Cardinal): string;
+var
+ Data: array[0..(1 shl 4) - 1] of Char;
+ i: Integer;
+begin
+ for i := 0 to (1 shl 4) - 1 do
+ if i < 10 then
+ Data[i] := Char(Ord('0') + i)
+ else
+ Data[i] := Char(Ord('A') + i - 10);
+
+ Result := Data[(c and (((1 shl (1 shl 2)) - 1) shl (7 shl 2))) shr (7 shl 2)]
+ + Data[(c and (((1 shl (1 shl 2)) - 1) shl (6 shl 2))) shr (6 shl 2)]
+ + Data[(c and (((1 shl (1 shl 2)) - 1) shl (5 shl 2))) shr (5 shl 2)]
+ + Data[(c and (((1 shl (1 shl 2)) - 1) shl (4 shl 2))) shr (4 shl 2)]
+ + Data[(c and (((1 shl (1 shl 2)) - 1) shl (3 shl 2))) shr (3 shl 2)]
+ + Data[(c and (((1 shl (1 shl 2)) - 1) shl (2 shl 2))) shr (2 shl 2)]
+ + Data[(c and (((1 shl (1 shl 2)) - 1) shl (1 shl 2))) shr (1 shl 2)]
+ + Data[(c and (((1 shl (1 shl 2)) - 1) shl (0 shl 2))) shr (0 shl 2)];
+end; }
+
+function HexOfCard(i: Cardinal): string;
+var
+ a: Cardinal;
+begin
+ Result := '';
+ while i > 0 do begin
+ a := i and $F;
+ Result := HexChar[a] + Result;
+ i := i shr 4;
+ end;
+end;
+
+function HexOfCard(i: Cardinal; Digits: Integer): string;
+var
+ a: Cardinal;
+begin
+ Result := '';
+ while i > 0 do begin
+ a := i and $F;
+ Result := HexChar[a] + Result;
+ i := i shr 4;
+ end;
+ Result := MulStr('0', Digits - Length(Result)) + Result;
+end;
+
+function PascalHexArray(a: TByteA; Name: string): string;
+var
+ i, len: Integer;
+begin
+ Result := 'const' + EOL +
+ ' ' + Name + ': array[0..' + IntToStr(High(a)) + '] of Byte = (';
+
+ len := Length(a);
+ for i := 0 to len-1 do begin
+ if (i mod 19) = 0 then
+ Result := Result + EOL + ' ' + ' ';
+ Result := Result + '$' + HexOfByte(a[i]);
+ if i < len-1 then
+ Result := Result + ',';
+ end;
+ Result := Result + EOL + ' );';
+end;
+
+function HexOfByteA(a: TByteA; Blocks: Integer = 1;
+ const Splitter: string = ' '): string;
+var
+ i: Integer;
+begin
+ Result := '';
+
+ if Blocks > 0 then
+ for i := 0 to High(a) do begin
+ Result := Result + HexOfByte(a[i]);
+ if i < High(a) then
+ if ((i+1) mod Blocks) = 0 then
+ Result := Result + Splitter;
+ end
+ else
+ for i := 0 to High(a) do
+ Result := Result + HexOfByte(a[i]);
+end;
+
+function BinOfByteA(a: TByteA; Blocks: Integer = 4;
+ const Splitter: string = ' '): string;
+var
+ i, max: Integer;
+ Bit: Boolean;
+begin
+ Result := '';
+
+ if Blocks > 0 then begin
+ max := 8 * (High(a)) + 7;
+ for i := 0 to max do begin
+ Bit := 7-(i mod 8) in TBitSet(a[i div 8]);
+ Result := Result + Char(Byte('0') + Byte(Bit));
+ if i < max then
+ if ((i+1) mod Blocks) = 0 then
+ Result := Result + Splitter;
+ end;
+ end else
+ for i := 0 to High(a) do
+ Result := Result + Char(Byte('0') + a[i] shr (i and 8));
+end;
+
+function CardOfHex(Hex: string): Cardinal;
+var
+ i: Integer;
+begin
+ Result := 0;
+ Hex := Copy(ExtractChars(Hex, HexadecimalChars), 1, 8);
+
+ for i := 1 to Length(Hex) do
+ if Hex[i] <> '0' then
+ Inc(Result, HexOrd(Hex[i]) shl ((Length(Hex) - i) shl 2));
+end;
+
+function IntOfBin(Bin: string): Cardinal;
+var
+ i: Integer;
+begin
+ Result := 0;
+ Bin := Copy(ExtractChars(Bin, BinaryChars), 1, 32);
+
+ for i := Length(Bin) downto 1 do
+ if Bin[i] = '1' then
+ Inc(Result, 1 shl (Length(Bin) - i));
+end;
+
+function BinOfInt(n: Cardinal): string;
+var
+ a: Integer;
+begin
+ if n = 0 then begin
+ Result := '0';
+ exit; end;
+
+ Result := '';
+ while n > 0 do begin
+ a := n and 1;
+ Result := Char(a + Byte('0')) + Result;
+ n := n shr 1;
+ end;
+end;
+
+function BinOfIntFill(n: Cardinal; MinCount: Integer = 8): string;
+var
+ a: Integer;
+begin
+ if n = 0 then begin
+ Result := MulStr('0', MinCount);
+ Exit; end;
+
+ Result := '';
+ while n > 0 do begin
+ a := n and 1;
+ Result := Char(a + Byte('0')) + Result;
+ n := n shr 1;
+ end;
+ Result := MulStr('0', MinCount - Length(Result)) + Result;
+end;
+
+function BaseNOfInt(I: Cardinal; B: TBaseN): string;
+var
+ a: Integer;
+begin
+ if (B < 2) or (i = 0) then begin
+ Result := '0';
+ Exit; end;
+
+ Result := '';
+ while i > 0 do begin
+ a := i mod B;
+ Result := BaseNChar[a] + Result;
+ i := i div B;
+ end;
+end;
+
+function IntOfBaseN(V: string; B: TBaseN): Cardinal;
+var
+ i: Integer;
+ F: Cardinal;
+ c: Byte;
+begin
+ Result := 0;
+ V := TrimAll(V);
+ F := 1;
+ for i := Length(V) downto 1 do begin
+ c := Byte(UpCase(V[i]));
+ case Char(c) of
+ '0'..'9': c := c - 48;
+ 'A'..'Z': c := c - 55;
+ end;
+ if c < B then
+ Result := Result + Byte(c) * F;
+ F := F * B;
+ end;
+end;
+
+function KeepIn(i, Bottom, Top: Variant): Variant;
+begin
+ Result := i;
+ if Result > Top then
+ Result := Top
+ else if Result < Bottom then
+ Result := Bottom;
+end;
+
+function InRange(Value, Bottom, Top: Variant): Boolean;
+begin
+ Result := (Value >= Bottom) and (Value <= Top);
+end;
+
+function InStrictRange(Value, Bottom, Top: Variant): Boolean;
+begin
+ Result := (Value > Bottom) and (Value < Top);
+end;
+
+function Min(const A, B: Integer): Integer;
+begin
+ if A < B then
+ Result := A
+ else
+ Result := B;
+end;
+
+function Min(const A: TIntA): Integer;
+var
+ i: Integer;
+begin
+ Result := 0;
+ if Length(A) = 0 then
+ Exit;
+
+ Result := A[0];
+ for i := 1 to High(A) do
+ if A[i] < Result then
+ Result := A[i];
+end;
+
+function Max(const A, B: Integer): Integer;
+begin
+ if A > B then
+ Result := A
+ else
+ Result := B;
+end;
+
+function Max(const A: TIntA): Integer;
+var
+ i: Integer;
+begin
+ Result := 0;
+ if Length(A) = 0 then
+ Exit;
+
+ Result := A[0];
+ for i := 1 to High(A) do
+ if A[i] > Result then
+ Result := A[i];
+end;
+
+function RangesOfStr(const S: string): TRanges;
+var
+ SL: TStringList;
+ r, b, t: string;
+ i, p: Integer;
+
+ function TryStrToCard(const S: string; out Value: Cardinal): Boolean;
+ var
+ E: Integer;
+ begin
+ Val(S, Value, E);
+ Result := E = 0;
+ end;
+
+begin
+ Result := nil;
+ SL := TStringList.Create;
+ try
+ Split(S, RangesSeparator, SL);
+ SetLength(Result, SL.Count);
+ for i := 0 to SL.Count-1 do begin
+ r := SL[i];
+ with Result[i] do begin
+ p := CharPos(RangeInnerSeparator, r);
+ Simple := p = 0; // no '-' found
+ if Simple then begin
+ if r = RangeInfinite then begin // * --> *-*
+ Simple := False;
+ Bottom := Low(Bottom);
+ Top := High(Top);
+ end else if not TryStrToCard(r, Value) then
+ Break;
+
+ end else begin
+ TileStr(r, p, p, b, t);
+
+ if b = RangeInfinite then
+ Bottom := Low(Bottom)
+ else if not TryStrToCard(b, Bottom) then
+ Break;
+
+ if t = RangeInfinite then
+ Top := High(Top)
+ else if not TryStrToCard(t, Top) then
+ Break;
+ if Bottom > Top then begin
+ p := Bottom; Bottom := Top; Top := p;
+ end;
+ end;
+ end;
+ end;
+
+ if i <> SL.Count then
+ Result := nil;
+
+ finally
+ SL.Free;
+ end;
+end;
+
+function InRanges(Ranges: TRanges; TestValue: Cardinal): Boolean;
+var
+ i: Integer;
+begin
+ Result := True;
+
+ for i := 0 to High(Ranges) do
+ with Ranges[i] do
+ if Simple then begin
+ if TestValue = Value then
+ Exit;
+ end else begin
+ if InRange(TestValue, Bottom, Top) then
+ Exit;
+ end;
+
+ Result := False;
+end;
+
+procedure WriteSL(Strings: TStrings; const Prefix: string = '';
+ const Suffix: string = '');
+var
+ i: Integer;
+begin
+ for i := 0 to Strings.Count-1 do
+ WriteLn(Prefix + Strings[i] + Suffix);
+end;
+
+function Success(Res: Integer; ResultOnSuccess: Integer = ERROR_SUCCESS): Boolean;
+begin
+ Result := (Res = ResultOnSuccess);
+ LastSuccessRes := Res;
+end;
+
+function Failure(Res: Integer; ResultOnSuccess: Integer = ERROR_SUCCESS): Boolean;
+begin
+ Result := not Success(Res, ResultOnSuccess);
+end;
+
+function ExpandString(const S: string): string;
+var
+ Len: Integer;
+ P, Res: PChar;
+begin
+ Result := '';
+ P := PChar(S);
+ Len := ExpandEnvironmentStrings(P, nil, 0);
+ if Len = 0 then
+ Exit;
+
+ GetMem(Res, Len);
+ ExpandEnvironmentStrings(P, Res, Len);
+
+ Result := Res;
+ FreeMem(Res, Len);
+end;
+
+function FindAll(Strings: TStrings; const Mask: string;
+ ScanSubDirs: Boolean = True; Attributes: Integer = faFindEveryFile;
+ FileReturn: TFileNameFunc = nil): Boolean;
+var
+ Path, FileName: string;
+
+ procedure ScanDir(const Path, FileName: string);
+ var
+ PSR: TSearchRec;
+ Res: Integer;
+
+ procedure Add(const S: string);
+ begin
+ if S <> '' then
+ Strings.Add(S);
+ end;
+
+ begin
+ Res := FindFirst(Path + FileName, Attributes, PSR);
+ while Success(Res, 0) do begin
+ if Assigned(FileReturn) then
+ Add(FileReturn(Path + PSR.Name))
+ else
+ Add(Path + PSR.Name);
+ Res := FindNext(PSR);
+ end;
+ FindClose(PSR);
+ if not ScanSubDirs then
+ Exit;
+
+ Res := FindFirst(Path + '*', faDirectory, PSR);
+ while Success(Res, 0) do begin
+ if (PSR.Attr and faDirectory > 0)
+ and (PSR.Name <> '.') and (PSR.Name <> '..') then
+ ScanDir(Path + PSR.Name + '\', FileName);
+ Res := FindNext(PSR);
+ end;
+ FindClose(PSR);
+ end;
+
+begin
+ Strings.Clear;
+ Path := ExtractPath(Mask);
+ FileName := ExtractFileName(Mask);
+ ScanDir(Path, FileName);
+ Result := Strings.Count > 0;
+end;
+
+function FindAllFirst(const Mask: string; ScanSubDirs: Boolean = True;
+ Attributes: Integer = faFindEveryFile): string;
+var
+ Path, FileName: string;
+
+ function ScanDir(const Path, FileName: string): Boolean;
+ var
+ PSR: TSearchRec;
+ Res: Integer;
+ begin
+ Result := False;
+ if Success(FindFirst(Path + FileName, Attributes, PSR), 0) then begin
+ FindAllFirst := Path + PSR.Name;
+ Result := True;
+ FindClose(PSR);
+ Exit; end;
+ if not ScanSubDirs then
+ Exit;
+
+ Res := FindFirst(Path + '*', faDirectory, PSR);
+ while not Result and Success(Res, 0) do begin
+ if (PSR.Attr and faDirectory > 0)
+ and (PSR.Name <> '.') and (PSR.Name <> '..') then
+ Result := ScanDir(Path + PSR.Name + '\', FileName);
+ Res := FindNext(PSR);
+ end;
+ FindClose(PSR);
+ end;
+begin
+ Result := '';
+ Path := ExtractPath(Mask);
+ FileName := ExtractFileName(Mask);
+ ScanDir(Path, FileName);
+end;
+
+procedure DeleteFiles(const Mask: string; ScanSubDirs: Boolean = True;
+ Attributes: Integer = faFindEveryFile);
+var
+ Path, FileName: string;
+
+ procedure ScanDir(const Path, FileName: string);
+ var
+ PSR: TSearchRec;
+ Res: Integer;
+
+ procedure TryDeleteFile(const FileName: string);
+ begin
+ try
+ DeleteFile(Path + PSR.Name);
+ except
+ end;
+ end;
+
+ begin
+ Res := FindFirst(Path + FileName, Attributes, PSR);
+ while Success(Res, 0) do begin
+ TryDeleteFile(Path + PSR.Name);
+ Res := FindNext(PSR);
+ end;
+ FindClose(PSR);
+ if not ScanSubDirs then
+ Exit;
+
+ Res := FindFirst(Path + '*', faDirectory, PSR);
+ while Success(Res, 0) do begin
+ if (PSR.Attr and faDirectory > 0)
+ and (PSR.Name <> '.') and (PSR.Name <> '..') then begin
+ ScanDir(Path + PSR.Name + '\', FileName);
+ TryDeleteFile(Path + PSR.Name);
+ end;
+ Res := FindNext(PSR);
+ end;
+ FindClose(PSR);
+ end;
+begin
+ Path := ExtractPath(Mask);
+ FileName := ExtractFileName(Mask);
+ ScanDir(Path, FileName);
+end;
+
+function GetFileNew(FileName: string; NoFloppyDrives: Boolean = True): string;
+var
+ Drive: string;
+ pf, pd, Len: Integer;
+ PSR: TSearchRec;
+begin
+ Result := '';
+ FileName := Trim(FileName);
+ if Length(FileName) < 2 then
+ Exit;
+
+ Drive := ExtractDrive(FileName);
+ if not DirectoryExists(Drive) then
+ Exit;
+
+ if NoFloppyDrives and (Drive[1] in ['A', 'B']) then
+ Exit;
+
+ Len := Length(FileName);
+ Result := Drive;
+ pf := Length(Drive) + 1;
+ while pf <= Len do begin
+ if FileName[pf] = '\' then begin
+ Result := Result + '\';
+ Inc(pf);
+ Continue; end;
+
+ pd := CharPos('\', FileName, pf);
+ if pd = 0 then begin
+ if 0=FindFirst(Result + Copy(FileName, pf, MaxInt), faFindEveryFile, PSR) then begin
+ Result := Result + PSR.Name;
+ Break; end else begin
+ FindClose(PSR);
+ if 0=FindFirst(Result + Copy(FileName, pf, MaxInt), faDirectory, PSR) then
+ Result := Result + PSR.Name + '\'
+ else
+ Result := '';
+ FindClose(PSR);
+ if Result = '' then
+ Break;
+ end;
+ end;
+
+ if 0=FindFirst(Result + Copy(FileName, pf, pd - pf), faDirectory, PSR) then
+ Result := Result + PSR.Name + '\'
+ else
+ Result := '';
+ FindClose(PSR);
+ if Result = '' then
+ Break;
+
+ pf := pd + 1;
+ end;
+
+ if (Result <> '') and not FileEx(Result, True) then
+ Result := '';
+end;
+
+function DateTimeOfFileTime(const FileTime: TFileTime): TDateTime;
+var
+ LocalFileTime: TFileTime;
+ Res: Integer;
+begin
+ Result := 0;
+
+ FileTimeToLocalFileTime(FileTime, LocalFileTime);
+ if not FileTimeToDosDateTime(LocalFileTime, LongRec(Res).Hi,
+ LongRec(Res).Lo) then
+ Res := -1;
+
+ if (Res = -1) or (Res = 0) then
+ Exit;
+ try
+ Result := FileDateToDateTime(Res);
+ except
+ end;
+end;
+
+procedure FileNew(const FileName: string);
+var
+ Handle: Integer;
+begin
+ Handle := FileCreate(FileName);
+ FileClose(Handle);
+end;
+
+function Win32PlatformStr: string;
+const
+ PlatformStrings: array[VER_PLATFORM_WIN32s..VER_PLATFORM_WIN32_NT] of string =
+ ('VER_PLATFORM_WIN32s', 'VER_PLATFORM_WIN32_WINDOWS', 'VER_PLATFORM_WIN32_NT');
+begin
+ Result := PlatformStrings[Win32Platform];
+end;
+
+function FullOSInfo: string;
+begin
+ Result := Format(
+ 'Platform: %s' + EOL +
+ 'Version: %d.%d Build %d' + EOL +
+ 'CSD: %s',
+ [
+ Win32PlatformStr,
+ Win32MajorVersion, Win32MinorVersion, Win32BuildNumber,
+ Win32CSDVersion
+ ]
+ );
+end;
+
+function Win9x: Boolean;
+begin
+ Result := Win32Platform = VER_PLATFORM_WIN32_WINDOWS;
+end;
+
+function WinNT: Boolean;
+begin
+ Result := Win32Platform = VER_PLATFORM_WIN32_NT;
+end;
+
+function Win2000: Boolean;
+begin
+ Result := (Win32Platform = VER_PLATFORM_WIN32_NT)
+ and (Win32MajorVersion = 4);
+end;
+
+function WinXP: Boolean;
+begin
+ Result := Win32MajorVersion >= 5;
+end;
+
+initialization
+ MyDir := GetMyDir;
+
+end.
+
+unit FifoStream;
+
+interface
+
+uses Classes, windows, Dialogs;
+
+const
+ DefaultChunksize = 32768; // 32kb per chunk as default.
+
+type
+ PMemChunk = ^TMemChunk;
+ TMemChunk = record
+ Filled: Longword;
+ Read: Longword;
+ Data: pointer;
+ end;
+
+ TFifo = class
+ private
+ FBuffers: TList;
+ FChunksize: Longword;
+ FCritSect: TRTLCriticalSection;
+ FIsWinNT: boolean;
+ FBytesInFifo: LongWord;
+ protected
+ function GetBytesInFifo: LongWord;
+ public
+ constructor Create;
+ destructor Destroy; override;
+ procedure Write(Data: pointer; Size: LongWord);
+ procedure Read(Buff: pointer; var ReqSize: LongWord);
+ procedure PeekData(Buff: pointer; var ReqSize: LongWord);
+ published
+ property BytesInFifo: LongWord read FBytesInFifo;
+ end;
+
+implementation
+
+constructor TFifo.Create;
+begin
+ inherited;
+ FBuffers := TList.Create;
+ // set default chunksize...
+ FChunksize := DefaultChunksize;
+ InitializeCriticalSection(FCritSect);
+end;
+
+destructor TFifo.Destroy;
+var
+ I: Integer;
+begin
+ EnterCriticalSection(FCritSect);
+ for I := 0 to FBuffers.count - 1 do
+ begin
+ FreeMem(PMemChunk(Fbuffers[I]).Data);
+ Dispose(PMemChunk(Fbuffers[I]));
+ end;
+ FBuffers.Clear;
+ FBuffers.Free;
+ LeaveCriticalSection(FCritSect);
+
+ DeleteCriticalSection(FCritSect);
+ inherited;
+end;
+
+function TFifo.GetBytesInFifo: LongWord;
+begin
+ Result := 0;
+ if FBuffers.Count = 0 then
+ begin
+ exit;
+ end
+ else
+ begin
+ if FBuffers.Count > 1 then
+ Inc(Result, (FBuffers.Count - 1) * FChunkSize);
+ Inc(Result, PMemChunk(FBuffers[Fbuffers.Count - 1]).Filled);
+ Dec(Result, PMemChunk(FBuffers[0]).Read);
+ end;
+end;
+
+procedure TFifo.Write(Data: pointer; Size: LongWord);
+var
+ Privpointer: pointer;
+ PrivSize: LongWord;
+ Chunk: PMemChunk;
+ PosInChunk: pointer;
+begin
+ if LongWord(Data) = 0 then
+ begin
+ // null pointer? somebody is trying to fool us, get out...
+ Exit;
+ end;
+ EnterCriticalSection(FCritSect);
+ PrivPointer := Data;
+ PrivSize := 0;
+ // are already buffers there?
+ if FBuffers.count > 0 then
+ begin
+ // is the last one of them not completely filled?
+ if PMemChunk(FBuffers[FBuffers.count - 1]).filled < FChunksize then
+ // not completely filled, so fill up the buffer.
+ begin
+ Chunk := PMemChunk(FBuffers[FBuffers.count - 1]);
+ // fetch chunkdata.
+ PosInChunk := Chunk.Data;
+ // move to current fill pos...
+ Inc(LongWord(PosInChunk), Chunk.Filled);
+ // can we fill the chunk completely?
+ if Size > FChunksize - Chunk.Filled then
+ begin
+ // yes we can.
+ Move(PrivPointer^, PosInChunk^, FChunksize - Chunk.Filled);
+ Inc(PrivSize, FChunksize - Chunk.Filled);
+ Inc(LongWord(PrivPointer), FChunksize - Chunk.Filled);
+ Chunk.Filled := FChunkSize;
+ end
+ else
+ // we have to less data for filling the chunk completely,
+ // just put everything in.
+ begin
+ Move(PrivPointer^, PosInChunk^, Size);
+ Inc(PrivSize, Size);
+ Inc(Chunk.Filled, Size);
+ end;
+ end;
+ end;
+ // as long as we have remaining stuff put it into new chunks.
+ while (PrivSize < Size) do
+ begin
+ new(Chunk);
+ GetMem(Chunk.Data, FChunksize);
+ Chunk.Read := 0;
+ // can we fill an entire chunk with the remaining data?
+ if Privsize + FChunksize < Size then
+ begin
+ // yes we can, so put the stuff in.
+ Move(Privpointer^, Chunk.Data^, FChunksize);
+ Inc(LongWord(PrivPointer), FChunksize);
+ Inc(PrivSize, FChunksize);
+ Chunk.Filled := FChunksize;
+ end
+ else // we have to less data to fill the entire chunk, just put the remaining stuff in.
+ begin
+ Move(Privpointer^, Chunk.Data^, Size - Privsize);
+ Chunk.Filled := Size - Privsize;
+ Inc(PrivSize, Size - Privsize);
+ end;
+ Fbuffers.Add(Chunk);
+ end;
+ if Size <> Privsize then
+ Showmessage('miscalculation in TFifo.write');
+ FBytesInFifo := GetBytesInFifo;
+ LeaveCriticalSection(FCritSect);
+end;
+
+procedure TFifo.Read(Buff: pointer; var ReqSize: LongWord);
+var
+ PrivSize: Integer;
+ Privpos: pointer;
+ Chunk: PMemChunk;
+ ChunkPos: pointer;
+begin
+ if LongWord(Buff) = 0 then
+ begin
+ // null pointer? somebody is trying to fool us, get out...
+ Exit;
+ end;
+ EnterCriticalSection(FCritSect);
+ PrivSize := 0;
+ Privpos := Buff;
+ while FBuffers.Count > 0 do
+ begin
+ Chunk := PMemChunk(FBuffers[0]);
+ ChunkPos := Chunk.data;
+ Inc(LongWord(ChunkPos), Chunk.Read);
+ // does the remaining part of the chunk fit into the buffer?
+ if PrivSize + (Chunk.Filled - Chunk.read) < ReqSize then
+ begin // yep, it fits
+ Move(ChunkPos^, Privpos^, Chunk.Filled - Chunk.read);
+ Inc(PrivSize, Chunk.Filled - Chunk.read);
+ FreeMem(Chunk.Data);
+ Dispose(Chunk);
+ FBuffers.Delete(0);
+ end
+ else // remaining part didn't fit, get as much as we can and increment the
+ // read attribute.
+ begin
+ Move(ChunkPos^, Privpos^, ReqSize - PrivSize);
+ Inc(Chunk.read, ReqSize - PrivSize);
+ Inc(PrivSize, ReqSize - PrivSize);
+ // as we filled the buffer, we'll have to break here.
+ break;
+ end;
+ end;
+ FBytesInFifo := GetBytesInFifo;
+ LeaveCriticalSection(FCritSect);
+ ReqSize := PrivSize;
+end;
+
+// read Data from Stream without removing it from the Stream...
+
+procedure TFifo.PeekData(Buff: pointer; var ReqSize: LongWord);
+var
+ PrivSize: Integer;
+ Privpos: pointer;
+ Chunk: PMemChunk;
+ ChunkPos: pointer;
+ ChunkNr: Integer;
+begin
+ if LongWord(Buff) = 0 then
+ begin
+ // null pointer? somebody is trying to fool us, get out...
+ Exit;
+ end;
+ EnterCriticalSection(FCritSect);
+ PrivSize := 0;
+ Privpos := Buff;
+ ChunkNr := 0;
+ while FBuffers.Count > ChunkNr do
+ begin
+ Chunk := PMemChunk(FBuffers[ChunkNr]);
+ ChunkPos := Chunk.data;
+ Inc(LongWord(ChunkPos), Chunk.Read);
+ // does the remaining part of the chunk fit into the buffer?
+ if PrivSize + (Chunk.Filled - Chunk.read) < ReqSize then
+ begin // yep, it fits
+ Move(ChunkPos^, Privpos^, Chunk.Filled - Chunk.read);
+ Inc(PrivSize, Chunk.Filled - Chunk.read);
+ Inc(ChunkNr);
+ end
+ else // remaining part didn't fit, get as much as we can and increment the
+ // read attribute.
+ begin
+ Move(ChunkPos^, Privpos^, ReqSize - PrivSize);
+ Inc(PrivSize, ReqSize - PrivSize);
+ // as we filled the buffer, we'll have to break here.
+ break;
+ end;
+ end;
+ LeaveCriticalSection(FCritSect);
+ ReqSize := PrivSize;
+end;
+
+end.
diff --git a/test/scanners/delphi/ytools.out.raydebug b/test/scanners/delphi/ytools.out.raydebug new file mode 100644 index 0000000..f1621fd --- /dev/null +++ b/test/scanners/delphi/ytools.out.raydebug @@ -0,0 +1,2708 @@ +comment(// vim:ft=pascal) + +reserved(unit) ident(YTools)operator(;) + +comment({=============================================================================== + + cYcnus.YTools 1.0.3 Beta for Delphi 4+ + by licenser and Murphy + + ©2000-2003 by cYcnus + visit www.cYcnus.de + + licenser@cYcnus.de (Heinz N. Gies\) + murphy@cYcnus.de (Kornelius Kalnbach\) + + this unit is published under the terms of the GPL + +===============================================================================}) + +reserved(interface) + +reserved(uses) + ident(Windows)operator(,) ident(SysUtils)operator(,) ident(Classes)operator(,) ident(YTypes)operator(;) + +reserved(const) + ident(BackSpace) operator(=) char(#8)operator(;) + ident(Tab) operator(=) char(#9)operator(;) + ident(LF) operator(=) char(#10)operator(;) comment(//Line Feed) + ident(CR) operator(=) char(#13)operator(;) comment(//Carriage Return) + ident(Space) operator(=) char(#32)operator(;) + ident(EOLChars) operator(=) operator([)ident(CR)operator(,) ident(LF)operator(];) +preprocessor({$IFNDEF VER140}) + ident(sLineBreak) operator(=) char(#13)char(#10)operator(;) + ident(SwitchChars) operator(=) operator([)char<delimiter(')content(/)delimiter(')>operator(,) char<delimiter(')content(-)delimiter(')>operator(];) +preprocessor({$ENDIF}) + ident(EOL) operator(=) ident(sLineBreak)operator(;) + ident(MaxCard) operator(=) ident(High)operator(()ident(Cardinal)operator(\);) + ident(AllChars) operator(=) operator([)char(#0)operator(..)char(#255)operator(];) + ident(Alphabetical) operator(=) operator([)char<delimiter(')content(A)delimiter(')>operator(..)char<delimiter(')content(Z)delimiter(')>operator(,) char<delimiter(')content(a)delimiter(')>operator(..)char<delimiter(')content(z)delimiter(')>operator(];) + ident(DecimalChars) operator(=) operator([)char<delimiter(')content(0)delimiter(')>operator(..)char<delimiter(')content(9)delimiter(')>operator(];) + ident(AlphaNumerical) operator(=) ident(Alphabetical) operator(+) ident(DecimalChars)operator(;) + ident(StrangeChars) operator(=) operator([)char(#0)operator(..)char(#31)operator(,) char(#127)operator(,) char(#129)operator(,) char(#141)operator(..)char(#144)operator(,) char(#157)operator(,) char(#158)operator(];) + + ident(HexadecimalChars) operator(=) ident(DecimalChars) operator(+) operator([)char<delimiter(')content(A)delimiter(')>operator(..)char<delimiter(')content(F)delimiter(')>operator(,) char<delimiter(')content(a)delimiter(')>operator(..)char<delimiter(')content(f)delimiter(')>operator(];) + ident(OctalChars) operator(=) operator([)char<delimiter(')content(0)delimiter(')>operator(..)char<delimiter(')content(7)delimiter(')>operator(];) + ident(BinaryChars) operator(=) operator([)char<delimiter(')content(0)delimiter(')>operator(,) char<delimiter(')content(1)delimiter(')>operator(];) + + ident(QuoteChars) operator(=) operator([)char<delimiter(')content('')delimiter(')>operator(,) char<delimiter(')content(")delimiter(')>operator(];) + ident(WildCards) operator(=) operator([)char<delimiter(')content(*)delimiter(')>operator(,) char<delimiter(')content(?)delimiter(')>operator(];) + ident(FileNameEnemies) operator(=) ident(WildCards) operator(+) operator([)char<delimiter(')content(\\)delimiter(')>operator(,) char<delimiter(')content(/)delimiter(')>operator(,) char<delimiter(')content(:)delimiter(')>operator(,) char<delimiter(')content(<)delimiter(')>operator(,) char<delimiter(')content(>)delimiter(')>operator(,) char<delimiter(')content(|)delimiter(')>operator(];) + + ident(HexChar)operator(:) reserved(array)operator([)ident(THex)operator(]) reserved(of) ident(Char) operator(=) operator(() + char<delimiter(')content(0)delimiter(')>operator(,)char<delimiter(')content(1)delimiter(')>operator(,)char<delimiter(')content(2)delimiter(')>operator(,)char<delimiter(')content(3)delimiter(')>operator(,)char<delimiter(')content(4)delimiter(')>operator(,)char<delimiter(')content(5)delimiter(')>operator(,)char<delimiter(')content(6)delimiter(')>operator(,)char<delimiter(')content(7)delimiter(')>operator(,)char<delimiter(')content(8)delimiter(')>operator(,)char<delimiter(')content(9)delimiter(')>operator(,)char<delimiter(')content(A)delimiter(')>operator(,)char<delimiter(')content(B)delimiter(')>operator(,)char<delimiter(')content(C)delimiter(')>operator(,)char<delimiter(')content(D)delimiter(')>operator(,)char<delimiter(')content(E)delimiter(')>operator(,)char<delimiter(')content(F)delimiter(')>operator(\);) + ident(LowerHexChar)operator(:) reserved(array)operator([)ident(THex)operator(]) reserved(of) ident(Char) operator(=) operator(() + char<delimiter(')content(0)delimiter(')>operator(,)char<delimiter(')content(1)delimiter(')>operator(,)char<delimiter(')content(2)delimiter(')>operator(,)char<delimiter(')content(3)delimiter(')>operator(,)char<delimiter(')content(4)delimiter(')>operator(,)char<delimiter(')content(5)delimiter(')>operator(,)char<delimiter(')content(6)delimiter(')>operator(,)char<delimiter(')content(7)delimiter(')>operator(,)char<delimiter(')content(8)delimiter(')>operator(,)char<delimiter(')content(9)delimiter(')>operator(,)char<delimiter(')content(a)delimiter(')>operator(,)char<delimiter(')content(b)delimiter(')>operator(,)char<delimiter(')content(c)delimiter(')>operator(,)char<delimiter(')content(d)delimiter(')>operator(,)char<delimiter(')content(e)delimiter(')>operator(,)char<delimiter(')content(f)delimiter(')>operator(\);) + ident(BaseNChar)operator(:) reserved(array)operator([)ident(TBaseN)operator(]) reserved(of) ident(Char) operator(=) operator(() + char<delimiter(')content(0)delimiter(')>operator(,)char<delimiter(')content(1)delimiter(')>operator(,)char<delimiter(')content(2)delimiter(')>operator(,)char<delimiter(')content(3)delimiter(')>operator(,)char<delimiter(')content(4)delimiter(')>operator(,)char<delimiter(')content(5)delimiter(')>operator(,)char<delimiter(')content(6)delimiter(')>operator(,)char<delimiter(')content(7)delimiter(')>operator(,)char<delimiter(')content(8)delimiter(')>operator(,)char<delimiter(')content(9)delimiter(')>operator(,)char<delimiter(')content(A)delimiter(')>operator(,)char<delimiter(')content(B)delimiter(')>operator(,)char<delimiter(')content(C)delimiter(')>operator(,)char<delimiter(')content(D)delimiter(')>operator(,)char<delimiter(')content(E)delimiter(')>operator(,)char<delimiter(')content(F)delimiter(')>operator(,)char<delimiter(')content(G)delimiter(')>operator(,)char<delimiter(')content(H)delimiter(')>operator(,) + char<delimiter(')content(I)delimiter(')>operator(,)char<delimiter(')content(J)delimiter(')>operator(,)char<delimiter(')content(K)delimiter(')>operator(,)char<delimiter(')content(L)delimiter(')>operator(,)char<delimiter(')content(M)delimiter(')>operator(,)char<delimiter(')content(N)delimiter(')>operator(,)char<delimiter(')content(O)delimiter(')>operator(,)char<delimiter(')content(P)delimiter(')>operator(,)char<delimiter(')content(Q)delimiter(')>operator(,)char<delimiter(')content(R)delimiter(')>operator(,)char<delimiter(')content(S)delimiter(')>operator(,)char<delimiter(')content(T)delimiter(')>operator(,)char<delimiter(')content(U)delimiter(')>operator(,)char<delimiter(')content(V)delimiter(')>operator(,)char<delimiter(')content(W)delimiter(')>operator(,)char<delimiter(')content(X)delimiter(')>operator(,)char<delimiter(')content(Y)delimiter(')>operator(,)char<delimiter(')content(Z)delimiter(')>operator(\);) + + ident(cYcnusOverlayColor) operator(=) hex($050001)operator(;) + + ident(faFindEveryFile) operator(=) ident(faReadOnly) operator(+) ident(faHidden) operator(+) ident(faSysFile) operator(+) ident(faArchive)operator(;) + + ident(platWin9x) operator(=) operator([)ident(VER_PLATFORM_WIN32s)operator(,) ident(VER_PLATFORM_WIN32_WINDOWS)operator(];) + + +comment({ Debugging }) +reserved(procedure) ident(ClearReport)operator(()reserved(const) ident(ReportName)operator(:) reserved(string)operator(\);) +reserved(procedure) ident(Report)operator(()reserved(const) ident(ReportName)operator(,) ident(Text)operator(:) reserved(string)operator(\);) +reserved(procedure) ident(ReportFmt)operator(()reserved(const) ident(ReportName)operator(,) ident(Fmt)operator(:) reserved(string)operator(;) reserved(const) ident(Args)operator(:) reserved(array) reserved(of) reserved(const)operator(\);) + +comment({ Params }) +reserved(procedure) ident(GetParams)operator(()ident(Strings)operator(:) ident(TStrings)operator(\);) directive(overload)operator(;) +reserved(function) ident(GetParams)operator(()reserved(const) ident(Separator)operator(:) reserved(string) operator(=) char<delimiter(')content( )delimiter(')>operator(\):) reserved(string)operator(;) directive(overload)operator(;) + +reserved(function) ident(ParamNum)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\):) ident(Integer)operator(;) +reserved(function) ident(ParamPrefixNum)operator(()reserved(const) ident(Prefix)operator(:) reserved(string)operator(\):) ident(Integer)operator(;) +reserved(function) ident(Param)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) +reserved(function) ident(ParamPrefix)operator(()reserved(const) ident(Prefix)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) + +reserved(function) ident(Switch)operator(()reserved(const) ident(Switch)operator(:) reserved(string)operator(;) reserved(const) ident(PrefixChars)operator(:) ident(TCharSet) operator(=) ident(SwitchChars)operator(;) + ident(IgnoreCase)operator(:) ident(Boolean) operator(=) ident(True)operator(\):) ident(Boolean)operator(;) +reserved(function) ident(GetParam)operator(()reserved(const) ident(Prefix)operator(:) reserved(string) operator(=) string<delimiter(')delimiter(')>operator(;) reserved(const) ident(Default)operator(:) reserved(string) operator(=) string<delimiter(')delimiter(')>operator(\):) reserved(string)operator(;) + +comment({ Dirs & UserName}) +reserved(function) ident(GetMyDir)operator(()ident(FullPath)operator(:) ident(Boolean) operator(=) ident(False)operator(\):) reserved(string)operator(;) +reserved(function) ident(WinDir)operator(:) reserved(string)operator(;) +reserved(function) ident(SysDir)operator(:) reserved(string)operator(;) +reserved(function) ident(UserName)operator(:) reserved(string)operator(;) + +comment({ Strings & Chars}) +reserved(function) ident(FirstChar)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\):) ident(Char)operator(;) +reserved(function) ident(LastChar)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\):) ident(Char)operator(;) + +reserved(function) ident(CharPos)operator(()ident(C)operator(:) ident(Char)operator(;) reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Offset)operator(:) ident(Integer) operator(=) integer(1)operator(\):) ident(Integer)operator(;) directive(overload)operator(;) +reserved(function) ident(CharPos)operator(()ident(C)operator(:) ident(TCharSet)operator(;) reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Offset)operator(:) ident(Integer) operator(=) integer(1)operator(\):) ident(Integer)operator(;) directive(overload)operator(;) +reserved(function) ident(CharPosR)operator(()ident(C)operator(:) ident(Char)operator(;) reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Offset)operator(:) ident(Integer) operator(=) operator(-)integer(1)operator(\):) ident(Integer)operator(;) +reserved(function) ident(PosEx)operator(()reserved(const) ident(SubStr)operator(,) ident(S)operator(:) reserved(string)operator(;) ident(Offset)operator(:) ident(Integer) operator(=) integer(1)operator(\):) ident(Integer)operator(;) +reserved(function) ident(PosExText)operator(()reserved(const) ident(SubStr)operator(,) ident(S)operator(:) reserved(string)operator(;) ident(Offset)operator(:) ident(Integer) operator(=) integer(1)operator(\):) ident(Integer)operator(;) +reserved(function) ident(PosExAnsiText)operator(()reserved(const) ident(SubStr)operator(,) ident(S)operator(:) reserved(string)operator(;) ident(Offset)operator(:) ident(Integer) operator(=) integer(1)operator(\):) ident(Integer)operator(;) + +reserved(function) ident(UntilChar)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Brake)operator(:) ident(Char)operator(\):) reserved(string)operator(;) directive(overload)operator(;) +reserved(function) ident(UntilChar)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Brake)operator(:) ident(TCharSet)operator(\):) reserved(string)operator(;) directive(overload)operator(;) +reserved(function) ident(UntilLastChar)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Brake)operator(:) ident(Char)operator(;) + ident(IgnoreNoBrake)operator(:) ident(Boolean) operator(=) ident(True)operator(\):) reserved(string)operator(;) + +reserved(function) ident(FromChar)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Brake)operator(:) ident(Char)operator(\):) reserved(string)operator(;) directive(overload)operator(;) +reserved(function) ident(FromChar)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Brake)operator(:) ident(TCharSet)operator(\):) reserved(string)operator(;) directive(overload)operator(;) +reserved(function) ident(FromLastChar)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Brake)operator(:) ident(Char)operator(;) + ident(IgnoreNoBrake)operator(:) ident(Boolean) operator(=) ident(False)operator(\):) reserved(string)operator(;) + +reserved(function) ident(BetweenChars)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Start)operator(,) ident(Finish)operator(:) ident(Char)operator(;) + ident(Inclusive)operator(:) ident(Boolean) operator(=) ident(False)operator(\):) reserved(string)operator(;) + +reserved(function) ident(UntilStr)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Brake)operator(:) reserved(string)operator(\):) reserved(string)operator(;) +reserved(function) ident(FromStr)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Brake)operator(:) reserved(string)operator(\):) reserved(string)operator(;) + +reserved(function) ident(StringWrap)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Width)operator(:) ident(Integer)operator(;) reserved(const) ident(LineEnd)operator(:) reserved(string) operator(=) ident(EOL)operator(\):) reserved(string)operator(;) + +comment({ Splitting & Combining }) +reserved(function) ident(Split)operator(()reserved(const) ident(S)operator(,) ident(Separator)operator(:) reserved(string)operator(;) ident(IgnoreMultiSep)operator(:) ident(Boolean) operator(=) ident(True)operator(;) + ident(MinCount)operator(:) ident(Integer) operator(=) integer(0)operator(\):) ident(TStrA)operator(;) directive(overload)operator(;) +reserved(procedure) ident(Split)operator(()reserved(const) ident(S)operator(,) ident(Separator)operator(:) reserved(string)operator(;) ident(Strings)operator(:) ident(TStrings)operator(;) + ident(IgnoreMultiSep)operator(:) ident(Boolean) operator(=) ident(True)operator(\);) directive(overload)operator(;) +reserved(function) ident(Split)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Separators)operator(:) ident(TCharSet)operator(;) + ident(IgnoreMultiSep)operator(:) ident(Boolean) operator(=) ident(True)operator(;) ident(MinCount)operator(:) ident(Integer) operator(=) integer(0)operator(\):) ident(TStrA)operator(;) directive(overload)operator(;) + +reserved(procedure) ident(TileStr)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(BrakeStart)operator(:) ident(Integer)operator(;) ident(BrakeEnd)operator(:) ident(Integer)operator(;) + reserved(out) ident(Left)operator(,) ident(Right)operator(:) reserved(string)operator(\);) + +reserved(function) ident(Join)operator(()ident(Strings)operator(:) ident(TStrings)operator(;) ident(Separator)operator(:) reserved(string) operator(=) char<delimiter(')content( )delimiter(')>operator(\):) reserved(string)operator(;) directive(overload)operator(;) +reserved(function) ident(Join)operator(()ident(StrA)operator(:) ident(TStrA)operator(;) ident(Separator)operator(:) reserved(string) operator(=) char<delimiter(')content( )delimiter(')>operator(\):) reserved(string)operator(;) directive(overload)operator(;) + +reserved(function) ident(MulStr)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Count)operator(:) ident(Integer)operator(\):) reserved(string)operator(;) + +comment({ Strings ausrichten }) +reserved(function) ident(AlignR)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Width)operator(:) ident(Integer)operator(;) ident(Filler)operator(:) ident(Char) operator(=) char<delimiter(')content( )delimiter(')>operator(\):) reserved(string)operator(;) +reserved(function) ident(MaxStr)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(MaxLen)operator(:) ident(Integer)operator(\):) reserved(string)operator(;) + +comment({ Stringing }) +reserved(function) ident(TrimAll)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\):) reserved(string)operator(;) + +reserved(function) ident(ControlChar)operator(()ident(C)operator(:) ident(Char)operator(\):) ident(Boolean)operator(;) +reserved(function) ident(FriendlyChar)operator(()ident(C)operator(:) ident(Char)operator(\):) ident(Char)operator(;) + +reserved(function) ident(FriendlyStr)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\):) reserved(string)operator(;) directive(overload)operator(;) +reserved(function) ident(FriendlyStr)operator(()ident(a)operator(:) ident(TByteA)operator(\):) reserved(string)operator(;) directive(overload)operator(;) + +reserved(function) ident(Quote)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Quoter)operator(:) ident(Char) operator(=) char<delimiter(')content(")delimiter(')>operator(\):) reserved(string)operator(;) +reserved(function) ident(UnQuote)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\):) reserved(string)operator(;) +reserved(function) ident(DeQuote)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\):) reserved(string)operator(;) + +reserved(function) ident(StrNumerus)operator(()reserved(const) ident(Value)operator(:) ident(Integer)operator(;) reserved(const) ident(Singular)operator(,) ident(Plural)operator(:) reserved(string)operator(;) + reserved(const) ident(Zero)operator(:) reserved(string) operator(=) char<delimiter(')content(0)delimiter(')>operator(\):) reserved(string)operator(;) + +reserved(function) ident(MakeStr)operator(()reserved(const) ident(Items)operator(:) reserved(array) reserved(of) reserved(const)operator(;) ident(Separator)operator(:) reserved(string) operator(=) string<delimiter(')delimiter(')>operator(\):) reserved(string)operator(;) +reserved(procedure) ident(ShowText)operator(()reserved(const) ident(Items)operator(:) reserved(array) reserved(of) reserved(const)operator(;) ident(Separator)operator(:) reserved(string) operator(=) string<delimiter(')delimiter(')>operator(\);) + +comment({ Delete }) +reserved(function) ident(DeleteChars)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(C)operator(:) ident(Char)operator(\):) reserved(string)operator(;) directive(overload)operator(;) +reserved(function) ident(DeleteChars)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(C)operator(:) ident(TCharSet)operator(\):) reserved(string)operator(;) directive(overload)operator(;) +reserved(function) ident(ExtractChars)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(C)operator(:) ident(TCharSet)operator(\):) reserved(string)operator(;) + +comment({ Find }) +reserved(function) ident(CharCount)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(C)operator(:) ident(Char)operator(\):) ident(Integer)operator(;) + +reserved(function) ident(CharIn)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(C)operator(:) ident(Char)operator(\):) ident(Boolean)operator(;) directive(overload)operator(;) +reserved(function) ident(CharIn)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(C)operator(:) ident(TCharSet)operator(\):) ident(Boolean)operator(;) directive(overload)operator(;) + +reserved(function) ident(StrAtPos)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Pos)operator(:) ident(Integer)operator(;) reserved(const) ident(Str)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) +reserved(function) ident(StrAtBegin)operator(()reserved(const) ident(S)operator(,) ident(Str)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) +reserved(function) ident(StrIn)operator(()reserved(const) ident(S)operator(,) ident(SubStr)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) directive(overload)operator(;) +reserved(function) ident(StrIn)operator(()ident(A)operator(:) ident(TStrA)operator(;) reserved(const) ident(S)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) directive(overload)operator(;) +reserved(function) ident(StrIn)operator(()ident(SL)operator(:) ident(TStrings)operator(;) reserved(const) ident(S)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) directive(overload)operator(;) +reserved(function) ident(StrIndex)operator(()ident(A)operator(:) ident(TStrA)operator(;) reserved(const) ident(S)operator(:) reserved(string)operator(\):) ident(Integer)operator(;) directive(overload)operator(;) +reserved(function) ident(StrIndex)operator(()ident(SL)operator(:) ident(TStrings)operator(;) reserved(const) ident(S)operator(:) reserved(string)operator(\):) ident(Integer)operator(;) directive(overload)operator(;) + +reserved(function) ident(TextAtPos)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Pos)operator(:) ident(Integer)operator(;) reserved(const) ident(Text)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) +reserved(function) ident(TextAtBegin)operator(()reserved(const) ident(S)operator(,) ident(Text)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) +reserved(function) ident(TextIn)operator(()reserved(const) ident(S)operator(,) ident(Text)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) directive(overload)operator(;) +reserved(function) ident(TextIn)operator(()ident(A)operator(:) ident(TStrA)operator(;) reserved(const) ident(Text)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) directive(overload)operator(;) +reserved(function) ident(TextIn)operator(()ident(SL)operator(:) ident(TStrings)operator(;) reserved(const) ident(Text)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) directive(overload)operator(;) +reserved(function) ident(TextIndex)operator(()ident(A)operator(:) ident(TStrA)operator(;) reserved(const) ident(Text)operator(:) reserved(string)operator(\):) ident(Integer)operator(;) directive(overload)operator(;) +reserved(function) ident(TextIndex)operator(()ident(SL)operator(:) ident(TStrings)operator(;) reserved(const) ident(Text)operator(:) reserved(string)operator(\):) ident(Integer)operator(;) directive(overload)operator(;) + +comment({ Replace }) +reserved(function) ident(ReplaceChars)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Old)operator(,) ident(New)operator(:) ident(Char)operator(\):) reserved(string)operator(;) directive(overload)operator(;) +reserved(function) ident(ReplaceChars)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Old)operator(:) ident(TCharSet)operator(;) ident(New)operator(:) ident(Char)operator(\):) reserved(string)operator(;) directive(overload)operator(;) + +reserved(function) ident(Replace)operator(()reserved(const) ident(S)operator(,) ident(Old)operator(,) ident(New)operator(:) reserved(string)operator(\):) reserved(string)operator(;) + +comment({ TStrings }) +reserved(function) ident(SLOfFile)operator(()reserved(const) ident(FileName)operator(:) reserved(string)operator(\):) ident(TStringList)operator(;) +reserved(function) ident(ContainsEmptyLines)operator(()ident(SL)operator(:) ident(TStrings)operator(\):) ident(Boolean)operator(;) +reserved(procedure) ident(DeleteEmptyLines)operator(()ident(SL)operator(:) ident(TStrings)operator(\);) +reserved(procedure) ident(DeleteCommentLines)operator(()ident(SL)operator(:) ident(TStrings)operator(;) reserved(const) ident(CommentSign)operator(:) reserved(string) operator(=) string<delimiter(')content(//)delimiter(')>operator(\);) +reserved(procedure) ident(WriteSL)operator(()ident(Strings)operator(:) ident(TStrings)operator(;) reserved(const) ident(Prefix)operator(:) reserved(string) operator(=) string<delimiter(')delimiter(')>operator(;) + reserved(const) ident(Suffix)operator(:) reserved(string) operator(=) string<delimiter(')delimiter(')>operator(\);) + +reserved(function) ident(FindLine)operator(()ident(SL)operator(:) ident(TStrings)operator(;) reserved(const) ident(S)operator(:) reserved(string)operator(\):) ident(Integer)operator(;) + +reserved(procedure) ident(QuickSortSL)operator(()ident(SL)operator(:) ident(TStringList)operator(\);) + +comment({ TStrA }) +reserved(function) ident(IncStrA)operator(()ident(StrA)operator(:) ident(TStrA)operator(\):) ident(Integer)operator(;) + +comment({ TByteA }) +reserved(function) ident(StrOfByteA)operator(()ident(a)operator(:) ident(TByteA)operator(\):) reserved(string)operator(;) +reserved(function) ident(ByteAOfStr)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\):) ident(TByteA)operator(;) +reserved(function) ident(ByteAOfInt)operator(()ident(i)operator(:) ident(Integer)operator(\):) ident(TByteA)operator(;) +reserved(function) ident(IntOfByteA)operator(()ident(A)operator(:) ident(TByteA)operator(\):) ident(Integer)operator(;) +reserved(function) ident(ByteAOfHex)operator(()reserved(const) ident(Hex)operator(:) reserved(string)operator(\):) ident(TByteA)operator(;) + +reserved(function) ident(SameByteA)operator(()reserved(const) ident(A)operator(,) ident(B)operator(:) ident(TByteA)operator(\):) ident(Boolean)operator(;) +reserved(function) ident(Reverse)operator(()ident(a)operator(:) ident(TByteA)operator(\):) ident(TByteA)operator(;) +reserved(function) ident(SaveByteA)operator(()ident(Data)operator(:) ident(TByteA)operator(;) reserved(const) ident(FileName)operator(:) reserved(string)operator(;) ident(Overwrite)operator(:) ident(Boolean) operator(=) ident(True)operator(\):) ident(Boolean)operator(;) +reserved(function) ident(LoadByteA)operator(()reserved(const) ident(FileName)operator(:) reserved(string)operator(\):) ident(TByteA)operator(;) + +reserved(function) ident(Endian)operator(()ident(i)operator(:) ident(Integer)operator(\):) ident(Integer)operator(;) + +comment({ Files }) +reserved(function) ident(SizeOfFile)operator(()reserved(const) ident(FileName)operator(:) reserved(string)operator(\):) ident(Integer)operator(;) +reserved(function) ident(FileEx)operator(()reserved(const) ident(FileName)operator(:) reserved(string)operator(;) ident(AllowFolders)operator(:) ident(Boolean) operator(=) ident(False)operator(\):) ident(Boolean)operator(;) +reserved(function) ident(LWPSolve)operator(()reserved(const) ident(Dir)operator(:) reserved(string)operator(\):) reserved(string)operator(;) +reserved(function) ident(LWPSlash)operator(()reserved(const) ident(Dir)operator(:) reserved(string)operator(\):) reserved(string)operator(;) + +reserved(function) ident(ExtractDrive)operator(()reserved(const) ident(FileName)operator(:) reserved(string)operator(\):) reserved(string)operator(;) +reserved(function) ident(ExtractPath)operator(()reserved(const) ident(FileName)operator(:) reserved(string)operator(\):) reserved(string)operator(;) +reserved(function) ident(ExtractPrefix)operator(()reserved(const) ident(FileName)operator(:) reserved(string)operator(\):) reserved(string)operator(;) +reserved(function) ident(ExtractSuffix)operator(()reserved(const) ident(FileName)operator(:) reserved(string)operator(\):) reserved(string)operator(;) + +reserved(function) ident(IsValidFileName)operator(()reserved(const) ident(FileName)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) +reserved(function) ident(MakeValidFileName)operator(()ident(FileName)operator(:) reserved(string)operator(;) reserved(const) ident(Default)operator(:) reserved(string) operator(=) string<delimiter(')content(File)delimiter(')>operator(\):) reserved(string)operator(;) + +comment({ Converting }) +reserved(function) ident(IsValidInteger)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) +reserved(function) ident(IsValidCardinal)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) + +reserved(function) ident(StrOfBool)operator(()ident(flag)operator(:) ident(Boolean)operator(;) reserved(const) ident(TrueStr)operator(:) reserved(string) operator(=) string<delimiter(')content(True)delimiter(')>operator(;) + reserved(const) ident(FalseStr)operator(:) reserved(string) operator(=) string<delimiter(')content(False)delimiter(')>operator(\):) reserved(string)operator(;) +reserved(function) ident(StrOfInt)operator(()ident(i)operator(:) ident(Integer)operator(\):) reserved(string)operator(;) +reserved(function) ident(CardOfStr)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\):) ident(Cardinal)operator(;) + +reserved(function) ident(HexOrd)operator(()ident(Hex)operator(:) ident(Char)operator(\):) ident(THex)operator(;) +reserved(function) ident(ByteOfHex)operator(()ident(Hex)operator(:) ident(THexByteStr)operator(\):) ident(Byte)operator(;) + +reserved(function) ident(DecOfHex)operator(()reserved(const) ident(Hex)operator(:) reserved(string)operator(\):) reserved(string)operator(;) +reserved(function) ident(HexOfByte)operator(()ident(b)operator(:) ident(Byte)operator(\):) ident(THexByteStr)operator(;) +reserved(function) ident(HexOfCard)operator(()ident(i)operator(:) ident(Cardinal)operator(\):) reserved(string)operator(;) directive(overload)operator(;) +reserved(function) ident(HexOfCard)operator(()ident(i)operator(:) ident(Cardinal)operator(;) ident(Digits)operator(:) ident(Integer)operator(\):) reserved(string)operator(;) directive(overload)operator(;) + +reserved(function) ident(PascalHexArray)operator(()ident(a)operator(:) ident(TByteA)operator(;) ident(Name)operator(:) reserved(string)operator(\):) reserved(string)operator(;) + +reserved(function) ident(HexOfByteA)operator(()ident(a)operator(:) ident(TByteA)operator(;) ident(Blocks)operator(:) ident(Integer) operator(=) integer(1)operator(;) + reserved(const) ident(Splitter)operator(:) reserved(string) operator(=) char<delimiter(')content( )delimiter(')>operator(\):) reserved(string)operator(;) +reserved(function) ident(BinOfByteA)operator(()ident(a)operator(:) ident(TByteA)operator(;) ident(Blocks)operator(:) ident(Integer) operator(=) integer(4)operator(;) + reserved(const) ident(Splitter)operator(:) reserved(string) operator(=) char<delimiter(')content( )delimiter(')>operator(\):) reserved(string)operator(;) + +reserved(function) ident(CardOfHex)operator(()ident(Hex)operator(:) reserved(string)operator(\):) ident(Cardinal)operator(;) +reserved(function) ident(IntOfBin)operator(()ident(Bin)operator(:) reserved(string)operator(\):) ident(Cardinal)operator(;) + +reserved(function) ident(BinOfIntFill)operator(()ident(n)operator(:) ident(cardinal)operator(;) ident(MinCount)operator(:) ident(Integer) operator(=) integer(8)operator(\):) reserved(string)operator(;) +reserved(function) ident(BinOfInt)operator(()ident(n)operator(:) ident(cardinal)operator(\):) reserved(string)operator(;) + +reserved(function) ident(BaseNOfInt)operator(()ident(I)operator(:) ident(Cardinal)operator(;) ident(B)operator(:) ident(TBaseN)operator(\):) reserved(string)operator(;) +reserved(function) ident(IntOfBaseN)operator(()ident(V)operator(:) reserved(string)operator(;) ident(B)operator(:) ident(TBaseN)operator(\):) ident(Cardinal)operator(;) + +comment({ Ranges }) +reserved(function) ident(KeepIn)operator(()ident(i)operator(,) ident(Bottom)operator(,) ident(Top)operator(:) ident(Variant)operator(\):) ident(Variant)operator(;) +reserved(function) ident(InRange)operator(()ident(Value)operator(,) ident(Bottom)operator(,) ident(Top)operator(:) ident(Variant)operator(\):) ident(Boolean)operator(;) +reserved(function) ident(InStrictRange)operator(()ident(Value)operator(,) ident(Bottom)operator(,) ident(Top)operator(:) ident(Variant)operator(\):) ident(Boolean)operator(;) +reserved(function) ident(Min)operator(()reserved(const) ident(A)operator(,) ident(B)operator(:) ident(Integer)operator(\):) ident(Integer)operator(;) directive(overload)operator(;) +reserved(function) ident(Min)operator(()reserved(const) ident(A)operator(:) ident(TIntA)operator(\):) ident(Integer)operator(;) directive(overload)operator(;) +reserved(function) ident(Max)operator(()reserved(const) ident(A)operator(,) ident(B)operator(:) ident(Integer)operator(\):) ident(Integer)operator(;) directive(overload)operator(;) +reserved(function) ident(Max)operator(()reserved(const) ident(A)operator(:) ident(TIntA)operator(\):) ident(Integer)operator(;) directive(overload)operator(;) + +reserved(const) + ident(RangesSeparator) operator(=) char<delimiter(')content(,)delimiter(')>operator(;) + ident(RangeInnerSeparator) operator(=) char<delimiter(')content(-)delimiter(')>operator(;) + ident(RangeInfinite) operator(=) char<delimiter(')content(*)delimiter(')>operator(;) + ident(RangeSpecialChars) operator(=) operator([)ident(RangesSeparator)operator(,) ident(RangeInnerSeparator)operator(,) ident(RangeInfinite)operator(];) + +reserved(function) ident(RangesOfStr)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\):) ident(TRanges)operator(;) +reserved(function) ident(InRanges)operator(()ident(Ranges)operator(:) ident(TRanges)operator(;) ident(TestValue)operator(:) ident(Cardinal)operator(\):) ident(Boolean)operator(;) + +reserved(function) ident(Success)operator(()ident(Res)operator(:) ident(Integer)operator(;) ident(ResultOnSuccess)operator(:) ident(Integer) operator(=) ident(ERROR_SUCCESS)operator(\):) ident(Boolean)operator(;) +reserved(function) ident(Failure)operator(()ident(Res)operator(:) ident(Integer)operator(;) ident(ResultOnSuccess)operator(:) ident(Integer) operator(=) ident(ERROR_SUCCESS)operator(\):) ident(Boolean)operator(;) + +reserved(function) ident(ExpandString)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\):) reserved(string)operator(;) + +comment({ Files }) +reserved(procedure) ident(DeleteFiles)operator(()reserved(const) ident(Mask)operator(:) reserved(string)operator(;) ident(ScanSubDirs)operator(:) ident(Boolean) operator(=) ident(True)operator(;) + ident(Attributes)operator(:) ident(Integer) operator(=) ident(faFindEveryFile)operator(\);) +reserved(procedure) ident(FileNew)operator(()reserved(const) ident(FileName)operator(:) reserved(string)operator(\);) +reserved(function) ident(DateTimeOfFileTime)operator(()reserved(const) ident(FileTime)operator(:) ident(TFileTime)operator(\):) ident(TDateTime)operator(;) + +comment({ FileNames }) +reserved(function) ident(GetFileNew)operator(()ident(FileName)operator(:) reserved(string)operator(;) ident(NoFloppyDrives)operator(:) ident(Boolean) operator(=) ident(True)operator(\):) reserved(string)operator(;) + +comment({ Finding Files }) +reserved(function) ident(FindAll)operator(()ident(Strings)operator(:) ident(TStrings)operator(;) reserved(const) ident(Mask)operator(:) reserved(string)operator(;) + ident(ScanSubDirs)operator(:) ident(Boolean) operator(=) ident(True)operator(;) ident(Attributes)operator(:) ident(Integer) operator(=) ident(faFindEveryFile)operator(;) + ident(FileReturn)operator(:) ident(TFileNameFunc) operator(=) reserved(nil)operator(\):) ident(Boolean)operator(;) +reserved(function) ident(FindAllFirst)operator(()reserved(const) ident(Mask)operator(:) reserved(string)operator(;) ident(ScanSubDirs)operator(:) ident(Boolean) operator(=) ident(True)operator(;) + ident(Attributes)operator(:) ident(Integer) operator(=) ident(faFindEveryFile)operator(\):) reserved(string)operator(;) + +reserved(function) ident(FullOSInfo)operator(:) reserved(string)operator(;) +reserved(function) ident(Win32PlatformStr)operator(:) reserved(string)operator(;) +reserved(function) ident(Win9x)operator(:) ident(Boolean)operator(;) +reserved(function) ident(WinNT)operator(:) ident(Boolean)operator(;) +reserved(function) ident(Win2000)operator(:) ident(Boolean)operator(;) +reserved(function) ident(WinXP)operator(:) ident(Boolean)operator(;) + +reserved(var) + ident(MyDir)operator(:) reserved(string) operator(=) string<delimiter(')delimiter(')>operator(;) + ident(LastSuccessRes)operator(:) ident(Integer) operator(=) integer(0)operator(;) + +comment({ Backward compatibility }) +preprocessor({$IFNDEF VER130}) +reserved(function) ident(SameText)operator(()reserved(const) ident(S1)operator(,) ident(S2)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) +preprocessor({$ENDIF}) + +reserved(implementation) +preprocessor({$IFNDEF VER140}) +reserved(uses) ident(FileCtrl)operator(;) +preprocessor({$ENDIF}) + +preprocessor({$IFNDEF VER130}) +reserved(function) ident(SameText)operator(()reserved(const) ident(S1)operator(,) ident(S2)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(CompareText)operator(()ident(S1)operator(,) ident(S2)operator(\)) operator(=) integer(0)operator(;) +reserved(end)operator(;) +preprocessor({$ENDIF}) + +reserved(procedure) ident(Report)operator(()reserved(const) ident(ReportName)operator(,) ident(Text)operator(:) reserved(string)operator(\);) +reserved(var) + ident(F)operator(:) ident(TextFile)operator(;) + ident(FileName)operator(:) reserved(string)operator(;) +reserved(begin) + ident(FileName) operator(:=) ident(MyDir) operator(+) ident(ReportName) operator(+) string<delimiter(')content(.rep)delimiter(')>operator(;) + ident(Assign)operator(()ident(F)operator(,) ident(FileName)operator(\);) + reserved(try) + reserved(if) reserved(not) ident(FileExists)operator(()ident(FileName)operator(\)) reserved(then) + ident(Rewrite)operator(()ident(F)operator(\)) + reserved(else) + ident(Append)operator(()ident(F)operator(\);) + ident(WriteLn)operator(()ident(F)operator(,) ident(Text)operator(\);) + reserved(finally) + ident(Close)operator(()ident(F)operator(\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(ClearReport)operator(()reserved(const) ident(ReportName)operator(:) reserved(string)operator(\);) +reserved(var) + ident(FileName)operator(:) reserved(string)operator(;) +reserved(begin) + ident(FileName) operator(:=) ident(MyDir) operator(+) ident(ReportName) operator(+) string<delimiter(')content(.rep)delimiter(')>operator(;) + ident(DeleteFile)operator(()ident(FileName)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(ReportFmt)operator(()reserved(const) ident(ReportName)operator(,) ident(Fmt)operator(:) reserved(string)operator(;) reserved(const) ident(Args)operator(:) reserved(array) reserved(of) reserved(const)operator(\);) +reserved(begin) + ident(Report)operator(()ident(ReportName)operator(,) ident(Format)operator(()ident(Fmt)operator(,) ident(Args)operator(\)\);) +reserved(end)operator(;) + +reserved(procedure) ident(GetParams)operator(()ident(Strings)operator(:) ident(TStrings)operator(\);) +reserved(var) + ident(P)operator(:) ident(PChar)operator(;) + ident(Param)operator(:) reserved(string)operator(;) + + reserved(function) ident(GetParamStr)operator(()reserved(var) ident(P)operator(:) ident(PChar)operator(;) reserved(var) ident(Param)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) + reserved(var) + ident(Quoted)operator(:) ident(Boolean)operator(;) + reserved(begin) + ident(Param) operator(:=) string<delimiter(')delimiter(')>operator(;) + + reserved(repeat) + reserved(while) operator(()ident(P)operator([)integer(0)operator(]) operator(<>) char(#0)operator(\)) reserved(and) operator(()ident(P)operator([)integer(0)operator(]) operator(<=) char<delimiter(')content( )delimiter(')>operator(\)) reserved(do) + ident(Inc)operator(()ident(P)operator(\);) + + ident(Quoted) operator(:=) ident(False)operator(;) + reserved(while) ident(P)operator([)integer(0)operator(]) operator(<>) char(#0) reserved(do) reserved(begin) + reserved(if) ident(P)operator([)integer(0)operator(]) operator(=) char<delimiter(')content(")delimiter(')> reserved(then) reserved(begin) + ident(Quoted) operator(:=) reserved(not) ident(Quoted)operator(;) + ident(Inc)operator(()ident(P)operator(\);) + ident(Continue)operator(;) reserved(end)operator(;) + reserved(if) operator(()ident(P)operator([)integer(0)operator(]) operator(<=) char<delimiter(')content( )delimiter(')>operator(\)) reserved(and) reserved(not) ident(Quoted) reserved(then) + ident(Break)operator(;) + ident(Param) operator(:=) ident(Param) operator(+) ident(P)operator([)integer(0)operator(];) + ident(Inc)operator(()ident(P)operator(\);) + reserved(end)operator(;) + reserved(until) operator(()ident(Param) operator(<>) string<delimiter(')delimiter(')>operator(\)) reserved(or) operator(()ident(P)operator([)integer(0)operator(]) operator(=) char(#0)operator(\);) + + ident(Result) operator(:=) ident(Param) operator(<>) string<delimiter(')delimiter(')>operator(;) + reserved(end)operator(;) + +reserved(begin) + ident(Strings)operator(.)ident(Clear)operator(;) + ident(P) operator(:=) ident(GetCommandLine)operator(;) + ident(GetParamStr)operator(()ident(P)operator(,) ident(Param)operator(\);) + reserved(while) ident(GetParamStr)operator(()ident(P)operator(,) ident(Param)operator(\)) reserved(do) + ident(Strings)operator(.)ident(Add)operator(()ident(Param)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(GetParams)operator(()reserved(const) ident(Separator)operator(:) reserved(string) operator(=) char<delimiter(')content( )delimiter(')>operator(\):) reserved(string)operator(;) +reserved(var) + ident(SL)operator(:) ident(TStringList)operator(;) +reserved(begin) + ident(SL) operator(:=) ident(TStringList)operator(.)ident(Create)operator(;) + ident(GetParams)operator(()ident(SL)operator(\);) + ident(Result) operator(:=) ident(Join)operator(()ident(SL)operator(,) ident(Separator)operator(\);) + ident(SL)operator(.)ident(Free)operator(;) +reserved(end)operator(;) + +reserved(function) ident(Switch)operator(()reserved(const) ident(Switch)operator(:) reserved(string)operator(;) reserved(const) ident(PrefixChars)operator(:) ident(TCharSet) operator(=) ident(SwitchChars)operator(;) + ident(IgnoreCase)operator(:) ident(Boolean) operator(=) ident(True)operator(\):) ident(Boolean)operator(;) +comment(//= SysUtils.FindCmdLineSwitch) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) + ident(s)operator(:) reserved(string)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(True)operator(;) + + reserved(for) ident(i) operator(:=) integer(1) reserved(to) ident(ParamCount) reserved(do) reserved(begin) + ident(s) operator(:=) ident(ParamStr)operator(()ident(i)operator(\);) + + reserved(if) operator(()ident(s) operator(<>) string<delimiter(')delimiter(')>operator(\)) reserved(and) operator(()ident(s)operator([)integer(1)operator(]) reserved(in) ident(PrefixChars)operator(\)) reserved(then) reserved(begin) + comment(//i know that always s <> '', but this is saver) + ident(s) operator(:=) ident(Copy)operator(()ident(s)operator(,) integer(2)operator(,) ident(MaxInt)operator(\);) + reserved(if) operator(()ident(s) operator(=) ident(Switch)operator(\)) reserved(or) operator(()ident(IgnoreCase) reserved(and) operator(()integer(0)operator(=)ident(AnsiCompareText)operator(()ident(s)operator(,) ident(Switch)operator(\)\)\)) reserved(then) + ident(Exit)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + ident(Result) operator(:=) ident(False)operator(;) +reserved(end)operator(;) + +reserved(function) ident(ParamNum)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\):) ident(Integer)operator(;) +reserved(begin) + reserved(for) ident(Result) operator(:=) integer(1) reserved(to) ident(ParamCount) reserved(do) + reserved(if) integer(0)operator(=)ident(AnsiCompareText)operator(()ident(ParamStr)operator(()ident(Result)operator(\),) ident(S)operator(\)) reserved(then) + ident(Exit)operator(;) + + ident(Result) operator(:=) integer(0)operator(;) +reserved(end)operator(;) + +reserved(function) ident(ParamPrefixNum)operator(()reserved(const) ident(Prefix)operator(:) reserved(string)operator(\):) ident(Integer)operator(;) +reserved(var) + ident(Len)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Len) operator(:=) ident(Length)operator(()ident(Prefix)operator(\);) + reserved(for) ident(Result) operator(:=) integer(1) reserved(to) ident(ParamCount) reserved(do) + reserved(if) integer(0)operator(=)ident(AnsiCompareText)operator(()ident(Copy)operator(()ident(ParamStr)operator(()ident(Result)operator(\),) integer(1)operator(,) ident(Len)operator(\),) ident(Prefix)operator(\)) reserved(then) + ident(Exit)operator(;) + + ident(Result) operator(:=) integer(0)operator(;) +reserved(end)operator(;) + +reserved(function) ident(Param)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(ParamNum)operator(()ident(S)operator(\)) operator(>) integer(0)operator(;) +reserved(end)operator(;) + +reserved(function) ident(ParamPrefix)operator(()reserved(const) ident(Prefix)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(ParamPrefixNum)operator(()ident(Prefix)operator(\)) operator(>) integer(0)operator(;) +reserved(end)operator(;) + +reserved(function) ident(GetParam)operator(()reserved(const) ident(Prefix)operator(:) reserved(string) operator(=) string<delimiter(')delimiter(')>operator(;) reserved(const) ident(Default)operator(:) reserved(string) operator(=) string<delimiter(')delimiter(')>operator(\):) reserved(string)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(Default)operator(;) + + reserved(if) ident(Prefix) operator(=) string<delimiter(')delimiter(')> reserved(then) reserved(begin) + ident(Result) operator(:=) ident(ParamStr)operator(()integer(1)operator(\);) + ident(Exit)operator(;) reserved(end)operator(;) + + ident(i) operator(:=) ident(ParamPrefixNum)operator(()ident(Prefix)operator(\);) + reserved(if) ident(i) operator(>) integer(0) reserved(then) + ident(Result) operator(:=) ident(Copy)operator(()ident(ParamStr)operator(()ident(i)operator(\),) ident(Length)operator(()ident(Prefix)operator(\)) operator(+) integer(1)operator(,) ident(MaxInt)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(GetMyDir)operator(()ident(FullPath)operator(:) ident(Boolean) operator(=) ident(False)operator(\):) reserved(string)operator(;) +reserved(var) + ident(Buffer)operator(:) reserved(array)operator([)integer(0)operator(..)integer(260)operator(]) reserved(of) ident(Char)operator(;) +reserved(begin) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + ident(SetString)operator(()ident(Result)operator(,) ident(Buffer)operator(,) ident(GetModuleFileName)operator(()integer(0)operator(,) ident(Buffer)operator(,) ident(SizeOf)operator(()ident(Buffer)operator(\)\)\);) + reserved(if) ident(FullPath) reserved(then) + ident(Result) operator(:=) ident(GetFileNew)operator(()ident(Result)operator(\);) + ident(Result) operator(:=) ident(ExtractPath)operator(()ident(Result)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(WinDir)operator(:) reserved(string)operator(;) +reserved(var) + ident(Res)operator(:) ident(PChar)operator(;) +reserved(begin) + ident(Result) operator(:=) char<delimiter(')content(\\)delimiter(')>operator(;) + ident(GetMem)operator(()ident(Res)operator(,) ident(MAX_PATH)operator(\);) + ident(GetWindowsDirectory)operator(()ident(Res)operator(,) ident(MAX_PATH)operator(\);) + ident(Result) operator(:=) ident(Res) operator(+) char<delimiter(')content(\\)delimiter(')>operator(;) + ident(FreeMem)operator(()ident(Res)operator(,) ident(MAX_PATH)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(SysDir)operator(:) reserved(string)operator(;) +reserved(var) + ident(Res)operator(:) ident(PChar)operator(;) +reserved(begin) + ident(Result) operator(:=) char<delimiter(')content(\\)delimiter(')>operator(;) + ident(GetMem)operator(()ident(Res)operator(,) ident(MAX_PATH)operator(\);) + ident(GetSystemDirectory)operator(()ident(Res)operator(,) ident(MAX_PATH)operator(\);) + ident(Result) operator(:=) ident(Res) operator(+) char<delimiter(')content(\\)delimiter(')>operator(;) + ident(FreeMem)operator(()ident(Res)operator(,) ident(MAX_PATH)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(UserName)operator(:) reserved(string)operator(;) +reserved(var) + ident(Len)operator(:) ident(Cardinal)operator(;) + ident(Res)operator(:) ident(PChar)operator(;) +reserved(begin) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + ident(GetMem)operator(()ident(Res)operator(,) ident(MAX_PATH)operator(\);) + ident(Len) operator(:=) ident(MAX_PATH)operator(;) + ident(GetUserName)operator(()ident(Res)operator(,) ident(Len)operator(\);) + ident(Result) operator(:=) ident(Res)operator(;) + ident(FreeMem)operator(()ident(Res)operator(,) ident(MAX_PATH)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(FirstChar)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\):) ident(Char)operator(;) +reserved(begin) + reserved(if) ident(s) operator(=) string<delimiter(')delimiter(')> reserved(then) + ident(Result) operator(:=) char(#0) + reserved(else) + ident(Result) operator(:=) ident(s)operator([)integer(1)operator(];) +reserved(end)operator(;) + +reserved(function) ident(LastChar)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\):) ident(Char)operator(;) +reserved(begin) + reserved(if) ident(s) operator(=) string<delimiter(')delimiter(')> reserved(then) + ident(Result) operator(:=) char(#0) + reserved(else) + ident(Result) operator(:=) ident(s)operator([)ident(Length)operator(()ident(s)operator(\)];) +reserved(end)operator(;) + +reserved(function) ident(CharPos)operator(()ident(C)operator(:) ident(Char)operator(;) reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Offset)operator(:) ident(Integer) operator(=) integer(1)operator(\):) ident(Integer)operator(;) +reserved(var) + ident(MaxPosToSearch)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(Offset)operator(;) + ident(MaxPosToSearch) operator(:=) ident(Length)operator(()ident(S)operator(\);) + + reserved(while) ident(Result) operator(<=) ident(MaxPosToSearch) reserved(do) reserved(begin) + reserved(if) ident(S)operator([)ident(Result)operator(]) operator(=) ident(C) reserved(then) + ident(Exit)operator(;) + ident(Inc)operator(()ident(Result)operator(\);) + reserved(end)operator(;) + + ident(Result) operator(:=) integer(0)operator(;) +reserved(end)operator(;) + +reserved(function) ident(CharPos)operator(()ident(C)operator(:) ident(TCharSet)operator(;) reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Offset)operator(:) ident(Integer) operator(=) integer(1)operator(\):) ident(Integer)operator(;) +reserved(var) + ident(MaxPosToSearch)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(Offset)operator(;) + ident(MaxPosToSearch) operator(:=) ident(Length)operator(()ident(S)operator(\);) + + reserved(while) ident(Result) operator(<=) ident(MaxPosToSearch) reserved(do) reserved(begin) + reserved(if) ident(S)operator([)ident(Result)operator(]) reserved(in) ident(C) reserved(then) + ident(Exit)operator(;) + ident(Inc)operator(()ident(Result)operator(\);) + reserved(end)operator(;) + + ident(Result) operator(:=) integer(0)operator(;) +reserved(end)operator(;) + +reserved(function) ident(CharPosR)operator(()ident(C)operator(:) ident(Char)operator(;) reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Offset)operator(:) ident(Integer) operator(=) operator(-)integer(1)operator(\):) ident(Integer)operator(;) +reserved(begin) + reserved(if) ident(Offset) operator(<) integer(0) reserved(then) + ident(Result) operator(:=) ident(Length)operator(()ident(S)operator(\)) operator(+) integer(1) operator(-) ident(Offset) + reserved(else) + ident(Result) operator(:=) ident(Offset)operator(;) + reserved(if) ident(Result) operator(>) ident(Length)operator(()ident(S)operator(\)) reserved(then) + ident(Result) operator(:=) ident(Length)operator(()ident(S)operator(\);) + + reserved(while) ident(Result) operator(>) integer(0) reserved(do) reserved(begin) + reserved(if) ident(S)operator([)ident(Result)operator(]) operator(=) ident(C) reserved(then) + ident(Exit)operator(;) + ident(Dec)operator(()ident(Result)operator(\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(function) ident(PosEx)operator(()reserved(const) ident(SubStr)operator(,) ident(S)operator(:) reserved(string)operator(;) ident(Offset)operator(:) ident(Integer) operator(=) integer(1)operator(\):) ident(Integer)operator(;) +reserved(var) + ident(MaxPosToSearch)operator(,) ident(LenSubStr)operator(,) ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + reserved(if) ident(SubStr) operator(=) string<delimiter(')delimiter(')> reserved(then) reserved(begin) + ident(Result) operator(:=) integer(0)operator(;) + ident(Exit)operator(;) reserved(end)operator(;) + + reserved(if) ident(Offset) operator(<) integer(1) reserved(then) + ident(Result) operator(:=) integer(1) + reserved(else) + ident(Result) operator(:=) ident(Offset)operator(;) + + ident(LenSubStr) operator(:=) ident(Length)operator(()ident(SubStr)operator(\);) + ident(MaxPosToSearch) operator(:=) ident(Length)operator(()ident(S)operator(\)) operator(-) ident(LenSubStr) operator(+) integer(1)operator(;) + + reserved(while) ident(Result) operator(<=) ident(MaxPosToSearch) reserved(do) reserved(begin) + reserved(if) ident(S)operator([)ident(Result)operator(]) operator(=) ident(SubStr)operator([)integer(1)operator(]) reserved(then) reserved(begin) + ident(i) operator(:=) integer(1)operator(;) + + reserved(while) operator(()ident(i) operator(<) ident(LenSubStr)operator(\)) + reserved(and) operator(()ident(S)operator([)ident(Result) operator(+) ident(i)operator(]) operator(=) ident(SubStr)operator([)ident(i) operator(+) integer(1)operator(]\)) reserved(do) + ident(Inc)operator(()ident(i)operator(\);) + + reserved(if) ident(i) operator(=) ident(LenSubStr) reserved(then) + ident(Exit)operator(;) + reserved(end)operator(;) + ident(Inc)operator(()ident(Result)operator(\);) + reserved(end)operator(;) + + ident(Result) operator(:=) integer(0)operator(;) +reserved(end)operator(;) + +reserved(function) ident(PosExText)operator(()reserved(const) ident(SubStr)operator(,) ident(S)operator(:) reserved(string)operator(;) ident(Offset)operator(:) ident(Integer) operator(=) integer(1)operator(\):) ident(Integer)operator(;) +reserved(var) + ident(MaxPosToSearch)operator(,) ident(LenSubStr)operator(,) ident(i)operator(:) ident(Integer)operator(;) + + reserved(function) ident(SameChar)operator(()ident(a)operator(,) ident(b)operator(:) ident(Char)operator(\):) ident(Boolean)operator(;) + reserved(begin) + ident(Result) operator(:=) ident(UpCase)operator(()ident(a)operator(\)) operator(=) ident(UpCase)operator(()ident(b)operator(\)) + reserved(end)operator(;) + +reserved(begin) + reserved(if) ident(SubStr) operator(=) string<delimiter(')delimiter(')> reserved(then) reserved(begin) + ident(Result) operator(:=) integer(0)operator(;) + ident(Exit)operator(;) reserved(end)operator(;) + + reserved(if) ident(Offset) operator(<) integer(1) reserved(then) + ident(Result) operator(:=) integer(1) + reserved(else) + ident(Result) operator(:=) ident(Offset)operator(;) + + ident(LenSubStr) operator(:=) ident(Length)operator(()ident(SubStr)operator(\);) + ident(MaxPosToSearch) operator(:=) ident(Length)operator(()ident(S)operator(\)) operator(-) ident(LenSubStr) operator(+) integer(1)operator(;) + + reserved(while) ident(Result) operator(<=) ident(MaxPosToSearch) reserved(do) reserved(begin) + reserved(if) ident(SameChar)operator(()ident(S)operator([)ident(Result)operator(],) ident(SubStr)operator([)integer(1)operator(]\)) reserved(then) reserved(begin) + ident(i) operator(:=) integer(1)operator(;) + + reserved(while) operator(()ident(i) operator(<) ident(LenSubStr)operator(\)) + reserved(and) operator(()ident(SameChar)operator(()ident(S)operator([)ident(Result) operator(+) ident(i)operator(],) ident(SubStr)operator([)ident(i) operator(+) integer(1)operator(]\)\)) reserved(do) + ident(Inc)operator(()ident(i)operator(\);) + + reserved(if) ident(i) operator(=) ident(LenSubStr) reserved(then) + ident(Exit)operator(;) + reserved(end)operator(;) + ident(Inc)operator(()ident(Result)operator(\);) + reserved(end)operator(;) + + ident(Result) operator(:=) integer(0)operator(;) +reserved(end)operator(;) + +reserved(function) ident(PosExAnsiText)operator(()reserved(const) ident(SubStr)operator(,) ident(S)operator(:) reserved(string)operator(;) ident(Offset)operator(:) ident(Integer) operator(=) integer(1)operator(\):) ident(Integer)operator(;) +reserved(var) + ident(MaxPosToSearch)operator(,) ident(LenSubStr)operator(,) ident(i)operator(:) ident(Integer)operator(;) + + reserved(function) ident(SameChar)operator(()ident(a)operator(,) ident(b)operator(:) ident(Char)operator(\):) ident(Boolean)operator(;) + reserved(begin) + ident(Result) operator(:=) ident(CharLower)operator(()ident(PChar)operator(()ident(a)operator(\)\)) operator(=) ident(CharLower)operator(()ident(PChar)operator(()ident(b)operator(\)\);) + reserved(end)operator(;) + +reserved(begin) + reserved(if) ident(SubStr) operator(=) string<delimiter(')delimiter(')> reserved(then) reserved(begin) + ident(Result) operator(:=) integer(0)operator(;) + ident(Exit)operator(;) reserved(end)operator(;) + + reserved(if) ident(Offset) operator(<) integer(1) reserved(then) + ident(Result) operator(:=) integer(1) + reserved(else) + ident(Result) operator(:=) ident(Offset)operator(;) + + ident(LenSubStr) operator(:=) ident(Length)operator(()ident(SubStr)operator(\);) + ident(MaxPosToSearch) operator(:=) ident(Length)operator(()ident(S)operator(\)) operator(-) ident(LenSubStr) operator(+) integer(1)operator(;) + + reserved(while) ident(Result) operator(<=) ident(MaxPosToSearch) reserved(do) reserved(begin) + reserved(if) ident(SameChar)operator(()ident(S)operator([)ident(Result)operator(],) ident(SubStr)operator([)integer(1)operator(]\)) reserved(then) reserved(begin) + ident(i) operator(:=) integer(1)operator(;) + + reserved(while) operator(()ident(i) operator(<) ident(LenSubStr)operator(\)) + reserved(and) operator(()ident(SameChar)operator(()ident(S)operator([)ident(Result) operator(+) ident(i)operator(],) ident(SubStr)operator([)ident(i) operator(+) integer(1)operator(]\)\)) reserved(do) + ident(Inc)operator(()ident(i)operator(\);) + + reserved(if) ident(i) operator(=) ident(LenSubStr) reserved(then) + ident(Exit)operator(;) + reserved(end)operator(;) + ident(Inc)operator(()ident(Result)operator(\);) + reserved(end)operator(;) + + ident(Result) operator(:=) integer(0)operator(;) +reserved(end)operator(;) + +reserved(function) ident(UntilChar)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Brake)operator(:) ident(Char)operator(\):) reserved(string)operator(;) +reserved(var) + ident(p)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(p) operator(:=) ident(CharPos)operator(()ident(Brake)operator(,) ident(S)operator(\);) + + reserved(if) ident(p) operator(>) integer(0) reserved(then) + ident(Result) operator(:=) ident(Copy)operator(()ident(S)operator(,) integer(1)operator(,) ident(p) operator(-) integer(1)operator(\)) + reserved(else) + ident(Result) operator(:=) ident(S)operator(;) +reserved(end)operator(;) + +reserved(function) ident(UntilChar)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Brake)operator(:) ident(TCharSet)operator(\):) reserved(string)operator(;) +reserved(var) + ident(p)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + ident(p) operator(:=) ident(CharPos)operator(()ident(Brake)operator(,) ident(S)operator(\);) + + reserved(if) ident(p) operator(>) integer(0) reserved(then) + ident(Result) operator(:=) ident(Copy)operator(()ident(S)operator(,) integer(1)operator(,) ident(p) operator(-) integer(1)operator(\)) + reserved(else) + ident(Result) operator(:=) ident(S)operator(;) +reserved(end)operator(;) + +reserved(function) ident(UntilLastChar)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Brake)operator(:) ident(Char)operator(;) + ident(IgnoreNoBrake)operator(:) ident(Boolean) operator(=) ident(True)operator(\):) reserved(string)operator(;) +reserved(var) + ident(p)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + ident(p) operator(:=) ident(CharPosR)operator(()ident(Brake)operator(,) ident(S)operator(\);) + + reserved(if) ident(p) operator(>) integer(0) reserved(then) + ident(Result) operator(:=) ident(Copy)operator(()ident(S)operator(,) integer(1)operator(,) ident(p) operator(-) integer(1)operator(\)) + reserved(else) reserved(if) ident(IgnoreNoBrake) reserved(then) + ident(Result) operator(:=) ident(S)operator(;) +reserved(end)operator(;) + +reserved(function) ident(FromChar)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Brake)operator(:) ident(Char)operator(\):) reserved(string)operator(;) +reserved(var) + ident(p)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + ident(p) operator(:=) ident(CharPos)operator(()ident(Brake)operator(,) ident(S)operator(\);) + + reserved(if) ident(p) operator(>) integer(0) reserved(then) + ident(Result) operator(:=) ident(Copy)operator(()ident(S)operator(,) ident(p) operator(+) integer(1)operator(,) ident(Length)operator(()ident(S)operator(\)) operator(-) ident(p)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(FromChar)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Brake)operator(:) ident(TCharSet)operator(\):) reserved(string)operator(;) +reserved(var) + ident(p)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + ident(p) operator(:=) ident(CharPos)operator(()ident(Brake)operator(,) ident(S)operator(\);) + + reserved(if) ident(p) operator(>) integer(0) reserved(then) + ident(Result) operator(:=) ident(Copy)operator(()ident(S)operator(,) ident(p) operator(+) integer(1)operator(,) ident(Length)operator(()ident(S)operator(\)) operator(-) ident(p)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(FromLastChar)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Brake)operator(:) ident(Char)operator(;) + ident(IgnoreNoBrake)operator(:) ident(Boolean) operator(=) ident(False)operator(\):) reserved(string)operator(;) +reserved(var) + ident(p)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + ident(p) operator(:=) ident(CharPosR)operator(()ident(Brake)operator(,) ident(S)operator(\);) + + reserved(if) ident(p) operator(>) integer(0) reserved(then) + ident(Result) operator(:=) ident(Copy)operator(()ident(S)operator(,) ident(p) operator(+) integer(1)operator(,) ident(Length)operator(()ident(S)operator(\)) operator(-) ident(p)operator(\)) + reserved(else) reserved(if) ident(IgnoreNoBrake) reserved(then) + ident(Result) operator(:=) ident(S)operator(;) +reserved(end)operator(;) + +reserved(function) ident(BetweenChars)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Start)operator(,) ident(Finish)operator(:) ident(Char)operator(;) + ident(Inclusive)operator(:) ident(Boolean) operator(=) ident(False)operator(\):) reserved(string)operator(;) +reserved(var) + ident(p)operator(,) ident(fin)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + + ident(p) operator(:=) ident(CharPos)operator(()ident(Start)operator(,) ident(S)operator(\);) + reserved(if) ident(p) operator(=) integer(0) reserved(then) + ident(Exit)operator(;) + + ident(fin) operator(:=) ident(CharPos)operator(()ident(Finish)operator(,) ident(S)operator(,) ident(p) operator(+) integer(1)operator(\);) + reserved(if) ident(fin) operator(=) integer(0) reserved(then) + ident(Exit)operator(;) + + reserved(if) reserved(not) ident(Inclusive) reserved(then) reserved(begin) + ident(Inc)operator(()ident(p)operator(\);) + ident(Dec)operator(()ident(fin)operator(\);) + reserved(end)operator(;) + + ident(Result) operator(:=) ident(Copy)operator(()ident(S)operator(,) ident(p)operator(,) ident(fin) operator(-) ident(p) operator(+) integer(1)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(UntilStr)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Brake)operator(:) reserved(string)operator(\):) reserved(string)operator(;) +reserved(var) + ident(p)operator(:) ident(Integer)operator(;) +reserved(begin) + reserved(if) ident(Length)operator(()ident(Brake)operator(\)) operator(=) integer(1) reserved(then) reserved(begin) + ident(Result) operator(:=) ident(UntilChar)operator(()ident(S)operator(,) ident(Brake)operator([)integer(1)operator(]\);) + ident(Exit)operator(;) reserved(end)operator(;) + + ident(p) operator(:=) ident(PosEx)operator(()ident(Brake)operator(,) ident(S)operator(\);) + + reserved(if) ident(p) operator(>) integer(0) reserved(then) + ident(Result) operator(:=) ident(Copy)operator(()ident(S)operator(,) integer(1)operator(,) ident(p) operator(-) integer(1)operator(\)) + reserved(else) + ident(Result) operator(:=) ident(S)operator(;) +reserved(end)operator(;) + +reserved(function) ident(FromStr)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Brake)operator(:) reserved(string)operator(\):) reserved(string)operator(;) +reserved(var) + ident(p)operator(:) ident(Integer)operator(;) +reserved(begin) + reserved(if) ident(Length)operator(()ident(Brake)operator(\)) operator(=) integer(1) reserved(then) reserved(begin) + ident(Result) operator(:=) ident(FromChar)operator(()ident(S)operator(,) ident(Brake)operator([)integer(1)operator(]\);) + ident(Exit)operator(;) reserved(end)operator(;) + + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + ident(p) operator(:=) ident(PosEx)operator(()ident(Brake)operator(,) ident(s)operator(\);) + + reserved(if) ident(p) operator(>) integer(0) reserved(then) reserved(begin) + ident(Inc)operator(()ident(p)operator(,) ident(Length)operator(()ident(Brake)operator(\)\);) + ident(Result) operator(:=) ident(Copy)operator(()ident(S)operator(,) ident(p)operator(,) ident(Length)operator(()ident(S)operator(\)) operator(-) ident(p) operator(+) integer(1)operator(\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(function) ident(StringWrap)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Width)operator(:) ident(Integer)operator(;) reserved(const) ident(LineEnd)operator(:) reserved(string) operator(=) ident(EOL)operator(\):) reserved(string)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + reserved(if) operator(()ident(S) operator(=) string<delimiter(')delimiter(')>operator(\)) reserved(or) operator(()ident(Width) operator(<) integer(1)operator(\)) reserved(then) + ident(Exit)operator(;) + + ident(i) operator(:=) integer(1)operator(;) + reserved(while) ident(True) reserved(do) reserved(begin) + ident(Result) operator(:=) ident(Result) operator(+) ident(Copy)operator(()ident(S)operator(,) ident(i)operator(,) ident(Width)operator(\);) + ident(Inc)operator(()ident(i)operator(,) ident(Width)operator(\);) + reserved(if) ident(i) operator(<=) ident(Length)operator(()ident(S)operator(\)) reserved(then) + ident(Result) operator(:=) ident(Result) operator(+) ident(LineEnd) + reserved(else) + ident(Exit)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(function) ident(Split)operator(()reserved(const) ident(S)operator(,) ident(Separator)operator(:) reserved(string)operator(;) ident(IgnoreMultiSep)operator(:) ident(Boolean) operator(=) ident(True)operator(;) + ident(MinCount)operator(:) ident(Integer) operator(=) integer(0)operator(\):) ident(TStrA)operator(;) +reserved(var) + ident(p)operator(,) ident(fin)operator(,) ident(SepLen)operator(:) ident(Integer)operator(;) + + reserved(procedure) ident(Add)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\);) + reserved(begin) + reserved(if) ident(IgnoreMultiSep) reserved(and) operator(()ident(S) operator(=) string<delimiter(')delimiter(')>operator(\)) reserved(then) + ident(Exit)operator(;) + ident(SetLength)operator(()ident(Result)operator(,) ident(Length)operator(()ident(Result)operator(\)) operator(+) integer(1)operator(\);) + ident(Result)operator([)ident(High)operator(()ident(Result)operator(\)]) operator(:=) ident(S)operator(;) + reserved(end)operator(;) + +reserved(begin) + reserved(if) ident(S) operator(=) string<delimiter(')delimiter(')> reserved(then) reserved(begin) + reserved(if) ident(Length)operator(()ident(Result)operator(\)) operator(<) ident(MinCount) reserved(then) + ident(SetLength)operator(()ident(Result)operator(,) ident(MinCount)operator(\);) + ident(Exit)operator(;) reserved(end)operator(;) + + ident(Result) operator(:=) reserved(nil)operator(;) + ident(SepLen) operator(:=) ident(Length)operator(()ident(Separator)operator(\);) + + ident(p) operator(:=) integer(1)operator(;) + ident(fin) operator(:=) ident(PosEx)operator(()ident(Separator)operator(,) ident(S)operator(\);) + reserved(while) ident(fin) operator(>) integer(0) reserved(do) reserved(begin) + ident(Add)operator(()ident(Copy)operator(()ident(S)operator(,) ident(p)operator(,) ident(fin) operator(-) ident(p)operator(\)\);) + ident(p) operator(:=) ident(fin) operator(+) ident(SepLen)operator(;) + ident(fin) operator(:=) ident(PosEx)operator(()ident(Separator)operator(,) ident(S)operator(,) ident(p)operator(\);) + reserved(end)operator(;) + ident(Add)operator(()ident(Copy)operator(()ident(S)operator(,) ident(p)operator(,) ident(Length)operator(()ident(S)operator(\)) operator(-) ident(p) operator(+) integer(1)operator(\)\);) + + reserved(if) ident(Length)operator(()ident(Result)operator(\)) operator(<) ident(MinCount) reserved(then) + ident(SetLength)operator(()ident(Result)operator(,) ident(MinCount)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(Split)operator(()reserved(const) ident(S)operator(,) ident(Separator)operator(:) reserved(string)operator(;) ident(Strings)operator(:) ident(TStrings)operator(;) + ident(IgnoreMultiSep)operator(:) ident(Boolean) operator(=) ident(True)operator(\);) +reserved(var) + ident(p)operator(,) ident(fin)operator(,) ident(SepLen)operator(:) ident(Integer)operator(;) + + reserved(procedure) ident(Add)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\);) + reserved(begin) + reserved(if) ident(IgnoreMultiSep) reserved(and) operator(()ident(S) operator(=) string<delimiter(')delimiter(')>operator(\)) reserved(then) + ident(Exit)operator(;) + ident(Strings)operator(.)ident(Add)operator(()ident(S)operator(\);) + reserved(end)operator(;) + +reserved(begin) + reserved(if) ident(S) operator(=) string<delimiter(')delimiter(')> reserved(then) + ident(Exit)operator(;) + + ident(Strings)operator(.)ident(BeginUpdate)operator(;) + ident(SepLen) operator(:=) ident(Length)operator(()ident(Separator)operator(\);) + ident(p) operator(:=) integer(1)operator(;) + ident(fin) operator(:=) ident(PosEx)operator(()ident(Separator)operator(,) ident(S)operator(\);) + reserved(while) ident(fin) operator(>) integer(0) reserved(do) reserved(begin) + ident(Add)operator(()ident(Copy)operator(()ident(S)operator(,) ident(p)operator(,) ident(fin) operator(-) ident(p)operator(\)\);) + ident(p) operator(:=) ident(fin) operator(+) ident(SepLen)operator(;) + ident(fin) operator(:=) ident(PosEx)operator(()ident(Separator)operator(,) ident(S)operator(,) ident(p)operator(\);) + reserved(end)operator(;) + ident(Add)operator(()ident(Copy)operator(()ident(S)operator(,) ident(p)operator(,) ident(Length)operator(()ident(S)operator(\)) operator(-) ident(p) operator(+) integer(1)operator(\)\);) + ident(Strings)operator(.)ident(EndUpdate)operator(;) +reserved(end)operator(;) + +reserved(function) ident(Split)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Separators)operator(:) ident(TCharSet)operator(;) + ident(IgnoreMultiSep)operator(:) ident(Boolean) operator(=) ident(True)operator(;) ident(MinCount)operator(:) ident(Integer) operator(=) integer(0)operator(\):) ident(TStrA)operator(;) +reserved(var) + ident(p)operator(,) ident(fin)operator(:) ident(Integer)operator(;) + + reserved(procedure) ident(Add)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\);) + reserved(begin) + reserved(if) ident(IgnoreMultiSep) reserved(and) operator(()ident(S) operator(=) string<delimiter(')delimiter(')>operator(\)) reserved(then) + ident(Exit)operator(;) + ident(SetLength)operator(()ident(Result)operator(,) ident(Length)operator(()ident(Result)operator(\)) operator(+) integer(1)operator(\);) + ident(Result)operator([)ident(High)operator(()ident(Result)operator(\)]) operator(:=) ident(S)operator(;) + reserved(end)operator(;) + +reserved(begin) + reserved(if) ident(S) operator(=) string<delimiter(')delimiter(')> reserved(then) reserved(begin) + reserved(if) ident(Length)operator(()ident(Result)operator(\)) operator(<) ident(MinCount) reserved(then) + ident(SetLength)operator(()ident(Result)operator(,) ident(MinCount)operator(\);) + ident(Exit)operator(;) reserved(end)operator(;) + + ident(Result) operator(:=) reserved(nil)operator(;) + + ident(p) operator(:=) integer(1)operator(;) + ident(fin) operator(:=) ident(CharPos)operator(()ident(Separators)operator(,) ident(S)operator(\);) + reserved(while) ident(fin) operator(>) integer(0) reserved(do) reserved(begin) + ident(Add)operator(()ident(Copy)operator(()ident(S)operator(,) ident(p)operator(,) ident(fin) operator(-) ident(p)operator(\)\);) + ident(p) operator(:=) ident(fin) operator(+) integer(1)operator(;) + ident(fin) operator(:=) ident(CharPos)operator(()ident(Separators)operator(,) ident(S)operator(,) ident(p)operator(\);) + reserved(end)operator(;) + ident(Add)operator(()ident(Copy)operator(()ident(S)operator(,) ident(p)operator(,) ident(Length)operator(()ident(S)operator(\)) operator(-) ident(p) operator(+) integer(1)operator(\)\);) + + reserved(if) ident(Length)operator(()ident(Result)operator(\)) operator(<) ident(MinCount) reserved(then) + ident(SetLength)operator(()ident(Result)operator(,) ident(MinCount)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TileStr)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(BrakeStart)operator(:) ident(Integer)operator(;) ident(BrakeEnd)operator(:) ident(Integer)operator(;) + reserved(out) ident(Left)operator(,) ident(Right)operator(:) reserved(string)operator(\);) +reserved(begin) + ident(Left) operator(:=) ident(Copy)operator(()ident(S)operator(,) integer(1)operator(,) ident(BrakeStart)operator(-)integer(1)operator(\);) + ident(Right) operator(:=) ident(Copy)operator(()ident(S)operator(,) ident(BrakeEnd) operator(+) integer(1)operator(,) ident(MaxInt)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(Join)operator(()ident(Strings)operator(:) ident(TStrings)operator(;) ident(Separator)operator(:) reserved(string) operator(=) char<delimiter(')content( )delimiter(')>operator(\):) reserved(string)operator(;) +reserved(var) + ident(i)operator(,) ident(imax)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + ident(imax) operator(:=) ident(Strings)operator(.)ident(Count)operator(-)integer(1)operator(;) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(imax) reserved(do) reserved(begin) + ident(Result) operator(:=) ident(Result) operator(+) ident(Strings)operator([)ident(i)operator(];) + reserved(if) ident(i) operator(<) ident(imax) reserved(then) + ident(Result) operator(:=) ident(Result) operator(+) ident(Separator)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(function) ident(Join)operator(()ident(StrA)operator(:) ident(TStrA)operator(;) ident(Separator)operator(:) reserved(string) operator(=) char<delimiter(')content( )delimiter(')>operator(\):) reserved(string)operator(;) directive(overload)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(High)operator(()ident(StrA)operator(\)) reserved(do) reserved(begin) + ident(Result) operator(:=) ident(Result) operator(+) ident(StrA)operator([)ident(i)operator(];) + reserved(if) ident(i) operator(<) ident(High)operator(()ident(StrA)operator(\)) reserved(then) + ident(Result) operator(:=) ident(Result) operator(+) ident(Separator)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(function) ident(MulStr)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Count)operator(:) ident(Integer)operator(\):) reserved(string)operator(;) +reserved(var) + ident(P)operator(:) ident(PChar)operator(;) + ident(Len)operator(,) ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + reserved(if) ident(Count) operator(=) integer(0) reserved(then) + ident(Exit)operator(;) + + ident(Len) operator(:=) ident(Length)operator(()ident(S)operator(\);) + ident(SetLength)operator(()ident(Result)operator(,) ident(Len) operator(*) ident(Count)operator(\);) + + ident(P) operator(:=) ident(Pointer)operator(()ident(Result)operator(\);) + reserved(for) ident(i) operator(:=) integer(1) reserved(to) ident(Count) reserved(do) reserved(begin) + ident(Move)operator(()ident(Pointer)operator(()ident(S)operator(\)^,) ident(P)operator(^,) ident(Len)operator(\);) + ident(Inc)operator(()ident(P)operator(,) ident(Len)operator(\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(function) ident(AlignR)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Width)operator(:) ident(Integer)operator(;) ident(Filler)operator(:) ident(Char) operator(=) char<delimiter(')content( )delimiter(')>operator(\):) reserved(string)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(MulStr)operator(()ident(Filler)operator(,) ident(Width) operator(-) ident(Length)operator(()ident(S)operator(\)\)) operator(+) ident(S)operator(;) +reserved(end)operator(;) + +reserved(function) ident(MaxStr)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(MaxLen)operator(:) ident(Integer)operator(\):) reserved(string)operator(;) +reserved(var) + ident(Len)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Len) operator(:=) ident(Length)operator(()ident(S)operator(\);) + reserved(if) ident(Len) operator(<=) ident(MaxLen) reserved(then) reserved(begin) + ident(Result) operator(:=) ident(S)operator(;) + ident(Exit) reserved(end)operator(;) + + ident(Result) operator(:=) ident(Copy)operator(()ident(S)operator(,) integer(1)operator(,) ident(MaxLen) operator(-) integer(3)operator(\)) operator(+) string<delimiter(')content(...)delimiter(')>operator(;) +reserved(end)operator(;) + +reserved(function) ident(TrimAll)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\):) reserved(string)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + reserved(for) ident(i) operator(:=) integer(1) reserved(to) ident(Length)operator(()ident(S)operator(\)) reserved(do) + reserved(if) ident(S)operator([)ident(i)operator(]) operator(>) char(#32) reserved(then) + ident(Result) operator(:=) ident(Result) operator(+) ident(S)operator([)ident(i)operator(];) +reserved(end)operator(;) + +reserved(function) ident(ControlChar)operator(()ident(C)operator(:) ident(Char)operator(\):) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(C) reserved(in) ident(StrangeChars)operator(;) +reserved(end)operator(;) + +reserved(function) ident(FriendlyChar)operator(()ident(C)operator(:) ident(Char)operator(\):) ident(Char)operator(;) +reserved(begin) + reserved(case) ident(C) reserved(of) + char(#0)operator(:) ident(Result) operator(:=) char<delimiter(')content(.)delimiter(')>operator(;) + char(#1)operator(..)char(#31)operator(:) ident(Result) operator(:=) char<delimiter(')content(?)delimiter(')>operator(;) + char(#255)operator(:) ident(Result) operator(:=) char<delimiter(')content(#)delimiter(')>operator(;) + reserved(else) + ident(Result) operator(:=) ident(C)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(function) ident(FriendlyStr)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\):) reserved(string)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(SetLength)operator(()ident(Result)operator(,) ident(Length)operator(()ident(S)operator(\)\);) + reserved(for) ident(i) operator(:=) integer(1) reserved(to) ident(Length)operator(()ident(S)operator(\)) reserved(do) + ident(Result)operator([)ident(i)operator(]) operator(:=) ident(FriendlyChar)operator(()ident(S)operator([)ident(i)operator(]\);) +reserved(end)operator(;) + +reserved(function) ident(FriendlyStr)operator(()ident(a)operator(:) ident(TByteA)operator(\):) reserved(string)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(SetLength)operator(()ident(Result)operator(,) ident(Length)operator(()ident(a)operator(\)\);) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(High)operator(()ident(a)operator(\)) reserved(do) + ident(Result)operator([)ident(i) operator(+) integer(1)operator(]) operator(:=) ident(FriendlyChar)operator(()ident(Char)operator(()ident(a)operator([)ident(i)operator(]\)\);) +reserved(end)operator(;) + +reserved(function) ident(Quote)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Quoter)operator(:) ident(Char) operator(=) char<delimiter(')content(")delimiter(')>operator(\):) reserved(string)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(S)operator(;) + + reserved(if) ident(FirstChar)operator(()ident(S)operator(\)) operator(<>) ident(Quoter) reserved(then) + ident(Result) operator(:=) ident(Quoter) operator(+) ident(Result)operator(;) + + reserved(if) ident(LastChar)operator(()ident(S)operator(\)) operator(<>) ident(Quoter) reserved(then) + ident(Result) operator(:=) ident(Result) operator(+) ident(Quoter)operator(;) +reserved(end)operator(;) + +reserved(function) ident(DeQuote)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\):) reserved(string)operator(;) +reserved(begin) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + reserved(if) ident(Length)operator(()ident(S)operator(\)) operator(>) integer(2) reserved(then) + ident(Result) operator(:=) ident(Copy)operator(()ident(S)operator(,) integer(2)operator(,) ident(Length)operator(()ident(S)operator(\)) operator(-) integer(2)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(UnQuote)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\):) reserved(string)operator(;) +reserved(var) + ident(Start)operator(,) ident(Len)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Start) operator(:=) integer(1)operator(;) + ident(Len) operator(:=) ident(Length)operator(()ident(S)operator(\);) + + reserved(if) operator(()ident(S) operator(<>) string<delimiter(')delimiter(')>operator(\)) reserved(and) operator(()ident(S)operator([)integer(1)operator(]) reserved(in) operator(([)char(#0)operator(..)char(#32)operator(]) operator(+) ident(QuoteChars)operator(\)\)) reserved(then) reserved(begin) + reserved(if) operator(()ident(LastChar)operator(()ident(S)operator(\)) operator(=) ident(S)operator([)integer(1)operator(]\)) reserved(then) + ident(Dec)operator(()ident(Len)operator(\);) + ident(Inc)operator(()ident(Start)operator(\);) + reserved(end)operator(;) + + ident(Result) operator(:=) ident(Copy)operator(()ident(S)operator(,) ident(Start)operator(,) ident(Len) operator(-) ident(Start) operator(+) integer(1)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(StrNumerus)operator(()reserved(const) ident(Value)operator(:) ident(Integer)operator(;) reserved(const) ident(Singular)operator(,) ident(Plural)operator(:) reserved(string)operator(;) + reserved(const) ident(Zero)operator(:) reserved(string) operator(=) char<delimiter(')content(0)delimiter(')>operator(\):) reserved(string)operator(;) +reserved(begin) + reserved(if) ident(Abs)operator(()ident(Value)operator(\)) operator(=) integer(1) reserved(then) + ident(Result) operator(:=) ident(IntToStr)operator(()ident(Value)operator(\)) operator(+) char<delimiter(')content( )delimiter(')> operator(+) ident(Singular) + reserved(else) reserved(if) ident(Value) operator(=) integer(0) reserved(then) + ident(Result) operator(:=) ident(Zero) operator(+) char<delimiter(')content( )delimiter(')> operator(+) ident(Plural) + reserved(else) + ident(Result) operator(:=) ident(IntToStr)operator(()ident(Value)operator(\)) operator(+) char<delimiter(')content( )delimiter(')> operator(+) ident(Plural)operator(;) +reserved(end)operator(;) + +reserved(function) ident(MakeStr)operator(()reserved(const) ident(Items)operator(:) reserved(array) reserved(of) reserved(const)operator(;) ident(Separator)operator(:) reserved(string) operator(=) string<delimiter(')delimiter(')>operator(\):) reserved(string)operator(;) +reserved(const) + ident(BoolStrings)operator(:) reserved(array)operator([)ident(Boolean)operator(]) reserved(of) reserved(string) operator(=) operator(()string<delimiter(')content(False)delimiter(')>operator(,) string<delimiter(')content(True)delimiter(')>operator(\);) + +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) + + reserved(function) ident(StrOfP)operator(()ident(P)operator(:) ident(Pointer)operator(\):) reserved(string)operator(;) + reserved(begin) + reserved(if) ident(P) operator(=) reserved(nil) reserved(then) + ident(Result) operator(:=) string<delimiter(')content([nil])delimiter(')> + reserved(else) + ident(Result) operator(:=) char<delimiter(')content([)delimiter(')> operator(+) ident(IntToStr)operator(()ident(Cardinal)operator(()ident(P)operator(\)\)) operator(+) char<delimiter(')content(])delimiter(')>operator(;) + reserved(end)operator(;) + + reserved(procedure) ident(Add)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\);) + reserved(begin) + ident(Result) operator(:=) ident(Result) operator(+) ident(s) operator(+) ident(Separator)operator(;) + reserved(end)operator(;) + +reserved(begin) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(High)operator(()ident(Items)operator(\)) reserved(do) + reserved(with) ident(Items)operator([)ident(i)operator(]) reserved(do) + reserved(case) ident(VType) reserved(of) + ident(vtString)operator(:) ident(Add)operator(()ident(VString)operator(^\);) + ident(vtInteger)operator(:) ident(Add)operator(()ident(IntToStr)operator(()ident(VInteger)operator(\)\);) + ident(vtBoolean)operator(:) ident(Add)operator(()ident(BoolStrings)operator([)ident(VBoolean)operator(]\);) + ident(vtChar)operator(:) ident(Add)operator(()ident(VChar)operator(\);) + ident(vtPChar)operator(:) ident(Add)operator(()ident(VPChar)operator(\);) + ident(vtExtended)operator(:) ident(Add)operator(()ident(FloatToStr)operator(()ident(VExtended)operator(^\)\);) + ident(vtObject)operator(:) reserved(if) ident(VObject) reserved(is) ident(TComponent) reserved(then) + ident(Add)operator(()ident(TComponent)operator(()ident(VObject)operator(\).)ident(Name)operator(\)) + reserved(else) + ident(Add)operator(()ident(VObject)operator(.)ident(ClassName)operator(\);) + ident(vtClass)operator(:) ident(Add)operator(()ident(VClass)operator(.)ident(ClassName)operator(\);) + ident(vtAnsiString)operator(:) ident(Add)operator(()reserved(string)operator(()ident(VAnsiString)operator(\)\);) + ident(vtCurrency)operator(:) ident(Add)operator(()ident(CurrToStr)operator(()ident(VCurrency)operator(^\)\);) + ident(vtInt64)operator(:) ident(Add)operator(()ident(IntToStr)operator(()ident(VInt64)operator(^\)\);) + ident(vtVariant)operator(:) ident(Add)operator(()reserved(string)operator(()ident(VVariant)operator(^\)\);) + + ident(vtWideChar)operator(:) ident(Add)operator(()ident(VWideChar)operator(\);) + ident(vtPWideChar)operator(:) ident(Add)operator(()ident(VPWideChar)operator(\);) + ident(vtInterface)operator(:) ident(Add)operator(()ident(StrOfP)operator(()ident(VInterface)operator(\)\);) + ident(vtPointer)operator(:) ident(Add)operator(()ident(StrOfP)operator(()ident(VPointer)operator(\)\);) + ident(vtWideString)operator(:) ident(Add)operator(()ident(WideString)operator(()ident(VWideString)operator(\)\);) + reserved(end)operator(;) + reserved(if) ident(Result) operator(<>) string<delimiter(')delimiter(')> reserved(then) + ident(SetLength)operator(()ident(result)operator(,) ident(Length)operator(()ident(Result)operator(\)) operator(-) ident(Length)operator(()ident(Separator)operator(\)\);) +reserved(end)operator(;) + +reserved(procedure) ident(ShowText)operator(()reserved(const) ident(Items)operator(:) reserved(array) reserved(of) reserved(const)operator(;) ident(Separator)operator(:) reserved(string) operator(=) string<delimiter(')delimiter(')>operator(\);) +reserved(var) + ident(Text)operator(:) reserved(string)operator(;) +reserved(begin) + ident(Text) operator(:=) ident(MakeStr)operator(()ident(Items)operator(,) ident(Separator)operator(\);) + + ident(MessageBox)operator(()integer(0)operator(,) ident(PChar)operator(()ident(Text)operator(\),) string<delimiter(')content(Info)delimiter(')>operator(,) ident(MB_OK) reserved(and) ident(MB_APPLMODAL)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(DeleteChars)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(C)operator(:) ident(Char)operator(\):) reserved(string)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + reserved(for) ident(i) operator(:=) integer(1) reserved(to) ident(Length)operator(()ident(S)operator(\)) reserved(do) + reserved(if) ident(S)operator([)ident(i)operator(]) operator(<>) ident(C) reserved(then) + ident(Result) operator(:=) ident(Result) operator(+) ident(S)operator([)ident(i)operator(];) +reserved(end)operator(;) + +reserved(function) ident(DeleteChars)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(C)operator(:) ident(TCharSet)operator(\):) reserved(string)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + reserved(for) ident(i) operator(:=) integer(1) reserved(to) ident(Length)operator(()ident(S)operator(\)) reserved(do) + reserved(if) reserved(not) operator(()ident(S)operator([)ident(i)operator(]) reserved(in) ident(C)operator(\)) reserved(then) + ident(Result) operator(:=) ident(Result) operator(+) ident(S)operator([)ident(i)operator(];) +reserved(end)operator(;) + +reserved(function) ident(ExtractChars)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(C)operator(:) ident(TCharSet)operator(\):) reserved(string)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + reserved(for) ident(i) operator(:=) integer(1) reserved(to) ident(Length)operator(()ident(S)operator(\)) reserved(do) + reserved(if) ident(S)operator([)ident(i)operator(]) reserved(in) ident(C) reserved(then) + ident(Result) operator(:=) ident(Result) operator(+) ident(S)operator([)ident(i)operator(];) +reserved(end)operator(;) + +reserved(function) ident(CharCount)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(C)operator(:) ident(Char)operator(\):) ident(Integer)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) integer(0)operator(;) + reserved(for) ident(i) operator(:=) integer(1) reserved(to) ident(Length)operator(()ident(S)operator(\)) reserved(do) + reserved(if) ident(S)operator([)ident(i)operator(]) operator(=) ident(C) reserved(then) + ident(Inc)operator(()ident(Result)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(StrAtPos)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Pos)operator(:) ident(Integer)operator(;) reserved(const) ident(Str)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) operator(()ident(Str) operator(<>) string<delimiter(')delimiter(')>operator(\)) reserved(and) operator(()ident(Str) operator(=) ident(Copy)operator(()ident(S)operator(,) ident(Pos)operator(,) ident(Length)operator(()ident(Str)operator(\)\)\);) +reserved(end)operator(;) + +reserved(function) ident(TextAtPos)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Pos)operator(:) ident(Integer)operator(;) reserved(const) ident(Text)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) operator(()ident(Text) operator(<>) string<delimiter(')delimiter(')>operator(\)) reserved(and) ident(SameText)operator(()ident(Text)operator(,) ident(Copy)operator(()ident(S)operator(,) ident(Pos)operator(,) ident(Length)operator(()ident(Text)operator(\)\)\);) +reserved(end)operator(;) + +reserved(function) ident(StrAtBegin)operator(()reserved(const) ident(S)operator(,) ident(Str)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(StrAtPos)operator(()ident(S)operator(,) integer(1)operator(,) ident(Str)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(TextAtBegin)operator(()reserved(const) ident(S)operator(,) ident(Text)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(TextAtPos)operator(()ident(S)operator(,) integer(1)operator(,) ident(Text)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(CharIn)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(C)operator(:) ident(Char)operator(\):) ident(Boolean)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(True)operator(;) + reserved(for) ident(i) operator(:=) integer(1) reserved(to) ident(Length)operator(()ident(S)operator(\)) reserved(do) + reserved(if) ident(S)operator([)ident(i)operator(]) operator(=) ident(C) reserved(then) ident(Exit)operator(;) + ident(Result) operator(:=) ident(False)operator(;) +reserved(end)operator(;) + +reserved(function) ident(CharIn)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(C)operator(:) ident(TCharSet)operator(\):) ident(Boolean)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(False)operator(;) + reserved(for) ident(i) operator(:=) integer(1) reserved(to) ident(Length)operator(()ident(S)operator(\)) reserved(do) reserved(begin) + ident(Result) operator(:=) ident(S)operator([)ident(i)operator(]) reserved(in) ident(C)operator(;) + reserved(if) ident(Result) reserved(then) + ident(Exit)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(function) ident(StrIn)operator(()reserved(const) ident(S)operator(,) ident(SubStr)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(PosEx)operator(()ident(SubStr)operator(,) ident(S)operator(\)) operator(>) integer(0)operator(;) +reserved(end)operator(;) + +reserved(function) ident(StrIn)operator(()ident(SL)operator(:) ident(TStrings)operator(;) reserved(const) ident(S)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(False)operator(;) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(SL)operator(.)ident(Count)operator(-)integer(1) reserved(do) reserved(begin) + ident(Result) operator(:=) operator(()ident(S) operator(=) ident(SL)operator([)ident(i)operator(]\);) + reserved(if) ident(Result) reserved(then) + ident(Exit)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(function) ident(StrIn)operator(()ident(A)operator(:) ident(TStrA)operator(;) reserved(const) ident(S)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(False)operator(;) + reserved(for) ident(i) operator(:=) ident(Low)operator(()ident(A)operator(\)) reserved(to) ident(High)operator(()ident(A)operator(\)) reserved(do) reserved(begin) + ident(Result) operator(:=) operator(()ident(S) operator(=) ident(A)operator([)ident(i)operator(]\);) + reserved(if) ident(Result) reserved(then) + ident(Exit)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(function) ident(TextIn)operator(()reserved(const) ident(S)operator(,) ident(Text)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(PosExText)operator(()ident(Text)operator(,) ident(S)operator(\)) operator(>) integer(0)operator(;) +reserved(end)operator(;) + +reserved(function) ident(TextIn)operator(()ident(SL)operator(:) ident(TStrings)operator(;) reserved(const) ident(Text)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(False)operator(;) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(SL)operator(.)ident(Count)operator(-)integer(1) reserved(do) reserved(begin) + ident(Result) operator(:=) ident(SameText)operator(()ident(Text)operator(,) ident(SL)operator([)ident(i)operator(]\);) + reserved(if) ident(Result) reserved(then) + ident(Exit)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(function) ident(TextIn)operator(()ident(A)operator(:) ident(TStrA)operator(;) reserved(const) ident(Text)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(False)operator(;) + reserved(for) ident(i) operator(:=) ident(Low)operator(()ident(A)operator(\)) reserved(to) ident(High)operator(()ident(A)operator(\)) reserved(do) reserved(begin) + ident(Result) operator(:=) ident(SameText)operator(()ident(Text)operator(,) ident(A)operator([)ident(i)operator(]\);) + reserved(if) ident(Result) reserved(then) + ident(Exit)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(function) ident(StrIndex)operator(()ident(SL)operator(:) ident(TStrings)operator(;) reserved(const) ident(S)operator(:) reserved(string)operator(\):) ident(Integer)operator(;) +reserved(begin) + reserved(for) ident(Result) operator(:=) integer(0) reserved(to) ident(SL)operator(.)ident(Count)operator(-)integer(1) reserved(do) + reserved(if) ident(S) operator(=) ident(SL)operator([)ident(Result)operator(]) reserved(then) + ident(Exit)operator(;) + ident(Result) operator(:=) operator(-)integer(1)operator(;) +reserved(end)operator(;) + +reserved(function) ident(StrIndex)operator(()ident(A)operator(:) ident(TStrA)operator(;) reserved(const) ident(S)operator(:) reserved(string)operator(\):) ident(Integer)operator(;) +reserved(begin) + reserved(for) ident(Result) operator(:=) ident(Low)operator(()ident(A)operator(\)) reserved(to) ident(High)operator(()ident(A)operator(\)) reserved(do) + reserved(if) ident(S) operator(=) ident(A)operator([)ident(Result)operator(]) reserved(then) + ident(Exit)operator(;) + ident(Result) operator(:=) operator(-)integer(1)operator(;) +reserved(end)operator(;) + +reserved(function) ident(TextIndex)operator(()ident(SL)operator(:) ident(TStrings)operator(;) reserved(const) ident(Text)operator(:) reserved(string)operator(\):) ident(Integer)operator(;) +reserved(begin) + reserved(for) ident(Result) operator(:=) integer(0) reserved(to) ident(SL)operator(.)ident(Count)operator(-)integer(1) reserved(do) + reserved(if) ident(SameText)operator(()ident(Text)operator(,) ident(SL)operator([)ident(Result)operator(]\)) reserved(then) + ident(Exit)operator(;) + ident(Result) operator(:=) operator(-)integer(1)operator(;) +reserved(end)operator(;) + +reserved(function) ident(TextIndex)operator(()ident(A)operator(:) ident(TStrA)operator(;) reserved(const) ident(Text)operator(:) reserved(string)operator(\):) ident(Integer)operator(;) +reserved(begin) + reserved(for) ident(Result) operator(:=) ident(Low)operator(()ident(A)operator(\)) reserved(to) ident(High)operator(()ident(A)operator(\)) reserved(do) + reserved(if) ident(SameText)operator(()ident(Text)operator(,) ident(A)operator([)ident(Result)operator(]\)) reserved(then) + ident(Exit)operator(;) + ident(Result) operator(:=) operator(-)integer(1)operator(;) +reserved(end)operator(;) + +reserved(function) ident(ReplaceChars)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Old)operator(,) ident(New)operator(:) ident(Char)operator(\):) reserved(string)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(S)operator(;) + reserved(for) ident(i) operator(:=) integer(1) reserved(to) ident(Length)operator(()ident(Result)operator(\)) reserved(do) + reserved(if) ident(Result)operator([)ident(i)operator(]) operator(=) ident(Old) reserved(then) + ident(Result)operator([)ident(i)operator(]) operator(:=) ident(New)operator(;) +reserved(end)operator(;) + +reserved(function) ident(ReplaceChars)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) ident(Old)operator(:) ident(TCharSet)operator(;) ident(New)operator(:) ident(Char)operator(\):) reserved(string)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(S)operator(;) + reserved(for) ident(i) operator(:=) integer(1) reserved(to) ident(Length)operator(()ident(Result)operator(\)) reserved(do) + reserved(if) ident(Result)operator([)ident(i)operator(]) reserved(in) ident(Old) reserved(then) + ident(Result)operator([)ident(i)operator(]) operator(:=) ident(New)operator(;) +reserved(end)operator(;) + +reserved(function) ident(Replace)operator(()reserved(const) ident(S)operator(,) ident(Old)operator(,) ident(New)operator(:) reserved(string)operator(\):) reserved(string)operator(;) +reserved(var) + ident(oldp)operator(,) ident(ps)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(ps) operator(:=) integer(1)operator(;) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + reserved(while) ident(True) reserved(do) reserved(begin) + ident(oldp) operator(:=) ident(ps)operator(;) + ident(ps) operator(:=) ident(PosEx)operator(()ident(Old)operator(,) ident(S)operator(,) ident(oldp)operator(\);) + reserved(if) ident(ps) operator(=) integer(0) reserved(then) reserved(begin) + ident(Result) operator(:=) ident(Result) operator(+) ident(Copy)operator(()ident(S)operator(,) ident(oldp)operator(,) ident(Length)operator(()ident(S)operator(\)) operator(-) ident(oldp) operator(+) integer(1)operator(\);) + ident(Exit)operator(;) reserved(end)operator(;) + ident(Result) operator(:=) ident(Result) operator(+) ident(Copy)operator(()ident(S)operator(,) ident(oldp)operator(,) ident(ps) operator(-) ident(oldp)operator(\)) operator(+) ident(New)operator(;) + ident(Inc)operator(()ident(ps)operator(,) ident(Length)operator(()ident(Old)operator(\)\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(function) ident(SLOfFile)operator(()reserved(const) ident(FileName)operator(:) reserved(string)operator(\):) ident(TStringList)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(TStringList)operator(.)ident(Create)operator(;) + reserved(if) ident(FileExists)operator(()ident(FileName)operator(\)) reserved(then) + ident(Result)operator(.)ident(LoadFromFile)operator(()ident(FileName)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(ContainsEmptyLines)operator(()ident(SL)operator(:) ident(TStrings)operator(\):) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(StrIn)operator(()ident(SL)operator(,) string<delimiter(')delimiter(')>operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(DeleteEmptyLines)operator(()ident(SL)operator(:) ident(TStrings)operator(\);) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(i) operator(:=) integer(0)operator(;) + reserved(while) ident(i) operator(<) ident(SL)operator(.)ident(Count) reserved(do) reserved(begin) + reserved(if) ident(SL)operator([)ident(i)operator(]) operator(=) string<delimiter(')delimiter(')> reserved(then) + ident(SL)operator(.)ident(Delete)operator(()ident(i)operator(\)) + reserved(else) + ident(Inc)operator(()ident(i)operator(\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(DeleteCommentLines)operator(()ident(SL)operator(:) ident(TStrings)operator(;) reserved(const) ident(CommentSign)operator(:) reserved(string) operator(=) string<delimiter(')content(//)delimiter(')>operator(\);) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(i) operator(:=) integer(0)operator(;) + reserved(while) ident(i) operator(<) ident(SL)operator(.)ident(Count) reserved(do) reserved(begin) + reserved(if) operator(()ident(SL)operator([)ident(i)operator(]) operator(=) string<delimiter(')delimiter(')>operator(\)) reserved(or) operator(()ident(StrAtBegin)operator(()ident(TrimLeft)operator(()ident(SL)operator([)ident(i)operator(]\),) ident(CommentSign)operator(\)\)) reserved(then) + ident(SL)operator(.)ident(Delete)operator(()ident(i)operator(\)) + reserved(else) + ident(Inc)operator(()ident(i)operator(\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(function) ident(FindLine)operator(()ident(SL)operator(:) ident(TStrings)operator(;) reserved(const) ident(S)operator(:) reserved(string)operator(\):) ident(Integer)operator(;) +reserved(begin) + reserved(for) ident(Result) operator(:=) integer(0) reserved(to) ident(SL)operator(.)ident(Count)operator(-)integer(1) reserved(do) + reserved(if) ident(TextAtBegin)operator(()ident(SL)operator([)ident(Result)operator(],) ident(S)operator(\)) reserved(then) + ident(Exit)operator(;) + ident(Result) operator(:=) operator(-)integer(1)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(QuickSortSL)operator(()ident(SL)operator(:) ident(TStringList)operator(\);) + + reserved(procedure) ident(Sort)operator(()ident(l)operator(,) ident(r)operator(:) ident(Integer)operator(\);) + reserved(var) + ident(i)operator(,)ident(j)operator(:) ident(Integer)operator(;) + ident(z)operator(,)ident(x)operator(:) reserved(string)operator(;) + reserved(begin) + ident(i) operator(:=) ident(l)operator(;) + ident(j) operator(:=) ident(r)operator(;) + ident(x) operator(:=) ident(SL)operator([()ident(j) operator(+) ident(i)operator(\)) reserved(div) integer(2)operator(];) + reserved(repeat) + reserved(while) ident(SL)operator([)ident(i)operator(]) operator(<) ident(x) reserved(do) ident(Inc)operator(()ident(i)operator(\);) + reserved(while) ident(SL)operator([)ident(j)operator(]) operator(>) ident(x) reserved(do) ident(Dec)operator(()ident(j)operator(\);) + reserved(if) ident(i) operator(<=) ident(j) reserved(then) reserved(begin) + ident(z) operator(:=) ident(SL)operator([)ident(i)operator(];) + ident(SL)operator([)ident(i)operator(]) operator(:=) ident(SL)operator([)ident(j)operator(];) + ident(SL)operator([)ident(j)operator(]) operator(:=) ident(z)operator(;) + ident(Inc)operator(()ident(i)operator(\);) ident(Dec)operator(()ident(j)operator(\);) + reserved(end)operator(;) + reserved(until) ident(i) operator(>) ident(j)operator(;) + reserved(if) ident(j) operator(>) ident(l) reserved(then) ident(Sort)operator(()ident(l)operator(,) ident(j)operator(\);) + reserved(if) ident(i) operator(<) ident(r) reserved(then) ident(Sort)operator(()ident(i)operator(,) ident(r)operator(\);) + reserved(end)operator(;) + +reserved(begin) + reserved(if) ident(SL)operator(.)ident(Count) operator(>) integer(0) reserved(then) + ident(Sort)operator(()integer(0)operator(,) ident(SL)operator(.)ident(Count)operator(-)integer(1)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(IncStrA)operator(()ident(StrA)operator(:) ident(TStrA)operator(\):) ident(Integer)operator(;) +reserved(begin) + ident(SetLength)operator(()ident(StrA)operator(,) ident(Length)operator(()ident(StrA)operator(\)) operator(+) integer(1)operator(\);) + ident(Result) operator(:=) ident(High)operator(()ident(StrA)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(StrOfByteA)operator(()ident(a)operator(:) ident(TByteA)operator(\):) reserved(string)operator(;) +reserved(begin) + ident(Result) operator(:=) reserved(string)operator(()ident(Copy)operator(()ident(a)operator(,) integer(0)operator(,) ident(Length)operator(()ident(a)operator(\)\)\);) +reserved(end)operator(;) + +reserved(function) ident(ByteAOfStr)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\):) ident(TByteA)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(TByteA)operator(()ident(Copy)operator(()ident(S)operator(,) integer(1)operator(,) ident(Length)operator(()ident(s)operator(\)\)\);) +reserved(end)operator(;) + +reserved(function) ident(ByteAOfInt)operator(()ident(i)operator(:) ident(Integer)operator(\):) ident(TByteA)operator(;) +reserved(begin) + ident(SetLength)operator(()ident(Result)operator(,) ident(SizeOf)operator(()ident(Integer)operator(\)\);) + ident(Move)operator(()ident(i)operator(,) ident(Pointer)operator(()ident(Result)operator(\)^,) ident(SizeOf)operator(()ident(Integer)operator(\)\);) +reserved(end)operator(;) + +reserved(function) ident(IntOfByteA)operator(()ident(A)operator(:) ident(TByteA)operator(\):) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) integer(0)operator(;) + ident(Move)operator(()ident(Pointer)operator(()ident(A)operator(\)^,) ident(Result)operator(,) ident(Min)operator(()ident(Length)operator(()ident(A)operator(\),) ident(SizeOf)operator(()ident(Integer)operator(\)\)\);) +reserved(end)operator(;) + +reserved(function) ident(ByteAOfHex)operator(()reserved(const) ident(Hex)operator(:) reserved(string)operator(\):) ident(TByteA)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) + ident(h)operator(:) reserved(string)operator(;) +reserved(begin) + ident(h) operator(:=) ident(ExtractChars)operator(()ident(Hex)operator(,) ident(HexadecimalChars)operator(\);) + ident(SetLength)operator(()ident(Result)operator(,) ident(Length)operator(()ident(h)operator(\)) reserved(div) integer(2)operator(\);) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(High)operator(()ident(Result)operator(\)) reserved(do) + ident(Result)operator([)ident(i)operator(]) operator(:=) ident(ByteOfHex)operator(()ident(Copy)operator(()ident(h)operator(,) operator(()ident(i) reserved(shl) integer(1)operator(\)) operator(+) integer(1)operator(,) integer(2)operator(\)\);) +reserved(end)operator(;) + +reserved(function) ident(SizeOfFile)operator(()reserved(const) ident(FileName)operator(:) reserved(string)operator(\):) ident(Integer)operator(;) +reserved(var) + ident(F)operator(:) reserved(file)operator(;) +reserved(begin) + ident(AssignFile)operator(()ident(F)operator(,) ident(FileName)operator(\);) + preprocessor({$I-})ident(Reset)operator(()ident(F)operator(,) integer(1)operator(\);)preprocessor({$I+}) + reserved(if) ident(IOResult) operator(=) integer(0) reserved(then) reserved(begin) + ident(Result) operator(:=) ident(FileSize)operator(()ident(F)operator(\);) + ident(CloseFile)operator(()ident(F)operator(\);) + reserved(end) reserved(else) + ident(Result) operator(:=) integer(0)operator(;) +reserved(end)operator(;) + +reserved(function) ident(FileEx)operator(()reserved(const) ident(FileName)operator(:) reserved(string)operator(;) ident(AllowFolders)operator(:) ident(Boolean) operator(=) ident(False)operator(\):) ident(Boolean)operator(;) +reserved(var) + ident(FindData)operator(:) ident(TWin32FindData)operator(;) +reserved(begin) + reserved(if) ident(FileName) operator(=) string<delimiter(')delimiter(')> reserved(then) reserved(begin) + ident(Result) operator(:=) ident(False)operator(;) + ident(Exit)operator(;) reserved(end)operator(;) + + ident(Result) operator(:=) operator(()ident(AllowFolders) reserved(and) ident(DirectoryExists)operator(()ident(FileName)operator(\)\)) reserved(or) + operator(()ident(FindFirstFile)operator(()ident(PChar)operator(()ident(FileName)operator(\),) ident(FindData)operator(\)) operator(<>) ident(INVALID_HANDLE_VALUE)operator(\);) + ident(Result) operator(:=) ident(Result) reserved(and) reserved(not) ident(CharIn)operator(()ident(FileName)operator(,) ident(WildCards)operator(\);) + ident(Result) operator(:=) ident(Result) reserved(and) operator(()ident(AllowFolders) + reserved(or) operator((()ident(FindData)operator(.)ident(dwFileAttributes) reserved(and) ident(FILE_ATTRIBUTE_DIRECTORY)operator(\)) operator(=) integer(0)operator(\)\);) +reserved(end)operator(;) + +reserved(function) ident(LWPSolve)operator(()reserved(const) ident(Dir)operator(:) reserved(string)operator(\):) reserved(string)operator(;) +reserved(begin) + reserved(if) operator(()ident(Dir) operator(<>) string<delimiter(')delimiter(')>operator(\)) reserved(and) operator(()ident(Dir)operator([)ident(Length)operator(()ident(Dir)operator(\)]) operator(=) char<delimiter(')content(\\)delimiter(')>operator(\)) reserved(then) reserved(begin) + ident(Result) operator(:=) ident(Copy)operator(()ident(Dir)operator(,) integer(1)operator(,) ident(Length)operator(()ident(Dir)operator(\)) operator(-) integer(1)operator(\);) + reserved(end) reserved(else) + ident(Result) operator(:=) ident(Dir)operator(;) +reserved(end)operator(;) + +reserved(function) ident(LWPSlash)operator(()reserved(const) ident(Dir)operator(:) reserved(string)operator(\):) reserved(string)operator(;) +reserved(begin) + reserved(if) operator(()ident(Dir) operator(<>) string<delimiter(')delimiter(')>operator(\)) reserved(and) operator(()ident(Dir)operator([)ident(Length)operator(()ident(Dir)operator(\)]) operator(=) char<delimiter(')content(\\)delimiter(')>operator(\)) reserved(then) reserved(begin) + ident(Result) operator(:=) ident(Copy)operator(()ident(Dir)operator(,) integer(1)operator(,) ident(Length)operator(()ident(Dir)operator(\)\);) + reserved(end) reserved(else) + ident(Result) operator(:=) ident(Dir) operator(+) char<delimiter(')content(\\)delimiter(')>operator(;) +reserved(end)operator(;) + +reserved(function) ident(ExtractDrive)operator(()reserved(const) ident(FileName)operator(:) reserved(string)operator(\):) reserved(string)operator(;) +reserved(begin) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + reserved(if) operator(()ident(Length)operator(()ident(FileName)operator(\)) operator(>=) integer(2)operator(\)) reserved(and) operator(()ident(FileName)operator([)integer(2)operator(]) operator(=) char<delimiter(')content(:)delimiter(')>operator(\)) reserved(then) + ident(Result) operator(:=) ident(UpperCase)operator(()ident(FileName)operator([)integer(1)operator(]) operator(+) string<delimiter(')content(:\\)delimiter(')>operator(\);) +reserved(end)operator(;) + +reserved(function) ident(ExtractPath)operator(()reserved(const) ident(FileName)operator(:) reserved(string)operator(\):) reserved(string)operator(;) +reserved(var) + ident(p)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(p) operator(:=) ident(CharPosR)operator(()char<delimiter(')content(\\)delimiter(')>operator(,) ident(FileName)operator(\);) + reserved(if) ident(P) operator(>) integer(0) reserved(then) + ident(Result) operator(:=) ident(Copy)operator(()ident(FileName)operator(,) integer(1)operator(,) ident(p)operator(\)) + reserved(else) + ident(Result) operator(:=) ident(FileName)operator(;) +reserved(end)operator(;) + +reserved(function) ident(ExtractPrefix)operator(()reserved(const) ident(FileName)operator(:) reserved(string)operator(\):) reserved(string)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(UntilLastChar)operator(()ident(ExtractFileName)operator(()ident(FileName)operator(\),) char<delimiter(')content(.)delimiter(')>operator(\);) +reserved(end)operator(;) + +reserved(function) ident(ExtractSuffix)operator(()reserved(const) ident(FileName)operator(:) reserved(string)operator(\):) reserved(string)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(FromLastChar)operator(()ident(ExtractFileName)operator(()ident(FileName)operator(\),) char<delimiter(')content(.)delimiter(')>operator(\);) +reserved(end)operator(;) + +reserved(function) ident(SameByteA)operator(()reserved(const) ident(A)operator(,) ident(B)operator(:) ident(TByteA)operator(\):) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) operator(()ident(A) operator(=) ident(B)operator(\)) reserved(or) operator((()ident(Length)operator(()ident(A)operator(\)) operator(=) ident(Length)operator(()ident(B)operator(\)\)) reserved(and) ident(CompareMem)operator(()ident(A)operator(,) ident(B)operator(,) ident(Length)operator(()ident(A)operator(\)\)\);) +reserved(end)operator(;) + +reserved(function) ident(Reverse)operator(()ident(A)operator(:) ident(TByteA)operator(\):) ident(TByteA)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(SetLength)operator(()ident(Result)operator(,) ident(Length)operator(()ident(A)operator(\)\);) + + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(High)operator(()ident(A)operator(\)) reserved(do) + ident(Result)operator([)ident(High)operator(()ident(Result)operator(\)) operator(-) ident(i)operator(]) operator(:=) ident(A)operator([)ident(i)operator(];) +reserved(end)operator(;) + +reserved(function) ident(Endian)operator(()ident(i)operator(:) ident(Integer)operator(\):) ident(Integer)operator(;) +reserved(type) + ident(EndianArray) operator(=) reserved(packed) reserved(array)operator([)integer(0)operator(..)integer(3)operator(]) reserved(of) ident(Byte)operator(;) +reserved(var) + ident(a)operator(,) ident(b)operator(:) ident(EndianArray)operator(;) +reserved(begin) + ident(a) operator(:=) ident(EndianArray)operator(()ident(i)operator(\);) + ident(b)operator([)integer(0)operator(]) operator(:=) ident(a)operator([)integer(3)operator(];) + ident(b)operator([)integer(1)operator(]) operator(:=) ident(a)operator([)integer(2)operator(];) + ident(b)operator([)integer(2)operator(]) operator(:=) ident(a)operator([)integer(1)operator(];) + ident(b)operator([)integer(3)operator(]) operator(:=) ident(a)operator([)integer(0)operator(];) + ident(Result) operator(:=) ident(Integer)operator(()ident(b)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(SaveByteA)operator(()ident(Data)operator(:) ident(TByteA)operator(;) reserved(const) ident(FileName)operator(:) reserved(string)operator(;) + ident(Overwrite)operator(:) ident(Boolean) operator(=) ident(True)operator(\):) ident(Boolean)operator(;) +reserved(var) + ident(F)operator(:) reserved(file)operator(;) +reserved(begin) + reserved(if) ident(FileExists)operator(()ident(FileName)operator(\)) reserved(and) reserved(not) ident(Overwrite) reserved(then) reserved(begin) + ident(Result) operator(:=) ident(False)operator(;) + ident(Exit) reserved(end)operator(;) + + ident(AssignFile)operator(()ident(F)operator(,) ident(FileName)operator(\);) + preprocessor({$I-})ident(Rewrite)operator(()ident(F)operator(,) integer(1)operator(\);)preprocessor({$I+}) + reserved(if) ident(IOResult) operator(=) integer(0) reserved(then) reserved(begin) + reserved(if) ident(Length)operator(()ident(Data)operator(\)) operator(>) integer(0) reserved(then) + ident(BlockWrite)operator(()ident(F)operator(,) ident(Data)operator([)integer(0)operator(],) ident(Length)operator(()ident(Data)operator(\)\);) + ident(CloseFile)operator(()ident(F)operator(\);) + ident(Result) operator(:=) ident(True)operator(;) + reserved(end) reserved(else) + ident(Result) operator(:=) ident(False)operator(;) +reserved(end)operator(;) + +reserved(function) ident(LoadByteA)operator(()reserved(const) ident(FileName)operator(:) reserved(string)operator(\):) ident(TByteA)operator(;) +reserved(var) + ident(F)operator(:) reserved(file)operator(;) +reserved(begin) + ident(AssignFile)operator(()ident(F)operator(,) ident(FileName)operator(\);) + preprocessor({$I-})ident(Reset)operator(()ident(F)operator(,) integer(1)operator(\);)preprocessor({$I+}) + reserved(if) ident(IOResult) operator(=) integer(0) reserved(then) reserved(begin) + ident(SetLength)operator(()ident(Result)operator(,) ident(FileSize)operator(()ident(F)operator(\)\);) + reserved(if) ident(Length)operator(()ident(Result)operator(\)) operator(>) integer(0) reserved(then) + ident(BlockRead)operator(()ident(F)operator(,) ident(Result)operator([)integer(0)operator(],) ident(FileSize)operator(()ident(F)operator(\)\);) + ident(CloseFile)operator(()ident(F)operator(\);) + reserved(end) reserved(else) + ident(SetLength)operator(()ident(Result)operator(,) integer(0)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(IsValidFileName)operator(()reserved(const) ident(FileName)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) operator(()ident(FileName) operator(<>) string<delimiter(')delimiter(')>operator(\)) reserved(and) reserved(not) ident(CharIn)operator(()ident(FileName)operator(,) ident(FileNameEnemies)operator(\)) + reserved(and) ident(CharIn)operator(()ident(Trim)operator(()ident(FileName)operator(\),) ident(AllChars) operator(-) operator([)char<delimiter(')content(.)delimiter(')>operator(]\);) +reserved(end)operator(;) + +reserved(function) ident(MakeValidFileName)operator(()ident(FileName)operator(:) reserved(string)operator(;) reserved(const) ident(Default)operator(:) reserved(string) operator(=) string<delimiter(')content(File)delimiter(')>operator(\):) reserved(string)operator(;) +reserved(begin) + reserved(if) ident(FileName) operator(=) string<delimiter(')delimiter(')> reserved(then) + ident(FileName) operator(:=) ident(Default)operator(;) + + reserved(if) ident(CharIn)operator(()ident(FileName)operator(,) ident(FileNameEnemies)operator(\)) reserved(then) + ident(Result) operator(:=) ident(ReplaceChars)operator(()ident(FileName)operator(,) ident(FileNameEnemies)operator(,) char<delimiter(')content(_)delimiter(')>operator(\)) + reserved(else) reserved(if) reserved(not) ident(CharIn)operator(()ident(Trim)operator(()ident(FileName)operator(\),) ident(AllChars) operator(-) operator([)char<delimiter(')content(.)delimiter(')>operator(]\)) reserved(then) + ident(Result) operator(:=) ident(Default) + reserved(else) + ident(Result) operator(:=) ident(FileName)operator(;) +reserved(end)operator(;) + +reserved(function) ident(IsValidInteger)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) +comment({const + LowInt = '2147483648'; + HighInt = '2147483647'; +var + len, RealLen, i, o: Integer; + c: Char; +begin + Result := False; + if S = '' then + Exit; + + len := Length(S\); + o := 1; + + if S[1] = '-' then begin + if len = 1 then + Exit; + Inc(o\); + while (o <= len\) and (S[o] = '0'\) do + Inc(o\); + if o > len then + Exit; + if o < len then begin + RealLen := len - o + 1; + if RealLen > Length(LowInt\) then + Exit + else if RealLen = Length(LowInt\) then begin + for i := 1 to Length(LowInt\) do begin + c := S[i + o - 1]; + if (c < '0'\) or (c > LowInt[i]\) then + Exit; + if c in ['0'..Char((Byte(LowInt[i]\)-1\)\)] then + Break; + end; + Inc(o, i\); + end; + end; + end else begin + while (o <= len\) and (S[o] = '0'\) do + Inc(o\); + if o <= len then begin + RealLen := len - o + 1; + if RealLen > Length(HighInt\) then + Exit + else if RealLen = Length(HighInt\) then begin + for i := 1 to Length(HighInt\) do begin + c := S[i + o - 1]; + if (c < '0'\) or (c > HighInt[i]\) then + Exit; + if c in ['0'..Char((Byte(HighInt[i]\)-1\)\)] then + Break; + end; + Inc(o, i\); + end; + end; + end; + + for i := o to len do + if not (S[i] in ['0'..'9']\) then + Exit; + + Result := True; }) +reserved(var) + ident(i)operator(:) ident(Int64)operator(;) +reserved(begin) + ident(i) operator(:=) ident(StrToInt64Def)operator(()ident(S)operator(,) ident(High)operator(()ident(Int64)operator(\)\);) + ident(Result) operator(:=) operator(()ident(i) operator(>=) ident(Low)operator(()ident(Integer)operator(\)\)) reserved(and) operator(()ident(i) operator(<=) ident(High)operator(()ident(Integer)operator(\)\);) +reserved(end)operator(;) + +reserved(function) ident(IsValidCardinal)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) +comment({const + HighCard = '4294967295'; +var + len, RealLen, i, o: Integer; +begin + Result := False; + if S = '' then + Exit; + + len := Length(S\); + o := 1; + + while (o <= len\) and (S[o] = '0'\) do + Inc(o\); + if o <= len then begin + RealLen := len - o + 1; + if RealLen > Length(HighCard\) then + Exit + else if RealLen = Length(HighCard\) then begin + for i := 1 to Length(HighCard\) do begin + if S[i + o - 1] > HighCard[i] then + Exit; + if S[i + o - 1] in ['0'..Char((Byte(HighCard[i]\)-1\)\)] then + Break; + end; + Inc(o, i\); + end; + end; + + for i := o to len do + if not (S[i] in ['0'..'9']\) then + Exit; + + Result := True; }) +reserved(var) + ident(i)operator(:) ident(Int64)operator(;) +reserved(begin) + ident(i) operator(:=) ident(StrToInt64Def)operator(()ident(S)operator(,) operator(-)integer(1)operator(\);) + ident(Result) operator(:=) operator(()ident(i) operator(>=) integer(0)operator(\)) reserved(and) operator(()ident(i) operator(<=) ident(High)operator(()ident(Cardinal)operator(\)\);) +reserved(end)operator(;) + +reserved(function) ident(StrOfBool)operator(()ident(flag)operator(:) ident(Boolean)operator(;) reserved(const) ident(TrueStr)operator(:) reserved(string) operator(=) string<delimiter(')content(True)delimiter(')>operator(;) + reserved(const) ident(FalseStr)operator(:) reserved(string) operator(=) string<delimiter(')content(False)delimiter(')>operator(\):) reserved(string)operator(;) +reserved(begin) + reserved(if) ident(Flag) reserved(then) + ident(Result) operator(:=) ident(TrueStr) + reserved(else) + ident(Result) operator(:=) ident(FalseStr)operator(;) +reserved(end)operator(;) + +reserved(function) ident(StrOfInt)operator(()ident(i)operator(:) ident(Integer)operator(\):) reserved(string)operator(;) +reserved(begin) +comment({ if i = 0 then begin + Result := '0'; + Exit end; + + while i > 0 do begin + Result := Char(Byte('0'\) + (i mod 10\)\) + Result; + i := i div 10; + end;}) + ident(Result) operator(:=) ident(IntToStr)operator(()ident(i)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(CardOfStr)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\):) ident(Cardinal)operator(;) +reserved(var) + ident(Res)operator(:) ident(Int64)operator(;) +reserved(begin) + ident(Res) operator(:=) ident(StrToInt64Def)operator(()ident(S)operator(,) operator(-)integer(1)operator(\);) + reserved(if) ident(Res) operator(>) ident(High)operator(()ident(Cardinal)operator(\)) reserved(then) + ident(Res) operator(:=) ident(High)operator(()ident(Cardinal)operator(\)) + reserved(else) reserved(if) ident(Res) operator(<) integer(0) reserved(then) + ident(Res) operator(:=) integer(0)operator(;) + ident(Result) operator(:=) ident(Cardinal)operator(()ident(Res)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(HexOrd)operator(()ident(Hex)operator(:) ident(Char)operator(\):) ident(THex)operator(;) +reserved(begin) + reserved(case) ident(Hex) reserved(of) + char<delimiter(')content(0)delimiter(')>operator(..)char<delimiter(')content(9)delimiter(')>operator(:) + ident(Result) operator(:=) ident(Byte)operator(()ident(Hex)operator(\)) operator(-) integer(48)operator(;) + char<delimiter(')content(A)delimiter(')>operator(..)char<delimiter(')content(F)delimiter(')>operator(:) + ident(Result) operator(:=) ident(Byte)operator(()ident(Hex)operator(\)) operator(-) integer(55)operator(;) + char<delimiter(')content(a)delimiter(')>operator(..)char<delimiter(')content(f)delimiter(')>operator(:) + ident(Result) operator(:=) ident(Byte)operator(()ident(Hex)operator(\)) operator(-) integer(87)operator(;) + reserved(else) + ident(Result) operator(:=) integer(0)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(function) ident(ByteOfHex)operator(()ident(Hex)operator(:) ident(THexByteStr)operator(\):) ident(Byte)operator(;) +reserved(begin) + ident(Result) operator(:=) operator(()ident(HexOrd)operator(()ident(Hex)operator([)integer(1)operator(]\)) reserved(shl) integer(4)operator(\)) operator(+) ident(HexOrd)operator(()ident(Hex)operator([)integer(2)operator(]\);) +reserved(end)operator(;) + +reserved(function) ident(DecOfHex)operator(()reserved(const) ident(Hex)operator(:) reserved(string)operator(\):) reserved(string)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(IntToStr)operator(()ident(CardOfHex)operator(()ident(Hex)operator(\)\);) +reserved(end)operator(;) + +reserved(function) ident(HexOfByte)operator(()ident(b)operator(:) ident(Byte)operator(\):) ident(THexByteStr)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(HexChar)operator([()ident(b) reserved(and) hex($F0)operator(\)) reserved(shr) integer(4)operator(]) + operator(+) ident(HexChar)operator([) ident(b) reserved(and) hex($0F) operator(];) +reserved(end)operator(;) + +comment({function HexOfCard2(c: Cardinal\): string; +var + Data: array[0..(1 shl 4\) - 1] of Char; + i: Integer; +begin + for i := 0 to (1 shl 4\) - 1 do + if i < 10 then + Data[i] := Char(Ord('0'\) + i\) + else + Data[i] := Char(Ord('A'\) + i - 10\); + + Result := Data[(c and (((1 shl (1 shl 2\)\) - 1\) shl (7 shl 2\)\)\) shr (7 shl 2\)] + + Data[(c and (((1 shl (1 shl 2\)\) - 1\) shl (6 shl 2\)\)\) shr (6 shl 2\)] + + Data[(c and (((1 shl (1 shl 2\)\) - 1\) shl (5 shl 2\)\)\) shr (5 shl 2\)] + + Data[(c and (((1 shl (1 shl 2\)\) - 1\) shl (4 shl 2\)\)\) shr (4 shl 2\)] + + Data[(c and (((1 shl (1 shl 2\)\) - 1\) shl (3 shl 2\)\)\) shr (3 shl 2\)] + + Data[(c and (((1 shl (1 shl 2\)\) - 1\) shl (2 shl 2\)\)\) shr (2 shl 2\)] + + Data[(c and (((1 shl (1 shl 2\)\) - 1\) shl (1 shl 2\)\)\) shr (1 shl 2\)] + + Data[(c and (((1 shl (1 shl 2\)\) - 1\) shl (0 shl 2\)\)\) shr (0 shl 2\)]; +end; }) + +reserved(function) ident(HexOfCard)operator(()ident(i)operator(:) ident(Cardinal)operator(\):) reserved(string)operator(;) +reserved(var) + ident(a)operator(:) ident(Cardinal)operator(;) +reserved(begin) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + reserved(while) ident(i) operator(>) integer(0) reserved(do) reserved(begin) + ident(a) operator(:=) ident(i) reserved(and) hex($F)operator(;) + ident(Result) operator(:=) ident(HexChar)operator([)ident(a)operator(]) operator(+) ident(Result)operator(;) + ident(i) operator(:=) ident(i) reserved(shr) integer(4)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(function) ident(HexOfCard)operator(()ident(i)operator(:) ident(Cardinal)operator(;) ident(Digits)operator(:) ident(Integer)operator(\):) reserved(string)operator(;) +reserved(var) + ident(a)operator(:) ident(Cardinal)operator(;) +reserved(begin) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + reserved(while) ident(i) operator(>) integer(0) reserved(do) reserved(begin) + ident(a) operator(:=) ident(i) reserved(and) hex($F)operator(;) + ident(Result) operator(:=) ident(HexChar)operator([)ident(a)operator(]) operator(+) ident(Result)operator(;) + ident(i) operator(:=) ident(i) reserved(shr) integer(4)operator(;) + reserved(end)operator(;) + ident(Result) operator(:=) ident(MulStr)operator(()char<delimiter(')content(0)delimiter(')>operator(,) ident(Digits) operator(-) ident(Length)operator(()ident(Result)operator(\)\)) operator(+) ident(Result)operator(;) +reserved(end)operator(;) + +reserved(function) ident(PascalHexArray)operator(()ident(a)operator(:) ident(TByteA)operator(;) ident(Name)operator(:) reserved(string)operator(\):) reserved(string)operator(;) +reserved(var) + ident(i)operator(,) ident(len)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) string<delimiter(')content(const)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content( )delimiter(')> operator(+) ident(Name) operator(+) string<delimiter(')content(: array[0..)delimiter(')> operator(+) ident(IntToStr)operator(()ident(High)operator(()ident(a)operator(\)\)) operator(+) string<delimiter(')content(] of Byte = ()delimiter(')>operator(;) + + ident(len) operator(:=) ident(Length)operator(()ident(a)operator(\);) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(len)operator(-)integer(1) reserved(do) reserved(begin) + reserved(if) operator(()ident(i) reserved(mod) integer(19)operator(\)) operator(=) integer(0) reserved(then) + ident(Result) operator(:=) ident(Result) operator(+) ident(EOL) operator(+) string<delimiter(')content( )delimiter(')> operator(+) string<delimiter(')content( )delimiter(')>operator(;) + ident(Result) operator(:=) ident(Result) operator(+) char<delimiter(')content($)delimiter(')> operator(+) ident(HexOfByte)operator(()ident(a)operator([)ident(i)operator(]\);) + reserved(if) ident(i) operator(<) ident(len)operator(-)integer(1) reserved(then) + ident(Result) operator(:=) ident(Result) operator(+) char<delimiter(')content(,)delimiter(')>operator(;) + reserved(end)operator(;) + ident(Result) operator(:=) ident(Result) operator(+) ident(EOL) operator(+) string<delimiter(')content( \);)delimiter(')>operator(;) +reserved(end)operator(;) + +reserved(function) ident(HexOfByteA)operator(()ident(a)operator(:) ident(TByteA)operator(;) ident(Blocks)operator(:) ident(Integer) operator(=) integer(1)operator(;) + reserved(const) ident(Splitter)operator(:) reserved(string) operator(=) char<delimiter(')content( )delimiter(')>operator(\):) reserved(string)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + + reserved(if) ident(Blocks) operator(>) integer(0) reserved(then) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(High)operator(()ident(a)operator(\)) reserved(do) reserved(begin) + ident(Result) operator(:=) ident(Result) operator(+) ident(HexOfByte)operator(()ident(a)operator([)ident(i)operator(]\);) + reserved(if) ident(i) operator(<) ident(High)operator(()ident(a)operator(\)) reserved(then) + reserved(if) operator((()ident(i)operator(+)integer(1)operator(\)) reserved(mod) ident(Blocks)operator(\)) operator(=) integer(0) reserved(then) + ident(Result) operator(:=) ident(Result) operator(+) ident(Splitter)operator(;) + reserved(end) + reserved(else) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(High)operator(()ident(a)operator(\)) reserved(do) + ident(Result) operator(:=) ident(Result) operator(+) ident(HexOfByte)operator(()ident(a)operator([)ident(i)operator(]\);) +reserved(end)operator(;) + +reserved(function) ident(BinOfByteA)operator(()ident(a)operator(:) ident(TByteA)operator(;) ident(Blocks)operator(:) ident(Integer) operator(=) integer(4)operator(;) + reserved(const) ident(Splitter)operator(:) reserved(string) operator(=) char<delimiter(')content( )delimiter(')>operator(\):) reserved(string)operator(;) +reserved(var) + ident(i)operator(,) ident(max)operator(:) ident(Integer)operator(;) + ident(Bit)operator(:) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + + reserved(if) ident(Blocks) operator(>) integer(0) reserved(then) reserved(begin) + ident(max) operator(:=) integer(8) operator(*) operator(()ident(High)operator(()ident(a)operator(\)\)) operator(+) integer(7)operator(;) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(max) reserved(do) reserved(begin) + ident(Bit) operator(:=) integer(7)operator(-()ident(i) reserved(mod) integer(8)operator(\)) reserved(in) ident(TBitSet)operator(()ident(a)operator([)ident(i) reserved(div) integer(8)operator(]\);) + ident(Result) operator(:=) ident(Result) operator(+) ident(Char)operator(()ident(Byte)operator(()char<delimiter(')content(0)delimiter(')>operator(\)) operator(+) ident(Byte)operator(()ident(Bit)operator(\)\);) + reserved(if) ident(i) operator(<) ident(max) reserved(then) + reserved(if) operator((()ident(i)operator(+)integer(1)operator(\)) reserved(mod) ident(Blocks)operator(\)) operator(=) integer(0) reserved(then) + ident(Result) operator(:=) ident(Result) operator(+) ident(Splitter)operator(;) + reserved(end)operator(;) + reserved(end) reserved(else) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(High)operator(()ident(a)operator(\)) reserved(do) + ident(Result) operator(:=) ident(Result) operator(+) ident(Char)operator(()ident(Byte)operator(()char<delimiter(')content(0)delimiter(')>operator(\)) operator(+) ident(a)operator([)ident(i)operator(]) reserved(shr) operator(()ident(i) reserved(and) integer(8)operator(\)\);) +reserved(end)operator(;) + +reserved(function) ident(CardOfHex)operator(()ident(Hex)operator(:) reserved(string)operator(\):) ident(Cardinal)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) integer(0)operator(;) + ident(Hex) operator(:=) ident(Copy)operator(()ident(ExtractChars)operator(()ident(Hex)operator(,) ident(HexadecimalChars)operator(\),) integer(1)operator(,) integer(8)operator(\);) + + reserved(for) ident(i) operator(:=) integer(1) reserved(to) ident(Length)operator(()ident(Hex)operator(\)) reserved(do) + reserved(if) ident(Hex)operator([)ident(i)operator(]) operator(<>) char<delimiter(')content(0)delimiter(')> reserved(then) + ident(Inc)operator(()ident(Result)operator(,) ident(HexOrd)operator(()ident(Hex)operator([)ident(i)operator(]\)) reserved(shl) operator((()ident(Length)operator(()ident(Hex)operator(\)) operator(-) ident(i)operator(\)) reserved(shl) integer(2)operator(\)\);) +reserved(end)operator(;) + +reserved(function) ident(IntOfBin)operator(()ident(Bin)operator(:) reserved(string)operator(\):) ident(Cardinal)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) integer(0)operator(;) + ident(Bin) operator(:=) ident(Copy)operator(()ident(ExtractChars)operator(()ident(Bin)operator(,) ident(BinaryChars)operator(\),) integer(1)operator(,) integer(32)operator(\);) + + reserved(for) ident(i) operator(:=) ident(Length)operator(()ident(Bin)operator(\)) reserved(downto) integer(1) reserved(do) + reserved(if) ident(Bin)operator([)ident(i)operator(]) operator(=) char<delimiter(')content(1)delimiter(')> reserved(then) + ident(Inc)operator(()ident(Result)operator(,) integer(1) reserved(shl) operator(()ident(Length)operator(()ident(Bin)operator(\)) operator(-) ident(i)operator(\)\);) +reserved(end)operator(;) + +reserved(function) ident(BinOfInt)operator(()ident(n)operator(:) ident(Cardinal)operator(\):) reserved(string)operator(;) +reserved(var) + ident(a)operator(:) ident(Integer)operator(;) +reserved(begin) + reserved(if) ident(n) operator(=) integer(0) reserved(then) reserved(begin) + ident(Result) operator(:=) char<delimiter(')content(0)delimiter(')>operator(;) + ident(exit)operator(;) reserved(end)operator(;) + + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + reserved(while) ident(n) operator(>) integer(0) reserved(do) reserved(begin) + ident(a) operator(:=) ident(n) reserved(and) integer(1)operator(;) + ident(Result) operator(:=) ident(Char)operator(()ident(a) operator(+) ident(Byte)operator(()char<delimiter(')content(0)delimiter(')>operator(\)\)) operator(+) ident(Result)operator(;) + ident(n) operator(:=) ident(n) reserved(shr) integer(1)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(function) ident(BinOfIntFill)operator(()ident(n)operator(:) ident(Cardinal)operator(;) ident(MinCount)operator(:) ident(Integer) operator(=) integer(8)operator(\):) reserved(string)operator(;) +reserved(var) + ident(a)operator(:) ident(Integer)operator(;) +reserved(begin) + reserved(if) ident(n) operator(=) integer(0) reserved(then) reserved(begin) + ident(Result) operator(:=) ident(MulStr)operator(()char<delimiter(')content(0)delimiter(')>operator(,) ident(MinCount)operator(\);) + ident(Exit)operator(;) reserved(end)operator(;) + + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + reserved(while) ident(n) operator(>) integer(0) reserved(do) reserved(begin) + ident(a) operator(:=) ident(n) reserved(and) integer(1)operator(;) + ident(Result) operator(:=) ident(Char)operator(()ident(a) operator(+) ident(Byte)operator(()char<delimiter(')content(0)delimiter(')>operator(\)\)) operator(+) ident(Result)operator(;) + ident(n) operator(:=) ident(n) reserved(shr) integer(1)operator(;) + reserved(end)operator(;) + ident(Result) operator(:=) ident(MulStr)operator(()char<delimiter(')content(0)delimiter(')>operator(,) ident(MinCount) operator(-) ident(Length)operator(()ident(Result)operator(\)\)) operator(+) ident(Result)operator(;) +reserved(end)operator(;) + +reserved(function) ident(BaseNOfInt)operator(()ident(I)operator(:) ident(Cardinal)operator(;) ident(B)operator(:) ident(TBaseN)operator(\):) reserved(string)operator(;) +reserved(var) + ident(a)operator(:) ident(Integer)operator(;) +reserved(begin) + reserved(if) operator(()ident(B) operator(<) integer(2)operator(\)) reserved(or) operator(()ident(i) operator(=) integer(0)operator(\)) reserved(then) reserved(begin) + ident(Result) operator(:=) char<delimiter(')content(0)delimiter(')>operator(;) + ident(Exit)operator(;) reserved(end)operator(;) + + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + reserved(while) ident(i) operator(>) integer(0) reserved(do) reserved(begin) + ident(a) operator(:=) ident(i) reserved(mod) ident(B)operator(;) + ident(Result) operator(:=) ident(BaseNChar)operator([)ident(a)operator(]) operator(+) ident(Result)operator(;) + ident(i) operator(:=) ident(i) reserved(div) ident(B)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(function) ident(IntOfBaseN)operator(()ident(V)operator(:) reserved(string)operator(;) ident(B)operator(:) ident(TBaseN)operator(\):) ident(Cardinal)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) + ident(F)operator(:) ident(Cardinal)operator(;) + ident(c)operator(:) ident(Byte)operator(;) +reserved(begin) + ident(Result) operator(:=) integer(0)operator(;) + ident(V) operator(:=) ident(TrimAll)operator(()ident(V)operator(\);) + ident(F) operator(:=) integer(1)operator(;) + reserved(for) ident(i) operator(:=) ident(Length)operator(()ident(V)operator(\)) reserved(downto) integer(1) reserved(do) reserved(begin) + ident(c) operator(:=) ident(Byte)operator(()ident(UpCase)operator(()ident(V)operator([)ident(i)operator(]\)\);) + reserved(case) ident(Char)operator(()ident(c)operator(\)) reserved(of) + char<delimiter(')content(0)delimiter(')>operator(..)char<delimiter(')content(9)delimiter(')>operator(:) ident(c) operator(:=) ident(c) operator(-) integer(48)operator(;) + char<delimiter(')content(A)delimiter(')>operator(..)char<delimiter(')content(Z)delimiter(')>operator(:) ident(c) operator(:=) ident(c) operator(-) integer(55)operator(;) + reserved(end)operator(;) + reserved(if) ident(c) operator(<) ident(B) reserved(then) + ident(Result) operator(:=) ident(Result) operator(+) ident(Byte)operator(()ident(c)operator(\)) operator(*) ident(F)operator(;) + ident(F) operator(:=) ident(F) operator(*) ident(B)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(function) ident(KeepIn)operator(()ident(i)operator(,) ident(Bottom)operator(,) ident(Top)operator(:) ident(Variant)operator(\):) ident(Variant)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(i)operator(;) + reserved(if) ident(Result) operator(>) ident(Top) reserved(then) + ident(Result) operator(:=) ident(Top) + reserved(else) reserved(if) ident(Result) operator(<) ident(Bottom) reserved(then) + ident(Result) operator(:=) ident(Bottom)operator(;) +reserved(end)operator(;) + +reserved(function) ident(InRange)operator(()ident(Value)operator(,) ident(Bottom)operator(,) ident(Top)operator(:) ident(Variant)operator(\):) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) operator(()ident(Value) operator(>=) ident(Bottom)operator(\)) reserved(and) operator(()ident(Value) operator(<=) ident(Top)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(InStrictRange)operator(()ident(Value)operator(,) ident(Bottom)operator(,) ident(Top)operator(:) ident(Variant)operator(\):) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) operator(()ident(Value) operator(>) ident(Bottom)operator(\)) reserved(and) operator(()ident(Value) operator(<) ident(Top)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(Min)operator(()reserved(const) ident(A)operator(,) ident(B)operator(:) ident(Integer)operator(\):) ident(Integer)operator(;) +reserved(begin) + reserved(if) ident(A) operator(<) ident(B) reserved(then) + ident(Result) operator(:=) ident(A) + reserved(else) + ident(Result) operator(:=) ident(B)operator(;) +reserved(end)operator(;) + +reserved(function) ident(Min)operator(()reserved(const) ident(A)operator(:) ident(TIntA)operator(\):) ident(Integer)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) integer(0)operator(;) + reserved(if) ident(Length)operator(()ident(A)operator(\)) operator(=) integer(0) reserved(then) + ident(Exit)operator(;) + + ident(Result) operator(:=) ident(A)operator([)integer(0)operator(];) + reserved(for) ident(i) operator(:=) integer(1) reserved(to) ident(High)operator(()ident(A)operator(\)) reserved(do) + reserved(if) ident(A)operator([)ident(i)operator(]) operator(<) ident(Result) reserved(then) + ident(Result) operator(:=) ident(A)operator([)ident(i)operator(];) +reserved(end)operator(;) + +reserved(function) ident(Max)operator(()reserved(const) ident(A)operator(,) ident(B)operator(:) ident(Integer)operator(\):) ident(Integer)operator(;) +reserved(begin) + reserved(if) ident(A) operator(>) ident(B) reserved(then) + ident(Result) operator(:=) ident(A) + reserved(else) + ident(Result) operator(:=) ident(B)operator(;) +reserved(end)operator(;) + +reserved(function) ident(Max)operator(()reserved(const) ident(A)operator(:) ident(TIntA)operator(\):) ident(Integer)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) integer(0)operator(;) + reserved(if) ident(Length)operator(()ident(A)operator(\)) operator(=) integer(0) reserved(then) + ident(Exit)operator(;) + + ident(Result) operator(:=) ident(A)operator([)integer(0)operator(];) + reserved(for) ident(i) operator(:=) integer(1) reserved(to) ident(High)operator(()ident(A)operator(\)) reserved(do) + reserved(if) ident(A)operator([)ident(i)operator(]) operator(>) ident(Result) reserved(then) + ident(Result) operator(:=) ident(A)operator([)ident(i)operator(];) +reserved(end)operator(;) + +reserved(function) ident(RangesOfStr)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\):) ident(TRanges)operator(;) +reserved(var) + ident(SL)operator(:) ident(TStringList)operator(;) + ident(r)operator(,) ident(b)operator(,) ident(t)operator(:) reserved(string)operator(;) + ident(i)operator(,) ident(p)operator(:) ident(Integer)operator(;) + + reserved(function) ident(TryStrToCard)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(;) reserved(out) ident(Value)operator(:) ident(Cardinal)operator(\):) ident(Boolean)operator(;) + reserved(var) + ident(E)operator(:) ident(Integer)operator(;) + reserved(begin) + ident(Val)operator(()ident(S)operator(,) ident(Value)operator(,) ident(E)operator(\);) + ident(Result) operator(:=) ident(E) operator(=) integer(0)operator(;) + reserved(end)operator(;) + +reserved(begin) + ident(Result) operator(:=) reserved(nil)operator(;) + ident(SL) operator(:=) ident(TStringList)operator(.)ident(Create)operator(;) + reserved(try) + ident(Split)operator(()ident(S)operator(,) ident(RangesSeparator)operator(,) ident(SL)operator(\);) + ident(SetLength)operator(()ident(Result)operator(,) ident(SL)operator(.)ident(Count)operator(\);) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(SL)operator(.)ident(Count)operator(-)integer(1) reserved(do) reserved(begin) + ident(r) operator(:=) ident(SL)operator([)ident(i)operator(];) + reserved(with) ident(Result)operator([)ident(i)operator(]) reserved(do) reserved(begin) + ident(p) operator(:=) ident(CharPos)operator(()ident(RangeInnerSeparator)operator(,) ident(r)operator(\);) + ident(Simple) operator(:=) ident(p) operator(=) integer(0)operator(;) comment(// no '-' found) + reserved(if) ident(Simple) reserved(then) reserved(begin) + reserved(if) ident(r) operator(=) ident(RangeInfinite) reserved(then) reserved(begin) comment(// * --> *-*) + ident(Simple) operator(:=) ident(False)operator(;) + ident(Bottom) operator(:=) ident(Low)operator(()ident(Bottom)operator(\);) + ident(Top) operator(:=) ident(High)operator(()ident(Top)operator(\);) + reserved(end) reserved(else) reserved(if) reserved(not) ident(TryStrToCard)operator(()ident(r)operator(,) ident(Value)operator(\)) reserved(then) + ident(Break)operator(;) + + reserved(end) reserved(else) reserved(begin) + ident(TileStr)operator(()ident(r)operator(,) ident(p)operator(,) ident(p)operator(,) ident(b)operator(,) ident(t)operator(\);) + + reserved(if) ident(b) operator(=) ident(RangeInfinite) reserved(then) + ident(Bottom) operator(:=) ident(Low)operator(()ident(Bottom)operator(\)) + reserved(else) reserved(if) reserved(not) ident(TryStrToCard)operator(()ident(b)operator(,) ident(Bottom)operator(\)) reserved(then) + ident(Break)operator(;) + + reserved(if) ident(t) operator(=) ident(RangeInfinite) reserved(then) + ident(Top) operator(:=) ident(High)operator(()ident(Top)operator(\)) + reserved(else) reserved(if) reserved(not) ident(TryStrToCard)operator(()ident(t)operator(,) ident(Top)operator(\)) reserved(then) + ident(Break)operator(;) + reserved(if) ident(Bottom) operator(>) ident(Top) reserved(then) reserved(begin) + ident(p) operator(:=) ident(Bottom)operator(;) ident(Bottom) operator(:=) ident(Top)operator(;) ident(Top) operator(:=) ident(p)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + reserved(if) ident(i) operator(<>) ident(SL)operator(.)ident(Count) reserved(then) + ident(Result) operator(:=) reserved(nil)operator(;) + + reserved(finally) + ident(SL)operator(.)ident(Free)operator(;) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(function) ident(InRanges)operator(()ident(Ranges)operator(:) ident(TRanges)operator(;) ident(TestValue)operator(:) ident(Cardinal)operator(\):) ident(Boolean)operator(;) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(True)operator(;) + + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(High)operator(()ident(Ranges)operator(\)) reserved(do) + reserved(with) ident(Ranges)operator([)ident(i)operator(]) reserved(do) + reserved(if) ident(Simple) reserved(then) reserved(begin) + reserved(if) ident(TestValue) operator(=) ident(Value) reserved(then) + ident(Exit)operator(;) + reserved(end) reserved(else) reserved(begin) + reserved(if) ident(InRange)operator(()ident(TestValue)operator(,) ident(Bottom)operator(,) ident(Top)operator(\)) reserved(then) + ident(Exit)operator(;) + reserved(end)operator(;) + + ident(Result) operator(:=) ident(False)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(WriteSL)operator(()ident(Strings)operator(:) ident(TStrings)operator(;) reserved(const) ident(Prefix)operator(:) reserved(string) operator(=) string<delimiter(')delimiter(')>operator(;) + reserved(const) ident(Suffix)operator(:) reserved(string) operator(=) string<delimiter(')delimiter(')>operator(\);) +reserved(var) + ident(i)operator(:) ident(Integer)operator(;) +reserved(begin) + reserved(for) ident(i) operator(:=) integer(0) reserved(to) ident(Strings)operator(.)ident(Count)operator(-)integer(1) reserved(do) + ident(WriteLn)operator(()ident(Prefix) operator(+) ident(Strings)operator([)ident(i)operator(]) operator(+) ident(Suffix)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(Success)operator(()ident(Res)operator(:) ident(Integer)operator(;) ident(ResultOnSuccess)operator(:) ident(Integer) operator(=) ident(ERROR_SUCCESS)operator(\):) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) operator(()ident(Res) operator(=) ident(ResultOnSuccess)operator(\);) + ident(LastSuccessRes) operator(:=) ident(Res)operator(;) +reserved(end)operator(;) + +reserved(function) ident(Failure)operator(()ident(Res)operator(:) ident(Integer)operator(;) ident(ResultOnSuccess)operator(:) ident(Integer) operator(=) ident(ERROR_SUCCESS)operator(\):) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) reserved(not) ident(Success)operator(()ident(Res)operator(,) ident(ResultOnSuccess)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(ExpandString)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\):) reserved(string)operator(;) +reserved(var) + ident(Len)operator(:) ident(Integer)operator(;) + ident(P)operator(,) ident(Res)operator(:) ident(PChar)operator(;) +reserved(begin) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + ident(P) operator(:=) ident(PChar)operator(()ident(S)operator(\);) + ident(Len) operator(:=) ident(ExpandEnvironmentStrings)operator(()ident(P)operator(,) reserved(nil)operator(,) integer(0)operator(\);) + reserved(if) ident(Len) operator(=) integer(0) reserved(then) + ident(Exit)operator(;) + + ident(GetMem)operator(()ident(Res)operator(,) ident(Len)operator(\);) + ident(ExpandEnvironmentStrings)operator(()ident(P)operator(,) ident(Res)operator(,) ident(Len)operator(\);) + + ident(Result) operator(:=) ident(Res)operator(;) + ident(FreeMem)operator(()ident(Res)operator(,) ident(Len)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(FindAll)operator(()ident(Strings)operator(:) ident(TStrings)operator(;) reserved(const) ident(Mask)operator(:) reserved(string)operator(;) + ident(ScanSubDirs)operator(:) ident(Boolean) operator(=) ident(True)operator(;) ident(Attributes)operator(:) ident(Integer) operator(=) ident(faFindEveryFile)operator(;) + ident(FileReturn)operator(:) ident(TFileNameFunc) operator(=) reserved(nil)operator(\):) ident(Boolean)operator(;) +reserved(var) + ident(Path)operator(,) ident(FileName)operator(:) reserved(string)operator(;) + + reserved(procedure) ident(ScanDir)operator(()reserved(const) ident(Path)operator(,) ident(FileName)operator(:) reserved(string)operator(\);) + reserved(var) + ident(PSR)operator(:) ident(TSearchRec)operator(;) + ident(Res)operator(:) ident(Integer)operator(;) + + reserved(procedure) ident(Add)operator(()reserved(const) ident(S)operator(:) reserved(string)operator(\);) + reserved(begin) + reserved(if) ident(S) operator(<>) string<delimiter(')delimiter(')> reserved(then) + ident(Strings)operator(.)ident(Add)operator(()ident(S)operator(\);) + reserved(end)operator(;) + + reserved(begin) + ident(Res) operator(:=) ident(FindFirst)operator(()ident(Path) operator(+) ident(FileName)operator(,) ident(Attributes)operator(,) ident(PSR)operator(\);) + reserved(while) ident(Success)operator(()ident(Res)operator(,) integer(0)operator(\)) reserved(do) reserved(begin) + reserved(if) ident(Assigned)operator(()ident(FileReturn)operator(\)) reserved(then) + ident(Add)operator(()ident(FileReturn)operator(()ident(Path) operator(+) ident(PSR)operator(.)ident(Name)operator(\)\)) + reserved(else) + ident(Add)operator(()ident(Path) operator(+) ident(PSR)operator(.)ident(Name)operator(\);) + ident(Res) operator(:=) ident(FindNext)operator(()ident(PSR)operator(\);) + reserved(end)operator(;) + ident(FindClose)operator(()ident(PSR)operator(\);) + reserved(if) reserved(not) ident(ScanSubDirs) reserved(then) + ident(Exit)operator(;) + + ident(Res) operator(:=) ident(FindFirst)operator(()ident(Path) operator(+) char<delimiter(')content(*)delimiter(')>operator(,) ident(faDirectory)operator(,) ident(PSR)operator(\);) + reserved(while) ident(Success)operator(()ident(Res)operator(,) integer(0)operator(\)) reserved(do) reserved(begin) + reserved(if) operator(()ident(PSR)operator(.)ident(Attr) reserved(and) ident(faDirectory) operator(>) integer(0)operator(\)) + reserved(and) operator(()ident(PSR)operator(.)ident(Name) operator(<>) char<delimiter(')content(.)delimiter(')>operator(\)) reserved(and) operator(()ident(PSR)operator(.)ident(Name) operator(<>) string<delimiter(')content(..)delimiter(')>operator(\)) reserved(then) + ident(ScanDir)operator(()ident(Path) operator(+) ident(PSR)operator(.)ident(Name) operator(+) char<delimiter(')content(\\)delimiter(')>operator(,) ident(FileName)operator(\);) + ident(Res) operator(:=) ident(FindNext)operator(()ident(PSR)operator(\);) + reserved(end)operator(;) + ident(FindClose)operator(()ident(PSR)operator(\);) + reserved(end)operator(;) + +reserved(begin) + ident(Strings)operator(.)ident(Clear)operator(;) + ident(Path) operator(:=) ident(ExtractPath)operator(()ident(Mask)operator(\);) + ident(FileName) operator(:=) ident(ExtractFileName)operator(()ident(Mask)operator(\);) + ident(ScanDir)operator(()ident(Path)operator(,) ident(FileName)operator(\);) + ident(Result) operator(:=) ident(Strings)operator(.)ident(Count) operator(>) integer(0)operator(;) +reserved(end)operator(;) + +reserved(function) ident(FindAllFirst)operator(()reserved(const) ident(Mask)operator(:) reserved(string)operator(;) ident(ScanSubDirs)operator(:) ident(Boolean) operator(=) ident(True)operator(;) + ident(Attributes)operator(:) ident(Integer) operator(=) ident(faFindEveryFile)operator(\):) reserved(string)operator(;) +reserved(var) + ident(Path)operator(,) ident(FileName)operator(:) reserved(string)operator(;) + + reserved(function) ident(ScanDir)operator(()reserved(const) ident(Path)operator(,) ident(FileName)operator(:) reserved(string)operator(\):) ident(Boolean)operator(;) + reserved(var) + ident(PSR)operator(:) ident(TSearchRec)operator(;) + ident(Res)operator(:) ident(Integer)operator(;) + reserved(begin) + ident(Result) operator(:=) ident(False)operator(;) + reserved(if) ident(Success)operator(()ident(FindFirst)operator(()ident(Path) operator(+) ident(FileName)operator(,) ident(Attributes)operator(,) ident(PSR)operator(\),) integer(0)operator(\)) reserved(then) reserved(begin) + ident(FindAllFirst) operator(:=) ident(Path) operator(+) ident(PSR)operator(.)ident(Name)operator(;) + ident(Result) operator(:=) ident(True)operator(;) + ident(FindClose)operator(()ident(PSR)operator(\);) + ident(Exit)operator(;) reserved(end)operator(;) + reserved(if) reserved(not) ident(ScanSubDirs) reserved(then) + ident(Exit)operator(;) + + ident(Res) operator(:=) ident(FindFirst)operator(()ident(Path) operator(+) char<delimiter(')content(*)delimiter(')>operator(,) ident(faDirectory)operator(,) ident(PSR)operator(\);) + reserved(while) reserved(not) ident(Result) reserved(and) ident(Success)operator(()ident(Res)operator(,) integer(0)operator(\)) reserved(do) reserved(begin) + reserved(if) operator(()ident(PSR)operator(.)ident(Attr) reserved(and) ident(faDirectory) operator(>) integer(0)operator(\)) + reserved(and) operator(()ident(PSR)operator(.)ident(Name) operator(<>) char<delimiter(')content(.)delimiter(')>operator(\)) reserved(and) operator(()ident(PSR)operator(.)ident(Name) operator(<>) string<delimiter(')content(..)delimiter(')>operator(\)) reserved(then) + ident(Result) operator(:=) ident(ScanDir)operator(()ident(Path) operator(+) ident(PSR)operator(.)ident(Name) operator(+) char<delimiter(')content(\\)delimiter(')>operator(,) ident(FileName)operator(\);) + ident(Res) operator(:=) ident(FindNext)operator(()ident(PSR)operator(\);) + reserved(end)operator(;) + ident(FindClose)operator(()ident(PSR)operator(\);) + reserved(end)operator(;) +reserved(begin) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + ident(Path) operator(:=) ident(ExtractPath)operator(()ident(Mask)operator(\);) + ident(FileName) operator(:=) ident(ExtractFileName)operator(()ident(Mask)operator(\);) + ident(ScanDir)operator(()ident(Path)operator(,) ident(FileName)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(DeleteFiles)operator(()reserved(const) ident(Mask)operator(:) reserved(string)operator(;) ident(ScanSubDirs)operator(:) ident(Boolean) operator(=) ident(True)operator(;) + ident(Attributes)operator(:) ident(Integer) operator(=) ident(faFindEveryFile)operator(\);) +reserved(var) + ident(Path)operator(,) ident(FileName)operator(:) reserved(string)operator(;) + + reserved(procedure) ident(ScanDir)operator(()reserved(const) ident(Path)operator(,) ident(FileName)operator(:) reserved(string)operator(\);) + reserved(var) + ident(PSR)operator(:) ident(TSearchRec)operator(;) + ident(Res)operator(:) ident(Integer)operator(;) + + reserved(procedure) ident(TryDeleteFile)operator(()reserved(const) ident(FileName)operator(:) reserved(string)operator(\);) + reserved(begin) + reserved(try) + ident(DeleteFile)operator(()ident(Path) operator(+) ident(PSR)operator(.)ident(Name)operator(\);) + reserved(except) + reserved(end)operator(;) + reserved(end)operator(;) + + reserved(begin) + ident(Res) operator(:=) ident(FindFirst)operator(()ident(Path) operator(+) ident(FileName)operator(,) ident(Attributes)operator(,) ident(PSR)operator(\);) + reserved(while) ident(Success)operator(()ident(Res)operator(,) integer(0)operator(\)) reserved(do) reserved(begin) + ident(TryDeleteFile)operator(()ident(Path) operator(+) ident(PSR)operator(.)ident(Name)operator(\);) + ident(Res) operator(:=) ident(FindNext)operator(()ident(PSR)operator(\);) + reserved(end)operator(;) + ident(FindClose)operator(()ident(PSR)operator(\);) + reserved(if) reserved(not) ident(ScanSubDirs) reserved(then) + ident(Exit)operator(;) + + ident(Res) operator(:=) ident(FindFirst)operator(()ident(Path) operator(+) char<delimiter(')content(*)delimiter(')>operator(,) ident(faDirectory)operator(,) ident(PSR)operator(\);) + reserved(while) ident(Success)operator(()ident(Res)operator(,) integer(0)operator(\)) reserved(do) reserved(begin) + reserved(if) operator(()ident(PSR)operator(.)ident(Attr) reserved(and) ident(faDirectory) operator(>) integer(0)operator(\)) + reserved(and) operator(()ident(PSR)operator(.)ident(Name) operator(<>) char<delimiter(')content(.)delimiter(')>operator(\)) reserved(and) operator(()ident(PSR)operator(.)ident(Name) operator(<>) string<delimiter(')content(..)delimiter(')>operator(\)) reserved(then) reserved(begin) + ident(ScanDir)operator(()ident(Path) operator(+) ident(PSR)operator(.)ident(Name) operator(+) char<delimiter(')content(\\)delimiter(')>operator(,) ident(FileName)operator(\);) + ident(TryDeleteFile)operator(()ident(Path) operator(+) ident(PSR)operator(.)ident(Name)operator(\);) + reserved(end)operator(;) + ident(Res) operator(:=) ident(FindNext)operator(()ident(PSR)operator(\);) + reserved(end)operator(;) + ident(FindClose)operator(()ident(PSR)operator(\);) + reserved(end)operator(;) +reserved(begin) + ident(Path) operator(:=) ident(ExtractPath)operator(()ident(Mask)operator(\);) + ident(FileName) operator(:=) ident(ExtractFileName)operator(()ident(Mask)operator(\);) + ident(ScanDir)operator(()ident(Path)operator(,) ident(FileName)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(GetFileNew)operator(()ident(FileName)operator(:) reserved(string)operator(;) ident(NoFloppyDrives)operator(:) ident(Boolean) operator(=) ident(True)operator(\):) reserved(string)operator(;) +reserved(var) + ident(Drive)operator(:) reserved(string)operator(;) + ident(pf)operator(,) ident(pd)operator(,) ident(Len)operator(:) ident(Integer)operator(;) + ident(PSR)operator(:) ident(TSearchRec)operator(;) +reserved(begin) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + ident(FileName) operator(:=) ident(Trim)operator(()ident(FileName)operator(\);) + reserved(if) ident(Length)operator(()ident(FileName)operator(\)) operator(<) integer(2) reserved(then) + ident(Exit)operator(;) + + ident(Drive) operator(:=) ident(ExtractDrive)operator(()ident(FileName)operator(\);) + reserved(if) reserved(not) ident(DirectoryExists)operator(()ident(Drive)operator(\)) reserved(then) + ident(Exit)operator(;) + + reserved(if) ident(NoFloppyDrives) reserved(and) operator(()ident(Drive)operator([)integer(1)operator(]) reserved(in) operator([)char<delimiter(')content(A)delimiter(')>operator(,) char<delimiter(')content(B)delimiter(')>operator(]\)) reserved(then) + ident(Exit)operator(;) + + ident(Len) operator(:=) ident(Length)operator(()ident(FileName)operator(\);) + ident(Result) operator(:=) ident(Drive)operator(;) + ident(pf) operator(:=) ident(Length)operator(()ident(Drive)operator(\)) operator(+) integer(1)operator(;) + reserved(while) ident(pf) operator(<=) ident(Len) reserved(do) reserved(begin) + reserved(if) ident(FileName)operator([)ident(pf)operator(]) operator(=) char<delimiter(')content(\\)delimiter(')> reserved(then) reserved(begin) + ident(Result) operator(:=) ident(Result) operator(+) char<delimiter(')content(\\)delimiter(')>operator(;) + ident(Inc)operator(()ident(pf)operator(\);) + ident(Continue)operator(;) reserved(end)operator(;) + + ident(pd) operator(:=) ident(CharPos)operator(()char<delimiter(')content(\\)delimiter(')>operator(,) ident(FileName)operator(,) ident(pf)operator(\);) + reserved(if) ident(pd) operator(=) integer(0) reserved(then) reserved(begin) + reserved(if) integer(0)operator(=)ident(FindFirst)operator(()ident(Result) operator(+) ident(Copy)operator(()ident(FileName)operator(,) ident(pf)operator(,) ident(MaxInt)operator(\),) ident(faFindEveryFile)operator(,) ident(PSR)operator(\)) reserved(then) reserved(begin) + ident(Result) operator(:=) ident(Result) operator(+) ident(PSR)operator(.)ident(Name)operator(;) + ident(Break)operator(;) reserved(end) reserved(else) reserved(begin) + ident(FindClose)operator(()ident(PSR)operator(\);) + reserved(if) integer(0)operator(=)ident(FindFirst)operator(()ident(Result) operator(+) ident(Copy)operator(()ident(FileName)operator(,) ident(pf)operator(,) ident(MaxInt)operator(\),) ident(faDirectory)operator(,) ident(PSR)operator(\)) reserved(then) + ident(Result) operator(:=) ident(Result) operator(+) ident(PSR)operator(.)ident(Name) operator(+) char<delimiter(')content(\\)delimiter(')> + reserved(else) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + ident(FindClose)operator(()ident(PSR)operator(\);) + reserved(if) ident(Result) operator(=) string<delimiter(')delimiter(')> reserved(then) + ident(Break)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + + reserved(if) integer(0)operator(=)ident(FindFirst)operator(()ident(Result) operator(+) ident(Copy)operator(()ident(FileName)operator(,) ident(pf)operator(,) ident(pd) operator(-) ident(pf)operator(\),) ident(faDirectory)operator(,) ident(PSR)operator(\)) reserved(then) + ident(Result) operator(:=) ident(Result) operator(+) ident(PSR)operator(.)ident(Name) operator(+) char<delimiter(')content(\\)delimiter(')> + reserved(else) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) + ident(FindClose)operator(()ident(PSR)operator(\);) + reserved(if) ident(Result) operator(=) string<delimiter(')delimiter(')> reserved(then) + ident(Break)operator(;) + + ident(pf) operator(:=) ident(pd) operator(+) integer(1)operator(;) + reserved(end)operator(;) + + reserved(if) operator(()ident(Result) operator(<>) string<delimiter(')delimiter(')>operator(\)) reserved(and) reserved(not) ident(FileEx)operator(()ident(Result)operator(,) ident(True)operator(\)) reserved(then) + ident(Result) operator(:=) string<delimiter(')delimiter(')>operator(;) +reserved(end)operator(;) + +reserved(function) ident(DateTimeOfFileTime)operator(()reserved(const) ident(FileTime)operator(:) ident(TFileTime)operator(\):) ident(TDateTime)operator(;) +reserved(var) + ident(LocalFileTime)operator(:) ident(TFileTime)operator(;) + ident(Res)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Result) operator(:=) integer(0)operator(;) + + ident(FileTimeToLocalFileTime)operator(()ident(FileTime)operator(,) ident(LocalFileTime)operator(\);) + reserved(if) reserved(not) ident(FileTimeToDosDateTime)operator(()ident(LocalFileTime)operator(,) ident(LongRec)operator(()ident(Res)operator(\).)ident(Hi)operator(,) + ident(LongRec)operator(()ident(Res)operator(\).)ident(Lo)operator(\)) reserved(then) + ident(Res) operator(:=) operator(-)integer(1)operator(;) + + reserved(if) operator(()ident(Res) operator(=) operator(-)integer(1)operator(\)) reserved(or) operator(()ident(Res) operator(=) integer(0)operator(\)) reserved(then) + ident(Exit)operator(;) + reserved(try) + ident(Result) operator(:=) ident(FileDateToDateTime)operator(()ident(Res)operator(\);) + reserved(except) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(FileNew)operator(()reserved(const) ident(FileName)operator(:) reserved(string)operator(\);) +reserved(var) + ident(Handle)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(Handle) operator(:=) ident(FileCreate)operator(()ident(FileName)operator(\);) + ident(FileClose)operator(()ident(Handle)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(Win32PlatformStr)operator(:) reserved(string)operator(;) +reserved(const) + ident(PlatformStrings)operator(:) reserved(array)operator([)ident(VER_PLATFORM_WIN32s)operator(..)ident(VER_PLATFORM_WIN32_NT)operator(]) reserved(of) reserved(string) operator(=) + operator(()string<delimiter(')content(VER_PLATFORM_WIN32s)delimiter(')>operator(,) string<delimiter(')content(VER_PLATFORM_WIN32_WINDOWS)delimiter(')>operator(,) string<delimiter(')content(VER_PLATFORM_WIN32_NT)delimiter(')>operator(\);) +reserved(begin) + ident(Result) operator(:=) ident(PlatformStrings)operator([)ident(Win32Platform)operator(];) +reserved(end)operator(;) + +reserved(function) ident(FullOSInfo)operator(:) reserved(string)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(Format)operator(() + string<delimiter(')content(Platform: %s)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(Version: %d.%d Build %d)delimiter(')> operator(+) ident(EOL) operator(+) + string<delimiter(')content(CSD: %s)delimiter(')>operator(,) + operator([) + ident(Win32PlatformStr)operator(,) + ident(Win32MajorVersion)operator(,) ident(Win32MinorVersion)operator(,) ident(Win32BuildNumber)operator(,) + ident(Win32CSDVersion) + operator(]) + operator(\);) +reserved(end)operator(;) + +reserved(function) ident(Win9x)operator(:) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(Win32Platform) operator(=) ident(VER_PLATFORM_WIN32_WINDOWS)operator(;) +reserved(end)operator(;) + +reserved(function) ident(WinNT)operator(:) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(Win32Platform) operator(=) ident(VER_PLATFORM_WIN32_NT)operator(;) +reserved(end)operator(;) + +reserved(function) ident(Win2000)operator(:) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) operator(()ident(Win32Platform) operator(=) ident(VER_PLATFORM_WIN32_NT)operator(\)) + reserved(and) operator(()ident(Win32MajorVersion) operator(=) integer(4)operator(\);) +reserved(end)operator(;) + +reserved(function) ident(WinXP)operator(:) ident(Boolean)operator(;) +reserved(begin) + ident(Result) operator(:=) ident(Win32MajorVersion) operator(>=) integer(5)operator(;) +reserved(end)operator(;) + +reserved(initialization) + ident(MyDir) operator(:=) ident(GetMyDir)operator(;) + +reserved(end)operator(.) + +reserved(unit) ident(FifoStream)operator(;) + +reserved(interface) + +reserved(uses) ident(Classes)operator(,) ident(windows)operator(,) ident(Dialogs)operator(;) + +reserved(const) + ident(DefaultChunksize) operator(=) integer(32768)operator(;) comment(// 32kb per chunk as default.) + +reserved(type) + ident(PMemChunk) operator(=) operator(^)ident(TMemChunk)operator(;) + ident(TMemChunk) operator(=) reserved(record) + ident(Filled)operator(:) ident(Longword)operator(;) + ident(Read)operator(:) ident(Longword)operator(;) + ident(Data)operator(:) ident(pointer)operator(;) + reserved(end)operator(;) + + ident(TFifo) operator(=) reserved(class) + directive(private) + ident(FBuffers)operator(:) ident(TList)operator(;) + ident(FChunksize)operator(:) ident(Longword)operator(;) + ident(FCritSect)operator(:) ident(TRTLCriticalSection)operator(;) + ident(FIsWinNT)operator(:) ident(boolean)operator(;) + ident(FBytesInFifo)operator(:) ident(LongWord)operator(;) + directive(protected) + reserved(function) ident(GetBytesInFifo)operator(:) ident(LongWord)operator(;) + directive(public) + reserved(constructor) ident(Create)operator(;) + reserved(destructor) ident(Destroy)operator(;) directive(override)operator(;) + reserved(procedure) ident(Write)operator(()ident(Data)operator(:) ident(pointer)operator(;) ident(Size)operator(:) ident(LongWord)operator(\);) + reserved(procedure) ident(Read)operator(()ident(Buff)operator(:) ident(pointer)operator(;) reserved(var) ident(ReqSize)operator(:) ident(LongWord)operator(\);) + reserved(procedure) ident(PeekData)operator(()ident(Buff)operator(:) ident(pointer)operator(;) reserved(var) ident(ReqSize)operator(:) ident(LongWord)operator(\);) + directive(published) + reserved(property) ident(BytesInFifo)operator(:) ident(LongWord) directive(read) ident(FBytesInFifo)operator(;) + reserved(end)operator(;) + +reserved(implementation) + +reserved(constructor) ident(TFifo)operator(.)ident(Create)operator(;) +reserved(begin) + reserved(inherited)operator(;) + ident(FBuffers) operator(:=) ident(TList)operator(.)ident(Create)operator(;) + comment(// set default chunksize...) + ident(FChunksize) operator(:=) ident(DefaultChunksize)operator(;) + ident(InitializeCriticalSection)operator(()ident(FCritSect)operator(\);) +reserved(end)operator(;) + +reserved(destructor) ident(TFifo)operator(.)ident(Destroy)operator(;) +reserved(var) + ident(I)operator(:) ident(Integer)operator(;) +reserved(begin) + ident(EnterCriticalSection)operator(()ident(FCritSect)operator(\);) + reserved(for) ident(I) operator(:=) integer(0) reserved(to) ident(FBuffers)operator(.)ident(count) operator(-) integer(1) reserved(do) + reserved(begin) + ident(FreeMem)operator(()ident(PMemChunk)operator(()ident(Fbuffers)operator([)ident(I)operator(]\).)ident(Data)operator(\);) + ident(Dispose)operator(()ident(PMemChunk)operator(()ident(Fbuffers)operator([)ident(I)operator(]\)\);) + reserved(end)operator(;) + ident(FBuffers)operator(.)ident(Clear)operator(;) + ident(FBuffers)operator(.)ident(Free)operator(;) + ident(LeaveCriticalSection)operator(()ident(FCritSect)operator(\);) + + ident(DeleteCriticalSection)operator(()ident(FCritSect)operator(\);) + reserved(inherited)operator(;) +reserved(end)operator(;) + +reserved(function) ident(TFifo)operator(.)ident(GetBytesInFifo)operator(:) ident(LongWord)operator(;) +reserved(begin) + ident(Result) operator(:=) integer(0)operator(;) + reserved(if) ident(FBuffers)operator(.)ident(Count) operator(=) integer(0) reserved(then) + reserved(begin) + ident(exit)operator(;) + reserved(end) + reserved(else) + reserved(begin) + reserved(if) ident(FBuffers)operator(.)ident(Count) operator(>) integer(1) reserved(then) + ident(Inc)operator(()ident(Result)operator(,) operator(()ident(FBuffers)operator(.)ident(Count) operator(-) integer(1)operator(\)) operator(*) ident(FChunkSize)operator(\);) + ident(Inc)operator(()ident(Result)operator(,) ident(PMemChunk)operator(()ident(FBuffers)operator([)ident(Fbuffers)operator(.)ident(Count) operator(-) integer(1)operator(]\).)ident(Filled)operator(\);) + ident(Dec)operator(()ident(Result)operator(,) ident(PMemChunk)operator(()ident(FBuffers)operator([)integer(0)operator(]\).)ident(Read)operator(\);) + reserved(end)operator(;) +reserved(end)operator(;) + +reserved(procedure) ident(TFifo)operator(.)ident(Write)operator(()ident(Data)operator(:) ident(pointer)operator(;) ident(Size)operator(:) ident(LongWord)operator(\);) +reserved(var) + ident(Privpointer)operator(:) ident(pointer)operator(;) + ident(PrivSize)operator(:) ident(LongWord)operator(;) + ident(Chunk)operator(:) ident(PMemChunk)operator(;) + ident(PosInChunk)operator(:) ident(pointer)operator(;) +reserved(begin) + reserved(if) ident(LongWord)operator(()ident(Data)operator(\)) operator(=) integer(0) reserved(then) + reserved(begin) + comment(// null pointer? somebody is trying to fool us, get out...) + ident(Exit)operator(;) + reserved(end)operator(;) + ident(EnterCriticalSection)operator(()ident(FCritSect)operator(\);) + ident(PrivPointer) operator(:=) ident(Data)operator(;) + ident(PrivSize) operator(:=) integer(0)operator(;) + comment(// are already buffers there?) + reserved(if) ident(FBuffers)operator(.)ident(count) operator(>) integer(0) reserved(then) + reserved(begin) + comment(// is the last one of them not completely filled?) + reserved(if) ident(PMemChunk)operator(()ident(FBuffers)operator([)ident(FBuffers)operator(.)ident(count) operator(-) integer(1)operator(]\).)ident(filled) operator(<) ident(FChunksize) reserved(then) + comment(// not completely filled, so fill up the buffer.) + reserved(begin) + ident(Chunk) operator(:=) ident(PMemChunk)operator(()ident(FBuffers)operator([)ident(FBuffers)operator(.)ident(count) operator(-) integer(1)operator(]\);) + comment(// fetch chunkdata.) + ident(PosInChunk) operator(:=) ident(Chunk)operator(.)ident(Data)operator(;) + comment(// move to current fill pos...) + ident(Inc)operator(()ident(LongWord)operator(()ident(PosInChunk)operator(\),) ident(Chunk)operator(.)ident(Filled)operator(\);) + comment(// can we fill the chunk completely?) + reserved(if) ident(Size) operator(>) ident(FChunksize) operator(-) ident(Chunk)operator(.)ident(Filled) reserved(then) + reserved(begin) + comment(// yes we can.) + ident(Move)operator(()ident(PrivPointer)operator(^,) ident(PosInChunk)operator(^,) ident(FChunksize) operator(-) ident(Chunk)operator(.)ident(Filled)operator(\);) + ident(Inc)operator(()ident(PrivSize)operator(,) ident(FChunksize) operator(-) ident(Chunk)operator(.)ident(Filled)operator(\);) + ident(Inc)operator(()ident(LongWord)operator(()ident(PrivPointer)operator(\),) ident(FChunksize) operator(-) ident(Chunk)operator(.)ident(Filled)operator(\);) + ident(Chunk)operator(.)ident(Filled) operator(:=) ident(FChunkSize)operator(;) + reserved(end) + reserved(else) + comment(// we have to less data for filling the chunk completely,) + comment(// just put everything in.) + reserved(begin) + ident(Move)operator(()ident(PrivPointer)operator(^,) ident(PosInChunk)operator(^,) ident(Size)operator(\);) + ident(Inc)operator(()ident(PrivSize)operator(,) ident(Size)operator(\);) + ident(Inc)operator(()ident(Chunk)operator(.)ident(Filled)operator(,) ident(Size)operator(\);) + reserved(end)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + comment(// as long as we have remaining stuff put it into new chunks.) + reserved(while) operator(()ident(PrivSize) operator(<) ident(Size)operator(\)) reserved(do) + reserved(begin) + ident(new)operator(()ident(Chunk)operator(\);) + ident(GetMem)operator(()ident(Chunk)operator(.)ident(Data)operator(,) ident(FChunksize)operator(\);) + ident(Chunk)operator(.)ident(Read) operator(:=) integer(0)operator(;) + comment(// can we fill an entire chunk with the remaining data?) + reserved(if) ident(Privsize) operator(+) ident(FChunksize) operator(<) ident(Size) reserved(then) + reserved(begin) + comment(// yes we can, so put the stuff in.) + ident(Move)operator(()ident(Privpointer)operator(^,) ident(Chunk)operator(.)ident(Data)operator(^,) ident(FChunksize)operator(\);) + ident(Inc)operator(()ident(LongWord)operator(()ident(PrivPointer)operator(\),) ident(FChunksize)operator(\);) + ident(Inc)operator(()ident(PrivSize)operator(,) ident(FChunksize)operator(\);) + ident(Chunk)operator(.)ident(Filled) operator(:=) ident(FChunksize)operator(;) + reserved(end) + reserved(else) comment(// we have to less data to fill the entire chunk, just put the remaining stuff in.) + reserved(begin) + ident(Move)operator(()ident(Privpointer)operator(^,) ident(Chunk)operator(.)ident(Data)operator(^,) ident(Size) operator(-) ident(Privsize)operator(\);) + ident(Chunk)operator(.)ident(Filled) operator(:=) ident(Size) operator(-) ident(Privsize)operator(;) + ident(Inc)operator(()ident(PrivSize)operator(,) ident(Size) operator(-) ident(Privsize)operator(\);) + reserved(end)operator(;) + ident(Fbuffers)operator(.)ident(Add)operator(()ident(Chunk)operator(\);) + reserved(end)operator(;) + reserved(if) ident(Size) operator(<>) ident(Privsize) reserved(then) + ident(Showmessage)operator(()string<delimiter(')content(miscalculation in TFifo.write)delimiter(')>operator(\);) + ident(FBytesInFifo) operator(:=) ident(GetBytesInFifo)operator(;) + ident(LeaveCriticalSection)operator(()ident(FCritSect)operator(\);) +reserved(end)operator(;) + +reserved(procedure) ident(TFifo)operator(.)ident(Read)operator(()ident(Buff)operator(:) ident(pointer)operator(;) reserved(var) ident(ReqSize)operator(:) ident(LongWord)operator(\);) +reserved(var) + ident(PrivSize)operator(:) ident(Integer)operator(;) + ident(Privpos)operator(:) ident(pointer)operator(;) + ident(Chunk)operator(:) ident(PMemChunk)operator(;) + ident(ChunkPos)operator(:) ident(pointer)operator(;) +reserved(begin) + reserved(if) ident(LongWord)operator(()ident(Buff)operator(\)) operator(=) integer(0) reserved(then) + reserved(begin) + comment(// null pointer? somebody is trying to fool us, get out...) + ident(Exit)operator(;) + reserved(end)operator(;) + ident(EnterCriticalSection)operator(()ident(FCritSect)operator(\);) + ident(PrivSize) operator(:=) integer(0)operator(;) + ident(Privpos) operator(:=) ident(Buff)operator(;) + reserved(while) ident(FBuffers)operator(.)ident(Count) operator(>) integer(0) reserved(do) + reserved(begin) + ident(Chunk) operator(:=) ident(PMemChunk)operator(()ident(FBuffers)operator([)integer(0)operator(]\);) + ident(ChunkPos) operator(:=) ident(Chunk)operator(.)ident(data)operator(;) + ident(Inc)operator(()ident(LongWord)operator(()ident(ChunkPos)operator(\),) ident(Chunk)operator(.)ident(Read)operator(\);) + comment(// does the remaining part of the chunk fit into the buffer?) + reserved(if) ident(PrivSize) operator(+) operator(()ident(Chunk)operator(.)ident(Filled) operator(-) ident(Chunk)operator(.)directive(read)operator(\)) operator(<) ident(ReqSize) reserved(then) + reserved(begin) comment(// yep, it fits) + ident(Move)operator(()ident(ChunkPos)operator(^,) ident(Privpos)operator(^,) ident(Chunk)operator(.)ident(Filled) operator(-) ident(Chunk)operator(.)directive(read)operator(\);) + ident(Inc)operator(()ident(PrivSize)operator(,) ident(Chunk)operator(.)ident(Filled) operator(-) ident(Chunk)operator(.)directive(read)operator(\);) + ident(FreeMem)operator(()ident(Chunk)operator(.)ident(Data)operator(\);) + ident(Dispose)operator(()ident(Chunk)operator(\);) + ident(FBuffers)operator(.)ident(Delete)operator(()integer(0)operator(\);) + reserved(end) + reserved(else) comment(// remaining part didn't fit, get as much as we can and increment the) + comment(// read attribute.) + reserved(begin) + ident(Move)operator(()ident(ChunkPos)operator(^,) ident(Privpos)operator(^,) ident(ReqSize) operator(-) ident(PrivSize)operator(\);) + ident(Inc)operator(()ident(Chunk)operator(.)directive(read)operator(,) ident(ReqSize) operator(-) ident(PrivSize)operator(\);) + ident(Inc)operator(()ident(PrivSize)operator(,) ident(ReqSize) operator(-) ident(PrivSize)operator(\);) + comment(// as we filled the buffer, we'll have to break here.) + ident(break)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + ident(FBytesInFifo) operator(:=) ident(GetBytesInFifo)operator(;) + ident(LeaveCriticalSection)operator(()ident(FCritSect)operator(\);) + ident(ReqSize) operator(:=) ident(PrivSize)operator(;) +reserved(end)operator(;) + +comment(// read Data from Stream without removing it from the Stream...) + +reserved(procedure) ident(TFifo)operator(.)ident(PeekData)operator(()ident(Buff)operator(:) ident(pointer)operator(;) reserved(var) ident(ReqSize)operator(:) ident(LongWord)operator(\);) +reserved(var) + ident(PrivSize)operator(:) ident(Integer)operator(;) + ident(Privpos)operator(:) ident(pointer)operator(;) + ident(Chunk)operator(:) ident(PMemChunk)operator(;) + ident(ChunkPos)operator(:) ident(pointer)operator(;) + ident(ChunkNr)operator(:) ident(Integer)operator(;) +reserved(begin) + reserved(if) ident(LongWord)operator(()ident(Buff)operator(\)) operator(=) integer(0) reserved(then) + reserved(begin) + comment(// null pointer? somebody is trying to fool us, get out...) + ident(Exit)operator(;) + reserved(end)operator(;) + ident(EnterCriticalSection)operator(()ident(FCritSect)operator(\);) + ident(PrivSize) operator(:=) integer(0)operator(;) + ident(Privpos) operator(:=) ident(Buff)operator(;) + ident(ChunkNr) operator(:=) integer(0)operator(;) + reserved(while) ident(FBuffers)operator(.)ident(Count) operator(>) ident(ChunkNr) reserved(do) + reserved(begin) + ident(Chunk) operator(:=) ident(PMemChunk)operator(()ident(FBuffers)operator([)ident(ChunkNr)operator(]\);) + ident(ChunkPos) operator(:=) ident(Chunk)operator(.)ident(data)operator(;) + ident(Inc)operator(()ident(LongWord)operator(()ident(ChunkPos)operator(\),) ident(Chunk)operator(.)ident(Read)operator(\);) + comment(// does the remaining part of the chunk fit into the buffer?) + reserved(if) ident(PrivSize) operator(+) operator(()ident(Chunk)operator(.)ident(Filled) operator(-) ident(Chunk)operator(.)directive(read)operator(\)) operator(<) ident(ReqSize) reserved(then) + reserved(begin) comment(// yep, it fits) + ident(Move)operator(()ident(ChunkPos)operator(^,) ident(Privpos)operator(^,) ident(Chunk)operator(.)ident(Filled) operator(-) ident(Chunk)operator(.)directive(read)operator(\);) + ident(Inc)operator(()ident(PrivSize)operator(,) ident(Chunk)operator(.)ident(Filled) operator(-) ident(Chunk)operator(.)directive(read)operator(\);) + ident(Inc)operator(()ident(ChunkNr)operator(\);) + reserved(end) + reserved(else) comment(// remaining part didn't fit, get as much as we can and increment the) + comment(// read attribute.) + reserved(begin) + ident(Move)operator(()ident(ChunkPos)operator(^,) ident(Privpos)operator(^,) ident(ReqSize) operator(-) ident(PrivSize)operator(\);) + ident(Inc)operator(()ident(PrivSize)operator(,) ident(ReqSize) operator(-) ident(PrivSize)operator(\);) + comment(// as we filled the buffer, we'll have to break here.) + ident(break)operator(;) + reserved(end)operator(;) + reserved(end)operator(;) + ident(LeaveCriticalSection)operator(()ident(FCritSect)operator(\);) + ident(ReqSize) operator(:=) ident(PrivSize)operator(;) +reserved(end)operator(;) + +reserved(end)operator(.) diff --git a/test/scanners/html/ampersand.in.html b/test/scanners/html/ampersand.in.html new file mode 100644 index 0000000..4bd7e7a --- /dev/null +++ b/test/scanners/html/ampersand.in.html @@ -0,0 +1 @@ +& diff --git a/test/scanners/html/ampersand.out.raydebug b/test/scanners/html/ampersand.out.raydebug new file mode 100644 index 0000000..0e0b464 --- /dev/null +++ b/test/scanners/html/ampersand.out.raydebug @@ -0,0 +1 @@ +error(&) diff --git a/test/scanners/html/suite.rb b/test/scanners/html/suite.rb new file mode 100644 index 0000000..29c45f8 --- /dev/null +++ b/test/scanners/html/suite.rb @@ -0,0 +1,2 @@ +class HTML < CodeRay::TestCase +end diff --git a/test/scanners/html/tolkien.in.html b/test/scanners/html/tolkien.in.html new file mode 100644 index 0000000..cef55da --- /dev/null +++ b/test/scanners/html/tolkien.in.html @@ -0,0 +1,169 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de"> +<head><title>Faszination Tolkien - Herr der Ringe & Co.</title> +<meta name="description" content="J.R.R. Tolkien und seine Werke (Schwerpunkt: Der Herr der Ringe). Anfängerfreundlich gestaltet. Große kommentierte Galerie, Downloads, Forum, Postkarten, etc." /> +<meta name="Author" content="Vladimir Simovic aka Perun" /> +<meta name="Keywords" content="J.R.R. Tolkien, Tolkien, Herr der Ringe, Der Herr der Ringe, HdR, hdr, herr ringe, Perun, Vladimir Simovic, Herr der Ringe Motive, Herr der Ringe Postkarten, kleiner hobbit, ringcon, ring*con" /> +<meta name="page-topic" content="J.R.R. Tolkien und seine Werke. Speziell Der Herr der Ringe" /> +<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" /> +<meta name="language" content="de" /> +<meta name="robots" content="index,follow" /> +<meta name="revisit-after" content="7 days" /> +<meta http-equiv="imagetoolbar" content="no" /> +<style type="text/css"> +<!-- +@import url("/css/perun.css"); +--> +</style> +<link rel="shortcut icon" href="http://www.faszination-tolkien.de/favicon.ico" /> +<link rel="home" href="/" title="Startseite" /> +<link rel="author" href="mailto:perun@faszination-tolkien.de,faszination-tolkien@web.de" title="Mail" /> +<link rel="copyright" href="/kontakte/impressum" title="Impressum" /> +<link rel="index" href="/hilfe/sitemap" title="Inhaltsverzeichnis" /> +<link rel="help" href="/hilfe/faq" title="FAQ" /> +<link rel="search" href="/hilfe/suchen" /> +<link rel="download" href="/goodies/downloads" /> +<link rel="bookmark" href="http://www.faszination-tolkien.de" title="Faszination Tolkien" /> +<script type="text/javascript"> +<!-- +if(top.frames.length > 0) +top.location.href=self.location; +//--> +</script> +</head> +<body> +<div id="kopf" title="Anmerkungen zu den Bildern und © in dem Styleswitch-Bereich"> +</div> +<div id="inhalt"> +<div style="font:11px verdana, sans-serif; margin:3px 0 0 0;"> +<script type="text/javascript"> +<!-- start js_paths.js??? +var path = ""; +var href = document.location.href; +var s = href.split("/"); +for (var i=2;i<(s.length-1);i++) { +path+="<a href=\""+href.substring(0,href.indexOf(s[i])+s[i].length)+"/\">"+s[i]+"</a> / "; +} +i=s.length-1; +path+="<a href=\""+href.substring(0,href.indexOf(s[i])+s[i].length)+"\">"+s[i]+"</a>"; +var url = /* window.location.protocol + "//" + */ path; +document.writeln(url); +// ende --> +</script> + +</div> +<h1>Faszination Tolkien - Herr der Ringe & Co.</h1> + +<p>Diese Seite beschäftigt sich mit den "Hauptwerken" von J. R. R. Tolkien. Im Mittelpunkt steht <strong>Der Herr der Ringe</strong>, aber nach und nach werden immer mehr Details aus <strong>Der kleine Hobbit</strong> bzw. <strong>Der Hobbit</strong> und <strong>Silmarillion</strong> einfließen.</p> +<p>Auf der Seite gibt es, neben vielen selbstverfassten Infos, eine große <a href="/galerie">Galerie</a> mit 'Herr der Ringe' Bildern (273 Bilder), eine <a href="goodies/downloads">Download</a> Sektion mit 13 <a href="goodies/downloads/winamp-skins">Winampskins</a> und einen <a href="http://www.guweb.com/cgi-bin/postcard?id=PERUN">eCard Versand</a> (digitale Postkarten) mit 'Herr der Ringe' Motiven.</p> +<p><b>Anmerkung:</b> die Unterpunkte in der Navigation, einige Links im Text und viele Bilder haben Informationen (Titel), daher lohnt es sich den Cursor, über den Link ruhen zu lassen. Einige häufige Fragen wurden schon in dem Bereich <a href="/hilfe/faq">FAQ</a> beantwortet.</p> + +<p>Immer auf dem laufenden bleiben? Mit <a href="goodies/newsletter">Newsletter</a>, <a href="javascript:sidebar.addPanel('Faszination-Tolkien','http://www.faszination-tolkien.de/goodies/sidebar/index.php','')">Sidebar</a> (Mozilla und Netscape ab 6.x) oder mit <a href="goodies/rss/index.xml">RSS</a>.</p> + +<p><strong><a href="goodies/styleswitcher">Styleswitcher</a></strong> - ändere das Aussehen dieser Seite.</p> + +<p><strong>Diese Website wird aus Zeitgründen nicht mehr aktualisiert.</strong></p> + + +<div style="text-align:center; padding:5px;"> +<!-- Anfang Banner --> + +<img src="http://www.die-gefaehrten.net/banner.php?banner=minitolkien&id=68" width="100" height="50" alt="Webring Banner (minitolkien)" border="0" usemap="#gef_banner_minitolkien" /> +<map name="gef_banner_minitolkien" id="gef_banner_minitolkien" style="display:inline;"> + <area shape="rect" href="http://www.die-gefaehrten.net/jump.php?action=next&id=68" alt="Nächste Seite" title="Nächste Seite" coords="70,30,100,50" /> + <area shape="rect" href="http://www.die-gefaehrten.net/jump.php?action=prev&id=68" alt="Vorherige Seite" title="Vorherige Seite" coords="0,30,30,50" /> + <area shape="rect" href="http://www.die-gefaehrten.net/jump.php?action=home&id=68" alt="Die Gefährten Homepage" title="Die Gefährten Homepage" coords="0,0,100,25" /> +</map> + +<!--<img src="links/fremde-banner/minitolkien.jpg" width="100" height="50" alt="Webring "Die Gefährten"" ismap="ismap" usemap="#minitolkien" /> +<map name="minitolkien" id="minitolkien" style="display:inline;"><area shape="rect" alt="Nächste Seite" href="http://www.die-gefaehrten.net/jump.php?action=next&id=Vladimir" coords="73,29,96,46" /><area shape="rect" alt="Vorherige Seite" href="http://www.die-gefaehrten.net/jump.php?action=prev&id=Vladimir" coords="4,30,26,46" /><area shape="rect" alt="Die Gefährten" href="http://www.die-gefaehrten.net/jump.php?action=home&id=Vladimir" coords="5,5,95,23" /></map>--> +<!-- Ende Banner --> + +<a href="http://pl15994.macbay.de/mozilla/bestviewedwithmozilla.htm" title="Best viewed with Mozilla or any other Browser"><img src="links/fremde-banner/bestviewedwithmozill.gif" width="169" height="29" alt="Best viewed with Mozilla or any other Browser" /></a> + +<!-- Anfang des Topsites Codes der Listinus-Toppages --> +<a href="http://click.listinus.de/topsite.php?id=34908" title="Top 50 Herr der Ringe - stimme für diese Seite ab."><img src="http://icon.listinus.de/topicon.php?id=34908" alt="Top 50 Herr der Ringe - stimme für diese Seite ab." /></a> +<!-- Ende des Topsites Codes der Listinus-Toppages --> +</div> + +<div style="text-align:center; padding:5px;"> +<form method="post" action="http://www.drachenritter.de/webring.php3" style="display:inline;"> +<input type="hidden" name="id" value="585" /> +<input type="hidden" name="mini" value="on" /> +<input type="image" src="/links/fremde-banner/minidrachenritter.jpg" name="click" title="Webring der Drachenritter" /> +</form> + +<a href="http://www.schatzwaechter.de"><img src="links/fremde-banner/faszinationtolkien.gif" width="128" height="56" alt="Schatzwächter" /></a> +</div> + +<p> +Faszination Tolkien ist zudem noch bei folgenden großen <a href="/die-seite/awards#wichtige-linklisten">Linklisten</a> aufgenommen. +</p> + +<p class="fussanker"><a href="#">nach oben</a></p> +</div> + +<div id="linkenavi"><!--linke seite--> +<a href="/kurzfassungen/" class="navilinks">Kurzfassungen <span class="hide">» <b>Tolkiens Welt:</b> Die Zusammenfassung von Herr der Ringe und Der Hobbit. «</span><br /></a> + +<a href="/ringe/" class="navilinks">Die Ringe <span class="hide">» <b>Tolkiens Welt:</b> Die Ringe der Macht. «</span><br /></a> + +<a href="/geschichte/" class="navilinks">Die Geschichte <span class="hide">» <b>Tolkiens Welt:</b> Die Geschichte von Arda bzw. Mittelerde. «</span><br /></a> + +<a href="/landeskunde/" class="navilinks">Landeskunde <span class="hide">» <b>Tolkiens Welt:</b> Geopolitische Informationen über Mittelerde. «</span><br /></a> + +<a href="/personen/" class="navilinks">Personen <span class="hide">» <b>Tolkiens Welt:</b> Wichtige Personen. «</span><br /></a> + +<a href="/volk/" class="navilinks" style="margin-bottom:10px;">Völker/Wesen <span class="hide">» <b>Tolkiens Welt:</b> Verschiedene Völker und Wesen von Arda bzw. Mittelerde. «</span><br /></a> +<!----> +<a href="/jrr-tolkien/" class="navilinks">J. R. R. Tolkien <span class="hide">» <b>Person Tolkien:</b> Eine kurze Biographie über Tolkien; Bücherliste mit Werken von Tolkien und Sekundärliteratur. «</span><br /></a> + +<a href="/galerie/" class="navilinks">Galerie <span class="hide">» <b>Bilder</b> von Künstlern, die von Tolkiens Werken Inspiriert wurden. «</span><br /></a> +<!----> +<a href="/ueberlegungen/" class="navilinks" style="margin-bottom:10px;">Überlegungen <span class="hide">» <b>Spekulation</b>, Gedanken zu diversen Ereignissen in Mittelerde. «</span><br /></a> +<a href="/filme/" class="navilinks"> Film/e <span class="hide">» <b>Tolkien und Medien:</b> Infos zu den beiden Verfilmungen von Herr der Ringe. «</span> +<br /></a> +<a href="/spiele/" class="navilinks">Spiele <span class="hide">» <b>Tolkien und Medien:</b> Versch. Spiele rund um Tolkiens Werke: Brett- und Kartenspiele, PC Spiele, Online Spiele etc. «</span><br /></a> +<a href="/fans/" class="navilinks">Fans <span class="hide">» <b>Fans und Ihre Aktivitäten:</b> Interviews, "Dein erstes Mal" etc. «</span><br /></a> +</div><!--ende linker seite--> + +<div id="rechtenavi"><!--rechte seite--> +<a href="/news/" class="navilinks">News <span class="hide2">» <b>Neuigkeiten:</b> über Tolkiens Werke, den Film, über die Seite etc. «</span><br /></a> + +<a href="/termine/" class="navilinks" style="margin-bottom:10px;">Termine <span class="hide2">» <b>Anstehende Veranstaltungen</b> zum Thema J. R. R. Tolkien und seine Werke. «</span><br /></a> +<!----> +<a href="/kontakte" class="navilinks">Kontakte <span class="hide2">» Impressum, Kontaktformular, Presseinfos «</span><br /></a> +<a href="/interaktiv" class="navilinks">Interaktiv <span class="hide2">» <b>Forum, Gästebuch,</b> Umfragen, Chat. «</span><br /></a> +<a href="/hilfe" class="navilinks">Hilfe <span class="hide2">» Suche, FAQ, Sitemap. «</span><br /></a> +<a href="/goodies" class="navilinks">Goodies <span class="hide2">» Newsletter, Sidebar, Styleswitcher, eCards, Winampskins, Downloads, Weiterempfehlen. «</span><br /></a> +<a href="/die-seite" class="navilinks" style="margin-bottom:10px;">Die Seite <span class="hide2">» Ruhmeshalle bzw. Awards, Warum? etc. «</span><br /></a> + +<!----> +<a href="/links/" class="navilinks">Links <span class="hide2">» Links zu anderen Tolkien Seiten und zu Webringen. Banner zum Bannertausch. «</span><br /></a> + +<a href="/empfehlungen/" class="navilinks">Empfehlungen <span class="hide2">» <b>Meine Empfehlungen:</b> Bücher, Spiele etc. «</span><br /></a> + +<a href="/wettbewerbe" class="navilinks">Wettbewerbe <span class="hide2">» Wettbewerbe und Gewinnspiele. «</span><br /></a> +</div><!--ende rechter seite--> + +<div id="fuss"> +<div class="center"> +Gültiges <a href="http://validator.w3.org/check/referer" + + title="Diese Seite hält sich an die Webstandards">XHTML 1.0</a> und gültiges <a href="http://jigsaw.w3.org/css-validator/validator?uri=http://www.faszination-tolkien.de/css/perun.css" + + title="Diese Seite hält sich an die Webstandards">CSS</a> +<br /> +2002-2006 by <a href="/kontakte/impressum/" title="Kontakt mit dem Webmaster">Perun</a> - Letzte Änderung: 04.03.2006 01:56:23<br /> +<a href="http://www.faszination-tolkien.de">www.faszination-tolkien.de</a> || <a href="http://www.herr-der-ringe.ws">www.herr-der-ringe.ws</a> || <a href="http://www.perun.net">www.perun.net</a> +<br /> +<span class="sehrklein">Webdesign by: <a href="http://www.vlad-design.de" title="Vlad-Design: Webdesign von Vladimir Simovic">Vlad-Design</a> || hosted by: <a href="http://www.all-inkl.com/index.php?partner=14435" title="Sehr gute und günstige Webhosting-Angebote">www.all-inkl.com</a></span> +</div> +<p class="unsichtbar">→Hinweis: Schon mal darüber nachgedacht deinen Browser upzudaten?<br />Auf z. B. Mozilla, oder Netscape 7.x, oder Opera 7.x oder zumindest auf Internet Explorer 6.</p> +</div> +<!-- PowerPhlogger Code START --> +<script language="JavaScript" type="text/javascript" src="/pphlogger.js"></script> +<noscript><img alt="" src="http://www.faszination-tolkien.de/statistik/pphlogger.php?id=Perun&st=img" /></noscript> +<!-- PowerPhlogger Code END --> +</body> +</html> diff --git a/test/scanners/html/tolkien.out.raydebug b/test/scanners/html/tolkien.out.raydebug new file mode 100644 index 0000000..653ddd0 --- /dev/null +++ b/test/scanners/html/tolkien.out.raydebug @@ -0,0 +1,169 @@ +preprocessor(<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">) +tag(<html) attribute_name(xmlns)operator(=)string<delimiter(")content(http://www.w3.org/1999/xhtml)delimiter(")> attribute_name(xml:lang)operator(=)string<delimiter(")content(de)delimiter(")> attribute_name(lang)operator(=)string<delimiter(")content(de)delimiter(")>tag(>) +tag(<head>)tag(<title>)plain(Faszination Tolkien - Herr der Ringe )entity(&) plain(Co.)tag(</title>) +tag(<meta) attribute_name(name)operator(=)string<delimiter(")content(description)delimiter(")> attribute_name(content)operator(=)string<delimiter(")content(J.R.R. Tolkien und seine Werke (Schwerpunkt: Der Herr der Ringe\). Anf)entity(ä)content(ngerfreundlich gestaltet. Gro)entity(ß)content(e kommentierte Galerie, Downloads, Forum, Postkarten, etc.)delimiter(")> tag(/>) +tag(<meta) attribute_name(name)operator(=)string<delimiter(")content(Author)delimiter(")> attribute_name(content)operator(=)string<delimiter(")content(Vladimir Simovic aka Perun)delimiter(")> tag(/>) +tag(<meta) attribute_name(name)operator(=)string<delimiter(")content(Keywords)delimiter(")> attribute_name(content)operator(=)string<delimiter(")content(J.R.R. Tolkien, Tolkien, Herr der Ringe, Der Herr der Ringe, HdR, hdr, herr ringe, Perun, Vladimir Simovic, Herr der Ringe Motive, Herr der Ringe Postkarten, kleiner hobbit, ringcon, ring*con)delimiter(")> tag(/>) +tag(<meta) attribute_name(name)operator(=)string<delimiter(")content(page-topic)delimiter(")> attribute_name(content)operator(=)string<delimiter(")content(J.R.R. Tolkien und seine Werke. Speziell Der Herr der Ringe)delimiter(")> tag(/>) +tag(<meta) attribute_name(http-equiv)operator(=)string<delimiter(")content(content-type)delimiter(")> attribute_name(content)operator(=)string<delimiter(")content(text/html; charset=iso-8859-1)delimiter(")> tag(/>) +tag(<meta) attribute_name(name)operator(=)string<delimiter(")content(language)delimiter(")> attribute_name(content)operator(=)string<delimiter(")content(de)delimiter(")> tag(/>) +tag(<meta) attribute_name(name)operator(=)string<delimiter(")content(robots)delimiter(")> attribute_name(content)operator(=)string<delimiter(")content(index,follow)delimiter(")> tag(/>) +tag(<meta) attribute_name(name)operator(=)string<delimiter(")content(revisit-after)delimiter(")> attribute_name(content)operator(=)string<delimiter(")content(7 days)delimiter(")> tag(/>) +tag(<meta) attribute_name(http-equiv)operator(=)string<delimiter(")content(imagetoolbar)delimiter(")> attribute_name(content)operator(=)string<delimiter(")content(no)delimiter(")> tag(/>) +tag(<style) attribute_name(type)operator(=)string<delimiter(")content(text/css)delimiter(")>tag(>) +comment(<!-- +@import url("/css/perun.css"\); +-->) +tag(</style>) +tag(<link) attribute_name(rel)operator(=)string<delimiter(")content(shortcut icon)delimiter(")> attribute_name(href)operator(=)string<delimiter(")content(http://www.faszination-tolkien.de/favicon.ico)delimiter(")> tag(/>) +tag(<link) attribute_name(rel)operator(=)string<delimiter(")content(home)delimiter(")> attribute_name(href)operator(=)string<delimiter(")content(/)delimiter(")> attribute_name(title)operator(=)string<delimiter(")content(Startseite)delimiter(")> tag(/>) +tag(<link) attribute_name(rel)operator(=)string<delimiter(")content(author)delimiter(")> attribute_name(href)operator(=)string<delimiter(")content(mailto:perun@faszination-tolkien.de,faszination-tolkien@web.de)delimiter(")> attribute_name(title)operator(=)string<delimiter(")content(Mail)delimiter(")> tag(/>) +tag(<link) attribute_name(rel)operator(=)string<delimiter(")content(copyright)delimiter(")> attribute_name(href)operator(=)string<delimiter(")content(/kontakte/impressum)delimiter(")> attribute_name(title)operator(=)string<delimiter(")content(Impressum)delimiter(")> tag(/>) +tag(<link) attribute_name(rel)operator(=)string<delimiter(")content(index)delimiter(")> attribute_name(href)operator(=)string<delimiter(")content(/hilfe/sitemap)delimiter(")> attribute_name(title)operator(=)string<delimiter(")content(Inhaltsverzeichnis)delimiter(")> tag(/>) +tag(<link) attribute_name(rel)operator(=)string<delimiter(")content(help)delimiter(")> attribute_name(href)operator(=)string<delimiter(")content(/hilfe/faq)delimiter(")> attribute_name(title)operator(=)string<delimiter(")content(FAQ)delimiter(")> tag(/>) +tag(<link) attribute_name(rel)operator(=)string<delimiter(")content(search)delimiter(")> attribute_name(href)operator(=)string<delimiter(")content(/hilfe/suchen)delimiter(")> tag(/>) +tag(<link) attribute_name(rel)operator(=)string<delimiter(")content(download)delimiter(")> attribute_name(href)operator(=)string<delimiter(")content(/goodies/downloads)delimiter(")> tag(/>) +tag(<link) attribute_name(rel)operator(=)string<delimiter(")content(bookmark)delimiter(")> attribute_name(href)operator(=)string<delimiter(")content(http://www.faszination-tolkien.de)delimiter(")> attribute_name(title)operator(=)string<delimiter(")content(Faszination Tolkien)delimiter(")> tag(/>) +tag(<script) attribute_name(type)operator(=)string<delimiter(")content(text/javascript)delimiter(")>tag(>) +comment(<!-- +if(top.frames.length > 0\) +top.location.href=self.location; +//-->) +tag(</script>) +tag(</head>) +tag(<body>) +tag(<div) attribute_name(id)operator(=)string<delimiter(")content(kopf)delimiter(")> attribute_name(title)operator(=)string<delimiter(")content(Anmerkungen zu den Bildern und )entity(©) content(in dem Styleswitch-Bereich)delimiter(")>tag(>) +tag(</div>) +tag(<div) attribute_name(id)operator(=)string<delimiter(")content(inhalt)delimiter(")>tag(>) +tag(<div) attribute_name(style)operator(=)string<delimiter(")content(font:11px verdana, sans-serif; margin:3px 0 0 0;)delimiter(")>tag(>) +tag(<script) attribute_name(type)operator(=)string<delimiter(")content(text/javascript)delimiter(")>tag(>) +comment(<!-- start js_paths.js??? +var path = ""; +var href = document.location.href; +var s = href.split("/"\); +for (var i=2;i<(s.length-1\);i++\) { +path+="<a href=\\""+href.substring(0,href.indexOf(s[i]\)+s[i].length\)+"/\\">"+s[i]+"</a> / "; +} +i=s.length-1; +path+="<a href=\\""+href.substring(0,href.indexOf(s[i]\)+s[i].length\)+"\\">"+s[i]+"</a>"; +var url = /* window.location.protocol + "//" + */ path; +document.writeln(url\); +// ende -->) +tag(</script>) + +tag(</div>) +tag(<h1>)plain(Faszination Tolkien - Herr der Ringe )entity(&) plain(Co.)tag(</h1>) + +tag(<p>)plain(Diese Seite besch)entity(ä)plain(ftigt sich mit den )entity(")plain(Hauptwerken)entity(") plain(von J. R. R. Tolkien. Im Mittelpunkt steht )tag(<strong>)plain(Der Herr der Ringe)tag(</strong>)plain(, aber nach und nach werden immer mehr Details aus )tag(<strong>)plain(Der kleine Hobbit)tag(</strong>) plain(bzw. )tag(<strong>)plain(Der Hobbit)tag(</strong>) plain(und )tag(<strong>)plain(Silmarillion)tag(</strong>) plain(einflie)entity(ß)plain(en.)tag(</p>) +tag(<p>)plain(Auf der Seite gibt es, neben vielen selbstverfassten Infos, eine gro)entity(ß)plain(e )tag(<a) attribute_name(href)operator(=)string<delimiter(")content(/galerie)delimiter(")>tag(>)plain(Galerie)tag(</a>) plain(mit 'Herr der Ringe' Bildern (273 Bilder\), eine )tag(<a) attribute_name(href)operator(=)string<delimiter(")content(goodies/downloads)delimiter(")>tag(>)plain(Download)tag(</a>) plain(Sektion mit 13 )tag(<a) attribute_name(href)operator(=)string<delimiter(")content(goodies/downloads/winamp-skins)delimiter(")>tag(>)plain(Winampskins)tag(</a>) plain(und einen )tag(<a) attribute_name(href)operator(=)string<delimiter(")content(http://www.guweb.com/cgi-bin/postcard?id=PERUN)delimiter(")>tag(>)plain(eCard Versand)tag(</a>) plain((digitale Postkarten\) mit 'Herr der Ringe' Motiven.)tag(</p>) +tag(<p>)tag(<b>)plain(Anmerkung:)tag(</b>) plain(die Unterpunkte in der Navigation, einige Links im Text und viele Bilder haben Informationen (Titel\), daher lohnt es sich den Cursor, )entity(ü)plain(ber den Link ruhen zu lassen. Einige h)entity(ä)plain(ufige Fragen wurden schon in dem Bereich )tag(<a) attribute_name(href)operator(=)string<delimiter(")content(/hilfe/faq)delimiter(")>tag(>)plain(FAQ)tag(</a>) plain(beantwortet.)tag(</p>) + +tag(<p>)plain(Immer auf dem laufenden bleiben? Mit )tag(<a) attribute_name(href)operator(=)string<delimiter(")content(goodies/newsletter)delimiter(")>tag(>)plain(Newsletter)tag(</a>)plain(, )tag(<a) attribute_name(href)operator(=)string<delimiter(")content(javascript:sidebar.addPanel('Faszination-Tolkien','http://www.faszination-tolkien.de/goodies/sidebar/index.php',''\))delimiter(")>tag(>)plain(Sidebar)tag(</a>) plain((Mozilla und Netscape ab 6.x\) oder mit )tag(<a) attribute_name(href)operator(=)string<delimiter(")content(goodies/rss/index.xml)delimiter(")>tag(>)plain(RSS)tag(</a>)plain(.)tag(</p>) + +tag(<p>)tag(<strong>)tag(<a) attribute_name(href)operator(=)string<delimiter(")content(goodies/styleswitcher)delimiter(")>tag(>)plain(Styleswitcher)tag(</a>)tag(</strong>) plain(- )entity(ä)plain(ndere das Aussehen dieser Seite.)tag(</p>) + +tag(<p>)tag(<strong>)plain(Diese Website wird aus Zeitgründen nicht mehr aktualisiert.)tag(</strong>)tag(</p>) + + +tag(<div) attribute_name(style)operator(=)string<delimiter(")content(text-align:center; padding:5px;)delimiter(")>tag(>) +comment(<!-- Anfang Banner -->) + +tag(<img) attribute_name(src)operator(=)string<delimiter(")content(http://www.die-gefaehrten.net/banner.php?banner=minitolkien)entity(&)content(id=68)delimiter(")> attribute_name(width)operator(=)string<delimiter(")content(100)delimiter(")> attribute_name(height)operator(=)string<delimiter(")content(50)delimiter(")> attribute_name(alt)operator(=)string<delimiter(")content(Webring Banner (minitolkien\))delimiter(")> attribute_name(border)operator(=)string<delimiter(")content(0)delimiter(")> attribute_name(usemap)operator(=)string<delimiter(")content(#gef_banner_minitolkien)delimiter(")> tag(/>) +tag(<map) attribute_name(name)operator(=)string<delimiter(")content(gef_banner_minitolkien)delimiter(")> attribute_name(id)operator(=)string<delimiter(")content(gef_banner_minitolkien)delimiter(")> attribute_name(style)operator(=)string<delimiter(")content(display:inline;)delimiter(")>tag(>) + tag(<area) attribute_name(shape)operator(=)string<delimiter(")content(rect)delimiter(")> attribute_name(href)operator(=)string<delimiter(")content(http://www.die-gefaehrten.net/jump.php?action=next)entity(&)content(id=68)delimiter(")> attribute_name(alt)operator(=)string<delimiter(")content(N)entity(ä)content(chste Seite)delimiter(")> attribute_name(title)operator(=)string<delimiter(")content(N)entity(ä)content(chste Seite)delimiter(")> attribute_name(coords)operator(=)string<delimiter(")content(70,30,100,50)delimiter(")> tag(/>) + tag(<area) attribute_name(shape)operator(=)string<delimiter(")content(rect)delimiter(")> attribute_name(href)operator(=)string<delimiter(")content(http://www.die-gefaehrten.net/jump.php?action=prev)entity(&)content(id=68)delimiter(")> attribute_name(alt)operator(=)string<delimiter(")content(Vorherige Seite)delimiter(")> attribute_name(title)operator(=)string<delimiter(")content(Vorherige Seite)delimiter(")> attribute_name(coords)operator(=)string<delimiter(")content(0,30,30,50)delimiter(")> tag(/>) + tag(<area) attribute_name(shape)operator(=)string<delimiter(")content(rect)delimiter(")> attribute_name(href)operator(=)string<delimiter(")content(http://www.die-gefaehrten.net/jump.php?action=home)entity(&)content(id=68)delimiter(")> attribute_name(alt)operator(=)string<delimiter(")content(Die Gef)entity(ä)content(hrten Homepage)delimiter(")> attribute_name(title)operator(=)string<delimiter(")content(Die Gef)entity(ä)content(hrten Homepage)delimiter(")> attribute_name(coords)operator(=)string<delimiter(")content(0,0,100,25)delimiter(")> tag(/>) +tag(</map>) + +comment(<!--<img src="links/fremde-banner/minitolkien.jpg" width="100" height="50" alt="Webring "Die Gefährten"" ismap="ismap" usemap="#minitolkien" /> +<map name="minitolkien" id="minitolkien" style="display:inline;"><area shape="rect" alt="Nächste Seite" href="http://www.die-gefaehrten.net/jump.php?action=next&id=Vladimir" coords="73,29,96,46" /><area shape="rect" alt="Vorherige Seite" href="http://www.die-gefaehrten.net/jump.php?action=prev&id=Vladimir" coords="4,30,26,46" /><area shape="rect" alt="Die Gefährten" href="http://www.die-gefaehrten.net/jump.php?action=home&id=Vladimir" coords="5,5,95,23" /></map>-->) +comment(<!-- Ende Banner -->) + +tag(<a) attribute_name(href)operator(=)string<delimiter(")content(http://pl15994.macbay.de/mozilla/bestviewedwithmozilla.htm)delimiter(")> attribute_name(title)operator(=)string<delimiter(")content(Best viewed with Mozilla or any other Browser)delimiter(")>tag(>)tag(<img) attribute_name(src)operator(=)string<delimiter(")content(links/fremde-banner/bestviewedwithmozill.gif)delimiter(")> attribute_name(width)operator(=)string<delimiter(")content(169)delimiter(")> attribute_name(height)operator(=)string<delimiter(")content(29)delimiter(")> attribute_name(alt)operator(=)string<delimiter(")content(Best viewed with Mozilla or any other Browser)delimiter(")> tag(/>)tag(</a>) + +comment(<!-- Anfang des Topsites Codes der Listinus-Toppages -->) +tag(<a) attribute_name(href)operator(=)string<delimiter(")content(http://click.listinus.de/topsite.php?id=34908)delimiter(")> attribute_name(title)operator(=)string<delimiter(")content(Top 50 Herr der Ringe - stimme f)entity(ü)content(r diese Seite ab.)delimiter(")>tag(>)tag(<img) attribute_name(src)operator(=)string<delimiter(")content(http://icon.listinus.de/topicon.php?id=34908)delimiter(")> attribute_name(alt)operator(=)string<delimiter(")content(Top 50 Herr der Ringe - stimme f)entity(ü)content(r diese Seite ab.)delimiter(")> tag(/>)tag(</a>) +comment(<!-- Ende des Topsites Codes der Listinus-Toppages -->) +tag(</div>) + +tag(<div) attribute_name(style)operator(=)string<delimiter(")content(text-align:center; padding:5px;)delimiter(")>tag(>) +tag(<form) attribute_name(method)operator(=)string<delimiter(")content(post)delimiter(")> attribute_name(action)operator(=)string<delimiter(")content(http://www.drachenritter.de/webring.php3)delimiter(")> attribute_name(style)operator(=)string<delimiter(")content(display:inline;)delimiter(")>tag(>) +tag(<input) attribute_name(type)operator(=)string<delimiter(")content(hidden)delimiter(")> attribute_name(name)operator(=)string<delimiter(")content(id)delimiter(")> attribute_name(value)operator(=)string<delimiter(")content(585)delimiter(")> tag(/>) +tag(<input) attribute_name(type)operator(=)string<delimiter(")content(hidden)delimiter(")> attribute_name(name)operator(=)string<delimiter(")content(mini)delimiter(")> attribute_name(value)operator(=)string<delimiter(")content(on)delimiter(")> tag(/>) +tag(<input) attribute_name(type)operator(=)string<delimiter(")content(image)delimiter(")> attribute_name(src)operator(=)string<delimiter(")content(/links/fremde-banner/minidrachenritter.jpg)delimiter(")> attribute_name(name)operator(=)string<delimiter(")content(click)delimiter(")> attribute_name(title)operator(=)string<delimiter(")content(Webring der Drachenritter)delimiter(")> tag(/>) +tag(</form>) + +tag(<a) attribute_name(href)operator(=)string<delimiter(")content(http://www.schatzwaechter.de)delimiter(")>tag(>)tag(<img) attribute_name(src)operator(=)string<delimiter(")content(links/fremde-banner/faszinationtolkien.gif)delimiter(")> attribute_name(width)operator(=)string<delimiter(")content(128)delimiter(")> attribute_name(height)operator(=)string<delimiter(")content(56)delimiter(")> attribute_name(alt)operator(=)string<delimiter(")content(Schatzw)entity(ä)content(chter)delimiter(")> tag(/>)tag(</a>) +tag(</div>) + +tag(<p>) +plain(Faszination Tolkien ist zudem noch bei folgenden gro)entity(ß)plain(en )tag(<a) attribute_name(href)operator(=)string<delimiter(")content(/die-seite/awards#wichtige-linklisten)delimiter(")>tag(>)plain(Linklisten)tag(</a>) plain(aufgenommen. +)tag(</p>) + +tag(<p) attribute_name(class)operator(=)string<delimiter(")content(fussanker)delimiter(")>tag(>)tag(<a) attribute_name(href)operator(=)string<delimiter(")content(#)delimiter(")>tag(>)plain(nach oben)tag(</a>)tag(</p>) +tag(</div>) + +tag(<div) attribute_name(id)operator(=)string<delimiter(")content(linkenavi)delimiter(")>tag(>)comment(<!--linke seite-->) +tag(<a) attribute_name(href)operator(=)string<delimiter(")content(/kurzfassungen/)delimiter(")> attribute_name(class)operator(=)string<delimiter(")content(navilinks)delimiter(")>tag(>)plain(Kurzfassungen )tag(<span) attribute_name(class)operator(=)string<delimiter(")content(hide)delimiter(")>tag(>)entity(») tag(<b>)plain(Tolkiens Welt:)tag(</b>) plain(Die Zusammenfassung von Herr der Ringe und Der Hobbit. )entity(«)tag(</span>)tag(<br) tag(/>)tag(</a>) + +tag(<a) attribute_name(href)operator(=)string<delimiter(")content(/ringe/)delimiter(")> attribute_name(class)operator(=)string<delimiter(")content(navilinks)delimiter(")>tag(>)plain(Die Ringe )tag(<span) attribute_name(class)operator(=)string<delimiter(")content(hide)delimiter(")>tag(>)entity(») tag(<b>)plain(Tolkiens Welt:)tag(</b>) plain(Die Ringe der Macht. )entity(«)tag(</span>)tag(<br) tag(/>)tag(</a>) + +tag(<a) attribute_name(href)operator(=)string<delimiter(")content(/geschichte/)delimiter(")> attribute_name(class)operator(=)string<delimiter(")content(navilinks)delimiter(")>tag(>)plain(Die Geschichte )tag(<span) attribute_name(class)operator(=)string<delimiter(")content(hide)delimiter(")>tag(>)entity(») tag(<b>)plain(Tolkiens Welt:)tag(</b>) plain(Die Geschichte von Arda bzw. Mittelerde. )entity(«)tag(</span>)tag(<br) tag(/>)tag(</a>) + +tag(<a) attribute_name(href)operator(=)string<delimiter(")content(/landeskunde/)delimiter(")> attribute_name(class)operator(=)string<delimiter(")content(navilinks)delimiter(")>tag(>)plain(Landeskunde )tag(<span) attribute_name(class)operator(=)string<delimiter(")content(hide)delimiter(")>tag(>)entity(») tag(<b>)plain(Tolkiens Welt:)tag(</b>) plain(Geopolitische Informationen )entity(ü)plain(ber Mittelerde. )entity(«)tag(</span>)tag(<br) tag(/>)tag(</a>) + +tag(<a) attribute_name(href)operator(=)string<delimiter(")content(/personen/)delimiter(")> attribute_name(class)operator(=)string<delimiter(")content(navilinks)delimiter(")>tag(>)plain(Personen )tag(<span) attribute_name(class)operator(=)string<delimiter(")content(hide)delimiter(")>tag(>)entity(») tag(<b>)plain(Tolkiens Welt:)tag(</b>) plain(Wichtige Personen. )entity(«)tag(</span>)tag(<br) tag(/>)tag(</a>) + +tag(<a) attribute_name(href)operator(=)string<delimiter(")content(/volk/)delimiter(")> attribute_name(class)operator(=)string<delimiter(")content(navilinks)delimiter(")> attribute_name(style)operator(=)string<delimiter(")content(margin-bottom:10px;)delimiter(")>tag(>)plain(V)entity(ö)plain(lker/Wesen )tag(<span) attribute_name(class)operator(=)string<delimiter(")content(hide)delimiter(")>tag(>)entity(») tag(<b>)plain(Tolkiens Welt:)tag(</b>) plain(Verschiedene V)entity(ö)plain(lker und Wesen von Arda bzw. Mittelerde. )entity(«)tag(</span>)tag(<br) tag(/>)tag(</a>) +comment(<!---->) +tag(<a) attribute_name(href)operator(=)string<delimiter(")content(/jrr-tolkien/)delimiter(")> attribute_name(class)operator(=)string<delimiter(")content(navilinks)delimiter(")>tag(>)plain(J. R. R. Tolkien )tag(<span) attribute_name(class)operator(=)string<delimiter(")content(hide)delimiter(")>tag(>)entity(») tag(<b>)plain(Person Tolkien:)tag(</b>) plain(Eine kurze Biographie )entity(ü)plain(ber Tolkien; B)entity(ü)plain(cherliste mit Werken von Tolkien und Sekund)entity(ä)plain(rliteratur. )entity(«)tag(</span>)tag(<br) tag(/>)tag(</a>) + +tag(<a) attribute_name(href)operator(=)string<delimiter(")content(/galerie/)delimiter(")> attribute_name(class)operator(=)string<delimiter(")content(navilinks)delimiter(")>tag(>)plain(Galerie )tag(<span) attribute_name(class)operator(=)string<delimiter(")content(hide)delimiter(")>tag(>)entity(») tag(<b>)plain(Bilder)tag(</b>) plain(von K)entity(ü)plain(nstlern, die von Tolkiens Werken Inspiriert wurden. )entity(«)tag(</span>)tag(<br) tag(/>)tag(</a>) +comment(<!---->) +tag(<a) attribute_name(href)operator(=)string<delimiter(")content(/ueberlegungen/)delimiter(")> attribute_name(class)operator(=)string<delimiter(")content(navilinks)delimiter(")> attribute_name(style)operator(=)string<delimiter(")content(margin-bottom:10px;)delimiter(")>tag(>)entity(Ü)plain(berlegungen )tag(<span) attribute_name(class)operator(=)string<delimiter(")content(hide)delimiter(")>tag(>)entity(») tag(<b>)plain(Spekulation)tag(</b>)plain(, Gedanken zu diversen Ereignissen in Mittelerde. )entity(«)tag(</span>)tag(<br) tag(/>)tag(</a>) +tag(<a) attribute_name(href)operator(=)string<delimiter(")content(/filme/)delimiter(")> attribute_name(class)operator(=)string<delimiter(")content(navilinks)delimiter(")>tag(>) plain(Film/e )tag(<span) attribute_name(class)operator(=)string<delimiter(")content(hide)delimiter(")>tag(>)entity(») tag(<b>)plain(Tolkien und Medien:)tag(</b>) plain(Infos zu den beiden Verfilmungen von Herr der Ringe. )entity(«)tag(</span>) +tag(<br) tag(/>)tag(</a>) +tag(<a) attribute_name(href)operator(=)string<delimiter(")content(/spiele/)delimiter(")> attribute_name(class)operator(=)string<delimiter(")content(navilinks)delimiter(")>tag(>)plain(Spiele )tag(<span) attribute_name(class)operator(=)string<delimiter(")content(hide)delimiter(")>tag(>)entity(») tag(<b>)plain(Tolkien und Medien:)tag(</b>) plain(Versch. Spiele rund um Tolkiens Werke: Brett- und Kartenspiele, PC Spiele, Online Spiele etc. )entity(«)tag(</span>)tag(<br) tag(/>)tag(</a>) +tag(<a) attribute_name(href)operator(=)string<delimiter(")content(/fans/)delimiter(")> attribute_name(class)operator(=)string<delimiter(")content(navilinks)delimiter(")>tag(>)plain(Fans )tag(<span) attribute_name(class)operator(=)string<delimiter(")content(hide)delimiter(")>tag(>)entity(») tag(<b>)plain(Fans und Ihre Aktivit)entity(ä)plain(ten:)tag(</b>) plain(Interviews, )entity(")plain(Dein erstes Mal)entity(") plain(etc. )entity(«)tag(</span>)tag(<br) tag(/>)tag(</a>) +tag(</div>)comment(<!--ende linker seite-->) + +tag(<div) attribute_name(id)operator(=)string<delimiter(")content(rechtenavi)delimiter(")>tag(>)comment(<!--rechte seite-->) +tag(<a) attribute_name(href)operator(=)string<delimiter(")content(/news/)delimiter(")> attribute_name(class)operator(=)string<delimiter(")content(navilinks)delimiter(")>tag(>)plain(News )tag(<span) attribute_name(class)operator(=)string<delimiter(")content(hide2)delimiter(")>tag(>)entity(») tag(<b>)plain(Neuigkeiten:)tag(</b>) entity(ü)plain(ber Tolkiens Werke, den Film, )entity(ü)plain(ber die Seite etc. )entity(«)tag(</span>)tag(<br) tag(/>)tag(</a>) + +tag(<a) attribute_name(href)operator(=)string<delimiter(")content(/termine/)delimiter(")> attribute_name(class)operator(=)string<delimiter(")content(navilinks)delimiter(")> attribute_name(style)operator(=)string<delimiter(")content(margin-bottom:10px;)delimiter(")>tag(>)plain(Termine )tag(<span) attribute_name(class)operator(=)string<delimiter(")content(hide2)delimiter(")>tag(>)entity(») tag(<b>)plain(Anstehende Veranstaltungen)tag(</b>) plain(zum Thema J. R. R. Tolkien und seine Werke. )entity(«)tag(</span>)tag(<br) tag(/>)tag(</a>) +comment(<!---->) +tag(<a) attribute_name(href)operator(=)string<delimiter(")content(/kontakte)delimiter(")> attribute_name(class)operator(=)string<delimiter(")content(navilinks)delimiter(")>tag(>)plain(Kontakte )tag(<span) attribute_name(class)operator(=)string<delimiter(")content(hide2)delimiter(")>tag(>)entity(») plain(Impressum, Kontaktformular, Presseinfos )entity(«)tag(</span>)tag(<br) tag(/>)tag(</a>) +tag(<a) attribute_name(href)operator(=)string<delimiter(")content(/interaktiv)delimiter(")> attribute_name(class)operator(=)string<delimiter(")content(navilinks)delimiter(")>tag(>)plain(Interaktiv )tag(<span) attribute_name(class)operator(=)string<delimiter(")content(hide2)delimiter(")>tag(>)entity(») tag(<b>)plain(Forum, G)entity(ä)plain(stebuch,)tag(</b>) plain(Umfragen, Chat. )entity(«)tag(</span>)tag(<br) tag(/>)tag(</a>) +tag(<a) attribute_name(href)operator(=)string<delimiter(")content(/hilfe)delimiter(")> attribute_name(class)operator(=)string<delimiter(")content(navilinks)delimiter(")>tag(>)plain(Hilfe )tag(<span) attribute_name(class)operator(=)string<delimiter(")content(hide2)delimiter(")>tag(>)entity(») plain(Suche, FAQ, Sitemap. )entity(«)tag(</span>)tag(<br) tag(/>)tag(</a>) +tag(<a) attribute_name(href)operator(=)string<delimiter(")content(/goodies)delimiter(")> attribute_name(class)operator(=)string<delimiter(")content(navilinks)delimiter(")>tag(>)plain(Goodies )tag(<span) attribute_name(class)operator(=)string<delimiter(")content(hide2)delimiter(")>tag(>)entity(») plain(Newsletter, Sidebar, Styleswitcher, eCards, Winampskins, Downloads, Weiterempfehlen. )entity(«)tag(</span>)tag(<br) tag(/>)tag(</a>) +tag(<a) attribute_name(href)operator(=)string<delimiter(")content(/die-seite)delimiter(")> attribute_name(class)operator(=)string<delimiter(")content(navilinks)delimiter(")> attribute_name(style)operator(=)string<delimiter(")content(margin-bottom:10px;)delimiter(")>tag(>)plain(Die Seite )tag(<span) attribute_name(class)operator(=)string<delimiter(")content(hide2)delimiter(")>tag(>)entity(») plain(Ruhmeshalle bzw. Awards, Warum? etc. )entity(«)tag(</span>)tag(<br) tag(/>)tag(</a>) + +comment(<!---->) +tag(<a) attribute_name(href)operator(=)string<delimiter(")content(/links/)delimiter(")> attribute_name(class)operator(=)string<delimiter(")content(navilinks)delimiter(")>tag(>)plain(Links )tag(<span) attribute_name(class)operator(=)string<delimiter(")content(hide2)delimiter(")>tag(>)entity(») plain(Links zu anderen Tolkien Seiten und zu Webringen. Banner zum Bannertausch. )entity(«)tag(</span>)tag(<br) tag(/>)tag(</a>) + +tag(<a) attribute_name(href)operator(=)string<delimiter(")content(/empfehlungen/)delimiter(")> attribute_name(class)operator(=)string<delimiter(")content(navilinks)delimiter(")>tag(>)plain(Empfehlungen )tag(<span) attribute_name(class)operator(=)string<delimiter(")content(hide2)delimiter(")>tag(>)entity(») tag(<b>)plain(Meine Empfehlungen:)tag(</b>) plain(B)entity(ü)plain(cher, Spiele etc. )entity(«)tag(</span>)tag(<br) tag(/>)tag(</a>) + +tag(<a) attribute_name(href)operator(=)string<delimiter(")content(/wettbewerbe)delimiter(")> attribute_name(class)operator(=)string<delimiter(")content(navilinks)delimiter(")>tag(>)plain(Wettbewerbe )tag(<span) attribute_name(class)operator(=)string<delimiter(")content(hide2)delimiter(")>tag(>)entity(») plain(Wettbewerbe und Gewinnspiele. )entity(«)tag(</span>)tag(<br) tag(/>)tag(</a>) +tag(</div>)comment(<!--ende rechter seite-->) + +tag(<div) attribute_name(id)operator(=)string<delimiter(")content(fuss)delimiter(")>tag(>) +tag(<div) attribute_name(class)operator(=)string<delimiter(")content(center)delimiter(")>tag(>) +plain(G)entity(ü)plain(ltiges )tag(<a) attribute_name(href)operator(=)string<delimiter(")content(http://validator.w3.org/check/referer)delimiter(")> + + attribute_name(title)operator(=)string<delimiter(")content(Diese Seite h)entity(ä)content(lt sich an die Webstandards)delimiter(")>tag(>)plain(XHTML 1.0)tag(</a>) plain(und g)entity(ü)plain(ltiges )tag(<a) attribute_name(href)operator(=)string<delimiter(")content(http://jigsaw.w3.org/css-validator/validator?uri=http://www.faszination-tolkien.de/css/perun.css)delimiter(")> + + attribute_name(title)operator(=)string<delimiter(")content(Diese Seite h)entity(ä)content(lt sich an die Webstandards)delimiter(")>tag(>)plain(CSS)tag(</a>) +tag(<br) tag(/>) +plain(2002-2006 by )tag(<a) attribute_name(href)operator(=)string<delimiter(")content(/kontakte/impressum/)delimiter(")> attribute_name(title)operator(=)string<delimiter(")content(Kontakt mit dem Webmaster)delimiter(")>tag(>)plain(Perun)tag(</a>) plain(- Letzte )entity(Ä)plain(nderung: 04.03.2006 01:56:23)tag(<br) tag(/>) +tag(<a) attribute_name(href)operator(=)string<delimiter(")content(http://www.faszination-tolkien.de)delimiter(")>tag(>)plain(www.faszination-tolkien.de)tag(</a>) plain(|| )tag(<a) attribute_name(href)operator(=)string<delimiter(")content(http://www.herr-der-ringe.ws)delimiter(")>tag(>)plain(www.herr-der-ringe.ws)tag(</a>) plain(|| )tag(<a) attribute_name(href)operator(=)string<delimiter(")content(http://www.perun.net)delimiter(")>tag(>)plain(www.perun.net)tag(</a>) +tag(<br) tag(/>) +tag(<span) attribute_name(class)operator(=)string<delimiter(")content(sehrklein)delimiter(")>tag(>)plain(Webdesign by: )tag(<a) attribute_name(href)operator(=)string<delimiter(")content(http://www.vlad-design.de)delimiter(")> attribute_name(title)operator(=)string<delimiter(")content(Vlad-Design: Webdesign von Vladimir Simovic)delimiter(")>tag(>)plain(Vlad-Design)tag(</a>) plain(|| hosted by: )tag(<a) attribute_name(href)operator(=)string<delimiter(")content(http://www.all-inkl.com/index.php?partner=14435)delimiter(")> attribute_name(title)operator(=)string<delimiter(")content(Sehr gute und g)entity(ü)content(nstige Webhosting-Angebote)delimiter(")>tag(>)plain(www.all-inkl.com)tag(</a>)tag(</span>) +tag(</div>) +tag(<p) attribute_name(class)operator(=)string<delimiter(")content(unsichtbar)delimiter(")>tag(>)entity(→)plain(Hinweis: Schon mal dar)entity(ü)plain(ber nachgedacht deinen Browser upzudaten?)tag(<br) tag(/>)plain(Auf z. B. Mozilla, oder Netscape 7.x, oder Opera 7.x oder zumindest auf Internet Explorer 6.)tag(</p>) +tag(</div>) +comment(<!-- PowerPhlogger Code START -->) +tag(<script) attribute_name(language)operator(=)string<delimiter(")content(JavaScript)delimiter(")> attribute_name(type)operator(=)string<delimiter(")content(text/javascript)delimiter(")> attribute_name(src)operator(=)string<delimiter(")content(/pphlogger.js)delimiter(")>tag(>)tag(</script>) +tag(<noscript>)tag(<img) attribute_name(alt)operator(=)string<delimiter(")delimiter(")> attribute_name(src)operator(=)string<delimiter(")content(http://www.faszination-tolkien.de/statistik/pphlogger.php?id=Perun)entity(&)content(st=img)delimiter(")> tag(/>)tag(</noscript>) +comment(<!-- PowerPhlogger Code END -->) +tag(</body>) +tag(</html>) diff --git a/test/scanners/nitro/suite.rb b/test/scanners/nitro/suite.rb new file mode 100644 index 0000000..c2f0e33 --- /dev/null +++ b/test/scanners/nitro/suite.rb @@ -0,0 +1,3 @@ +class Nitro < CodeRay::TestCase + extension :xhtml +end diff --git a/test/scanners/nitro/tags.in.xhtml b/test/scanners/nitro/tags.in.xhtml new file mode 100644 index 0000000..398031c --- /dev/null +++ b/test/scanners/nitro/tags.in.xhtml @@ -0,0 +1,87 @@ +<Page title="Questions and Tips by Tags"> + <div id="left"> + <?r if @tags ?> + <h1>Questions with Tags: #{@tags.join(" ")}</h1> + + <?r if @questions && @questions.size > 0 ?> + <?r if @qtags ?> + Too many results for that Tag, please reduce the number by using one of the following Tags: + #{cloud_of(@qtags)} + <?r end ?> + <div class="results"> + <?r @questions.each do |q| ?> + <h2><a href="/question/#{q.oid}">#{q.question}</a></h2> + <p> + <?r excerpt = excerpt_with_words(q.text, @tags) ?> + #{excerpt} + </p> + <p style="float:right;">#{q.answers.size.to_i} answers</p> + <?r end ?> + </div> + <div class="pager"> + #{@qpager.navigation} + </div> + <?r else ?> + <div class="results_none"> + <h2>no question with this/these tag(s) found</h2> + <p><a href="/ask">Ask a question here.</a></p> + </div> + <?r end ?> + + <?r if @tips && @tips.size > 0 ?> + <h1>Tips with Tags: #{@tags.join(" ")}</h1> + <?r if @ttags ?> + Too many results for that Tag, please reduce the number by using one of the following Tags: + #{cloud_of(@ttags)} + <?r end ?> + <div class="results"> + <?r @tips.each do |t| ?> + <h2><a href="/tip/#{t.oid}">#{t.title}</a></h2> + <p> + <?r excerpt = excerpt_with_words(t.text, @tags) ?> + #{excerpt} + </p> + <?r end ?> + </div> + <div class="pager"> + #{@tpager.navigation} + </div> + <?r end ?> + + <?r if @tutorials && @tutorials.size > 0 ?> + <h1>Tutorials with Tags: #{@tags.join(" ")}</h1> + <?r if @tuttags ?> + Too many results for that Tag, please reduce the number by using one of the following Tags: + #{cloud_of(@tuttags)} + <?r end ?> + <div class="results"> + <?r @tutorials.each do |t| ?> + <h2><a href="/tutorial/#{t.oid}">#{t.title}</a></h2> + <p> + <?r excerpt = excerpt_with_words(t.text, @tags) ?> + #{excerpt} + </p> + <?r end ?> + </div> + <div class="pager"> + #{@tpager.navigation} + </div> + <?r end ?> + + + <?r else ?> + <div class="cloud"> + <?r + sum = all_tags.inject(0) { |sum, t| sum + t.popularity.to_i } + ?> + <?r all_tags.each do |t| ?> + <a href="/tags/#{t.name}" style="font-size:#{(1+((t.popularity.to_i/sum.to_f)*2)).to_s[0..3]}em;">#{t.name}</a> + <?r end ?> + </div> <!-- #cloud --> + <?r end ?> + </div> <!-- #left --> + + <render href="/right" /> +</Page> + +<!-- Copyright © 2006 Kashia Buch (kashia@vfemail.net), Fabian Buch (fabian@fabian-buch.de). All rights reserved. --> diff --git a/test/scanners/nitro/tags.out.raydebug b/test/scanners/nitro/tags.out.raydebug new file mode 100644 index 0000000..7ce6076 --- /dev/null +++ b/test/scanners/nitro/tags.out.raydebug @@ -0,0 +1,87 @@ +tag(<Page) attribute_name(title)operator(=)string<delimiter(")content(Questions and Tips by Tags)delimiter(")>tag(>) + tag(<div) attribute_name(id)operator(=)string<delimiter(")content(left)delimiter(")>tag(>) + inline<delimiter(<?r) reserved(if) instance_variable(@tags) delimiter(?>)> + tag(<h1>)plain(Questions with Tags: )inline<delimiter(#{)instance_variable(@tags)operator(.)ident(join)operator(()string<delimiter(")content( )delimiter(")>operator(\))delimiter(})>tag(</h1>) + + inline<delimiter(<?r) reserved(if) instance_variable(@questions) operator(&&) instance_variable(@questions)operator(.)ident(size) operator(>) integer(0) delimiter(?>)> + inline<delimiter(<?r) reserved(if) instance_variable(@qtags) delimiter(?>)> + plain(Too many results for that Tag, please reduce the number by using one of the following Tags: + )inline<delimiter(#{)ident(cloud_of)operator(()instance_variable(@qtags)operator(\))delimiter(})> + inline<delimiter(<?r) reserved(end) delimiter(?>)> + tag(<div) attribute_name(class)operator(=)string<delimiter(")content(results)delimiter(")>tag(>) + inline<delimiter(<?r) instance_variable(@questions)operator(.)ident(each) reserved(do) operator(|)ident(q)operator(|) delimiter(?>)> + tag(<h2>)tag(<a) attribute_name(href)operator(=)string<delimiter(")content(/question/)inline<delimiter(#{)ident(q)operator(.)ident(oid)delimiter(})>delimiter(")>tag(>)inline<delimiter(#{)ident(q)operator(.)ident(question)delimiter(})>tag(</a>)tag(</h2>) + tag(<p>) + inline<delimiter(<?r) ident(excerpt) operator(=) ident(excerpt_with_words)operator(()ident(q)operator(.)ident(text)operator(,) instance_variable(@tags)operator(\)) delimiter(?>)> + inline<delimiter(#{)ident(excerpt)delimiter(})> + tag(</p>) + tag(<p) attribute_name(style)operator(=)string<delimiter(")content(float:right;)delimiter(")>tag(>)inline<delimiter(#{)ident(q)operator(.)ident(answers)operator(.)ident(size)operator(.)ident(to_i)delimiter(})> plain(answers)tag(</p>) + inline<delimiter(<?r) reserved(end) delimiter(?>)> + tag(</div>) + tag(<div) attribute_name(class)operator(=)string<delimiter(")content(pager)delimiter(")>tag(>) + inline<delimiter(#{)instance_variable(@qpager)operator(.)ident(navigation)delimiter(})> + tag(</div>) + inline<delimiter(<?r) reserved(else) delimiter(?>)> + tag(<div) attribute_name(class)operator(=)string<delimiter(")content(results_none)delimiter(")>tag(>) + tag(<h2>)plain(no question with this/these tag(s\) found)tag(</h2>) + tag(<p>)tag(<a) attribute_name(href)operator(=)string<delimiter(")content(/ask)delimiter(")>tag(>)plain(Ask a question here.)tag(</a>)tag(</p>) + tag(</div>) + inline<delimiter(<?r) reserved(end) delimiter(?>)> + + inline<delimiter(<?r) reserved(if) instance_variable(@tips) operator(&&) instance_variable(@tips)operator(.)ident(size) operator(>) integer(0) delimiter(?>)> + tag(<h1>)plain(Tips with Tags: )inline<delimiter(#{)instance_variable(@tags)operator(.)ident(join)operator(()string<delimiter(")content( )delimiter(")>operator(\))delimiter(})>tag(</h1>) + inline<delimiter(<?r) reserved(if) instance_variable(@ttags) delimiter(?>)> + plain(Too many results for that Tag, please reduce the number by using one of the following Tags: + )inline<delimiter(#{)ident(cloud_of)operator(()instance_variable(@ttags)operator(\))delimiter(})> + inline<delimiter(<?r) reserved(end) delimiter(?>)> + tag(<div) attribute_name(class)operator(=)string<delimiter(")content(results)delimiter(")>tag(>) + inline<delimiter(<?r) instance_variable(@tips)operator(.)ident(each) reserved(do) operator(|)ident(t)operator(|) delimiter(?>)> + tag(<h2>)tag(<a) attribute_name(href)operator(=)string<delimiter(")content(/tip/)inline<delimiter(#{)ident(t)operator(.)ident(oid)delimiter(})>delimiter(")>tag(>)inline<delimiter(#{)ident(t)operator(.)ident(title)delimiter(})>tag(</a>)tag(</h2>) + tag(<p>) + inline<delimiter(<?r) ident(excerpt) operator(=) ident(excerpt_with_words)operator(()ident(t)operator(.)ident(text)operator(,) instance_variable(@tags)operator(\)) delimiter(?>)> + inline<delimiter(#{)ident(excerpt)delimiter(})> + tag(</p>) + inline<delimiter(<?r) reserved(end) delimiter(?>)> + tag(</div>) + tag(<div) attribute_name(class)operator(=)string<delimiter(")content(pager)delimiter(")>tag(>) + inline<delimiter(#{)instance_variable(@tpager)operator(.)ident(navigation)delimiter(})> + tag(</div>) + inline<delimiter(<?r) reserved(end) delimiter(?>)> + + inline<delimiter(<?r) reserved(if) instance_variable(@tutorials) operator(&&) instance_variable(@tutorials)operator(.)ident(size) operator(>) integer(0) delimiter(?>)> + tag(<h1>)plain(Tutorials with Tags: )inline<delimiter(#{)instance_variable(@tags)operator(.)ident(join)operator(()string<delimiter(")content( )delimiter(")>operator(\))delimiter(})>tag(</h1>) + inline<delimiter(<?r) reserved(if) instance_variable(@tuttags) delimiter(?>)> + plain(Too many results for that Tag, please reduce the number by using one of the following Tags: + )inline<delimiter(#{)ident(cloud_of)operator(()instance_variable(@tuttags)operator(\))delimiter(})> + inline<delimiter(<?r) reserved(end) delimiter(?>)> + tag(<div) attribute_name(class)operator(=)string<delimiter(")content(results)delimiter(")>tag(>) + inline<delimiter(<?r) instance_variable(@tutorials)operator(.)ident(each) reserved(do) operator(|)ident(t)operator(|) delimiter(?>)> + tag(<h2>)tag(<a) attribute_name(href)operator(=)string<delimiter(")content(/tutorial/)inline<delimiter(#{)ident(t)operator(.)ident(oid)delimiter(})>delimiter(")>tag(>)inline<delimiter(#{)ident(t)operator(.)ident(title)delimiter(})>tag(</a>)tag(</h2>) + tag(<p>) + inline<delimiter(<?r) ident(excerpt) operator(=) ident(excerpt_with_words)operator(()ident(t)operator(.)ident(text)operator(,) instance_variable(@tags)operator(\)) delimiter(?>)> + inline<delimiter(#{)ident(excerpt)delimiter(})> + tag(</p>) + inline<delimiter(<?r) reserved(end) delimiter(?>)> + tag(</div>) + tag(<div) attribute_name(class)operator(=)string<delimiter(")content(pager)delimiter(")>tag(>) + inline<delimiter(#{)instance_variable(@tpager)operator(.)ident(navigation)delimiter(})> + tag(</div>) + inline<delimiter(<?r) reserved(end) delimiter(?>)> + + + inline<delimiter(<?r) reserved(else) delimiter(?>)> + tag(<div) attribute_name(class)operator(=)string<delimiter(")content(cloud)delimiter(")>tag(>) + inline<delimiter(<?r) + ident(sum) operator(=) ident(all_tags)operator(.)ident(inject)operator(()integer(0)operator(\)) operator({) operator(|)ident(sum)operator(,) ident(t)operator(|) ident(sum) operator(+) ident(t)operator(.)ident(popularity)operator(.)ident(to_i) operator(}) + delimiter(?>)> + inline<delimiter(<?r) ident(all_tags)operator(.)ident(each) reserved(do) operator(|)ident(t)operator(|) delimiter(?>)> + tag(<a) attribute_name(href)operator(=)string<delimiter(")content(/tags/)inline<delimiter(#{)ident(t)operator(.)ident(name)delimiter(})>delimiter(")> attribute_name(style)operator(=)string<delimiter(")content(font-size:)inline<delimiter(#{)operator(()integer(1)operator(+)operator(()operator(()ident(t)operator(.)ident(popularity)operator(.)ident(to_i)operator(/)ident(sum)operator(.)ident(to_f)operator(\))operator(*)integer(2)operator(\))operator(\))operator(.)ident(to_s)operator([)integer(0)operator(..)integer(3)operator(])delimiter(})>content(em;)delimiter(")>tag(>)inline<delimiter(#{)ident(t)operator(.)ident(name)delimiter(})>tag(</a>) + inline<delimiter(<?r) reserved(end) delimiter(?>)> + tag(</div>) comment(<!-- #cloud -->) + inline<delimiter(<?r) reserved(end) delimiter(?>)> + tag(</div>) comment(<!-- #left -->) + + tag(<render) attribute_name(href)operator(=)string<delimiter(")content(/right)delimiter(")> tag(/>) +tag(</Page>) + +comment(<!-- Copyright © 2006 Kashia Buch (kashia@vfemail.net\), Fabian Buch (fabian@fabian-buch.de\). All rights reserved. -->) diff --git a/test/scanners/rhtml/day.in.rhtml b/test/scanners/rhtml/day.in.rhtml new file mode 100644 index 0000000..12ebe82 --- /dev/null +++ b/test/scanners/rhtml/day.in.rhtml @@ -0,0 +1,26 @@ +<% day, auftritte = *day -%>
+<%
+ for auftritt in auftritte
+-%>
+
+<tr>
+ <td class="pplan_datum">
+ <%= colorize day.to_s(:dots) if day %>
+ <% if day and day.wday == 6 %><br /><em>Samstag</em><% end %>
+ </td>
+ <td class="pplan_zeit">
+ <%= colorize auftritt.time %>
+ </td>
+ <td class="pplan_stueck">
+ <%= colorize auftritt.program %>
+ <%= link_to 'E', :controller => 'admin/auftritte', :action => :edit, :id => auftritt %>
+ </td>
+ <td class="pplan_besetzung">
+ <%= colorize(auftritt.place, 'Ort: ') + '<br />' unless auftritt.place.blank? %>
+ </td>
+</tr>
+
+<%
+ day = nil
+ end
+-%>
diff --git a/test/scanners/rhtml/day.out.raydebug b/test/scanners/rhtml/day.out.raydebug new file mode 100644 index 0000000..7440d64 --- /dev/null +++ b/test/scanners/rhtml/day.out.raydebug @@ -0,0 +1,26 @@ +inline<delimiter(<%) ident(day)operator(,) ident(auftritte) operator(=) operator(*)ident(day) delimiter(-%>)> +inline<delimiter(<%) + reserved(for) ident(auftritt) reserved(in) ident(auftritte) +delimiter(-%>)> + +tag(<tr>) + tag(<td) attribute_name(class)operator(=)string<delimiter(")content(pplan_datum)delimiter(")>tag(>) + inline<delimiter(<%=) ident(colorize) ident(day)operator(.)ident(to_s)operator(()symbol(:dots)operator(\)) reserved(if) ident(day) delimiter(%>)> + inline<delimiter(<%) reserved(if) ident(day) reserved(and) ident(day)operator(.)ident(wday) operator(==) integer(6) delimiter(%>)>tag(<br) tag(/>)tag(<em>)plain(Samstag)tag(</em>)inline<delimiter(<%) reserved(end) delimiter(%>)> + tag(</td>) + tag(<td) attribute_name(class)operator(=)string<delimiter(")content(pplan_zeit)delimiter(")>tag(>) + inline<delimiter(<%=) ident(colorize) ident(auftritt)operator(.)ident(time) delimiter(%>)> + tag(</td>) + tag(<td) attribute_name(class)operator(=)string<delimiter(")content(pplan_stueck)delimiter(")>tag(>) + inline<delimiter(<%=) ident(colorize) ident(auftritt)operator(.)ident(program) delimiter(%>)> + inline<delimiter(<%=) ident(link_to) string<delimiter(')content(E)delimiter(')>operator(,) symbol(:controller) operator(=)operator(>) string<delimiter(')content(admin/auftritte)delimiter(')>operator(,) symbol(:action) operator(=)operator(>) symbol(:edit)operator(,) symbol(:id) operator(=)operator(>) ident(auftritt) delimiter(%>)> + tag(</td>) + tag(<td) attribute_name(class)operator(=)string<delimiter(")content(pplan_besetzung)delimiter(")>tag(>) + inline<delimiter(<%=) ident(colorize)operator(()ident(auftritt)operator(.)ident(place)operator(,) string<delimiter(')content(Ort: )delimiter(')>operator(\)) operator(+) string<delimiter(')content(<br />)delimiter(')> reserved(unless) ident(auftritt)operator(.)ident(place)operator(.)ident(blank?) delimiter(%>)> + tag(</td>) +tag(</tr>) + +inline<delimiter(<%) + ident(day) operator(=) pre_constant(nil) + reserved(end) +delimiter(-%>)> diff --git a/test/scanners/rhtml/suite.rb b/test/scanners/rhtml/suite.rb new file mode 100644 index 0000000..aa10fff --- /dev/null +++ b/test/scanners/rhtml/suite.rb @@ -0,0 +1,2 @@ +class RHTML < CodeRay::TestCase +end diff --git a/test/scanners/ruby/1.in.rb b/test/scanners/ruby/1.in.rb new file mode 100644 index 0000000..ddd5106 --- /dev/null +++ b/test/scanners/ruby/1.in.rb @@ -0,0 +1,731 @@ +public :<<
+
+class String
+ def / regex
+ scan(regex).first
+ end
+end
+
+module Bytes
+ KILOBYTE, MEGABYTE, GIGABYTE, TERABYTE, PETABYTE = (1..5).map { |x| 2 ** (10 * x) }
+ FactorOfSuffix = Hash.new(1)
+ constants.each do |c|
+ FactorOfSuffix[c[0,1]] = const_get c
+ end
+
+ def Bytes.factor_of_suffix suff
+ FactorOfSuffix[suff]
+ end
+
+ def Bytes.[] str
+ n, fac = str / /(.+)([A-Z])/
+ n = n.to_i
+ fac = factor_of_suffix fac
+ n * fac
+ end
+end
+
+class String
+ def to_bytes
+ Bytes[self]
+ end
+end
+
+p '01K'.to_bytes
+p '%d - %p' % [Bytes.constants.size, self]
+
+p 'abc' / /([ac])/
+
+p 'abc' + /([ac])/
+p 'abc' - /([ac])/
+p 'abc' * /([ac])/
+p 'abc' ** /([ac])/
+p 'abc' % /([ac])/
+p 'abc' ~ /([ac])/
+
+require 'benchmark'
+S = 'bla' * 100 + "\n" + "\t"*4
+T = 200000
+
+Benchmark.bm(1) do |bm|
+ GC.sweep
+ bm.report('?') { T.times { S.index(?\n) } }
+ GC.sweep
+ bm.report('"') { T.times { S.index("\n") } }
+ GC.sweep
+ bm.report('/') { T.times { S.index(/\n/) } }
+ GC.sweep
+end
+
+ def next?()
+ !end?
+ end
+ # Rewinds the generator.
+ def rewind()
+ initialize(nil, &@block) if @index.nonzero?
+
+ self
+ end
+
+a = []
+a << a
+p a #-> [[...]]
+
+# format.rb: Written by Tadayoshi Funaba 1999-2004
+# $Id: format.rb,v 2.14 2004-11-06 10:58:40+09 tadf Exp $
+
+require 'rational'
+
+class Date
+
+ MONTHS = {
+ 'january' => 1, 'february' => 2, 'march' => 3, 'april' => 4,
+ 'may' => 5, 'june' => 6, 'july' => 7, 'august' => 8,
+ 'september'=> 9, 'october' =>10, 'november' =>11, 'december' =>12
+ }
+
+ DAYS = {
+ 'sunday' => 0, 'monday' => 1, 'tuesday' => 2, 'wednesday'=> 3,
+ 'thursday' => 4, 'friday' => 5, 'saturday' => 6
+ }
+
+ ABBR_MONTHS = {
+ 'jan' => 1, 'feb' => 2, 'mar' => 3, 'apr' => 4,
+ 'may' => 5, 'jun' => 6, 'jul' => 7, 'aug' => 8,
+ 'sep' => 9, 'oct' =>10, 'nov' =>11, 'dec' =>12
+ }
+
+ ABBR_DAYS = {
+ 'sun' => 0, 'mon' => 1, 'tue' => 2, 'wed' => 3,
+ 'thu' => 4, 'fri' => 5, 'sat' => 6
+ }
+
+ ZONES = {
+ 'ut' => 0*3600, 'gmt' => 0*3600, 'est' => -5*3600, 'edt' => -4*3600,
+ 'cst' => -6*3600, 'cdt' => -5*3600, 'mst' => -7*3600, 'mdt' => -6*3600,
+ 'pst' => -8*3600, 'pdt' => -7*3600,
+ 'a' => 1*3600, 'b' => 2*3600, 'c' => 3*3600, 'd' => 4*3600,
+ 'e' => 5*3600, 'f' => 6*3600, 'g' => 7*3600, 'h' => 8*3600,
+ 'i' => 9*3600, 'k' => 10*3600, 'l' => 11*3600, 'm' => 12*3600,
+ 'n' => -1*3600, 'o' => -2*3600, 'p' => -3*3600, 'q' => -4*3600,
+ 'r' => -5*3600, 's' => -6*3600, 't' => -7*3600, 'u' => -8*3600,
+ 'v' => -9*3600, 'w' =>-10*3600, 'x' =>-11*3600, 'y' =>-12*3600,
+ 'z' => 0*3600,
+ 'utc' => 0*3600, 'wet' => 0*3600, 'bst' => 1*3600, 'wat' => -1*3600,
+ 'at' => -2*3600, 'ast' => -4*3600, 'adt' => -3*3600, 'yst' => -9*3600,
+ 'ydt' => -8*3600, 'hst' =>-10*3600, 'hdt' => -9*3600, 'cat' =>-10*3600,
+ 'ahst'=>-10*3600, 'nt' =>-11*3600, 'idlw'=>-12*3600, 'cet' => 1*3600,
+ 'met' => 1*3600, 'mewt'=> 1*3600, 'mest'=> 2*3600, 'mesz'=> 2*3600,
+ 'swt' => 1*3600, 'sst' => 2*3600, 'fwt' => 1*3600, 'fst' => 2*3600,
+ 'eet' => 2*3600, 'bt' => 3*3600, 'zp4' => 4*3600, 'zp5' => 5*3600,
+ 'zp6' => 6*3600, 'wast'=> 7*3600, 'wadt'=> 8*3600, 'cct' => 8*3600,
+ 'jst' => 9*3600, 'east'=> 10*3600, 'eadt'=> 11*3600, 'gst' => 10*3600,
+ 'nzt' => 12*3600, 'nzst'=> 12*3600, 'nzdt'=> 13*3600, 'idle'=> 12*3600
+ }
+
+ def self.__strptime(str, fmt, elem)
+ fmt.scan(/%[EO]?.|./o) do |c|
+ cc = c.sub(/\A%[EO]?(.)\Z/o, '%\\1')
+ case cc
+ when /\A\s/o
+ str.sub!(/\A[\s\v]+/o, '')
+ when '%A', '%a'
+ return unless str.sub!(/\A([a-z]+)\b/io, '')
+ val = DAYS[$1.downcase] || ABBR_DAYS[$1.downcase]
+ return unless val
+ elem[:wday] = val
+ when '%B', '%b', '%h'
+ return unless str.sub!(/\A([a-z]+)\b/io, '')
+ val = MONTHS[$1.downcase] || ABBR_MONTHS[$1.downcase]
+ return unless val
+ elem[:mon] = val
+ when '%C'
+ return unless str.sub!(/\A(\d+)/o, '')
+ val = $1.to_i
+ elem[:cent] = val
+ when '%c'
+ return unless __strptime(str, '%a %b %e %H:%M:%S %Y', elem)
+ when '%D'
+ return unless __strptime(str, '%m/%d/%y', elem)
+ when '%d', '%e'
+ return unless str.sub!(/\A ?(\d+)/o, '')
+ val = $1.to_i
+ return unless (1..31) === val
+ elem[:mday] = val
+ when '%F'
+ return unless __strptime(str, '%Y-%m-%d', elem)
+ when '%G'
+ return unless str.sub!(/\A([-+]?\d+)/o, '')
+ val = $1.to_i
+ elem[:cwyear] = val
+ when '%g'
+ return unless str.sub!(/\A(\d+)/o, '')
+ val = $1.to_i
+ return unless (0..99) === val
+ elem[:cwyear] = val
+ elem[:cent] ||= if val >= 69 then 19 else 20 end
+ when '%H', '%k'
+ return unless str.sub!(/\A ?(\d+)/o, '')
+ val = $1.to_i
+ return unless (0..24) === val
+ elem[:hour] = val
+ when '%I', '%l'
+ return unless str.sub!(/\A ?(\d+)/o, '')
+ val = $1.to_i
+ return unless (1..12) === val
+ elem[:hour] = val
+ when '%j'
+ return unless str.sub!(/\A(\d+)/o, '')
+ val = $1.to_i
+ return unless (1..366) === val
+ elem[:yday] = val
+ when '%M'
+ return unless str.sub!(/\A(\d+)/o, '')
+ val = $1.to_i
+ return unless (0..59) === val
+ elem[:min] = val
+ when '%m'
+ return unless str.sub!(/\A(\d+)/o, '')
+ val = $1.to_i
+ return unless (1..12) === val
+ elem[:mon] = val
+ when '%n'
+ return unless __strptime(str, ' ', elem)
+ when '%p', '%P'
+ return unless str.sub!(/\A([ap])(?:m\b|\.m\.)/io, '')
+ elem[:merid] = if $1.downcase == 'a' then 0 else 12 end
+ when '%R'
+ return unless __strptime(str, '%H:%M', elem)
+ when '%r'
+ return unless __strptime(str, '%I:%M:%S %p', elem)
+ when '%S'
+ return unless str.sub!(/\A(\d+)/o, '')
+ val = $1.to_i
+ return unless (0..60) === val
+ elem[:sec] = val
+ when '%s'
+ return unless str.sub!(/\A(\d+)/o, '')
+ val = $1.to_i
+ elem[:seconds] = val
+ when '%T'
+ return unless __strptime(str, '%H:%M:%S', elem)
+ when '%t'
+ return unless __strptime(str, ' ', elem)
+ when '%U', '%W'
+ return unless str.sub!(/\A(\d+)/o, '')
+ val = $1.to_i
+ return unless (0..53) === val
+ elem[if c == '%U' then :wnum0 else :wnum1 end] = val
+ when '%u'
+ return unless str.sub!(/\A(\d+)/o, '')
+ val = $1.to_i
+ return unless (1..7) === val
+ elem[:cwday] = val
+ when '%V'
+ return unless str.sub!(/\A(\d+)/o, '')
+ val = $1.to_i
+ return unless (1..53) === val
+ elem[:cweek] = val
+ when '%v'
+ return unless __strptime(str, '%e-%b-%Y', elem)
+ when '%w'
+ return unless str.sub!(/\A(\d+)/o, '')
+ val = $1.to_i
+ return unless (0..6) === val
+ elem[:wday] = val
+ when '%X'
+ return unless __strptime(str, '%H:%M:%S', elem)
+ when '%x'
+ return unless __strptime(str, '%m/%d/%y', elem)
+ when '%Y'
+ return unless str.sub!(/\A([-+]?\d+)/o, '')
+ val = $1.to_i
+ elem[:year] = val
+ when '%y'
+ return unless str.sub!(/\A(\d+)/o, '')
+ val = $1.to_i
+ return unless (0..99) === val
+ elem[:year] = val
+ elem[:cent] ||= if val >= 69 then 19 else 20 end
+ when '%Z', '%z'
+ return unless str.sub!(/\A([-+:a-z0-9]+(?:\s+dst\b)?)/io, '')
+ val = $1
+ elem[:zone] = val
+ offset = zone_to_diff(val)
+ elem[:offset] = offset
+ when '%%'
+ return unless str.sub!(/\A%/o, '')
+ when '%+'
+ return unless __strptime(str, '%a %b %e %H:%M:%S %Z %Y', elem)
+=begin
+ when '%.'
+ return unless str.sub!(/\A(\d+)/o, '')
+ val = $1.to_i.to_r / (10**$1.size)
+ elem[:sec_fraction] = val
+=end
+ when '%1'
+ return unless str.sub!(/\A(\d+)/o, '')
+ val = $1.to_i
+ elem[:jd] = val
+ when '%2'
+ return unless __strptime(str, '%Y-%j', elem)
+ when '%3'
+ return unless __strptime(str, '%F', elem)
+ else
+ return unless str.sub!(Regexp.new('\\A' + Regexp.quote(c)), '')
+ end
+ end
+
+ if cent = elem.delete(:cent)
+ if elem[:cwyear]
+ elem[:cwyear] += cent * 100
+ end
+ if elem[:year]
+ elem[:year] += cent * 100
+ end
+ end
+
+ if merid = elem.delete(:merid)
+ if elem[:hour]
+ elem[:hour] %= 12
+ elem[:hour] += merid
+ end
+ end
+
+ str
+ end
+
+ private_class_method :__strptime
+
+ def self._strptime(str, fmt='%F')
+ elem = {}
+ elem if __strptime(str.dup, fmt, elem)
+ end
+
+ PARSE_MONTHPAT = ABBR_MONTHS.keys.join('|')
+ PARSE_DAYPAT = ABBR_DAYS. keys.join('|')
+
+ def self._parse(str, comp=false)
+ str = str.dup
+
+ str.gsub!(/[^-+,.\/:0-9a-z]+/ino, ' ')
+
+ # day
+ if str.sub!(/(#{PARSE_DAYPAT})\S*/ino, ' ')
+ wday = ABBR_DAYS[$1.downcase]
+ end
+
+ # time
+ if str.sub!(
+ /(\d+):(\d+)
+ (?:
+ :(\d+)(?:[,.](\d*))?
+ )?
+ (?:
+ \s*
+ ([ap])(?:m\b|\.m\.)
+ )?
+ (?:
+ \s*
+ (
+ [a-z]+(?:\s+dst)?\b
+ |
+ [-+]\d+(?::?\d+)
+ )
+ )?
+ /inox,
+ ' ')
+ hour = $1.to_i
+ min = $2.to_i
+ sec = $3.to_i if $3
+ if $4
+ sec_fraction = $4.to_i.to_r / (10**$4.size)
+ end
+
+ if $5
+ hour %= 12
+ if $5.downcase == 'p'
+ hour += 12
+ end
+ end
+
+ if $6
+ zone = $6
+ end
+ end
+
+ # eu
+ if str.sub!(
+ /(\d+)\S*
+ \s+
+ (#{PARSE_MONTHPAT})\S*
+ (?:
+ \s+
+ (-?\d+)
+ )?
+ /inox,
+ ' ')
+ mday = $1.to_i
+ mon = ABBR_MONTHS[$2.downcase]
+
+ if $3
+ year = $3.to_i
+ if $3.size > 2
+ comp = false
+ end
+ end
+
+ # us
+ elsif str.sub!(
+ /(#{PARSE_MONTHPAT})\S*
+ \s+
+ (\d+)\S*
+ (?:
+ \s+
+ (-?\d+)
+ )?
+ /inox,
+ ' ')
+ mon = ABBR_MONTHS[$1.downcase]
+ mday = $2.to_i
+
+ if $3
+ year = $3.to_i
+ if $3.size > 2
+ comp = false
+ end
+ end
+
+ # iso
+ elsif str.sub!(/([-+]?\d+)-(\d+)-(-?\d+)/no, ' ')
+ year = $1.to_i
+ mon = $2.to_i
+ mday = $3.to_i
+
+ if $1.size > 2
+ comp = false
+ elsif $3.size > 2
+ comp = false
+ mday, mon, year = year, mon, mday
+ end
+
+ # jis
+ elsif str.sub!(/([MTSH])(\d+)\.(\d+)\.(\d+)/ino, ' ')
+ e = { 'm'=>1867,
+ 't'=>1911,
+ 's'=>1925,
+ 'h'=>1988
+ }[$1.downcase]
+ year = $2.to_i + e
+ mon = $3.to_i
+ mday = $4.to_i
+
+ # vms
+ elsif str.sub!(/(-?\d+)-(#{PARSE_MONTHPAT})[^-]*-(-?\d+)/ino, ' ')
+ mday = $1.to_i
+ mon = ABBR_MONTHS[$2.downcase]
+ year = $3.to_i
+
+ if $1.size > 2
+ comp = false
+ year, mon, mday = mday, mon, year
+ elsif $3.size > 2
+ comp = false
+ end
+
+ # sla
+ elsif str.sub!(%r|(-?\d+)/(\d+)(?:/(-?\d+))?|no, ' ')
+ mon = $1.to_i
+ mday = $2.to_i
+
+ if $3
+ year = $3.to_i
+ if $3.size > 2
+ comp = false
+ end
+ end
+
+ if $3 && $1.size > 2
+ comp = false
+ year, mon, mday = mon, mday, year
+ end
+
+ # ddd
+ elsif str.sub!(
+ /([-+]?)(\d{4,14})
+ (?:
+ \s*
+ T?
+ \s*
+ (\d{2,6})(?:[,.](\d*))?
+ )?
+ (?:
+ \s*
+ (
+ Z
+ |
+ [-+]\d{2,4}
+ )
+ \b
+ )?
+ /inox,
+ ' ')
+ case $2.size
+ when 4
+ mon = $2[ 0, 2].to_i
+ mday = $2[ 2, 2].to_i
+ when 6
+ year = ($1 + $2[ 0, 2]).to_i
+ mon = $2[ 2, 2].to_i
+ mday = $2[ 4, 2].to_i
+ when 8, 10, 12, 14
+ year = ($1 + $2[ 0, 4]).to_i
+ mon = $2[ 4, 2].to_i
+ mday = $2[ 6, 2].to_i
+ hour = $2[ 8, 2].to_i if $2.size >= 10
+ min = $2[10, 2].to_i if $2.size >= 12
+ sec = $2[12, 2].to_i if $2.size >= 14
+ comp = false
+ end
+ if $3
+ case $3.size
+ when 2, 4, 6
+ hour = $3[ 0, 2].to_i
+ min = $3[ 2, 2].to_i if $3.size >= 4
+ sec = $3[ 4, 2].to_i if $3.size >= 6
+ end
+ end
+ if $4
+ sec_fraction = $4.to_i.to_r / (10**$4.size)
+ end
+ if $5
+ zone = $5
+ end
+ end
+
+ if str.sub!(/\b(bc\b|bce\b|b\.c\.|b\.c\.e\.)/ino, ' ')
+ if year
+ year = -year + 1
+ end
+ end
+
+ if comp and year
+ if year >= 0 and year <= 99
+ if year >= 69
+ year += 1900
+ else
+ year += 2000
+ end
+ end
+ end
+
+ elem = {}
+ elem[:year] = year if year
+ elem[:mon] = mon if mon
+ elem[:mday] = mday if mday
+ elem[:hour] = hour if hour
+ elem[:min] = min if min
+ elem[:sec] = sec if sec
+ elem[:sec_fraction] = sec_fraction if sec_fraction
+ elem[:zone] = zone if zone
+ offset = zone_to_diff(zone) if zone
+ elem[:offset] = offset if offset
+ elem[:wday] = wday if wday
+ elem
+ end
+
+ def self.zone_to_diff(str)
+ abb, dst = str.downcase.split(/\s+/o, 2)
+ if ZONES.include?(abb)
+ offset = ZONES[abb]
+ offset += 3600 if dst
+ elsif /\A([-+])(\d{2}):?(\d{2})?\Z/no =~ str
+ offset = $2.to_i * 3600 + $3.to_i * 60
+ offset *= -1 if $1 == '-'
+ end
+ offset
+ end
+
+ def strftime(fmt='%F')
+ o = ''
+ fmt.scan(/%[EO]?.|./o) do |c|
+ cc = c.sub(/^%[EO]?(.)$/o, '%\\1')
+ case cc
+ when '%A'; o << DAYNAMES[wday]
+ when '%a'; o << ABBR_DAYNAMES[wday]
+ when '%B'; o << MONTHNAMES[mon]
+ when '%b'; o << ABBR_MONTHNAMES[mon]
+ when '%C'; o << '%02d' % (year / 100.0).floor # P2,ID
+ when '%c'; o << strftime('%a %b %e %H:%M:%S %Y')
+ when '%D'; o << strftime('%m/%d/%y') # P2,ID
+ when '%d'; o << '%02d' % mday
+ when '%e'; o << '%2d' % mday
+ when '%F'; o << strftime('%Y-%m-%d') # ID
+ when '%G'; o << '%.4d' % cwyear # ID
+ when '%g'; o << '%02d' % (cwyear % 100) # ID
+ when '%H'; o << '%02d' % hour
+ when '%h'; o << strftime('%b') # P2,ID
+ when '%I'; o << '%02d' % ((hour % 12).nonzero? or 12)
+ when '%j'; o << '%03d' % yday
+ when '%k'; o << '%2d' % hour # AR,TZ,GL
+ when '%l'; o << '%2d' % ((hour % 12).nonzero? or 12) # AR,TZ,GL
+ when '%M'; o << '%02d' % min
+ when '%m'; o << '%02d' % mon
+ when '%n'; o << "\n" # P2,ID
+ when '%P'; o << if hour < 12 then 'am' else 'pm' end # GL
+ when '%p'; o << if hour < 12 then 'AM' else 'PM' end
+ when '%R'; o << strftime('%H:%M') # ID
+ when '%r'; o << strftime('%I:%M:%S %p') # P2,ID
+ when '%S'; o << '%02d' % sec
+ when '%s' # TZ,GL
+ d = ajd - self.class.jd_to_ajd(self.class.civil_to_jd(1970,1,1), 0)
+ s = (d * 86400).to_i
+ o << '%d' % s
+ when '%T'; o << strftime('%H:%M:%S') # P2,ID
+ when '%t'; o << "\t" # P2,ID
+ when '%U', '%W'
+ a = self.class.civil_to_jd(year, 1, 1, ns?) + 6
+ k = if c == '%U' then 0 else 1 end
+ w = (jd - (a - ((a - k) + 1) % 7) + 7) / 7
+ o << '%02d' % w
+ when '%u'; o << '%d' % cwday # P2,ID
+ when '%V'; o << '%02d' % cweek # P2,ID
+ when '%v'; o << strftime('%e-%b-%Y') # AR,TZ
+ when '%w'; o << '%d' % wday
+ when '%X'; o << strftime('%H:%M:%S')
+ when '%x'; o << strftime('%m/%d/%y')
+ when '%Y'; o << '%.4d' % year
+ when '%y'; o << '%02d' % (year % 100)
+ when '%Z'; o << (if offset.zero? then 'Z' else strftime('%z') end)
+ when '%z' # ID
+ o << if offset < 0 then '-' else '+' end
+ of = offset.abs
+ hh, fr = of.divmod(1.to_r/24)
+ mm = fr / (1.to_r/1440)
+ o << '%02d' % hh
+ o << '%02d' % mm
+ when '%%'; o << '%'
+ when '%+'; o << strftime('%a %b %e %H:%M:%S %Z %Y') # TZ
+=begin
+ when '%.'
+ o << '%06d' % (sec_fraction / (1.to_r/86400/(10**6)))
+=end
+ when '%1'; o << '%d' % jd
+ when '%2'; o << strftime('%Y-%j')
+ when '%3'; o << strftime('%Y-%m-%d')
+ else; o << c
+ end
+ end
+ o
+ end
+
+# alias_method :format, :strftime
+
+ def asctime() strftime('%c') end
+
+ alias_method :ctime, :asctime
+
+end
+
+class DateTime < Date
+
+ def self._strptime(str, fmt='%FT%T%Z')
+ super(str, fmt)
+ end
+
+ def strftime(fmt='%FT%T%Z')
+ super(fmt)
+ end
+
+end
+
+require 'generator'
+a = [2, 3, 5, 7, 11]
+b = %w#h a l l o#
+SyncEnumerator.new(a, b).each { |i, j|
+ puts "#{i} & #{j}"
+}
+
+class Signature < Array
+ def === x
+ x.kind_of? Array and zip(x).all? { |me, it| me === it }
+ end
+end
+
+module Chess
+
+ BOARD_RANGE = 1..8
+
+ class Position
+
+ attr_reader :x, :y
+
+ def initialize *args
+ @x, @y = case args
+ when Signature[Fixnum, Fixnum]
+ args
+ when Signature[String]
+ Position.decode args.first
+ else
+ raise ArgumentError, 'wrong number of arguments(one String or two fixnums)'
+ end
+ raise RuntimeError, '%p is out of the chess board' % self unless Position.valid? @x, @y
+ end
+
+ def inspect
+ 'Position(%p, %p)' % [x, y]
+ end
+
+ def Position.decode pos
+ x, y = pos.split('')
+ return x.upcase[0] - ?A + 1, @y = y[0] - ?0
+ end
+
+ def Position.valid? x, y
+ BOARD_RANGE.include? x and BOARD_RANGE.include? y
+ end
+ end
+
+end
+
+p Chess::Position.new('H3')
+SuperString = Class.new String
+p Chess::Position.new(SuperString.new('C5'))
+p Chess::Position.new(3, 6)
+p Chess::Position.new(3, 9)
+
+require 'grammar'
+
+def test_grammars
+ [<<EOG1, <<EOG2, <<EOG3,].map { |g| Grammar.new g }
+Z --> S
+S --> Sb
+S --> bAa
+A --> aSc
+A --> a
+A --> aSb
+EOG1
+
+C --> d
+C --> ABC
+B -->
+B --> c
+A --> B
+A --> a
+EOG2
+
+E - TD
+D - pTD
+D -
+T - FS
+S - uFS
+S -
+F - aEz
+F - i
+EOG3
+end
+
+$trace = false
+test_grammars.each_with_index do |g, i|
+ puts "Grammar #{i} is #{'not ' if g.ll1?}LL(1)."
+end
diff --git a/test/scanners/ruby/1.out.raydebug b/test/scanners/ruby/1.out.raydebug new file mode 100644 index 0000000..510e7c6 --- /dev/null +++ b/test/scanners/ruby/1.out.raydebug @@ -0,0 +1,731 @@ +ident(public) symbol(:<<) + +reserved(class) class(String) + reserved(def) method(/) ident(regex) + ident(scan)operator(()ident(regex)operator(\))operator(.)ident(first) + reserved(end) +reserved(end) + +reserved(module) class(Bytes) + constant(KILOBYTE)operator(,) constant(MEGABYTE)operator(,) constant(GIGABYTE)operator(,) constant(TERABYTE)operator(,) constant(PETABYTE) operator(=) operator(()integer(1)operator(..)integer(5)operator(\))operator(.)ident(map) operator({) operator(|)ident(x)operator(|) integer(2) operator(**) operator(()integer(10) operator(*) ident(x)operator(\)) operator(}) + constant(FactorOfSuffix) operator(=) constant(Hash)operator(.)ident(new)operator(()integer(1)operator(\)) + ident(constants)operator(.)ident(each) reserved(do) operator(|)ident(c)operator(|) + constant(FactorOfSuffix)operator([)ident(c)operator([)integer(0)operator(,)integer(1)operator(])operator(]) operator(=) ident(const_get) ident(c) + reserved(end) + + reserved(def) constant(Bytes)operator(.)ident(factor_of_suffix) ident(suff) + constant(FactorOfSuffix)operator([)ident(suff)operator(]) + reserved(end) + + reserved(def) constant(Bytes)operator(.)operator([]) ident(str) + ident(n)operator(,) ident(fac) operator(=) ident(str) operator(/) regexp<delimiter(/)content((.+\)([A-Z]\))delimiter(/)> + ident(n) operator(=) ident(n)operator(.)ident(to_i) + ident(fac) operator(=) ident(factor_of_suffix) ident(fac) + ident(n) operator(*) ident(fac) + reserved(end) +reserved(end) + +reserved(class) class(String) + reserved(def) method(to_bytes) + constant(Bytes)operator([)pre_constant(self)operator(]) + reserved(end) +reserved(end) + +ident(p) string<delimiter(')content(01K)delimiter(')>operator(.)ident(to_bytes) +ident(p) string<delimiter(')content(%d - %p)delimiter(')> operator(%) operator([)constant(Bytes)operator(.)ident(constants)operator(.)ident(size)operator(,) pre_constant(self)operator(]) + +ident(p) string<delimiter(')content(abc)delimiter(')> operator(/) regexp<delimiter(/)content(([ac]\))delimiter(/)> + +ident(p) string<delimiter(')content(abc)delimiter(')> operator(+) regexp<delimiter(/)content(([ac]\))delimiter(/)> +ident(p) string<delimiter(')content(abc)delimiter(')> operator(-) regexp<delimiter(/)content(([ac]\))delimiter(/)> +ident(p) string<delimiter(')content(abc)delimiter(')> operator(*) regexp<delimiter(/)content(([ac]\))delimiter(/)> +ident(p) string<delimiter(')content(abc)delimiter(')> operator(**) regexp<delimiter(/)content(([ac]\))delimiter(/)> +ident(p) string<delimiter(')content(abc)delimiter(')> operator(%) regexp<delimiter(/)content(([ac]\))delimiter(/)> +ident(p) string<delimiter(')content(abc)delimiter(')> operator(~) regexp<delimiter(/)content(([ac]\))delimiter(/)> + +ident(require) string<delimiter(')content(benchmark)delimiter(')> +constant(S) operator(=) string<delimiter(')content(bla)delimiter(')> operator(*) integer(100) operator(+) string<delimiter(")char(\\n)delimiter(")> operator(+) string<delimiter(")char(\\t)delimiter(")>operator(*)integer(4) +constant(T) operator(=) integer(200000) + +constant(Benchmark)operator(.)ident(bm)operator(()integer(1)operator(\)) reserved(do) operator(|)ident(bm)operator(|) + constant(GC)operator(.)ident(sweep) + ident(bm)operator(.)ident(report)operator(()string<delimiter(')content(?)delimiter(')>operator(\)) operator({) constant(T)operator(.)ident(times) operator({) constant(S)operator(.)ident(index)operator(()integer(?\\n)operator(\)) operator(}) operator(}) + constant(GC)operator(.)ident(sweep) + ident(bm)operator(.)ident(report)operator(()string<delimiter(')content(")delimiter(')>operator(\)) operator({) constant(T)operator(.)ident(times) operator({) constant(S)operator(.)ident(index)operator(()string<delimiter(")char(\\n)delimiter(")>operator(\)) operator(}) operator(}) + constant(GC)operator(.)ident(sweep) + ident(bm)operator(.)ident(report)operator(()string<delimiter(')content(/)delimiter(')>operator(\)) operator({) constant(T)operator(.)ident(times) operator({) constant(S)operator(.)ident(index)operator(()regexp<delimiter(/)char(\\n)delimiter(/)>operator(\)) operator(}) operator(}) + constant(GC)operator(.)ident(sweep) +reserved(end) + + reserved(def) method(next?)operator(()operator(\)) + operator(!)ident(end?) + reserved(end) + comment(# Rewinds the generator.) + reserved(def) method(rewind)operator(()operator(\)) + ident(initialize)operator(()pre_constant(nil)operator(,) operator(&)instance_variable(@block)operator(\)) reserved(if) instance_variable(@index)operator(.)ident(nonzero?) + + pre_constant(self) + reserved(end) + +ident(a) operator(=) operator([)operator(]) +ident(a) operator(<<) ident(a) +ident(p) ident(a) comment(#-> [[...]]) + +comment(# format.rb: Written by Tadayoshi Funaba 1999-2004) +comment(# $Id: format.rb,v 2.14 2004-11-06 10:58:40+09 tadf Exp $) + +ident(require) string<delimiter(')content(rational)delimiter(')> + +reserved(class) class(Date) + + constant(MONTHS) operator(=) operator({) + string<delimiter(')content(january)delimiter(')> operator(=)operator(>) integer(1)operator(,) string<delimiter(')content(february)delimiter(')> operator(=)operator(>) integer(2)operator(,) string<delimiter(')content(march)delimiter(')> operator(=)operator(>) integer(3)operator(,) string<delimiter(')content(april)delimiter(')> operator(=)operator(>) integer(4)operator(,) + string<delimiter(')content(may)delimiter(')> operator(=)operator(>) integer(5)operator(,) string<delimiter(')content(june)delimiter(')> operator(=)operator(>) integer(6)operator(,) string<delimiter(')content(july)delimiter(')> operator(=)operator(>) integer(7)operator(,) string<delimiter(')content(august)delimiter(')> operator(=)operator(>) integer(8)operator(,) + string<delimiter(')content(september)delimiter(')>operator(=)operator(>) integer(9)operator(,) string<delimiter(')content(october)delimiter(')> operator(=)operator(>)integer(10)operator(,) string<delimiter(')content(november)delimiter(')> operator(=)operator(>)integer(11)operator(,) string<delimiter(')content(december)delimiter(')> operator(=)operator(>)integer(12) + operator(}) + + constant(DAYS) operator(=) operator({) + string<delimiter(')content(sunday)delimiter(')> operator(=)operator(>) integer(0)operator(,) string<delimiter(')content(monday)delimiter(')> operator(=)operator(>) integer(1)operator(,) string<delimiter(')content(tuesday)delimiter(')> operator(=)operator(>) integer(2)operator(,) string<delimiter(')content(wednesday)delimiter(')>operator(=)operator(>) integer(3)operator(,) + string<delimiter(')content(thursday)delimiter(')> operator(=)operator(>) integer(4)operator(,) string<delimiter(')content(friday)delimiter(')> operator(=)operator(>) integer(5)operator(,) string<delimiter(')content(saturday)delimiter(')> operator(=)operator(>) integer(6) + operator(}) + + constant(ABBR_MONTHS) operator(=) operator({) + string<delimiter(')content(jan)delimiter(')> operator(=)operator(>) integer(1)operator(,) string<delimiter(')content(feb)delimiter(')> operator(=)operator(>) integer(2)operator(,) string<delimiter(')content(mar)delimiter(')> operator(=)operator(>) integer(3)operator(,) string<delimiter(')content(apr)delimiter(')> operator(=)operator(>) integer(4)operator(,) + string<delimiter(')content(may)delimiter(')> operator(=)operator(>) integer(5)operator(,) string<delimiter(')content(jun)delimiter(')> operator(=)operator(>) integer(6)operator(,) string<delimiter(')content(jul)delimiter(')> operator(=)operator(>) integer(7)operator(,) string<delimiter(')content(aug)delimiter(')> operator(=)operator(>) integer(8)operator(,) + string<delimiter(')content(sep)delimiter(')> operator(=)operator(>) integer(9)operator(,) string<delimiter(')content(oct)delimiter(')> operator(=)operator(>)integer(10)operator(,) string<delimiter(')content(nov)delimiter(')> operator(=)operator(>)integer(11)operator(,) string<delimiter(')content(dec)delimiter(')> operator(=)operator(>)integer(12) + operator(}) + + constant(ABBR_DAYS) operator(=) operator({) + string<delimiter(')content(sun)delimiter(')> operator(=)operator(>) integer(0)operator(,) string<delimiter(')content(mon)delimiter(')> operator(=)operator(>) integer(1)operator(,) string<delimiter(')content(tue)delimiter(')> operator(=)operator(>) integer(2)operator(,) string<delimiter(')content(wed)delimiter(')> operator(=)operator(>) integer(3)operator(,) + string<delimiter(')content(thu)delimiter(')> operator(=)operator(>) integer(4)operator(,) string<delimiter(')content(fri)delimiter(')> operator(=)operator(>) integer(5)operator(,) string<delimiter(')content(sat)delimiter(')> operator(=)operator(>) integer(6) + operator(}) + + constant(ZONES) operator(=) operator({) + string<delimiter(')content(ut)delimiter(')> operator(=)operator(>) integer(0)operator(*)integer(3600)operator(,) string<delimiter(')content(gmt)delimiter(')> operator(=)operator(>) integer(0)operator(*)integer(3600)operator(,) string<delimiter(')content(est)delimiter(')> operator(=)operator(>) integer(-5)operator(*)integer(3600)operator(,) string<delimiter(')content(edt)delimiter(')> operator(=)operator(>) integer(-4)operator(*)integer(3600)operator(,) + string<delimiter(')content(cst)delimiter(')> operator(=)operator(>) integer(-6)operator(*)integer(3600)operator(,) string<delimiter(')content(cdt)delimiter(')> operator(=)operator(>) integer(-5)operator(*)integer(3600)operator(,) string<delimiter(')content(mst)delimiter(')> operator(=)operator(>) integer(-7)operator(*)integer(3600)operator(,) string<delimiter(')content(mdt)delimiter(')> operator(=)operator(>) integer(-6)operator(*)integer(3600)operator(,) + string<delimiter(')content(pst)delimiter(')> operator(=)operator(>) integer(-8)operator(*)integer(3600)operator(,) string<delimiter(')content(pdt)delimiter(')> operator(=)operator(>) integer(-7)operator(*)integer(3600)operator(,) + string<delimiter(')content(a)delimiter(')> operator(=)operator(>) integer(1)operator(*)integer(3600)operator(,) string<delimiter(')content(b)delimiter(')> operator(=)operator(>) integer(2)operator(*)integer(3600)operator(,) string<delimiter(')content(c)delimiter(')> operator(=)operator(>) integer(3)operator(*)integer(3600)operator(,) string<delimiter(')content(d)delimiter(')> operator(=)operator(>) integer(4)operator(*)integer(3600)operator(,) + string<delimiter(')content(e)delimiter(')> operator(=)operator(>) integer(5)operator(*)integer(3600)operator(,) string<delimiter(')content(f)delimiter(')> operator(=)operator(>) integer(6)operator(*)integer(3600)operator(,) string<delimiter(')content(g)delimiter(')> operator(=)operator(>) integer(7)operator(*)integer(3600)operator(,) string<delimiter(')content(h)delimiter(')> operator(=)operator(>) integer(8)operator(*)integer(3600)operator(,) + string<delimiter(')content(i)delimiter(')> operator(=)operator(>) integer(9)operator(*)integer(3600)operator(,) string<delimiter(')content(k)delimiter(')> operator(=)operator(>) integer(10)operator(*)integer(3600)operator(,) string<delimiter(')content(l)delimiter(')> operator(=)operator(>) integer(11)operator(*)integer(3600)operator(,) string<delimiter(')content(m)delimiter(')> operator(=)operator(>) integer(12)operator(*)integer(3600)operator(,) + string<delimiter(')content(n)delimiter(')> operator(=)operator(>) integer(-1)operator(*)integer(3600)operator(,) string<delimiter(')content(o)delimiter(')> operator(=)operator(>) integer(-2)operator(*)integer(3600)operator(,) string<delimiter(')content(p)delimiter(')> operator(=)operator(>) integer(-3)operator(*)integer(3600)operator(,) string<delimiter(')content(q)delimiter(')> operator(=)operator(>) integer(-4)operator(*)integer(3600)operator(,) + string<delimiter(')content(r)delimiter(')> operator(=)operator(>) integer(-5)operator(*)integer(3600)operator(,) string<delimiter(')content(s)delimiter(')> operator(=)operator(>) integer(-6)operator(*)integer(3600)operator(,) string<delimiter(')content(t)delimiter(')> operator(=)operator(>) integer(-7)operator(*)integer(3600)operator(,) string<delimiter(')content(u)delimiter(')> operator(=)operator(>) integer(-8)operator(*)integer(3600)operator(,) + string<delimiter(')content(v)delimiter(')> operator(=)operator(>) integer(-9)operator(*)integer(3600)operator(,) string<delimiter(')content(w)delimiter(')> operator(=)operator(>)integer(-10)operator(*)integer(3600)operator(,) string<delimiter(')content(x)delimiter(')> operator(=)operator(>)integer(-11)operator(*)integer(3600)operator(,) string<delimiter(')content(y)delimiter(')> operator(=)operator(>)integer(-12)operator(*)integer(3600)operator(,) + string<delimiter(')content(z)delimiter(')> operator(=)operator(>) integer(0)operator(*)integer(3600)operator(,) + string<delimiter(')content(utc)delimiter(')> operator(=)operator(>) integer(0)operator(*)integer(3600)operator(,) string<delimiter(')content(wet)delimiter(')> operator(=)operator(>) integer(0)operator(*)integer(3600)operator(,) string<delimiter(')content(bst)delimiter(')> operator(=)operator(>) integer(1)operator(*)integer(3600)operator(,) string<delimiter(')content(wat)delimiter(')> operator(=)operator(>) integer(-1)operator(*)integer(3600)operator(,) + string<delimiter(')content(at)delimiter(')> operator(=)operator(>) integer(-2)operator(*)integer(3600)operator(,) string<delimiter(')content(ast)delimiter(')> operator(=)operator(>) integer(-4)operator(*)integer(3600)operator(,) string<delimiter(')content(adt)delimiter(')> operator(=)operator(>) integer(-3)operator(*)integer(3600)operator(,) string<delimiter(')content(yst)delimiter(')> operator(=)operator(>) integer(-9)operator(*)integer(3600)operator(,) + string<delimiter(')content(ydt)delimiter(')> operator(=)operator(>) integer(-8)operator(*)integer(3600)operator(,) string<delimiter(')content(hst)delimiter(')> operator(=)operator(>)integer(-10)operator(*)integer(3600)operator(,) string<delimiter(')content(hdt)delimiter(')> operator(=)operator(>) integer(-9)operator(*)integer(3600)operator(,) string<delimiter(')content(cat)delimiter(')> operator(=)operator(>)integer(-10)operator(*)integer(3600)operator(,) + string<delimiter(')content(ahst)delimiter(')>operator(=)operator(>)integer(-10)operator(*)integer(3600)operator(,) string<delimiter(')content(nt)delimiter(')> operator(=)operator(>)integer(-11)operator(*)integer(3600)operator(,) string<delimiter(')content(idlw)delimiter(')>operator(=)operator(>)integer(-12)operator(*)integer(3600)operator(,) string<delimiter(')content(cet)delimiter(')> operator(=)operator(>) integer(1)operator(*)integer(3600)operator(,) + string<delimiter(')content(met)delimiter(')> operator(=)operator(>) integer(1)operator(*)integer(3600)operator(,) string<delimiter(')content(mewt)delimiter(')>operator(=)operator(>) integer(1)operator(*)integer(3600)operator(,) string<delimiter(')content(mest)delimiter(')>operator(=)operator(>) integer(2)operator(*)integer(3600)operator(,) string<delimiter(')content(mesz)delimiter(')>operator(=)operator(>) integer(2)operator(*)integer(3600)operator(,) + string<delimiter(')content(swt)delimiter(')> operator(=)operator(>) integer(1)operator(*)integer(3600)operator(,) string<delimiter(')content(sst)delimiter(')> operator(=)operator(>) integer(2)operator(*)integer(3600)operator(,) string<delimiter(')content(fwt)delimiter(')> operator(=)operator(>) integer(1)operator(*)integer(3600)operator(,) string<delimiter(')content(fst)delimiter(')> operator(=)operator(>) integer(2)operator(*)integer(3600)operator(,) + string<delimiter(')content(eet)delimiter(')> operator(=)operator(>) integer(2)operator(*)integer(3600)operator(,) string<delimiter(')content(bt)delimiter(')> operator(=)operator(>) integer(3)operator(*)integer(3600)operator(,) string<delimiter(')content(zp4)delimiter(')> operator(=)operator(>) integer(4)operator(*)integer(3600)operator(,) string<delimiter(')content(zp5)delimiter(')> operator(=)operator(>) integer(5)operator(*)integer(3600)operator(,) + string<delimiter(')content(zp6)delimiter(')> operator(=)operator(>) integer(6)operator(*)integer(3600)operator(,) string<delimiter(')content(wast)delimiter(')>operator(=)operator(>) integer(7)operator(*)integer(3600)operator(,) string<delimiter(')content(wadt)delimiter(')>operator(=)operator(>) integer(8)operator(*)integer(3600)operator(,) string<delimiter(')content(cct)delimiter(')> operator(=)operator(>) integer(8)operator(*)integer(3600)operator(,) + string<delimiter(')content(jst)delimiter(')> operator(=)operator(>) integer(9)operator(*)integer(3600)operator(,) string<delimiter(')content(east)delimiter(')>operator(=)operator(>) integer(10)operator(*)integer(3600)operator(,) string<delimiter(')content(eadt)delimiter(')>operator(=)operator(>) integer(11)operator(*)integer(3600)operator(,) string<delimiter(')content(gst)delimiter(')> operator(=)operator(>) integer(10)operator(*)integer(3600)operator(,) + string<delimiter(')content(nzt)delimiter(')> operator(=)operator(>) integer(12)operator(*)integer(3600)operator(,) string<delimiter(')content(nzst)delimiter(')>operator(=)operator(>) integer(12)operator(*)integer(3600)operator(,) string<delimiter(')content(nzdt)delimiter(')>operator(=)operator(>) integer(13)operator(*)integer(3600)operator(,) string<delimiter(')content(idle)delimiter(')>operator(=)operator(>) integer(12)operator(*)integer(3600) + operator(}) + + reserved(def) pre_constant(self)operator(.)ident(__strptime)operator(()ident(str)operator(,) ident(fmt)operator(,) ident(elem)operator(\)) + ident(fmt)operator(.)ident(scan)operator(()regexp<delimiter(/)content(%[EO]?.|.)delimiter(/)modifier(o)>operator(\)) reserved(do) operator(|)ident(c)operator(|) + ident(cc) operator(=) ident(c)operator(.)ident(sub)operator(()regexp<delimiter(/)char(\\A)content(%[EO]?(.\))char(\\Z)delimiter(/)modifier(o)>operator(,) string<delimiter(')content(%)char(\\\\)content(1)delimiter(')>operator(\)) + reserved(case) ident(cc) + reserved(when) regexp<delimiter(/)char(\\A)char(\\s)delimiter(/)modifier(o)> + ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(/)char(\\A)content([)char(\\s)char(\\v)content(]+)delimiter(/)modifier(o)>operator(,) string<delimiter(')delimiter(')>operator(\)) + reserved(when) string<delimiter(')content(%A)delimiter(')>operator(,) string<delimiter(')content(%a)delimiter(')> + reserved(return) reserved(unless) ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(/)char(\\A)content(([a-z]+\))char(\\b)delimiter(/)modifier(io)>operator(,) string<delimiter(')delimiter(')>operator(\)) + ident(val) operator(=) constant(DAYS)operator([)global_variable($1)operator(.)ident(downcase)operator(]) operator(||) constant(ABBR_DAYS)operator([)global_variable($1)operator(.)ident(downcase)operator(]) + reserved(return) reserved(unless) ident(val) + ident(elem)operator([)symbol(:wday)operator(]) operator(=) ident(val) + reserved(when) string<delimiter(')content(%B)delimiter(')>operator(,) string<delimiter(')content(%b)delimiter(')>operator(,) string<delimiter(')content(%h)delimiter(')> + reserved(return) reserved(unless) ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(/)char(\\A)content(([a-z]+\))char(\\b)delimiter(/)modifier(io)>operator(,) string<delimiter(')delimiter(')>operator(\)) + ident(val) operator(=) constant(MONTHS)operator([)global_variable($1)operator(.)ident(downcase)operator(]) operator(||) constant(ABBR_MONTHS)operator([)global_variable($1)operator(.)ident(downcase)operator(]) + reserved(return) reserved(unless) ident(val) + ident(elem)operator([)symbol(:mon)operator(]) operator(=) ident(val) + reserved(when) string<delimiter(')content(%C)delimiter(')> + reserved(return) reserved(unless) ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(/)char(\\A)content(()char(\\d)content(+\))delimiter(/)modifier(o)>operator(,) string<delimiter(')delimiter(')>operator(\)) + ident(val) operator(=) global_variable($1)operator(.)ident(to_i) + ident(elem)operator([)symbol(:cent)operator(]) operator(=) ident(val) + reserved(when) string<delimiter(')content(%c)delimiter(')> + reserved(return) reserved(unless) ident(__strptime)operator(()ident(str)operator(,) string<delimiter(')content(%a %b %e %H:%M:%S %Y)delimiter(')>operator(,) ident(elem)operator(\)) + reserved(when) string<delimiter(')content(%D)delimiter(')> + reserved(return) reserved(unless) ident(__strptime)operator(()ident(str)operator(,) string<delimiter(')content(%m/%d/%y)delimiter(')>operator(,) ident(elem)operator(\)) + reserved(when) string<delimiter(')content(%d)delimiter(')>operator(,) string<delimiter(')content(%e)delimiter(')> + reserved(return) reserved(unless) ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(/)char(\\A)content( ?()char(\\d)content(+\))delimiter(/)modifier(o)>operator(,) string<delimiter(')delimiter(')>operator(\)) + ident(val) operator(=) global_variable($1)operator(.)ident(to_i) + reserved(return) reserved(unless) operator(()integer(1)operator(..)integer(31)operator(\)) operator(===) ident(val) + ident(elem)operator([)symbol(:mday)operator(]) operator(=) ident(val) + reserved(when) string<delimiter(')content(%F)delimiter(')> + reserved(return) reserved(unless) ident(__strptime)operator(()ident(str)operator(,) string<delimiter(')content(%Y-%m-%d)delimiter(')>operator(,) ident(elem)operator(\)) + reserved(when) string<delimiter(')content(%G)delimiter(')> + reserved(return) reserved(unless) ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(/)char(\\A)content(([-+]?)char(\\d)content(+\))delimiter(/)modifier(o)>operator(,) string<delimiter(')delimiter(')>operator(\)) + ident(val) operator(=) global_variable($1)operator(.)ident(to_i) + ident(elem)operator([)symbol(:cwyear)operator(]) operator(=) ident(val) + reserved(when) string<delimiter(')content(%g)delimiter(')> + reserved(return) reserved(unless) ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(/)char(\\A)content(()char(\\d)content(+\))delimiter(/)modifier(o)>operator(,) string<delimiter(')delimiter(')>operator(\)) + ident(val) operator(=) global_variable($1)operator(.)ident(to_i) + reserved(return) reserved(unless) operator(()integer(0)operator(..)integer(99)operator(\)) operator(===) ident(val) + ident(elem)operator([)symbol(:cwyear)operator(]) operator(=) ident(val) + ident(elem)operator([)symbol(:cent)operator(]) operator(||=) reserved(if) ident(val) operator(>)operator(=) integer(69) reserved(then) integer(19) reserved(else) integer(20) reserved(end) + reserved(when) string<delimiter(')content(%H)delimiter(')>operator(,) string<delimiter(')content(%k)delimiter(')> + reserved(return) reserved(unless) ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(/)char(\\A)content( ?()char(\\d)content(+\))delimiter(/)modifier(o)>operator(,) string<delimiter(')delimiter(')>operator(\)) + ident(val) operator(=) global_variable($1)operator(.)ident(to_i) + reserved(return) reserved(unless) operator(()integer(0)operator(..)integer(24)operator(\)) operator(===) ident(val) + ident(elem)operator([)symbol(:hour)operator(]) operator(=) ident(val) + reserved(when) string<delimiter(')content(%I)delimiter(')>operator(,) string<delimiter(')content(%l)delimiter(')> + reserved(return) reserved(unless) ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(/)char(\\A)content( ?()char(\\d)content(+\))delimiter(/)modifier(o)>operator(,) string<delimiter(')delimiter(')>operator(\)) + ident(val) operator(=) global_variable($1)operator(.)ident(to_i) + reserved(return) reserved(unless) operator(()integer(1)operator(..)integer(12)operator(\)) operator(===) ident(val) + ident(elem)operator([)symbol(:hour)operator(]) operator(=) ident(val) + reserved(when) string<delimiter(')content(%j)delimiter(')> + reserved(return) reserved(unless) ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(/)char(\\A)content(()char(\\d)content(+\))delimiter(/)modifier(o)>operator(,) string<delimiter(')delimiter(')>operator(\)) + ident(val) operator(=) global_variable($1)operator(.)ident(to_i) + reserved(return) reserved(unless) operator(()integer(1)operator(..)integer(366)operator(\)) operator(===) ident(val) + ident(elem)operator([)symbol(:yday)operator(]) operator(=) ident(val) + reserved(when) string<delimiter(')content(%M)delimiter(')> + reserved(return) reserved(unless) ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(/)char(\\A)content(()char(\\d)content(+\))delimiter(/)modifier(o)>operator(,) string<delimiter(')delimiter(')>operator(\)) + ident(val) operator(=) global_variable($1)operator(.)ident(to_i) + reserved(return) reserved(unless) operator(()integer(0)operator(..)integer(59)operator(\)) operator(===) ident(val) + ident(elem)operator([)symbol(:min)operator(]) operator(=) ident(val) + reserved(when) string<delimiter(')content(%m)delimiter(')> + reserved(return) reserved(unless) ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(/)char(\\A)content(()char(\\d)content(+\))delimiter(/)modifier(o)>operator(,) string<delimiter(')delimiter(')>operator(\)) + ident(val) operator(=) global_variable($1)operator(.)ident(to_i) + reserved(return) reserved(unless) operator(()integer(1)operator(..)integer(12)operator(\)) operator(===) ident(val) + ident(elem)operator([)symbol(:mon)operator(]) operator(=) ident(val) + reserved(when) string<delimiter(')content(%n)delimiter(')> + reserved(return) reserved(unless) ident(__strptime)operator(()ident(str)operator(,) string<delimiter(')content( )delimiter(')>operator(,) ident(elem)operator(\)) + reserved(when) string<delimiter(')content(%p)delimiter(')>operator(,) string<delimiter(')content(%P)delimiter(')> + reserved(return) reserved(unless) ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(/)char(\\A)content(([ap]\)(?:m)char(\\b)content(|)char(\\.)content(m)char(\\.)content(\))delimiter(/)modifier(io)>operator(,) string<delimiter(')delimiter(')>operator(\)) + ident(elem)operator([)symbol(:merid)operator(]) operator(=) reserved(if) global_variable($1)operator(.)ident(downcase) operator(==) string<delimiter(')content(a)delimiter(')> reserved(then) integer(0) reserved(else) integer(12) reserved(end) + reserved(when) string<delimiter(')content(%R)delimiter(')> + reserved(return) reserved(unless) ident(__strptime)operator(()ident(str)operator(,) string<delimiter(')content(%H:%M)delimiter(')>operator(,) ident(elem)operator(\)) + reserved(when) string<delimiter(')content(%r)delimiter(')> + reserved(return) reserved(unless) ident(__strptime)operator(()ident(str)operator(,) string<delimiter(')content(%I:%M:%S %p)delimiter(')>operator(,) ident(elem)operator(\)) + reserved(when) string<delimiter(')content(%S)delimiter(')> + reserved(return) reserved(unless) ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(/)char(\\A)content(()char(\\d)content(+\))delimiter(/)modifier(o)>operator(,) string<delimiter(')delimiter(')>operator(\)) + ident(val) operator(=) global_variable($1)operator(.)ident(to_i) + reserved(return) reserved(unless) operator(()integer(0)operator(..)integer(60)operator(\)) operator(===) ident(val) + ident(elem)operator([)symbol(:sec)operator(]) operator(=) ident(val) + reserved(when) string<delimiter(')content(%s)delimiter(')> + reserved(return) reserved(unless) ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(/)char(\\A)content(()char(\\d)content(+\))delimiter(/)modifier(o)>operator(,) string<delimiter(')delimiter(')>operator(\)) + ident(val) operator(=) global_variable($1)operator(.)ident(to_i) + ident(elem)operator([)symbol(:seconds)operator(]) operator(=) ident(val) + reserved(when) string<delimiter(')content(%T)delimiter(')> + reserved(return) reserved(unless) ident(__strptime)operator(()ident(str)operator(,) string<delimiter(')content(%H:%M:%S)delimiter(')>operator(,) ident(elem)operator(\)) + reserved(when) string<delimiter(')content(%t)delimiter(')> + reserved(return) reserved(unless) ident(__strptime)operator(()ident(str)operator(,) string<delimiter(')content( )delimiter(')>operator(,) ident(elem)operator(\)) + reserved(when) string<delimiter(')content(%U)delimiter(')>operator(,) string<delimiter(')content(%W)delimiter(')> + reserved(return) reserved(unless) ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(/)char(\\A)content(()char(\\d)content(+\))delimiter(/)modifier(o)>operator(,) string<delimiter(')delimiter(')>operator(\)) + ident(val) operator(=) global_variable($1)operator(.)ident(to_i) + reserved(return) reserved(unless) operator(()integer(0)operator(..)integer(53)operator(\)) operator(===) ident(val) + ident(elem)operator([)reserved(if) ident(c) operator(==) string<delimiter(')content(%U)delimiter(')> reserved(then) symbol(:wnum0) reserved(else) symbol(:wnum1) reserved(end)operator(]) operator(=) ident(val) + reserved(when) string<delimiter(')content(%u)delimiter(')> + reserved(return) reserved(unless) ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(/)char(\\A)content(()char(\\d)content(+\))delimiter(/)modifier(o)>operator(,) string<delimiter(')delimiter(')>operator(\)) + ident(val) operator(=) global_variable($1)operator(.)ident(to_i) + reserved(return) reserved(unless) operator(()integer(1)operator(..)integer(7)operator(\)) operator(===) ident(val) + ident(elem)operator([)symbol(:cwday)operator(]) operator(=) ident(val) + reserved(when) string<delimiter(')content(%V)delimiter(')> + reserved(return) reserved(unless) ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(/)char(\\A)content(()char(\\d)content(+\))delimiter(/)modifier(o)>operator(,) string<delimiter(')delimiter(')>operator(\)) + ident(val) operator(=) global_variable($1)operator(.)ident(to_i) + reserved(return) reserved(unless) operator(()integer(1)operator(..)integer(53)operator(\)) operator(===) ident(val) + ident(elem)operator([)symbol(:cweek)operator(]) operator(=) ident(val) + reserved(when) string<delimiter(')content(%v)delimiter(')> + reserved(return) reserved(unless) ident(__strptime)operator(()ident(str)operator(,) string<delimiter(')content(%e-%b-%Y)delimiter(')>operator(,) ident(elem)operator(\)) + reserved(when) string<delimiter(')content(%w)delimiter(')> + reserved(return) reserved(unless) ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(/)char(\\A)content(()char(\\d)content(+\))delimiter(/)modifier(o)>operator(,) string<delimiter(')delimiter(')>operator(\)) + ident(val) operator(=) global_variable($1)operator(.)ident(to_i) + reserved(return) reserved(unless) operator(()integer(0)operator(..)integer(6)operator(\)) operator(===) ident(val) + ident(elem)operator([)symbol(:wday)operator(]) operator(=) ident(val) + reserved(when) string<delimiter(')content(%X)delimiter(')> + reserved(return) reserved(unless) ident(__strptime)operator(()ident(str)operator(,) string<delimiter(')content(%H:%M:%S)delimiter(')>operator(,) ident(elem)operator(\)) + reserved(when) string<delimiter(')content(%x)delimiter(')> + reserved(return) reserved(unless) ident(__strptime)operator(()ident(str)operator(,) string<delimiter(')content(%m/%d/%y)delimiter(')>operator(,) ident(elem)operator(\)) + reserved(when) string<delimiter(')content(%Y)delimiter(')> + reserved(return) reserved(unless) ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(/)char(\\A)content(([-+]?)char(\\d)content(+\))delimiter(/)modifier(o)>operator(,) string<delimiter(')delimiter(')>operator(\)) + ident(val) operator(=) global_variable($1)operator(.)ident(to_i) + ident(elem)operator([)symbol(:year)operator(]) operator(=) ident(val) + reserved(when) string<delimiter(')content(%y)delimiter(')> + reserved(return) reserved(unless) ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(/)char(\\A)content(()char(\\d)content(+\))delimiter(/)modifier(o)>operator(,) string<delimiter(')delimiter(')>operator(\)) + ident(val) operator(=) global_variable($1)operator(.)ident(to_i) + reserved(return) reserved(unless) operator(()integer(0)operator(..)integer(99)operator(\)) operator(===) ident(val) + ident(elem)operator([)symbol(:year)operator(]) operator(=) ident(val) + ident(elem)operator([)symbol(:cent)operator(]) operator(||=) reserved(if) ident(val) operator(>)operator(=) integer(69) reserved(then) integer(19) reserved(else) integer(20) reserved(end) + reserved(when) string<delimiter(')content(%Z)delimiter(')>operator(,) string<delimiter(')content(%z)delimiter(')> + reserved(return) reserved(unless) ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(/)char(\\A)content(([-+:a-z0-9]+(?:)char(\\s)content(+dst)char(\\b)content(\)?\))delimiter(/)modifier(io)>operator(,) string<delimiter(')delimiter(')>operator(\)) + ident(val) operator(=) global_variable($1) + ident(elem)operator([)symbol(:zone)operator(]) operator(=) ident(val) + ident(offset) operator(=) ident(zone_to_diff)operator(()ident(val)operator(\)) + ident(elem)operator([)symbol(:offset)operator(]) operator(=) ident(offset) + reserved(when) string<delimiter(')content(%%)delimiter(')> + reserved(return) reserved(unless) ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(/)char(\\A)content(%)delimiter(/)modifier(o)>operator(,) string<delimiter(')delimiter(')>operator(\)) + reserved(when) string<delimiter(')content(%+)delimiter(')> + reserved(return) reserved(unless) ident(__strptime)operator(()ident(str)operator(,) string<delimiter(')content(%a %b %e %H:%M:%S %Z %Y)delimiter(')>operator(,) ident(elem)operator(\)) +comment(=begin + when '%.' + return unless str.sub!(/\\A(\\d+\)/o, ''\) + val = $1.to_i.to_r / (10**$1.size\) + elem[:sec_fraction] = val +=end) + reserved(when) string<delimiter(')content(%1)delimiter(')> + reserved(return) reserved(unless) ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(/)char(\\A)content(()char(\\d)content(+\))delimiter(/)modifier(o)>operator(,) string<delimiter(')delimiter(')>operator(\)) + ident(val) operator(=) global_variable($1)operator(.)ident(to_i) + ident(elem)operator([)symbol(:jd)operator(]) operator(=) ident(val) + reserved(when) string<delimiter(')content(%2)delimiter(')> + reserved(return) reserved(unless) ident(__strptime)operator(()ident(str)operator(,) string<delimiter(')content(%Y-%j)delimiter(')>operator(,) ident(elem)operator(\)) + reserved(when) string<delimiter(')content(%3)delimiter(')> + reserved(return) reserved(unless) ident(__strptime)operator(()ident(str)operator(,) string<delimiter(')content(%F)delimiter(')>operator(,) ident(elem)operator(\)) + reserved(else) + reserved(return) reserved(unless) ident(str)operator(.)ident(sub!)operator(()constant(Regexp)operator(.)ident(new)operator(()string<delimiter(')char(\\\\)content(A)delimiter(')> operator(+) constant(Regexp)operator(.)ident(quote)operator(()ident(c)operator(\))operator(\))operator(,) string<delimiter(')delimiter(')>operator(\)) + reserved(end) + reserved(end) + + reserved(if) ident(cent) operator(=) ident(elem)operator(.)ident(delete)operator(()symbol(:cent)operator(\)) + reserved(if) ident(elem)operator([)symbol(:cwyear)operator(]) + ident(elem)operator([)symbol(:cwyear)operator(]) operator(+=) ident(cent) operator(*) integer(100) + reserved(end) + reserved(if) ident(elem)operator([)symbol(:year)operator(]) + ident(elem)operator([)symbol(:year)operator(]) operator(+=) ident(cent) operator(*) integer(100) + reserved(end) + reserved(end) + + reserved(if) ident(merid) operator(=) ident(elem)operator(.)ident(delete)operator(()symbol(:merid)operator(\)) + reserved(if) ident(elem)operator([)symbol(:hour)operator(]) + ident(elem)operator([)symbol(:hour)operator(]) operator(%=) integer(12) + ident(elem)operator([)symbol(:hour)operator(]) operator(+=) ident(merid) + reserved(end) + reserved(end) + + ident(str) + reserved(end) + + ident(private_class_method) symbol(:__strptime) + + reserved(def) pre_constant(self)operator(.)ident(_strptime)operator(()ident(str)operator(,) ident(fmt)operator(=)string<delimiter(')content(%F)delimiter(')>operator(\)) + ident(elem) operator(=) operator({)operator(}) + ident(elem) reserved(if) ident(__strptime)operator(()ident(str)operator(.)ident(dup)operator(,) ident(fmt)operator(,) ident(elem)operator(\)) + reserved(end) + + constant(PARSE_MONTHPAT) operator(=) constant(ABBR_MONTHS)operator(.)ident(keys)operator(.)ident(join)operator(()string<delimiter(')content(|)delimiter(')>operator(\)) + constant(PARSE_DAYPAT) operator(=) constant(ABBR_DAYS)operator(.) ident(keys)operator(.)ident(join)operator(()string<delimiter(')content(|)delimiter(')>operator(\)) + + reserved(def) pre_constant(self)operator(.)ident(_parse)operator(()ident(str)operator(,) ident(comp)operator(=)pre_constant(false)operator(\)) + ident(str) operator(=) ident(str)operator(.)ident(dup) + + ident(str)operator(.)ident(gsub!)operator(()regexp<delimiter(/)content([^-+,.)char(\\/)content(:0-9a-z]+)delimiter(/)modifier(ino)>operator(,) string<delimiter(')content( )delimiter(')>operator(\)) + + comment(# day) + reserved(if) ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(/)content(()inline<delimiter(#{)constant(PARSE_DAYPAT)delimiter(})>content(\))char(\\S)content(*)delimiter(/)modifier(ino)>operator(,) string<delimiter(')content( )delimiter(')>operator(\)) + ident(wday) operator(=) constant(ABBR_DAYS)operator([)global_variable($1)operator(.)ident(downcase)operator(]) + reserved(end) + + comment(# time) + reserved(if) ident(str)operator(.)ident(sub!)operator(() + regexp<delimiter(/)content(()char(\\d)content(+\):()char(\\d)content(+\) + (?: + :()char(\\d)content(+\)(?:[,.]()char(\\d)content(*\)\)? + \)? + (?: + )char(\\s)content(* + ([ap]\)(?:m)char(\\b)content(|)char(\\.)content(m)char(\\.)content(\) + \)? + (?: + )char(\\s)content(* + ( + [a-z]+(?:)char(\\s)content(+dst\)?)char(\\b)content( + | + [-+])char(\\d)content(+(?::?)char(\\d)content(+\) + \) + \)? + )delimiter(/)modifier(inox)>operator(,) + string<delimiter(')content( )delimiter(')>operator(\)) + ident(hour) operator(=) global_variable($1)operator(.)ident(to_i) + ident(min) operator(=) global_variable($2)operator(.)ident(to_i) + ident(sec) operator(=) global_variable($3)operator(.)ident(to_i) reserved(if) global_variable($3) + reserved(if) global_variable($4) + ident(sec_fraction) operator(=) global_variable($4)operator(.)ident(to_i)operator(.)ident(to_r) operator(/) operator(()integer(10)operator(**)global_variable($4)operator(.)ident(size)operator(\)) + reserved(end) + + reserved(if) global_variable($5) + ident(hour) operator(%=) integer(12) + reserved(if) global_variable($5)operator(.)ident(downcase) operator(==) string<delimiter(')content(p)delimiter(')> + ident(hour) operator(+=) integer(12) + reserved(end) + reserved(end) + + reserved(if) global_variable($6) + ident(zone) operator(=) global_variable($6) + reserved(end) + reserved(end) + + comment(# eu) + reserved(if) ident(str)operator(.)ident(sub!)operator(() + regexp<delimiter(/)content(()char(\\d)content(+\))char(\\S)content(* + )char(\\s)content(+ + ()inline<delimiter(#{)constant(PARSE_MONTHPAT)delimiter(})>content(\))char(\\S)content(* + (?: + )char(\\s)content(+ + (-?)char(\\d)content(+\) + \)? + )delimiter(/)modifier(inox)>operator(,) + string<delimiter(')content( )delimiter(')>operator(\)) + ident(mday) operator(=) global_variable($1)operator(.)ident(to_i) + ident(mon) operator(=) constant(ABBR_MONTHS)operator([)global_variable($2)operator(.)ident(downcase)operator(]) + + reserved(if) global_variable($3) + ident(year) operator(=) global_variable($3)operator(.)ident(to_i) + reserved(if) global_variable($3)operator(.)ident(size) operator(>) integer(2) + ident(comp) operator(=) pre_constant(false) + reserved(end) + reserved(end) + + comment(# us) + reserved(elsif) ident(str)operator(.)ident(sub!)operator(() + regexp<delimiter(/)content(()inline<delimiter(#{)constant(PARSE_MONTHPAT)delimiter(})>content(\))char(\\S)content(* + )char(\\s)content(+ + ()char(\\d)content(+\))char(\\S)content(* + (?: + )char(\\s)content(+ + (-?)char(\\d)content(+\) + \)? + )delimiter(/)modifier(inox)>operator(,) + string<delimiter(')content( )delimiter(')>operator(\)) + ident(mon) operator(=) constant(ABBR_MONTHS)operator([)global_variable($1)operator(.)ident(downcase)operator(]) + ident(mday) operator(=) global_variable($2)operator(.)ident(to_i) + + reserved(if) global_variable($3) + ident(year) operator(=) global_variable($3)operator(.)ident(to_i) + reserved(if) global_variable($3)operator(.)ident(size) operator(>) integer(2) + ident(comp) operator(=) pre_constant(false) + reserved(end) + reserved(end) + + comment(# iso) + reserved(elsif) ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(/)content(([-+]?)char(\\d)content(+\)-()char(\\d)content(+\)-(-?)char(\\d)content(+\))delimiter(/)modifier(no)>operator(,) string<delimiter(')content( )delimiter(')>operator(\)) + ident(year) operator(=) global_variable($1)operator(.)ident(to_i) + ident(mon) operator(=) global_variable($2)operator(.)ident(to_i) + ident(mday) operator(=) global_variable($3)operator(.)ident(to_i) + + reserved(if) global_variable($1)operator(.)ident(size) operator(>) integer(2) + ident(comp) operator(=) pre_constant(false) + reserved(elsif) global_variable($3)operator(.)ident(size) operator(>) integer(2) + ident(comp) operator(=) pre_constant(false) + ident(mday)operator(,) ident(mon)operator(,) ident(year) operator(=) ident(year)operator(,) ident(mon)operator(,) ident(mday) + reserved(end) + + comment(# jis) + reserved(elsif) ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(/)content(([MTSH]\)()char(\\d)content(+\))char(\\.)content(()char(\\d)content(+\))char(\\.)content(()char(\\d)content(+\))delimiter(/)modifier(ino)>operator(,) string<delimiter(')content( )delimiter(')>operator(\)) + ident(e) operator(=) operator({) string<delimiter(')content(m)delimiter(')>operator(=)operator(>)integer(1867)operator(,) + string<delimiter(')content(t)delimiter(')>operator(=)operator(>)integer(1911)operator(,) + string<delimiter(')content(s)delimiter(')>operator(=)operator(>)integer(1925)operator(,) + string<delimiter(')content(h)delimiter(')>operator(=)operator(>)integer(1988) + operator(})operator([)global_variable($1)operator(.)ident(downcase)operator(]) + ident(year) operator(=) global_variable($2)operator(.)ident(to_i) operator(+) ident(e) + ident(mon) operator(=) global_variable($3)operator(.)ident(to_i) + ident(mday) operator(=) global_variable($4)operator(.)ident(to_i) + + comment(# vms) + reserved(elsif) ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(/)content((-?)char(\\d)content(+\)-()inline<delimiter(#{)constant(PARSE_MONTHPAT)delimiter(})>content(\)[^-]*-(-?)char(\\d)content(+\))delimiter(/)modifier(ino)>operator(,) string<delimiter(')content( )delimiter(')>operator(\)) + ident(mday) operator(=) global_variable($1)operator(.)ident(to_i) + ident(mon) operator(=) constant(ABBR_MONTHS)operator([)global_variable($2)operator(.)ident(downcase)operator(]) + ident(year) operator(=) global_variable($3)operator(.)ident(to_i) + + reserved(if) global_variable($1)operator(.)ident(size) operator(>) integer(2) + ident(comp) operator(=) pre_constant(false) + ident(year)operator(,) ident(mon)operator(,) ident(mday) operator(=) ident(mday)operator(,) ident(mon)operator(,) ident(year) + reserved(elsif) global_variable($3)operator(.)ident(size) operator(>) integer(2) + ident(comp) operator(=) pre_constant(false) + reserved(end) + + comment(# sla) + reserved(elsif) ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(%r|)content((-?)char(\\d)content(+\)/()char(\\d)content(+\)(?:/(-?)char(\\d)content(+\)\)?)delimiter(|)modifier(no)>operator(,) string<delimiter(')content( )delimiter(')>operator(\)) + ident(mon) operator(=) global_variable($1)operator(.)ident(to_i) + ident(mday) operator(=) global_variable($2)operator(.)ident(to_i) + + reserved(if) global_variable($3) + ident(year) operator(=) global_variable($3)operator(.)ident(to_i) + reserved(if) global_variable($3)operator(.)ident(size) operator(>) integer(2) + ident(comp) operator(=) pre_constant(false) + reserved(end) + reserved(end) + + reserved(if) global_variable($3) operator(&&) global_variable($1)operator(.)ident(size) operator(>) integer(2) + ident(comp) operator(=) pre_constant(false) + ident(year)operator(,) ident(mon)operator(,) ident(mday) operator(=) ident(mon)operator(,) ident(mday)operator(,) ident(year) + reserved(end) + + comment(# ddd) + reserved(elsif) ident(str)operator(.)ident(sub!)operator(() + regexp<delimiter(/)content(([-+]?\)()char(\\d)content({4,14}\) + (?: + )char(\\s)content(* + T? + )char(\\s)content(* + ()char(\\d)content({2,6}\)(?:[,.]()char(\\d)content(*\)\)? + \)? + (?: + )char(\\s)content(* + ( + Z + | + [-+])char(\\d)content({2,4} + \) + )char(\\b)content( + \)? + )delimiter(/)modifier(inox)>operator(,) + string<delimiter(')content( )delimiter(')>operator(\)) + reserved(case) global_variable($2)operator(.)ident(size) + reserved(when) integer(4) + ident(mon) operator(=) global_variable($2)operator([) integer(0)operator(,) integer(2)operator(])operator(.)ident(to_i) + ident(mday) operator(=) global_variable($2)operator([) integer(2)operator(,) integer(2)operator(])operator(.)ident(to_i) + reserved(when) integer(6) + ident(year) operator(=) operator(()global_variable($1) operator(+) global_variable($2)operator([) integer(0)operator(,) integer(2)operator(])operator(\))operator(.)ident(to_i) + ident(mon) operator(=) global_variable($2)operator([) integer(2)operator(,) integer(2)operator(])operator(.)ident(to_i) + ident(mday) operator(=) global_variable($2)operator([) integer(4)operator(,) integer(2)operator(])operator(.)ident(to_i) + reserved(when) integer(8)operator(,) integer(10)operator(,) integer(12)operator(,) integer(14) + ident(year) operator(=) operator(()global_variable($1) operator(+) global_variable($2)operator([) integer(0)operator(,) integer(4)operator(])operator(\))operator(.)ident(to_i) + ident(mon) operator(=) global_variable($2)operator([) integer(4)operator(,) integer(2)operator(])operator(.)ident(to_i) + ident(mday) operator(=) global_variable($2)operator([) integer(6)operator(,) integer(2)operator(])operator(.)ident(to_i) + ident(hour) operator(=) global_variable($2)operator([) integer(8)operator(,) integer(2)operator(])operator(.)ident(to_i) reserved(if) global_variable($2)operator(.)ident(size) operator(>)operator(=) integer(10) + ident(min) operator(=) global_variable($2)operator([)integer(10)operator(,) integer(2)operator(])operator(.)ident(to_i) reserved(if) global_variable($2)operator(.)ident(size) operator(>)operator(=) integer(12) + ident(sec) operator(=) global_variable($2)operator([)integer(12)operator(,) integer(2)operator(])operator(.)ident(to_i) reserved(if) global_variable($2)operator(.)ident(size) operator(>)operator(=) integer(14) + ident(comp) operator(=) pre_constant(false) + reserved(end) + reserved(if) global_variable($3) + reserved(case) global_variable($3)operator(.)ident(size) + reserved(when) integer(2)operator(,) integer(4)operator(,) integer(6) + ident(hour) operator(=) global_variable($3)operator([) integer(0)operator(,) integer(2)operator(])operator(.)ident(to_i) + ident(min) operator(=) global_variable($3)operator([) integer(2)operator(,) integer(2)operator(])operator(.)ident(to_i) reserved(if) global_variable($3)operator(.)ident(size) operator(>)operator(=) integer(4) + ident(sec) operator(=) global_variable($3)operator([) integer(4)operator(,) integer(2)operator(])operator(.)ident(to_i) reserved(if) global_variable($3)operator(.)ident(size) operator(>)operator(=) integer(6) + reserved(end) + reserved(end) + reserved(if) global_variable($4) + ident(sec_fraction) operator(=) global_variable($4)operator(.)ident(to_i)operator(.)ident(to_r) operator(/) operator(()integer(10)operator(**)global_variable($4)operator(.)ident(size)operator(\)) + reserved(end) + reserved(if) global_variable($5) + ident(zone) operator(=) global_variable($5) + reserved(end) + reserved(end) + + reserved(if) ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(/)char(\\b)content((bc)char(\\b)content(|bce)char(\\b)content(|b)char(\\.)content(c)char(\\.)content(|b)char(\\.)content(c)char(\\.)content(e)char(\\.)content(\))delimiter(/)modifier(ino)>operator(,) string<delimiter(')content( )delimiter(')>operator(\)) + reserved(if) ident(year) + ident(year) operator(=) operator(-)ident(year) operator(+) integer(1) + reserved(end) + reserved(end) + + reserved(if) ident(comp) reserved(and) ident(year) + reserved(if) ident(year) operator(>)operator(=) integer(0) reserved(and) ident(year) operator(<=) integer(99) + reserved(if) ident(year) operator(>)operator(=) integer(69) + ident(year) operator(+=) integer(1900) + reserved(else) + ident(year) operator(+=) integer(2000) + reserved(end) + reserved(end) + reserved(end) + + ident(elem) operator(=) operator({)operator(}) + ident(elem)operator([)symbol(:year)operator(]) operator(=) ident(year) reserved(if) ident(year) + ident(elem)operator([)symbol(:mon)operator(]) operator(=) ident(mon) reserved(if) ident(mon) + ident(elem)operator([)symbol(:mday)operator(]) operator(=) ident(mday) reserved(if) ident(mday) + ident(elem)operator([)symbol(:hour)operator(]) operator(=) ident(hour) reserved(if) ident(hour) + ident(elem)operator([)symbol(:min)operator(]) operator(=) ident(min) reserved(if) ident(min) + ident(elem)operator([)symbol(:sec)operator(]) operator(=) ident(sec) reserved(if) ident(sec) + ident(elem)operator([)symbol(:sec_fraction)operator(]) operator(=) ident(sec_fraction) reserved(if) ident(sec_fraction) + ident(elem)operator([)symbol(:zone)operator(]) operator(=) ident(zone) reserved(if) ident(zone) + ident(offset) operator(=) ident(zone_to_diff)operator(()ident(zone)operator(\)) reserved(if) ident(zone) + ident(elem)operator([)symbol(:offset)operator(]) operator(=) ident(offset) reserved(if) ident(offset) + ident(elem)operator([)symbol(:wday)operator(]) operator(=) ident(wday) reserved(if) ident(wday) + ident(elem) + reserved(end) + + reserved(def) pre_constant(self)operator(.)ident(zone_to_diff)operator(()ident(str)operator(\)) + ident(abb)operator(,) ident(dst) operator(=) ident(str)operator(.)ident(downcase)operator(.)ident(split)operator(()regexp<delimiter(/)char(\\s)content(+)delimiter(/)modifier(o)>operator(,) integer(2)operator(\)) + reserved(if) constant(ZONES)operator(.)ident(include?)operator(()ident(abb)operator(\)) + ident(offset) operator(=) constant(ZONES)operator([)ident(abb)operator(]) + ident(offset) operator(+=) integer(3600) reserved(if) ident(dst) + reserved(elsif) regexp<delimiter(/)char(\\A)content(([-+]\)()char(\\d)content({2}\):?()char(\\d)content({2}\)?)char(\\Z)delimiter(/)modifier(no)> operator(=)operator(~) ident(str) + ident(offset) operator(=) global_variable($2)operator(.)ident(to_i) operator(*) integer(3600) operator(+) global_variable($3)operator(.)ident(to_i) operator(*) integer(60) + ident(offset) operator(*=) integer(-1) reserved(if) global_variable($1) operator(==) string<delimiter(')content(-)delimiter(')> + reserved(end) + ident(offset) + reserved(end) + + reserved(def) method(strftime)operator(()ident(fmt)operator(=)string<delimiter(')content(%F)delimiter(')>operator(\)) + ident(o) operator(=) string<delimiter(')delimiter(')> + ident(fmt)operator(.)ident(scan)operator(()regexp<delimiter(/)content(%[EO]?.|.)delimiter(/)modifier(o)>operator(\)) reserved(do) operator(|)ident(c)operator(|) + ident(cc) operator(=) ident(c)operator(.)ident(sub)operator(()regexp<delimiter(/)content(^%[EO]?(.\)$)delimiter(/)modifier(o)>operator(,) string<delimiter(')content(%)char(\\\\)content(1)delimiter(')>operator(\)) + reserved(case) ident(cc) + reserved(when) string<delimiter(')content(%A)delimiter(')>operator(;) ident(o) operator(<<) constant(DAYNAMES)operator([)ident(wday)operator(]) + reserved(when) string<delimiter(')content(%a)delimiter(')>operator(;) ident(o) operator(<<) constant(ABBR_DAYNAMES)operator([)ident(wday)operator(]) + reserved(when) string<delimiter(')content(%B)delimiter(')>operator(;) ident(o) operator(<<) constant(MONTHNAMES)operator([)ident(mon)operator(]) + reserved(when) string<delimiter(')content(%b)delimiter(')>operator(;) ident(o) operator(<<) constant(ABBR_MONTHNAMES)operator([)ident(mon)operator(]) + reserved(when) string<delimiter(')content(%C)delimiter(')>operator(;) ident(o) operator(<<) string<delimiter(')content(%02d)delimiter(')> operator(%) operator(()ident(year) operator(/) float(100.0)operator(\))operator(.)ident(floor) comment(# P2,ID) + reserved(when) string<delimiter(')content(%c)delimiter(')>operator(;) ident(o) operator(<<) ident(strftime)operator(()string<delimiter(')content(%a %b %e %H:%M:%S %Y)delimiter(')>operator(\)) + reserved(when) string<delimiter(')content(%D)delimiter(')>operator(;) ident(o) operator(<<) ident(strftime)operator(()string<delimiter(')content(%m/%d/%y)delimiter(')>operator(\)) comment(# P2,ID) + reserved(when) string<delimiter(')content(%d)delimiter(')>operator(;) ident(o) operator(<<) string<delimiter(')content(%02d)delimiter(')> operator(%) ident(mday) + reserved(when) string<delimiter(')content(%e)delimiter(')>operator(;) ident(o) operator(<<) string<delimiter(')content(%2d)delimiter(')> operator(%) ident(mday) + reserved(when) string<delimiter(')content(%F)delimiter(')>operator(;) ident(o) operator(<<) ident(strftime)operator(()string<delimiter(')content(%Y-%m-%d)delimiter(')>operator(\)) comment(# ID) + reserved(when) string<delimiter(')content(%G)delimiter(')>operator(;) ident(o) operator(<<) string<delimiter(')content(%.4d)delimiter(')> operator(%) ident(cwyear) comment(# ID) + reserved(when) string<delimiter(')content(%g)delimiter(')>operator(;) ident(o) operator(<<) string<delimiter(')content(%02d)delimiter(')> operator(%) operator(()ident(cwyear) operator(%) integer(100)operator(\)) comment(# ID) + reserved(when) string<delimiter(')content(%H)delimiter(')>operator(;) ident(o) operator(<<) string<delimiter(')content(%02d)delimiter(')> operator(%) ident(hour) + reserved(when) string<delimiter(')content(%h)delimiter(')>operator(;) ident(o) operator(<<) ident(strftime)operator(()string<delimiter(')content(%b)delimiter(')>operator(\)) comment(# P2,ID) + reserved(when) string<delimiter(')content(%I)delimiter(')>operator(;) ident(o) operator(<<) string<delimiter(')content(%02d)delimiter(')> operator(%) operator(()operator(()ident(hour) operator(%) integer(12)operator(\))operator(.)ident(nonzero?) reserved(or) integer(12)operator(\)) + reserved(when) string<delimiter(')content(%j)delimiter(')>operator(;) ident(o) operator(<<) string<delimiter(')content(%03d)delimiter(')> operator(%) ident(yday) + reserved(when) string<delimiter(')content(%k)delimiter(')>operator(;) ident(o) operator(<<) string<delimiter(')content(%2d)delimiter(')> operator(%) ident(hour) comment(# AR,TZ,GL) + reserved(when) string<delimiter(')content(%l)delimiter(')>operator(;) ident(o) operator(<<) string<delimiter(')content(%2d)delimiter(')> operator(%) operator(()operator(()ident(hour) operator(%) integer(12)operator(\))operator(.)ident(nonzero?) reserved(or) integer(12)operator(\)) comment(# AR,TZ,GL) + reserved(when) string<delimiter(')content(%M)delimiter(')>operator(;) ident(o) operator(<<) string<delimiter(')content(%02d)delimiter(')> operator(%) ident(min) + reserved(when) string<delimiter(')content(%m)delimiter(')>operator(;) ident(o) operator(<<) string<delimiter(')content(%02d)delimiter(')> operator(%) ident(mon) + reserved(when) string<delimiter(')content(%n)delimiter(')>operator(;) ident(o) operator(<<) string<delimiter(")char(\\n)delimiter(")> comment(# P2,ID) + reserved(when) string<delimiter(')content(%P)delimiter(')>operator(;) ident(o) operator(<<) reserved(if) ident(hour) operator(<) integer(12) reserved(then) string<delimiter(')content(am)delimiter(')> reserved(else) string<delimiter(')content(pm)delimiter(')> reserved(end) comment(# GL) + reserved(when) string<delimiter(')content(%p)delimiter(')>operator(;) ident(o) operator(<<) reserved(if) ident(hour) operator(<) integer(12) reserved(then) string<delimiter(')content(AM)delimiter(')> reserved(else) string<delimiter(')content(PM)delimiter(')> reserved(end) + reserved(when) string<delimiter(')content(%R)delimiter(')>operator(;) ident(o) operator(<<) ident(strftime)operator(()string<delimiter(')content(%H:%M)delimiter(')>operator(\)) comment(# ID) + reserved(when) string<delimiter(')content(%r)delimiter(')>operator(;) ident(o) operator(<<) ident(strftime)operator(()string<delimiter(')content(%I:%M:%S %p)delimiter(')>operator(\)) comment(# P2,ID) + reserved(when) string<delimiter(')content(%S)delimiter(')>operator(;) ident(o) operator(<<) string<delimiter(')content(%02d)delimiter(')> operator(%) ident(sec) + reserved(when) string<delimiter(')content(%s)delimiter(')> comment(# TZ,GL) + ident(d) operator(=) ident(ajd) operator(-) pre_constant(self)operator(.)ident(class)operator(.)ident(jd_to_ajd)operator(()pre_constant(self)operator(.)ident(class)operator(.)ident(civil_to_jd)operator(()integer(1970)operator(,)integer(1)operator(,)integer(1)operator(\))operator(,) integer(0)operator(\)) + ident(s) operator(=) operator(()ident(d) operator(*) integer(86400)operator(\))operator(.)ident(to_i) + ident(o) operator(<<) string<delimiter(')content(%d)delimiter(')> operator(%) ident(s) + reserved(when) string<delimiter(')content(%T)delimiter(')>operator(;) ident(o) operator(<<) ident(strftime)operator(()string<delimiter(')content(%H:%M:%S)delimiter(')>operator(\)) comment(# P2,ID) + reserved(when) string<delimiter(')content(%t)delimiter(')>operator(;) ident(o) operator(<<) string<delimiter(")char(\\t)delimiter(")> comment(# P2,ID) + reserved(when) string<delimiter(')content(%U)delimiter(')>operator(,) string<delimiter(')content(%W)delimiter(')> + ident(a) operator(=) pre_constant(self)operator(.)ident(class)operator(.)ident(civil_to_jd)operator(()ident(year)operator(,) integer(1)operator(,) integer(1)operator(,) ident(ns?)operator(\)) operator(+) integer(6) + ident(k) operator(=) reserved(if) ident(c) operator(==) string<delimiter(')content(%U)delimiter(')> reserved(then) integer(0) reserved(else) integer(1) reserved(end) + ident(w) operator(=) operator(()ident(jd) operator(-) operator(()ident(a) operator(-) operator(()operator(()ident(a) operator(-) ident(k)operator(\)) operator(+) integer(1)operator(\)) operator(%) integer(7)operator(\)) operator(+) integer(7)operator(\)) operator(/) integer(7) + ident(o) operator(<<) string<delimiter(')content(%02d)delimiter(')> operator(%) ident(w) + reserved(when) string<delimiter(')content(%u)delimiter(')>operator(;) ident(o) operator(<<) string<delimiter(')content(%d)delimiter(')> operator(%) ident(cwday) comment(# P2,ID) + reserved(when) string<delimiter(')content(%V)delimiter(')>operator(;) ident(o) operator(<<) string<delimiter(')content(%02d)delimiter(')> operator(%) ident(cweek) comment(# P2,ID) + reserved(when) string<delimiter(')content(%v)delimiter(')>operator(;) ident(o) operator(<<) ident(strftime)operator(()string<delimiter(')content(%e-%b-%Y)delimiter(')>operator(\)) comment(# AR,TZ) + reserved(when) string<delimiter(')content(%w)delimiter(')>operator(;) ident(o) operator(<<) string<delimiter(')content(%d)delimiter(')> operator(%) ident(wday) + reserved(when) string<delimiter(')content(%X)delimiter(')>operator(;) ident(o) operator(<<) ident(strftime)operator(()string<delimiter(')content(%H:%M:%S)delimiter(')>operator(\)) + reserved(when) string<delimiter(')content(%x)delimiter(')>operator(;) ident(o) operator(<<) ident(strftime)operator(()string<delimiter(')content(%m/%d/%y)delimiter(')>operator(\)) + reserved(when) string<delimiter(')content(%Y)delimiter(')>operator(;) ident(o) operator(<<) string<delimiter(')content(%.4d)delimiter(')> operator(%) ident(year) + reserved(when) string<delimiter(')content(%y)delimiter(')>operator(;) ident(o) operator(<<) string<delimiter(')content(%02d)delimiter(')> operator(%) operator(()ident(year) operator(%) integer(100)operator(\)) + reserved(when) string<delimiter(')content(%Z)delimiter(')>operator(;) ident(o) operator(<<) operator(()reserved(if) ident(offset)operator(.)ident(zero?) reserved(then) string<delimiter(')content(Z)delimiter(')> reserved(else) ident(strftime)operator(()string<delimiter(')content(%z)delimiter(')>operator(\)) reserved(end)operator(\)) + reserved(when) string<delimiter(')content(%z)delimiter(')> comment(# ID) + ident(o) operator(<<) reserved(if) ident(offset) operator(<) integer(0) reserved(then) string<delimiter(')content(-)delimiter(')> reserved(else) string<delimiter(')content(+)delimiter(')> reserved(end) + ident(of) operator(=) ident(offset)operator(.)ident(abs) + ident(hh)operator(,) ident(fr) operator(=) ident(of)operator(.)ident(divmod)operator(()integer(1)operator(.)ident(to_r)operator(/)integer(24)operator(\)) + ident(mm) operator(=) ident(fr) operator(/) operator(()integer(1)operator(.)ident(to_r)operator(/)integer(1440)operator(\)) + ident(o) operator(<<) string<delimiter(')content(%02d)delimiter(')> operator(%) ident(hh) + ident(o) operator(<<) string<delimiter(')content(%02d)delimiter(')> operator(%) ident(mm) + reserved(when) string<delimiter(')content(%%)delimiter(')>operator(;) ident(o) operator(<<) string<delimiter(')content(%)delimiter(')> + reserved(when) string<delimiter(')content(%+)delimiter(')>operator(;) ident(o) operator(<<) ident(strftime)operator(()string<delimiter(')content(%a %b %e %H:%M:%S %Z %Y)delimiter(')>operator(\)) comment(# TZ) +comment(=begin + when '%.' + o << '%06d' % (sec_fraction / (1.to_r/86400/(10**6\)\)\) +=end) + reserved(when) string<delimiter(')content(%1)delimiter(')>operator(;) ident(o) operator(<<) string<delimiter(')content(%d)delimiter(')> operator(%) ident(jd) + reserved(when) string<delimiter(')content(%2)delimiter(')>operator(;) ident(o) operator(<<) ident(strftime)operator(()string<delimiter(')content(%Y-%j)delimiter(')>operator(\)) + reserved(when) string<delimiter(')content(%3)delimiter(')>operator(;) ident(o) operator(<<) ident(strftime)operator(()string<delimiter(')content(%Y-%m-%d)delimiter(')>operator(\)) + reserved(else)operator(;) ident(o) operator(<<) ident(c) + reserved(end) + reserved(end) + ident(o) + reserved(end) + +comment(# alias_method :format, :strftime) + + reserved(def) method(asctime)operator(()operator(\)) ident(strftime)operator(()string<delimiter(')content(%c)delimiter(')>operator(\)) reserved(end) + + ident(alias_method) symbol(:ctime)operator(,) symbol(:asctime) + +reserved(end) + +reserved(class) class(DateTime) operator(<) constant(Date) + + reserved(def) pre_constant(self)operator(.)ident(_strptime)operator(()ident(str)operator(,) ident(fmt)operator(=)string<delimiter(')content(%FT%T%Z)delimiter(')>operator(\)) + reserved(super)operator(()ident(str)operator(,) ident(fmt)operator(\)) + reserved(end) + + reserved(def) method(strftime)operator(()ident(fmt)operator(=)string<delimiter(')content(%FT%T%Z)delimiter(')>operator(\)) + reserved(super)operator(()ident(fmt)operator(\)) + reserved(end) + +reserved(end) + +ident(require) string<delimiter(')content(generator)delimiter(')> +ident(a) operator(=) operator([)integer(2)operator(,) integer(3)operator(,) integer(5)operator(,) integer(7)operator(,) integer(11)operator(]) +ident(b) operator(=) string<delimiter(%w#)content(h a l l o)delimiter(#)> +constant(SyncEnumerator)operator(.)ident(new)operator(()ident(a)operator(,) ident(b)operator(\))operator(.)ident(each) operator({) operator(|)ident(i)operator(,) ident(j)operator(|) + ident(puts) string<delimiter(")inline<delimiter(#{)ident(i)delimiter(})>content( & )inline<delimiter(#{)ident(j)delimiter(})>delimiter(")> +operator(}) + +reserved(class) class(Signature) operator(<) constant(Array) + reserved(def) method(===) ident(x) + ident(x)operator(.)ident(kind_of?) constant(Array) reserved(and) ident(zip)operator(()ident(x)operator(\))operator(.)ident(all?) operator({) operator(|)ident(me)operator(,) ident(it)operator(|) ident(me) operator(===) ident(it) operator(}) + reserved(end) +reserved(end) + +reserved(module) class(Chess) + + constant(BOARD_RANGE) operator(=) integer(1)operator(..)integer(8) + + reserved(class) class(Position) + + ident(attr_reader) symbol(:x)operator(,) symbol(:y) + + reserved(def) method(initialize) operator(*)ident(args) + instance_variable(@x)operator(,) instance_variable(@y) operator(=) reserved(case) ident(args) + reserved(when) constant(Signature)operator([)constant(Fixnum)operator(,) constant(Fixnum)operator(]) + ident(args) + reserved(when) constant(Signature)operator([)constant(String)operator(]) + constant(Position)operator(.)ident(decode) ident(args)operator(.)ident(first) + reserved(else) + ident(raise) constant(ArgumentError)operator(,) string<delimiter(')content(wrong number of arguments(one String or two fixnums\))delimiter(')> + reserved(end) + ident(raise) constant(RuntimeError)operator(,) string<delimiter(')content(%p is out of the chess board)delimiter(')> operator(%) pre_constant(self) reserved(unless) constant(Position)operator(.)ident(valid?) instance_variable(@x)operator(,) instance_variable(@y) + reserved(end) + + reserved(def) method(inspect) + string<delimiter(')content(Position(%p, %p\))delimiter(')> operator(%) operator([)ident(x)operator(,) ident(y)operator(]) + reserved(end) + + reserved(def) constant(Position)operator(.)ident(decode) ident(pos) + ident(x)operator(,) ident(y) operator(=) ident(pos)operator(.)ident(split)operator(()string<delimiter(')delimiter(')>operator(\)) + reserved(return) ident(x)operator(.)ident(upcase)operator([)integer(0)operator(]) operator(-) integer(?A) operator(+) integer(1)operator(,) instance_variable(@y) operator(=) ident(y)operator([)integer(0)operator(]) operator(-) integer(?0) + reserved(end) + + reserved(def) constant(Position)operator(.)ident(valid?) ident(x)operator(,) ident(y) + constant(BOARD_RANGE)operator(.)ident(include?) ident(x) reserved(and) constant(BOARD_RANGE)operator(.)ident(include?) ident(y) + reserved(end) + reserved(end) + +reserved(end) + +ident(p) constant(Chess)operator(::)constant(Position)operator(.)ident(new)operator(()string<delimiter(')content(H3)delimiter(')>operator(\)) +constant(SuperString) operator(=) constant(Class)operator(.)ident(new) constant(String) +ident(p) constant(Chess)operator(::)constant(Position)operator(.)ident(new)operator(()constant(SuperString)operator(.)ident(new)operator(()string<delimiter(')content(C5)delimiter(')>operator(\))operator(\)) +ident(p) constant(Chess)operator(::)constant(Position)operator(.)ident(new)operator(()integer(3)operator(,) integer(6)operator(\)) +ident(p) constant(Chess)operator(::)constant(Position)operator(.)ident(new)operator(()integer(3)operator(,) integer(9)operator(\)) + +ident(require) string<delimiter(')content(grammar)delimiter(')> + +reserved(def) method(test_grammars) + operator([)string<delimiter(<<EOG1)>operator(,) string<delimiter(<<EOG2)>operator(,) string<delimiter(<<EOG3)>operator(,)operator(])operator(.)ident(map) operator({) operator(|)ident(g)operator(|) constant(Grammar)operator(.)ident(new) ident(g) operator(})string<content( +Z --> S +S --> Sb +S --> bAa +A --> aSc +A --> a +A --> aSb)delimiter( +EOG1)>string<content( + +C --> d +C --> ABC +B --> +B --> c +A --> B +A --> a)delimiter( +EOG2)>string<content( + +E - TD +D - pTD +D - +T - FS +S - uFS +S - +F - aEz +F - i)delimiter( +EOG3)> +reserved(end) + +global_variable($trace) operator(=) pre_constant(false) +ident(test_grammars)operator(.)ident(each_with_index) reserved(do) operator(|)ident(g)operator(,) ident(i)operator(|) + ident(puts) string<delimiter(")content(Grammar )inline<delimiter(#{)ident(i)delimiter(})>content( is )inline<delimiter(#{)string<delimiter(')content(not )delimiter(')> reserved(if) ident(g)operator(.)ident(ll1?)delimiter(})>content(LL(1\).)delimiter(")> +reserved(end) diff --git a/test/scanners/ruby/besetzung.in.rb b/test/scanners/ruby/besetzung.in.rb Binary files differnew file mode 100644 index 0000000..e226460 --- /dev/null +++ b/test/scanners/ruby/besetzung.in.rb diff --git a/test/scanners/ruby/besetzung.out.raydebug b/test/scanners/ruby/besetzung.out.raydebug Binary files differnew file mode 100644 index 0000000..d65e4fc --- /dev/null +++ b/test/scanners/ruby/besetzung.out.raydebug diff --git a/test/scanners/ruby/class.in.rb b/test/scanners/ruby/class.in.rb new file mode 100644 index 0000000..b8d0bca --- /dev/null +++ b/test/scanners/ruby/class.in.rb @@ -0,0 +1,83 @@ +$: << File.dirname(__FILE__) + '/..'
+require 'coderay'
+CodeRay::Encoders[:tokens]
+CodeRay::Encoders[:html]
+
+require 'test/unit'
+include Test::Unit
+
+class CodeRaySuite < TestCase
+
+ def self.dir &block
+ @dir ||= File.dirname(@file)
+ if block
+ Dir.chdir @dir, &block
+ end
+ @dir
+ end
+
+ def dir &block
+ self.class.dir &block
+ end
+
+ def extension
+ 'in.' + self.class::EXTENSION
+ end
+
+ def lang
+ self.class::LANG
+ end
+
+ def test_ALL
+ CodeRay::Scanners.load lang
+ tokenizer = CodeRay.tokens
+ highlighter = CodeRay.html
+
+ dir do
+ for input in Dir["*.#{extension}"]
+ name = File.basename(input, ".#{extension}")
+ output = name + '.out.tok'
+ code = File.read(input)
+
+ computed = tokenizer.encode code, lang
+
+ if File.exist? output
+ expected = File.read output
+ assert_equal(expected, computed)
+ else
+ File.open(output, 'w') do |f| f.write computed end
+ puts "New test: #{output}"
+ end
+
+ highlighted = highlighter.highlight_page code, lang
+ File.open(name + '.html', 'w') do |f| f.write highlighted end
+ end
+ end
+ end
+
+end
+
+require 'test/unit/testsuite'
+$suite = TestSuite.new
+
+def load_suite name
+ begin
+ require name + '/suite.rb'
+ rescue LoadError
+ $stderr.puts <<-ERR
+
+!! Folder #{File.split(__FILE__).first + '/' + name} not found
+
+ ERR
+ false
+ end
+end
+
+if subsuite = ARGV.first
+ load_suite(subsuite) or exit
+else
+ Dir['*/'].each { |suite| load_suite suite }
+end
+
+require 'test/unit/ui/console/testrunner'
+UI::Console::TestRunner.run $suite
diff --git a/test/scanners/ruby/class.out.raydebug b/test/scanners/ruby/class.out.raydebug new file mode 100644 index 0000000..af7a63a --- /dev/null +++ b/test/scanners/ruby/class.out.raydebug @@ -0,0 +1,83 @@ +global_variable($:) operator(<<) constant(File)operator(.)ident(dirname)operator(()pre_constant(__FILE__)operator(\)) operator(+) string<delimiter(')content(/..)delimiter(')> +ident(require) string<delimiter(')content(coderay)delimiter(')> +constant(CodeRay)operator(::)constant(Encoders)operator([)symbol(:tokens)operator(]) +constant(CodeRay)operator(::)constant(Encoders)operator([)symbol(:html)operator(]) + +ident(require) string<delimiter(')content(test/unit)delimiter(')> +ident(include) constant(Test)operator(::)constant(Unit) + +reserved(class) class(CodeRaySuite) operator(<) constant(TestCase) + + reserved(def) pre_constant(self)operator(.)ident(dir) operator(&)ident(block) + instance_variable(@dir) operator(||=) constant(File)operator(.)ident(dirname)operator(()instance_variable(@file)operator(\)) + reserved(if) ident(block) + constant(Dir)operator(.)ident(chdir) instance_variable(@dir)operator(,) operator(&)ident(block) + reserved(end) + instance_variable(@dir) + reserved(end) + + reserved(def) method(dir) operator(&)ident(block) + pre_constant(self)operator(.)ident(class)operator(.)ident(dir) operator(&)ident(block) + reserved(end) + + reserved(def) method(extension) + string<delimiter(')content(in.)delimiter(')> operator(+) pre_constant(self)operator(.)ident(class)operator(::)constant(EXTENSION) + reserved(end) + + reserved(def) method(lang) + pre_constant(self)operator(.)ident(class)operator(::)constant(LANG) + reserved(end) + + reserved(def) method(test_ALL) + constant(CodeRay)operator(::)constant(Scanners)operator(.)ident(load) ident(lang) + ident(tokenizer) operator(=) constant(CodeRay)operator(.)ident(tokens) + ident(highlighter) operator(=) constant(CodeRay)operator(.)ident(html) + + ident(dir) reserved(do) + reserved(for) ident(input) reserved(in) constant(Dir)operator([)string<delimiter(")content(*.)inline<delimiter(#{)ident(extension)delimiter(})>delimiter(")>operator(]) + ident(name) operator(=) constant(File)operator(.)ident(basename)operator(()ident(input)operator(,) string<delimiter(")content(.)inline<delimiter(#{)ident(extension)delimiter(})>delimiter(")>operator(\)) + ident(output) operator(=) ident(name) operator(+) string<delimiter(')content(.out.tok)delimiter(')> + ident(code) operator(=) constant(File)operator(.)ident(read)operator(()ident(input)operator(\)) + + ident(computed) operator(=) ident(tokenizer)operator(.)ident(encode) ident(code)operator(,) ident(lang) + + reserved(if) constant(File)operator(.)ident(exist?) ident(output) + ident(expected) operator(=) constant(File)operator(.)ident(read) ident(output) + ident(assert_equal)operator(()ident(expected)operator(,) ident(computed)operator(\)) + reserved(else) + constant(File)operator(.)ident(open)operator(()ident(output)operator(,) string<delimiter(')content(w)delimiter(')>operator(\)) reserved(do) operator(|)ident(f)operator(|) ident(f)operator(.)ident(write) ident(computed) reserved(end) + ident(puts) string<delimiter(")content(New test: )inline<delimiter(#{)ident(output)delimiter(})>delimiter(")> + reserved(end) + + ident(highlighted) operator(=) ident(highlighter)operator(.)ident(highlight_page) ident(code)operator(,) ident(lang) + constant(File)operator(.)ident(open)operator(()ident(name) operator(+) string<delimiter(')content(.html)delimiter(')>operator(,) string<delimiter(')content(w)delimiter(')>operator(\)) reserved(do) operator(|)ident(f)operator(|) ident(f)operator(.)ident(write) ident(highlighted) reserved(end) + reserved(end) + reserved(end) + reserved(end) + +reserved(end) + +ident(require) string<delimiter(')content(test/unit/testsuite)delimiter(')> +global_variable($suite) operator(=) constant(TestSuite)operator(.)ident(new) + +reserved(def) method(load_suite) ident(name) + reserved(begin) + ident(require) ident(name) operator(+) string<delimiter(')content(/suite.rb)delimiter(')> + reserved(rescue) constant(LoadError) + global_variable($stderr)operator(.)ident(puts) string<delimiter(<<-ERR)>string<content( + +!! Folder )inline<delimiter(#{)constant(File)operator(.)ident(split)operator(()pre_constant(__FILE__)operator(\))operator(.)ident(first) operator(+) string<delimiter(')content(/)delimiter(')> operator(+) ident(name)delimiter(})>content( not found + )delimiter( + ERR)> + pre_constant(false) + reserved(end) +reserved(end) + +reserved(if) ident(subsuite) operator(=) pre_constant(ARGV)operator(.)ident(first) + ident(load_suite)operator(()ident(subsuite)operator(\)) reserved(or) ident(exit) +reserved(else) + constant(Dir)operator([)string<delimiter(')content(*/)delimiter(')>operator(])operator(.)ident(each) operator({) operator(|)ident(suite)operator(|) ident(load_suite) ident(suite) operator(}) +reserved(end) + +ident(require) string<delimiter(')content(test/unit/ui/console/testrunner)delimiter(')> +constant(UI)operator(::)constant(Console)operator(::)constant(TestRunner)operator(.)ident(run) global_variable($suite) diff --git a/test/scanners/ruby/comment.in.rb b/test/scanners/ruby/comment.in.rb new file mode 100644 index 0000000..d0dea65 --- /dev/null +++ b/test/scanners/ruby/comment.in.rb @@ -0,0 +1,17 @@ +=begin test
+=end test
+
+bla
+
+ =begin
+
+ __END__
+
+
+__END__
+#CODE
+
+mangawobeegee
+
+#test\
+dasd
diff --git a/test/scanners/ruby/comment.out.raydebug b/test/scanners/ruby/comment.out.raydebug new file mode 100644 index 0000000..0e24ae3 --- /dev/null +++ b/test/scanners/ruby/comment.out.raydebug @@ -0,0 +1,17 @@ +comment(=begin test +=end test) + +ident(bla) + + operator(=)reserved(begin) + + ident(__END__) + + +comment(__END__ +)comment(#CODE) + +ident(mangawobeegee) + +comment(#test\\) +ident(dasd) diff --git a/test/scanners/ruby/diffed.in.rb b/test/scanners/ruby/diffed.in.rb new file mode 100644 index 0000000..a1deb0f --- /dev/null +++ b/test/scanners/ruby/diffed.in.rb @@ -0,0 +1,30 @@ +## example diff [diff]
+Index: /Users/jgoebel/rails/pastie/app/controllers/pastes_controller.rb
+===================================================================
+--- /Users/jgoebel/rails/pastie/app/controllers/pastes_controller.rb (revision 1431)
++++ /Users/jgoebel/rails/pastie/app/controllers/pastes_controller.rb (revision 1437)
+@@ -1,6 +1,10 @@
++require 'login_system'
+ require 'coderay'
+
+ class PastesController < ApplicationController
++ include LoginSystem
++
++ before_filter :attempt_cookie_login
+
+ # caches_action :recent
+
+@@ -10,11 +14,7 @@
+
+ def show
+ @paste = Paste.find(params[:id])
+- if params[:key] and params[:key]==User.new(@paste.nick).magic_mojo
+- session[:login]=@paste.nick
+- return redirect_to(:action => 'show', :id => @paste.id)
+- end
+-
++ attempt_key_login if not logged_in?
+ unless @paste.asset or not @paste.body.blank?
+ render :action => "edit"
+ end
+
diff --git a/test/scanners/ruby/diffed.out.raydebug b/test/scanners/ruby/diffed.out.raydebug new file mode 100644 index 0000000..8881649 --- /dev/null +++ b/test/scanners/ruby/diffed.out.raydebug @@ -0,0 +1,30 @@ +comment(## example diff [diff]) +constant(Index)operator(:) regexp<delimiter(/)content(Users)delimiter(/)>ident(jgoebel)operator(/)ident(rails)operator(/)ident(pastie)operator(/)ident(app)operator(/)ident(controllers)operator(/)ident(pastes_controller)operator(.)ident(rb) +operator(===)operator(===)operator(===)operator(===)operator(===)operator(===)operator(===)operator(===)operator(===)operator(===)operator(===)operator(===)operator(===)operator(===)operator(===)operator(===)operator(===)operator(===)operator(===)operator(===)operator(===)operator(===)operator(=) +operator(-)operator(-)operator(-) regexp<delimiter(/)content(Users)delimiter(/)>ident(jgoebel)operator(/)ident(rails)operator(/)ident(pastie)operator(/)ident(app)operator(/)ident(controllers)operator(/)ident(pastes_controller)operator(.)ident(rb) operator(()ident(revision) integer(1431)operator(\)) +operator(+)operator(+)operator(+) regexp<delimiter(/)content(Users)delimiter(/)>ident(jgoebel)operator(/)ident(rails)operator(/)ident(pastie)operator(/)ident(app)operator(/)ident(controllers)operator(/)ident(pastes_controller)operator(.)ident(rb) operator(()ident(revision) integer(1437)operator(\)) +error(@)error(@) integer(-1)operator(,)integer(6) integer(+1)operator(,)integer(10) error(@)error(@) +operator(+)ident(require) string<delimiter(')content(login_system)delimiter(')> + ident(require) string<delimiter(')content(coderay)delimiter(')> + + reserved(class) class(PastesController) operator(<) constant(ApplicationController) +operator(+) ident(include) constant(LoginSystem) +operator(+) +operator(+) ident(before_filter) symbol(:attempt_cookie_login) + + comment(# caches_action :recent) + +error(@)error(@) integer(-10)operator(,)integer(11) integer(+14)operator(,)integer(7) error(@)error(@) + + reserved(def) method(show) + instance_variable(@paste) operator(=) constant(Paste)operator(.)ident(find)operator(()ident(params)operator([)symbol(:id)operator(])operator(\)) +operator(-) reserved(if) ident(params)operator([)symbol(:key)operator(]) reserved(and) ident(params)operator([)symbol(:key)operator(])operator(==)constant(User)operator(.)ident(new)operator(()instance_variable(@paste)operator(.)ident(nick)operator(\))operator(.)ident(magic_mojo) +operator(-) ident(session)operator([)symbol(:login)operator(])operator(=)instance_variable(@paste)operator(.)ident(nick) +operator(-) reserved(return) ident(redirect_to)operator(()symbol(:action) operator(=)operator(>) string<delimiter(')content(show)delimiter(')>operator(,) symbol(:id) operator(=)operator(>) instance_variable(@paste)operator(.)ident(id)operator(\)) +operator(-) reserved(end) +operator(-) +operator(+) ident(attempt_key_login) reserved(if) reserved(not) ident(logged_in?) + reserved(unless) instance_variable(@paste)operator(.)ident(asset) reserved(or) reserved(not) instance_variable(@paste)operator(.)ident(body)operator(.)ident(blank?) + ident(render) symbol(:action) operator(=)operator(>) string<delimiter(")content(edit)delimiter(")> + reserved(end) + diff --git a/test/scanners/ruby/evil.in.rb b/test/scanners/ruby/evil.in.rb new file mode 100644 index 0000000..877a586 --- /dev/null +++ b/test/scanners/ruby/evil.in.rb @@ -0,0 +1,1123 @@ +p(String *Class)
+class String
+class Class
+end
+end
+#def String(x) x.to_s end #it's already built-in. duh!
+def String.*(right) [self,right] end
+def String.<<(right) [self,:<<,right] end
+def String./(right) [self,:/,right] end
+def String.[](right) [self,:[],right] end
+p(String::Class)
+p(String:: Class)
+p(String ::Class)
+p(String :: Class)
+p(String<<Class)
+p(String<< Class)
+p(String <<Class)
+sgsdfgf
+Class
+p(String << Class)
+p(String/Class)
+p(String/ Class)
+p(String /Class/)
+p(String / Class) #borken
+p(String[Class])
+p(String[ Class])
+p(String [Class])
+p(String [ Class])
+p(String*Class)
+p(String* Class)
+p(String *Class)
+p(String * Class)
+class <<String
+undef :*,<<,/,[]
+end
+
+
+
+p(false::to_s)
+p(false ::to_s)
+p(false:: to_s)
+p(false :: to_s)
+
+class C2
+class <<self
+ def self.p8; p 8 end
+ alias p? p
+ alias P? p
+ alias [] p
+ alias <=> p
+end
+
+q=9
+Q=99
+
+p:p8
+false ? p: p8
+p :p8
+false ? p : p8
+
+false ? q:p8
+false ? q: p8
+false ? q :p8
+false ? q : p8
+
+#false ? Q:p8 #gives ruby indigestion
+false ? Q: p8
+#false ? Q :p8 #gives ruby indigestion
+false ? Q : p8
+
+p?:p8
+false ? p?: p8
+p? :p8
+false ? p? : p8
+
+P?:p8
+false ? P?: p8
+P? :p8
+false ? P? : p8
+
+self.[]:p8
+false ? self.[]: p8
+self.[] :p8
+false ? self.[] : p8
+
+self.<=>:p8
+false ? self.<=>: p8
+self.<=> :p8
+false ? self.<=> : p8
+
+self <=>:p8
+#false ? self <=>: p8 #gives ruby indigestion
+self <=> :p8
+#false ? self <=> : p8 #gives ruby indigestion
+end
+
+p <<stuff+'foobar'.tr('j-l','d-f')
+"more stuff"
+12345678
+the quick brown fox jumped over the lazy dog
+stuff
+
+
+p <<p
+sdfsfdf^^^^@@@
+p
+mix=nil
+p / 5/mix
+
+module M33
+ p="var:"
+ Q="func:"
+ def Q.method_missing(name,*args)
+ self+name.to_s+(args.join' ')
+ end
+ def p.method_missing(name,*args)
+ self+name.to_s+(args.join' ')
+ end
+ def self.p(*a); super; Q end
+ @a=1
+ $a=2
+
+ p(p~6)
+ p(p ~6)
+ p(p~ 6)
+ p(p ~ 6)
+ p(p*11)
+ p(p *11)
+ p(p* 11)
+ p(p * 11)
+ p(p&proc{})
+ p(p &proc{})
+ p(p& proc{})
+ p(p & proc{})
+ p(p !1)
+# p(p ?1) #compile error, when p is var
+ p(p ! 1)
+ p(p ? 1 : 6)
+ p(p@a)
+ p(p @a)
+# p(p@ a) #wont
+# p(p @ a) #work
+ p(p#a
+)
+ p(p #a
+)
+ p(p# a
+)
+ p(p # a
+)
+ p(p$a)
+ p(p $a)
+# p(p$ a) #wont
+# p(p $ a) #work
+ p(p%Q{:foo})
+ p(p %Q{:foo})
+ p(p% Q{:foo})
+ p(p % Q{:foo})
+ p(p^6)
+ p(p ^6)
+ p(p^ 6)
+ p(p ^ 6)
+ p(p&7)
+ p(p &proc{7})
+ p(p& 7)
+ p(p & 7)
+ p(p(2))
+ p(p (2))
+ p(p( 2))
+ p(p ( 2))
+ p(p(p))
+ p(p())
+ p(p (p))
+ p(p ())
+ p(p ( p))
+ p(p ( ))
+ p(p( p))
+ p(p( ))
+ p(p)
+ p((p))
+ p(p )
+ p((p ))
+ p((p p))
+ p((p p,p))
+ p((p p))
+ p((p p,p))
+ p(p-0)
+ p(p -0)
+ p(p- 0)
+ p(p - 0)
+ p(p+9)
+ p(p +9)
+ p(p+ 9)
+ p(p + 9)
+ p(p[1])
+ p(p [1])
+ p(p[ 1])
+ p(p [ 1])
+ p(p{1})
+ p(p {1})
+ p(p{ 1})
+ p(p { 1})
+ p(p/1)
+ p(p /22)
+ p(p/ 1)
+ p(p / 22)
+ p(p._)
+ p(p ._)
+ p(p. _)
+ p(p . _)
+ p(false ? p:f)
+ p(false ? p :f)
+ p(false ? p: f)
+ p(false ? p : f)
+ p((p;1))
+ p((p ;1))
+ p((p; 1))
+ p((p ; 1))
+ p(p<1)
+ p(p <1)
+ p(p< 1)
+ p(p < 1)
+ p(p<<1)
+ p(p <<1)
+ p(p<< 1)
+ p(p << 1)
+ p(p'j')
+ p(p 'j')
+ p(p' j')
+ p(p ' j')
+ p(p"k")
+ p(p "k")
+ p(p" k")
+ p(p " k")
+ p(p|4)
+ p(p |4)
+ p(p| 4)
+ p(p | 4)
+ p(p>2)
+ p(p >2)
+ p(p> 2)
+ p(p > 2)
+
+end
+
+module M34
+ p(p~6)
+ p(p ~6)
+ p(p~ 6)
+ p(p ~ 6)
+ p(p*[1])
+ p(p *[1])
+ p(p* [1])
+ p(p * [1])
+ p(p&proc{})
+ p(p &proc{})
+ p(p& proc{})
+ p(p & proc{})
+ p(p !1)
+ p(p ?1)
+ p(p ! 1)
+ p(p ? 1 : 6)
+ p(p@a)
+ p(p @a)
+# p(p@ a) #wont
+# p(p @ a) #work
+
+ p(p#a
+)
+ p(p #a
+)
+ p(p# a
+)
+ p(p # a
+)
+ p(p$a)
+ p(p $a)
+# p(p$ a) #wont
+# p(p $ a) #work
+ p(p%Q{:foo})
+ p(p %Q{:foo})
+ p(p% Q{:foo})
+ p(p % Q{:foo})
+ p(p^6)
+ p(p ^6)
+ p(p^ 6)
+ p(p ^ 6)
+ p(p&7)
+ p(p &proc{7})
+ p(p& 7)
+ p(p & 7)
+ p(p(2))
+ p(p (2))
+ p(p( 2))
+ p(p ( 2))
+ p(p(p))
+ p(p())
+ p(p (p))
+ p(p ())
+ p(p ( p))
+ p(p ( ))
+ p(p( p))
+ p(p( ))
+ p(p)
+ p((p))
+ p(p )
+ p((p ))
+ p((p p))
+ p((p p,p))
+ p((p p))
+ p((p p,p))
+ p(p-0)
+ p(p -1)
+ p(p- 0)
+ p(p - 0)
+ p(p+9)
+ p(p +9)
+ p(p+ 9)
+ p(p + 9)
+ p(p[1])
+ p(p [1])
+ p(p[ 1])
+ p(p [ 1])
+ p(p{1})
+ p(p {1})
+ p(p{ 1})
+ p(p { 1})
+ p(p/1)
+ p(p /22/)
+ p(p/ 1)
+ p(p / 22)
+ p(p._)
+ p(p ._)
+ p(p. _)
+ p(p . _)
+ p(p:f)
+ p(p :f)
+ p(false ? p: f)
+ p(false ? p : f)
+ p((p;1))
+ p((p ;1))
+ p((p; 1))
+ p((p ; 1))
+ p(p<1)
+ p(p <1)
+ p(p< 1)
+ p(p < 1)
+ p(p<<1)
+ p(p <<1)
+foobar
+1
+ p(p<< 1)
+ p(p << 1)
+ p(p'j')
+ p(p 'j')
+ p(p' j')
+ p(p ' j')
+ p(p"k")
+ p(p "k")
+ p(p" k")
+ p(p " k")
+ p(p|4)
+ p(p |4)
+ p(p| 4)
+ p(p | 4)
+ p(p>2)
+ p(p >2)
+ p(p> 2)
+ p(p > 2)
+
+end
+
+
+def bob(x) x end
+def bill(x) x end
+p(bob %(22))
+for bob in [100] do p(bob %(22)) end
+p(bob %(22))
+def %(n) to_s+"%#{n}" end
+p(bill %(22))
+begin sdjkfsjkdfsd; rescue Object => bill; p(bill %(22)) end
+p(bill %(22))
+undef %
+
+class Object
+
+public :`
+def `(s)
+ print "bq: #{s}\n"
+end
+end
+
+69.`('what a world')
+
+79::`('what a word')
+
+p :`
+
+p{}
+p {}
+a=5
+p p +5
+p a +5
+
+def nil.+(x) ~x end
+def nil.[](*x) [x] end
+p( p + 5 )
+p( p +5 )
+p( p+5 )
+p( p[] )
+p( p [] )
+p( p [ ] )
+class NilClass; undef +,[] end
+
+class Foou
+ public
+ def [] x=-100,&y; p x; 100 end
+end
+a0=8
+p Foou.new.[]!false #value
+p Foou.new.[] !false #value
+p Foou.new.[]~9 #value
+p Foou.new.[] ~9 #value
+p Foou.new.[]-9 #op
+p Foou.new.[]+9 #op
+p Foou.new.[] -9 #value
+p Foou.new.[] +9 #value
+p Foou.new.[]<<9 #op
+p Foou.new.[] <<9 #value
+foobar
+9
+p Foou.new.[]%9 #op
+p Foou.new.[]/9 #op
+p Foou.new.[] %(9) #value
+p Foou.new.[] /9/ #value
+p Foou.new.[]$9 #value
+p Foou.new.[]a0 #value
+p Foou.new.[] $9 #value
+p Foou.new.[] a0 #value
+p Foou.new.[]{9} #lambda (op)
+p Foou.new.[] {9} #lambda (op)
+
+if p then p end
+
+p({:foo=>:bar}) #why does this work? i'd think that ':foo=' would be 1 token
+p EMPTY = 0
+p BLACK = 1
+p WHITE = - BLACK
+
+ a=b=c=0
+ a ? b:c
+ a ?b:c
+
+ p(a ? b:c)
+ p(a ?b:c)
+
+
+p~4
+p:f
+p(~4){}
+p(:f){}
+h={}
+h.default=:foo
+
+p def (h="foobar").default= v; p @v=v;v end
+p h
+
+p h.default=:b
+
+x, (*y) = [:x, :y, :z]
+p x
+p y
+
+x, *y = [:x, :y, :z]
+p x
+p y
+
+x, * = [:x, :y, :z]
+p x
+
+
+
+p Array("foo\nbar")
+
+
+
+p +(4)
+p -(4)
+
+p :'\\'
+
+class Foop
+ def Foop.bar a,b
+ p a,b
+ end
+end
+Foop.bar 1,2
+Foop::bar 3,4
+
+
+class Foop
+ def Foop::baz a,b
+ p :baz,a,b
+ end
+end
+Foop.baz 5,6
+Foop::baz 7,8
+
+
+
+without_creating=widgetname=nil
+ if without_creating && !widgetname #foo
+ fail ArgumentError,
+ "if set 'without_creating' to true, need to define 'widgetname'"
+ end
+
+
+
+=begin disable for now
+
+#class, module, and def should temporarily hide local variables
+def mopsdfjskdf arg; arg*2 end
+mopsdfjskdf=5
+ class C
+ p mopsdfjskdf %(3) #calls method
+ end
+
+module M
+ p mopsdfjskdf %(4) #calls method
+end
+
+ def d
+ p mopsdfjskdf %(5) #calls method
+ end
+p d
+p mopsdfjskdf %(6) #reads variable
+p proc{mopsdfjskdf %(7)}[] #reads variable
+
+#fancy symbols not supported yet
+p %s{symbol}
+=end
+
+#multiple assignment test
+proc {
+ a,b,c,d,e,f,g,h,i,j,k=1,2,3,4,5,6,7,8,9,10,11
+ p(b %(c))
+ p(a %(c))
+ p(k %(c))
+ p(p %(c))
+}.call
+
+
+=begin disable for now
+p "#{<<kekerz}#{"foob"
+zimpler
+kekerz
+}"
+
+
+aaa=<<whatnot; p "#{'uh,yeah'
+gonna take it down, to the nitty-grit
+gonna tell you mother-fuckers why you ain't shit
+cause suckers like you just make me strong
+whatnot
+}"
+p aaa
+
+#test variable creation in string inclusion
+#currently broken because string inclusions
+#are lexed by a separate lexer!
+proc {
+ p "jentawz: #{baz=200}"
+ p( baz %(9))
+}.call
+=end
+
+=begin ought to work...ruby doesn't like
+class A
+class B
+class C
+end
+end
+end
+def A::B::C::d() :abcd end
+def A::B::d() :abd end #this used to work as well... i think
+
+def nil.d=; end #this works
+def (;).d=; end
+def ().d=; end
+p def (p h="foobar";).default= v; p @v=v;v end
+p def (p h="foobar";h).default= v; p @v=v;v end
+
+p~4{}
+p:f{}
+p ~4{}
+p :f{}
+
+def g a=:g; [a] end
+g g g #this works
+g *g #this works
+g *g g #this doesn't
+
+[nil,p 5]
+"foo"+[1].join' '
+
+class Fook
+def foo; end
+
+
+#these work:
+(not true)
+p(!true) #etc
+(true if false) #etc
+(true and false) #etc
+(undef foo)
+(alias bar foo)
+(BEGIN{p :yyy})
+
+#these don't:
+p(not true)
+p(true if false) #etc
+p(true and false) #etc
+p(undef foo)
+p(alias bar foo)
+p(BEGIN{p :yyy})
+end
+
+=end
+
+proc {
+}
+
+p "#{<<foobar3}"
+bim
+baz
+bof
+foobar3
+
+def func
+ a,b,* = [1,2,3,4,5,6,7,8]
+ p a,b
+ a,b, = [1,2,3,4,5,6,7,8]
+ p a,b
+
+ a,b = [1,2,3,4,5,6,7,8]
+ p a,b
+ a,*b = [1,2,3,4,5,6,7,8]
+ p a,b
+
+ a,b,*c=[1,2,3,4,5,6,7,8]
+ a,b,* c=[1,2,3,4,5,6,7,8]
+end
+func
+
+
+p( %r{\/$})
+p( %r~<!include:([\/\w\.\-]+)>~m)
+
+p <<end
+#{compile_body}\
+#{outvar}
+end
+
+
+
+
+
+proc {
+ h={:a=>(foo=100)}
+ p( foo %(5))
+}.call
+
+
+p "#{<<foobar3}"
+bim
+baz
+bof
+foobar3
+
+p "#{<<foobar2
+bim
+baz
+bof
+foobar2
+}"
+
+p <<one ; p "#{<<two}"
+1111111111111111
+fdsgdfgdsfffff
+one
+2222222222222222
+sdfasdfasdfads
+two
+p "#{<<foobar0.each('|'){|s| '\nthort: '+s} }"
+jbvd|g4543ghb|!@G$dfsd|fafr|e
+|s4e5rrwware|BBBBB|*&^(*&^>"PMK:njs;d|
+
+foobar0
+
+p "#{<<foobar1.each('|'){|s| '\nthort: '+s}
+jbvd|g4543ghb|!@G$dfsd|fafr|e
+|s4e5rrwware|BBBBB|*&^(*&^>"PMK:njs;d|
+
+foobar1
+}"
+
+def foo(a=<<a,b=<<b,c=<<c)
+jfksdkjf
+dkljjkf
+a
+kdljfjkdg
+dfglkdfkgjdf
+dkf
+b
+lkdffdjksadhf
+sdflkdjgsfdkjgsdg
+dsfg;lkdflisgffd
+g
+c
+
+ a+b+c
+
+end
+p foo
+
+
+
+$a=1
+@b=2
+@@c=3
+p "#$a #@b #@@c #{$a+@b+@@c}"
+p "\#$a \#@b \#@@c \#{$a+@b+@@c}"
+p '#$a #@b #@@c #{$a+@b+@@c}'
+p '\#$a \#@b \#@@c \#{$a+@b+@@c}'
+p %w"#$a #@b #@@c #{$a+@b+@@c}"
+p %w"\#$a \#@b \#@@c \#{$a+@b+@@c}"
+p %W"#$a #@b #@@c #{$a+@b+@@c}"
+p %W"\#$a \#@b \#@@c \#{$a+@b+@@c}"
+p %Q[#$a #@b #@@c #{$a+@b+@@c}]
+p %Q[\#$a \#@b \#@@c \#{$a+@b+@@c}]
+p `echo #$a #@b #@@c #{$a+@b+@@c}`
+p `echo \#$a \#@b \#@@c \#{$a+@b+@@c}`
+p(/#$a #@b #@@c #{$a+@b+@@c}/)
+#p(/\#$a \#@b \#@@c \#{$a+@b+@@c}/) #moved to w.rb
+
+class AA; class BB; class CC
+FFOO=1
+end end end
+
+p AA::BB::CC::FFOO
+
+compile_body=outvar='foob'
+
+if false
+ method_src = c.compile(template, (HtmlCompiler::AnyData.new)).join("\n") +
+ "\n# generated by PartsTemplate::compile_partstemplate at #{Time.new}\n"
+ rescu -1
+end
+
+ p('rb_out', 'args', <<-'EOL')
+ regsub -all {!} $args {\\!} args
+ regsub -all "{" $args "\\{" args
+ if {[set st [catch {ruby [format "TkCore.callback %%Q!%s!" $args]} ret]] != 0} {
+ return -code $st $ret
+ } {
+ return $ret
+ }
+ EOL
+
+def add(*args)
+ self.<<(*args)
+end
+
+
+
+val=%[13,17,22,"hike", ?\s]
+ if val.include? ?\s
+ p val.split.collect{|v| (v)}
+ end
+p "#{}"
+p "#(1)"
+class Hosts
+end
+class DNS < Hosts
+end
+def intialize(resolvers=[Hosts.new, DNS.new]) end
+def environment(env = File.basename($0, '.*')) end
+
+def ssssss &block
+end
+def params_quoted(field_name, default)
+ if block_given? then yield field_name else default end
+end
+def ==(o) 444 end
+def String.ffff4() self.to_s+"ffff" end
+
+p *[]
+for i in \
+[44,55,66,77,88] do p i**Math.sqrt(i) end
+
+#(
+for i in if
+false then foob12345; else [44,55,66,77,88] end do p i**Math.sqrt(i) end
+#)
+(
+for i in if false then
+foob12345; else [44,55,66,77,88] end do p i**Math.sqrt(i) end
+
+c=j=0
+until while j<10 do j+=1 end.nil? do p 'pppppppppp' end
+for i in if false then foob12345;
+else [44,55,66,77,88] end do p i**Math.sqrt(i) end
+
+for i in if false then foob12345; else
+[44,55,66,77,88] end do p i**Math.sqrt(i) end
+
+
+for i in (c;
+[44,55,66,77,88]) do p i**Math.sqrt(i) end
+)
+(
+
+for i in (begin
+[44,55,66,77,88] end) do p i**Math.sqrt(i) end
+
+for i in if false then foob12345; else
+[44,55,66,77,88] end do p i**Math.sqrt(i) end
+
+for i in (
+
+[44,55,66,77,88]) do p i**Math.sqrt(i) end
+
+for i in (
+[44,55,66,77,88]) do p i**Math.sqrt(i) end
+
+)
+
+
+def yy;yield end
+
+block=proc{p "blah blah"}
+
+yy &block
+p(1.+1)
+p pppp
+
+module M66
+p(proc do
+ p=123
+end.call)
+
+p proc {
+ p=123
+}.call
+
+p def pppp
+ p=123
+end
+p module Ppp
+ p=123
+end
+p class Pppp < String
+ p=123
+end
+end
+
+ def _make_regex(str) /([#{Regexp.escape(str)}])/n end
+p _make_regex("8smdf,34rh\#@\#$%$gfm/[]dD")
+
+
+p "#$a #@b #@@c
+
+d e f
+#$a #@b #@@c
+"
+
+p "\""
+
+a=a.to_s
+class <<a
+ def foobar
+ self*101
+ end
+ alias eql? ==
+end
+
+p a.foobar
+
+p(/^\s*(([+-\/*&\|^]|<<|>>|\|\||\&\&)=|\&\&|\|\|)/)
+p(:%)
+p( { :class => class_=0})
+p cls_name = {}[:class]
+
+
+p foo
+p "#{$!.class}"
+p :p
+p(:p)
+p(:"[]")
+p :"[]"
+p("\\")
+p(/\\/)
+p(/[\\]/)
+p 0x80
+p ?p
+p 0.1
+p 0.8
+p 0.9
+p(-1)
+p %/p/
+p %Q[<LI>]
+i=99
+p %Q[<LI><A HREF="#{i[3]}.html\##{i[4]}">#{i[0]+i[1]+(i[2])}</A>\n]
+p(:side=>:top)
+p %w[a b c
+ d e f]
+p %w[a b c\n
+ d e f]
+p %w[\\]
+p %w[\]]
+p :+
+p 99 / 3
+
+a=99;b=3
+p 1+(a / b)
+p %Q[\"]
+p %Q[ some [nested] text]
+
+if false
+ formatter.format_element(element) do
+ amrita_expand_and_format1(element, context, formatter)
+ end
+end
+if false
+ ret = <<-END
+ @@parts_template = #{template.to_ruby}
+ def parts_template
+ @@parts_template
+ end
+
+ #{c.const_def_src.join("\n")}
+ def amrita_expand_and_format(element, context, formatter)
+ if element.tagname_symbol == :span and element.attrs.size == 0
+ amrita_expand_and_format1(element, context, formatter)
+ else
+ formatter.format_element(element) do
+ amrita_expand_and_format1(element, context, formatter)
+ end
+ end
+ end
+
+ def amrita_expand_and_format1(element, context, formatter)
+ #{method_src}
+ end
+ END
+ j=55
+end
+
+p '
+'
+p '\n'
+p "
+"
+p "\n"
+p %w/
+/
+p %w/\n/
+
+p %W/
+/
+p %W/\n/
+p(/
+/)
+p(/\n/)
+p proc {
+ p `
+ `
+ p `\n`
+}
+
+
+
+p(%r[foo]i)
+#breakpoint
+p <<stuff+'foobar'.tr('j-l','d-f')
+"more stuff"
+12345678
+the quick brown fox jumped over the lazy dog
+stuff
+
+=begin doesn't work
+p <<stuff+'foobar'.tr('j-l','d-f')\
++"more stuff"
+12345678
+the quick brown fox jumped over the lazy dog
+stuff
+=end
+
+p ENV["AmritaCacheDir"]
+p <<-BEGIN + <<-END
+ def element_downcase(attributes = {})
+ BEGIN
+ end
+ END
+
+
+
+p <<ggg; def
+kleegarts() p 'kkkkkkk' end
+dfgdgfdf
+ggg
+koomblatz!() p 'jdkfsk' end
+
+koomblatz!
+
+p f = 3.7517675036461267e+17
+p $10
+p $1001
+p( <<end )
+nine time nine men have stood untold.
+end
+
+def jd_to_wday(jd) (jd + 1) % 7 end
+p jd_to_wday(98)
+
+
+p pre = $`
+=begin
+=end
+
+p <<"..end .."
+cbkvjb
+vb;lkxcvkbxc
+vxlc;kblxckvb
+xcvblcvb
+..end ..
+
+p $-j=55
+
+def empty() end
+
+p <<a
+dkflg
+flk
+a
+
+label='label';tab=[1,2,3]
+ p <<S
+#{label} = arr = Array.new(#{tab.size}, nil)
+str = a = i = nil
+idx = 0
+clist.each do |str|
+ str.split(',', -1).each do |i|
+ arr[idx] = i.to_i unless i.empty?
+ idx += 1
+ end
+end
+
+S
+def printem1 a,b,c
+ p(a +77)
+ p(b +77)
+ p(c +77)
+end
+
+def foobar() end
+def foobar2
+end
+
+def printem0(a)
+ p(a +77)
+end
+def printem0(a,b,c)
+ p(a +77)
+ p(b +77)
+ p(c +77)
+end
+def printem2 a,b,c; p(a +77); p(b +77); p(c +77) end
+def three() (1+2) end
+
+def d;end
+def d()end
+def d(dd)end
+
+def printem a,b,c
+ p a;p b;p c
+ p(a +77)
+ p(b %(0.123))
+end
+printem 1,2,3
+
+a=1
+p(a +77)
+
+def hhh(a=(1+2)) a end
+
+
+
+END {
+ p "bye-bye"
+}
+
+
+p <<here
+where?
+here
+p <<-what
+ ? that's
+ what
+p proc{||}
+for i in if false
+foob12345; else [44,55,66,77,88] end do p i**Math.sqrt(i) end
+p "\v"
+c=0
+ while c == /[ \t\f\r\13]/; end
+
+
+
+
+
+
+
+
diff --git a/test/scanners/ruby/evil.out.raydebug b/test/scanners/ruby/evil.out.raydebug new file mode 100644 index 0000000..b1e3231 --- /dev/null +++ b/test/scanners/ruby/evil.out.raydebug @@ -0,0 +1,1123 @@ +ident(p)operator(()constant(String) operator(*)constant(Class)operator(\)) +reserved(class) class(String) +reserved(class) class(Class) +reserved(end) +reserved(end) +comment(#def String(x\) x.to_s end #it's already built-in. duh!) +reserved(def) constant(String)operator(.)operator(*)operator(()ident(right)operator(\)) operator([)pre_constant(self)operator(,)ident(right)operator(]) reserved(end) +reserved(def) constant(String)operator(.)operator(<<)operator(()ident(right)operator(\)) operator([)pre_constant(self)operator(,)symbol(:<<)operator(,)ident(right)operator(]) reserved(end) +reserved(def) constant(String)operator(.)operator(/)operator(()ident(right)operator(\)) operator([)pre_constant(self)operator(,)symbol(:/)operator(,)ident(right)operator(]) reserved(end) +reserved(def) constant(String)operator(.)operator([])operator(()ident(right)operator(\)) operator([)pre_constant(self)operator(,)symbol(:[])operator(,)ident(right)operator(]) reserved(end) +ident(p)operator(()constant(String)operator(::)constant(Class)operator(\)) +ident(p)operator(()constant(String)operator(::) constant(Class)operator(\)) +ident(p)operator(()constant(String) operator(::)constant(Class)operator(\)) +ident(p)operator(()constant(String) operator(::) constant(Class)operator(\)) +ident(p)operator(()constant(String)operator(<<)constant(Class)operator(\)) +ident(p)operator(()constant(String)operator(<<) constant(Class)operator(\)) +ident(p)operator(()constant(String) string<delimiter(<<Class)>operator(\)) string<content( +sgsdfgf)delimiter( +Class)> +ident(p)operator(()constant(String) operator(<<) constant(Class)operator(\)) +ident(p)operator(()constant(String)operator(/)constant(Class)operator(\)) +ident(p)operator(()constant(String)operator(/) constant(Class)operator(\)) +ident(p)operator(()constant(String) regexp<delimiter(/)content(Class)delimiter(/)>operator(\)) +ident(p)operator(()constant(String) operator(/) constant(Class)operator(\)) comment(#borken) +ident(p)operator(()constant(String)operator([)constant(Class)operator(])operator(\)) +ident(p)operator(()constant(String)operator([) constant(Class)operator(])operator(\)) +ident(p)operator(()constant(String) operator([)constant(Class)operator(])operator(\)) +ident(p)operator(()constant(String) operator([) constant(Class)operator(])operator(\)) +ident(p)operator(()constant(String)operator(*)constant(Class)operator(\)) +ident(p)operator(()constant(String)operator(*) constant(Class)operator(\)) +ident(p)operator(()constant(String) operator(*)constant(Class)operator(\)) +ident(p)operator(()constant(String) operator(*) constant(Class)operator(\)) +reserved(class) operator(<<)class(String) +reserved(undef) symbol(:*)operator(,)method(<<)operator(,)method(/)operator(,)method([]) +reserved(end) + + + +ident(p)operator(()pre_constant(false)operator(::)ident(to_s)operator(\)) +ident(p)operator(()pre_constant(false) operator(::)ident(to_s)operator(\)) +ident(p)operator(()pre_constant(false)operator(::) ident(to_s)operator(\)) +ident(p)operator(()pre_constant(false) operator(::) ident(to_s)operator(\)) + +reserved(class) class(C2) +reserved(class) operator(<<)class(self) + reserved(def) pre_constant(self)operator(.)ident(p8)operator(;) ident(p) integer(8) reserved(end) + reserved(alias) ident(p?) ident(p) + reserved(alias) ident(P?) ident(p) + reserved(alias) operator([)operator(]) ident(p) + reserved(alias) operator(<=>) ident(p) +reserved(end) + +ident(q)operator(=)integer(9) +constant(Q)operator(=)integer(99) + +ident(p)symbol(:p8) +pre_constant(false) operator(?) ident(p)operator(:) ident(p8) +ident(p) symbol(:p8) +pre_constant(false) operator(?) ident(p) operator(:) ident(p8) + +pre_constant(false) operator(?) ident(q)symbol(:p8) +pre_constant(false) operator(?) ident(q)operator(:) ident(p8) +pre_constant(false) operator(?) ident(q) symbol(:p8) +pre_constant(false) operator(?) ident(q) operator(:) ident(p8) + +comment(#false ? Q:p8 #gives ruby indigestion) +pre_constant(false) operator(?) constant(Q)operator(:) ident(p8) +comment(#false ? Q :p8 #gives ruby indigestion) +pre_constant(false) operator(?) constant(Q) operator(:) ident(p8) + +ident(p?)symbol(:p8) +pre_constant(false) operator(?) ident(p?)operator(:) ident(p8) +ident(p?) symbol(:p8) +pre_constant(false) operator(?) ident(p?) operator(:) ident(p8) + +ident(P?)symbol(:p8) +pre_constant(false) operator(?) ident(P?)operator(:) ident(p8) +ident(P?) symbol(:p8) +pre_constant(false) operator(?) ident(P?) operator(:) ident(p8) + +pre_constant(self)operator(.)operator([])symbol(:p8) +pre_constant(false) operator(?) pre_constant(self)operator(.)operator([])operator(:) ident(p8) +pre_constant(self)operator(.)operator([]) symbol(:p8) +pre_constant(false) operator(?) pre_constant(self)operator(.)operator([]) operator(:) ident(p8) + +pre_constant(self)operator(.)operator(<=>)symbol(:p8) +pre_constant(false) operator(?) pre_constant(self)operator(.)operator(<=>)operator(:) ident(p8) +pre_constant(self)operator(.)operator(<=>) symbol(:p8) +pre_constant(false) operator(?) pre_constant(self)operator(.)operator(<=>) operator(:) ident(p8) + +pre_constant(self) operator(<=>)symbol(:p8) +comment(#false ? self <=>: p8 #gives ruby indigestion) +pre_constant(self) operator(<=>) symbol(:p8) +comment(#false ? self <=> : p8 #gives ruby indigestion) +reserved(end) + +ident(p) string<delimiter(<<stuff)>operator(+)string<delimiter(')content(foobar)delimiter(')>operator(.)ident(tr)operator(()string<delimiter(')content(j-l)delimiter(')>operator(,)string<delimiter(')content(d-f)delimiter(')>operator(\))string<content( +"more stuff" +12345678 +the quick brown fox jumped over the lazy dog)delimiter( +stuff)> + + +ident(p) string<delimiter(<<p)>string<content( +sdfsfdf^^^^@@@)delimiter( +p)> +ident(mix)operator(=)pre_constant(nil) +ident(p) operator(/) integer(5)operator(/)ident(mix) + +reserved(module) class(M33) + ident(p)operator(=)string<delimiter(")content(var:)delimiter(")> + constant(Q)operator(=)string<delimiter(")content(func:)delimiter(")> + reserved(def) constant(Q)operator(.)ident(method_missing)operator(()ident(name)operator(,)operator(*)ident(args)operator(\)) + pre_constant(self)operator(+)ident(name)operator(.)ident(to_s)operator(+)operator(()ident(args)operator(.)ident(join)string<delimiter(')content( )delimiter(')>operator(\)) + reserved(end) + reserved(def) ident(p)operator(.)ident(method_missing)operator(()ident(name)operator(,)operator(*)ident(args)operator(\)) + pre_constant(self)operator(+)ident(name)operator(.)ident(to_s)operator(+)operator(()ident(args)operator(.)ident(join)string<delimiter(')content( )delimiter(')>operator(\)) + reserved(end) + reserved(def) pre_constant(self)operator(.)ident(p)operator(()operator(*)ident(a)operator(\))operator(;) reserved(super)operator(;) constant(Q) reserved(end) + instance_variable(@a)operator(=)integer(1) + global_variable($a)operator(=)integer(2) + + ident(p)operator(()ident(p)operator(~)integer(6)operator(\)) + ident(p)operator(()ident(p) operator(~)integer(6)operator(\)) + ident(p)operator(()ident(p)operator(~) integer(6)operator(\)) + ident(p)operator(()ident(p) operator(~) integer(6)operator(\)) + ident(p)operator(()ident(p)operator(*)integer(11)operator(\)) + ident(p)operator(()ident(p) operator(*)integer(11)operator(\)) + ident(p)operator(()ident(p)operator(*) integer(11)operator(\)) + ident(p)operator(()ident(p) operator(*) integer(11)operator(\)) + ident(p)operator(()ident(p)operator(&)ident(proc)operator({)operator(})operator(\)) + ident(p)operator(()ident(p) operator(&)ident(proc)operator({)operator(})operator(\)) + ident(p)operator(()ident(p)operator(&) ident(proc)operator({)operator(})operator(\)) + ident(p)operator(()ident(p) operator(&) ident(proc)operator({)operator(})operator(\)) + ident(p)operator(()ident(p) operator(!)integer(1)operator(\)) +comment(# p(p ?1\) #compile error, when p is var) + ident(p)operator(()ident(p) operator(!) integer(1)operator(\)) + ident(p)operator(()ident(p) operator(?) integer(1) operator(:) integer(6)operator(\)) + ident(p)operator(()ident(p)instance_variable(@a)operator(\)) + ident(p)operator(()ident(p) instance_variable(@a)operator(\)) +comment(# p(p@ a\) #wont) +comment(# p(p @ a\) #work ) + ident(p)operator(()ident(p)comment(#a) +operator(\)) + ident(p)operator(()ident(p) comment(#a) +operator(\)) + ident(p)operator(()ident(p)comment(# a) +operator(\)) + ident(p)operator(()ident(p) comment(# a) +operator(\)) + ident(p)operator(()ident(p)global_variable($a)operator(\)) + ident(p)operator(()ident(p) global_variable($a)operator(\)) +comment(# p(p$ a\) #wont) +comment(# p(p $ a\) #work) + ident(p)operator(()ident(p)operator(%)constant(Q)operator({)symbol(:foo)operator(})operator(\)) + ident(p)operator(()ident(p) string<delimiter(%Q{)content(:foo)delimiter(})>operator(\)) + ident(p)operator(()ident(p)operator(%) constant(Q)operator({)symbol(:foo)operator(})operator(\)) + ident(p)operator(()ident(p) operator(%) constant(Q)operator({)symbol(:foo)operator(})operator(\)) + ident(p)operator(()ident(p)operator(^)integer(6)operator(\)) + ident(p)operator(()ident(p) operator(^)integer(6)operator(\)) + ident(p)operator(()ident(p)operator(^) integer(6)operator(\)) + ident(p)operator(()ident(p) operator(^) integer(6)operator(\)) + ident(p)operator(()ident(p)operator(&)integer(7)operator(\)) + ident(p)operator(()ident(p) operator(&)ident(proc)operator({)integer(7)operator(})operator(\)) + ident(p)operator(()ident(p)operator(&) integer(7)operator(\)) + ident(p)operator(()ident(p) operator(&) integer(7)operator(\)) + ident(p)operator(()ident(p)operator(()integer(2)operator(\))operator(\)) + ident(p)operator(()ident(p) operator(()integer(2)operator(\))operator(\)) + ident(p)operator(()ident(p)operator(() integer(2)operator(\))operator(\)) + ident(p)operator(()ident(p) operator(() integer(2)operator(\))operator(\)) + ident(p)operator(()ident(p)operator(()ident(p)operator(\))operator(\)) + ident(p)operator(()ident(p)operator(()operator(\))operator(\)) + ident(p)operator(()ident(p) operator(()ident(p)operator(\))operator(\)) + ident(p)operator(()ident(p) operator(()operator(\))operator(\)) + ident(p)operator(()ident(p) operator(() ident(p)operator(\))operator(\)) + ident(p)operator(()ident(p) operator(() operator(\))operator(\)) + ident(p)operator(()ident(p)operator(() ident(p)operator(\))operator(\)) + ident(p)operator(()ident(p)operator(() operator(\))operator(\)) + ident(p)operator(()ident(p)operator(\)) + ident(p)operator(()operator(()ident(p)operator(\))operator(\)) + ident(p)operator(()ident(p) operator(\)) + ident(p)operator(()operator(()ident(p) operator(\))operator(\)) + ident(p)operator(()operator(()ident(p) ident(p)operator(\))operator(\)) + ident(p)operator(()operator(()ident(p) ident(p)operator(,)ident(p)operator(\))operator(\)) + ident(p)operator(()operator(()ident(p) ident(p)operator(\))operator(\)) + ident(p)operator(()operator(()ident(p) ident(p)operator(,)ident(p)operator(\))operator(\)) + ident(p)operator(()ident(p)integer(-0)operator(\)) + ident(p)operator(()ident(p) integer(-0)operator(\)) + ident(p)operator(()ident(p)operator(-) integer(0)operator(\)) + ident(p)operator(()ident(p) operator(-) integer(0)operator(\)) + ident(p)operator(()ident(p)integer(+9)operator(\)) + ident(p)operator(()ident(p) integer(+9)operator(\)) + ident(p)operator(()ident(p)operator(+) integer(9)operator(\)) + ident(p)operator(()ident(p) operator(+) integer(9)operator(\)) + ident(p)operator(()ident(p)operator([)integer(1)operator(])operator(\)) + ident(p)operator(()ident(p) operator([)integer(1)operator(])operator(\)) + ident(p)operator(()ident(p)operator([) integer(1)operator(])operator(\)) + ident(p)operator(()ident(p) operator([) integer(1)operator(])operator(\)) + ident(p)operator(()ident(p)operator({)integer(1)operator(})operator(\)) + ident(p)operator(()ident(p) operator({)integer(1)operator(})operator(\)) + ident(p)operator(()ident(p)operator({) integer(1)operator(})operator(\)) + ident(p)operator(()ident(p) operator({) integer(1)operator(})operator(\)) + ident(p)operator(()ident(p)operator(/)integer(1)operator(\)) + ident(p)operator(()ident(p) regexp<delimiter(/)content(22\) + p(p)delimiter(/)> integer(1)operator(\)) + ident(p)operator(()ident(p) operator(/) integer(22)operator(\)) + ident(p)operator(()ident(p)operator(.)ident(_)operator(\)) + ident(p)operator(()ident(p) operator(.)ident(_)operator(\)) + ident(p)operator(()ident(p)operator(.) ident(_)operator(\)) + ident(p)operator(()ident(p) operator(.) ident(_)operator(\)) + ident(p)operator(()pre_constant(false) operator(?) ident(p)symbol(:f)operator(\)) + ident(p)operator(()pre_constant(false) operator(?) ident(p) symbol(:f)operator(\)) + ident(p)operator(()pre_constant(false) operator(?) ident(p)operator(:) ident(f)operator(\)) + ident(p)operator(()pre_constant(false) operator(?) ident(p) operator(:) ident(f)operator(\)) + ident(p)operator(()operator(()ident(p)operator(;)integer(1)operator(\))operator(\)) + ident(p)operator(()operator(()ident(p) operator(;)integer(1)operator(\))operator(\)) + ident(p)operator(()operator(()ident(p)operator(;) integer(1)operator(\))operator(\)) + ident(p)operator(()operator(()ident(p) operator(;) integer(1)operator(\))operator(\)) + ident(p)operator(()ident(p)operator(<)integer(1)operator(\)) + ident(p)operator(()ident(p) operator(<)integer(1)operator(\)) + ident(p)operator(()ident(p)operator(<) integer(1)operator(\)) + ident(p)operator(()ident(p) operator(<) integer(1)operator(\)) + ident(p)operator(()ident(p)operator(<<)integer(1)operator(\)) + ident(p)operator(()ident(p) string<delimiter(<<1)>operator(\))string<content( + p(p<< 1\) + p(p << 1\) + p(p'j'\) + p(p 'j'\) + p(p' j'\) + p(p ' j'\) + p(p"k"\) + p(p "k"\) + p(p" k"\) + p(p " k"\) + p(p|4\) + p(p |4\) + p(p| 4\) + p(p | 4\) + p(p>2\) + p(p >2\) + p(p> 2\) + p(p > 2\) + +end + +module M34 + p(p~6\) + p(p ~6\) + p(p~ 6\) + p(p ~ 6\) + p(p*[1]\) + p(p *[1]\) + p(p* [1]\) + p(p * [1]\) + p(p&proc{}\) + p(p &proc{}\) + p(p& proc{}\) + p(p & proc{}\) + p(p !1\) + p(p ?1\) + p(p ! 1\) + p(p ? 1 : 6\) + p(p@a\) + p(p @a\) +# p(p@ a\) #wont +# p(p @ a\) #work + + p(p#a +\) + p(p #a +\) + p(p# a +\) + p(p # a +\) + p(p$a\) + p(p $a\) +# p(p$ a\) #wont +# p(p $ a\) #work + p(p%Q{:foo}\) + p(p %Q{:foo}\) + p(p% Q{:foo}\) + p(p % Q{:foo}\) + p(p^6\) + p(p ^6\) + p(p^ 6\) + p(p ^ 6\) + p(p&7\) + p(p &proc{7}\) + p(p& 7\) + p(p & 7\) + p(p(2\)\) + p(p (2\)\) + p(p( 2\)\) + p(p ( 2\)\) + p(p(p\)\) + p(p(\)\) + p(p (p\)\) + p(p (\)\) + p(p ( p\)\) + p(p ( \)\) + p(p( p\)\) + p(p( \)\) + p(p\) + p((p\)\) + p(p \) + p((p \)\) + p((p p\)\) + p((p p,p\)\) + p((p p\)\) + p((p p,p\)\) + p(p-0\) + p(p -1\) + p(p- 0\) + p(p - 0\) + p(p+9\) + p(p +9\) + p(p+ 9\) + p(p + 9\) + p(p[1]\) + p(p [1]\) + p(p[ 1]\) + p(p [ 1]\) + p(p{1}\) + p(p {1}\) + p(p{ 1}\) + p(p { 1}\) + p(p/1\) + p(p /22/\) + p(p/ 1\) + p(p / 22\) + p(p._\) + p(p ._\) + p(p. _\) + p(p . _\) + p(p:f\) + p(p :f\) + p(false ? p: f\) + p(false ? p : f\) + p((p;1\)\) + p((p ;1\)\) + p((p; 1\)\) + p((p ; 1\)\) + p(p<1\) + p(p <1\) + p(p< 1\) + p(p < 1\) + p(p<<1\) + p(p <<1\) +foobar)delimiter( +1)> + ident(p)operator(()ident(p)operator(<<) integer(1)operator(\)) + ident(p)operator(()ident(p) operator(<<) integer(1)operator(\)) + ident(p)operator(()ident(p)string<delimiter(')content(j)delimiter(')>operator(\)) + ident(p)operator(()ident(p) string<delimiter(')content(j)delimiter(')>operator(\)) + ident(p)operator(()ident(p)string<delimiter(')content( j)delimiter(')>operator(\)) + ident(p)operator(()ident(p) string<delimiter(')content( j)delimiter(')>operator(\)) + ident(p)operator(()ident(p)string<delimiter(")content(k)delimiter(")>operator(\)) + ident(p)operator(()ident(p) string<delimiter(")content(k)delimiter(")>operator(\)) + ident(p)operator(()ident(p)string<delimiter(")content( k)delimiter(")>operator(\)) + ident(p)operator(()ident(p) string<delimiter(")content( k)delimiter(")>operator(\)) + ident(p)operator(()ident(p)operator(|)integer(4)operator(\)) + ident(p)operator(()ident(p) operator(|)integer(4)operator(\)) + ident(p)operator(()ident(p)operator(|) integer(4)operator(\)) + ident(p)operator(()ident(p) operator(|) integer(4)operator(\)) + ident(p)operator(()ident(p)operator(>)integer(2)operator(\)) + ident(p)operator(()ident(p) operator(>)integer(2)operator(\)) + ident(p)operator(()ident(p)operator(>) integer(2)operator(\)) + ident(p)operator(()ident(p) operator(>) integer(2)operator(\)) + +reserved(end) + + +reserved(def) method(bob)operator(()ident(x)operator(\)) ident(x) reserved(end) +reserved(def) method(bill)operator(()ident(x)operator(\)) ident(x) reserved(end) +ident(p)operator(()ident(bob) string<delimiter(%()content(22)delimiter(\))>operator(\)) +reserved(for) ident(bob) reserved(in) operator([)integer(100)operator(]) reserved(do) ident(p)operator(()ident(bob) string<delimiter(%()content(22)delimiter(\))>operator(\)) reserved(end) +ident(p)operator(()ident(bob) string<delimiter(%()content(22)delimiter(\))>operator(\)) +reserved(def) method(%)operator(()ident(n)operator(\)) ident(to_s)operator(+)string<delimiter(")content(%)inline<delimiter(#{)ident(n)delimiter(})>delimiter(")> reserved(end) +ident(p)operator(()ident(bill) string<delimiter(%()content(22)delimiter(\))>operator(\)) +reserved(begin) ident(sdjkfsjkdfsd)operator(;) reserved(rescue) constant(Object) operator(=)operator(>) ident(bill)operator(;) ident(p)operator(()ident(bill) string<delimiter(%()content(22)delimiter(\))>operator(\)) reserved(end) +ident(p)operator(()ident(bill) string<delimiter(%()content(22)delimiter(\))>operator(\)) +reserved(undef) method(%) + +reserved(class) class(Object) + +ident(public) symbol(:`) +reserved(def) method(`)operator(()ident(s)operator(\)) + ident(print) string<delimiter(")content(bq: )inline<delimiter(#{)ident(s)delimiter(})>char(\\n)delimiter(")> +reserved(end) +reserved(end) + +integer(69)operator(.)operator(`)operator(()string<delimiter(')content(what a world)delimiter(')>operator(\)) + +integer(79)operator(::)operator(`)operator(()string<delimiter(')content(what a word)delimiter(')>operator(\)) + +ident(p) symbol(:`) + +ident(p)operator({)operator(}) +ident(p) operator({)operator(}) +ident(a)operator(=)integer(5) +ident(p) ident(p) integer(+5) +ident(p) ident(a) integer(+5) + +reserved(def) pre_constant(nil)operator(.)operator(+)operator(()ident(x)operator(\)) operator(~)ident(x) reserved(end) +reserved(def) pre_constant(nil)operator(.)operator([])operator(()operator(*)ident(x)operator(\)) operator([)ident(x)operator(]) reserved(end) +ident(p)operator(() ident(p) operator(+) integer(5) operator(\)) +ident(p)operator(() ident(p) integer(+5) operator(\)) +ident(p)operator(() ident(p)integer(+5) operator(\)) +ident(p)operator(() ident(p)operator([)operator(]) operator(\)) +ident(p)operator(() ident(p) operator([)operator(]) operator(\)) +ident(p)operator(() ident(p) operator([) operator(]) operator(\)) +reserved(class) class(NilClass)operator(;) reserved(undef) method(+)operator(,)method([]) reserved(end) + +reserved(class) class(Foou) + ident(public) + reserved(def) method([]) ident(x)operator(=)integer(-100)operator(,)operator(&)ident(y)operator(;) ident(p) ident(x)operator(;) integer(100) reserved(end) +reserved(end) +ident(a0)operator(=)integer(8) +ident(p) constant(Foou)operator(.)ident(new)operator(.)operator([])operator(!)pre_constant(false) comment(#value) +ident(p) constant(Foou)operator(.)ident(new)operator(.)operator([]) operator(!)pre_constant(false) comment(#value) +ident(p) constant(Foou)operator(.)ident(new)operator(.)operator([])operator(~)integer(9) comment(#value) +ident(p) constant(Foou)operator(.)ident(new)operator(.)operator([]) operator(~)integer(9) comment(#value) +ident(p) constant(Foou)operator(.)ident(new)operator(.)operator([])integer(-9) comment(#op) +ident(p) constant(Foou)operator(.)ident(new)operator(.)operator([])integer(+9) comment(#op) +ident(p) constant(Foou)operator(.)ident(new)operator(.)operator([]) integer(-9) comment(#value) +ident(p) constant(Foou)operator(.)ident(new)operator(.)operator([]) integer(+9) comment(#value) +ident(p) constant(Foou)operator(.)ident(new)operator(.)operator([])operator(<<)integer(9) comment(#op) +ident(p) constant(Foou)operator(.)ident(new)operator(.)operator([]) string<delimiter(<<9)> comment(#value)string<content( +foobar)delimiter( +9)> +ident(p) constant(Foou)operator(.)ident(new)operator(.)operator([])operator(%)integer(9) comment(#op) +ident(p) constant(Foou)operator(.)ident(new)operator(.)operator([])operator(/)integer(9) comment(#op) +ident(p) constant(Foou)operator(.)ident(new)operator(.)operator([]) string<delimiter(%()content(9)delimiter(\))> comment(#value) +ident(p) constant(Foou)operator(.)ident(new)operator(.)operator([]) operator(/)integer(9)operator(/) comment(#value) +ident(p) constant(Foou)operator(.)ident(new)operator(.)operator([])global_variable($9) comment(#value) +ident(p) constant(Foou)operator(.)ident(new)operator(.)operator([])ident(a0) comment(#value) +ident(p) constant(Foou)operator(.)ident(new)operator(.)operator([]) global_variable($9) comment(#value) +ident(p) constant(Foou)operator(.)ident(new)operator(.)operator([]) ident(a0) comment(#value) +ident(p) constant(Foou)operator(.)ident(new)operator(.)operator([])operator({)integer(9)operator(}) comment(#lambda (op\)) +ident(p) constant(Foou)operator(.)ident(new)operator(.)operator([]) operator({)integer(9)operator(}) comment(#lambda (op\)) + +reserved(if) ident(p) reserved(then) ident(p) reserved(end) + +ident(p)operator(()operator({)symbol(:foo)operator(=)operator(>)symbol(:bar)operator(})operator(\)) comment(#why does this work? i'd think that ':foo=' would be 1 token) +ident(p) constant(EMPTY) operator(=) integer(0) +ident(p) constant(BLACK) operator(=) integer(1) +ident(p) constant(WHITE) operator(=) operator(-) constant(BLACK) + + ident(a)operator(=)ident(b)operator(=)ident(c)operator(=)integer(0) + ident(a) operator(?) ident(b)symbol(:c) + ident(a) integer(?b)symbol(:c) + + ident(p)operator(()ident(a) operator(?) ident(b)symbol(:c)operator(\)) + ident(p)operator(()ident(a) integer(?b)symbol(:c)operator(\)) + + +ident(p)operator(~)integer(4) +ident(p)symbol(:f) +ident(p)operator(()operator(~)integer(4)operator(\))operator({)operator(}) +ident(p)operator(()symbol(:f)operator(\))operator({)operator(}) +ident(h)operator(=)operator({)operator(}) +ident(h)operator(.)ident(default)operator(=)symbol(:foo) + +ident(p) reserved(def) operator(()ident(h)operator(=)string<delimiter(")content(foobar)delimiter(")>operator(\))operator(.)ident(default)operator(=) ident(v)operator(;) ident(p) instance_variable(@v)operator(=)ident(v)operator(;)ident(v) reserved(end) +ident(p) ident(h) + +ident(p) ident(h)operator(.)ident(default)operator(=)symbol(:b) + +ident(x)operator(,) operator(()operator(*)ident(y)operator(\)) operator(=) operator([)symbol(:x)operator(,) symbol(:y)operator(,) symbol(:z)operator(]) +ident(p) ident(x) +ident(p) ident(y) + +ident(x)operator(,) operator(*)ident(y) operator(=) operator([)symbol(:x)operator(,) symbol(:y)operator(,) symbol(:z)operator(]) +ident(p) ident(x) +ident(p) ident(y) + +ident(x)operator(,) operator(*) operator(=) operator([)symbol(:x)operator(,) symbol(:y)operator(,) symbol(:z)operator(]) +ident(p) ident(x) + + + +ident(p) ident(Array)operator(()string<delimiter(")content(foo)char(\\n)content(bar)delimiter(")>operator(\)) + + + +ident(p) operator(+)operator(()integer(4)operator(\)) +ident(p) operator(-)operator(()integer(4)operator(\)) + +ident(p) symbol<symbol(:)delimiter(')char(\\\\)delimiter(')> + +reserved(class) class(Foop) + reserved(def) constant(Foop)operator(.)ident(bar) ident(a)operator(,)ident(b) + ident(p) ident(a)operator(,)ident(b) + reserved(end) +reserved(end) +constant(Foop)operator(.)ident(bar) integer(1)operator(,)integer(2) +constant(Foop)operator(::)ident(bar) integer(3)operator(,)integer(4) + + +reserved(class) class(Foop) + reserved(def) constant(Foop)operator(::)ident(baz) ident(a)operator(,)ident(b) + ident(p) symbol(:baz)operator(,)ident(a)operator(,)ident(b) + reserved(end) +reserved(end) +constant(Foop)operator(.)ident(baz) integer(5)operator(,)integer(6) +constant(Foop)operator(::)ident(baz) integer(7)operator(,)integer(8) + + + +ident(without_creating)operator(=)ident(widgetname)operator(=)pre_constant(nil) + reserved(if) ident(without_creating) operator(&&) operator(!)ident(widgetname) comment(#foo) + ident(fail) constant(ArgumentError)operator(,) + string<delimiter(")content(if set 'without_creating' to true, need to define 'widgetname')delimiter(")> + reserved(end) + + + +comment(=begin disable for now + +#class, module, and def should temporarily hide local variables +def mopsdfjskdf arg; arg*2 end +mopsdfjskdf=5 + class C + p mopsdfjskdf %(3\) #calls method + end + +module M + p mopsdfjskdf %(4\) #calls method +end + + def d + p mopsdfjskdf %(5\) #calls method + end +p d +p mopsdfjskdf %(6\) #reads variable +p proc{mopsdfjskdf %(7\)}[] #reads variable + +#fancy symbols not supported yet +p %s{symbol} +=end) + +comment(#multiple assignment test) +ident(proc) operator({) + ident(a)operator(,)ident(b)operator(,)ident(c)operator(,)ident(d)operator(,)ident(e)operator(,)ident(f)operator(,)ident(g)operator(,)ident(h)operator(,)ident(i)operator(,)ident(j)operator(,)ident(k)operator(=)integer(1)operator(,)integer(2)operator(,)integer(3)operator(,)integer(4)operator(,)integer(5)operator(,)integer(6)operator(,)integer(7)operator(,)integer(8)operator(,)integer(9)operator(,)integer(10)operator(,)integer(11) + ident(p)operator(()ident(b) string<delimiter(%()content(c)delimiter(\))>operator(\)) + ident(p)operator(()ident(a) string<delimiter(%()content(c)delimiter(\))>operator(\)) + ident(p)operator(()ident(k) string<delimiter(%()content(c)delimiter(\))>operator(\)) + ident(p)operator(()ident(p) string<delimiter(%()content(c)delimiter(\))>operator(\)) +operator(})operator(.)ident(call) + + +comment(=begin disable for now +p "#{<<kekerz}#{"foob" +zimpler +kekerz +}" + + +aaa=<<whatnot; p "#{'uh,yeah' +gonna take it down, to the nitty-grit +gonna tell you mother-fuckers why you ain't shit +cause suckers like you just make me strong +whatnot +}" +p aaa + +#test variable creation in string inclusion +#currently broken because string inclusions +#are lexed by a separate lexer! +proc { + p "jentawz: #{baz=200}" + p( baz %(9\)\) +}.call +=end) + +comment(=begin ought to work...ruby doesn't like +class A +class B +class C +end +end +end +def A::B::C::d(\) :abcd end +def A::B::d(\) :abd end #this used to work as well... i think + +def nil.d=; end #this works +def (;\).d=; end +def (\).d=; end +p def (p h="foobar";\).default= v; p @v=v;v end +p def (p h="foobar";h\).default= v; p @v=v;v end + +p~4{} +p:f{} +p ~4{} +p :f{} + +def g a=:g; [a] end +g g g #this works +g *g #this works +g *g g #this doesn't + +[nil,p 5] +"foo"+[1].join' ' + +class Fook +def foo; end + + +#these work: +(not true\) +p(!true\) #etc +(true if false\) #etc +(true and false\) #etc +(undef foo\) +(alias bar foo\) +(BEGIN{p :yyy}\) + +#these don't: +p(not true\) +p(true if false\) #etc +p(true and false\) #etc +p(undef foo\) +p(alias bar foo\) +p(BEGIN{p :yyy}\) +end + +=end) + +ident(proc) operator({) +operator(}) + +ident(p) string<delimiter(")inline<delimiter(#{)string<delimiter(<<foobar3)>delimiter(})>delimiter(")> +ident(bim) +ident(baz) +ident(bof) +ident(foobar3) + +reserved(def) method(func) + ident(a)operator(,)ident(b)operator(,)operator(*) operator(=) operator([)integer(1)operator(,)integer(2)operator(,)integer(3)operator(,)integer(4)operator(,)integer(5)operator(,)integer(6)operator(,)integer(7)operator(,)integer(8)operator(]) + ident(p) ident(a)operator(,)ident(b) + ident(a)operator(,)ident(b)operator(,) operator(=) operator([)integer(1)operator(,)integer(2)operator(,)integer(3)operator(,)integer(4)operator(,)integer(5)operator(,)integer(6)operator(,)integer(7)operator(,)integer(8)operator(]) + ident(p) ident(a)operator(,)ident(b) + + ident(a)operator(,)ident(b) operator(=) operator([)integer(1)operator(,)integer(2)operator(,)integer(3)operator(,)integer(4)operator(,)integer(5)operator(,)integer(6)operator(,)integer(7)operator(,)integer(8)operator(]) + ident(p) ident(a)operator(,)ident(b) + ident(a)operator(,)operator(*)ident(b) operator(=) operator([)integer(1)operator(,)integer(2)operator(,)integer(3)operator(,)integer(4)operator(,)integer(5)operator(,)integer(6)operator(,)integer(7)operator(,)integer(8)operator(]) + ident(p) ident(a)operator(,)ident(b) + + ident(a)operator(,)ident(b)operator(,)operator(*)ident(c)operator(=)operator([)integer(1)operator(,)integer(2)operator(,)integer(3)operator(,)integer(4)operator(,)integer(5)operator(,)integer(6)operator(,)integer(7)operator(,)integer(8)operator(]) + ident(a)operator(,)ident(b)operator(,)operator(*) ident(c)operator(=)operator([)integer(1)operator(,)integer(2)operator(,)integer(3)operator(,)integer(4)operator(,)integer(5)operator(,)integer(6)operator(,)integer(7)operator(,)integer(8)operator(]) +reserved(end) +ident(func) + + +ident(p)operator(() regexp<delimiter(%r{)char(\\/)content($)delimiter(})>operator(\)) +ident(p)operator(() regexp<delimiter(%r~)content(<!include:([)char(\\/)char(\\w)char(\\.)char(\\-)content(]+\)>)delimiter(~)modifier(m)>operator(\)) + +ident(p) string<delimiter(<<end)>string<content( +)inline<delimiter(#{)ident(compile_body)delimiter(})>char(\\ +)inline<delimiter(#{)ident(outvar)delimiter(})>delimiter( +end)> + + + + + +ident(proc) operator({) + ident(h)operator(=)operator({)symbol(:a)operator(=)operator(>)operator(()ident(foo)operator(=)integer(100)operator(\))operator(}) + ident(p)operator(() ident(foo) string<delimiter(%()content(5)delimiter(\))>operator(\)) +operator(})operator(.)ident(call) + + +ident(p) string<delimiter(")inline<delimiter(#{)string<delimiter(<<foobar3)>delimiter(})>delimiter(")> +ident(bim) +ident(baz) +ident(bof) +ident(foobar3) + +ident(p) string<delimiter(")inline<delimiter(#{)string<delimiter(<<foobar2)>string<content( +bim +baz +bof)delimiter( +foobar2)> +delimiter(})>delimiter(")> + +ident(p) string<delimiter(<<one)> operator(;) ident(p) string<delimiter(")inline<delimiter(#{)string<delimiter(<<two)>delimiter(})>delimiter(")>string<content( +1111111111111111 +fdsgdfgdsfffff)delimiter( +one)>string<content( +2222222222222222 +sdfasdfasdfads)delimiter( +two)> +ident(p) string<delimiter(")inline<delimiter(#{)string<delimiter(<<foobar0)>operator(.)ident(each)operator(()string<delimiter(')content(|)delimiter(')>operator(\))operator({)operator(|)ident(s)operator(|) string<delimiter(')content(\\n)content(thort: )delimiter(')>operator(+)ident(s)operator(}) delimiter(})>delimiter(")> +ident(jbvd)operator(|)ident(g4543ghb)operator(|)operator(!)instance_variable(@G)global_variable($dfsd)operator(|)ident(fafr)operator(|)ident(e) +operator(|)ident(s4e5rrwware)operator(|)constant(BBBBB)operator(|*)operator(&)operator(^)operator(()operator(*&)operator(^)operator(>)string<delimiter(")content(PMK:njs;d| + +foobar0 + +p )delimiter(")>comment(#{<<foobar1.each('|'\){|s| '\\nthort: '+s}) +ident(jbvd)operator(|)ident(g4543ghb)operator(|)operator(!)instance_variable(@G)global_variable($dfsd)operator(|)ident(fafr)operator(|)ident(e) +operator(|)ident(s4e5rrwware)operator(|)constant(BBBBB)operator(|*)operator(&)operator(^)operator(()operator(*&)operator(^)operator(>)string<delimiter(")content(PMK:njs;d| + +foobar1 +})delimiter(")> + +reserved(def) method(foo)operator(()ident(a)operator(=)string<delimiter(<<a)>operator(,)ident(b)operator(=)string<delimiter(<<b)>operator(,)ident(c)operator(=)string<delimiter(<<c)>operator(\))string<content( +jfksdkjf +dkljjkf)delimiter( +a)>string<content( +kdljfjkdg +dfglkdfkgjdf +dkf)delimiter( +b)>string<content( +lkdffdjksadhf +sdflkdjgsfdkjgsdg +dsfg;lkdflisgffd +g)delimiter( +c)> + + ident(a)operator(+)ident(b)operator(+)ident(c) + +reserved(end) +ident(p) ident(foo) + + + +global_variable($a)operator(=)integer(1) +instance_variable(@b)operator(=)integer(2) +class_variable(@@c)operator(=)integer(3) +ident(p) string<delimiter(")escape(#)global_variable($a)content( )escape(#)instance_variable(@b)content( )escape(#)class_variable(@@c)content( )inline<delimiter(#{)global_variable($a)operator(+)instance_variable(@b)operator(+)class_variable(@@c)delimiter(})>delimiter(")> +ident(p) string<delimiter(")char(\\#)content($a )char(\\#)content(@b )char(\\#)content(@@c )char(\\#)content({$a+@b+@@c})delimiter(")> +ident(p) string<delimiter(')content(#$a #@b #@@c #{$a+@b+@@c})delimiter(')> +ident(p) string<delimiter(')content(\\#)content($a )content(\\#)content(@b )content(\\#)content(@@c )content(\\#)content({$a+@b+@@c})delimiter(')> +ident(p) string<delimiter(%w")content(#$a #@b #@@c #{$a+@b+@@c})delimiter(")> +ident(p) string<delimiter(%w")content(\\#)content($a )content(\\#)content(@b )content(\\#)content(@@c )content(\\#)content({$a+@b+@@c})delimiter(")> +ident(p) string<delimiter(%W")escape(#)global_variable($a)content( )escape(#)instance_variable(@b)content( )escape(#)class_variable(@@c)content( )inline<delimiter(#{)global_variable($a)operator(+)instance_variable(@b)operator(+)class_variable(@@c)delimiter(})>delimiter(")> +ident(p) string<delimiter(%W")char(\\#)content($a )char(\\#)content(@b )char(\\#)content(@@c )char(\\#)content({$a+@b+@@c})delimiter(")> +ident(p) string<delimiter(%Q[)escape(#)global_variable($a)content( )escape(#)instance_variable(@b)content( )escape(#)class_variable(@@c)content( )inline<delimiter(#{)global_variable($a)operator(+)instance_variable(@b)operator(+)class_variable(@@c)delimiter(})>delimiter(])> +ident(p) string<delimiter(%Q[)char(\\#)content($a )char(\\#)content(@b )char(\\#)content(@@c )char(\\#)content({$a+@b+@@c})delimiter(])> +ident(p) shell<delimiter(`)content(echo )escape(#)global_variable($a)content( )escape(#)instance_variable(@b)content( )escape(#)class_variable(@@c)content( )inline<delimiter(#{)global_variable($a)operator(+)instance_variable(@b)operator(+)class_variable(@@c)delimiter(})>delimiter(`)> +ident(p) shell<delimiter(`)content(echo )char(\\#)content($a )char(\\#)content(@b )char(\\#)content(@@c )char(\\#)content({$a+@b+@@c})delimiter(`)> +ident(p)operator(()regexp<delimiter(/)escape(#)global_variable($a)content( )escape(#)instance_variable(@b)content( )escape(#)class_variable(@@c)content( )inline<delimiter(#{)global_variable($a)operator(+)instance_variable(@b)operator(+)class_variable(@@c)delimiter(})>delimiter(/)>operator(\)) +comment(#p(/\\#$a \\#@b \\#@@c \\#{$a+@b+@@c}/\) #moved to w.rb) + +reserved(class) class(AA)operator(;) reserved(class) class(BB)operator(;) reserved(class) class(CC) +constant(FFOO)operator(=)integer(1) +reserved(end) reserved(end) reserved(end) + +ident(p) constant(AA)operator(::)constant(BB)operator(::)constant(CC)operator(::)constant(FFOO) + +ident(compile_body)operator(=)ident(outvar)operator(=)string<delimiter(')content(foob)delimiter(')> + +reserved(if) pre_constant(false) + ident(method_src) operator(=) ident(c)operator(.)ident(compile)operator(()ident(template)operator(,) operator(()constant(HtmlCompiler)operator(::)constant(AnyData)operator(.)ident(new)operator(\))operator(\))operator(.)ident(join)operator(()string<delimiter(")char(\\n)delimiter(")>operator(\)) operator(+) + string<delimiter(")char(\\n)content(# generated by PartsTemplate::compile_partstemplate at )inline<delimiter(#{)constant(Time)operator(.)ident(new)delimiter(})>char(\\n)delimiter(")> + ident(rescu) integer(-1) +reserved(end) + + ident(p)operator(()string<delimiter(')content(rb_out)delimiter(')>operator(,) string<delimiter(')content(args)delimiter(')>operator(,) string<delimiter(<<-'EOL')>operator(\))string<content( + regsub -all {!} $args {)char(\\\\)content(!} args + regsub -all "{" $args ")char(\\\\)content({" args + if {[set st [catch {ruby [format "TkCore.callback %%Q!%s!" $args]} ret]] != 0} { + return -code $st $ret + } { + return $ret + })delimiter( + EOL)> + +reserved(def) method(add)operator(()operator(*)ident(args)operator(\)) + pre_constant(self)operator(.)operator(<<)operator(()operator(*)ident(args)operator(\)) +reserved(end) + + + +ident(val)operator(=)string<delimiter(%[)content(13,17,22,"hike", ?)char(\\s)delimiter(])> + reserved(if) ident(val)operator(.)ident(include?) integer(?\\s) + ident(p) ident(val)operator(.)ident(split)operator(.)ident(collect)operator({)operator(|)ident(v)operator(|) operator(()ident(v)operator(\))operator(}) + reserved(end) +ident(p) string<delimiter(")inline<delimiter(#{)delimiter(})>delimiter(")> +ident(p) string<delimiter(")content(#(1\))delimiter(")> +reserved(class) class(Hosts) +reserved(end) +reserved(class) class(DNS) operator(<) constant(Hosts) +reserved(end) +reserved(def) method(intialize)operator(()ident(resolvers)operator(=)operator([)constant(Hosts)operator(.)ident(new)operator(,) constant(DNS)operator(.)ident(new)operator(])operator(\)) reserved(end) +reserved(def) method(environment)operator(()ident(env) operator(=) constant(File)operator(.)ident(basename)operator(()global_variable($0)operator(,) string<delimiter(')content(.*)delimiter(')>operator(\))operator(\)) reserved(end) + +reserved(def) method(ssssss) operator(&)ident(block) +reserved(end) +reserved(def) method(params_quoted)operator(()ident(field_name)operator(,) ident(default)operator(\)) + reserved(if) ident(block_given?) reserved(then) reserved(yield) ident(field_name) reserved(else) ident(default) reserved(end) +reserved(end) +reserved(def) method(==)operator(()ident(o)operator(\)) integer(444) reserved(end) +reserved(def) constant(String)operator(.)ident(ffff4)operator(()operator(\)) pre_constant(self)operator(.)ident(to_s)operator(+)string<delimiter(")content(ffff)delimiter(")> reserved(end) + +ident(p) operator(*)operator([)operator(]) +reserved(for) ident(i) reserved(in) \ +operator([)integer(44)operator(,)integer(55)operator(,)integer(66)operator(,)integer(77)operator(,)integer(88)operator(]) reserved(do) ident(p) ident(i)operator(**)constant(Math)operator(.)ident(sqrt)operator(()ident(i)operator(\)) reserved(end) + +comment(#() +reserved(for) ident(i) reserved(in) reserved(if) +pre_constant(false) reserved(then) ident(foob12345)operator(;) reserved(else) operator([)integer(44)operator(,)integer(55)operator(,)integer(66)operator(,)integer(77)operator(,)integer(88)operator(]) reserved(end) reserved(do) ident(p) ident(i)operator(**)constant(Math)operator(.)ident(sqrt)operator(()ident(i)operator(\)) reserved(end) +comment(#\)) +operator(() +reserved(for) ident(i) reserved(in) reserved(if) pre_constant(false) reserved(then) +ident(foob12345)operator(;) reserved(else) operator([)integer(44)operator(,)integer(55)operator(,)integer(66)operator(,)integer(77)operator(,)integer(88)operator(]) reserved(end) reserved(do) ident(p) ident(i)operator(**)constant(Math)operator(.)ident(sqrt)operator(()ident(i)operator(\)) reserved(end) + +ident(c)operator(=)ident(j)operator(=)integer(0) +reserved(until) reserved(while) ident(j)operator(<)integer(10) reserved(do) ident(j)operator(+=)integer(1) reserved(end)operator(.)ident(nil?) reserved(do) ident(p) string<delimiter(')content(pppppppppp)delimiter(')> reserved(end) +reserved(for) ident(i) reserved(in) reserved(if) pre_constant(false) reserved(then) ident(foob12345)operator(;) +reserved(else) operator([)integer(44)operator(,)integer(55)operator(,)integer(66)operator(,)integer(77)operator(,)integer(88)operator(]) reserved(end) reserved(do) ident(p) ident(i)operator(**)constant(Math)operator(.)ident(sqrt)operator(()ident(i)operator(\)) reserved(end) + +reserved(for) ident(i) reserved(in) reserved(if) pre_constant(false) reserved(then) ident(foob12345)operator(;) reserved(else) +operator([)integer(44)operator(,)integer(55)operator(,)integer(66)operator(,)integer(77)operator(,)integer(88)operator(]) reserved(end) reserved(do) ident(p) ident(i)operator(**)constant(Math)operator(.)ident(sqrt)operator(()ident(i)operator(\)) reserved(end) + + +reserved(for) ident(i) reserved(in) operator(()ident(c)operator(;) +operator([)integer(44)operator(,)integer(55)operator(,)integer(66)operator(,)integer(77)operator(,)integer(88)operator(])operator(\)) reserved(do) ident(p) ident(i)operator(**)constant(Math)operator(.)ident(sqrt)operator(()ident(i)operator(\)) reserved(end) +operator(\)) +operator(() + +reserved(for) ident(i) reserved(in) operator(()reserved(begin) +operator([)integer(44)operator(,)integer(55)operator(,)integer(66)operator(,)integer(77)operator(,)integer(88)operator(]) reserved(end)operator(\)) reserved(do) ident(p) ident(i)operator(**)constant(Math)operator(.)ident(sqrt)operator(()ident(i)operator(\)) reserved(end) + +reserved(for) ident(i) reserved(in) reserved(if) pre_constant(false) reserved(then) ident(foob12345)operator(;) reserved(else) +operator([)integer(44)operator(,)integer(55)operator(,)integer(66)operator(,)integer(77)operator(,)integer(88)operator(]) reserved(end) reserved(do) ident(p) ident(i)operator(**)constant(Math)operator(.)ident(sqrt)operator(()ident(i)operator(\)) reserved(end) + +reserved(for) ident(i) reserved(in) operator(() + +operator([)integer(44)operator(,)integer(55)operator(,)integer(66)operator(,)integer(77)operator(,)integer(88)operator(])operator(\)) reserved(do) ident(p) ident(i)operator(**)constant(Math)operator(.)ident(sqrt)operator(()ident(i)operator(\)) reserved(end) + +reserved(for) ident(i) reserved(in) operator(() +operator([)integer(44)operator(,)integer(55)operator(,)integer(66)operator(,)integer(77)operator(,)integer(88)operator(])operator(\)) reserved(do) ident(p) ident(i)operator(**)constant(Math)operator(.)ident(sqrt)operator(()ident(i)operator(\)) reserved(end) + +operator(\)) + + +reserved(def) method(yy)operator(;)reserved(yield) reserved(end) + +ident(block)operator(=)ident(proc)operator({)ident(p) string<delimiter(")content(blah blah)delimiter(")>operator(}) + +ident(yy) operator(&)ident(block) +ident(p)operator(()integer(1)operator(.)operator(+)integer(1)operator(\)) +ident(p) ident(pppp) + +reserved(module) class(M66) +ident(p)operator(()ident(proc) reserved(do) + ident(p)operator(=)integer(123) +reserved(end)operator(.)ident(call)operator(\)) + +ident(p) ident(proc) operator({) + ident(p)operator(=)integer(123) +operator(})operator(.)ident(call) + +ident(p) reserved(def) method(pppp) + ident(p)operator(=)integer(123) +reserved(end) +ident(p) reserved(module) class(Ppp) + ident(p)operator(=)integer(123) +reserved(end) +ident(p) reserved(class) class(Pppp) operator(<) constant(String) + ident(p)operator(=)integer(123) +reserved(end) +reserved(end) + + reserved(def) method(_make_regex)operator(()ident(str)operator(\)) operator(/)operator(()operator([)comment(#{Regexp.escape(str\)}]\)/n end) +ident(p) ident(_make_regex)operator(()string<delimiter(")content(8smdf,34rh)char(\\#)content(@)char(\\#)content($%$gfm/[]dD)delimiter(")>operator(\)) + + +ident(p) string<delimiter(")escape(#)global_variable($a)content( )escape(#)instance_variable(@b)content( )escape(#)class_variable(@@c)content( + +d e f +)escape(#)global_variable($a)content( )escape(#)instance_variable(@b)content( )escape(#)class_variable(@@c)content( +)delimiter(")> + +ident(p) string<delimiter(")char(\\")delimiter(")> + +ident(a)operator(=)ident(a)operator(.)ident(to_s) +reserved(class) operator(<<)class(a) + reserved(def) method(foobar) + pre_constant(self)operator(*)integer(101) + reserved(end) + reserved(alias) ident(eql?) operator(==) +reserved(end) + +ident(p) ident(a)operator(.)ident(foobar) + +ident(p)operator(()regexp<delimiter(/)content(^)char(\\s)content(*(([+-)char(\\/)content(*&)char(\\|)content(^]|<<|>>|)char(\\|)char(\\|)content(|)char(\\&)char(\\&)content(\)=|)char(\\&)char(\\&)content(|)char(\\|)char(\\|)content(\))delimiter(/)>operator(\)) +ident(p)operator(()symbol(:%)operator(\)) +ident(p)operator(() operator({) symbol(:class) operator(=)operator(>) ident(class_)operator(=)integer(0)operator(})operator(\)) +ident(p) ident(cls_name) operator(=) operator({)operator(})operator([)symbol(:class)operator(]) + + +ident(p) ident(foo) +ident(p) string<delimiter(")inline<delimiter(#{)global_variable($!)operator(.)ident(class)delimiter(})>delimiter(")> +ident(p) symbol(:p) +ident(p)operator(()symbol(:p)operator(\)) +ident(p)operator(()symbol<symbol(:)delimiter(")content([])delimiter(")>operator(\)) +ident(p) symbol<symbol(:)delimiter(")content([])delimiter(")> +ident(p)operator(()string<delimiter(")char(\\\\)delimiter(")>operator(\)) +ident(p)operator(()regexp<delimiter(/)char(\\\\)delimiter(/)>operator(\)) +ident(p)operator(()regexp<delimiter(/)content([)char(\\\\)content(])delimiter(/)>operator(\)) +ident(p) integer(0x80) +ident(p) integer(?p) +ident(p) float(0.1) +ident(p) float(0.8) +ident(p) float(0.9) +ident(p)operator(()integer(-1)operator(\)) +ident(p) string<delimiter(%/)content(p)delimiter(/)> +ident(p) string<delimiter(%Q[)content(<LI>)delimiter(])> +ident(i)operator(=)integer(99) +ident(p) string<delimiter(%Q[)content(<LI><A HREF=")inline<delimiter(#{)ident(i)operator([)integer(3)operator(])delimiter(})>content(.html)char(\\#)inline<delimiter(#{)ident(i)operator([)integer(4)operator(])delimiter(})>content(">)inline<delimiter(#{)ident(i)operator([)integer(0)operator(])operator(+)ident(i)operator([)integer(1)operator(])operator(+)operator(()ident(i)operator([)integer(2)operator(])operator(\))delimiter(})>content(</A>)char(\\n)delimiter(])> +ident(p)operator(()symbol(:side)operator(=)operator(>)symbol(:top)operator(\)) +ident(p) string<delimiter(%w[)content(a b c + d e f)delimiter(])> +ident(p) string<delimiter(%w[)content(a b c)content(\\n)content( + d e f)delimiter(])> +ident(p) string<delimiter(%w[)char(\\\\)delimiter(])> +ident(p) string<delimiter(%w[)char(\\])delimiter(])> +ident(p) symbol(:+) +ident(p) integer(99) operator(/) integer(3) + +ident(a)operator(=)integer(99)operator(;)ident(b)operator(=)integer(3) +ident(p) integer(1)operator(+)operator(()ident(a) operator(/) ident(b)operator(\)) +ident(p) string<delimiter(%Q[)char(\\")delimiter(])> +ident(p) string<delimiter(%Q[)content( some )nesting_delimiter([)content(nested)nesting_delimiter(])content( text)delimiter(])> + +reserved(if) pre_constant(false) + ident(formatter)operator(.)ident(format_element)operator(()ident(element)operator(\)) reserved(do) + ident(amrita_expand_and_format1)operator(()ident(element)operator(,) ident(context)operator(,) ident(formatter)operator(\)) + reserved(end) +reserved(end) +reserved(if) pre_constant(false) + ident(ret) operator(=) string<delimiter(<<-END)>string<content( + @@parts_template = )inline<delimiter(#{)ident(template)operator(.)ident(to_ruby)delimiter(})>content( + def parts_template + @@parts_template + end + + )inline<delimiter(#{)ident(c)operator(.)ident(const_def_src)operator(.)ident(join)operator(()string<delimiter(")char(\\n)delimiter(")>operator(\))delimiter(})>content( + def amrita_expand_and_format(element, context, formatter\) + if element.tagname_symbol == :span and element.attrs.size == 0 + amrita_expand_and_format1(element, context, formatter\) + else + formatter.format_element(element\) do + amrita_expand_and_format1(element, context, formatter\) + end + end + end + + def amrita_expand_and_format1(element, context, formatter\) + )inline<delimiter(#{)ident(method_src)delimiter(})>content( + end)delimiter( + END)> + ident(j)operator(=)integer(55) +reserved(end) + +ident(p) string<delimiter(')content( +)delimiter(')> +ident(p) string<delimiter(')content(\\n)delimiter(')> +ident(p) string<delimiter(")content( +)delimiter(")> +ident(p) string<delimiter(")char(\\n)delimiter(")> +ident(p) string<delimiter(%w/)content( +)delimiter(/)> +ident(p) string<delimiter(%w/)content(\\n)delimiter(/)> + +ident(p) string<delimiter(%W/)content( +)delimiter(/)> +ident(p) string<delimiter(%W/)char(\\n)delimiter(/)> +ident(p)operator(()regexp<delimiter(/)content( +)delimiter(/)>operator(\)) +ident(p)operator(()regexp<delimiter(/)char(\\n)delimiter(/)>operator(\)) +ident(p) ident(proc) operator({) + ident(p) shell<delimiter(`)content( + )delimiter(`)> + ident(p) shell<delimiter(`)char(\\n)delimiter(`)> +operator(}) + + + +ident(p)operator(()regexp<delimiter(%r[)content(foo)delimiter(])modifier(i)>operator(\)) +comment(#breakpoint) +ident(p) string<delimiter(<<stuff)>operator(+)string<delimiter(')content(foobar)delimiter(')>operator(.)ident(tr)operator(()string<delimiter(')content(j-l)delimiter(')>operator(,)string<delimiter(')content(d-f)delimiter(')>operator(\))string<content( +"more stuff" +12345678 +the quick brown fox jumped over the lazy dog)delimiter( +stuff)> + +comment(=begin doesn't work +p <<stuff+'foobar'.tr('j-l','d-f'\)\\ ++"more stuff" +12345678 +the quick brown fox jumped over the lazy dog +stuff +=end) + +ident(p) constant(ENV)operator([)string<delimiter(")content(AmritaCacheDir)delimiter(")>operator(]) +ident(p) string<delimiter(<<-BEGIN)> operator(+) string<delimiter(<<-END)>string<content( + def element_downcase(attributes = {}\))delimiter( + BEGIN)>string<content( + end)delimiter( + END)> + + + +ident(p) string<delimiter(<<ggg)>operator(;) reserved(def)string<content( +kleegarts(\) p 'kkkkkkk' end +dfgdgfdf)delimiter( +ggg)> +ident(koomblatz!)operator(()operator(\)) ident(p) string<delimiter(')content(jdkfsk)delimiter(')> reserved(end) + +ident(koomblatz!) + +ident(p) ident(f) operator(=) float(3.7517675036461267e+17) +ident(p) global_variable($10) +ident(p) global_variable($1001) +ident(p)operator(() string<delimiter(<<end)> operator(\))string<content( +nine time nine men have stood untold.)delimiter( +end)> + +reserved(def) method(jd_to_wday)operator(()ident(jd)operator(\)) operator(()ident(jd) operator(+) integer(1)operator(\)) operator(%) integer(7) reserved(end) +ident(p) ident(jd_to_wday)operator(()integer(98)operator(\)) + + +ident(p) ident(pre) operator(=) global_variable($`) +comment(=begin +=end) + +ident(p) string<delimiter(<<"..end ..")>string<content( +cbkvjb +vb;lkxcvkbxc +vxlc;kblxckvb +xcvblcvb)delimiter( +..end ..)> + +ident(p) global_variable($-j)operator(=)integer(55) + +reserved(def) method(empty)operator(()operator(\)) reserved(end) + +ident(p) string<delimiter(<<a)>string<content( +dkflg +flk)delimiter( +a)> + +ident(label)operator(=)string<delimiter(')content(label)delimiter(')>operator(;)ident(tab)operator(=)operator([)integer(1)operator(,)integer(2)operator(,)integer(3)operator(]) + ident(p) string<delimiter(<<S)>string<content( +)inline<delimiter(#{)ident(label)delimiter(})>content( = arr = Array.new()inline<delimiter(#{)ident(tab)operator(.)ident(size)delimiter(})>content(, nil\) +str = a = i = nil +idx = 0 +clist.each do |str| + str.split(',', -1\).each do |i| + arr[idx] = i.to_i unless i.empty? + idx += 1 + end +end +)delimiter( +S)> +reserved(def) method(printem1) ident(a)operator(,)ident(b)operator(,)ident(c) + ident(p)operator(()ident(a) integer(+77)operator(\)) + ident(p)operator(()ident(b) integer(+77)operator(\)) + ident(p)operator(()ident(c) integer(+77)operator(\)) +reserved(end) + +reserved(def) method(foobar)operator(()operator(\)) reserved(end) +reserved(def) method(foobar2) +reserved(end) + +reserved(def) method(printem0)operator(()ident(a)operator(\)) + ident(p)operator(()ident(a) integer(+77)operator(\)) +reserved(end) +reserved(def) method(printem0)operator(()ident(a)operator(,)ident(b)operator(,)ident(c)operator(\)) + ident(p)operator(()ident(a) integer(+77)operator(\)) + ident(p)operator(()ident(b) integer(+77)operator(\)) + ident(p)operator(()ident(c) integer(+77)operator(\)) +reserved(end) +reserved(def) method(printem2) ident(a)operator(,)ident(b)operator(,)ident(c)operator(;) ident(p)operator(()ident(a) integer(+77)operator(\))operator(;) ident(p)operator(()ident(b) integer(+77)operator(\))operator(;) ident(p)operator(()ident(c) integer(+77)operator(\)) reserved(end) +reserved(def) method(three)operator(()operator(\)) operator(()integer(1)integer(+2)operator(\)) reserved(end) + +reserved(def) method(d)operator(;)reserved(end) +reserved(def) method(d)operator(()operator(\))reserved(end) +reserved(def) method(d)operator(()ident(dd)operator(\))reserved(end) + +reserved(def) method(printem) ident(a)operator(,)ident(b)operator(,)ident(c) + ident(p) ident(a)operator(;)ident(p) ident(b)operator(;)ident(p) ident(c) + ident(p)operator(()ident(a) integer(+77)operator(\)) + ident(p)operator(()ident(b) string<delimiter(%()content(0.123)delimiter(\))>operator(\)) +reserved(end) +ident(printem) integer(1)operator(,)integer(2)operator(,)integer(3) + +ident(a)operator(=)integer(1) +ident(p)operator(()ident(a) integer(+77)operator(\)) + +reserved(def) method(hhh)operator(()ident(a)operator(=)operator(()integer(1)integer(+2)operator(\))operator(\)) ident(a) reserved(end) + + + +reserved(END) operator({) + ident(p) string<delimiter(")content(bye-bye)delimiter(")> +operator(}) + + +ident(p) string<delimiter(<<here)>string<content( +where?)delimiter( +here)> +ident(p) string<delimiter(<<-what)>string<content( + ? that's)delimiter( + what)> +ident(p) ident(proc)operator({)operator(||)operator(}) +reserved(for) ident(i) reserved(in) reserved(if) pre_constant(false) +ident(foob12345)operator(;) reserved(else) operator([)integer(44)operator(,)integer(55)operator(,)integer(66)operator(,)integer(77)operator(,)integer(88)operator(]) reserved(end) reserved(do) ident(p) ident(i)operator(**)constant(Math)operator(.)ident(sqrt)operator(()ident(i)operator(\)) reserved(end) +ident(p) string<delimiter(")char(\\v)delimiter(")> +ident(c)operator(=)integer(0) + reserved(while) ident(c) operator(==) regexp<delimiter(/)content([ )char(\\t)char(\\f)char(\\r)char(\\13)content(])delimiter(/)>operator(;) reserved(end) + + + + + + + + diff --git a/test/scanners/ruby/example.in.rb b/test/scanners/ruby/example.in.rb new file mode 100644 index 0000000..8e6d20e --- /dev/null +++ b/test/scanners/ruby/example.in.rb @@ -0,0 +1,3789 @@ +module CodeRay
+ module Scanners
+
+class Ruby < Scanner
+
+ RESERVED_WORDS = [
+ 'and', 'def', 'end', 'in', 'or', 'unless', 'begin',
+ 'defined?', 'ensure', 'module', 'redo', 'super', 'until',
+ 'BEGIN', 'break', 'do', 'next', 'rescue', 'then',
+ 'when', 'END', 'case', 'else', 'for', 'retry',
+ 'while', 'alias', 'class', 'elsif', 'if', 'not', 'return',
+ 'undef', 'yield',
+ ]
+
+ DEF_KEYWORDS = ['def']
+ MODULE_KEYWORDS = ['class', 'module']
+ DEF_NEW_STATE = WordList.new(:initial).
+ add(DEF_KEYWORDS, :def_expected).
+ add(MODULE_KEYWORDS, :module_expected)
+
+ WORDS_ALLOWING_REGEXP = [
+ 'and', 'or', 'not', 'while', 'until', 'unless', 'if', 'elsif', 'when'
+ ]
+ REGEXP_ALLOWED = WordList.new(false).
+ add(WORDS_ALLOWING_REGEXP, :set)
+
+ PREDEFINED_CONSTANTS = [
+ 'nil', 'true', 'false', 'self',
+ 'DATA', 'ARGV', 'ARGF', '__FILE__', '__LINE__',
+ ]
+
+ IDENT_KIND = WordList.new(:ident).
+ add(RESERVED_WORDS, :reserved).
+ add(PREDEFINED_CONSTANTS, :pre_constant)
+
+ METHOD_NAME = / #{IDENT} [?!]? /xo
+ METHOD_NAME_EX = /
+ #{METHOD_NAME} # common methods: split, foo=, empty?, gsub!
+ | \*\*? # multiplication and power
+ | [-+~]@? # plus, minus
+ | [\/%&|^`] # division, modulo or format strings, &and, |or, ^xor, `system`
+ | \[\]=? # array getter and setter
+ | <=?>? | >=? # comparison, rocket operator
+ | << | >> # append or shift left, shift right
+ | ===? # simple equality and case equality
+ /ox
+ GLOBAL_VARIABLE = / \$ (?: #{IDENT} | \d+ | [~&+`'=\/,;_.<>!@0$?*":F\\] | -[a-zA-Z_0-9] ) /ox
+
+ DOUBLEQ = / " [^"\#\\]* (?: (?: \#\{.*?\} | \#(?:$")? | \\. ) [^"\#\\]* )* "? /ox
+ SINGLEQ = / ' [^'\\]* (?: \\. [^'\\]* )* '? /ox
+ STRING = / #{SINGLEQ} | #{DOUBLEQ} /ox
+ SHELL = / ` [^`\#\\]* (?: (?: \#\{.*?\} | \#(?:$`)? | \\. ) [^`\#\\]* )* `? /ox
+ REGEXP = / \/ [^\/\#\\]* (?: (?: \#\{.*?\} | \#(?:$\/)? | \\. ) [^\/\#\\]* )* \/? /ox
+
+ DECIMAL = /\d+(?:_\d+)*/ # doesn't recognize 09 as octal error
+ OCTAL = /0_?[0-7]+(?:_[0-7]+)*/
+ HEXADECIMAL = /0x[0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*/
+ BINARY = /0b[01]+(?:_[01]+)*/
+
+ EXPONENT = / [eE] [+-]? #{DECIMAL} /ox
+ FLOAT = / #{DECIMAL} (?: #{EXPONENT} | \. #{DECIMAL} #{EXPONENT}? ) /
+ INTEGER = /#{OCTAL}|#{HEXADECIMAL}|#{BINARY}|#{DECIMAL}/
+
+ def reset
+ super
+ @regexp_allowed = false
+ end
+
+ def next_token
+ return if @scanner.eos?
+
+ kind = :error
+ if @scanner.scan(/\s+/) # in every state
+ kind = :space
+ @regexp_allowed = :set if @regexp_allowed or @scanner.matched.index(?\n) # delayed flag setting
+
+ elsif @state == :def_expected
+ if @scanner.scan(/ (?: (?:#{IDENT}(?:\.|::))* | (?:@@?|$)? #{IDENT}(?:\.|::) ) #{METHOD_NAME_EX} /ox)
+ kind = :method
+ @state = :initial
+ else
+ @scanner.getch
+ end
+ @state = :initial
+
+ elsif @state == :module_expected
+ if @scanner.scan(/<</)
+ kind = :operator
+ else
+ if @scanner.scan(/ (?: #{IDENT} (?:\.|::))* #{IDENT} /ox)
+ kind = :method
+ else
+ @scanner.getch
+ end
+ @state = :initial
+ end
+
+ elsif # state == :initial
+ # IDENTIFIERS, KEYWORDS
+ if @scanner.scan(GLOBAL_VARIABLE)
+ kind = :global_variable
+ elsif @scanner.scan(/ @@ #{IDENT} /ox)
+ kind = :class_variable
+ elsif @scanner.scan(/ @ #{IDENT} /ox)
+ kind = :instance_variable
+ elsif @scanner.scan(/ __END__\n ( (?!\#CODE\#) .* )? | \#[^\n]* | =begin(?=\s).*? \n=end(?=\s|\z)(?:[^\n]*)? /mx)
+ kind = :comment
+ elsif @scanner.scan(METHOD_NAME)
+ if @last_token_dot
+ kind = :ident
+ else
+ matched = @scanner.matched
+ kind = IDENT_KIND[matched]
+ if kind == :ident and matched =~ /^[A-Z]/
+ kind = :constant
+ elsif kind == :reserved
+ @state = DEF_NEW_STATE[matched]
+ @regexp_allowed = REGEXP_ALLOWED[matched]
+ end
+ end
+
+ elsif @scanner.scan(STRING)
+ kind = :string
+ elsif @scanner.scan(SHELL)
+ kind = :shell
+ elsif @scanner.scan(/<<
+ (?:
+ ([a-zA-Z_0-9]+)
+ (?: .*? ^\1$ | .* )
+ |
+ -([a-zA-Z_0-9]+)
+ (?: .*? ^\s*\2$ | .* )
+ |
+ (["\'`]) (.+?) \3
+ (?: .*? ^\4$ | .* )
+ |
+ - (["\'`]) (.+?) \5
+ (?: .*? ^\s*\6$ | .* )
+ )
+ /mxo)
+ kind = :string
+ elsif @scanner.scan(/\//) and @regexp_allowed
+ @scanner.unscan
+ @scanner.scan(REGEXP)
+ kind = :regexp
+/%(?:[Qqxrw](?:\([^)#\\\\]*(?:(?:#\{.*?\}|#|\\\\.)[^)#\\\\]*)*\)?|\[[^\]#\\\\]*(?:(?:#\{.*?\}|#|\\\\.)[^\]#\\\\]*)*\]?|\{[^}#\\\\]*(?:(?:#\{.*?\}|#|\\\\.)[^}#\\\\]*)*\}?|<[^>#\\\\]*(?:(?:#\{.*?\}|#|\\\\.)[^>#\\\\]*)*>?|([^a-zA-Z\\\\])(?:(?!\1)[^#\\\\])*(?:(?:#\{.*?\}|#|\\\\.)(?:(?!\1)[^#\\\\])*)*\1?)|\([^)#\\\\]*(?:(?:#\{.*?\}|#|\\\\.)[^)#\\\\]*)*\)?|\[[^\]#\\\\]*(?:(?:#\{.*?\}|#|\\\\.)[^\]#\\\\]*)*\]?|\{[^}#\\\\]*(?:(?:#\{.*?\}|#|\\\\.)[^}#\\\\]*)*\}?|<[^>#\\\\]*(?:(?:#\{.*?\}|#|\\\\.)[^>#\\\\]*)*>?|([^a-zA-Z\s\\\\])(?:(?!\2)[^#\\\\])*(?:(?:#\{.*?\}|#|\\\\.)(?:(?!\2)[^#\\\\])*)*\2?|\\\\[^#\\\\]*(?:(?:#\{.*?\}|#)[^#\\\\]*)*\\\\?)/
+ elsif @scanner.scan(/:(?:#{GLOBAL_VARIABLE}|#{METHOD_NAME_EX}|#{STRING})/ox)
+ kind = :symbol
+ elsif @scanner.scan(/
+ \? (?:
+ [^\s\\]
+ |
+ \\ (?:M-\\C-|C-\\M-|M-\\c|c\\M-|c|C-|M-))? (?: \\ (?: . | [0-7]{3} | x[0-9A-Fa-f][0-9A-Fa-f] )
+ )
+ /mox)
+ kind = :integer
+
+ elsif @scanner.scan(/ [-+*\/%=<>;,|&!()\[\]{}~?] | \.\.?\.? | ::? /x)
+ kind = :operator
+ @regexp_allowed = :set if @scanner.matched[-1,1] =~ /[~=!<>|&^,\(\[+\-\/\*%]\z/
+ elsif @scanner.scan(FLOAT)
+ kind = :float
+ elsif @scanner.scan(INTEGER)
+ kind = :integer
+ else
+ @scanner.getch
+ end
+ end
+
+ token = Token.new @scanner.matched, kind
+
+ if kind == :regexp
+ token.text << @scanner.scan(/[eimnosux]*/)
+ end
+
+ @regexp_allowed = (@regexp_allowed == :set) # delayed flag setting
+
+ token
+ end
+end
+
+register Ruby, 'ruby', 'rb'
+
+ end
+end
+class Set
+ include Enumerable
+
+ # Creates a new set containing the given objects.
+ def self.[](*ary)
+ new(ary)
+ end
+
+ # Creates a new set containing the elements of the given enumerable
+ # object.
+ #
+ # If a block is given, the elements of enum are preprocessed by the
+ # given block.
+ def initialize(enum = nil, &block) # :yields: o
+ @hash ||= Hash.new
+
+ enum.nil? and return
+
+ if block
+ enum.each { |o| add(block[o]) }
+ else
+ merge(enum)
+ end
+ end
+
+ # Copy internal hash.
+ def initialize_copy(orig)
+ @hash = orig.instance_eval{@hash}.dup
+ end
+
+ # Returns the number of elements.
+ def size
+ @hash.size
+ end
+ alias length size
+
+ # Returns true if the set contains no elements.
+ def empty?
+ @hash.empty?
+ end
+
+ # Removes all elements and returns self.
+ def clear
+ @hash.clear
+ self
+ end
+
+ # Replaces the contents of the set with the contents of the given
+ # enumerable object and returns self.
+ def replace(enum)
+ if enum.class == self.class
+ @hash.replace(enum.instance_eval { @hash })
+ else
+ enum.is_a?(Enumerable) or raise ArgumentError, "value must be enumerable"
+ clear
+ enum.each { |o| add(o) }
+ end
+
+ self
+ end
+
+ # Converts the set to an array. The order of elements is uncertain.
+ def to_a
+ @hash.keys
+ end
+
+ def flatten_merge(set, seen = Set.new)
+ set.each { |e|
+ if e.is_a?(Set)
+ if seen.include?(e_id = e.object_id)
+ raise ArgumentError, "tried to flatten recursive Set"
+ end
+
+ seen.add(e_id)
+ flatten_merge(e, seen)
+ seen.delete(e_id)
+ else
+ add(e)
+ end
+ }
+
+ self
+ end
+ protected :flatten_merge
+
+ # Returns a new set that is a copy of the set, flattening each
+ # containing set recursively.
+ def flatten
+ self.class.new.flatten_merge(self)
+ end
+
+ # Equivalent to Set#flatten, but replaces the receiver with the
+ # result in place. Returns nil if no modifications were made.
+ def flatten!
+ if detect { |e| e.is_a?(Set) }
+ replace(flatten())
+ else
+ nil
+ end
+ end
+
+ # Returns true if the set contains the given object.
+ def include?(o)
+ @hash.include?(o)
+ end
+ alias member? include?
+
+ # Returns true if the set is a superset of the given set.
+ def superset?(set)
+ set.is_a?(Set) or raise ArgumentError, "value must be a set"
+ return false if size < set.size
+ set.all? { |o| include?(o) }
+ end
+
+ # Returns true if the set is a proper superset of the given set.
+ def proper_superset?(set)
+ set.is_a?(Set) or raise ArgumentError, "value must be a set"
+ return false if size <= set.size
+ set.all? { |o| include?(o) }
+ end
+
+ # Returns true if the set is a subset of the given set.
+ def subset?(set)
+ set.is_a?(Set) or raise ArgumentError, "value must be a set"
+ return false if set.size < size
+ all? { |o| set.include?(o) }
+ end
+
+ # Returns true if the set is a proper subset of the given set.
+ def proper_subset?(set)
+ set.is_a?(Set) or raise ArgumentError, "value must be a set"
+ return false if set.size <= size
+ all? { |o| set.include?(o) }
+ end
+
+ # Calls the given block once for each element in the set, passing
+ # the element as parameter.
+ def each
+ @hash.each_key { |o| yield(o) }
+ self
+ end
+
+ # Adds the given object to the set and returns self. Use +merge+ to
+ # add several elements at once.
+ def add(o)
+ @hash[o] = true
+ self
+ end
+ alias << add
+
+ # Adds the given object to the set and returns self. If the
+ # object is already in the set, returns nil.
+ def add?(o)
+ if include?(o)
+ nil
+ else
+ add(o)
+ end
+ end
+
+ # Deletes the given object from the set and returns self. Use +subtract+ to
+ # delete several items at once.
+ def delete(o)
+ @hash.delete(o)
+ self
+ end
+
+ # Deletes the given object from the set and returns self. If the
+ # object is not in the set, returns nil.
+ def delete?(o)
+ if include?(o)
+ delete(o)
+ else
+ nil
+ end
+ end
+
+ # Deletes every element of the set for which block evaluates to
+ # true, and returns self.
+ def delete_if
+ @hash.delete_if { |o,| yield(o) }
+ self
+ end
+
+ # Do collect() destructively.
+ def collect!
+ set = self.class.new
+ each { |o| set << yield(o) }
+ replace(set)
+ end
+ alias map! collect!
+
+ # Equivalent to Set#delete_if, but returns nil if no changes were
+ # made.
+ def reject!
+ n = size
+ delete_if { |o| yield(o) }
+ size == n ? nil : self
+ end
+
+ # Merges the elements of the given enumerable object to the set and
+ # returns self.
+ def merge(enum)
+ if enum.is_a?(Set)
+ @hash.update(enum.instance_eval { @hash })
+ else
+ enum.is_a?(Enumerable) or raise ArgumentError, "value must be enumerable"
+ enum.each { |o| add(o) }
+ end
+
+ self
+ end
+
+ # Deletes every element that appears in the given enumerable object
+ # and returns self.
+ def subtract(enum)
+ enum.is_a?(Enumerable) or raise ArgumentError, "value must be enumerable"
+ enum.each { |o| delete(o) }
+ self
+ end
+
+ # Returns a new set built by merging the set and the elements of the
+ # given enumerable object.
+ def |(enum)
+ enum.is_a?(Enumerable) or raise ArgumentError, "value must be enumerable"
+ dup.merge(enum)
+ end
+ alias + | ##
+ alias union | ##
+
+ # Returns a new set built by duplicating the set, removing every
+ # element that appears in the given enumerable object.
+ def -(enum)
+ enum.is_a?(Enumerable) or raise ArgumentError, "value must be enumerable"
+ dup.subtract(enum)
+ end
+ alias difference - ##
+
+ # Returns a new array containing elements common to the set and the
+ # given enumerable object.
+ def &(enum)
+ enum.is_a?(Enumerable) or raise ArgumentError, "value must be enumerable"
+ n = self.class.new
+ enum.each { |o| n.add(o) if include?(o) }
+ n
+ end
+ alias intersection & ##
+
+ # Returns a new array containing elements exclusive between the set
+ # and the given enumerable object. (set ^ enum) is equivalent to
+ # ((set | enum) - (set & enum)).
+ def ^(enum)
+ enum.is_a?(Enumerable) or raise ArgumentError, "value must be enumerable"
+ n = dup
+ enum.each { |o| if n.include?(o) then n.delete(o) else n.add(o) end }
+ n
+ end
+
+ # Returns true if two sets are equal. The equality of each couple
+ # of elements is defined according to Object#eql?.
+ def ==(set)
+ equal?(set) and return true
+
+ set.is_a?(Set) && size == set.size or return false
+
+ hash = @hash.dup
+ set.all? { |o| hash.include?(o) }
+ end
+
+ def hash # :nodoc:
+ @hash.hash
+ end
+
+ def eql?(o) # :nodoc:
+ return false unless o.is_a?(Set)
+ @hash.eql?(o.instance_eval{@hash})
+ end
+
+ # Classifies the set by the return value of the given block and
+ # returns a hash of {value => set of elements} pairs. The block is
+ # called once for each element of the set, passing the element as
+ # parameter.
+ #
+ # e.g.:
+ #
+ # require 'set'
+ # files = Set.new(Dir.glob("*.rb"))
+ # hash = files.classify { |f| File.mtime(f).year }
+ # p hash # => {2000=>#<Set: {"a.rb", "b.rb"}>,
+ # # 2001=>#<Set: {"c.rb", "d.rb", "e.rb"}>,
+ # # 2002=>#<Set: {"f.rb"}>}
+ def classify # :yields: o
+ h = {}
+
+ each { |i|
+ x = yield(i)
+ (h[x] ||= self.class.new).add(i)
+ }
+
+ h
+ end
+
+ # Divides the set into a set of subsets according to the commonality
+ # defined by the given block.
+ #
+ # If the arity of the block is 2, elements o1 and o2 are in common
+ # if block.call(o1, o2) is true. Otherwise, elements o1 and o2 are
+ # in common if block.call(o1) == block.call(o2).
+ #
+ # e.g.:
+ #
+ # require 'set'
+ # numbers = Set[1, 3, 4, 6, 9, 10, 11]
+ # set = numbers.divide { |i,j| (i - j).abs == 1 }
+ # p set # => #<Set: {#<Set: {1}>,
+ # # #<Set: {11, 9, 10}>,
+ # # #<Set: {3, 4}>,
+ # # #<Set: {6}>}>
+ def divide(&func)
+ if func.arity == 2
+ require 'tsort'
+
+ class << dig = {} # :nodoc:
+ include TSort
+
+ alias tsort_each_node each_key
+ def tsort_each_child(node, &block)
+ fetch(node).each(&block)
+ end
+ end
+
+ each { |u|
+ dig[u] = a = []
+ each{ |v| func.call(u, v) and a << v }
+ }
+
+ set = Set.new()
+ dig.each_strongly_connected_component { |css|
+ set.add(self.class.new(css))
+ }
+ set
+ else
+ Set.new(classify(&func).values)
+ end
+ end
+
+ InspectKey = :__inspect_key__ # :nodoc:
+
+ # Returns a string containing a human-readable representation of the
+ # set. ("#<Set: {element1, element2, ...}>")
+ def inspect
+ ids = (Thread.current[InspectKey] ||= [])
+
+ if ids.include?(object_id)
+ return sprintf('#<%s: {...}>', self.class.name)
+ end
+
+ begin
+ ids << object_id
+ return sprintf('#<%s: {%s}>', self.class, to_a.inspect[1..-2])
+ ensure
+ ids.pop
+ end
+ end
+
+ def pretty_print(pp) # :nodoc:
+ pp.text sprintf('#<%s: {', self.class.name)
+ pp.nest(1) {
+ pp.seplist(self) { |o|
+ pp.pp o
+ }
+ }
+ pp.text "}>"
+ end
+
+ def pretty_print_cycle(pp) # :nodoc:
+ pp.text sprintf('#<%s: {%s}>', self.class.name, empty? ? '' : '...')
+ end
+end
+
+# SortedSet implements a set which elements are sorted in order. See Set.
+class SortedSet < Set
+ @@setup = false
+
+ class << self
+ def [](*ary) # :nodoc:
+ new(ary)
+ end
+
+ def setup # :nodoc:
+ @@setup and return
+
+ begin
+ require 'rbtree'
+
+ module_eval %{
+ def initialize(*args, &block)
+ @hash = RBTree.new
+ super
+ end
+ }
+ rescue LoadError
+ module_eval %{
+ def initialize(*args, &block)
+ @keys = nil
+ super
+ end
+
+ def clear
+ @keys = nil
+ super
+ end
+
+ def replace(enum)
+ @keys = nil
+ super
+ end
+
+ def add(o)
+ @keys = nil
+ @hash[o] = true
+ self
+ end
+ alias << add
+
+ def delete(o)
+ @keys = nil
+ @hash.delete(o)
+ self
+ end
+
+ def delete_if
+ n = @hash.size
+ @hash.delete_if { |o,| yield(o) }
+ @keys = nil if @hash.size != n
+ self
+ end
+
+ def merge(enum)
+ @keys = nil
+ super
+ end
+
+ def each
+ to_a.each { |o| yield(o) }
+ end
+
+ def to_a
+ (@keys = @hash.keys).sort! unless @keys
+ @keys
+ end
+ }
+ end
+
+ @@setup = true
+ end
+ end
+
+ def initialize(*args, &block) # :nodoc:
+ SortedSet.setup
+ initialize(*args, &block)
+ end
+end
+
+module Enumerable
+ # Makes a set from the enumerable object with given arguments.
+ def to_set(klass = Set, *args, &block)
+ klass.new(self, *args, &block)
+ end
+end
+
+# =begin
+# == RestricedSet class
+# RestricedSet implements a set with restrictions defined by a given
+# block.
+#
+# === Super class
+# Set
+#
+# === Class Methods
+# --- RestricedSet::new(enum = nil) { |o| ... }
+# --- RestricedSet::new(enum = nil) { |rset, o| ... }
+# Creates a new restricted set containing the elements of the given
+# enumerable object. Restrictions are defined by the given block.
+#
+# If the block's arity is 2, it is called with the RestrictedSet
+# itself and an object to see if the object is allowed to be put in
+# the set.
+#
+# Otherwise, the block is called with an object to see if the object
+# is allowed to be put in the set.
+#
+# === Instance Methods
+# --- restriction_proc
+# Returns the restriction procedure of the set.
+#
+# =end
+#
+# class RestricedSet < Set
+# def initialize(*args, &block)
+# @proc = block or raise ArgumentError, "missing a block"
+#
+# if @proc.arity == 2
+# instance_eval %{
+# def add(o)
+# @hash[o] = true if @proc.call(self, o)
+# self
+# end
+# alias << add
+#
+# def add?(o)
+# if include?(o) || !@proc.call(self, o)
+# nil
+# else
+# @hash[o] = true
+# self
+# end
+# end
+#
+# def replace(enum)
+# enum.is_a?(Enumerable) or raise ArgumentError, "value must be enumerable"
+# clear
+# enum.each { |o| add(o) }
+#
+# self
+# end
+#
+# def merge(enum)
+# enum.is_a?(Enumerable) or raise ArgumentError, "value must be enumerable"
+# enum.each { |o| add(o) }
+#
+# self
+# end
+# }
+# else
+# instance_eval %{
+# def add(o)
+# if @proc.call(o)
+# @hash[o] = true
+# end
+# self
+# end
+# alias << add
+#
+# def add?(o)
+# if include?(o) || !@proc.call(o)
+# nil
+# else
+# @hash[o] = true
+# self
+# end
+# end
+# }
+# end
+#
+# super(*args)
+# end
+#
+# def restriction_proc
+# @proc
+# end
+# end
+
+if $0 == __FILE__
+ eval DATA.read, nil, $0, __LINE__+4
+end
+
+# = rweb - CGI Support Library
+#
+# Author:: Johannes Barre (mailto:rweb@igels.net)
+# Copyright:: Copyright (c) 2003, 04 by Johannes Barre
+# License:: GNU Lesser General Public License (COPYING, http://www.gnu.org/copyleft/lesser.html)
+# Version:: 0.1.0
+# CVS-ID:: $Id: rweb.rb 6 2004-06-16 15:56:26Z igel $
+#
+# == What is Rweb?
+# Rweb is a replacement for the cgi class included in the ruby distribution.
+#
+# == How to use
+#
+# === Basics
+#
+# This class is made to be as easy as possible to use. An example:
+#
+# require "rweb"
+#
+# web = Rweb.new
+# web.out do
+# web.puts "Hello world!"
+# end
+#
+# The visitor will get a simple "Hello World!" in his browser. Please notice,
+# that won't set html-tags for you, so you should better do something like this:
+#
+# require "rweb"
+#
+# web = Rweb.new
+# web.out do
+# web.puts "<html><body>Hello world!</body></html>"
+# end
+#
+# === Set headers
+# Of course, it's also possible to tell the browser, that the content of this
+# page is plain text instead of html code:
+#
+# require "rweb"
+#
+# web = Rweb.new
+# web.out do
+# web.header("content-type: text/plain")
+# web.puts "Hello plain world!"
+# end
+#
+# Please remember, headers can't be set after the page content has been send.
+# You have to set all nessessary headers before the first puts oder print. It's
+# possible to cache the content until everything is complete. Doing it this
+# way, you can set headers everywhere.
+#
+# If you set a header twice, the second header will replace the first one. The
+# header name is not casesensitive, it will allways converted in to the
+# capitalised form suggested by the w3c (http://w3.org)
+#
+# === Set cookies
+# Setting cookies is quite easy:
+# include 'rweb'
+#
+# web = Rweb.new
+# Cookie.new("Visits", web.cookies['visits'].to_i +1)
+# web.out do
+# web.puts "Welcome back! You visited this page #{web.cookies['visits'].to_i +1} times"
+# end
+#
+# See the class Cookie for more details.
+#
+# === Get form and cookie values
+# There are four ways to submit data from the browser to the server and your
+# ruby script: via GET, POST, cookies and file upload. Rweb doesn't support
+# file upload by now.
+#
+# include 'rweb'
+#
+# web = Rweb.new
+# web.out do
+# web.print "action: #{web.get['action']} "
+# web.puts "The value of the cookie 'visits' is #{web.cookies['visits']}"
+# web.puts "The post parameter 'test['x']' is #{web.post['test']['x']}"
+# end
+
+RWEB_VERSION = "0.1.0"
+RWEB = "rweb/#{RWEB_VERSION}"
+
+#require 'rwebcookie' -> edit by bunny :-)
+
+class Rweb
+ # All parameter submitted via the GET method are available in attribute
+ # get. This is Hash, where every parameter is available as a key-value
+ # pair.
+ #
+ # If your input tag has a name like this one, it's value will be available
+ # as web.get["fieldname"]
+ # <input name="fieldname">
+ # You can submit values as a Hash
+ # <input name="text['index']">
+ # <input name="text['index2']">
+ # will be available as
+ # web.get["text"]["index"]
+ # web.get["text"]["index2"]
+ # Integers are also possible
+ # <input name="int[2]">
+ # <input name="int[3]['hi']>
+ # will be available as
+ # web.get["int"][2]
+ # web.get["int"][3]["hi"]
+ # If you specify no index, the lowest unused index will be used:
+ # <input name="int[]"><!-- First Field -->
+ # <input name="int[]"><!-- Second one -->
+ # will be available as
+ # web.get["int"][0] # First Field
+ # web.get["int"][1] # Second one
+ # Please notice, this doesn'd work like you might expect:
+ # <input name="text[index]">
+ # It will not be available as web.get["text"]["index"] but
+ # web.get["text[index]"]
+ attr_reader :get
+
+ # All parameters submitted via POST are available in the attribute post. It
+ # works like the get attribute.
+ # <input name="text[0]">
+ # will be available as
+ # web.post["text"][0]
+ attr_reader :post
+
+ # All cookies submitted by the browser are available in cookies. This is a
+ # Hash, where every cookie is a key-value pair.
+ attr_reader :cookies
+
+ # The name of the browser identification is submitted as USER_AGENT and
+ # available in this attribute.
+ attr_reader :user_agent
+
+ # The IP address of the client.
+ attr_reader :remote_addr
+
+ # Creates a new Rweb object. This should only done once. You can set various
+ # options via the settings hash.
+ #
+ # "cache" => true: Everything you script send to the client will be cached
+ # until the end of the out block or until flush is called. This way, you
+ # can modify headers and cookies even after printing something to the client.
+ #
+ # "safe" => level: Changes the $SAFE attribute. By default, $SAFE will be set
+ # to 1. If $SAFE is already higher than this value, it won't be changed.
+ #
+ # "silend" => true: Normaly, Rweb adds automaticly a header like this
+ # "X-Powered-By: Rweb/x.x.x (Ruby/y.y.y)". With the silend option you can
+ # suppress this.
+ def initialize (settings = {})
+ # {{{
+ @header = {}
+ @cookies = {}
+ @get = {}
+ @post = {}
+
+ # Internal attributes
+ @status = nil
+ @reasonPhrase = nil
+ @setcookies = []
+ @output_started = false;
+ @output_allowed = false;
+
+ @mod_ruby = false
+ @env = ENV.to_hash
+
+ if defined?(MOD_RUBY)
+ @output_method = "mod_ruby"
+ @mod_ruby = true
+ elsif @env['SERVER_SOFTWARE'] =~ /^Microsoft-IIS/i
+ @output_method = "nph"
+ else
+ @output_method = "ph"
+ end
+
+ unless settings.is_a?(Hash)
+ raise TypeError, "settings must be a Hash"
+ end
+ @settings = settings
+
+ unless @settings.has_key?("safe")
+ @settings["safe"] = 1
+ end
+
+ if $SAFE < @settings["safe"]
+ $SAFE = @settings["safe"]
+ end
+
+ unless @settings.has_key?("cache")
+ @settings["cache"] = false
+ end
+
+ # mod_ruby sets no QUERY_STRING variable, if no GET-Parameters are given
+ unless @env.has_key?("QUERY_STRING")
+ @env["QUERY_STRING"] = ""
+ end
+
+ # Now we split the QUERY_STRING by the seperators & and ; or, if
+ # specified, settings['get seperator']
+ unless @settings.has_key?("get seperator")
+ get_args = @env['QUERY_STRING'].split(/[&;]/)
+ else
+ get_args = @env['QUERY_STRING'].split(@settings['get seperator'])
+ end
+
+ get_args.each do | arg |
+ arg_key, arg_val = arg.split(/=/, 2)
+ arg_key = Rweb::unescape(arg_key)
+ arg_val = Rweb::unescape(arg_val)
+
+ # Parse names like name[0], name['text'] or name[]
+ pattern = /^(.+)\[("[^\]]*"|'[^\]]*'|[0-9]*)\]$/
+ keys = []
+ while match = pattern.match(arg_key)
+ arg_key = match[1]
+ keys = [match[2]] + keys
+ end
+ keys = [arg_key] + keys
+
+ akt = @get
+ last = nil
+ lastkey = nil
+ keys.each do |key|
+ if key == ""
+ # No key specified (like in "test[]"), so we use the
+ # lowerst unused Integer as key
+ key = 0
+ while akt.has_key?(key)
+ key += 1
+ end
+ elsif /^[0-9]*$/ =~ key
+ # If the index is numerical convert it to an Integer
+ key = key.to_i
+ elsif key[0].chr == "'" || key[0].chr == '"'
+ key = key[1, key.length() -2]
+ end
+ if !akt.has_key?(key) || !akt[key].class == Hash
+ # create an empty Hash if there isn't already one
+ akt[key] = {}
+ end
+ last = akt
+ lastkey = key
+ akt = akt[key]
+ end
+ last[lastkey] = arg_val
+ end
+
+ if @env['REQUEST_METHOD'] == "POST"
+ if @env.has_key?("CONTENT_TYPE") && @env['CONTENT_TYPE'] == "application/x-www-form-urlencoded" && @env.has_key?('CONTENT_LENGTH')
+ unless @settings.has_key?("post seperator")
+ post_args = $stdin.read(@env['CONTENT_LENGTH'].to_i).split(/[&;]/)
+ else
+ post_args = $stdin.read(@env['CONTENT_LENGTH'].to_i).split(@settings['post seperator'])
+ end
+ post_args.each do | arg |
+ arg_key, arg_val = arg.split(/=/, 2)
+ arg_key = Rweb::unescape(arg_key)
+ arg_val = Rweb::unescape(arg_val)
+
+ # Parse names like name[0], name['text'] or name[]
+ pattern = /^(.+)\[("[^\]]*"|'[^\]]*'|[0-9]*)\]$/
+ keys = []
+ while match = pattern.match(arg_key)
+ arg_key = match[1]
+ keys = [match[2]] + keys
+ end
+ keys = [arg_key] + keys
+
+ akt = @post
+ last = nil
+ lastkey = nil
+ keys.each do |key|
+ if key == ""
+ # No key specified (like in "test[]"), so we use
+ # the lowerst unused Integer as key
+ key = 0
+ while akt.has_key?(key)
+ key += 1
+ end
+ elsif /^[0-9]*$/ =~ key
+ # If the index is numerical convert it to an Integer
+ key = key.to_i
+ elsif key[0].chr == "'" || key[0].chr == '"'
+ key = key[1, key.length() -2]
+ end
+ if !akt.has_key?(key) || !akt[key].class == Hash
+ # create an empty Hash if there isn't already one
+ akt[key] = {}
+ end
+ last = akt
+ lastkey = key
+ akt = akt[key]
+ end
+ last[lastkey] = arg_val
+ end
+ else
+ # Maybe we should print a warning here?
+ $stderr.print("Unidentified form data recived and discarded.")
+ end
+ end
+
+ if @env.has_key?("HTTP_COOKIE")
+ cookie = @env['HTTP_COOKIE'].split(/; ?/)
+ cookie.each do | c |
+ cookie_key, cookie_val = c.split(/=/, 2)
+
+ @cookies [Rweb::unescape(cookie_key)] = Rweb::unescape(cookie_val)
+ end
+ end
+
+ if defined?(@env['HTTP_USER_AGENT'])
+ @user_agent = @env['HTTP_USER_AGENT']
+ else
+ @user_agent = nil;
+ end
+
+ if defined?(@env['REMOTE_ADDR'])
+ @remote_addr = @env['REMOTE_ADDR']
+ else
+ @remote_addr = nil
+ end
+ # }}}
+ end
+
+ # Prints a String to the client. If caching is enabled, the String will
+ # buffered until the end of the out block ends.
+ def print(str = "")
+ # {{{
+ unless @output_allowed
+ raise "You just can write to output inside of a Rweb::out-block"
+ end
+
+ if @settings["cache"]
+ @buffer += [str.to_s]
+ else
+ unless @output_started
+ sendHeaders
+ end
+ $stdout.print(str)
+ end
+ nil
+ # }}}
+ end
+
+ # Prints a String to the client and adds a line break at the end. Please
+ # remember, that a line break is not visible in HTML, use the <br> HTML-Tag
+ # for this. If caching is enabled, the String will buffered until the end
+ # of the out block ends.
+ def puts(str = "")
+ # {{{
+ self.print(str + "\n")
+ # }}}
+ end
+
+ # Alias to print.
+ def write(str = "")
+ # {{{
+ self.print(str)
+ # }}}
+ end
+
+ # If caching is enabled, all cached data are send to the cliend and the
+ # cache emptied.
+ def flush
+ # {{{
+ unless @output_allowed
+ raise "You can't use flush outside of a Rweb::out-block"
+ end
+ buffer = @buffer.join
+
+ unless @output_started
+ sendHeaders
+ end
+ $stdout.print(buffer)
+
+ @buffer = []
+ # }}}
+ end
+
+ # Sends one or more header to the client. All headers are cached just
+ # before body data are send to the client. If the same header are set
+ # twice, only the last value is send.
+ #
+ # Example:
+ # web.header("Last-Modified: Mon, 16 Feb 2004 20:15:41 GMT")
+ # web.header("Location: http://www.ruby-lang.org")
+ #
+ # You can specify more than one header at the time by doing something like
+ # this:
+ # web.header("Content-Type: text/plain\nContent-Length: 383")
+ # or
+ # web.header(["Content-Type: text/plain", "Content-Length: 383"])
+ def header(str)
+ # {{{
+ if @output_started
+ raise "HTTP-Headers are already send. You can't change them after output has started!"
+ end
+ unless @output_allowed
+ raise "You just can set headers inside of a Rweb::out-block"
+ end
+ if str.is_a?Array
+ str.each do | value |
+ self.header(value)
+ end
+
+ elsif str.split(/\n/).length > 1
+ str.split(/\n/).each do | value |
+ self.header(value)
+ end
+
+ elsif str.is_a? String
+ str.gsub!(/\r/, "")
+
+ if (str =~ /^HTTP\/1\.[01] [0-9]{3} ?.*$/) == 0
+ pattern = /^HTTP\/1.[01] ([0-9]{3}) ?(.*)$/
+
+ result = pattern.match(str)
+ self.setstatus(result[0], result[1])
+ elsif (str =~ /^status: [0-9]{3} ?.*$/i) == 0
+ pattern = /^status: ([0-9]{3}) ?(.*)$/i
+
+ result = pattern.match(str)
+ self.setstatus(result[0], result[1])
+ else
+ a = str.split(/: ?/, 2)
+
+ @header[a[0].downcase] = a[1]
+ end
+ end
+ # }}}
+ end
+
+ # Changes the status of this page. There are several codes like "200 OK",
+ # "302 Found", "404 Not Found" or "500 Internal Server Error". A list of
+ # all codes is available at
+ # http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10
+ #
+ # You can just send the code number, the reason phrase will be added
+ # automaticly with the recommendations from the w3c if not specified. If
+ # you set the status twice or more, only the last status will be send.
+ # Examples:
+ # web.status("401 Unauthorized")
+ # web.status("410 Sad but true, this lonely page is gone :(")
+ # web.status(206)
+ # web.status("400")
+ #
+ # The default status is "200 OK". If a "Location" header is set, the
+ # default status is "302 Found".
+ def status(str)
+ # {{{
+ if @output_started
+ raise "HTTP-Headers are already send. You can't change them after output has started!"
+ end
+ unless @output_allowed
+ raise "You just can set headers inside of a Rweb::out-block"
+ end
+ if str.is_a?Integer
+ @status = str
+ elsif str.is_a?String
+ p1 = /^([0-9]{3}) ?(.*)$/
+ p2 = /^HTTP\/1\.[01] ([0-9]{3}) ?(.*)$/
+ p3 = /^status: ([0-9]{3}) ?(.*)$/i
+
+ if (a = p1.match(str)) == nil
+ if (a = p2.match(str)) == nil
+ if (a = p3.match(str)) == nil
+ raise ArgumentError, "Invalid argument", caller
+ end
+ end
+ end
+ @status = a[1].to_i
+ if a[2] != ""
+ @reasonPhrase = a[2]
+ else
+ @reasonPhrase = getReasonPhrase(@status)
+ end
+ else
+ raise ArgumentError, "Argument of setstatus must be integer or string", caller
+ end
+ # }}}
+ end
+
+ # Handles the output of your content and rescues all exceptions. Send all
+ # data in the block to this method. For example:
+ # web.out do
+ # web.header("Content-Type: text/plain")
+ # web.puts("Hello, plain world!")
+ # end
+ def out
+ # {{{
+ @output_allowed = true
+ @buffer = []; # We use an array as buffer, because it's more performant :)
+
+ begin
+ yield
+ rescue Exception => exception
+ $stderr.puts "Ruby exception rescued (#{exception.class}): #{exception.message}"
+ $stderr.puts exception.backtrace.join("\n")
+
+ unless @output_started
+ self.setstatus(500)
+ @header = {}
+ end
+
+ unless (@settings.has_key?("hide errors") and @settings["hide errors"] == true)
+ unless @output_started
+ self.header("Content-Type: text/html")
+ self.puts "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Strict//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">"
+ self.puts "<html>"
+ self.puts "<head>"
+ self.puts "<title>500 Internal Server Error</title>"
+ self.puts "</head>"
+ self.puts "<body>"
+ end
+ if @header.has_key?("content-type") and (@header["content-type"] =~ /^text\/html/i) == 0
+ self.puts "<h1>Internal Server Error</h1>"
+ self.puts "<p>The server encountered an exception and was unable to complete your request.</p>"
+ self.puts "<p>The exception has provided the following information:</p>"
+ self.puts "<pre style=\"background: #FFCCCC; border: black solid 2px; margin-left: 2cm; margin-right: 2cm; padding: 2mm;\"><b>#{exception.class}</b>: #{exception.message} <b>on</b>"
+ self.puts
+ self.puts "#{exception.backtrace.join("\n")}</pre>"
+ self.puts "</body>"
+ self.puts "</html>"
+ else
+ self.puts "The server encountered an exception and was unable to complete your request"
+ self.puts "The exception has provided the following information:"
+ self.puts "#{exception.class}: #{exception.message}"
+ self.puts
+ self.puts exception.backtrace.join("\n")
+ end
+ end
+ end
+
+ if @settings["cache"]
+ buffer = @buffer.join
+
+ unless @output_started
+ unless @header.has_key?("content-length")
+ self.header("content-length: #{buffer.length}")
+ end
+
+ sendHeaders
+ end
+ $stdout.print(buffer)
+ elsif !@output_started
+ sendHeaders
+ end
+ @output_allowed = false;
+ # }}}
+ end
+
+ # Decodes URL encoded data, %20 for example stands for a space.
+ def Rweb.unescape(str)
+ # {{{
+ if defined? str and str.is_a? String
+ str.gsub!(/\+/, " ")
+ str.gsub(/%.{2}/) do | s |
+ s[1,2].hex.chr
+ end
+ end
+ # }}}
+ end
+
+ protected
+ def sendHeaders
+ # {{{
+
+ Cookie.disallow # no more cookies can be set or modified
+ if !(@settings.has_key?("silent") and @settings["silent"] == true) and !@header.has_key?("x-powered-by")
+ if @mod_ruby
+ header("x-powered-by: #{RWEB} (Ruby/#{RUBY_VERSION}, #{MOD_RUBY})");
+ else
+ header("x-powered-by: #{RWEB} (Ruby/#{RUBY_VERSION})");
+ end
+ end
+
+ if @output_method == "ph"
+ if ((@status == nil or @status == 200) and !@header.has_key?("content-type") and !@header.has_key?("location"))
+ header("content-type: text/html")
+ end
+
+ if @status != nil
+ $stdout.print "Status: #{@status} #{@reasonPhrase}\r\n"
+ end
+
+ @header.each do |key, value|
+ key = key *1 # "unfreeze" key :)
+ key[0] = key[0,1].upcase![0]
+
+ key = key.gsub(/-[a-z]/) do |char|
+ "-" + char[1,1].upcase
+ end
+
+ $stdout.print "#{key}: #{value}\r\n"
+ end
+ cookies = Cookie.getHttpHeader # Get all cookies as an HTTP Header
+ if cookies
+ $stdout.print cookies
+ end
+
+ $stdout.print "\r\n"
+
+ elsif @output_method == "nph"
+ elsif @output_method == "mod_ruby"
+ r = Apache.request
+
+ if ((@status == nil or @status == 200) and !@header.has_key?("content-type") and !@header.has_key?("location"))
+ header("text/html")
+ end
+
+ if @status != nil
+ r.status_line = "#{@status} #{@reasonPhrase}"
+ end
+
+ r.send_http_header
+ @header.each do |key, value|
+ key = key *1 # "unfreeze" key :)
+
+ key[0] = key[0,1].upcase![0]
+ key = key.gsub(/-[a-z]/) do |char|
+ "-" + char[1,1].upcase
+ end
+ puts "#{key}: #{value.class}"
+ #r.headers_out[key] = value
+ end
+ end
+ @output_started = true
+ # }}}
+ end
+
+ def getReasonPhrase (status)
+ # {{{
+ if status == 100
+ "Continue"
+ elsif status == 101
+ "Switching Protocols"
+ elsif status == 200
+ "OK"
+ elsif status == 201
+ "Created"
+ elsif status == 202
+ "Accepted"
+ elsif status == 203
+ "Non-Authoritative Information"
+ elsif status == 204
+ "No Content"
+ elsif status == 205
+ "Reset Content"
+ elsif status == 206
+ "Partial Content"
+ elsif status == 300
+ "Multiple Choices"
+ elsif status == 301
+ "Moved Permanently"
+ elsif status == 302
+ "Found"
+ elsif status == 303
+ "See Other"
+ elsif status == 304
+ "Not Modified"
+ elsif status == 305
+ "Use Proxy"
+ elsif status == 307
+ "Temporary Redirect"
+ elsif status == 400
+ "Bad Request"
+ elsif status == 401
+ "Unauthorized"
+ elsif status == 402
+ "Payment Required"
+ elsif status == 403
+ "Forbidden"
+ elsif status == 404
+ "Not Found"
+ elsif status == 405
+ "Method Not Allowed"
+ elsif status == 406
+ "Not Acceptable"
+ elsif status == 407
+ "Proxy Authentication Required"
+ elsif status == 408
+ "Request Time-out"
+ elsif status == 409
+ "Conflict"
+ elsif status == 410
+ "Gone"
+ elsif status == 411
+ "Length Required"
+ elsif status == 412
+ "Precondition Failed"
+ elsif status == 413
+ "Request Entity Too Large"
+ elsif status == 414
+ "Request-URI Too Large"
+ elsif status == 415
+ "Unsupported Media Type"
+ elsif status == 416
+ "Requested range not satisfiable"
+ elsif status == 417
+ "Expectation Failed"
+ elsif status == 500
+ "Internal Server Error"
+ elsif status == 501
+ "Not Implemented"
+ elsif status == 502
+ "Bad Gateway"
+ elsif status == 503
+ "Service Unavailable"
+ elsif status == 504
+ "Gateway Time-out"
+ elsif status == 505
+ "HTTP Version not supported"
+ else
+ raise "Unknown Statuscode. See http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html#sec6.1 for more information."
+ end
+ # }}}
+ end
+end
+
+class Cookie
+ attr_reader :name, :value, :maxage, :path, :domain, :secure, :comment
+
+ # Sets a cookie. Please see below for details of the attributes.
+ def initialize (name, value = nil, maxage = nil, path = nil, domain = nil, secure = false)
+ # {{{
+ # HTTP headers (Cookies are a HTTP header) can only set, while no content
+ # is send. So an exception will be raised, when @@allowed is set to false
+ # and a new cookie has set.
+ unless defined?(@@allowed)
+ @@allowed = true
+ end
+ unless @@allowed
+ raise "You can't set cookies after the HTTP headers are send."
+ end
+
+ unless defined?(@@list)
+ @@list = []
+ end
+ @@list += [self]
+
+ unless defined?(@@type)
+ @@type = "netscape"
+ end
+
+ unless name.class == String
+ raise TypeError, "The name of a cookie must be a string", caller
+ end
+ if value.class.superclass == Integer || value.class == Float
+ value = value.to_s
+ elsif value.class != String && value != nil
+ raise TypeError, "The value of a cookie must be a string, integer, float or nil", caller
+ end
+ if maxage.class == Time
+ maxage = maxage - Time.now
+ elsif !maxage.class.superclass == Integer || !maxage == nil
+ raise TypeError, "The maxage date of a cookie must be an Integer or Time object or nil.", caller
+ end
+ unless path.class == String || path == nil
+ raise TypeError, "The path of a cookie must be nil or a string", caller
+ end
+ unless domain.class == String || domain == nil
+ raise TypeError, "The value of a cookie must be nil or a string", caller
+ end
+ unless secure == true || secure == false
+ raise TypeError, "The secure field of a cookie must be true or false", caller
+ end
+
+ @name, @value, @maxage, @path, @domain, @secure = name, value, maxage, path, domain, secure
+ @comment = nil
+ # }}}
+ end
+
+ # Modifies the value of this cookie. The information you want to store. If the
+ # value is nil, the cookie will be deleted by the client.
+ #
+ # This attribute can be a String, Integer or Float object or nil.
+ def value=(value)
+ # {{{
+ if value.class.superclass == Integer || value.class == Float
+ value = value.to_s
+ elsif value.class != String && value != nil
+ raise TypeError, "The value of a cookie must be a string, integer, float or nil", caller
+ end
+ @value = value
+ # }}}
+ end
+
+ # Modifies the maxage of this cookie. This attribute defines the lifetime of
+ # the cookie, in seconds. A value of 0 means the cookie should be discarded
+ # imediatly. If it set to nil, the cookie will be deleted when the browser
+ # will be closed.
+ #
+ # Attention: This is different from other implementations like PHP, where you
+ # gives the seconds since 1/1/1970 0:00:00 GMT.
+ #
+ # This attribute must be an Integer or Time object or nil.
+ def maxage=(maxage)
+ # {{{
+ if maxage.class == Time
+ maxage = maxage - Time.now
+ elsif maxage.class.superclass == Integer || !maxage == nil
+ raise TypeError, "The maxage of a cookie must be an Interger or Time object or nil.", caller
+ end
+ @maxage = maxage
+ # }}}
+ end
+
+ # Modifies the path value of this cookie. The client will send this cookie
+ # only, if the requested document is this directory or a subdirectory of it.
+ #
+ # The value of the attribute must be a String object or nil.
+ def path=(path)
+ # {{{
+ unless path.class == String || path == nil
+ raise TypeError, "The path of a cookie must be nil or a string", caller
+ end
+ @path = path
+ # }}}
+ end
+
+ # Modifies the domain value of this cookie. The client will send this cookie
+ # only if it's connected with this domain (or a subdomain, if the first
+ # character is a dot like in ".ruby-lang.org")
+ #
+ # The value of this attribute must be a String or nil.
+ def domain=(domain)
+ # {{{
+ unless domain.class == String || domain == nil
+ raise TypeError, "The domain of a cookie must be a String or nil.", caller
+ end
+ @domain = domain
+ # }}}
+ end
+
+ # Modifies the secure flag of this cookie. If it's true, the client will only
+ # send this cookie if it is secured connected with us.
+ #
+ # The value od this attribute has to be true or false.
+ def secure=(secure)
+ # {{{
+ unless secure == true || secure == false
+ raise TypeError, "The secure field of a cookie must be true or false", caller
+ end
+ @secure = secure
+ # }}}
+ end
+
+ # Modifies the comment value of this cookie. The comment won't be send, if
+ # type is "netscape".
+ def comment=(comment)
+ # {{{
+ unless comment.class == String || comment == nil
+ raise TypeError, "The comment of a cookie must be a string or nil", caller
+ end
+ @comment = comment
+ # }}}
+ end
+
+ # Changes the type of all cookies.
+ # Allowed values are RFC2109 and netscape (default).
+ def Cookie.type=(type)
+ # {{{
+ unless @@allowed
+ raise "The cookies are allready send, so you can't change the type anymore."
+ end
+ unless type.downcase == "rfc2109" && type.downcase == "netscape"
+ raise "The type of the cookies must be \"RFC2109\" or \"netscape\"."
+ end
+ @@type = type;
+ # }}}
+ end
+
+ # After sending this message, no cookies can be set or modified. Use it, when
+ # HTTP-Headers are send. Rweb does this for you.
+ def Cookie.disallow
+ # {{{
+ @@allowed = false
+ true
+ # }}}
+ end
+
+ # Returns a HTTP header (type String) with all cookies. Rweb does this for
+ # you.
+ def Cookie.getHttpHeader
+ # {{{
+ if defined?(@@list)
+ if @@type == "netscape"
+ str = ""
+ @@list.each do |cookie|
+ if cookie.value == nil
+ cookie.maxage = 0
+ cookie.value = ""
+ end
+ # TODO: Name and value should be escaped!
+ str += "Set-Cookie: #{cookie.name}=#{cookie.value}"
+ unless cookie.maxage == nil
+ expire = Time.now + cookie.maxage
+ expire.gmtime
+ str += "; Expire=#{expire.strftime("%a, %d-%b-%Y %H:%M:%S %Z")}"
+ end
+ unless cookie.domain == nil
+ str += "; Domain=#{cookie.domain}"
+ end
+ unless cookie.path == nil
+ str += "; Path=#{cookie.path}"
+ end
+ if cookie.secure
+ str += "; Secure"
+ end
+ str += "\r\n"
+ end
+ return str
+ else # type == "RFC2109"
+ str = "Set-Cookie: "
+ comma = false;
+
+ @@list.each do |cookie|
+ if cookie.value == nil
+ cookie.maxage = 0
+ cookie.value = ""
+ end
+ if comma
+ str += ","
+ end
+ comma = true
+
+ str += "#{cookie.name}=\"#{cookie.value}\""
+ unless cookie.maxage == nil
+ str += "; Max-Age=\"#{cookie.maxage}\""
+ end
+ unless cookie.domain == nil
+ str += "; Domain=\"#{cookie.domain}\""
+ end
+ unless cookie.path == nil
+ str += "; Path=\"#{cookie.path}\""
+ end
+ if cookie.secure
+ str += "; Secure"
+ end
+ unless cookie.comment == nil
+ str += "; Comment=\"#{cookie.comment}\""
+ end
+ str += "; Version=\"1\""
+ end
+ str
+ end
+ else
+ false
+ end
+ # }}}
+ end
+end
+
+require 'strscan'
+
+module BBCode
+ DEBUG = true
+
+ use 'encoder', 'tags', 'tagstack', 'smileys'
+
+=begin
+ The Parser class takes care of the encoding.
+ It scans the given BBCode (as plain text), finds tags
+ and smilies and also makes links of urls in text.
+
+ Normal text is send directly to the encoder.
+
+ If a tag was found, an instance of a Tag subclass is created
+ to handle the case.
+
+ The @tagstack manages tag nesting and ensures valid HTML.
+=end
+
+ class Parser
+ class Attribute
+ # flatten and use only one empty_arg
+ def self.create attr
+ attr = flatten attr
+ return @@empty_attr if attr.empty?
+ new attr
+ end
+
+ private_class_method :new
+
+ # remove leading and trailing whitespace; concat lines
+ def self.flatten attr
+ attr.strip.gsub(/\n/, ' ')
+ # -> ^ and $ can only match at begin and end now
+ end
+
+ ATTRIBUTE_SCAN = /
+ (?!$) # don't match at end
+ \s*
+ ( # $1 = key
+ [^=\s\]"\\]*
+ (?:
+ (?: \\. | "[^"\\]*(?:\\.[^"\\]*)*"? )
+ [^=\s\]"\\]*
+ )*
+ )
+ (?:
+ =
+ ( # $2 = value
+ [^\s\]"\\]*
+ (?:
+ (?: \\. | "[^"\\]*(?:\\.[^"\\]*)*"? )
+ [^\s\]"\\]*
+ )*
+ )?
+ )?
+ \s*
+ /x
+
+ def self.parse source
+ source = source.dup
+ # empty_tag: the tag looks like [... /]
+ # slice!: this deletes the \s*/] at the end
+ # \s+ because [url=http://rubybb.org/forum/] is NOT an empty tag.
+ # In RubyBBCode, you can use [url=http://rubybb.org/forum/ /], and this has to be
+ # interpreted correctly.
+ empty_tag = source.sub!(/^:/, '=') or source.slice!(/\/$/)
+ debug 'PARSE: ' + source.inspect + ' => ' + empty_tag.inspect
+ #-> we have now an attr that's EITHER empty OR begins and ends with non-whitespace.
+
+ attr = Hash.new
+ attr[:flags] = []
+ source.scan(ATTRIBUTE_SCAN) { |key, value|
+ if not value
+ attr[:flags] << unescape(key)
+ else
+ next if value.empty? and key.empty?
+ attr[unescape(key)] = unescape(value)
+ end
+ }
+ debug attr.inspect
+
+ return empty_tag, attr
+ end
+
+ def self.unescape_char esc
+ esc[1]
+ end
+
+ def self.unquote qt
+ qt[1..-1].chomp('"').gsub(/\\./) { |esc| unescape_char esc }
+ end
+
+ def self.unescape str
+ str.gsub(/ (\\.) | (" [^"\\]* (?:\\.[^"\\]*)* "?) /x) {
+ if $1
+ unescape_char $1
+ else
+ unquote $2
+ end
+ }
+ end
+
+ include Enumerable
+ def each &block
+ @args.each(&block)
+ end
+
+ attr_reader :source, :args, :value
+
+ def initialize source
+ @source = source
+ debug 'Attribute#new(%p)' % source
+ @empty_tag, @attr = Attribute.parse source
+ @value = @attr[''].to_s
+ end
+
+ def empty?
+ self == @@empty_attr
+ end
+
+ def empty_tag?
+ @empty_tag
+ end
+
+ def [] *keys
+ res = @attr[*keys]
+ end
+
+ def flags
+ attr[:flags]
+ end
+
+ def to_s
+ @attr
+ end
+
+ def inspect
+ 'ATTR[' + @attr.inspect + (@empty_tag ? ' | empty tag' : '') + ']'
+ end
+ end
+ class Attribute
+ @@empty_attr = new ''
+ end
+ end
+
+ class Parser
+ def Parser.flatten str
+ # replace mac & dos newlines with unix style
+ str.gsub(/\r\n?/, "\n")
+ end
+
+ def initialize input = ''
+ # input manager
+ @scanner = StringScanner.new ''
+ # output manager
+ @encoder = Encoder.new
+ @output = ''
+ # tag manager
+ @tagstack = TagStack.new(@encoder)
+
+ @do_magic = true
+ # set the input
+ feed input
+ end
+
+ # if you want, you can feed a parser instance after creating,
+ # or even feed it repeatedly.
+ def feed food
+ @scanner.string = Parser.flatten food
+ end
+
+ # parse through the string using parse_token
+ def parse
+ parse_token until @scanner.eos?
+ @tagstack.close_all
+ @output = parse_magic @encoder.output
+ end
+
+ def output
+ @output
+ end
+
+ # ok, internals start here
+ private
+ # the default output functions. everything should use them or the tags.
+ def add_text text = @scanner.matched
+ @encoder.add_text text
+ end
+
+ # use this carefully
+ def add_html html
+ @encoder.add_html html
+ end
+
+ # highlights the text as error
+ def add_garbage garbage
+ add_html '<span class="error">' if DEBUG
+ add_text garbage
+ add_html '</span>' if DEBUG
+ end
+
+ # unknown and incorrectly nested tags are ignored and
+ # sent as plaintext (garbage in - garbage out).
+ # in debug mode, garbage is marked with lime background.
+ def garbage_out start
+ @scanner.pos = start
+ garbage = @scanner.scan(/./m)
+ debug 'GARBAGE: ' + garbage
+ add_garbage garbage
+ end
+
+ # simple text; everything but [, \[ allowed
+ SIMPLE_TEXT_SCAN_ = /
+ [^\[\\]* # normal*
+ (?: # (
+ \\.? # special
+ [^\[\\]* # normal*
+ )* # )*
+ /mx
+ SIMPLE_TEXT_SCAN = /[^\[]+/
+
+=begin
+
+ WHAT IS A TAG?
+ ==============
+
+ Tags in BBCode can be much more than just a simple [b].
+ I use many terms here to differ the parts of each tag.
+
+ Basic scheme:
+ [ code ]
+ TAG START TAG INFO TAG END
+
+ Most tags need a second tag to close the range it opened.
+ This is done with CLOSING TAGS:
+ [/code]
+ or by using empty tags that have no content and close themselfes:
+ [url=winamp.com /]
+ You surely know this from HTML.
+ These slashes define the TAG KIND = normal|closing|empty and
+ cannot be used together.
+
+ Everything between [ and ] and expluding the slashes is called the
+ TAG INFO. This info may contain:
+ - TAG ID
+ - TAG NAME including the tag id
+ - attributes
+
+ The TAG ID is the first char of the info:
+
+ TAG | ID
+ ----------+----
+ [quote] | q
+ [±] | &
+ ["[b]"] | "
+ [/url] | u
+ [---] | -
+
+ As you can see, the tag id shows the TAG TYPE, it can be a
+ normal tag, a formatting tag or an entity.
+ Therefor, the parser first scans the id to decide how to go
+ on with parsing.
+=end
+ # tag
+ # TODO more complex expression allowing
+ # [quote="[ladico]"] and [quote=\[ladico\]] to be correct tags
+ TAG_BEGIN_SCAN = /
+ \[ # tag start
+ ( \/ )? # $1 = closing tag?
+ ( [^\]] ) # $2 = tag id
+ /x
+ TAG_END_SCAN = /
+ [^\]]* # rest that was not handled
+ \]? # tag end
+ /x
+ CLOSE_TAG_SCAN = /
+ ( [^\]]* ) # $1 = the rest of the tag info
+ ( \/ )? # $2 = empty tag?
+ \]? # tag end
+ /x
+ UNCLOSED_TAG_SCAN = / \[ /x
+
+ CLASSIC_TAG_SCAN = / [a-z]* /ix
+
+ SEPARATOR_TAG_SCAN = / \** /x
+
+ FORMAT_TAG_SCAN = / -- -* /x
+
+ QUOTED_SCAN = /
+ ( # $1 = quoted text
+ [^"\\]* # normal*
+ (?: # (
+ \\. # special
+ [^"\\]* # normal*
+ )* # )*
+ )
+ "? # end quote "
+ /mx
+
+ ENTITY_SCAN = /
+ ( [^;\]]+ ) # $1 = entity code
+ ;? # optional ending semicolon
+ /ix
+
+ SMILEY_SCAN = Smileys::SMILEY_PATTERN
+
+ # this is the main parser loop that separates
+ # text - everything until "["
+ # from
+ # tags - starting with "[", ending with "]"
+ def parse_token
+ if @scanner.scan(SIMPLE_TEXT_SCAN)
+ add_text
+ else
+ handle_tag
+ end
+ end
+
+ def handle_tag
+ tag_start = @scanner.pos
+
+ unless @scanner.scan TAG_BEGIN_SCAN
+ garbage_out tag_start
+ return
+ end
+
+ closing, id = @scanner[1], @scanner[2]
+ #debug 'handle_tag(%p)' % @scanner.matched
+
+ handled =
+ case id
+
+ when /[a-z]/i
+ if @scanner.scan(CLASSIC_TAG_SCAN)
+ if handle_classic_tag(id + @scanner.matched, closing)
+ already_closed = true
+ end
+ end
+
+ when '*'
+ if @scanner.scan(SEPARATOR_TAG_SCAN)
+ handle_asterisk tag_start, id + @scanner.matched
+ true
+ end
+
+ when '-'
+ if @scanner.scan(FORMAT_TAG_SCAN)
+ #format = id + @scanner.matched
+ @encoder.add_html "\n<hr>\n"
+ true
+ end
+
+ when '"'
+ if @scanner.scan(QUOTED_SCAN)
+ @encoder.add_text unescape(@scanner[1])
+ true
+ end
+
+ when '&'
+ if @scanner.scan(ENTITY_SCAN)
+ @encoder.add_entity @scanner[1]
+ true
+ end
+
+ when Smileys::SMILEY_START_CHARSET
+ @scanner.pos = @scanner.pos - 1 # (ungetch)
+ if @scanner.scan(SMILEY_SCAN)
+ @encoder.add_html Smileys.smiley_to_image(@scanner.matched)
+ true
+ end
+
+ end # case
+
+ return garbage_out(tag_start) unless handled
+
+ @scanner.scan(TAG_END_SCAN) unless already_closed
+ end
+
+ ATTRIBUTES_SCAN = /
+ (
+ [^\]"\\]*
+ (?:
+ (?:
+ \\.
+ |
+ "
+ [^"\\]*
+ (?:
+ \\.
+ [^"\\]*
+ )*
+ "?
+ )
+ [^\]"\\]*
+ )*
+ )
+ \]?
+ /x
+
+ def handle_classic_tag name, closing
+ debug 'TAG: ' + (closing ? '/' : '') + name
+ # flatten
+ name.downcase!
+ tag_class = TAG_LIST[name]
+ return unless tag_class
+
+ #debug((opening ? 'OPEN ' : 'CLOSE ') + tag_class.name)
+
+ # create an attribute object to handle it
+ @scanner.scan(ATTRIBUTES_SCAN)
+ #debug name + ':' + @scanner[1]
+ attr = Attribute.create @scanner[1]
+ #debug 'ATTRIBUTES %p ' % attr #unless attr.empty?
+
+ #debug 'closing: %p; name=%s, attr=%p' % [closing, name, attr]
+
+ # OPEN
+ if not closing and tag = @tagstack.try_open_class(tag_class, attr)
+ #debug 'opening'
+ tag.do_open @scanner
+ # this should be done by the tag itself.
+ if attr.empty_tag?
+ tag.handle_empty
+ @tagstack.close_tag
+ elsif tag.special_content?
+ handle_special_content(tag)
+ @tagstack.close_tag
+ # # ignore asterisks directly after the opening; these are phpBBCode
+ # elsif tag.respond_to? :asterisk
+ # debug 'SKIP ASTERISKS: ' if @scanner.skip(ASTERISK_TAGS_SCAN)
+ end
+
+ # CLOSE
+ elsif @tagstack.try_close_class(tag_class)
+ #debug 'closing'
+ # GARBAGE
+ else
+ return
+ end
+
+ true
+ end
+
+ def handle_asterisk tag_start, stars
+ #debug 'ASTERISK: ' + stars.to_s
+ # rule for asterisk tags: they belong to the last tag
+ # that handles them. tags opened after this tag are closed.
+ # if no open tag uses them, all are closed.
+ tag = @tagstack.close_all_until { |tag| tag.respond_to? :asterisk }
+ unless tag and tag.asterisk stars, @scanner
+ garbage_out tag_start
+ end
+ end
+
+ def handle_special_content tag
+ scanned = @scanner.scan_until(tag.closing_tag)
+ if scanned
+ scanned.slice!(-(@scanner.matched.size)..-1)
+ else
+ scanned = @scanner.scan(/.*/m).to_s
+ end
+ #debug 'SPECIAL CONTENT: ' + scanned
+ tag.handle_content(scanned)
+ end
+
+ def unescape text
+ # input: correctly formatted quoted string (without the quotes)
+ text.gsub(/\\(?:(["\\])|.)/) { $1 or $& }
+ end
+
+
+ # MAGIC FEAUTURES
+
+ URL_PATTERN = /(?:(?:www|ftp)\.|(?>\w{3,}):\/\/)\S+/
+ EMAIL_PATTERN = /(?>[\w\-_.]+)@[\w\-\.]+\.\w+/
+
+ HAS_MAGIC = /[&@#{Smileys::SMILEY_START_CHARS}]|(?i:www|ftp)/
+
+ MAGIC_PATTERN = Regexp.new('(\W|^)(%s)' %
+ [Smileys::MAGIC_SMILEY_PATTERN, URL_PATTERN, EMAIL_PATTERN].map { |pattern|
+ pattern.to_s
+ }.join('|') )
+
+ IS_SMILEY_PATTERN = Regexp.new('^%s' % Smileys::SMILEY_START_CHARSET.to_s )
+ IS_URL_PATTERN = /^(?:(?i:www|ftp)\.|(?>\w+):\/\/)/
+ URL_STARTS_WITH_PROTOCOL = /^\w+:\/\//
+ IS_EMAIL_PATTERN = /^[\w\-_.]+@/
+
+ def to_magic text
+ # debug MAGIC_PATTERN.to_s
+ text.gsub!(MAGIC_PATTERN) {
+ magic = $2
+ $1 + case magic
+ when IS_SMILEY_PATTERN
+ Smileys.smiley_to_img magic
+ when IS_URL_PATTERN
+ last = magic.slice_punctation! # no punctation in my URL
+ href = magic
+ href.insert(0, 'http://') unless magic =~ URL_STARTS_WITH_PROTOCOL
+ '<a href="' + href + '">' + magic + '</a>' + last
+ when IS_EMAIL_PATTERN
+ last = magic.slice_punctation!
+ '<a href="mailto:' + magic + '">' + magic + '</a>' + last
+ else
+ raise '{{{' + magic + '}}}'
+ end
+ }
+ text
+ end
+
+ # handles smileys and urls
+ def parse_magic html
+ return html unless @do_magic
+ scanner = StringScanner.new html
+ out = ''
+ while scanner.rest?
+ if scanner.scan(/ < (?: a\s .*? <\/a> | pre\W .*? <\/pre> | [^>]* > ) /mx)
+ out << scanner.matched
+ elsif scanner.scan(/ [^<]+ /x)
+ out << to_magic(scanner.matched)
+
+ # this should never happen
+ elsif scanner.scan(/./m)
+ raise 'ERROR: else case reached'
+ end
+ end
+ out
+ end
+ end # Parser
+end
+
+class String
+ def slice_punctation!
+ slice!(/[.:,!\?]+$/).to_s # return '' instead of nil
+ end
+end
+
+#
+# = Grammar
+#
+# An implementation of common algorithms on grammars.
+#
+# This is used by Shinobu, a visualization tool for educating compiler-building.
+#
+# Thanks to Andreas Kunert for his wonderful LR(k) Pamphlet (German, see http://www.informatik.hu-berlin.de/~kunert/papers/lr-analyse), and Aho/Sethi/Ullman for their Dragon Book.
+#
+# Homepage:: http://shinobu.cYcnus.de (not existing yet)
+# Author:: murphy (Kornelius Kalnbach)
+# Copyright:: (cc) 2005 cYcnus
+# License:: GPL
+# Version:: 0.2.0 (2005-03-27)
+
+require 'set_hash'
+require 'ctype'
+require 'tools'
+require 'rules'
+require 'trace'
+
+require 'first'
+require 'follow'
+
+# = Grammar
+#
+# == Syntax
+#
+# === Rules
+#
+# Each line is a rule.
+# The syntax is
+#
+# left - right
+#
+# where +left+ and +right+ can be uppercase and lowercase letters,
+# and <code>-</code> can be any combination of <, >, - or whitespace.
+#
+# === Symbols
+#
+# Uppercase letters stand for meta symbols, lowercase for terminals.
+#
+# You can make epsilon-derivations by leaving <code><right></code> empty.
+#
+# === Example
+# S - Ac
+# A - Sc
+# A - b
+# A -
+class Grammar
+
+ attr_reader :tracer
+ # Creates a new Grammar.
+ # If $trace is true, the algorithms explain (textual) what they do to $stdout.
+ def initialize data, tracer = Tracer.new
+ @tracer = tracer
+ @rules = Rules.new
+ @terminals, @meta_symbols = SortedSet.new, Array.new
+ @start_symbol = nil
+ add_rules data
+ end
+
+ attr_reader :meta_symbols, :terminals, :rules, :start_symbol
+
+ alias_method :sigma, :terminals
+ alias_method :alphabet, :terminals
+ alias_method :variables, :meta_symbols
+ alias_method :nonterminals, :meta_symbols
+
+ # A string representation of the grammar for debugging.
+ def inspect productions_too = false
+ 'Grammar(meta symbols: %s; alphabet: %s; productions: [%s]; start symbol: %s)' %
+ [
+ meta_symbols.join(', '),
+ terminals.join(', '),
+ if productions_too
+ @rules.inspect
+ else
+ @rules.size
+ end,
+ start_symbol
+ ]
+ end
+
+ # Add rules to the grammar. +rules+ should be a String or respond to +scan+ in a similar way.
+ #
+ # Syntax: see Grammar.
+ def add_rules grammar
+ @rules = Rules.parse grammar do |rule|
+ @start_symbol ||= rule.left
+ @meta_symbols << rule.left
+ @terminals.merge rule.right.split('').select { |s| terminal? s }
+ end
+ @meta_symbols.uniq!
+ update
+ end
+
+ # Returns a hash acting as FIRST operator, so that
+ # <code>first["ABC"]</code> is FIRST(ABC).
+ # See http://en.wikipedia.org/wiki/LL_parser "Constructing an LL(1) parsing table" for details.
+ def first
+ first_operator
+ end
+
+ # Returns a hash acting as FOLLOW operator, so that
+ # <code>first["A"]</code> is FOLLOW(A).
+ # See http://en.wikipedia.org/wiki/LL_parser "Constructing an LL(1) parsing table" for details.
+ def follow
+ follow_operator
+ end
+
+ LLError = Class.new(Exception)
+ LLErrorType1 = Class.new(LLError)
+ LLErrorType2 = Class.new(LLError)
+
+ # Tests if the grammar is LL(1).
+ def ll1?
+ begin
+ for meta in @meta_symbols
+ first_sets = @rules[meta].map { |alpha| first[alpha] }
+ first_sets.inject(Set[]) do |already_used, another_first_set|
+ unless already_used.disjoint? another_first_set
+ raise LLErrorType1
+ end
+ already_used.merge another_first_set
+ end
+
+ if first[meta].include? EPSILON and not first[meta].disjoint? follow[meta]
+ raise LLErrorType2
+ end
+ end
+ rescue LLError
+ false
+ else
+ true
+ end
+ end
+
+private
+
+ def first_operator
+ @first ||= FirstOperator.new self
+ end
+
+ def follow_operator
+ @follow ||= FollowOperator.new self
+ end
+
+ def update
+ @first = @follow = nil
+ end
+
+end
+
+if $0 == __FILE__
+ eval DATA.read, nil, $0, __LINE__+4
+end
+
+require 'test/unit'
+
+class TestCaseGrammar < Test::Unit::TestCase
+
+ include Grammar::Symbols
+
+ def fifo s
+ Set[*s.split('')]
+ end
+
+ def test_fifo
+ assert_equal Set[], fifo('')
+ assert_equal Set[EPSILON, END_OF_INPUT, 'x', 'Y'], fifo('?xY$')
+ end
+
+ TEST_GRAMMAR_1 = <<-EOG
+S - ABCD
+A - a
+A -
+B - b
+B -
+C - c
+C -
+D - S
+D -
+ EOG
+
+ def test_symbols
+ assert EPSILON
+ assert END_OF_INPUT
+ end
+
+ def test_first_1
+ g = Grammar.new TEST_GRAMMAR_1
+
+ f = nil
+ assert_nothing_raised { f = g.first }
+ assert_equal(Set['a', EPSILON], f['A'])
+ assert_equal(Set['b', EPSILON], f['B'])
+ assert_equal(Set['c', EPSILON], f['C'])
+ assert_equal(Set['a', 'b', 'c', EPSILON], f['D'])
+ assert_equal(f['D'], f['S'])
+ end
+
+ def test_follow_1
+ g = Grammar.new TEST_GRAMMAR_1
+
+ f = nil
+ assert_nothing_raised { f = g.follow }
+ assert_equal(Set['a', 'b', 'c', END_OF_INPUT], f['A'])
+ assert_equal(Set['a', 'b', 'c', END_OF_INPUT], f['B'])
+ assert_equal(Set['a', 'b', 'c', END_OF_INPUT], f['C'])
+ assert_equal(Set[END_OF_INPUT], f['D'])
+ assert_equal(Set[END_OF_INPUT], f['S'])
+ end
+
+
+ TEST_GRAMMAR_2 = <<-EOG
+S - Ed
+E - EpT
+E - EmT
+E - T
+T - TuF
+T - TdF
+T - F
+F - i
+F - n
+F - aEz
+ EOG
+
+ def test_first_2
+ g = Grammar.new TEST_GRAMMAR_2
+
+ f = nil
+ assert_nothing_raised { f = g.first }
+ assert_equal(Set['a', 'n', 'i'], f['E'])
+ assert_equal(Set['a', 'n', 'i'], f['F'])
+ assert_equal(Set['a', 'n', 'i'], f['T'])
+ assert_equal(Set['a', 'n', 'i'], f['S'])
+ end
+
+ def test_follow_2
+ g = Grammar.new TEST_GRAMMAR_2
+
+ f = nil
+ assert_nothing_raised { f = g.follow }
+ assert_equal(Set['m', 'd', 'z', 'p'], f['E'])
+ assert_equal(Set['m', 'd', 'z', 'p', 'u'], f['F'])
+ assert_equal(Set['m', 'd', 'z', 'p', 'u'], f['T'])
+ assert_equal(Set[END_OF_INPUT], f['S'])
+ end
+
+ LLError = Grammar::LLError
+
+ TEST_GRAMMAR_3 = <<-EOG
+E - TD
+D - pTD
+D -
+T - FS
+S - uFS
+S -
+S - p
+F - aEz
+F - i
+ EOG
+
+ NoError = Class.new(Exception)
+
+ def test_first_3
+ g = Grammar.new TEST_GRAMMAR_3
+
+ # Grammar 3 is LL(1), so all first-sets must be disjoint.
+ f = nil
+ assert_nothing_raised { f = g.first }
+ assert_equal(Set['a', 'i'], f['E'])
+ assert_equal(Set[EPSILON, 'p'], f['D'])
+ assert_equal(Set['a', 'i'], f['F'])
+ assert_equal(Set['a', 'i'], f['T'])
+ assert_equal(Set[EPSILON, 'u', 'p'], f['S'])
+ for m in g.meta_symbols
+ r = g.rules[m]
+ firsts = r.map { |x| f[x] }.to_set
+ assert_nothing_raised do
+ firsts.inject(Set.new) do |already_used, another_first_set|
+ raise LLError, 'not disjoint!' unless already_used.disjoint? another_first_set
+ already_used.merge another_first_set
+ end
+ end
+ end
+ end
+
+ def test_follow_3
+ g = Grammar.new TEST_GRAMMAR_3
+
+ # Grammar 3 is not LL(1), because epsilon is in FIRST(S),
+ # but FIRST(S) and FOLLOW(S) are not disjoint.
+ f = nil
+ assert_nothing_raised { f = g.follow }
+ assert_equal(Set['z', END_OF_INPUT], f['E'])
+ assert_equal(Set['z', END_OF_INPUT], f['D'])
+ assert_equal(Set['z', 'p', 'u', END_OF_INPUT], f['F'])
+ assert_equal(Set['p', 'z', END_OF_INPUT], f['T'])
+ assert_equal(Set['p', 'z', END_OF_INPUT], f['S'])
+ for m in g.meta_symbols
+ first_m = g.first[m]
+ next unless first_m.include? EPSILON
+ assert_raise(m == 'S' ? LLError : NoError) do
+ if first_m.disjoint? f[m]
+ raise NoError # this is fun :D
+ else
+ raise LLError
+ end
+ end
+ end
+ end
+
+ TEST_GRAMMAR_3b = <<-EOG
+E - TD
+D - pTD
+D - PTD
+D -
+T - FS
+S - uFS
+S -
+F - aEz
+F - i
+P - p
+ EOG
+
+ def test_first_3b
+ g = Grammar.new TEST_GRAMMAR_3b
+
+ # Grammar 3b is NOT LL(1), since not all first-sets are disjoint.
+ f = nil
+ assert_nothing_raised { f = g.first }
+ assert_equal(Set['a', 'i'], f['E'])
+ assert_equal(Set[EPSILON, 'p'], f['D'])
+ assert_equal(Set['p'], f['P'])
+ assert_equal(Set['a', 'i'], f['F'])
+ assert_equal(Set['a', 'i'], f['T'])
+ assert_equal(Set[EPSILON, 'u'], f['S'])
+ for m in g.meta_symbols
+ r = g.rules[m]
+ firsts = r.map { |x| f[x] }
+ assert_raise(m == 'D' ? LLError : NoError) do
+ firsts.inject(Set.new) do |already_used, another_first_set|
+ raise LLError, 'not disjoint!' unless already_used.disjoint? another_first_set
+ already_used.merge another_first_set
+ end
+ raise NoError
+ end
+ end
+ end
+
+ def test_follow_3b
+ g = Grammar.new TEST_GRAMMAR_3b
+
+ # Although Grammar 3b is NOT LL(1), the FOLLOW-condition is satisfied.
+ f = nil
+ assert_nothing_raised { f = g.follow }
+ assert_equal(fifo('z$'), f['E'], 'E')
+ assert_equal(fifo('z$'), f['D'], 'D')
+ assert_equal(fifo('ai'), f['P'], 'P')
+ assert_equal(fifo('z$pu'), f['F'], 'F')
+ assert_equal(fifo('z$p'), f['T'], 'T')
+ assert_equal(fifo('z$p'), f['S'], 'S')
+ for m in g.meta_symbols
+ first_m = g.first[m]
+ next unless first_m.include? EPSILON
+ assert_raise(NoError) do
+ if first_m.disjoint? f[m]
+ raise NoError # this is fun :D
+ else
+ raise LLError
+ end
+ end
+ end
+ end
+
+ def test_ll1?
+ assert_equal false, Grammar.new(TEST_GRAMMAR_3).ll1?, 'Grammar 3'
+ assert_equal false, Grammar.new(TEST_GRAMMAR_3b).ll1?, 'Grammar 3b'
+ end
+
+ def test_new
+ assert_nothing_raised { Grammar.new '' }
+ assert_nothing_raised { Grammar.new TEST_GRAMMAR_1 }
+ assert_nothing_raised { Grammar.new TEST_GRAMMAR_2 }
+ assert_nothing_raised { Grammar.new TEST_GRAMMAR_3 }
+ assert_nothing_raised { Grammar.new TEST_GRAMMAR_1 + TEST_GRAMMAR_2 + TEST_GRAMMAR_3 }
+ assert_raise(ArgumentError) { Grammar.new 'S - ?' }
+ end
+end
+
+# vim:foldmethod=syntax
+
+#!/usr/bin/env ruby
+
+require 'fox12'
+
+include Fox
+
+class Window < FXMainWindow
+ def initialize(app)
+ super(app, app.appName + ": First Set Calculation", nil, nil, DECOR_ALL, 0, 0, 800, 600, 0, 0)
+
+ # {{{ menubar
+ menubar = FXMenuBar.new(self, LAYOUT_SIDE_TOP|LAYOUT_FILL_X)
+
+ filemenu = FXMenuPane.new(self)
+
+ FXMenuCommand.new(filemenu, "&Start\tCtl-S\tStart the application.", nil, getApp()).connect(SEL_COMMAND, method(:start))
+ FXMenuCommand.new(filemenu, "&Quit\tAlt-F4\tQuit the application.", nil, getApp(), FXApp::ID_QUIT)
+ FXMenuTitle.new(menubar, "&File", nil, filemenu)
+ # }}} menubar
+
+ # {{{ statusbar
+ @statusbar = FXStatusBar.new(self, LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|STATUSBAR_WITH_DRAGCORNER)
+ # }}} statusbar
+
+ # {{{ window content
+ horizontalsplitt = FXSplitter.new(self, SPLITTER_VERTICAL|LAYOUT_SIDE_TOP|LAYOUT_FILL)
+
+
+ @productions = FXList.new(horizontalsplitt, nil, 0, LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FIX_HEIGHT|LIST_SINGLESELECT)
+ @productions.height = 100
+
+ @result = FXTable.new(horizontalsplitt, nil, 0, LAYOUT_FILL)
+ @result.height = 200
+ @result.setTableSize(2, 2, false)
+ @result.rowHeaderWidth = 0
+
+ header = @result.columnHeader
+ header.setItemText 0, 'X'
+ header.setItemText 1, 'FIRST(X)'
+ for item in header
+ item.justification = FXHeaderItem::CENTER_X
+ end
+
+ @debug = FXText.new(horizontalsplitt, nil, 0, LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|LAYOUT_FIX_HEIGHT)
+ @debug.height = 200
+
+ # }}} window content
+ end
+
+ def load_grammar grammar
+ @tracer = FirstTracer.new(self)
+ @grammar = Grammar.new grammar, @tracer
+ @rules_indexes = Hash.new
+ @grammar.rules.each_with_index do |rule, i|
+ @productions.appendItem rule.inspect
+ @rules_indexes[rule] = i
+ end
+ end
+
+ def create
+ super
+ show(PLACEMENT_SCREEN)
+ end
+
+ def rule rule
+ @productions.selectItem @rules_indexes[rule]
+ sleep 0.1
+ end
+
+ def iterate i
+ setTitle i.to_s
+ sleep 0.1
+ end
+
+ def missing what
+ @debug.appendText what + "\n"
+ sleep 0.1
+ end
+
+ def start sender, sel, pointer
+ Thread.new do
+ begin
+ @grammar.first
+ rescue => boom
+ @debug.appendText [boom.to_s, *boom.backtrace].join("\n")
+ end
+ end
+ end
+
+end
+
+$: << 'grammar'
+require 'grammar'
+
+require 'first_tracer'
+
+app = FXApp.new("Shinobu", "cYcnus")
+
+# fenster erzeugen
+window = Window.new app
+
+unless ARGV.empty?
+ grammar = File.read(ARGV.first)
+else
+ grammar = <<-EOG1
+Z --> S
+S --> Sb
+S --> bAa
+A --> aSc
+A --> a
+A --> aSb
+ EOG1
+end
+
+window.load_grammar grammar
+
+app.create
+app.run
+
+require 'erb'
+require 'ftools'
+require 'yaml'
+require 'redcloth'
+
+module WhyTheLuckyStiff
+ class Book
+ attr_accessor :author, :title, :terms, :image, :teaser,
+ :chapters, :expansion_paks, :encoding, :credits
+ def [] x
+ @lang.fetch(x) do
+ warn warning = "[not translated: '#{x}'!]"
+ warning
+ end
+ end
+ end
+
+ def Book::load( file_name )
+ YAML::load( File.open( file_name ) )
+ end
+
+ class Section
+ attr_accessor :index, :header, :content
+ def initialize( i, h, c )
+ @index, @header, @content = i, h, RedCloth::new( c.to_s )
+ end
+ end
+
+ class Sidebar
+ attr_accessor :title, :content
+ end
+
+ YAML::add_domain_type( 'whytheluckystiff.net,2003', 'sidebar' ) do |taguri, val|
+ YAML::object_maker( Sidebar, 'title' => val.keys.first, 'content' => RedCloth::new( val.values.first ) )
+ end
+ class Chapter
+ attr_accessor :index, :title, :sections
+ def initialize( i, t, sects )
+ @index = i
+ @title = t
+ i = 0
+ @sections = sects.collect do |s|
+ if s.respond_to?( :keys )
+ i += 1
+ Section.new( i, s.keys.first, s.values.first )
+ else
+ s
+ end
+ end
+ end
+ end
+
+ YAML::add_domain_type( 'whytheluckystiff.net,2003', 'book' ) do |taguri, val|
+ ['chapters', 'expansion_paks'].each do |chaptype|
+ i = 0
+ val[chaptype].collect! do |c|
+ i += 1
+ Chapter::new( i, c.keys.first, c.values.first )
+ end
+ end
+ val['teaser'].collect! do |t|
+ Section::new( 1, t.keys.first, t.values.first )
+ end
+ val['terms'] = RedCloth::new( val['terms'] )
+ YAML::object_maker( Book, val )
+ end
+
+ class Image
+ attr_accessor :file_name
+ end
+
+ YAML::add_domain_type( 'whytheluckystiff.net,2003', 'img' ) do |taguri, val|
+ YAML::object_maker( Image, 'file_name' => "i/" + val )
+ end
+end
+
+#
+# Convert the book to HTML
+#
+if __FILE__ == $0
+ unless ARGV[0]
+ puts "Usage: #{$0} [/path/to/save/html]"
+ exit
+ end
+
+ site_path = ARGV[0]
+ book = WhyTheLuckyStiff::Book::load( 'poignant.yml' )
+ chapter = nil
+
+ # Write index page
+ index_tpl = ERB::new( File.open( 'index.erb' ).read )
+ File.open( File.join( site_path, 'index.html' ), 'w' ) do |out|
+ out << index_tpl.result
+ end
+
+ book.chapters = book.chapters[0,3] if ARGV.include? '-fast'
+
+ # Write chapter pages
+ chapter_tpl = ERB::new( File.open( 'chapter.erb' ).read )
+ book.chapters.each do |chapter|
+ File.open( File.join( site_path, "chapter-#{ chapter.index }.html" ), 'w' ) do |out|
+ out << chapter_tpl.result
+ end
+ end
+ exit if ARGV.include? '-fast'
+
+ # Write expansion pak pages
+ expak_tpl = ERB::new( File.open( 'expansion-pak.erb' ).read )
+ book.expansion_paks.each do |pak|
+ File.open( File.join( site_path, "expansion-pak-#{ pak.index }.html" ), 'w' ) do |out|
+ out << expak_tpl.result( binding )
+ end
+ end
+
+ # Write printable version
+ print_tpl = ERB::new( File.open( 'print.erb' ).read )
+ File.open( File.join( site_path, "print.html" ), 'w' ) do |out|
+ out << print_tpl.result
+ end
+
+ # Copy css + images into site
+ copy_list = ["guide.css"] +
+ Dir["i/*"].find_all { |image| image =~ /\.(gif|jpg|png)$/ }
+
+ File.makedirs( File.join( site_path, "i" ) )
+ copy_list.each do |copy_file|
+ File.copy( copy_file, File.join( site_path, copy_file ) )
+ end
+end
+
+#!/usr/bin/env ruby
+
+require 'fox'
+begin
+ require 'opengl'
+rescue LoadError
+ require 'fox/missingdep'
+ MSG = <<EOM
+ Sorry, this example depends on the OpenGL extension. Please
+ check the Ruby Application Archives for an appropriate
+ download site.
+EOM
+ missingDependency(MSG)
+end
+
+
+include Fox
+include Math
+
+Deg2Rad = Math::PI / 180
+
+D_MAX = 6
+SQUARE_SIZE = 2.0 / D_MAX
+SQUARE_DISTANCE = 4.0 / D_MAX
+AMPLITUDE = SQUARE_SIZE
+LAMBDA = D_MAX.to_f / 2
+
+class GLTestWindow < FXMainWindow
+
+ # How often our timer will fire (in milliseconds)
+ TIMER_INTERVAL = 500
+
+ # Rotate the boxes when a timer message is received
+ def onTimeout(sender, sel, ptr)
+ @angle += 10.0
+# @size = 0.5 + 0.2 * Math.cos(Deg2Rad * @angle)
+ drawScene()
+ @timer = getApp().addTimeout(TIMER_INTERVAL, method(:onTimeout))
+ end
+
+ # Rotate the boxes when a chore message is received
+ def onChore(sender, sel, ptr)
+ @angle += 10.0
+# @angle %= 360.0
+# @size = 0.5 + 0.2 * Math.cos(Deg2Rad * @angle)
+ drawScene()
+ @chore = getApp().addChore(method(:onChore))
+ end
+
+ # Draw the GL scene
+ def drawScene
+ lightPosition = [15.0, 10.0, 5.0, 1.0]
+ lightAmbient = [ 0.1, 0.1, 0.1, 1.0]
+ lightDiffuse = [ 0.9, 0.9, 0.9, 1.0]
+ redMaterial = [ 0.0, 0.0, 1.0, 1.0]
+ blueMaterial = [ 0.0, 1.0, 0.0, 1.0]
+
+ width = @glcanvas.width.to_f
+ height = @glcanvas.height.to_f
+ aspect = width/height
+
+ # Make context current
+ @glcanvas.makeCurrent()
+
+ GL.Viewport(0, 0, @glcanvas.width, @glcanvas.height)
+
+ GL.ClearColor(1.0/256, 0.0, 5.0/256, 1.0)
+ GL.Clear(GL::COLOR_BUFFER_BIT|GL::DEPTH_BUFFER_BIT)
+ GL.Enable(GL::DEPTH_TEST)
+
+ GL.Disable(GL::DITHER)
+
+ GL.MatrixMode(GL::PROJECTION)
+ GL.LoadIdentity()
+ GLU.Perspective(30.0, aspect, 1.0, 100.0)
+
+ GL.MatrixMode(GL::MODELVIEW)
+ GL.LoadIdentity()
+ GLU.LookAt(5.0, 10.0, 15.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)
+
+ GL.ShadeModel(GL::SMOOTH)
+ GL.Light(GL::LIGHT0, GL::POSITION, lightPosition)
+ GL.Light(GL::LIGHT0, GL::AMBIENT, lightAmbient)
+ GL.Light(GL::LIGHT0, GL::DIFFUSE, lightDiffuse)
+ GL.Enable(GL::LIGHT0)
+ GL.Enable(GL::LIGHTING)
+
+ GL.Rotated(0.1*@angle, 0.0, 1.0, 0.0)
+ for x in -D_MAX..D_MAX
+ for y in -D_MAX..D_MAX
+ h1 = (x + y - 2).abs
+ h2 = (y - x + 1).abs
+ GL.PushMatrix
+ c = [1, 0, 0, 1]
+ GL.Material(GL::FRONT, GL::AMBIENT, c)
+ GL.Material(GL::FRONT, GL::DIFFUSE, c)
+
+ GL.Translated(
+ y * SQUARE_DISTANCE,
+ AMPLITUDE * h1,
+ x * SQUARE_DISTANCE
+ )
+
+ GL.Begin(GL::TRIANGLE_STRIP)
+ GL.Normal(1.0, 0.0, 0.0)
+ GL.Vertex(-SQUARE_SIZE, +SQUARE_SIZE, -SQUARE_SIZE)
+ GL.Vertex(-SQUARE_SIZE, +SQUARE_SIZE, +SQUARE_SIZE)
+ GL.Vertex(+SQUARE_SIZE, +SQUARE_SIZE, -SQUARE_SIZE)
+ GL.Vertex(+SQUARE_SIZE, +SQUARE_SIZE, +SQUARE_SIZE)
+ GL.End
+
+ GL.PopMatrix
+
+ GL.PushMatrix
+ c = [0, 0, 1, 1]
+ GL.Material(GL::FRONT, GL::AMBIENT, c)
+ GL.Material(GL::FRONT, GL::DIFFUSE, c)
+
+ GL.Translated(
+ y * SQUARE_DISTANCE,
+ AMPLITUDE * h2,
+ x * SQUARE_DISTANCE
+ )
+
+ GL.Begin(GL::TRIANGLE_STRIP)
+ GL.Normal(1.0, 0.0, 0.0)
+ GL.Vertex(-SQUARE_SIZE, +SQUARE_SIZE, -SQUARE_SIZE)
+ GL.Vertex(-SQUARE_SIZE, +SQUARE_SIZE, +SQUARE_SIZE)
+ GL.Vertex(+SQUARE_SIZE, +SQUARE_SIZE, -SQUARE_SIZE)
+ GL.Vertex(+SQUARE_SIZE, +SQUARE_SIZE, +SQUARE_SIZE)
+ GL.End
+
+ GL.PopMatrix
+
+ GL.PushMatrix
+ c = [0.0 + (x/10.0), 0.0 + (y/10.0), 0, 1]
+ GL.Material(GL::FRONT, GL::AMBIENT, c)
+ GL.Material(GL::FRONT, GL::DIFFUSE, c)
+
+ GL.Translated(
+ y * SQUARE_DISTANCE,
+ 0,
+ x * SQUARE_DISTANCE
+ )
+
+ GL.Begin(GL::TRIANGLE_STRIP)
+ GL.Normal(1.0, 0.0, 0.0)
+ GL.Vertex(-SQUARE_SIZE, +SQUARE_SIZE, -SQUARE_SIZE)
+ GL.Vertex(-SQUARE_SIZE, +SQUARE_SIZE, +SQUARE_SIZE)
+ GL.Vertex(+SQUARE_SIZE, +SQUARE_SIZE, -SQUARE_SIZE)
+ GL.Vertex(+SQUARE_SIZE, +SQUARE_SIZE, +SQUARE_SIZE)
+ GL.End
+
+ GL.PopMatrix
+ end
+ end
+
+ # Swap if it is double-buffered
+ if @glvisual.isDoubleBuffer
+ @glcanvas.swapBuffers
+ end
+
+ # Make context non-current
+ @glcanvas.makeNonCurrent
+ end
+
+ def initialize(app)
+ # Invoke the base class initializer
+ super(app, "OpenGL Test Application", nil, nil, DECOR_ALL, 0, 0, 1024, 768)
+
+ # Construct the main window elements
+ frame = FXHorizontalFrame.new(self, LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y)
+ frame.padLeft, frame.padRight = 0, 0
+ frame.padTop, frame.padBottom = 0, 0
+
+ # Left pane to contain the glcanvas
+ glcanvasFrame = FXVerticalFrame.new(frame,
+ LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_TOP|LAYOUT_LEFT)
+ glcanvasFrame.padLeft, glcanvasFrame.padRight = 10, 10
+ glcanvasFrame.padTop, glcanvasFrame.padBottom = 10, 10
+
+ # Label above the glcanvas
+ FXLabel.new(glcanvasFrame, "OpenGL Canvas Frame", nil,
+ JUSTIFY_CENTER_X|LAYOUT_FILL_X)
+
+ # Horizontal divider line
+ FXHorizontalSeparator.new(glcanvasFrame, SEPARATOR_GROOVE|LAYOUT_FILL_X)
+
+ # Drawing glcanvas
+ glpanel = FXVerticalFrame.new(glcanvasFrame, (FRAME_SUNKEN|FRAME_THICK|
+ LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_TOP|LAYOUT_LEFT))
+ glpanel.padLeft, glpanel.padRight = 0, 0
+ glpanel.padTop, glpanel.padBottom = 0, 0
+
+ # A visual to draw OpenGL
+ @glvisual = FXGLVisual.new(getApp(), VISUAL_DOUBLEBUFFER)
+
+ # Drawing glcanvas
+ @glcanvas = FXGLCanvas.new(glpanel, @glvisual, nil, 0,
+ LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_TOP|LAYOUT_LEFT)
+ @glcanvas.connect(SEL_PAINT) {
+ drawScene
+ }
+ @glcanvas.connect(SEL_CONFIGURE) {
+ if @glcanvas.makeCurrent
+ GL.Viewport(0, 0, @glcanvas.width, @glcanvas.height)
+ @glcanvas.makeNonCurrent
+ end
+ }
+
+ # Right pane for the buttons
+ buttonFrame = FXVerticalFrame.new(frame, LAYOUT_FILL_Y|LAYOUT_TOP|LAYOUT_LEFT)
+ buttonFrame.padLeft, buttonFrame.padRight = 10, 10
+ buttonFrame.padTop, buttonFrame.padBottom = 10, 10
+
+ # Label above the buttons
+ FXLabel.new(buttonFrame, "Button Frame", nil,
+ JUSTIFY_CENTER_X|LAYOUT_FILL_X)
+
+ # Horizontal divider line
+ FXHorizontalSeparator.new(buttonFrame, SEPARATOR_RIDGE|LAYOUT_FILL_X)
+
+ # Spin according to timer
+ spinTimerBtn = FXButton.new(buttonFrame,
+ "Spin &Timer\tSpin using interval timers\nNote the app
+ blocks until the interal has elapsed...", nil,
+ nil, 0, FRAME_THICK|FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT)
+ spinTimerBtn.padLeft, spinTimerBtn.padRight = 10, 10
+ spinTimerBtn.padTop, spinTimerBtn.padBottom = 5, 5
+ spinTimerBtn.connect(SEL_COMMAND) {
+ @spinning = true
+ @timer = getApp().addTimeout(TIMER_INTERVAL, method(:onTimeout))
+ }
+ spinTimerBtn.connect(SEL_UPDATE) { |sender, sel, ptr|
+ @spinning ? sender.disable : sender.enable
+ }
+
+ # Spin according to chore
+ spinChoreBtn = FXButton.new(buttonFrame,
+ "Spin &Chore\tSpin as fast as possible using chores\nNote even though the
+ app is very responsive, it never blocks;\nthere is always something to
+ do...", nil,
+ nil, 0, FRAME_THICK|FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT)
+ spinChoreBtn.padLeft, spinChoreBtn.padRight = 10, 10
+ spinChoreBtn.padTop, spinChoreBtn.padBottom = 5, 5
+ spinChoreBtn.connect(SEL_COMMAND) {
+ @spinning = true
+ @chore = getApp().addChore(method(:onChore))
+ }
+ spinChoreBtn.connect(SEL_UPDATE) { |sender, sel, ptr|
+ @spinning ? sender.disable : sender.enable
+ }
+
+ # Stop spinning
+ stopBtn = FXButton.new(buttonFrame,
+ "&Stop Spin\tStop this mad spinning, I'm getting dizzy", nil,
+ nil, 0, FRAME_THICK|FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT)
+ stopBtn.padLeft, stopBtn.padRight = 10, 10
+ stopBtn.padTop, stopBtn.padBottom = 5, 5
+ stopBtn.connect(SEL_COMMAND) {
+ @spinning = false
+ if @timer
+ getApp().removeTimeout(@timer)
+ @timer = nil
+ end
+ if @chore
+ getApp().removeChore(@chore)
+ @chore = nil
+ end
+ }
+ stopBtn.connect(SEL_UPDATE) { |sender, sel, ptr|
+ @spinning ? sender.enable : sender.disable
+ }
+
+ # Exit button
+ exitBtn = FXButton.new(buttonFrame, "&Exit\tExit the application", nil,
+ getApp(), FXApp::ID_QUIT,
+ FRAME_THICK|FRAME_RAISED|LAYOUT_FILL_X|LAYOUT_TOP|LAYOUT_LEFT)
+ exitBtn.padLeft, exitBtn.padRight = 10, 10
+ exitBtn.padTop, exitBtn.padBottom = 5, 5
+
+ # Make a tooltip
+ FXTooltip.new(getApp())
+
+ # Initialize private variables
+ @spinning = false
+ @chore = nil
+ @timer = nil
+ @angle = 0.0
+ @size = 0.5
+ end
+
+ # Create and initialize
+ def create
+ super
+ show(PLACEMENT_SCREEN)
+ end
+end
+
+if __FILE__ == $0
+ # Construct the application
+ application = FXApp.new("GLTest", "FoxTest")
+
+ # To ensure that the chores-based spin will run as fast as possible,
+ # we can disable the chore in FXRuby's event loop that tries to schedule
+ # other threads. This is OK for this program because there aren't any
+ # other Ruby threads running.
+
+ #application.disableThreads
+
+ # Construct the main window
+ GLTestWindow.new(application)
+
+ # Create the app's windows
+ application.create
+
+ # Run the application
+ application.run
+end
+
+class Facelet
+ attr_accessor :color
+ def initialize(color)
+ @color = color
+ end
+
+ def to_s
+ @color
+ end
+end
+
+class Edge
+ attr_accessor :facelets, :colors
+
+ def initialize(facelets)
+ @facelets = facelets
+ @colors = @facelets.map { |fl| fl.color }
+ end
+
+ def apply(edge)
+ @facelets.each_with_index { |fl, i|
+ fl.color = edge.colors[i]
+ }
+ end
+
+ def inspect
+ "\n%s %s\n%s %s %s" % facelets
+ end
+end
+
+class Side
+ attr_reader :num, :facelets
+ attr_accessor :sides
+
+ def initialize(num)
+ @num = num
+ @sides = []
+ @facelets = []
+ @fl_by_side = {}
+ end
+
+ # facelets & sides
+ # 0
+ # 0 1 2
+ # 3 3 4 5 1
+ # 6 7 8
+ # 2
+
+ def facelets=(facelets)
+ @facelets = facelets.map { |c| Facelet.new(c) }
+ init_facelet 0, 3,0
+ init_facelet 1, 0
+ init_facelet 2, 0,1
+ init_facelet 3, 3
+ init_facelet 5, 1
+ init_facelet 6, 2,3
+ init_facelet 7, 2
+ init_facelet 8, 1,2
+ end
+
+ def <=>(side)
+ self.num <=> side.num
+ end
+
+ def init_facelet(pos, *side_nums)
+ sides = side_nums.map { |num| @sides[num] }.sort
+ @fl_by_side[sides] = pos
+ end
+
+ def []=(color, *sides)
+ @facelets[@fl_by_side[sides.sort]].color = color
+ end
+
+ def values_at(*sides)
+ sides.map { |sides| @facelets[@fl_by_side[sides.sort]] }
+ end
+
+ def inspect(range=nil)
+ if range
+ @facelets.values_at(*(range.to_a)).join(' ')
+ else
+ <<-EOS.gsub(/\d/) { |num| @facelets[num.to_i] }.gsub(/[ABCD]/) { |side| @sides[side[0]-?A].num.to_s }
+ A
+ 0 1 2
+ D 3 4 5 B
+ 6 7 8
+ C
+ EOS
+ end
+ end
+
+ def get_edge(side)
+ trio = (-1..1).map { |x| (side + x) % 4 }
+ prev_side, this_side, next_side = @sides.values_at(*trio)
+ e = Edge.new(
+ self .values_at( [this_side], [this_side, next_side] ) +
+ this_side.values_at( [self, prev_side], [self ], [self, next_side] )
+ )
+ #puts 'Edge created for side %d: ' % side + e.inspect
+ e
+ end
+
+ def turn(dir)
+ #p 'turn side %d in %d' % [num, dir]
+ edges = (0..3).map { |n| get_edge n }
+ for i in 0..3
+ edges[i].apply edges[(i-dir) % 4]
+ end
+ end
+end
+
+class Cube
+ def initialize
+ @sides = []
+ %w(left front right back top bottom).each_with_index { |side, i|
+ eval("@sides[#{i}] = @#{side} = Side.new(#{i})")
+ }
+ @left.sides = [@top, @front, @bottom, @back]
+ @front.sides = [@top, @right, @bottom, @left]
+ @right.sides = [@top, @back, @bottom, @front]
+ @back.sides = [@top, @left, @bottom, @right]
+ @top.sides = [@back, @right, @front, @left]
+ @bottom.sides = [@front, @right, @back, @left]
+ end
+
+ def read_facelets(fs)
+ pattern = Regexp.new(<<-EOP.gsub(/\w/, '\w').gsub(/\s+/, '\s*'))
+ (w w w)
+ (w w w)
+ (w w w)
+(r r r) (g g g) (b b b) (o o o)
+(r r r) (g g g) (b b b) (o o o)
+(r r r) (g g g) (b b b) (o o o)
+ (y y y)
+ (y y y)
+ (y y y)
+ EOP
+ md = pattern.match(fs).to_a
+
+ @top.facelets = parse_facelets(md.values_at(1,2,3))
+ @left.facelets = parse_facelets(md.values_at(4,8,12))
+ @front.facelets = parse_facelets(md.values_at(5,9,13))
+ @right.facelets = parse_facelets(md.values_at(6,10,14))
+ @back.facelets = parse_facelets(md.values_at(7,11,15))
+ @bottom.facelets = parse_facelets(md.values_at(16,17,18))
+ end
+
+ def turn(side, dir)
+ #p 'turn %d in %d' % [side, dir]
+ @sides[side].turn(dir)
+ #puts inspect
+ end
+
+ def inspect
+ <<-EOF.gsub(/(\d):(\d)-(\d)/) { @sides[$1.to_i].inspect(Range.new($2.to_i, $3.to_i)) }
+ 4:0-2
+ 4:3-5
+ 4:6-8
+0:0-2 1:0-2 2:0-2 3:0-2
+0:3-5 1:3-5 2:3-5 3:3-5
+0:6-8 1:6-8 2:6-8 3:6-8
+ 5:0-2
+ 5:3-5
+ 5:6-8
+ EOF
+ end
+
+private
+ def parse_facelets(rows)
+ rows.join.delete(' ').split(//)
+ end
+end
+
+#$stdin = DATA
+
+gets.to_i.times do |i|
+ puts "Scenario ##{i+1}:"
+ fs = ''
+ 9.times { fs << gets }
+ cube = Cube.new
+ cube.read_facelets fs
+ gets.to_i.times do |t|
+ side, dir = gets.split.map {|s| s.to_i}
+ cube.turn(side, dir)
+ end
+ puts cube.inspect
+ puts
+end
+
+# 2004 by murphy <korny@cYcnus.de>
+# GPL
+class Scenario
+ class TimePoint
+ attr_reader :data
+ def initialize *data
+ @data = data
+ end
+
+ def [] i
+ @data[i] or 0
+ end
+
+ include Comparable
+ def <=> tp
+ r = 0
+ [@data.size, tp.data.size].max.times do |i|
+ r = self[i] <=> tp[i]
+ return r if r.nonzero?
+ end
+ 0
+ end
+
+ def - tp
+ r = []
+ [@data.size, tp.data.size].max.times do |i|
+ r << self[i] - tp[i]
+ end
+ r
+ end
+
+ def inspect
+ # 01/01/1800 00:00:00
+ '%02d/%02d/%04d %02d:%02d:%02d' % @data.values_at(1, 2, 0, 3, 4, 5)
+ end
+ end
+
+ ONE_HOUR = TimePoint.new 0, 0, 0, 1, 0, 0
+
+ APPOINTMENT_PATTERN = /
+ ( \d{4} ) \s ( \d{2} ) \s ( \d{2} ) \s ( \d{2} ) \s ( \d{2} ) \s ( \d{2} ) \s
+ ( \d{4} ) \s ( \d{2} ) \s ( \d{2} ) \s ( \d{2} ) \s ( \d{2} ) \s ( \d{2} )
+ /x
+
+ def initialize io
+ @team_size = io.gets.to_i
+ @data = [ [TimePoint.new(1800, 01, 01, 00, 00, 00), @team_size] ]
+ @team_size.times do # each team member
+ io.gets.to_i.times do # each appointment
+ m = APPOINTMENT_PATTERN.match io.gets
+ @data << [TimePoint.new(*m.captures[0,6].map { |x| x.to_i }), -1]
+ @data << [TimePoint.new(*m.captures[6,6].map { |x| x.to_i }), +1]
+ end
+ end
+ @data << [TimePoint.new(2200, 01, 01, 00, 00, 00), -@team_size]
+ end
+
+ def print_time_plan
+ n = 0
+ appointment = nil
+ no_appointment = true
+ @data.sort_by { |x| x[0] }.each do |x|
+ tp, action = *x
+ n += action
+ # at any time during the meeting, at least two team members need to be there
+ # and at most one team member is allowed to be absent
+ if n >= 2 and (@team_size - n) <= 1
+ appointment ||= tp
+ else
+ if appointment
+ # the meeting should be at least one hour in length
+ if TimePoint.new(*(tp - appointment)) >= ONE_HOUR
+ puts 'appointment possible from %p to %p' % [appointment, tp]
+ no_appointment = false
+ end
+ appointment = false
+ end
+ end
+ end
+ puts 'no appointment possible' if no_appointment
+ end
+end
+
+# read the data
+DATA.gets.to_i.times do |si| # each scenario
+ puts 'Scenario #%d:' % (si + 1)
+ sc = Scenario.new DATA
+ sc.print_time_plan
+ puts
+end
+
+#__END__
+2
+3
+3
+2002 06 28 15 00 00 2002 06 28 18 00 00 TUD Contest Practice Session
+2002 06 29 10 00 00 2002 06 29 15 00 00 TUD Contest
+2002 11 15 15 00 00 2002 11 17 23 00 00 NWERC Delft
+4
+2002 06 25 13 30 00 2002 06 25 15 30 00 FIFA World Cup Semifinal I
+2002 06 26 13 30 00 2002 06 26 15 30 00 FIFA World Cup Semifinal II
+2002 06 29 13 00 00 2002 06 29 15 00 00 FIFA World Cup Third Place
+2002 06 30 13 00 00 2002 06 30 15 00 00 FIFA World Cup Final
+1
+2002 06 01 00 00 00 2002 06 29 18 00 00 Preparation of Problem Set
+2
+1
+1800 01 01 00 00 00 2200 01 01 00 00 00 Solving Problem 8
+0
+
+require 'token_consts'
+require 'symbol'
+require 'ctype'
+require 'error'
+
+class Fixnum
+ # Treat char as a digit and return it's value as Fixnum.
+ # Returns nonsense for non-digits.
+ # Examples:
+ # <code>
+ # RUBY_VERSION[0].digit == '1.8.2'[0].digit == 1
+ # </code>
+ #
+ # <code>
+ # ?6.digit == 6
+ # </code>
+ #
+ # <code>
+ # ?A.digit == 17
+ # </code>
+ def digit
+ self - ?0
+ end
+end
+
+##
+# Stellt einen einfachen Scanner für die lexikalische Analyse der Sprache Pas-0 dar.
+#
+# @author Andreas Kunert
+# Ruby port by murphy
+class Scanner
+
+ include TokenConsts
+
+ attr_reader :line, :pos
+
+ # To allow Scanner.new without parameters.
+ DUMMY_INPUT = 'dummy file'
+ def DUMMY_INPUT.getc
+ nil
+ end
+
+ ##
+ # Erzeugt einen Scanner, der als Eingabe das übergebene IO benutzt.
+ def initialize input = DUMMY_INPUT
+ @line = 1
+ @pos = 0
+
+ begin
+ @input = input
+ @next_char = @input.getc
+ rescue IOError # TODO show the reason!
+ Error.ioError
+ raise
+ end
+ end
+
+ ##
+ # Liest das n + def read_next_char
+ begin
+ @pos += 1
+ @current_char = @next_char
+ @next_char = @input.getc
+ rescue IOError
+ Error.ioError
+ raise
+ end
+ end
+
+ ##
+ # Sucht das nächste Symbol, identifiziert es, instantiiert ein entsprechendes
+ # PascalSymbol-Objekt und gibt es zurück.
+ # @see Symbol
+ # @return das gefundene Symbol als PascalSymbol-Objekt
+ def get_symbol
+ current_symbol = nil
+ until current_symbol
+ read_next_char
+
+ if @current_char.alpha?
+ identifier = @current_char.chr
+ while @next_char.alpha? or @next_char.digit?
+ identifier << @next_char
+ read_next_char
+ end
+ current_symbol = handle_identifier(identifier.upcase)
+ elsif @current_char.digit?
+ current_symbol = number
+ else
+ case @current_char
+ when ?\s
+ # ignore
+ when ?\n
+ new_line
+ when nil
+ current_symbol = PascalSymbol.new EOP
+ when ?{
+ comment
+
+ when ?:
+ if @next_char == ?=
+ read_next_char
+ current_symbol = PascalSymbol.new BECOMES
+ else
+ current_symbol = PascalSymbol.new COLON
+ end
+
+ when ?<
+ if (@next_char == ?=)
+ read_next_char
+ current_symbol = PascalSymbol.new LEQSY
+ elsif (@next_char == ?>)
+ read_next_char
+ current_symbol = PascalSymbol.new NEQSY
+ else
+ current_symbol = PascalSymbol.new LSSSY
+ end
+
+ when ?>
+ if (@next_char == ?=)
+ read_next_char
+ current_symbol = PascalSymbol.new GEQSY
+ else
+ current_symbol = PascalSymbol.new GRTSY
+ end
+
+ when ?. then current_symbol = PascalSymbol.new PERIOD
+ when ?( then current_symbol = PascalSymbol.new LPARENT
+ when ?, then current_symbol = PascalSymbol.new COMMA
+ when ?* then current_symbol = PascalSymbol.new TIMES
+ when ?/ then current_symbol = PascalSymbol.new SLASH
+ when ?+ then current_symbol = PascalSymbol.new PLUS
+ when ?- then current_symbol = PascalSymbol.new MINUS
+ when ?= then current_symbol = PascalSymbol.new EQLSY
+ when ?) then current_symbol = PascalSymbol.new RPARENT
+ when ?; then current_symbol = PascalSymbol.new SEMICOLON
+ else
+ Error.error(100, @line, @pos) if @current_char > ?\s
+ end
+ end
+ end
+ current_symbol
+ end
+
+private
+ ##
+ # Versucht, in dem gegebenen String ein Schlüsselwort zu erkennen.
+ # Sollte dabei ein Keyword gefunden werden, so gibt er ein PascalSymbol-Objekt zurück, das
+ # das entsprechende Keyword repräsentiert. Ansonsten besteht die Rückgabe aus
+ # einem SymbolIdent-Objekt (abgeleitet von PascalSymbol), das den String 1:1 enthält
+ # @see symbol
+ # @return falls Keyword gefunden, zugehöriges PascalSymbol, sonst SymbolIdent
+ def handle_identifier identifier
+ if sym = KEYWORD_SYMBOLS[identifier]
+ PascalSymbol.new sym
+ else
+ SymbolIdent.new identifier
+ end
+ end
+
+ MAXINT = 2**31 - 1
+ MAXINT_DIV_10 = MAXINT / 10
+ MAXINT_MOD_10 = MAXINT % 10
+ ##
+ # Versucht, aus dem gegebenen Zeichen und den folgenden eine Zahl zusammenzusetzen.
+ # Dabei wird der relativ intuitive Algorithmus benutzt, die endgültige Zahl bei
+ # jeder weiteren Ziffer mit 10 zu multiplizieren und diese dann mit der Ziffer zu
+ # addieren. Sonderfälle bestehen dann nur noch in der Behandlung von reellen Zahlen.
+ # <BR>
+ # Treten dabei kein Punkt oder ein E auf, so gibt diese Methode ein SymbolIntCon-Objekt
+ # zurück, ansonsten (reelle Zahl) ein SymbolRealCon-Objekt. Beide Symbole enthalten
+ # jeweils die Zahlwerte.
+ # <BR>
+ # Anmerkung: Diese Funktion ist mit Hilfe der Java/Ruby-API deutlich leichter zu realisieren.
+ # Sie wurde dennoch so implementiert, um den Algorithmus zu demonstrieren
+ # @see symbol
+ # @return SymbolIntcon- oder SymbolRealcon-Objekt, das den Zahlwert enthält
+ def number
+ is_integer = true
+ integer_too_long = false
+ exponent = 0
+ exp_counter = -1
+ exp_sign = 1
+
+ integer_mantisse = @current_char.digit
+
+ while (@next_char.digit? and integer_mantisse < MAXINT_DIV_10) or
+ (integer_mantisse == MAXINT_DIV_10 and @next_char.digit <= MAXINT_MOD_10)
+ integer_mantisse *= 10
+ integer_mantisse += @next_char.digit
+ read_next_char
+ end
+
+ real_mantisse = integer_mantisse
+
+ while @next_char.digit?
+ integer_too_long = true
+ real_mantisse *= 10
+ real_mantisse += @next_char.digit
+ read_next_char
+ end
+ if @next_char == ?.
+ read_next_char
+ is_integer = false
+ unless @next_char.digit?
+ Error.error 101, @line, @pos
+ end
+ while @next_char.digit?
+ real_mantisse += @next_char.digit * (10 ** exp_counter)
+ read_next_char
+ exp_counter -= 1
+ end
+ end
+ if @next_char == ?E
+ is_integer = false
+ read_next_char
+ if @next_char == ?-
+ exp_sign = -1
+ read_next_char
+ end
+ unless @next_char.digit?
+ Error.error 101, @line, @pos
+ end
+ while @next_char.digit?
+ exponent *= 10
+ exponent += @next_char.digit
+ read_next_char
+ end
+ end
+
+ if is_integer
+ if integer_too_long
+ Error.error 102, @line, @pos
+ end
+ SymbolIntcon.new integer_mantisse
+ else
+ SymbolRealcon.new real_mantisse * (10 ** (exp_sign * exponent))
+ end
+ end
+
+ ##
+ # Sorgt für ein Überlesen von Kommentaren.
+ # Es werden einfach alle Zeichen bis zu einer schließenden Klammer eingelesen
+ # und verworfen.
+ def comment
+ while @current_char != ?}
+ forbid_eop
+ new_line if @current_char == ?\n
+ read_next_char
+ end
+ end
+
+ def new_line
+ @line += 1
+ @pos = 0
+ end
+
+ def forbid_eop
+ if eop?
+ Error.error 103, @line, @pos
+ end
+ exit
+ end
+
+ def eop?
+ @current_char.nil?
+ end
+end
+
+##
+# Läßt ein Testprogramm ablaufen.
+# Dieses erzeugt sich ein Scanner-Objekt und ruft an diesem kontinuierlich bis zum Dateiende
+# get_symbol auf.
+if $0 == __FILE__
+ scan = Scanner.new(File.new(ARGV[0] || 'test.pas'))
+ loop do
+ c = scan.get_symbol
+ puts c
+ break if c.typ == TokenConsts::EOP
+ end
+end
+
diff --git a/test/scanners/ruby/example.out.raydebug b/test/scanners/ruby/example.out.raydebug new file mode 100644 index 0000000..be68a13 --- /dev/null +++ b/test/scanners/ruby/example.out.raydebug @@ -0,0 +1,3789 @@ +reserved(module) class(CodeRay) + reserved(module) class(Scanners) + +reserved(class) class(Ruby) operator(<) constant(Scanner) + + constant(RESERVED_WORDS) operator(=) operator([) + string<delimiter(')content(and)delimiter(')>operator(,) string<delimiter(')content(def)delimiter(')>operator(,) string<delimiter(')content(end)delimiter(')>operator(,) string<delimiter(')content(in)delimiter(')>operator(,) string<delimiter(')content(or)delimiter(')>operator(,) string<delimiter(')content(unless)delimiter(')>operator(,) string<delimiter(')content(begin)delimiter(')>operator(,) + string<delimiter(')content(defined?)delimiter(')>operator(,) string<delimiter(')content(ensure)delimiter(')>operator(,) string<delimiter(')content(module)delimiter(')>operator(,) string<delimiter(')content(redo)delimiter(')>operator(,) string<delimiter(')content(super)delimiter(')>operator(,) string<delimiter(')content(until)delimiter(')>operator(,) + string<delimiter(')content(BEGIN)delimiter(')>operator(,) string<delimiter(')content(break)delimiter(')>operator(,) string<delimiter(')content(do)delimiter(')>operator(,) string<delimiter(')content(next)delimiter(')>operator(,) string<delimiter(')content(rescue)delimiter(')>operator(,) string<delimiter(')content(then)delimiter(')>operator(,) + string<delimiter(')content(when)delimiter(')>operator(,) string<delimiter(')content(END)delimiter(')>operator(,) string<delimiter(')content(case)delimiter(')>operator(,) string<delimiter(')content(else)delimiter(')>operator(,) string<delimiter(')content(for)delimiter(')>operator(,) string<delimiter(')content(retry)delimiter(')>operator(,) + string<delimiter(')content(while)delimiter(')>operator(,) string<delimiter(')content(alias)delimiter(')>operator(,) string<delimiter(')content(class)delimiter(')>operator(,) string<delimiter(')content(elsif)delimiter(')>operator(,) string<delimiter(')content(if)delimiter(')>operator(,) string<delimiter(')content(not)delimiter(')>operator(,) string<delimiter(')content(return)delimiter(')>operator(,) + string<delimiter(')content(undef)delimiter(')>operator(,) string<delimiter(')content(yield)delimiter(')>operator(,) + operator(]) + + constant(DEF_KEYWORDS) operator(=) operator([)string<delimiter(')content(def)delimiter(')>operator(]) + constant(MODULE_KEYWORDS) operator(=) operator([)string<delimiter(')content(class)delimiter(')>operator(,) string<delimiter(')content(module)delimiter(')>operator(]) + constant(DEF_NEW_STATE) operator(=) constant(WordList)operator(.)ident(new)operator(()symbol(:initial)operator(\))operator(.) + ident(add)operator(()constant(DEF_KEYWORDS)operator(,) symbol(:def_expected)operator(\))operator(.) + ident(add)operator(()constant(MODULE_KEYWORDS)operator(,) symbol(:module_expected)operator(\)) + + constant(WORDS_ALLOWING_REGEXP) operator(=) operator([) + string<delimiter(')content(and)delimiter(')>operator(,) string<delimiter(')content(or)delimiter(')>operator(,) string<delimiter(')content(not)delimiter(')>operator(,) string<delimiter(')content(while)delimiter(')>operator(,) string<delimiter(')content(until)delimiter(')>operator(,) string<delimiter(')content(unless)delimiter(')>operator(,) string<delimiter(')content(if)delimiter(')>operator(,) string<delimiter(')content(elsif)delimiter(')>operator(,) string<delimiter(')content(when)delimiter(')> + operator(]) + constant(REGEXP_ALLOWED) operator(=) constant(WordList)operator(.)ident(new)operator(()pre_constant(false)operator(\))operator(.) + ident(add)operator(()constant(WORDS_ALLOWING_REGEXP)operator(,) symbol(:set)operator(\)) + + constant(PREDEFINED_CONSTANTS) operator(=) operator([) + string<delimiter(')content(nil)delimiter(')>operator(,) string<delimiter(')content(true)delimiter(')>operator(,) string<delimiter(')content(false)delimiter(')>operator(,) string<delimiter(')content(self)delimiter(')>operator(,) + string<delimiter(')content(DATA)delimiter(')>operator(,) string<delimiter(')content(ARGV)delimiter(')>operator(,) string<delimiter(')content(ARGF)delimiter(')>operator(,) string<delimiter(')content(__FILE__)delimiter(')>operator(,) string<delimiter(')content(__LINE__)delimiter(')>operator(,) + operator(]) + + constant(IDENT_KIND) operator(=) constant(WordList)operator(.)ident(new)operator(()symbol(:ident)operator(\))operator(.) + ident(add)operator(()constant(RESERVED_WORDS)operator(,) symbol(:reserved)operator(\))operator(.) + ident(add)operator(()constant(PREDEFINED_CONSTANTS)operator(,) symbol(:pre_constant)operator(\)) + + constant(METHOD_NAME) operator(=) regexp<delimiter(/)content( )inline<delimiter(#{)constant(IDENT)delimiter(})>content( [?!]? )delimiter(/)modifier(xo)> + constant(METHOD_NAME_EX) operator(=) regexp<delimiter(/)content( + )inline<delimiter(#{)constant(METHOD_NAME)delimiter(})>content( # common methods: split, foo=, empty?, gsub! + | )char(\\*)char(\\*)content(? # multiplication and power + | [-+~]@? # plus, minus + | [)char(\\/)content(%&|^`] # division, modulo or format strings, &and, |or, ^xor, `system` + | )char(\\[)char(\\])content(=? # array getter and setter + | <=?>? | >=? # comparison, rocket operator + | << | >> # append or shift left, shift right + | ===? # simple equality and case equality + )delimiter(/)modifier(ox)> + constant(GLOBAL_VARIABLE) operator(=) regexp<delimiter(/)content( )char(\\$)content( (?: )inline<delimiter(#{)constant(IDENT)delimiter(})>content( | )char(\\d)content(+ | [~&+`'=)char(\\/)content(,;_.<>!@0$?*":F)char(\\\\)content(] | -[a-zA-Z_0-9] \) )delimiter(/)modifier(ox)> + + constant(DOUBLEQ) operator(=) regexp<delimiter(/)content( " [^")char(\\#)char(\\\\)content(]* (?: (?: )char(\\#)char(\\{)content(.*?)char(\\})content( | )char(\\#)content((?:$"\)? | )char(\\\\)content(. \) [^")char(\\#)char(\\\\)content(]* \)* "? )delimiter(/)modifier(ox)> + constant(SINGLEQ) operator(=) regexp<delimiter(/)content( ' [^')char(\\\\)content(]* (?: )char(\\\\)content(. [^')char(\\\\)content(]* \)* '? )delimiter(/)modifier(ox)> + constant(STRING) operator(=) regexp<delimiter(/)content( )inline<delimiter(#{)constant(SINGLEQ)delimiter(})>content( | )inline<delimiter(#{)constant(DOUBLEQ)delimiter(})>content( )delimiter(/)modifier(ox)> + constant(SHELL) operator(=) regexp<delimiter(/)content( ` [^`)char(\\#)char(\\\\)content(]* (?: (?: )char(\\#)char(\\{)content(.*?)char(\\})content( | )char(\\#)content((?:$`\)? | )char(\\\\)content(. \) [^`)char(\\#)char(\\\\)content(]* \)* `? )delimiter(/)modifier(ox)> + constant(REGEXP) operator(=) regexp<delimiter(/)content( )char(\\/)content( [^)char(\\/)char(\\#)char(\\\\)content(]* (?: (?: )char(\\#)char(\\{)content(.*?)char(\\})content( | )char(\\#)content((?:$)char(\\/)content(\)? | )char(\\\\)content(. \) [^)char(\\/)char(\\#)char(\\\\)content(]* \)* )char(\\/)content(? )delimiter(/)modifier(ox)> + + constant(DECIMAL) operator(=) regexp<delimiter(/)char(\\d)content(+(?:_)char(\\d)content(+\)*)delimiter(/)> comment(# doesn't recognize 09 as octal error) + constant(OCTAL) operator(=) regexp<delimiter(/)content(0_?[0-7]+(?:_[0-7]+\)*)delimiter(/)> + constant(HEXADECIMAL) operator(=) regexp<delimiter(/)content(0x[0-9A-Fa-f]+(?:_[0-9A-Fa-f]+\)*)delimiter(/)> + constant(BINARY) operator(=) regexp<delimiter(/)content(0b[01]+(?:_[01]+\)*)delimiter(/)> + + constant(EXPONENT) operator(=) regexp<delimiter(/)content( [eE] [+-]? )inline<delimiter(#{)constant(DECIMAL)delimiter(})>content( )delimiter(/)modifier(ox)> + constant(FLOAT) operator(=) regexp<delimiter(/)content( )inline<delimiter(#{)constant(DECIMAL)delimiter(})>content( (?: )inline<delimiter(#{)constant(EXPONENT)delimiter(})>content( | )char(\\.)content( )inline<delimiter(#{)constant(DECIMAL)delimiter(})>content( )inline<delimiter(#{)constant(EXPONENT)delimiter(})>content(? \) )delimiter(/)> + constant(INTEGER) operator(=) regexp<delimiter(/)inline<delimiter(#{)constant(OCTAL)delimiter(})>content(|)inline<delimiter(#{)constant(HEXADECIMAL)delimiter(})>content(|)inline<delimiter(#{)constant(BINARY)delimiter(})>content(|)inline<delimiter(#{)constant(DECIMAL)delimiter(})>delimiter(/)> + + reserved(def) method(reset) + reserved(super) + instance_variable(@regexp_allowed) operator(=) pre_constant(false) + reserved(end) + + reserved(def) method(next_token) + reserved(return) reserved(if) instance_variable(@scanner)operator(.)ident(eos?) + + ident(kind) operator(=) symbol(:error) + reserved(if) instance_variable(@scanner)operator(.)ident(scan)operator(()regexp<delimiter(/)char(\\s)content(+)delimiter(/)>operator(\)) comment(# in every state) + ident(kind) operator(=) symbol(:space) + instance_variable(@regexp_allowed) operator(=) symbol(:set) reserved(if) instance_variable(@regexp_allowed) reserved(or) instance_variable(@scanner)operator(.)ident(matched)operator(.)ident(index)operator(()integer(?\\n)operator(\)) comment(# delayed flag setting) + + reserved(elsif) instance_variable(@state) operator(==) symbol(:def_expected) + reserved(if) instance_variable(@scanner)operator(.)ident(scan)operator(()regexp<delimiter(/)content( (?: (?:)inline<delimiter(#{)constant(IDENT)delimiter(})>content((?:)char(\\.)content(|::\)\)* | (?:@@?|$\)? )inline<delimiter(#{)constant(IDENT)delimiter(})>content((?:)char(\\.)content(|::\) \) )inline<delimiter(#{)constant(METHOD_NAME_EX)delimiter(})>content( )delimiter(/)modifier(ox)>operator(\)) + ident(kind) operator(=) symbol(:method) + instance_variable(@state) operator(=) symbol(:initial) + reserved(else) + instance_variable(@scanner)operator(.)ident(getch) + reserved(end) + instance_variable(@state) operator(=) symbol(:initial) + + reserved(elsif) instance_variable(@state) operator(==) symbol(:module_expected) + reserved(if) instance_variable(@scanner)operator(.)ident(scan)operator(()regexp<delimiter(/)content(<<)delimiter(/)>operator(\)) + ident(kind) operator(=) symbol(:operator) + reserved(else) + reserved(if) instance_variable(@scanner)operator(.)ident(scan)operator(()regexp<delimiter(/)content( (?: )inline<delimiter(#{)constant(IDENT)delimiter(})>content( (?:)char(\\.)content(|::\)\)* )inline<delimiter(#{)constant(IDENT)delimiter(})>content( )delimiter(/)modifier(ox)>operator(\)) + ident(kind) operator(=) symbol(:method) + reserved(else) + instance_variable(@scanner)operator(.)ident(getch) + reserved(end) + instance_variable(@state) operator(=) symbol(:initial) + reserved(end) + + reserved(elsif) comment(# state == :initial) + comment(# IDENTIFIERS, KEYWORDS) + reserved(if) instance_variable(@scanner)operator(.)ident(scan)operator(()constant(GLOBAL_VARIABLE)operator(\)) + ident(kind) operator(=) symbol(:global_variable) + reserved(elsif) instance_variable(@scanner)operator(.)ident(scan)operator(()regexp<delimiter(/)content( @@ )inline<delimiter(#{)constant(IDENT)delimiter(})>content( )delimiter(/)modifier(ox)>operator(\)) + ident(kind) operator(=) symbol(:class_variable) + reserved(elsif) instance_variable(@scanner)operator(.)ident(scan)operator(()regexp<delimiter(/)content( @ )inline<delimiter(#{)constant(IDENT)delimiter(})>content( )delimiter(/)modifier(ox)>operator(\)) + ident(kind) operator(=) symbol(:instance_variable) + reserved(elsif) instance_variable(@scanner)operator(.)ident(scan)operator(()regexp<delimiter(/)content( __END__)char(\\n)content( ( (?!)char(\\#)content(CODE)char(\\#)content(\) .* \)? | )char(\\#)content([^)char(\\n)content(]* | =begin(?=)char(\\s)content(\).*? )char(\\n)content(=end(?=)char(\\s)content(|)char(\\z)content(\)(?:[^)char(\\n)content(]*\)? )delimiter(/)modifier(mx)>operator(\)) + ident(kind) operator(=) symbol(:comment) + reserved(elsif) instance_variable(@scanner)operator(.)ident(scan)operator(()constant(METHOD_NAME)operator(\)) + reserved(if) instance_variable(@last_token_dot) + ident(kind) operator(=) symbol(:ident) + reserved(else) + ident(matched) operator(=) instance_variable(@scanner)operator(.)ident(matched) + ident(kind) operator(=) constant(IDENT_KIND)operator([)ident(matched)operator(]) + reserved(if) ident(kind) operator(==) symbol(:ident) reserved(and) ident(matched) operator(=)operator(~) regexp<delimiter(/)content(^[A-Z])delimiter(/)> + ident(kind) operator(=) symbol(:constant) + reserved(elsif) ident(kind) operator(==) symbol(:reserved) + instance_variable(@state) operator(=) constant(DEF_NEW_STATE)operator([)ident(matched)operator(]) + instance_variable(@regexp_allowed) operator(=) constant(REGEXP_ALLOWED)operator([)ident(matched)operator(]) + reserved(end) + reserved(end) + + reserved(elsif) instance_variable(@scanner)operator(.)ident(scan)operator(()constant(STRING)operator(\)) + ident(kind) operator(=) symbol(:string) + reserved(elsif) instance_variable(@scanner)operator(.)ident(scan)operator(()constant(SHELL)operator(\)) + ident(kind) operator(=) symbol(:shell) + reserved(elsif) instance_variable(@scanner)operator(.)ident(scan)operator(()regexp<delimiter(/)content(<< + (?: + ([a-zA-Z_0-9]+\) + (?: .*? ^)char(\\1)content($ | .* \) + | + -([a-zA-Z_0-9]+\) + (?: .*? ^)char(\\s)content(*)char(\\2)content($ | .* \) + | + ([")char(\\')content(`]\) (.+?\) )char(\\3)content( + (?: .*? ^)char(\\4)content($ | .* \) + | + - ([")char(\\')content(`]\) (.+?\) )char(\\5)content( + (?: .*? ^)char(\\s)content(*)char(\\6)content($ | .* \) + \) + )delimiter(/)modifier(mxo)>operator(\)) + ident(kind) operator(=) symbol(:string) + reserved(elsif) instance_variable(@scanner)operator(.)ident(scan)operator(()regexp<delimiter(/)char(\\/)delimiter(/)>operator(\)) reserved(and) instance_variable(@regexp_allowed) + instance_variable(@scanner)operator(.)ident(unscan) + instance_variable(@scanner)operator(.)ident(scan)operator(()constant(REGEXP)operator(\)) + ident(kind) operator(=) symbol(:regexp) +regexp<delimiter(/)content(%(?:[Qqxrw](?:)char(\\()content([^\)#)char(\\\\)char(\\\\)content(]*(?:(?:#)char(\\{)content(.*?)char(\\})content(|#|)char(\\\\)char(\\\\)content(.\)[^\)#)char(\\\\)char(\\\\)content(]*\)*)char(\\\))content(?|)char(\\[)content([^)char(\\])content(#)char(\\\\)char(\\\\)content(]*(?:(?:#)char(\\{)content(.*?)char(\\})content(|#|)char(\\\\)char(\\\\)content(.\)[^)char(\\])content(#)char(\\\\)char(\\\\)content(]*\)*)char(\\])content(?|)char(\\{)content([^}#)char(\\\\)char(\\\\)content(]*(?:(?:#)char(\\{)content(.*?)char(\\})content(|#|)char(\\\\)char(\\\\)content(.\)[^}#)char(\\\\)char(\\\\)content(]*\)*)char(\\})content(?|<[^>#)char(\\\\)char(\\\\)content(]*(?:(?:#)char(\\{)content(.*?)char(\\})content(|#|)char(\\\\)char(\\\\)content(.\)[^>#)char(\\\\)char(\\\\)content(]*\)*>?|([^a-zA-Z)char(\\\\)char(\\\\)content(]\)(?:(?!)char(\\1)content(\)[^#)char(\\\\)char(\\\\)content(]\)*(?:(?:#)char(\\{)content(.*?)char(\\})content(|#|)char(\\\\)char(\\\\)content(.\)(?:(?!)char(\\1)content(\)[^#)char(\\\\)char(\\\\)content(]\)*\)*)char(\\1)content(?\)|)char(\\()content([^\)#)char(\\\\)char(\\\\)content(]*(?:(?:#)char(\\{)content(.*?)char(\\})content(|#|)char(\\\\)char(\\\\)content(.\)[^\)#)char(\\\\)char(\\\\)content(]*\)*)char(\\\))content(?|)char(\\[)content([^)char(\\])content(#)char(\\\\)char(\\\\)content(]*(?:(?:#)char(\\{)content(.*?)char(\\})content(|#|)char(\\\\)char(\\\\)content(.\)[^)char(\\])content(#)char(\\\\)char(\\\\)content(]*\)*)char(\\])content(?|)char(\\{)content([^}#)char(\\\\)char(\\\\)content(]*(?:(?:#)char(\\{)content(.*?)char(\\})content(|#|)char(\\\\)char(\\\\)content(.\)[^}#)char(\\\\)char(\\\\)content(]*\)*)char(\\})content(?|<[^>#)char(\\\\)char(\\\\)content(]*(?:(?:#)char(\\{)content(.*?)char(\\})content(|#|)char(\\\\)char(\\\\)content(.\)[^>#)char(\\\\)char(\\\\)content(]*\)*>?|([^a-zA-Z)char(\\s)char(\\\\)char(\\\\)content(]\)(?:(?!)char(\\2)content(\)[^#)char(\\\\)char(\\\\)content(]\)*(?:(?:#)char(\\{)content(.*?)char(\\})content(|#|)char(\\\\)char(\\\\)content(.\)(?:(?!)char(\\2)content(\)[^#)char(\\\\)char(\\\\)content(]\)*\)*)char(\\2)content(?|)char(\\\\)char(\\\\)content([^#)char(\\\\)char(\\\\)content(]*(?:(?:#)char(\\{)content(.*?)char(\\})content(|#\)[^#)char(\\\\)char(\\\\)content(]*\)*)char(\\\\)char(\\\\)content(?\))delimiter(/)> + reserved(elsif) instance_variable(@scanner)operator(.)ident(scan)operator(()regexp<delimiter(/)content(:(?:)inline<delimiter(#{)constant(GLOBAL_VARIABLE)delimiter(})>content(|)inline<delimiter(#{)constant(METHOD_NAME_EX)delimiter(})>content(|)inline<delimiter(#{)constant(STRING)delimiter(})>content(\))delimiter(/)modifier(ox)>operator(\)) + ident(kind) operator(=) symbol(:symbol) + reserved(elsif) instance_variable(@scanner)operator(.)ident(scan)operator(()regexp<delimiter(/)content( + )char(\\?)content( (?: + [^)char(\\s)char(\\\\)content(] + | + )char(\\\\)content( (?:M-)char(\\\\)content(C-|C-)char(\\\\)content(M-|M-)char(\\\\)content(c|c)char(\\\\)content(M-|c|C-|M-\)\)? (?: )char(\\\\)content( (?: . | [0-7]{3} | x[0-9A-Fa-f][0-9A-Fa-f] \) + \) + )delimiter(/)modifier(mox)>operator(\)) + ident(kind) operator(=) symbol(:integer) + + reserved(elsif) instance_variable(@scanner)operator(.)ident(scan)operator(()regexp<delimiter(/)content( [-+*)char(\\/)content(%=<>;,|&!(\))char(\\[)char(\\])content({}~?] | )char(\\.)char(\\.)content(?)char(\\.)content(? | ::? )delimiter(/)modifier(x)>operator(\)) + ident(kind) operator(=) symbol(:operator) + instance_variable(@regexp_allowed) operator(=) symbol(:set) reserved(if) instance_variable(@scanner)operator(.)ident(matched)operator([)integer(-1)operator(,)integer(1)operator(]) operator(=)operator(~) regexp<delimiter(/)content([~=!<>|&^,)char(\\()char(\\[)content(+)char(\\-)char(\\/)char(\\*)content(%])char(\\z)delimiter(/)> + reserved(elsif) instance_variable(@scanner)operator(.)ident(scan)operator(()constant(FLOAT)operator(\)) + ident(kind) operator(=) symbol(:float) + reserved(elsif) instance_variable(@scanner)operator(.)ident(scan)operator(()constant(INTEGER)operator(\)) + ident(kind) operator(=) symbol(:integer) + reserved(else) + instance_variable(@scanner)operator(.)ident(getch) + reserved(end) + reserved(end) + + ident(token) operator(=) constant(Token)operator(.)ident(new) instance_variable(@scanner)operator(.)ident(matched)operator(,) ident(kind) + + reserved(if) ident(kind) operator(==) symbol(:regexp) + ident(token)operator(.)ident(text) operator(<<) instance_variable(@scanner)operator(.)ident(scan)operator(()regexp<delimiter(/)content([eimnosux]*)delimiter(/)>operator(\)) + reserved(end) + + instance_variable(@regexp_allowed) operator(=) operator(()instance_variable(@regexp_allowed) operator(==) symbol(:set)operator(\)) comment(# delayed flag setting) + + ident(token) + reserved(end) +reserved(end) + +ident(register) constant(Ruby)operator(,) string<delimiter(')content(ruby)delimiter(')>operator(,) string<delimiter(')content(rb)delimiter(')> + + reserved(end) +reserved(end) +reserved(class) class(Set) + ident(include) constant(Enumerable) + + comment(# Creates a new set containing the given objects.) + reserved(def) pre_constant(self)operator(.)operator([])operator(()operator(*)ident(ary)operator(\)) + ident(new)operator(()ident(ary)operator(\)) + reserved(end) + + comment(# Creates a new set containing the elements of the given enumerable) + comment(# object.) + comment(#) + comment(# If a block is given, the elements of enum are preprocessed by the) + comment(# given block.) + reserved(def) method(initialize)operator(()ident(enum) operator(=) pre_constant(nil)operator(,) operator(&)ident(block)operator(\)) comment(# :yields: o) + instance_variable(@hash) operator(||=) constant(Hash)operator(.)ident(new) + + ident(enum)operator(.)ident(nil?) reserved(and) reserved(return) + + reserved(if) ident(block) + ident(enum)operator(.)ident(each) operator({) operator(|)ident(o)operator(|) ident(add)operator(()ident(block)operator([)ident(o)operator(])operator(\)) operator(}) + reserved(else) + ident(merge)operator(()ident(enum)operator(\)) + reserved(end) + reserved(end) + + comment(# Copy internal hash.) + reserved(def) method(initialize_copy)operator(()ident(orig)operator(\)) + instance_variable(@hash) operator(=) ident(orig)operator(.)ident(instance_eval)operator({)instance_variable(@hash)operator(})operator(.)ident(dup) + reserved(end) + + comment(# Returns the number of elements.) + reserved(def) method(size) + instance_variable(@hash)operator(.)ident(size) + reserved(end) + reserved(alias) ident(length) ident(size) + + comment(# Returns true if the set contains no elements.) + reserved(def) method(empty?) + instance_variable(@hash)operator(.)ident(empty?) + reserved(end) + + comment(# Removes all elements and returns self.) + reserved(def) method(clear) + instance_variable(@hash)operator(.)ident(clear) + pre_constant(self) + reserved(end) + + comment(# Replaces the contents of the set with the contents of the given) + comment(# enumerable object and returns self.) + reserved(def) method(replace)operator(()ident(enum)operator(\)) + reserved(if) ident(enum)operator(.)ident(class) operator(==) pre_constant(self)operator(.)ident(class) + instance_variable(@hash)operator(.)ident(replace)operator(()ident(enum)operator(.)ident(instance_eval) operator({) instance_variable(@hash) operator(})operator(\)) + reserved(else) + ident(enum)operator(.)ident(is_a?)operator(()constant(Enumerable)operator(\)) reserved(or) ident(raise) constant(ArgumentError)operator(,) string<delimiter(")content(value must be enumerable)delimiter(")> + ident(clear) + ident(enum)operator(.)ident(each) operator({) operator(|)ident(o)operator(|) ident(add)operator(()ident(o)operator(\)) operator(}) + reserved(end) + + pre_constant(self) + reserved(end) + + comment(# Converts the set to an array. The order of elements is uncertain.) + reserved(def) method(to_a) + instance_variable(@hash)operator(.)ident(keys) + reserved(end) + + reserved(def) method(flatten_merge)operator(()ident(set)operator(,) ident(seen) operator(=) constant(Set)operator(.)ident(new)operator(\)) + ident(set)operator(.)ident(each) operator({) operator(|)ident(e)operator(|) + reserved(if) ident(e)operator(.)ident(is_a?)operator(()constant(Set)operator(\)) + reserved(if) ident(seen)operator(.)ident(include?)operator(()ident(e_id) operator(=) ident(e)operator(.)ident(object_id)operator(\)) + ident(raise) constant(ArgumentError)operator(,) string<delimiter(")content(tried to flatten recursive Set)delimiter(")> + reserved(end) + + ident(seen)operator(.)ident(add)operator(()ident(e_id)operator(\)) + ident(flatten_merge)operator(()ident(e)operator(,) ident(seen)operator(\)) + ident(seen)operator(.)ident(delete)operator(()ident(e_id)operator(\)) + reserved(else) + ident(add)operator(()ident(e)operator(\)) + reserved(end) + operator(}) + + pre_constant(self) + reserved(end) + ident(protected) symbol(:flatten_merge) + + comment(# Returns a new set that is a copy of the set, flattening each) + comment(# containing set recursively.) + reserved(def) method(flatten) + pre_constant(self)operator(.)ident(class)operator(.)ident(new)operator(.)ident(flatten_merge)operator(()pre_constant(self)operator(\)) + reserved(end) + + comment(# Equivalent to Set#flatten, but replaces the receiver with the) + comment(# result in place. Returns nil if no modifications were made.) + reserved(def) method(flatten!) + reserved(if) ident(detect) operator({) operator(|)ident(e)operator(|) ident(e)operator(.)ident(is_a?)operator(()constant(Set)operator(\)) operator(}) + ident(replace)operator(()ident(flatten)operator(()operator(\))operator(\)) + reserved(else) + pre_constant(nil) + reserved(end) + reserved(end) + + comment(# Returns true if the set contains the given object.) + reserved(def) method(include?)operator(()ident(o)operator(\)) + instance_variable(@hash)operator(.)ident(include?)operator(()ident(o)operator(\)) + reserved(end) + reserved(alias) ident(member?) ident(include?) + + comment(# Returns true if the set is a superset of the given set.) + reserved(def) method(superset?)operator(()ident(set)operator(\)) + ident(set)operator(.)ident(is_a?)operator(()constant(Set)operator(\)) reserved(or) ident(raise) constant(ArgumentError)operator(,) string<delimiter(")content(value must be a set)delimiter(")> + reserved(return) pre_constant(false) reserved(if) ident(size) operator(<) ident(set)operator(.)ident(size) + ident(set)operator(.)ident(all?) operator({) operator(|)ident(o)operator(|) ident(include?)operator(()ident(o)operator(\)) operator(}) + reserved(end) + + comment(# Returns true if the set is a proper superset of the given set.) + reserved(def) method(proper_superset?)operator(()ident(set)operator(\)) + ident(set)operator(.)ident(is_a?)operator(()constant(Set)operator(\)) reserved(or) ident(raise) constant(ArgumentError)operator(,) string<delimiter(")content(value must be a set)delimiter(")> + reserved(return) pre_constant(false) reserved(if) ident(size) operator(<=) ident(set)operator(.)ident(size) + ident(set)operator(.)ident(all?) operator({) operator(|)ident(o)operator(|) ident(include?)operator(()ident(o)operator(\)) operator(}) + reserved(end) + + comment(# Returns true if the set is a subset of the given set.) + reserved(def) method(subset?)operator(()ident(set)operator(\)) + ident(set)operator(.)ident(is_a?)operator(()constant(Set)operator(\)) reserved(or) ident(raise) constant(ArgumentError)operator(,) string<delimiter(")content(value must be a set)delimiter(")> + reserved(return) pre_constant(false) reserved(if) ident(set)operator(.)ident(size) operator(<) ident(size) + ident(all?) operator({) operator(|)ident(o)operator(|) ident(set)operator(.)ident(include?)operator(()ident(o)operator(\)) operator(}) + reserved(end) + + comment(# Returns true if the set is a proper subset of the given set.) + reserved(def) method(proper_subset?)operator(()ident(set)operator(\)) + ident(set)operator(.)ident(is_a?)operator(()constant(Set)operator(\)) reserved(or) ident(raise) constant(ArgumentError)operator(,) string<delimiter(")content(value must be a set)delimiter(")> + reserved(return) pre_constant(false) reserved(if) ident(set)operator(.)ident(size) operator(<=) ident(size) + ident(all?) operator({) operator(|)ident(o)operator(|) ident(set)operator(.)ident(include?)operator(()ident(o)operator(\)) operator(}) + reserved(end) + + comment(# Calls the given block once for each element in the set, passing) + comment(# the element as parameter.) + reserved(def) method(each) + instance_variable(@hash)operator(.)ident(each_key) operator({) operator(|)ident(o)operator(|) reserved(yield)operator(()ident(o)operator(\)) operator(}) + pre_constant(self) + reserved(end) + + comment(# Adds the given object to the set and returns self. Use +merge+ to) + comment(# add several elements at once.) + reserved(def) method(add)operator(()ident(o)operator(\)) + instance_variable(@hash)operator([)ident(o)operator(]) operator(=) pre_constant(true) + pre_constant(self) + reserved(end) + reserved(alias) operator(<<) ident(add) + + comment(# Adds the given object to the set and returns self. If the) + comment(# object is already in the set, returns nil.) + reserved(def) method(add?)operator(()ident(o)operator(\)) + reserved(if) ident(include?)operator(()ident(o)operator(\)) + pre_constant(nil) + reserved(else) + ident(add)operator(()ident(o)operator(\)) + reserved(end) + reserved(end) + + comment(# Deletes the given object from the set and returns self. Use +subtract+ to) + comment(# delete several items at once.) + reserved(def) method(delete)operator(()ident(o)operator(\)) + instance_variable(@hash)operator(.)ident(delete)operator(()ident(o)operator(\)) + pre_constant(self) + reserved(end) + + comment(# Deletes the given object from the set and returns self. If the) + comment(# object is not in the set, returns nil.) + reserved(def) method(delete?)operator(()ident(o)operator(\)) + reserved(if) ident(include?)operator(()ident(o)operator(\)) + ident(delete)operator(()ident(o)operator(\)) + reserved(else) + pre_constant(nil) + reserved(end) + reserved(end) + + comment(# Deletes every element of the set for which block evaluates to) + comment(# true, and returns self.) + reserved(def) method(delete_if) + instance_variable(@hash)operator(.)ident(delete_if) operator({) operator(|)ident(o)operator(,)operator(|) reserved(yield)operator(()ident(o)operator(\)) operator(}) + pre_constant(self) + reserved(end) + + comment(# Do collect(\) destructively.) + reserved(def) method(collect!) + ident(set) operator(=) pre_constant(self)operator(.)ident(class)operator(.)ident(new) + ident(each) operator({) operator(|)ident(o)operator(|) ident(set) operator(<<) reserved(yield)operator(()ident(o)operator(\)) operator(}) + ident(replace)operator(()ident(set)operator(\)) + reserved(end) + reserved(alias) ident(map!) ident(collect!) + + comment(# Equivalent to Set#delete_if, but returns nil if no changes were) + comment(# made.) + reserved(def) method(reject!) + ident(n) operator(=) ident(size) + ident(delete_if) operator({) operator(|)ident(o)operator(|) reserved(yield)operator(()ident(o)operator(\)) operator(}) + ident(size) operator(==) ident(n) operator(?) pre_constant(nil) operator(:) pre_constant(self) + reserved(end) + + comment(# Merges the elements of the given enumerable object to the set and) + comment(# returns self.) + reserved(def) method(merge)operator(()ident(enum)operator(\)) + reserved(if) ident(enum)operator(.)ident(is_a?)operator(()constant(Set)operator(\)) + instance_variable(@hash)operator(.)ident(update)operator(()ident(enum)operator(.)ident(instance_eval) operator({) instance_variable(@hash) operator(})operator(\)) + reserved(else) + ident(enum)operator(.)ident(is_a?)operator(()constant(Enumerable)operator(\)) reserved(or) ident(raise) constant(ArgumentError)operator(,) string<delimiter(")content(value must be enumerable)delimiter(")> + ident(enum)operator(.)ident(each) operator({) operator(|)ident(o)operator(|) ident(add)operator(()ident(o)operator(\)) operator(}) + reserved(end) + + pre_constant(self) + reserved(end) + + comment(# Deletes every element that appears in the given enumerable object) + comment(# and returns self.) + reserved(def) method(subtract)operator(()ident(enum)operator(\)) + ident(enum)operator(.)ident(is_a?)operator(()constant(Enumerable)operator(\)) reserved(or) ident(raise) constant(ArgumentError)operator(,) string<delimiter(")content(value must be enumerable)delimiter(")> + ident(enum)operator(.)ident(each) operator({) operator(|)ident(o)operator(|) ident(delete)operator(()ident(o)operator(\)) operator(}) + pre_constant(self) + reserved(end) + + comment(# Returns a new set built by merging the set and the elements of the) + comment(# given enumerable object.) + reserved(def) method(|)operator(()ident(enum)operator(\)) + ident(enum)operator(.)ident(is_a?)operator(()constant(Enumerable)operator(\)) reserved(or) ident(raise) constant(ArgumentError)operator(,) string<delimiter(")content(value must be enumerable)delimiter(")> + ident(dup)operator(.)ident(merge)operator(()ident(enum)operator(\)) + reserved(end) + reserved(alias) operator(+) operator(|) comment(##) + reserved(alias) ident(union) operator(|) comment(##) + + comment(# Returns a new set built by duplicating the set, removing every) + comment(# element that appears in the given enumerable object.) + reserved(def) method(-)operator(()ident(enum)operator(\)) + ident(enum)operator(.)ident(is_a?)operator(()constant(Enumerable)operator(\)) reserved(or) ident(raise) constant(ArgumentError)operator(,) string<delimiter(")content(value must be enumerable)delimiter(")> + ident(dup)operator(.)ident(subtract)operator(()ident(enum)operator(\)) + reserved(end) + reserved(alias) ident(difference) operator(-) comment(##) + + comment(# Returns a new array containing elements common to the set and the) + comment(# given enumerable object.) + reserved(def) method(&)operator(()ident(enum)operator(\)) + ident(enum)operator(.)ident(is_a?)operator(()constant(Enumerable)operator(\)) reserved(or) ident(raise) constant(ArgumentError)operator(,) string<delimiter(")content(value must be enumerable)delimiter(")> + ident(n) operator(=) pre_constant(self)operator(.)ident(class)operator(.)ident(new) + ident(enum)operator(.)ident(each) operator({) operator(|)ident(o)operator(|) ident(n)operator(.)ident(add)operator(()ident(o)operator(\)) reserved(if) ident(include?)operator(()ident(o)operator(\)) operator(}) + ident(n) + reserved(end) + reserved(alias) ident(intersection) operator(&) comment(##) + + comment(# Returns a new array containing elements exclusive between the set) + comment(# and the given enumerable object. (set ^ enum\) is equivalent to) + comment(# ((set | enum\) - (set & enum\)\).) + reserved(def) method(^)operator(()ident(enum)operator(\)) + ident(enum)operator(.)ident(is_a?)operator(()constant(Enumerable)operator(\)) reserved(or) ident(raise) constant(ArgumentError)operator(,) string<delimiter(")content(value must be enumerable)delimiter(")> + ident(n) operator(=) ident(dup) + ident(enum)operator(.)ident(each) operator({) operator(|)ident(o)operator(|) reserved(if) ident(n)operator(.)ident(include?)operator(()ident(o)operator(\)) reserved(then) ident(n)operator(.)ident(delete)operator(()ident(o)operator(\)) reserved(else) ident(n)operator(.)ident(add)operator(()ident(o)operator(\)) reserved(end) operator(}) + ident(n) + reserved(end) + + comment(# Returns true if two sets are equal. The equality of each couple) + comment(# of elements is defined according to Object#eql?.) + reserved(def) method(==)operator(()ident(set)operator(\)) + ident(equal?)operator(()ident(set)operator(\)) reserved(and) reserved(return) pre_constant(true) + + ident(set)operator(.)ident(is_a?)operator(()constant(Set)operator(\)) operator(&&) ident(size) operator(==) ident(set)operator(.)ident(size) reserved(or) reserved(return) pre_constant(false) + + ident(hash) operator(=) instance_variable(@hash)operator(.)ident(dup) + ident(set)operator(.)ident(all?) operator({) operator(|)ident(o)operator(|) ident(hash)operator(.)ident(include?)operator(()ident(o)operator(\)) operator(}) + reserved(end) + + reserved(def) method(hash) comment(# :nodoc:) + instance_variable(@hash)operator(.)ident(hash) + reserved(end) + + reserved(def) method(eql?)operator(()ident(o)operator(\)) comment(# :nodoc:) + reserved(return) pre_constant(false) reserved(unless) ident(o)operator(.)ident(is_a?)operator(()constant(Set)operator(\)) + instance_variable(@hash)operator(.)ident(eql?)operator(()ident(o)operator(.)ident(instance_eval)operator({)instance_variable(@hash)operator(})operator(\)) + reserved(end) + + comment(# Classifies the set by the return value of the given block and) + comment(# returns a hash of {value => set of elements} pairs. The block is) + comment(# called once for each element of the set, passing the element as) + comment(# parameter.) + comment(#) + comment(# e.g.:) + comment(#) + comment(# require 'set') + comment(# files = Set.new(Dir.glob("*.rb"\)\)) + comment(# hash = files.classify { |f| File.mtime(f\).year }) + comment(# p hash # => {2000=>#<Set: {"a.rb", "b.rb"}>,) + comment(# # 2001=>#<Set: {"c.rb", "d.rb", "e.rb"}>,) + comment(# # 2002=>#<Set: {"f.rb"}>}) + reserved(def) method(classify) comment(# :yields: o) + ident(h) operator(=) operator({)operator(}) + + ident(each) operator({) operator(|)ident(i)operator(|) + ident(x) operator(=) reserved(yield)operator(()ident(i)operator(\)) + operator(()ident(h)operator([)ident(x)operator(]) operator(||=) pre_constant(self)operator(.)ident(class)operator(.)ident(new)operator(\))operator(.)ident(add)operator(()ident(i)operator(\)) + operator(}) + + ident(h) + reserved(end) + + comment(# Divides the set into a set of subsets according to the commonality) + comment(# defined by the given block.) + comment(#) + comment(# If the arity of the block is 2, elements o1 and o2 are in common) + comment(# if block.call(o1, o2\) is true. Otherwise, elements o1 and o2 are) + comment(# in common if block.call(o1\) == block.call(o2\).) + comment(#) + comment(# e.g.:) + comment(#) + comment(# require 'set') + comment(# numbers = Set[1, 3, 4, 6, 9, 10, 11]) + comment(# set = numbers.divide { |i,j| (i - j\).abs == 1 }) + comment(# p set # => #<Set: {#<Set: {1}>,) + comment(# # #<Set: {11, 9, 10}>,) + comment(# # #<Set: {3, 4}>,) + comment(# # #<Set: {6}>}>) + reserved(def) method(divide)operator(()operator(&)ident(func)operator(\)) + reserved(if) ident(func)operator(.)ident(arity) operator(==) integer(2) + ident(require) string<delimiter(')content(tsort)delimiter(')> + + reserved(class) operator(<<) class(dig) operator(=) operator({)operator(}) comment(# :nodoc:) + ident(include) constant(TSort) + + reserved(alias) ident(tsort_each_node) ident(each_key) + reserved(def) method(tsort_each_child)operator(()ident(node)operator(,) operator(&)ident(block)operator(\)) + ident(fetch)operator(()ident(node)operator(\))operator(.)ident(each)operator(()operator(&)ident(block)operator(\)) + reserved(end) + reserved(end) + + ident(each) operator({) operator(|)ident(u)operator(|) + ident(dig)operator([)ident(u)operator(]) operator(=) ident(a) operator(=) operator([)operator(]) + ident(each)operator({) operator(|)ident(v)operator(|) ident(func)operator(.)ident(call)operator(()ident(u)operator(,) ident(v)operator(\)) reserved(and) ident(a) operator(<<) ident(v) operator(}) + operator(}) + + ident(set) operator(=) constant(Set)operator(.)ident(new)operator(()operator(\)) + ident(dig)operator(.)ident(each_strongly_connected_component) operator({) operator(|)ident(css)operator(|) + ident(set)operator(.)ident(add)operator(()pre_constant(self)operator(.)ident(class)operator(.)ident(new)operator(()ident(css)operator(\))operator(\)) + operator(}) + ident(set) + reserved(else) + constant(Set)operator(.)ident(new)operator(()ident(classify)operator(()operator(&)ident(func)operator(\))operator(.)ident(values)operator(\)) + reserved(end) + reserved(end) + + constant(InspectKey) operator(=) symbol(:__inspect_key__) comment(# :nodoc:) + + comment(# Returns a string containing a human-readable representation of the) + comment(# set. ("#<Set: {element1, element2, ...}>"\)) + reserved(def) method(inspect) + ident(ids) operator(=) operator(()constant(Thread)operator(.)ident(current)operator([)constant(InspectKey)operator(]) operator(||=) operator([)operator(])operator(\)) + + reserved(if) ident(ids)operator(.)ident(include?)operator(()ident(object_id)operator(\)) + reserved(return) ident(sprintf)operator(()string<delimiter(')content(#<%s: {...}>)delimiter(')>operator(,) pre_constant(self)operator(.)ident(class)operator(.)ident(name)operator(\)) + reserved(end) + + reserved(begin) + ident(ids) operator(<<) ident(object_id) + reserved(return) ident(sprintf)operator(()string<delimiter(')content(#<%s: {%s}>)delimiter(')>operator(,) pre_constant(self)operator(.)ident(class)operator(,) ident(to_a)operator(.)ident(inspect)operator([)integer(1)operator(..)integer(-2)operator(])operator(\)) + reserved(ensure) + ident(ids)operator(.)ident(pop) + reserved(end) + reserved(end) + + reserved(def) method(pretty_print)operator(()ident(pp)operator(\)) comment(# :nodoc:) + ident(pp)operator(.)ident(text) ident(sprintf)operator(()string<delimiter(')content(#<%s: {)delimiter(')>operator(,) pre_constant(self)operator(.)ident(class)operator(.)ident(name)operator(\)) + ident(pp)operator(.)ident(nest)operator(()integer(1)operator(\)) operator({) + ident(pp)operator(.)ident(seplist)operator(()pre_constant(self)operator(\)) operator({) operator(|)ident(o)operator(|) + ident(pp)operator(.)ident(pp) ident(o) + operator(}) + operator(}) + ident(pp)operator(.)ident(text) string<delimiter(")content(}>)delimiter(")> + reserved(end) + + reserved(def) method(pretty_print_cycle)operator(()ident(pp)operator(\)) comment(# :nodoc:) + ident(pp)operator(.)ident(text) ident(sprintf)operator(()string<delimiter(')content(#<%s: {%s}>)delimiter(')>operator(,) pre_constant(self)operator(.)ident(class)operator(.)ident(name)operator(,) ident(empty?) operator(?) string<delimiter(')delimiter(')> operator(:) string<delimiter(')content(...)delimiter(')>operator(\)) + reserved(end) +reserved(end) + +comment(# SortedSet implements a set which elements are sorted in order. See Set.) +reserved(class) class(SortedSet) operator(<) constant(Set) + class_variable(@@setup) operator(=) pre_constant(false) + + reserved(class) operator(<<) class(self) + reserved(def) method([])operator(()operator(*)ident(ary)operator(\)) comment(# :nodoc:) + ident(new)operator(()ident(ary)operator(\)) + reserved(end) + + reserved(def) method(setup) comment(# :nodoc:) + class_variable(@@setup) reserved(and) reserved(return) + + reserved(begin) + ident(require) string<delimiter(')content(rbtree)delimiter(')> + + ident(module_eval) string<delimiter(%{)content( + def initialize(*args, &block\) + @hash = RBTree.new + super + end + )delimiter(})> + reserved(rescue) constant(LoadError) + ident(module_eval) string<delimiter(%{)content( + def initialize(*args, &block\) + @keys = nil + super + end + + def clear + @keys = nil + super + end + + def replace(enum\) + @keys = nil + super + end + + def add(o\) + @keys = nil + @hash[o] = true + self + end + alias << add + + def delete(o\) + @keys = nil + @hash.delete(o\) + self + end + + def delete_if + n = @hash.size + @hash.delete_if )nesting_delimiter({)content( |o,| yield(o\) )nesting_delimiter(})content( + @keys = nil if @hash.size != n + self + end + + def merge(enum\) + @keys = nil + super + end + + def each + to_a.each )nesting_delimiter({)content( |o| yield(o\) )nesting_delimiter(})content( + end + + def to_a + (@keys = @hash.keys\).sort! unless @keys + @keys + end + )delimiter(})> + reserved(end) + + class_variable(@@setup) operator(=) pre_constant(true) + reserved(end) + reserved(end) + + reserved(def) method(initialize)operator(()operator(*)ident(args)operator(,) operator(&)ident(block)operator(\)) comment(# :nodoc:) + constant(SortedSet)operator(.)ident(setup) + ident(initialize)operator(()operator(*)ident(args)operator(,) operator(&)ident(block)operator(\)) + reserved(end) +reserved(end) + +reserved(module) class(Enumerable) + comment(# Makes a set from the enumerable object with given arguments.) + reserved(def) method(to_set)operator(()ident(klass) operator(=) constant(Set)operator(,) operator(*)ident(args)operator(,) operator(&)ident(block)operator(\)) + ident(klass)operator(.)ident(new)operator(()pre_constant(self)operator(,) operator(*)ident(args)operator(,) operator(&)ident(block)operator(\)) + reserved(end) +reserved(end) + +comment(# =begin) +comment(# == RestricedSet class) +comment(# RestricedSet implements a set with restrictions defined by a given) +comment(# block.) +comment(#) +comment(# === Super class) +comment(# Set) +comment(#) +comment(# === Class Methods) +comment(# --- RestricedSet::new(enum = nil\) { |o| ... }) +comment(# --- RestricedSet::new(enum = nil\) { |rset, o| ... }) +comment(# Creates a new restricted set containing the elements of the given) +comment(# enumerable object. Restrictions are defined by the given block.) +comment(#) +comment(# If the block's arity is 2, it is called with the RestrictedSet) +comment(# itself and an object to see if the object is allowed to be put in) +comment(# the set.) +comment(#) +comment(# Otherwise, the block is called with an object to see if the object) +comment(# is allowed to be put in the set.) +comment(#) +comment(# === Instance Methods) +comment(# --- restriction_proc) +comment(# Returns the restriction procedure of the set.) +comment(#) +comment(# =end) +comment(#) +comment(# class RestricedSet < Set) +comment(# def initialize(*args, &block\)) +comment(# @proc = block or raise ArgumentError, "missing a block") +comment(#) +comment(# if @proc.arity == 2) +comment(# instance_eval %{) +comment(# def add(o\)) +comment(# @hash[o] = true if @proc.call(self, o\)) +comment(# self) +comment(# end) +comment(# alias << add) +comment(#) +comment(# def add?(o\)) +comment(# if include?(o\) || !@proc.call(self, o\)) +comment(# nil) +comment(# else) +comment(# @hash[o] = true) +comment(# self) +comment(# end) +comment(# end) +comment(#) +comment(# def replace(enum\)) +comment(# enum.is_a?(Enumerable\) or raise ArgumentError, "value must be enumerable") +comment(# clear) +comment(# enum.each { |o| add(o\) }) +comment(#) +comment(# self) +comment(# end) +comment(#) +comment(# def merge(enum\)) +comment(# enum.is_a?(Enumerable\) or raise ArgumentError, "value must be enumerable") +comment(# enum.each { |o| add(o\) }) +comment(#) +comment(# self) +comment(# end) +comment(# }) +comment(# else) +comment(# instance_eval %{) +comment(# def add(o\)) +comment(# if @proc.call(o\)) +comment(# @hash[o] = true) +comment(# end) +comment(# self) +comment(# end) +comment(# alias << add) +comment(#) +comment(# def add?(o\)) +comment(# if include?(o\) || !@proc.call(o\)) +comment(# nil) +comment(# else) +comment(# @hash[o] = true) +comment(# self) +comment(# end) +comment(# end) +comment(# }) +comment(# end) +comment(#) +comment(# super(*args\)) +comment(# end) +comment(#) +comment(# def restriction_proc) +comment(# @proc) +comment(# end) +comment(# end) + +reserved(if) global_variable($0) operator(==) pre_constant(__FILE__) + ident(eval) pre_constant(DATA)operator(.)ident(read)operator(,) pre_constant(nil)operator(,) global_variable($0)operator(,) pre_constant(__LINE__)integer(+4) +reserved(end) + +comment(# = rweb - CGI Support Library) +comment(#) +comment(# Author:: Johannes Barre (mailto:rweb@igels.net\)) +comment(# Copyright:: Copyright (c\) 2003, 04 by Johannes Barre) +comment(# License:: GNU Lesser General Public License (COPYING, http://www.gnu.org/copyleft/lesser.html\)) +comment(# Version:: 0.1.0) +comment(# CVS-ID:: $Id: rweb.rb 6 2004-06-16 15:56:26Z igel $) +comment(#) +comment(# == What is Rweb?) +comment(# Rweb is a replacement for the cgi class included in the ruby distribution.) +comment(#) +comment(# == How to use) +comment(#) +comment(# === Basics) +comment(#) +comment(# This class is made to be as easy as possible to use. An example:) +comment(#) +comment(# require "rweb") +comment(#) +comment(# web = Rweb.new) +comment(# web.out do) +comment(# web.puts "Hello world!") +comment(# end) +comment(#) +comment(# The visitor will get a simple "Hello World!" in his browser. Please notice,) +comment(# that won't set html-tags for you, so you should better do something like this:) +comment(#) +comment(# require "rweb") +comment(#) +comment(# web = Rweb.new) +comment(# web.out do) +comment(# web.puts "<html><body>Hello world!</body></html>") +comment(# end) +comment(#) +comment(# === Set headers) +comment(# Of course, it's also possible to tell the browser, that the content of this) +comment(# page is plain text instead of html code:) +comment(#) +comment(# require "rweb") +comment(#) +comment(# web = Rweb.new) +comment(# web.out do) +comment(# web.header("content-type: text/plain"\)) +comment(# web.puts "Hello plain world!") +comment(# end) +comment(#) +comment(# Please remember, headers can't be set after the page content has been send.) +comment(# You have to set all nessessary headers before the first puts oder print. It's) +comment(# possible to cache the content until everything is complete. Doing it this) +comment(# way, you can set headers everywhere.) +comment(#) +comment(# If you set a header twice, the second header will replace the first one. The) +comment(# header name is not casesensitive, it will allways converted in to the) +comment(# capitalised form suggested by the w3c (http://w3.org\)) +comment(#) +comment(# === Set cookies) +comment(# Setting cookies is quite easy:) +comment(# include 'rweb') +comment(#) +comment(# web = Rweb.new) +comment(# Cookie.new("Visits", web.cookies['visits'].to_i +1\)) +comment(# web.out do) +comment(# web.puts "Welcome back! You visited this page #{web.cookies['visits'].to_i +1} times") +comment(# end) +comment(#) +comment(# See the class Cookie for more details.) +comment(#) +comment(# === Get form and cookie values) +comment(# There are four ways to submit data from the browser to the server and your) +comment(# ruby script: via GET, POST, cookies and file upload. Rweb doesn't support) +comment(# file upload by now.) +comment(#) +comment(# include 'rweb') +comment(#) +comment(# web = Rweb.new) +comment(# web.out do) +comment(# web.print "action: #{web.get['action']} ") +comment(# web.puts "The value of the cookie 'visits' is #{web.cookies['visits']}") +comment(# web.puts "The post parameter 'test['x']' is #{web.post['test']['x']}") +comment(# end) + +constant(RWEB_VERSION) operator(=) string<delimiter(")content(0.1.0)delimiter(")> +constant(RWEB) operator(=) string<delimiter(")content(rweb/)inline<delimiter(#{)constant(RWEB_VERSION)delimiter(})>delimiter(")> + +comment(#require 'rwebcookie' -> edit by bunny :-\)) + +reserved(class) class(Rweb) + comment(# All parameter submitted via the GET method are available in attribute) + comment(# get. This is Hash, where every parameter is available as a key-value) + comment(# pair.) + comment(#) + comment(# If your input tag has a name like this one, it's value will be available) + comment(# as web.get["fieldname"]) + comment(# <input name="fieldname">) + comment(# You can submit values as a Hash) + comment(# <input name="text['index']">) + comment(# <input name="text['index2']">) + comment(# will be available as) + comment(# web.get["text"]["index"]) + comment(# web.get["text"]["index2"]) + comment(# Integers are also possible) + comment(# <input name="int[2]">) + comment(# <input name="int[3]['hi']>) + comment(# will be available as) + comment(# web.get["int"][2]) + comment(# web.get["int"][3]["hi"]) + comment(# If you specify no index, the lowest unused index will be used:) + comment(# <input name="int[]"><!-- First Field -->) + comment(# <input name="int[]"><!-- Second one -->) + comment(# will be available as) + comment(# web.get["int"][0] # First Field) + comment(# web.get["int"][1] # Second one) + comment(# Please notice, this doesn'd work like you might expect:) + comment(# <input name="text[index]">) + comment(# It will not be available as web.get["text"]["index"] but) + comment(# web.get["text[index]"]) + ident(attr_reader) symbol(:get) + + comment(# All parameters submitted via POST are available in the attribute post. It) + comment(# works like the get attribute.) + comment(# <input name="text[0]">) + comment(# will be available as) + comment(# web.post["text"][0]) + ident(attr_reader) symbol(:post) + + comment(# All cookies submitted by the browser are available in cookies. This is a) + comment(# Hash, where every cookie is a key-value pair.) + ident(attr_reader) symbol(:cookies) + + comment(# The name of the browser identification is submitted as USER_AGENT and) + comment(# available in this attribute.) + ident(attr_reader) symbol(:user_agent) + + comment(# The IP address of the client.) + ident(attr_reader) symbol(:remote_addr) + + comment(# Creates a new Rweb object. This should only done once. You can set various) + comment(# options via the settings hash.) + comment(#) + comment(# "cache" => true: Everything you script send to the client will be cached) + comment(# until the end of the out block or until flush is called. This way, you) + comment(# can modify headers and cookies even after printing something to the client.) + comment(#) + comment(# "safe" => level: Changes the $SAFE attribute. By default, $SAFE will be set) + comment(# to 1. If $SAFE is already higher than this value, it won't be changed.) + comment(#) + comment(# "silend" => true: Normaly, Rweb adds automaticly a header like this) + comment(# "X-Powered-By: Rweb/x.x.x (Ruby/y.y.y\)". With the silend option you can) + comment(# suppress this.) + reserved(def) method(initialize) operator(()ident(settings) operator(=) operator({)operator(})operator(\)) + comment(# {{{) + instance_variable(@header) operator(=) operator({)operator(}) + instance_variable(@cookies) operator(=) operator({)operator(}) + instance_variable(@get) operator(=) operator({)operator(}) + instance_variable(@post) operator(=) operator({)operator(}) + + comment(# Internal attributes) + instance_variable(@status) operator(=) pre_constant(nil) + instance_variable(@reasonPhrase) operator(=) pre_constant(nil) + instance_variable(@setcookies) operator(=) operator([)operator(]) + instance_variable(@output_started) operator(=) pre_constant(false)operator(;) + instance_variable(@output_allowed) operator(=) pre_constant(false)operator(;) + + instance_variable(@mod_ruby) operator(=) pre_constant(false) + instance_variable(@env) operator(=) constant(ENV)operator(.)ident(to_hash) + + reserved(if) reserved(defined?)operator(()constant(MOD_RUBY)operator(\)) + instance_variable(@output_method) operator(=) string<delimiter(")content(mod_ruby)delimiter(")> + instance_variable(@mod_ruby) operator(=) pre_constant(true) + reserved(elsif) instance_variable(@env)operator([)string<delimiter(')content(SERVER_SOFTWARE)delimiter(')>operator(]) operator(=)operator(~) regexp<delimiter(/)content(^Microsoft-IIS)delimiter(/)modifier(i)> + instance_variable(@output_method) operator(=) string<delimiter(")content(nph)delimiter(")> + reserved(else) + instance_variable(@output_method) operator(=) string<delimiter(")content(ph)delimiter(")> + reserved(end) + + reserved(unless) ident(settings)operator(.)ident(is_a?)operator(()constant(Hash)operator(\)) + ident(raise) constant(TypeError)operator(,) string<delimiter(")content(settings must be a Hash)delimiter(")> + reserved(end) + instance_variable(@settings) operator(=) ident(settings) + + reserved(unless) instance_variable(@settings)operator(.)ident(has_key?)operator(()string<delimiter(")content(safe)delimiter(")>operator(\)) + instance_variable(@settings)operator([)string<delimiter(")content(safe)delimiter(")>operator(]) operator(=) integer(1) + reserved(end) + + reserved(if) global_variable($SAFE) operator(<) instance_variable(@settings)operator([)string<delimiter(")content(safe)delimiter(")>operator(]) + global_variable($SAFE) operator(=) instance_variable(@settings)operator([)string<delimiter(")content(safe)delimiter(")>operator(]) + reserved(end) + + reserved(unless) instance_variable(@settings)operator(.)ident(has_key?)operator(()string<delimiter(")content(cache)delimiter(")>operator(\)) + instance_variable(@settings)operator([)string<delimiter(")content(cache)delimiter(")>operator(]) operator(=) pre_constant(false) + reserved(end) + + comment(# mod_ruby sets no QUERY_STRING variable, if no GET-Parameters are given) + reserved(unless) instance_variable(@env)operator(.)ident(has_key?)operator(()string<delimiter(")content(QUERY_STRING)delimiter(")>operator(\)) + instance_variable(@env)operator([)string<delimiter(")content(QUERY_STRING)delimiter(")>operator(]) operator(=) string<delimiter(")delimiter(")> + reserved(end) + + comment(# Now we split the QUERY_STRING by the seperators & and ; or, if) + comment(# specified, settings['get seperator']) + reserved(unless) instance_variable(@settings)operator(.)ident(has_key?)operator(()string<delimiter(")content(get seperator)delimiter(")>operator(\)) + ident(get_args) operator(=) instance_variable(@env)operator([)string<delimiter(')content(QUERY_STRING)delimiter(')>operator(])operator(.)ident(split)operator(()regexp<delimiter(/)content([&;])delimiter(/)>operator(\)) + reserved(else) + ident(get_args) operator(=) instance_variable(@env)operator([)string<delimiter(')content(QUERY_STRING)delimiter(')>operator(])operator(.)ident(split)operator(()instance_variable(@settings)operator([)string<delimiter(')content(get seperator)delimiter(')>operator(])operator(\)) + reserved(end) + + ident(get_args)operator(.)ident(each) reserved(do) operator(|) ident(arg) operator(|) + ident(arg_key)operator(,) ident(arg_val) operator(=) ident(arg)operator(.)ident(split)operator(()regexp<delimiter(/)content(=)delimiter(/)>operator(,) integer(2)operator(\)) + ident(arg_key) operator(=) constant(Rweb)operator(::)ident(unescape)operator(()ident(arg_key)operator(\)) + ident(arg_val) operator(=) constant(Rweb)operator(::)ident(unescape)operator(()ident(arg_val)operator(\)) + + comment(# Parse names like name[0], name['text'] or name[]) + ident(pattern) operator(=) regexp<delimiter(/)content(^(.+\))char(\\[)content(("[^)char(\\])content(]*"|'[^)char(\\])content(]*'|[0-9]*\))char(\\])content($)delimiter(/)> + ident(keys) operator(=) operator([)operator(]) + reserved(while) ident(match) operator(=) ident(pattern)operator(.)ident(match)operator(()ident(arg_key)operator(\)) + ident(arg_key) operator(=) ident(match)operator([)integer(1)operator(]) + ident(keys) operator(=) operator([)ident(match)operator([)integer(2)operator(])operator(]) operator(+) ident(keys) + reserved(end) + ident(keys) operator(=) operator([)ident(arg_key)operator(]) operator(+) ident(keys) + + ident(akt) operator(=) instance_variable(@get) + ident(last) operator(=) pre_constant(nil) + ident(lastkey) operator(=) pre_constant(nil) + ident(keys)operator(.)ident(each) reserved(do) operator(|)ident(key)operator(|) + reserved(if) ident(key) operator(==) string<delimiter(")delimiter(")> + comment(# No key specified (like in "test[]"\), so we use the) + comment(# lowerst unused Integer as key) + ident(key) operator(=) integer(0) + reserved(while) ident(akt)operator(.)ident(has_key?)operator(()ident(key)operator(\)) + ident(key) operator(+=) integer(1) + reserved(end) + reserved(elsif) regexp<delimiter(/)content(^[0-9]*$)delimiter(/)> operator(=)operator(~) ident(key) + comment(# If the index is numerical convert it to an Integer) + ident(key) operator(=) ident(key)operator(.)ident(to_i) + reserved(elsif) ident(key)operator([)integer(0)operator(])operator(.)ident(chr) operator(==) string<delimiter(")content(')delimiter(")> operator(||) ident(key)operator([)integer(0)operator(])operator(.)ident(chr) operator(==) string<delimiter(')content(")delimiter(')> + ident(key) operator(=) ident(key)operator([)integer(1)operator(,) ident(key)operator(.)ident(length)operator(()operator(\)) integer(-2)operator(]) + reserved(end) + reserved(if) operator(!)ident(akt)operator(.)ident(has_key?)operator(()ident(key)operator(\)) operator(||) operator(!)ident(akt)operator([)ident(key)operator(])operator(.)ident(class) operator(==) constant(Hash) + comment(# create an empty Hash if there isn't already one) + ident(akt)operator([)ident(key)operator(]) operator(=) operator({)operator(}) + reserved(end) + ident(last) operator(=) ident(akt) + ident(lastkey) operator(=) ident(key) + ident(akt) operator(=) ident(akt)operator([)ident(key)operator(]) + reserved(end) + ident(last)operator([)ident(lastkey)operator(]) operator(=) ident(arg_val) + reserved(end) + + reserved(if) instance_variable(@env)operator([)string<delimiter(')content(REQUEST_METHOD)delimiter(')>operator(]) operator(==) string<delimiter(")content(POST)delimiter(")> + reserved(if) instance_variable(@env)operator(.)ident(has_key?)operator(()string<delimiter(")content(CONTENT_TYPE)delimiter(")>operator(\)) operator(&&) instance_variable(@env)operator([)string<delimiter(')content(CONTENT_TYPE)delimiter(')>operator(]) operator(==) string<delimiter(")content(application/x-www-form-urlencoded)delimiter(")> operator(&&) instance_variable(@env)operator(.)ident(has_key?)operator(()string<delimiter(')content(CONTENT_LENGTH)delimiter(')>operator(\)) + reserved(unless) instance_variable(@settings)operator(.)ident(has_key?)operator(()string<delimiter(")content(post seperator)delimiter(")>operator(\)) + ident(post_args) operator(=) global_variable($stdin)operator(.)ident(read)operator(()instance_variable(@env)operator([)string<delimiter(')content(CONTENT_LENGTH)delimiter(')>operator(])operator(.)ident(to_i)operator(\))operator(.)ident(split)operator(()regexp<delimiter(/)content([&;])delimiter(/)>operator(\)) + reserved(else) + ident(post_args) operator(=) global_variable($stdin)operator(.)ident(read)operator(()instance_variable(@env)operator([)string<delimiter(')content(CONTENT_LENGTH)delimiter(')>operator(])operator(.)ident(to_i)operator(\))operator(.)ident(split)operator(()instance_variable(@settings)operator([)string<delimiter(')content(post seperator)delimiter(')>operator(])operator(\)) + reserved(end) + ident(post_args)operator(.)ident(each) reserved(do) operator(|) ident(arg) operator(|) + ident(arg_key)operator(,) ident(arg_val) operator(=) ident(arg)operator(.)ident(split)operator(()regexp<delimiter(/)content(=)delimiter(/)>operator(,) integer(2)operator(\)) + ident(arg_key) operator(=) constant(Rweb)operator(::)ident(unescape)operator(()ident(arg_key)operator(\)) + ident(arg_val) operator(=) constant(Rweb)operator(::)ident(unescape)operator(()ident(arg_val)operator(\)) + + comment(# Parse names like name[0], name['text'] or name[]) + ident(pattern) operator(=) regexp<delimiter(/)content(^(.+\))char(\\[)content(("[^)char(\\])content(]*"|'[^)char(\\])content(]*'|[0-9]*\))char(\\])content($)delimiter(/)> + ident(keys) operator(=) operator([)operator(]) + reserved(while) ident(match) operator(=) ident(pattern)operator(.)ident(match)operator(()ident(arg_key)operator(\)) + ident(arg_key) operator(=) ident(match)operator([)integer(1)operator(]) + ident(keys) operator(=) operator([)ident(match)operator([)integer(2)operator(])operator(]) operator(+) ident(keys) + reserved(end) + ident(keys) operator(=) operator([)ident(arg_key)operator(]) operator(+) ident(keys) + + ident(akt) operator(=) instance_variable(@post) + ident(last) operator(=) pre_constant(nil) + ident(lastkey) operator(=) pre_constant(nil) + ident(keys)operator(.)ident(each) reserved(do) operator(|)ident(key)operator(|) + reserved(if) ident(key) operator(==) string<delimiter(")delimiter(")> + comment(# No key specified (like in "test[]"\), so we use) + comment(# the lowerst unused Integer as key) + ident(key) operator(=) integer(0) + reserved(while) ident(akt)operator(.)ident(has_key?)operator(()ident(key)operator(\)) + ident(key) operator(+=) integer(1) + reserved(end) + reserved(elsif) regexp<delimiter(/)content(^[0-9]*$)delimiter(/)> operator(=)operator(~) ident(key) + comment(# If the index is numerical convert it to an Integer) + ident(key) operator(=) ident(key)operator(.)ident(to_i) + reserved(elsif) ident(key)operator([)integer(0)operator(])operator(.)ident(chr) operator(==) string<delimiter(")content(')delimiter(")> operator(||) ident(key)operator([)integer(0)operator(])operator(.)ident(chr) operator(==) string<delimiter(')content(")delimiter(')> + ident(key) operator(=) ident(key)operator([)integer(1)operator(,) ident(key)operator(.)ident(length)operator(()operator(\)) integer(-2)operator(]) + reserved(end) + reserved(if) operator(!)ident(akt)operator(.)ident(has_key?)operator(()ident(key)operator(\)) operator(||) operator(!)ident(akt)operator([)ident(key)operator(])operator(.)ident(class) operator(==) constant(Hash) + comment(# create an empty Hash if there isn't already one) + ident(akt)operator([)ident(key)operator(]) operator(=) operator({)operator(}) + reserved(end) + ident(last) operator(=) ident(akt) + ident(lastkey) operator(=) ident(key) + ident(akt) operator(=) ident(akt)operator([)ident(key)operator(]) + reserved(end) + ident(last)operator([)ident(lastkey)operator(]) operator(=) ident(arg_val) + reserved(end) + reserved(else) + comment(# Maybe we should print a warning here?) + global_variable($stderr)operator(.)ident(print)operator(()string<delimiter(")content(Unidentified form data recived and discarded.)delimiter(")>operator(\)) + reserved(end) + reserved(end) + + reserved(if) instance_variable(@env)operator(.)ident(has_key?)operator(()string<delimiter(")content(HTTP_COOKIE)delimiter(")>operator(\)) + ident(cookie) operator(=) instance_variable(@env)operator([)string<delimiter(')content(HTTP_COOKIE)delimiter(')>operator(])operator(.)ident(split)operator(()regexp<delimiter(/)content(; ?)delimiter(/)>operator(\)) + ident(cookie)operator(.)ident(each) reserved(do) operator(|) ident(c) operator(|) + ident(cookie_key)operator(,) ident(cookie_val) operator(=) ident(c)operator(.)ident(split)operator(()regexp<delimiter(/)content(=)delimiter(/)>operator(,) integer(2)operator(\)) + + instance_variable(@cookies) operator([)constant(Rweb)operator(::)ident(unescape)operator(()ident(cookie_key)operator(\))operator(]) operator(=) constant(Rweb)operator(::)ident(unescape)operator(()ident(cookie_val)operator(\)) + reserved(end) + reserved(end) + + reserved(if) reserved(defined?)operator(()instance_variable(@env)operator([)string<delimiter(')content(HTTP_USER_AGENT)delimiter(')>operator(])operator(\)) + instance_variable(@user_agent) operator(=) instance_variable(@env)operator([)string<delimiter(')content(HTTP_USER_AGENT)delimiter(')>operator(]) + reserved(else) + instance_variable(@user_agent) operator(=) pre_constant(nil)operator(;) + reserved(end) + + reserved(if) reserved(defined?)operator(()instance_variable(@env)operator([)string<delimiter(')content(REMOTE_ADDR)delimiter(')>operator(])operator(\)) + instance_variable(@remote_addr) operator(=) instance_variable(@env)operator([)string<delimiter(')content(REMOTE_ADDR)delimiter(')>operator(]) + reserved(else) + instance_variable(@remote_addr) operator(=) pre_constant(nil) + reserved(end) + comment(# }}}) + reserved(end) + + comment(# Prints a String to the client. If caching is enabled, the String will) + comment(# buffered until the end of the out block ends.) + reserved(def) method(print)operator(()ident(str) operator(=) string<delimiter(")delimiter(")>operator(\)) + comment(# {{{) + reserved(unless) instance_variable(@output_allowed) + ident(raise) string<delimiter(")content(You just can write to output inside of a Rweb::out-block)delimiter(")> + reserved(end) + + reserved(if) instance_variable(@settings)operator([)string<delimiter(")content(cache)delimiter(")>operator(]) + instance_variable(@buffer) operator(+=) operator([)ident(str)operator(.)ident(to_s)operator(]) + reserved(else) + reserved(unless) instance_variable(@output_started) + ident(sendHeaders) + reserved(end) + global_variable($stdout)operator(.)ident(print)operator(()ident(str)operator(\)) + reserved(end) + pre_constant(nil) + comment(# }}}) + reserved(end) + + comment(# Prints a String to the client and adds a line break at the end. Please) + comment(# remember, that a line break is not visible in HTML, use the <br> HTML-Tag) + comment(# for this. If caching is enabled, the String will buffered until the end) + comment(# of the out block ends.) + reserved(def) method(puts)operator(()ident(str) operator(=) string<delimiter(")delimiter(")>operator(\)) + comment(# {{{) + pre_constant(self)operator(.)ident(print)operator(()ident(str) operator(+) string<delimiter(")char(\\n)delimiter(")>operator(\)) + comment(# }}}) + reserved(end) + + comment(# Alias to print.) + reserved(def) method(write)operator(()ident(str) operator(=) string<delimiter(")delimiter(")>operator(\)) + comment(# {{{) + pre_constant(self)operator(.)ident(print)operator(()ident(str)operator(\)) + comment(# }}}) + reserved(end) + + comment(# If caching is enabled, all cached data are send to the cliend and the) + comment(# cache emptied.) + reserved(def) method(flush) + comment(# {{{) + reserved(unless) instance_variable(@output_allowed) + ident(raise) string<delimiter(")content(You can't use flush outside of a Rweb::out-block)delimiter(")> + reserved(end) + ident(buffer) operator(=) instance_variable(@buffer)operator(.)ident(join) + + reserved(unless) instance_variable(@output_started) + ident(sendHeaders) + reserved(end) + global_variable($stdout)operator(.)ident(print)operator(()ident(buffer)operator(\)) + + instance_variable(@buffer) operator(=) operator([)operator(]) + comment(# }}}) + reserved(end) + + comment(# Sends one or more header to the client. All headers are cached just) + comment(# before body data are send to the client. If the same header are set) + comment(# twice, only the last value is send.) + comment(#) + comment(# Example:) + comment(# web.header("Last-Modified: Mon, 16 Feb 2004 20:15:41 GMT"\)) + comment(# web.header("Location: http://www.ruby-lang.org"\)) + comment(#) + comment(# You can specify more than one header at the time by doing something like) + comment(# this:) + comment(# web.header("Content-Type: text/plain\\nContent-Length: 383"\)) + comment(# or) + comment(# web.header(["Content-Type: text/plain", "Content-Length: 383"]\)) + reserved(def) method(header)operator(()ident(str)operator(\)) + comment(# {{{) + reserved(if) instance_variable(@output_started) + ident(raise) string<delimiter(")content(HTTP-Headers are already send. You can't change them after output has started!)delimiter(")> + reserved(end) + reserved(unless) instance_variable(@output_allowed) + ident(raise) string<delimiter(")content(You just can set headers inside of a Rweb::out-block)delimiter(")> + reserved(end) + reserved(if) ident(str)operator(.)ident(is_a?)constant(Array) + ident(str)operator(.)ident(each) reserved(do) operator(|) ident(value) operator(|) + pre_constant(self)operator(.)ident(header)operator(()ident(value)operator(\)) + reserved(end) + + reserved(elsif) ident(str)operator(.)ident(split)operator(()regexp<delimiter(/)char(\\n)delimiter(/)>operator(\))operator(.)ident(length) operator(>) integer(1) + ident(str)operator(.)ident(split)operator(()regexp<delimiter(/)char(\\n)delimiter(/)>operator(\))operator(.)ident(each) reserved(do) operator(|) ident(value) operator(|) + pre_constant(self)operator(.)ident(header)operator(()ident(value)operator(\)) + reserved(end) + + reserved(elsif) ident(str)operator(.)ident(is_a?) constant(String) + ident(str)operator(.)ident(gsub!)operator(()regexp<delimiter(/)char(\\r)delimiter(/)>operator(,) string<delimiter(")delimiter(")>operator(\)) + + reserved(if) operator(()ident(str) operator(=)operator(~) regexp<delimiter(/)content(^HTTP)char(\\/)content(1)char(\\.)content([01] [0-9]{3} ?.*$)delimiter(/)>operator(\)) operator(==) integer(0) + ident(pattern) operator(=) regexp<delimiter(/)content(^HTTP)char(\\/)content(1.[01] ([0-9]{3}\) ?(.*\)$)delimiter(/)> + + ident(result) operator(=) ident(pattern)operator(.)ident(match)operator(()ident(str)operator(\)) + pre_constant(self)operator(.)ident(setstatus)operator(()ident(result)operator([)integer(0)operator(])operator(,) ident(result)operator([)integer(1)operator(])operator(\)) + reserved(elsif) operator(()ident(str) operator(=)operator(~) regexp<delimiter(/)content(^status: [0-9]{3} ?.*$)delimiter(/)modifier(i)>operator(\)) operator(==) integer(0) + ident(pattern) operator(=) regexp<delimiter(/)content(^status: ([0-9]{3}\) ?(.*\)$)delimiter(/)modifier(i)> + + ident(result) operator(=) ident(pattern)operator(.)ident(match)operator(()ident(str)operator(\)) + pre_constant(self)operator(.)ident(setstatus)operator(()ident(result)operator([)integer(0)operator(])operator(,) ident(result)operator([)integer(1)operator(])operator(\)) + reserved(else) + ident(a) operator(=) ident(str)operator(.)ident(split)operator(()regexp<delimiter(/)content(: ?)delimiter(/)>operator(,) integer(2)operator(\)) + + instance_variable(@header)operator([)ident(a)operator([)integer(0)operator(])operator(.)ident(downcase)operator(]) operator(=) ident(a)operator([)integer(1)operator(]) + reserved(end) + reserved(end) + comment(# }}}) + reserved(end) + + comment(# Changes the status of this page. There are several codes like "200 OK",) + comment(# "302 Found", "404 Not Found" or "500 Internal Server Error". A list of) + comment(# all codes is available at) + comment(# http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10) + comment(#) + comment(# You can just send the code number, the reason phrase will be added) + comment(# automaticly with the recommendations from the w3c if not specified. If) + comment(# you set the status twice or more, only the last status will be send.) + comment(# Examples:) + comment(# web.status("401 Unauthorized"\)) + comment(# web.status("410 Sad but true, this lonely page is gone :("\)) + comment(# web.status(206\)) + comment(# web.status("400"\)) + comment(#) + comment(# The default status is "200 OK". If a "Location" header is set, the) + comment(# default status is "302 Found".) + reserved(def) method(status)operator(()ident(str)operator(\)) + comment(# {{{) + reserved(if) instance_variable(@output_started) + ident(raise) string<delimiter(")content(HTTP-Headers are already send. You can't change them after output has started!)delimiter(")> + reserved(end) + reserved(unless) instance_variable(@output_allowed) + ident(raise) string<delimiter(")content(You just can set headers inside of a Rweb::out-block)delimiter(")> + reserved(end) + reserved(if) ident(str)operator(.)ident(is_a?)constant(Integer) + instance_variable(@status) operator(=) ident(str) + reserved(elsif) ident(str)operator(.)ident(is_a?)constant(String) + ident(p1) operator(=) regexp<delimiter(/)content(^([0-9]{3}\) ?(.*\)$)delimiter(/)> + ident(p2) operator(=) regexp<delimiter(/)content(^HTTP)char(\\/)content(1)char(\\.)content([01] ([0-9]{3}\) ?(.*\)$)delimiter(/)> + ident(p3) operator(=) regexp<delimiter(/)content(^status: ([0-9]{3}\) ?(.*\)$)delimiter(/)modifier(i)> + + reserved(if) operator(()ident(a) operator(=) ident(p1)operator(.)ident(match)operator(()ident(str)operator(\))operator(\)) operator(==) pre_constant(nil) + reserved(if) operator(()ident(a) operator(=) ident(p2)operator(.)ident(match)operator(()ident(str)operator(\))operator(\)) operator(==) pre_constant(nil) + reserved(if) operator(()ident(a) operator(=) ident(p3)operator(.)ident(match)operator(()ident(str)operator(\))operator(\)) operator(==) pre_constant(nil) + ident(raise) constant(ArgumentError)operator(,) string<delimiter(")content(Invalid argument)delimiter(")>operator(,) ident(caller) + reserved(end) + reserved(end) + reserved(end) + instance_variable(@status) operator(=) ident(a)operator([)integer(1)operator(])operator(.)ident(to_i) + reserved(if) ident(a)operator([)integer(2)operator(]) operator(!=) string<delimiter(")delimiter(")> + instance_variable(@reasonPhrase) operator(=) ident(a)operator([)integer(2)operator(]) + reserved(else) + instance_variable(@reasonPhrase) operator(=) ident(getReasonPhrase)operator(()instance_variable(@status)operator(\)) + reserved(end) + reserved(else) + ident(raise) constant(ArgumentError)operator(,) string<delimiter(")content(Argument of setstatus must be integer or string)delimiter(")>operator(,) ident(caller) + reserved(end) + comment(# }}}) + reserved(end) + + comment(# Handles the output of your content and rescues all exceptions. Send all) + comment(# data in the block to this method. For example:) + comment(# web.out do) + comment(# web.header("Content-Type: text/plain"\)) + comment(# web.puts("Hello, plain world!"\)) + comment(# end) + reserved(def) method(out) + comment(# {{{) + instance_variable(@output_allowed) operator(=) pre_constant(true) + instance_variable(@buffer) operator(=) operator([)operator(])operator(;) comment(# We use an array as buffer, because it's more performant :\)) + + reserved(begin) + reserved(yield) + reserved(rescue) constant(Exception) operator(=)operator(>) ident(exception) + global_variable($stderr)operator(.)ident(puts) string<delimiter(")content(Ruby exception rescued ()inline<delimiter(#{)ident(exception)operator(.)ident(class)delimiter(})>content(\): )inline<delimiter(#{)ident(exception)operator(.)ident(message)delimiter(})>delimiter(")> + global_variable($stderr)operator(.)ident(puts) ident(exception)operator(.)ident(backtrace)operator(.)ident(join)operator(()string<delimiter(")char(\\n)delimiter(")>operator(\)) + + reserved(unless) instance_variable(@output_started) + pre_constant(self)operator(.)ident(setstatus)operator(()integer(500)operator(\)) + instance_variable(@header) operator(=) operator({)operator(}) + reserved(end) + + reserved(unless) operator(()instance_variable(@settings)operator(.)ident(has_key?)operator(()string<delimiter(")content(hide errors)delimiter(")>operator(\)) reserved(and) instance_variable(@settings)operator([)string<delimiter(")content(hide errors)delimiter(")>operator(]) operator(==) pre_constant(true)operator(\)) + reserved(unless) instance_variable(@output_started) + pre_constant(self)operator(.)ident(header)operator(()string<delimiter(")content(Content-Type: text/html)delimiter(")>operator(\)) + pre_constant(self)operator(.)ident(puts) string<delimiter(")content(<!DOCTYPE HTML PUBLIC )char(\\")content(-//W3C//DTD HTML 4.01 Strict//EN)char(\\")content( )char(\\")content(http://www.w3.org/TR/html4/strict.dtd)char(\\")content(>)delimiter(")> + pre_constant(self)operator(.)ident(puts) string<delimiter(")content(<html>)delimiter(")> + pre_constant(self)operator(.)ident(puts) string<delimiter(")content(<head>)delimiter(")> + pre_constant(self)operator(.)ident(puts) string<delimiter(")content(<title>500 Internal Server Error</title>)delimiter(")> + pre_constant(self)operator(.)ident(puts) string<delimiter(")content(</head>)delimiter(")> + pre_constant(self)operator(.)ident(puts) string<delimiter(")content(<body>)delimiter(")> + reserved(end) + reserved(if) instance_variable(@header)operator(.)ident(has_key?)operator(()string<delimiter(")content(content-type)delimiter(")>operator(\)) reserved(and) operator(()instance_variable(@header)operator([)string<delimiter(")content(content-type)delimiter(")>operator(]) operator(=)operator(~) regexp<delimiter(/)content(^text)char(\\/)content(html)delimiter(/)modifier(i)>operator(\)) operator(==) integer(0) + pre_constant(self)operator(.)ident(puts) string<delimiter(")content(<h1>Internal Server Error</h1>)delimiter(")> + pre_constant(self)operator(.)ident(puts) string<delimiter(")content(<p>The server encountered an exception and was unable to complete your request.</p>)delimiter(")> + pre_constant(self)operator(.)ident(puts) string<delimiter(")content(<p>The exception has provided the following information:</p>)delimiter(")> + pre_constant(self)operator(.)ident(puts) string<delimiter(")content(<pre style=)char(\\")content(background: #FFCCCC; border: black solid 2px; margin-left: 2cm; margin-right: 2cm; padding: 2mm;)char(\\")content(><b>)inline<delimiter(#{)ident(exception)operator(.)ident(class)delimiter(})>content(</b>: )inline<delimiter(#{)ident(exception)operator(.)ident(message)delimiter(})>content( <b>on</b>)delimiter(")> + pre_constant(self)operator(.)ident(puts) + pre_constant(self)operator(.)ident(puts) string<delimiter(")inline<delimiter(#{)ident(exception)operator(.)ident(backtrace)operator(.)ident(join)operator(()string<delimiter(")char(\\n)delimiter(")>operator(\))delimiter(})>content(</pre>)delimiter(")> + pre_constant(self)operator(.)ident(puts) string<delimiter(")content(</body>)delimiter(")> + pre_constant(self)operator(.)ident(puts) string<delimiter(")content(</html>)delimiter(")> + reserved(else) + pre_constant(self)operator(.)ident(puts) string<delimiter(")content(The server encountered an exception and was unable to complete your request)delimiter(")> + pre_constant(self)operator(.)ident(puts) string<delimiter(")content(The exception has provided the following information:)delimiter(")> + pre_constant(self)operator(.)ident(puts) string<delimiter(")inline<delimiter(#{)ident(exception)operator(.)ident(class)delimiter(})>content(: )inline<delimiter(#{)ident(exception)operator(.)ident(message)delimiter(})>delimiter(")> + pre_constant(self)operator(.)ident(puts) + pre_constant(self)operator(.)ident(puts) ident(exception)operator(.)ident(backtrace)operator(.)ident(join)operator(()string<delimiter(")char(\\n)delimiter(")>operator(\)) + reserved(end) + reserved(end) + reserved(end) + + reserved(if) instance_variable(@settings)operator([)string<delimiter(")content(cache)delimiter(")>operator(]) + ident(buffer) operator(=) instance_variable(@buffer)operator(.)ident(join) + + reserved(unless) instance_variable(@output_started) + reserved(unless) instance_variable(@header)operator(.)ident(has_key?)operator(()string<delimiter(")content(content-length)delimiter(")>operator(\)) + pre_constant(self)operator(.)ident(header)operator(()string<delimiter(")content(content-length: )inline<delimiter(#{)ident(buffer)operator(.)ident(length)delimiter(})>delimiter(")>operator(\)) + reserved(end) + + ident(sendHeaders) + reserved(end) + global_variable($stdout)operator(.)ident(print)operator(()ident(buffer)operator(\)) + reserved(elsif) operator(!)instance_variable(@output_started) + ident(sendHeaders) + reserved(end) + instance_variable(@output_allowed) operator(=) pre_constant(false)operator(;) + comment(# }}}) + reserved(end) + + comment(# Decodes URL encoded data, %20 for example stands for a space.) + reserved(def) constant(Rweb)operator(.)ident(unescape)operator(()ident(str)operator(\)) + comment(# {{{) + reserved(if) reserved(defined?) ident(str) reserved(and) ident(str)operator(.)ident(is_a?) constant(String) + ident(str)operator(.)ident(gsub!)operator(()regexp<delimiter(/)char(\\+)delimiter(/)>operator(,) string<delimiter(")content( )delimiter(")>operator(\)) + ident(str)operator(.)ident(gsub)operator(()regexp<delimiter(/)content(%.{2})delimiter(/)>operator(\)) reserved(do) operator(|) ident(s) operator(|) + ident(s)operator([)integer(1)operator(,)integer(2)operator(])operator(.)ident(hex)operator(.)ident(chr) + reserved(end) + reserved(end) + comment(# }}}) + reserved(end) + + ident(protected) + reserved(def) method(sendHeaders) + comment(# {{{) + + constant(Cookie)operator(.)ident(disallow) comment(# no more cookies can be set or modified) + reserved(if) operator(!)operator(()instance_variable(@settings)operator(.)ident(has_key?)operator(()string<delimiter(")content(silent)delimiter(")>operator(\)) reserved(and) instance_variable(@settings)operator([)string<delimiter(")content(silent)delimiter(")>operator(]) operator(==) pre_constant(true)operator(\)) reserved(and) operator(!)instance_variable(@header)operator(.)ident(has_key?)operator(()string<delimiter(")content(x-powered-by)delimiter(")>operator(\)) + reserved(if) instance_variable(@mod_ruby) + ident(header)operator(()string<delimiter(")content(x-powered-by: )inline<delimiter(#{)constant(RWEB)delimiter(})>content( (Ruby/)inline<delimiter(#{)constant(RUBY_VERSION)delimiter(})>content(, )inline<delimiter(#{)constant(MOD_RUBY)delimiter(})>content(\))delimiter(")>operator(\))operator(;) + reserved(else) + ident(header)operator(()string<delimiter(")content(x-powered-by: )inline<delimiter(#{)constant(RWEB)delimiter(})>content( (Ruby/)inline<delimiter(#{)constant(RUBY_VERSION)delimiter(})>content(\))delimiter(")>operator(\))operator(;) + reserved(end) + reserved(end) + + reserved(if) instance_variable(@output_method) operator(==) string<delimiter(")content(ph)delimiter(")> + reserved(if) operator(()operator(()instance_variable(@status) operator(==) pre_constant(nil) reserved(or) instance_variable(@status) operator(==) integer(200)operator(\)) reserved(and) operator(!)instance_variable(@header)operator(.)ident(has_key?)operator(()string<delimiter(")content(content-type)delimiter(")>operator(\)) reserved(and) operator(!)instance_variable(@header)operator(.)ident(has_key?)operator(()string<delimiter(")content(location)delimiter(")>operator(\))operator(\)) + ident(header)operator(()string<delimiter(")content(content-type: text/html)delimiter(")>operator(\)) + reserved(end) + + reserved(if) instance_variable(@status) operator(!=) pre_constant(nil) + global_variable($stdout)operator(.)ident(print) string<delimiter(")content(Status: )inline<delimiter(#{)instance_variable(@status)delimiter(})>content( )inline<delimiter(#{)instance_variable(@reasonPhrase)delimiter(})>char(\\r)char(\\n)delimiter(")> + reserved(end) + + instance_variable(@header)operator(.)ident(each) reserved(do) operator(|)ident(key)operator(,) ident(value)operator(|) + ident(key) operator(=) ident(key) operator(*)integer(1) comment(# "unfreeze" key :\)) + ident(key)operator([)integer(0)operator(]) operator(=) ident(key)operator([)integer(0)operator(,)integer(1)operator(])operator(.)ident(upcase!)operator([)integer(0)operator(]) + + ident(key) operator(=) ident(key)operator(.)ident(gsub)operator(()regexp<delimiter(/)content(-[a-z])delimiter(/)>operator(\)) reserved(do) operator(|)ident(char)operator(|) + string<delimiter(")content(-)delimiter(")> operator(+) ident(char)operator([)integer(1)operator(,)integer(1)operator(])operator(.)ident(upcase) + reserved(end) + + global_variable($stdout)operator(.)ident(print) string<delimiter(")inline<delimiter(#{)ident(key)delimiter(})>content(: )inline<delimiter(#{)ident(value)delimiter(})>char(\\r)char(\\n)delimiter(")> + reserved(end) + ident(cookies) operator(=) constant(Cookie)operator(.)ident(getHttpHeader) comment(# Get all cookies as an HTTP Header) + reserved(if) ident(cookies) + global_variable($stdout)operator(.)ident(print) ident(cookies) + reserved(end) + + global_variable($stdout)operator(.)ident(print) string<delimiter(")char(\\r)char(\\n)delimiter(")> + + reserved(elsif) instance_variable(@output_method) operator(==) string<delimiter(")content(nph)delimiter(")> + reserved(elsif) instance_variable(@output_method) operator(==) string<delimiter(")content(mod_ruby)delimiter(")> + ident(r) operator(=) constant(Apache)operator(.)ident(request) + + reserved(if) operator(()operator(()instance_variable(@status) operator(==) pre_constant(nil) reserved(or) instance_variable(@status) operator(==) integer(200)operator(\)) reserved(and) operator(!)instance_variable(@header)operator(.)ident(has_key?)operator(()string<delimiter(")content(content-type)delimiter(")>operator(\)) reserved(and) operator(!)instance_variable(@header)operator(.)ident(has_key?)operator(()string<delimiter(")content(location)delimiter(")>operator(\))operator(\)) + ident(header)operator(()string<delimiter(")content(text/html)delimiter(")>operator(\)) + reserved(end) + + reserved(if) instance_variable(@status) operator(!=) pre_constant(nil) + ident(r)operator(.)ident(status_line) operator(=) string<delimiter(")inline<delimiter(#{)instance_variable(@status)delimiter(})>content( )inline<delimiter(#{)instance_variable(@reasonPhrase)delimiter(})>delimiter(")> + reserved(end) + + ident(r)operator(.)ident(send_http_header) + instance_variable(@header)operator(.)ident(each) reserved(do) operator(|)ident(key)operator(,) ident(value)operator(|) + ident(key) operator(=) ident(key) operator(*)integer(1) comment(# "unfreeze" key :\)) + + ident(key)operator([)integer(0)operator(]) operator(=) ident(key)operator([)integer(0)operator(,)integer(1)operator(])operator(.)ident(upcase!)operator([)integer(0)operator(]) + ident(key) operator(=) ident(key)operator(.)ident(gsub)operator(()regexp<delimiter(/)content(-[a-z])delimiter(/)>operator(\)) reserved(do) operator(|)ident(char)operator(|) + string<delimiter(")content(-)delimiter(")> operator(+) ident(char)operator([)integer(1)operator(,)integer(1)operator(])operator(.)ident(upcase) + reserved(end) + ident(puts) string<delimiter(")inline<delimiter(#{)ident(key)delimiter(})>content(: )inline<delimiter(#{)ident(value)operator(.)ident(class)delimiter(})>delimiter(")> + comment(#r.headers_out[key] = value) + reserved(end) + reserved(end) + instance_variable(@output_started) operator(=) pre_constant(true) + comment(# }}}) + reserved(end) + + reserved(def) method(getReasonPhrase) operator(()ident(status)operator(\)) + comment(# {{{) + reserved(if) ident(status) operator(==) integer(100) + string<delimiter(")content(Continue)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(101) + string<delimiter(")content(Switching Protocols)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(200) + string<delimiter(")content(OK)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(201) + string<delimiter(")content(Created)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(202) + string<delimiter(")content(Accepted)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(203) + string<delimiter(")content(Non-Authoritative Information)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(204) + string<delimiter(")content(No Content)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(205) + string<delimiter(")content(Reset Content)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(206) + string<delimiter(")content(Partial Content)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(300) + string<delimiter(")content(Multiple Choices)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(301) + string<delimiter(")content(Moved Permanently)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(302) + string<delimiter(")content(Found)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(303) + string<delimiter(")content(See Other)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(304) + string<delimiter(")content(Not Modified)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(305) + string<delimiter(")content(Use Proxy)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(307) + string<delimiter(")content(Temporary Redirect)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(400) + string<delimiter(")content(Bad Request)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(401) + string<delimiter(")content(Unauthorized)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(402) + string<delimiter(")content(Payment Required)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(403) + string<delimiter(")content(Forbidden)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(404) + string<delimiter(")content(Not Found)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(405) + string<delimiter(")content(Method Not Allowed)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(406) + string<delimiter(")content(Not Acceptable)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(407) + string<delimiter(")content(Proxy Authentication Required)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(408) + string<delimiter(")content(Request Time-out)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(409) + string<delimiter(")content(Conflict)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(410) + string<delimiter(")content(Gone)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(411) + string<delimiter(")content(Length Required)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(412) + string<delimiter(")content(Precondition Failed)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(413) + string<delimiter(")content(Request Entity Too Large)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(414) + string<delimiter(")content(Request-URI Too Large)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(415) + string<delimiter(")content(Unsupported Media Type)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(416) + string<delimiter(")content(Requested range not satisfiable)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(417) + string<delimiter(")content(Expectation Failed)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(500) + string<delimiter(")content(Internal Server Error)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(501) + string<delimiter(")content(Not Implemented)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(502) + string<delimiter(")content(Bad Gateway)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(503) + string<delimiter(")content(Service Unavailable)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(504) + string<delimiter(")content(Gateway Time-out)delimiter(")> + reserved(elsif) ident(status) operator(==) integer(505) + string<delimiter(")content(HTTP Version not supported)delimiter(")> + reserved(else) + ident(raise) string<delimiter(")content(Unknown Statuscode. See http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html#sec6.1 for more information.)delimiter(")> + reserved(end) + comment(# }}}) + reserved(end) +reserved(end) + +reserved(class) class(Cookie) + ident(attr_reader) symbol(:name)operator(,) symbol(:value)operator(,) symbol(:maxage)operator(,) symbol(:path)operator(,) symbol(:domain)operator(,) symbol(:secure)operator(,) symbol(:comment) + + comment(# Sets a cookie. Please see below for details of the attributes.) + reserved(def) method(initialize) operator(()ident(name)operator(,) ident(value) operator(=) pre_constant(nil)operator(,) ident(maxage) operator(=) pre_constant(nil)operator(,) ident(path) operator(=) pre_constant(nil)operator(,) ident(domain) operator(=) pre_constant(nil)operator(,) ident(secure) operator(=) pre_constant(false)operator(\)) + comment(# {{{) + comment(# HTTP headers (Cookies are a HTTP header\) can only set, while no content) + comment(# is send. So an exception will be raised, when @@allowed is set to false) + comment(# and a new cookie has set.) + reserved(unless) reserved(defined?)operator(()class_variable(@@allowed)operator(\)) + class_variable(@@allowed) operator(=) pre_constant(true) + reserved(end) + reserved(unless) class_variable(@@allowed) + ident(raise) string<delimiter(")content(You can't set cookies after the HTTP headers are send.)delimiter(")> + reserved(end) + + reserved(unless) reserved(defined?)operator(()class_variable(@@list)operator(\)) + class_variable(@@list) operator(=) operator([)operator(]) + reserved(end) + class_variable(@@list) operator(+=) operator([)pre_constant(self)operator(]) + + reserved(unless) reserved(defined?)operator(()class_variable(@@type)operator(\)) + class_variable(@@type) operator(=) string<delimiter(")content(netscape)delimiter(")> + reserved(end) + + reserved(unless) ident(name)operator(.)ident(class) operator(==) constant(String) + ident(raise) constant(TypeError)operator(,) string<delimiter(")content(The name of a cookie must be a string)delimiter(")>operator(,) ident(caller) + reserved(end) + reserved(if) ident(value)operator(.)ident(class)operator(.)ident(superclass) operator(==) constant(Integer) operator(||) ident(value)operator(.)ident(class) operator(==) constant(Float) + ident(value) operator(=) ident(value)operator(.)ident(to_s) + reserved(elsif) ident(value)operator(.)ident(class) operator(!=) constant(String) operator(&&) ident(value) operator(!=) pre_constant(nil) + ident(raise) constant(TypeError)operator(,) string<delimiter(")content(The value of a cookie must be a string, integer, float or nil)delimiter(")>operator(,) ident(caller) + reserved(end) + reserved(if) ident(maxage)operator(.)ident(class) operator(==) constant(Time) + ident(maxage) operator(=) ident(maxage) operator(-) constant(Time)operator(.)ident(now) + reserved(elsif) operator(!)ident(maxage)operator(.)ident(class)operator(.)ident(superclass) operator(==) constant(Integer) operator(||) operator(!)ident(maxage) operator(==) pre_constant(nil) + ident(raise) constant(TypeError)operator(,) string<delimiter(")content(The maxage date of a cookie must be an Integer or Time object or nil.)delimiter(")>operator(,) ident(caller) + reserved(end) + reserved(unless) ident(path)operator(.)ident(class) operator(==) constant(String) operator(||) ident(path) operator(==) pre_constant(nil) + ident(raise) constant(TypeError)operator(,) string<delimiter(")content(The path of a cookie must be nil or a string)delimiter(")>operator(,) ident(caller) + reserved(end) + reserved(unless) ident(domain)operator(.)ident(class) operator(==) constant(String) operator(||) ident(domain) operator(==) pre_constant(nil) + ident(raise) constant(TypeError)operator(,) string<delimiter(")content(The value of a cookie must be nil or a string)delimiter(")>operator(,) ident(caller) + reserved(end) + reserved(unless) ident(secure) operator(==) pre_constant(true) operator(||) ident(secure) operator(==) pre_constant(false) + ident(raise) constant(TypeError)operator(,) string<delimiter(")content(The secure field of a cookie must be true or false)delimiter(")>operator(,) ident(caller) + reserved(end) + + instance_variable(@name)operator(,) instance_variable(@value)operator(,) instance_variable(@maxage)operator(,) instance_variable(@path)operator(,) instance_variable(@domain)operator(,) instance_variable(@secure) operator(=) ident(name)operator(,) ident(value)operator(,) ident(maxage)operator(,) ident(path)operator(,) ident(domain)operator(,) ident(secure) + instance_variable(@comment) operator(=) pre_constant(nil) + comment(# }}}) + reserved(end) + + comment(# Modifies the value of this cookie. The information you want to store. If the) + comment(# value is nil, the cookie will be deleted by the client.) + comment(#) + comment(# This attribute can be a String, Integer or Float object or nil.) + reserved(def) method(value=)operator(()ident(value)operator(\)) + comment(# {{{) + reserved(if) ident(value)operator(.)ident(class)operator(.)ident(superclass) operator(==) constant(Integer) operator(||) ident(value)operator(.)ident(class) operator(==) constant(Float) + ident(value) operator(=) ident(value)operator(.)ident(to_s) + reserved(elsif) ident(value)operator(.)ident(class) operator(!=) constant(String) operator(&&) ident(value) operator(!=) pre_constant(nil) + ident(raise) constant(TypeError)operator(,) string<delimiter(")content(The value of a cookie must be a string, integer, float or nil)delimiter(")>operator(,) ident(caller) + reserved(end) + instance_variable(@value) operator(=) ident(value) + comment(# }}}) + reserved(end) + + comment(# Modifies the maxage of this cookie. This attribute defines the lifetime of) + comment(# the cookie, in seconds. A value of 0 means the cookie should be discarded) + comment(# imediatly. If it set to nil, the cookie will be deleted when the browser) + comment(# will be closed.) + comment(#) + comment(# Attention: This is different from other implementations like PHP, where you) + comment(# gives the seconds since 1/1/1970 0:00:00 GMT.) + comment(#) + comment(# This attribute must be an Integer or Time object or nil.) + reserved(def) method(maxage=)operator(()ident(maxage)operator(\)) + comment(# {{{) + reserved(if) ident(maxage)operator(.)ident(class) operator(==) constant(Time) + ident(maxage) operator(=) ident(maxage) operator(-) constant(Time)operator(.)ident(now) + reserved(elsif) ident(maxage)operator(.)ident(class)operator(.)ident(superclass) operator(==) constant(Integer) operator(||) operator(!)ident(maxage) operator(==) pre_constant(nil) + ident(raise) constant(TypeError)operator(,) string<delimiter(")content(The maxage of a cookie must be an Interger or Time object or nil.)delimiter(")>operator(,) ident(caller) + reserved(end) + instance_variable(@maxage) operator(=) ident(maxage) + comment(# }}}) + reserved(end) + + comment(# Modifies the path value of this cookie. The client will send this cookie) + comment(# only, if the requested document is this directory or a subdirectory of it.) + comment(#) + comment(# The value of the attribute must be a String object or nil.) + reserved(def) method(path=)operator(()ident(path)operator(\)) + comment(# {{{) + reserved(unless) ident(path)operator(.)ident(class) operator(==) constant(String) operator(||) ident(path) operator(==) pre_constant(nil) + ident(raise) constant(TypeError)operator(,) string<delimiter(")content(The path of a cookie must be nil or a string)delimiter(")>operator(,) ident(caller) + reserved(end) + instance_variable(@path) operator(=) ident(path) + comment(# }}}) + reserved(end) + + comment(# Modifies the domain value of this cookie. The client will send this cookie) + comment(# only if it's connected with this domain (or a subdomain, if the first) + comment(# character is a dot like in ".ruby-lang.org"\)) + comment(#) + comment(# The value of this attribute must be a String or nil.) + reserved(def) method(domain=)operator(()ident(domain)operator(\)) + comment(# {{{) + reserved(unless) ident(domain)operator(.)ident(class) operator(==) constant(String) operator(||) ident(domain) operator(==) pre_constant(nil) + ident(raise) constant(TypeError)operator(,) string<delimiter(")content(The domain of a cookie must be a String or nil.)delimiter(")>operator(,) ident(caller) + reserved(end) + instance_variable(@domain) operator(=) ident(domain) + comment(# }}}) + reserved(end) + + comment(# Modifies the secure flag of this cookie. If it's true, the client will only) + comment(# send this cookie if it is secured connected with us.) + comment(#) + comment(# The value od this attribute has to be true or false.) + reserved(def) method(secure=)operator(()ident(secure)operator(\)) + comment(# {{{) + reserved(unless) ident(secure) operator(==) pre_constant(true) operator(||) ident(secure) operator(==) pre_constant(false) + ident(raise) constant(TypeError)operator(,) string<delimiter(")content(The secure field of a cookie must be true or false)delimiter(")>operator(,) ident(caller) + reserved(end) + instance_variable(@secure) operator(=) ident(secure) + comment(# }}}) + reserved(end) + + comment(# Modifies the comment value of this cookie. The comment won't be send, if) + comment(# type is "netscape".) + reserved(def) method(comment=)operator(()ident(comment)operator(\)) + comment(# {{{) + reserved(unless) ident(comment)operator(.)ident(class) operator(==) constant(String) operator(||) ident(comment) operator(==) pre_constant(nil) + ident(raise) constant(TypeError)operator(,) string<delimiter(")content(The comment of a cookie must be a string or nil)delimiter(")>operator(,) ident(caller) + reserved(end) + instance_variable(@comment) operator(=) ident(comment) + comment(# }}}) + reserved(end) + + comment(# Changes the type of all cookies.) + comment(# Allowed values are RFC2109 and netscape (default\).) + reserved(def) constant(Cookie)operator(.)ident(type)operator(=)operator(()ident(type)operator(\)) + comment(# {{{) + reserved(unless) class_variable(@@allowed) + ident(raise) string<delimiter(")content(The cookies are allready send, so you can't change the type anymore.)delimiter(")> + reserved(end) + reserved(unless) ident(type)operator(.)ident(downcase) operator(==) string<delimiter(")content(rfc2109)delimiter(")> operator(&&) ident(type)operator(.)ident(downcase) operator(==) string<delimiter(")content(netscape)delimiter(")> + ident(raise) string<delimiter(")content(The type of the cookies must be )char(\\")content(RFC2109)char(\\")content( or )char(\\")content(netscape)char(\\")content(.)delimiter(")> + reserved(end) + class_variable(@@type) operator(=) ident(type)operator(;) + comment(# }}}) + reserved(end) + + comment(# After sending this message, no cookies can be set or modified. Use it, when) + comment(# HTTP-Headers are send. Rweb does this for you.) + reserved(def) constant(Cookie)operator(.)ident(disallow) + comment(# {{{) + class_variable(@@allowed) operator(=) pre_constant(false) + pre_constant(true) + comment(# }}}) + reserved(end) + + comment(# Returns a HTTP header (type String\) with all cookies. Rweb does this for) + comment(# you.) + reserved(def) constant(Cookie)operator(.)ident(getHttpHeader) + comment(# {{{) + reserved(if) reserved(defined?)operator(()class_variable(@@list)operator(\)) + reserved(if) class_variable(@@type) operator(==) string<delimiter(")content(netscape)delimiter(")> + ident(str) operator(=) string<delimiter(")delimiter(")> + class_variable(@@list)operator(.)ident(each) reserved(do) operator(|)ident(cookie)operator(|) + reserved(if) ident(cookie)operator(.)ident(value) operator(==) pre_constant(nil) + ident(cookie)operator(.)ident(maxage) operator(=) integer(0) + ident(cookie)operator(.)ident(value) operator(=) string<delimiter(")delimiter(")> + reserved(end) + comment(# TODO: Name and value should be escaped!) + ident(str) operator(+=) string<delimiter(")content(Set-Cookie: )inline<delimiter(#{)ident(cookie)operator(.)ident(name)delimiter(})>content(=)inline<delimiter(#{)ident(cookie)operator(.)ident(value)delimiter(})>delimiter(")> + reserved(unless) ident(cookie)operator(.)ident(maxage) operator(==) pre_constant(nil) + ident(expire) operator(=) constant(Time)operator(.)ident(now) operator(+) ident(cookie)operator(.)ident(maxage) + ident(expire)operator(.)ident(gmtime) + ident(str) operator(+=) string<delimiter(")content(; Expire=)inline<delimiter(#{)ident(expire)operator(.)ident(strftime)operator(()string<delimiter(")content(%a, %d-%b-%Y %H:%M:%S %Z)delimiter(")>operator(\))delimiter(})>delimiter(")> + reserved(end) + reserved(unless) ident(cookie)operator(.)ident(domain) operator(==) pre_constant(nil) + ident(str) operator(+=) string<delimiter(")content(; Domain=)inline<delimiter(#{)ident(cookie)operator(.)ident(domain)delimiter(})>delimiter(")> + reserved(end) + reserved(unless) ident(cookie)operator(.)ident(path) operator(==) pre_constant(nil) + ident(str) operator(+=) string<delimiter(")content(; Path=)inline<delimiter(#{)ident(cookie)operator(.)ident(path)delimiter(})>delimiter(")> + reserved(end) + reserved(if) ident(cookie)operator(.)ident(secure) + ident(str) operator(+=) string<delimiter(")content(; Secure)delimiter(")> + reserved(end) + ident(str) operator(+=) string<delimiter(")char(\\r)char(\\n)delimiter(")> + reserved(end) + reserved(return) ident(str) + reserved(else) comment(# type == "RFC2109") + ident(str) operator(=) string<delimiter(")content(Set-Cookie: )delimiter(")> + ident(comma) operator(=) pre_constant(false)operator(;) + + class_variable(@@list)operator(.)ident(each) reserved(do) operator(|)ident(cookie)operator(|) + reserved(if) ident(cookie)operator(.)ident(value) operator(==) pre_constant(nil) + ident(cookie)operator(.)ident(maxage) operator(=) integer(0) + ident(cookie)operator(.)ident(value) operator(=) string<delimiter(")delimiter(")> + reserved(end) + reserved(if) ident(comma) + ident(str) operator(+=) string<delimiter(")content(,)delimiter(")> + reserved(end) + ident(comma) operator(=) pre_constant(true) + + ident(str) operator(+=) string<delimiter(")inline<delimiter(#{)ident(cookie)operator(.)ident(name)delimiter(})>content(=)char(\\")inline<delimiter(#{)ident(cookie)operator(.)ident(value)delimiter(})>char(\\")delimiter(")> + reserved(unless) ident(cookie)operator(.)ident(maxage) operator(==) pre_constant(nil) + ident(str) operator(+=) string<delimiter(")content(; Max-Age=)char(\\")inline<delimiter(#{)ident(cookie)operator(.)ident(maxage)delimiter(})>char(\\")delimiter(")> + reserved(end) + reserved(unless) ident(cookie)operator(.)ident(domain) operator(==) pre_constant(nil) + ident(str) operator(+=) string<delimiter(")content(; Domain=)char(\\")inline<delimiter(#{)ident(cookie)operator(.)ident(domain)delimiter(})>char(\\")delimiter(")> + reserved(end) + reserved(unless) ident(cookie)operator(.)ident(path) operator(==) pre_constant(nil) + ident(str) operator(+=) string<delimiter(")content(; Path=)char(\\")inline<delimiter(#{)ident(cookie)operator(.)ident(path)delimiter(})>char(\\")delimiter(")> + reserved(end) + reserved(if) ident(cookie)operator(.)ident(secure) + ident(str) operator(+=) string<delimiter(")content(; Secure)delimiter(")> + reserved(end) + reserved(unless) ident(cookie)operator(.)ident(comment) operator(==) pre_constant(nil) + ident(str) operator(+=) string<delimiter(")content(; Comment=)char(\\")inline<delimiter(#{)ident(cookie)operator(.)ident(comment)delimiter(})>char(\\")delimiter(")> + reserved(end) + ident(str) operator(+=) string<delimiter(")content(; Version=)char(\\")content(1)char(\\")delimiter(")> + reserved(end) + ident(str) + reserved(end) + reserved(else) + pre_constant(false) + reserved(end) + comment(# }}}) + reserved(end) +reserved(end) + +ident(require) string<delimiter(')content(strscan)delimiter(')> + +reserved(module) class(BBCode) + constant(DEBUG) operator(=) pre_constant(true) + + ident(use) string<delimiter(')content(encoder)delimiter(')>operator(,) string<delimiter(')content(tags)delimiter(')>operator(,) string<delimiter(')content(tagstack)delimiter(')>operator(,) string<delimiter(')content(smileys)delimiter(')> + +comment(=begin + The Parser class takes care of the encoding. + It scans the given BBCode (as plain text\), finds tags + and smilies and also makes links of urls in text. + + Normal text is send directly to the encoder. + + If a tag was found, an instance of a Tag subclass is created + to handle the case. + + The @tagstack manages tag nesting and ensures valid HTML. +=end) + + reserved(class) class(Parser) + reserved(class) class(Attribute) + comment(# flatten and use only one empty_arg) + reserved(def) pre_constant(self)operator(.)ident(create) ident(attr) + ident(attr) operator(=) ident(flatten) ident(attr) + reserved(return) class_variable(@@empty_attr) reserved(if) ident(attr)operator(.)ident(empty?) + ident(new) ident(attr) + reserved(end) + + ident(private_class_method) symbol(:new) + + comment(# remove leading and trailing whitespace; concat lines) + reserved(def) pre_constant(self)operator(.)ident(flatten) ident(attr) + ident(attr)operator(.)ident(strip)operator(.)ident(gsub)operator(()regexp<delimiter(/)char(\\n)delimiter(/)>operator(,) string<delimiter(')content( )delimiter(')>operator(\)) + comment(# -> ^ and $ can only match at begin and end now) + reserved(end) + + constant(ATTRIBUTE_SCAN) operator(=) regexp<delimiter(/)content( + (?!$\) # don't match at end + )char(\\s)content(* + ( # $1 = key + [^=)char(\\s)char(\\])content(")char(\\\\)content(]* + (?: + (?: )char(\\\\)content(. | "[^")char(\\\\)content(]*(?:)char(\\\\)content(.[^")char(\\\\)content(]*\)*"? \) + [^=)char(\\s)char(\\])content(")char(\\\\)content(]* + \)* + \) + (?: + = + ( # $2 = value + [^)char(\\s)char(\\])content(")char(\\\\)content(]* + (?: + (?: )char(\\\\)content(. | "[^")char(\\\\)content(]*(?:)char(\\\\)content(.[^")char(\\\\)content(]*\)*"? \) + [^)char(\\s)char(\\])content(")char(\\\\)content(]* + \)* + \)? + \)? + )char(\\s)content(* + )delimiter(/)modifier(x)> + + reserved(def) pre_constant(self)operator(.)ident(parse) ident(source) + ident(source) operator(=) ident(source)operator(.)ident(dup) + comment(# empty_tag: the tag looks like [... /]) + comment(# slice!: this deletes the \\s*/] at the end) + comment(# \\s+ because [url=http://rubybb.org/forum/] is NOT an empty tag.) + comment(# In RubyBBCode, you can use [url=http://rubybb.org/forum/ /], and this has to be) + comment(# interpreted correctly.) + ident(empty_tag) operator(=) ident(source)operator(.)ident(sub!)operator(()regexp<delimiter(/)content(^:)delimiter(/)>operator(,) string<delimiter(')content(=)delimiter(')>operator(\)) reserved(or) ident(source)operator(.)ident(slice!)operator(()regexp<delimiter(/)char(\\/)content($)delimiter(/)>operator(\)) + ident(debug) string<delimiter(')content(PARSE: )delimiter(')> operator(+) ident(source)operator(.)ident(inspect) operator(+) string<delimiter(')content( => )delimiter(')> operator(+) ident(empty_tag)operator(.)ident(inspect) + comment(#-> we have now an attr that's EITHER empty OR begins and ends with non-whitespace.) + + ident(attr) operator(=) constant(Hash)operator(.)ident(new) + ident(attr)operator([)symbol(:flags)operator(]) operator(=) operator([)operator(]) + ident(source)operator(.)ident(scan)operator(()constant(ATTRIBUTE_SCAN)operator(\)) operator({) operator(|)ident(key)operator(,) ident(value)operator(|) + reserved(if) reserved(not) ident(value) + ident(attr)operator([)symbol(:flags)operator(]) operator(<<) ident(unescape)operator(()ident(key)operator(\)) + reserved(else) + reserved(next) reserved(if) ident(value)operator(.)ident(empty?) reserved(and) ident(key)operator(.)ident(empty?) + ident(attr)operator([)ident(unescape)operator(()ident(key)operator(\))operator(]) operator(=) ident(unescape)operator(()ident(value)operator(\)) + reserved(end) + operator(}) + ident(debug) ident(attr)operator(.)ident(inspect) + + reserved(return) ident(empty_tag)operator(,) ident(attr) + reserved(end) + + reserved(def) pre_constant(self)operator(.)ident(unescape_char) ident(esc) + ident(esc)operator([)integer(1)operator(]) + reserved(end) + + reserved(def) pre_constant(self)operator(.)ident(unquote) ident(qt) + ident(qt)operator([)integer(1)operator(..)integer(-1)operator(])operator(.)ident(chomp)operator(()string<delimiter(')content(")delimiter(')>operator(\))operator(.)ident(gsub)operator(()regexp<delimiter(/)char(\\\\)content(.)delimiter(/)>operator(\)) operator({) operator(|)ident(esc)operator(|) ident(unescape_char) ident(esc) operator(}) + reserved(end) + + reserved(def) pre_constant(self)operator(.)ident(unescape) ident(str) + ident(str)operator(.)ident(gsub)operator(()regexp<delimiter(/)content( ()char(\\\\)content(.\) | (" [^")char(\\\\)content(]* (?:)char(\\\\)content(.[^")char(\\\\)content(]*\)* "?\) )delimiter(/)modifier(x)>operator(\)) operator({) + reserved(if) global_variable($1) + ident(unescape_char) global_variable($1) + reserved(else) + ident(unquote) global_variable($2) + reserved(end) + operator(}) + reserved(end) + + ident(include) constant(Enumerable) + reserved(def) method(each) operator(&)ident(block) + instance_variable(@args)operator(.)ident(each)operator(()operator(&)ident(block)operator(\)) + reserved(end) + + ident(attr_reader) symbol(:source)operator(,) symbol(:args)operator(,) symbol(:value) + + reserved(def) method(initialize) ident(source) + instance_variable(@source) operator(=) ident(source) + ident(debug) string<delimiter(')content(Attribute#new(%p\))delimiter(')> operator(%) ident(source) + instance_variable(@empty_tag)operator(,) instance_variable(@attr) operator(=) constant(Attribute)operator(.)ident(parse) ident(source) + instance_variable(@value) operator(=) instance_variable(@attr)operator([)string<delimiter(')delimiter(')>operator(])operator(.)ident(to_s) + reserved(end) + + reserved(def) method(empty?) + pre_constant(self) operator(==) class_variable(@@empty_attr) + reserved(end) + + reserved(def) method(empty_tag?) + instance_variable(@empty_tag) + reserved(end) + + reserved(def) method([]) operator(*)ident(keys) + ident(res) operator(=) instance_variable(@attr)operator([)operator(*)ident(keys)operator(]) + reserved(end) + + reserved(def) method(flags) + ident(attr)operator([)symbol(:flags)operator(]) + reserved(end) + + reserved(def) method(to_s) + instance_variable(@attr) + reserved(end) + + reserved(def) method(inspect) + string<delimiter(')content(ATTR[)delimiter(')> operator(+) instance_variable(@attr)operator(.)ident(inspect) operator(+) operator(()instance_variable(@empty_tag) operator(?) string<delimiter(')content( | empty tag)delimiter(')> operator(:) string<delimiter(')delimiter(')>operator(\)) operator(+) string<delimiter(')content(])delimiter(')> + reserved(end) + reserved(end) + reserved(class) class(Attribute) + class_variable(@@empty_attr) operator(=) ident(new) string<delimiter(')delimiter(')> + reserved(end) + reserved(end) + + reserved(class) class(Parser) + reserved(def) constant(Parser)operator(.)ident(flatten) ident(str) + comment(# replace mac & dos newlines with unix style) + ident(str)operator(.)ident(gsub)operator(()regexp<delimiter(/)char(\\r)char(\\n)content(?)delimiter(/)>operator(,) string<delimiter(")char(\\n)delimiter(")>operator(\)) + reserved(end) + + reserved(def) method(initialize) ident(input) operator(=) string<delimiter(')delimiter(')> + comment(# input manager) + instance_variable(@scanner) operator(=) constant(StringScanner)operator(.)ident(new) string<delimiter(')delimiter(')> + comment(# output manager) + instance_variable(@encoder) operator(=) constant(Encoder)operator(.)ident(new) + instance_variable(@output) operator(=) string<delimiter(')delimiter(')> + comment(# tag manager) + instance_variable(@tagstack) operator(=) constant(TagStack)operator(.)ident(new)operator(()instance_variable(@encoder)operator(\)) + + instance_variable(@do_magic) operator(=) pre_constant(true) + comment(# set the input) + ident(feed) ident(input) + reserved(end) + + comment(# if you want, you can feed a parser instance after creating,) + comment(# or even feed it repeatedly.) + reserved(def) method(feed) ident(food) + instance_variable(@scanner)operator(.)ident(string) operator(=) constant(Parser)operator(.)ident(flatten) ident(food) + reserved(end) + + comment(# parse through the string using parse_token) + reserved(def) method(parse) + ident(parse_token) reserved(until) instance_variable(@scanner)operator(.)ident(eos?) + instance_variable(@tagstack)operator(.)ident(close_all) + instance_variable(@output) operator(=) ident(parse_magic) instance_variable(@encoder)operator(.)ident(output) + reserved(end) + + reserved(def) method(output) + instance_variable(@output) + reserved(end) + + comment(# ok, internals start here) + ident(private) + comment(# the default output functions. everything should use them or the tags.) + reserved(def) method(add_text) ident(text) operator(=) instance_variable(@scanner)operator(.)ident(matched) + instance_variable(@encoder)operator(.)ident(add_text) ident(text) + reserved(end) + + comment(# use this carefully) + reserved(def) method(add_html) ident(html) + instance_variable(@encoder)operator(.)ident(add_html) ident(html) + reserved(end) + + comment(# highlights the text as error) + reserved(def) method(add_garbage) ident(garbage) + ident(add_html) string<delimiter(')content(<span class="error">)delimiter(')> reserved(if) constant(DEBUG) + ident(add_text) ident(garbage) + ident(add_html) string<delimiter(')content(</span>)delimiter(')> reserved(if) constant(DEBUG) + reserved(end) + + comment(# unknown and incorrectly nested tags are ignored and) + comment(# sent as plaintext (garbage in - garbage out\).) + comment(# in debug mode, garbage is marked with lime background.) + reserved(def) method(garbage_out) ident(start) + instance_variable(@scanner)operator(.)ident(pos) operator(=) ident(start) + ident(garbage) operator(=) instance_variable(@scanner)operator(.)ident(scan)operator(()regexp<delimiter(/)content(.)delimiter(/)modifier(m)>operator(\)) + ident(debug) string<delimiter(')content(GARBAGE: )delimiter(')> operator(+) ident(garbage) + ident(add_garbage) ident(garbage) + reserved(end) + + comment(# simple text; everything but [, \\[ allowed) + constant(SIMPLE_TEXT_SCAN_) operator(=) regexp<delimiter(/)content( + [^)char(\\[)char(\\\\)content(]* # normal* + (?: # ( + )char(\\\\)content(.? # special + [^)char(\\[)char(\\\\)content(]* # normal* + \)* # \)* + )delimiter(/)modifier(mx)> + constant(SIMPLE_TEXT_SCAN) operator(=) regexp<delimiter(/)content([^)char(\\[)content(]+)delimiter(/)> + +comment(=begin + + WHAT IS A TAG? + ============== + + Tags in BBCode can be much more than just a simple [b]. + I use many terms here to differ the parts of each tag. + + Basic scheme: + [ code ] + TAG START TAG INFO TAG END + + Most tags need a second tag to close the range it opened. + This is done with CLOSING TAGS: + [/code] + or by using empty tags that have no content and close themselfes: + [url=winamp.com /] + You surely know this from HTML. + These slashes define the TAG KIND = normal|closing|empty and + cannot be used together. + + Everything between [ and ] and expluding the slashes is called the + TAG INFO. This info may contain: + - TAG ID + - TAG NAME including the tag id + - attributes + + The TAG ID is the first char of the info: + + TAG | ID + ----------+---- + [quote] | q + [±] | & + ["[b]"] | " + [/url] | u + [---] | - + + As you can see, the tag id shows the TAG TYPE, it can be a + normal tag, a formatting tag or an entity. + Therefor, the parser first scans the id to decide how to go + on with parsing. +=end) + comment(# tag) + comment(# TODO more complex expression allowing) + comment(# [quote="[ladico]"] and [quote=\\[ladico\\]] to be correct tags) + constant(TAG_BEGIN_SCAN) operator(=) regexp<delimiter(/)content( + )char(\\[)content( # tag start + ( )char(\\/)content( \)? # $1 = closing tag? + ( [^)char(\\])content(] \) # $2 = tag id + )delimiter(/)modifier(x)> + constant(TAG_END_SCAN) operator(=) regexp<delimiter(/)content( + [^)char(\\])content(]* # rest that was not handled + )char(\\])content(? # tag end + )delimiter(/)modifier(x)> + constant(CLOSE_TAG_SCAN) operator(=) regexp<delimiter(/)content( + ( [^)char(\\])content(]* \) # $1 = the rest of the tag info + ( )char(\\/)content( \)? # $2 = empty tag? + )char(\\])content(? # tag end + )delimiter(/)modifier(x)> + constant(UNCLOSED_TAG_SCAN) operator(=) regexp<delimiter(/)content( )char(\\[)content( )delimiter(/)modifier(x)> + + constant(CLASSIC_TAG_SCAN) operator(=) regexp<delimiter(/)content( [a-z]* )delimiter(/)modifier(ix)> + + constant(SEPARATOR_TAG_SCAN) operator(=) regexp<delimiter(/)content( )char(\\*)content(* )delimiter(/)modifier(x)> + + constant(FORMAT_TAG_SCAN) operator(=) regexp<delimiter(/)content( -- -* )delimiter(/)modifier(x)> + + constant(QUOTED_SCAN) operator(=) regexp<delimiter(/)content( + ( # $1 = quoted text + [^")char(\\\\)content(]* # normal* + (?: # ( + )char(\\\\)content(. # special + [^")char(\\\\)content(]* # normal* + \)* # \)* + \) + "? # end quote " + )delimiter(/)modifier(mx)> + + constant(ENTITY_SCAN) operator(=) regexp<delimiter(/)content( + ( [^;)char(\\])content(]+ \) # $1 = entity code + ;? # optional ending semicolon + )delimiter(/)modifier(ix)> + + constant(SMILEY_SCAN) operator(=) constant(Smileys)operator(::)constant(SMILEY_PATTERN) + + comment(# this is the main parser loop that separates) + comment(# text - everything until "[") + comment(# from) + comment(# tags - starting with "[", ending with "]") + reserved(def) method(parse_token) + reserved(if) instance_variable(@scanner)operator(.)ident(scan)operator(()constant(SIMPLE_TEXT_SCAN)operator(\)) + ident(add_text) + reserved(else) + ident(handle_tag) + reserved(end) + reserved(end) + + reserved(def) method(handle_tag) + ident(tag_start) operator(=) instance_variable(@scanner)operator(.)ident(pos) + + reserved(unless) instance_variable(@scanner)operator(.)ident(scan) constant(TAG_BEGIN_SCAN) + ident(garbage_out) ident(tag_start) + reserved(return) + reserved(end) + + ident(closing)operator(,) ident(id) operator(=) instance_variable(@scanner)operator([)integer(1)operator(])operator(,) instance_variable(@scanner)operator([)integer(2)operator(]) + comment(#debug 'handle_tag(%p\)' % @scanner.matched) + + ident(handled) operator(=) + reserved(case) ident(id) + + reserved(when) regexp<delimiter(/)content([a-z])delimiter(/)modifier(i)> + reserved(if) instance_variable(@scanner)operator(.)ident(scan)operator(()constant(CLASSIC_TAG_SCAN)operator(\)) + reserved(if) ident(handle_classic_tag)operator(()ident(id) operator(+) instance_variable(@scanner)operator(.)ident(matched)operator(,) ident(closing)operator(\)) + ident(already_closed) operator(=) pre_constant(true) + reserved(end) + reserved(end) + + reserved(when) string<delimiter(')content(*)delimiter(')> + reserved(if) instance_variable(@scanner)operator(.)ident(scan)operator(()constant(SEPARATOR_TAG_SCAN)operator(\)) + ident(handle_asterisk) ident(tag_start)operator(,) ident(id) operator(+) instance_variable(@scanner)operator(.)ident(matched) + pre_constant(true) + reserved(end) + + reserved(when) string<delimiter(')content(-)delimiter(')> + reserved(if) instance_variable(@scanner)operator(.)ident(scan)operator(()constant(FORMAT_TAG_SCAN)operator(\)) + comment(#format = id + @scanner.matched) + instance_variable(@encoder)operator(.)ident(add_html) string<delimiter(")char(\\n)content(<hr>)char(\\n)delimiter(")> + pre_constant(true) + reserved(end) + + reserved(when) string<delimiter(')content(")delimiter(')> + reserved(if) instance_variable(@scanner)operator(.)ident(scan)operator(()constant(QUOTED_SCAN)operator(\)) + instance_variable(@encoder)operator(.)ident(add_text) ident(unescape)operator(()instance_variable(@scanner)operator([)integer(1)operator(])operator(\)) + pre_constant(true) + reserved(end) + + reserved(when) string<delimiter(')content(&)delimiter(')> + reserved(if) instance_variable(@scanner)operator(.)ident(scan)operator(()constant(ENTITY_SCAN)operator(\)) + instance_variable(@encoder)operator(.)ident(add_entity) instance_variable(@scanner)operator([)integer(1)operator(]) + pre_constant(true) + reserved(end) + + reserved(when) constant(Smileys)operator(::)constant(SMILEY_START_CHARSET) + instance_variable(@scanner)operator(.)ident(pos) operator(=) instance_variable(@scanner)operator(.)ident(pos) operator(-) integer(1) comment(# (ungetch\)) + reserved(if) instance_variable(@scanner)operator(.)ident(scan)operator(()constant(SMILEY_SCAN)operator(\)) + instance_variable(@encoder)operator(.)ident(add_html) constant(Smileys)operator(.)ident(smiley_to_image)operator(()instance_variable(@scanner)operator(.)ident(matched)operator(\)) + pre_constant(true) + reserved(end) + + reserved(end) comment(# case) + + reserved(return) ident(garbage_out)operator(()ident(tag_start)operator(\)) reserved(unless) ident(handled) + + instance_variable(@scanner)operator(.)ident(scan)operator(()constant(TAG_END_SCAN)operator(\)) reserved(unless) ident(already_closed) + reserved(end) + + constant(ATTRIBUTES_SCAN) operator(=) regexp<delimiter(/)content( + ( + [^)char(\\])content(")char(\\\\)content(]* + (?: + (?: + )char(\\\\)content(. + | + " + [^")char(\\\\)content(]* + (?: + )char(\\\\)content(. + [^")char(\\\\)content(]* + \)* + "? + \) + [^)char(\\])content(")char(\\\\)content(]* + \)* + \) + )char(\\])content(? + )delimiter(/)modifier(x)> + + reserved(def) method(handle_classic_tag) ident(name)operator(,) ident(closing) + ident(debug) string<delimiter(')content(TAG: )delimiter(')> operator(+) operator(()ident(closing) operator(?) string<delimiter(')content(/)delimiter(')> operator(:) string<delimiter(')delimiter(')>operator(\)) operator(+) ident(name) + comment(# flatten) + ident(name)operator(.)ident(downcase!) + ident(tag_class) operator(=) constant(TAG_LIST)operator([)ident(name)operator(]) + reserved(return) reserved(unless) ident(tag_class) + + comment(#debug((opening ? 'OPEN ' : 'CLOSE '\) + tag_class.name\)) + + comment(# create an attribute object to handle it) + instance_variable(@scanner)operator(.)ident(scan)operator(()constant(ATTRIBUTES_SCAN)operator(\)) + comment(#debug name + ':' + @scanner[1]) + ident(attr) operator(=) constant(Attribute)operator(.)ident(create) instance_variable(@scanner)operator([)integer(1)operator(]) + comment(#debug 'ATTRIBUTES %p ' % attr #unless attr.empty?) + + comment(#debug 'closing: %p; name=%s, attr=%p' % [closing, name, attr]) + + comment(# OPEN) + reserved(if) reserved(not) ident(closing) reserved(and) ident(tag) operator(=) instance_variable(@tagstack)operator(.)ident(try_open_class)operator(()ident(tag_class)operator(,) ident(attr)operator(\)) + comment(#debug 'opening') + ident(tag)operator(.)ident(do_open) instance_variable(@scanner) + comment(# this should be done by the tag itself.) + reserved(if) ident(attr)operator(.)ident(empty_tag?) + ident(tag)operator(.)ident(handle_empty) + instance_variable(@tagstack)operator(.)ident(close_tag) + reserved(elsif) ident(tag)operator(.)ident(special_content?) + ident(handle_special_content)operator(()ident(tag)operator(\)) + instance_variable(@tagstack)operator(.)ident(close_tag) + comment(# # ignore asterisks directly after the opening; these are phpBBCode) + comment(# elsif tag.respond_to? :asterisk) + comment(# debug 'SKIP ASTERISKS: ' if @scanner.skip(ASTERISK_TAGS_SCAN\)) + reserved(end) + + comment(# CLOSE) + reserved(elsif) instance_variable(@tagstack)operator(.)ident(try_close_class)operator(()ident(tag_class)operator(\)) + comment(#debug 'closing') + comment(# GARBAGE) + reserved(else) + reserved(return) + reserved(end) + + pre_constant(true) + reserved(end) + + reserved(def) method(handle_asterisk) ident(tag_start)operator(,) ident(stars) + comment(#debug 'ASTERISK: ' + stars.to_s) + comment(# rule for asterisk tags: they belong to the last tag) + comment(# that handles them. tags opened after this tag are closed.) + comment(# if no open tag uses them, all are closed.) + ident(tag) operator(=) instance_variable(@tagstack)operator(.)ident(close_all_until) operator({) operator(|)ident(tag)operator(|) ident(tag)operator(.)ident(respond_to?) symbol(:asterisk) operator(}) + reserved(unless) ident(tag) reserved(and) ident(tag)operator(.)ident(asterisk) ident(stars)operator(,) instance_variable(@scanner) + ident(garbage_out) ident(tag_start) + reserved(end) + reserved(end) + + reserved(def) method(handle_special_content) ident(tag) + ident(scanned) operator(=) instance_variable(@scanner)operator(.)ident(scan_until)operator(()ident(tag)operator(.)ident(closing_tag)operator(\)) + reserved(if) ident(scanned) + ident(scanned)operator(.)ident(slice!)operator(()operator(-)operator(()instance_variable(@scanner)operator(.)ident(matched)operator(.)ident(size)operator(\))operator(..)integer(-1)operator(\)) + reserved(else) + ident(scanned) operator(=) instance_variable(@scanner)operator(.)ident(scan)operator(()regexp<delimiter(/)content(.*)delimiter(/)modifier(m)>operator(\))operator(.)ident(to_s) + reserved(end) + comment(#debug 'SPECIAL CONTENT: ' + scanned) + ident(tag)operator(.)ident(handle_content)operator(()ident(scanned)operator(\)) + reserved(end) + + reserved(def) method(unescape) ident(text) + comment(# input: correctly formatted quoted string (without the quotes\)) + ident(text)operator(.)ident(gsub)operator(()regexp<delimiter(/)char(\\\\)content((?:([")char(\\\\)content(]\)|.\))delimiter(/)>operator(\)) operator({) global_variable($1) reserved(or) global_variable($&) operator(}) + reserved(end) + + + comment(# MAGIC FEAUTURES) + + constant(URL_PATTERN) operator(=) regexp<delimiter(/)content((?:(?:www|ftp\))char(\\.)content(|(?>)char(\\w)content({3,}\):)char(\\/)char(\\/)content(\))char(\\S)content(+)delimiter(/)> + constant(EMAIL_PATTERN) operator(=) regexp<delimiter(/)content((?>[)char(\\w)char(\\-)content(_.]+\)@[)char(\\w)char(\\-)char(\\.)content(]+)char(\\.)char(\\w)content(+)delimiter(/)> + + constant(HAS_MAGIC) operator(=) regexp<delimiter(/)content([&@)inline<delimiter(#{)constant(Smileys)operator(::)constant(SMILEY_START_CHARS)delimiter(})>content(]|(?i:www|ftp\))delimiter(/)> + + constant(MAGIC_PATTERN) operator(=) constant(Regexp)operator(.)ident(new)operator(()string<delimiter(')content(()content(\\W)content(|^\)(%s\))delimiter(')> operator(%) + operator([)constant(Smileys)operator(::)constant(MAGIC_SMILEY_PATTERN)operator(,) constant(URL_PATTERN)operator(,) constant(EMAIL_PATTERN)operator(])operator(.)ident(map) operator({) operator(|)ident(pattern)operator(|) + ident(pattern)operator(.)ident(to_s) + operator(})operator(.)ident(join)operator(()string<delimiter(')content(|)delimiter(')>operator(\)) operator(\)) + + constant(IS_SMILEY_PATTERN) operator(=) constant(Regexp)operator(.)ident(new)operator(()string<delimiter(')content(^%s)delimiter(')> operator(%) constant(Smileys)operator(::)constant(SMILEY_START_CHARSET)operator(.)ident(to_s) operator(\)) + constant(IS_URL_PATTERN) operator(=) regexp<delimiter(/)content(^(?:(?i:www|ftp\))char(\\.)content(|(?>)char(\\w)content(+\):)char(\\/)char(\\/)content(\))delimiter(/)> + constant(URL_STARTS_WITH_PROTOCOL) operator(=) regexp<delimiter(/)content(^)char(\\w)content(+:)char(\\/)char(\\/)delimiter(/)> + constant(IS_EMAIL_PATTERN) operator(=) regexp<delimiter(/)content(^[)char(\\w)char(\\-)content(_.]+@)delimiter(/)> + + reserved(def) method(to_magic) ident(text) + comment(# debug MAGIC_PATTERN.to_s) + ident(text)operator(.)ident(gsub!)operator(()constant(MAGIC_PATTERN)operator(\)) operator({) + ident(magic) operator(=) global_variable($2) + global_variable($1) operator(+) reserved(case) ident(magic) + reserved(when) constant(IS_SMILEY_PATTERN) + constant(Smileys)operator(.)ident(smiley_to_img) ident(magic) + reserved(when) constant(IS_URL_PATTERN) + ident(last) operator(=) ident(magic)operator(.)ident(slice_punctation!) comment(# no punctation in my URL) + ident(href) operator(=) ident(magic) + ident(href)operator(.)ident(insert)operator(()integer(0)operator(,) string<delimiter(')content(http://)delimiter(')>operator(\)) reserved(unless) ident(magic) operator(=)operator(~) constant(URL_STARTS_WITH_PROTOCOL) + string<delimiter(')content(<a href=")delimiter(')> operator(+) ident(href) operator(+) string<delimiter(')content(">)delimiter(')> operator(+) ident(magic) operator(+) string<delimiter(')content(</a>)delimiter(')> operator(+) ident(last) + reserved(when) constant(IS_EMAIL_PATTERN) + ident(last) operator(=) ident(magic)operator(.)ident(slice_punctation!) + string<delimiter(')content(<a href="mailto:)delimiter(')> operator(+) ident(magic) operator(+) string<delimiter(')content(">)delimiter(')> operator(+) ident(magic) operator(+) string<delimiter(')content(</a>)delimiter(')> operator(+) ident(last) + reserved(else) + ident(raise) string<delimiter(')content({{{)delimiter(')> operator(+) ident(magic) operator(+) string<delimiter(')content(}}})delimiter(')> + reserved(end) + operator(}) + ident(text) + reserved(end) + + comment(# handles smileys and urls) + reserved(def) method(parse_magic) ident(html) + reserved(return) ident(html) reserved(unless) instance_variable(@do_magic) + ident(scanner) operator(=) constant(StringScanner)operator(.)ident(new) ident(html) + ident(out) operator(=) string<delimiter(')delimiter(')> + reserved(while) ident(scanner)operator(.)ident(rest?) + reserved(if) ident(scanner)operator(.)ident(scan)operator(()regexp<delimiter(/)content( < (?: a)char(\\s)content( .*? <)char(\\/)content(a> | pre)char(\\W)content( .*? <)char(\\/)content(pre> | [^>]* > \) )delimiter(/)modifier(mx)>operator(\)) + ident(out) operator(<<) ident(scanner)operator(.)ident(matched) + reserved(elsif) ident(scanner)operator(.)ident(scan)operator(()regexp<delimiter(/)content( [^<]+ )delimiter(/)modifier(x)>operator(\)) + ident(out) operator(<<) ident(to_magic)operator(()ident(scanner)operator(.)ident(matched)operator(\)) + + comment(# this should never happen) + reserved(elsif) ident(scanner)operator(.)ident(scan)operator(()regexp<delimiter(/)content(.)delimiter(/)modifier(m)>operator(\)) + ident(raise) string<delimiter(')content(ERROR: else case reached)delimiter(')> + reserved(end) + reserved(end) + ident(out) + reserved(end) + reserved(end) comment(# Parser) +reserved(end) + +reserved(class) class(String) + reserved(def) method(slice_punctation!) + ident(slice!)operator(()regexp<delimiter(/)content([.:,!)char(\\?)content(]+$)delimiter(/)>operator(\))operator(.)ident(to_s) comment(# return '' instead of nil) + reserved(end) +reserved(end) + +comment(#) +comment(# = Grammar) +comment(#) +comment(# An implementation of common algorithms on grammars.) +comment(#) +comment(# This is used by Shinobu, a visualization tool for educating compiler-building.) +comment(#) +comment(# Thanks to Andreas Kunert for his wonderful LR(k\) Pamphlet (German, see http://www.informatik.hu-berlin.de/~kunert/papers/lr-analyse\), and Aho/Sethi/Ullman for their Dragon Book.) +comment(#) +comment(# Homepage:: http://shinobu.cYcnus.de (not existing yet\)) +comment(# Author:: murphy (Kornelius Kalnbach\)) +comment(# Copyright:: (cc\) 2005 cYcnus) +comment(# License:: GPL) +comment(# Version:: 0.2.0 (2005-03-27\)) + +ident(require) string<delimiter(')content(set_hash)delimiter(')> +ident(require) string<delimiter(')content(ctype)delimiter(')> +ident(require) string<delimiter(')content(tools)delimiter(')> +ident(require) string<delimiter(')content(rules)delimiter(')> +ident(require) string<delimiter(')content(trace)delimiter(')> + +ident(require) string<delimiter(')content(first)delimiter(')> +ident(require) string<delimiter(')content(follow)delimiter(')> + +comment(# = Grammar) +comment(#) +comment(# == Syntax) +comment(#) +comment(# === Rules) +comment(#) +comment(# Each line is a rule.) +comment(# The syntax is) +comment(#) +comment(# left - right) +comment(#) +comment(# where +left+ and +right+ can be uppercase and lowercase letters,) +comment(# and <code>-</code> can be any combination of <, >, - or whitespace.) +comment(#) +comment(# === Symbols) +comment(#) +comment(# Uppercase letters stand for meta symbols, lowercase for terminals.) +comment(#) +comment(# You can make epsilon-derivations by leaving <code><right></code> empty.) +comment(#) +comment(# === Example) +comment(# S - Ac) +comment(# A - Sc) +comment(# A - b) +comment(# A -) +reserved(class) class(Grammar) + + ident(attr_reader) symbol(:tracer) + comment(# Creates a new Grammar.) + comment(# If $trace is true, the algorithms explain (textual\) what they do to $stdout.) + reserved(def) method(initialize) ident(data)operator(,) ident(tracer) operator(=) constant(Tracer)operator(.)ident(new) + instance_variable(@tracer) operator(=) ident(tracer) + instance_variable(@rules) operator(=) constant(Rules)operator(.)ident(new) + instance_variable(@terminals)operator(,) instance_variable(@meta_symbols) operator(=) constant(SortedSet)operator(.)ident(new)operator(,) constant(Array)operator(.)ident(new) + instance_variable(@start_symbol) operator(=) pre_constant(nil) + ident(add_rules) ident(data) + reserved(end) + + ident(attr_reader) symbol(:meta_symbols)operator(,) symbol(:terminals)operator(,) symbol(:rules)operator(,) symbol(:start_symbol) + + ident(alias_method) symbol(:sigma)operator(,) symbol(:terminals) + ident(alias_method) symbol(:alphabet)operator(,) symbol(:terminals) + ident(alias_method) symbol(:variables)operator(,) symbol(:meta_symbols) + ident(alias_method) symbol(:nonterminals)operator(,) symbol(:meta_symbols) + + comment(# A string representation of the grammar for debugging.) + reserved(def) method(inspect) ident(productions_too) operator(=) pre_constant(false) + string<delimiter(')content(Grammar(meta symbols: %s; alphabet: %s; productions: [%s]; start symbol: %s\))delimiter(')> operator(%) + operator([) + ident(meta_symbols)operator(.)ident(join)operator(()string<delimiter(')content(, )delimiter(')>operator(\))operator(,) + ident(terminals)operator(.)ident(join)operator(()string<delimiter(')content(, )delimiter(')>operator(\))operator(,) + reserved(if) ident(productions_too) + instance_variable(@rules)operator(.)ident(inspect) + reserved(else) + instance_variable(@rules)operator(.)ident(size) + reserved(end)operator(,) + ident(start_symbol) + operator(]) + reserved(end) + + comment(# Add rules to the grammar. +rules+ should be a String or respond to +scan+ in a similar way.) + comment(#) + comment(# Syntax: see Grammar.) + reserved(def) method(add_rules) ident(grammar) + instance_variable(@rules) operator(=) constant(Rules)operator(.)ident(parse) ident(grammar) reserved(do) operator(|)ident(rule)operator(|) + instance_variable(@start_symbol) operator(||=) ident(rule)operator(.)ident(left) + instance_variable(@meta_symbols) operator(<<) ident(rule)operator(.)ident(left) + instance_variable(@terminals)operator(.)ident(merge) ident(rule)operator(.)ident(right)operator(.)ident(split)operator(()string<delimiter(')delimiter(')>operator(\))operator(.)ident(select) operator({) operator(|)ident(s)operator(|) ident(terminal?) ident(s) operator(}) + reserved(end) + instance_variable(@meta_symbols)operator(.)ident(uniq!) + ident(update) + reserved(end) + + comment(# Returns a hash acting as FIRST operator, so that) + comment(# <code>first["ABC"]</code> is FIRST(ABC\).) + comment(# See http://en.wikipedia.org/wiki/LL_parser "Constructing an LL(1\) parsing table" for details.) + reserved(def) method(first) + ident(first_operator) + reserved(end) + + comment(# Returns a hash acting as FOLLOW operator, so that) + comment(# <code>first["A"]</code> is FOLLOW(A\).) + comment(# See http://en.wikipedia.org/wiki/LL_parser "Constructing an LL(1\) parsing table" for details.) + reserved(def) method(follow) + ident(follow_operator) + reserved(end) + + constant(LLError) operator(=) constant(Class)operator(.)ident(new)operator(()constant(Exception)operator(\)) + constant(LLErrorType1) operator(=) constant(Class)operator(.)ident(new)operator(()constant(LLError)operator(\)) + constant(LLErrorType2) operator(=) constant(Class)operator(.)ident(new)operator(()constant(LLError)operator(\)) + + comment(# Tests if the grammar is LL(1\).) + reserved(def) method(ll1?) + reserved(begin) + reserved(for) ident(meta) reserved(in) instance_variable(@meta_symbols) + ident(first_sets) operator(=) instance_variable(@rules)operator([)ident(meta)operator(])operator(.)ident(map) operator({) operator(|)ident(alpha)operator(|) ident(first)operator([)ident(alpha)operator(]) operator(}) + ident(first_sets)operator(.)ident(inject)operator(()constant(Set)operator([)operator(])operator(\)) reserved(do) operator(|)ident(already_used)operator(,) ident(another_first_set)operator(|) + reserved(unless) ident(already_used)operator(.)ident(disjoint?) ident(another_first_set) + ident(raise) constant(LLErrorType1) + reserved(end) + ident(already_used)operator(.)ident(merge) ident(another_first_set) + reserved(end) + + reserved(if) ident(first)operator([)ident(meta)operator(])operator(.)ident(include?) constant(EPSILON) reserved(and) reserved(not) ident(first)operator([)ident(meta)operator(])operator(.)ident(disjoint?) ident(follow)operator([)ident(meta)operator(]) + ident(raise) constant(LLErrorType2) + reserved(end) + reserved(end) + reserved(rescue) constant(LLError) + pre_constant(false) + reserved(else) + pre_constant(true) + reserved(end) + reserved(end) + +ident(private) + + reserved(def) method(first_operator) + instance_variable(@first) operator(||=) constant(FirstOperator)operator(.)ident(new) pre_constant(self) + reserved(end) + + reserved(def) method(follow_operator) + instance_variable(@follow) operator(||=) constant(FollowOperator)operator(.)ident(new) pre_constant(self) + reserved(end) + + reserved(def) method(update) + instance_variable(@first) operator(=) instance_variable(@follow) operator(=) pre_constant(nil) + reserved(end) + +reserved(end) + +reserved(if) global_variable($0) operator(==) pre_constant(__FILE__) + ident(eval) pre_constant(DATA)operator(.)ident(read)operator(,) pre_constant(nil)operator(,) global_variable($0)operator(,) pre_constant(__LINE__)integer(+4) +reserved(end) + +ident(require) string<delimiter(')content(test/unit)delimiter(')> + +reserved(class) class(TestCaseGrammar) operator(<) constant(Test)operator(::)constant(Unit)operator(::)constant(TestCase) + + ident(include) constant(Grammar)operator(::)constant(Symbols) + + reserved(def) method(fifo) ident(s) + constant(Set)operator([)operator(*)ident(s)operator(.)ident(split)operator(()string<delimiter(')delimiter(')>operator(\))operator(]) + reserved(end) + + reserved(def) method(test_fifo) + ident(assert_equal) constant(Set)operator([)operator(])operator(,) ident(fifo)operator(()string<delimiter(')delimiter(')>operator(\)) + ident(assert_equal) constant(Set)operator([)constant(EPSILON)operator(,) constant(END_OF_INPUT)operator(,) string<delimiter(')content(x)delimiter(')>operator(,) string<delimiter(')content(Y)delimiter(')>operator(])operator(,) ident(fifo)operator(()string<delimiter(')content(?xY$)delimiter(')>operator(\)) + reserved(end) + + constant(TEST_GRAMMAR_1) operator(=) string<delimiter(<<-EOG)>string<content( +S - ABCD +A - a +A - +B - b +B - +C - c +C - +D - S +D -)delimiter( + EOG)> + + reserved(def) method(test_symbols) + ident(assert) constant(EPSILON) + ident(assert) constant(END_OF_INPUT) + reserved(end) + + reserved(def) method(test_first_1) + ident(g) operator(=) constant(Grammar)operator(.)ident(new) constant(TEST_GRAMMAR_1) + + ident(f) operator(=) pre_constant(nil) + ident(assert_nothing_raised) operator({) ident(f) operator(=) ident(g)operator(.)ident(first) operator(}) + ident(assert_equal)operator(()constant(Set)operator([)string<delimiter(')content(a)delimiter(')>operator(,) constant(EPSILON)operator(])operator(,) ident(f)operator([)string<delimiter(')content(A)delimiter(')>operator(])operator(\)) + ident(assert_equal)operator(()constant(Set)operator([)string<delimiter(')content(b)delimiter(')>operator(,) constant(EPSILON)operator(])operator(,) ident(f)operator([)string<delimiter(')content(B)delimiter(')>operator(])operator(\)) + ident(assert_equal)operator(()constant(Set)operator([)string<delimiter(')content(c)delimiter(')>operator(,) constant(EPSILON)operator(])operator(,) ident(f)operator([)string<delimiter(')content(C)delimiter(')>operator(])operator(\)) + ident(assert_equal)operator(()constant(Set)operator([)string<delimiter(')content(a)delimiter(')>operator(,) string<delimiter(')content(b)delimiter(')>operator(,) string<delimiter(')content(c)delimiter(')>operator(,) constant(EPSILON)operator(])operator(,) ident(f)operator([)string<delimiter(')content(D)delimiter(')>operator(])operator(\)) + ident(assert_equal)operator(()ident(f)operator([)string<delimiter(')content(D)delimiter(')>operator(])operator(,) ident(f)operator([)string<delimiter(')content(S)delimiter(')>operator(])operator(\)) + reserved(end) + + reserved(def) method(test_follow_1) + ident(g) operator(=) constant(Grammar)operator(.)ident(new) constant(TEST_GRAMMAR_1) + + ident(f) operator(=) pre_constant(nil) + ident(assert_nothing_raised) operator({) ident(f) operator(=) ident(g)operator(.)ident(follow) operator(}) + ident(assert_equal)operator(()constant(Set)operator([)string<delimiter(')content(a)delimiter(')>operator(,) string<delimiter(')content(b)delimiter(')>operator(,) string<delimiter(')content(c)delimiter(')>operator(,) constant(END_OF_INPUT)operator(])operator(,) ident(f)operator([)string<delimiter(')content(A)delimiter(')>operator(])operator(\)) + ident(assert_equal)operator(()constant(Set)operator([)string<delimiter(')content(a)delimiter(')>operator(,) string<delimiter(')content(b)delimiter(')>operator(,) string<delimiter(')content(c)delimiter(')>operator(,) constant(END_OF_INPUT)operator(])operator(,) ident(f)operator([)string<delimiter(')content(B)delimiter(')>operator(])operator(\)) + ident(assert_equal)operator(()constant(Set)operator([)string<delimiter(')content(a)delimiter(')>operator(,) string<delimiter(')content(b)delimiter(')>operator(,) string<delimiter(')content(c)delimiter(')>operator(,) constant(END_OF_INPUT)operator(])operator(,) ident(f)operator([)string<delimiter(')content(C)delimiter(')>operator(])operator(\)) + ident(assert_equal)operator(()constant(Set)operator([)constant(END_OF_INPUT)operator(])operator(,) ident(f)operator([)string<delimiter(')content(D)delimiter(')>operator(])operator(\)) + ident(assert_equal)operator(()constant(Set)operator([)constant(END_OF_INPUT)operator(])operator(,) ident(f)operator([)string<delimiter(')content(S)delimiter(')>operator(])operator(\)) + reserved(end) + + + constant(TEST_GRAMMAR_2) operator(=) string<delimiter(<<-EOG)>string<content( +S - Ed +E - EpT +E - EmT +E - T +T - TuF +T - TdF +T - F +F - i +F - n +F - aEz)delimiter( + EOG)> + + reserved(def) method(test_first_2) + ident(g) operator(=) constant(Grammar)operator(.)ident(new) constant(TEST_GRAMMAR_2) + + ident(f) operator(=) pre_constant(nil) + ident(assert_nothing_raised) operator({) ident(f) operator(=) ident(g)operator(.)ident(first) operator(}) + ident(assert_equal)operator(()constant(Set)operator([)string<delimiter(')content(a)delimiter(')>operator(,) string<delimiter(')content(n)delimiter(')>operator(,) string<delimiter(')content(i)delimiter(')>operator(])operator(,) ident(f)operator([)string<delimiter(')content(E)delimiter(')>operator(])operator(\)) + ident(assert_equal)operator(()constant(Set)operator([)string<delimiter(')content(a)delimiter(')>operator(,) string<delimiter(')content(n)delimiter(')>operator(,) string<delimiter(')content(i)delimiter(')>operator(])operator(,) ident(f)operator([)string<delimiter(')content(F)delimiter(')>operator(])operator(\)) + ident(assert_equal)operator(()constant(Set)operator([)string<delimiter(')content(a)delimiter(')>operator(,) string<delimiter(')content(n)delimiter(')>operator(,) string<delimiter(')content(i)delimiter(')>operator(])operator(,) ident(f)operator([)string<delimiter(')content(T)delimiter(')>operator(])operator(\)) + ident(assert_equal)operator(()constant(Set)operator([)string<delimiter(')content(a)delimiter(')>operator(,) string<delimiter(')content(n)delimiter(')>operator(,) string<delimiter(')content(i)delimiter(')>operator(])operator(,) ident(f)operator([)string<delimiter(')content(S)delimiter(')>operator(])operator(\)) + reserved(end) + + reserved(def) method(test_follow_2) + ident(g) operator(=) constant(Grammar)operator(.)ident(new) constant(TEST_GRAMMAR_2) + + ident(f) operator(=) pre_constant(nil) + ident(assert_nothing_raised) operator({) ident(f) operator(=) ident(g)operator(.)ident(follow) operator(}) + ident(assert_equal)operator(()constant(Set)operator([)string<delimiter(')content(m)delimiter(')>operator(,) string<delimiter(')content(d)delimiter(')>operator(,) string<delimiter(')content(z)delimiter(')>operator(,) string<delimiter(')content(p)delimiter(')>operator(])operator(,) ident(f)operator([)string<delimiter(')content(E)delimiter(')>operator(])operator(\)) + ident(assert_equal)operator(()constant(Set)operator([)string<delimiter(')content(m)delimiter(')>operator(,) string<delimiter(')content(d)delimiter(')>operator(,) string<delimiter(')content(z)delimiter(')>operator(,) string<delimiter(')content(p)delimiter(')>operator(,) string<delimiter(')content(u)delimiter(')>operator(])operator(,) ident(f)operator([)string<delimiter(')content(F)delimiter(')>operator(])operator(\)) + ident(assert_equal)operator(()constant(Set)operator([)string<delimiter(')content(m)delimiter(')>operator(,) string<delimiter(')content(d)delimiter(')>operator(,) string<delimiter(')content(z)delimiter(')>operator(,) string<delimiter(')content(p)delimiter(')>operator(,) string<delimiter(')content(u)delimiter(')>operator(])operator(,) ident(f)operator([)string<delimiter(')content(T)delimiter(')>operator(])operator(\)) + ident(assert_equal)operator(()constant(Set)operator([)constant(END_OF_INPUT)operator(])operator(,) ident(f)operator([)string<delimiter(')content(S)delimiter(')>operator(])operator(\)) + reserved(end) + + constant(LLError) operator(=) constant(Grammar)operator(::)constant(LLError) + + constant(TEST_GRAMMAR_3) operator(=) string<delimiter(<<-EOG)>string<content( +E - TD +D - pTD +D - +T - FS +S - uFS +S - +S - p +F - aEz +F - i)delimiter( + EOG)> + + constant(NoError) operator(=) constant(Class)operator(.)ident(new)operator(()constant(Exception)operator(\)) + + reserved(def) method(test_first_3) + ident(g) operator(=) constant(Grammar)operator(.)ident(new) constant(TEST_GRAMMAR_3) + + comment(# Grammar 3 is LL(1\), so all first-sets must be disjoint.) + ident(f) operator(=) pre_constant(nil) + ident(assert_nothing_raised) operator({) ident(f) operator(=) ident(g)operator(.)ident(first) operator(}) + ident(assert_equal)operator(()constant(Set)operator([)string<delimiter(')content(a)delimiter(')>operator(,) string<delimiter(')content(i)delimiter(')>operator(])operator(,) ident(f)operator([)string<delimiter(')content(E)delimiter(')>operator(])operator(\)) + ident(assert_equal)operator(()constant(Set)operator([)constant(EPSILON)operator(,) string<delimiter(')content(p)delimiter(')>operator(])operator(,) ident(f)operator([)string<delimiter(')content(D)delimiter(')>operator(])operator(\)) + ident(assert_equal)operator(()constant(Set)operator([)string<delimiter(')content(a)delimiter(')>operator(,) string<delimiter(')content(i)delimiter(')>operator(])operator(,) ident(f)operator([)string<delimiter(')content(F)delimiter(')>operator(])operator(\)) + ident(assert_equal)operator(()constant(Set)operator([)string<delimiter(')content(a)delimiter(')>operator(,) string<delimiter(')content(i)delimiter(')>operator(])operator(,) ident(f)operator([)string<delimiter(')content(T)delimiter(')>operator(])operator(\)) + ident(assert_equal)operator(()constant(Set)operator([)constant(EPSILON)operator(,) string<delimiter(')content(u)delimiter(')>operator(,) string<delimiter(')content(p)delimiter(')>operator(])operator(,) ident(f)operator([)string<delimiter(')content(S)delimiter(')>operator(])operator(\)) + reserved(for) ident(m) reserved(in) ident(g)operator(.)ident(meta_symbols) + ident(r) operator(=) ident(g)operator(.)ident(rules)operator([)ident(m)operator(]) + ident(firsts) operator(=) ident(r)operator(.)ident(map) operator({) operator(|)ident(x)operator(|) ident(f)operator([)ident(x)operator(]) operator(})operator(.)ident(to_set) + ident(assert_nothing_raised) reserved(do) + ident(firsts)operator(.)ident(inject)operator(()constant(Set)operator(.)ident(new)operator(\)) reserved(do) operator(|)ident(already_used)operator(,) ident(another_first_set)operator(|) + ident(raise) constant(LLError)operator(,) string<delimiter(')content(not disjoint!)delimiter(')> reserved(unless) ident(already_used)operator(.)ident(disjoint?) ident(another_first_set) + ident(already_used)operator(.)ident(merge) ident(another_first_set) + reserved(end) + reserved(end) + reserved(end) + reserved(end) + + reserved(def) method(test_follow_3) + ident(g) operator(=) constant(Grammar)operator(.)ident(new) constant(TEST_GRAMMAR_3) + + comment(# Grammar 3 is not LL(1\), because epsilon is in FIRST(S\),) + comment(# but FIRST(S\) and FOLLOW(S\) are not disjoint.) + ident(f) operator(=) pre_constant(nil) + ident(assert_nothing_raised) operator({) ident(f) operator(=) ident(g)operator(.)ident(follow) operator(}) + ident(assert_equal)operator(()constant(Set)operator([)string<delimiter(')content(z)delimiter(')>operator(,) constant(END_OF_INPUT)operator(])operator(,) ident(f)operator([)string<delimiter(')content(E)delimiter(')>operator(])operator(\)) + ident(assert_equal)operator(()constant(Set)operator([)string<delimiter(')content(z)delimiter(')>operator(,) constant(END_OF_INPUT)operator(])operator(,) ident(f)operator([)string<delimiter(')content(D)delimiter(')>operator(])operator(\)) + ident(assert_equal)operator(()constant(Set)operator([)string<delimiter(')content(z)delimiter(')>operator(,) string<delimiter(')content(p)delimiter(')>operator(,) string<delimiter(')content(u)delimiter(')>operator(,) constant(END_OF_INPUT)operator(])operator(,) ident(f)operator([)string<delimiter(')content(F)delimiter(')>operator(])operator(\)) + ident(assert_equal)operator(()constant(Set)operator([)string<delimiter(')content(p)delimiter(')>operator(,) string<delimiter(')content(z)delimiter(')>operator(,) constant(END_OF_INPUT)operator(])operator(,) ident(f)operator([)string<delimiter(')content(T)delimiter(')>operator(])operator(\)) + ident(assert_equal)operator(()constant(Set)operator([)string<delimiter(')content(p)delimiter(')>operator(,) string<delimiter(')content(z)delimiter(')>operator(,) constant(END_OF_INPUT)operator(])operator(,) ident(f)operator([)string<delimiter(')content(S)delimiter(')>operator(])operator(\)) + reserved(for) ident(m) reserved(in) ident(g)operator(.)ident(meta_symbols) + ident(first_m) operator(=) ident(g)operator(.)ident(first)operator([)ident(m)operator(]) + reserved(next) reserved(unless) ident(first_m)operator(.)ident(include?) constant(EPSILON) + ident(assert_raise)operator(()ident(m) operator(==) string<delimiter(')content(S)delimiter(')> operator(?) constant(LLError) operator(:) constant(NoError)operator(\)) reserved(do) + reserved(if) ident(first_m)operator(.)ident(disjoint?) ident(f)operator([)ident(m)operator(]) + ident(raise) constant(NoError) comment(# this is fun :D) + reserved(else) + ident(raise) constant(LLError) + reserved(end) + reserved(end) + reserved(end) + reserved(end) + + constant(TEST_GRAMMAR_3b) operator(=) string<delimiter(<<-EOG)>string<content( +E - TD +D - pTD +D - PTD +D - +T - FS +S - uFS +S - +F - aEz +F - i +P - p)delimiter( + EOG)> + + reserved(def) method(test_first_3b) + ident(g) operator(=) constant(Grammar)operator(.)ident(new) constant(TEST_GRAMMAR_3b) + + comment(# Grammar 3b is NOT LL(1\), since not all first-sets are disjoint.) + ident(f) operator(=) pre_constant(nil) + ident(assert_nothing_raised) operator({) ident(f) operator(=) ident(g)operator(.)ident(first) operator(}) + ident(assert_equal)operator(()constant(Set)operator([)string<delimiter(')content(a)delimiter(')>operator(,) string<delimiter(')content(i)delimiter(')>operator(])operator(,) ident(f)operator([)string<delimiter(')content(E)delimiter(')>operator(])operator(\)) + ident(assert_equal)operator(()constant(Set)operator([)constant(EPSILON)operator(,) string<delimiter(')content(p)delimiter(')>operator(])operator(,) ident(f)operator([)string<delimiter(')content(D)delimiter(')>operator(])operator(\)) + ident(assert_equal)operator(()constant(Set)operator([)string<delimiter(')content(p)delimiter(')>operator(])operator(,) ident(f)operator([)string<delimiter(')content(P)delimiter(')>operator(])operator(\)) + ident(assert_equal)operator(()constant(Set)operator([)string<delimiter(')content(a)delimiter(')>operator(,) string<delimiter(')content(i)delimiter(')>operator(])operator(,) ident(f)operator([)string<delimiter(')content(F)delimiter(')>operator(])operator(\)) + ident(assert_equal)operator(()constant(Set)operator([)string<delimiter(')content(a)delimiter(')>operator(,) string<delimiter(')content(i)delimiter(')>operator(])operator(,) ident(f)operator([)string<delimiter(')content(T)delimiter(')>operator(])operator(\)) + ident(assert_equal)operator(()constant(Set)operator([)constant(EPSILON)operator(,) string<delimiter(')content(u)delimiter(')>operator(])operator(,) ident(f)operator([)string<delimiter(')content(S)delimiter(')>operator(])operator(\)) + reserved(for) ident(m) reserved(in) ident(g)operator(.)ident(meta_symbols) + ident(r) operator(=) ident(g)operator(.)ident(rules)operator([)ident(m)operator(]) + ident(firsts) operator(=) ident(r)operator(.)ident(map) operator({) operator(|)ident(x)operator(|) ident(f)operator([)ident(x)operator(]) operator(}) + ident(assert_raise)operator(()ident(m) operator(==) string<delimiter(')content(D)delimiter(')> operator(?) constant(LLError) operator(:) constant(NoError)operator(\)) reserved(do) + ident(firsts)operator(.)ident(inject)operator(()constant(Set)operator(.)ident(new)operator(\)) reserved(do) operator(|)ident(already_used)operator(,) ident(another_first_set)operator(|) + ident(raise) constant(LLError)operator(,) string<delimiter(')content(not disjoint!)delimiter(')> reserved(unless) ident(already_used)operator(.)ident(disjoint?) ident(another_first_set) + ident(already_used)operator(.)ident(merge) ident(another_first_set) + reserved(end) + ident(raise) constant(NoError) + reserved(end) + reserved(end) + reserved(end) + + reserved(def) method(test_follow_3b) + ident(g) operator(=) constant(Grammar)operator(.)ident(new) constant(TEST_GRAMMAR_3b) + + comment(# Although Grammar 3b is NOT LL(1\), the FOLLOW-condition is satisfied.) + ident(f) operator(=) pre_constant(nil) + ident(assert_nothing_raised) operator({) ident(f) operator(=) ident(g)operator(.)ident(follow) operator(}) + ident(assert_equal)operator(()ident(fifo)operator(()string<delimiter(')content(z$)delimiter(')>operator(\))operator(,) ident(f)operator([)string<delimiter(')content(E)delimiter(')>operator(])operator(,) string<delimiter(')content(E)delimiter(')>operator(\)) + ident(assert_equal)operator(()ident(fifo)operator(()string<delimiter(')content(z$)delimiter(')>operator(\))operator(,) ident(f)operator([)string<delimiter(')content(D)delimiter(')>operator(])operator(,) string<delimiter(')content(D)delimiter(')>operator(\)) + ident(assert_equal)operator(()ident(fifo)operator(()string<delimiter(')content(ai)delimiter(')>operator(\))operator(,) ident(f)operator([)string<delimiter(')content(P)delimiter(')>operator(])operator(,) string<delimiter(')content(P)delimiter(')>operator(\)) + ident(assert_equal)operator(()ident(fifo)operator(()string<delimiter(')content(z$pu)delimiter(')>operator(\))operator(,) ident(f)operator([)string<delimiter(')content(F)delimiter(')>operator(])operator(,) string<delimiter(')content(F)delimiter(')>operator(\)) + ident(assert_equal)operator(()ident(fifo)operator(()string<delimiter(')content(z$p)delimiter(')>operator(\))operator(,) ident(f)operator([)string<delimiter(')content(T)delimiter(')>operator(])operator(,) string<delimiter(')content(T)delimiter(')>operator(\)) + ident(assert_equal)operator(()ident(fifo)operator(()string<delimiter(')content(z$p)delimiter(')>operator(\))operator(,) ident(f)operator([)string<delimiter(')content(S)delimiter(')>operator(])operator(,) string<delimiter(')content(S)delimiter(')>operator(\)) + reserved(for) ident(m) reserved(in) ident(g)operator(.)ident(meta_symbols) + ident(first_m) operator(=) ident(g)operator(.)ident(first)operator([)ident(m)operator(]) + reserved(next) reserved(unless) ident(first_m)operator(.)ident(include?) constant(EPSILON) + ident(assert_raise)operator(()constant(NoError)operator(\)) reserved(do) + reserved(if) ident(first_m)operator(.)ident(disjoint?) ident(f)operator([)ident(m)operator(]) + ident(raise) constant(NoError) comment(# this is fun :D) + reserved(else) + ident(raise) constant(LLError) + reserved(end) + reserved(end) + reserved(end) + reserved(end) + + reserved(def) method(test_ll1?) + ident(assert_equal) pre_constant(false)operator(,) constant(Grammar)operator(.)ident(new)operator(()constant(TEST_GRAMMAR_3)operator(\))operator(.)ident(ll1?)operator(,) string<delimiter(')content(Grammar 3)delimiter(')> + ident(assert_equal) pre_constant(false)operator(,) constant(Grammar)operator(.)ident(new)operator(()constant(TEST_GRAMMAR_3b)operator(\))operator(.)ident(ll1?)operator(,) string<delimiter(')content(Grammar 3b)delimiter(')> + reserved(end) + + reserved(def) method(test_new) + ident(assert_nothing_raised) operator({) constant(Grammar)operator(.)ident(new) string<delimiter(')delimiter(')> operator(}) + ident(assert_nothing_raised) operator({) constant(Grammar)operator(.)ident(new) constant(TEST_GRAMMAR_1) operator(}) + ident(assert_nothing_raised) operator({) constant(Grammar)operator(.)ident(new) constant(TEST_GRAMMAR_2) operator(}) + ident(assert_nothing_raised) operator({) constant(Grammar)operator(.)ident(new) constant(TEST_GRAMMAR_3) operator(}) + ident(assert_nothing_raised) operator({) constant(Grammar)operator(.)ident(new) constant(TEST_GRAMMAR_1) operator(+) constant(TEST_GRAMMAR_2) operator(+) constant(TEST_GRAMMAR_3) operator(}) + ident(assert_raise)operator(()constant(ArgumentError)operator(\)) operator({) constant(Grammar)operator(.)ident(new) string<delimiter(')content(S - ?)delimiter(')> operator(}) + reserved(end) +reserved(end) + +comment(# vim:foldmethod=syntax) + +comment(#!/usr/bin/env ruby) + +ident(require) string<delimiter(')content(fox12)delimiter(')> + +ident(include) constant(Fox) + +reserved(class) class(Window) operator(<) constant(FXMainWindow) + reserved(def) method(initialize)operator(()ident(app)operator(\)) + reserved(super)operator(()ident(app)operator(,) ident(app)operator(.)ident(appName) operator(+) string<delimiter(")content(: First Set Calculation)delimiter(")>operator(,) pre_constant(nil)operator(,) pre_constant(nil)operator(,) constant(DECOR_ALL)operator(,) integer(0)operator(,) integer(0)operator(,) integer(800)operator(,) integer(600)operator(,) integer(0)operator(,) integer(0)operator(\)) + + comment(# {{{ menubar) + ident(menubar) operator(=) constant(FXMenuBar)operator(.)ident(new)operator(()pre_constant(self)operator(,) constant(LAYOUT_SIDE_TOP)operator(|)constant(LAYOUT_FILL_X)operator(\)) + + ident(filemenu) operator(=) constant(FXMenuPane)operator(.)ident(new)operator(()pre_constant(self)operator(\)) + + constant(FXMenuCommand)operator(.)ident(new)operator(()ident(filemenu)operator(,) string<delimiter(")content(&Start)char(\\t)content(Ctl-S)char(\\t)content(Start the application.)delimiter(")>operator(,) pre_constant(nil)operator(,) ident(getApp)operator(()operator(\))operator(\))operator(.)ident(connect)operator(()constant(SEL_COMMAND)operator(,) ident(method)operator(()symbol(:start)operator(\))operator(\)) + constant(FXMenuCommand)operator(.)ident(new)operator(()ident(filemenu)operator(,) string<delimiter(")content(&Quit)char(\\t)content(Alt-F4)char(\\t)content(Quit the application.)delimiter(")>operator(,) pre_constant(nil)operator(,) ident(getApp)operator(()operator(\))operator(,) constant(FXApp)operator(::)constant(ID_QUIT)operator(\)) + constant(FXMenuTitle)operator(.)ident(new)operator(()ident(menubar)operator(,) string<delimiter(")content(&File)delimiter(")>operator(,) pre_constant(nil)operator(,) ident(filemenu)operator(\)) + comment(# }}} menubar) + + comment(# {{{ statusbar) + instance_variable(@statusbar) operator(=) constant(FXStatusBar)operator(.)ident(new)operator(()pre_constant(self)operator(,) constant(LAYOUT_SIDE_BOTTOM)operator(|)constant(LAYOUT_FILL_X)operator(|)constant(STATUSBAR_WITH_DRAGCORNER)operator(\)) + comment(# }}} statusbar) + + comment(# {{{ window content) + ident(horizontalsplitt) operator(=) constant(FXSplitter)operator(.)ident(new)operator(()pre_constant(self)operator(,) constant(SPLITTER_VERTICAL)operator(|)constant(LAYOUT_SIDE_TOP)operator(|)constant(LAYOUT_FILL)operator(\)) + + + instance_variable(@productions) operator(=) constant(FXList)operator(.)ident(new)operator(()ident(horizontalsplitt)operator(,) pre_constant(nil)operator(,) integer(0)operator(,) constant(LAYOUT_SIDE_TOP)operator(|)constant(LAYOUT_FILL_X)operator(|)constant(LAYOUT_FIX_HEIGHT)operator(|)constant(LIST_SINGLESELECT)operator(\)) + instance_variable(@productions)operator(.)ident(height) operator(=) integer(100) + + instance_variable(@result) operator(=) constant(FXTable)operator(.)ident(new)operator(()ident(horizontalsplitt)operator(,) pre_constant(nil)operator(,) integer(0)operator(,) constant(LAYOUT_FILL)operator(\)) + instance_variable(@result)operator(.)ident(height) operator(=) integer(200) + instance_variable(@result)operator(.)ident(setTableSize)operator(()integer(2)operator(,) integer(2)operator(,) pre_constant(false)operator(\)) + instance_variable(@result)operator(.)ident(rowHeaderWidth) operator(=) integer(0) + + ident(header) operator(=) instance_variable(@result)operator(.)ident(columnHeader) + ident(header)operator(.)ident(setItemText) integer(0)operator(,) string<delimiter(')content(X)delimiter(')> + ident(header)operator(.)ident(setItemText) integer(1)operator(,) string<delimiter(')content(FIRST(X\))delimiter(')> + reserved(for) ident(item) reserved(in) ident(header) + ident(item)operator(.)ident(justification) operator(=) constant(FXHeaderItem)operator(::)constant(CENTER_X) + reserved(end) + + instance_variable(@debug) operator(=) constant(FXText)operator(.)ident(new)operator(()ident(horizontalsplitt)operator(,) pre_constant(nil)operator(,) integer(0)operator(,) constant(LAYOUT_SIDE_BOTTOM)operator(|)constant(LAYOUT_FILL_X)operator(|)constant(LAYOUT_FIX_HEIGHT)operator(\)) + instance_variable(@debug)operator(.)ident(height) operator(=) integer(200) + + comment(# }}} window content) + reserved(end) + + reserved(def) method(load_grammar) ident(grammar) + instance_variable(@tracer) operator(=) constant(FirstTracer)operator(.)ident(new)operator(()pre_constant(self)operator(\)) + instance_variable(@grammar) operator(=) constant(Grammar)operator(.)ident(new) ident(grammar)operator(,) instance_variable(@tracer) + instance_variable(@rules_indexes) operator(=) constant(Hash)operator(.)ident(new) + instance_variable(@grammar)operator(.)ident(rules)operator(.)ident(each_with_index) reserved(do) operator(|)ident(rule)operator(,) ident(i)operator(|) + instance_variable(@productions)operator(.)ident(appendItem) ident(rule)operator(.)ident(inspect) + instance_variable(@rules_indexes)operator([)ident(rule)operator(]) operator(=) ident(i) + reserved(end) + reserved(end) + + reserved(def) method(create) + reserved(super) + ident(show)operator(()constant(PLACEMENT_SCREEN)operator(\)) + reserved(end) + + reserved(def) method(rule) ident(rule) + instance_variable(@productions)operator(.)ident(selectItem) instance_variable(@rules_indexes)operator([)ident(rule)operator(]) + ident(sleep) float(0.1) + reserved(end) + + reserved(def) method(iterate) ident(i) + ident(setTitle) ident(i)operator(.)ident(to_s) + ident(sleep) float(0.1) + reserved(end) + + reserved(def) method(missing) ident(what) + instance_variable(@debug)operator(.)ident(appendText) ident(what) operator(+) string<delimiter(")char(\\n)delimiter(")> + ident(sleep) float(0.1) + reserved(end) + + reserved(def) method(start) ident(sender)operator(,) ident(sel)operator(,) ident(pointer) + constant(Thread)operator(.)ident(new) reserved(do) + reserved(begin) + instance_variable(@grammar)operator(.)ident(first) + reserved(rescue) operator(=)operator(>) ident(boom) + instance_variable(@debug)operator(.)ident(appendText) operator([)ident(boom)operator(.)ident(to_s)operator(,) operator(*)ident(boom)operator(.)ident(backtrace)operator(])operator(.)ident(join)operator(()string<delimiter(")char(\\n)delimiter(")>operator(\)) + reserved(end) + reserved(end) + reserved(end) + +reserved(end) + +global_variable($:) operator(<<) string<delimiter(')content(grammar)delimiter(')> +ident(require) string<delimiter(')content(grammar)delimiter(')> + +ident(require) string<delimiter(')content(first_tracer)delimiter(')> + +ident(app) operator(=) constant(FXApp)operator(.)ident(new)operator(()string<delimiter(")content(Shinobu)delimiter(")>operator(,) string<delimiter(")content(cYcnus)delimiter(")>operator(\)) + +comment(# fenster erzeugen) +ident(window) operator(=) constant(Window)operator(.)ident(new) ident(app) + +reserved(unless) pre_constant(ARGV)operator(.)ident(empty?) + ident(grammar) operator(=) constant(File)operator(.)ident(read)operator(()pre_constant(ARGV)operator(.)ident(first)operator(\)) +reserved(else) + ident(grammar) operator(=) string<delimiter(<<-EOG1)>string<content( +Z --> S +S --> Sb +S --> bAa +A --> aSc +A --> a +A --> aSb)delimiter( + EOG1)> +reserved(end) + +ident(window)operator(.)ident(load_grammar) ident(grammar) + +ident(app)operator(.)ident(create) +ident(app)operator(.)ident(run) + +ident(require) string<delimiter(')content(erb)delimiter(')> +ident(require) string<delimiter(')content(ftools)delimiter(')> +ident(require) string<delimiter(')content(yaml)delimiter(')> +ident(require) string<delimiter(')content(redcloth)delimiter(')> + +reserved(module) class(WhyTheLuckyStiff) + reserved(class) class(Book) + ident(attr_accessor) symbol(:author)operator(,) symbol(:title)operator(,) symbol(:terms)operator(,) symbol(:image)operator(,) symbol(:teaser)operator(,) + symbol(:chapters)operator(,) symbol(:expansion_paks)operator(,) symbol(:encoding)operator(,) symbol(:credits) + reserved(def) method([]) ident(x) + instance_variable(@lang)operator(.)ident(fetch)operator(()ident(x)operator(\)) reserved(do) + ident(warn) ident(warning) operator(=) string<delimiter(")content([not translated: ')inline<delimiter(#{)ident(x)delimiter(})>content('!])delimiter(")> + ident(warning) + reserved(end) + reserved(end) + reserved(end) + + reserved(def) constant(Book)operator(::)ident(load)operator(() ident(file_name) operator(\)) + constant(YAML)operator(::)ident(load)operator(() constant(File)operator(.)ident(open)operator(() ident(file_name) operator(\)) operator(\)) + reserved(end) + + reserved(class) class(Section) + ident(attr_accessor) symbol(:index)operator(,) symbol(:header)operator(,) symbol(:content) + reserved(def) method(initialize)operator(() ident(i)operator(,) ident(h)operator(,) ident(c) operator(\)) + instance_variable(@index)operator(,) instance_variable(@header)operator(,) instance_variable(@content) operator(=) ident(i)operator(,) ident(h)operator(,) constant(RedCloth)operator(::)ident(new)operator(() ident(c)operator(.)ident(to_s) operator(\)) + reserved(end) + reserved(end) + + reserved(class) class(Sidebar) + ident(attr_accessor) symbol(:title)operator(,) symbol(:content) + reserved(end) + + constant(YAML)operator(::)ident(add_domain_type)operator(() string<delimiter(')content(whytheluckystiff.net,2003)delimiter(')>operator(,) string<delimiter(')content(sidebar)delimiter(')> operator(\)) reserved(do) operator(|)ident(taguri)operator(,) ident(val)operator(|) + constant(YAML)operator(::)ident(object_maker)operator(() constant(Sidebar)operator(,) string<delimiter(')content(title)delimiter(')> operator(=)operator(>) ident(val)operator(.)ident(keys)operator(.)ident(first)operator(,) string<delimiter(')content(content)delimiter(')> operator(=)operator(>) constant(RedCloth)operator(::)ident(new)operator(() ident(val)operator(.)ident(values)operator(.)ident(first) operator(\)) operator(\)) + reserved(end) + reserved(class) class(Chapter) + ident(attr_accessor) symbol(:index)operator(,) symbol(:title)operator(,) symbol(:sections) + reserved(def) method(initialize)operator(() ident(i)operator(,) ident(t)operator(,) ident(sects) operator(\)) + instance_variable(@index) operator(=) ident(i) + instance_variable(@title) operator(=) ident(t) + ident(i) operator(=) integer(0) + instance_variable(@sections) operator(=) ident(sects)operator(.)ident(collect) reserved(do) operator(|)ident(s)operator(|) + reserved(if) ident(s)operator(.)ident(respond_to?)operator(() symbol(:keys) operator(\)) + ident(i) operator(+=) integer(1) + constant(Section)operator(.)ident(new)operator(() ident(i)operator(,) ident(s)operator(.)ident(keys)operator(.)ident(first)operator(,) ident(s)operator(.)ident(values)operator(.)ident(first) operator(\)) + reserved(else) + ident(s) + reserved(end) + reserved(end) + reserved(end) + reserved(end) + + constant(YAML)operator(::)ident(add_domain_type)operator(() string<delimiter(')content(whytheluckystiff.net,2003)delimiter(')>operator(,) string<delimiter(')content(book)delimiter(')> operator(\)) reserved(do) operator(|)ident(taguri)operator(,) ident(val)operator(|) + operator([)string<delimiter(')content(chapters)delimiter(')>operator(,) string<delimiter(')content(expansion_paks)delimiter(')>operator(])operator(.)ident(each) reserved(do) operator(|)ident(chaptype)operator(|) + ident(i) operator(=) integer(0) + ident(val)operator([)ident(chaptype)operator(])operator(.)ident(collect!) reserved(do) operator(|)ident(c)operator(|) + ident(i) operator(+=) integer(1) + constant(Chapter)operator(::)ident(new)operator(() ident(i)operator(,) ident(c)operator(.)ident(keys)operator(.)ident(first)operator(,) ident(c)operator(.)ident(values)operator(.)ident(first) operator(\)) + reserved(end) + reserved(end) + ident(val)operator([)string<delimiter(')content(teaser)delimiter(')>operator(])operator(.)ident(collect!) reserved(do) operator(|)ident(t)operator(|) + constant(Section)operator(::)ident(new)operator(() integer(1)operator(,) ident(t)operator(.)ident(keys)operator(.)ident(first)operator(,) ident(t)operator(.)ident(values)operator(.)ident(first) operator(\)) + reserved(end) + ident(val)operator([)string<delimiter(')content(terms)delimiter(')>operator(]) operator(=) constant(RedCloth)operator(::)ident(new)operator(() ident(val)operator([)string<delimiter(')content(terms)delimiter(')>operator(]) operator(\)) + constant(YAML)operator(::)ident(object_maker)operator(() constant(Book)operator(,) ident(val) operator(\)) + reserved(end) + + reserved(class) class(Image) + ident(attr_accessor) symbol(:file_name) + reserved(end) + + constant(YAML)operator(::)ident(add_domain_type)operator(() string<delimiter(')content(whytheluckystiff.net,2003)delimiter(')>operator(,) string<delimiter(')content(img)delimiter(')> operator(\)) reserved(do) operator(|)ident(taguri)operator(,) ident(val)operator(|) + constant(YAML)operator(::)ident(object_maker)operator(() constant(Image)operator(,) string<delimiter(')content(file_name)delimiter(')> operator(=)operator(>) string<delimiter(")content(i/)delimiter(")> operator(+) ident(val) operator(\)) + reserved(end) +reserved(end) + +comment(#) +comment(# Convert the book to HTML) +comment(#) +reserved(if) pre_constant(__FILE__) operator(==) global_variable($0) + reserved(unless) pre_constant(ARGV)operator([)integer(0)operator(]) + ident(puts) string<delimiter(")content(Usage: )inline<delimiter(#{)global_variable($0)delimiter(})>content( [/path/to/save/html])delimiter(")> + ident(exit) + reserved(end) + + ident(site_path) operator(=) pre_constant(ARGV)operator([)integer(0)operator(]) + ident(book) operator(=) constant(WhyTheLuckyStiff)operator(::)constant(Book)operator(::)ident(load)operator(() string<delimiter(')content(poignant.yml)delimiter(')> operator(\)) + ident(chapter) operator(=) pre_constant(nil) + + comment(# Write index page) + ident(index_tpl) operator(=) constant(ERB)operator(::)ident(new)operator(() constant(File)operator(.)ident(open)operator(() string<delimiter(')content(index.erb)delimiter(')> operator(\))operator(.)ident(read) operator(\)) + constant(File)operator(.)ident(open)operator(() constant(File)operator(.)ident(join)operator(() ident(site_path)operator(,) string<delimiter(')content(index.html)delimiter(')> operator(\))operator(,) string<delimiter(')content(w)delimiter(')> operator(\)) reserved(do) operator(|)ident(out)operator(|) + ident(out) operator(<<) ident(index_tpl)operator(.)ident(result) + reserved(end) + + ident(book)operator(.)ident(chapters) operator(=) ident(book)operator(.)ident(chapters)operator([)integer(0)operator(,)integer(3)operator(]) reserved(if) pre_constant(ARGV)operator(.)ident(include?) string<delimiter(')content(-fast)delimiter(')> + + comment(# Write chapter pages) + ident(chapter_tpl) operator(=) constant(ERB)operator(::)ident(new)operator(() constant(File)operator(.)ident(open)operator(() string<delimiter(')content(chapter.erb)delimiter(')> operator(\))operator(.)ident(read) operator(\)) + ident(book)operator(.)ident(chapters)operator(.)ident(each) reserved(do) operator(|)ident(chapter)operator(|) + constant(File)operator(.)ident(open)operator(() constant(File)operator(.)ident(join)operator(() ident(site_path)operator(,) string<delimiter(")content(chapter-)inline<delimiter(#{) ident(chapter)operator(.)ident(index) delimiter(})>content(.html)delimiter(")> operator(\))operator(,) string<delimiter(')content(w)delimiter(')> operator(\)) reserved(do) operator(|)ident(out)operator(|) + ident(out) operator(<<) ident(chapter_tpl)operator(.)ident(result) + reserved(end) + reserved(end) + ident(exit) reserved(if) pre_constant(ARGV)operator(.)ident(include?) string<delimiter(')content(-fast)delimiter(')> + + comment(# Write expansion pak pages) + ident(expak_tpl) operator(=) constant(ERB)operator(::)ident(new)operator(() constant(File)operator(.)ident(open)operator(() string<delimiter(')content(expansion-pak.erb)delimiter(')> operator(\))operator(.)ident(read) operator(\)) + ident(book)operator(.)ident(expansion_paks)operator(.)ident(each) reserved(do) operator(|)ident(pak)operator(|) + constant(File)operator(.)ident(open)operator(() constant(File)operator(.)ident(join)operator(() ident(site_path)operator(,) string<delimiter(")content(expansion-pak-)inline<delimiter(#{) ident(pak)operator(.)ident(index) delimiter(})>content(.html)delimiter(")> operator(\))operator(,) string<delimiter(')content(w)delimiter(')> operator(\)) reserved(do) operator(|)ident(out)operator(|) + ident(out) operator(<<) ident(expak_tpl)operator(.)ident(result)operator(() ident(binding) operator(\)) + reserved(end) + reserved(end) + + comment(# Write printable version) + ident(print_tpl) operator(=) constant(ERB)operator(::)ident(new)operator(() constant(File)operator(.)ident(open)operator(() string<delimiter(')content(print.erb)delimiter(')> operator(\))operator(.)ident(read) operator(\)) + constant(File)operator(.)ident(open)operator(() constant(File)operator(.)ident(join)operator(() ident(site_path)operator(,) string<delimiter(")content(print.html)delimiter(")> operator(\))operator(,) string<delimiter(')content(w)delimiter(')> operator(\)) reserved(do) operator(|)ident(out)operator(|) + ident(out) operator(<<) ident(print_tpl)operator(.)ident(result) + reserved(end) + + comment(# Copy css + images into site) + ident(copy_list) operator(=) operator([)string<delimiter(")content(guide.css)delimiter(")>operator(]) operator(+) + constant(Dir)operator([)string<delimiter(")content(i/*)delimiter(")>operator(])operator(.)ident(find_all) operator({) operator(|)ident(image)operator(|) ident(image) operator(=)operator(~) regexp<delimiter(/)char(\\.)content((gif|jpg|png\)$)delimiter(/)> operator(}) + + constant(File)operator(.)ident(makedirs)operator(() constant(File)operator(.)ident(join)operator(() ident(site_path)operator(,) string<delimiter(")content(i)delimiter(")> operator(\)) operator(\)) + ident(copy_list)operator(.)ident(each) reserved(do) operator(|)ident(copy_file)operator(|) + constant(File)operator(.)ident(copy)operator(() ident(copy_file)operator(,) constant(File)operator(.)ident(join)operator(() ident(site_path)operator(,) ident(copy_file) operator(\)) operator(\)) + reserved(end) +reserved(end) + +comment(#!/usr/bin/env ruby) + +ident(require) string<delimiter(')content(fox)delimiter(')> +reserved(begin) + ident(require) string<delimiter(')content(opengl)delimiter(')> +reserved(rescue) constant(LoadError) + ident(require) string<delimiter(')content(fox/missingdep)delimiter(')> + constant(MSG) operator(=) string<delimiter(<<EOM)>string<content( + Sorry, this example depends on the OpenGL extension. Please + check the Ruby Application Archives for an appropriate + download site.)delimiter( +EOM)> + ident(missingDependency)operator(()constant(MSG)operator(\)) +reserved(end) + + +ident(include) constant(Fox) +ident(include) constant(Math) + +constant(Deg2Rad) operator(=) constant(Math)operator(::)constant(PI) operator(/) integer(180) + +constant(D_MAX) operator(=) integer(6) +constant(SQUARE_SIZE) operator(=) float(2.0) operator(/) constant(D_MAX) +constant(SQUARE_DISTANCE) operator(=) float(4.0) operator(/) constant(D_MAX) +constant(AMPLITUDE) operator(=) constant(SQUARE_SIZE) +constant(LAMBDA) operator(=) constant(D_MAX)operator(.)ident(to_f) operator(/) integer(2) + +reserved(class) class(GLTestWindow) operator(<) constant(FXMainWindow) + + comment(# How often our timer will fire (in milliseconds\)) + constant(TIMER_INTERVAL) operator(=) integer(500) + + comment(# Rotate the boxes when a timer message is received) + reserved(def) method(onTimeout)operator(()ident(sender)operator(,) ident(sel)operator(,) ident(ptr)operator(\)) + instance_variable(@angle) operator(+=) float(10.0) +comment(# @size = 0.5 + 0.2 * Math.cos(Deg2Rad * @angle\)) + ident(drawScene)operator(()operator(\)) + instance_variable(@timer) operator(=) ident(getApp)operator(()operator(\))operator(.)ident(addTimeout)operator(()constant(TIMER_INTERVAL)operator(,) ident(method)operator(()symbol(:onTimeout)operator(\))operator(\)) + reserved(end) + + comment(# Rotate the boxes when a chore message is received) + reserved(def) method(onChore)operator(()ident(sender)operator(,) ident(sel)operator(,) ident(ptr)operator(\)) + instance_variable(@angle) operator(+=) float(10.0) +comment(# @angle %= 360.0) +comment(# @size = 0.5 + 0.2 * Math.cos(Deg2Rad * @angle\)) + ident(drawScene)operator(()operator(\)) + instance_variable(@chore) operator(=) ident(getApp)operator(()operator(\))operator(.)ident(addChore)operator(()ident(method)operator(()symbol(:onChore)operator(\))operator(\)) + reserved(end) + + comment(# Draw the GL scene) + reserved(def) method(drawScene) + ident(lightPosition) operator(=) operator([)float(15.0)operator(,) float(10.0)operator(,) float(5.0)operator(,) float(1.0)operator(]) + ident(lightAmbient) operator(=) operator([) float(0.1)operator(,) float(0.1)operator(,) float(0.1)operator(,) float(1.0)operator(]) + ident(lightDiffuse) operator(=) operator([) float(0.9)operator(,) float(0.9)operator(,) float(0.9)operator(,) float(1.0)operator(]) + ident(redMaterial) operator(=) operator([) float(0.0)operator(,) float(0.0)operator(,) float(1.0)operator(,) float(1.0)operator(]) + ident(blueMaterial) operator(=) operator([) float(0.0)operator(,) float(1.0)operator(,) float(0.0)operator(,) float(1.0)operator(]) + + ident(width) operator(=) instance_variable(@glcanvas)operator(.)ident(width)operator(.)ident(to_f) + ident(height) operator(=) instance_variable(@glcanvas)operator(.)ident(height)operator(.)ident(to_f) + ident(aspect) operator(=) ident(width)operator(/)ident(height) + + comment(# Make context current) + instance_variable(@glcanvas)operator(.)ident(makeCurrent)operator(()operator(\)) + + constant(GL)operator(.)ident(Viewport)operator(()integer(0)operator(,) integer(0)operator(,) instance_variable(@glcanvas)operator(.)ident(width)operator(,) instance_variable(@glcanvas)operator(.)ident(height)operator(\)) + + constant(GL)operator(.)ident(ClearColor)operator(()float(1.0)operator(/)integer(256)operator(,) float(0.0)operator(,) float(5.0)operator(/)integer(256)operator(,) float(1.0)operator(\)) + constant(GL)operator(.)ident(Clear)operator(()constant(GL)operator(::)constant(COLOR_BUFFER_BIT)operator(|)constant(GL)operator(::)constant(DEPTH_BUFFER_BIT)operator(\)) + constant(GL)operator(.)ident(Enable)operator(()constant(GL)operator(::)constant(DEPTH_TEST)operator(\)) + + constant(GL)operator(.)ident(Disable)operator(()constant(GL)operator(::)constant(DITHER)operator(\)) + + constant(GL)operator(.)ident(MatrixMode)operator(()constant(GL)operator(::)constant(PROJECTION)operator(\)) + constant(GL)operator(.)ident(LoadIdentity)operator(()operator(\)) + constant(GLU)operator(.)ident(Perspective)operator(()float(30.0)operator(,) ident(aspect)operator(,) float(1.0)operator(,) float(100.0)operator(\)) + + constant(GL)operator(.)ident(MatrixMode)operator(()constant(GL)operator(::)constant(MODELVIEW)operator(\)) + constant(GL)operator(.)ident(LoadIdentity)operator(()operator(\)) + constant(GLU)operator(.)ident(LookAt)operator(()float(5.0)operator(,) float(10.0)operator(,) float(15.0)operator(,) float(0.0)operator(,) float(0.0)operator(,) float(0.0)operator(,) float(0.0)operator(,) float(1.0)operator(,) float(0.0)operator(\)) + + constant(GL)operator(.)ident(ShadeModel)operator(()constant(GL)operator(::)constant(SMOOTH)operator(\)) + constant(GL)operator(.)ident(Light)operator(()constant(GL)operator(::)constant(LIGHT0)operator(,) constant(GL)operator(::)constant(POSITION)operator(,) ident(lightPosition)operator(\)) + constant(GL)operator(.)ident(Light)operator(()constant(GL)operator(::)constant(LIGHT0)operator(,) constant(GL)operator(::)constant(AMBIENT)operator(,) ident(lightAmbient)operator(\)) + constant(GL)operator(.)ident(Light)operator(()constant(GL)operator(::)constant(LIGHT0)operator(,) constant(GL)operator(::)constant(DIFFUSE)operator(,) ident(lightDiffuse)operator(\)) + constant(GL)operator(.)ident(Enable)operator(()constant(GL)operator(::)constant(LIGHT0)operator(\)) + constant(GL)operator(.)ident(Enable)operator(()constant(GL)operator(::)constant(LIGHTING)operator(\)) + + constant(GL)operator(.)ident(Rotated)operator(()float(0.1)operator(*)instance_variable(@angle)operator(,) float(0.0)operator(,) float(1.0)operator(,) float(0.0)operator(\)) + reserved(for) ident(x) reserved(in) operator(-)constant(D_MAX)operator(..)constant(D_MAX) + reserved(for) ident(y) reserved(in) operator(-)constant(D_MAX)operator(..)constant(D_MAX) + ident(h1) operator(=) operator(()ident(x) operator(+) ident(y) operator(-) integer(2)operator(\))operator(.)ident(abs) + ident(h2) operator(=) operator(()ident(y) operator(-) ident(x) operator(+) integer(1)operator(\))operator(.)ident(abs) + constant(GL)operator(.)constant(PushMatrix) + ident(c) operator(=) operator([)integer(1)operator(,) integer(0)operator(,) integer(0)operator(,) integer(1)operator(]) + constant(GL)operator(.)ident(Material)operator(()constant(GL)operator(::)constant(FRONT)operator(,) constant(GL)operator(::)constant(AMBIENT)operator(,) ident(c)operator(\)) + constant(GL)operator(.)ident(Material)operator(()constant(GL)operator(::)constant(FRONT)operator(,) constant(GL)operator(::)constant(DIFFUSE)operator(,) ident(c)operator(\)) + + constant(GL)operator(.)ident(Translated)operator(() + ident(y) operator(*) constant(SQUARE_DISTANCE)operator(,) + constant(AMPLITUDE) operator(*) ident(h1)operator(,) + ident(x) operator(*) constant(SQUARE_DISTANCE) + operator(\)) + + constant(GL)operator(.)ident(Begin)operator(()constant(GL)operator(::)constant(TRIANGLE_STRIP)operator(\)) + constant(GL)operator(.)ident(Normal)operator(()float(1.0)operator(,) float(0.0)operator(,) float(0.0)operator(\)) + constant(GL)operator(.)ident(Vertex)operator(()operator(-)constant(SQUARE_SIZE)operator(,) operator(+)constant(SQUARE_SIZE)operator(,) operator(-)constant(SQUARE_SIZE)operator(\)) + constant(GL)operator(.)ident(Vertex)operator(()operator(-)constant(SQUARE_SIZE)operator(,) operator(+)constant(SQUARE_SIZE)operator(,) operator(+)constant(SQUARE_SIZE)operator(\)) + constant(GL)operator(.)ident(Vertex)operator(()operator(+)constant(SQUARE_SIZE)operator(,) operator(+)constant(SQUARE_SIZE)operator(,) operator(-)constant(SQUARE_SIZE)operator(\)) + constant(GL)operator(.)ident(Vertex)operator(()operator(+)constant(SQUARE_SIZE)operator(,) operator(+)constant(SQUARE_SIZE)operator(,) operator(+)constant(SQUARE_SIZE)operator(\)) + constant(GL)operator(.)constant(End) + + constant(GL)operator(.)constant(PopMatrix) + + constant(GL)operator(.)constant(PushMatrix) + ident(c) operator(=) operator([)integer(0)operator(,) integer(0)operator(,) integer(1)operator(,) integer(1)operator(]) + constant(GL)operator(.)ident(Material)operator(()constant(GL)operator(::)constant(FRONT)operator(,) constant(GL)operator(::)constant(AMBIENT)operator(,) ident(c)operator(\)) + constant(GL)operator(.)ident(Material)operator(()constant(GL)operator(::)constant(FRONT)operator(,) constant(GL)operator(::)constant(DIFFUSE)operator(,) ident(c)operator(\)) + + constant(GL)operator(.)ident(Translated)operator(() + ident(y) operator(*) constant(SQUARE_DISTANCE)operator(,) + constant(AMPLITUDE) operator(*) ident(h2)operator(,) + ident(x) operator(*) constant(SQUARE_DISTANCE) + operator(\)) + + constant(GL)operator(.)ident(Begin)operator(()constant(GL)operator(::)constant(TRIANGLE_STRIP)operator(\)) + constant(GL)operator(.)ident(Normal)operator(()float(1.0)operator(,) float(0.0)operator(,) float(0.0)operator(\)) + constant(GL)operator(.)ident(Vertex)operator(()operator(-)constant(SQUARE_SIZE)operator(,) operator(+)constant(SQUARE_SIZE)operator(,) operator(-)constant(SQUARE_SIZE)operator(\)) + constant(GL)operator(.)ident(Vertex)operator(()operator(-)constant(SQUARE_SIZE)operator(,) operator(+)constant(SQUARE_SIZE)operator(,) operator(+)constant(SQUARE_SIZE)operator(\)) + constant(GL)operator(.)ident(Vertex)operator(()operator(+)constant(SQUARE_SIZE)operator(,) operator(+)constant(SQUARE_SIZE)operator(,) operator(-)constant(SQUARE_SIZE)operator(\)) + constant(GL)operator(.)ident(Vertex)operator(()operator(+)constant(SQUARE_SIZE)operator(,) operator(+)constant(SQUARE_SIZE)operator(,) operator(+)constant(SQUARE_SIZE)operator(\)) + constant(GL)operator(.)constant(End) + + constant(GL)operator(.)constant(PopMatrix) + + constant(GL)operator(.)constant(PushMatrix) + ident(c) operator(=) operator([)float(0.0) operator(+) operator(()ident(x)operator(/)float(10.0)operator(\))operator(,) float(0.0) operator(+) operator(()ident(y)operator(/)float(10.0)operator(\))operator(,) integer(0)operator(,) integer(1)operator(]) + constant(GL)operator(.)ident(Material)operator(()constant(GL)operator(::)constant(FRONT)operator(,) constant(GL)operator(::)constant(AMBIENT)operator(,) ident(c)operator(\)) + constant(GL)operator(.)ident(Material)operator(()constant(GL)operator(::)constant(FRONT)operator(,) constant(GL)operator(::)constant(DIFFUSE)operator(,) ident(c)operator(\)) + + constant(GL)operator(.)ident(Translated)operator(() + ident(y) operator(*) constant(SQUARE_DISTANCE)operator(,) + integer(0)operator(,) + ident(x) operator(*) constant(SQUARE_DISTANCE) + operator(\)) + + constant(GL)operator(.)ident(Begin)operator(()constant(GL)operator(::)constant(TRIANGLE_STRIP)operator(\)) + constant(GL)operator(.)ident(Normal)operator(()float(1.0)operator(,) float(0.0)operator(,) float(0.0)operator(\)) + constant(GL)operator(.)ident(Vertex)operator(()operator(-)constant(SQUARE_SIZE)operator(,) operator(+)constant(SQUARE_SIZE)operator(,) operator(-)constant(SQUARE_SIZE)operator(\)) + constant(GL)operator(.)ident(Vertex)operator(()operator(-)constant(SQUARE_SIZE)operator(,) operator(+)constant(SQUARE_SIZE)operator(,) operator(+)constant(SQUARE_SIZE)operator(\)) + constant(GL)operator(.)ident(Vertex)operator(()operator(+)constant(SQUARE_SIZE)operator(,) operator(+)constant(SQUARE_SIZE)operator(,) operator(-)constant(SQUARE_SIZE)operator(\)) + constant(GL)operator(.)ident(Vertex)operator(()operator(+)constant(SQUARE_SIZE)operator(,) operator(+)constant(SQUARE_SIZE)operator(,) operator(+)constant(SQUARE_SIZE)operator(\)) + constant(GL)operator(.)constant(End) + + constant(GL)operator(.)constant(PopMatrix) + reserved(end) + reserved(end) + + comment(# Swap if it is double-buffered) + reserved(if) instance_variable(@glvisual)operator(.)ident(isDoubleBuffer) + instance_variable(@glcanvas)operator(.)ident(swapBuffers) + reserved(end) + + comment(# Make context non-current) + instance_variable(@glcanvas)operator(.)ident(makeNonCurrent) + reserved(end) + + reserved(def) method(initialize)operator(()ident(app)operator(\)) + comment(# Invoke the base class initializer) + reserved(super)operator(()ident(app)operator(,) string<delimiter(")content(OpenGL Test Application)delimiter(")>operator(,) pre_constant(nil)operator(,) pre_constant(nil)operator(,) constant(DECOR_ALL)operator(,) integer(0)operator(,) integer(0)operator(,) integer(1024)operator(,) integer(768)operator(\)) + + comment(# Construct the main window elements) + ident(frame) operator(=) constant(FXHorizontalFrame)operator(.)ident(new)operator(()pre_constant(self)operator(,) constant(LAYOUT_SIDE_TOP)operator(|)constant(LAYOUT_FILL_X)operator(|)constant(LAYOUT_FILL_Y)operator(\)) + ident(frame)operator(.)ident(padLeft)operator(,) ident(frame)operator(.)ident(padRight) operator(=) integer(0)operator(,) integer(0) + ident(frame)operator(.)ident(padTop)operator(,) ident(frame)operator(.)ident(padBottom) operator(=) integer(0)operator(,) integer(0) + + comment(# Left pane to contain the glcanvas) + ident(glcanvasFrame) operator(=) constant(FXVerticalFrame)operator(.)ident(new)operator(()ident(frame)operator(,) + constant(LAYOUT_FILL_X)operator(|)constant(LAYOUT_FILL_Y)operator(|)constant(LAYOUT_TOP)operator(|)constant(LAYOUT_LEFT)operator(\)) + ident(glcanvasFrame)operator(.)ident(padLeft)operator(,) ident(glcanvasFrame)operator(.)ident(padRight) operator(=) integer(10)operator(,) integer(10) + ident(glcanvasFrame)operator(.)ident(padTop)operator(,) ident(glcanvasFrame)operator(.)ident(padBottom) operator(=) integer(10)operator(,) integer(10) + + comment(# Label above the glcanvas) + constant(FXLabel)operator(.)ident(new)operator(()ident(glcanvasFrame)operator(,) string<delimiter(")content(OpenGL Canvas Frame)delimiter(")>operator(,) pre_constant(nil)operator(,) + constant(JUSTIFY_CENTER_X)operator(|)constant(LAYOUT_FILL_X)operator(\)) + + comment(# Horizontal divider line) + constant(FXHorizontalSeparator)operator(.)ident(new)operator(()ident(glcanvasFrame)operator(,) constant(SEPARATOR_GROOVE)operator(|)constant(LAYOUT_FILL_X)operator(\)) + + comment(# Drawing glcanvas) + ident(glpanel) operator(=) constant(FXVerticalFrame)operator(.)ident(new)operator(()ident(glcanvasFrame)operator(,) operator(()constant(FRAME_SUNKEN)operator(|)constant(FRAME_THICK)operator(|) + constant(LAYOUT_FILL_X)operator(|)constant(LAYOUT_FILL_Y)operator(|)constant(LAYOUT_TOP)operator(|)constant(LAYOUT_LEFT)operator(\))operator(\)) + ident(glpanel)operator(.)ident(padLeft)operator(,) ident(glpanel)operator(.)ident(padRight) operator(=) integer(0)operator(,) integer(0) + ident(glpanel)operator(.)ident(padTop)operator(,) ident(glpanel)operator(.)ident(padBottom) operator(=) integer(0)operator(,) integer(0) + + comment(# A visual to draw OpenGL) + instance_variable(@glvisual) operator(=) constant(FXGLVisual)operator(.)ident(new)operator(()ident(getApp)operator(()operator(\))operator(,) constant(VISUAL_DOUBLEBUFFER)operator(\)) + + comment(# Drawing glcanvas) + instance_variable(@glcanvas) operator(=) constant(FXGLCanvas)operator(.)ident(new)operator(()ident(glpanel)operator(,) instance_variable(@glvisual)operator(,) pre_constant(nil)operator(,) integer(0)operator(,) + constant(LAYOUT_FILL_X)operator(|)constant(LAYOUT_FILL_Y)operator(|)constant(LAYOUT_TOP)operator(|)constant(LAYOUT_LEFT)operator(\)) + instance_variable(@glcanvas)operator(.)ident(connect)operator(()constant(SEL_PAINT)operator(\)) operator({) + ident(drawScene) + operator(}) + instance_variable(@glcanvas)operator(.)ident(connect)operator(()constant(SEL_CONFIGURE)operator(\)) operator({) + reserved(if) instance_variable(@glcanvas)operator(.)ident(makeCurrent) + constant(GL)operator(.)ident(Viewport)operator(()integer(0)operator(,) integer(0)operator(,) instance_variable(@glcanvas)operator(.)ident(width)operator(,) instance_variable(@glcanvas)operator(.)ident(height)operator(\)) + instance_variable(@glcanvas)operator(.)ident(makeNonCurrent) + reserved(end) + operator(}) + + comment(# Right pane for the buttons) + ident(buttonFrame) operator(=) constant(FXVerticalFrame)operator(.)ident(new)operator(()ident(frame)operator(,) constant(LAYOUT_FILL_Y)operator(|)constant(LAYOUT_TOP)operator(|)constant(LAYOUT_LEFT)operator(\)) + ident(buttonFrame)operator(.)ident(padLeft)operator(,) ident(buttonFrame)operator(.)ident(padRight) operator(=) integer(10)operator(,) integer(10) + ident(buttonFrame)operator(.)ident(padTop)operator(,) ident(buttonFrame)operator(.)ident(padBottom) operator(=) integer(10)operator(,) integer(10) + + comment(# Label above the buttons) + constant(FXLabel)operator(.)ident(new)operator(()ident(buttonFrame)operator(,) string<delimiter(")content(Button Frame)delimiter(")>operator(,) pre_constant(nil)operator(,) + constant(JUSTIFY_CENTER_X)operator(|)constant(LAYOUT_FILL_X)operator(\)) + + comment(# Horizontal divider line) + constant(FXHorizontalSeparator)operator(.)ident(new)operator(()ident(buttonFrame)operator(,) constant(SEPARATOR_RIDGE)operator(|)constant(LAYOUT_FILL_X)operator(\)) + + comment(# Spin according to timer) + ident(spinTimerBtn) operator(=) constant(FXButton)operator(.)ident(new)operator(()ident(buttonFrame)operator(,) + string<delimiter(")content(Spin &Timer)char(\\t)content(Spin using interval timers)char(\\n)content(Note the app + blocks until the interal has elapsed...)delimiter(")>operator(,) pre_constant(nil)operator(,) + pre_constant(nil)operator(,) integer(0)operator(,) constant(FRAME_THICK)operator(|)constant(FRAME_RAISED)operator(|)constant(LAYOUT_FILL_X)operator(|)constant(LAYOUT_TOP)operator(|)constant(LAYOUT_LEFT)operator(\)) + ident(spinTimerBtn)operator(.)ident(padLeft)operator(,) ident(spinTimerBtn)operator(.)ident(padRight) operator(=) integer(10)operator(,) integer(10) + ident(spinTimerBtn)operator(.)ident(padTop)operator(,) ident(spinTimerBtn)operator(.)ident(padBottom) operator(=) integer(5)operator(,) integer(5) + ident(spinTimerBtn)operator(.)ident(connect)operator(()constant(SEL_COMMAND)operator(\)) operator({) + instance_variable(@spinning) operator(=) pre_constant(true) + instance_variable(@timer) operator(=) ident(getApp)operator(()operator(\))operator(.)ident(addTimeout)operator(()constant(TIMER_INTERVAL)operator(,) ident(method)operator(()symbol(:onTimeout)operator(\))operator(\)) + operator(}) + ident(spinTimerBtn)operator(.)ident(connect)operator(()constant(SEL_UPDATE)operator(\)) operator({) operator(|)ident(sender)operator(,) ident(sel)operator(,) ident(ptr)operator(|) + instance_variable(@spinning) operator(?) ident(sender)operator(.)ident(disable) operator(:) ident(sender)operator(.)ident(enable) + operator(}) + + comment(# Spin according to chore) + ident(spinChoreBtn) operator(=) constant(FXButton)operator(.)ident(new)operator(()ident(buttonFrame)operator(,) + string<delimiter(")content(Spin &Chore)char(\\t)content(Spin as fast as possible using chores)char(\\n)content(Note even though the + app is very responsive, it never blocks;)char(\\n)content(there is always something to + do...)delimiter(")>operator(,) pre_constant(nil)operator(,) + pre_constant(nil)operator(,) integer(0)operator(,) constant(FRAME_THICK)operator(|)constant(FRAME_RAISED)operator(|)constant(LAYOUT_FILL_X)operator(|)constant(LAYOUT_TOP)operator(|)constant(LAYOUT_LEFT)operator(\)) + ident(spinChoreBtn)operator(.)ident(padLeft)operator(,) ident(spinChoreBtn)operator(.)ident(padRight) operator(=) integer(10)operator(,) integer(10) + ident(spinChoreBtn)operator(.)ident(padTop)operator(,) ident(spinChoreBtn)operator(.)ident(padBottom) operator(=) integer(5)operator(,) integer(5) + ident(spinChoreBtn)operator(.)ident(connect)operator(()constant(SEL_COMMAND)operator(\)) operator({) + instance_variable(@spinning) operator(=) pre_constant(true) + instance_variable(@chore) operator(=) ident(getApp)operator(()operator(\))operator(.)ident(addChore)operator(()ident(method)operator(()symbol(:onChore)operator(\))operator(\)) + operator(}) + ident(spinChoreBtn)operator(.)ident(connect)operator(()constant(SEL_UPDATE)operator(\)) operator({) operator(|)ident(sender)operator(,) ident(sel)operator(,) ident(ptr)operator(|) + instance_variable(@spinning) operator(?) ident(sender)operator(.)ident(disable) operator(:) ident(sender)operator(.)ident(enable) + operator(}) + + comment(# Stop spinning) + ident(stopBtn) operator(=) constant(FXButton)operator(.)ident(new)operator(()ident(buttonFrame)operator(,) + string<delimiter(")content(&Stop Spin)char(\\t)content(Stop this mad spinning, I'm getting dizzy)delimiter(")>operator(,) pre_constant(nil)operator(,) + pre_constant(nil)operator(,) integer(0)operator(,) constant(FRAME_THICK)operator(|)constant(FRAME_RAISED)operator(|)constant(LAYOUT_FILL_X)operator(|)constant(LAYOUT_TOP)operator(|)constant(LAYOUT_LEFT)operator(\)) + ident(stopBtn)operator(.)ident(padLeft)operator(,) ident(stopBtn)operator(.)ident(padRight) operator(=) integer(10)operator(,) integer(10) + ident(stopBtn)operator(.)ident(padTop)operator(,) ident(stopBtn)operator(.)ident(padBottom) operator(=) integer(5)operator(,) integer(5) + ident(stopBtn)operator(.)ident(connect)operator(()constant(SEL_COMMAND)operator(\)) operator({) + instance_variable(@spinning) operator(=) pre_constant(false) + reserved(if) instance_variable(@timer) + ident(getApp)operator(()operator(\))operator(.)ident(removeTimeout)operator(()instance_variable(@timer)operator(\)) + instance_variable(@timer) operator(=) pre_constant(nil) + reserved(end) + reserved(if) instance_variable(@chore) + ident(getApp)operator(()operator(\))operator(.)ident(removeChore)operator(()instance_variable(@chore)operator(\)) + instance_variable(@chore) operator(=) pre_constant(nil) + reserved(end) + operator(}) + ident(stopBtn)operator(.)ident(connect)operator(()constant(SEL_UPDATE)operator(\)) operator({) operator(|)ident(sender)operator(,) ident(sel)operator(,) ident(ptr)operator(|) + instance_variable(@spinning) operator(?) ident(sender)operator(.)ident(enable) operator(:) ident(sender)operator(.)ident(disable) + operator(}) + + comment(# Exit button) + ident(exitBtn) operator(=) constant(FXButton)operator(.)ident(new)operator(()ident(buttonFrame)operator(,) string<delimiter(")content(&Exit)char(\\t)content(Exit the application)delimiter(")>operator(,) pre_constant(nil)operator(,) + ident(getApp)operator(()operator(\))operator(,) constant(FXApp)operator(::)constant(ID_QUIT)operator(,) + constant(FRAME_THICK)operator(|)constant(FRAME_RAISED)operator(|)constant(LAYOUT_FILL_X)operator(|)constant(LAYOUT_TOP)operator(|)constant(LAYOUT_LEFT)operator(\)) + ident(exitBtn)operator(.)ident(padLeft)operator(,) ident(exitBtn)operator(.)ident(padRight) operator(=) integer(10)operator(,) integer(10) + ident(exitBtn)operator(.)ident(padTop)operator(,) ident(exitBtn)operator(.)ident(padBottom) operator(=) integer(5)operator(,) integer(5) + + comment(# Make a tooltip) + constant(FXTooltip)operator(.)ident(new)operator(()ident(getApp)operator(()operator(\))operator(\)) + + comment(# Initialize private variables) + instance_variable(@spinning) operator(=) pre_constant(false) + instance_variable(@chore) operator(=) pre_constant(nil) + instance_variable(@timer) operator(=) pre_constant(nil) + instance_variable(@angle) operator(=) float(0.0) + instance_variable(@size) operator(=) float(0.5) + reserved(end) + + comment(# Create and initialize) + reserved(def) method(create) + reserved(super) + ident(show)operator(()constant(PLACEMENT_SCREEN)operator(\)) + reserved(end) +reserved(end) + +reserved(if) pre_constant(__FILE__) operator(==) global_variable($0) + comment(# Construct the application) + ident(application) operator(=) constant(FXApp)operator(.)ident(new)operator(()string<delimiter(")content(GLTest)delimiter(")>operator(,) string<delimiter(")content(FoxTest)delimiter(")>operator(\)) + + comment(# To ensure that the chores-based spin will run as fast as possible,) + comment(# we can disable the chore in FXRuby's event loop that tries to schedule) + comment(# other threads. This is OK for this program because there aren't any) + comment(# other Ruby threads running.) + + comment(#application.disableThreads) + + comment(# Construct the main window) + constant(GLTestWindow)operator(.)ident(new)operator(()ident(application)operator(\)) + + comment(# Create the app's windows) + ident(application)operator(.)ident(create) + + comment(# Run the application) + ident(application)operator(.)ident(run) +reserved(end) + +reserved(class) class(Facelet) + ident(attr_accessor) symbol(:color) + reserved(def) method(initialize)operator(()ident(color)operator(\)) + instance_variable(@color) operator(=) ident(color) + reserved(end) + + reserved(def) method(to_s) + instance_variable(@color) + reserved(end) +reserved(end) + +reserved(class) class(Edge) + ident(attr_accessor) symbol(:facelets)operator(,) symbol(:colors) + + reserved(def) method(initialize)operator(()ident(facelets)operator(\)) + instance_variable(@facelets) operator(=) ident(facelets) + instance_variable(@colors) operator(=) instance_variable(@facelets)operator(.)ident(map) operator({) operator(|)ident(fl)operator(|) ident(fl)operator(.)ident(color) operator(}) + reserved(end) + + reserved(def) method(apply)operator(()ident(edge)operator(\)) + instance_variable(@facelets)operator(.)ident(each_with_index) operator({) operator(|)ident(fl)operator(,) ident(i)operator(|) + ident(fl)operator(.)ident(color) operator(=) ident(edge)operator(.)ident(colors)operator([)ident(i)operator(]) + operator(}) + reserved(end) + + reserved(def) method(inspect) + string<delimiter(")char(\\n)content(%s %s)char(\\n)content(%s %s %s)delimiter(")> operator(%) ident(facelets) + reserved(end) +reserved(end) + +reserved(class) class(Side) + ident(attr_reader) symbol(:num)operator(,) symbol(:facelets) + ident(attr_accessor) symbol(:sides) + + reserved(def) method(initialize)operator(()ident(num)operator(\)) + instance_variable(@num) operator(=) ident(num) + instance_variable(@sides) operator(=) operator([)operator(]) + instance_variable(@facelets) operator(=) operator([)operator(]) + instance_variable(@fl_by_side) operator(=) operator({)operator(}) + reserved(end) + + comment(# facelets & sides) + comment(# 0) + comment(# 0 1 2) + comment(# 3 3 4 5 1) + comment(# 6 7 8) + comment(# 2) + + reserved(def) method(facelets=)operator(()ident(facelets)operator(\)) + instance_variable(@facelets) operator(=) ident(facelets)operator(.)ident(map) operator({) operator(|)ident(c)operator(|) constant(Facelet)operator(.)ident(new)operator(()ident(c)operator(\)) operator(}) + ident(init_facelet) integer(0)operator(,) integer(3)operator(,)integer(0) + ident(init_facelet) integer(1)operator(,) integer(0) + ident(init_facelet) integer(2)operator(,) integer(0)operator(,)integer(1) + ident(init_facelet) integer(3)operator(,) integer(3) + ident(init_facelet) integer(5)operator(,) integer(1) + ident(init_facelet) integer(6)operator(,) integer(2)operator(,)integer(3) + ident(init_facelet) integer(7)operator(,) integer(2) + ident(init_facelet) integer(8)operator(,) integer(1)operator(,)integer(2) + reserved(end) + + reserved(def) method(<=>)operator(()ident(side)operator(\)) + pre_constant(self)operator(.)ident(num) operator(<=>) ident(side)operator(.)ident(num) + reserved(end) + + reserved(def) method(init_facelet)operator(()ident(pos)operator(,) operator(*)ident(side_nums)operator(\)) + ident(sides) operator(=) ident(side_nums)operator(.)ident(map) operator({) operator(|)ident(num)operator(|) instance_variable(@sides)operator([)ident(num)operator(]) operator(})operator(.)ident(sort) + instance_variable(@fl_by_side)operator([)ident(sides)operator(]) operator(=) ident(pos) + reserved(end) + + reserved(def) method([]=)operator(()ident(color)operator(,) operator(*)ident(sides)operator(\)) + instance_variable(@facelets)operator([)instance_variable(@fl_by_side)operator([)ident(sides)operator(.)ident(sort)operator(])operator(])operator(.)ident(color) operator(=) ident(color) + reserved(end) + + reserved(def) method(values_at)operator(()operator(*)ident(sides)operator(\)) + ident(sides)operator(.)ident(map) operator({) operator(|)ident(sides)operator(|) instance_variable(@facelets)operator([)instance_variable(@fl_by_side)operator([)ident(sides)operator(.)ident(sort)operator(])operator(]) operator(}) + reserved(end) + + reserved(def) method(inspect)operator(()ident(range)operator(=)pre_constant(nil)operator(\)) + reserved(if) ident(range) + instance_variable(@facelets)operator(.)ident(values_at)operator(()operator(*)operator(()ident(range)operator(.)ident(to_a)operator(\))operator(\))operator(.)ident(join)operator(()string<delimiter(')content( )delimiter(')>operator(\)) + reserved(else) + string<delimiter(<<-EOS)>operator(.)ident(gsub)operator(()regexp<delimiter(/)char(\\d)delimiter(/)>operator(\)) operator({) operator(|)ident(num)operator(|) instance_variable(@facelets)operator([)ident(num)operator(.)ident(to_i)operator(]) operator(})operator(.)ident(gsub)operator(()regexp<delimiter(/)content([ABCD])delimiter(/)>operator(\)) operator({) operator(|)ident(side)operator(|) instance_variable(@sides)operator([)ident(side)operator([)integer(0)operator(])operator(-)integer(?A)operator(])operator(.)ident(num)operator(.)ident(to_s) operator(})string<content( + A + 0 1 2 + D 3 4 5 B + 6 7 8 + C)delimiter( + EOS)> + reserved(end) + reserved(end) + + reserved(def) method(get_edge)operator(()ident(side)operator(\)) + ident(trio) operator(=) operator(()integer(-1)operator(..)integer(1)operator(\))operator(.)ident(map) operator({) operator(|)ident(x)operator(|) operator(()ident(side) operator(+) ident(x)operator(\)) operator(%) integer(4) operator(}) + ident(prev_side)operator(,) ident(this_side)operator(,) ident(next_side) operator(=) instance_variable(@sides)operator(.)ident(values_at)operator(()operator(*)ident(trio)operator(\)) + ident(e) operator(=) constant(Edge)operator(.)ident(new)operator(() + pre_constant(self) operator(.)ident(values_at)operator(() operator([)ident(this_side)operator(])operator(,) operator([)ident(this_side)operator(,) ident(next_side)operator(]) operator(\)) operator(+) + ident(this_side)operator(.)ident(values_at)operator(() operator([)pre_constant(self)operator(,) ident(prev_side)operator(])operator(,) operator([)pre_constant(self) operator(])operator(,) operator([)pre_constant(self)operator(,) ident(next_side)operator(]) operator(\)) + operator(\)) + comment(#puts 'Edge created for side %d: ' % side + e.inspect) + ident(e) + reserved(end) + + reserved(def) method(turn)operator(()ident(dir)operator(\)) + comment(#p 'turn side %d in %d' % [num, dir]) + ident(edges) operator(=) operator(()integer(0)operator(..)integer(3)operator(\))operator(.)ident(map) operator({) operator(|)ident(n)operator(|) ident(get_edge) ident(n) operator(}) + reserved(for) ident(i) reserved(in) integer(0)operator(..)integer(3) + ident(edges)operator([)ident(i)operator(])operator(.)ident(apply) ident(edges)operator([)operator(()ident(i)operator(-)ident(dir)operator(\)) operator(%) integer(4)operator(]) + reserved(end) + reserved(end) +reserved(end) + +reserved(class) class(Cube) + reserved(def) method(initialize) + instance_variable(@sides) operator(=) operator([)operator(]) + string<delimiter(%w()content(left front right back top bottom)delimiter(\))>operator(.)ident(each_with_index) operator({) operator(|)ident(side)operator(,) ident(i)operator(|) + ident(eval)operator(()string<delimiter(")content(@sides[)inline<delimiter(#{)ident(i)delimiter(})>content(] = @)inline<delimiter(#{)ident(side)delimiter(})>content( = Side.new()inline<delimiter(#{)ident(i)delimiter(})>content(\))delimiter(")>operator(\)) + operator(}) + instance_variable(@left)operator(.)ident(sides) operator(=) operator([)instance_variable(@top)operator(,) instance_variable(@front)operator(,) instance_variable(@bottom)operator(,) instance_variable(@back)operator(]) + instance_variable(@front)operator(.)ident(sides) operator(=) operator([)instance_variable(@top)operator(,) instance_variable(@right)operator(,) instance_variable(@bottom)operator(,) instance_variable(@left)operator(]) + instance_variable(@right)operator(.)ident(sides) operator(=) operator([)instance_variable(@top)operator(,) instance_variable(@back)operator(,) instance_variable(@bottom)operator(,) instance_variable(@front)operator(]) + instance_variable(@back)operator(.)ident(sides) operator(=) operator([)instance_variable(@top)operator(,) instance_variable(@left)operator(,) instance_variable(@bottom)operator(,) instance_variable(@right)operator(]) + instance_variable(@top)operator(.)ident(sides) operator(=) operator([)instance_variable(@back)operator(,) instance_variable(@right)operator(,) instance_variable(@front)operator(,) instance_variable(@left)operator(]) + instance_variable(@bottom)operator(.)ident(sides) operator(=) operator([)instance_variable(@front)operator(,) instance_variable(@right)operator(,) instance_variable(@back)operator(,) instance_variable(@left)operator(]) + reserved(end) + + reserved(def) method(read_facelets)operator(()ident(fs)operator(\)) + ident(pattern) operator(=) constant(Regexp)operator(.)ident(new)operator(()string<delimiter(<<-EOP)>operator(.)ident(gsub)operator(()regexp<delimiter(/)char(\\w)delimiter(/)>operator(,) string<delimiter(')content(\\w)delimiter(')>operator(\))operator(.)ident(gsub)operator(()regexp<delimiter(/)char(\\s)content(+)delimiter(/)>operator(,) string<delimiter(')content(\\s)content(*)delimiter(')>operator(\))operator(\))string<content( + (w w w\) + (w w w\) + (w w w\) +(r r r\) (g g g\) (b b b\) (o o o\) +(r r r\) (g g g\) (b b b\) (o o o\) +(r r r\) (g g g\) (b b b\) (o o o\) + (y y y\) + (y y y\) + (y y y\))delimiter( + EOP)> + ident(md) operator(=) ident(pattern)operator(.)ident(match)operator(()ident(fs)operator(\))operator(.)ident(to_a) + + instance_variable(@top)operator(.)ident(facelets) operator(=) ident(parse_facelets)operator(()ident(md)operator(.)ident(values_at)operator(()integer(1)operator(,)integer(2)operator(,)integer(3)operator(\))operator(\)) + instance_variable(@left)operator(.)ident(facelets) operator(=) ident(parse_facelets)operator(()ident(md)operator(.)ident(values_at)operator(()integer(4)operator(,)integer(8)operator(,)integer(12)operator(\))operator(\)) + instance_variable(@front)operator(.)ident(facelets) operator(=) ident(parse_facelets)operator(()ident(md)operator(.)ident(values_at)operator(()integer(5)operator(,)integer(9)operator(,)integer(13)operator(\))operator(\)) + instance_variable(@right)operator(.)ident(facelets) operator(=) ident(parse_facelets)operator(()ident(md)operator(.)ident(values_at)operator(()integer(6)operator(,)integer(10)operator(,)integer(14)operator(\))operator(\)) + instance_variable(@back)operator(.)ident(facelets) operator(=) ident(parse_facelets)operator(()ident(md)operator(.)ident(values_at)operator(()integer(7)operator(,)integer(11)operator(,)integer(15)operator(\))operator(\)) + instance_variable(@bottom)operator(.)ident(facelets) operator(=) ident(parse_facelets)operator(()ident(md)operator(.)ident(values_at)operator(()integer(16)operator(,)integer(17)operator(,)integer(18)operator(\))operator(\)) + reserved(end) + + reserved(def) method(turn)operator(()ident(side)operator(,) ident(dir)operator(\)) + comment(#p 'turn %d in %d' % [side, dir]) + instance_variable(@sides)operator([)ident(side)operator(])operator(.)ident(turn)operator(()ident(dir)operator(\)) + comment(#puts inspect) + reserved(end) + + reserved(def) method(inspect) + string<delimiter(<<-EOF)>operator(.)ident(gsub)operator(()regexp<delimiter(/)content(()char(\\d)content(\):()char(\\d)content(\)-()char(\\d)content(\))delimiter(/)>operator(\)) operator({) instance_variable(@sides)operator([)global_variable($1)operator(.)ident(to_i)operator(])operator(.)ident(inspect)operator(()constant(Range)operator(.)ident(new)operator(()global_variable($2)operator(.)ident(to_i)operator(,) global_variable($3)operator(.)ident(to_i)operator(\))operator(\)) operator(})string<content( + 4:0-2 + 4:3-5 + 4:6-8 +0:0-2 1:0-2 2:0-2 3:0-2 +0:3-5 1:3-5 2:3-5 3:3-5 +0:6-8 1:6-8 2:6-8 3:6-8 + 5:0-2 + 5:3-5 + 5:6-8)delimiter( + EOF)> + reserved(end) + +ident(private) + reserved(def) method(parse_facelets)operator(()ident(rows)operator(\)) + ident(rows)operator(.)ident(join)operator(.)ident(delete)operator(()string<delimiter(')content( )delimiter(')>operator(\))operator(.)ident(split)operator(()regexp<delimiter(/)delimiter(/)>operator(\)) + reserved(end) +reserved(end) + +comment(#$stdin = DATA) + +ident(gets)operator(.)ident(to_i)operator(.)ident(times) reserved(do) operator(|)ident(i)operator(|) + ident(puts) string<delimiter(")content(Scenario #)inline<delimiter(#{)ident(i)integer(+1)delimiter(})>content(:)delimiter(")> + ident(fs) operator(=) string<delimiter(')delimiter(')> + integer(9)operator(.)ident(times) operator({) ident(fs) operator(<<) ident(gets) operator(}) + ident(cube) operator(=) constant(Cube)operator(.)ident(new) + ident(cube)operator(.)ident(read_facelets) ident(fs) + ident(gets)operator(.)ident(to_i)operator(.)ident(times) reserved(do) operator(|)ident(t)operator(|) + ident(side)operator(,) ident(dir) operator(=) ident(gets)operator(.)ident(split)operator(.)ident(map) operator({)operator(|)ident(s)operator(|) ident(s)operator(.)ident(to_i)operator(}) + ident(cube)operator(.)ident(turn)operator(()ident(side)operator(,) ident(dir)operator(\)) + reserved(end) + ident(puts) ident(cube)operator(.)ident(inspect) + ident(puts) +reserved(end) + +comment(# 2004 by murphy <korny@cYcnus.de>) +comment(# GPL) +reserved(class) class(Scenario) + reserved(class) class(TimePoint) + ident(attr_reader) symbol(:data) + reserved(def) method(initialize) operator(*)ident(data) + instance_variable(@data) operator(=) ident(data) + reserved(end) + + reserved(def) method([]) ident(i) + instance_variable(@data)operator([)ident(i)operator(]) reserved(or) integer(0) + reserved(end) + + ident(include) constant(Comparable) + reserved(def) method(<=>) ident(tp) + ident(r) operator(=) integer(0) + operator([)instance_variable(@data)operator(.)ident(size)operator(,) ident(tp)operator(.)ident(data)operator(.)ident(size)operator(])operator(.)ident(max)operator(.)ident(times) reserved(do) operator(|)ident(i)operator(|) + ident(r) operator(=) pre_constant(self)operator([)ident(i)operator(]) operator(<=>) ident(tp)operator([)ident(i)operator(]) + reserved(return) ident(r) reserved(if) ident(r)operator(.)ident(nonzero?) + reserved(end) + integer(0) + reserved(end) + + reserved(def) method(-) ident(tp) + ident(r) operator(=) operator([)operator(]) + operator([)instance_variable(@data)operator(.)ident(size)operator(,) ident(tp)operator(.)ident(data)operator(.)ident(size)operator(])operator(.)ident(max)operator(.)ident(times) reserved(do) operator(|)ident(i)operator(|) + ident(r) operator(<<) pre_constant(self)operator([)ident(i)operator(]) operator(-) ident(tp)operator([)ident(i)operator(]) + reserved(end) + ident(r) + reserved(end) + + reserved(def) method(inspect) + comment(# 01/01/1800 00:00:00) + string<delimiter(')content(%02d/%02d/%04d %02d:%02d:%02d)delimiter(')> operator(%) instance_variable(@data)operator(.)ident(values_at)operator(()integer(1)operator(,) integer(2)operator(,) integer(0)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(\)) + reserved(end) + reserved(end) + + constant(ONE_HOUR) operator(=) constant(TimePoint)operator(.)ident(new) integer(0)operator(,) integer(0)operator(,) integer(0)operator(,) integer(1)operator(,) integer(0)operator(,) integer(0) + + constant(APPOINTMENT_PATTERN) operator(=) regexp<delimiter(/)content( + ( )char(\\d)content({4} \) )char(\\s)content( ( )char(\\d)content({2} \) )char(\\s)content( ( )char(\\d)content({2} \) )char(\\s)content( ( )char(\\d)content({2} \) )char(\\s)content( ( )char(\\d)content({2} \) )char(\\s)content( ( )char(\\d)content({2} \) )char(\\s)content( + ( )char(\\d)content({4} \) )char(\\s)content( ( )char(\\d)content({2} \) )char(\\s)content( ( )char(\\d)content({2} \) )char(\\s)content( ( )char(\\d)content({2} \) )char(\\s)content( ( )char(\\d)content({2} \) )char(\\s)content( ( )char(\\d)content({2} \) + )delimiter(/)modifier(x)> + + reserved(def) method(initialize) ident(io) + instance_variable(@team_size) operator(=) ident(io)operator(.)ident(gets)operator(.)ident(to_i) + instance_variable(@data) operator(=) operator([) operator([)constant(TimePoint)operator(.)ident(new)operator(()integer(1800)operator(,) integer(01)operator(,) integer(01)operator(,) integer(00)operator(,) integer(00)operator(,) integer(00)operator(\))operator(,) instance_variable(@team_size)operator(]) operator(]) + instance_variable(@team_size)operator(.)ident(times) reserved(do) comment(# each team member) + ident(io)operator(.)ident(gets)operator(.)ident(to_i)operator(.)ident(times) reserved(do) comment(# each appointment) + ident(m) operator(=) constant(APPOINTMENT_PATTERN)operator(.)ident(match) ident(io)operator(.)ident(gets) + instance_variable(@data) operator(<<) operator([)constant(TimePoint)operator(.)ident(new)operator(()operator(*)ident(m)operator(.)ident(captures)operator([)integer(0)operator(,)integer(6)operator(])operator(.)ident(map) operator({) operator(|)ident(x)operator(|) ident(x)operator(.)ident(to_i) operator(})operator(\))operator(,) integer(-1)operator(]) + instance_variable(@data) operator(<<) operator([)constant(TimePoint)operator(.)ident(new)operator(()operator(*)ident(m)operator(.)ident(captures)operator([)integer(6)operator(,)integer(6)operator(])operator(.)ident(map) operator({) operator(|)ident(x)operator(|) ident(x)operator(.)ident(to_i) operator(})operator(\))operator(,) integer(+1)operator(]) + reserved(end) + reserved(end) + instance_variable(@data) operator(<<) operator([)constant(TimePoint)operator(.)ident(new)operator(()integer(2200)operator(,) integer(01)operator(,) integer(01)operator(,) integer(00)operator(,) integer(00)operator(,) integer(00)operator(\))operator(,) operator(-)instance_variable(@team_size)operator(]) + reserved(end) + + reserved(def) method(print_time_plan) + ident(n) operator(=) integer(0) + ident(appointment) operator(=) pre_constant(nil) + ident(no_appointment) operator(=) pre_constant(true) + instance_variable(@data)operator(.)ident(sort_by) operator({) operator(|)ident(x)operator(|) ident(x)operator([)integer(0)operator(]) operator(})operator(.)ident(each) reserved(do) operator(|)ident(x)operator(|) + ident(tp)operator(,) ident(action) operator(=) operator(*)ident(x) + ident(n) operator(+=) ident(action) + comment(# at any time during the meeting, at least two team members need to be there) + comment(# and at most one team member is allowed to be absent) + reserved(if) ident(n) operator(>)operator(=) integer(2) reserved(and) operator(()instance_variable(@team_size) operator(-) ident(n)operator(\)) operator(<=) integer(1) + ident(appointment) operator(||=) ident(tp) + reserved(else) + reserved(if) ident(appointment) + comment(# the meeting should be at least one hour in length) + reserved(if) constant(TimePoint)operator(.)ident(new)operator(()operator(*)operator(()ident(tp) operator(-) ident(appointment)operator(\))operator(\)) operator(>)operator(=) constant(ONE_HOUR) + ident(puts) string<delimiter(')content(appointment possible from %p to %p)delimiter(')> operator(%) operator([)ident(appointment)operator(,) ident(tp)operator(]) + ident(no_appointment) operator(=) pre_constant(false) + reserved(end) + ident(appointment) operator(=) pre_constant(false) + reserved(end) + reserved(end) + reserved(end) + ident(puts) string<delimiter(')content(no appointment possible)delimiter(')> reserved(if) ident(no_appointment) + reserved(end) +reserved(end) + +comment(# read the data) +pre_constant(DATA)operator(.)ident(gets)operator(.)ident(to_i)operator(.)ident(times) reserved(do) operator(|)ident(si)operator(|) comment(# each scenario) + ident(puts) string<delimiter(')content(Scenario #%d:)delimiter(')> operator(%) operator(()ident(si) operator(+) integer(1)operator(\)) + ident(sc) operator(=) constant(Scenario)operator(.)ident(new) pre_constant(DATA) + ident(sc)operator(.)ident(print_time_plan) + ident(puts) +reserved(end) + +comment(#__END__) +integer(2) +integer(3) +integer(3) +integer(2002) integer(06) integer(28) integer(15) integer(00) integer(00) integer(2002) integer(06) integer(28) integer(18) integer(00) integer(00) constant(TUD) constant(Contest) constant(Practice) constant(Session) +integer(2002) integer(06) integer(29) integer(10) integer(00) integer(00) integer(2002) integer(06) integer(29) integer(15) integer(00) integer(00) constant(TUD) constant(Contest) +integer(2002) integer(11) integer(15) integer(15) integer(00) integer(00) integer(2002) integer(11) integer(17) integer(23) integer(00) integer(00) constant(NWERC) constant(Delft) +integer(4) +integer(2002) integer(06) integer(25) integer(13) integer(30) integer(00) integer(2002) integer(06) integer(25) integer(15) integer(30) integer(00) constant(FIFA) constant(World) constant(Cup) constant(Semifinal) constant(I) +integer(2002) integer(06) integer(26) integer(13) integer(30) integer(00) integer(2002) integer(06) integer(26) integer(15) integer(30) integer(00) constant(FIFA) constant(World) constant(Cup) constant(Semifinal) constant(II) +integer(2002) integer(06) integer(29) integer(13) integer(00) integer(00) integer(2002) integer(06) integer(29) integer(15) integer(00) integer(00) constant(FIFA) constant(World) constant(Cup) constant(Third) constant(Place) +integer(2002) integer(06) integer(30) integer(13) integer(00) integer(00) integer(2002) integer(06) integer(30) integer(15) integer(00) integer(00) constant(FIFA) constant(World) constant(Cup) constant(Final) +integer(1) +integer(2002) integer(06) integer(01) integer(00) integer(00) integer(00) integer(2002) integer(06) integer(29) integer(18) integer(00) integer(00) constant(Preparation) ident(of) constant(Problem) constant(Set) +integer(2) +integer(1) +integer(1800) integer(01) integer(01) integer(00) integer(00) integer(00) integer(2200) integer(01) integer(01) integer(00) integer(00) integer(00) constant(Solving) constant(Problem) integer(8) +integer(0) + +ident(require) string<delimiter(')content(token_consts)delimiter(')> +ident(require) string<delimiter(')content(symbol)delimiter(')> +ident(require) string<delimiter(')content(ctype)delimiter(')> +ident(require) string<delimiter(')content(error)delimiter(')> + +reserved(class) class(Fixnum) + comment(# Treat char as a digit and return it's value as Fixnum.) + comment(# Returns nonsense for non-digits.) + comment(# Examples:) + comment(# <code>) + comment(# RUBY_VERSION[0].digit == '1.8.2'[0].digit == 1) + comment(# </code>) + comment(#) + comment(# <code>) + comment(# ?6.digit == 6) + comment(# </code>) + comment(#) + comment(# <code>) + comment(# ?A.digit == 17) + comment(# </code>) + reserved(def) method(digit) + pre_constant(self) operator(-) integer(?0) + reserved(end) +reserved(end) + +comment(##) +comment(# Stellt einen einfachen Scanner für die lexikalische Analyse der Sprache Pas-0 dar.) +comment(#) +comment(# @author Andreas Kunert) +comment(# Ruby port by murphy) +reserved(class) class(Scanner) + + ident(include) constant(TokenConsts) + + ident(attr_reader) symbol(:line)operator(,) symbol(:pos) + + comment(# To allow Scanner.new without parameters.) + constant(DUMMY_INPUT) operator(=) string<delimiter(')content(dummy file)delimiter(')> + reserved(def) constant(DUMMY_INPUT)operator(.)ident(getc) + pre_constant(nil) + reserved(end) + + comment(##) + comment(# Erzeugt einen Scanner, der als Eingabe das übergebene IO benutzt.) + reserved(def) method(initialize) ident(input) operator(=) constant(DUMMY_INPUT) + instance_variable(@line) operator(=) integer(1) + instance_variable(@pos) operator(=) integer(0) + + reserved(begin) + instance_variable(@input) operator(=) ident(input) + instance_variable(@next_char) operator(=) instance_variable(@input)operator(.)ident(getc) + reserved(rescue) constant(IOError) comment(# TODO show the reason!) + constant(Error)operator(.)ident(ioError) + ident(raise) + reserved(end) + reserved(end) + + comment(##) + comment(# Liest das n + reserved(def) method(read_next_char) + reserved(begin) + instance_variable(@pos) operator(+=) integer(1) + instance_variable(@current_char) operator(=) instance_variable(@next_char) + instance_variable(@next_char) operator(=) instance_variable(@input)operator(.)ident(getc) + reserved(rescue) constant(IOError) + constant(Error)operator(.)ident(ioError) + ident(raise) + reserved(end) + reserved(end) + + comment(##) + comment(# Sucht das nächste Symbol, identifiziert es, instantiiert ein entsprechendes) + comment(# PascalSymbol-Objekt und gibt es zurück.) + comment(# @see Symbol) + comment(# @return das gefundene Symbol als PascalSymbol-Objekt) + reserved(def) method(get_symbol) + ident(current_symbol) operator(=) pre_constant(nil) + reserved(until) ident(current_symbol) + ident(read_next_char) + + reserved(if) instance_variable(@current_char)operator(.)ident(alpha?) + ident(identifier) operator(=) instance_variable(@current_char)operator(.)ident(chr) + reserved(while) instance_variable(@next_char)operator(.)ident(alpha?) reserved(or) instance_variable(@next_char)operator(.)ident(digit?) + ident(identifier) operator(<<) instance_variable(@next_char) + ident(read_next_char) + reserved(end) + ident(current_symbol) operator(=) ident(handle_identifier)operator(()ident(identifier)operator(.)ident(upcase)operator(\)) + reserved(elsif) instance_variable(@current_char)operator(.)ident(digit?) + ident(current_symbol) operator(=) ident(number) + reserved(else) + reserved(case) instance_variable(@current_char) + reserved(when) integer(?\\s) + comment(# ignore) + reserved(when) integer(?\\n) + ident(new_line) + reserved(when) pre_constant(nil) + ident(current_symbol) operator(=) constant(PascalSymbol)operator(.)ident(new) constant(EOP) + reserved(when) integer(?{) + ident(comment) + + reserved(when) integer(?:) + reserved(if) instance_variable(@next_char) operator(==) integer(?=) + ident(read_next_char) + ident(current_symbol) operator(=) constant(PascalSymbol)operator(.)ident(new) constant(BECOMES) + reserved(else) + ident(current_symbol) operator(=) constant(PascalSymbol)operator(.)ident(new) constant(COLON) + reserved(end) + + reserved(when) integer(?<) + reserved(if) operator(()instance_variable(@next_char) operator(==) integer(?=)operator(\)) + ident(read_next_char) + ident(current_symbol) operator(=) constant(PascalSymbol)operator(.)ident(new) constant(LEQSY) + reserved(elsif) operator(()instance_variable(@next_char) operator(==) integer(?>)operator(\)) + ident(read_next_char) + ident(current_symbol) operator(=) constant(PascalSymbol)operator(.)ident(new) constant(NEQSY) + reserved(else) + ident(current_symbol) operator(=) constant(PascalSymbol)operator(.)ident(new) constant(LSSSY) + reserved(end) + + reserved(when) integer(?>) + reserved(if) operator(()instance_variable(@next_char) operator(==) integer(?=)operator(\)) + ident(read_next_char) + ident(current_symbol) operator(=) constant(PascalSymbol)operator(.)ident(new) constant(GEQSY) + reserved(else) + ident(current_symbol) operator(=) constant(PascalSymbol)operator(.)ident(new) constant(GRTSY) + reserved(end) + + reserved(when) integer(?.) reserved(then) ident(current_symbol) operator(=) constant(PascalSymbol)operator(.)ident(new) constant(PERIOD) + reserved(when) integer(?() reserved(then) ident(current_symbol) operator(=) constant(PascalSymbol)operator(.)ident(new) constant(LPARENT) + reserved(when) integer(?,) reserved(then) ident(current_symbol) operator(=) constant(PascalSymbol)operator(.)ident(new) constant(COMMA) + reserved(when) integer(?*) reserved(then) ident(current_symbol) operator(=) constant(PascalSymbol)operator(.)ident(new) constant(TIMES) + reserved(when) integer(?/) reserved(then) ident(current_symbol) operator(=) constant(PascalSymbol)operator(.)ident(new) constant(SLASH) + reserved(when) integer(?+) reserved(then) ident(current_symbol) operator(=) constant(PascalSymbol)operator(.)ident(new) constant(PLUS) + reserved(when) integer(?-) reserved(then) ident(current_symbol) operator(=) constant(PascalSymbol)operator(.)ident(new) constant(MINUS) + reserved(when) integer(?=) reserved(then) ident(current_symbol) operator(=) constant(PascalSymbol)operator(.)ident(new) constant(EQLSY) + reserved(when) integer(?\)) reserved(then) ident(current_symbol) operator(=) constant(PascalSymbol)operator(.)ident(new) constant(RPARENT) + reserved(when) integer(?;) reserved(then) ident(current_symbol) operator(=) constant(PascalSymbol)operator(.)ident(new) constant(SEMICOLON) + reserved(else) + constant(Error)operator(.)ident(error)operator(()integer(100)operator(,) instance_variable(@line)operator(,) instance_variable(@pos)operator(\)) reserved(if) instance_variable(@current_char) operator(>) integer(?\\s) + reserved(end) + reserved(end) + reserved(end) + ident(current_symbol) + reserved(end) + +ident(private) + comment(##) + comment(# Versucht, in dem gegebenen String ein Schlüsselwort zu erkennen.) + comment(# Sollte dabei ein Keyword gefunden werden, so gibt er ein PascalSymbol-Objekt zurück, das) + comment(# das entsprechende Keyword repräsentiert. Ansonsten besteht die Rückgabe aus) + comment(# einem SymbolIdent-Objekt (abgeleitet von PascalSymbol\), das den String 1:1 enthält) + comment(# @see symbol) + comment(# @return falls Keyword gefunden, zugehöriges PascalSymbol, sonst SymbolIdent) + reserved(def) method(handle_identifier) ident(identifier) + reserved(if) ident(sym) operator(=) constant(KEYWORD_SYMBOLS)operator([)ident(identifier)operator(]) + constant(PascalSymbol)operator(.)ident(new) ident(sym) + reserved(else) + constant(SymbolIdent)operator(.)ident(new) ident(identifier) + reserved(end) + reserved(end) + + constant(MAXINT) operator(=) integer(2)operator(**)integer(31) operator(-) integer(1) + constant(MAXINT_DIV_10) operator(=) constant(MAXINT) operator(/) integer(10) + constant(MAXINT_MOD_10) operator(=) constant(MAXINT) operator(%) integer(10) + comment(##) + comment(# Versucht, aus dem gegebenen Zeichen und den folgenden eine Zahl zusammenzusetzen.) + comment(# Dabei wird der relativ intuitive Algorithmus benutzt, die endgültige Zahl bei) + comment(# jeder weiteren Ziffer mit 10 zu multiplizieren und diese dann mit der Ziffer zu) + comment(# addieren. Sonderfälle bestehen dann nur noch in der Behandlung von reellen Zahlen.) + comment(# <BR>) + comment(# Treten dabei kein Punkt oder ein E auf, so gibt diese Methode ein SymbolIntCon-Objekt) + comment(# zurück, ansonsten (reelle Zahl\) ein SymbolRealCon-Objekt. Beide Symbole enthalten) + comment(# jeweils die Zahlwerte.) + comment(# <BR>) + comment(# Anmerkung: Diese Funktion ist mit Hilfe der Java/Ruby-API deutlich leichter zu realisieren.) + comment(# Sie wurde dennoch so implementiert, um den Algorithmus zu demonstrieren) + comment(# @see symbol) + comment(# @return SymbolIntcon- oder SymbolRealcon-Objekt, das den Zahlwert enthält) + reserved(def) method(number) + ident(is_integer) operator(=) pre_constant(true) + ident(integer_too_long) operator(=) pre_constant(false) + ident(exponent) operator(=) integer(0) + ident(exp_counter) operator(=) integer(-1) + ident(exp_sign) operator(=) integer(1) + + ident(integer_mantisse) operator(=) instance_variable(@current_char)operator(.)ident(digit) + + reserved(while) operator(()instance_variable(@next_char)operator(.)ident(digit?) reserved(and) ident(integer_mantisse) operator(<) constant(MAXINT_DIV_10)operator(\)) reserved(or) + operator(()ident(integer_mantisse) operator(==) constant(MAXINT_DIV_10) reserved(and) instance_variable(@next_char)operator(.)ident(digit) operator(<=) constant(MAXINT_MOD_10)operator(\)) + ident(integer_mantisse) operator(*=) integer(10) + ident(integer_mantisse) operator(+=) instance_variable(@next_char)operator(.)ident(digit) + ident(read_next_char) + reserved(end) + + ident(real_mantisse) operator(=) ident(integer_mantisse) + + reserved(while) instance_variable(@next_char)operator(.)ident(digit?) + ident(integer_too_long) operator(=) pre_constant(true) + ident(real_mantisse) operator(*=) integer(10) + ident(real_mantisse) operator(+=) instance_variable(@next_char)operator(.)ident(digit) + ident(read_next_char) + reserved(end) + reserved(if) instance_variable(@next_char) operator(==) integer(?.) + ident(read_next_char) + ident(is_integer) operator(=) pre_constant(false) + reserved(unless) instance_variable(@next_char)operator(.)ident(digit?) + constant(Error)operator(.)ident(error) integer(101)operator(,) instance_variable(@line)operator(,) instance_variable(@pos) + reserved(end) + reserved(while) instance_variable(@next_char)operator(.)ident(digit?) + ident(real_mantisse) operator(+=) instance_variable(@next_char)operator(.)ident(digit) operator(*) operator(()integer(10) operator(**) ident(exp_counter)operator(\)) + ident(read_next_char) + ident(exp_counter) operator(-=) integer(1) + reserved(end) + reserved(end) + reserved(if) instance_variable(@next_char) operator(==) integer(?E) + ident(is_integer) operator(=) pre_constant(false) + ident(read_next_char) + reserved(if) instance_variable(@next_char) operator(==) integer(?-) + ident(exp_sign) operator(=) integer(-1) + ident(read_next_char) + reserved(end) + reserved(unless) instance_variable(@next_char)operator(.)ident(digit?) + constant(Error)operator(.)ident(error) integer(101)operator(,) instance_variable(@line)operator(,) instance_variable(@pos) + reserved(end) + reserved(while) instance_variable(@next_char)operator(.)ident(digit?) + ident(exponent) operator(*=) integer(10) + ident(exponent) operator(+=) instance_variable(@next_char)operator(.)ident(digit) + ident(read_next_char) + reserved(end) + reserved(end) + + reserved(if) ident(is_integer) + reserved(if) ident(integer_too_long) + constant(Error)operator(.)ident(error) integer(102)operator(,) instance_variable(@line)operator(,) instance_variable(@pos) + reserved(end) + constant(SymbolIntcon)operator(.)ident(new) ident(integer_mantisse) + reserved(else) + constant(SymbolRealcon)operator(.)ident(new) ident(real_mantisse) operator(*) operator(()integer(10) operator(**) operator(()ident(exp_sign) operator(*) ident(exponent)operator(\))operator(\)) + reserved(end) + reserved(end) + + comment(##) + comment(# Sorgt für ein Überlesen von Kommentaren.) + comment(# Es werden einfach alle Zeichen bis zu einer schließenden Klammer eingelesen) + comment(# und verworfen.) + reserved(def) method(comment) + reserved(while) instance_variable(@current_char) operator(!=) integer(?}) + ident(forbid_eop) + ident(new_line) reserved(if) instance_variable(@current_char) operator(==) integer(?\\n) + ident(read_next_char) + reserved(end) + reserved(end) + + reserved(def) method(new_line) + instance_variable(@line) operator(+=) integer(1) + instance_variable(@pos) operator(=) integer(0) + reserved(end) + + reserved(def) method(forbid_eop) + reserved(if) ident(eop?) + constant(Error)operator(.)ident(error) integer(103)operator(,) instance_variable(@line)operator(,) instance_variable(@pos) + reserved(end) + ident(exit) + reserved(end) + + reserved(def) method(eop?) + instance_variable(@current_char)operator(.)ident(nil?) + reserved(end) +reserved(end) + +comment(##) +comment(# Läßt ein Testprogramm ablaufen.) +comment(# Dieses erzeugt sich ein Scanner-Objekt und ruft an diesem kontinuierlich bis zum Dateiende) +comment(# get_symbol auf.) +reserved(if) global_variable($0) operator(==) pre_constant(__FILE__) + ident(scan) operator(=) constant(Scanner)operator(.)ident(new)operator(()constant(File)operator(.)ident(new)operator(()pre_constant(ARGV)operator([)integer(0)operator(]) operator(||) string<delimiter(')content(test.pas)delimiter(')>operator(\))operator(\)) + ident(loop) reserved(do) + ident(c) operator(=) ident(scan)operator(.)ident(get_symbol) + ident(puts) ident(c) + reserved(break) reserved(if) ident(c)operator(.)ident(typ) operator(==) constant(TokenConsts)operator(::)constant(EOP) + reserved(end) +reserved(end) + diff --git a/test/scanners/ruby/jarh.in.rb b/test/scanners/ruby/jarh.in.rb new file mode 100644 index 0000000..df2176e --- /dev/null +++ b/test/scanners/ruby/jarh.in.rb @@ -0,0 +1,371 @@ +
+print ',rekcah ybuR rehtona tsuJ'.reverse
+
+print %q/92G5S="!A;F]T:&5R(%)U8GD@:&%C:V5R+```/.unpack('u')
+
+print %q/SnVzdCBhbm90aGVyIFJ1YnkgaGFja2VyLA==/.unpack('m')
+
+print 'Whfg nabgure Ehol unpxre,'.tr('A-Za-z', 'N-ZA-Mn-za-m')
+
+print({'ruby' => 'Just another Ruby hacker,'}['ruby'])
+
+print 'jUsT aNoThEr '.capitalize, 'RuBy HaCkEr,'.capitalize
+
+print ['Just another Ruby hacker,'][0]
+
+print ['hacker,', 'Ruby ', 'another ', 'Just '].reverse
+
+proc {print 'Just another Ruby hacker,'}.call
+
+def pri() print 'Just another Ruby hacker,' end; pri
+
+for i in 'Just another Ruby hacker,' do print i end
+
+print `echo -n Just another Ruby hacker,`
+
+print 'Just another Ruby hacker,'.split('')
+
+print 'JQust aQnotQher RQuby hQackQer,'.delete('Q')
+
+'Just another Ruby hacker,'.scan(/(.)/) {print $1}
+
+print 'Just ' + 'another ' + 'Ruby ' + 'hacker,'
+
+print ['4a75737420616e6f746865722052756279206861636b65722c'].pack('H*')
+
+print 'Just another Ruby hacker,'.split(/(.)/)
+
+print %w(Just another Ruby hacker,).join(' ')
+
+print({'another '=>'Just ', 'hacker,'=>'Ruby '}.invert.sort)
+
+print eval(%-eval %: %|Just another Ruby hacker,| :-)
+
+#;eval %qPprint eval %-eval %:'Just another Ruby hacker,' :-P
+
+print Hash.new('Just another Ruby hacker,')[:Ruby]
+
+print ['Just ', ['another ', ['Ruby ', ['hacker,']]]].flatten
+
+print Struct.new(*%w|Ruby Just another Ruby hacker,|)[*[0]*4].members.join(' ')
+
+print Time.now.strftime('Just another Ruby hacker,')
+
+print " Just another Ruby hacker, \r\n".strip
+
+print ['Just ', nil, 'another ', nil, 'Ruby ', nil, 'hacker,'].compact
+
+['hacker,', 'Ruby ', 'another ', 'Just '].reverse_each do |x| print x end
+
+/Just another Ruby hacker,/.source.display
+
+send :print, 'Just another Ruby hacker,'
+
+print ['Just ', 'another ', 'Ruby '] | ['another ', 'Ruby ', 'hacker,']
+
+print ['Just ', 'another ', 'Perl', 'Ruby ', 'hacker,'] - ['Perl']
+
+print [['', 'Just another Ruby hacker,']].assoc('')
+
+print ['Just another Ruby hacker,'].pack('a*')
+
+print 'Just another Ruby hacker,'.unpack('a*')
+
+print [['Just another Ruby hacker,'].pop].sort.shift
+
+print [['Just another Ruby hacker,', '']].rassoc('')
+
+{'Just another ' => 'Ruby hacker,'}.to_a.display
+
+print 'Just another Ruby hackeq,'.succ
+
+print 'jUST ANOTHER rUBY HACKER,'.swapcase
+
+print ['Just another Ruby hacker,'].find {|x| x}
+
+print %w(Just another Ruby hacker,).find_all {|x| x}.join(' ')
+
+print %w(Just another Ruby hacker,).grep(/./).join(' ')
+
+Ruby = 'Just another Ruby hacker,' and print Object.const_get(:Ruby)
+
+Proc.new {print 'Just another Ruby hacker,'}[]
+
+print 'JJuusstt aannootthheerr RRuubbyy hhaacckkeerr,,'.squeeze
+
+print [1249211252, 543256175, 1952998770, 542274914, 2032167009, 1667982706].pack('N*'), ','
+
+$> << 'Just ' << 'another ' << 'Ruby ' << 'hacker,'
+
+5.times do|i|'Jaebcunrykso ettRhr hua,'.scan(/.{5}/) do print $&[i,1] end end
+
+a=',rekcah ybuR rehtona tsuJ'.split('');print a.pop while not a.empty?
+
+print ',Pr-eok,c"a$h! kypbquuRA %roeqhbtaoon;ab rtesbujJ&'.gsub(/(.)./, '\1').reverse
+
+print /.*/.match('Just another Ruby hacker,')
+
+print $& if /.*/ === 'Just another Ruby hacker,'
+
+case 'Just another Ruby hacker,' when /.*/; print $~[0] end
+
+print Marshal.load(Marshal.dump("Just another Ruby hacker,"))
+
+'Just another Ruby hacker,'.each_byte do |x| print x.chr end
+
+print '/hacker,/another /Ruby /Just '.split('/').sort.values_at(1,3,2,4)
+
+print 'Just another Perl hacker,'.sub('Perl', 'Ruby')
+
+#$><<'RbyckJust another,'.split('').values_at(5..16,9,0,6,1,2,9,14,10,3,4,15..17)
+
+('a'..'y').to_a.join.tr('a-y','Just another Ruby hacker,').display
+
+begin print 'Just another ' ensure print 'Ruby hacker,' end
+
+'J,ursetk caanho tyhbeurR Rruebhyt ohnaac ktesru,J'.scan(/.(.)/).reverse.display
+
+'J,ursetk caanho tyhbeurR Rruebhyt ohnaac ktesru,J'.gsub(/(.)./,'\1').display
+
+a='J,ursetk caanho tyhbeurR ';0.step(24,2){|i|print a[i,1]};23.step(1,-2){|i|print a[i,1]}
+
+a='Js nte uyhce,rka bRrhoatu'.split('');12.times{print a.shift,a.pop};print a
+
+a='Js nte uyhce,rka bRrhoatu';begin a.sub!(/^(.)(.*)(.)$/){print $1,$3;$2}end while$1;print a
+
+a='J Ruby hacker,ust another';11.times{a.sub!(/^(.)(.*)(.)$/,'\1\3\2')};print a
+
+print 'Just. another! -Ruby? $hacker,'.tr_s('-.!?$ ', ' ')
+
+' e m r,yJaRnafatbpcuekewhjhskvngohrlrxsctdtiubuoyq'.scan(/(.)(.)/).collect!{|x|[x[1],x[0]]}.sort.collect!{|x|x[1]}.display
+
+'e m r y,aJnRfatapbuckewejhshvkgnholrxrcsdtitbuouqy'.scan(/../).sort.collect!{|x|x[1,1]}.display
+
+'4a75737420616e6f746865722052756279206861636b65722c'.scan(/../){print $&.hex.chr}
+
+print ['Just another Perl hacker,'].fill('Just another Ruby hacker,')
+
+$><<{1=>'Just ',2=>'another ',3=>'Ruby ',4=>'hacker,'}.sort.to_s.delete('1-4')
+
+Kernel.print %q<Just another Ruby hacker,>
+
+class Just_another_Ruby_hackerq;end;print Just_another_Ruby_hackerq.to_s.tr('_q',' ,')
+
+Kust_another_Ruby_hacker=0;print Module.constants.grep(/Kust/)[0].tr('K_','J '), ','
+
+module Lust_another_Ruby_hackerq; print name.tr('L_q', 'J ,') end
+
+class Bar; print 'Just another Ruby hacker,' end
+
+class Baz; def initialize() print 'Just another Ruby hacker,' end end; Baz.new
+
+eval "A<')I;G0@)TIU<W0@86YO=&AE<B!2=6)Y(&AA8VME<BPG".unpack('u')[0]
+
+eval "cHJpbnQgJ0p1c3QgYW5vdGhlciBSdWJ5IGhhY2tlciwn".unpack('m')[0]
+
+$stdout.write 'Just another Ruby hacker,'
+
+"Just \nanother \nRuby \nhacker,\n".each do |x| print x.chomp end
+
+print $' if /\n/x === "\nJust another Ruby hacker,"
+
+raise 'Just another Ruby hacker,' rescue print $!
+
+print File.basename('~/Just another Ruby hacker,.rb','.*')
+
+proc{|x|x['Just another Ruby hacker,']}[proc{|x|print x}]
+
+method(:print)['Just another Ruby hacker,']
+
+'Just another Ruby hacker,'.method(:display)[]
+
+print ''.replace('Just another Ruby hacker,')
+
+instance_eval do print 'Just another Ruby hacker,' end
+
+Kernel.module_eval do print 'Just another Ruby hacker,' end
+
+print %%\%s%%%%Just another Ruby hacker,%%%%%%%%%
+
+print !?????:???%?Just another Ruby hacker,?:??
+
+#({}.default='Just another Ruby hacker,')[0].display
+
+print Hash['Just another ', 'Ruby hacker,']
+
+print 'Just ' 'another ' 'Ruby ' 'hacker,'
+
+print File.dirname('Just another Ruby hacker,/Just another Ruby porter,')
+
+def $_.singleton_method_added(*) print 'Just another Ruby hacker,' end
+
+print ['Just another Ruby hacker,'].delete_at(0)
+
+print '%s %s %s %s' % %w[Just another Ruby hacker,]
+
+'cker,by haer RuanothJust '.scan(/.{5}/).reverse.display
+
+(97..121).to_a.pack('c*').tr('a-y','Just another Ruby hacker,').display
+
+'abcdefghijklmnopqrstuvwxy'.tr('a-y','Just another Ruby hacker,').display
+
+',rekcah ybuR rehtona tsuJ'.scan(/.{1}/).reverse.display
+
+print 'Just another Ruby hacker,'%%; (^_^;;;
+
+print('Just another Ruby hacker,'% %- ;-)
+
+'r,keac hbyRur heotant usJ'.scan(/.{1,2}/).reverse.display
+
+print 'Just another Ruby hacker,' * ('Just another Ruby hacker,' =~ /u/)
+
+print 'uJtsa onhtreR bu yahkcre,'.unpack('v12c').pack('n12c')
+
+print 'uJtsa onhtreR bu yahkcre,'.gsub(/(.)(.?)/, '\2\1')
+
+'uJtsa onhtreR bu yahkcre,'.scan(/(.)(.?)/){|x,y| print y+x}
+
+print 'Just another Ruby hacker,'['Just another Ruby hacker,']
+
+print 'Just another Ruby hacker,'[/.*/]
+
+print [].push('Just ', 'another ', 'Ruby ', 'hacker,')
+
+print 'Just another Ruby hacker,'[0..-1]
+
+print 'Just another Ruby hacker,'.instance_eval{self}
+
+class String; def +@() print self end; +'Just another Ruby hacker,' end
+
+print '1J2u3s4t5 6a7n8o9t0h1e2r3 4R5u6b7y8 9h0a1c2k3e4r5,'.delete('0-9')
+
+'Jaubsctd eafngohtihjekrl mRnuobpyq rhsatcukvewrx,y'.gsub(/(.)./, '\1').display
+
+#$><<{'Just another Ruby hacker,'=>''}.default=0
+
+print eval('Just another Ruby hacker,'.dump)
+
+print 'Just another Ruby hacker'.concat(?,)
+
+print 'Just another Ruby hacker,'.intern.to_s
+
+print 'Just another Ruby hacker,'.dump[1..-2]
+
+'Just another Ruby hacker,'.each_line do |x| print x end
+
+['JUST ANOTHER ', 'RUBY HACKER,'].each do |x| print x.capitalize end
+
+printf '%.25s', 'Just another Ruby hacker,JARH'
+
+print 'Just another Ruby hacker,'.split(/Z/)[0]
+
+print 'Just another Ruby hacker,'.split(//)
+
+print %w.J u s t \ a n o t h e r \ R u b y \ h a c k e r ,.
+
+print String([%[Just another Ruby hacker,]])
+
+print catch(:x){throw :x, 'Just another Ruby hacker,'}
+
+r,w = IO::pipe;w.print 'Just another Ruby hacker,';w.close;print r.gets
+
+print sprintf('%s', format('%s' % '%s', 'Just another Ruby hacker,'))
+
+print eval('Just another Ruby hacker,'.inspect)
+
+/#{print 'Just another Ruby hacker,'}/
+
+print 'Just another Ruby hacker,'.scan(/./).collect{|x|x[0]}.pack('U*')
+
+print 'Just another Ruby hacker,'.scan(/./).pack('a'*25)
+
+'Just another Ruby hacker,'.send 'yalpsid'.reverse.intern
+
+print %w.Just another Ruby Ruby Ruby hacker,..uniq.join(' ')
+
+{}.fetch(:x){'Just another Ruby hacker,'}.display
+
+{}.delete(:x){'Just another Ruby hacker,'}.display
+
+print [:x].map{'Just another Ruby hacker,'}
+
+{'Ruby hacker,'=>'Just another'}.each{|*x|print x.reverse.join(' ')}
+
+print [].unshift('Ruby hacker,').unshift('Just another').join(' ')
+
+{3=>'Ruby ',2=>'another ',4=>'hacker,',1=>'Just '}.values_at(1,2,3,4).display
+
+print [[0,'Just another Ruby hacker,'],1].first.last
+
+{''=>'JARH'}.update(''=>'Just another Ruby hacker,').display
+
+{:JARH => 'Just another Ruby hacker,'}.values.display
+
+{'Just another Ruby hacker,'=>:JARH}.invert[:JARH].display
+
+print ['Just another Ruby hacker,'=>:JARH][0].keys
+
+print [{}].slice(0..0)[0].store('', 'Just another Ruby hacker,')
+
+print 'Just another Ruby hacker,'.split.join(' ')
+
+begin print 'Just another Ruby hacker,' end while false
+
+begin rescue then else print 'Just another Ruby hacker,' end
+
+print //.match('Just another Ruby hacker,').string
+
+callcc{print 'Just another Ruby hacker,'}
+
+Thread.start{print'Just another Ruby hacker,'}.join
+
+('JARH'..'Just another Ruby hacker,').end.display
+
+('Just another'..'Ruby hacker,').to_s.tr_s('.', ' ').display
+
+unless true then else 'Just another Ruby hacker,' end.display
+
+loop do print 'Just another Ruby hacker,'; break end
+
+1.times do print 'Just another Ruby hacker,' end
+
+0.upto(0) do print 'Just another Ruby hacker,' end
+
+0.downto(0) do print 'Just another Ruby hacker,' end
+
+print Struct.new('Just_another_Ruby_hacker').to_s.split(':')[2].tr('_',' '),','
+
+def (x='Just another Ruby hacker,').foo() print self end; x.foo
+
+begin print 'Just another Ruby hacker,' end until true
+
+for i in %w[Just\ another\ Ruby\ hacker,] do print i end
+
+'Just another Ruby hacker,'.each_byte do |x| putc x end
+
+',rekcah ybuR rehtona tsuJ'.scan(/./).reverse_each do |x| putc x end
+
+print Regexp.quote('Just another Ruby hacker,').delete('\\')
+
+print true ? "Just another Ruby hacker," :-P
+
+print true ? "Just another Ruby hacker," :-D
+
+print *("Just another Ruby hacker,".."Just another Ruby hacker,").to_a
+
+print eval(%<%%Just another Ruby hacker,%>)
+
+print case when true then "Just another Ruby hacker," end
+
+print %w[Just another Ruby hacker,] * " "
+
+begin end if print "Just another Ruby hacker,"
+
+print begin "Just another Ruby hacker," end
+
+print "Just another Ruby hacker,".center(10000).strip
+
+print "Just " or print "another " or print "Ruby " or print "hacker,"
+
+print :"Just another Ruby hacker,"
+
diff --git a/test/scanners/ruby/jarh.out.raydebug b/test/scanners/ruby/jarh.out.raydebug new file mode 100644 index 0000000..a1eb7fc --- /dev/null +++ b/test/scanners/ruby/jarh.out.raydebug @@ -0,0 +1,371 @@ + +ident(print) string<delimiter(')content(,rekcah ybuR rehtona tsuJ)delimiter(')>operator(.)ident(reverse) + +ident(print) string<delimiter(%q/)content(92G5S="!A;F]T:&5R(%\)U8GD@:&%C:V5R+```)delimiter(/)>operator(.)ident(unpack)operator(()string<delimiter(')content(u)delimiter(')>operator(\)) + +ident(print) string<delimiter(%q/)content(SnVzdCBhbm90aGVyIFJ1YnkgaGFja2VyLA==)delimiter(/)>operator(.)ident(unpack)operator(()string<delimiter(')content(m)delimiter(')>operator(\)) + +ident(print) string<delimiter(')content(Whfg nabgure Ehol unpxre,)delimiter(')>operator(.)ident(tr)operator(()string<delimiter(')content(A-Za-z)delimiter(')>operator(,) string<delimiter(')content(N-ZA-Mn-za-m)delimiter(')>operator(\)) + +ident(print)operator(()operator({)string<delimiter(')content(ruby)delimiter(')> operator(=)operator(>) string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(})operator([)string<delimiter(')content(ruby)delimiter(')>operator(])operator(\)) + +ident(print) string<delimiter(')content(jUsT aNoThEr )delimiter(')>operator(.)ident(capitalize)operator(,) string<delimiter(')content(RuBy HaCkEr,)delimiter(')>operator(.)ident(capitalize) + +ident(print) operator([)string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(])operator([)integer(0)operator(]) + +ident(print) operator([)string<delimiter(')content(hacker,)delimiter(')>operator(,) string<delimiter(')content(Ruby )delimiter(')>operator(,) string<delimiter(')content(another )delimiter(')>operator(,) string<delimiter(')content(Just )delimiter(')>operator(])operator(.)ident(reverse) + +ident(proc) operator({)ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(})operator(.)ident(call) + +reserved(def) method(pri)operator(()operator(\)) ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')> reserved(end)operator(;) ident(pri) + +reserved(for) ident(i) reserved(in) string<delimiter(')content(Just another Ruby hacker,)delimiter(')> reserved(do) ident(print) ident(i) reserved(end) + +ident(print) shell<delimiter(`)content(echo -n Just another Ruby hacker,)delimiter(`)> + +ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(.)ident(split)operator(()string<delimiter(')delimiter(')>operator(\)) + +ident(print) string<delimiter(')content(JQust aQnotQher RQuby hQackQer,)delimiter(')>operator(.)ident(delete)operator(()string<delimiter(')content(Q)delimiter(')>operator(\)) + +string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(.)ident(scan)operator(()regexp<delimiter(/)content((.\))delimiter(/)>operator(\)) operator({)ident(print) global_variable($1)operator(}) + +ident(print) string<delimiter(')content(Just )delimiter(')> operator(+) string<delimiter(')content(another )delimiter(')> operator(+) string<delimiter(')content(Ruby )delimiter(')> operator(+) string<delimiter(')content(hacker,)delimiter(')> + +ident(print) operator([)string<delimiter(')content(4a75737420616e6f746865722052756279206861636b65722c)delimiter(')>operator(])operator(.)ident(pack)operator(()string<delimiter(')content(H*)delimiter(')>operator(\)) + +ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(.)ident(split)operator(()regexp<delimiter(/)content((.\))delimiter(/)>operator(\)) + +ident(print) string<delimiter(%w()content(Just another Ruby hacker,)delimiter(\))>operator(.)ident(join)operator(()string<delimiter(')content( )delimiter(')>operator(\)) + +ident(print)operator(()operator({)string<delimiter(')content(another )delimiter(')>operator(=)operator(>)string<delimiter(')content(Just )delimiter(')>operator(,) string<delimiter(')content(hacker,)delimiter(')>operator(=)operator(>)string<delimiter(')content(Ruby )delimiter(')>operator(})operator(.)ident(invert)operator(.)ident(sort)operator(\)) + +ident(print) ident(eval)operator(()string<delimiter(%-)content(eval %: %|Just another Ruby hacker,| :)delimiter(-)>operator(\)) + +comment(#;eval %qPprint eval %-eval %:'Just another Ruby hacker,' :-P) + +ident(print) constant(Hash)operator(.)ident(new)operator(()string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(\))operator([)symbol(:Ruby)operator(]) + +ident(print) operator([)string<delimiter(')content(Just )delimiter(')>operator(,) operator([)string<delimiter(')content(another )delimiter(')>operator(,) operator([)string<delimiter(')content(Ruby )delimiter(')>operator(,) operator([)string<delimiter(')content(hacker,)delimiter(')>operator(])operator(])operator(])operator(])operator(.)ident(flatten) + +ident(print) constant(Struct)operator(.)ident(new)operator(()operator(*)string<delimiter(%w|)content(Ruby Just another Ruby hacker,)delimiter(|)>operator(\))operator([)operator(*)operator([)integer(0)operator(])operator(*)integer(4)operator(])operator(.)ident(members)operator(.)ident(join)operator(()string<delimiter(')content( )delimiter(')>operator(\)) + +ident(print) constant(Time)operator(.)ident(now)operator(.)ident(strftime)operator(()string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(\)) + +ident(print) string<delimiter(")content( Just another Ruby hacker, )char(\\r)char(\\n)delimiter(")>operator(.)ident(strip) + +ident(print) operator([)string<delimiter(')content(Just )delimiter(')>operator(,) pre_constant(nil)operator(,) string<delimiter(')content(another )delimiter(')>operator(,) pre_constant(nil)operator(,) string<delimiter(')content(Ruby )delimiter(')>operator(,) pre_constant(nil)operator(,) string<delimiter(')content(hacker,)delimiter(')>operator(])operator(.)ident(compact) + +operator([)string<delimiter(')content(hacker,)delimiter(')>operator(,) string<delimiter(')content(Ruby )delimiter(')>operator(,) string<delimiter(')content(another )delimiter(')>operator(,) string<delimiter(')content(Just )delimiter(')>operator(])operator(.)ident(reverse_each) reserved(do) operator(|)ident(x)operator(|) ident(print) ident(x) reserved(end) + +regexp<delimiter(/)content(Just another Ruby hacker,)delimiter(/)>operator(.)ident(source)operator(.)ident(display) + +ident(send) symbol(:print)operator(,) string<delimiter(')content(Just another Ruby hacker,)delimiter(')> + +ident(print) operator([)string<delimiter(')content(Just )delimiter(')>operator(,) string<delimiter(')content(another )delimiter(')>operator(,) string<delimiter(')content(Ruby )delimiter(')>operator(]) operator(|) operator([)string<delimiter(')content(another )delimiter(')>operator(,) string<delimiter(')content(Ruby )delimiter(')>operator(,) string<delimiter(')content(hacker,)delimiter(')>operator(]) + +ident(print) operator([)string<delimiter(')content(Just )delimiter(')>operator(,) string<delimiter(')content(another )delimiter(')>operator(,) string<delimiter(')content(Perl)delimiter(')>operator(,) string<delimiter(')content(Ruby )delimiter(')>operator(,) string<delimiter(')content(hacker,)delimiter(')>operator(]) operator(-) operator([)string<delimiter(')content(Perl)delimiter(')>operator(]) + +ident(print) operator([)operator([)string<delimiter(')delimiter(')>operator(,) string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(])operator(])operator(.)ident(assoc)operator(()string<delimiter(')delimiter(')>operator(\)) + +ident(print) operator([)string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(])operator(.)ident(pack)operator(()string<delimiter(')content(a*)delimiter(')>operator(\)) + +ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(.)ident(unpack)operator(()string<delimiter(')content(a*)delimiter(')>operator(\)) + +ident(print) operator([)operator([)string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(])operator(.)ident(pop)operator(])operator(.)ident(sort)operator(.)ident(shift) + +ident(print) operator([)operator([)string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(,) string<delimiter(')delimiter(')>operator(])operator(])operator(.)ident(rassoc)operator(()string<delimiter(')delimiter(')>operator(\)) + +operator({)string<delimiter(')content(Just another )delimiter(')> operator(=)operator(>) string<delimiter(')content(Ruby hacker,)delimiter(')>operator(})operator(.)ident(to_a)operator(.)ident(display) + +ident(print) string<delimiter(')content(Just another Ruby hackeq,)delimiter(')>operator(.)ident(succ) + +ident(print) string<delimiter(')content(jUST ANOTHER rUBY HACKER,)delimiter(')>operator(.)ident(swapcase) + +ident(print) operator([)string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(])operator(.)ident(find) operator({)operator(|)ident(x)operator(|) ident(x)operator(}) + +ident(print) string<delimiter(%w()content(Just another Ruby hacker,)delimiter(\))>operator(.)ident(find_all) operator({)operator(|)ident(x)operator(|) ident(x)operator(})operator(.)ident(join)operator(()string<delimiter(')content( )delimiter(')>operator(\)) + +ident(print) string<delimiter(%w()content(Just another Ruby hacker,)delimiter(\))>operator(.)ident(grep)operator(()regexp<delimiter(/)content(.)delimiter(/)>operator(\))operator(.)ident(join)operator(()string<delimiter(')content( )delimiter(')>operator(\)) + +constant(Ruby) operator(=) string<delimiter(')content(Just another Ruby hacker,)delimiter(')> reserved(and) ident(print) constant(Object)operator(.)ident(const_get)operator(()symbol(:Ruby)operator(\)) + +constant(Proc)operator(.)ident(new) operator({)ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(})operator([)operator(]) + +ident(print) string<delimiter(')content(JJuusstt aannootthheerr RRuubbyy hhaacckkeerr,,)delimiter(')>operator(.)ident(squeeze) + +ident(print) operator([)integer(1249211252)operator(,) integer(543256175)operator(,) integer(1952998770)operator(,) integer(542274914)operator(,) integer(2032167009)operator(,) integer(1667982706)operator(])operator(.)ident(pack)operator(()string<delimiter(')content(N*)delimiter(')>operator(\))operator(,) string<delimiter(')content(,)delimiter(')> + +global_variable($>) operator(<<) string<delimiter(')content(Just )delimiter(')> operator(<<) string<delimiter(')content(another )delimiter(')> operator(<<) string<delimiter(')content(Ruby )delimiter(')> operator(<<) string<delimiter(')content(hacker,)delimiter(')> + +integer(5)operator(.)ident(times) reserved(do)operator(|)ident(i)operator(|)string<delimiter(')content(Jaebcunrykso ettRhr hua,)delimiter(')>operator(.)ident(scan)operator(()regexp<delimiter(/)content(.{5})delimiter(/)>operator(\)) reserved(do) ident(print) global_variable($&)operator([)ident(i)operator(,)integer(1)operator(]) reserved(end) reserved(end) + +ident(a)operator(=)string<delimiter(')content(,rekcah ybuR rehtona tsuJ)delimiter(')>operator(.)ident(split)operator(()string<delimiter(')delimiter(')>operator(\))operator(;)ident(print) ident(a)operator(.)ident(pop) reserved(while) reserved(not) ident(a)operator(.)ident(empty?) + +ident(print) string<delimiter(')content(,Pr-eok,c"a$h! kypbquuRA %roeqhbtaoon;ab rtesbujJ&)delimiter(')>operator(.)ident(gsub)operator(()regexp<delimiter(/)content((.\).)delimiter(/)>operator(,) string<delimiter(')content(\\1)delimiter(')>operator(\))operator(.)ident(reverse) + +ident(print) regexp<delimiter(/)content(.*)delimiter(/)>operator(.)ident(match)operator(()string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(\)) + +ident(print) global_variable($&) reserved(if) regexp<delimiter(/)content(.*)delimiter(/)> operator(===) string<delimiter(')content(Just another Ruby hacker,)delimiter(')> + +reserved(case) string<delimiter(')content(Just another Ruby hacker,)delimiter(')> reserved(when) regexp<delimiter(/)content(.*)delimiter(/)>operator(;) ident(print) global_variable($~)operator([)integer(0)operator(]) reserved(end) + +ident(print) constant(Marshal)operator(.)ident(load)operator(()constant(Marshal)operator(.)ident(dump)operator(()string<delimiter(")content(Just another Ruby hacker,)delimiter(")>operator(\))operator(\)) + +string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(.)ident(each_byte) reserved(do) operator(|)ident(x)operator(|) ident(print) ident(x)operator(.)ident(chr) reserved(end) + +ident(print) string<delimiter(')content(/hacker,/another /Ruby /Just )delimiter(')>operator(.)ident(split)operator(()string<delimiter(')content(/)delimiter(')>operator(\))operator(.)ident(sort)operator(.)ident(values_at)operator(()integer(1)operator(,)integer(3)operator(,)integer(2)operator(,)integer(4)operator(\)) + +ident(print) string<delimiter(')content(Just another Perl hacker,)delimiter(')>operator(.)ident(sub)operator(()string<delimiter(')content(Perl)delimiter(')>operator(,) string<delimiter(')content(Ruby)delimiter(')>operator(\)) + +comment(#$><<'RbyckJust another,'.split(''\).values_at(5..16,9,0,6,1,2,9,14,10,3,4,15..17\)) + +operator(()string<delimiter(')content(a)delimiter(')>operator(..)string<delimiter(')content(y)delimiter(')>operator(\))operator(.)ident(to_a)operator(.)ident(join)operator(.)ident(tr)operator(()string<delimiter(')content(a-y)delimiter(')>operator(,)string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(\))operator(.)ident(display) + +reserved(begin) ident(print) string<delimiter(')content(Just another )delimiter(')> reserved(ensure) ident(print) string<delimiter(')content(Ruby hacker,)delimiter(')> reserved(end) + +string<delimiter(')content(J,ursetk caanho tyhbeurR Rruebhyt ohnaac ktesru,J)delimiter(')>operator(.)ident(scan)operator(()regexp<delimiter(/)content(.(.\))delimiter(/)>operator(\))operator(.)ident(reverse)operator(.)ident(display) + +string<delimiter(')content(J,ursetk caanho tyhbeurR Rruebhyt ohnaac ktesru,J)delimiter(')>operator(.)ident(gsub)operator(()regexp<delimiter(/)content((.\).)delimiter(/)>operator(,)string<delimiter(')content(\\1)delimiter(')>operator(\))operator(.)ident(display) + +ident(a)operator(=)string<delimiter(')content(J,ursetk caanho tyhbeurR )delimiter(')>operator(;)integer(0)operator(.)ident(step)operator(()integer(24)operator(,)integer(2)operator(\))operator({)operator(|)ident(i)operator(|)ident(print) ident(a)operator([)ident(i)operator(,)integer(1)operator(])operator(})operator(;)integer(23)operator(.)ident(step)operator(()integer(1)operator(,)integer(-2)operator(\))operator({)operator(|)ident(i)operator(|)ident(print) ident(a)operator([)ident(i)operator(,)integer(1)operator(])operator(}) + +ident(a)operator(=)string<delimiter(')content(Js nte uyhce,rka bRrhoatu)delimiter(')>operator(.)ident(split)operator(()string<delimiter(')delimiter(')>operator(\))operator(;)integer(12)operator(.)ident(times)operator({)ident(print) ident(a)operator(.)ident(shift)operator(,)ident(a)operator(.)ident(pop)operator(})operator(;)ident(print) ident(a) + +ident(a)operator(=)string<delimiter(')content(Js nte uyhce,rka bRrhoatu)delimiter(')>operator(;)reserved(begin) ident(a)operator(.)ident(sub!)operator(()regexp<delimiter(/)content(^(.\)(.*\)(.\)$)delimiter(/)>operator(\))operator({)ident(print) global_variable($1)operator(,)global_variable($3)operator(;)global_variable($2)operator(})reserved(end) reserved(while)global_variable($1)operator(;)ident(print) ident(a) + +ident(a)operator(=)string<delimiter(')content(J Ruby hacker,ust another)delimiter(')>operator(;)integer(11)operator(.)ident(times)operator({)ident(a)operator(.)ident(sub!)operator(()regexp<delimiter(/)content(^(.\)(.*\)(.\)$)delimiter(/)>operator(,)string<delimiter(')content(\\1)content(\\3)content(\\2)delimiter(')>operator(\))operator(})operator(;)ident(print) ident(a) + +ident(print) string<delimiter(')content(Just. another! -Ruby? $hacker,)delimiter(')>operator(.)ident(tr_s)operator(()string<delimiter(')content(-.!?$ )delimiter(')>operator(,) string<delimiter(')content( )delimiter(')>operator(\)) + +string<delimiter(')content( e m r,yJaRnafatbpcuekewhjhskvngohrlrxsctdtiubuoyq)delimiter(')>operator(.)ident(scan)operator(()regexp<delimiter(/)content((.\)(.\))delimiter(/)>operator(\))operator(.)ident(collect!)operator({)operator(|)ident(x)operator(|)operator([)ident(x)operator([)integer(1)operator(])operator(,)ident(x)operator([)integer(0)operator(])operator(])operator(})operator(.)ident(sort)operator(.)ident(collect!)operator({)operator(|)ident(x)operator(|)ident(x)operator([)integer(1)operator(])operator(})operator(.)ident(display) + +string<delimiter(')content(e m r y,aJnRfatapbuckewejhshvkgnholrxrcsdtitbuouqy)delimiter(')>operator(.)ident(scan)operator(()regexp<delimiter(/)content(..)delimiter(/)>operator(\))operator(.)ident(sort)operator(.)ident(collect!)operator({)operator(|)ident(x)operator(|)ident(x)operator([)integer(1)operator(,)integer(1)operator(])operator(})operator(.)ident(display) + +string<delimiter(')content(4a75737420616e6f746865722052756279206861636b65722c)delimiter(')>operator(.)ident(scan)operator(()regexp<delimiter(/)content(..)delimiter(/)>operator(\))operator({)ident(print) global_variable($&)operator(.)ident(hex)operator(.)ident(chr)operator(}) + +ident(print) operator([)string<delimiter(')content(Just another Perl hacker,)delimiter(')>operator(])operator(.)ident(fill)operator(()string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(\)) + +global_variable($>)operator(<<)operator({)integer(1)operator(=)operator(>)string<delimiter(')content(Just )delimiter(')>operator(,)integer(2)operator(=)operator(>)string<delimiter(')content(another )delimiter(')>operator(,)integer(3)operator(=)operator(>)string<delimiter(')content(Ruby )delimiter(')>operator(,)integer(4)operator(=)operator(>)string<delimiter(')content(hacker,)delimiter(')>operator(})operator(.)ident(sort)operator(.)ident(to_s)operator(.)ident(delete)operator(()string<delimiter(')content(1-4)delimiter(')>operator(\)) + +constant(Kernel)operator(.)ident(print) string<delimiter(%q<)content(Just another Ruby hacker,)delimiter(>)> + +reserved(class) class(Just_another_Ruby_hackerq)operator(;)reserved(end)operator(;)ident(print) constant(Just_another_Ruby_hackerq)operator(.)ident(to_s)operator(.)ident(tr)operator(()string<delimiter(')content(_q)delimiter(')>operator(,)string<delimiter(')content( ,)delimiter(')>operator(\)) + +constant(Kust_another_Ruby_hacker)operator(=)integer(0)operator(;)ident(print) constant(Module)operator(.)ident(constants)operator(.)ident(grep)operator(()regexp<delimiter(/)content(Kust)delimiter(/)>operator(\))operator([)integer(0)operator(])operator(.)ident(tr)operator(()string<delimiter(')content(K_)delimiter(')>operator(,)string<delimiter(')content(J )delimiter(')>operator(\))operator(,) string<delimiter(')content(,)delimiter(')> + +reserved(module) class(Lust_another_Ruby_hackerq)operator(;) ident(print) ident(name)operator(.)ident(tr)operator(()string<delimiter(')content(L_q)delimiter(')>operator(,) string<delimiter(')content(J ,)delimiter(')>operator(\)) reserved(end) + +reserved(class) class(Bar)operator(;) ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')> reserved(end) + +reserved(class) class(Baz)operator(;) reserved(def) method(initialize)operator(()operator(\)) ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')> reserved(end) reserved(end)operator(;) constant(Baz)operator(.)ident(new) + +ident(eval) string<delimiter(")content(A<'\)I;G0@\)TIU<W0@86YO=&AE<B!2=6\)Y(&AA8VME<BPG)delimiter(")>operator(.)ident(unpack)operator(()string<delimiter(')content(u)delimiter(')>operator(\))operator([)integer(0)operator(]) + +ident(eval) string<delimiter(")content(cHJpbnQgJ0p1c3QgYW5vdGhlciBSdWJ5IGhhY2tlciwn)delimiter(")>operator(.)ident(unpack)operator(()string<delimiter(')content(m)delimiter(')>operator(\))operator([)integer(0)operator(]) + +global_variable($stdout)operator(.)ident(write) string<delimiter(')content(Just another Ruby hacker,)delimiter(')> + +string<delimiter(")content(Just )char(\\n)content(another )char(\\n)content(Ruby )char(\\n)content(hacker,)char(\\n)delimiter(")>operator(.)ident(each) reserved(do) operator(|)ident(x)operator(|) ident(print) ident(x)operator(.)ident(chomp) reserved(end) + +ident(print) global_variable($') reserved(if) regexp<delimiter(/)char(\\n)delimiter(/)modifier(x)> operator(===) string<delimiter(")char(\\n)content(Just another Ruby hacker,)delimiter(")> + +ident(raise) string<delimiter(')content(Just another Ruby hacker,)delimiter(')> reserved(rescue) ident(print) global_variable($!) + +ident(print) constant(File)operator(.)ident(basename)operator(()string<delimiter(')content(~/Just another Ruby hacker,.rb)delimiter(')>operator(,)string<delimiter(')content(.*)delimiter(')>operator(\)) + +ident(proc)operator({)operator(|)ident(x)operator(|)ident(x)operator([)string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(])operator(})operator([)ident(proc)operator({)operator(|)ident(x)operator(|)ident(print) ident(x)operator(})operator(]) + +ident(method)operator(()symbol(:print)operator(\))operator([)string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(]) + +string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(.)ident(method)operator(()symbol(:display)operator(\))operator([)operator(]) + +ident(print) string<delimiter(')delimiter(')>operator(.)ident(replace)operator(()string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(\)) + +ident(instance_eval) reserved(do) ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')> reserved(end) + +constant(Kernel)operator(.)ident(module_eval) reserved(do) ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')> reserved(end) + +ident(print) string<delimiter(%%)char(\\%)content(s)delimiter(%)>operator(%)string<delimiter(%%)content(Just another Ruby hacker,)delimiter(%)>operator(%)string<delimiter(%%)delimiter(%)>operator(%)string<delimiter(%%)delimiter(%)> + +ident(print) operator(!)integer(??)operator(?)integer(??)operator(:)integer(??)operator(?)string<delimiter(%?)content(Just another Ruby hacker,)delimiter(?)>operator(:)integer(??) + +comment(#({}.default='Just another Ruby hacker,'\)[0].display) + +ident(print) constant(Hash)operator([)string<delimiter(')content(Just another )delimiter(')>operator(,) string<delimiter(')content(Ruby hacker,)delimiter(')>operator(]) + +ident(print) string<delimiter(')content(Just )delimiter(')> string<delimiter(')content(another )delimiter(')> string<delimiter(')content(Ruby )delimiter(')> string<delimiter(')content(hacker,)delimiter(')> + +ident(print) constant(File)operator(.)ident(dirname)operator(()string<delimiter(')content(Just another Ruby hacker,/Just another Ruby porter,)delimiter(')>operator(\)) + +reserved(def) global_variable($_)operator(.)ident(singleton_method_added)operator(()operator(*)operator(\)) ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')> reserved(end) + +ident(print) operator([)string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(])operator(.)ident(delete_at)operator(()integer(0)operator(\)) + +ident(print) string<delimiter(')content(%s %s %s %s)delimiter(')> operator(%) string<delimiter(%w[)content(Just another Ruby hacker,)delimiter(])> + +string<delimiter(')content(cker,by haer RuanothJust )delimiter(')>operator(.)ident(scan)operator(()regexp<delimiter(/)content(.{5})delimiter(/)>operator(\))operator(.)ident(reverse)operator(.)ident(display) + +operator(()integer(97)operator(..)integer(121)operator(\))operator(.)ident(to_a)operator(.)ident(pack)operator(()string<delimiter(')content(c*)delimiter(')>operator(\))operator(.)ident(tr)operator(()string<delimiter(')content(a-y)delimiter(')>operator(,)string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(\))operator(.)ident(display) + +string<delimiter(')content(abcdefghijklmnopqrstuvwxy)delimiter(')>operator(.)ident(tr)operator(()string<delimiter(')content(a-y)delimiter(')>operator(,)string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(\))operator(.)ident(display) + +string<delimiter(')content(,rekcah ybuR rehtona tsuJ)delimiter(')>operator(.)ident(scan)operator(()regexp<delimiter(/)content(.{1})delimiter(/)>operator(\))operator(.)ident(reverse)operator(.)ident(display) + +ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(%)string<delimiter(%;)content( (^_^)delimiter(;)>operator(;)operator(;) + +ident(print)operator(()string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(%) string<delimiter(%-)content( ;)delimiter(-)>operator(\)) + +string<delimiter(')content(r,keac hbyRur heotant usJ)delimiter(')>operator(.)ident(scan)operator(()regexp<delimiter(/)content(.{1,2})delimiter(/)>operator(\))operator(.)ident(reverse)operator(.)ident(display) + +ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')> operator(*) operator(()string<delimiter(')content(Just another Ruby hacker,)delimiter(')> operator(=)operator(~) regexp<delimiter(/)content(u)delimiter(/)>operator(\)) + +ident(print) string<delimiter(')content(uJtsa onhtreR bu yahkcre,)delimiter(')>operator(.)ident(unpack)operator(()string<delimiter(')content(v12c)delimiter(')>operator(\))operator(.)ident(pack)operator(()string<delimiter(')content(n12c)delimiter(')>operator(\)) + +ident(print) string<delimiter(')content(uJtsa onhtreR bu yahkcre,)delimiter(')>operator(.)ident(gsub)operator(()regexp<delimiter(/)content((.\)(.?\))delimiter(/)>operator(,) string<delimiter(')content(\\2)content(\\1)delimiter(')>operator(\)) + +string<delimiter(')content(uJtsa onhtreR bu yahkcre,)delimiter(')>operator(.)ident(scan)operator(()regexp<delimiter(/)content((.\)(.?\))delimiter(/)>operator(\))operator({)operator(|)ident(x)operator(,)ident(y)operator(|) ident(print) ident(y)operator(+)ident(x)operator(}) + +ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator([)string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(]) + +ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator([)regexp<delimiter(/)content(.*)delimiter(/)>operator(]) + +ident(print) operator([)operator(])operator(.)ident(push)operator(()string<delimiter(')content(Just )delimiter(')>operator(,) string<delimiter(')content(another )delimiter(')>operator(,) string<delimiter(')content(Ruby )delimiter(')>operator(,) string<delimiter(')content(hacker,)delimiter(')>operator(\)) + +ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator([)integer(0)operator(..)integer(-1)operator(]) + +ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(.)ident(instance_eval)operator({)pre_constant(self)operator(}) + +reserved(class) class(String)operator(;) reserved(def) method(+@)operator(()operator(\)) ident(print) pre_constant(self) reserved(end)operator(;) operator(+)string<delimiter(')content(Just another Ruby hacker,)delimiter(')> reserved(end) + +ident(print) string<delimiter(')content(1J2u3s4t5 6a7n8o9t0h1e2r3 4R5u6b7y8 9h0a1c2k3e4r5,)delimiter(')>operator(.)ident(delete)operator(()string<delimiter(')content(0-9)delimiter(')>operator(\)) + +string<delimiter(')content(Jaubsctd eafngohtihjekrl mRnuobpyq rhsatcukvewrx,y)delimiter(')>operator(.)ident(gsub)operator(()regexp<delimiter(/)content((.\).)delimiter(/)>operator(,) string<delimiter(')content(\\1)delimiter(')>operator(\))operator(.)ident(display) + +comment(#$><<{'Just another Ruby hacker,'=>''}.default=0) + +ident(print) ident(eval)operator(()string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(.)ident(dump)operator(\)) + +ident(print) string<delimiter(')content(Just another Ruby hacker)delimiter(')>operator(.)ident(concat)operator(()integer(?,)operator(\)) + +ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(.)ident(intern)operator(.)ident(to_s) + +ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(.)ident(dump)operator([)integer(1)operator(..)integer(-2)operator(]) + +string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(.)ident(each_line) reserved(do) operator(|)ident(x)operator(|) ident(print) ident(x) reserved(end) + +operator([)string<delimiter(')content(JUST ANOTHER )delimiter(')>operator(,) string<delimiter(')content(RUBY HACKER,)delimiter(')>operator(])operator(.)ident(each) reserved(do) operator(|)ident(x)operator(|) ident(print) ident(x)operator(.)ident(capitalize) reserved(end) + +ident(printf) string<delimiter(')content(%.25s)delimiter(')>operator(,) string<delimiter(')content(Just another Ruby hacker,JARH)delimiter(')> + +ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(.)ident(split)operator(()regexp<delimiter(/)content(Z)delimiter(/)>operator(\))operator([)integer(0)operator(]) + +ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(.)ident(split)operator(()regexp<delimiter(/)delimiter(/)>operator(\)) + +ident(print) string<delimiter(%w.)content(J u s t )content(\\ )content(a n o t h e r )content(\\ )content(R u b y )content(\\ )content(h a c k e r ,)delimiter(.)> + +ident(print) ident(String)operator(()operator([)string<delimiter(%[)content(Just another Ruby hacker,)delimiter(])>operator(])operator(\)) + +ident(print) ident(catch)operator(()symbol(:x)operator(\))operator({)ident(throw) symbol(:x)operator(,) string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(}) + +ident(r)operator(,)ident(w) operator(=) constant(IO)operator(::)ident(pipe)operator(;)ident(w)operator(.)ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(;)ident(w)operator(.)ident(close)operator(;)ident(print) ident(r)operator(.)ident(gets) + +ident(print) ident(sprintf)operator(()string<delimiter(')content(%s)delimiter(')>operator(,) ident(format)operator(()string<delimiter(')content(%s)delimiter(')> operator(%) string<delimiter(')content(%s)delimiter(')>operator(,) string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(\))operator(\)) + +ident(print) ident(eval)operator(()string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(.)ident(inspect)operator(\)) + +regexp<delimiter(/)inline<delimiter(#{)ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')>delimiter(})>delimiter(/)> + +ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(.)ident(scan)operator(()regexp<delimiter(/)content(.)delimiter(/)>operator(\))operator(.)ident(collect)operator({)operator(|)ident(x)operator(|)ident(x)operator([)integer(0)operator(])operator(})operator(.)ident(pack)operator(()string<delimiter(')content(U*)delimiter(')>operator(\)) + +ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(.)ident(scan)operator(()regexp<delimiter(/)content(.)delimiter(/)>operator(\))operator(.)ident(pack)operator(()string<delimiter(')content(a)delimiter(')>operator(*)integer(25)operator(\)) + +string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(.)ident(send) string<delimiter(')content(yalpsid)delimiter(')>operator(.)ident(reverse)operator(.)ident(intern) + +ident(print) string<delimiter(%w.)content(Just another Ruby Ruby Ruby hacker,)delimiter(.)>operator(.)ident(uniq)operator(.)ident(join)operator(()string<delimiter(')content( )delimiter(')>operator(\)) + +operator({)operator(})operator(.)ident(fetch)operator(()symbol(:x)operator(\))operator({)string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(})operator(.)ident(display) + +operator({)operator(})operator(.)ident(delete)operator(()symbol(:x)operator(\))operator({)string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(})operator(.)ident(display) + +ident(print) operator([)symbol(:x)operator(])operator(.)ident(map)operator({)string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(}) + +operator({)string<delimiter(')content(Ruby hacker,)delimiter(')>operator(=)operator(>)string<delimiter(')content(Just another)delimiter(')>operator(})operator(.)ident(each)operator({)operator(|*)ident(x)operator(|)ident(print) ident(x)operator(.)ident(reverse)operator(.)ident(join)operator(()string<delimiter(')content( )delimiter(')>operator(\))operator(}) + +ident(print) operator([)operator(])operator(.)ident(unshift)operator(()string<delimiter(')content(Ruby hacker,)delimiter(')>operator(\))operator(.)ident(unshift)operator(()string<delimiter(')content(Just another)delimiter(')>operator(\))operator(.)ident(join)operator(()string<delimiter(')content( )delimiter(')>operator(\)) + +operator({)integer(3)operator(=)operator(>)string<delimiter(')content(Ruby )delimiter(')>operator(,)integer(2)operator(=)operator(>)string<delimiter(')content(another )delimiter(')>operator(,)integer(4)operator(=)operator(>)string<delimiter(')content(hacker,)delimiter(')>operator(,)integer(1)operator(=)operator(>)string<delimiter(')content(Just )delimiter(')>operator(})operator(.)ident(values_at)operator(()integer(1)operator(,)integer(2)operator(,)integer(3)operator(,)integer(4)operator(\))operator(.)ident(display) + +ident(print) operator([)operator([)integer(0)operator(,)string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(])operator(,)integer(1)operator(])operator(.)ident(first)operator(.)ident(last) + +operator({)string<delimiter(')delimiter(')>operator(=)operator(>)string<delimiter(')content(JARH)delimiter(')>operator(})operator(.)ident(update)operator(()string<delimiter(')delimiter(')>operator(=)operator(>)string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(\))operator(.)ident(display) + +operator({)symbol(:JARH) operator(=)operator(>) string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(})operator(.)ident(values)operator(.)ident(display) + +operator({)string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(=)operator(>)symbol(:JARH)operator(})operator(.)ident(invert)operator([)symbol(:JARH)operator(])operator(.)ident(display) + +ident(print) operator([)string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(=)operator(>)symbol(:JARH)operator(])operator([)integer(0)operator(])operator(.)ident(keys) + +ident(print) operator([)operator({)operator(})operator(])operator(.)ident(slice)operator(()integer(0)operator(..)integer(0)operator(\))operator([)integer(0)operator(])operator(.)ident(store)operator(()string<delimiter(')delimiter(')>operator(,) string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(\)) + +ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(.)ident(split)operator(.)ident(join)operator(()string<delimiter(')content( )delimiter(')>operator(\)) + +reserved(begin) ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')> reserved(end) reserved(while) pre_constant(false) + +reserved(begin) reserved(rescue) reserved(then) reserved(else) ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')> reserved(end) + +ident(print) regexp<delimiter(/)delimiter(/)>operator(.)ident(match)operator(()string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(\))operator(.)ident(string) + +ident(callcc)operator({)ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(}) + +constant(Thread)operator(.)ident(start)operator({)ident(print)string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(})operator(.)ident(join) + +operator(()string<delimiter(')content(JARH)delimiter(')>operator(..)string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(\))operator(.)ident(end)operator(.)ident(display) + +operator(()string<delimiter(')content(Just another)delimiter(')>operator(..)string<delimiter(')content(Ruby hacker,)delimiter(')>operator(\))operator(.)ident(to_s)operator(.)ident(tr_s)operator(()string<delimiter(')content(.)delimiter(')>operator(,) string<delimiter(')content( )delimiter(')>operator(\))operator(.)ident(display) + +reserved(unless) pre_constant(true) reserved(then) reserved(else) string<delimiter(')content(Just another Ruby hacker,)delimiter(')> reserved(end)operator(.)ident(display) + +ident(loop) reserved(do) ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(;) reserved(break) reserved(end) + +integer(1)operator(.)ident(times) reserved(do) ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')> reserved(end) + +integer(0)operator(.)ident(upto)operator(()integer(0)operator(\)) reserved(do) ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')> reserved(end) + +integer(0)operator(.)ident(downto)operator(()integer(0)operator(\)) reserved(do) ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')> reserved(end) + +ident(print) constant(Struct)operator(.)ident(new)operator(()string<delimiter(')content(Just_another_Ruby_hacker)delimiter(')>operator(\))operator(.)ident(to_s)operator(.)ident(split)operator(()string<delimiter(')content(:)delimiter(')>operator(\))operator([)integer(2)operator(])operator(.)ident(tr)operator(()string<delimiter(')content(_)delimiter(')>operator(,)string<delimiter(')content( )delimiter(')>operator(\))operator(,)string<delimiter(')content(,)delimiter(')> + +reserved(def) operator(()ident(x)operator(=)string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(\))operator(.)ident(foo)operator(()operator(\)) ident(print) pre_constant(self) reserved(end)operator(;) ident(x)operator(.)ident(foo) + +reserved(begin) ident(print) string<delimiter(')content(Just another Ruby hacker,)delimiter(')> reserved(end) reserved(until) pre_constant(true) + +reserved(for) ident(i) reserved(in) string<delimiter(%w[)content(Just)content(\\ )content( another)content(\\ )content( Ruby)content(\\ )content( hacker,)delimiter(])> reserved(do) ident(print) ident(i) reserved(end) + +string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(.)ident(each_byte) reserved(do) operator(|)ident(x)operator(|) ident(putc) ident(x) reserved(end) + +string<delimiter(')content(,rekcah ybuR rehtona tsuJ)delimiter(')>operator(.)ident(scan)operator(()regexp<delimiter(/)content(.)delimiter(/)>operator(\))operator(.)ident(reverse_each) reserved(do) operator(|)ident(x)operator(|) ident(putc) ident(x) reserved(end) + +ident(print) constant(Regexp)operator(.)ident(quote)operator(()string<delimiter(')content(Just another Ruby hacker,)delimiter(')>operator(\))operator(.)ident(delete)operator(()string<delimiter(')char(\\\\)delimiter(')>operator(\)) + +ident(print) pre_constant(true) operator(?) string<delimiter(")content(Just another Ruby hacker,)delimiter(")> symbol(:-)constant(P) + +ident(print) pre_constant(true) operator(?) string<delimiter(")content(Just another Ruby hacker,)delimiter(")> symbol(:-)constant(D) + +ident(print) operator(*)operator(()string<delimiter(")content(Just another Ruby hacker,)delimiter(")>operator(..)string<delimiter(")content(Just another Ruby hacker,)delimiter(")>operator(\))operator(.)ident(to_a) + +ident(print) ident(eval)operator(()string<delimiter(%<)content(%%Just another Ruby hacker,%)delimiter(>)>operator(\)) + +ident(print) reserved(case) reserved(when) pre_constant(true) reserved(then) string<delimiter(")content(Just another Ruby hacker,)delimiter(")> reserved(end) + +ident(print) string<delimiter(%w[)content(Just another Ruby hacker,)delimiter(])> operator(*) string<delimiter(")content( )delimiter(")> + +reserved(begin) reserved(end) reserved(if) ident(print) string<delimiter(")content(Just another Ruby hacker,)delimiter(")> + +ident(print) reserved(begin) string<delimiter(")content(Just another Ruby hacker,)delimiter(")> reserved(end) + +ident(print) string<delimiter(")content(Just another Ruby hacker,)delimiter(")>operator(.)ident(center)operator(()integer(10000)operator(\))operator(.)ident(strip) + +ident(print) string<delimiter(")content(Just )delimiter(")> reserved(or) ident(print) string<delimiter(")content(another )delimiter(")> reserved(or) ident(print) string<delimiter(")content(Ruby )delimiter(")> reserved(or) ident(print) string<delimiter(")content(hacker,)delimiter(")> + +ident(print) symbol<symbol(:)delimiter(")content(Just another Ruby hacker,)delimiter(")> + diff --git a/test/scanners/ruby/open-heredoc.in.rb b/test/scanners/ruby/open-heredoc.in.rb new file mode 100644 index 0000000..9089080 --- /dev/null +++ b/test/scanners/ruby/open-heredoc.in.rb @@ -0,0 +1 @@ +<<''
diff --git a/test/scanners/ruby/open-heredoc.out.raydebug b/test/scanners/ruby/open-heredoc.out.raydebug new file mode 100644 index 0000000..72fae77 --- /dev/null +++ b/test/scanners/ruby/open-heredoc.out.raydebug @@ -0,0 +1,2 @@ +string<delimiter(<<'')>string<delimiter( +)>
\ No newline at end of file diff --git a/test/scanners/ruby/open-inline.in.rb b/test/scanners/ruby/open-inline.in.rb new file mode 100644 index 0000000..529907e --- /dev/null +++ b/test/scanners/ruby/open-inline.in.rb @@ -0,0 +1 @@ +"#{
diff --git a/test/scanners/ruby/open-inline.out.raydebug b/test/scanners/ruby/open-inline.out.raydebug new file mode 100644 index 0000000..03af29e --- /dev/null +++ b/test/scanners/ruby/open-inline.out.raydebug @@ -0,0 +1,2 @@ +string<delimiter(")inline<delimiter(#{) +>>
\ No newline at end of file diff --git a/test/scanners/ruby/open-string.in.rb b/test/scanners/ruby/open-string.in.rb new file mode 100644 index 0000000..897afad --- /dev/null +++ b/test/scanners/ruby/open-string.in.rb @@ -0,0 +1 @@ +'\
diff --git a/test/scanners/ruby/open-string.out.raydebug b/test/scanners/ruby/open-string.out.raydebug new file mode 100644 index 0000000..e44c295 --- /dev/null +++ b/test/scanners/ruby/open-string.out.raydebug @@ -0,0 +1,2 @@ +string<delimiter(')content(\\ +)>
\ No newline at end of file diff --git a/test/scanners/ruby/pleac.in.rb b/test/scanners/ruby/pleac.in.rb new file mode 100644 index 0000000..0f967b9 --- /dev/null +++ b/test/scanners/ruby/pleac.in.rb @@ -0,0 +1,6368 @@ +# -*- ruby -*- + +# Local variables: +# indent-tabs-mode: nil +# ruby-indent-level: 4 +# End: + +# @@PLEAC@@_NAME +# @@SKIP@@ Ruby + +# @@PLEAC@@_WEB +# @@SKIP@@ http://www.ruby-lang.org + + +# @@PLEAC@@_1.0 +string = '\n' # two characters, \ and an n +string = 'Jon \'Maddog\' Orwant' # literal single quotes + +string = "\n" # a "newline" character +string = "Jon \"Maddog\" Orwant" # literal double quotes + +string = %q/Jon 'Maddog' Orwant/ # literal single quotes + +string = %q[Jon 'Maddog' Orwant] # literal single quotes +string = %q{Jon 'Maddog' Orwant} # literal single quotes +string = %q(Jon 'Maddog' Orwant) # literal single quotes +string = %q<Jon 'Maddog' Orwant> # literal single quotes + +a = <<"EOF" +This is a multiline here document +terminated by EOF on a line by itself +EOF + + +# @@PLEAC@@_1.1 +value = string[offset,count] +value = string[offset..-1] + +string[offset,count] = newstring +string[offset..-1] = newtail + +# in Ruby we can also specify intervals by their two offsets +value = string[offset..offs2] +string[offset..offs2] = newstring + +leading, s1, s2, trailing = data.unpack("A5 x3 A8 A8 A*") + +fivers = string.unpack("A5" * (string.length/5)) + +chars = string.unpack("A1" * string.length) + +string = "This is what you have" +# +012345678901234567890 Indexing forwards (left to right) +# 109876543210987654321- Indexing backwards (right to left) +# note that 0 means 10 or 20, etc. above + +first = string[0, 1] # "T" +start = string[5, 2] # "is" +rest = string[13..-1] # "you have" +last = string[-1, 1] # "e" +end_ = string[-4..-1] # "have" +piece = string[-8, 3] # "you" + +string[5, 2] = "wasn't" # change "is" to "wasn't" +string[-12..-1] = "ondrous" # "This wasn't wondrous" +string[0, 1] = "" # delete first character +string[-10..-1] = "" # delete last 10 characters + +if string[-10..-1] =~ /pattern/ + puts "Pattern matches in last 10 characters" +end + +string[0, 5].gsub!(/is/, 'at') + +a = "make a hat" +a[0, 1], a[-1, 1] = a[-1, 1], a[0, 1] + +a = "To be or not to be" +b = a.unpack("x6 A6") + +b, c = a.unpack("x6 A2 X5 A2") +puts "#{b}\n#{c}\n" + +def cut2fmt(*args) + template = '' + lastpos = 1 + for place in args + template += "A" + (place - lastpos).to_s + " " + lastpos = place + end + template += "A*" + return template +end + +fmt = cut2fmt(8, 14, 20, 26, 30) + + +# @@PLEAC@@_1.2 +# careful! "b is true" doesn't mean "b != 0" (0 is true in Ruby) +# thus no problem of "defined" later since only nil is false +# the following sets to `c' if `b' is nil or false +a = b || c + +# if you need Perl's behaviour (setting to `c' if `b' is 0) the most +# effective way is to use Numeric#nonzero? (thanks to Dave Thomas!) +a = b.nonzero? || c + +# you will still want to use defined? in order to test +# for scope existence of a given object +a = defined?(b) ? b : c + +dir = ARGV.shift || "/tmp" + + +# @@PLEAC@@_1.3 +v1, v2 = v2, v1 + +alpha, beta, production = %w(January March August) +alpha, beta, production = beta, production, alpha + + +# @@PLEAC@@_1.4 +num = char[0] +char = num.chr + +# Ruby also supports having a char from character constant +num = ?r + +char = sprintf("%c", num) +printf("Number %d is character %c\n", num, num) + +ascii = string.unpack("C*") +string = ascii.pack("C*") + +hal = "HAL" +ascii = hal.unpack("C*") +# We can't use Array#each since we can't mutate a Fixnum +ascii.collect! { |i| + i + 1 # add one to each ASCII value +} +ibm = ascii.pack("C*") +puts ibm + + +# @@PLEAC@@_1.5 +array = string.split('') + +array = string.unpack("C*") + +string.scan(/./) { |b| + # do something with b +} + +string = "an apple a day" +print "unique chars are: ", string.split('').uniq.sort, "\n" + +sum = 0 +for ascval in string.unpack("C*") # or use Array#each for a pure OO style :) + sum += ascval +end +puts "sum is #{sum & 0xffffffff}" # since Ruby will go Bignum if necessary + +# @@INCLUDE@@ include/ruby/slowcat.rb + + +# @@PLEAC@@_1.6 +revbytes = string.reverse + +revwords = string.split(" ").reverse.join(" ") + +revwords = string.split(/(\s+)/).reverse.join + +# using the fact that IO is Enumerable, you can directly "select" it +long_palindromes = File.open("/usr/share/dict/words"). + select { |w| w.chomp!; w.reverse == w && w.length > 5 } + + +# @@PLEAC@@_1.7 +while string.sub!("\t+") { ' ' * ($&.length * 8 - $`.length % 8) } +end + + +# @@PLEAC@@_1.8 +'You owe #{debt} to me'.gsub(/\#{(\w+)}/) { eval($1) } + +rows, cols = 24, 80 +text = %q(I am #{rows} high and #{cols} long) +text.gsub!(/\#{(\w+)}/) { eval("#{$1}") } +puts text + +'I am 17 years old'.gsub(/\d+/) { 2 * $&.to_i } + + +# @@PLEAC@@_1.9 +e = "bo peep".upcase +e.downcase! +e.capitalize! + +"thIS is a loNG liNE".gsub!(/\w+/) { $&.capitalize } + + +# @@PLEAC@@_1.10 +"I have #{n+1} guanacos." +print "I have ", n+1, " guanacos." + + +# @@PLEAC@@_1.11 +var = <<'EOF'.gsub(/^\s+/, '') + your text + goes here +EOF + + +# @@PLEAC@@_1.12 +string = "Folding and splicing is the work of an editor,\n"+ + "not a mere collection of silicon\n"+ + "and\n"+ + "mobile electrons!" + +def wrap(str, max_size) + all = [] + line = '' + for l in str.split + if (line+l).length >= max_size + all.push(line) + line = '' + end + line += line == '' ? l : ' ' + l + end + all.push(line).join("\n") +end + +print wrap(string, 20) +#=> Folding and +#=> splicing is the +#=> work of an editor, +#=> not a mere +#=> collection of +#=> silicon and mobile +#=> electrons! + + +# @@PLEAC@@_1.13 +string = %q(Mom said, "Don't do that.") +string.gsub(/['"]/) { '\\'+$& } +string.gsub(/['"]/, '\&\&') +string.gsub(/[^A-Z]/) { '\\'+$& } +"is a test!".gsub(/\W/) { '\\'+$& } # no function like quotemeta? + + +# @@PLEAC@@_1.14 +string.strip! + + +# @@PLEAC@@_1.15 +def parse_csv(text) + new = text.scan(/"([^\"\\]*(?:\\.[^\"\\]*)*)",?|([^,]+),?|,/) + new << nil if text[-1] == ?, + new.flatten.compact +end + +line = %q<XYZZY,"","O'Reilly, Inc","Wall, Larry","a \"glug\" bit,",5,"Error, Core Dumped"> +fields = parse_csv(line) +fields.each_with_index { |v,i| + print "#{i} : #{v}\n"; +} + + +# @@PLEAC@@_1.16 +# Use the soundex.rb Library from Michael Neumann. +# http://www.s-direktnet.de/homepages/neumann/rb_prgs/Soundex.rb +require 'Soundex' + +code = Text::Soundex.soundex(string) +codes = Text::Soundex.soundex(array) + +# substitution function for getpwent(): +# returns an array of user entries, +# each entry contains the username and the full name +def login_names + result = [] + File.open("/etc/passwd") { |file| + file.each_line { |line| + next if line.match(/^#/) + cols = line.split(":") + result.push([cols[0], cols[4]]) + } + } + result +end + +puts "Lookup user: " +user = STDIN.gets +user.chomp! +exit unless user +name_code = Text::Soundex.soundex(user) + +splitter = Regexp.new('(\w+)[^,]*\b(\w+)') +for username, fullname in login_names do + firstname, lastname = splitter.match(fullname)[1,2] + if name_code == Text::Soundex.soundex(username) + || name_code == Text::Soundex.soundex(firstname) + || name_code == Text::Soundex.soundex(lastname) + then + puts "#{username}: #{firstname} #{lastname}" + end +end + + +# @@PLEAC@@_1.17 +# @@INCLUDE@@ include/ruby/fixstyle.rb + + +# @@PLEAC@@_1.18 +# @@INCLUDE@@ include/ruby/psgrep.rb + + +# @@PLEAC@@_2.1 +# Matz tells that you can use Integer() for strict checked conversion. +Integer("abc") +#=> `Integer': invalid value for Integer: "abc" (ArgumentError) +Integer("567") +#=> 567 + +# You may use Float() for floating point stuff +Integer("56.7") +#=> `Integer': invalid value for Integer: "56.7" (ArgumentError) +Float("56.7") +#=> 56.7 + +# You may also use a regexp for that +if string =~ /^[+-]?\d+$/ + p 'is an integer' +else + p 'is not' +end + +if string =~ /^-?(?:\d+(?:\.\d*)?|\.\d+)$/ + p 'is a decimal number' +else + p 'is not' +end + + +# @@PLEAC@@_2.2 +# equal(num1, num2, accuracy) : returns true if num1 and num2 are +# equal to accuracy number of decimal places +def equal(i, j, a) + sprintf("%.#{a}g", i) == sprintf("%.#{a}g", j) +end + +wage = 536 # $5.36/hour +week = 40 * wage # $214.40 +printf("One week's wage is: \$%.2f\n", week/100.0) + + +# @@PLEAC@@_2.3 +num.round # rounds to integer + +a = 0.255 +b = sprintf("%.2f", a) +print "Unrounded: #{a}\nRounded: #{b}\n" +printf "Unrounded: #{a}\nRounded: %.2f\n", a + +print "number\tint\tfloor\tceil\n" +a = [ 3.3 , 3.5 , 3.7, -3.3 ] +for n in a + printf("% .1f\t% .1f\t% .1f\t% .1f\n", # at least I don't fake my output :) + n, n.to_i, n.floor, n.ceil) +end + + +# @@PLEAC@@_2.4 +def dec2bin(n) + [n].pack("N").unpack("B32")[0].sub(/^0+(?=\d)/, '') +end + +def bin2dec(n) + [("0"*32+n.to_s)[-32..-1]].pack("B32").unpack("N")[0] +end + + +# @@PLEAC@@_2.5 +for i in x .. y + # i is set to every integer from x to y, inclusive +end + +x.step(y,7) { |i| + # i is set to every integer from x to y, stepsize = 7 +} + +print "Infancy is: " +(0..2).each { |i| + print i, " " +} +print "\n" + + +# @@PLEAC@@_2.6 +# We can add conversion methods to the Integer class, +# this makes a roman number just a representation for normal numbers. +class Integer + + @@romanlist = [["M", 1000], + ["CM", 900], + ["D", 500], + ["CD", 400], + ["C", 100], + ["XC", 90], + ["L", 50], + ["XL", 40], + ["X", 10], + ["IX", 9], + ["V", 5], + ["IV", 4], + ["I", 1]] + + def to_roman + remains = self + roman = "" + for sym, num in @@romanlist + while remains >= num + remains -= num + roman << sym + end + end + roman + end + + def Integer.from_roman(roman) + ustr = roman.upcase + sum = 0 + for entry in @@romanlist + sym, num = entry[0], entry[1] + while sym == ustr[0, sym.length] + sum += num + ustr.slice!(0, sym.length) + end + end + sum + end + +end + + +roman_fifteen = 15.to_roman +puts "Roman for fifteen is #{roman_fifteen}" +i = Integer.from_roman(roman_fifteen) +puts "Converted back, #{roman_fifteen} is #{i}" + +# check +for i in (1..3900) + r = i.to_roman + j = Integer.from_roman(r) + if i != j + puts "error: #{i} : #{r} - #{j}" + end +end + + +# @@PLEAC@@_2.7 +random = rand(y-x+1)+x + +chars = ["A".."Z","a".."z","0".."9"].collect { |r| r.to_a }.join + %q(!@$%^&*) +password = (1..8).collect { chars[rand(chars.size)] }.pack("C*") + + +# @@PLEAC@@_2.8 +srand # uses a combination of the time, the process id, and a sequence number +srand(val) # for repeatable behaviour + + +# @@PLEAC@@_2.9 +# from the randomr lib: +# http://raa.ruby-lang.org/project/randomr/ +----> http://raa.ruby-lang.org/project/randomr/ + +require 'random/mersenne_twister' +mers = Random::MersenneTwister.new 123456789 +puts mers.rand(0) # 0.550321932544541 +puts mers.rand(10) # 2 + +# using online sources of random data via the realrand package: +# http://raa.ruby-lang.org/project/realrand/ +# **Note** +# The following online services are used in this package: +# http://www.random.org - source: atmospheric noise +# http://www.fourmilab.ch/hotbits - source: radioactive decay timings +# http://random.hd.org - source: entropy from local and network noise +# Please visit the sites and respect the rules of each service. + +require 'random/online' + +generator1 = Random::RandomOrg.new +puts generator1.randbyte(5).join(",") +puts generator1.randnum(10, 1, 6).join(",") # Roll dice 10 times. + +generator2 = Random::FourmiLab.new +puts generator2.randbyte(5).join(",") +# randnum is not supported. + +generator3 = Random::EntropyPool.new +puts generator3.randbyte(5).join(",") +# randnum is not supported. + + +# @@PLEAC@@_2.10 +def gaussian_rand + begin + u1 = 2 * rand() - 1 + u2 = 2 * rand() - 1 + w = u1*u1 + u2*u2 + end while (w >= 1) + w = Math.sqrt((-2*Math.log(w))/w) + [ u2*w, u1*w ] +end + +mean = 25 +sdev = 2 +salary = gaussian_rand[0] * sdev + mean +printf("You have been hired at \$%.2f\n", salary) + + +# @@PLEAC@@_2.11 +def deg2rad(d) + (d/180.0)*Math::PI +end + +def rad2deg(r) + (r/Math::PI)*180 +end + + +# @@PLEAC@@_2.12 +sin_val = Math.sin(angle) +cos_val = Math.cos(angle) +tan_val = Math.tan(angle) + +# AFAIK Ruby's Math module doesn't provide acos/asin +# While we're at it, let's also define missing hyperbolic functions +module Math + def Math.asin(x) + atan2(x, sqrt(1 - x**2)) + end + def Math.acos(x) + atan2(sqrt(1 - x**2), x) + end + def Math.atan(x) + atan2(x, 1) + end + def Math.sinh(x) + (exp(x) - exp(-x)) / 2 + end + def Math.cosh(x) + (exp(x) + exp(-x)) / 2 + end + def Math.tanh(x) + sinh(x) / cosh(x) + end +end + +# The support for Complex numbers is not built-in +y = Math.acos(3.7) +#=> in `sqrt': square root for negative number (ArgumentError) + +# There is an implementation of Complex numbers in 'complex.rb' in current +# Ruby distro, but it doesn't support atan2 with complex args, so it doesn't +# solve this problem. + + +# @@PLEAC@@_2.13 +log_e = Math.log(val) +log_10 = Math.log10(val) + +def log_base(base, val) + Math.log(val)/Math.log(base) +end + +answer = log_base(10, 10_000) +puts "log10(10,000) = #{answer}" + + +# @@PLEAC@@_2.14 +require 'matrix.rb' + +a = Matrix[[3, 2, 3], [5, 9, 8]] +b = Matrix[[4, 7], [9, 3], [8, 1]] +c = a * b + +a.row_size +a.column_size + +c.det +a.transpose + + +# @@PLEAC@@_2.15 +require 'complex.rb' +require 'rational.rb' + +a = Complex(3, 5) # 3 + 5i +b = Complex(2, -2) # 2 - 2i +puts "c = #{a*b}" + +c = a * b +d = 3 + 4*Complex::I + +printf "sqrt(#{d}) = %s\n", Math.sqrt(d) + + +# @@PLEAC@@_2.16 +number = hexadecimal.hex +number = octal.oct + +print "Gimme a number in decimal, octal, or hex: " +num = gets.chomp +exit unless defined?(num) +num = num.oct if num =~ /^0/ # does both oct and hex +printf "%d %x %o\n", num, num, num + +print "Enter file permission in octal: " +permissions = gets.chomp +raise "Exiting ...\n" unless defined?(permissions) +puts "The decimal value is #{permissions.oct}" + + +# @@PLEAC@@_2.17 +def commify(n) + n.to_s =~ /([^\.]*)(\..*)?/ + int, dec = $1.reverse, $2 ? $2 : "" + while int.gsub!(/(,|\.|^)(\d{3})(\d)/, '\1\2,\3') + end + int.reverse + dec +end + + +# @@PLEAC@@_2.18 +printf "It took %d hour%s\n", time, time == 1 ? "" : "s" + +# dunno if an equivalent to Lingua::EN::Inflect exists... + + +# @@PLEAC@@_2.19 +#----------------------------- +#!/usr/bin/ruby +# bigfact - calculating prime factors +def factorize(orig) + factors = {} + factors.default = 0 # return 0 instead nil if key not found in hash + n = orig + i = 2 + sqi = 4 # square of i + while sqi <= n do + while n.modulo(i) == 0 do + n /= i + factors[i] += 1 + # puts "Found factor #{i}" + end + # we take advantage of the fact that (i +1)**2 = i**2 + 2*i +1 + sqi += 2 * i + 1 + i += 1 + end + + if (n != 1) && (n != orig) + factors[n] += 1 + end + factors +end + +def printfactorhash(orig, factorcount) + print format("%-10d ", orig) + if factorcount.length == 0 + print "PRIME" + else + # sorts after number, because the hash keys are numbers + factorcount.sort.each { |factor,exponent| + print factor + if exponent > 1 + print "**", exponent + end + print " " + } + end + puts +end + +for arg in ARGV + n = arg.to_i + mfactors = factorize(n) + printfactorhash(n, mfactors) +end +#----------------------------- + + +# @@PLEAC@@_3.0 +puts Time.now + +print "Today is day ", Time.now.yday, " of the current year.\n" +print "Today is day ", Time.now.day, " of the current month.\n" + + +# @@PLEAC@@_3.1 +day, month, year = Time.now.day, Time.now.month, Time.now.year +# or +day, month, year = Time.now.to_a[3..5] + +tl = Time.now.localtime +printf("The current date is %04d %02d %02d\n", tl.year, tl.month, tl.day) + +Time.now.localtime.strftime("%Y-%m-%d") + + +# @@PLEAC@@_3.2 +Time.local(year, month, day, hour, minute, second).tv_sec +Time.gm(year, month, day, hour, minute, second).tv_sec + + +# @@PLEAC@@_3.3 +sec, min, hour, day, month, year, wday, yday, isdst, zone = Time.at(epoch_secs).to_a + + +# @@PLEAC@@_3.4 +when_ = now + difference # now -> Time ; difference -> Numeric (delta in seconds) +then_ = now - difference + + +# @@PLEAC@@_3.5 +bree = 361535725 +nat = 96201950 + +difference = bree - nat +puts "There were #{difference} seconds between Nat and Bree" + +seconds = difference % 60 +difference = (difference - seconds) / 60 +minutes = difference % 60 +difference = (difference - minutes) / 60 +hours = difference % 24 +difference = (difference - hours) / 24 +days = difference % 7 +weeks = (difference - days) / 7 + +puts "(#{weeks} weeks, #{days} days, #{hours}:#{minutes}:#{seconds})" + + +# @@PLEAC@@_3.6 +monthday, weekday, yearday = date.mday, date.wday, date.yday + +# AFAIK the week number is not just a division since week boundaries are on sundays +weeknum = d.strftime("%U").to_i + 1 + +year = 1981 +month = "jun" # or `6' if you want to emulate a broken language +day = 16 +t = Time.mktime(year, month, day) +print "#{month}/#{day}/#{year} was a ", t.strftime("%A"), "\n" + + +# @@PLEAC@@_3.7 +yyyy, mm, dd = $1, $2, $3 if "1998-06-25" =~ /(\d+)-(\d+)-(\d+)/ + +epoch_seconds = Time.mktime(yyyy, mm, dd).tv_sec + +# dunno an equivalent to Date::Manip#ParseDate + + +# @@PLEAC@@_3.8 +string = Time.at(epoch_secs) +Time.at(1234567890).gmtime # gives: Fri Feb 13 23:31:30 UTC 2009 + +time = Time.mktime(1973, "jan", 18, 3, 45, 50) +print "In localtime it gives: ", time.localtime, "\n" + + +# @@PLEAC@@_3.9 +# Ruby provides micro-seconds in Time object +Time.now.usec + +# Ruby gives the seconds in floating format when substracting two Time objects +before = Time.now +line = gets +elapsed = Time.now - before +puts "You took #{elapsed} seconds." + +# On my Celeron-400 with Linux-2.2.19-14mdk, average for three execs are: +# This Ruby version: average 0.00321 sec +# Cookbook's Perl version: average 0.00981 sec +size = 500 +number_of_times = 100 +total_time = 0 +number_of_times.times { + # populate array + array = [] + size.times { array << rand } + # sort it + begin_ = Time.now + array.sort! + time = Time.now - begin_ + total_time += time +} +printf "On average, sorting %d random numbers takes %.5f seconds\n", + size, (total_time/Float(number_of_times)) + + +# @@PLEAC@@_3.10 +sleep(0.005) # Ruby is definitely not as broken as Perl :) +# (may be interrupted by sending the process a SIGALRM) + + +# @@PLEAC@@_3.11 +#!/usr/bin/ruby -w +# hopdelta - feed mail header, produce lines +# showing delay at each hop. +require 'time' +class MailHopDelta + + def initialize(mail) + @head = mail.gsub(/\n\s+/,' ') + @topline = %w-Sender Recipient Time Delta- + @start_from = mail.match(/^From.*\@([^\s>]*)/)[1] + @date = Time.parse(mail.match(/^Date:\s+(.*)/)[1]) + end + + def out(line) + "%-20.20s %-20.20s %-20.20s %s" % line + end + + def hop_date(day) + day.strftime("%I:%M:%S %Y/%m/%d") + end + + def puts_hops + puts out(@topline) + puts out(['Start', @start_from, hop_date(@date),'']) + @head.split(/\n/).reverse.grep(/^Received:/).each do |hop| + hop.gsub!(/\bon (.*?) (id.*)/,'; \1') + whence = hop.match(/;\s+(.*)$/)[1] + unless whence + warn "Bad received line: #{hop}" + next + end + from = $+ if hop =~ /from\s+(\S+)|\((.*?)\)/ + by = $1 if hop =~ /by\s+(\S+\.\S+)/ + next unless now = Time.parse(whence).localtime + delta = now - @date + puts out([from, by, hop_date(now), hop_time(delta)]) + @date = now + end + end + + def hop_time(secs) + sign = secs < 0 ? -1 : 1 + days, secs = secs.abs.divmod(60 * 60 * 24) + hours,secs = secs.abs.divmod(60 * 60) + mins, secs = secs.abs.divmod(60) + rtn = "%3ds" % [secs * sign] + rtn << "%3dm" % [mins * sign] if mins != 0 + rtn << "%3dh" % [hours * sign] if hours != 0 + rtn << "%3dd" % [days * sign] if days != 0 + rtn + end +end + +$/ = "" +mail = MailHopDelta.new(ARGF.gets).puts_hops + + +# @@PLEAC@@_4.0 +single_level = [ "this", "that", "the", "other" ] + +# Ruby directly supports nested arrays +double_level = [ "this", "that", [ "the", "other" ] ] +still_single_level = [ "this", "that", [ "the", "other" ] ].flatten + + +# @@PLEAC@@_4.1 +a = [ "quick", "brown", "fox" ] +a = %w(Why are you teasing me?) + +lines = <<"END_OF_HERE_DOC".gsub(/^\s*(.+)/, '\1') + The boy stood on the burning deck, + It was as hot as glass. +END_OF_HERE_DOC + +bigarray = IO.readlines("mydatafile").collect { |l| l.chomp } + +name = "Gandalf" +banner = %Q(Speak, #{name}, and welcome!) + +host_info = `host #{his_host}` + +%x(ps #{$$}) + +banner = 'Costs only $4.95'.split(' ') + +rax = %w! ( ) < > { } [ ] ! + + +# @@PLEAC@@_4.2 +def commify_series(arr) + return '' if not arr + case arr.size + when 0 then '' + when 1 then arr[0] + when 2 then arr.join(' and ') + else arr[0..-2].join(', ') + ', and ' + arr[-1] + end +end + +array = [ "red", "yellow", "green" ] + +print "I have ", array, " marbles\n" +# -> I have redyellowgreen marbles + +# But unlike Perl: +print "I have #{array} marbles\n" +# -> I have redyellowgreen marbles +# So, needs: +print "I have #{array.join(' ')} marbles\n" +# -> I have red yellow green marbles + +#!/usr/bin/ruby +# communify_series - show proper comma insertion in list output + +def commify_series(arr) + return '' if not arr + sepchar = arr.find { |p| p =~ /,/ } ? '; ' : ', ' + case arr.size + when 0 then '' + when 1 then arr[0] + when 2 then arr.join(' and ') + else arr[0..-2].join(sepchar) + sepchar + 'and ' + arr[-1] + end +end + +lists = [ + [ 'just one thing' ], + %w(Mutt Jeff), + %w(Peter Paul Mary), + [ 'To our parents', 'Mother Theresa', 'God' ], + [ 'pastrami', 'ham and cheese', 'peanut butter and jelly', 'tuna' ], + [ 'recycle tired, old phrases', 'ponder big, happy thoughts' ], + [ 'recycle tired, old phrases', + 'ponder big, happy thoughts', + 'sleep and dream peacefully' ], +] + +for list in lists do + puts "The list is: #{commify_series(list)}." +end + + +# @@PLEAC@@_4.3 +# (note: AFAIK Ruby doesn't allow gory change of Array length) +# grow the array by assigning nil to past the end of array +ary[new_size-1] = nil +# shrink the array by slicing it down +ary.slice!(new_size..-1) +# init the array with given size +Array.new(number_of_elems) +# assign to an element past the original end enlarges the array +ary[index_new_last_elem] = value + +def what_about_that_array(a) + print "The array now has ", a.size, " elements.\n" + # Index of last element is not really interesting in Ruby + print "Element #3 is `#{a[3]}'.\n" +end +people = %w(Crosby Stills Nash Young) +what_about_that_array(people) + + +# @@PLEAC@@_4.4 +# OO style +bad_users.each { |user| + complain(user) +} +# or, functional style +for user in bad_users + complain(user) +end + +for var in ENV.keys.sort + puts "#{var}=#{ENV[var]}" +end + +for user in all_users + disk_space = get_usage(user) + if (disk_space > MAX_QUOTA) + complain(user) + end +end + +for l in IO.popen("who").readlines + print l if l =~ /^gc/ +end + +# we can mimic the obfuscated Perl way +while fh.gets # $_ is set to the line just read + chomp # $_ has a trailing \n removed, if it had one + split.each { |w| # $_ is split on whitespace + # but $_ is not set to each chunk as in Perl + print w.reverse + } +end +# ...or use a cleaner way +for l in fh.readlines + l.chomp.split.each { |w| print w.reverse } +end + +# same drawback as in problem 1.4, we can't mutate a Numeric... +array.collect! { |v| v - 1 } + +a = [ .5, 3 ]; b = [ 0, 1 ] +for ary in [ a, b ] + ary.collect! { |v| v * 7 } +end +puts "#{a.join(' ')} #{b.join(' ')}" + +# we can mutate Strings, cool; we need a trick for the scalar +for ary in [ [ scalar ], array, hash.values ] + ary.each { |v| v.strip! } # String#strip rules :) +end + + +# @@PLEAC@@_4.5 +# not relevant in Ruby since we have always references +for item in array + # do somethingh with item +end + + +# @@PLEAC@@_4.6 +unique = list.uniq + +# generate a list of users logged in, removing duplicates +users = `who`.collect { |l| l =~ /(\w+)/; $1 }.sort.uniq +puts("users logged in: #{commify_series(users)}") # see 4.2 for commify_series + + +# @@PLEAC@@_4.7 +a - b +# [ 1, 1, 2, 2, 3, 3, 3, 4, 5 ] - [ 1, 2, 4 ] -> [3, 5] + + +# @@PLEAC@@_4.8 +union = a | b +intersection = a & b +difference = a - b + + +# @@PLEAC@@_4.9 +array1.concat(array2) +# if you will assign to another object, better use: +new_ary = array1 + array2 + +members = [ "Time", "Flies" ] +initiates = [ "An", "Arrow" ] +members += initiates + +members = [ "Time", "Flies" ] +initiates = [ "An", "Arrow" ] +members[2,0] = [ "Like", initiates ].flatten + +members[0] = "Fruit" +members[3,2] = "A", "Banana" + + +# @@PLEAC@@_4.10 +reversed = ary.reverse + +ary.reverse_each { |e| + # do something with e +} + +descending = ary.sort.reverse +descending = ary.sort { |a,b| b <=> a } + + +# @@PLEAC@@_4.11 +# remove n elements from front of ary (shift n) +front = ary.slice!(0, n) + +# remove n elements from the end of ary (pop n) +end_ = ary.slice!(-n .. -1) + +# let's extend the Array class, to make that useful +class Array + def shift2() + slice!(0 .. 1) # more symetric with pop2... + end + def pop2() + slice!(-2 .. -1) + end +end + +friends = %w(Peter Paul Mary Jim Tim) +this, that = friends.shift2 + +beverages = %w(Dew Jolt Cola Sprite Fresca) +pair = beverages.pop2 + + +# @@PLEAC@@_4.12 +# use Enumerable#detect (or the synonym Enumerable#find) +highest_eng = employees.detect { |emp| emp.category == 'engineer' } + + +# @@PLEAC@@_4.13 +# use Enumerable#select (or the synonym Enumerable#find_all) +bigs = nums.select { |i| i > 1_000_000 } +pigs = users.keys.select { |k| users[k] > 1e7 } + +matching = `who`.select { |u| u =~ /^gnat / } + +engineers = employees.select { |e| e.position == 'Engineer' } + +secondary_assistance = applicants.select { |a| + a.income >= 26_000 && a.income < 30_000 +} + + +# @@PLEAC@@_4.14 +# normally you would have an array of Numeric (Float or +# Fixnum or Bignum), so you would use: +sorted = unsorted.sort +# if you have strings representing Integers or Floats +# you may specify another sort method: +sorted = unsorted.sort { |a,b| a.to_f <=> b.to_f } + +# let's use the list of my own PID's +`ps ux`.split("\n")[1..-1]. + select { |i| i =~ /^#{ENV['USER']}/ }. + collect { |i| i.split[1] }. + sort { |a,b| a.to_i <=> b.to_i }.each { |i| puts i } +puts "Select a process ID to kill:" +pid = gets.chomp +raise "Exiting ... \n" unless pid && pid =~ /^\d+$/ +Process.kill('TERM', pid.to_i) +sleep 2 +Process.kill('KILL', pid.to_i) + +descending = unsorted.sort { |a,b| b.to_f <=> a.to_f } + + +# @@PLEAC@@_4.15 +ordered = unordered.sort { |a,b| compare(a,b) } + +precomputed = unordered.collect { |e| [compute, e] } +ordered_precomputed = precomputed.sort { |a,b| a[0] <=> b[0] } +ordered = ordered_precomputed.collect { |e| e[1] } + +ordered = unordered.collect { |e| [compute, e] }. + sort { |a,b| a[0] <=> b[0] }. + collect { |e| e[1] } + +for employee in employees.sort { |a,b| a.name <=> b.name } + print employee.name, " earns \$ ", employee.salary, "\n" +end + +# Beware! `0' is true in Ruby. +# For chaining comparisons, you may use Numeric#nonzero?, which +# returns num if num is not zero, nil otherwise +sorted = employees.sort { |a,b| (a.name <=> b.name).nonzero? || b.age <=> a.age } + +users = [] +# getpwent is not wrapped in Ruby... let's fallback +IO.readlines('/etc/passwd').each { |u| users << u.split(':') } +users.sort! { |a,b| a[0] <=> b[0] } +for user in users + puts user[0] +end + +sorted = names.sort { |a,b| a[1, 1] <=> b[1, 1] } +sorted = strings.sort { |a,b| a.length <=> b.length } + +# let's show only the compact version +ordered = strings.collect { |e| [e.length, e] }. + sort { |a,b| a[0] <=> b[0] }. + collect { |e| e[1] } + +ordered = strings.collect { |e| [/\d+/.match(e)[0].to_i, e] }. + sort { |a,b| a[0] <=> b[0] }. + collect { |e| e[1] } + +print `cat /etc/passwd`.collect { |e| [e, e.split(':').indexes(3,2,0)].flatten }. + sort { |a,b| (a[1] <=> b[1]).nonzero? || (a[2] <=> b[2]).nonzero? || a[3] <=> b[3] }. + collect { |e| e[0] } + + +# @@PLEAC@@_4.16 +circular.unshift(circular.pop) # the last shall be first +circular.push(circular.shift) # and vice versa + +def grab_and_rotate(l) + l.push(ret = l.shift) + ret +end + +processes = [1, 2, 3, 4, 5] +while (1) + process = grab_and_rotate(processes) + puts "Handling process #{process}" + sleep 1 +end + + +# @@PLEAC@@_4.17 +def fisher_yates_shuffle(a) + (a.size-1).downto(1) { |i| + j = rand(i+1) + a[i], a[j] = a[j], a[i] if i != j + } +end + +def naive_shuffle(a) + for i in 0...a.size + j = rand(a.size) + a[i], a[j] = a[j], a[i] + end +end + + +# @@PLEAC@@_4.18 +#!/usr/bin/env ruby +# example 4-2 words +# words - gather lines, present in colums + +# class to encapsulate the word formatting from the input +class WordFormatter + def initialize(cols) + @cols = cols + end + + # helper to return the length of the longest word in the wordlist + def maxlen(wordlist) + max = 1 + for word in wordlist + if word.length > max + max = word.length + end + end + max + end + + # process the wordlist and print it formmated into columns + def output(wordlist) + collen = maxlen(wordlist) + 1 + columns = @cols / collen + columns = 1 if columns == 0 + rows = (wordlist.length + columns - 1) / columns + # now process each item, picking out proper piece for this position + 0.upto(rows * columns - 1) { |item| + target = (item % columns) * rows + (item / columns) + eol = ((item+1) % columns == 0) + piece = wordlist[target] || "" + piece = piece.ljust(collen) unless eol + print piece + puts if eol + } + # no need to finish it up, because eol is always true for the last element + end +end + +# get nr of chars that fit in window or console, see PLEAC 15.4 +# not portable -- linux only (?) +def getWinCharWidth() + buf = "\0" * 8 + $stdout.ioctl(0x5413, buf) + ws_row, ws_col, ws_xpixel, ws_ypixel = buf.unpack("$4") + ws_col || 80 +rescue + 80 +end + +# main program +cols = getWinCharWidth() +formatter = WordFormatter.new(cols) +words = readlines() +words.collect! { |line| + line.chomp +} +formatter.output(words) + + +# @@PLEAC@@_4.19 +# In ruby, Fixnum's are automatically converted to Bignum's when +# needed, so there is no need for an extra module +def factorial(n) + s = 1 + while n > 0 + s *= n + n -= 1 + end + s +end + +puts factorial(500) + +#--------------------------------------------------------- +# Example 4-3. tsc-permute +# tsc_permute: permute each word of input +def permute(items, perms) + unless items.length > 0 + puts perms.join(" ") + else + for i in items + newitems = items.dup + newperms = perms.dup + newperms.unshift(newitems.delete(i)) + permute(newitems, newperms) + end + end +end +# In ruby the main program must be after all definitions it is using +permute(ARGV, []) + +#--------------------------------------------------------- +# mjd_permute: permute each word of input + +def factorial(n) + s = 1 + while n > 0 + s *= n + n -= 1 + end + s +end + +# we use a class with a class variable store the private cache +# for the results of the factorial function. +class Factorial + @@fact = [ 1 ] + def Factorial.compute(n) + if @@fact[n] + @@fact[n] + else + @@fact[n] = n * Factorial.compute(n - 1) + end + end +end + +#--------------------------------------------------------- +# Example 4-4- mjd-permute +# n2pat(n, len): produce the N-th pattern of length len + +# We must use a lower case letter as parameter N, otherwise it is +# handled as constant Length is the length of the resulting +# array, not the index of the last element (length -1) like in +# the perl example. +def n2pat(n, length) + pat = [] + i = 1 + while i <= length + pat.push(n % i) + n /= i + i += 1 + end + pat +end + +# pat2perm(pat): turn pattern returned by n2pat() into +# permutation of integers. +def pat2perm(pat) + source = (0 .. pat.length - 1).to_a + perm = [] + perm.push(source.slice!(pat.pop)) while pat.length > 0 + perm +end + +def n2perm(n, len) + pat2perm(n2pat(n,len)) +end + +# In ruby the main program must be after all definitions +while gets + data = split + # the perl solution has used $#data, which is length-1 + num_permutations = Factorial.compute(data.length()) + 0.upto(num_permutations - 1) do |i| + # in ruby we can not use an array as selector for an array + # but by exchanging the two arrays, we can use the collect method + # which returns an array with the result of all block invocations + permutation = n2perm(i, data.length).collect { + |j| data[j] + } + puts permutation.join(" ") + end +end + + +# @@PLEAC@@_5.0 +age = { "Nat", 24, + "Jules", 25, + "Josh", 17 } + +age["Nat"] = 24 +age["Jules"] = 25 +age["Josh"] = 17 + +food_color = { + "Apple" => "red", + "Banana" => "yellow", + "Lemon" => "yellow", + "Carrot" => "orange" + } + +# In Ruby, you cannot avoid the double or simple quoting +# while manipulatin hashes + + +# @@PLEAC@@_5.1 +hash[key] = value + +food_color["Raspberry"] = "pink" +puts "Known foods:", food_color.keys + + +# @@PLEAC@@_5.2 +# does hash have a value for key ? +if (hash.has_key?(key)) + # it exists +else + # it doesn't +end + +[ "Banana", "Martini" ].each { |name| + print name, " is a ", food_color.has_key?(name) ? "food" : "drink", "\n" +} + +age = {} +age['Toddler'] = 3 +age['Unborn'] = 0 +age['Phantasm'] = nil + +for thing in ['Toddler', 'Unborn', 'Phantasm', 'Relic'] + print "#{thing}: " + print "Has-key " if age.has_key?(thing) + print "True " if age[thing] + print "Nonzero " if age[thing] && age[thing].nonzero? + print "\n" +end + +#=> +# Toddler: Has-key True Nonzero +# Unborn: Has-key True +# Phantasm: Has-key +# Relic: + +# You use Hash#has_key? when you use Perl's exists -> it checks +# for existence of a key in a hash. +# All Numeric are "True" in ruby, so the test doesn't have the +# same semantics as in Perl; you would use Numeric#nonzero? to +# achieve the same semantics (false if 0, true otherwise). + + +# @@PLEAC@@_5.3 +food_color.delete("Banana") + + +# @@PLEAC@@_5.4 +hash.each { |key, value| + # do something with key and value +} + +hash.each_key { |key| + # do something with key +} + +food_color.each { |food, color| + puts "#{food} is #{color}" +} + +food_color.each_key { |food| + puts "#{food} is #{food_color[food]}" +} + +# IMO this demonstrates that OO style is by far more readable +food_color.keys.sort.each { |food| + puts "#{food} is #{food_color[food]}." +} + +#----------------------------- +#!/usr/bin/ruby +# countfrom - count number of messages from each sender + +# Default value is 0 +from = Hash.new(0) +while gets + /^From: (.*)/ and from[$1] += 1 +end + +# More useful to sort by number of received mail by person +from.sort {|a,b| b[1]<=>a[1]}.each { |v| + puts "#{v[1]}: #{v[0]}" +} +#----------------------------- + + +# @@PLEAC@@_5.5 +# You may use the built-in 'inspect' method this way: +p hash + +# Or do it the Cookbook way: +hash.each { |k,v| puts "#{k} => #{v}" } + +# Sorted by keys +hash.sort.each { |e| puts "#{e[0]} => #{e[1]}" } +# Sorted by values +hash.sort{|a,b| a[1]<=>b[1]}.each { |e| puts "#{e[0]} => #{e[1]}" } + + +# @@PLEAC@@_5.7 +ttys = Hash.new +for i in `who` + user, tty = i.split + (ttys[user] ||= []) << tty # see problems_ruby for more infos +end +ttys.keys.sort.each { |k| + puts "#{k}: #{commify_series(ttys[k])}" # from 4.2 +} + + +# @@PLEAC@@_5.8 +surname = { "Mickey" => "Mantle", "Babe" => "Ruth" } +puts surname.index("Mantle") + +# If you really needed to 'invert' the whole hash, use Hash#invert + +#----------------------------- +#!/usr/bin/ruby -w +# foodfind - find match for food or color + +given = ARGV.shift or raise "usage: foodfind food_or_color" + +color = { + "Apple" => "red", + "Banana" => "yellow", + "Lemon" => "yellow", + "Carrot" => "orange", +} + +if (color.has_key?(given)) + puts "#{given} is a food with color #{color[given]}." +end +if (color.has_value?(given)) + puts "#{color.index(given)} is a food with color #{given}." +end +#----------------------------- + + +# @@PLEAC@@_5.9 +# Sorted by keys (Hash#sort gives an Array of pairs made of each key,value) +food_color.sort.each { |f| + puts "#{f[0]} is #{f[1]}." +} + +# Sorted by values +food_color.sort { |a,b| a[1] <=> b[1] }.each { |f| + puts "#{f[0]} is #{f[1]}." +} + +# Sorted by length of values +food_color.sort { |a,b| a[1].length <=> b[1].length }.each { |f| + puts "#{f[0]} is #{f[1]}." +} + + +# @@PLEAC@@_5.10 +merged = a.clone.update(b) # because Hash#update changes object in place + +drink_color = { "Galliano" => "yellow", "Mai Tai" => "blue" } +ingested_color = drink_color.clone.update(food_color) + +substance_color = {} +for i in [ food_color, drink_color ] + i.each_key { |k| + if substance_color.has_key?(k) + puts "Warning: #{k} seen twice. Using the first definition." + next + end + substance_color[k] = 1 + } +end + + +# @@PLEAC@@_5.11 +common = hash1.keys & hash2.keys + +this_not_that = hash1.keys - hash2.keys + + +# @@PLEAC@@_5.12 +# no problem here, Ruby handles any kind of object for key-ing +# (it takes Object#hash, which defaults to Object#id) + + +# @@PLEAC@@_5.13 +# AFAIK, not possible in Ruby + + +# @@PLEAC@@_5.14 +# Be careful, the following is possible only because Fixnum objects are +# special (documentation says: there is effectively only one Fixnum object +# instance for any given integer value). +count = Hash.new(0) +array.each { |e| + count[e] += 1 +} + + +# @@PLEAC@@_5.15 +father = { + "Cain" , "Adam", + "Abel" , "Adam", + "Seth" , "Adam", + "Enoch" , "Cain", + "Irad" , "Enoch", + "Mehujael" , "Irad", + "Methusael" , "Mehujael", + "Lamech" , "Methusael", + "Jabal" , "Lamech", + "Jubal" , "Lamech", + "Tubalcain" , "Lamech", + "Enos" , "Seth", +} + +while gets + chomp + begin + print $_, " " + end while $_ = father[$_] + puts +end + +children = {} +father.each { |k,v| + (children[v] ||= []) << k +} +while gets + chomp + puts "#{$_} begat #{(children[$_] || ['Nobody']).join(', ')}.\n" +end + +includes = {} +files.each { |f| + begin + for l in IO.readlines(f) + next unless l =~ /^\s*#\s*include\s*<([^>]+)>/ + (includes[$1] ||= []) << f + end + rescue SystemCallError + $stderr.puts "#$! (skipping)" + end +} + +include_free = includes.values.flatten.uniq - includes.keys + + +# @@PLEAC@@_5.16 +# dutree - print sorted intented rendition of du output +#% dutree +#% dutree /usr +#% dutree -a +#% dutree -a /bin + +# The DuNode class collects all information about a directory, +# and provides some convenience methods +class DuNode + + attr_reader :name + attr_accessor :size + attr_accessor :kids + + def initialize(name) + @name = name + @kids = [] + @size = 0 + end + + # support for sorting nodes with side + def size_compare(node2) + @size <=> node2.size + end + + def basename + @name.sub(/.*\//, "") + end + + #returns substring before last "/", nil if not there + def parent + p = @name.sub(/\/[^\/]+$/,"") + if p == @name + nil + else + p + end + end + +end + +# The DuTree does the acdtual work of +# getting the input, parsing it, builging up a tree +# and format it for output +class Dutree + + attr_reader :topdir + + def initialize + @nodes = Hash.new + @dirsizes = Hash.new(0) + @kids = Hash.new([]) + end + + # get a node by name, create it if it does not exist yet + def get_create_node(name) + if @nodes.has_key?(name) + @nodes[name] + else + node = DuNode.new(name) + @nodes[name] = node + node + end + end + + # run du, read in input, save sizes and kids + # stores last directory read in instance variable topdir + def input(arguments) + name = "" + cmd = "du " + arguments.join(" ") + IO.popen(cmd) { |pipe| + pipe.each { |line| + size, name = line.chomp.split(/\s+/, 2) + node = get_create_node(name) + node.size = size.to_i + @nodes[name] = node + parent = node.parent + if parent + get_create_node(parent).kids.push(node) + end + } + } + @topdir = @nodes[name] + end + + # figure out how much is taken in each directory + # that isn't stored in the subdirectories. Add a new + # fake kid called "." containing that much. + def get_dots(node) + cursize = node.size + for kid in node.kids + cursize -= kid.size + get_dots(kid) + end + if node.size != cursize + newnode = get_create_node(node.name + "/.") + newnode.size = cursize + node.kids.push(newnode) + end + end + + # recursively output everything + # passing padding and number width as well + # on recursive calls + def output(node, prefix="", width=0) + line = sprintf("%#{width}d %s", node.size, node.basename) + puts(prefix + line) + prefix += line.sub(/\d /, "| ") + prefix.gsub!(/[^|]/, " ") + if node.kids.length > 0 # not a bachelor node + kids = node.kids + kids.sort! { |a,b| + b.size_compare(a) + } + width = kids[0].size.to_s.length + for kid in kids + output(kid, prefix, width) + end + end + end + +end + +tree = Dutree.new +tree.input(ARGV) +tree.get_dots(tree.topdir) +tree.output(tree.topdir) + + +# @@PLEAC@@_6.0 +# The verbose version are match, sub, gsub, sub! and gsub!; +# pattern needs to be a Regexp object; it yields a MatchData +# object. +pattern.match(string) +string.sub(pattern, replacement) +string.gsub(pattern, replacement) +# As usual in Ruby, sub! does the same as sub but also modifies +# the object, the same for gsub!/gsub. + +# Sugared syntax yields the position of the match (or nil if no +# match). Note that the object at the right of the operator needs +# not to be a Regexp object (it can be a String). The "dont +# match" operator yields true or false. +meadow =~ /sheep/ # position of the match, nil if no match +meadow !~ /sheep/ # true if doesn't match, false if it does +# There is no sugared version for the substitution + +meadow =~ /\bovines?\b/i and print "Here be sheep!" + +string = "good food" +string.sub!(/o*/, 'e') + +# % echo ababacaca | ruby -ne 'puts $& if /(a|ba|b)+(a|ac)+/' +# ababa + +# The "global" (or "multiple") match is handled by String#scan +scan (/(\d+)/) { + puts "Found number #{$1}" +} + +# String#scan yields an Array if not used with a block +numbers = scan(/\d+/) + +digits = "123456789" +nonlap = digits.scan(/(\d\d\d)/) +yeslap = digits.scan(/(?=(\d\d\d))/) +puts "Non-overlapping: #{nonlap.join(' ')}" +puts "Overlapping: #{yeslap.join(' ')}"; +# Non-overlapping: 123 456 789 +# Overlapping: 123 234 345 456 567 678 789 + +string = "And little lambs eat ivy" +string =~ /l[^s]*s/ +puts "(#$`) (#$&) (#$')" +# (And ) (little lambs) ( eat ivy) + + +# @@PLEAC@@_6.1 +# Ruby doesn't have the same problem: +dst = src.sub('this', 'that') + +progname = $0.sub('^.*/', '') + +bindirs = %w(/usr/bin /bin /usr/local/bin) +libdirs = bindirs.map { |l| l.sub('bin', 'lib') } + + +# @@PLEAC@@_6.3 +/\S+/ # as many non-whitespace bytes as possible +/[A-Za-z'-]+/ # as many letters, apostrophes, and hyphens + +/\b([A-Za-z]+)\b/ # usually best +/\s([A-Za-z]+)\s/ # fails at ends or w/ punctuation + + +# @@PLEAC@@_6.4 +require 'socket' +str = 'www.ruby-lang.org and www.rubygarden.org' +re = / + ( # capture the hostname in $1 + (?: # these parens for grouping only + (?! [-_] ) # lookahead for neither underscore nor dash + [\w-] + # hostname component + \. # and the domain dot + ) + # now repeat that whole thing a bunch of times + [A-Za-z] # next must be a letter + [\w-] + # now trailing domain part + ) # end of $1 capture + /x # /x for nice formatting + +str.gsub! re do # pass a block to execute replacement + host = TCPsocket.gethostbyname($1) + "#{$1} [#{host[3]}]" +end + +puts str +#----------------------------- +# to match whitespace or #-characters in an extended re you need to escape +# them. + +foo = 42 +str = 'blah #foo# blah' +str.gsub! %r/ # replace + \# # a pound sign + (\w+) # the variable name + \# # another pound sign + /x do + eval $1 # with the value of a local variable + end +puts str # => blah 42 blah + + +# @@PLEAC@@_6.5 +# The 'g' modifier doesn't exist in Ruby, a regexp can't be used +# directly in a while loop; instead, use String#scan { |match| .. } +fish = 'One fish two fish red fish blue fish' +WANT = 3 +count = 0 +fish.scan(/(\w+)\s+fish\b/i) { + if (count += 1) == WANT + puts "The third fish is a #{$1} one." + end +} + +if fish =~ /(?:\w+\s+fish\s+){2}(\w+)\s+fish/i + puts "The third fish is a #{$1} one." +end + +pond = 'One fish two fish red fish blue fish' +# String#scan without a block gives an array of matches, each match +# being an array of all the specified groups +colors = pond.scan(/(\w+)\s+fish\b/i).flatten # get all matches +color = colors[2] # then the one we want +# or without a temporary array +color = pond.scan(/(\w+)\s+fish\b/i).flatten[2] # just grab element 3 +puts "The third fish in the pond is #{color}." + +count = 0 +fishes = 'One fish two fish red fish blue fish' +evens = fishes.scan(/(\w+)\s+fish\b/i).select { (count+=1) % 2 == 0 } +print "Even numbered fish are #{evens.join(' ')}." + +count = 0 +fishes.gsub(/ + \b # makes next \w more efficient + ( \w+ ) # this is what we\'ll be changing + ( + \s+ fish \b + ) + /x) { + if (count += 1) == 4 + 'sushi' + $2 + else + $1 + $2 + end +} + +pond = 'One fish two fish red fish blue fish swim here.' +puts "Last fish is #{pond.scan(/\b(\w+)\s+fish\b/i).flatten[-1]}" + +/ + A # find some pattern A + (?! # mustn\'t be able to find + .* # something + A # and A + ) + $ # through the end of the string +/x + +# The "s" perl modifier is "m" in Ruby (not very nice since there is +# also an "m" in perl..) +pond = "One fish two fish red fish blue fish swim here." +if (pond =~ / + \b ( \w+) \s+ fish \b + (?! .* \b fish \b ) + /mix) + puts "Last fish is #{$1}." +else + puts "Failed!" +end + + +# @@PLEAC@@_6.6 +#----------------------------- +#!/usr/bin/ruby -w +# killtags - very bad html killer +$/ = nil; # each read is whole file +while file = gets() do + file.gsub!(/<.*?>/m,''); # strip tags (terribly) + puts file # print file to STDOUT +end +#----------------------------- +#!/usr/bin/ruby -w +#headerfy - change certain chapter headers to html +$/ = '' +while file = gets() do + pattern = / + \A # start of record + ( # capture in $1 + Chapter # text string + \s+ # mandatory whitespace + \d+ # decimal number + \s* # optional whitespace + : # a real colon + . * # anything not a newline till end of line + ) + /x + puts file.gsub(pattern,'<H1>\1</H1>') +end +#----------------------------- +#% ruby -00pe "gsub!(/\A(Chapter\s+\d+\s*:.*)/,'<H1>\1</H1>')" datafile + +#!/usr/bin/ruby -w +#----------------------------- +for file in ARGV + file = File.open(ARGV.shift) + while file.gets('') do # each read is a paragraph + print "chunk #{$.} in $ARGV has <<#{$1}>>\n" while /^START(.*?)^END/m + end # /m activates the multiline mode +end +#----------------------------- + +# @@PLEAC@@_6.7 +#----------------------------- +$/ = nil; +file = File.open("datafile") +chunks = file.gets.split(/pattern/) +#----------------------------- +# .Ch, .Se and .Ss divide chunks of STDIN +chunks = gets(nil).split(/^\.(Ch|Se|Ss)$/) +print "I read #{chunks.size} chunks.\n" +#----------------------------- + + +# @@PLEAC@@_6.8 +while gets + if ~/BEGIN/ .. ~/END/ + # line falls between BEGIN and END inclusive + end +end + +while gets + if ($. == firstnum) .. ($. == lastnum) + # operate between firstnum and lastnum line number + end +end + +# in ruby versions prior to 1.8, the above two conditional +# expressions could be shortened to: +# if /BEGIN/ .. /END/ +# and +# if firstnum .. lastnum +# but these now only work this way from the command line + +#----------------------------- + +while gets + if ~/BEGIN/ ... ~/END/ + # line falls between BEGIN and END on different lines + end +end + +while gets + if ($. == first) ... ($. == last) + # operate between first and last line number on different lines + end +end + +#----------------------------- +# command-line to print lines 15 through 17 inclusive (see below) +ruby -ne 'print if 15 .. 17' datafile + +# print out all <XMP> .. </XMP> displays from HTML doc +while gets + print if ~%r#<XMP>#i .. ~%r#</XMP>#i; +end + +# same, but as shell command +# ruby -ne 'print if %r#<XMP>#i .. %r#</XMP>#i' document.html +#----------------------------- +# ruby -ne 'BEGIN { $top=3; $bottom=5 }; \ +# print if $top .. $bottom' /etc/passwd # FAILS +# ruby -ne 'BEGIN { $top=3; $bottom=5 }; \ +# print if $. == $top .. $. == $bottom' /etc/passwd # works +# ruby -ne 'print if 3 .. 5' /etc/passwd # also works +#----------------------------- +print if ~/begin/ .. ~/end/; +print if ~/begin/ ... ~/end/; +#----------------------------- +while gets + $in_header = $. == 1 .. ~/^$/ ? true : false + $in_body = ~/^$/ .. ARGF.eof ? true : false +end +#----------------------------- +seen = {} +ARGF.each do |line| + next unless line =~ /^From:?\s/i .. line =~ /^$/; + line.scan(%r/([^<>(),;\s]+\@[^<>(),;\s]+)/).each do |addr| + puts addr unless seen[addr] + seen[addr] ||= 1 + end +end + + +# @@PLEAC@@_6.9 +def glob2pat(globstr) + patmap = { + '*' => '.*', + '?' => '.', + '[' => '[', + ']' => ']', + } + globstr.gsub!(/(.)/) { |c| patmap[c] || Regexp::escape(c) } + '^' + globstr + '$' +end + + +# @@PLEAC@@_6.10 +# avoid interpolating patterns like this if the pattern +# isn't going to change: +pattern = ARGV.shift +ARGF.each do |line| + print line if line =~ /#{pattern}/ +end + +# the above creates a new regex each iteration. Instead, +# use the /o modifier so the regex is compiled only once + +pattern = ARGV.shift +ARGF.each do |line| + print line if line =~ /#{pattern}/o +end + +#----------------------------- + +#!/usr/bin/ruby +# popgrep1 - grep for abbreviations of places that say "pop" +# version 1: slow but obvious way +popstates = %w(CO ON MI WI MN) +ARGF.each do |line| + popstates.each do |state| + if line =~ /\b#{state}\b/ + print line + last + end + end +end + +#----------------------------- +#!/usr/bin/ruby +# popgrep2 - grep for abbreviations of places that say "pop" +# version 2: eval strings; fast but hard to quote +popstates = %w(CO ON MI WI MN) +code = "ARGF.each do |line|\n" +popstates.each do |state| + code += "\tif line =~ /\\b#{state}\\b/; print(line); next; end\n" +end +code += "end\n" +print "CODE IS\n---\n#{code}\n---\n" if false # turn on for debugging +eval code + +# CODE IS +# --- +# ARGF.each do |line| +# if line =~ /\bCO\b/; print(line); next; end +# if line =~ /\bON\b/; print(line); next; end +# if line =~ /\bMI\b/; print(line); next; end +# if line =~ /\bWI\b/; print(line); next; end +# if line =~ /\bMN\b/; print(line); next; end +# end +# +# --- + +## alternatively, the same idea as above but compiling +## to a case statement: (not in perlcookbook) +#!/usr/bin/ruby -w +# popgrep2.5 - grep for abbreviations of places that say "pop" +# version 2.5: eval strings; fast but hard to quote +popstates = %w(CO ON MI WI MN) +code = "ARGF.each do |line|\n case line\n" +popstates.each do |state| + code += " when /\\b#{state}\\b/ : print line\n" +end +code += " end\nend\n" +print "CODE IS\n---\n#{code}\n---\n" if false # turn on for debugging +eval code + +# CODE IS +# --- +# ARGF.each do |line| +# case line +# when /\bCO\b/ : print line +# when /\bON\b/ : print line +# when /\bMI\b/ : print line +# when /\bWI\b/ : print line +# when /\bMN\b/ : print line +# end +# end +# +# --- + +# Note: (above) Ruby 1.8+ allows the 'when EXP : EXPR' on one line +# with the colon separator. + +#----------------------------- +#!/usr/bin/ruby +# popgrep3 - grep for abbreviations of places that say "pop" +# version3: build a match_any function +popstates = %w(CO ON MI WI MN) +expr = popstates.map{|e|"line =~ /\\b#{e}\\b/"}.join('||') +eval "def match_any(line); #{expr};end" +ARGF.each do |line| + print line if match_any(line) +end +#----------------------------- + +## building a match_all function is a trivial +## substitution of && for || +## here is a generalized example: +#!/usr/bin/ruby -w +## grepauth - print lines that mention both foo and bar +class MultiMatch + def initialize(*patterns) + _any = build_match('||',patterns) + _all = build_match('&&',patterns) + eval "def match_any(line);#{_any};end\n" + eval "def match_all(line);#{_all};end\n" + end + def build_match(sym,args) + args.map{|e|"line =~ /#{e}/"}.join(sym) + end +end + +mm = MultiMatch.new('foo','bar') +ARGF.each do |line| + print line if mm.match_all(line) +end +#----------------------------- + +#!/usr/bin/ruby +# popgrep4 - grep for abbreviations of places that say "pop" +# version4: pretty fast, but simple: compile all re's first: +popstates = %w(CO ON MI WI MN) +popstates = popstates.map{|re| %r/\b#{re}\b/} +ARGF.each do |line| + popstates.each do |state_re| + if line =~ state_re + print line + break + end + end +end + +## speeds trials on the jargon file(412): 26006 lines, 1.3MB +## popgrep1 => 7.040s +## popgrep2 => 0.656s +## popgrep2.5 => 0.633s +## popgrep3 => 0.675s +## popgrep4 => 1.027s + +# unless speed is criticial, the technique in popgrep4 is a +# reasonable balance between speed and logical simplicity. + + +# @@PLEAC@@_6.11 +begin + print "Pattern? " + pat = $stdin.gets.chomp + Regexp.new(pat) +rescue + warn "Invalid Pattern" + retry +end + + +# @@PLEAC@@_6.13 +# uses the 'amatch' extension found on: +# http://raa.ruby-lang.org/project/amatch/ +require 'amatch' +matcher = Amatch.new('balast') +#$relative, $distance = 0, 1 +File.open('/usr/share/dict/words').each_line do |line| + print line if matcher.search(line) <= 1 +end +__END__ +#CODE +ballast +ballasts +balustrade +balustrades +blast +blasted +blaster +blasters +blasting +blasts + + +# @@PLEAC@@_6.14 +str.scan(/\G(\d)/).each do |token| + puts "found #{token}" +end +#----------------------------- +n = " 49 here" +n.gsub!(/\G /,'0') +puts n +#----------------------------- +str = "3,4,5,9,120" +str.scan(/\G,?(\d+)/).each do |num| + puts "Found number: #{num}" +end +#----------------------------- +# Ruby doesn't have the String.pos or a /c re modifier like Perl +# But it does have StringScanner in the standard library (strscn) +# which allows similar functionality: + +require 'strscan' +text = 'the year 1752 lost 10 days on the 3rd of September' +sc = StringScanner.new(text) +while sc.scan(/.*?(\d+)/) + print "found: #{sc[1]}\n" +end +if sc.scan(/\S+/) + puts "Found #{sc[0]} after last number" +end +#----------------------------- +# assuming continuing from above: +puts "The position in 'text' is: #{sc.pos}" +sc.pos = 30 +puts "The position in 'text' is: #{sc.pos}" + + +# @@PLEAC@@_6.15 +#----------------------------- +# greedy pattern +str.gsub!(/<.*>/m,'') # not good + +# non-greedy (minimal) pattern +str.gsub!(/<.*?>/m,'') # not great + + +#----------------------------- +#<b><i>this</i> and <i>that</i> are important</b> Oh, <b><i>me too!</i></b> +#----------------------------- +%r{ <b><i>(.*?)</i></b> }mx +#----------------------------- +%r/BEGIN((?:(?!BEGIN).)*)END/ +#----------------------------- +%r{ <b><i>( (?: (?!</b>|</i>). )* ) </i></b> }mx +#----------------------------- +%r{ <b><i>( (?: (?!</[ib]>). )* ) </i></b> }mx +#----------------------------- +%r{ + <b><i> + [^<]* # stuff not possibly bad, and not possibly the end. + (?: + # at this point, we can have '<' if not part of something bad + (?! </?[ib]> ) # what we can't have + < # okay, so match the '<' + [^<]* # and continue with more safe stuff + ) * + </i></b> + }mx + + +# @@PLEAC@@_6.16 +#----------------------------- +$/ = "" +ARGF.each do |para| + para.scan %r/ + \b # start at word boundary + (\S+) # find chunk of non-whitespace + \b # until a word boundary + ( + \s+ # followed by whitespace + \1 # and that same chunk again + \b # and a word boundary + ) + # one or more times + /xi do + puts "dup word '#{$1}' at paragraph #{$.}" + end +end +#----------------------------- +astr = 'nobody' +bstr = 'bodysnatcher' +if "#{astr} #{bstr}" =~ /^(\w+)(\w+) \2(\w+)$/ + print "#{$2} overlaps in #{$1}-#{$2}-#{$3}" +end +#----------------------------- +#!/usr/bin/ruby -w +# prime_pattern -- find prime factors of argument using patterns +ARGV << 180 +cap = 'o' * ARGV.shift +while cap =~ /^(oo+?)\1+$/ + print $1.size, " " + cap.gsub!(/#{$1}/,'o') +end +puts cap.size +#----------------------------- +#diophantine +# solve for 12x + 15y + 16z = 281, maximizing x +if ('o' * 281).match(/^(o*)\1{11}(o*)\2{14}(o*)\3{15}$/) + x, y, z = $1.size, $2.size, $3.size + puts "One solution is: x=#{x}; y=#{y}; z=#{z}" +else + puts "No solution." +end +# => One solution is: x=17; y=3; z=2 + +#----------------------------- +# using different quantifiers: +('o' * 281).match(/^(o+)\1{11}(o+)\2{14}(o+)\3{15}$/) +# => One solution is: x=17; y=3; z=2 + +('o' * 281).match(/^(o*?)\1{11}(o*)\2{14}(o*)\3{15}$/) +# => One solution is: x=0; y=7; z=11 + +('o' * 281).match(/^(o+?)\1{11}(o*)\2{14}(o*)\3{15}$/) +# => One solution is: x=1; y=3; z=14 + + +# @@PLEAC@@_6.17 +# alpha OR beta +%r/alpha|beta/ + +# alpha AND beta +%r/(?=.*alpha)(?=.*beta)/m + +# alpha AND beta, no overlap +%r/alpha.*beta|beta.*alpha/m + +# NOT beta +%r/^(?:(?!beta).)*$/m + +# NOT bad BUT good +%r/(?=(?:(?!BAD).)*$)GOOD/m +#----------------------------- + +if !(string =~ /pattern/) # ugly + something() +end + +if string !~ /pattern/ # preferred + something() +end + + +#----------------------------- +if string =~ /pat1/ && string =~ /pat2/ + something() +end +#----------------------------- +if string =~ /pat1/ || string =~ /pat2/ + something() +end +#----------------------------- +#!/usr/bin/ruby -w +# minigrep - trivial grep +pat = ARGV.shift +ARGF.each do |line| + print line if line =~ /#{pat}/o +end +#----------------------------- + "labelled" =~ /^(?=.*bell)(?=.*lab)/m +#----------------------------- +$string =~ /bell/ && $string =~ /lab/ +#----------------------------- +$murray_hill = "blah bell blah " +if $murray_hill =~ %r{ + ^ # start of string + (?= # zero-width lookahead + .* # any amount of intervening stuff + bell # the desired bell string + ) # rewind, since we were only looking + (?= # and do the same thing + .* # any amount of intervening stuff + lab # and the lab part + ) + }mx # /m means . can match newline + + print "Looks like Bell Labs might be in Murray Hill!\n"; +end +#----------------------------- +"labelled" =~ /(?:^.*bell.*lab)|(?:^.*lab.*bell)/ +#----------------------------- +$brand = "labelled"; +if $brand =~ %r{ + (?: # non-capturing grouper + ^ .*? # any amount of stuff at the front + bell # look for a bell + .*? # followed by any amount of anything + lab # look for a lab + ) # end grouper + | # otherwise, try the other direction + (?: # non-capturing grouper + ^ .*? # any amount of stuff at the front + lab # look for a lab + .*? # followed by any amount of anything + bell # followed by a bell + ) # end grouper + }mx # /m means . can match newline + print "Our brand has bell and lab separate.\n"; +end +#----------------------------- +$map =~ /^(?:(?!waldo).)*$/s +#----------------------------- +$map = "the great baldo" +if $map =~ %r{ + ^ # start of string + (?: # non-capturing grouper + (?! # look ahead negation + waldo # is he ahead of us now? + ) # is so, the negation failed + . # any character (cuzza /s) + ) * # repeat that grouping 0 or more + $ # through the end of the string + }mx # /m means . can match newline + print "There's no waldo here!\n"; +end +=begin + 7:15am up 206 days, 13:30, 4 users, load average: 1.04, 1.07, 1.04 + +USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT + +tchrist tty1 5:16pm 36days 24:43 0.03s xinit + +tchrist tty2 5:19pm 6days 0.43s 0.43s -tcsh + +tchrist ttyp0 chthon 7:58am 3days 23.44s 0.44s -tcsh + +gnat ttyS4 coprolith 2:01pm 13:36m 0.30s 0.30s -tcsh +=end +#% w | minigrep '^(?!.*ttyp).*tchrist' +#----------------------------- +%r{ + ^ # anchored to the start + (?! # zero-width look-ahead assertion + .* # any amount of anything (faster than .*?) + ttyp # the string you don't want to find + ) # end look-ahead negation; rewind to start + .* # any amount of anything (faster than .*?) + tchrist # now try to find Tom +}x +#----------------------------- +#% w | grep tchrist | grep -v ttyp +#----------------------------- +#% grep -i 'pattern' files +#% minigrep '(?i)pattern' files +#----------------------------- + + +# @@PLEAC@@_6.20 +ans = $stdin.gets.chomp +re = %r/^#{Regexp.quote(ans)}/ +case + when "SEND" =~ re : puts "Action is send" + when "STOP" =~ re : puts "Action is stop" + when "ABORT" =~ re : puts "Action is abort" + when "EDIT" =~ re : puts "Action is edit" +end +#----------------------------- +require 'abbrev' +table = Abbrev.abbrev %w-send stop abort edit- +loop do + print "Action: " + ans = $stdin.gets.chomp + puts "Action for #{ans} is #{table[ans.downcase]}" +end + + +#----------------------------- +# dummy values are defined for 'file', 'PAGER', and +# the 'invoke_editor' and 'deliver_message' methods +# do not do anything interesting in this example. +#!/usr/bin/ruby -w +require 'abbrev' + +file = 'pleac_ruby.data' +PAGER = 'less' + +def invoke_editor + puts "invoking editor" +end + +def deliver_message + puts "delivering message" +end + +actions = { + 'edit' => self.method(:invoke_editor), + 'send' => self.method(:deliver_message), + 'list' => proc {system(PAGER, file)}, + 'abort' => proc {puts "See ya!"; exit}, + "" => proc {puts "Unknown Command"} +} + +dtable = Abbrev.abbrev(actions.keys) +loop do + print "Action: " + ans = $stdin.gets.chomp.delete(" \t") + actions[ dtable[ans.downcase] || "" ].call +end + + +# @@PLEAC@@_6.19 +#----------------------------- +# basically, the Perl Cookbook categorizes this as an +# unsolvable problem ... +#----------------------------- +1 while addr.gsub!(/\([^()]*\)/,'') +#----------------------------- +Dear someuser@host.com, + +Please confirm the mail address you gave us Wed May 6 09:38:41 +MDT 1998 by replying to this message. Include the string +"Rumpelstiltskin" in that reply, but spelled in reverse; that is, +start with "Nik...". Once this is done, your confirmed address will +be entered into our records. + + +# @@PLEAC@@_6.21 +#----------------------------- +#% gunzip -c ~/mail/archive.gz | urlify > archive.urlified +#----------------------------- +#% urlify ~/mail/*.inbox > ~/allmail.urlified +#----------------------------- +#!/usr/bin/ruby -w +# urlify - wrap HTML links around URL-like constructs + +urls = '(https?|telnet|gopher|file|wais|ftp)'; +ltrs = '\w'; +gunk = '/#~:.?+=&%@!\-'; +punc = '.:?\-'; +any = "#{ltrs}#{gunk}#{punc}"; + +ARGF.each do |line| + line.gsub! %r/ + \b # start at word boundary + ( # begin $1 { + #{urls} : # need resource and a colon + [#{any}] +? # followed by on or more + # of any valid character, but + # be conservative and take only + # what you need to.... + ) # end $1 } + (?= # look-ahead non-consumptive assertion + [#{punc}]* # either 0 or more punctuation + [^#{any}] # followed by a non-url char + | # or else + $ # then end of the string + ) + /iox do + %Q|<A HREF="#{$1}">#{$1}</A>| + end + print line +end + + +# @@PLEAC@@_6.23 +%r/^m*(d?c{0,3}|c[dm])(l?x{0,3}|x[lc])(v?i{0,3}|i[vx])$/i +#----------------------------- +str.sub!(/(\S+)(\s+)(\S+)/, '\3\2\1') +#----------------------------- +%r/(\w+)\s*=\s*(.*)\s*$/ # keyword is $1, value is $2 +#----------------------------- +%r/.{80,}/ +#----------------------------- +%r|(\d+)/(\d+)/(\d+) (\d+):(\d+):(\d+)| +#----------------------------- +str.gsub!(%r|/usr/bin|,'/usr/local/bin') +#----------------------------- +str.gsub!(/%([0-9A-Fa-f][0-9A-Fa-f])/){ $1.hex.chr } +#----------------------------- +str.gsub!(%r{ + /\* # Match the opening delimiter + .*? # Match a minimal number of characters + \*/ # Match the closing delimiter +}xm,'') +#----------------------------- +str.sub!(/^\s+/, '') +str.sub!(/\s+$/, '') + +# but really, in Ruby we'd just do: +str.strip! +#----------------------------- +str.gsub!(/\\n/,"\n") +#----------------------------- +str.sub!(/^.*::/, '') +#----------------------------- +%r/^([01]?\d\d|2[0-4]\d|25[0-5])\.([01]?\d\d|2[0-4]\d|25[0-5])\. + ([01]?\d\d|2[0-4]\d|25[0-5])\.([01]?\d\d|2[0-4]\d|25[0-5])$/x +#----------------------------- +str.sub!(%r|^.*/|, '') +#----------------------------- +cols = ( (ENV['TERMCAP'] || " ") =~ /:co#(\d+):/ ) ? $1 : 80; +#----------------------------- +name = " #{$0} #{ARGV}".gsub(%r| /\S+/|, ' ') +#----------------------------- +require 'rbconfig' +include Config +raise "This isn't Linux" unless CONFIG['target_os'] =~ /linux/i; +#----------------------------- +str.gsub!(%r/\n\s+/, ' ') +#----------------------------- +nums = str.scan(/(\d+\.?\d*|\.\d+)/) +#----------------------------- +capwords = str.scan(%r/(\b[^\Wa-z0-9_]+\b)/) +#----------------------------- +lowords = str.scan(%r/(\b[^\WA-Z0-9_]+\b)/) +#----------------------------- +icwords = str.scan(%r/(\b[^\Wa-z0-9_][^\WA-Z0-9_]*\b)/) +#----------------------------- +links = str.scan(%r/<A[^>]+?HREF\s*=\s*["']?([^'" >]+?)[ '"]?>/mi) +#----------------------------- +initial = str =~ /^\S+\s+(\S)\S*\s+\S/ ? $1 : "" +#----------------------------- +str.gsub!(%r/"([^"]*)"/, %q-``\1''-) +#----------------------------- + +$/ = "" +sentences = [] +ARGF.each do |para| + para.gsub!(/\n/, ' ') + para.gsub!(/ {3,}/,' ') + sentences << para.scan(/(\S.*?[!?.])(?= |\Z)/) +end + +#----------------------------- +%r/(\d{4})-(\d\d)-(\d\d)/ # YYYY in $1, MM in $2, DD in $3 +#----------------------------- +%r/ ^ + (?: + 1 \s (?: \d\d\d \s)? # 1, or 1 and area code + | # ... or ... + \(\d\d\d\) \s # area code with parens + | # ... or ... + (?: \+\d\d?\d? \s)? # optional +country code + \d\d\d ([\s\-]) # and area code + ) + \d\d\d (\s|\1) # prefix (and area code separator) + \d\d\d\d # exchange + $ + /x +#----------------------------- +%r/\boh\s+my\s+gh?o(d(dess(es)?|s?)|odness|sh)\b/i +#----------------------------- +lines = [] +lines << $1 while input.sub!(/^([^\012\015]*)(\012\015?|\015\012?)/,'') + + +# @@PLEAC@@_7.0 +# An IO object being Enumerable, we can use 'each' directly on it +File.open("/usr/local/widgets/data").each { |line| + puts line if line =~ /blue/ +} + +logfile = File.new("/var/log/rubylog.txt", "w") +mysub($stdin, logfile) + +# The method IO#readline is similar to IO#gets +# but throws an exception when it reaches EOF +f = File.new("bla.txt") +begin + while (line = f.readline) + line.chomp + $stdout.print line if line =~ /blue/ + end +rescue EOFError + f.close +end + +while $stdin.gets # reads from STDIN + unless (/\d/) + $stderr.puts "No digit found." # writes to STDERR + end + puts "Read: #{$_}" # writes to STDOUT +end + +logfile = File.new("/tmp/log", "w") + +logfile.close + +# $defout (or its synonym '$>') is the destination of output +# for Kernel#print, Kernel#puts, and family functions +logfile = File.new("log.txt", "w") +old = $defout +$defout = logfile # switch to logfile for output +puts "Countdown initiated ..." +$defout = old # return to original output +puts "You have 30 seconds to reach minimum safety distance." + + +# @@PLEAC@@_7.1 +source = File.new(path, "r") # open file "path" for reading only +sink = File.new(path, "w") # open file "path" for writing only + +source = File.open(path, File::RDONLY) # open file "path" for reading only +sink = File.open(path, File::WRONLY) # open file "path" for writing only + +file = File.open(path, "r+") # open "path" for reading and writing +file = File.open(path, flags) # open "path" with the flags "flags" (see examples below for flags) + +# open file "path" read only +file = File.open(path, "r") +file = File.open(path, File::RDONLY) + +# open file "path" write only, create it if it does not exist +# truncate it to zero length if it exists +file = File.open(path, "w") +file = File.open(path, File::WRONLY|File::TRUNC|File::CREAT) +file = File.open(path, File::WRONLY|File::TRUNC|File::CREAT, 0666) # with permission 0666 + +# open file "path" write only, fails if file exists +file = File.open(path, File::WRONLY|File::EXCL|File::CREAT) +file = File.open(path, File::WRONLY|File::EXCL|File::CREAT, 0666) + +# open file "path" for appending +file = File.open(path, "a") +file = File.open(path, File::WRONLY|File::APPEND|File::CREAT) +file = File.open(path, File::WRONLY|File::APPEND|File::CREAT, 0666) + +# open file "path" for appending only when file exists +file = File.open(path, File::WRONLY|File::APPEND) + +# open file "path" for reading and writing +file = File.open(path, "r+") +file = File.open(path, File::RDWR) + +# open file for reading and writing, create a new file if it does not exist +file = File.open(path, File::RDWR|File::CREAT) +file = File.open(path, File::RDWR|File::CREAT, 0600) + +# open file "path" reading and writing, fails if file exists +file = File.open(path, File::RDWR|File::EXCL|File::CREAT) +file = File.open(path, File::RDWR|File::EXCL|File::CREAT, 0600) + + +# @@PLEAC@@_7.2 +# No problem with Ruby since the filename doesn't contain characters with +# special meaning; like Perl's sysopen +File.open(filename, 'r') + + +# @@PLEAC@@_7.3 +File.expand_path('~root/tmp') +#=> "/root/tmp" +File.expand_path('~rpcuser') +#=> "/var/lib/nfs" + +# To expand ~/.. it explicitely needs the environment variable HOME +File.expand_path('~/tmp') +#=> "/home/gc/tmp" + + +# @@PLEAC@@_7.4 +# The exception raised in Ruby reports the filename +File.open('afile') + + +# @@PLEAC@@_7.5 +# Standard Ruby distribution provides the following useful extension +require 'tempfile' +# With the Tempfile class, the file is automatically deleted on garbage +# collection, so you won't need to remove it, later on. +tf = Tempfile.new('tmp') # a name is required to create the filename + +# If you need to pass the filename to an external program you can use +# File#path, but don't forget to File#flush in order to flush anything +# living in some buffer somewhere. +tf.flush +system("/usr/bin/dowhatever #{tf.path}") + +fh = Tempfile.new('tmp') +fh.sync = true # autoflushes +10.times { |i| fh.puts i } +fh.rewind +puts 'Tmp file has: ', fh.readlines + + +# @@PLEAC@@_7.6 +while (DATA.gets) do + # process the line +end +__END__ +# your data goes here +# __DATA__ doesn't exist in Ruby + +#CODE +# get info about the script (size, date of last modification) +kilosize = DATA.stat.size / 1024 +last_modif = DATA.stat.mtime +puts "<P>Script size is #{kilosize}" +puts "<P>Last script update: #{last_modif}" +__END__ +# DO NOT REMOVE THE PRECEEDING LINE. +# Everything else in this file will be ignored. +#CODE + + +# @@PLEAC@@_7.7 +while line = gets do + # do something with line. +end + +# or +while gets do + # do something with $_ +end + +# or more rubyish +$stdin.each do |line| + # do stuff with line +end + + +# ARGF may makes this more easy +# this is skipped if ARGV.size==0 +ARGV.each do |filename| + # closing and exception handling are done by the block + open(filename) do |fd| + fd.each do |line| + # do stuff with line + end + end rescue abort("can't open %s" % filename) +end + +# globbing is done in the Dir module +ARGV = Dir["*.[Cch]"] if ARGV.empty? + +# note: optparse is the preferred way to handle this +if (ARGV[0] == '-c') + chop_first += 1 + ARGV.shift +end + + +# processing numerical options +if ARGV[0] =~ /^-(\d+)$/ + columns = $1 + ARGV.shift +end + +# again, better to use optparse: +require 'optparse' +nostdout = 0 +append = 0 +unbuffer = 0 +ignore_ints = 0 +ARGV.options do |opt| + opt.on('-n') { nostdout +=1 } + opt.on('-a') { append +=1 } + opt.on('-u') { unbuffer +=1 } + opt.on('-i') { ignore_ints +=1 } + opt.parse! +end or abort("usage: " + __FILE__ + " [-ainu] [filenames]") + +# no need to do undef $/, we have File.read +str = File.read(ARGV[0]) + +# again we have File.read +str = File.read(ARGV[0]) + +# not sure what this should do: +# I believe open the file, print filename, lineno and line: +ARGF.each_with_index do |line, idx| + print ARGF.filename, ":", idx, ";", line +end + +# print all the lines in every file passed via command line that contains login +ARGF.each do |line| + puts line if line =~ /login/ +end +# +# even this would fit +#%ruby -ne "print if /f/" 2.log +# + +ARGF.each { |l| puts l.downcase! } + +#------------------ +#!/usr/bin/ruby -p +# just like perl's -p +$_.downcase! +# + +# I don't know who should I trust. +# perl's version splits on \w+ while python's on \w. + +chunks = 0 + +File.read(ARGV[0]).split.each do |word| + next if word =~ /^#/ + break if ["__DATA__", "__END__"].member? word + chunks += 1 +end + +print "Found ", chunks, " chunks\n" + + +# @@PLEAC@@_7.8 +old = File.open(old_file) +new = File.open(new_file, "w") +while old.gets do + # change $_, then... + new.print $_ +end +old.close +new.close +File.rename(old_file, "old.orig") +File.rename(new_file, old_file) + +while old.gets do + if $. == 20 then # we are at the 20th line + new.puts "Extra line 1" + new.puts "Extra line 2" + end + new.print $_ +end + +while old.gets do + next if 20..30 # skip the 20th line to the 30th + # Ruby (and Perl) permit to write if 20..30 + # instead of if (20 <= $.) and ($. <= 30) + new.print $_ +end + + +# @@PLEAC@@_7.9 +#% ruby -i.orig -pe 'FILTER COMMAND' file1 file2 file3 ... +# +#----------------------------- +##!/usr/bin/ruby -i.orig -p +# filter commands go here +#----------------------------- + +#% ruby -pi.orig -e 'gsub!(/DATE/){Time.now)' + +# effectively becomes: +ARGV << 'I' +oldfile = "" +while gets + if ARGF.filename != oldfile + newfile = ARGF.filename + File.rename(newfile, newfile + ".orig") + $stdout = File.open(newfile,'w') + oldfile = newfile + end + gsub!(/DATE/){Time.now} + print +end +$stdout = STDOUT +#----------------------------- +#% ruby -i.old -pe 'gsub!(%r{\bhisvar\b}, 'hervar')' *.[Cchy] + +#----------------------------- +# set up to iterate over the *.c files in the current directory, +# editing in place and saving the old file with a .orig extension +$-i = '.orig' # set up -i mode +ARGV.replace(Dir['*.[Cchy]']) +while gets + if $. == 1 + print "This line should appear at the top of each file\n" + end + gsub!(/\b(p)earl\b/i, '\1erl') # Correct typos, preserving case + print + ARGF.close if ARGF.eof +end + + +# @@PLEAC@@_7.10 +File.open('itest', 'r+') do |f| # open file for update + lines = f.readlines # read into array of lines + lines.each do |it| # modify lines + it.gsub!(/foo/, 'QQQ') + end + f.pos = 0 # back to start + f.print lines # write out modified lines + f.truncate(f.pos) # truncate to new length +end # file is automatically closed +#----------------------------- +File.open('itest', 'r+') do |f| + out = "" + f.each do |line| + out << line.gsub(/DATE/) {Time.now} + end + f.pos = 0 + f.print out + f.truncate(f.pos) +end + +# @@PLEAC@@_7.11 +File.open('infile', 'r+') do |f| + f.flock File::LOCK_EX + # update file +end +#----------------------------- +File::LOCK_SH # shared lock (for reading) +File::LOCK_EX # exclusive lock (for writing) +File::LOCK_NB # non-blocking request +File::LOCK_UN # free lock +#----------------------------- +unless f.flock File::LOCK_EX | File::LOCK_NB + warn "can't get immediate lock: blocking ..." + f.flock File::LOCK_EX +end +#----------------------------- +File.open('numfile', File::RDWR|File::CREAT) do |f| + f.flock(File::LOCK_EX) + num = f.gets.to_i || 0 + f.pos = 0 + f.truncate 0 + f.puts num + 1q +end + + +# @@PLEAC@@_7.12 +output_handle.sync = true +# Please note that like in Perl, $stderr is already unbuffered +#----------------------------- +#!/usr/bin/ruby -w +# seeme - demo stdio output buffering +$stdout.sync = ARGV.size > 0 +print "Now you don't see it..." +sleep 2 +puts "now you do" +#----------------------------- +$stderr.sync = true +afile.sync = false +#----------------------------- +# assume 'remote_con' is an interactive socket handle, +# but 'disk_file' is a handle to a regular file. +remote_con.sync = true # unbuffer for clarity +disk_file.sync = false # buffered for speed +#----------------------------- +require 'socket' +sock = TCPSocket.new('www.ruby-lang.org', 80) +sock.sync = true +sock.puts "GET /en/ HTTP/1.0 \n\n" +resp = sock.read +print "DOC IS: #{resp}\n" + + +# @@PLEAC@@_7.13 +#----------------------------- +# assumes fh1, fh2, fh2 are oen IO objects +nfound = select([$stdin, fh1, fh2, fh3], nil, nil, 0) +nfound[0].each do |file| + case file + when fh1 + # do something with fh1 + when fh2 + # do something with fh2 + when fh3 + # do something with fh3 + end +end +#----------------------------- +input_files = [] +# repeat next line for all in-files to poll +input_files << fh1 +if nfound = select(input_files, nil, nil, 0) + # input ready on files in nfound[0] +end + + +# @@PLEAC@@_8.0 +#----------------------------- +# datafile is a file or IO object +datafile.readlines.each { |line| + line.chomp! + size = line.length + puts size +} +#----------------------------- +datafile.readlines.each { |line| + puts line.chomp!.length +} +#----------------------------- +lines = datafile.readlines +#----------------------------- +whole_file = file.read +#----------------------------- +# ruby -040 -e 'word = gets; puts "First word is #{word}"' +#----------------------------- +# ruby -ne 'BEGIN { $/="%%\n" }; $_.chomp; puts $_ if( $_=~/Unix/i)' fortune.dat +#----------------------------- +handle.print "one", "two", "three" # "onetwothree" +puts "Baa baa black sheep." # sent to $stdout +#----------------------------- +buffer = handle.read(4096) +rv = buffer.length +#----------------------------- +handle.truncate(length) +open("/tmp#{$$}.pid", 'w') { |handle| handle.truncate(length) } +#----------------------------- +pos = datafile.pos # tell is an alias of pos +puts "I'm #{pos} bytes from the start of datafile" +#----------------------------- +logfile.seek(0, IO::SEEK_END) +datafile.seek(pos) # IO::SEEK_SET is the default +out.seek(-20, IO::SEEK_CUR) +#----------------------------- +written = datafile.syswrite(mystring) +raise RunTimeError unless written == mystring.length +block = infile.sysread(256) # no equivalent to perl offset parameter in sysread +puts "only read #{block.length} bytes" if 256 != block.length +#----------------------------- +pos = handle.sysseek(0, IO::SEEK_CUR) # don't change position + + +# @@PLEAC@@_8.1 +while (line = fh.gets) + line.chomp! + nextline = nil + line.gsub!(/\\$/) { |match| nextline = fh.gets; '' } + if (nextline != nil) + line += nextline + redo + end + # process full record in line here +end +#----------------------------- +# DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) \ +# $(TEXINFOS) $(INFOS) $(MANS) $(DATA) +# DEP_DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) \ +# $(TEXINFOS) $(INFO_DEPS) $(MANS) $(DATA) \ +# $(EXTRA_DIST) +#----------------------------- +line.gsub!(/\\\s*$/, '') { + # as before +} + + +# @@PLEAC@@_8.2 +#----------------------------- +count = `wc -l < #{filename}` +fail "wc failed: #{$?}" if $? != 0 +count.chomp! +#----------------------------- +count = 0 +File.open(file, 'r') { |fh| + count += 1 while fh.gets +} +# count now holds the number of lines read +#----------------------------- +count = 0 +while (chunk = file.sysread(2**16)) + count += chunk.count("\n") +end rescue EOFError +#----------------------------- +File.open(filename,'r') { |fh| + count += 1 while fh.gets +} +# count now holds the number of lines read +#----------------------------- +# As ruby doesn't quite have an equivalent to using a for +# statement as in perl, I threw this in +count = File.readlines(filename).size +#----------------------------- +1 while file.gets +count = $. +#----------------------------- +$/ = '' +open(filename, 'r') { |fh| + 1 while fh.gets + para_count = $. +} rescue fail("can't open #{filename}: $!") +#----------------------------- + + +# ^^PLEAC^^_8.3 +#----------------------------- +while (gets) + split.each { |chunk| + # do something with chunk + } +end +#----------------------------- +while (gets) + gsub(/(\w[\w'-]*)/) { |word| + # do something with word + } +end +#----------------------------- +# Make a word frequency count +# normally hashes can be created using {} or just Hash.new +# but we want the default value of an entry to be 0 instead +# of nil. (nil can't be incremented) +seen = Hash.new(0) +while (gets) + gsub(/(\w[\w'-]*)/) { |word| + seen[word.downcase] += 1 + } +end +# output hash in a descending numeric sort of its values +seen.sort { |a,b| b[1] <=> a[1] }.each do |k,v| + printf("%5d %s\n", v, k ) +end + +#----------------------------- +# Line frequency count +seen = Hash.new(0) +while (gets) + seen[$_.downcase] += 1 +end +seen.sort { |a,b| b[1] <=> a[1] }.each do |k,v| + printf("%5d %s\n", v, k ) +end +#----------------------------- + + +# @@PLEAC@@_8.4 +#----------------------------- +# instead of file handle FILE, we can just +# use a string containing the filename +File.readlines(file).each { |line| + # do something with line +} +#----------------------------- +File.readlines(file).reverse_each { |line| + # do something with line +} +#----------------------------- +# the variable lines might have been created +# this way +# lines = File.readlines(file) +# +# normally one would use the reverse_each, but +# if you insist on using a numerical index to +# iterate over the lines array... +(lines.size - 1).downto(0) { |i| + line = lines[i] +} +#----------------------------- +# the second readlines argument is a the +# record separator $/, just like perl, a blank +# separator splits the records into paragraphs +File.readlines(file, '').each { |paragraph| + # do something with paragraph + puts "->Paragraph #{paragraph}" +} +#----------------------------- + + +# @@PLEAC@@_8.6 + +$/ = "%\n"; +srand; + +File.open('/usr/share/fortune/humorists').each do |line| + adage = line if rand($.) < 1 +end + +puts adage; + + +# @@PLEAC@@_8.10 +begin + fh = File.open(file, "r+") + addr = fh.tell unless fh.eof while fh.gets + fh.truncate(addr) +rescue SystemCallError + $stderr.puts "#$!" +end + + +# @@PLEAC@@_9.0 +entry = File.stat("/usr/bin/vi") +entry = File.stat("/usr/bin") +entry = File.stat(INFILE) + +entry = File.stat("/usr/bin/vi") +ctime = entry.ctime +size = entry.size + +f = File.open(filename, "r") + +## There is no -T equivalent in Ruby, but we can still test emptiness +if test(?s, filename) + puts "#{filename} doesn't have text in it." + exit +end + +Dir.new("/usr/bin").each do |filename| + puts "Inside /usr/bin is something called #{filename}" +end + + +# @@PLEAC@@_9.1 +file = File.stat("filename") +readtime, writetime = file.atime, file.mtime +file.utime(readtime, writetime) + +SECONDS_PER_DAY = 60 * 60 * 24 +file = File.stat("filename") +atime, mtime = file.atime, file.mtime + +atime -= 7 * SECONDS_PER_DAY +mtime -= 7 * SECONDS_PER_DAY + +File.utime(atime, mtime, file) +mtime = File.stat(file).mtime +File.utime(Time.new, mtime, file) +File.utime(Time.new, File.stat("testfile").mtime, file) + +#----------------------------- +#!/usr/bin/ruby -w +## uvi - vi a file without changing it's access times + +if ARGV.length != 1 + puts "usage: uvi filename" + exit +end +file = ARGV[0] +atime, mtime = File.stat(file).atime, File.stat(file).mtime +system(ENV["EDITOR"] || "vi", file) +File.utime(atime, mtime, file) +#----------------------------- + + +# @@PLEAC@@_9.2 +File.unlink(FILENAME) + +err_flg = false +filenames.each do |file| + begin + File.unlink(file) + rescue + err_flg = $! + end +end +err_flg and raise "Couldn't unlink all of #{filenames.join(" ")}: #{err_flg}" + +File.unlink(file) + +count = filenames.length +filenames.each do |file| + begin + File.unlink(file) + rescue + count -= 1 + end +end +if count != filenames.length + STDERR.puts "could only delete #{count} of #{filenames.length} files" +end + + +# @@PLEAC@@_9.3 +require "ftools" +File.copy(oldfile, newfile) + +infile = File.open(oldfile, "r") +outfile = File.open(newfile, "w") + +blksize = infile.stat.blksize +# This doesn't handle partial writes or ^Z +# like the Perl version does. +while (line = infile.read(blksize)) + outfile.write(line) +end + +infile.close +outfile.close + +system("cp #{oldfile} #{newfile}") # unix +system("copy #{oldfile} #{newfile}") # dos, vms + +require "ftools" +File.copy("datafile.dat", "datafile.bak") +File.move("datafile.new", "datafile.dat") + + +# @@PLEAC@@_9.4 +$seen = {} # must use global var to be seen inside of method below + +def do_my_thing(filename) + dev, ino = File.stat(filename).dev, File.stat(filename).ino + unless $seen[[dev, ino]] + # do something with $filename because we haven't + # seen it before + end + $seen[[dev, ino]] = $seen[[dev, ino]].to_i + 1 +end + +files.each do |filename| + dev, ino = File.stat(filename).dev, File.stat(filename).ino + if !$seen.has_key?([dev, ino]) + $seen[[dev, ino]] = [] + end + $seen[[dev, ino]].push(filename) +end + +$seen.keys.sort.each do |devino| + ino, dev = devino + if $seen[devino].length > 1 + # $seen[devino] is a list of filenames for the same file + end +end + + +# @@PLEAC@@_9.5 +Dir.open(dirname) do |dir| + dir.each do |file| + # do something with dirname/file + puts file + end +end +# Dir.close is automatic + +# No -T equivalent in Ruby + +dir.each do |file| + next if file =~ /^\.\.?$/ + # ... +end + +def plainfiles(dir) + dh = Dir.open(dir) + dh.entries.grep(/^[^.]/). + map {|file| "#{dir}/#{file}"}. + find_all {|file| test(?f, file)}. + sort +end + + +# @@PLEAC@@_9.6 +list = Dir.glob("*.c") + +dir = Dir.open(path) +files = dir.entries.grep(/\.c$/) +dir.close + +files = Dir.glob("*.c") +files = Dir.open(path).entries.grep(/\.[ch]$/i) + +dir = Dir.new(path) +files = dir.entries.grep(/\.[ch]$/i) + +begin + d = Dir.open(dir) +rescue Errno::ENOENT + raise "Couldn't open #{dir} for reading: #{$!}" +end + +files = [] +d.each do |file| + puts file + next unless file =~ /\.[ch]$/i + + filename = "#{dir}/#{file}" + # There is no -T equivalent in Ruby, but we can still test emptiness + files.push(filename) if test(?s, filename) +end + +dirs.entries.grep(/^\d+$/). + map { |file| [file, "#{path}/#{file}"]} . + select { |file| test(?d, file[1]) }. + sort { |a,b| a[0] <=> b[0] }. + map { |file| file[1] } + + +# @@PLEAC@@_9.7 +require 'find' +Find.find(dirlist) do |file| + # do whatever +end + +require 'find' +argv = ARGV.empty? ? %w{.} : ARGV +Find.find(*argv) do |file| + print file, (test(?d, file) ? "/\n" : "\n") +end + +require 'find' +argv = ARGV.empty? ? %w{.} : ARGV +sum = 0 +Find.find(*argv) do |file| + size = test(?s, file) || 0 + sum += size +end +puts "#{argv.join(' ')} contains #{sum} bytes" + +require 'find' +argv = ARGV.empty? ? %w{.} : ARGV +saved_size, saved_name = -1, "" +Find.find(*argv) do |file| + size = test(?s, file) || 0 + next unless test(?f, file) && size > saved_size + saved_size = size + saved_name = file +end +puts "Biggest file #{saved_name} in #{argv.join(' ')} is #{saved_size}" + +require 'find' +argv = ARGV.empty? ? %w{.} : ARGV +age, name = nil +Find.find(*argv) do |file| + mtime = File.stat(file).mtime + next if age && age > mtime + age = mtime + name = file +end +puts "#{name} #{age}" + +#----------------------------- +#!/usr/bin/ruby -w +# fdirs - find all directories +require 'find' +argv = ARGV.empty? ? %w{.} : ARGV +File.find(*argv) { |file| puts file if test(?d, file) } +#----------------------------- + + +# @@PLEAC@@_9.8 +require 'fileutils' + +puts "Usage #{$0} dir ..." if ARGV.empty? +ARGV.each do |dir| + FileUtils.rmtree(dir) +end + + +# @@PLEAC@@_9.9 +require 'ftools' +names.each do |file| + newname = file + begin + File.move(file, newname) + rescue Errno::EPERM + $stderr.puts "Couldn't rename #{file} to #{newname}: #{$!}" + end +end + +require 'ftools' +op = ARGV.empty? ? (raise "Usage: rename expr [files]\n") : ARGV.shift +argv = ARGV.empty? ? $stdin.readlines.map { |f| f.chomp } : ARGV +argv.each do |file| + was = file + file = eval("file.#{op}") + File.move(was, file) unless was == file +end + + +# @@PLEAC@@_9.10 +base = File.basename(path) +dir = File.dirname(path) +# ruby has no fileparse equivalent +dir, base = File.split(path) +ext = base.scan(/\..*$/).to_s + +path = '/usr/lib/libc.a' +file = File.basename(path) +dir = File.dirname(path) + +puts "dir is #{dir}, file is #{file}" +# dir is /usr/lib, file is libc.a + +path = '/usr/lib/libc.a' +dir, filename = File.split(path) +name, ext = filename.split(/(?=\.)/) +puts "dir is #{dir}, name is #{name}, ext is #{ext}" +# NOTE: The Ruby code prints +# dir is /usr/lib, name is libc, extension is .a +# while the Perl code prints a '/' after the directory name +# dir is /usr/lib/, name is libc, extension is .a + +# No fileparse_set_fstype() equivalent in ruby + +def extension(path) + ext = path.scan(/\..*$/).to_s + ext.sub(/^\./, "") +end + + +# @@PLEAC@@_9.11 +#----------------------------- +#!/usr/bin/ruby -w +# symirror - build spectral forest of symlinks + +require 'find' +require 'fileutils' + +raise "usage: #{$0} realdir mirrordir" unless ARGV.size == 2 + +srcdir,dstdir = ARGV +srcmode = File::stat(srcdir).mode +Dir.mkdir(dstdir, srcmode & 07777) unless test(?d, dstdir) + +# fix relative paths +Dir.chdir(srcdir) {srcdir = Dir.pwd} +Dir.chdir(dstdir) {dstdir = Dir.pwd} + +Find.find(srcdir) do |srcfile| + if test(?d, srcfile) + dest = srcfile.sub(/^#{srcdir}/, dstdir) + dmode = File::stat(srcfile).mode & 07777 + Dir.mkdir(dest, dmode) unless test(?d, dest) + a = Dir["#{srcfile}/*"].reject{|f| test(?d, f)} + FileUtils.ln_s(a, dest) + end +end + + +# @@PLEAC@@_9.12 +# we use the Getopt/Declare library here for convenience: +# http://raa.ruby-lang.org/project/getoptdeclare/ +#----------------------------- +#!/usr/bin/ruby -w +# lst - list sorted directory contents (depth first) + +require 'find' +require 'etc' +require "Getopt/Declare" + +# Note: in the option-spec below there must by at least one hard +# tab in between each -option and its description. For example +# -i <tab> read from stdin + +opts = Getopt::Declare.new(<<'EOPARAM') + ============ + Input Format: + -i read from stdin + ============ + Output Format: + -l long listing + -r reverse listing + ============ + Sort on: (one of) + -m mtime (modify time - default) + {$sort_criteria = :mtime} + -u atime (access time) + {$sort_criteria = :atime} + -c ctime (inode change time) + {$sort_criteria = :ctime} + -s size + {$sort_criteria = :size} + [mutex: -m -u -c -s] + +EOPARAM + +$sort_criteria ||= :mtime +files = {} +DIRS = opts['-i'] ? $stdin.readlines.map{|f|f.chomp!} : ARGV +DIRS.each do |dir| + Find.find(dir) do |ent| + files[ent] = File::stat(ent) + end +end +entries = files.keys.sort_by{|f| files[f].send($sort_criteria)} +entries = entries.reverse unless opts['-r'] + +entries.each do |ent| + unless opts['-l'] + puts ent + next + end + stats = files[ent] + ftime = stats.send($sort_criteria == :size ? :mtime : $sort_criteria) + printf "%6d %04o %6d %8s %8s %8d %s %s\n", + stats.ino, + stats.mode & 07777, + stats.nlink, + ETC::PASSWD[stats.uid].name, + ETC::GROUP[stats.gid].name, + stats.size, + ftime.strftime("%a %b %d %H:%M:%S %Y"), + ent +end + + +# @@PLEAC@@_10.0 +def hello + $greeted += 1 # in Ruby, a variable beginning with $ is global (can be any type of course) + puts "hi there!" +end + +# We need to initialize $greeted before it can be used, because "+=" is waiting a Numeric object +$greeted = 0 +hello # note that appending () is optional to function calls with no parameters + + +# @@PLEAC@@_10.1 +# In Ruby, parameters are named anyway +def hypotenuse(side1, side2) + Math.sqrt(side1**2 + side2**2) # the sqrt function comes from the Math module +end +diag = hypotenuse(3, 4) + +puts hypotenuse(3, 4) + +a = [3, 4] +print hypotenuse(*a) # the star operator will magically convert an Array into a "tuple" + +both = men + women + +# In Ruby, all objects are references, so the same problem arises; we then return a new object +nums = [1.4, 3.5, 6.7] +def int_all(n) + n.collect { |v| v.to_i } +end +ints = int_all(nums) + +nums = [1.4, 3.5, 6.7] +def trunc_em(n) + n.collect! { |v| v.to_i } # the bang-version of collect modifies the object +end +trunc_em(nums) + +# Ruby has two chomp version: +# ``chomp'' chomps the record separator and returns what's expected +# ``chomp!'' does the same but also modifies the parameter object + + +# @@PLEAC@@_10.2 +def somefunc + variable = something # variable is local by default +end + +name, age = ARGV +start = fetch_time + +a, b = pair # will succeed if pair is an Array object (like ARGV is) +c = fetch_time + +# In ruby, run_check can't access a, b, or c until they are +# explicitely defined global (using leading $), even if they are +# both defined in the same scope + +def check_x(x) + y = "whatever" + run_check + if $condition + puts "got $x" + end +end + +# The following will keep a reference to the array, though the +# results will be slightly different from perl: the last element +# of $global_array will be itself an array +def save_array(ary) + $global_array << ary +end + +# The following gives the same results as in Perl for $global_array, +# though it doesn't illustrate anymore the way to keep a reference +# to an object: $global_array is extended with the elements of ary +def save_array(ary) + $global_array += ary +end + + +# @@PLEAC@@_10.3 +# In Ruby, AFAIK a method cannot access "local variables" defined +# upper scope; mostly because everything is an object, so you'll +# do the same by defining an attribute or a static attribute + +# In Ruby the BEGIN also exists: +BEGIN { puts "hello from BEGIN" } +puts "hello from main" +BEGIN { puts "hello from 2nd BEGIN" } +# gives: +# hello from BEGIN +# hello from 2nd BEGIN +# hello from main + +# In Ruby, it can be written as a static method and a static +# variable +class Counter + @@counter = 0 + def Counter.next_counter; @@counter += 1; end +end + +# There is no need of BEGIN since the variable will get +# initialized when parsing +class Counter + @@counter = 42 + def Counter.next_counter; @@counter += 1; end + def Counter.prev_counter; @@counter -= 1; end +end + + +# @@PLEAC@@_10.4 +# You can either get the whole trace as an array of strings, each +# string telling which file, line and method is calling: +caller + +# ...or only the last caller +caller[0] + +# We need to extract just the method name of the backtrace: +def whoami; caller()[0] =~ /in `([^']+)'/ ? $1 : '(anonymous)'; end +def whowasi; caller()[1] =~ /in `([^']+)'/ ? $1 : '(anonymous)'; end + + +# @@PLEAC@@_10.5 +# In Ruby, every value is a reference on an object, thus there is +# no such problem +array_diff(array1, array2) + +def add_vecpair(a1, a2) + results = [] + a1.each_index { |i| results << (a1[i] + a2[i]) } + results +end +a = [1, 2] +b = [5, 8] +c = add_vecpair(a, b) +p c + +# Add this to the beginning of the function to check if we were +# given two arrays +a1.type == Array && a2.type == Array or + raise "usage: add_vecpair array1 array2 (was used with: #{a1.type} #{a2.type})" + + +# @@PLEAC@@_10.6 +# There is no return context in Ruby + + +# @@PLEAC@@_10.7 +# Like in Perl, we need to fake with a hash, but it's dirty :-( +def thefunc(param_args) + args = { 'INCREMENT' => '10s', 'FINISH' => '0', 'START' => 0 } + args.update(param_args) + if (args['INCREMENT'] =~ /m$/ ) + # ..... + end +end + +thefunc({ 'INCREMENT' => '20s', 'START' => '+5m', 'FINISH' => '+30m' }) +thefunc({}) + + +# @@PLEAC@@_10.8 +# there is no "undef" direct equivalent but there is the slice equiv: +a, c = func.indexes(0, 2) + + +# @@PLEAC@@_10.9 +# Ruby has no such limitation: +def somefunc + ary = [] + hash = {} + # ... + return ary, hash +end +arr, dict = somefunc + +array_of_hashes = fn +h1, h2, h3 = fn + + +# @@PLEAC@@_10.10 +return +# or (equivalent) +return nil + + +# @@PLEAC@@_10.11 +# You can't prototype in Ruby regarding types :-( +# Though, you can force the number of arguments: +def func_with_no_arg; end +def func_with_no_arg(); end +def func_with_one_arg(a1); end +def func_with_two_args(a1, a2); end +def func_with_any_number_of_args(*args); end + + +# @@PLEAC@@_10.12 +raise "some message" # raise exception + +begin + val = func +rescue Exception => msg + $stderr.puts "func raised an exception: #{msg}" +end + +# In Ruby the rescue statement uses an exception class, every +# exception which is not matched is still continuing +begin + val = func +rescue FullMoonError + ... +end + + +# @@PLEAC@@_10.13 +# Saving Global Values +# Of course we can just save the value and restore it later: +def print_age + puts "Age is #{$age}" +end + +$age = 18 # global variable +print_age() +if condition + safeage = $age + $age = 23 + print_age() + $age = safeage +end + +# We can also use a method that saves the global variable and +# restores it automatically when the block is left: + +def local(var) + eval("save = #{var.id2name}") + begin + result = yield + ensure + # we want to call this even if we got an exception + eval("#{var.id2name} = save") + end + result +end + +condition = true +$age = 18 +print_age() +if condition + local(:$age) { + $age = 23 + print_age() + } +end +print_age() + +# There is no need to use local() for filehandles or directory +# handles in ruby because filehandles are normal objects. + + +# @@PLEAC@@_10.14 +# In Ruby you may redefine a method [but not overload it :-(] +# just by defining again with the same name. +def foo; puts 'foo'; end +def foo; puts 'bar'; end +foo +#=> bar + +# You can also take a reference to an existing method before +# redefining a new one, using the `alias' keyword +def foo; puts 'foo'; end +alias foo_orig foo +def foo; puts 'bar'; end +foo_orig +foo +#=> foo +#=> bar + +# AFAIK, there is no direct way to create a new method whose name +# comes from a variable, so use "eval" +colors = %w(red blue green yellow orange purple violet) +colors.each { |c| + eval <<-EOS + def #{c}(*a) + "<FONT COLOR='#{c}'>" + a.to_s + "</FONT>" + end + EOS +} + + +# @@PLEAC@@_10.15 +def method_missing(name, *args) + "<FONT COLOR='#{name}'>" + args.join(' ') + "</FONT>" +end +puts chartreuse("stuff") + + +# @@PLEAC@@_10.16 +def outer(arg) + x = arg + 35 + inner = proc { x * 19 } + x + inner.call() +end + + +# @@PLEAC@@_10.17 +#!/usr/bin/ruby -w +# mailsort - sort mbox by different criteria +require 'English' +require 'Date' + +# Objects of class Mail represent a single mail. +class Mail + attr_accessor :no + attr_accessor :subject + attr_accessor :fulltext + attr_accessor :date + + def initialize + @fulltext = "" + @subject = "" + end + + def append(para) + @fulltext << para + end + + # this is called if you call puts(mail) + def to_s + @fulltext + end +end + +# represents a list of mails. +class Mailbox < Array + + Subjectpattern = Regexp.new('Subject:\s*(?:Re:\s*)*(.*)\n') + Datepattern = Regexp.new('Date:\s*(.*)\n') + + # reads mails from open file and stores them + def read(file) + $INPUT_RECORD_SEPARATOR = '' # paragraph reads + msgno = -1 + file.each { |para| + if para =~ /^From/ + mail = Mail.new + mail.no = (msgno += 1) + md = Subjectpattern.match(para) + if md + mail.subject = md[1] + end + md = Datepattern.match(para) + if md + mail.date = DateTime.parse(md[1]) + else + mail.date = DateTime.now + end + self.push(mail) + end + mail.append(para) if mail + } + end + + def sort_by_subject_and_no + self.sort_by { |m| + [m.subject, m.no] + } + end + + # sorts by a list of attributs of mail, given as symbols + def sort_by_attributs(*attrs) + # you can sort an Enumerable by an array of + # values, they would be compared + # from ary[0] to ary[n]t, say: + # ['b',1] > ['a',10] > ['a',9] + self.sort_by { |elem| + attrs.map { |attr| + elem.send(attr) + } + } + end + +end + +mailbox = Mailbox.new +mailbox.read(ARGF) + +# print only subjects sorted by subject and number +for m in mailbox.sort_by_subject_and_no + puts(m.subject) +end + +# print complete mails sorted by date, then subject, then number +for m in mailbox.sort_by_attributs(:date, :subject) + puts(m) +end + + +# @@PLEAC@@_11.7 +def mkcounter(count) + start = count + bundle = { + "NEXT" => proc { count += 1 }, + "PREV" => proc { count -= 1 }, + "RESET" => proc { count = start } + } + bundle["LAST"] = bundle["PREV"] + return bundle +end + +c1 = mkcounter(20) +c2 = mkcounter(77) + +puts "next c1: #{c1["NEXT"].call}" # 21 +puts "next c2: #{c2["NEXT"].call}" # 78 +puts "next c1: #{c1["NEXT"].call}" # 22 +puts "last c1: #{c1["PREV"].call}" # 21 +puts "last c1: #{c1["LAST"].call}" # 20 +puts "old c2: #{c2["RESET"].call}" # 77 + + +# @@PLEAC@@_11.15 +class Binary_tree + def initialize(val) + @value = val + @left = nil + @right = nil + end + + # insert given value into proper point of + # provided tree. If no tree provided, + # use implicit pass by reference aspect of @_ + # to fill one in for our caller. + def insert(val) + if val < @value then + if @left then + @left.insert(val) + else + @left = Binary_tree.new(val) + end + elsif val > @value then + if @right then + @right.insert(val) + else + @right = Binary_tree.new(val) + end + else + puts "double" + # do nothing, no double values + end + end + + # recurse on left child, + # then show current value, + # then recurse on right child. + def in_order + @left.in_order if @left + print @value, " " + @right.in_order if @right + end + + # show current value, + # then recurse on left child, + # then recurse on right child. + def pre_order + print @value, " " + @left.pre_order if @left + @right.pre_order if @right + end + + # recurse on left child, + # then recurse on right child, + # then show current value. + def post_order + @left.post_order if @left + @right.post_order if @right + print @value, " " + end + + # find out whether provided value is in the tree. + # if so, return the node at which the value was found. + # cut down search time by only looking in the correct + # branch, based on current value. + def search(val) + if val == @value then + return self + elsif val < @value then + return @left.search(val) if @left + return nil + else + return @right.search(val) if @right + return nil + end + end +end + +# first generate 20 random inserts +test = Binary_tree.new(0) +for a in 0..20 + test.insert(rand(1000)) +end + +# now dump out the tree all three ways +print "Pre order: "; test.pre_order; puts "" +print "In order: "; test.in_order; puts "" +print "Post order: "; test.post_order; puts "" + +print "search?" +while gets + print test.search($_.to_i) + print "\nsearch?" +end + + +# @@PLEAC@@_12.0 +# class and module names need to have the first letter capitalized +module Alpha + NAME = 'first' +end +module Omega + NAME = 'last' +end +puts "Alpha is #{Alpha::NAME}, Omega is #{Omega::NAME}" + +# ruby doesn't differentiate beteen compile-time and run-time +require 'getoptlong.rb' +require 'getoptlong' # assumes the .rb +require 'cards/poker.rb' +require 'cards/poker' # assumes the .rb +load 'cards/poker' # require only loads the file once + +module Cards + module Poker + @card_deck = Array.new # or @card_deck = [] + def shuffle + end + end +end + + +# @@PLEAC@@_12.1 +# a module exports all of its functions +module Your_Module + def self.function + # this would be called as Your_Module.function + end + + def Your_Module.another + # this is the same as above, but more specific + end +end + +# @@PLEAC@@_12.2 +begin + require 'nonexistent' +rescue LoadError + puts "Couldn't load #{$!}" # $! contains the last error string +end + +# @@PLEAC@@_12.4 +# module variables are private unless access functions are defined +module Alpha + @aa = 10 + @bb = 11 + + def self.put_aa + puts @aa + end + + def self.bb=(val) + @bb = val + end +end + +Alpha.bb = 12 +# Alpha.aa = 10 # error, no aa=method + + +# @@PLEAC@@_12.5 +# caller provides a backtrace of the call stack +module MyModule + def find_caller + caller + end + + def find_caller2(i) + caller(i) # an argument limits the size of the stack returned + end +end + + +# @@PLEAC@@_12.6 +BEGIN { + $logfile = '/tmp/mylog' unless defined? $logfile + $LF = File.open($logfile, 'a') +} + +module Logger + def self.logmsg(msg) + $LF.puts msg + end + + logmsg('startup') +end + +END { + Logger::logmsg('shutdown') + $LF.close +} + + +# @@PLEAC@@_12.7 +#----------------------------- +# results may be different on your system +# % ruby -e "$LOAD_PATH.each_index { |i| printf("%d %s\n", i, $LOAD_PATH[i] } +#0 /usr/local/lib/site_ruby/1.6 +#1 /usr/local/lib/site_ruby/1.6/i386-linux +#2 /usr/local/lib/site_ruby/ +#3 /usr/lib/ruby/1.6 +#4 /usr/lib/ruby/1.6/i136-linux +#5 . +#----------------------------- +# syntax for sh, bash, ksh, or zsh +#$ export RUBYLIB=$HOME/rubylib + +# syntax for csh or tcsh +# % setenv RUBYLIB ~/rubylib +#----------------------------- +$LOAD_PATH.unshift "/projects/spectre/lib"; + + +# @@PLEAC@@_12.8 +# equivalents in ruby are mkmf, SWIG, or Ruby/DL depending on usage + + +# @@PLEAC@@_12.9 +# no equivalent in ruby + + +# @@PLEAC@@_12.10 +# no equivalent in ruby + + +# @@PLEAC@@_12.11 +module FineTime + def self.time + # to be defined later + end +end + + +module FineTime + def self.time + "its a fine time" + end +end + +puts FineTime.time #=> "its a fine time" + + +# @@PLEAC@@_12.12 +def even_only(n) + raise "#{n} is not even" if (n & 1) != 0 # one way to test + # ... +end +def even_only(n) + $stderr.puts "#{n} is not even" if (n & 1) != 0 + # ... +end + + +# @@PLEAC@@_12.17 +# The library archive for ruby is called Ruby Application archive, +# or shorter RAA, and can be found at http://raa.ruby-lang.org. +# A typical library is installed like this: +# % gunzip some-module-4.54.tar.gz +# % tar xf some-module-4.54.tar +# % cd some-module-4.54.tar +# % ruby install.rb config +# % ruby install.rb setup +# get superuser previleges here if needed for next step +# % ruby install.rb install + +# Some modules use a different process, +# you should find details in the documentation +# Here is an example of such a different process +# % ruby extconf.rb +# % make +# % make install + +# If you want the module installed in your own directory: +# For ruby version specific libraries +# % ruby install.rb config --site-ruby=~/lib +# For version independent libraries +# % ruby install.rb config --site-ruby-common=~/lib + +# Information about possible options for config +# % ruby install.rb --help + +# If you have your own complete distribution +# % ruby install.rb --prefix=path=~/ruby-private + + +# @@PLEAC@@_13.0 +# Classes and objects in Ruby are rather straigthforward +class Person + # Class variables (also called static attributes) are prefixed by @@ + @@person_counter=0 + + # object constructor + def initialize(age, name, alive = true) # Default arg like in C++ + @age, @name, @alive = age, name, alive # Object attributes are prefixed by '@' + @@person_counter += 1 + # There is no '++' operator in Ruby. The '++'/'--' operators are in fact + # hidden assignments which affect variables, not objects. You cannot accomplish + # assignment via method. Since everything in Ruby is object, '++' and '--' + # contradict Ruby OO ideology. Instead '-=' and '+=' are used. + end + + attr_accessor :name, :age # This creates setter and getter methods for @name + # and @age. See 13.3 for detailes. + + # methods modifying the receiver object usually have the '!' suffix + def die! + @alive = false + puts "#{@name} has died at the age of #{@age}." + @alive + end + + def kill(anotherPerson) + print @name, ' is killing ', anotherPerson.name, ".\n" + anotherPerson.die! + end + + # methods used as queries + # usually have the '?' suffix + def alive? + @alive && true + end + + def year_of_birth + Time.now.year - @age + end + + # Class method (also called static method) + def Person.number_of_people + @@person_counter + end +end + +# Using the class: +# Create objects of class Person +lecter = Person.new(47, 'Hannibal') +starling = Person.new(29, 'Clarice', true) +pazzi = Person.new(40, 'Rinaldo', true) + +# Calling a class method +print "There are ", Person.number_of_people, " Person objects\n" + +print pazzi.name, ' is ', (pazzi.alive?) ? 'alive' : 'dead', ".\n" +lecter.kill(pazzi) +print pazzi.name, ' is ', (pazzi.alive?) ? 'alive' : 'dead', ".\n" + +print starling.name , ' was born in ', starling.year_of_birth, "\n" + + +# @@PLEAC@@_13.1 +# If you don't need any initialisation in the constructor, +# you don't need to write a constructor. +class MyClass +end + +class MyClass + def initialize + @start = Time.new + @age = 0 + end +end + +class MyClass + def initialize(inithash) + @start = Time.new + @age = 0 + for key, value in inithash + instance_variable_set("@#{key}", value) + end + end +end + +# @@PLEAC@@_13.2 +# Objects are destroyed by the garbage collector. +# The time of destroying is not predictable. +# The ruby garbage collector can handle circular references, +# so there is no need to write destructor for that. + +# There is no direct support for destructor. +# You can call a custom function, or more specific a proc object, when the +# garbage collector is about to destruct the object, but it is unpredictable +# when this occurs. +# Also if such a finalizer object has a reference to the orignal object, +# this may prevent the original object to get garbage collected. +# Because of this problem the finalize method below is +# a class method and not a instance method. +# So if you need to free resources for an object, like +# closing a socket or kill a spawned subprocess, +# you should do it explicitly. + +class MyClass + def initialize + ObjectSpace.define_finalizer(self, + self.class.method(:finalize).to_proc) + end + def MyClass.finalize(id) + puts "Object #{id} dying at #{Time.new}" + end +end + +# test code +3.times { + MyClass.new +} +ObjectSpace.garbage_collect + + +# @@PLEAC@@_13.3 +# You can write getter and setter methods in a natural way: +class Person + def name + @name + end + def name=(name) + @name = name + end +end + +# But there is a better and shorter way +class Person + attr_reader :age + attr_writer :name + # attr_reader and attr_writer are actually methods in class Class + # which set getter and setter methods for you. +end + +# There is also attr_accessor to create both setters and getters +class Person + attr_accessor :age, :name +end + + +# @@PLEAC@@_13.4 +class Person + # Class variables (also called static attributes) are prefixed by @@ + @@person_counter = 0 + + def Person.population + @@person_counter + end + def initialize + @@person_counter += 1 + ObjectSpace.define_finalizer(self, + self.class.method(:finalize).to_proc) + end + def Person.finalize(id) + @@person_counter -= 1 + end +end +people = [] +10.times { + people.push(Person.new) +} +printf("There are %d people alive", Person.population) + + +FixedArray.class_max_bounds = 100 +alpha = FixedArray.new +puts "Bound on alpha is #{alpha.max_bounds}" + +beta = FixedArray.new +beta.max_bounds = 50 # calls the instance method +beta.class.class_max_bounds = 50 # alternative, calls the class method +puts "Bound on alpha is #{alpha.max_bounds}" + +class FixedArray + @@bounds = 7 + + def max_bounds + @@max_bounds + end + # instance method, which sets the class variable + def max_bounds=(value) + @@max_bounds = value + end + # class method. This can only be called on a class, + # but not on the instances + def FixedArray.class_max_bounds=(value) + @@max_bounds = value + end +end + + +# @@PLEAC@@_13.5 +PersonStruct = Struct.new("Person", :name, :age, :peers) +# creates a class "Person::Struct", which is accessiable with the +# constant "PersonStruct" +p = PersonStruct.new +p = Struct::Person.new # alternative using the classname +p.name = "Jason Smythe" +p.age = 13 +p.peers = ["Wilbur", "Ralph", "Fred"] +p[:peers] = ["Wilbur", "Ralph", "Fred"] # alternative access using symbol +p["peers"] = ["Wilbur", "Ralph", "Fred"] # alternative access using name of field +p[2] = ["Wilbur", "Ralph", "Fred"] # alternative access using index of field +puts "At age #{p.age}, #{p.name}'s first friend is #{p.peers[0]}" + +# The fields of a struct have no special type, like other ruby variables +# you can put any objects in. Therefore the discussions how to specify +# the types of the fields do not apply to ruby. + +FamilyStruct = Struct.new("Family", :head, :address, :members) +folks = FamilyStruct.new +folks.head = PersonStruct.new +dad = folks.head +dad.name = "John" +dad.age = 34 + +# supply of own accessor method for the struct for error checking +class PersonStruct + def age=(value) + if !value.kind_of?(Integer) + raise(ArgumentError, "Age #{value} isn't an Integer") + elsif value > 150 + raise(ArgumentError, "Age #{value} is unreasonable") + end + @age = value + end +end + + +# @@PLEAC@@_13.6 +# The ruby Object class defines a dup and a clone method. +# The dup method is recommended for prototype object creation. +# The default implementation makes a shallow copy, +# but each class can override it, for example to make a deep copy. + +# If you want to call 'new' directly on the instances, +# you can create a instance method "new", which returns a new duplicate. +# This method is distinct from the class method new. +# +class A + def new + dup + end +end + +ob1 = A.new +# later on +ob2 = ob1.new + + +# @@PLEAC@@_13.7 +methname = 'flicker' +obj.send(methname, 10) # calls obj.flicker(10) + +# call three methods on the object, by name +['start', 'run', 'stop'].each do |method_string| + obj.send(method_string) +end + +# Another way is to create a Method object +method_obj = obj.method('flicker') +# And then call it +method_obj.call(10) + + +# @@PLEAC@@_13.8 +# All classes in Ruby inherit from class Object +# and thus all objects share methods defined in this class + +# the class of the object +puts any_object.type + +# Ruby classes are actually objects of class Class and they +# respond to methods defined in Object class as well + +# the superclass of this class +puts any_object.class.superclass + +# ask an object whether it is an instance of particular class +n = 4.7 +puts n.instance_of?(Float) # true +puts n.instance_of?(Numeric) # false + +# ask an object whether it is an instance of class, one of the +# superclasses of the object, or modules included in it +puts n.kind_of?(Float) # true (the class) +puts n.kind_of?(Numeric) # true (an ancestor class) +puts n.kind_of?(Comparable) # true (a mixin module) +puts n.kind_of?(String) # false + +# ask an object whether it can respond to a particular method +puts n.respond_to?('+') # true +puts n.respond_to?('length') # false + +# all methods an object can respond to +'just a string'.methods.each { |m| puts m } + + +# @@PLEAC@@_13.9 +# Actually any class in Ruby is inheritable +class Person + attr_accessor :age, :name + def initialize + @name + @age + end +end +#----------------------------- +dude = Person.new +dude.name = 'Jason' +dude.age = 23 +printf "%s is age %d.\n", dude.name, dude.age +#----------------------------- +# Inheriting from Person +class Employee < Person + attr_accessor :salary +end +#----------------------------- +empl = Employee.new +empl.name = 'Jason' +empl.age = 23 +empl.salary = 200 +printf "%s is age %d, the salary is %d.\n", empl.name, empl.age, empl.salary +#----------------------------- +# Any built-in class can be inherited the same way +class WeirdString < String + def initialize(obj) + super obj + end + def +(anotherObj) # + method in this class is overridden + # to return the sum of string lengths + self.length + anotherObj.length # 'self' can be omitted + end +end +#----------------------------- +a = WeirdString.new('hello') +b = WeirdString.new('bye') + +puts a + b # the overridden + +#=> 8 +puts a.length # method from the superclass, String +#=> 5 + + +# @@PLEAC@@_13.11 +# In ruby you can override the method_missing method +# to have a solution similar to perls AUTOLOAD. +class Person + + def initialize + @ok_fields = %w(name age peers parent) + end + + def valid_attribute?(name) + @ok_fields.include?(name) + end + + def method_missing(namesymbol, *params) + name = namesymbol.to_s + return if name =~ /^A-Z/ + if name.to_s[-1] == ('='[0]) # we have a setter + isSetter = true + name.sub!(/=$/, '') + end + if valid_attribute?(name) + if isSetter + instance_variable_set("@#{name}", *params) + else + instance_variable_get("@#{name}", *params) + end + else + # if no annestor is responsible, + # the Object class will throw a NoMethodError exception + super(namesymbol, *params) + end + end + + def new + kid = Person.new + kid.parent = self + kid + end + +end + +dad = Person.new +dad.name = "Jason" +dad.age = 23 +kid = dad.new +kid.name = "Rachel" +kid.age = 2 +puts "Kid's parent is #{kid.parent.name}" +puts dad +puts kid + +class Employee < Person + def initialize + super + @ok_fields.push("salary", "boss") + end + def ok_fields + @ok_fields + end +end + + +# @@PLEAC@@_13.13 +# The ruby garbage collector pretends to cope with circular structures. +# You can test it with this code: +class RingNode + attr_accessor :next + attr_accessor :prev + attr_reader :name + + def initialize(aName) + @name = aName + ObjectSpace.define_finalizer(self, + self.class.method(:finalize).to_proc) + end + + def RingNode.finalize(id) + puts "Node #{id} dying" + end + + def RingNode.show_all_objects + ObjectSpace.each_object {|id| + puts id.name if id.class == RingNode + } + end +end + +def create_test + a = RingNode.new("Node A") + b = RingNode.new("Node B") + c = RingNode.new("Node C") + a.next = b + b.next = c + c.next = a + a.prev = c + c.prev = b + b.prev = a + + a = nil + b = nil + c = nil +end + +create_test +RingNode.show_all_objects +ObjectSpace.garbage_collect +puts "After garbage collection" +RingNode.show_all_objects + + +# @@PLEAC@@_13.14 +class String + def <=>(other) + self.casecmp other + end +end + +# There is no way to directly overload the '""' (stringify) +# operator in Ruby. However, by convention, classes which +# can reasonably be converted to a String will define a +# 'to_s' method as in the TimeNumber class defined below. +# The 'puts' method will automatcally call an object's +# 'to_s' method as is demonstrated below. +# Furthermore, if a class defines a to_str method, an object of that +# class can be used most any place where the interpreter is looking +# for a String value. + +#--------------------------------------- +# NOTE: Ruby has a builtin Time class which would usually be used +# to manipulate time objects, the following is supplied for +# educational purposes to demonstrate operator overloading. +# +class TimeNumber + attr_accessor :hours,:minutes,:seconds + def initialize( hours, minutes, seconds) + @hours = hours + @minutes = minutes + @seconds = seconds + end + + def to_s + return sprintf( "%d:%02d:%02d", @hours, @minutes, @seconds) + end + + def to_str + to_s + end + + def +( other) + seconds = @seconds + other.seconds + minutes = @minutes + other.minutes + hours = @hours + other.hours + if seconds >= 60 + seconds %= 60 + minutes += 1 + end + if minutes >= 60 + minutes %= 60 + hours += 1 + end + return TimeNumber.new(hours, minutes, seconds) + end + + def -(other) + raise NotImplementedError + end + + def *(other) + raise NotImplementedError + end + + def /( other) + raise NotImplementedError + end +end + +t1 = TimeNumber.new(0, 58, 59) +sec = TimeNumber.new(0, 0, 1) +min = TimeNumber.new(0, 1, 0) +puts t1 + sec + min + min + +#----------------------------- +# StrNum class example: Ruby's builtin String class already has the +# capabilities outlined in StrNum Perl example, however the '*' operator +# on Ruby's String class acts differently: It creates a string which +# is the original string repeated N times. +# +# Using Ruby's String class as is in this example: +x = "Red"; y = "Black" +z = x+y +r = z*3 # r is "RedBlackRedBlackRedBlack" +puts "values are #{x}, #{y}, #{z}, and #{r}" +print "#{x} is ", x < y ? "LT" : "GE", " #{y}\n" +# prints: +# values are Red, Black, RedBlack, and RedBlackRedBlackRedBlack +# Red is GE Black + +#----------------------------- +class FixNum + REGEX = /(\.\d*)/ + DEFAULT_PLACES = 0 + attr_accessor :value, :places + def initialize(value, places = nil) + @value = value + if places + @places = places + else + m = REGEX.match(value.to_s) + if m + @places = m[0].length - 1 + else + @places = DEFAULT_PLACES + end + end + end + + def +(other) + FixNum.new(@value + other.value, max(@places, other.places)) + end + + def *(other) + FixNum.new(@value * other.value, max(@places, other.places)) + end + + def /(other) + puts "Divide: #{@value.to_f/other.value.to_f}" + result = FixNum.new(@value.to_f/other.value.to_f) + result.places = max(result.places,other.places) + result + end + + def to_s + sprintf("STR%s: %.*f", self.class.to_s , @places, @value) #. + end + + def to_str + to_s + end + + def to_i #convert to int + @value.to_i + end + + def to_f #convert to float` + @value.to_f + end + + private + def max(a,b) + a > b ? a : b + end +end + +def demo() + x = FixNum.new(40) + y = FixNum.new(12, 0) + + puts "sum of #{x} and #{y} is #{x+y}" + puts "product of #{x} and #{y} is #{x*y}" + + z = x/y + puts "#{z} has #{z.places} places" + unless z.places + z.places = 2 + end + + puts "div of #{x} by #{y} is #{z}" + puts "square of that is #{z*z}" +end + +if __FILE__ == $0 + demo() +end + + +# @@PLEAC@@_14.1 +# There are dbm, sdbm, gdbm modules +# and the bdb module for accessing the berkeley db +# sdbm seem to be available on the most systems, +# so we use it here +# +require "sdbm" +SDBM.open("filename", 0666) { |dbobj| + # raises exception if open error + + # the returned sdbm-dbobj has most of the methods of a hash + v = dbobj["key"] + dbobj["key"] = "newvalue" + if dbobj.has_key?("key") + # ... + end + dbobj.delete("key2") +} +# database is open only inside the block. + +# It is also possible to use a open .. close pair: +dbobj = SDBM.open("filename", 0666) +#.. do something with dbobj +dbobj.close + +#!/usr/bin/ruby -w +# userstats - generate statistics on who is logged in +# call with usernames as argument to display the totals +# for the given usernames, call with "ALL" to display all users + +require "sdbm" +filename = '/tmp/userstats.db' +SDBM.open(filename, 0666) { |dbobj| + if ARGV.length > 0 + if ARGV[0] == "ALL" + # ARGV is constant, so we need the variable userlist + userlist = dbobj.keys().sort() + else + userlist = ARGV + end + userlist.each { |user| + print "#{user}\t#{dbobj[user]}\n" + } + else + who = `who` + who.split("\n").each { |line| + md = /^(\S+)/.match(line) + raise "Bad line from who: #{line}" unless md + # sdbm stores only strings, so "+=" doesn't work, + # we need to convert them expicitly back to integer. + if dbobj.has_key?(md[0]) + dbobj[md[0]] = dbobj[md[0]].to_i + 1 + else + dbobj[md[0]] = "1" + end + } + end +} + + +# @@PLEAC@@_14.2 +# using open and clear +dbobj = SDBM.open("filename", 0666) +dbobj.clear() +dbobj.close() +# deleting file and recreating it +# the filenames depend on the flavor of dbm you use, +# for example sdbm has two files named filename.pag and filename.dir, +# so you need to delete both files +begin + File.delete("filename") + # raises Exception if not exist + dbobj = SDBM.open("filename", 0666) +rescue + # add error handling here +end + + +# @@PLEAC@@_14.3 +# sdbm2gdbm: converts sdbm database to a gdbm database +require "sdbm" +require "gdbm" + +unless ARGV.length == 2 + fail "usage: sdbm2gdbm infile outfile" +end +infile = ARGV[0] +outfile = ARGV[1] + +sdb = SDBM.open(infile) +gdb = GDBM.open(outfile, 0666) +sdb.each { |key, val| + gdb[key] = val +} +gdb.close +sdb.close + + +# @@PLEAC@@_14.4 +#!/usr/bin/ruby -w +# dbmmerge: merges two dbm databases +require "sdbm" + +unless ARGV.length == 3 + fail "usage: dbmmerge indb1 indb2 outdb" +end +infile1 = ARGV[0] +infile2 = ARGV[0] +outfile = ARGV[2] + +in1 = SDBM.open(infile1, nil) +in2 = SDBM.open(infile2, nil) +outdb = SDBM.open(outfile, 0666) + +[in1, in2].each { |indb| + indb.each { |key, val| + if outdb.has_key?(key) + # decide which value to set. + # set outdb[key] if necessary + else + outdb[key] = val + end + } +} +in1.close +in2.close +outdb.close + + +# @@PLEAC@@_14.7 +# we write a tie method that extends the Array class. +# It reads the file into the memory, executes the code block +# in which you can manipulate the array as needed, and writes +# the array back to the file after the end of the block execution +class Array + def tie(filename, flags) + File.open(filename, flags) { |f| + f.each_line { |line| + self.push(line.chomp) + } + yield + f.rewind + each { |line| + if line + f.puts(line) + else + f.puts "" + end + } + } + end +end + +array = Array.new +array.tie("/tmp/textfile.txt", File::RDWR|File::CREAT) { + array[4] = "a new line 4" +} + +# The tied array can be manipulated like a normal array, +# so there is no need for a special API, and the recno_demo program +# to demonstrate is API is useless + + +# tied array demo: show how to use array with a tied file +filename = "db_file.txt" +lines = Array.new +File.unlink(filename) if File.exists?(filename) +lines.tie(filename, File::RDWR | File::CREAT) { + # first create a textfile to play with + lines[0] = "zero" + lines[1] = "one" + lines[2] = "two" + lines[3] = "three" + lines[4] = "four" + + # print the records in order. + # Opposed to perl, the tied array behaves exactly as a normal array + puts "\nOriginal" + for i in 0..(lines.length-1) + puts "#{i}: #{lines[i]}" + end + + #use push and pop + a = lines.pop + lines.push("last") + puts("The last line was [#{a}]") + + #use shift and unshift + a = lines.shift + lines.unshift("first") + puts("The first line was [#{a}]") + + # add record after record 2 + i = 2 + lines.insert(i + 1, "Newbie") + + # add record before record one + i = 1 + lines.insert(i, "New One") + + # delete record 3 + lines.delete_at(3) + + #now print the records in reverse order + puts "\nReverse" + (lines.length - 1).downto(0){ |i| + puts "#{i}: #{lines[i]}" + } + +} + + +# @@PLEAC@@_14.8 +# example to store complex data in a database +# uses marshall from the standard library +require "sdbm" +db = SDBM.open("pleac14-8-database", 0666) + +# convert the Objects into strings and back by using the Marshal module. +# Most normal objects can be converted out of the box, +# but not special things like procedure objects, +# IO instance variables, singleton objects + +db["Tom Christiansen"] = Marshal.dump(["book author", "tchrist@perl.com"]) +db["Tom Boutell"] = Marshal.dump(["shareware author", +"boutell@boutell.com"]) + +name1 = "Tom Christiansen" +name2 = "Tom Boutell" + +tom1 = Marshal.load(db[name1]) +tom2 = Marshal.load(db[name2]) + +puts "Two Toming: #{tom1} #{tom2}" + +if tom1[0] == tom2[0] && tom1[1] == tom2[1] + puts "You're having runtime fun with one Tom made two." +else + puts "No two Toms are ever alike" +end + +# To change parts of an entry, get the whole entry, change the parts, +# and save the whole entry back +entry = Marshal.load(db["Tom Boutell"]) +entry[0] = "Poet Programmer" +db["Tom Boutell"] = Marshal.dump(entry) +db.close + + +# @@PLEAC@@_14.9 +# example to make data persistent +# uses Marshal from the standard lib +# Stores the data in a simple file, +# see 14.8 on how to store it in a dbm file + +# The BEGIN block is executed before the rest of the script +# we use global variables here because local variables +# will go out of scope and are not accessible from the main script + +BEGIN { + $persistent_store = "persitence.dat" + begin + File.open($persistent_store) do |f| + $stringvariable1 = Marshal.load(f) + $arrayvariable2 = Marshal.load(f) + end + rescue + puts "Can not open #{$persistent_store}" + # Initialisation if this script runs the first time + $stringvariable1 = "" + $arrayvariable2 = [] + end +} + +END { + File.open($persistent_store, "w+") do |f| + Marshal.dump($stringvariable1, f) + Marshal.dump($arrayvariable2, f) + end +} + +# simple test program +puts $stringvariable1 +puts $arrayvariable2 +$stringvariable1 = "Hello World" +$arrayvariable2.push(5) +puts $stringvariable1 +puts $arrayvariable2 + + +# @@PLEAC@@_14.10 +#!/usr/bin/ruby -w +# Ruby has a dbi module with an architecture similar +# to the Perl dbi module: the dbi module provides an unified +# interface and uses specialized drivers for each dbms vendor +# +begin + DBI.connect("DBI:driver:driverspecific", "username", "auth") { + |dbh| + + dbh.do(SQL1) + + dbh.prepare(SQL2){ |sth| + sth.execute + sth.fetch {|row| + # ... + } + } # end of block finishes the statement handle + } # end of block closes the database connection +rescue DBI::DatabaseError => e + puts "dbi error occurred" + puts "Error code: #{e.err}" + puts "Error message: #{e.errstr}" +end + +#!/usr/bin/ruby -w +# dbusers - example for mysql which creates a table, +# fills it with values, retrieves the values back, +# and finally destroys the table. + +require "dbi" + +# replacement for the User::pwnt module +def getpwent + result = [] + File.open("/etc/passwd") {|file| + file.each_line {|line| + next if line.match(/^#/) + cols = line.split(":") + result.push([cols[2], cols[0]]) + } + } + result +end + +begin + DBI.connect("DBI:Mysql:pleacdatabase", "pleac", "pleacpassword") { + |conn| + + conn.do("CREATE TABLE users (uid INT, login CHAR(8))") + + users = getpwent + + conn.prepare("INSERT INTO users VALUES (?,?)") {|sth| + users.each {|entry| + sth.execute(entry[0], entry[1]) + } + } + + conn.execute("SELECT uid, login FROM users WHERE uid < 50") {|sth| + sth.fetch {|row| + puts row.collect {|col| + if col.nil? + "(null)" + else + col + end + }.join(", ") + } + } + + conn.do("DROP TABLE users") + } +rescue DBI::DatabaseError => e + puts "dbi error occurred" + puts "Error code: #{e.err}" + puts "Error message: #{e.errstr}" +end + + +# @@PLEAC@@_15.1 +# This test program demonstrates parsing program arguments. +# It uses the optparse library, which is included with ruby 1.8 +# It handles classic unix style and gnu style options +require 'optparse' + +@debugmode = false +@verbose = false + +ARGV.options do |opts| + opts.banner = "Usage: ruby #{$0} [OPTIONS] INPUTFILES" + + opts.on("-h", "--help", "show this message") { + puts opts + exit + } + # The OptionParser#on method is called with a specification of short + # options, of long options, a data type spezification and user help + # messages for this option. + # The method analyses the given parameter and decides what it is, + # so you can leave out the long option if you don't need it + opts.on("-v", "--[no-]verbose=[FLAG]", TrueClass, "run verbosly") { + |@verbose| # sets @verbose to true or false + } + opts.on("-D", "--DEBUG", TrueClass, "turns on debug mode" ){ + |@debugmode| # sets @debugmode to true + } + opts.on("-c", "--count=NUMBER", Integer, "how many times we do it" ){ + |@count| # sets @count to given integer + } + opts.on("-o", "--output=FILE", String, "file to write output to"){ + |@outputfile| # sets @outputfile to given string + } + opts.parse! +end + +# example to use the options in the main program +puts "Verbose is on" if @verbose +puts "Debugmode is on" if @debugmode +puts "Outfile is #{@outputfile}" if defined? @outputfile +puts "Count is #{@count}" if defined? @count +ARGV.each { |param| + puts "Got parameter #{param}" +} + + +# @@PLEAC@@_15.4 +buf = "\0" * 8 +$stdout.ioctl(0x5413, buf) +ws_row, ws_col, ws_xpixel, ws_ypixel = buf.unpack("S4") + +raise "You must have at least 20 characters" unless ws_col >= 20 +max = 0 +values = (1..5).collect { rand(20) } # generate an array[5] of rand values +for i in values + max = i if max < i +end +ratio = Float(ws_col-12)/max # chars per unit +for i in values + printf "%8.1f %s\n", i, "*" * (ratio*i) +end + +# gives, for example: +# 15.0 ******************************* +# 10.0 ********************* +# 5.0 ********** +# 14.0 ***************************** +# 18.0 ************************************** + + +# @@PLEAC@@_16.1 +output = `program args` # collect output into one multiline string +output = `program args`.split # collect output into array, one line per +element + +readme = IO.popen("ls") +output = "" +while readme.gets do + output += $_ +end +readme.close + +`fsck -y /dev/rsd1a` # BAD AND SCARY in Perl because it's managed by the shell + # I donna in Ruby ... + +# so the "clean and secure" version +readme, writeme = IO.pipe +pid = fork { + # child + $stdout = writeme + readme.close + exec('find', '..') +} +# parent +Process.waitpid(pid, 0) +writeme.close +while readme.gets do + # do something with $_ +end + + +# @@PLEAC@@_16.2 +status = system("xemacs #{myfile}") + +status = system("xemacs", myfile) + +system("cmd1 args | cmd2 | cmd3 >outfile") +system("cmd args <infile >outfile 2>errfile") + +# stop if the command fails +raise "$program exited funny: #{$?}" unless system("cmd", "args1", "args2") + +# get the value of the signal sent to the child +# even if it is a SIGINT or SIGQUIT +system(arglist) +raise "program killed by signal #{$?}" if ($? & 127) != 0 + +pid = fork { + trap("SIGINT", "IGNORE") + exec("sleep", "10") +} +trap ("SIGINT") { + puts "Tsk tsk, no process interruptus" +} +Process.waitpid(pid, 0) + +# Ruby doesn't permit to lie to the program called by a 'system'. +# (ie specify what return argv[0] in C, $0 in Perl/Ruby ...) +# A (dirty) way is to create a link (under Unix), run this link and +# erase it. Somebody has a best idea ? + + +# @@PLEAC@@_16.3 +exec("archive *.data") + +exec("archive", "accounting.data") + +exec("archive accounting.data") + + +# @@PLEAC@@_16.4 +# read the output of a program +IO.popen("ls") {|readme| + while readme.gets do + # ... + end +} +# or +readme = IO.popen("ls") +while readme.gets do + # ... +end +readme.close + +# "write" in a program +IO.popen("cmd args","w") {|pipe| + pipe.puts("data") + pipe.puts("foo") +} + +# close wait for the end of the process +read = IO.popen("sleep 10000") # child goes to sleep +read.close # and the parent goes to lala land + +writeme = IO.popen("cmd args", "w") +writeme.puts "hello" # program will get hello\n on STDIN +writeme.close # program will get EOF on STDIN + +# send in a pager (eg less) all output +$stdout = IO.popen("/usr/bin/less","w") +print "huge string\n" * 10000 + + +# @@PLEAC@@_16.5 +#----------------------------- +def head(lines = 20) + pid = open("|-","w") + if pid == nil + return + else + while gets() do + pid.print + lines -= 1 + break if lines == 0 + end + end + exit +end + +head(100) +while gets() do + print +end +#----------------------------- +1: > Welcome to Linux, version 2.0.33 on a i686 + +2: > + +3: > "The software required `Windows 95 or better', + +4: > so I installed Linux." +#----------------------------- +> 1: Welcome to Linux, Kernel version 2.0.33 on a i686 + +> 2: + +> 3: "The software required `Windows 95 or better', + +> 4: so I installed Linux." +#----------------------------- +#!/usr/bin/ruby +# qnumcat - demo additive output filters + +def number() + pid = open("|-","w") + if pid == nil + return + else + while gets() do pid.printf("%d: %s", $., $_); end + end + exit +end + +def quote() + pid = open("|-","w") + if pid == nil + return + else + while gets() do pid.print "> #{$_}" end + end + exit +end + +number() +quote() + +while gets() do + print +end +$stdout.close +exit + + +# @@PLEAC@@_16.6 +ARGV.map! { |arg| + arg =~ /\.(gz|Z)$/ ? "|gzip -dc #{arg}" : arg +} +for file in ARGV + fh = open(file) + while fh.gets() do + # ....... + end +end +#----------------------------- +ARGV.map! { |arg| + arg =~ %r#^\w+://# ? "|GET #{arg}" : arg # +} +for file in ARGV + fh = open(file) + while fh.gets() do + # ....... + end +end +#----------------------------- +pwdinfo = (`domainname` =~ /^(\(none\))?$/) ? '/etc/passwd' : '|ypcat passwd'; +pwd = open(pwdinfo); +#----------------------------- +puts "File, please? "; +file = gets().chomp(); +fh = open(file); + + +# @@PLEAC@@_16.7 +output = `cmd 2>&1` # with backticks +# or +ph = open("|cmd 2>&1") # with an open pipe +while ph.gets() { } # plus a read +#----------------------------- +output = `cmd 2>/dev/null` # with backticks +# or +ph = open("|cmd 2>/dev/null") # with an open pipe +while ph.gets() { } # plus a read +#----------------------------- +output = `cmd 2>&1 1>/dev/null` # with backticks +# or +ph = open("|cmd 2>&1 1>/dev/null") # with an open pipe +while ph.gets() { } # plus a read +#----------------------------- +output = `cmd 3>&1 1>&2 2>&3 3>&-` # with backticks +# or +ph = open("|cmd 3>&1 1>&2 2>&3 3>&-") # with an open pipe +while ph.gets() { } # plus a read +#----------------------------- +system("program args 1>/tmp/program.stdout 2>/tmp/program.stderr") +#----------------------------- +output = `cmd 3>&1 1>&2 2>&3 3>&-` +#----------------------------- +fd3 = fd1 +fd1 = fd2 +fd2 = fd3 +fd3 = nil +#----------------------------- +system("prog args 1>tmpfile 2>&1") +system("prog args 2>&1 1>tmpfile") +#----------------------------- +# system ("prog args 1>tmpfile 2>&1") +fd1 = "tmpfile" # change stdout destination first +fd2 = fd1 # now point stderr there, too +#----------------------------- +# system("prog args 2>&1 1>tmpfile") +fd2 = fd1 # stderr same destination as stdout +fd1 = "tmpfile" # but change stdout destination +#----------------------------- +# It is often better not to rely on the shell, +# because of portability, possible security problems +# and bigger resource usage. So, it is often better to use the open3 library. +# See below for an example. +# opening stdin, stdout, stderr +require "open3" +stdin, stdout, stderr = Open3.popen('cmd') + + +# @@PLEAC@@_16.8 +#----------------------------- +# Contrary to perl, we don't need to use a module in Ruby +fh = Kernel.open("|" + program, "w+") +fh.puts "here's your input\n" +output = fh.gets() +fh.close() +#----------------------------- +Kernel.open("|program"),"w+") # RIGHT ! +#----------------------------- +# Ruby has already object methods for I/O handles +#----------------------------- +begin + fh = Kernel.open("|" + program_and_options, "w+") +rescue + if ($@ ~= /^open/) + $stderr.puts "open failed : #{$!} \n #{$@} \n" + break + end + raise # reraise unforseen exception +end + + +# @@PLEAC@@_16.13 +#% kill -l +#HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE +#ALRM TERM CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM +#PROF WINCH POLL PWR +#----------------------------- +#% ruby -e 'puts Signal.list.keys.join(" ")' +#PWR USR1 BUS USR2 TERM SEGV KILL POLL STOP SYS TRAP IOT HUP INT # +#WINCH XCPU TTIN CLD TSTP FPE IO TTOU PROF CHLD CONT PIPE ABRT +#VTALRM QUIT ILL XFSZ URG ALRM +#----------------------------- +# After that, the perl script create an hash equivalent to Signal.list, +# and an array. The array can be obtained by : +signame = [] +Signal.list.each { |name, i| signame[i] = name } + + +# @@PLEAC@@_16.14 +Process.kill(9, pid) # send $pid a signal 9 +Process.kill(-1, Process.getpgrp()) # send whole job a signal 1 +Process.kill("USR1", $$) # send myself a SIGUSR1 +Process.kill("HUP", pid1, pid2, pid3) # send a SIGHUP to processes in @pids +#----------------------------- +begin + Process.kill(0, minion) + puts "#{minion} is alive!" +rescue Errno::EPERM # changed uid + puts "#{minion} has escaped my control!"; +rescue Errno::ESRCH + puts "#{minion} is deceased."; # or zombied +rescue + puts "Odd; I couldn't check the status of #{minion} : #{$!}" +end + + +# @@PLEAC@@_16.15 +Kernel.trap("QUIT", got_sig_quit) # got_sig_quit = Proc.new { puts "Quit\n" } +trap("PIPE", "got_sig_quit") # def got_sig_pipe ... +trap("INT") { ouch++ } # increment ouch for every SIGINT +#----------------------------- +trap("INT", "IGNORE") # ignore the signal INT +#----------------------------- +trap("STOP", "DEFAULT") # restore default STOP signal handling + + +# @@PLEAC@@_16.16 +# the signal handler +def ding + trap("INT", "ding") + puts "\aEnter your name!" +end + +# prompt for name, overriding SIGINT +def get_name + save = trap("INT", "ding") + + puts "Kindly Stranger, please enter your name: " + name = gets().chomp() + trap("INT", save) + name +end + + +# @@PLEAC@@_16.21 +# implemented thanks to http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/1760 +require 'timeout' + +# we'll do something vastly more useful than cookbook to demonstrate timeouts +begin + timeout(5) { + waitsec = rand(10) + puts "Let's see if a sleep of #{waitsec} seconds is longer than 5 seconds..." + system("sleep #{waitsec}") + } + puts "Timeout didn't occur" +rescue Timeout::Error + puts "Timed out!" +end + + +# @@PLEAC@@_17.1 +# A basic TCP client connection +require 'socket' +begin + t = TCPSocket.new('www.ruby-lang.org', 'www') +rescue + puts "error: #{$!}" +else + # ... do something with the socket + t.print "GET / HTTP/1.0\n\n" + answer = t.gets(nil) + # and terminate the connection when we're done + t.close +end + +# Using the evil low level socket API +require 'socket' +# create a socket +s = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0) +# build the address of the remote machine +sockaddr_server = [Socket::AF_INET, 80, + Socket.gethostbyname('www.ruby-lang.org')[3], + 0, 0].pack("snA4NN") +# connect +begin + s.connect(sockaddr_server) +rescue + puts "error: #{$!}" +else + # ... do something with the socket + s.print "GET / HTTP/1.0\n\n" + # and terminate the connection when we're done + s.close +end + +# TCP connection with management of error (DNS) +require 'socket' +begin + client = TCPSocket.new('does not exists', 'www') +rescue + puts "error: #{$!}" +end + +# TCP connection with a time out +require 'socket' +require 'timeout' +begin + timeout(1) do #the server has one second to answer + client = TCPSocket.new('www.host.com', 'www') + end +rescue + puts "error: #{$!}" +end + + +# @@PLEAC@@_17.12 +require 'socket' + +class Preforker + attr_reader (:child_count) + + def initialize(prefork, max_clients_per_child, port, client_handler) + @prefork = prefork + @max_clients_per_child = max_clients_per_child + @port = port + @child_count = 0 + + @reaper = proc { + trap('CHLD', @reaper) + pid = Process.wait + @child_count -= 1 + } + + @huntsman = proc { + trap('CHLD', 'IGNORE') + trap('INT', 'IGNORE') + Process.kill('INT', 0) + exit + } + + @client_handler=client_handler + end + + def child_handler + trap('INT', 'EXIT') + @client_handler.setUp + # wish: sigprocmask UNblock SIGINT + @max_clients_per_child.times { + client = @server.accept or break + @client_handler.handle_request(client) + client.close + } + @client_handler.tearDown + end + + def make_new_child + # wish: sigprocmask block SIGINT + @child_count += 1 + pid = fork do + child_handler + end + # wish: sigprocmask UNblock SIGINT + end + + def run + @server = TCPserver.open(@port) + trap('CHLD', @reaper) + trap('INT', @huntsman) + loop { + (@prefork - @child_count).times { |i| + make_new_child + } + sleep .1 + } + end +end + +#----------------------------- +#!/usr/bin/ruby + +require 'Preforker' + +class ClientHandler + def setUp + end + + def tearDown + end + + def handle_request(client) + # do stuff + end +end + +server = Preforker.new(1, 100, 3102, ClientHandler.new) +server.run + + +# @@PLEAC@@_18.2 +require 'net/ftp' + +begin + ftp = Net::FTP::new("ftp.host.com") + ftp.login(username,password) + ftp.chdir(directory) + ftp.get(filename) + ftp.put(filename) +rescue Net::FTPError + $stderr.print "FTP failed: " + $! +ensure + ftp.close() if ftp +end + +# A better solution for a local use could be : +Net::FTP::new("ftp.host.com") do |ftp| + ftp.login(username,password) + ftp.chdir(directory) + ftp.get(filename) + ftp.put(filename) +end + +# If you have only one file to get, there is a simple solution : +require 'open-uri' +open("ftp://www.ruby-lang.org/path/filename") do |fh| + # read from filehandle fh +end +#-------------------------------------------- +# to wait a defined time for the connection, +# use the timeout module +require 'timeout' +begin + timeout(30){ + ftp = Net::FTP::new("ftp.host.com") + ftp.debug_mode = true + } +rescue Net::FTPError + $stderr.puts "Couldn't connect." +rescue Timeout::Error + $stderr.puts "Timeout while connecting to server." +end + +begin + ftp.login() +rescue Net::FTPError + $stderr.print "Couldn't authentificate.\n" +end + +begin + ftp.login(username) +rescue Net::FTPError + $stderr.print "Still couldn't authenticate.\n" +end + +begin + ftp.login(username, password) +rescue Net::FTPError + $stderr.print "Couldn't authenticate, even with explicit + username and password.\n" +end + +begin + ftp.login(username, password, account) +rescue Net::FTPError + $stderr.print "No dice. It hates me.\n" +end +#----------------------------- +ftp.put(localfile, remotefile) +#----------------------------- +# Sending data from STDIN is not directly supported +# by the ftp library module. A possible way to do it is to use the +# storlines method directly to send raw commands to the ftp server. +#----------------------------- +ftp.get(remotefile, localfile) +#----------------------------- +ftp.get(remotefile) { |data| puts data } +#----------------------------- +ftp.chdir("/pub/ruby") +print "I'm in the directory ", ftp.pwd(), "\n" +#----------------------------- +ftp.mkdir("/pub/ruby/new_dir") +#----------------------------- +lines = ftp.ls("/pub/ruby/") +# => ["drwxr-xr-x 2 matz users 4096 July 17 1998 1.0", ... ] + +latest = ftp.dir("/pub/ruby/*.tgz").sort.last + +ftp.nlst("/pub/ruby") +# => ["/pub/ruby/1.0", ... ] +#----------------------------- +ftp.quit() + + +# @@PLEAC@@_18.6 +require 'net/telnet' +t = Net::Telnet::new( "Timeout" => 10, + "Prompt" => /%/, + "Host" => host ) +t.login(username, password) +files = t.cmd("ls") +t.print("top") +process_string = t.waitfor(/\d+ processes/) +t.close +#----------------------------- +/[$%#>] \z/n +#----------------------------- +# In case of an error, the telnet module throws an exception. +# For control of the behavior in case of an error, +# you just need to catch the exceptions and do your custom +# error handling. +#----------------------------- +begin + telnet.login(username, password) +rescue TimeoutError + fail "Login failed !\n" +end +#----------------------------- +telnet.waitfor('/--more--/') +#----------------------------- +telnet.waitfor(String => 'greasy smoke', Timeout => 30) + + +# @@PLEAC@@_18.7 +require 'ping' + +puts "#{host} is alive.\n" if Ping.pingecho(host); +#----------------------------- +# the ping module only use TCP ping, not ICMP even if we are root +if Ping.pingecho("kingkong.com") + puts "The giant ape lives!\n"; +else + puts "All hail mighty Gamera, friend of children!\n"; +end + + +# @@PLEAC@@_19.0 +#----------------------------- +# http://www.perl.com/CPAN/ +# http://www.perl.com:8001/bad/mojo.html +# ftp://gatekeeper.dec.com/pub/misc/netlib.tar.Z +# ftp://anonymous@myplace:gatekeeper.dec.com/pub/misc/netlib.tar.Z +# file:///etc/motd +#----------------------------- +# http://mox.perl.com/cgi-bin/program?name=Johann&born=1685 +#----------------------------- +# http://mox.perl.com/cgi-bin/program +#----------------------------- + + +# @@PLEAC@@_19.1 +#!/usr/local/bin/ruby -w +# hiweb - load CGI class to decode information given by web server + +require 'cgi' + +cgi = CGI.new('html3') + +# get a parameter from a form +value = cgi.params['PARAM_NAME'][0] + +# output a document +cgi.out { + cgi.html { + cgi.head { cgi.title { "Howdy there!" } } + + cgi.body { cgi.p { "You typed: " + cgi.tt { + CGI.escapeHTML(value) } } } + } +} + +require 'cgi' +cgi = CGI.new +who = cgi.param["Name"][0] # first param in list +phone = cgi.param["Number"][0] +picks = cgi.param["Choices"] # complete list + +print cgi.header( 'type' => 'text/plain', + 'expires' => Time.now + (3 * 24 * 60 * 60) ) + + +# @@PLEAC@@_19.3 +#!/usr/local/bin/ruby -w +# webwhoami - show web user's id +require 'etc' +print "Content-Type: text/plain\n\n" +print "Running as " + Etc.getpwuid.name + "\n" + +# % ruby -wc cgi-script # just check syntax + +# % ruby -w cgi-script # params from stdin +# (offline mode: enter name=value pairs on standard input) +# name=joe +# number=10 +# ^D + +# % ruby -w cgi-script name=joe number=10 # run with mock form input +# % ruby -d cgi-script name=joe number=10 # ditto, under the debugger + +# POST method script in csh +# % (setenv HTTP_METHOD POST; ruby -w cgi-script name=joe number=10) +# POST method script in sh +# % HTTP_METHOD=POST perl -w cgi-script name=joe number=10 + + +# @@PLEAC@@_19.4 +# ruby has several security levels, the level "1" is similar to perls taint mode. +# It can be switched on by providing the -T command line parameter +# or by setting $SAFE to 1. Setting $SAFE to 2,3 or 4 restricts possible +# harmful operations further. + +#!/usr/bin/ruby -T +$SAFE = 1 +File.open(ARGV[0], "w") +# ruby warns with: +# taint1.rb:2:in `initialize': Insecure operation - initialize (SecurityError) + +$SAFE = 1 +file = ARGV[0] +unless /^([\w.-]+)$/.match(file) + raise "filename #{file} has invalid characters" +end +file = $1 +# In ruby, even the back reference from a regular expression stays tainted. +# you need to explicitly untaint the variable: +file.untaint +File.open(file, "w") + +# Race condition exists like in perl: +unless File.exists(filename) # Wrong because of race condition + File.open(filename, "w") +end + + +# @@PLEAC@@_19.8 +url = "http://pleac.sourceforge.net/pleac_ruby/" +print "Location: #{url}\r\n\r\n" +exit + +#!/usr/bin/ruby +require 'cgi' + +cgi = CGI.new +oreo = CGI::Cookie.new('name' => 'filling', + 'value' => 'vanilla creme', + 'expires' => Time.now + (3 * 30 * 24 * 60 * 60), + 'domain' => '.pleac.sourceforge.net') + +whither = 'http://pleac.sourceforge.net/pleac_ruby/cgiprogramming.html' + +cgi.out('cookie' => oreo, + 'Location' => whither){""} + +#!/usr/bin/ruby +# os_snipe - redirect to a Jargon File entry about current OS +dir = 'http://www.elsewhere.org/jargon/html/entry' + +agent = ENV['HTTP_USER_AGENT'] + +page = case + when agent =~ /Mac/: 'Macintrash.html' + when agent =~ /Win(dows )?NT/: 'evil_and_rude.html' + when agent =~ /Win|MSIE|WebTV/: 'Microsloth_Windows.html' + when agent =~ /Linux/: 'Linux.html' + when agent =~ /HP-UX/: 'HP-SUX.html' + when agent =~ /SunOS/: 'ScumOS.html' + else 'Appendix_B.html' +end + +print "Location: #{dir}/#{page}\n\n" + +require 'cgi' +cgi = CGI.new +cgi.out('status' => '204 No response'){""} +# this produces: +# Status: 204 No response +# Content-Type: text/html +# Content-Length: 0 +# <blank line here> + + +# @@PLEAC@@_19.10 +preference_value = cgi.cookies["preference name"][0] + +packed_cookie = CGI::Cookie.new("name" => "preference name", + "value" => "whatever you'd like", + "expires" => Time.local(Time.now.year + 2, + Time.now.mon, Time.now.day, Time.now.hour, Time.now.min, Time.now.sec) ) + +cgi.header("cookie" => [packed_cookie]) + +#!/usr/local/bin/ruby -w +# ic_cookies - sample CGI script that uses a cookie +require 'cgi' + +cgi = CGI.new('html3') + +cookname = "favorite ice cream" +favorite = cgi.params["flavor"][0] +tasty = cgi.cookies[cookname][0] || 'mint' + +unless favorite + cgi.out { + cgi.html { + cgi.head { cgi.title { "Ice Cookies" } } + + cgi.body { + cgi.h1 { "Hello Ice Cream" } + + cgi.hr + + cgi.form { + cgi.p { "Please select a flavor: " + + cgi.text_field("flavor", tasty ) } + } + + cgi.hr + } + } + } +else + cookie = CGI::Cookie.new( "name" => cookname, + "value" => favorite, + "expires" => Time.local(Time.now.year + 2, +Time.now.mon, Time.now.day, Time.now.hour, Time.now.min, Time.now.sec) ) + cgi.out("cookie" => [cookie]) { + cgi.html { + cgi.head { cgi.title { "Ice Cookies" } } + + cgi.body { + cgi.h1 { "Hello Ice Cream" } + + cgi.p { "You chose as your favorite flavor `#{favorite}'." } + } + } + } +end + + +# @@PLEAC@@_20.9 +def templatefile(filename, fillings) + aFile = File.new(filename, "r") + text = aFile.read() + aFile.close() + pattern = Regexp.new('%%(.*?)%%') + text.gsub!(pattern) { + fillings[$1] || "" + } + text +end + +fields = { + 'username' => whats_his_name, + 'count' => login_count, + 'total' => minutes_used +} +puts templatefile('simple.template', fields) + +# @@INCOMPLETE@@ +# An example using databases is missing + + diff --git a/test/scanners/ruby/pleac.out.raydebug b/test/scanners/ruby/pleac.out.raydebug new file mode 100644 index 0000000..c6fcd8c --- /dev/null +++ b/test/scanners/ruby/pleac.out.raydebug @@ -0,0 +1,6368 @@ +comment(# -*- ruby -*-) + +comment(# Local variables:) +comment(# indent-tabs-mode: nil) +comment(# ruby-indent-level: 4) +comment(# End:) + +comment(# @@PLEAC@@_NAME) +comment(# @@SKIP@@ Ruby) + +comment(# @@PLEAC@@_WEB) +comment(# @@SKIP@@ http://www.ruby-lang.org) + + +comment(# @@PLEAC@@_1.0) +ident(string) operator(=) string<delimiter(')content(\\n)delimiter(')> comment(# two characters, \\ and an n) +ident(string) operator(=) string<delimiter(')content(Jon )char(\\')content(Maddog)char(\\')content( Orwant)delimiter(')> comment(# literal single quotes) + +ident(string) operator(=) string<delimiter(")char(\\n)delimiter(")> comment(# a "newline" character) +ident(string) operator(=) string<delimiter(")content(Jon )char(\\")content(Maddog)char(\\")content( Orwant)delimiter(")> comment(# literal double quotes) + +ident(string) operator(=) string<delimiter(%q/)content(Jon 'Maddog' Orwant)delimiter(/)> comment(# literal single quotes) + +ident(string) operator(=) string<delimiter(%q[)content(Jon 'Maddog' Orwant)delimiter(])> comment(# literal single quotes) +ident(string) operator(=) string<delimiter(%q{)content(Jon 'Maddog' Orwant)delimiter(})> comment(# literal single quotes) +ident(string) operator(=) string<delimiter(%q()content(Jon 'Maddog' Orwant)delimiter(\))> comment(# literal single quotes) +ident(string) operator(=) string<delimiter(%q<)content(Jon 'Maddog' Orwant)delimiter(>)> comment(# literal single quotes) + +ident(a) operator(=) string<delimiter(<<"EOF")>string<content( +This is a multiline here document +terminated by EOF on a line by itself)delimiter( +EOF)> + + +comment(# @@PLEAC@@_1.1) +ident(value) operator(=) ident(string)operator([)ident(offset)operator(,)ident(count)operator(]) +ident(value) operator(=) ident(string)operator([)ident(offset)operator(..)integer(-1)operator(]) + +ident(string)operator([)ident(offset)operator(,)ident(count)operator(]) operator(=) ident(newstring) +ident(string)operator([)ident(offset)operator(..)integer(-1)operator(]) operator(=) ident(newtail) + +comment(# in Ruby we can also specify intervals by their two offsets) +ident(value) operator(=) ident(string)operator([)ident(offset)operator(..)ident(offs2)operator(]) +ident(string)operator([)ident(offset)operator(..)ident(offs2)operator(]) operator(=) ident(newstring) + +ident(leading)operator(,) ident(s1)operator(,) ident(s2)operator(,) ident(trailing) operator(=) ident(data)operator(.)ident(unpack)operator(()string<delimiter(")content(A5 x3 A8 A8 A*)delimiter(")>operator(\)) + +ident(fivers) operator(=) ident(string)operator(.)ident(unpack)operator(()string<delimiter(")content(A5)delimiter(")> operator(*) operator(()ident(string)operator(.)ident(length)operator(/)integer(5)operator(\))operator(\)) + +ident(chars) operator(=) ident(string)operator(.)ident(unpack)operator(()string<delimiter(")content(A1)delimiter(")> operator(*) ident(string)operator(.)ident(length)operator(\)) + +ident(string) operator(=) string<delimiter(")content(This is what you have)delimiter(")> +comment(# +012345678901234567890 Indexing forwards (left to right\)) +comment(# 109876543210987654321- Indexing backwards (right to left\)) +comment(# note that 0 means 10 or 20, etc. above) + +ident(first) operator(=) ident(string)operator([)integer(0)operator(,) integer(1)operator(]) comment(# "T") +ident(start) operator(=) ident(string)operator([)integer(5)operator(,) integer(2)operator(]) comment(# "is") +ident(rest) operator(=) ident(string)operator([)integer(13)operator(..)integer(-1)operator(]) comment(# "you have") +ident(last) operator(=) ident(string)operator([)integer(-1)operator(,) integer(1)operator(]) comment(# "e") +ident(end_) operator(=) ident(string)operator([)integer(-4)operator(..)integer(-1)operator(]) comment(# "have") +ident(piece) operator(=) ident(string)operator([)integer(-8)operator(,) integer(3)operator(]) comment(# "you") + +ident(string)operator([)integer(5)operator(,) integer(2)operator(]) operator(=) string<delimiter(")content(wasn't)delimiter(")> comment(# change "is" to "wasn't") +ident(string)operator([)integer(-12)operator(..)integer(-1)operator(]) operator(=) string<delimiter(")content(ondrous)delimiter(")> comment(# "This wasn't wondrous") +ident(string)operator([)integer(0)operator(,) integer(1)operator(]) operator(=) string<delimiter(")delimiter(")> comment(# delete first character) +ident(string)operator([)integer(-10)operator(..)integer(-1)operator(]) operator(=) string<delimiter(")delimiter(")> comment(# delete last 10 characters) + +reserved(if) ident(string)operator([)integer(-10)operator(..)integer(-1)operator(]) operator(=)operator(~) regexp<delimiter(/)content(pattern)delimiter(/)> + ident(puts) string<delimiter(")content(Pattern matches in last 10 characters)delimiter(")> +reserved(end) + +ident(string)operator([)integer(0)operator(,) integer(5)operator(])operator(.)ident(gsub!)operator(()regexp<delimiter(/)content(is)delimiter(/)>operator(,) string<delimiter(')content(at)delimiter(')>operator(\)) + +ident(a) operator(=) string<delimiter(")content(make a hat)delimiter(")> +ident(a)operator([)integer(0)operator(,) integer(1)operator(])operator(,) ident(a)operator([)integer(-1)operator(,) integer(1)operator(]) operator(=) ident(a)operator([)integer(-1)operator(,) integer(1)operator(])operator(,) ident(a)operator([)integer(0)operator(,) integer(1)operator(]) + +ident(a) operator(=) string<delimiter(")content(To be or not to be)delimiter(")> +ident(b) operator(=) ident(a)operator(.)ident(unpack)operator(()string<delimiter(")content(x6 A6)delimiter(")>operator(\)) + +ident(b)operator(,) ident(c) operator(=) ident(a)operator(.)ident(unpack)operator(()string<delimiter(")content(x6 A2 X5 A2)delimiter(")>operator(\)) +ident(puts) string<delimiter(")inline<delimiter(#{)ident(b)delimiter(})>char(\\n)inline<delimiter(#{)ident(c)delimiter(})>char(\\n)delimiter(")> + +reserved(def) method(cut2fmt)operator(()operator(*)ident(args)operator(\)) + ident(template) operator(=) string<delimiter(')delimiter(')> + ident(lastpos) operator(=) integer(1) + reserved(for) ident(place) reserved(in) ident(args) + ident(template) operator(+=) string<delimiter(")content(A)delimiter(")> operator(+) operator(()ident(place) operator(-) ident(lastpos)operator(\))operator(.)ident(to_s) operator(+) string<delimiter(")content( )delimiter(")> + ident(lastpos) operator(=) ident(place) + reserved(end) + ident(template) operator(+=) string<delimiter(")content(A*)delimiter(")> + reserved(return) ident(template) +reserved(end) + +ident(fmt) operator(=) ident(cut2fmt)operator(()integer(8)operator(,) integer(14)operator(,) integer(20)operator(,) integer(26)operator(,) integer(30)operator(\)) + + +comment(# @@PLEAC@@_1.2) +comment(# careful! "b is true" doesn't mean "b != 0" (0 is true in Ruby\)) +comment(# thus no problem of "defined" later since only nil is false) +comment(# the following sets to `c' if `b' is nil or false) +ident(a) operator(=) ident(b) operator(||) ident(c) + +comment(# if you need Perl's behaviour (setting to `c' if `b' is 0\) the most) +comment(# effective way is to use Numeric#nonzero? (thanks to Dave Thomas!\)) +ident(a) operator(=) ident(b)operator(.)ident(nonzero?) operator(||) ident(c) + +comment(# you will still want to use defined? in order to test) +comment(# for scope existence of a given object) +ident(a) operator(=) reserved(defined?)operator(()ident(b)operator(\)) operator(?) ident(b) operator(:) ident(c) + +ident(dir) operator(=) pre_constant(ARGV)operator(.)ident(shift) operator(||) string<delimiter(")content(/tmp)delimiter(")> + + +comment(# @@PLEAC@@_1.3) +ident(v1)operator(,) ident(v2) operator(=) ident(v2)operator(,) ident(v1) + +ident(alpha)operator(,) ident(beta)operator(,) ident(production) operator(=) string<delimiter(%w()content(January March August)delimiter(\))> +ident(alpha)operator(,) ident(beta)operator(,) ident(production) operator(=) ident(beta)operator(,) ident(production)operator(,) ident(alpha) + + +comment(# @@PLEAC@@_1.4) +ident(num) operator(=) ident(char)operator([)integer(0)operator(]) +ident(char) operator(=) ident(num)operator(.)ident(chr) + +comment(# Ruby also supports having a char from character constant) +ident(num) operator(=) integer(?r) + +ident(char) operator(=) ident(sprintf)operator(()string<delimiter(")content(%c)delimiter(")>operator(,) ident(num)operator(\)) +ident(printf)operator(()string<delimiter(")content(Number %d is character %c)char(\\n)delimiter(")>operator(,) ident(num)operator(,) ident(num)operator(\)) + +ident(ascii) operator(=) ident(string)operator(.)ident(unpack)operator(()string<delimiter(")content(C*)delimiter(")>operator(\)) +ident(string) operator(=) ident(ascii)operator(.)ident(pack)operator(()string<delimiter(")content(C*)delimiter(")>operator(\)) + +ident(hal) operator(=) string<delimiter(")content(HAL)delimiter(")> +ident(ascii) operator(=) ident(hal)operator(.)ident(unpack)operator(()string<delimiter(")content(C*)delimiter(")>operator(\)) +comment(# We can't use Array#each since we can't mutate a Fixnum) +ident(ascii)operator(.)ident(collect!) operator({) operator(|)ident(i)operator(|) + ident(i) operator(+) integer(1) comment(# add one to each ASCII value) +operator(}) +ident(ibm) operator(=) ident(ascii)operator(.)ident(pack)operator(()string<delimiter(")content(C*)delimiter(")>operator(\)) +ident(puts) ident(ibm) + + +comment(# @@PLEAC@@_1.5) +ident(array) operator(=) ident(string)operator(.)ident(split)operator(()string<delimiter(')delimiter(')>operator(\)) + +ident(array) operator(=) ident(string)operator(.)ident(unpack)operator(()string<delimiter(")content(C*)delimiter(")>operator(\)) + +ident(string)operator(.)ident(scan)operator(()regexp<delimiter(/)content(.)delimiter(/)>operator(\)) operator({) operator(|)ident(b)operator(|) + comment(# do something with b) +operator(}) + +ident(string) operator(=) string<delimiter(")content(an apple a day)delimiter(")> +ident(print) string<delimiter(")content(unique chars are: )delimiter(")>operator(,) ident(string)operator(.)ident(split)operator(()string<delimiter(')delimiter(')>operator(\))operator(.)ident(uniq)operator(.)ident(sort)operator(,) string<delimiter(")char(\\n)delimiter(")> + +ident(sum) operator(=) integer(0) +reserved(for) ident(ascval) reserved(in) ident(string)operator(.)ident(unpack)operator(()string<delimiter(")content(C*)delimiter(")>operator(\)) comment(# or use Array#each for a pure OO style :\)) + ident(sum) operator(+=) ident(ascval) +reserved(end) +ident(puts) string<delimiter(")content(sum is )inline<delimiter(#{)ident(sum) operator(&) integer(0xffffffff)delimiter(})>delimiter(")> comment(# since Ruby will go Bignum if necessary) + +comment(# @@INCLUDE@@ include/ruby/slowcat.rb) + + +comment(# @@PLEAC@@_1.6) +ident(revbytes) operator(=) ident(string)operator(.)ident(reverse) + +ident(revwords) operator(=) ident(string)operator(.)ident(split)operator(()string<delimiter(")content( )delimiter(")>operator(\))operator(.)ident(reverse)operator(.)ident(join)operator(()string<delimiter(")content( )delimiter(")>operator(\)) + +ident(revwords) operator(=) ident(string)operator(.)ident(split)operator(()regexp<delimiter(/)content(()char(\\s)content(+\))delimiter(/)>operator(\))operator(.)ident(reverse)operator(.)ident(join) + +comment(# using the fact that IO is Enumerable, you can directly "select" it) +ident(long_palindromes) operator(=) constant(File)operator(.)ident(open)operator(()string<delimiter(")content(/usr/share/dict/words)delimiter(")>operator(\))operator(.) + ident(select) operator({) operator(|)ident(w)operator(|) ident(w)operator(.)ident(chomp!)operator(;) ident(w)operator(.)ident(reverse) operator(==) ident(w) operator(&&) ident(w)operator(.)ident(length) operator(>) integer(5) operator(}) + + +comment(# @@PLEAC@@_1.7) +reserved(while) ident(string)operator(.)ident(sub!)operator(()string<delimiter(")char(\\t)content(+)delimiter(")>operator(\)) operator({) string<delimiter(')content( )delimiter(')> operator(*) operator(()global_variable($&)operator(.)ident(length) operator(*) integer(8) operator(-) global_variable($`)operator(.)ident(length) operator(%) integer(8)operator(\)) operator(}) +reserved(end) + + +comment(# @@PLEAC@@_1.8) +string<delimiter(')content(You owe #{debt} to me)delimiter(')>operator(.)ident(gsub)operator(()regexp<delimiter(/)char(\\#)content({()char(\\w)content(+\)})delimiter(/)>operator(\)) operator({) ident(eval)operator(()global_variable($1)operator(\)) operator(}) + +ident(rows)operator(,) ident(cols) operator(=) integer(24)operator(,) integer(80) +ident(text) operator(=) string<delimiter(%q()content(I am #{rows} high and #{cols} long)delimiter(\))> +ident(text)operator(.)ident(gsub!)operator(()regexp<delimiter(/)char(\\#)content({()char(\\w)content(+\)})delimiter(/)>operator(\)) operator({) ident(eval)operator(()string<delimiter(")inline<delimiter(#{)global_variable($1)delimiter(})>delimiter(")>operator(\)) operator(}) +ident(puts) ident(text) + +string<delimiter(')content(I am 17 years old)delimiter(')>operator(.)ident(gsub)operator(()regexp<delimiter(/)char(\\d)content(+)delimiter(/)>operator(\)) operator({) integer(2) operator(*) global_variable($&)operator(.)ident(to_i) operator(}) + + +comment(# @@PLEAC@@_1.9) +ident(e) operator(=) string<delimiter(")content(bo peep)delimiter(")>operator(.)ident(upcase) +ident(e)operator(.)ident(downcase!) +ident(e)operator(.)ident(capitalize!) + +string<delimiter(")content(thIS is a loNG liNE)delimiter(")>operator(.)ident(gsub!)operator(()regexp<delimiter(/)char(\\w)content(+)delimiter(/)>operator(\)) operator({) global_variable($&)operator(.)ident(capitalize) operator(}) + + +comment(# @@PLEAC@@_1.10) +string<delimiter(")content(I have )inline<delimiter(#{)ident(n)integer(+1)delimiter(})>content( guanacos.)delimiter(")> +ident(print) string<delimiter(")content(I have )delimiter(")>operator(,) ident(n)integer(+1)operator(,) string<delimiter(")content( guanacos.)delimiter(")> + + +comment(# @@PLEAC@@_1.11) +ident(var) operator(=) string<delimiter(<<'EOF')>operator(.)ident(gsub)operator(()regexp<delimiter(/)content(^)char(\\s)content(+)delimiter(/)>operator(,) string<delimiter(')delimiter(')>operator(\))string<content( + your text + goes here)delimiter( +EOF)> + + +comment(# @@PLEAC@@_1.12) +ident(string) operator(=) string<delimiter(")content(Folding and splicing is the work of an editor,)char(\\n)delimiter(")>operator(+) + string<delimiter(")content(not a mere collection of silicon)char(\\n)delimiter(")>operator(+) + string<delimiter(")content(and)char(\\n)delimiter(")>operator(+) + string<delimiter(")content(mobile electrons!)delimiter(")> + +reserved(def) method(wrap)operator(()ident(str)operator(,) ident(max_size)operator(\)) + ident(all) operator(=) operator([)operator(]) + ident(line) operator(=) string<delimiter(')delimiter(')> + reserved(for) ident(l) reserved(in) ident(str)operator(.)ident(split) + reserved(if) operator(()ident(line)operator(+)ident(l)operator(\))operator(.)ident(length) operator(>)operator(=) ident(max_size) + ident(all)operator(.)ident(push)operator(()ident(line)operator(\)) + ident(line) operator(=) string<delimiter(')delimiter(')> + reserved(end) + ident(line) operator(+=) ident(line) operator(==) string<delimiter(')delimiter(')> operator(?) ident(l) operator(:) string<delimiter(')content( )delimiter(')> operator(+) ident(l) + reserved(end) + ident(all)operator(.)ident(push)operator(()ident(line)operator(\))operator(.)ident(join)operator(()string<delimiter(")char(\\n)delimiter(")>operator(\)) +reserved(end) + +ident(print) ident(wrap)operator(()ident(string)operator(,) integer(20)operator(\)) +comment(#=> Folding and ) +comment(#=> splicing is the ) +comment(#=> work of an editor, ) +comment(#=> not a mere ) +comment(#=> collection of ) +comment(#=> silicon and mobile ) +comment(#=> electrons!) + + +comment(# @@PLEAC@@_1.13) +ident(string) operator(=) string<delimiter(%q()content(Mom said, "Don't do that.")delimiter(\))> +ident(string)operator(.)ident(gsub)operator(()regexp<delimiter(/)content(['"])delimiter(/)>operator(\)) operator({) string<delimiter(')char(\\\\)delimiter(')>operator(+)global_variable($&) operator(}) +ident(string)operator(.)ident(gsub)operator(()regexp<delimiter(/)content(['"])delimiter(/)>operator(,) string<delimiter(')content(\\&)content(\\&)delimiter(')>operator(\)) +ident(string)operator(.)ident(gsub)operator(()regexp<delimiter(/)content([^A-Z])delimiter(/)>operator(\)) operator({) string<delimiter(')char(\\\\)delimiter(')>operator(+)global_variable($&) operator(}) +string<delimiter(")content(is a test!)delimiter(")>operator(.)ident(gsub)operator(()regexp<delimiter(/)char(\\W)delimiter(/)>operator(\)) operator({) string<delimiter(')char(\\\\)delimiter(')>operator(+)global_variable($&) operator(}) comment(# no function like quotemeta?) + + +comment(# @@PLEAC@@_1.14) +ident(string)operator(.)ident(strip!) + + +comment(# @@PLEAC@@_1.15) +reserved(def) method(parse_csv)operator(()ident(text)operator(\)) + ident(new) operator(=) ident(text)operator(.)ident(scan)operator(()regexp<delimiter(/)content("([^)char(\\")char(\\\\)content(]*(?:)char(\\\\)content(.[^)char(\\")char(\\\\)content(]*\)*\)",?|([^,]+\),?|,)delimiter(/)>operator(\)) + ident(new) operator(<<) pre_constant(nil) reserved(if) ident(text)operator([)integer(-1)operator(]) operator(==) integer(?,) + ident(new)operator(.)ident(flatten)operator(.)ident(compact) +reserved(end) + +ident(line) operator(=) string<delimiter(%q<)content(XYZZY,"","O'Reilly, Inc","Wall, Larry","a )content(\\")content(glug)content(\\")content( bit,",5,"Error, Core Dumped")delimiter(>)> +ident(fields) operator(=) ident(parse_csv)operator(()ident(line)operator(\)) +ident(fields)operator(.)ident(each_with_index) operator({) operator(|)ident(v)operator(,)ident(i)operator(|) + ident(print) string<delimiter(")inline<delimiter(#{)ident(i)delimiter(})>content( : )inline<delimiter(#{)ident(v)delimiter(})>char(\\n)delimiter(")>operator(;) +operator(}) + + +comment(# @@PLEAC@@_1.16) +comment(# Use the soundex.rb Library from Michael Neumann.) +comment(# http://www.s-direktnet.de/homepages/neumann/rb_prgs/Soundex.rb) +ident(require) string<delimiter(')content(Soundex)delimiter(')> + +ident(code) operator(=) constant(Text)operator(::)constant(Soundex)operator(.)ident(soundex)operator(()ident(string)operator(\)) +ident(codes) operator(=) constant(Text)operator(::)constant(Soundex)operator(.)ident(soundex)operator(()ident(array)operator(\)) + +comment(# substitution function for getpwent(\):) +comment(# returns an array of user entries,) +comment(# each entry contains the username and the full name) +reserved(def) method(login_names) + ident(result) operator(=) operator([)operator(]) + constant(File)operator(.)ident(open)operator(()string<delimiter(")content(/etc/passwd)delimiter(")>operator(\)) operator({) operator(|)ident(file)operator(|) + ident(file)operator(.)ident(each_line) operator({) operator(|)ident(line)operator(|) + reserved(next) reserved(if) ident(line)operator(.)ident(match)operator(()regexp<delimiter(/)content(^#)delimiter(/)>operator(\)) + ident(cols) operator(=) ident(line)operator(.)ident(split)operator(()string<delimiter(")content(:)delimiter(")>operator(\)) + ident(result)operator(.)ident(push)operator(()operator([)ident(cols)operator([)integer(0)operator(])operator(,) ident(cols)operator([)integer(4)operator(])operator(])operator(\)) + operator(}) + operator(}) + ident(result) +reserved(end) + +ident(puts) string<delimiter(")content(Lookup user: )delimiter(")> +ident(user) operator(=) constant(STDIN)operator(.)ident(gets) +ident(user)operator(.)ident(chomp!) +ident(exit) reserved(unless) ident(user) +ident(name_code) operator(=) constant(Text)operator(::)constant(Soundex)operator(.)ident(soundex)operator(()ident(user)operator(\)) + +ident(splitter) operator(=) constant(Regexp)operator(.)ident(new)operator(()string<delimiter(')content(()content(\\w)content(+\)[^,]*)content(\\b)content(()content(\\w)content(+\))delimiter(')>operator(\)) +reserved(for) ident(username)operator(,) ident(fullname) reserved(in) ident(login_names) reserved(do) + ident(firstname)operator(,) ident(lastname) operator(=) ident(splitter)operator(.)ident(match)operator(()ident(fullname)operator(\))operator([)integer(1)operator(,)integer(2)operator(]) + reserved(if) ident(name_code) operator(==) constant(Text)operator(::)constant(Soundex)operator(.)ident(soundex)operator(()ident(username)operator(\)) + operator(||) ident(name_code) operator(==) constant(Text)operator(::)constant(Soundex)operator(.)ident(soundex)operator(()ident(firstname)operator(\)) + operator(||) ident(name_code) operator(==) constant(Text)operator(::)constant(Soundex)operator(.)ident(soundex)operator(()ident(lastname)operator(\)) + reserved(then) + ident(puts) string<delimiter(")inline<delimiter(#{)ident(username)delimiter(})>content(: )inline<delimiter(#{)ident(firstname)delimiter(})>content( )inline<delimiter(#{)ident(lastname)delimiter(})>delimiter(")> + reserved(end) +reserved(end) + + +comment(# @@PLEAC@@_1.17) +comment(# @@INCLUDE@@ include/ruby/fixstyle.rb) + + +comment(# @@PLEAC@@_1.18) +comment(# @@INCLUDE@@ include/ruby/psgrep.rb) + + +comment(# @@PLEAC@@_2.1) +comment(# Matz tells that you can use Integer(\) for strict checked conversion.) +ident(Integer)operator(()string<delimiter(")content(abc)delimiter(")>operator(\)) +comment(#=> `Integer': invalid value for Integer: "abc" (ArgumentError\)) +ident(Integer)operator(()string<delimiter(")content(567)delimiter(")>operator(\)) +comment(#=> 567) + +comment(# You may use Float(\) for floating point stuff) +ident(Integer)operator(()string<delimiter(")content(56.7)delimiter(")>operator(\)) +comment(#=> `Integer': invalid value for Integer: "56.7" (ArgumentError\)) +ident(Float)operator(()string<delimiter(")content(56.7)delimiter(")>operator(\)) +comment(#=> 56.7) + +comment(# You may also use a regexp for that) +reserved(if) ident(string) operator(=)operator(~) regexp<delimiter(/)content(^[+-]?)char(\\d)content(+$)delimiter(/)> + ident(p) string<delimiter(')content(is an integer)delimiter(')> +reserved(else) + ident(p) string<delimiter(')content(is not)delimiter(')> +reserved(end) + +reserved(if) ident(string) operator(=)operator(~) regexp<delimiter(/)content(^-?(?:)char(\\d)content(+(?:)char(\\.)char(\\d)content(*\)?|)char(\\.)char(\\d)content(+\)$)delimiter(/)> + ident(p) string<delimiter(')content(is a decimal number)delimiter(')> +reserved(else) + ident(p) string<delimiter(')content(is not)delimiter(')> +reserved(end) + + +comment(# @@PLEAC@@_2.2) +comment(# equal(num1, num2, accuracy\) : returns true if num1 and num2 are) +comment(# equal to accuracy number of decimal places) +reserved(def) method(equal)operator(()ident(i)operator(,) ident(j)operator(,) ident(a)operator(\)) + ident(sprintf)operator(()string<delimiter(")content(%.)inline<delimiter(#{)ident(a)delimiter(})>content(g)delimiter(")>operator(,) ident(i)operator(\)) operator(==) ident(sprintf)operator(()string<delimiter(")content(%.)inline<delimiter(#{)ident(a)delimiter(})>content(g)delimiter(")>operator(,) ident(j)operator(\)) +reserved(end) + +ident(wage) operator(=) integer(536) comment(# $5.36/hour) +ident(week) operator(=) integer(40) operator(*) ident(wage) comment(# $214.40) +ident(printf)operator(()string<delimiter(")content(One week's wage is: )char(\\$)content(%.2f)char(\\n)delimiter(")>operator(,) ident(week)operator(/)float(100.0)operator(\)) + + +comment(# @@PLEAC@@_2.3) +ident(num)operator(.)ident(round) comment(# rounds to integer) + +ident(a) operator(=) float(0.255) +ident(b) operator(=) ident(sprintf)operator(()string<delimiter(")content(%.2f)delimiter(")>operator(,) ident(a)operator(\)) +ident(print) string<delimiter(")content(Unrounded: )inline<delimiter(#{)ident(a)delimiter(})>char(\\n)content(Rounded: )inline<delimiter(#{)ident(b)delimiter(})>char(\\n)delimiter(")> +ident(printf) string<delimiter(")content(Unrounded: )inline<delimiter(#{)ident(a)delimiter(})>char(\\n)content(Rounded: %.2f)char(\\n)delimiter(")>operator(,) ident(a) + +ident(print) string<delimiter(")content(number)char(\\t)content(int)char(\\t)content(floor)char(\\t)content(ceil)char(\\n)delimiter(")> +ident(a) operator(=) operator([) float(3.3) operator(,) float(3.5) operator(,) float(3.7)operator(,) float(-3.3) operator(]) +reserved(for) ident(n) reserved(in) ident(a) + ident(printf)operator(()string<delimiter(")content(% .1f)char(\\t)content(% .1f)char(\\t)content(% .1f)char(\\t)content(% .1f)char(\\n)delimiter(")>operator(,) comment(# at least I don't fake my output :\)) + ident(n)operator(,) ident(n)operator(.)ident(to_i)operator(,) ident(n)operator(.)ident(floor)operator(,) ident(n)operator(.)ident(ceil)operator(\)) +reserved(end) + + +comment(# @@PLEAC@@_2.4) +reserved(def) method(dec2bin)operator(()ident(n)operator(\)) + operator([)ident(n)operator(])operator(.)ident(pack)operator(()string<delimiter(")content(N)delimiter(")>operator(\))operator(.)ident(unpack)operator(()string<delimiter(")content(B32)delimiter(")>operator(\))operator([)integer(0)operator(])operator(.)ident(sub)operator(()regexp<delimiter(/)content(^0+(?=)char(\\d)content(\))delimiter(/)>operator(,) string<delimiter(')delimiter(')>operator(\)) +reserved(end) + +reserved(def) method(bin2dec)operator(()ident(n)operator(\)) + operator([)operator(()string<delimiter(")content(0)delimiter(")>operator(*)integer(32)operator(+)ident(n)operator(.)ident(to_s)operator(\))operator([)integer(-32)operator(..)integer(-1)operator(])operator(])operator(.)ident(pack)operator(()string<delimiter(")content(B32)delimiter(")>operator(\))operator(.)ident(unpack)operator(()string<delimiter(")content(N)delimiter(")>operator(\))operator([)integer(0)operator(]) +reserved(end) + + +comment(# @@PLEAC@@_2.5) +reserved(for) ident(i) reserved(in) ident(x) operator(..) ident(y) + comment(# i is set to every integer from x to y, inclusive) +reserved(end) + +ident(x)operator(.)ident(step)operator(()ident(y)operator(,)integer(7)operator(\)) operator({) operator(|)ident(i)operator(|) + comment(# i is set to every integer from x to y, stepsize = 7) +operator(}) + +ident(print) string<delimiter(")content(Infancy is: )delimiter(")> +operator(()integer(0)operator(..)integer(2)operator(\))operator(.)ident(each) operator({) operator(|)ident(i)operator(|) + ident(print) ident(i)operator(,) string<delimiter(")content( )delimiter(")> +operator(}) +ident(print) string<delimiter(")char(\\n)delimiter(")> + + +comment(# @@PLEAC@@_2.6) +comment(# We can add conversion methods to the Integer class,) +comment(# this makes a roman number just a representation for normal numbers.) +reserved(class) class(Integer) + + class_variable(@@romanlist) operator(=) operator([)operator([)string<delimiter(")content(M)delimiter(")>operator(,) integer(1000)operator(])operator(,) + operator([)string<delimiter(")content(CM)delimiter(")>operator(,) integer(900)operator(])operator(,) + operator([)string<delimiter(")content(D)delimiter(")>operator(,) integer(500)operator(])operator(,) + operator([)string<delimiter(")content(CD)delimiter(")>operator(,) integer(400)operator(])operator(,) + operator([)string<delimiter(")content(C)delimiter(")>operator(,) integer(100)operator(])operator(,) + operator([)string<delimiter(")content(XC)delimiter(")>operator(,) integer(90)operator(])operator(,) + operator([)string<delimiter(")content(L)delimiter(")>operator(,) integer(50)operator(])operator(,) + operator([)string<delimiter(")content(XL)delimiter(")>operator(,) integer(40)operator(])operator(,) + operator([)string<delimiter(")content(X)delimiter(")>operator(,) integer(10)operator(])operator(,) + operator([)string<delimiter(")content(IX)delimiter(")>operator(,) integer(9)operator(])operator(,) + operator([)string<delimiter(")content(V)delimiter(")>operator(,) integer(5)operator(])operator(,) + operator([)string<delimiter(")content(IV)delimiter(")>operator(,) integer(4)operator(])operator(,) + operator([)string<delimiter(")content(I)delimiter(")>operator(,) integer(1)operator(])operator(]) + + reserved(def) method(to_roman) + ident(remains) operator(=) pre_constant(self) + ident(roman) operator(=) string<delimiter(")delimiter(")> + reserved(for) ident(sym)operator(,) ident(num) reserved(in) class_variable(@@romanlist) + reserved(while) ident(remains) operator(>)operator(=) ident(num) + ident(remains) operator(-=) ident(num) + ident(roman) operator(<<) ident(sym) + reserved(end) + reserved(end) + ident(roman) + reserved(end) + + reserved(def) constant(Integer)operator(.)ident(from_roman)operator(()ident(roman)operator(\)) + ident(ustr) operator(=) ident(roman)operator(.)ident(upcase) + ident(sum) operator(=) integer(0) + reserved(for) ident(entry) reserved(in) class_variable(@@romanlist) + ident(sym)operator(,) ident(num) operator(=) ident(entry)operator([)integer(0)operator(])operator(,) ident(entry)operator([)integer(1)operator(]) + reserved(while) ident(sym) operator(==) ident(ustr)operator([)integer(0)operator(,) ident(sym)operator(.)ident(length)operator(]) + ident(sum) operator(+=) ident(num) + ident(ustr)operator(.)ident(slice!)operator(()integer(0)operator(,) ident(sym)operator(.)ident(length)operator(\)) + reserved(end) + reserved(end) + ident(sum) + reserved(end) + +reserved(end) + + +ident(roman_fifteen) operator(=) integer(15)operator(.)ident(to_roman) +ident(puts) string<delimiter(")content(Roman for fifteen is )inline<delimiter(#{)ident(roman_fifteen)delimiter(})>delimiter(")> +ident(i) operator(=) constant(Integer)operator(.)ident(from_roman)operator(()ident(roman_fifteen)operator(\)) +ident(puts) string<delimiter(")content(Converted back, )inline<delimiter(#{)ident(roman_fifteen)delimiter(})>content( is )inline<delimiter(#{)ident(i)delimiter(})>delimiter(")> + +comment(# check) +reserved(for) ident(i) reserved(in) operator(()integer(1)operator(..)integer(3900)operator(\)) + ident(r) operator(=) ident(i)operator(.)ident(to_roman) + ident(j) operator(=) constant(Integer)operator(.)ident(from_roman)operator(()ident(r)operator(\)) + reserved(if) ident(i) operator(!=) ident(j) + ident(puts) string<delimiter(")content(error: )inline<delimiter(#{)ident(i)delimiter(})>content( : )inline<delimiter(#{)ident(r)delimiter(})>content( - )inline<delimiter(#{)ident(j)delimiter(})>delimiter(")> + reserved(end) +reserved(end) + + +comment(# @@PLEAC@@_2.7) +ident(random) operator(=) ident(rand)operator(()ident(y)operator(-)ident(x)integer(+1)operator(\))operator(+)ident(x) + +ident(chars) operator(=) operator([)string<delimiter(")content(A)delimiter(")>operator(..)string<delimiter(")content(Z)delimiter(")>operator(,)string<delimiter(")content(a)delimiter(")>operator(..)string<delimiter(")content(z)delimiter(")>operator(,)string<delimiter(")content(0)delimiter(")>operator(..)string<delimiter(")content(9)delimiter(")>operator(])operator(.)ident(collect) operator({) operator(|)ident(r)operator(|) ident(r)operator(.)ident(to_a) operator(})operator(.)ident(join) operator(+) string<delimiter(%q()content(!@$%^&*)delimiter(\))> +ident(password) operator(=) operator(()integer(1)operator(..)integer(8)operator(\))operator(.)ident(collect) operator({) ident(chars)operator([)ident(rand)operator(()ident(chars)operator(.)ident(size)operator(\))operator(]) operator(})operator(.)ident(pack)operator(()string<delimiter(")content(C*)delimiter(")>operator(\)) + + +comment(# @@PLEAC@@_2.8) +ident(srand) comment(# uses a combination of the time, the process id, and a sequence number) +ident(srand)operator(()ident(val)operator(\)) comment(# for repeatable behaviour) + + +comment(# @@PLEAC@@_2.9) +comment(# from the randomr lib: ) +comment(# http://raa.ruby-lang.org/project/randomr/) +operator(-)operator(-)operator(-)operator(-)operator(>) ident(http)symbol(:/)operator(/)ident(raa)operator(.)ident(ruby)operator(-)ident(lang)operator(.)ident(org)operator(/)ident(project)operator(/)ident(randomr)operator(/) + +ident(require) string<delimiter(')content(random/mersenne_twister)delimiter(')> +ident(mers) operator(=) constant(Random)operator(::)constant(MersenneTwister)operator(.)ident(new) integer(123456789) +ident(puts) ident(mers)operator(.)ident(rand)operator(()integer(0)operator(\)) comment(# 0.550321932544541) +ident(puts) ident(mers)operator(.)ident(rand)operator(()integer(10)operator(\)) comment(# 2) + +comment(# using online sources of random data via the realrand package:) +comment(# http://raa.ruby-lang.org/project/realrand/) +comment(# **Note**) +comment(# The following online services are used in this package:) +comment(# http://www.random.org - source: atmospheric noise ) +comment(# http://www.fourmilab.ch/hotbits - source: radioactive decay timings) +comment(# http://random.hd.org - source: entropy from local and network noise) +comment(# Please visit the sites and respect the rules of each service.) + +ident(require) string<delimiter(')content(random/online)delimiter(')> + +ident(generator1) operator(=) constant(Random)operator(::)constant(RandomOrg)operator(.)ident(new) +ident(puts) ident(generator1)operator(.)ident(randbyte)operator(()integer(5)operator(\))operator(.)ident(join)operator(()string<delimiter(")content(,)delimiter(")>operator(\)) +ident(puts) ident(generator1)operator(.)ident(randnum)operator(()integer(10)operator(,) integer(1)operator(,) integer(6)operator(\))operator(.)ident(join)operator(()string<delimiter(")content(,)delimiter(")>operator(\)) comment(# Roll dice 10 times.) + +ident(generator2) operator(=) constant(Random)operator(::)constant(FourmiLab)operator(.)ident(new) +ident(puts) ident(generator2)operator(.)ident(randbyte)operator(()integer(5)operator(\))operator(.)ident(join)operator(()string<delimiter(")content(,)delimiter(")>operator(\)) +comment(# randnum is not supported.) + +ident(generator3) operator(=) constant(Random)operator(::)constant(EntropyPool)operator(.)ident(new) +ident(puts) ident(generator3)operator(.)ident(randbyte)operator(()integer(5)operator(\))operator(.)ident(join)operator(()string<delimiter(")content(,)delimiter(")>operator(\)) +comment(# randnum is not supported.) + + +comment(# @@PLEAC@@_2.10) +reserved(def) method(gaussian_rand) + reserved(begin) + ident(u1) operator(=) integer(2) operator(*) ident(rand)operator(()operator(\)) operator(-) integer(1) + ident(u2) operator(=) integer(2) operator(*) ident(rand)operator(()operator(\)) operator(-) integer(1) + ident(w) operator(=) ident(u1)operator(*)ident(u1) operator(+) ident(u2)operator(*)ident(u2) + reserved(end) reserved(while) operator(()ident(w) operator(>)operator(=) integer(1)operator(\)) + ident(w) operator(=) constant(Math)operator(.)ident(sqrt)operator(()operator(()integer(-2)operator(*)constant(Math)operator(.)ident(log)operator(()ident(w)operator(\))operator(\))operator(/)ident(w)operator(\)) + operator([) ident(u2)operator(*)ident(w)operator(,) ident(u1)operator(*)ident(w) operator(]) +reserved(end) + +ident(mean) operator(=) integer(25) +ident(sdev) operator(=) integer(2) +ident(salary) operator(=) ident(gaussian_rand)operator([)integer(0)operator(]) operator(*) ident(sdev) operator(+) ident(mean) +ident(printf)operator(()string<delimiter(")content(You have been hired at )char(\\$)content(%.2f)char(\\n)delimiter(")>operator(,) ident(salary)operator(\)) + + +comment(# @@PLEAC@@_2.11) +reserved(def) method(deg2rad)operator(()ident(d)operator(\)) + operator(()ident(d)operator(/)float(180.0)operator(\))operator(*)constant(Math)operator(::)constant(PI) +reserved(end) + +reserved(def) method(rad2deg)operator(()ident(r)operator(\)) + operator(()ident(r)operator(/)constant(Math)operator(::)constant(PI)operator(\))operator(*)integer(180) +reserved(end) + + +comment(# @@PLEAC@@_2.12) +ident(sin_val) operator(=) constant(Math)operator(.)ident(sin)operator(()ident(angle)operator(\)) +ident(cos_val) operator(=) constant(Math)operator(.)ident(cos)operator(()ident(angle)operator(\)) +ident(tan_val) operator(=) constant(Math)operator(.)ident(tan)operator(()ident(angle)operator(\)) + +comment(# AFAIK Ruby's Math module doesn't provide acos/asin) +comment(# While we're at it, let's also define missing hyperbolic functions) +reserved(module) class(Math) + reserved(def) constant(Math)operator(.)ident(asin)operator(()ident(x)operator(\)) + ident(atan2)operator(()ident(x)operator(,) ident(sqrt)operator(()integer(1) operator(-) ident(x)operator(**)integer(2)operator(\))operator(\)) + reserved(end) + reserved(def) constant(Math)operator(.)ident(acos)operator(()ident(x)operator(\)) + ident(atan2)operator(()ident(sqrt)operator(()integer(1) operator(-) ident(x)operator(**)integer(2)operator(\))operator(,) ident(x)operator(\)) + reserved(end) + reserved(def) constant(Math)operator(.)ident(atan)operator(()ident(x)operator(\)) + ident(atan2)operator(()ident(x)operator(,) integer(1)operator(\)) + reserved(end) + reserved(def) constant(Math)operator(.)ident(sinh)operator(()ident(x)operator(\)) + operator(()ident(exp)operator(()ident(x)operator(\)) operator(-) ident(exp)operator(()operator(-)ident(x)operator(\))operator(\)) operator(/) integer(2) + reserved(end) + reserved(def) constant(Math)operator(.)ident(cosh)operator(()ident(x)operator(\)) + operator(()ident(exp)operator(()ident(x)operator(\)) operator(+) ident(exp)operator(()operator(-)ident(x)operator(\))operator(\)) operator(/) integer(2) + reserved(end) + reserved(def) constant(Math)operator(.)ident(tanh)operator(()ident(x)operator(\)) + ident(sinh)operator(()ident(x)operator(\)) operator(/) ident(cosh)operator(()ident(x)operator(\)) + reserved(end) +reserved(end) + +comment(# The support for Complex numbers is not built-in) +ident(y) operator(=) constant(Math)operator(.)ident(acos)operator(()float(3.7)operator(\)) +comment(#=> in `sqrt': square root for negative number (ArgumentError\)) + +comment(# There is an implementation of Complex numbers in 'complex.rb' in current) +comment(# Ruby distro, but it doesn't support atan2 with complex args, so it doesn't) +comment(# solve this problem.) + + +comment(# @@PLEAC@@_2.13) +ident(log_e) operator(=) constant(Math)operator(.)ident(log)operator(()ident(val)operator(\)) +ident(log_10) operator(=) constant(Math)operator(.)ident(log10)operator(()ident(val)operator(\)) + +reserved(def) method(log_base)operator(()ident(base)operator(,) ident(val)operator(\)) + constant(Math)operator(.)ident(log)operator(()ident(val)operator(\))operator(/)constant(Math)operator(.)ident(log)operator(()ident(base)operator(\)) +reserved(end) + +ident(answer) operator(=) ident(log_base)operator(()integer(10)operator(,) integer(10_000)operator(\)) +ident(puts) string<delimiter(")content(log10(10,000\) = )inline<delimiter(#{)ident(answer)delimiter(})>delimiter(")> + + +comment(# @@PLEAC@@_2.14) +ident(require) string<delimiter(')content(matrix.rb)delimiter(')> + +ident(a) operator(=) constant(Matrix)operator([)operator([)integer(3)operator(,) integer(2)operator(,) integer(3)operator(])operator(,) operator([)integer(5)operator(,) integer(9)operator(,) integer(8)operator(])operator(]) +ident(b) operator(=) constant(Matrix)operator([)operator([)integer(4)operator(,) integer(7)operator(])operator(,) operator([)integer(9)operator(,) integer(3)operator(])operator(,) operator([)integer(8)operator(,) integer(1)operator(])operator(]) +ident(c) operator(=) ident(a) operator(*) ident(b) + +ident(a)operator(.)ident(row_size) +ident(a)operator(.)ident(column_size) + +ident(c)operator(.)ident(det) +ident(a)operator(.)ident(transpose) + + +comment(# @@PLEAC@@_2.15) +ident(require) string<delimiter(')content(complex.rb)delimiter(')> +ident(require) string<delimiter(')content(rational.rb)delimiter(')> + +ident(a) operator(=) ident(Complex)operator(()integer(3)operator(,) integer(5)operator(\)) comment(# 3 + 5i) +ident(b) operator(=) ident(Complex)operator(()integer(2)operator(,) integer(-2)operator(\)) comment(# 2 - 2i) +ident(puts) string<delimiter(")content(c = )inline<delimiter(#{)ident(a)operator(*)ident(b)delimiter(})>delimiter(")> + +ident(c) operator(=) ident(a) operator(*) ident(b) +ident(d) operator(=) integer(3) operator(+) integer(4)operator(*)constant(Complex)operator(::)constant(I) + +ident(printf) string<delimiter(")content(sqrt()inline<delimiter(#{)ident(d)delimiter(})>content(\) = %s)char(\\n)delimiter(")>operator(,) constant(Math)operator(.)ident(sqrt)operator(()ident(d)operator(\)) + + +comment(# @@PLEAC@@_2.16) +ident(number) operator(=) ident(hexadecimal)operator(.)ident(hex) +ident(number) operator(=) ident(octal)operator(.)ident(oct) + +ident(print) string<delimiter(")content(Gimme a number in decimal, octal, or hex: )delimiter(")> +ident(num) operator(=) ident(gets)operator(.)ident(chomp) +ident(exit) reserved(unless) reserved(defined?)operator(()ident(num)operator(\)) +ident(num) operator(=) ident(num)operator(.)ident(oct) reserved(if) ident(num) operator(=)operator(~) regexp<delimiter(/)content(^0)delimiter(/)> comment(# does both oct and hex ) +ident(printf) string<delimiter(")content(%d %x %o)char(\\n)delimiter(")>operator(,) ident(num)operator(,) ident(num)operator(,) ident(num) + +ident(print) string<delimiter(")content(Enter file permission in octal: )delimiter(")> +ident(permissions) operator(=) ident(gets)operator(.)ident(chomp) +ident(raise) string<delimiter(")content(Exiting ...)char(\\n)delimiter(")> reserved(unless) reserved(defined?)operator(()ident(permissions)operator(\)) +ident(puts) string<delimiter(")content(The decimal value is )inline<delimiter(#{)ident(permissions)operator(.)ident(oct)delimiter(})>delimiter(")> + + +comment(# @@PLEAC@@_2.17) +reserved(def) method(commify)operator(()ident(n)operator(\)) + ident(n)operator(.)ident(to_s) operator(=)operator(~) regexp<delimiter(/)content(([^)char(\\.)content(]*\)()char(\\.)content(.*\)?)delimiter(/)> + ident(int)operator(,) ident(dec) operator(=) global_variable($1)operator(.)ident(reverse)operator(,) global_variable($2) operator(?) global_variable($2) operator(:) string<delimiter(")delimiter(")> + reserved(while) ident(int)operator(.)ident(gsub!)operator(()regexp<delimiter(/)content((,|)char(\\.)content(|^\)()char(\\d)content({3}\)()char(\\d)content(\))delimiter(/)>operator(,) string<delimiter(')content(\\1)content(\\2)content(,)content(\\3)delimiter(')>operator(\)) + reserved(end) + ident(int)operator(.)ident(reverse) operator(+) ident(dec) +reserved(end) + + +comment(# @@PLEAC@@_2.18) +ident(printf) string<delimiter(")content(It took %d hour%s)char(\\n)delimiter(")>operator(,) ident(time)operator(,) ident(time) operator(==) integer(1) operator(?) string<delimiter(")delimiter(")> operator(:) string<delimiter(")content(s)delimiter(")> + +comment(# dunno if an equivalent to Lingua::EN::Inflect exists...) + + +comment(# @@PLEAC@@_2.19) +comment(#-----------------------------) +comment(#!/usr/bin/ruby) +comment(# bigfact - calculating prime factors) +reserved(def) method(factorize)operator(()ident(orig)operator(\)) + ident(factors) operator(=) operator({)operator(}) + ident(factors)operator(.)ident(default) operator(=) integer(0) comment(# return 0 instead nil if key not found in hash) + ident(n) operator(=) ident(orig) + ident(i) operator(=) integer(2) + ident(sqi) operator(=) integer(4) comment(# square of i) + reserved(while) ident(sqi) operator(<=) ident(n) reserved(do) + reserved(while) ident(n)operator(.)ident(modulo)operator(()ident(i)operator(\)) operator(==) integer(0) reserved(do) + ident(n) regexp<delimiter(/)content(= i + factors[i] += 1 + # puts "Found factor )inline<delimiter(#{)ident(i)delimiter(})>content(" + end + # we take advantage of the fact that (i +1\)**2 = i**2 + 2*i +1 + sqi += 2 * i + 1 + i += 1 + end + + if (n != 1\) && (n != orig\) + factors[n] += 1 + end + factors +end + +def printfactorhash(orig, factorcount\) + print format("%-10d ", orig\) + if factorcount.length == 0 + print "PRIME" + else + # sorts after number, because the hash keys are numbers + factorcount.sort.each { |factor,exponent| + print factor + if exponent > 1 + print "**", exponent + end + print " " + } + end + puts +end + +for arg in ARGV + n = arg.to_i + mfactors = factorize(n\) + printfactorhash(n, mfactors\) +end +#----------------------------- + + +# @@PLEAC@@_3.0 +puts Time.now + +print "Today is day ", Time.now.yday, " of the current year.)char(\\n)content(" +print "Today is day ", Time.now.day, " of the current month.)char(\\n)content(" + + +# @@PLEAC@@_3.1 +day, month, year = Time.now.day, Time.now.month, Time.now.year +# or +day, month, year = Time.now.to_a[3..5] + +tl = Time.now.localtime +printf("The current date is %04d %02d %02d)char(\\n)content(", tl.year, tl.month, tl.day\) + +Time.now.localtime.strftime("%Y-%m-%d"\) + + +# @@PLEAC@@_3.2 +Time.local(year, month, day, hour, minute, second\).tv_sec +Time.gm(year, month, day, hour, minute, second\).tv_sec + + +# @@PLEAC@@_3.3 +sec, min, hour, day, month, year, wday, yday, isdst, zone = Time.at(epoch_secs\).to_a + + +# @@PLEAC@@_3.4 +when_ = now + difference # now -> Time ; difference -> Numeric (delta in seconds\) +then_ = now - difference + + +# @@PLEAC@@_3.5 +bree = 361535725 +nat = 96201950 + +difference = bree - nat +puts "There were )inline<delimiter(#{)ident(difference)delimiter(})>content( seconds between Nat and Bree" + +seconds = difference % 60 +difference = (difference - seconds\) )delimiter(/)> integer(60) +ident(minutes) operator(=) ident(difference) operator(%) integer(60) +ident(difference) operator(=) operator(()ident(difference) operator(-) ident(minutes)operator(\)) operator(/) integer(60) +ident(hours) operator(=) ident(difference) operator(%) integer(24) +ident(difference) operator(=) operator(()ident(difference) operator(-) ident(hours)operator(\)) operator(/) integer(24) +ident(days) operator(=) ident(difference) operator(%) integer(7) +ident(weeks) operator(=) operator(()ident(difference) operator(-) ident(days)operator(\)) operator(/) integer(7) + +ident(puts) string<delimiter(")content(()inline<delimiter(#{)ident(weeks)delimiter(})>content( weeks, )inline<delimiter(#{)ident(days)delimiter(})>content( days, )inline<delimiter(#{)ident(hours)delimiter(})>content(:)inline<delimiter(#{)ident(minutes)delimiter(})>content(:)inline<delimiter(#{)ident(seconds)delimiter(})>content(\))delimiter(")> + + +comment(# @@PLEAC@@_3.6) +ident(monthday)operator(,) ident(weekday)operator(,) ident(yearday) operator(=) ident(date)operator(.)ident(mday)operator(,) ident(date)operator(.)ident(wday)operator(,) ident(date)operator(.)ident(yday) + +comment(# AFAIK the week number is not just a division since week boundaries are on sundays) +ident(weeknum) operator(=) ident(d)operator(.)ident(strftime)operator(()string<delimiter(")content(%U)delimiter(")>operator(\))operator(.)ident(to_i) operator(+) integer(1) + +ident(year) operator(=) integer(1981) +ident(month) operator(=) string<delimiter(")content(jun)delimiter(")> comment(# or `6' if you want to emulate a broken language) +ident(day) operator(=) integer(16) +ident(t) operator(=) constant(Time)operator(.)ident(mktime)operator(()ident(year)operator(,) ident(month)operator(,) ident(day)operator(\)) +ident(print) string<delimiter(")inline<delimiter(#{)ident(month)delimiter(})>content(/)inline<delimiter(#{)ident(day)delimiter(})>content(/)inline<delimiter(#{)ident(year)delimiter(})>content( was a )delimiter(")>operator(,) ident(t)operator(.)ident(strftime)operator(()string<delimiter(")content(%A)delimiter(")>operator(\))operator(,) string<delimiter(")char(\\n)delimiter(")> + + +comment(# @@PLEAC@@_3.7) +ident(yyyy)operator(,) ident(mm)operator(,) ident(dd) operator(=) global_variable($1)operator(,) global_variable($2)operator(,) global_variable($3) reserved(if) string<delimiter(")content(1998-06-25)delimiter(")> operator(=)operator(~) regexp<delimiter(/)content(()char(\\d)content(+\)-()char(\\d)content(+\)-()char(\\d)content(+\))delimiter(/)> + +ident(epoch_seconds) operator(=) constant(Time)operator(.)ident(mktime)operator(()ident(yyyy)operator(,) ident(mm)operator(,) ident(dd)operator(\))operator(.)ident(tv_sec) + +comment(# dunno an equivalent to Date::Manip#ParseDate) + + +comment(# @@PLEAC@@_3.8) +ident(string) operator(=) constant(Time)operator(.)ident(at)operator(()ident(epoch_secs)operator(\)) +constant(Time)operator(.)ident(at)operator(()integer(1234567890)operator(\))operator(.)ident(gmtime) comment(# gives: Fri Feb 13 23:31:30 UTC 2009) + +ident(time) operator(=) constant(Time)operator(.)ident(mktime)operator(()integer(1973)operator(,) string<delimiter(")content(jan)delimiter(")>operator(,) integer(18)operator(,) integer(3)operator(,) integer(45)operator(,) integer(50)operator(\)) +ident(print) string<delimiter(")content(In localtime it gives: )delimiter(")>operator(,) ident(time)operator(.)ident(localtime)operator(,) string<delimiter(")char(\\n)delimiter(")> + + +comment(# @@PLEAC@@_3.9) +comment(# Ruby provides micro-seconds in Time object) +constant(Time)operator(.)ident(now)operator(.)ident(usec) + +comment(# Ruby gives the seconds in floating format when substracting two Time objects) +ident(before) operator(=) constant(Time)operator(.)ident(now) +ident(line) operator(=) ident(gets) +ident(elapsed) operator(=) constant(Time)operator(.)ident(now) operator(-) ident(before) +ident(puts) string<delimiter(")content(You took )inline<delimiter(#{)ident(elapsed)delimiter(})>content( seconds.)delimiter(")> + +comment(# On my Celeron-400 with Linux-2.2.19-14mdk, average for three execs are:) +comment(# This Ruby version: average 0.00321 sec) +comment(# Cookbook's Perl version: average 0.00981 sec) +ident(size) operator(=) integer(500) +ident(number_of_times) operator(=) integer(100) +ident(total_time) operator(=) integer(0) +ident(number_of_times)operator(.)ident(times) operator({) + comment(# populate array) + ident(array) operator(=) operator([)operator(]) + ident(size)operator(.)ident(times) operator({) ident(array) operator(<<) ident(rand) operator(}) + comment(# sort it) + ident(begin_) operator(=) constant(Time)operator(.)ident(now) + ident(array)operator(.)ident(sort!) + ident(time) operator(=) constant(Time)operator(.)ident(now) operator(-) ident(begin_) + ident(total_time) operator(+=) ident(time) +operator(}) +ident(printf) string<delimiter(")content(On average, sorting %d random numbers takes %.5f seconds)char(\\n)delimiter(")>operator(,) + ident(size)operator(,) operator(()ident(total_time)operator(/)ident(Float)operator(()ident(number_of_times)operator(\))operator(\)) + + +comment(# @@PLEAC@@_3.10) +ident(sleep)operator(()float(0.005)operator(\)) comment(# Ruby is definitely not as broken as Perl :\)) +comment(# (may be interrupted by sending the process a SIGALRM\)) + + +comment(# @@PLEAC@@_3.11) +comment(#!/usr/bin/ruby -w) +comment(# hopdelta - feed mail header, produce lines) +comment(# showing delay at each hop.) +ident(require) string<delimiter(')content(time)delimiter(')> +reserved(class) class(MailHopDelta) + + reserved(def) method(initialize)operator(()ident(mail)operator(\)) + instance_variable(@head) operator(=) ident(mail)operator(.)ident(gsub)operator(()regexp<delimiter(/)char(\\n)char(\\s)content(+)delimiter(/)>operator(,)string<delimiter(')content( )delimiter(')>operator(\)) + instance_variable(@topline) operator(=) string<delimiter(%w-)content(Sender Recipient Time Delta)delimiter(-)> + instance_variable(@start_from) operator(=) ident(mail)operator(.)ident(match)operator(()regexp<delimiter(/)content(^From.*)char(\\@)content(([^)char(\\s)content(>]*\))delimiter(/)>operator(\))operator([)integer(1)operator(]) + instance_variable(@date) operator(=) constant(Time)operator(.)ident(parse)operator(()ident(mail)operator(.)ident(match)operator(()regexp<delimiter(/)content(^Date:)char(\\s)content(+(.*\))delimiter(/)>operator(\))operator([)integer(1)operator(])operator(\)) + reserved(end) + + reserved(def) method(out)operator(()ident(line)operator(\)) + string<delimiter(")content(%-20.20s %-20.20s %-20.20s %s)delimiter(")> operator(%) ident(line) + reserved(end) + + reserved(def) method(hop_date)operator(()ident(day)operator(\)) + ident(day)operator(.)ident(strftime)operator(()string<delimiter(")content(%I:%M:%S %Y/%m/%d)delimiter(")>operator(\)) + reserved(end) + + reserved(def) method(puts_hops) + ident(puts) ident(out)operator(()instance_variable(@topline)operator(\)) + ident(puts) ident(out)operator(()operator([)string<delimiter(')content(Start)delimiter(')>operator(,) instance_variable(@start_from)operator(,) ident(hop_date)operator(()instance_variable(@date)operator(\))operator(,)string<delimiter(')delimiter(')>operator(])operator(\)) + instance_variable(@head)operator(.)ident(split)operator(()regexp<delimiter(/)char(\\n)delimiter(/)>operator(\))operator(.)ident(reverse)operator(.)ident(grep)operator(()regexp<delimiter(/)content(^Received:)delimiter(/)>operator(\))operator(.)ident(each) reserved(do) operator(|)ident(hop)operator(|) + ident(hop)operator(.)ident(gsub!)operator(()regexp<delimiter(/)char(\\b)content(on (.*?\) (id.*\))delimiter(/)>operator(,)string<delimiter(')content(; )content(\\1)delimiter(')>operator(\)) + ident(whence) operator(=) ident(hop)operator(.)ident(match)operator(()regexp<delimiter(/)content(;)char(\\s)content(+(.*\)$)delimiter(/)>operator(\))operator([)integer(1)operator(]) + reserved(unless) ident(whence) + ident(warn) string<delimiter(")content(Bad received line: )inline<delimiter(#{)ident(hop)delimiter(})>delimiter(")> + reserved(next) + reserved(end) + ident(from) operator(=) global_variable($+) reserved(if) ident(hop) operator(=)operator(~) regexp<delimiter(/)content(from)char(\\s)content(+()char(\\S)content(+\)|)char(\\()content((.*?\))char(\\\))delimiter(/)> + ident(by) operator(=) global_variable($1) reserved(if) ident(hop) operator(=)operator(~) regexp<delimiter(/)content(by)char(\\s)content(+()char(\\S)content(+)char(\\.)char(\\S)content(+\))delimiter(/)> + reserved(next) reserved(unless) ident(now) operator(=) constant(Time)operator(.)ident(parse)operator(()ident(whence)operator(\))operator(.)ident(localtime) + ident(delta) operator(=) ident(now) operator(-) instance_variable(@date) + ident(puts) ident(out)operator(()operator([)ident(from)operator(,) ident(by)operator(,) ident(hop_date)operator(()ident(now)operator(\))operator(,) ident(hop_time)operator(()ident(delta)operator(\))operator(])operator(\)) + instance_variable(@date) operator(=) ident(now) + reserved(end) + reserved(end) + + reserved(def) method(hop_time)operator(()ident(secs)operator(\)) + ident(sign) operator(=) ident(secs) operator(<) integer(0) operator(?) integer(-1) operator(:) integer(1) + ident(days)operator(,) ident(secs) operator(=) ident(secs)operator(.)ident(abs)operator(.)ident(divmod)operator(()integer(60) operator(*) integer(60) operator(*) integer(24)operator(\)) + ident(hours)operator(,)ident(secs) operator(=) ident(secs)operator(.)ident(abs)operator(.)ident(divmod)operator(()integer(60) operator(*) integer(60)operator(\)) + ident(mins)operator(,) ident(secs) operator(=) ident(secs)operator(.)ident(abs)operator(.)ident(divmod)operator(()integer(60)operator(\)) + ident(rtn) operator(=) string<delimiter(")content(%3ds)delimiter(")> operator(%) operator([)ident(secs) operator(*) ident(sign)operator(]) + ident(rtn) operator(<<) string<delimiter(")content(%3dm)delimiter(")> operator(%) operator([)ident(mins) operator(*) ident(sign)operator(]) reserved(if) ident(mins) operator(!=) integer(0) + ident(rtn) operator(<<) string<delimiter(")content(%3dh)delimiter(")> operator(%) operator([)ident(hours) operator(*) ident(sign)operator(]) reserved(if) ident(hours) operator(!=) integer(0) + ident(rtn) operator(<<) string<delimiter(")content(%3dd)delimiter(")> operator(%) operator([)ident(days) operator(*) ident(sign)operator(]) reserved(if) ident(days) operator(!=) integer(0) + ident(rtn) + reserved(end) +reserved(end) + +global_variable($/) operator(=) string<delimiter(")delimiter(")> +ident(mail) operator(=) constant(MailHopDelta)operator(.)ident(new)operator(()pre_constant(ARGF)operator(.)ident(gets)operator(\))operator(.)ident(puts_hops) + + +comment(# @@PLEAC@@_4.0) +ident(single_level) operator(=) operator([) string<delimiter(")content(this)delimiter(")>operator(,) string<delimiter(")content(that)delimiter(")>operator(,) string<delimiter(")content(the)delimiter(")>operator(,) string<delimiter(")content(other)delimiter(")> operator(]) + +comment(# Ruby directly supports nested arrays) +ident(double_level) operator(=) operator([) string<delimiter(")content(this)delimiter(")>operator(,) string<delimiter(")content(that)delimiter(")>operator(,) operator([) string<delimiter(")content(the)delimiter(")>operator(,) string<delimiter(")content(other)delimiter(")> operator(]) operator(]) +ident(still_single_level) operator(=) operator([) string<delimiter(")content(this)delimiter(")>operator(,) string<delimiter(")content(that)delimiter(")>operator(,) operator([) string<delimiter(")content(the)delimiter(")>operator(,) string<delimiter(")content(other)delimiter(")> operator(]) operator(])operator(.)ident(flatten) + + +comment(# @@PLEAC@@_4.1) +ident(a) operator(=) operator([) string<delimiter(")content(quick)delimiter(")>operator(,) string<delimiter(")content(brown)delimiter(")>operator(,) string<delimiter(")content(fox)delimiter(")> operator(]) +ident(a) operator(=) string<delimiter(%w()content(Why are you teasing me?)delimiter(\))> + +ident(lines) operator(=) string<delimiter(<<"END_OF_HERE_DOC")>operator(.)ident(gsub)operator(()regexp<delimiter(/)content(^)char(\\s)content(*(.+\))delimiter(/)>operator(,) string<delimiter(')content(\\1)delimiter(')>operator(\))string<content( + The boy stood on the burning deck, + It was as hot as glass.)delimiter( +END_OF_HERE_DOC)> + +ident(bigarray) operator(=) constant(IO)operator(.)ident(readlines)operator(()string<delimiter(")content(mydatafile)delimiter(")>operator(\))operator(.)ident(collect) operator({) operator(|)ident(l)operator(|) ident(l)operator(.)ident(chomp) operator(}) + +ident(name) operator(=) string<delimiter(")content(Gandalf)delimiter(")> +ident(banner) operator(=) string<delimiter(%Q()content(Speak, )inline<delimiter(#{)ident(name)delimiter(})>content(, and welcome!)delimiter(\))> + +ident(host_info) operator(=) shell<delimiter(`)content(host )inline<delimiter(#{)ident(his_host)delimiter(})>delimiter(`)> + +shell<delimiter(%x()content(ps )inline<delimiter(#{)global_variable($$)delimiter(})>delimiter(\))> + +ident(banner) operator(=) string<delimiter(')content(Costs only $4.95)delimiter(')>operator(.)ident(split)operator(()string<delimiter(')content( )delimiter(')>operator(\)) + +ident(rax) operator(=) string<delimiter(%w!)content( ( \) < > { } [ ] )delimiter(!)> + + +comment(# @@PLEAC@@_4.2) +reserved(def) method(commify_series)operator(()ident(arr)operator(\)) + reserved(return) string<delimiter(')delimiter(')> reserved(if) reserved(not) ident(arr) + reserved(case) ident(arr)operator(.)ident(size) + reserved(when) integer(0) reserved(then) string<delimiter(')delimiter(')> + reserved(when) integer(1) reserved(then) ident(arr)operator([)integer(0)operator(]) + reserved(when) integer(2) reserved(then) ident(arr)operator(.)ident(join)operator(()string<delimiter(')content( and )delimiter(')>operator(\)) + reserved(else) ident(arr)operator([)integer(0)operator(..)integer(-2)operator(])operator(.)ident(join)operator(()string<delimiter(')content(, )delimiter(')>operator(\)) operator(+) string<delimiter(')content(, and )delimiter(')> operator(+) ident(arr)operator([)integer(-1)operator(]) + reserved(end) +reserved(end) + +ident(array) operator(=) operator([) string<delimiter(")content(red)delimiter(")>operator(,) string<delimiter(")content(yellow)delimiter(")>operator(,) string<delimiter(")content(green)delimiter(")> operator(]) + +ident(print) string<delimiter(")content(I have )delimiter(")>operator(,) ident(array)operator(,) string<delimiter(")content( marbles)char(\\n)delimiter(")> +comment(# -> I have redyellowgreen marbles) + +comment(# But unlike Perl:) +ident(print) string<delimiter(")content(I have )inline<delimiter(#{)ident(array)delimiter(})>content( marbles)char(\\n)delimiter(")> +comment(# -> I have redyellowgreen marbles) +comment(# So, needs:) +ident(print) string<delimiter(")content(I have )inline<delimiter(#{)ident(array)operator(.)ident(join)operator(()string<delimiter(')content( )delimiter(')>operator(\))delimiter(})>content( marbles)char(\\n)delimiter(")> +comment(# -> I have red yellow green marbles) + +comment(#!/usr/bin/ruby) +comment(# communify_series - show proper comma insertion in list output) + +reserved(def) method(commify_series)operator(()ident(arr)operator(\)) + reserved(return) string<delimiter(')delimiter(')> reserved(if) reserved(not) ident(arr) + ident(sepchar) operator(=) ident(arr)operator(.)ident(find) operator({) operator(|)ident(p)operator(|) ident(p) operator(=)operator(~) regexp<delimiter(/)content(,)delimiter(/)> operator(}) operator(?) string<delimiter(')content(; )delimiter(')> operator(:) string<delimiter(')content(, )delimiter(')> + reserved(case) ident(arr)operator(.)ident(size) + reserved(when) integer(0) reserved(then) string<delimiter(')delimiter(')> + reserved(when) integer(1) reserved(then) ident(arr)operator([)integer(0)operator(]) + reserved(when) integer(2) reserved(then) ident(arr)operator(.)ident(join)operator(()string<delimiter(')content( and )delimiter(')>operator(\)) + reserved(else) ident(arr)operator([)integer(0)operator(..)integer(-2)operator(])operator(.)ident(join)operator(()ident(sepchar)operator(\)) operator(+) ident(sepchar) operator(+) string<delimiter(')content(and )delimiter(')> operator(+) ident(arr)operator([)integer(-1)operator(]) + reserved(end) +reserved(end) + +ident(lists) operator(=) operator([) + operator([) string<delimiter(')content(just one thing)delimiter(')> operator(])operator(,) + string<delimiter(%w()content(Mutt Jeff)delimiter(\))>operator(,) + string<delimiter(%w()content(Peter Paul Mary)delimiter(\))>operator(,) + operator([) string<delimiter(')content(To our parents)delimiter(')>operator(,) string<delimiter(')content(Mother Theresa)delimiter(')>operator(,) string<delimiter(')content(God)delimiter(')> operator(])operator(,) + operator([) string<delimiter(')content(pastrami)delimiter(')>operator(,) string<delimiter(')content(ham and cheese)delimiter(')>operator(,) string<delimiter(')content(peanut butter and jelly)delimiter(')>operator(,) string<delimiter(')content(tuna)delimiter(')> operator(])operator(,) + operator([) string<delimiter(')content(recycle tired, old phrases)delimiter(')>operator(,) string<delimiter(')content(ponder big, happy thoughts)delimiter(')> operator(])operator(,) + operator([) string<delimiter(')content(recycle tired, old phrases)delimiter(')>operator(,) + string<delimiter(')content(ponder big, happy thoughts)delimiter(')>operator(,) + string<delimiter(')content(sleep and dream peacefully)delimiter(')> operator(])operator(,) +operator(]) + +reserved(for) ident(list) reserved(in) ident(lists) reserved(do) + ident(puts) string<delimiter(")content(The list is: )inline<delimiter(#{)ident(commify_series)operator(()ident(list)operator(\))delimiter(})>content(.)delimiter(")> +reserved(end) + + +comment(# @@PLEAC@@_4.3) +comment(# (note: AFAIK Ruby doesn't allow gory change of Array length\)) +comment(# grow the array by assigning nil to past the end of array) +ident(ary)operator([)ident(new_size)integer(-1)operator(]) operator(=) pre_constant(nil) +comment(# shrink the array by slicing it down) +ident(ary)operator(.)ident(slice!)operator(()ident(new_size)operator(..)integer(-1)operator(\)) +comment(# init the array with given size) +constant(Array)operator(.)ident(new)operator(()ident(number_of_elems)operator(\)) +comment(# assign to an element past the original end enlarges the array) +ident(ary)operator([)ident(index_new_last_elem)operator(]) operator(=) ident(value) + +reserved(def) method(what_about_that_array)operator(()ident(a)operator(\)) + ident(print) string<delimiter(")content(The array now has )delimiter(")>operator(,) ident(a)operator(.)ident(size)operator(,) string<delimiter(")content( elements.)char(\\n)delimiter(")> + comment(# Index of last element is not really interesting in Ruby) + ident(print) string<delimiter(")content(Element #3 is `)inline<delimiter(#{)ident(a)operator([)integer(3)operator(])delimiter(})>content('.)char(\\n)delimiter(")> +reserved(end) +ident(people) operator(=) string<delimiter(%w()content(Crosby Stills Nash Young)delimiter(\))> +ident(what_about_that_array)operator(()ident(people)operator(\)) + + +comment(# @@PLEAC@@_4.4) +comment(# OO style) +ident(bad_users)operator(.)ident(each) operator({) operator(|)ident(user)operator(|) + ident(complain)operator(()ident(user)operator(\)) +operator(}) +comment(# or, functional style) +reserved(for) ident(user) reserved(in) ident(bad_users) + ident(complain)operator(()ident(user)operator(\)) +reserved(end) + +reserved(for) ident(var) reserved(in) constant(ENV)operator(.)ident(keys)operator(.)ident(sort) + ident(puts) string<delimiter(")inline<delimiter(#{)ident(var)delimiter(})>content(=)inline<delimiter(#{)constant(ENV)operator([)ident(var)operator(])delimiter(})>delimiter(")> +reserved(end) + +reserved(for) ident(user) reserved(in) ident(all_users) + ident(disk_space) operator(=) ident(get_usage)operator(()ident(user)operator(\)) + reserved(if) operator(()ident(disk_space) operator(>) constant(MAX_QUOTA)operator(\)) + ident(complain)operator(()ident(user)operator(\)) + reserved(end) +reserved(end) + +reserved(for) ident(l) reserved(in) constant(IO)operator(.)ident(popen)operator(()string<delimiter(")content(who)delimiter(")>operator(\))operator(.)ident(readlines) + ident(print) ident(l) reserved(if) ident(l) operator(=)operator(~) regexp<delimiter(/)content(^gc)delimiter(/)> +reserved(end) + +comment(# we can mimic the obfuscated Perl way) +reserved(while) ident(fh)operator(.)ident(gets) comment(# $_ is set to the line just read) + ident(chomp) comment(# $_ has a trailing \\n removed, if it had one) + ident(split)operator(.)ident(each) operator({) operator(|)ident(w)operator(|) comment(# $_ is split on whitespace) + comment(# but $_ is not set to each chunk as in Perl) + ident(print) ident(w)operator(.)ident(reverse) + operator(}) +reserved(end) +comment(# ...or use a cleaner way) +reserved(for) ident(l) reserved(in) ident(fh)operator(.)ident(readlines) + ident(l)operator(.)ident(chomp)operator(.)ident(split)operator(.)ident(each) operator({) operator(|)ident(w)operator(|) ident(print) ident(w)operator(.)ident(reverse) operator(}) +reserved(end) + +comment(# same drawback as in problem 1.4, we can't mutate a Numeric...) +ident(array)operator(.)ident(collect!) operator({) operator(|)ident(v)operator(|) ident(v) operator(-) integer(1) operator(}) + +ident(a) operator(=) operator([) operator(.)integer(5)operator(,) integer(3) operator(])operator(;) ident(b) operator(=) operator([) integer(0)operator(,) integer(1) operator(]) +reserved(for) ident(ary) reserved(in) operator([) ident(a)operator(,) ident(b) operator(]) + ident(ary)operator(.)ident(collect!) operator({) operator(|)ident(v)operator(|) ident(v) operator(*) integer(7) operator(}) +reserved(end) +ident(puts) string<delimiter(")inline<delimiter(#{)ident(a)operator(.)ident(join)operator(()string<delimiter(')content( )delimiter(')>operator(\))delimiter(})>content( )inline<delimiter(#{)ident(b)operator(.)ident(join)operator(()string<delimiter(')content( )delimiter(')>operator(\))delimiter(})>delimiter(")> + +comment(# we can mutate Strings, cool; we need a trick for the scalar) +reserved(for) ident(ary) reserved(in) operator([) operator([) ident(scalar) operator(])operator(,) ident(array)operator(,) ident(hash)operator(.)ident(values) operator(]) + ident(ary)operator(.)ident(each) operator({) operator(|)ident(v)operator(|) ident(v)operator(.)ident(strip!) operator(}) comment(# String#strip rules :\)) +reserved(end) + + +comment(# @@PLEAC@@_4.5) +comment(# not relevant in Ruby since we have always references) +reserved(for) ident(item) reserved(in) ident(array) + comment(# do somethingh with item) +reserved(end) + + +comment(# @@PLEAC@@_4.6) +ident(unique) operator(=) ident(list)operator(.)ident(uniq) + +comment(# generate a list of users logged in, removing duplicates) +ident(users) operator(=) shell<delimiter(`)content(who)delimiter(`)>operator(.)ident(collect) operator({) operator(|)ident(l)operator(|) ident(l) operator(=)operator(~) regexp<delimiter(/)content(()char(\\w)content(+\))delimiter(/)>operator(;) global_variable($1) operator(})operator(.)ident(sort)operator(.)ident(uniq) +ident(puts)operator(()string<delimiter(")content(users logged in: )inline<delimiter(#{)ident(commify_series)operator(()ident(users)operator(\))delimiter(})>delimiter(")>operator(\)) comment(# see 4.2 for commify_series) + + +comment(# @@PLEAC@@_4.7) +ident(a) operator(-) ident(b) +comment(# [ 1, 1, 2, 2, 3, 3, 3, 4, 5 ] - [ 1, 2, 4 ] -> [3, 5]) + + +comment(# @@PLEAC@@_4.8) +ident(union) operator(=) ident(a) operator(|) ident(b) +ident(intersection) operator(=) ident(a) operator(&) ident(b) +ident(difference) operator(=) ident(a) operator(-) ident(b) + + +comment(# @@PLEAC@@_4.9) +ident(array1)operator(.)ident(concat)operator(()ident(array2)operator(\)) +comment(# if you will assign to another object, better use:) +ident(new_ary) operator(=) ident(array1) operator(+) ident(array2) + +ident(members) operator(=) operator([) string<delimiter(")content(Time)delimiter(")>operator(,) string<delimiter(")content(Flies)delimiter(")> operator(]) +ident(initiates) operator(=) operator([) string<delimiter(")content(An)delimiter(")>operator(,) string<delimiter(")content(Arrow)delimiter(")> operator(]) +ident(members) operator(+=) ident(initiates) + +ident(members) operator(=) operator([) string<delimiter(")content(Time)delimiter(")>operator(,) string<delimiter(")content(Flies)delimiter(")> operator(]) +ident(initiates) operator(=) operator([) string<delimiter(")content(An)delimiter(")>operator(,) string<delimiter(")content(Arrow)delimiter(")> operator(]) +ident(members)operator([)integer(2)operator(,)integer(0)operator(]) operator(=) operator([) string<delimiter(")content(Like)delimiter(")>operator(,) ident(initiates) operator(])operator(.)ident(flatten) + +ident(members)operator([)integer(0)operator(]) operator(=) string<delimiter(")content(Fruit)delimiter(")> +ident(members)operator([)integer(3)operator(,)integer(2)operator(]) operator(=) string<delimiter(")content(A)delimiter(")>operator(,) string<delimiter(")content(Banana)delimiter(")> + + +comment(# @@PLEAC@@_4.10) +ident(reversed) operator(=) ident(ary)operator(.)ident(reverse) + +ident(ary)operator(.)ident(reverse_each) operator({) operator(|)ident(e)operator(|) + comment(# do something with e) +operator(}) + +ident(descending) operator(=) ident(ary)operator(.)ident(sort)operator(.)ident(reverse) +ident(descending) operator(=) ident(ary)operator(.)ident(sort) operator({) operator(|)ident(a)operator(,)ident(b)operator(|) ident(b) operator(<=>) ident(a) operator(}) + + +comment(# @@PLEAC@@_4.11) +comment(# remove n elements from front of ary (shift n\)) +ident(front) operator(=) ident(ary)operator(.)ident(slice!)operator(()integer(0)operator(,) ident(n)operator(\)) + +comment(# remove n elements from the end of ary (pop n\)) +ident(end_) operator(=) ident(ary)operator(.)ident(slice!)operator(()operator(-)ident(n) operator(..) integer(-1)operator(\)) + +comment(# let's extend the Array class, to make that useful) +reserved(class) class(Array) + reserved(def) method(shift2)operator(()operator(\)) + ident(slice!)operator(()integer(0) operator(..) integer(1)operator(\)) comment(# more symetric with pop2...) + reserved(end) + reserved(def) method(pop2)operator(()operator(\)) + ident(slice!)operator(()integer(-2) operator(..) integer(-1)operator(\)) + reserved(end) +reserved(end) + +ident(friends) operator(=) string<delimiter(%w()content(Peter Paul Mary Jim Tim)delimiter(\))> +ident(this)operator(,) ident(that) operator(=) ident(friends)operator(.)ident(shift2) + +ident(beverages) operator(=) string<delimiter(%w()content(Dew Jolt Cola Sprite Fresca)delimiter(\))> +ident(pair) operator(=) ident(beverages)operator(.)ident(pop2) + + +comment(# @@PLEAC@@_4.12) +comment(# use Enumerable#detect (or the synonym Enumerable#find\)) +ident(highest_eng) operator(=) ident(employees)operator(.)ident(detect) operator({) operator(|)ident(emp)operator(|) ident(emp)operator(.)ident(category) operator(==) string<delimiter(')content(engineer)delimiter(')> operator(}) + + +comment(# @@PLEAC@@_4.13) +comment(# use Enumerable#select (or the synonym Enumerable#find_all\)) +ident(bigs) operator(=) ident(nums)operator(.)ident(select) operator({) operator(|)ident(i)operator(|) ident(i) operator(>) integer(1_000_000) operator(}) +ident(pigs) operator(=) ident(users)operator(.)ident(keys)operator(.)ident(select) operator({) operator(|)ident(k)operator(|) ident(users)operator([)ident(k)operator(]) operator(>) float(1e7) operator(}) + +ident(matching) operator(=) shell<delimiter(`)content(who)delimiter(`)>operator(.)ident(select) operator({) operator(|)ident(u)operator(|) ident(u) operator(=)operator(~) regexp<delimiter(/)content(^gnat )delimiter(/)> operator(}) + +ident(engineers) operator(=) ident(employees)operator(.)ident(select) operator({) operator(|)ident(e)operator(|) ident(e)operator(.)ident(position) operator(==) string<delimiter(')content(Engineer)delimiter(')> operator(}) + +ident(secondary_assistance) operator(=) ident(applicants)operator(.)ident(select) operator({) operator(|)ident(a)operator(|) + ident(a)operator(.)ident(income) operator(>)operator(=) integer(26_000) operator(&&) ident(a)operator(.)ident(income) operator(<) integer(30_000) +operator(}) + + +comment(# @@PLEAC@@_4.14) +comment(# normally you would have an array of Numeric (Float or) +comment(# Fixnum or Bignum\), so you would use:) +ident(sorted) operator(=) ident(unsorted)operator(.)ident(sort) +comment(# if you have strings representing Integers or Floats) +comment(# you may specify another sort method:) +ident(sorted) operator(=) ident(unsorted)operator(.)ident(sort) operator({) operator(|)ident(a)operator(,)ident(b)operator(|) ident(a)operator(.)ident(to_f) operator(<=>) ident(b)operator(.)ident(to_f) operator(}) + +comment(# let's use the list of my own PID's) +shell<delimiter(`)content(ps ux)delimiter(`)>operator(.)ident(split)operator(()string<delimiter(")char(\\n)delimiter(")>operator(\))operator([)integer(1)operator(..)integer(-1)operator(])operator(.) + ident(select) operator({) operator(|)ident(i)operator(|) ident(i) operator(=)operator(~) regexp<delimiter(/)content(^)inline<delimiter(#{)constant(ENV)operator([)string<delimiter(')content(USER)delimiter(')>operator(])delimiter(})>delimiter(/)> operator(})operator(.) + ident(collect) operator({) operator(|)ident(i)operator(|) ident(i)operator(.)ident(split)operator([)integer(1)operator(]) operator(})operator(.) + ident(sort) operator({) operator(|)ident(a)operator(,)ident(b)operator(|) ident(a)operator(.)ident(to_i) operator(<=>) ident(b)operator(.)ident(to_i) operator(})operator(.)ident(each) operator({) operator(|)ident(i)operator(|) ident(puts) ident(i) operator(}) +ident(puts) string<delimiter(")content(Select a process ID to kill:)delimiter(")> +ident(pid) operator(=) ident(gets)operator(.)ident(chomp) +ident(raise) string<delimiter(")content(Exiting ... )char(\\n)delimiter(")> reserved(unless) ident(pid) operator(&&) ident(pid) operator(=)operator(~) regexp<delimiter(/)content(^)char(\\d)content(+$)delimiter(/)> +constant(Process)operator(.)ident(kill)operator(()string<delimiter(')content(TERM)delimiter(')>operator(,) ident(pid)operator(.)ident(to_i)operator(\)) +ident(sleep) integer(2) +constant(Process)operator(.)ident(kill)operator(()string<delimiter(')content(KILL)delimiter(')>operator(,) ident(pid)operator(.)ident(to_i)operator(\)) + +ident(descending) operator(=) ident(unsorted)operator(.)ident(sort) operator({) operator(|)ident(a)operator(,)ident(b)operator(|) ident(b)operator(.)ident(to_f) operator(<=>) ident(a)operator(.)ident(to_f) operator(}) + + +comment(# @@PLEAC@@_4.15) +ident(ordered) operator(=) ident(unordered)operator(.)ident(sort) operator({) operator(|)ident(a)operator(,)ident(b)operator(|) ident(compare)operator(()ident(a)operator(,)ident(b)operator(\)) operator(}) + +ident(precomputed) operator(=) ident(unordered)operator(.)ident(collect) operator({) operator(|)ident(e)operator(|) operator([)ident(compute)operator(,) ident(e)operator(]) operator(}) +ident(ordered_precomputed) operator(=) ident(precomputed)operator(.)ident(sort) operator({) operator(|)ident(a)operator(,)ident(b)operator(|) ident(a)operator([)integer(0)operator(]) operator(<=>) ident(b)operator([)integer(0)operator(]) operator(}) +ident(ordered) operator(=) ident(ordered_precomputed)operator(.)ident(collect) operator({) operator(|)ident(e)operator(|) ident(e)operator([)integer(1)operator(]) operator(}) + +ident(ordered) operator(=) ident(unordered)operator(.)ident(collect) operator({) operator(|)ident(e)operator(|) operator([)ident(compute)operator(,) ident(e)operator(]) operator(})operator(.) + ident(sort) operator({) operator(|)ident(a)operator(,)ident(b)operator(|) ident(a)operator([)integer(0)operator(]) operator(<=>) ident(b)operator([)integer(0)operator(]) operator(})operator(.) + ident(collect) operator({) operator(|)ident(e)operator(|) ident(e)operator([)integer(1)operator(]) operator(}) + +reserved(for) ident(employee) reserved(in) ident(employees)operator(.)ident(sort) operator({) operator(|)ident(a)operator(,)ident(b)operator(|) ident(a)operator(.)ident(name) operator(<=>) ident(b)operator(.)ident(name) operator(}) + ident(print) ident(employee)operator(.)ident(name)operator(,) string<delimiter(")content( earns )char(\\$)content( )delimiter(")>operator(,) ident(employee)operator(.)ident(salary)operator(,) string<delimiter(")char(\\n)delimiter(")> +reserved(end) + +comment(# Beware! `0' is true in Ruby.) +comment(# For chaining comparisons, you may use Numeric#nonzero?, which) +comment(# returns num if num is not zero, nil otherwise) +ident(sorted) operator(=) ident(employees)operator(.)ident(sort) operator({) operator(|)ident(a)operator(,)ident(b)operator(|) operator(()ident(a)operator(.)ident(name) operator(<=>) ident(b)operator(.)ident(name)operator(\))operator(.)ident(nonzero?) operator(||) ident(b)operator(.)ident(age) operator(<=>) ident(a)operator(.)ident(age) operator(}) + +ident(users) operator(=) operator([)operator(]) +comment(# getpwent is not wrapped in Ruby... let's fallback) +constant(IO)operator(.)ident(readlines)operator(()string<delimiter(')content(/etc/passwd)delimiter(')>operator(\))operator(.)ident(each) operator({) operator(|)ident(u)operator(|) ident(users) operator(<<) ident(u)operator(.)ident(split)operator(()string<delimiter(')content(:)delimiter(')>operator(\)) operator(}) +ident(users)operator(.)ident(sort!) operator({) operator(|)ident(a)operator(,)ident(b)operator(|) ident(a)operator([)integer(0)operator(]) operator(<=>) ident(b)operator([)integer(0)operator(]) operator(}) +reserved(for) ident(user) reserved(in) ident(users) + ident(puts) ident(user)operator([)integer(0)operator(]) +reserved(end) + +ident(sorted) operator(=) ident(names)operator(.)ident(sort) operator({) operator(|)ident(a)operator(,)ident(b)operator(|) ident(a)operator([)integer(1)operator(,) integer(1)operator(]) operator(<=>) ident(b)operator([)integer(1)operator(,) integer(1)operator(]) operator(}) +ident(sorted) operator(=) ident(strings)operator(.)ident(sort) operator({) operator(|)ident(a)operator(,)ident(b)operator(|) ident(a)operator(.)ident(length) operator(<=>) ident(b)operator(.)ident(length) operator(}) + +comment(# let's show only the compact version) +ident(ordered) operator(=) ident(strings)operator(.)ident(collect) operator({) operator(|)ident(e)operator(|) operator([)ident(e)operator(.)ident(length)operator(,) ident(e)operator(]) operator(})operator(.) + ident(sort) operator({) operator(|)ident(a)operator(,)ident(b)operator(|) ident(a)operator([)integer(0)operator(]) operator(<=>) ident(b)operator([)integer(0)operator(]) operator(})operator(.) + ident(collect) operator({) operator(|)ident(e)operator(|) ident(e)operator([)integer(1)operator(]) operator(}) + +ident(ordered) operator(=) ident(strings)operator(.)ident(collect) operator({) operator(|)ident(e)operator(|) operator([)regexp<delimiter(/)char(\\d)content(+)delimiter(/)>operator(.)ident(match)operator(()ident(e)operator(\))operator([)integer(0)operator(])operator(.)ident(to_i)operator(,) ident(e)operator(]) operator(})operator(.) + ident(sort) operator({) operator(|)ident(a)operator(,)ident(b)operator(|) ident(a)operator([)integer(0)operator(]) operator(<=>) ident(b)operator([)integer(0)operator(]) operator(})operator(.) + ident(collect) operator({) operator(|)ident(e)operator(|) ident(e)operator([)integer(1)operator(]) operator(}) + +ident(print) shell<delimiter(`)content(cat /etc/passwd)delimiter(`)>operator(.)ident(collect) operator({) operator(|)ident(e)operator(|) operator([)ident(e)operator(,) ident(e)operator(.)ident(split)operator(()string<delimiter(')content(:)delimiter(')>operator(\))operator(.)ident(indexes)operator(()integer(3)operator(,)integer(2)operator(,)integer(0)operator(\))operator(])operator(.)ident(flatten) operator(})operator(.) + ident(sort) operator({) operator(|)ident(a)operator(,)ident(b)operator(|) operator(()ident(a)operator([)integer(1)operator(]) operator(<=>) ident(b)operator([)integer(1)operator(])operator(\))operator(.)ident(nonzero?) operator(||) operator(()ident(a)operator([)integer(2)operator(]) operator(<=>) ident(b)operator([)integer(2)operator(])operator(\))operator(.)ident(nonzero?) operator(||) ident(a)operator([)integer(3)operator(]) operator(<=>) ident(b)operator([)integer(3)operator(]) operator(})operator(.) + ident(collect) operator({) operator(|)ident(e)operator(|) ident(e)operator([)integer(0)operator(]) operator(}) + + +comment(# @@PLEAC@@_4.16) +ident(circular)operator(.)ident(unshift)operator(()ident(circular)operator(.)ident(pop)operator(\)) comment(# the last shall be first) +ident(circular)operator(.)ident(push)operator(()ident(circular)operator(.)ident(shift)operator(\)) comment(# and vice versa) + +reserved(def) method(grab_and_rotate)operator(()ident(l)operator(\)) + ident(l)operator(.)ident(push)operator(()ident(ret) operator(=) ident(l)operator(.)ident(shift)operator(\)) + ident(ret) +reserved(end) + +ident(processes) operator(=) operator([)integer(1)operator(,) integer(2)operator(,) integer(3)operator(,) integer(4)operator(,) integer(5)operator(]) +reserved(while) operator(()integer(1)operator(\)) + ident(process) operator(=) ident(grab_and_rotate)operator(()ident(processes)operator(\)) + ident(puts) string<delimiter(")content(Handling process )inline<delimiter(#{)ident(process)delimiter(})>delimiter(")> + ident(sleep) integer(1) +reserved(end) + + +comment(# @@PLEAC@@_4.17) +reserved(def) method(fisher_yates_shuffle)operator(()ident(a)operator(\)) + operator(()ident(a)operator(.)ident(size)integer(-1)operator(\))operator(.)ident(downto)operator(()integer(1)operator(\)) operator({) operator(|)ident(i)operator(|) + ident(j) operator(=) ident(rand)operator(()ident(i)integer(+1)operator(\)) + ident(a)operator([)ident(i)operator(])operator(,) ident(a)operator([)ident(j)operator(]) operator(=) ident(a)operator([)ident(j)operator(])operator(,) ident(a)operator([)ident(i)operator(]) reserved(if) ident(i) operator(!=) ident(j) + operator(}) +reserved(end) + +reserved(def) method(naive_shuffle)operator(()ident(a)operator(\)) + reserved(for) ident(i) reserved(in) integer(0)operator(...)ident(a)operator(.)ident(size) + ident(j) operator(=) ident(rand)operator(()ident(a)operator(.)ident(size)operator(\)) + ident(a)operator([)ident(i)operator(])operator(,) ident(a)operator([)ident(j)operator(]) operator(=) ident(a)operator([)ident(j)operator(])operator(,) ident(a)operator([)ident(i)operator(]) + reserved(end) +reserved(end) + + +comment(# @@PLEAC@@_4.18) +comment(#!/usr/bin/env ruby) +comment(# example 4-2 words) +comment(# words - gather lines, present in colums) + +comment(# class to encapsulate the word formatting from the input) +reserved(class) class(WordFormatter) + reserved(def) method(initialize)operator(()ident(cols)operator(\)) + instance_variable(@cols) operator(=) ident(cols) + reserved(end) + + comment(# helper to return the length of the longest word in the wordlist) + reserved(def) method(maxlen)operator(()ident(wordlist)operator(\)) + ident(max) operator(=) integer(1) + reserved(for) ident(word) reserved(in) ident(wordlist) + reserved(if) ident(word)operator(.)ident(length) operator(>) ident(max) + ident(max) operator(=) ident(word)operator(.)ident(length) + reserved(end) + reserved(end) + ident(max) + reserved(end) + + comment(# process the wordlist and print it formmated into columns) + reserved(def) method(output)operator(()ident(wordlist)operator(\)) + ident(collen) operator(=) ident(maxlen)operator(()ident(wordlist)operator(\)) operator(+) integer(1) + ident(columns) operator(=) instance_variable(@cols) operator(/) ident(collen) + ident(columns) operator(=) integer(1) reserved(if) ident(columns) operator(==) integer(0) + ident(rows) operator(=) operator(()ident(wordlist)operator(.)ident(length) operator(+) ident(columns) operator(-) integer(1)operator(\)) operator(/) ident(columns) + comment(# now process each item, picking out proper piece for this position) + integer(0)operator(.)ident(upto)operator(()ident(rows) operator(*) ident(columns) operator(-) integer(1)operator(\)) operator({) operator(|)ident(item)operator(|) + ident(target) operator(=) operator(()ident(item) operator(%) ident(columns)operator(\)) operator(*) ident(rows) operator(+) operator(()ident(item) operator(/) ident(columns)operator(\)) + ident(eol) operator(=) operator(()operator(()ident(item)integer(+1)operator(\)) operator(%) ident(columns) operator(==) integer(0)operator(\)) + ident(piece) operator(=) ident(wordlist)operator([)ident(target)operator(]) operator(||) string<delimiter(")delimiter(")> + ident(piece) operator(=) ident(piece)operator(.)ident(ljust)operator(()ident(collen)operator(\)) reserved(unless) ident(eol) + ident(print) ident(piece) + ident(puts) reserved(if) ident(eol) + operator(}) + comment(# no need to finish it up, because eol is always true for the last element) + reserved(end) +reserved(end) + +comment(# get nr of chars that fit in window or console, see PLEAC 15.4) +comment(# not portable -- linux only (?\)) +reserved(def) method(getWinCharWidth)operator(()operator(\)) + ident(buf) operator(=) string<delimiter(")char(\\0)delimiter(")> operator(*) integer(8) + global_variable($stdout)operator(.)ident(ioctl)operator(()integer(0x5413)operator(,) ident(buf)operator(\)) + ident(ws_row)operator(,) ident(ws_col)operator(,) ident(ws_xpixel)operator(,) ident(ws_ypixel) operator(=) ident(buf)operator(.)ident(unpack)operator(()string<delimiter(")content($4)delimiter(")>operator(\)) + ident(ws_col) operator(||) integer(80) +reserved(rescue) + integer(80) +reserved(end) + +comment(# main program) +ident(cols) operator(=) ident(getWinCharWidth)operator(()operator(\)) +ident(formatter) operator(=) constant(WordFormatter)operator(.)ident(new)operator(()ident(cols)operator(\)) +ident(words) operator(=) ident(readlines)operator(()operator(\)) +ident(words)operator(.)ident(collect!) operator({) operator(|)ident(line)operator(|) + ident(line)operator(.)ident(chomp) +operator(}) +ident(formatter)operator(.)ident(output)operator(()ident(words)operator(\)) + + +comment(# @@PLEAC@@_4.19) +comment(# In ruby, Fixnum's are automatically converted to Bignum's when) +comment(# needed, so there is no need for an extra module) +reserved(def) method(factorial)operator(()ident(n)operator(\)) + ident(s) operator(=) integer(1) + reserved(while) ident(n) operator(>) integer(0) + ident(s) operator(*=) ident(n) + ident(n) operator(-=) integer(1) + reserved(end) + ident(s) +reserved(end) + +ident(puts) ident(factorial)operator(()integer(500)operator(\)) + +comment(#---------------------------------------------------------) +comment(# Example 4-3. tsc-permute) +comment(# tsc_permute: permute each word of input) +reserved(def) method(permute)operator(()ident(items)operator(,) ident(perms)operator(\)) + reserved(unless) ident(items)operator(.)ident(length) operator(>) integer(0) + ident(puts) ident(perms)operator(.)ident(join)operator(()string<delimiter(")content( )delimiter(")>operator(\)) + reserved(else) + reserved(for) ident(i) reserved(in) ident(items) + ident(newitems) operator(=) ident(items)operator(.)ident(dup) + ident(newperms) operator(=) ident(perms)operator(.)ident(dup) + ident(newperms)operator(.)ident(unshift)operator(()ident(newitems)operator(.)ident(delete)operator(()ident(i)operator(\))operator(\)) + ident(permute)operator(()ident(newitems)operator(,) ident(newperms)operator(\)) + reserved(end) + reserved(end) +reserved(end) +comment(# In ruby the main program must be after all definitions it is using) +ident(permute)operator(()pre_constant(ARGV)operator(,) operator([)operator(])operator(\)) + +comment(#---------------------------------------------------------) +comment(# mjd_permute: permute each word of input) + +reserved(def) method(factorial)operator(()ident(n)operator(\)) + ident(s) operator(=) integer(1) + reserved(while) ident(n) operator(>) integer(0) + ident(s) operator(*=) ident(n) + ident(n) operator(-=) integer(1) + reserved(end) + ident(s) +reserved(end) + +comment(# we use a class with a class variable store the private cache) +comment(# for the results of the factorial function.) +reserved(class) class(Factorial) + class_variable(@@fact) operator(=) operator([) integer(1) operator(]) + reserved(def) constant(Factorial)operator(.)ident(compute)operator(()ident(n)operator(\)) + reserved(if) class_variable(@@fact)operator([)ident(n)operator(]) + class_variable(@@fact)operator([)ident(n)operator(]) + reserved(else) + class_variable(@@fact)operator([)ident(n)operator(]) operator(=) ident(n) operator(*) constant(Factorial)operator(.)ident(compute)operator(()ident(n) operator(-) integer(1)operator(\)) + reserved(end) + reserved(end) +reserved(end) + +comment(#---------------------------------------------------------) +comment(# Example 4-4- mjd-permute) +comment(# n2pat(n, len\): produce the N-th pattern of length len) + +comment(# We must use a lower case letter as parameter N, otherwise it is) +comment(# handled as constant Length is the length of the resulting) +comment(# array, not the index of the last element (length -1\) like in) +comment(# the perl example.) +reserved(def) method(n2pat)operator(()ident(n)operator(,) ident(length)operator(\)) + ident(pat) operator(=) operator([)operator(]) + ident(i) operator(=) integer(1) + reserved(while) ident(i) operator(<=) ident(length) + ident(pat)operator(.)ident(push)operator(()ident(n) operator(%) ident(i)operator(\)) + ident(n) regexp<delimiter(/)content(= i + i += 1 + end + pat +end + +# pat2perm(pat\): turn pattern returned by n2pat(\) into +# permutation of integers. +def pat2perm(pat\) + source = (0 .. pat.length - 1\).to_a + perm = [] + perm.push(source.slice!(pat.pop\)\) while pat.length > 0 + perm +end + +def n2perm(n, len\) + pat2perm(n2pat(n,len\)\) +end + +# In ruby the main program must be after all definitions +while gets + data = split + # the perl solution has used $#data, which is length-1 + num_permutations = Factorial.compute(data.length(\)\) + 0.upto(num_permutations - 1\) do |i| + # in ruby we can not use an array as selector for an array + # but by exchanging the two arrays, we can use the collect method + # which returns an array with the result of all block invocations + permutation = n2perm(i, data.length\).collect { + |j| data[j] + } + puts permutation.join(" "\) + end +end + + +# @@PLEAC@@_5.0 +age = { "Nat", 24, + "Jules", 25, + "Josh", 17 } + +age["Nat"] = 24 +age["Jules"] = 25 +age["Josh"] = 17 + +food_color = { + "Apple" => "red", + "Banana" => "yellow", + "Lemon" => "yellow", + "Carrot" => "orange" + } + +# In Ruby, you cannot avoid the double or simple quoting +# while manipulatin hashes + + +# @@PLEAC@@_5.1 +hash[key] = value + +food_color["Raspberry"] = "pink" +puts "Known foods:", food_color.keys + + +# @@PLEAC@@_5.2 +# does hash have a value for key ? +if (hash.has_key?(key\)\) + # it exists +else + # it doesn't +end + +[ "Banana", "Martini" ].each { |name| + print name, " is a ", food_color.has_key?(name\) ? "food" : "drink", ")char(\\n)content(" +} + +age = {} +age['Toddler'] = 3 +age['Unborn'] = 0 +age['Phantasm'] = nil + +for thing in ['Toddler', 'Unborn', 'Phantasm', 'Relic'] + print ")inline<delimiter(#{)ident(thing)delimiter(})>content(: " + print "Has-key " if age.has_key?(thing\) + print "True " if age[thing] + print "Nonzero " if age[thing] && age[thing].nonzero? + print ")char(\\n)content(" +end + +#=> +# Toddler: Has-key True Nonzero +# Unborn: Has-key True +# Phantasm: Has-key +# Relic: + +# You use Hash#has_key? when you use Perl's exists -> it checks +# for existence of a key in a hash. +# All Numeric are "True" in ruby, so the test doesn't have the +# same semantics as in Perl; you would use Numeric#nonzero? to +# achieve the same semantics (false if 0, true otherwise\). + + +# @@PLEAC@@_5.3 +food_color.delete("Banana"\) + + +# @@PLEAC@@_5.4 +hash.each { |key, value| + # do something with key and value +} + +hash.each_key { |key| + # do something with key +} + +food_color.each { |food, color| + puts ")inline<delimiter(#{)ident(food)delimiter(})>content( is )inline<delimiter(#{)ident(color)delimiter(})>content(" +} + +food_color.each_key { |food| + puts ")inline<delimiter(#{)ident(food)delimiter(})>content( is )inline<delimiter(#{)ident(food_color)operator([)ident(food)operator(])delimiter(})>content(" +} + +# IMO this demonstrates that OO style is by far more readable +food_color.keys.sort.each { |food| + puts ")inline<delimiter(#{)ident(food)delimiter(})>content( is )inline<delimiter(#{)ident(food_color)operator([)ident(food)operator(])delimiter(})>content(." +} + +#----------------------------- +#!)delimiter(/)modifier(us)>ident(r)operator(/)ident(bin)operator(/)ident(ruby) +comment(# countfrom - count number of messages from each sender) + +comment(# Default value is 0) +ident(from) operator(=) constant(Hash)operator(.)ident(new)operator(()integer(0)operator(\)) +reserved(while) ident(gets) + regexp<delimiter(/)content(^From: (.*\))delimiter(/)> reserved(and) ident(from)operator([)global_variable($1)operator(]) operator(+=) integer(1) +reserved(end) + +comment(# More useful to sort by number of received mail by person) +ident(from)operator(.)ident(sort) operator({)operator(|)ident(a)operator(,)ident(b)operator(|) ident(b)operator([)integer(1)operator(])operator(<=>)ident(a)operator([)integer(1)operator(])operator(})operator(.)ident(each) operator({) operator(|)ident(v)operator(|) + ident(puts) string<delimiter(")inline<delimiter(#{)ident(v)operator([)integer(1)operator(])delimiter(})>content(: )inline<delimiter(#{)ident(v)operator([)integer(0)operator(])delimiter(})>delimiter(")> +operator(}) +comment(#-----------------------------) + + +comment(# @@PLEAC@@_5.5) +comment(# You may use the built-in 'inspect' method this way:) +ident(p) ident(hash) + +comment(# Or do it the Cookbook way:) +ident(hash)operator(.)ident(each) operator({) operator(|)ident(k)operator(,)ident(v)operator(|) ident(puts) string<delimiter(")inline<delimiter(#{)ident(k)delimiter(})>content( => )inline<delimiter(#{)ident(v)delimiter(})>delimiter(")> operator(}) + +comment(# Sorted by keys) +ident(hash)operator(.)ident(sort)operator(.)ident(each) operator({) operator(|)ident(e)operator(|) ident(puts) string<delimiter(")inline<delimiter(#{)ident(e)operator([)integer(0)operator(])delimiter(})>content( => )inline<delimiter(#{)ident(e)operator([)integer(1)operator(])delimiter(})>delimiter(")> operator(}) +comment(# Sorted by values) +ident(hash)operator(.)ident(sort)operator({)operator(|)ident(a)operator(,)ident(b)operator(|) ident(a)operator([)integer(1)operator(])operator(<=>)ident(b)operator([)integer(1)operator(])operator(})operator(.)ident(each) operator({) operator(|)ident(e)operator(|) ident(puts) string<delimiter(")inline<delimiter(#{)ident(e)operator([)integer(0)operator(])delimiter(})>content( => )inline<delimiter(#{)ident(e)operator([)integer(1)operator(])delimiter(})>delimiter(")> operator(}) + + +comment(# @@PLEAC@@_5.7) +ident(ttys) operator(=) constant(Hash)operator(.)ident(new) +reserved(for) ident(i) reserved(in) shell<delimiter(`)content(who)delimiter(`)> + ident(user)operator(,) ident(tty) operator(=) ident(i)operator(.)ident(split) + operator(()ident(ttys)operator([)ident(user)operator(]) operator(||=) operator([)operator(])operator(\)) operator(<<) ident(tty) comment(# see problems_ruby for more infos) +reserved(end) +ident(ttys)operator(.)ident(keys)operator(.)ident(sort)operator(.)ident(each) operator({) operator(|)ident(k)operator(|) + ident(puts) string<delimiter(")inline<delimiter(#{)ident(k)delimiter(})>content(: )inline<delimiter(#{)ident(commify_series)operator(()ident(ttys)operator([)ident(k)operator(])operator(\))delimiter(})>delimiter(")> comment(# from 4.2) +operator(}) + + +comment(# @@PLEAC@@_5.8) +ident(surname) operator(=) operator({) string<delimiter(")content(Mickey)delimiter(")> operator(=)operator(>) string<delimiter(")content(Mantle)delimiter(")>operator(,) string<delimiter(")content(Babe)delimiter(")> operator(=)operator(>) string<delimiter(")content(Ruth)delimiter(")> operator(}) +ident(puts) ident(surname)operator(.)ident(index)operator(()string<delimiter(")content(Mantle)delimiter(")>operator(\)) + +comment(# If you really needed to 'invert' the whole hash, use Hash#invert) + +comment(#-----------------------------) +comment(#!/usr/bin/ruby -w) +comment(# foodfind - find match for food or color) + +ident(given) operator(=) pre_constant(ARGV)operator(.)ident(shift) reserved(or) ident(raise) string<delimiter(")content(usage: foodfind food_or_color)delimiter(")> + +ident(color) operator(=) operator({) + string<delimiter(")content(Apple)delimiter(")> operator(=)operator(>) string<delimiter(")content(red)delimiter(")>operator(,) + string<delimiter(")content(Banana)delimiter(")> operator(=)operator(>) string<delimiter(")content(yellow)delimiter(")>operator(,) + string<delimiter(")content(Lemon)delimiter(")> operator(=)operator(>) string<delimiter(")content(yellow)delimiter(")>operator(,) + string<delimiter(")content(Carrot)delimiter(")> operator(=)operator(>) string<delimiter(")content(orange)delimiter(")>operator(,) +operator(}) + +reserved(if) operator(()ident(color)operator(.)ident(has_key?)operator(()ident(given)operator(\))operator(\)) + ident(puts) string<delimiter(")inline<delimiter(#{)ident(given)delimiter(})>content( is a food with color )inline<delimiter(#{)ident(color)operator([)ident(given)operator(])delimiter(})>content(.)delimiter(")> +reserved(end) +reserved(if) operator(()ident(color)operator(.)ident(has_value?)operator(()ident(given)operator(\))operator(\)) + ident(puts) string<delimiter(")inline<delimiter(#{)ident(color)operator(.)ident(index)operator(()ident(given)operator(\))delimiter(})>content( is a food with color )inline<delimiter(#{)ident(given)delimiter(})>content(.)delimiter(")> +reserved(end) +comment(#-----------------------------) + + +comment(# @@PLEAC@@_5.9) +comment(# Sorted by keys (Hash#sort gives an Array of pairs made of each key,value\)) +ident(food_color)operator(.)ident(sort)operator(.)ident(each) operator({) operator(|)ident(f)operator(|) + ident(puts) string<delimiter(")inline<delimiter(#{)ident(f)operator([)integer(0)operator(])delimiter(})>content( is )inline<delimiter(#{)ident(f)operator([)integer(1)operator(])delimiter(})>content(.)delimiter(")> +operator(}) + +comment(# Sorted by values) +ident(food_color)operator(.)ident(sort) operator({) operator(|)ident(a)operator(,)ident(b)operator(|) ident(a)operator([)integer(1)operator(]) operator(<=>) ident(b)operator([)integer(1)operator(]) operator(})operator(.)ident(each) operator({) operator(|)ident(f)operator(|) + ident(puts) string<delimiter(")inline<delimiter(#{)ident(f)operator([)integer(0)operator(])delimiter(})>content( is )inline<delimiter(#{)ident(f)operator([)integer(1)operator(])delimiter(})>content(.)delimiter(")> +operator(}) + +comment(# Sorted by length of values) +ident(food_color)operator(.)ident(sort) operator({) operator(|)ident(a)operator(,)ident(b)operator(|) ident(a)operator([)integer(1)operator(])operator(.)ident(length) operator(<=>) ident(b)operator([)integer(1)operator(])operator(.)ident(length) operator(})operator(.)ident(each) operator({) operator(|)ident(f)operator(|) + ident(puts) string<delimiter(")inline<delimiter(#{)ident(f)operator([)integer(0)operator(])delimiter(})>content( is )inline<delimiter(#{)ident(f)operator([)integer(1)operator(])delimiter(})>content(.)delimiter(")> +operator(}) + + +comment(# @@PLEAC@@_5.10) +ident(merged) operator(=) ident(a)operator(.)ident(clone)operator(.)ident(update)operator(()ident(b)operator(\)) comment(# because Hash#update changes object in place) + +ident(drink_color) operator(=) operator({) string<delimiter(")content(Galliano)delimiter(")> operator(=)operator(>) string<delimiter(")content(yellow)delimiter(")>operator(,) string<delimiter(")content(Mai Tai)delimiter(")> operator(=)operator(>) string<delimiter(")content(blue)delimiter(")> operator(}) +ident(ingested_color) operator(=) ident(drink_color)operator(.)ident(clone)operator(.)ident(update)operator(()ident(food_color)operator(\)) + +ident(substance_color) operator(=) operator({)operator(}) +reserved(for) ident(i) reserved(in) operator([) ident(food_color)operator(,) ident(drink_color) operator(]) + ident(i)operator(.)ident(each_key) operator({) operator(|)ident(k)operator(|) + reserved(if) ident(substance_color)operator(.)ident(has_key?)operator(()ident(k)operator(\)) + ident(puts) string<delimiter(")content(Warning: )inline<delimiter(#{)ident(k)delimiter(})>content( seen twice. Using the first definition.)delimiter(")> + reserved(next) + reserved(end) + ident(substance_color)operator([)ident(k)operator(]) operator(=) integer(1) + operator(}) +reserved(end) + + +comment(# @@PLEAC@@_5.11) +ident(common) operator(=) ident(hash1)operator(.)ident(keys) operator(&) ident(hash2)operator(.)ident(keys) + +ident(this_not_that) operator(=) ident(hash1)operator(.)ident(keys) operator(-) ident(hash2)operator(.)ident(keys) + + +comment(# @@PLEAC@@_5.12) +comment(# no problem here, Ruby handles any kind of object for key-ing) +comment(# (it takes Object#hash, which defaults to Object#id\)) + + +comment(# @@PLEAC@@_5.13) +comment(# AFAIK, not possible in Ruby) + + +comment(# @@PLEAC@@_5.14) +comment(# Be careful, the following is possible only because Fixnum objects are) +comment(# special (documentation says: there is effectively only one Fixnum object) +comment(# instance for any given integer value\).) +ident(count) operator(=) constant(Hash)operator(.)ident(new)operator(()integer(0)operator(\)) +ident(array)operator(.)ident(each) operator({) operator(|)ident(e)operator(|) + ident(count)operator([)ident(e)operator(]) operator(+=) integer(1) +operator(}) + + +comment(# @@PLEAC@@_5.15) +ident(father) operator(=) operator({) + string<delimiter(")content(Cain)delimiter(")> operator(,) string<delimiter(")content(Adam)delimiter(")>operator(,) + string<delimiter(")content(Abel)delimiter(")> operator(,) string<delimiter(")content(Adam)delimiter(")>operator(,) + string<delimiter(")content(Seth)delimiter(")> operator(,) string<delimiter(")content(Adam)delimiter(")>operator(,) + string<delimiter(")content(Enoch)delimiter(")> operator(,) string<delimiter(")content(Cain)delimiter(")>operator(,) + string<delimiter(")content(Irad)delimiter(")> operator(,) string<delimiter(")content(Enoch)delimiter(")>operator(,) + string<delimiter(")content(Mehujael)delimiter(")> operator(,) string<delimiter(")content(Irad)delimiter(")>operator(,) + string<delimiter(")content(Methusael)delimiter(")> operator(,) string<delimiter(")content(Mehujael)delimiter(")>operator(,) + string<delimiter(")content(Lamech)delimiter(")> operator(,) string<delimiter(")content(Methusael)delimiter(")>operator(,) + string<delimiter(")content(Jabal)delimiter(")> operator(,) string<delimiter(")content(Lamech)delimiter(")>operator(,) + string<delimiter(")content(Jubal)delimiter(")> operator(,) string<delimiter(")content(Lamech)delimiter(")>operator(,) + string<delimiter(")content(Tubalcain)delimiter(")> operator(,) string<delimiter(")content(Lamech)delimiter(")>operator(,) + string<delimiter(")content(Enos)delimiter(")> operator(,) string<delimiter(")content(Seth)delimiter(")>operator(,) +operator(}) + +reserved(while) ident(gets) + ident(chomp) + reserved(begin) + ident(print) global_variable($_)operator(,) string<delimiter(")content( )delimiter(")> + reserved(end) reserved(while) global_variable($_) operator(=) ident(father)operator([)global_variable($_)operator(]) + ident(puts) +reserved(end) + +ident(children) operator(=) operator({)operator(}) +ident(father)operator(.)ident(each) operator({) operator(|)ident(k)operator(,)ident(v)operator(|) + operator(()ident(children)operator([)ident(v)operator(]) operator(||=) operator([)operator(])operator(\)) operator(<<) ident(k) +operator(}) +reserved(while) ident(gets) + ident(chomp) + ident(puts) string<delimiter(")inline<delimiter(#{)global_variable($_)delimiter(})>content( begat )inline<delimiter(#{)operator(()ident(children)operator([)global_variable($_)operator(]) operator(||) operator([)string<delimiter(')content(Nobody)delimiter(')>operator(])operator(\))operator(.)ident(join)operator(()string<delimiter(')content(, )delimiter(')>operator(\))delimiter(})>content(.)char(\\n)delimiter(")> +reserved(end) + +ident(includes) operator(=) operator({)operator(}) +ident(files)operator(.)ident(each) operator({) operator(|)ident(f)operator(|) + reserved(begin) + reserved(for) ident(l) reserved(in) constant(IO)operator(.)ident(readlines)operator(()ident(f)operator(\)) + reserved(next) reserved(unless) ident(l) operator(=)operator(~) regexp<delimiter(/)content(^)char(\\s)content(*#)char(\\s)content(*include)char(\\s)content(*<([^>]+\)>)delimiter(/)> + operator(()ident(includes)operator([)global_variable($1)operator(]) operator(||=) operator([)operator(])operator(\)) operator(<<) ident(f) + reserved(end) + reserved(rescue) constant(SystemCallError) + global_variable($stderr)operator(.)ident(puts) string<delimiter(")escape(#)global_variable($!)content( (skipping\))delimiter(")> + reserved(end) +operator(}) + +ident(include_free) operator(=) ident(includes)operator(.)ident(values)operator(.)ident(flatten)operator(.)ident(uniq) operator(-) ident(includes)operator(.)ident(keys) + + +comment(# @@PLEAC@@_5.16) +comment(# dutree - print sorted intented rendition of du output) +comment(#% dutree) +comment(#% dutree /usr) +comment(#% dutree -a) +comment(#% dutree -a /bin) + +comment(# The DuNode class collects all information about a directory,) +comment(# and provides some convenience methods) +reserved(class) class(DuNode) + + ident(attr_reader) symbol(:name) + ident(attr_accessor) symbol(:size) + ident(attr_accessor) symbol(:kids) + + reserved(def) method(initialize)operator(()ident(name)operator(\)) + instance_variable(@name) operator(=) ident(name) + instance_variable(@kids) operator(=) operator([)operator(]) + instance_variable(@size) operator(=) integer(0) + reserved(end) + + comment(# support for sorting nodes with side) + reserved(def) method(size_compare)operator(()ident(node2)operator(\)) + instance_variable(@size) operator(<=>) ident(node2)operator(.)ident(size) + reserved(end) + + reserved(def) method(basename) + instance_variable(@name)operator(.)ident(sub)operator(()regexp<delimiter(/)content(.*)char(\\/)delimiter(/)>operator(,) string<delimiter(")delimiter(")>operator(\)) + reserved(end) + + comment(#returns substring before last "/", nil if not there) + reserved(def) method(parent) + ident(p) operator(=) instance_variable(@name)operator(.)ident(sub)operator(()regexp<delimiter(/)char(\\/)content([^)char(\\/)content(]+$)delimiter(/)>operator(,)string<delimiter(")delimiter(")>operator(\)) + reserved(if) ident(p) operator(==) instance_variable(@name) + pre_constant(nil) + reserved(else) + ident(p) + reserved(end) + reserved(end) + +reserved(end) + +comment(# The DuTree does the acdtual work of) +comment(# getting the input, parsing it, builging up a tree) +comment(# and format it for output) +reserved(class) class(Dutree) + + ident(attr_reader) symbol(:topdir) + + reserved(def) method(initialize) + instance_variable(@nodes) operator(=) constant(Hash)operator(.)ident(new) + instance_variable(@dirsizes) operator(=) constant(Hash)operator(.)ident(new)operator(()integer(0)operator(\)) + instance_variable(@kids) operator(=) constant(Hash)operator(.)ident(new)operator(()operator([)operator(])operator(\)) + reserved(end) + + comment(# get a node by name, create it if it does not exist yet) + reserved(def) method(get_create_node)operator(()ident(name)operator(\)) + reserved(if) instance_variable(@nodes)operator(.)ident(has_key?)operator(()ident(name)operator(\)) + instance_variable(@nodes)operator([)ident(name)operator(]) + reserved(else) + ident(node) operator(=) constant(DuNode)operator(.)ident(new)operator(()ident(name)operator(\)) + instance_variable(@nodes)operator([)ident(name)operator(]) operator(=) ident(node) + ident(node) + reserved(end) + reserved(end) + + comment(# run du, read in input, save sizes and kids) + comment(# stores last directory read in instance variable topdir) + reserved(def) method(input)operator(()ident(arguments)operator(\)) + ident(name) operator(=) string<delimiter(")delimiter(")> + ident(cmd) operator(=) string<delimiter(")content(du )delimiter(")> operator(+) ident(arguments)operator(.)ident(join)operator(()string<delimiter(")content( )delimiter(")>operator(\)) + constant(IO)operator(.)ident(popen)operator(()ident(cmd)operator(\)) operator({) operator(|)ident(pipe)operator(|) + ident(pipe)operator(.)ident(each) operator({) operator(|)ident(line)operator(|) + ident(size)operator(,) ident(name) operator(=) ident(line)operator(.)ident(chomp)operator(.)ident(split)operator(()regexp<delimiter(/)char(\\s)content(+)delimiter(/)>operator(,) integer(2)operator(\)) + ident(node) operator(=) ident(get_create_node)operator(()ident(name)operator(\)) + ident(node)operator(.)ident(size) operator(=) ident(size)operator(.)ident(to_i) + instance_variable(@nodes)operator([)ident(name)operator(]) operator(=) ident(node) + ident(parent) operator(=) ident(node)operator(.)ident(parent) + reserved(if) ident(parent) + ident(get_create_node)operator(()ident(parent)operator(\))operator(.)ident(kids)operator(.)ident(push)operator(()ident(node)operator(\)) + reserved(end) + operator(}) + operator(}) + instance_variable(@topdir) operator(=) instance_variable(@nodes)operator([)ident(name)operator(]) + reserved(end) + + comment(# figure out how much is taken in each directory) + comment(# that isn't stored in the subdirectories. Add a new) + comment(# fake kid called "." containing that much.) + reserved(def) method(get_dots)operator(()ident(node)operator(\)) + ident(cursize) operator(=) ident(node)operator(.)ident(size) + reserved(for) ident(kid) reserved(in) ident(node)operator(.)ident(kids) + ident(cursize) operator(-=) ident(kid)operator(.)ident(size) + ident(get_dots)operator(()ident(kid)operator(\)) + reserved(end) + reserved(if) ident(node)operator(.)ident(size) operator(!=) ident(cursize) + ident(newnode) operator(=) ident(get_create_node)operator(()ident(node)operator(.)ident(name) operator(+) string<delimiter(")content(/.)delimiter(")>operator(\)) + ident(newnode)operator(.)ident(size) operator(=) ident(cursize) + ident(node)operator(.)ident(kids)operator(.)ident(push)operator(()ident(newnode)operator(\)) + reserved(end) + reserved(end) + + comment(# recursively output everything) + comment(# passing padding and number width as well) + comment(# on recursive calls) + reserved(def) method(output)operator(()ident(node)operator(,) ident(prefix)operator(=)string<delimiter(")delimiter(")>operator(,) ident(width)operator(=)integer(0)operator(\)) + ident(line) operator(=) ident(sprintf)operator(()string<delimiter(")content(%)inline<delimiter(#{)ident(width)delimiter(})>content(d %s)delimiter(")>operator(,) ident(node)operator(.)ident(size)operator(,) ident(node)operator(.)ident(basename)operator(\)) + ident(puts)operator(()ident(prefix) operator(+) ident(line)operator(\)) + ident(prefix) operator(+=) ident(line)operator(.)ident(sub)operator(()regexp<delimiter(/)char(\\d)content( )delimiter(/)>operator(,) string<delimiter(")content(| )delimiter(")>operator(\)) + ident(prefix)operator(.)ident(gsub!)operator(()regexp<delimiter(/)content([^|])delimiter(/)>operator(,) string<delimiter(")content( )delimiter(")>operator(\)) + reserved(if) ident(node)operator(.)ident(kids)operator(.)ident(length) operator(>) integer(0) comment(# not a bachelor node) + ident(kids) operator(=) ident(node)operator(.)ident(kids) + ident(kids)operator(.)ident(sort!) operator({) operator(|)ident(a)operator(,)ident(b)operator(|) + ident(b)operator(.)ident(size_compare)operator(()ident(a)operator(\)) + operator(}) + ident(width) operator(=) ident(kids)operator([)integer(0)operator(])operator(.)ident(size)operator(.)ident(to_s)operator(.)ident(length) + reserved(for) ident(kid) reserved(in) ident(kids) + ident(output)operator(()ident(kid)operator(,) ident(prefix)operator(,) ident(width)operator(\)) + reserved(end) + reserved(end) + reserved(end) + +reserved(end) + +ident(tree) operator(=) constant(Dutree)operator(.)ident(new) +ident(tree)operator(.)ident(input)operator(()pre_constant(ARGV)operator(\)) +ident(tree)operator(.)ident(get_dots)operator(()ident(tree)operator(.)ident(topdir)operator(\)) +ident(tree)operator(.)ident(output)operator(()ident(tree)operator(.)ident(topdir)operator(\)) + + +comment(# @@PLEAC@@_6.0) +comment(# The verbose version are match, sub, gsub, sub! and gsub!;) +comment(# pattern needs to be a Regexp object; it yields a MatchData) +comment(# object.) +ident(pattern)operator(.)ident(match)operator(()ident(string)operator(\)) +ident(string)operator(.)ident(sub)operator(()ident(pattern)operator(,) ident(replacement)operator(\)) +ident(string)operator(.)ident(gsub)operator(()ident(pattern)operator(,) ident(replacement)operator(\)) +comment(# As usual in Ruby, sub! does the same as sub but also modifies) +comment(# the object, the same for gsub!/gsub.) + +comment(# Sugared syntax yields the position of the match (or nil if no) +comment(# match\). Note that the object at the right of the operator needs) +comment(# not to be a Regexp object (it can be a String\). The "dont) +comment(# match" operator yields true or false.) +ident(meadow) operator(=)operator(~) regexp<delimiter(/)content(sheep)delimiter(/)> comment(# position of the match, nil if no match) +ident(meadow) operator(!)operator(~) regexp<delimiter(/)content(sheep)delimiter(/)> comment(# true if doesn't match, false if it does) +comment(# There is no sugared version for the substitution) + +ident(meadow) operator(=)operator(~) regexp<delimiter(/)char(\\b)content(ovines?)char(\\b)delimiter(/)modifier(i)> reserved(and) ident(print) string<delimiter(")content(Here be sheep!)delimiter(")> + +ident(string) operator(=) string<delimiter(")content(good food)delimiter(")> +ident(string)operator(.)ident(sub!)operator(()regexp<delimiter(/)content(o*)delimiter(/)>operator(,) string<delimiter(')content(e)delimiter(')>operator(\)) + +comment(# % echo ababacaca | ruby -ne 'puts $& if /(a|ba|b\)+(a|ac\)+/') +comment(# ababa) + +comment(# The "global" (or "multiple"\) match is handled by String#scan) +ident(scan) operator(()regexp<delimiter(/)content(()char(\\d)content(+\))delimiter(/)>operator(\)) operator({) + ident(puts) string<delimiter(")content(Found number )inline<delimiter(#{)global_variable($1)delimiter(})>delimiter(")> +operator(}) + +comment(# String#scan yields an Array if not used with a block) +ident(numbers) operator(=) ident(scan)operator(()regexp<delimiter(/)char(\\d)content(+)delimiter(/)>operator(\)) + +ident(digits) operator(=) string<delimiter(")content(123456789)delimiter(")> +ident(nonlap) operator(=) ident(digits)operator(.)ident(scan)operator(()regexp<delimiter(/)content(()char(\\d)char(\\d)char(\\d)content(\))delimiter(/)>operator(\)) +ident(yeslap) operator(=) ident(digits)operator(.)ident(scan)operator(()regexp<delimiter(/)content((?=()char(\\d)char(\\d)char(\\d)content(\)\))delimiter(/)>operator(\)) +ident(puts) string<delimiter(")content(Non-overlapping: )inline<delimiter(#{)ident(nonlap)operator(.)ident(join)operator(()string<delimiter(')content( )delimiter(')>operator(\))delimiter(})>delimiter(")> +ident(puts) string<delimiter(")content(Overlapping: )inline<delimiter(#{)ident(yeslap)operator(.)ident(join)operator(()string<delimiter(')content( )delimiter(')>operator(\))delimiter(})>delimiter(")>operator(;) +comment(# Non-overlapping: 123 456 789) +comment(# Overlapping: 123 234 345 456 567 678 789) + +ident(string) operator(=) string<delimiter(")content(And little lambs eat ivy)delimiter(")> +ident(string) operator(=)operator(~) regexp<delimiter(/)content(l[^s]*s)delimiter(/)> +ident(puts) string<delimiter(")content(()escape(#)global_variable($`)content(\) ()escape(#)global_variable($&)content(\) ()escape(#)global_variable($')content(\))delimiter(")> +comment(# (And \) (little lambs\) ( eat ivy\)) + + +comment(# @@PLEAC@@_6.1) +comment(# Ruby doesn't have the same problem:) +ident(dst) operator(=) ident(src)operator(.)ident(sub)operator(()string<delimiter(')content(this)delimiter(')>operator(,) string<delimiter(')content(that)delimiter(')>operator(\)) + +ident(progname) operator(=) global_variable($0)operator(.)ident(sub)operator(()string<delimiter(')content(^.*/)delimiter(')>operator(,) string<delimiter(')delimiter(')>operator(\)) + +ident(bindirs) operator(=) string<delimiter(%w()content(/usr/bin /bin /usr/local/bin)delimiter(\))> +ident(libdirs) operator(=) ident(bindirs)operator(.)ident(map) operator({) operator(|)ident(l)operator(|) ident(l)operator(.)ident(sub)operator(()string<delimiter(')content(bin)delimiter(')>operator(,) string<delimiter(')content(lib)delimiter(')>operator(\)) operator(}) + + +comment(# @@PLEAC@@_6.3) +regexp<delimiter(/)char(\\S)content(+)delimiter(/)> comment(# as many non-whitespace bytes as possible) +regexp<delimiter(/)content([A-Za-z'-]+)delimiter(/)> comment(# as many letters, apostrophes, and hyphens) + +regexp<delimiter(/)char(\\b)content(([A-Za-z]+\))char(\\b)delimiter(/)> comment(# usually best) +regexp<delimiter(/)char(\\s)content(([A-Za-z]+\))char(\\s)delimiter(/)> comment(# fails at ends or w/ punctuation) + + +comment(# @@PLEAC@@_6.4) +ident(require) string<delimiter(')content(socket)delimiter(')> +ident(str) operator(=) string<delimiter(')content(www.ruby-lang.org and www.rubygarden.org)delimiter(')> +ident(re) operator(=) regexp<delimiter(/)content( + ( # capture the hostname in $1 + (?: # these parens for grouping only + (?! [-_] \) # lookahead for neither underscore nor dash + [)char(\\w)content(-] + # hostname component + )char(\\.)content( # and the domain dot + \) + # now repeat that whole thing a bunch of times + [A-Za-z] # next must be a letter + [)char(\\w)content(-] + # now trailing domain part + \) # end of $1 capture + )delimiter(/)modifier(x)> comment(# /x for nice formatting) + +ident(str)operator(.)ident(gsub!) ident(re) reserved(do) comment(# pass a block to execute replacement) + ident(host) operator(=) constant(TCPsocket)operator(.)ident(gethostbyname)operator(()global_variable($1)operator(\)) + string<delimiter(")inline<delimiter(#{)global_variable($1)delimiter(})>content( [)inline<delimiter(#{)ident(host)operator([)integer(3)operator(])delimiter(})>content(])delimiter(")> +reserved(end) + +ident(puts) ident(str) +comment(#-----------------------------) +comment(# to match whitespace or #-characters in an extended re you need to escape) +comment(# them.) + +ident(foo) operator(=) integer(42) +ident(str) operator(=) string<delimiter(')content(blah #foo# blah)delimiter(')> +ident(str)operator(.)ident(gsub!) regexp<delimiter(%r/)content( # replace + )char(\\#)content( # a pound sign + ()char(\\w)content(+\) # the variable name + )char(\\#)content( # another pound sign + )delimiter(/)modifier(x)> reserved(do) + ident(eval) global_variable($1) comment(# with the value of a local variable) + reserved(end) +ident(puts) ident(str) comment(# => blah 42 blah) + + +comment(# @@PLEAC@@_6.5) +comment(# The 'g' modifier doesn't exist in Ruby, a regexp can't be used) +comment(# directly in a while loop; instead, use String#scan { |match| .. } ) +ident(fish) operator(=) string<delimiter(')content(One fish two fish red fish blue fish)delimiter(')> +constant(WANT) operator(=) integer(3) +ident(count) operator(=) integer(0) +ident(fish)operator(.)ident(scan)operator(()regexp<delimiter(/)content(()char(\\w)content(+\))char(\\s)content(+fish)char(\\b)delimiter(/)modifier(i)>operator(\)) operator({) + reserved(if) operator(()ident(count) operator(+=) integer(1)operator(\)) operator(==) constant(WANT) + ident(puts) string<delimiter(")content(The third fish is a )inline<delimiter(#{)global_variable($1)delimiter(})>content( one.)delimiter(")> + reserved(end) +operator(}) + +reserved(if) ident(fish) operator(=)operator(~) regexp<delimiter(/)content((?:)char(\\w)content(+)char(\\s)content(+fish)char(\\s)content(+\){2}()char(\\w)content(+\))char(\\s)content(+fish)delimiter(/)modifier(i)> + ident(puts) string<delimiter(")content(The third fish is a )inline<delimiter(#{)global_variable($1)delimiter(})>content( one.)delimiter(")> +reserved(end) + +ident(pond) operator(=) string<delimiter(')content(One fish two fish red fish blue fish)delimiter(')> +comment(# String#scan without a block gives an array of matches, each match) +comment(# being an array of all the specified groups) +ident(colors) operator(=) ident(pond)operator(.)ident(scan)operator(()regexp<delimiter(/)content(()char(\\w)content(+\))char(\\s)content(+fish)char(\\b)delimiter(/)modifier(i)>operator(\))operator(.)ident(flatten) comment(# get all matches) +ident(color) operator(=) ident(colors)operator([)integer(2)operator(]) comment(# then the one we want) +comment(# or without a temporary array) +ident(color) operator(=) ident(pond)operator(.)ident(scan)operator(()regexp<delimiter(/)content(()char(\\w)content(+\))char(\\s)content(+fish)char(\\b)delimiter(/)modifier(i)>operator(\))operator(.)ident(flatten)operator([)integer(2)operator(]) comment(# just grab element 3) +ident(puts) string<delimiter(")content(The third fish in the pond is )inline<delimiter(#{)ident(color)delimiter(})>content(.)delimiter(")> + +ident(count) operator(=) integer(0) +ident(fishes) operator(=) string<delimiter(')content(One fish two fish red fish blue fish)delimiter(')> +ident(evens) operator(=) ident(fishes)operator(.)ident(scan)operator(()regexp<delimiter(/)content(()char(\\w)content(+\))char(\\s)content(+fish)char(\\b)delimiter(/)modifier(i)>operator(\))operator(.)ident(select) operator({) operator(()ident(count)operator(+=)integer(1)operator(\)) operator(%) integer(2) operator(==) integer(0) operator(}) +ident(print) string<delimiter(")content(Even numbered fish are )inline<delimiter(#{)ident(evens)operator(.)ident(join)operator(()string<delimiter(')content( )delimiter(')>operator(\))delimiter(})>content(.)delimiter(")> + +ident(count) operator(=) integer(0) +ident(fishes)operator(.)ident(gsub)operator(()regexp<delimiter(/)content( + )char(\\b)content( # makes next )char(\\w)content( more efficient + ( )char(\\w)content(+ \) # this is what we)char(\\')content(ll be changing + ( + )char(\\s)content(+ fish )char(\\b)content( + \) + )delimiter(/)modifier(x)>operator(\)) operator({) + reserved(if) operator(()ident(count) operator(+=) integer(1)operator(\)) operator(==) integer(4) + string<delimiter(')content(sushi)delimiter(')> operator(+) global_variable($2) + reserved(else) + global_variable($1) operator(+) global_variable($2) + reserved(end) +operator(}) + +ident(pond) operator(=) string<delimiter(')content(One fish two fish red fish blue fish swim here.)delimiter(')> +ident(puts) string<delimiter(")content(Last fish is )inline<delimiter(#{)ident(pond)operator(.)ident(scan)operator(()regexp<delimiter(/)char(\\b)content(()char(\\w)content(+\))char(\\s)content(+fish)char(\\b)delimiter(/)modifier(i)>operator(\))operator(.)ident(flatten)operator([)integer(-1)operator(])delimiter(})>delimiter(")> + +regexp<delimiter(/)content( + A # find some pattern A + (?! # mustn)char(\\')content(t be able to find + .* # something + A # and A + \) + $ # through the end of the string +)delimiter(/)modifier(x)> + +comment(# The "s" perl modifier is "m" in Ruby (not very nice since there is) +comment(# also an "m" in perl..\)) +ident(pond) operator(=) string<delimiter(")content(One fish two fish red fish blue fish swim here.)delimiter(")> +reserved(if) operator(()ident(pond) operator(=)operator(~) regexp<delimiter(/)content( + )char(\\b)content( ( )char(\\w)content(+\) )char(\\s)content(+ fish )char(\\b)content( + (?! .* )char(\\b)content( fish )char(\\b)content( \) + )delimiter(/)modifier(mix)>operator(\)) + ident(puts) string<delimiter(")content(Last fish is )inline<delimiter(#{)global_variable($1)delimiter(})>content(.)delimiter(")> +reserved(else) + ident(puts) string<delimiter(")content(Failed!)delimiter(")> +reserved(end) + + +comment(# @@PLEAC@@_6.6) +comment(#-----------------------------) +comment(#!/usr/bin/ruby -w) +comment(# killtags - very bad html killer) +global_variable($/) operator(=) pre_constant(nil)operator(;) comment(# each read is whole file) +reserved(while) ident(file) operator(=) ident(gets)operator(()operator(\)) reserved(do) + ident(file)operator(.)ident(gsub!)operator(()regexp<delimiter(/)content(<.*?>)delimiter(/)modifier(m)>operator(,)string<delimiter(')delimiter(')>operator(\))operator(;) comment(# strip tags (terribly\)) + ident(puts) ident(file) comment(# print file to STDOUT) +reserved(end) +comment(#-----------------------------) +comment(#!/usr/bin/ruby -w) +comment(#headerfy - change certain chapter headers to html) +global_variable($/) operator(=) string<delimiter(')delimiter(')> +reserved(while) ident(file) operator(=) ident(gets)operator(()operator(\)) reserved(do) + ident(pattern) operator(=) regexp<delimiter(/)content( + )char(\\A)content( # start of record + ( # capture in $1 + Chapter # text string + )char(\\s)content(+ # mandatory whitespace + )char(\\d)content(+ # decimal number + )char(\\s)content(* # optional whitespace + : # a real colon + . * # anything not a newline till end of line + \) + )delimiter(/)modifier(x)> + ident(puts) ident(file)operator(.)ident(gsub)operator(()ident(pattern)operator(,)string<delimiter(')content(<H1>)content(\\1)content(</H1>)delimiter(')>operator(\)) +reserved(end) +comment(#-----------------------------) +comment(#% ruby -00pe "gsub!(/\\A(Chapter\\s+\\d+\\s*:.*\)/,'<H1>\\1</H1>'\)" datafile) + +comment(#!/usr/bin/ruby -w) +comment(#-----------------------------) +reserved(for) ident(file) reserved(in) pre_constant(ARGV) + ident(file) operator(=) constant(File)operator(.)ident(open)operator(()pre_constant(ARGV)operator(.)ident(shift)operator(\)) + reserved(while) ident(file)operator(.)ident(gets)operator(()string<delimiter(')delimiter(')>operator(\)) reserved(do) comment(# each read is a paragraph) + ident(print) string<delimiter(")content(chunk )inline<delimiter(#{)global_variable($.)delimiter(})>content( in $ARGV has <<)inline<delimiter(#{)global_variable($1)delimiter(})>content(>>)char(\\n)delimiter(")> reserved(while) regexp<delimiter(/)content(^START(.*?\)^END)delimiter(/)modifier(m)> + reserved(end) comment(# /m activates the multiline mode) +reserved(end) +comment(#-----------------------------) + +comment(# @@PLEAC@@_6.7) +comment(#-----------------------------) +global_variable($/) operator(=) pre_constant(nil)operator(;) +ident(file) operator(=) constant(File)operator(.)ident(open)operator(()string<delimiter(")content(datafile)delimiter(")>operator(\)) +ident(chunks) operator(=) ident(file)operator(.)ident(gets)operator(.)ident(split)operator(()regexp<delimiter(/)content(pattern)delimiter(/)>operator(\)) +comment(#-----------------------------) +comment(# .Ch, .Se and .Ss divide chunks of STDIN) +ident(chunks) operator(=) ident(gets)operator(()pre_constant(nil)operator(\))operator(.)ident(split)operator(()regexp<delimiter(/)content(^)char(\\.)content((Ch|Se|Ss\)$)delimiter(/)>operator(\)) +ident(print) string<delimiter(")content(I read )inline<delimiter(#{)ident(chunks)operator(.)ident(size)delimiter(})>content( chunks.)char(\\n)delimiter(")> +comment(#-----------------------------) + + +comment(# @@PLEAC@@_6.8) +reserved(while) ident(gets) + reserved(if) operator(~)regexp<delimiter(/)content(BEGIN)delimiter(/)> operator(..) operator(~)regexp<delimiter(/)content(END)delimiter(/)> + comment(# line falls between BEGIN and END inclusive) + reserved(end) +reserved(end) + +reserved(while) ident(gets) + reserved(if) operator(()global_variable($.) operator(==) ident(firstnum)operator(\)) operator(..) operator(()global_variable($.) operator(==) ident(lastnum)operator(\)) + comment(# operate between firstnum and lastnum line number) + reserved(end) +reserved(end) + +comment(# in ruby versions prior to 1.8, the above two conditional) +comment(# expressions could be shortened to:) +comment(# if /BEGIN/ .. /END/) +comment(# and) +comment(# if firstnum .. lastnum) +comment(# but these now only work this way from the command line ) + +comment(#-----------------------------) + +reserved(while) ident(gets) + reserved(if) operator(~)regexp<delimiter(/)content(BEGIN)delimiter(/)> operator(...) operator(~)regexp<delimiter(/)content(END)delimiter(/)> + comment(# line falls between BEGIN and END on different lines) + reserved(end) +reserved(end) + +reserved(while) ident(gets) + reserved(if) operator(()global_variable($.) operator(==) ident(first)operator(\)) operator(...) operator(()global_variable($.) operator(==) ident(last)operator(\)) + comment(# operate between first and last line number on different lines) + reserved(end) +reserved(end) + +comment(#-----------------------------) +comment(# command-line to print lines 15 through 17 inclusive (see below\)) +ident(ruby) operator(-)ident(ne) string<delimiter(')content(print if 15 .. 17)delimiter(')> ident(datafile) + +comment(# print out all <XMP> .. </XMP> displays from HTML doc) +reserved(while) ident(gets) + ident(print) reserved(if) operator(~)regexp<delimiter(%r#)content(<XMP>)delimiter(#)modifier(i)> operator(..) operator(~)regexp<delimiter(%r#)content(</XMP>)delimiter(#)modifier(i)>operator(;) +reserved(end) + +comment(# same, but as shell command) +comment(# ruby -ne 'print if %r#<XMP>#i .. %r#</XMP>#i' document.html) +comment(#-----------------------------) +comment(# ruby -ne 'BEGIN { $top=3; $bottom=5 }; \\) +comment(# print if $top .. $bottom' /etc/passwd # FAILS) +comment(# ruby -ne 'BEGIN { $top=3; $bottom=5 }; \\) +comment(# print if $. == $top .. $. == $bottom' /etc/passwd # works) +comment(# ruby -ne 'print if 3 .. 5' /etc/passwd # also works) +comment(#-----------------------------) +ident(print) reserved(if) operator(~)regexp<delimiter(/)content(begin)delimiter(/)> operator(..) operator(~)regexp<delimiter(/)content(end)delimiter(/)>operator(;) +ident(print) reserved(if) operator(~)regexp<delimiter(/)content(begin)delimiter(/)> operator(...) operator(~)regexp<delimiter(/)content(end)delimiter(/)>operator(;) +comment(#-----------------------------) +reserved(while) ident(gets) + global_variable($in_header) operator(=) global_variable($.) operator(==) integer(1) operator(..) operator(~)regexp<delimiter(/)content(^$)delimiter(/)> operator(?) pre_constant(true) operator(:) pre_constant(false) + global_variable($in_body) operator(=) operator(~)regexp<delimiter(/)content(^$)delimiter(/)> operator(..) pre_constant(ARGF)operator(.)ident(eof) operator(?) pre_constant(true) operator(:) pre_constant(false) +reserved(end) +comment(#-----------------------------) +ident(seen) operator(=) operator({)operator(}) +pre_constant(ARGF)operator(.)ident(each) reserved(do) operator(|)ident(line)operator(|) + reserved(next) reserved(unless) ident(line) operator(=)operator(~) regexp<delimiter(/)content(^From:?)char(\\s)delimiter(/)modifier(i)> operator(..) ident(line) operator(=)operator(~) regexp<delimiter(/)content(^$)delimiter(/)>operator(;) + ident(line)operator(.)ident(scan)operator(()regexp<delimiter(%r/)content(([^<>(\),;)char(\\s)content(]+)char(\\@)content([^<>(\),;)char(\\s)content(]+\))delimiter(/)>operator(\))operator(.)ident(each) reserved(do) operator(|)ident(addr)operator(|) + ident(puts) ident(addr) reserved(unless) ident(seen)operator([)ident(addr)operator(]) + ident(seen)operator([)ident(addr)operator(]) operator(||=) integer(1) + reserved(end) +reserved(end) + + +comment(# @@PLEAC@@_6.9) +reserved(def) method(glob2pat)operator(()ident(globstr)operator(\)) + ident(patmap) operator(=) operator({) + string<delimiter(')content(*)delimiter(')> operator(=)operator(>) string<delimiter(')content(.*)delimiter(')>operator(,) + string<delimiter(')content(?)delimiter(')> operator(=)operator(>) string<delimiter(')content(.)delimiter(')>operator(,) + string<delimiter(')content([)delimiter(')> operator(=)operator(>) string<delimiter(')content([)delimiter(')>operator(,) + string<delimiter(')content(])delimiter(')> operator(=)operator(>) string<delimiter(')content(])delimiter(')>operator(,) + operator(}) + ident(globstr)operator(.)ident(gsub!)operator(()regexp<delimiter(/)content((.\))delimiter(/)>operator(\)) operator({) operator(|)ident(c)operator(|) ident(patmap)operator([)ident(c)operator(]) operator(||) constant(Regexp)operator(::)ident(escape)operator(()ident(c)operator(\)) operator(}) + string<delimiter(')content(^)delimiter(')> operator(+) ident(globstr) operator(+) string<delimiter(')content($)delimiter(')> +reserved(end) + + +comment(# @@PLEAC@@_6.10) +comment(# avoid interpolating patterns like this if the pattern) +comment(# isn't going to change:) +ident(pattern) operator(=) pre_constant(ARGV)operator(.)ident(shift) +pre_constant(ARGF)operator(.)ident(each) reserved(do) operator(|)ident(line)operator(|) + ident(print) ident(line) reserved(if) ident(line) operator(=)operator(~) regexp<delimiter(/)inline<delimiter(#{)ident(pattern)delimiter(})>delimiter(/)> +reserved(end) + +comment(# the above creates a new regex each iteration. Instead,) +comment(# use the /o modifier so the regex is compiled only once) + +ident(pattern) operator(=) pre_constant(ARGV)operator(.)ident(shift) +pre_constant(ARGF)operator(.)ident(each) reserved(do) operator(|)ident(line)operator(|) + ident(print) ident(line) reserved(if) ident(line) operator(=)operator(~) regexp<delimiter(/)inline<delimiter(#{)ident(pattern)delimiter(})>delimiter(/)modifier(o)> +reserved(end) + +comment(#-----------------------------) + +comment(#!/usr/bin/ruby) +comment(# popgrep1 - grep for abbreviations of places that say "pop") +comment(# version 1: slow but obvious way) +ident(popstates) operator(=) string<delimiter(%w()content(CO ON MI WI MN)delimiter(\))> +pre_constant(ARGF)operator(.)ident(each) reserved(do) operator(|)ident(line)operator(|) + ident(popstates)operator(.)ident(each) reserved(do) operator(|)ident(state)operator(|) + reserved(if) ident(line) operator(=)operator(~) regexp<delimiter(/)char(\\b)inline<delimiter(#{)ident(state)delimiter(})>char(\\b)delimiter(/)> + ident(print) ident(line) + ident(last) + reserved(end) + reserved(end) +reserved(end) + +comment(#-----------------------------) +comment(#!/usr/bin/ruby) +comment(# popgrep2 - grep for abbreviations of places that say "pop") +comment(# version 2: eval strings; fast but hard to quote) +ident(popstates) operator(=) string<delimiter(%w()content(CO ON MI WI MN)delimiter(\))> +ident(code) operator(=) string<delimiter(")content(ARGF.each do |line|)char(\\n)delimiter(")> +ident(popstates)operator(.)ident(each) reserved(do) operator(|)ident(state)operator(|) + ident(code) operator(+=) string<delimiter(")char(\\t)content(if line =~ /)char(\\\\)content(b)inline<delimiter(#{)ident(state)delimiter(})>char(\\\\)content(b/; print(line\); next; end)char(\\n)delimiter(")> +reserved(end) +ident(code) operator(+=) string<delimiter(")content(end)char(\\n)delimiter(")> +ident(print) string<delimiter(")content(CODE IS)char(\\n)content(---)char(\\n)inline<delimiter(#{)ident(code)delimiter(})>char(\\n)content(---)char(\\n)delimiter(")> reserved(if) pre_constant(false) comment(# turn on for debugging) +ident(eval) ident(code) + +comment(# CODE IS) +comment(# ---) +comment(# ARGF.each do |line|) +comment(# if line =~ /\\bCO\\b/; print(line\); next; end) +comment(# if line =~ /\\bON\\b/; print(line\); next; end) +comment(# if line =~ /\\bMI\\b/; print(line\); next; end) +comment(# if line =~ /\\bWI\\b/; print(line\); next; end) +comment(# if line =~ /\\bMN\\b/; print(line\); next; end) +comment(# end) +comment(# ) +comment(# ---) + +comment(## alternatively, the same idea as above but compiling ) +comment(## to a case statement: (not in perlcookbook\)) +comment(#!/usr/bin/ruby -w) +comment(# popgrep2.5 - grep for abbreviations of places that say "pop") +comment(# version 2.5: eval strings; fast but hard to quote) +ident(popstates) operator(=) string<delimiter(%w()content(CO ON MI WI MN)delimiter(\))> +ident(code) operator(=) string<delimiter(")content(ARGF.each do |line|)char(\\n)content( case line)char(\\n)delimiter(")> +ident(popstates)operator(.)ident(each) reserved(do) operator(|)ident(state)operator(|) + ident(code) operator(+=) string<delimiter(")content( when /)char(\\\\)content(b)inline<delimiter(#{)ident(state)delimiter(})>char(\\\\)content(b/ : print line)char(\\n)delimiter(")> +reserved(end) +ident(code) operator(+=) string<delimiter(")content( end)char(\\n)content(end)char(\\n)delimiter(")> +ident(print) string<delimiter(")content(CODE IS)char(\\n)content(---)char(\\n)inline<delimiter(#{)ident(code)delimiter(})>char(\\n)content(---)char(\\n)delimiter(")> reserved(if) pre_constant(false) comment(# turn on for debugging) +ident(eval) ident(code) + +comment(# CODE IS) +comment(# ---) +comment(# ARGF.each do |line|) +comment(# case line) +comment(# when /\\bCO\\b/ : print line) +comment(# when /\\bON\\b/ : print line) +comment(# when /\\bMI\\b/ : print line) +comment(# when /\\bWI\\b/ : print line) +comment(# when /\\bMN\\b/ : print line) +comment(# end) +comment(# end) +comment(# ) +comment(# ---) + +comment(# Note: (above\) Ruby 1.8+ allows the 'when EXP : EXPR' on one line) +comment(# with the colon separator.) + +comment(#-----------------------------) +comment(#!/usr/bin/ruby) +comment(# popgrep3 - grep for abbreviations of places that say "pop") +comment(# version3: build a match_any function) +ident(popstates) operator(=) string<delimiter(%w()content(CO ON MI WI MN)delimiter(\))> +ident(expr) operator(=) ident(popstates)operator(.)ident(map)operator({)operator(|)ident(e)operator(|)string<delimiter(")content(line =~ /)char(\\\\)content(b)inline<delimiter(#{)ident(e)delimiter(})>char(\\\\)content(b/)delimiter(")>operator(})operator(.)ident(join)operator(()string<delimiter(')content(||)delimiter(')>operator(\)) +ident(eval) string<delimiter(")content(def match_any(line\); )inline<delimiter(#{)ident(expr)delimiter(})>content(;end)delimiter(")> +pre_constant(ARGF)operator(.)ident(each) reserved(do) operator(|)ident(line)operator(|) + ident(print) ident(line) reserved(if) ident(match_any)operator(()ident(line)operator(\)) +reserved(end) +comment(#-----------------------------) + +comment(## building a match_all function is a trivial) +comment(## substitution of && for ||) +comment(## here is a generalized example:) +comment(#!/usr/bin/ruby -w) +comment(## grepauth - print lines that mention both foo and bar) +reserved(class) class(MultiMatch) + reserved(def) method(initialize)operator(()operator(*)ident(patterns)operator(\)) + ident(_any) operator(=) ident(build_match)operator(()string<delimiter(')content(||)delimiter(')>operator(,)ident(patterns)operator(\)) + ident(_all) operator(=) ident(build_match)operator(()string<delimiter(')content(&&)delimiter(')>operator(,)ident(patterns)operator(\)) + ident(eval) string<delimiter(")content(def match_any(line\);)inline<delimiter(#{)ident(_any)delimiter(})>content(;end)char(\\n)delimiter(")> + ident(eval) string<delimiter(")content(def match_all(line\);)inline<delimiter(#{)ident(_all)delimiter(})>content(;end)char(\\n)delimiter(")> + reserved(end) + reserved(def) method(build_match)operator(()ident(sym)operator(,)ident(args)operator(\)) + ident(args)operator(.)ident(map)operator({)operator(|)ident(e)operator(|)string<delimiter(")content(line =~ /)inline<delimiter(#{)ident(e)delimiter(})>content(/)delimiter(")>operator(})operator(.)ident(join)operator(()ident(sym)operator(\)) + reserved(end) +reserved(end) + +ident(mm) operator(=) constant(MultiMatch)operator(.)ident(new)operator(()string<delimiter(')content(foo)delimiter(')>operator(,)string<delimiter(')content(bar)delimiter(')>operator(\)) +pre_constant(ARGF)operator(.)ident(each) reserved(do) operator(|)ident(line)operator(|) + ident(print) ident(line) reserved(if) ident(mm)operator(.)ident(match_all)operator(()ident(line)operator(\)) +reserved(end) +comment(#-----------------------------) + +comment(#!/usr/bin/ruby) +comment(# popgrep4 - grep for abbreviations of places that say "pop") +comment(# version4: pretty fast, but simple: compile all re's first:) +ident(popstates) operator(=) string<delimiter(%w()content(CO ON MI WI MN)delimiter(\))> +ident(popstates) operator(=) ident(popstates)operator(.)ident(map)operator({)operator(|)ident(re)operator(|) regexp<delimiter(%r/)char(\\b)inline<delimiter(#{)ident(re)delimiter(})>char(\\b)delimiter(/)>operator(}) +pre_constant(ARGF)operator(.)ident(each) reserved(do) operator(|)ident(line)operator(|) + ident(popstates)operator(.)ident(each) reserved(do) operator(|)ident(state_re)operator(|) + reserved(if) ident(line) operator(=)operator(~) ident(state_re) + ident(print) ident(line) + reserved(break) + reserved(end) + reserved(end) +reserved(end) + +comment(## speeds trials on the jargon file(412\): 26006 lines, 1.3MB) +comment(## popgrep1 => 7.040s) +comment(## popgrep2 => 0.656s) +comment(## popgrep2.5 => 0.633s) +comment(## popgrep3 => 0.675s) +comment(## popgrep4 => 1.027s) + +comment(# unless speed is criticial, the technique in popgrep4 is a) +comment(# reasonable balance between speed and logical simplicity.) + + +comment(# @@PLEAC@@_6.11) +reserved(begin) + ident(print) string<delimiter(")content(Pattern? )delimiter(")> + ident(pat) operator(=) global_variable($stdin)operator(.)ident(gets)operator(.)ident(chomp) + constant(Regexp)operator(.)ident(new)operator(()ident(pat)operator(\)) +reserved(rescue) + ident(warn) string<delimiter(")content(Invalid Pattern)delimiter(")> + reserved(retry) +reserved(end) + + +comment(# @@PLEAC@@_6.13) +comment(# uses the 'amatch' extension found on:) +comment(# http://raa.ruby-lang.org/project/amatch/) +ident(require) string<delimiter(')content(amatch)delimiter(')> +ident(matcher) operator(=) constant(Amatch)operator(.)ident(new)operator(()string<delimiter(')content(balast)delimiter(')>operator(\)) +comment(#$relative, $distance = 0, 1) +constant(File)operator(.)ident(open)operator(()string<delimiter(')content(/usr/share/dict/words)delimiter(')>operator(\))operator(.)ident(each_line) reserved(do) operator(|)ident(line)operator(|) + ident(print) ident(line) reserved(if) ident(matcher)operator(.)ident(search)operator(()ident(line)operator(\)) operator(<=) integer(1) +reserved(end) +comment(__END__ +)comment(#CODE) +ident(ballast) +ident(ballasts) +ident(balustrade) +ident(balustrades) +ident(blast) +ident(blasted) +ident(blaster) +ident(blasters) +ident(blasting) +ident(blasts) + + +comment(# @@PLEAC@@_6.14) +ident(str)operator(.)ident(scan)operator(()regexp<delimiter(/)char(\\G)content(()char(\\d)content(\))delimiter(/)>operator(\))operator(.)ident(each) reserved(do) operator(|)ident(token)operator(|) + ident(puts) string<delimiter(")content(found )inline<delimiter(#{)ident(token)delimiter(})>delimiter(")> +reserved(end) +comment(#-----------------------------) +ident(n) operator(=) string<delimiter(")content( 49 here)delimiter(")> +ident(n)operator(.)ident(gsub!)operator(()regexp<delimiter(/)char(\\G)content( )delimiter(/)>operator(,)string<delimiter(')content(0)delimiter(')>operator(\)) +ident(puts) ident(n) +comment(#-----------------------------) +ident(str) operator(=) string<delimiter(")content(3,4,5,9,120)delimiter(")> +ident(str)operator(.)ident(scan)operator(()regexp<delimiter(/)char(\\G)content(,?()char(\\d)content(+\))delimiter(/)>operator(\))operator(.)ident(each) reserved(do) operator(|)ident(num)operator(|) + ident(puts) string<delimiter(")content(Found number: )inline<delimiter(#{)ident(num)delimiter(})>delimiter(")> +reserved(end) +comment(#-----------------------------) +comment(# Ruby doesn't have the String.pos or a /c re modifier like Perl ) +comment(# But it does have StringScanner in the standard library (strscn\)) +comment(# which allows similar functionality:) + +ident(require) string<delimiter(')content(strscan)delimiter(')> +ident(text) operator(=) string<delimiter(')content(the year 1752 lost 10 days on the 3rd of September)delimiter(')> +ident(sc) operator(=) constant(StringScanner)operator(.)ident(new)operator(()ident(text)operator(\)) +reserved(while) ident(sc)operator(.)ident(scan)operator(()regexp<delimiter(/)content(.*?()char(\\d)content(+\))delimiter(/)>operator(\)) + ident(print) string<delimiter(")content(found: )inline<delimiter(#{)ident(sc)operator([)integer(1)operator(])delimiter(})>char(\\n)delimiter(")> +reserved(end) +reserved(if) ident(sc)operator(.)ident(scan)operator(()regexp<delimiter(/)char(\\S)content(+)delimiter(/)>operator(\)) + ident(puts) string<delimiter(")content(Found )inline<delimiter(#{)ident(sc)operator([)integer(0)operator(])delimiter(})>content( after last number)delimiter(")> +reserved(end) +comment(#-----------------------------) +comment(# assuming continuing from above:) +ident(puts) string<delimiter(")content(The position in 'text' is: )inline<delimiter(#{)ident(sc)operator(.)ident(pos)delimiter(})>delimiter(")> +ident(sc)operator(.)ident(pos) operator(=) integer(30) +ident(puts) string<delimiter(")content(The position in 'text' is: )inline<delimiter(#{)ident(sc)operator(.)ident(pos)delimiter(})>delimiter(")> + + +comment(# @@PLEAC@@_6.15) +comment(#-----------------------------) +comment(# greedy pattern) +ident(str)operator(.)ident(gsub!)operator(()regexp<delimiter(/)content(<.*>)delimiter(/)modifier(m)>operator(,)string<delimiter(')delimiter(')>operator(\)) comment(# not good) + +comment(# non-greedy (minimal\) pattern) +ident(str)operator(.)ident(gsub!)operator(()regexp<delimiter(/)content(<.*?>)delimiter(/)modifier(m)>operator(,)string<delimiter(')delimiter(')>operator(\)) comment(# not great) + + +comment(#-----------------------------) +comment(#<b><i>this</i> and <i>that</i> are important</b> Oh, <b><i>me too!</i></b>) +comment(#-----------------------------) +regexp<delimiter(%r{)content( <b><i>(.*?\)</i></b> )delimiter(})modifier(mx)> +comment(#-----------------------------) +regexp<delimiter(%r/)content(BEGIN((?:(?!BEGIN\).\)*\)END)delimiter(/)> +comment(#-----------------------------) +regexp<delimiter(%r{)content( <b><i>( (?: (?!</b>|</i>\). \)* \) </i></b> )delimiter(})modifier(mx)> +comment(#-----------------------------) +regexp<delimiter(%r{)content( <b><i>( (?: (?!</[ib]>\). \)* \) </i></b> )delimiter(})modifier(mx)> +comment(#-----------------------------) +regexp<delimiter(%r{)content( + <b><i> + [^<]* # stuff not possibly bad, and not possibly the end. + (?: + # at this point, we can have '<' if not part of something bad + (?! </?[ib]> \) # what we can't have + < # okay, so match the '<' + [^<]* # and continue with more safe stuff + \) * + </i></b> + )delimiter(})modifier(mx)> + + +comment(# @@PLEAC@@_6.16) +comment(#-----------------------------) +global_variable($/) operator(=) string<delimiter(")delimiter(")> +pre_constant(ARGF)operator(.)ident(each) reserved(do) operator(|)ident(para)operator(|) + ident(para)operator(.)ident(scan) regexp<delimiter(%r/)content( + )char(\\b)content( # start at word boundary + ()char(\\S)content(+\) # find chunk of non-whitespace + )char(\\b)content( # until a word boundary + ( + )char(\\s)content(+ # followed by whitespace + )char(\\1)content( # and that same chunk again + )char(\\b)content( # and a word boundary + \) + # one or more times + )delimiter(/)modifier(xi)> reserved(do) + ident(puts) string<delimiter(")content(dup word ')inline<delimiter(#{)global_variable($1)delimiter(})>content(' at paragraph )inline<delimiter(#{)global_variable($.)delimiter(})>delimiter(")> + reserved(end) +reserved(end) +comment(#-----------------------------) +ident(astr) operator(=) string<delimiter(')content(nobody)delimiter(')> +ident(bstr) operator(=) string<delimiter(')content(bodysnatcher)delimiter(')> +reserved(if) string<delimiter(")inline<delimiter(#{)ident(astr)delimiter(})>content( )inline<delimiter(#{)ident(bstr)delimiter(})>delimiter(")> operator(=)operator(~) regexp<delimiter(/)content(^()char(\\w)content(+\)()char(\\w)content(+\) )char(\\2)content(()char(\\w)content(+\)$)delimiter(/)> + ident(print) string<delimiter(")inline<delimiter(#{)global_variable($2)delimiter(})>content( overlaps in )inline<delimiter(#{)global_variable($1)delimiter(})>content(-)inline<delimiter(#{)global_variable($2)delimiter(})>content(-)inline<delimiter(#{)global_variable($3)delimiter(})>delimiter(")> +reserved(end) +comment(#-----------------------------) +comment(#!/usr/bin/ruby -w) +comment(# prime_pattern -- find prime factors of argument using patterns) +pre_constant(ARGV) operator(<<) integer(180) +ident(cap) operator(=) string<delimiter(')content(o)delimiter(')> operator(*) pre_constant(ARGV)operator(.)ident(shift) +reserved(while) ident(cap) operator(=)operator(~) regexp<delimiter(/)content(^(oo+?\))char(\\1)content(+$)delimiter(/)> + ident(print) global_variable($1)operator(.)ident(size)operator(,) string<delimiter(")content( )delimiter(")> + ident(cap)operator(.)ident(gsub!)operator(()regexp<delimiter(/)inline<delimiter(#{)global_variable($1)delimiter(})>delimiter(/)>operator(,)string<delimiter(')content(o)delimiter(')>operator(\)) +reserved(end) +ident(puts) ident(cap)operator(.)ident(size) +comment(#-----------------------------) +comment(#diophantine) +comment(# solve for 12x + 15y + 16z = 281, maximizing x) +reserved(if) operator(()string<delimiter(')content(o)delimiter(')> operator(*) integer(281)operator(\))operator(.)ident(match)operator(()regexp<delimiter(/)content(^(o*\))char(\\1)content({11}(o*\))char(\\2)content({14}(o*\))char(\\3)content({15}$)delimiter(/)>operator(\)) + ident(x)operator(,) ident(y)operator(,) ident(z) operator(=) global_variable($1)operator(.)ident(size)operator(,) global_variable($2)operator(.)ident(size)operator(,) global_variable($3)operator(.)ident(size) + ident(puts) string<delimiter(")content(One solution is: x=)inline<delimiter(#{)ident(x)delimiter(})>content(; y=)inline<delimiter(#{)ident(y)delimiter(})>content(; z=)inline<delimiter(#{)ident(z)delimiter(})>delimiter(")> +reserved(else) + ident(puts) string<delimiter(")content(No solution.)delimiter(")> +reserved(end) +comment(# => One solution is: x=17; y=3; z=2) + +comment(#-----------------------------) +comment(# using different quantifiers:) +operator(()string<delimiter(')content(o)delimiter(')> operator(*) integer(281)operator(\))operator(.)ident(match)operator(()regexp<delimiter(/)content(^(o+\))char(\\1)content({11}(o+\))char(\\2)content({14}(o+\))char(\\3)content({15}$)delimiter(/)>operator(\)) +comment(# => One solution is: x=17; y=3; z=2) + +operator(()string<delimiter(')content(o)delimiter(')> operator(*) integer(281)operator(\))operator(.)ident(match)operator(()regexp<delimiter(/)content(^(o*?\))char(\\1)content({11}(o*\))char(\\2)content({14}(o*\))char(\\3)content({15}$)delimiter(/)>operator(\)) +comment(# => One solution is: x=0; y=7; z=11) + +operator(()string<delimiter(')content(o)delimiter(')> operator(*) integer(281)operator(\))operator(.)ident(match)operator(()regexp<delimiter(/)content(^(o+?\))char(\\1)content({11}(o*\))char(\\2)content({14}(o*\))char(\\3)content({15}$)delimiter(/)>operator(\)) +comment(# => One solution is: x=1; y=3; z=14) + + +comment(# @@PLEAC@@_6.17) +comment(# alpha OR beta) +regexp<delimiter(%r/)content(alpha|beta)delimiter(/)> + +comment(# alpha AND beta) +regexp<delimiter(%r/)content((?=.*alpha\)(?=.*beta\))delimiter(/)modifier(m)> + +comment(# alpha AND beta, no overlap) +regexp<delimiter(%r/)content(alpha.*beta|beta.*alpha)delimiter(/)modifier(m)> + +comment(# NOT beta) +regexp<delimiter(%r/)content(^(?:(?!beta\).\)*$)delimiter(/)modifier(m)> + +comment(# NOT bad BUT good) +regexp<delimiter(%r/)content((?=(?:(?!BAD\).\)*$\)GOOD)delimiter(/)modifier(m)> +comment(#-----------------------------) + +reserved(if) operator(!)operator(()ident(string) operator(=)operator(~) regexp<delimiter(/)content(pattern)delimiter(/)>operator(\)) comment(# ugly) + ident(something)operator(()operator(\)) +reserved(end) + +reserved(if) ident(string) operator(!)operator(~) regexp<delimiter(/)content(pattern)delimiter(/)> comment(# preferred) + ident(something)operator(()operator(\)) +reserved(end) + + +comment(#-----------------------------) +reserved(if) ident(string) operator(=)operator(~) regexp<delimiter(/)content(pat1)delimiter(/)> operator(&&) ident(string) operator(=)operator(~) regexp<delimiter(/)content(pat2)delimiter(/)> + ident(something)operator(()operator(\)) +reserved(end) +comment(#-----------------------------) +reserved(if) ident(string) operator(=)operator(~) regexp<delimiter(/)content(pat1)delimiter(/)> operator(||) ident(string) operator(=)operator(~) regexp<delimiter(/)content(pat2)delimiter(/)> + ident(something)operator(()operator(\)) +reserved(end) +comment(#-----------------------------) +comment(#!/usr/bin/ruby -w) +comment(# minigrep - trivial grep) +ident(pat) operator(=) pre_constant(ARGV)operator(.)ident(shift) +pre_constant(ARGF)operator(.)ident(each) reserved(do) operator(|)ident(line)operator(|) + ident(print) ident(line) reserved(if) ident(line) operator(=)operator(~) regexp<delimiter(/)inline<delimiter(#{)ident(pat)delimiter(})>delimiter(/)modifier(o)> +reserved(end) +comment(#-----------------------------) + string<delimiter(")content(labelled)delimiter(")> operator(=)operator(~) regexp<delimiter(/)content(^(?=.*bell\)(?=.*lab\))delimiter(/)modifier(m)> +comment(#-----------------------------) +global_variable($string) operator(=)operator(~) regexp<delimiter(/)content(bell)delimiter(/)> operator(&&) global_variable($string) operator(=)operator(~) regexp<delimiter(/)content(lab)delimiter(/)> +comment(#-----------------------------) +global_variable($murray_hill) operator(=) string<delimiter(")content(blah bell blah )delimiter(")> +reserved(if) global_variable($murray_hill) operator(=)operator(~) regexp<delimiter(%r{)content( + ^ # start of string + (?= # zero-width lookahead + .* # any amount of intervening stuff + bell # the desired bell string + \) # rewind, since we were only looking + (?= # and do the same thing + .* # any amount of intervening stuff + lab # and the lab part + \) + )delimiter(})modifier(mx)> comment(# /m means . can match newline) + + ident(print) string<delimiter(")content(Looks like Bell Labs might be in Murray Hill!)char(\\n)delimiter(")>operator(;) +reserved(end) +comment(#-----------------------------) +string<delimiter(")content(labelled)delimiter(")> operator(=)operator(~) regexp<delimiter(/)content((?:^.*bell.*lab\)|(?:^.*lab.*bell\))delimiter(/)> +comment(#-----------------------------) +global_variable($brand) operator(=) string<delimiter(")content(labelled)delimiter(")>operator(;) +reserved(if) global_variable($brand) operator(=)operator(~) regexp<delimiter(%r{)content( + (?: # non-capturing grouper + ^ .*? # any amount of stuff at the front + bell # look for a bell + .*? # followed by any amount of anything + lab # look for a lab + \) # end grouper + | # otherwise, try the other direction + (?: # non-capturing grouper + ^ .*? # any amount of stuff at the front + lab # look for a lab + .*? # followed by any amount of anything + bell # followed by a bell + \) # end grouper + )delimiter(})modifier(mx)> comment(# /m means . can match newline) + ident(print) string<delimiter(")content(Our brand has bell and lab separate.)char(\\n)delimiter(")>operator(;) +reserved(end) +comment(#-----------------------------) +global_variable($map) operator(=)operator(~) regexp<delimiter(/)content(^(?:(?!waldo\).\)*$)delimiter(/)modifier(s)> +comment(#-----------------------------) +global_variable($map) operator(=) string<delimiter(")content(the great baldo)delimiter(")> +reserved(if) global_variable($map) operator(=)operator(~) regexp<delimiter(%r{)content( + ^ # start of string + (?: # non-capturing grouper + (?! # look ahead negation + waldo # is he ahead of us now? + \) # is so, the negation failed + . # any character (cuzza /s\) + \) * # repeat that grouping 0 or more + $ # through the end of the string + )delimiter(})modifier(mx)> comment(# /m means . can match newline) + ident(print) string<delimiter(")content(There's no waldo here!)char(\\n)delimiter(")>operator(;) +reserved(end) +comment(=begin + 7:15am up 206 days, 13:30, 4 users, load average: 1.04, 1.07, 1.04 + +USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT + +tchrist tty1 5:16pm 36days 24:43 0.03s xinit + +tchrist tty2 5:19pm 6days 0.43s 0.43s -tcsh + +tchrist ttyp0 chthon 7:58am 3days 23.44s 0.44s -tcsh + +gnat ttyS4 coprolith 2:01pm 13:36m 0.30s 0.30s -tcsh +=end) +comment(#% w | minigrep '^(?!.*ttyp\).*tchrist') +comment(#-----------------------------) +regexp<delimiter(%r{)content( + ^ # anchored to the start + (?! # zero-width look-ahead assertion + .* # any amount of anything (faster than .*?\) + ttyp # the string you don't want to find + \) # end look-ahead negation; rewind to start + .* # any amount of anything (faster than .*?\) + tchrist # now try to find Tom +)delimiter(})modifier(x)> +comment(#-----------------------------) +comment(#% w | grep tchrist | grep -v ttyp) +comment(#-----------------------------) +comment(#% grep -i 'pattern' files) +comment(#% minigrep '(?i\)pattern' files) +comment(#-----------------------------) + + +comment(# @@PLEAC@@_6.20) +ident(ans) operator(=) global_variable($stdin)operator(.)ident(gets)operator(.)ident(chomp) +ident(re) operator(=) regexp<delimiter(%r/)content(^)inline<delimiter(#{)constant(Regexp)operator(.)ident(quote)operator(()ident(ans)operator(\))delimiter(})>delimiter(/)> +reserved(case) + reserved(when) string<delimiter(")content(SEND)delimiter(")> operator(=)operator(~) ident(re) operator(:) ident(puts) string<delimiter(")content(Action is send)delimiter(")> + reserved(when) string<delimiter(")content(STOP)delimiter(")> operator(=)operator(~) ident(re) operator(:) ident(puts) string<delimiter(")content(Action is stop)delimiter(")> + reserved(when) string<delimiter(")content(ABORT)delimiter(")> operator(=)operator(~) ident(re) operator(:) ident(puts) string<delimiter(")content(Action is abort)delimiter(")> + reserved(when) string<delimiter(")content(EDIT)delimiter(")> operator(=)operator(~) ident(re) operator(:) ident(puts) string<delimiter(")content(Action is edit)delimiter(")> +reserved(end) +comment(#-----------------------------) +ident(require) string<delimiter(')content(abbrev)delimiter(')> +ident(table) operator(=) constant(Abbrev)operator(.)ident(abbrev) string<delimiter(%w-)content(send stop abort edit)delimiter(-)> +ident(loop) reserved(do) + ident(print) string<delimiter(")content(Action: )delimiter(")> + ident(ans) operator(=) global_variable($stdin)operator(.)ident(gets)operator(.)ident(chomp) + ident(puts) string<delimiter(")content(Action for )inline<delimiter(#{)ident(ans)delimiter(})>content( is )inline<delimiter(#{)ident(table)operator([)ident(ans)operator(.)ident(downcase)operator(])delimiter(})>delimiter(")> +reserved(end) + + +comment(#-----------------------------) +comment(# dummy values are defined for 'file', 'PAGER', and) +comment(# the 'invoke_editor' and 'deliver_message' methods) +comment(# do not do anything interesting in this example.) +comment(#!/usr/bin/ruby -w) +ident(require) string<delimiter(')content(abbrev)delimiter(')> + +ident(file) operator(=) string<delimiter(')content(pleac_ruby.data)delimiter(')> +constant(PAGER) operator(=) string<delimiter(')content(less)delimiter(')> + +reserved(def) method(invoke_editor) + ident(puts) string<delimiter(")content(invoking editor)delimiter(")> +reserved(end) + +reserved(def) method(deliver_message) + ident(puts) string<delimiter(")content(delivering message)delimiter(")> +reserved(end) + +ident(actions) operator(=) operator({) + string<delimiter(')content(edit)delimiter(')> operator(=)operator(>) pre_constant(self)operator(.)ident(method)operator(()symbol(:invoke_editor)operator(\))operator(,) + string<delimiter(')content(send)delimiter(')> operator(=)operator(>) pre_constant(self)operator(.)ident(method)operator(()symbol(:deliver_message)operator(\))operator(,) + string<delimiter(')content(list)delimiter(')> operator(=)operator(>) ident(proc) operator({)ident(system)operator(()constant(PAGER)operator(,) ident(file)operator(\))operator(})operator(,) + string<delimiter(')content(abort)delimiter(')> operator(=)operator(>) ident(proc) operator({)ident(puts) string<delimiter(")content(See ya!)delimiter(")>operator(;) ident(exit)operator(})operator(,) + string<delimiter(")delimiter(")> operator(=)operator(>) ident(proc) operator({)ident(puts) string<delimiter(")content(Unknown Command)delimiter(")>operator(}) +operator(}) + +ident(dtable) operator(=) constant(Abbrev)operator(.)ident(abbrev)operator(()ident(actions)operator(.)ident(keys)operator(\)) +ident(loop) reserved(do) + ident(print) string<delimiter(")content(Action: )delimiter(")> + ident(ans) operator(=) global_variable($stdin)operator(.)ident(gets)operator(.)ident(chomp)operator(.)ident(delete)operator(()string<delimiter(")content( )char(\\t)delimiter(")>operator(\)) + ident(actions)operator([) ident(dtable)operator([)ident(ans)operator(.)ident(downcase)operator(]) operator(||) string<delimiter(")delimiter(")> operator(])operator(.)ident(call) +reserved(end) + + +comment(# @@PLEAC@@_6.19) +comment(#-----------------------------) +comment(# basically, the Perl Cookbook categorizes this as an) +comment(# unsolvable problem ...) +comment(#-----------------------------) +integer(1) reserved(while) ident(addr)operator(.)ident(gsub!)operator(()regexp<delimiter(/)char(\\()content([^(\)]*)char(\\\))delimiter(/)>operator(,)string<delimiter(')delimiter(')>operator(\)) +comment(#-----------------------------) +constant(Dear) ident(someuser)instance_variable(@host)operator(.)ident(com)operator(,) + +constant(Please) ident(confirm) ident(the) ident(mail) ident(address) ident(you) ident(gave) ident(us) constant(Wed) constant(May) integer(6) integer(09)operator(:)integer(38)operator(:)integer(41) +constant(MDT) integer(1998) ident(by) ident(replying) ident(to) ident(this) ident(message)operator(.) constant(Include) ident(the) ident(string) +string<delimiter(")content(Rumpelstiltskin)delimiter(")> reserved(in) ident(that) ident(reply)operator(,) ident(but) ident(spelled) reserved(in) ident(reverse)operator(;) ident(that) ident(is)operator(,) +ident(start) ident(with) string<delimiter(")content(Nik...)delimiter(")>operator(.) constant(Once) ident(this) ident(is) ident(done)operator(,) ident(your) ident(confirmed) ident(address) ident(will) +ident(be) ident(entered) ident(into) ident(our) ident(records)operator(.) + + +comment(# @@PLEAC@@_6.21) +comment(#-----------------------------) +comment(#% gunzip -c ~/mail/archive.gz | urlify > archive.urlified) +comment(#-----------------------------) +comment(#% urlify ~/mail/*.inbox > ~/allmail.urlified) +comment(#-----------------------------) +comment(#!/usr/bin/ruby -w) +comment(# urlify - wrap HTML links around URL-like constructs) + +ident(urls) operator(=) string<delimiter(')content((https?|telnet|gopher|file|wais|ftp\))delimiter(')>operator(;) +ident(ltrs) operator(=) string<delimiter(')content(\\w)delimiter(')>operator(;) +ident(gunk) operator(=) string<delimiter(')content(/#~:.?+=&%@!)content(\\-)delimiter(')>operator(;) +ident(punc) operator(=) string<delimiter(')content(.:?)content(\\-)delimiter(')>operator(;) +ident(any) operator(=) string<delimiter(")inline<delimiter(#{)ident(ltrs)delimiter(})>inline<delimiter(#{)ident(gunk)delimiter(})>inline<delimiter(#{)ident(punc)delimiter(})>delimiter(")>operator(;) + +pre_constant(ARGF)operator(.)ident(each) reserved(do) operator(|)ident(line)operator(|) + ident(line)operator(.)ident(gsub!) regexp<delimiter(%r/)content( + )char(\\b)content( # start at word boundary + ( # begin $1 { + )inline<delimiter(#{)ident(urls)delimiter(})>content( : # need resource and a colon + [)inline<delimiter(#{)ident(any)delimiter(})>content(] +? # followed by on or more + # of any valid character, but + # be conservative and take only + # what you need to.... + \) # end $1 } + (?= # look-ahead non-consumptive assertion + [)inline<delimiter(#{)ident(punc)delimiter(})>content(]* # either 0 or more punctuation + [^)inline<delimiter(#{)ident(any)delimiter(})>content(] # followed by a non-url char + | # or else + $ # then end of the string + \) + )delimiter(/)modifier(iox)> reserved(do) + string<delimiter(%Q|)content(<A HREF=")inline<delimiter(#{)global_variable($1)delimiter(})>content(">)inline<delimiter(#{)global_variable($1)delimiter(})>content(</A>)delimiter(|)> + reserved(end) + ident(print) ident(line) +reserved(end) + + +comment(# @@PLEAC@@_6.23) +regexp<delimiter(%r/)content(^m*(d?c{0,3}|c[dm]\)(l?x{0,3}|x[lc]\)(v?i{0,3}|i[vx]\)$)delimiter(/)modifier(i)> +comment(#-----------------------------) +ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(/)content(()char(\\S)content(+\)()char(\\s)content(+\)()char(\\S)content(+\))delimiter(/)>operator(,) string<delimiter(')content(\\3)content(\\2)content(\\1)delimiter(')>operator(\)) +comment(#-----------------------------) +regexp<delimiter(%r/)content(()char(\\w)content(+\))char(\\s)content(*=)char(\\s)content(*(.*\))char(\\s)content(*$)delimiter(/)> comment(# keyword is $1, value is $2) +comment(#-----------------------------) +regexp<delimiter(%r/)content(.{80,})delimiter(/)> +comment(#-----------------------------) +regexp<delimiter(%r|)content(()char(\\d)content(+\)/()char(\\d)content(+\)/()char(\\d)content(+\) ()char(\\d)content(+\):()char(\\d)content(+\):()char(\\d)content(+\))delimiter(|)> +comment(#-----------------------------) +ident(str)operator(.)ident(gsub!)operator(()regexp<delimiter(%r|)content(/usr/bin)delimiter(|)>operator(,)string<delimiter(')content(/usr/local/bin)delimiter(')>operator(\)) +comment(#-----------------------------) +ident(str)operator(.)ident(gsub!)operator(()regexp<delimiter(/)content(%([0-9A-Fa-f][0-9A-Fa-f]\))delimiter(/)>operator(\))operator({) global_variable($1)operator(.)ident(hex)operator(.)ident(chr) operator(}) +comment(#-----------------------------) +ident(str)operator(.)ident(gsub!)operator(()regexp<delimiter(%r{)content( + /)char(\\*)content( # Match the opening delimiter + .*? # Match a minimal number of characters + )char(\\*)content(/ # Match the closing delimiter +)delimiter(})modifier(xm)>operator(,)string<delimiter(')delimiter(')>operator(\)) +comment(#-----------------------------) +ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(/)content(^)char(\\s)content(+)delimiter(/)>operator(,) string<delimiter(')delimiter(')>operator(\)) +ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(/)char(\\s)content(+$)delimiter(/)>operator(,) string<delimiter(')delimiter(')>operator(\)) + +comment(# but really, in Ruby we'd just do:) +ident(str)operator(.)ident(strip!) +comment(#-----------------------------) +ident(str)operator(.)ident(gsub!)operator(()regexp<delimiter(/)char(\\\\)content(n)delimiter(/)>operator(,)string<delimiter(")char(\\n)delimiter(")>operator(\)) +comment(#-----------------------------) +ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(/)content(^.*::)delimiter(/)>operator(,) string<delimiter(')delimiter(')>operator(\)) +comment(#-----------------------------) +regexp<delimiter(%r/)content(^([01]?)char(\\d)char(\\d)content(|2[0-4])char(\\d)content(|25[0-5]\))char(\\.)content(([01]?)char(\\d)char(\\d)content(|2[0-4])char(\\d)content(|25[0-5]\))char(\\.)content( + ([01]?)char(\\d)char(\\d)content(|2[0-4])char(\\d)content(|25[0-5]\))char(\\.)content(([01]?)char(\\d)char(\\d)content(|2[0-4])char(\\d)content(|25[0-5]\)$)delimiter(/)modifier(x)> +comment(#-----------------------------) +ident(str)operator(.)ident(sub!)operator(()regexp<delimiter(%r|)content(^.*/)delimiter(|)>operator(,) string<delimiter(')delimiter(')>operator(\)) +comment(#-----------------------------) +ident(cols) operator(=) operator(() operator(()constant(ENV)operator([)string<delimiter(')content(TERMCAP)delimiter(')>operator(]) operator(||) string<delimiter(")content( )delimiter(")>operator(\)) operator(=)operator(~) regexp<delimiter(/)content(:co#()char(\\d)content(+\):)delimiter(/)> operator(\)) operator(?) global_variable($1) operator(:) integer(80)operator(;) +comment(#-----------------------------) +ident(name) operator(=) string<delimiter(")content( )inline<delimiter(#{)global_variable($0)delimiter(})>content( )inline<delimiter(#{)pre_constant(ARGV)delimiter(})>delimiter(")>operator(.)ident(gsub)operator(()regexp<delimiter(%r|)content( /)char(\\S)content(+/)delimiter(|)>operator(,) string<delimiter(')content( )delimiter(')>operator(\)) +comment(#-----------------------------) +ident(require) string<delimiter(')content(rbconfig)delimiter(')> +ident(include) constant(Config) +ident(raise) string<delimiter(")content(This isn't Linux)delimiter(")> reserved(unless) constant(CONFIG)operator([)string<delimiter(')content(target_os)delimiter(')>operator(]) operator(=)operator(~) regexp<delimiter(/)content(linux)delimiter(/)modifier(i)>operator(;) +comment(#-----------------------------) +ident(str)operator(.)ident(gsub!)operator(()regexp<delimiter(%r/)char(\\n)char(\\s)content(+)delimiter(/)>operator(,) string<delimiter(')content( )delimiter(')>operator(\)) +comment(#-----------------------------) +ident(nums) operator(=) ident(str)operator(.)ident(scan)operator(()regexp<delimiter(/)content(()char(\\d)content(+)char(\\.)content(?)char(\\d)content(*|)char(\\.)char(\\d)content(+\))delimiter(/)>operator(\)) +comment(#-----------------------------) +ident(capwords) operator(=) ident(str)operator(.)ident(scan)operator(()regexp<delimiter(%r/)content(()char(\\b)content([^)char(\\W)content(a-z0-9_]+)char(\\b)content(\))delimiter(/)>operator(\)) +comment(#-----------------------------) +ident(lowords) operator(=) ident(str)operator(.)ident(scan)operator(()regexp<delimiter(%r/)content(()char(\\b)content([^)char(\\W)content(A-Z0-9_]+)char(\\b)content(\))delimiter(/)>operator(\)) +comment(#-----------------------------) +ident(icwords) operator(=) ident(str)operator(.)ident(scan)operator(()regexp<delimiter(%r/)content(()char(\\b)content([^)char(\\W)content(a-z0-9_][^)char(\\W)content(A-Z0-9_]*)char(\\b)content(\))delimiter(/)>operator(\)) +comment(#-----------------------------) +ident(links) operator(=) ident(str)operator(.)ident(scan)operator(()regexp<delimiter(%r/)content(<A[^>]+?HREF)char(\\s)content(*=)char(\\s)content(*["']?([^'" >]+?\)[ '"]?>)delimiter(/)modifier(mi)>operator(\)) +comment(#-----------------------------) +ident(initial) operator(=) ident(str) operator(=)operator(~) regexp<delimiter(/)content(^)char(\\S)content(+)char(\\s)content(+()char(\\S)content(\))char(\\S)content(*)char(\\s)content(+)char(\\S)delimiter(/)> operator(?) global_variable($1) operator(:) string<delimiter(")delimiter(")> +comment(#-----------------------------) +ident(str)operator(.)ident(gsub!)operator(()regexp<delimiter(%r/)content("([^"]*\)")delimiter(/)>operator(,) string<delimiter(%q-)content(``)content(\\1)content('')delimiter(-)>operator(\)) +comment(#-----------------------------) + +global_variable($/) operator(=) string<delimiter(")delimiter(")> +ident(sentences) operator(=) operator([)operator(]) +pre_constant(ARGF)operator(.)ident(each) reserved(do) operator(|)ident(para)operator(|) + ident(para)operator(.)ident(gsub!)operator(()regexp<delimiter(/)char(\\n)delimiter(/)>operator(,) string<delimiter(')content( )delimiter(')>operator(\)) + ident(para)operator(.)ident(gsub!)operator(()regexp<delimiter(/)content( {3,})delimiter(/)>operator(,)string<delimiter(')content( )delimiter(')>operator(\)) + ident(sentences) operator(<<) ident(para)operator(.)ident(scan)operator(()regexp<delimiter(/)content(()char(\\S)content(.*?[!?.]\)(?= |)char(\\Z)content(\))delimiter(/)>operator(\)) +reserved(end) + +comment(#-----------------------------) +regexp<delimiter(%r/)content(()char(\\d)content({4}\)-()char(\\d)char(\\d)content(\)-()char(\\d)char(\\d)content(\))delimiter(/)> comment(# YYYY in $1, MM in $2, DD in $3) +comment(#-----------------------------) +regexp<delimiter(%r/)content( ^ + (?: + 1 )char(\\s)content( (?: )char(\\d)char(\\d)char(\\d)content( )char(\\s)content(\)? # 1, or 1 and area code + | # ... or ... + )char(\\()char(\\d)char(\\d)char(\\d)char(\\\))content( )char(\\s)content( # area code with parens + | # ... or ... + (?: )char(\\+)char(\\d)char(\\d)content(?)char(\\d)content(? )char(\\s)content(\)? # optional +country code + )char(\\d)char(\\d)char(\\d)content( ([)char(\\s)char(\\-)content(]\) # and area code + \) + )char(\\d)char(\\d)char(\\d)content( ()char(\\s)content(|)char(\\1)content(\) # prefix (and area code separator\) + )char(\\d)char(\\d)char(\\d)char(\\d)content( # exchange + $ + )delimiter(/)modifier(x)> +comment(#-----------------------------) +regexp<delimiter(%r/)char(\\b)content(oh)char(\\s)content(+my)char(\\s)content(+gh?o(d(dess(es\)?|s?\)|odness|sh\))char(\\b)delimiter(/)modifier(i)> +comment(#-----------------------------) +ident(lines) operator(=) operator([)operator(]) +ident(lines) operator(<<) global_variable($1) reserved(while) ident(input)operator(.)ident(sub!)operator(()regexp<delimiter(/)content(^([^)char(\\012)char(\\015)content(]*\)()char(\\012)char(\\015)content(?|)char(\\015)char(\\012)content(?\))delimiter(/)>operator(,)string<delimiter(')delimiter(')>operator(\)) + + +comment(# @@PLEAC@@_7.0) +comment(# An IO object being Enumerable, we can use 'each' directly on it) +constant(File)operator(.)ident(open)operator(()string<delimiter(")content(/usr/local/widgets/data)delimiter(")>operator(\))operator(.)ident(each) operator({) operator(|)ident(line)operator(|) + ident(puts) ident(line) reserved(if) ident(line) operator(=)operator(~) regexp<delimiter(/)content(blue)delimiter(/)> +operator(}) + +ident(logfile) operator(=) constant(File)operator(.)ident(new)operator(()string<delimiter(")content(/var/log/rubylog.txt)delimiter(")>operator(,) string<delimiter(")content(w)delimiter(")>operator(\)) +ident(mysub)operator(()global_variable($stdin)operator(,) ident(logfile)operator(\)) + +comment(# The method IO#readline is similar to IO#gets) +comment(# but throws an exception when it reaches EOF) +ident(f) operator(=) constant(File)operator(.)ident(new)operator(()string<delimiter(")content(bla.txt)delimiter(")>operator(\)) +reserved(begin) + reserved(while) operator(()ident(line) operator(=) ident(f)operator(.)ident(readline)operator(\)) + ident(line)operator(.)ident(chomp) + global_variable($stdout)operator(.)ident(print) ident(line) reserved(if) ident(line) operator(=)operator(~) regexp<delimiter(/)content(blue)delimiter(/)> + reserved(end) +reserved(rescue) constant(EOFError) + ident(f)operator(.)ident(close) +reserved(end) + +reserved(while) global_variable($stdin)operator(.)ident(gets) comment(# reads from STDIN) + reserved(unless) operator(()regexp<delimiter(/)char(\\d)delimiter(/)>operator(\)) + global_variable($stderr)operator(.)ident(puts) string<delimiter(")content(No digit found.)delimiter(")> comment(# writes to STDERR) + reserved(end) + ident(puts) string<delimiter(")content(Read: )inline<delimiter(#{)global_variable($_)delimiter(})>delimiter(")> comment(# writes to STDOUT) +reserved(end) + +ident(logfile) operator(=) constant(File)operator(.)ident(new)operator(()string<delimiter(")content(/tmp/log)delimiter(")>operator(,) string<delimiter(")content(w)delimiter(")>operator(\)) + +ident(logfile)operator(.)ident(close) + +comment(# $defout (or its synonym '$>'\) is the destination of output) +comment(# for Kernel#print, Kernel#puts, and family functions) +ident(logfile) operator(=) constant(File)operator(.)ident(new)operator(()string<delimiter(")content(log.txt)delimiter(")>operator(,) string<delimiter(")content(w)delimiter(")>operator(\)) +ident(old) operator(=) global_variable($defout) +global_variable($defout) operator(=) ident(logfile) comment(# switch to logfile for output) +ident(puts) string<delimiter(")content(Countdown initiated ...)delimiter(")> +global_variable($defout) operator(=) ident(old) comment(# return to original output) +ident(puts) string<delimiter(")content(You have 30 seconds to reach minimum safety distance.)delimiter(")> + + +comment(# @@PLEAC@@_7.1) +ident(source) operator(=) constant(File)operator(.)ident(new)operator(()ident(path)operator(,) string<delimiter(")content(r)delimiter(")>operator(\)) comment(# open file "path" for reading only) +ident(sink) operator(=) constant(File)operator(.)ident(new)operator(()ident(path)operator(,) string<delimiter(")content(w)delimiter(")>operator(\)) comment(# open file "path" for writing only) + +ident(source) operator(=) constant(File)operator(.)ident(open)operator(()ident(path)operator(,) constant(File)operator(::)constant(RDONLY)operator(\)) comment(# open file "path" for reading only) +ident(sink) operator(=) constant(File)operator(.)ident(open)operator(()ident(path)operator(,) constant(File)operator(::)constant(WRONLY)operator(\)) comment(# open file "path" for writing only) + +ident(file) operator(=) constant(File)operator(.)ident(open)operator(()ident(path)operator(,) string<delimiter(")content(r+)delimiter(")>operator(\)) comment(# open "path" for reading and writing) +ident(file) operator(=) constant(File)operator(.)ident(open)operator(()ident(path)operator(,) ident(flags)operator(\)) comment(# open "path" with the flags "flags" (see examples below for flags\)) + +comment(# open file "path" read only) +ident(file) operator(=) constant(File)operator(.)ident(open)operator(()ident(path)operator(,) string<delimiter(")content(r)delimiter(")>operator(\)) +ident(file) operator(=) constant(File)operator(.)ident(open)operator(()ident(path)operator(,) constant(File)operator(::)constant(RDONLY)operator(\)) + +comment(# open file "path" write only, create it if it does not exist) +comment(# truncate it to zero length if it exists) +ident(file) operator(=) constant(File)operator(.)ident(open)operator(()ident(path)operator(,) string<delimiter(")content(w)delimiter(")>operator(\)) +ident(file) operator(=) constant(File)operator(.)ident(open)operator(()ident(path)operator(,) constant(File)operator(::)constant(WRONLY)operator(|)constant(File)operator(::)constant(TRUNC)operator(|)constant(File)operator(::)constant(CREAT)operator(\)) +ident(file) operator(=) constant(File)operator(.)ident(open)operator(()ident(path)operator(,) constant(File)operator(::)constant(WRONLY)operator(|)constant(File)operator(::)constant(TRUNC)operator(|)constant(File)operator(::)constant(CREAT)operator(,) integer(0666)operator(\)) comment(# with permission 0666) + +comment(# open file "path" write only, fails if file exists) +ident(file) operator(=) constant(File)operator(.)ident(open)operator(()ident(path)operator(,) constant(File)operator(::)constant(WRONLY)operator(|)constant(File)operator(::)constant(EXCL)operator(|)constant(File)operator(::)constant(CREAT)operator(\)) +ident(file) operator(=) constant(File)operator(.)ident(open)operator(()ident(path)operator(,) constant(File)operator(::)constant(WRONLY)operator(|)constant(File)operator(::)constant(EXCL)operator(|)constant(File)operator(::)constant(CREAT)operator(,) integer(0666)operator(\)) + +comment(# open file "path" for appending) +ident(file) operator(=) constant(File)operator(.)ident(open)operator(()ident(path)operator(,) string<delimiter(")content(a)delimiter(")>operator(\)) +ident(file) operator(=) constant(File)operator(.)ident(open)operator(()ident(path)operator(,) constant(File)operator(::)constant(WRONLY)operator(|)constant(File)operator(::)constant(APPEND)operator(|)constant(File)operator(::)constant(CREAT)operator(\)) +ident(file) operator(=) constant(File)operator(.)ident(open)operator(()ident(path)operator(,) constant(File)operator(::)constant(WRONLY)operator(|)constant(File)operator(::)constant(APPEND)operator(|)constant(File)operator(::)constant(CREAT)operator(,) integer(0666)operator(\)) + +comment(# open file "path" for appending only when file exists) +ident(file) operator(=) constant(File)operator(.)ident(open)operator(()ident(path)operator(,) constant(File)operator(::)constant(WRONLY)operator(|)constant(File)operator(::)constant(APPEND)operator(\)) + +comment(# open file "path" for reading and writing) +ident(file) operator(=) constant(File)operator(.)ident(open)operator(()ident(path)operator(,) string<delimiter(")content(r+)delimiter(")>operator(\)) +ident(file) operator(=) constant(File)operator(.)ident(open)operator(()ident(path)operator(,) constant(File)operator(::)constant(RDWR)operator(\)) + +comment(# open file for reading and writing, create a new file if it does not exist) +ident(file) operator(=) constant(File)operator(.)ident(open)operator(()ident(path)operator(,) constant(File)operator(::)constant(RDWR)operator(|)constant(File)operator(::)constant(CREAT)operator(\)) +ident(file) operator(=) constant(File)operator(.)ident(open)operator(()ident(path)operator(,) constant(File)operator(::)constant(RDWR)operator(|)constant(File)operator(::)constant(CREAT)operator(,) integer(0600)operator(\)) + +comment(# open file "path" reading and writing, fails if file exists) +ident(file) operator(=) constant(File)operator(.)ident(open)operator(()ident(path)operator(,) constant(File)operator(::)constant(RDWR)operator(|)constant(File)operator(::)constant(EXCL)operator(|)constant(File)operator(::)constant(CREAT)operator(\)) +ident(file) operator(=) constant(File)operator(.)ident(open)operator(()ident(path)operator(,) constant(File)operator(::)constant(RDWR)operator(|)constant(File)operator(::)constant(EXCL)operator(|)constant(File)operator(::)constant(CREAT)operator(,) integer(0600)operator(\)) + + +comment(# @@PLEAC@@_7.2) +comment(# No problem with Ruby since the filename doesn't contain characters with) +comment(# special meaning; like Perl's sysopen) +constant(File)operator(.)ident(open)operator(()ident(filename)operator(,) string<delimiter(')content(r)delimiter(')>operator(\)) + + +comment(# @@PLEAC@@_7.3) +constant(File)operator(.)ident(expand_path)operator(()string<delimiter(')content(~root/tmp)delimiter(')>operator(\)) +comment(#=> "/root/tmp") +constant(File)operator(.)ident(expand_path)operator(()string<delimiter(')content(~rpcuser)delimiter(')>operator(\)) +comment(#=> "/var/lib/nfs") + +comment(# To expand ~/.. it explicitely needs the environment variable HOME) +constant(File)operator(.)ident(expand_path)operator(()string<delimiter(')content(~/tmp)delimiter(')>operator(\)) +comment(#=> "/home/gc/tmp") + + +comment(# @@PLEAC@@_7.4) +comment(# The exception raised in Ruby reports the filename) +constant(File)operator(.)ident(open)operator(()string<delimiter(')content(afile)delimiter(')>operator(\)) + + +comment(# @@PLEAC@@_7.5) +comment(# Standard Ruby distribution provides the following useful extension) +ident(require) string<delimiter(')content(tempfile)delimiter(')> +comment(# With the Tempfile class, the file is automatically deleted on garbage) +comment(# collection, so you won't need to remove it, later on.) +ident(tf) operator(=) constant(Tempfile)operator(.)ident(new)operator(()string<delimiter(')content(tmp)delimiter(')>operator(\)) comment(# a name is required to create the filename) + +comment(# If you need to pass the filename to an external program you can use) +comment(# File#path, but don't forget to File#flush in order to flush anything) +comment(# living in some buffer somewhere.) +ident(tf)operator(.)ident(flush) +ident(system)operator(()string<delimiter(")content(/usr/bin/dowhatever )inline<delimiter(#{)ident(tf)operator(.)ident(path)delimiter(})>delimiter(")>operator(\)) + +ident(fh) operator(=) constant(Tempfile)operator(.)ident(new)operator(()string<delimiter(')content(tmp)delimiter(')>operator(\)) +ident(fh)operator(.)ident(sync) operator(=) pre_constant(true) comment(# autoflushes) +integer(10)operator(.)ident(times) operator({) operator(|)ident(i)operator(|) ident(fh)operator(.)ident(puts) ident(i) operator(}) +ident(fh)operator(.)ident(rewind) +ident(puts) string<delimiter(')content(Tmp file has: )delimiter(')>operator(,) ident(fh)operator(.)ident(readlines) + + +comment(# @@PLEAC@@_7.6) +reserved(while) operator(()pre_constant(DATA)operator(.)ident(gets)operator(\)) reserved(do) + comment(# process the line ) +reserved(end) +comment(__END__ +# your data goes here +# __DATA__ doesn't exist in Ruby + +)comment(#CODE) +comment(# get info about the script (size, date of last modification\)) +ident(kilosize) operator(=) pre_constant(DATA)operator(.)ident(stat)operator(.)ident(size) operator(/) integer(1024) +ident(last_modif) operator(=) pre_constant(DATA)operator(.)ident(stat)operator(.)ident(mtime) +ident(puts) string<delimiter(")content(<P>Script size is )inline<delimiter(#{)ident(kilosize)delimiter(})>delimiter(")> +ident(puts) string<delimiter(")content(<P>Last script update: )inline<delimiter(#{)ident(last_modif)delimiter(})>delimiter(")> +comment(__END__ +# DO NOT REMOVE THE PRECEEDING LINE. +# Everything else in this file will be ignored. +)comment(#CODE) + + +comment(# @@PLEAC@@_7.7) +reserved(while) ident(line) operator(=) ident(gets) reserved(do) + comment(# do something with line.) +reserved(end) + +comment(# or ) +reserved(while) ident(gets) reserved(do) + comment(# do something with $_) +reserved(end) + +comment(# or more rubyish) +global_variable($stdin)operator(.)ident(each) reserved(do) operator(|)ident(line)operator(|) + comment(# do stuff with line) +reserved(end) + + +comment(# ARGF may makes this more easy) +comment(# this is skipped if ARGV.size==0) +pre_constant(ARGV)operator(.)ident(each) reserved(do) operator(|)ident(filename)operator(|) + comment(# closing and exception handling are done by the block) + ident(open)operator(()ident(filename)operator(\)) reserved(do) operator(|)ident(fd)operator(|) + ident(fd)operator(.)ident(each) reserved(do) operator(|)ident(line)operator(|) + comment(# do stuff with line) + reserved(end) + reserved(end) reserved(rescue) ident(abort)operator(()string<delimiter(")content(can't open %s)delimiter(")> operator(%) ident(filename)operator(\)) +reserved(end) + +comment(# globbing is done in the Dir module) +pre_constant(ARGV) operator(=) constant(Dir)operator([)string<delimiter(")content(*.[Cch])delimiter(")>operator(]) reserved(if) pre_constant(ARGV)operator(.)ident(empty?) + +comment(# note: optparse is the preferred way to handle this) +reserved(if) operator(()pre_constant(ARGV)operator([)integer(0)operator(]) operator(==) string<delimiter(')content(-c)delimiter(')>operator(\)) + ident(chop_first) operator(+=) integer(1) + pre_constant(ARGV)operator(.)ident(shift) +reserved(end) + + +comment(# processing numerical options) +reserved(if) pre_constant(ARGV)operator([)integer(0)operator(]) operator(=)operator(~) regexp<delimiter(/)content(^-()char(\\d)content(+\)$)delimiter(/)> + ident(columns) operator(=) global_variable($1) + pre_constant(ARGV)operator(.)ident(shift) +reserved(end) + +comment(# again, better to use optparse:) +ident(require) string<delimiter(')content(optparse)delimiter(')> +ident(nostdout) operator(=) integer(0) +ident(append) operator(=) integer(0) +ident(unbuffer) operator(=) integer(0) +ident(ignore_ints) operator(=) integer(0) +pre_constant(ARGV)operator(.)ident(options) reserved(do) operator(|)ident(opt)operator(|) + ident(opt)operator(.)ident(on)operator(()string<delimiter(')content(-n)delimiter(')>operator(\)) operator({) ident(nostdout) operator(+=)integer(1) operator(}) + ident(opt)operator(.)ident(on)operator(()string<delimiter(')content(-a)delimiter(')>operator(\)) operator({) ident(append) operator(+=)integer(1) operator(}) + ident(opt)operator(.)ident(on)operator(()string<delimiter(')content(-u)delimiter(')>operator(\)) operator({) ident(unbuffer) operator(+=)integer(1) operator(}) + ident(opt)operator(.)ident(on)operator(()string<delimiter(')content(-i)delimiter(')>operator(\)) operator({) ident(ignore_ints) operator(+=)integer(1) operator(}) + ident(opt)operator(.)ident(parse!) +reserved(end) reserved(or) ident(abort)operator(()string<delimiter(")content(usage: )delimiter(")> operator(+) pre_constant(__FILE__) operator(+) string<delimiter(")content( [-ainu] [filenames])delimiter(")>operator(\)) + +comment(# no need to do undef $/, we have File.read) +ident(str) operator(=) constant(File)operator(.)ident(read)operator(()pre_constant(ARGV)operator([)integer(0)operator(])operator(\)) + +comment(# again we have File.read) +ident(str) operator(=) constant(File)operator(.)ident(read)operator(()pre_constant(ARGV)operator([)integer(0)operator(])operator(\)) + +comment(# not sure what this should do:) +comment(# I believe open the file, print filename, lineno and line:) +pre_constant(ARGF)operator(.)ident(each_with_index) reserved(do) operator(|)ident(line)operator(,) ident(idx)operator(|) + ident(print) pre_constant(ARGF)operator(.)ident(filename)operator(,) string<delimiter(")content(:)delimiter(")>operator(,) ident(idx)operator(,) string<delimiter(")content(;)delimiter(")>operator(,) ident(line) +reserved(end) + +comment(# print all the lines in every file passed via command line that contains login) +pre_constant(ARGF)operator(.)ident(each) reserved(do) operator(|)ident(line)operator(|) + ident(puts) ident(line) reserved(if) ident(line) operator(=)operator(~) regexp<delimiter(/)content(login)delimiter(/)> +reserved(end) +comment(#) +comment(# even this would fit) +comment(#%ruby -ne "print if /f/" 2.log) +comment(#) + +pre_constant(ARGF)operator(.)ident(each) operator({) operator(|)ident(l)operator(|) ident(puts) ident(l)operator(.)ident(downcase!) operator(}) + +comment(#------------------) +comment(#!/usr/bin/ruby -p) +comment(# just like perl's -p) +global_variable($_)operator(.)ident(downcase!) +comment(#) + +comment(# I don't know who should I trust. ) +comment(# perl's version splits on \\w+ while python's on \\w.) + +ident(chunks) operator(=) integer(0) + +constant(File)operator(.)ident(read)operator(()pre_constant(ARGV)operator([)integer(0)operator(])operator(\))operator(.)ident(split)operator(.)ident(each) reserved(do) operator(|)ident(word)operator(|) + reserved(next) reserved(if) ident(word) operator(=)operator(~) regexp<delimiter(/)content(^#)delimiter(/)> + reserved(break) reserved(if) operator([)string<delimiter(")content(__DATA__)delimiter(")>operator(,) string<delimiter(")content(__END__)delimiter(")>operator(])operator(.)ident(member?) ident(word) + ident(chunks) operator(+=) integer(1) +reserved(end) + +ident(print) string<delimiter(")content(Found )delimiter(")>operator(,) ident(chunks)operator(,) string<delimiter(")content( chunks)char(\\n)delimiter(")> + + +comment(# @@PLEAC@@_7.8) +ident(old) operator(=) constant(File)operator(.)ident(open)operator(()ident(old_file)operator(\)) +ident(new) operator(=) constant(File)operator(.)ident(open)operator(()ident(new_file)operator(,) string<delimiter(")content(w)delimiter(")>operator(\)) +reserved(while) ident(old)operator(.)ident(gets) reserved(do) + comment(# change $_, then...) + ident(new)operator(.)ident(print) global_variable($_) +reserved(end) +ident(old)operator(.)ident(close) +ident(new)operator(.)ident(close) +constant(File)operator(.)ident(rename)operator(()ident(old_file)operator(,) string<delimiter(")content(old.orig)delimiter(")>operator(\)) +constant(File)operator(.)ident(rename)operator(()ident(new_file)operator(,) ident(old_file)operator(\)) + +reserved(while) ident(old)operator(.)ident(gets) reserved(do) + reserved(if) global_variable($.) operator(==) integer(20) reserved(then) comment(# we are at the 20th line) + ident(new)operator(.)ident(puts) string<delimiter(")content(Extra line 1)delimiter(")> + ident(new)operator(.)ident(puts) string<delimiter(")content(Extra line 2)delimiter(")> + reserved(end) + ident(new)operator(.)ident(print) global_variable($_) +reserved(end) + +reserved(while) ident(old)operator(.)ident(gets) reserved(do) + reserved(next) reserved(if) integer(20)operator(..)integer(30) comment(# skip the 20th line to the 30th) + comment(# Ruby (and Perl\) permit to write if 20..30 ) + comment(# instead of if (20 <= $.\) and ($. <= 30\)) + ident(new)operator(.)ident(print) global_variable($_) +reserved(end) + + +comment(# @@PLEAC@@_7.9) +comment(#% ruby -i.orig -pe 'FILTER COMMAND' file1 file2 file3 ...) +comment(#) +comment(#-----------------------------) +comment(##!/usr/bin/ruby -i.orig -p) +comment(# filter commands go here) +comment(#-----------------------------) + +comment(#% ruby -pi.orig -e 'gsub!(/DATE/\){Time.now\)') + +comment(# effectively becomes:) +pre_constant(ARGV) operator(<<) string<delimiter(')content(I)delimiter(')> +ident(oldfile) operator(=) string<delimiter(")delimiter(")> +reserved(while) ident(gets) + reserved(if) pre_constant(ARGF)operator(.)ident(filename) operator(!=) ident(oldfile) + ident(newfile) operator(=) pre_constant(ARGF)operator(.)ident(filename) + constant(File)operator(.)ident(rename)operator(()ident(newfile)operator(,) ident(newfile) operator(+) string<delimiter(")content(.orig)delimiter(")>operator(\)) + global_variable($stdout) operator(=) constant(File)operator(.)ident(open)operator(()ident(newfile)operator(,)string<delimiter(')content(w)delimiter(')>operator(\)) + ident(oldfile) operator(=) ident(newfile) + reserved(end) + ident(gsub!)operator(()regexp<delimiter(/)content(DATE)delimiter(/)>operator(\))operator({)constant(Time)operator(.)ident(now)operator(}) + ident(print) +reserved(end) +global_variable($stdout) operator(=) constant(STDOUT) +comment(#-----------------------------) +comment(#% ruby -i.old -pe 'gsub!(%r{\\bhisvar\\b}, 'hervar'\)' *.[Cchy]) + +comment(#-----------------------------) +comment(# set up to iterate over the *.c files in the current directory,) +comment(# editing in place and saving the old file with a .orig extension) +global_variable($-i) operator(=) string<delimiter(')content(.orig)delimiter(')> comment(# set up -i mode) +pre_constant(ARGV)operator(.)ident(replace)operator(()constant(Dir)operator([)string<delimiter(')content(*.[Cchy])delimiter(')>operator(])operator(\)) +reserved(while) ident(gets) + reserved(if) global_variable($.) operator(==) integer(1) + ident(print) string<delimiter(")content(This line should appear at the top of each file)char(\\n)delimiter(")> + reserved(end) + ident(gsub!)operator(()regexp<delimiter(/)char(\\b)content((p\)earl)char(\\b)delimiter(/)modifier(i)>operator(,) string<delimiter(')content(\\1)content(erl)delimiter(')>operator(\)) comment(# Correct typos, preserving case) + ident(print) + pre_constant(ARGF)operator(.)ident(close) reserved(if) pre_constant(ARGF)operator(.)ident(eof) +reserved(end) + + +comment(# @@PLEAC@@_7.10) +constant(File)operator(.)ident(open)operator(()string<delimiter(')content(itest)delimiter(')>operator(,) string<delimiter(')content(r+)delimiter(')>operator(\)) reserved(do) operator(|)ident(f)operator(|) comment(# open file for update) + ident(lines) operator(=) ident(f)operator(.)ident(readlines) comment(# read into array of lines) + ident(lines)operator(.)ident(each) reserved(do) operator(|)ident(it)operator(|) comment(# modify lines) + ident(it)operator(.)ident(gsub!)operator(()regexp<delimiter(/)content(foo)delimiter(/)>operator(,) string<delimiter(')content(QQQ)delimiter(')>operator(\)) + reserved(end) + ident(f)operator(.)ident(pos) operator(=) integer(0) comment(# back to start) + ident(f)operator(.)ident(print) ident(lines) comment(# write out modified lines) + ident(f)operator(.)ident(truncate)operator(()ident(f)operator(.)ident(pos)operator(\)) comment(# truncate to new length) +reserved(end) comment(# file is automatically closed) +comment(#-----------------------------) +constant(File)operator(.)ident(open)operator(()string<delimiter(')content(itest)delimiter(')>operator(,) string<delimiter(')content(r+)delimiter(')>operator(\)) reserved(do) operator(|)ident(f)operator(|) + ident(out) operator(=) string<delimiter(")delimiter(")> + ident(f)operator(.)ident(each) reserved(do) operator(|)ident(line)operator(|) + ident(out) operator(<<) ident(line)operator(.)ident(gsub)operator(()regexp<delimiter(/)content(DATE)delimiter(/)>operator(\)) operator({)constant(Time)operator(.)ident(now)operator(}) + reserved(end) + ident(f)operator(.)ident(pos) operator(=) integer(0) + ident(f)operator(.)ident(print) ident(out) + ident(f)operator(.)ident(truncate)operator(()ident(f)operator(.)ident(pos)operator(\)) +reserved(end) + +comment(# @@PLEAC@@_7.11) +constant(File)operator(.)ident(open)operator(()string<delimiter(')content(infile)delimiter(')>operator(,) string<delimiter(')content(r+)delimiter(')>operator(\)) reserved(do) operator(|)ident(f)operator(|) + ident(f)operator(.)ident(flock) constant(File)operator(::)constant(LOCK_EX) + comment(# update file) +reserved(end) +comment(#-----------------------------) +constant(File)operator(::)constant(LOCK_SH) comment(# shared lock (for reading\)) +constant(File)operator(::)constant(LOCK_EX) comment(# exclusive lock (for writing\)) +constant(File)operator(::)constant(LOCK_NB) comment(# non-blocking request) +constant(File)operator(::)constant(LOCK_UN) comment(# free lock) +comment(#-----------------------------) +reserved(unless) ident(f)operator(.)ident(flock) constant(File)operator(::)constant(LOCK_EX) operator(|) constant(File)operator(::)constant(LOCK_NB) + ident(warn) string<delimiter(")content(can't get immediate lock: blocking ...)delimiter(")> + ident(f)operator(.)ident(flock) constant(File)operator(::)constant(LOCK_EX) +reserved(end) +comment(#-----------------------------) +constant(File)operator(.)ident(open)operator(()string<delimiter(')content(numfile)delimiter(')>operator(,) constant(File)operator(::)constant(RDWR)operator(|)constant(File)operator(::)constant(CREAT)operator(\)) reserved(do) operator(|)ident(f)operator(|) + ident(f)operator(.)ident(flock)operator(()constant(File)operator(::)constant(LOCK_EX)operator(\)) + ident(num) operator(=) ident(f)operator(.)ident(gets)operator(.)ident(to_i) operator(||) integer(0) + ident(f)operator(.)ident(pos) operator(=) integer(0) + ident(f)operator(.)ident(truncate) integer(0) + ident(f)operator(.)ident(puts) ident(num) operator(+) integer(1)ident(q) +reserved(end) + + +comment(# @@PLEAC@@_7.12) +ident(output_handle)operator(.)ident(sync) operator(=) pre_constant(true) +comment(# Please note that like in Perl, $stderr is already unbuffered) +comment(#-----------------------------) +comment(#!/usr/bin/ruby -w) +comment(# seeme - demo stdio output buffering) +global_variable($stdout)operator(.)ident(sync) operator(=) pre_constant(ARGV)operator(.)ident(size) operator(>) integer(0) +ident(print) string<delimiter(")content(Now you don't see it...)delimiter(")> +ident(sleep) integer(2) +ident(puts) string<delimiter(")content(now you do)delimiter(")> +comment(#-----------------------------) +global_variable($stderr)operator(.)ident(sync) operator(=) pre_constant(true) +ident(afile)operator(.)ident(sync) operator(=) pre_constant(false) +comment(#-----------------------------) +comment(# assume 'remote_con' is an interactive socket handle,) +comment(# but 'disk_file' is a handle to a regular file.) +ident(remote_con)operator(.)ident(sync) operator(=) pre_constant(true) comment(# unbuffer for clarity) +ident(disk_file)operator(.)ident(sync) operator(=) pre_constant(false) comment(# buffered for speed) +comment(#-----------------------------) +ident(require) string<delimiter(')content(socket)delimiter(')> +ident(sock) operator(=) constant(TCPSocket)operator(.)ident(new)operator(()string<delimiter(')content(www.ruby-lang.org)delimiter(')>operator(,) integer(80)operator(\)) +ident(sock)operator(.)ident(sync) operator(=) pre_constant(true) +ident(sock)operator(.)ident(puts) string<delimiter(")content(GET /en/ HTTP/1.0 )char(\\n)char(\\n)delimiter(")> +ident(resp) operator(=) ident(sock)operator(.)ident(read) +ident(print) string<delimiter(")content(DOC IS: )inline<delimiter(#{)ident(resp)delimiter(})>char(\\n)delimiter(")> + + +comment(# @@PLEAC@@_7.13) +comment(#-----------------------------) +comment(# assumes fh1, fh2, fh2 are oen IO objects) +ident(nfound) operator(=) ident(select)operator(()operator([)global_variable($stdin)operator(,) ident(fh1)operator(,) ident(fh2)operator(,) ident(fh3)operator(])operator(,) pre_constant(nil)operator(,) pre_constant(nil)operator(,) integer(0)operator(\)) +ident(nfound)operator([)integer(0)operator(])operator(.)ident(each) reserved(do) operator(|)ident(file)operator(|) + reserved(case) ident(file) + reserved(when) ident(fh1) + comment(# do something with fh1) + reserved(when) ident(fh2) + comment(# do something with fh2) + reserved(when) ident(fh3) + comment(# do something with fh3) + reserved(end) +reserved(end) +comment(#-----------------------------) +ident(input_files) operator(=) operator([)operator(]) +comment(# repeat next line for all in-files to poll) +ident(input_files) operator(<<) ident(fh1) +reserved(if) ident(nfound) operator(=) ident(select)operator(()ident(input_files)operator(,) pre_constant(nil)operator(,) pre_constant(nil)operator(,) integer(0)operator(\)) + comment(# input ready on files in nfound[0]) +reserved(end) + + +comment(# @@PLEAC@@_8.0) +comment(#-----------------------------) +comment(# datafile is a file or IO object) +ident(datafile)operator(.)ident(readlines)operator(.)ident(each) operator({) operator(|)ident(line)operator(|) + ident(line)operator(.)ident(chomp!) + ident(size) operator(=) ident(line)operator(.)ident(length) + ident(puts) ident(size) +operator(}) +comment(#-----------------------------) +ident(datafile)operator(.)ident(readlines)operator(.)ident(each) operator({) operator(|)ident(line)operator(|) + ident(puts) ident(line)operator(.)ident(chomp!)operator(.)ident(length) +operator(}) +comment(#-----------------------------) +ident(lines) operator(=) ident(datafile)operator(.)ident(readlines) +comment(#-----------------------------) +ident(whole_file) operator(=) ident(file)operator(.)ident(read) +comment(#-----------------------------) +comment(# ruby -040 -e 'word = gets; puts "First word is #{word}"') +comment(#-----------------------------) +comment(# ruby -ne 'BEGIN { $/="%%\\n" }; $_.chomp; puts $_ if( $_=~/Unix/i\)' fortune.dat) +comment(#-----------------------------) +ident(handle)operator(.)ident(print) string<delimiter(")content(one)delimiter(")>operator(,) string<delimiter(")content(two)delimiter(")>operator(,) string<delimiter(")content(three)delimiter(")> comment(# "onetwothree") +ident(puts) string<delimiter(")content(Baa baa black sheep.)delimiter(")> comment(# sent to $stdout) +comment(#-----------------------------) +ident(buffer) operator(=) ident(handle)operator(.)ident(read)operator(()integer(4096)operator(\)) +ident(rv) operator(=) ident(buffer)operator(.)ident(length) +comment(#-----------------------------) +ident(handle)operator(.)ident(truncate)operator(()ident(length)operator(\)) +ident(open)operator(()string<delimiter(")content(/tmp)inline<delimiter(#{)global_variable($$)delimiter(})>content(.pid)delimiter(")>operator(,) string<delimiter(')content(w)delimiter(')>operator(\)) operator({) operator(|)ident(handle)operator(|) ident(handle)operator(.)ident(truncate)operator(()ident(length)operator(\)) operator(}) +comment(#-----------------------------) +ident(pos) operator(=) ident(datafile)operator(.)ident(pos) comment(# tell is an alias of pos) +ident(puts) string<delimiter(")content(I'm )inline<delimiter(#{)ident(pos)delimiter(})>content( bytes from the start of datafile)delimiter(")> +comment(#-----------------------------) +ident(logfile)operator(.)ident(seek)operator(()integer(0)operator(,) constant(IO)operator(::)constant(SEEK_END)operator(\)) +ident(datafile)operator(.)ident(seek)operator(()ident(pos)operator(\)) comment(# IO::SEEK_SET is the default) +ident(out)operator(.)ident(seek)operator(()integer(-20)operator(,) constant(IO)operator(::)constant(SEEK_CUR)operator(\)) +comment(#-----------------------------) +ident(written) operator(=) ident(datafile)operator(.)ident(syswrite)operator(()ident(mystring)operator(\)) +ident(raise) constant(RunTimeError) reserved(unless) ident(written) operator(==) ident(mystring)operator(.)ident(length) +ident(block) operator(=) ident(infile)operator(.)ident(sysread)operator(()integer(256)operator(\)) comment(# no equivalent to perl offset parameter in sysread) +ident(puts) string<delimiter(")content(only read )inline<delimiter(#{)ident(block)operator(.)ident(length)delimiter(})>content( bytes)delimiter(")> reserved(if) integer(256) operator(!=) ident(block)operator(.)ident(length) +comment(#-----------------------------) +ident(pos) operator(=) ident(handle)operator(.)ident(sysseek)operator(()integer(0)operator(,) constant(IO)operator(::)constant(SEEK_CUR)operator(\)) comment(# don't change position) + + +comment(# @@PLEAC@@_8.1) +reserved(while) operator(()ident(line) operator(=) ident(fh)operator(.)ident(gets)operator(\)) + ident(line)operator(.)ident(chomp!) + ident(nextline) operator(=) pre_constant(nil) + ident(line)operator(.)ident(gsub!)operator(()regexp<delimiter(/)char(\\\\)content($)delimiter(/)>operator(\)) operator({) operator(|)ident(match)operator(|) ident(nextline) operator(=) ident(fh)operator(.)ident(gets)operator(;) string<delimiter(')delimiter(')> operator(}) + reserved(if) operator(()ident(nextline) operator(!=) pre_constant(nil)operator(\)) + ident(line) operator(+=) ident(nextline) + reserved(redo) + reserved(end) + comment(# process full record in line here) +reserved(end) +comment(#-----------------------------) +comment(# DISTFILES = $(DIST_COMMON\) $(SOURCES\) $(HEADERS\) \\) +comment(# $(TEXINFOS\) $(INFOS\) $(MANS\) $(DATA\)) +comment(# DEP_DISTFILES = $(DIST_COMMON\) $(SOURCES\) $(HEADERS\) \\) +comment(# $(TEXINFOS\) $(INFO_DEPS\) $(MANS\) $(DATA\) \\) +comment(# $(EXTRA_DIST\)) +comment(#-----------------------------) +ident(line)operator(.)ident(gsub!)operator(()regexp<delimiter(/)char(\\\\)char(\\s)content(*$)delimiter(/)>operator(,) string<delimiter(')delimiter(')>operator(\)) operator({) + comment(# as before) +operator(}) + + +comment(# @@PLEAC@@_8.2) +comment(#-----------------------------) +ident(count) operator(=) shell<delimiter(`)content(wc -l < )inline<delimiter(#{)ident(filename)delimiter(})>delimiter(`)> +ident(fail) string<delimiter(")content(wc failed: )inline<delimiter(#{)global_variable($?)delimiter(})>delimiter(")> reserved(if) global_variable($?) operator(!=) integer(0) +ident(count)operator(.)ident(chomp!) +comment(#-----------------------------) +ident(count) operator(=) integer(0) +constant(File)operator(.)ident(open)operator(()ident(file)operator(,) string<delimiter(')content(r)delimiter(')>operator(\)) operator({) operator(|)ident(fh)operator(|) + ident(count) operator(+=) integer(1) reserved(while) ident(fh)operator(.)ident(gets) +operator(}) +comment(# count now holds the number of lines read) +comment(#-----------------------------) +ident(count) operator(=) integer(0) +reserved(while) operator(()ident(chunk) operator(=) ident(file)operator(.)ident(sysread)operator(()integer(2)operator(**)integer(16)operator(\))operator(\)) + ident(count) operator(+=) ident(chunk)operator(.)ident(count)operator(()string<delimiter(")char(\\n)delimiter(")>operator(\)) +reserved(end) reserved(rescue) constant(EOFError) +comment(#-----------------------------) +constant(File)operator(.)ident(open)operator(()ident(filename)operator(,)string<delimiter(')content(r)delimiter(')>operator(\)) operator({) operator(|)ident(fh)operator(|) + ident(count) operator(+=) integer(1) reserved(while) ident(fh)operator(.)ident(gets) +operator(}) +comment(# count now holds the number of lines read) +comment(#-----------------------------) +comment(# As ruby doesn't quite have an equivalent to using a for) +comment(# statement as in perl, I threw this in) +ident(count) operator(=) constant(File)operator(.)ident(readlines)operator(()ident(filename)operator(\))operator(.)ident(size) +comment(#-----------------------------) +integer(1) reserved(while) ident(file)operator(.)ident(gets) +ident(count) operator(=) global_variable($.) +comment(#-----------------------------) +global_variable($/) operator(=) string<delimiter(')delimiter(')> +ident(open)operator(()ident(filename)operator(,) string<delimiter(')content(r)delimiter(')>operator(\)) operator({) operator(|)ident(fh)operator(|) + integer(1) reserved(while) ident(fh)operator(.)ident(gets) + ident(para_count) operator(=) global_variable($.) +operator(}) reserved(rescue) ident(fail)operator(()string<delimiter(")content(can't open )inline<delimiter(#{)ident(filename)delimiter(})>content(: $!)delimiter(")>operator(\)) +comment(#-----------------------------) + + +comment(# ^^PLEAC^^_8.3) +comment(#-----------------------------) +reserved(while) operator(()ident(gets)operator(\)) + ident(split)operator(.)ident(each) operator({) operator(|)ident(chunk)operator(|) + comment(# do something with chunk) + operator(}) +reserved(end) +comment(#-----------------------------) +reserved(while) operator(()ident(gets)operator(\)) + ident(gsub)operator(()regexp<delimiter(/)content(()char(\\w)content([)char(\\w)content('-]*\))delimiter(/)>operator(\)) operator({) operator(|)ident(word)operator(|) + comment(# do something with word) + operator(}) +reserved(end) +comment(#-----------------------------) +comment(# Make a word frequency count) +comment(# normally hashes can be created using {} or just Hash.new) +comment(# but we want the default value of an entry to be 0 instead ) +comment(# of nil. (nil can't be incremented\)) +ident(seen) operator(=) constant(Hash)operator(.)ident(new)operator(()integer(0)operator(\)) +reserved(while) operator(()ident(gets)operator(\)) + ident(gsub)operator(()regexp<delimiter(/)content(()char(\\w)content([)char(\\w)content('-]*\))delimiter(/)>operator(\)) operator({) operator(|)ident(word)operator(|) + ident(seen)operator([)ident(word)operator(.)ident(downcase)operator(]) operator(+=) integer(1) + operator(}) +reserved(end) +comment(# output hash in a descending numeric sort of its values) +ident(seen)operator(.)ident(sort) operator({) operator(|)ident(a)operator(,)ident(b)operator(|) ident(b)operator([)integer(1)operator(]) operator(<=>) ident(a)operator([)integer(1)operator(]) operator(})operator(.)ident(each) reserved(do) operator(|)ident(k)operator(,)ident(v)operator(|) + ident(printf)operator(()string<delimiter(")content(%5d %s)char(\\n)delimiter(")>operator(,) ident(v)operator(,) ident(k) operator(\)) +reserved(end) + +comment(#-----------------------------) +comment(# Line frequency count) +ident(seen) operator(=) constant(Hash)operator(.)ident(new)operator(()integer(0)operator(\)) +reserved(while) operator(()ident(gets)operator(\)) + ident(seen)operator([)global_variable($_)operator(.)ident(downcase)operator(]) operator(+=) integer(1) +reserved(end) +ident(seen)operator(.)ident(sort) operator({) operator(|)ident(a)operator(,)ident(b)operator(|) ident(b)operator([)integer(1)operator(]) operator(<=>) ident(a)operator([)integer(1)operator(]) operator(})operator(.)ident(each) reserved(do) operator(|)ident(k)operator(,)ident(v)operator(|) + ident(printf)operator(()string<delimiter(")content(%5d %s)char(\\n)delimiter(")>operator(,) ident(v)operator(,) ident(k) operator(\)) +reserved(end) +comment(#-----------------------------) + + +comment(# @@PLEAC@@_8.4) +comment(#-----------------------------) +comment(# instead of file handle FILE, we can just) +comment(# use a string containing the filename) +constant(File)operator(.)ident(readlines)operator(()ident(file)operator(\))operator(.)ident(each) operator({) operator(|)ident(line)operator(|) + comment(# do something with line) +operator(}) +comment(#-----------------------------) +constant(File)operator(.)ident(readlines)operator(()ident(file)operator(\))operator(.)ident(reverse_each) operator({) operator(|)ident(line)operator(|) + comment(# do something with line) +operator(}) +comment(#-----------------------------) +comment(# the variable lines might have been created) +comment(# this way) +comment(# lines = File.readlines(file\)) +comment(#) +comment(# normally one would use the reverse_each, but) +comment(# if you insist on using a numerical index to) +comment(# iterate over the lines array...) +operator(()ident(lines)operator(.)ident(size) operator(-) integer(1)operator(\))operator(.)ident(downto)operator(()integer(0)operator(\)) operator({) operator(|)ident(i)operator(|) + ident(line) operator(=) ident(lines)operator([)ident(i)operator(]) +operator(}) +comment(#-----------------------------) +comment(# the second readlines argument is a the ) +comment(# record separator $/, just like perl, a blank) +comment(# separator splits the records into paragraphs) +constant(File)operator(.)ident(readlines)operator(()ident(file)operator(,) string<delimiter(')delimiter(')>operator(\))operator(.)ident(each) operator({) operator(|)ident(paragraph)operator(|) + comment(# do something with paragraph) + ident(puts) string<delimiter(")content(->Paragraph )inline<delimiter(#{)ident(paragraph)delimiter(})>delimiter(")> +operator(}) +comment(#-----------------------------) + + +comment(# @@PLEAC@@_8.6) + +global_variable($/) operator(=) string<delimiter(")content(%)char(\\n)delimiter(")>operator(;) +ident(srand)operator(;) + +constant(File)operator(.)ident(open)operator(()string<delimiter(')content(/usr/share/fortune/humorists)delimiter(')>operator(\))operator(.)ident(each) reserved(do) operator(|)ident(line)operator(|) + ident(adage) operator(=) ident(line) reserved(if) ident(rand)operator(()global_variable($.)operator(\)) operator(<) integer(1) +reserved(end) + +ident(puts) ident(adage)operator(;) + + +comment(# @@PLEAC@@_8.10) +reserved(begin) + ident(fh) operator(=) constant(File)operator(.)ident(open)operator(()ident(file)operator(,) string<delimiter(")content(r+)delimiter(")>operator(\)) + ident(addr) operator(=) ident(fh)operator(.)ident(tell) reserved(unless) ident(fh)operator(.)ident(eof) reserved(while) ident(fh)operator(.)ident(gets) + ident(fh)operator(.)ident(truncate)operator(()ident(addr)operator(\)) +reserved(rescue) constant(SystemCallError) + global_variable($stderr)operator(.)ident(puts) string<delimiter(")escape(#)global_variable($!)delimiter(")> +reserved(end) + + +comment(# @@PLEAC@@_9.0) +ident(entry) operator(=) constant(File)operator(.)ident(stat)operator(()string<delimiter(")content(/usr/bin/vi)delimiter(")>operator(\)) +ident(entry) operator(=) constant(File)operator(.)ident(stat)operator(()string<delimiter(")content(/usr/bin)delimiter(")>operator(\)) +ident(entry) operator(=) constant(File)operator(.)ident(stat)operator(()constant(INFILE)operator(\)) + +ident(entry) operator(=) constant(File)operator(.)ident(stat)operator(()string<delimiter(")content(/usr/bin/vi)delimiter(")>operator(\)) +ident(ctime) operator(=) ident(entry)operator(.)ident(ctime) +ident(size) operator(=) ident(entry)operator(.)ident(size) + +ident(f) operator(=) constant(File)operator(.)ident(open)operator(()ident(filename)operator(,) string<delimiter(")content(r)delimiter(")>operator(\)) + +comment(## There is no -T equivalent in Ruby, but we can still test emptiness) +reserved(if) ident(test)operator(()integer(?s)operator(,) ident(filename)operator(\)) + ident(puts) string<delimiter(")inline<delimiter(#{)ident(filename)delimiter(})>content( doesn't have text in it.)delimiter(")> + ident(exit) +reserved(end) + +constant(Dir)operator(.)ident(new)operator(()string<delimiter(")content(/usr/bin)delimiter(")>operator(\))operator(.)ident(each) reserved(do) operator(|)ident(filename)operator(|) + ident(puts) string<delimiter(")content(Inside /usr/bin is something called )inline<delimiter(#{)ident(filename)delimiter(})>delimiter(")> +reserved(end) + + +comment(# @@PLEAC@@_9.1) +ident(file) operator(=) constant(File)operator(.)ident(stat)operator(()string<delimiter(")content(filename)delimiter(")>operator(\)) +ident(readtime)operator(,) ident(writetime) operator(=) ident(file)operator(.)ident(atime)operator(,) ident(file)operator(.)ident(mtime) +ident(file)operator(.)ident(utime)operator(()ident(readtime)operator(,) ident(writetime)operator(\)) + +constant(SECONDS_PER_DAY) operator(=) integer(60) operator(*) integer(60) operator(*) integer(24) +ident(file) operator(=) constant(File)operator(.)ident(stat)operator(()string<delimiter(")content(filename)delimiter(")>operator(\)) +ident(atime)operator(,) ident(mtime) operator(=) ident(file)operator(.)ident(atime)operator(,) ident(file)operator(.)ident(mtime) + +ident(atime) operator(-=) integer(7) operator(*) constant(SECONDS_PER_DAY) +ident(mtime) operator(-=) integer(7) operator(*) constant(SECONDS_PER_DAY) + +constant(File)operator(.)ident(utime)operator(()ident(atime)operator(,) ident(mtime)operator(,) ident(file)operator(\)) +ident(mtime) operator(=) constant(File)operator(.)ident(stat)operator(()ident(file)operator(\))operator(.)ident(mtime) +constant(File)operator(.)ident(utime)operator(()constant(Time)operator(.)ident(new)operator(,) ident(mtime)operator(,) ident(file)operator(\)) +constant(File)operator(.)ident(utime)operator(()constant(Time)operator(.)ident(new)operator(,) constant(File)operator(.)ident(stat)operator(()string<delimiter(")content(testfile)delimiter(")>operator(\))operator(.)ident(mtime)operator(,) ident(file)operator(\)) + +comment(#-----------------------------) +comment(#!/usr/bin/ruby -w) +comment(## uvi - vi a file without changing it's access times) + +reserved(if) pre_constant(ARGV)operator(.)ident(length) operator(!=) integer(1) + ident(puts) string<delimiter(")content(usage: uvi filename)delimiter(")> + ident(exit) +reserved(end) +ident(file) operator(=) pre_constant(ARGV)operator([)integer(0)operator(]) +ident(atime)operator(,) ident(mtime) operator(=) constant(File)operator(.)ident(stat)operator(()ident(file)operator(\))operator(.)ident(atime)operator(,) constant(File)operator(.)ident(stat)operator(()ident(file)operator(\))operator(.)ident(mtime) +ident(system)operator(()constant(ENV)operator([)string<delimiter(")content(EDITOR)delimiter(")>operator(]) operator(||) string<delimiter(")content(vi)delimiter(")>operator(,) ident(file)operator(\)) +constant(File)operator(.)ident(utime)operator(()ident(atime)operator(,) ident(mtime)operator(,) ident(file)operator(\)) +comment(#-----------------------------) + + +comment(# @@PLEAC@@_9.2) +constant(File)operator(.)ident(unlink)operator(()constant(FILENAME)operator(\)) + +ident(err_flg) operator(=) pre_constant(false) +ident(filenames)operator(.)ident(each) reserved(do) operator(|)ident(file)operator(|) + reserved(begin) + constant(File)operator(.)ident(unlink)operator(()ident(file)operator(\)) + reserved(rescue) + ident(err_flg) operator(=) global_variable($!) + reserved(end) +reserved(end) +ident(err_flg) reserved(and) ident(raise) string<delimiter(")content(Couldn't unlink all of )inline<delimiter(#{)ident(filenames)operator(.)ident(join)operator(()string<delimiter(")content( )delimiter(")>operator(\))delimiter(})>content(: )inline<delimiter(#{)ident(err_flg)delimiter(})>delimiter(")> + +constant(File)operator(.)ident(unlink)operator(()ident(file)operator(\)) + +ident(count) operator(=) ident(filenames)operator(.)ident(length) +ident(filenames)operator(.)ident(each) reserved(do) operator(|)ident(file)operator(|) + reserved(begin) + constant(File)operator(.)ident(unlink)operator(()ident(file)operator(\)) + reserved(rescue) + ident(count) operator(-=) integer(1) + reserved(end) +reserved(end) +reserved(if) ident(count) operator(!=) ident(filenames)operator(.)ident(length) + constant(STDERR)operator(.)ident(puts) string<delimiter(")content(could only delete )inline<delimiter(#{)ident(count)delimiter(})>content( of )inline<delimiter(#{)ident(filenames)operator(.)ident(length)delimiter(})>content( files)delimiter(")> +reserved(end) + + +comment(# @@PLEAC@@_9.3) +ident(require) string<delimiter(")content(ftools)delimiter(")> +constant(File)operator(.)ident(copy)operator(()ident(oldfile)operator(,) ident(newfile)operator(\)) + +ident(infile) operator(=) constant(File)operator(.)ident(open)operator(()ident(oldfile)operator(,) string<delimiter(")content(r)delimiter(")>operator(\)) +ident(outfile) operator(=) constant(File)operator(.)ident(open)operator(()ident(newfile)operator(,) string<delimiter(")content(w)delimiter(")>operator(\)) + +ident(blksize) operator(=) ident(infile)operator(.)ident(stat)operator(.)ident(blksize) +comment(# This doesn't handle partial writes or ^Z) +comment(# like the Perl version does.) +reserved(while) operator(()ident(line) operator(=) ident(infile)operator(.)ident(read)operator(()ident(blksize)operator(\))operator(\)) + ident(outfile)operator(.)ident(write)operator(()ident(line)operator(\)) +reserved(end) + +ident(infile)operator(.)ident(close) +ident(outfile)operator(.)ident(close) + +ident(system)operator(()string<delimiter(")content(cp )inline<delimiter(#{)ident(oldfile)delimiter(})>content( )inline<delimiter(#{)ident(newfile)delimiter(})>delimiter(")>operator(\)) comment(# unix) +ident(system)operator(()string<delimiter(")content(copy )inline<delimiter(#{)ident(oldfile)delimiter(})>content( )inline<delimiter(#{)ident(newfile)delimiter(})>delimiter(")>operator(\)) comment(# dos, vms) + +ident(require) string<delimiter(")content(ftools)delimiter(")> +constant(File)operator(.)ident(copy)operator(()string<delimiter(")content(datafile.dat)delimiter(")>operator(,) string<delimiter(")content(datafile.bak)delimiter(")>operator(\)) +constant(File)operator(.)ident(move)operator(()string<delimiter(")content(datafile.new)delimiter(")>operator(,) string<delimiter(")content(datafile.dat)delimiter(")>operator(\)) + + +comment(# @@PLEAC@@_9.4) +global_variable($seen) operator(=) operator({)operator(}) comment(# must use global var to be seen inside of method below) + +reserved(def) method(do_my_thing)operator(()ident(filename)operator(\)) + ident(dev)operator(,) ident(ino) operator(=) constant(File)operator(.)ident(stat)operator(()ident(filename)operator(\))operator(.)ident(dev)operator(,) constant(File)operator(.)ident(stat)operator(()ident(filename)operator(\))operator(.)ident(ino) + reserved(unless) global_variable($seen)operator([)operator([)ident(dev)operator(,) ident(ino)operator(])operator(]) + comment(# do something with $filename because we haven't) + comment(# seen it before) + reserved(end) + global_variable($seen)operator([)operator([)ident(dev)operator(,) ident(ino)operator(])operator(]) operator(=) global_variable($seen)operator([)operator([)ident(dev)operator(,) ident(ino)operator(])operator(])operator(.)ident(to_i) operator(+) integer(1) +reserved(end) + +ident(files)operator(.)ident(each) reserved(do) operator(|)ident(filename)operator(|) + ident(dev)operator(,) ident(ino) operator(=) constant(File)operator(.)ident(stat)operator(()ident(filename)operator(\))operator(.)ident(dev)operator(,) constant(File)operator(.)ident(stat)operator(()ident(filename)operator(\))operator(.)ident(ino) + reserved(if) operator(!)global_variable($seen)operator(.)ident(has_key?)operator(()operator([)ident(dev)operator(,) ident(ino)operator(])operator(\)) + global_variable($seen)operator([)operator([)ident(dev)operator(,) ident(ino)operator(])operator(]) operator(=) operator([)operator(]) + reserved(end) + global_variable($seen)operator([)operator([)ident(dev)operator(,) ident(ino)operator(])operator(])operator(.)ident(push)operator(()ident(filename)operator(\)) +reserved(end) + +global_variable($seen)operator(.)ident(keys)operator(.)ident(sort)operator(.)ident(each) reserved(do) operator(|)ident(devino)operator(|) + ident(ino)operator(,) ident(dev) operator(=) ident(devino) + reserved(if) global_variable($seen)operator([)ident(devino)operator(])operator(.)ident(length) operator(>) integer(1) + comment(# $seen[devino] is a list of filenames for the same file) + reserved(end) +reserved(end) + + +comment(# @@PLEAC@@_9.5) +constant(Dir)operator(.)ident(open)operator(()ident(dirname)operator(\)) reserved(do) operator(|)ident(dir)operator(|) + ident(dir)operator(.)ident(each) reserved(do) operator(|)ident(file)operator(|) + comment(# do something with dirname/file) + ident(puts) ident(file) + reserved(end) +reserved(end) +comment(# Dir.close is automatic) + +comment(# No -T equivalent in Ruby) + +ident(dir)operator(.)ident(each) reserved(do) operator(|)ident(file)operator(|) + reserved(next) reserved(if) ident(file) operator(=)operator(~) regexp<delimiter(/)content(^)char(\\.)char(\\.)content(?$)delimiter(/)> + comment(# ...) +reserved(end) + +reserved(def) method(plainfiles)operator(()ident(dir)operator(\)) + ident(dh) operator(=) constant(Dir)operator(.)ident(open)operator(()ident(dir)operator(\)) + ident(dh)operator(.)ident(entries)operator(.)ident(grep)operator(()regexp<delimiter(/)content(^[^.])delimiter(/)>operator(\))operator(.) + ident(map) operator({)operator(|)ident(file)operator(|) string<delimiter(")inline<delimiter(#{)ident(dir)delimiter(})>content(/)inline<delimiter(#{)ident(file)delimiter(})>delimiter(")>operator(})operator(.) + ident(find_all) operator({)operator(|)ident(file)operator(|) ident(test)operator(()integer(?f)operator(,) ident(file)operator(\))operator(})operator(.) + ident(sort) +reserved(end) + + +comment(# @@PLEAC@@_9.6) +ident(list) operator(=) constant(Dir)operator(.)ident(glob)operator(()string<delimiter(")content(*.c)delimiter(")>operator(\)) + +ident(dir) operator(=) constant(Dir)operator(.)ident(open)operator(()ident(path)operator(\)) +ident(files) operator(=) ident(dir)operator(.)ident(entries)operator(.)ident(grep)operator(()regexp<delimiter(/)char(\\.)content(c$)delimiter(/)>operator(\)) +ident(dir)operator(.)ident(close) + +ident(files) operator(=) constant(Dir)operator(.)ident(glob)operator(()string<delimiter(")content(*.c)delimiter(")>operator(\)) +ident(files) operator(=) constant(Dir)operator(.)ident(open)operator(()ident(path)operator(\))operator(.)ident(entries)operator(.)ident(grep)operator(()regexp<delimiter(/)char(\\.)content([ch]$)delimiter(/)modifier(i)>operator(\)) + +ident(dir) operator(=) constant(Dir)operator(.)ident(new)operator(()ident(path)operator(\)) +ident(files) operator(=) ident(dir)operator(.)ident(entries)operator(.)ident(grep)operator(()regexp<delimiter(/)char(\\.)content([ch]$)delimiter(/)modifier(i)>operator(\)) + +reserved(begin) + ident(d) operator(=) constant(Dir)operator(.)ident(open)operator(()ident(dir)operator(\)) +reserved(rescue) constant(Errno)operator(::)constant(ENOENT) + ident(raise) string<delimiter(")content(Couldn't open )inline<delimiter(#{)ident(dir)delimiter(})>content( for reading: )inline<delimiter(#{)global_variable($!)delimiter(})>delimiter(")> +reserved(end) + +ident(files) operator(=) operator([)operator(]) +ident(d)operator(.)ident(each) reserved(do) operator(|)ident(file)operator(|) + ident(puts) ident(file) + reserved(next) reserved(unless) ident(file) operator(=)operator(~) regexp<delimiter(/)char(\\.)content([ch]$)delimiter(/)modifier(i)> + + ident(filename) operator(=) string<delimiter(")inline<delimiter(#{)ident(dir)delimiter(})>content(/)inline<delimiter(#{)ident(file)delimiter(})>delimiter(")> + comment(# There is no -T equivalent in Ruby, but we can still test emptiness) + ident(files)operator(.)ident(push)operator(()ident(filename)operator(\)) reserved(if) ident(test)operator(()integer(?s)operator(,) ident(filename)operator(\)) +reserved(end) + +ident(dirs)operator(.)ident(entries)operator(.)ident(grep)operator(()regexp<delimiter(/)content(^)char(\\d)content(+$)delimiter(/)>operator(\))operator(.) + ident(map) operator({) operator(|)ident(file)operator(|) operator([)ident(file)operator(,) string<delimiter(")inline<delimiter(#{)ident(path)delimiter(})>content(/)inline<delimiter(#{)ident(file)delimiter(})>delimiter(")>operator(])operator(}) operator(.) + ident(select) operator({) operator(|)ident(file)operator(|) ident(test)operator(()integer(?d)operator(,) ident(file)operator([)integer(1)operator(])operator(\)) operator(})operator(.) + ident(sort) operator({) operator(|)ident(a)operator(,)ident(b)operator(|) ident(a)operator([)integer(0)operator(]) operator(<=>) ident(b)operator([)integer(0)operator(]) operator(})operator(.) + ident(map) operator({) operator(|)ident(file)operator(|) ident(file)operator([)integer(1)operator(]) operator(}) + + +comment(# @@PLEAC@@_9.7) +ident(require) string<delimiter(')content(find)delimiter(')> +constant(Find)operator(.)ident(find)operator(()ident(dirlist)operator(\)) reserved(do) operator(|)ident(file)operator(|) + comment(# do whatever) +reserved(end) + +ident(require) string<delimiter(')content(find)delimiter(')> +ident(argv) operator(=) pre_constant(ARGV)operator(.)ident(empty?) operator(?) string<delimiter(%w{)content(.)delimiter(})> operator(:) pre_constant(ARGV) +constant(Find)operator(.)ident(find)operator(()operator(*)ident(argv)operator(\)) reserved(do) operator(|)ident(file)operator(|) + ident(print) ident(file)operator(,) operator(()ident(test)operator(()integer(?d)operator(,) ident(file)operator(\)) operator(?) string<delimiter(")content(/)char(\\n)delimiter(")> operator(:) string<delimiter(")char(\\n)delimiter(")>operator(\)) +reserved(end) + +ident(require) string<delimiter(')content(find)delimiter(')> +ident(argv) operator(=) pre_constant(ARGV)operator(.)ident(empty?) operator(?) string<delimiter(%w{)content(.)delimiter(})> operator(:) pre_constant(ARGV) +ident(sum) operator(=) integer(0) +constant(Find)operator(.)ident(find)operator(()operator(*)ident(argv)operator(\)) reserved(do) operator(|)ident(file)operator(|) + ident(size) operator(=) ident(test)operator(()integer(?s)operator(,) ident(file)operator(\)) operator(||) integer(0) + ident(sum) operator(+=) ident(size) +reserved(end) +ident(puts) string<delimiter(")inline<delimiter(#{)ident(argv)operator(.)ident(join)operator(()string<delimiter(')content( )delimiter(')>operator(\))delimiter(})>content( contains )inline<delimiter(#{)ident(sum)delimiter(})>content( bytes)delimiter(")> + +ident(require) string<delimiter(')content(find)delimiter(')> +ident(argv) operator(=) pre_constant(ARGV)operator(.)ident(empty?) operator(?) string<delimiter(%w{)content(.)delimiter(})> operator(:) pre_constant(ARGV) +ident(saved_size)operator(,) ident(saved_name) operator(=) integer(-1)operator(,) string<delimiter(")delimiter(")> +constant(Find)operator(.)ident(find)operator(()operator(*)ident(argv)operator(\)) reserved(do) operator(|)ident(file)operator(|) + ident(size) operator(=) ident(test)operator(()integer(?s)operator(,) ident(file)operator(\)) operator(||) integer(0) + reserved(next) reserved(unless) ident(test)operator(()integer(?f)operator(,) ident(file)operator(\)) operator(&&) ident(size) operator(>) ident(saved_size) + ident(saved_size) operator(=) ident(size) + ident(saved_name) operator(=) ident(file) +reserved(end) +ident(puts) string<delimiter(")content(Biggest file )inline<delimiter(#{)ident(saved_name)delimiter(})>content( in )inline<delimiter(#{)ident(argv)operator(.)ident(join)operator(()string<delimiter(')content( )delimiter(')>operator(\))delimiter(})>content( is )inline<delimiter(#{)ident(saved_size)delimiter(})>delimiter(")> + +ident(require) string<delimiter(')content(find)delimiter(')> +ident(argv) operator(=) pre_constant(ARGV)operator(.)ident(empty?) operator(?) string<delimiter(%w{)content(.)delimiter(})> operator(:) pre_constant(ARGV) +ident(age)operator(,) ident(name) operator(=) pre_constant(nil) +constant(Find)operator(.)ident(find)operator(()operator(*)ident(argv)operator(\)) reserved(do) operator(|)ident(file)operator(|) + ident(mtime) operator(=) constant(File)operator(.)ident(stat)operator(()ident(file)operator(\))operator(.)ident(mtime) + reserved(next) reserved(if) ident(age) operator(&&) ident(age) operator(>) ident(mtime) + ident(age) operator(=) ident(mtime) + ident(name) operator(=) ident(file) +reserved(end) +ident(puts) string<delimiter(")inline<delimiter(#{)ident(name)delimiter(})>content( )inline<delimiter(#{)ident(age)delimiter(})>delimiter(")> + +comment(#-----------------------------) +comment(#!/usr/bin/ruby -w) +comment(# fdirs - find all directories) +ident(require) string<delimiter(')content(find)delimiter(')> +ident(argv) operator(=) pre_constant(ARGV)operator(.)ident(empty?) operator(?) string<delimiter(%w{)content(.)delimiter(})> operator(:) pre_constant(ARGV) +constant(File)operator(.)ident(find)operator(()operator(*)ident(argv)operator(\)) operator({) operator(|)ident(file)operator(|) ident(puts) ident(file) reserved(if) ident(test)operator(()integer(?d)operator(,) ident(file)operator(\)) operator(}) +comment(#-----------------------------) + + +comment(# @@PLEAC@@_9.8) +ident(require) string<delimiter(')content(fileutils)delimiter(')> + +ident(puts) string<delimiter(")content(Usage )inline<delimiter(#{)global_variable($0)delimiter(})>content( dir ...)delimiter(")> reserved(if) pre_constant(ARGV)operator(.)ident(empty?) +pre_constant(ARGV)operator(.)ident(each) reserved(do) operator(|)ident(dir)operator(|) + constant(FileUtils)operator(.)ident(rmtree)operator(()ident(dir)operator(\)) +reserved(end) + + +comment(# @@PLEAC@@_9.9) +ident(require) string<delimiter(')content(ftools)delimiter(')> +ident(names)operator(.)ident(each) reserved(do) operator(|)ident(file)operator(|) + ident(newname) operator(=) ident(file) + reserved(begin) + constant(File)operator(.)ident(move)operator(()ident(file)operator(,) ident(newname)operator(\)) + reserved(rescue) constant(Errno)operator(::)constant(EPERM) + global_variable($stderr)operator(.)ident(puts) string<delimiter(")content(Couldn't rename )inline<delimiter(#{)ident(file)delimiter(})>content( to )inline<delimiter(#{)ident(newname)delimiter(})>content(: )inline<delimiter(#{)global_variable($!)delimiter(})>delimiter(")> + reserved(end) +reserved(end) + +ident(require) string<delimiter(')content(ftools)delimiter(')> +ident(op) operator(=) pre_constant(ARGV)operator(.)ident(empty?) operator(?) operator(()ident(raise) string<delimiter(")content(Usage: rename expr [files])char(\\n)delimiter(")>operator(\)) operator(:) pre_constant(ARGV)operator(.)ident(shift) +ident(argv) operator(=) pre_constant(ARGV)operator(.)ident(empty?) operator(?) global_variable($stdin)operator(.)ident(readlines)operator(.)ident(map) operator({) operator(|)ident(f)operator(|) ident(f)operator(.)ident(chomp) operator(}) operator(:) pre_constant(ARGV) +ident(argv)operator(.)ident(each) reserved(do) operator(|)ident(file)operator(|) + ident(was) operator(=) ident(file) + ident(file) operator(=) ident(eval)operator(()string<delimiter(")content(file.)inline<delimiter(#{)ident(op)delimiter(})>delimiter(")>operator(\)) + constant(File)operator(.)ident(move)operator(()ident(was)operator(,) ident(file)operator(\)) reserved(unless) ident(was) operator(==) ident(file) +reserved(end) + + +comment(# @@PLEAC@@_9.10) +ident(base) operator(=) constant(File)operator(.)ident(basename)operator(()ident(path)operator(\)) +ident(dir) operator(=) constant(File)operator(.)ident(dirname)operator(()ident(path)operator(\)) +comment(# ruby has no fileparse equivalent) +ident(dir)operator(,) ident(base) operator(=) constant(File)operator(.)ident(split)operator(()ident(path)operator(\)) +ident(ext) operator(=) ident(base)operator(.)ident(scan)operator(()regexp<delimiter(/)char(\\.)content(.*$)delimiter(/)>operator(\))operator(.)ident(to_s) + +ident(path) operator(=) string<delimiter(')content(/usr/lib/libc.a)delimiter(')> +ident(file) operator(=) constant(File)operator(.)ident(basename)operator(()ident(path)operator(\)) +ident(dir) operator(=) constant(File)operator(.)ident(dirname)operator(()ident(path)operator(\)) + +ident(puts) string<delimiter(")content(dir is )inline<delimiter(#{)ident(dir)delimiter(})>content(, file is )inline<delimiter(#{)ident(file)delimiter(})>delimiter(")> +comment(# dir is /usr/lib, file is libc.a) + +ident(path) operator(=) string<delimiter(')content(/usr/lib/libc.a)delimiter(')> +ident(dir)operator(,) ident(filename) operator(=) constant(File)operator(.)ident(split)operator(()ident(path)operator(\)) +ident(name)operator(,) ident(ext) operator(=) ident(filename)operator(.)ident(split)operator(()regexp<delimiter(/)content((?=)char(\\.)content(\))delimiter(/)>operator(\)) +ident(puts) string<delimiter(")content(dir is )inline<delimiter(#{)ident(dir)delimiter(})>content(, name is )inline<delimiter(#{)ident(name)delimiter(})>content(, ext is )inline<delimiter(#{)ident(ext)delimiter(})>delimiter(")> +comment(# NOTE: The Ruby code prints) +comment(# dir is /usr/lib, name is libc, extension is .a) +comment(# while the Perl code prints a '/' after the directory name) +comment(# dir is /usr/lib/, name is libc, extension is .a) + +comment(# No fileparse_set_fstype(\) equivalent in ruby) + +reserved(def) method(extension)operator(()ident(path)operator(\)) + ident(ext) operator(=) ident(path)operator(.)ident(scan)operator(()regexp<delimiter(/)char(\\.)content(.*$)delimiter(/)>operator(\))operator(.)ident(to_s) + ident(ext)operator(.)ident(sub)operator(()regexp<delimiter(/)content(^)char(\\.)delimiter(/)>operator(,) string<delimiter(")delimiter(")>operator(\)) +reserved(end) + + +comment(# @@PLEAC@@_9.11) +comment(#-----------------------------) +comment(#!/usr/bin/ruby -w) +comment(# symirror - build spectral forest of symlinks) + +ident(require) string<delimiter(')content(find)delimiter(')> +ident(require) string<delimiter(')content(fileutils)delimiter(')> + +ident(raise) string<delimiter(")content(usage: )inline<delimiter(#{)global_variable($0)delimiter(})>content( realdir mirrordir)delimiter(")> reserved(unless) pre_constant(ARGV)operator(.)ident(size) operator(==) integer(2) + +ident(srcdir)operator(,)ident(dstdir) operator(=) pre_constant(ARGV) +ident(srcmode) operator(=) constant(File)operator(::)ident(stat)operator(()ident(srcdir)operator(\))operator(.)ident(mode) +constant(Dir)operator(.)ident(mkdir)operator(()ident(dstdir)operator(,) ident(srcmode) operator(&) integer(07777)operator(\)) reserved(unless) ident(test)operator(()integer(?d)operator(,) ident(dstdir)operator(\)) + +comment(# fix relative paths) +constant(Dir)operator(.)ident(chdir)operator(()ident(srcdir)operator(\)) operator({)ident(srcdir) operator(=) constant(Dir)operator(.)ident(pwd)operator(}) +constant(Dir)operator(.)ident(chdir)operator(()ident(dstdir)operator(\)) operator({)ident(dstdir) operator(=) constant(Dir)operator(.)ident(pwd)operator(}) + +constant(Find)operator(.)ident(find)operator(()ident(srcdir)operator(\)) reserved(do) operator(|)ident(srcfile)operator(|) + reserved(if) ident(test)operator(()integer(?d)operator(,) ident(srcfile)operator(\)) + ident(dest) operator(=) ident(srcfile)operator(.)ident(sub)operator(()regexp<delimiter(/)content(^)inline<delimiter(#{)ident(srcdir)delimiter(})>delimiter(/)>operator(,) ident(dstdir)operator(\)) + ident(dmode) operator(=) constant(File)operator(::)ident(stat)operator(()ident(srcfile)operator(\))operator(.)ident(mode) operator(&) integer(07777) + constant(Dir)operator(.)ident(mkdir)operator(()ident(dest)operator(,) ident(dmode)operator(\)) reserved(unless) ident(test)operator(()integer(?d)operator(,) ident(dest)operator(\)) + ident(a) operator(=) constant(Dir)operator([)string<delimiter(")inline<delimiter(#{)ident(srcfile)delimiter(})>content(/*)delimiter(")>operator(])operator(.)ident(reject)operator({)operator(|)ident(f)operator(|) ident(test)operator(()integer(?d)operator(,) ident(f)operator(\))operator(}) + constant(FileUtils)operator(.)ident(ln_s)operator(()ident(a)operator(,) ident(dest)operator(\)) + reserved(end) +reserved(end) + + +comment(# @@PLEAC@@_9.12) +comment(# we use the Getopt/Declare library here for convenience:) +comment(# http://raa.ruby-lang.org/project/getoptdeclare/) +comment(#-----------------------------) +comment(#!/usr/bin/ruby -w) +comment(# lst - list sorted directory contents (depth first\)) + +ident(require) string<delimiter(')content(find)delimiter(')> +ident(require) string<delimiter(')content(etc)delimiter(')> +ident(require) string<delimiter(")content(Getopt/Declare)delimiter(")> + +comment(# Note: in the option-spec below there must by at least one hard) +comment(# tab in between each -option and its description. For example) +comment(# -i <tab> read from stdin) + +ident(opts) operator(=) constant(Getopt)operator(::)constant(Declare)operator(.)ident(new)operator(()string<delimiter(<<'EOPARAM')>operator(\))string<content( + ============ + Input Format: + -i read from stdin + ============ + Output Format: + -l long listing + -r reverse listing + ============ + Sort on: (one of\) + -m mtime (modify time - default\) + {$sort_criteria = :mtime} + -u atime (access time\) + {$sort_criteria = :atime} + -c ctime (inode change time\) + {$sort_criteria = :ctime} + -s size + {$sort_criteria = :size} + [mutex: -m -u -c -s] +)delimiter( +EOPARAM)> + +global_variable($sort_criteria) operator(||=) symbol(:mtime) +ident(files) operator(=) operator({)operator(}) +constant(DIRS) operator(=) ident(opts)operator([)string<delimiter(')content(-i)delimiter(')>operator(]) operator(?) global_variable($stdin)operator(.)ident(readlines)operator(.)ident(map)operator({)operator(|)ident(f)operator(|)ident(f)operator(.)ident(chomp!)operator(}) operator(:) pre_constant(ARGV) +constant(DIRS)operator(.)ident(each) reserved(do) operator(|)ident(dir)operator(|) + constant(Find)operator(.)ident(find)operator(()ident(dir)operator(\)) reserved(do) operator(|)ident(ent)operator(|) + ident(files)operator([)ident(ent)operator(]) operator(=) constant(File)operator(::)ident(stat)operator(()ident(ent)operator(\)) + reserved(end) +reserved(end) +ident(entries) operator(=) ident(files)operator(.)ident(keys)operator(.)ident(sort_by)operator({)operator(|)ident(f)operator(|) ident(files)operator([)ident(f)operator(])operator(.)ident(send)operator(()global_variable($sort_criteria)operator(\))operator(}) +ident(entries) operator(=) ident(entries)operator(.)ident(reverse) reserved(unless) ident(opts)operator([)string<delimiter(')content(-r)delimiter(')>operator(]) + +ident(entries)operator(.)ident(each) reserved(do) operator(|)ident(ent)operator(|) + reserved(unless) ident(opts)operator([)string<delimiter(')content(-l)delimiter(')>operator(]) + ident(puts) ident(ent) + reserved(next) + reserved(end) + ident(stats) operator(=) ident(files)operator([)ident(ent)operator(]) + ident(ftime) operator(=) ident(stats)operator(.)ident(send)operator(()global_variable($sort_criteria) operator(==) symbol(:size) operator(?) symbol(:mtime) operator(:) global_variable($sort_criteria)operator(\)) + ident(printf) string<delimiter(")content(%6d %04o %6d %8s %8s %8d %s %s)char(\\n)delimiter(")>operator(,) + ident(stats)operator(.)ident(ino)operator(,) + ident(stats)operator(.)ident(mode) operator(&) integer(07777)operator(,) + ident(stats)operator(.)ident(nlink)operator(,) + constant(ETC)operator(::)constant(PASSWD)operator([)ident(stats)operator(.)ident(uid)operator(])operator(.)ident(name)operator(,) + constant(ETC)operator(::)constant(GROUP)operator([)ident(stats)operator(.)ident(gid)operator(])operator(.)ident(name)operator(,) + ident(stats)operator(.)ident(size)operator(,) + ident(ftime)operator(.)ident(strftime)operator(()string<delimiter(")content(%a %b %d %H:%M:%S %Y)delimiter(")>operator(\))operator(,) + ident(ent) +reserved(end) + + +comment(# @@PLEAC@@_10.0) +reserved(def) method(hello) + global_variable($greeted) operator(+=) integer(1) comment(# in Ruby, a variable beginning with $ is global (can be any type of course\)) + ident(puts) string<delimiter(")content(hi there!)delimiter(")> +reserved(end) + +comment(# We need to initialize $greeted before it can be used, because "+=" is waiting a Numeric object) +global_variable($greeted) operator(=) integer(0) +ident(hello) comment(# note that appending (\) is optional to function calls with no parameters) + + +comment(# @@PLEAC@@_10.1) +comment(# In Ruby, parameters are named anyway) +reserved(def) method(hypotenuse)operator(()ident(side1)operator(,) ident(side2)operator(\)) + constant(Math)operator(.)ident(sqrt)operator(()ident(side1)operator(**)integer(2) operator(+) ident(side2)operator(**)integer(2)operator(\)) comment(# the sqrt function comes from the Math module) +reserved(end) +ident(diag) operator(=) ident(hypotenuse)operator(()integer(3)operator(,) integer(4)operator(\)) + +ident(puts) ident(hypotenuse)operator(()integer(3)operator(,) integer(4)operator(\)) + +ident(a) operator(=) operator([)integer(3)operator(,) integer(4)operator(]) +ident(print) ident(hypotenuse)operator(()operator(*)ident(a)operator(\)) comment(# the star operator will magically convert an Array into a "tuple") + +ident(both) operator(=) ident(men) operator(+) ident(women) + +comment(# In Ruby, all objects are references, so the same problem arises; we then return a new object) +ident(nums) operator(=) operator([)float(1.4)operator(,) float(3.5)operator(,) float(6.7)operator(]) +reserved(def) method(int_all)operator(()ident(n)operator(\)) + ident(n)operator(.)ident(collect) operator({) operator(|)ident(v)operator(|) ident(v)operator(.)ident(to_i) operator(}) +reserved(end) +ident(ints) operator(=) ident(int_all)operator(()ident(nums)operator(\)) + +ident(nums) operator(=) operator([)float(1.4)operator(,) float(3.5)operator(,) float(6.7)operator(]) +reserved(def) method(trunc_em)operator(()ident(n)operator(\)) + ident(n)operator(.)ident(collect!) operator({) operator(|)ident(v)operator(|) ident(v)operator(.)ident(to_i) operator(}) comment(# the bang-version of collect modifies the object) +reserved(end) +ident(trunc_em)operator(()ident(nums)operator(\)) + +comment(# Ruby has two chomp version:) +comment(# ``chomp'' chomps the record separator and returns what's expected) +comment(# ``chomp!'' does the same but also modifies the parameter object) + + +comment(# @@PLEAC@@_10.2) +reserved(def) method(somefunc) + ident(variable) operator(=) ident(something) comment(# variable is local by default) +reserved(end) + +ident(name)operator(,) ident(age) operator(=) pre_constant(ARGV) +ident(start) operator(=) ident(fetch_time) + +ident(a)operator(,) ident(b) operator(=) ident(pair) comment(# will succeed if pair is an Array object (like ARGV is\)) +ident(c) operator(=) ident(fetch_time) + +comment(# In ruby, run_check can't access a, b, or c until they are) +comment(# explicitely defined global (using leading $\), even if they are) +comment(# both defined in the same scope) + +reserved(def) method(check_x)operator(()ident(x)operator(\)) + ident(y) operator(=) string<delimiter(")content(whatever)delimiter(")> + ident(run_check) + reserved(if) global_variable($condition) + ident(puts) string<delimiter(")content(got $x)delimiter(")> + reserved(end) +reserved(end) + +comment(# The following will keep a reference to the array, though the) +comment(# results will be slightly different from perl: the last element) +comment(# of $global_array will be itself an array) +reserved(def) method(save_array)operator(()ident(ary)operator(\)) + global_variable($global_array) operator(<<) ident(ary) +reserved(end) + +comment(# The following gives the same results as in Perl for $global_array,) +comment(# though it doesn't illustrate anymore the way to keep a reference) +comment(# to an object: $global_array is extended with the elements of ary) +reserved(def) method(save_array)operator(()ident(ary)operator(\)) + global_variable($global_array) operator(+=) ident(ary) +reserved(end) + + +comment(# @@PLEAC@@_10.3) +comment(# In Ruby, AFAIK a method cannot access "local variables" defined) +comment(# upper scope; mostly because everything is an object, so you'll) +comment(# do the same by defining an attribute or a static attribute) + +comment(# In Ruby the BEGIN also exists:) +reserved(BEGIN) operator({) ident(puts) string<delimiter(")content(hello from BEGIN)delimiter(")> operator(}) +ident(puts) string<delimiter(")content(hello from main)delimiter(")> +reserved(BEGIN) operator({) ident(puts) string<delimiter(")content(hello from 2nd BEGIN)delimiter(")> operator(}) +comment(# gives:) +comment(# hello from BEGIN) +comment(# hello from 2nd BEGIN) +comment(# hello from main) + +comment(# In Ruby, it can be written as a static method and a static) +comment(# variable) +reserved(class) class(Counter) + class_variable(@@counter) operator(=) integer(0) + reserved(def) constant(Counter)operator(.)ident(next_counter)operator(;) class_variable(@@counter) operator(+=) integer(1)operator(;) reserved(end) +reserved(end) + +comment(# There is no need of BEGIN since the variable will get) +comment(# initialized when parsing) +reserved(class) class(Counter) + class_variable(@@counter) operator(=) integer(42) + reserved(def) constant(Counter)operator(.)ident(next_counter)operator(;) class_variable(@@counter) operator(+=) integer(1)operator(;) reserved(end) + reserved(def) constant(Counter)operator(.)ident(prev_counter)operator(;) class_variable(@@counter) operator(-=) integer(1)operator(;) reserved(end) +reserved(end) + + +comment(# @@PLEAC@@_10.4) +comment(# You can either get the whole trace as an array of strings, each) +comment(# string telling which file, line and method is calling:) +ident(caller) + +comment(# ...or only the last caller) +ident(caller)operator([)integer(0)operator(]) + +comment(# We need to extract just the method name of the backtrace:) +reserved(def) method(whoami)operator(;) ident(caller)operator(()operator(\))operator([)integer(0)operator(]) operator(=)operator(~) regexp<delimiter(/)content(in `([^']+\)')delimiter(/)> operator(?) global_variable($1) operator(:) string<delimiter(')content((anonymous\))delimiter(')>operator(;) reserved(end) +reserved(def) method(whowasi)operator(;) ident(caller)operator(()operator(\))operator([)integer(1)operator(]) operator(=)operator(~) regexp<delimiter(/)content(in `([^']+\)')delimiter(/)> operator(?) global_variable($1) operator(:) string<delimiter(')content((anonymous\))delimiter(')>operator(;) reserved(end) + + +comment(# @@PLEAC@@_10.5) +comment(# In Ruby, every value is a reference on an object, thus there is) +comment(# no such problem) +ident(array_diff)operator(()ident(array1)operator(,) ident(array2)operator(\)) + +reserved(def) method(add_vecpair)operator(()ident(a1)operator(,) ident(a2)operator(\)) + ident(results) operator(=) operator([)operator(]) + ident(a1)operator(.)ident(each_index) operator({) operator(|)ident(i)operator(|) ident(results) operator(<<) operator(()ident(a1)operator([)ident(i)operator(]) operator(+) ident(a2)operator([)ident(i)operator(])operator(\)) operator(}) + ident(results) +reserved(end) +ident(a) operator(=) operator([)integer(1)operator(,) integer(2)operator(]) +ident(b) operator(=) operator([)integer(5)operator(,) integer(8)operator(]) +ident(c) operator(=) ident(add_vecpair)operator(()ident(a)operator(,) ident(b)operator(\)) +ident(p) ident(c) + +comment(# Add this to the beginning of the function to check if we were) +comment(# given two arrays) +ident(a1)operator(.)ident(type) operator(==) constant(Array) operator(&&) ident(a2)operator(.)ident(type) operator(==) constant(Array) reserved(or) + ident(raise) string<delimiter(")content(usage: add_vecpair array1 array2 (was used with: )inline<delimiter(#{)ident(a1)operator(.)ident(type)delimiter(})>content( )inline<delimiter(#{)ident(a2)operator(.)ident(type)delimiter(})>content(\))delimiter(")> + + +comment(# @@PLEAC@@_10.6) +comment(# There is no return context in Ruby) + + +comment(# @@PLEAC@@_10.7) +comment(# Like in Perl, we need to fake with a hash, but it's dirty :-() +reserved(def) method(thefunc)operator(()ident(param_args)operator(\)) + ident(args) operator(=) operator({) string<delimiter(')content(INCREMENT)delimiter(')> operator(=)operator(>) string<delimiter(')content(10s)delimiter(')>operator(,) string<delimiter(')content(FINISH)delimiter(')> operator(=)operator(>) string<delimiter(')content(0)delimiter(')>operator(,) string<delimiter(')content(START)delimiter(')> operator(=)operator(>) integer(0) operator(}) + ident(args)operator(.)ident(update)operator(()ident(param_args)operator(\)) + reserved(if) operator(()ident(args)operator([)string<delimiter(')content(INCREMENT)delimiter(')>operator(]) operator(=)operator(~) regexp<delimiter(/)content(m$)delimiter(/)> operator(\)) + comment(# .....) + reserved(end) +reserved(end) + +ident(thefunc)operator(()operator({) string<delimiter(')content(INCREMENT)delimiter(')> operator(=)operator(>) string<delimiter(')content(20s)delimiter(')>operator(,) string<delimiter(')content(START)delimiter(')> operator(=)operator(>) string<delimiter(')content(+5m)delimiter(')>operator(,) string<delimiter(')content(FINISH)delimiter(')> operator(=)operator(>) string<delimiter(')content(+30m)delimiter(')> operator(})operator(\)) +ident(thefunc)operator(()operator({)operator(})operator(\)) + + +comment(# @@PLEAC@@_10.8) +comment(# there is no "undef" direct equivalent but there is the slice equiv:) +ident(a)operator(,) ident(c) operator(=) ident(func)operator(.)ident(indexes)operator(()integer(0)operator(,) integer(2)operator(\)) + + +comment(# @@PLEAC@@_10.9) +comment(# Ruby has no such limitation:) +reserved(def) method(somefunc) + ident(ary) operator(=) operator([)operator(]) + ident(hash) operator(=) operator({)operator(}) + comment(# ...) + reserved(return) ident(ary)operator(,) ident(hash) +reserved(end) +ident(arr)operator(,) ident(dict) operator(=) ident(somefunc) + +ident(array_of_hashes) operator(=) ident(fn) +ident(h1)operator(,) ident(h2)operator(,) ident(h3) operator(=) ident(fn) + + +comment(# @@PLEAC@@_10.10) +reserved(return) +comment(# or (equivalent\)) +reserved(return) pre_constant(nil) + + +comment(# @@PLEAC@@_10.11) +comment(# You can't prototype in Ruby regarding types :-() +comment(# Though, you can force the number of arguments:) +reserved(def) method(func_with_no_arg)operator(;) reserved(end) +reserved(def) method(func_with_no_arg)operator(()operator(\))operator(;) reserved(end) +reserved(def) method(func_with_one_arg)operator(()ident(a1)operator(\))operator(;) reserved(end) +reserved(def) method(func_with_two_args)operator(()ident(a1)operator(,) ident(a2)operator(\))operator(;) reserved(end) +reserved(def) method(func_with_any_number_of_args)operator(()operator(*)ident(args)operator(\))operator(;) reserved(end) + + +comment(# @@PLEAC@@_10.12) +ident(raise) string<delimiter(")content(some message)delimiter(")> comment(# raise exception) + +reserved(begin) + ident(val) operator(=) ident(func) +reserved(rescue) constant(Exception) operator(=)operator(>) ident(msg) + global_variable($stderr)operator(.)ident(puts) string<delimiter(")content(func raised an exception: )inline<delimiter(#{)ident(msg)delimiter(})>delimiter(")> +reserved(end) + +comment(# In Ruby the rescue statement uses an exception class, every) +comment(# exception which is not matched is still continuing) +reserved(begin) + ident(val) operator(=) ident(func) +reserved(rescue) constant(FullMoonError) + operator(...) +reserved(end) + + +comment(# @@PLEAC@@_10.13) +comment(# Saving Global Values) +comment(# Of course we can just save the value and restore it later:) +reserved(def) method(print_age) + ident(puts) string<delimiter(")content(Age is )inline<delimiter(#{)global_variable($age)delimiter(})>delimiter(")> +reserved(end) + +global_variable($age) operator(=) integer(18) comment(# global variable) +ident(print_age)operator(()operator(\)) +reserved(if) ident(condition) + ident(safeage) operator(=) global_variable($age) + global_variable($age) operator(=) integer(23) + ident(print_age)operator(()operator(\)) + global_variable($age) operator(=) ident(safeage) +reserved(end) + +comment(# We can also use a method that saves the global variable and) +comment(# restores it automatically when the block is left:) + +reserved(def) method(local)operator(()ident(var)operator(\)) + ident(eval)operator(()string<delimiter(")content(save = )inline<delimiter(#{)ident(var)operator(.)ident(id2name)delimiter(})>delimiter(")>operator(\)) + reserved(begin) + ident(result) operator(=) reserved(yield) + reserved(ensure) + comment(# we want to call this even if we got an exception) + ident(eval)operator(()string<delimiter(")inline<delimiter(#{)ident(var)operator(.)ident(id2name)delimiter(})>content( = save)delimiter(")>operator(\)) + reserved(end) + ident(result) +reserved(end) + +ident(condition) operator(=) pre_constant(true) +global_variable($age) operator(=) integer(18) +ident(print_age)operator(()operator(\)) +reserved(if) ident(condition) + ident(local)operator(()symbol(:$age)operator(\)) operator({) + global_variable($age) operator(=) integer(23) + ident(print_age)operator(()operator(\)) + operator(}) +reserved(end) +ident(print_age)operator(()operator(\)) + +comment(# There is no need to use local(\) for filehandles or directory) +comment(# handles in ruby because filehandles are normal objects.) + + +comment(# @@PLEAC@@_10.14) +comment(# In Ruby you may redefine a method [but not overload it :-(]) +comment(# just by defining again with the same name.) +reserved(def) method(foo)operator(;) ident(puts) string<delimiter(')content(foo)delimiter(')>operator(;) reserved(end) +reserved(def) method(foo)operator(;) ident(puts) string<delimiter(')content(bar)delimiter(')>operator(;) reserved(end) +ident(foo) +comment(#=> bar) + +comment(# You can also take a reference to an existing method before) +comment(# redefining a new one, using the `alias' keyword) +reserved(def) method(foo)operator(;) ident(puts) string<delimiter(')content(foo)delimiter(')>operator(;) reserved(end) +reserved(alias) ident(foo_orig) ident(foo) +reserved(def) method(foo)operator(;) ident(puts) string<delimiter(')content(bar)delimiter(')>operator(;) reserved(end) +ident(foo_orig) +ident(foo) +comment(#=> foo) +comment(#=> bar) + +comment(# AFAIK, there is no direct way to create a new method whose name) +comment(# comes from a variable, so use "eval") +ident(colors) operator(=) string<delimiter(%w()content(red blue green yellow orange purple violet)delimiter(\))> +ident(colors)operator(.)ident(each) operator({) operator(|)ident(c)operator(|) + ident(eval) string<delimiter(<<-EOS)>string<content( + def )inline<delimiter(#{)ident(c)delimiter(})>content((*a\) + "<FONT COLOR=')inline<delimiter(#{)ident(c)delimiter(})>content('>" + a.to_s + "</FONT>" + end)delimiter( + EOS)> +operator(}) + + +comment(# @@PLEAC@@_10.15) +reserved(def) method(method_missing)operator(()ident(name)operator(,) operator(*)ident(args)operator(\)) + string<delimiter(")content(<FONT COLOR=')inline<delimiter(#{)ident(name)delimiter(})>content('>)delimiter(")> operator(+) ident(args)operator(.)ident(join)operator(()string<delimiter(')content( )delimiter(')>operator(\)) operator(+) string<delimiter(")content(</FONT>)delimiter(")> +reserved(end) +ident(puts) ident(chartreuse)operator(()string<delimiter(")content(stuff)delimiter(")>operator(\)) + + +comment(# @@PLEAC@@_10.16) +reserved(def) method(outer)operator(()ident(arg)operator(\)) + ident(x) operator(=) ident(arg) operator(+) integer(35) + ident(inner) operator(=) ident(proc) operator({) ident(x) operator(*) integer(19) operator(}) + ident(x) operator(+) ident(inner)operator(.)ident(call)operator(()operator(\)) +reserved(end) + + +comment(# @@PLEAC@@_10.17) +comment(#!/usr/bin/ruby -w) +comment(# mailsort - sort mbox by different criteria) +ident(require) string<delimiter(')content(English)delimiter(')> +ident(require) string<delimiter(')content(Date)delimiter(')> + +comment(# Objects of class Mail represent a single mail.) +reserved(class) class(Mail) + ident(attr_accessor) symbol(:no) + ident(attr_accessor) symbol(:subject) + ident(attr_accessor) symbol(:fulltext) + ident(attr_accessor) symbol(:date) + + reserved(def) method(initialize) + instance_variable(@fulltext) operator(=) string<delimiter(")delimiter(")> + instance_variable(@subject) operator(=) string<delimiter(")delimiter(")> + reserved(end) + + reserved(def) method(append)operator(()ident(para)operator(\)) + instance_variable(@fulltext) operator(<<) ident(para) + reserved(end) + + comment(# this is called if you call puts(mail\)) + reserved(def) method(to_s) + instance_variable(@fulltext) + reserved(end) +reserved(end) + +comment(# represents a list of mails.) +reserved(class) class(Mailbox) operator(<) constant(Array) + + constant(Subjectpattern) operator(=) constant(Regexp)operator(.)ident(new)operator(()string<delimiter(')content(Subject:)content(\\s)content(*(?:Re:)content(\\s)content(*\)*(.*\))content(\\n)delimiter(')>operator(\)) + constant(Datepattern) operator(=) constant(Regexp)operator(.)ident(new)operator(()string<delimiter(')content(Date:)content(\\s)content(*(.*\))content(\\n)delimiter(')>operator(\)) + + comment(# reads mails from open file and stores them) + reserved(def) method(read)operator(()ident(file)operator(\)) + global_variable($INPUT_RECORD_SEPARATOR) operator(=) string<delimiter(')delimiter(')> comment(# paragraph reads) + ident(msgno) operator(=) integer(-1) + ident(file)operator(.)ident(each) operator({) operator(|)ident(para)operator(|) + reserved(if) ident(para) operator(=)operator(~) regexp<delimiter(/)content(^From)delimiter(/)> + ident(mail) operator(=) constant(Mail)operator(.)ident(new) + ident(mail)operator(.)ident(no) operator(=) operator(()ident(msgno) operator(+=) integer(1)operator(\)) + ident(md) operator(=) constant(Subjectpattern)operator(.)ident(match)operator(()ident(para)operator(\)) + reserved(if) ident(md) + ident(mail)operator(.)ident(subject) operator(=) ident(md)operator([)integer(1)operator(]) + reserved(end) + ident(md) operator(=) constant(Datepattern)operator(.)ident(match)operator(()ident(para)operator(\)) + reserved(if) ident(md) + ident(mail)operator(.)ident(date) operator(=) constant(DateTime)operator(.)ident(parse)operator(()ident(md)operator([)integer(1)operator(])operator(\)) + reserved(else) + ident(mail)operator(.)ident(date) operator(=) constant(DateTime)operator(.)ident(now) + reserved(end) + pre_constant(self)operator(.)ident(push)operator(()ident(mail)operator(\)) + reserved(end) + ident(mail)operator(.)ident(append)operator(()ident(para)operator(\)) reserved(if) ident(mail) + operator(}) + reserved(end) + + reserved(def) method(sort_by_subject_and_no) + pre_constant(self)operator(.)ident(sort_by) operator({) operator(|)ident(m)operator(|) + operator([)ident(m)operator(.)ident(subject)operator(,) ident(m)operator(.)ident(no)operator(]) + operator(}) + reserved(end) + + comment(# sorts by a list of attributs of mail, given as symbols) + reserved(def) method(sort_by_attributs)operator(()operator(*)ident(attrs)operator(\)) + comment(# you can sort an Enumerable by an array of) + comment(# values, they would be compared) + comment(# from ary[0] to ary[n]t, say:) + comment(# ['b',1] > ['a',10] > ['a',9]) + pre_constant(self)operator(.)ident(sort_by) operator({) operator(|)ident(elem)operator(|) + ident(attrs)operator(.)ident(map) operator({) operator(|)ident(attr)operator(|) + ident(elem)operator(.)ident(send)operator(()ident(attr)operator(\)) + operator(}) + operator(}) + reserved(end) + +reserved(end) + +ident(mailbox) operator(=) constant(Mailbox)operator(.)ident(new) +ident(mailbox)operator(.)ident(read)operator(()pre_constant(ARGF)operator(\)) + +comment(# print only subjects sorted by subject and number) +reserved(for) ident(m) reserved(in) ident(mailbox)operator(.)ident(sort_by_subject_and_no) + ident(puts)operator(()ident(m)operator(.)ident(subject)operator(\)) +reserved(end) + +comment(# print complete mails sorted by date, then subject, then number) +reserved(for) ident(m) reserved(in) ident(mailbox)operator(.)ident(sort_by_attributs)operator(()symbol(:date)operator(,) symbol(:subject)operator(\)) + ident(puts)operator(()ident(m)operator(\)) +reserved(end) + + +comment(# @@PLEAC@@_11.7) +reserved(def) method(mkcounter)operator(()ident(count)operator(\)) + ident(start) operator(=) ident(count) + ident(bundle) operator(=) operator({) + string<delimiter(")content(NEXT)delimiter(")> operator(=)operator(>) ident(proc) operator({) ident(count) operator(+=) integer(1) operator(})operator(,) + string<delimiter(")content(PREV)delimiter(")> operator(=)operator(>) ident(proc) operator({) ident(count) operator(-=) integer(1) operator(})operator(,) + string<delimiter(")content(RESET)delimiter(")> operator(=)operator(>) ident(proc) operator({) ident(count) operator(=) ident(start) operator(}) + operator(}) + ident(bundle)operator([)string<delimiter(")content(LAST)delimiter(")>operator(]) operator(=) ident(bundle)operator([)string<delimiter(")content(PREV)delimiter(")>operator(]) + reserved(return) ident(bundle) +reserved(end) + +ident(c1) operator(=) ident(mkcounter)operator(()integer(20)operator(\)) +ident(c2) operator(=) ident(mkcounter)operator(()integer(77)operator(\)) + +ident(puts) string<delimiter(")content(next c1: )inline<delimiter(#{)ident(c1)operator([)string<delimiter(")content(NEXT)delimiter(")>operator(])operator(.)ident(call)delimiter(})>delimiter(")> comment(# 21 ) +ident(puts) string<delimiter(")content(next c2: )inline<delimiter(#{)ident(c2)operator([)string<delimiter(")content(NEXT)delimiter(")>operator(])operator(.)ident(call)delimiter(})>delimiter(")> comment(# 78 ) +ident(puts) string<delimiter(")content(next c1: )inline<delimiter(#{)ident(c1)operator([)string<delimiter(")content(NEXT)delimiter(")>operator(])operator(.)ident(call)delimiter(})>delimiter(")> comment(# 22 ) +ident(puts) string<delimiter(")content(last c1: )inline<delimiter(#{)ident(c1)operator([)string<delimiter(")content(PREV)delimiter(")>operator(])operator(.)ident(call)delimiter(})>delimiter(")> comment(# 21 ) +ident(puts) string<delimiter(")content(last c1: )inline<delimiter(#{)ident(c1)operator([)string<delimiter(")content(LAST)delimiter(")>operator(])operator(.)ident(call)delimiter(})>delimiter(")> comment(# 20 ) +ident(puts) string<delimiter(")content(old c2: )inline<delimiter(#{)ident(c2)operator([)string<delimiter(")content(RESET)delimiter(")>operator(])operator(.)ident(call)delimiter(})>delimiter(")> comment(# 77 ) + + +comment(# @@PLEAC@@_11.15) +reserved(class) class(Binary_tree) + reserved(def) method(initialize)operator(()ident(val)operator(\)) + instance_variable(@value) operator(=) ident(val) + instance_variable(@left) operator(=) pre_constant(nil) + instance_variable(@right) operator(=) pre_constant(nil) + reserved(end) + + comment(# insert given value into proper point of) + comment(# provided tree. If no tree provided, ) + comment(# use implicit pass by reference aspect of @_) + comment(# to fill one in for our caller.) + reserved(def) method(insert)operator(()ident(val)operator(\)) + reserved(if) ident(val) operator(<) instance_variable(@value) reserved(then) + reserved(if) instance_variable(@left) reserved(then) + instance_variable(@left)operator(.)ident(insert)operator(()ident(val)operator(\)) + reserved(else) + instance_variable(@left) operator(=) constant(Binary_tree)operator(.)ident(new)operator(()ident(val)operator(\)) + reserved(end) + reserved(elsif) ident(val) operator(>) instance_variable(@value) reserved(then) + reserved(if) instance_variable(@right) reserved(then) + instance_variable(@right)operator(.)ident(insert)operator(()ident(val)operator(\)) + reserved(else) + instance_variable(@right) operator(=) constant(Binary_tree)operator(.)ident(new)operator(()ident(val)operator(\)) + reserved(end) + reserved(else) + ident(puts) string<delimiter(")content(double)delimiter(")> + comment(# do nothing, no double values) + reserved(end) + reserved(end) + + comment(# recurse on left child, ) + comment(# then show current value, ) + comment(# then recurse on right child. ) + reserved(def) method(in_order) + instance_variable(@left)operator(.)ident(in_order) reserved(if) instance_variable(@left) + ident(print) instance_variable(@value)operator(,) string<delimiter(")content( )delimiter(")> + instance_variable(@right)operator(.)ident(in_order) reserved(if) instance_variable(@right) + reserved(end) + + comment(# show current value, ) + comment(# then recurse on left child, ) + comment(# then recurse on right child.) + reserved(def) method(pre_order) + ident(print) instance_variable(@value)operator(,) string<delimiter(")content( )delimiter(")> + instance_variable(@left)operator(.)ident(pre_order) reserved(if) instance_variable(@left) + instance_variable(@right)operator(.)ident(pre_order) reserved(if) instance_variable(@right) + reserved(end) + + comment(# recurse on left child, ) + comment(# then recurse on right child,) + comment(# then show current value.) + reserved(def) method(post_order) + instance_variable(@left)operator(.)ident(post_order) reserved(if) instance_variable(@left) + instance_variable(@right)operator(.)ident(post_order) reserved(if) instance_variable(@right) + ident(print) instance_variable(@value)operator(,) string<delimiter(")content( )delimiter(")> + reserved(end) + + comment(# find out whether provided value is in the tree.) + comment(# if so, return the node at which the value was found.) + comment(# cut down search time by only looking in the correct) + comment(# branch, based on current value.) + reserved(def) method(search)operator(()ident(val)operator(\)) + reserved(if) ident(val) operator(==) instance_variable(@value) reserved(then) + reserved(return) pre_constant(self) + reserved(elsif) ident(val) operator(<) instance_variable(@value) reserved(then) + reserved(return) instance_variable(@left)operator(.)ident(search)operator(()ident(val)operator(\)) reserved(if) instance_variable(@left) + reserved(return) pre_constant(nil) + reserved(else) + reserved(return) instance_variable(@right)operator(.)ident(search)operator(()ident(val)operator(\)) reserved(if) instance_variable(@right) + reserved(return) pre_constant(nil) + reserved(end) + reserved(end) +reserved(end) + +comment(# first generate 20 random inserts) +ident(test) operator(=) constant(Binary_tree)operator(.)ident(new)operator(()integer(0)operator(\)) +reserved(for) ident(a) reserved(in) integer(0)operator(..)integer(20) + ident(test)operator(.)ident(insert)operator(()ident(rand)operator(()integer(1000)operator(\))operator(\)) +reserved(end) + +comment(# now dump out the tree all three ways) +ident(print) string<delimiter(")content(Pre order: )delimiter(")>operator(;) ident(test)operator(.)ident(pre_order)operator(;) ident(puts) string<delimiter(")delimiter(")> +ident(print) string<delimiter(")content(In order: )delimiter(")>operator(;) ident(test)operator(.)ident(in_order)operator(;) ident(puts) string<delimiter(")delimiter(")> +ident(print) string<delimiter(")content(Post order: )delimiter(")>operator(;) ident(test)operator(.)ident(post_order)operator(;) ident(puts) string<delimiter(")delimiter(")> + +ident(print) string<delimiter(")content(search?)delimiter(")> +reserved(while) ident(gets) + ident(print) ident(test)operator(.)ident(search)operator(()global_variable($_)operator(.)ident(to_i)operator(\)) + ident(print) string<delimiter(")char(\\n)content(search?)delimiter(")> +reserved(end) + + +comment(# @@PLEAC@@_12.0) +comment(# class and module names need to have the first letter capitalized) +reserved(module) class(Alpha) + constant(NAME) operator(=) string<delimiter(')content(first)delimiter(')> +reserved(end) +reserved(module) class(Omega) + constant(NAME) operator(=) string<delimiter(')content(last)delimiter(')> +reserved(end) +ident(puts) string<delimiter(")content(Alpha is )inline<delimiter(#{)constant(Alpha)operator(::)constant(NAME)delimiter(})>content(, Omega is )inline<delimiter(#{)constant(Omega)operator(::)constant(NAME)delimiter(})>delimiter(")> + +comment(# ruby doesn't differentiate beteen compile-time and run-time) +ident(require) string<delimiter(')content(getoptlong.rb)delimiter(')> +ident(require) string<delimiter(')content(getoptlong)delimiter(')> comment(# assumes the .rb) +ident(require) string<delimiter(')content(cards/poker.rb)delimiter(')> +ident(require) string<delimiter(')content(cards/poker)delimiter(')> comment(# assumes the .rb) +ident(load) string<delimiter(')content(cards/poker)delimiter(')> comment(# require only loads the file once) + +reserved(module) class(Cards) + reserved(module) class(Poker) + instance_variable(@card_deck) operator(=) constant(Array)operator(.)ident(new) comment(# or @card_deck = []) + reserved(def) method(shuffle) + reserved(end) + reserved(end) +reserved(end) + + +comment(# @@PLEAC@@_12.1) +comment(# a module exports all of its functions) +reserved(module) class(Your_Module) + reserved(def) pre_constant(self)operator(.)ident(function) + comment(# this would be called as Your_Module.function) + reserved(end) + + reserved(def) constant(Your_Module)operator(.)ident(another) + comment(# this is the same as above, but more specific) + reserved(end) +reserved(end) + +comment(# @@PLEAC@@_12.2) +reserved(begin) + ident(require) string<delimiter(')content(nonexistent)delimiter(')> +reserved(rescue) constant(LoadError) + ident(puts) string<delimiter(")content(Couldn't load )inline<delimiter(#{)global_variable($!)delimiter(})>delimiter(")> comment(# $! contains the last error string) +reserved(end) + +comment(# @@PLEAC@@_12.4) +comment(# module variables are private unless access functions are defined) +reserved(module) class(Alpha) + instance_variable(@aa) operator(=) integer(10) + instance_variable(@bb) operator(=) integer(11) + + reserved(def) pre_constant(self)operator(.)ident(put_aa) + ident(puts) instance_variable(@aa) + reserved(end) + + reserved(def) pre_constant(self)operator(.)ident(bb)operator(=)operator(()ident(val)operator(\)) + instance_variable(@bb) operator(=) ident(val) + reserved(end) +reserved(end) + +constant(Alpha)operator(.)ident(bb) operator(=) integer(12) +comment(# Alpha.aa = 10 # error, no aa=method) + + +comment(# @@PLEAC@@_12.5) +comment(# caller provides a backtrace of the call stack) +reserved(module) class(MyModule) + reserved(def) method(find_caller) + ident(caller) + reserved(end) + + reserved(def) method(find_caller2)operator(()ident(i)operator(\)) + ident(caller)operator(()ident(i)operator(\)) comment(# an argument limits the size of the stack returned) + reserved(end) +reserved(end) + + +comment(# @@PLEAC@@_12.6) +reserved(BEGIN) operator({) + global_variable($logfile) operator(=) string<delimiter(')content(/tmp/mylog)delimiter(')> reserved(unless) reserved(defined?) global_variable($logfile) + global_variable($LF) operator(=) constant(File)operator(.)ident(open)operator(()global_variable($logfile)operator(,) string<delimiter(')content(a)delimiter(')>operator(\)) +operator(}) + +reserved(module) class(Logger) + reserved(def) pre_constant(self)operator(.)ident(logmsg)operator(()ident(msg)operator(\)) + global_variable($LF)operator(.)ident(puts) ident(msg) + reserved(end) + + ident(logmsg)operator(()string<delimiter(')content(startup)delimiter(')>operator(\)) +reserved(end) + +reserved(END) operator({) + constant(Logger)operator(::)ident(logmsg)operator(()string<delimiter(')content(shutdown)delimiter(')>operator(\)) + global_variable($LF)operator(.)ident(close) +operator(}) + + +comment(# @@PLEAC@@_12.7) +comment(#-----------------------------) +comment(# results may be different on your system) +comment(# % ruby -e "$LOAD_PATH.each_index { |i| printf("%d %s\\n", i, $LOAD_PATH[i] }) +comment(#0 /usr/local/lib/site_ruby/1.6) +comment(#1 /usr/local/lib/site_ruby/1.6/i386-linux) +comment(#2 /usr/local/lib/site_ruby/) +comment(#3 /usr/lib/ruby/1.6) +comment(#4 /usr/lib/ruby/1.6/i136-linux) +comment(#5 .) +comment(#-----------------------------) +comment(# syntax for sh, bash, ksh, or zsh) +comment(#$ export RUBYLIB=$HOME/rubylib) + +comment(# syntax for csh or tcsh) +comment(# % setenv RUBYLIB ~/rubylib) +comment(#-----------------------------) +global_variable($LOAD_PATH)operator(.)ident(unshift) string<delimiter(")content(/projects/spectre/lib)delimiter(")>operator(;) + + +comment(# @@PLEAC@@_12.8) +comment(# equivalents in ruby are mkmf, SWIG, or Ruby/DL depending on usage) + + +comment(# @@PLEAC@@_12.9) +comment(# no equivalent in ruby) + + +comment(# @@PLEAC@@_12.10) +comment(# no equivalent in ruby) + + +comment(# @@PLEAC@@_12.11) +reserved(module) class(FineTime) + reserved(def) pre_constant(self)operator(.)ident(time) + comment(# to be defined later) + reserved(end) +reserved(end) + + +reserved(module) class(FineTime) + reserved(def) pre_constant(self)operator(.)ident(time) + string<delimiter(")content(its a fine time)delimiter(")> + reserved(end) +reserved(end) + +ident(puts) constant(FineTime)operator(.)ident(time) comment(#=> "its a fine time") + + +comment(# @@PLEAC@@_12.12) +reserved(def) method(even_only)operator(()ident(n)operator(\)) + ident(raise) string<delimiter(")inline<delimiter(#{)ident(n)delimiter(})>content( is not even)delimiter(")> reserved(if) operator(()ident(n) operator(&) integer(1)operator(\)) operator(!=) integer(0) comment(# one way to test) + comment(# ...) +reserved(end) +reserved(def) method(even_only)operator(()ident(n)operator(\)) + global_variable($stderr)operator(.)ident(puts) string<delimiter(")inline<delimiter(#{)ident(n)delimiter(})>content( is not even)delimiter(")> reserved(if) operator(()ident(n) operator(&) integer(1)operator(\)) operator(!=) integer(0) + comment(# ...) +reserved(end) + + +comment(# @@PLEAC@@_12.17) +comment(# The library archive for ruby is called Ruby Application archive,) +comment(# or shorter RAA, and can be found at http://raa.ruby-lang.org.) +comment(# A typical library is installed like this:) +comment(# % gunzip some-module-4.54.tar.gz) +comment(# % tar xf some-module-4.54.tar) +comment(# % cd some-module-4.54.tar) +comment(# % ruby install.rb config) +comment(# % ruby install.rb setup) +comment(# get superuser previleges here if needed for next step) +comment(# % ruby install.rb install) + +comment(# Some modules use a different process,) +comment(# you should find details in the documentation) +comment(# Here is an example of such a different process) +comment(# % ruby extconf.rb) +comment(# % make) +comment(# % make install) + +comment(# If you want the module installed in your own directory:) +comment(# For ruby version specific libraries) +comment(# % ruby install.rb config --site-ruby=~/lib) +comment(# For version independent libraries) +comment(# % ruby install.rb config --site-ruby-common=~/lib) + +comment(# Information about possible options for config) +comment(# % ruby install.rb --help) + +comment(# If you have your own complete distribution) +comment(# % ruby install.rb --prefix=path=~/ruby-private) + + +comment(# @@PLEAC@@_13.0) +comment(# Classes and objects in Ruby are rather straigthforward) +reserved(class) class(Person) + comment(# Class variables (also called static attributes\) are prefixed by @@) + class_variable(@@person_counter)operator(=)integer(0) + + comment(# object constructor) + reserved(def) method(initialize)operator(()ident(age)operator(,) ident(name)operator(,) ident(alive) operator(=) pre_constant(true)operator(\)) comment(# Default arg like in C++) + instance_variable(@age)operator(,) instance_variable(@name)operator(,) instance_variable(@alive) operator(=) ident(age)operator(,) ident(name)operator(,) ident(alive) comment(# Object attributes are prefixed by '@') + class_variable(@@person_counter) operator(+=) integer(1) + comment(# There is no '++' operator in Ruby. The '++'/'--' operators are in fact ) + comment(# hidden assignments which affect variables, not objects. You cannot accomplish) + comment(# assignment via method. Since everything in Ruby is object, '++' and '--' ) + comment(# contradict Ruby OO ideology. Instead '-=' and '+=' are used.) + reserved(end) + + ident(attr_accessor) symbol(:name)operator(,) symbol(:age) comment(# This creates setter and getter methods for @name) + comment(# and @age. See 13.3 for detailes.) + + comment(# methods modifying the receiver object usually have the '!' suffix) + reserved(def) method(die!) + instance_variable(@alive) operator(=) pre_constant(false) + ident(puts) string<delimiter(")inline<delimiter(#{)instance_variable(@name)delimiter(})>content( has died at the age of )inline<delimiter(#{)instance_variable(@age)delimiter(})>content(.)delimiter(")> + instance_variable(@alive) + reserved(end) + + reserved(def) method(kill)operator(()ident(anotherPerson)operator(\)) + ident(print) instance_variable(@name)operator(,) string<delimiter(')content( is killing )delimiter(')>operator(,) ident(anotherPerson)operator(.)ident(name)operator(,) string<delimiter(")content(.)char(\\n)delimiter(")> + ident(anotherPerson)operator(.)ident(die!) + reserved(end) + + comment(# methods used as queries) + comment(# usually have the '?' suffix ) + reserved(def) method(alive?) + instance_variable(@alive) operator(&&) pre_constant(true) + reserved(end) + + reserved(def) method(year_of_birth) + constant(Time)operator(.)ident(now)operator(.)ident(year) operator(-) instance_variable(@age) + reserved(end) + + comment(# Class method (also called static method\)) + reserved(def) constant(Person)operator(.)ident(number_of_people) + class_variable(@@person_counter) + reserved(end) +reserved(end) + +comment(# Using the class:) +comment(# Create objects of class Person) +ident(lecter) operator(=) constant(Person)operator(.)ident(new)operator(()integer(47)operator(,) string<delimiter(')content(Hannibal)delimiter(')>operator(\)) +ident(starling) operator(=) constant(Person)operator(.)ident(new)operator(()integer(29)operator(,) string<delimiter(')content(Clarice)delimiter(')>operator(,) pre_constant(true)operator(\)) +ident(pazzi) operator(=) constant(Person)operator(.)ident(new)operator(()integer(40)operator(,) string<delimiter(')content(Rinaldo)delimiter(')>operator(,) pre_constant(true)operator(\)) + +comment(# Calling a class method) +ident(print) string<delimiter(")content(There are )delimiter(")>operator(,) constant(Person)operator(.)ident(number_of_people)operator(,) string<delimiter(")content( Person objects)char(\\n)delimiter(")> + +ident(print) ident(pazzi)operator(.)ident(name)operator(,) string<delimiter(')content( is )delimiter(')>operator(,) operator(()ident(pazzi)operator(.)ident(alive?)operator(\)) operator(?) string<delimiter(')content(alive)delimiter(')> operator(:) string<delimiter(')content(dead)delimiter(')>operator(,) string<delimiter(")content(.)char(\\n)delimiter(")> +ident(lecter)operator(.)ident(kill)operator(()ident(pazzi)operator(\)) +ident(print) ident(pazzi)operator(.)ident(name)operator(,) string<delimiter(')content( is )delimiter(')>operator(,) operator(()ident(pazzi)operator(.)ident(alive?)operator(\)) operator(?) string<delimiter(')content(alive)delimiter(')> operator(:) string<delimiter(')content(dead)delimiter(')>operator(,) string<delimiter(")content(.)char(\\n)delimiter(")> + +ident(print) ident(starling)operator(.)ident(name) operator(,) string<delimiter(')content( was born in )delimiter(')>operator(,) ident(starling)operator(.)ident(year_of_birth)operator(,) string<delimiter(")char(\\n)delimiter(")> + + +comment(# @@PLEAC@@_13.1) +comment(# If you don't need any initialisation in the constructor,) +comment(# you don't need to write a constructor.) +reserved(class) class(MyClass) +reserved(end) + +reserved(class) class(MyClass) + reserved(def) method(initialize) + instance_variable(@start) operator(=) constant(Time)operator(.)ident(new) + instance_variable(@age) operator(=) integer(0) + reserved(end) +reserved(end) + +reserved(class) class(MyClass) + reserved(def) method(initialize)operator(()ident(inithash)operator(\)) + instance_variable(@start) operator(=) constant(Time)operator(.)ident(new) + instance_variable(@age) operator(=) integer(0) + reserved(for) ident(key)operator(,) ident(value) reserved(in) ident(inithash) + ident(instance_variable_set)operator(()string<delimiter(")content(@)inline<delimiter(#{)ident(key)delimiter(})>delimiter(")>operator(,) ident(value)operator(\)) + reserved(end) + reserved(end) +reserved(end) + +comment(# @@PLEAC@@_13.2) +comment(# Objects are destroyed by the garbage collector.) +comment(# The time of destroying is not predictable.) +comment(# The ruby garbage collector can handle circular references,) +comment(# so there is no need to write destructor for that.) + +comment(# There is no direct support for destructor.) +comment(# You can call a custom function, or more specific a proc object, when the) +comment(# garbage collector is about to destruct the object, but it is unpredictable) +comment(# when this occurs.) +comment(# Also if such a finalizer object has a reference to the orignal object,) +comment(# this may prevent the original object to get garbage collected.) +comment(# Because of this problem the finalize method below is) +comment(# a class method and not a instance method.) +comment(# So if you need to free resources for an object, like) +comment(# closing a socket or kill a spawned subprocess,) +comment(# you should do it explicitly.) + +reserved(class) class(MyClass) + reserved(def) method(initialize) + constant(ObjectSpace)operator(.)ident(define_finalizer)operator(()pre_constant(self)operator(,) + pre_constant(self)operator(.)ident(class)operator(.)ident(method)operator(()symbol(:finalize)operator(\))operator(.)ident(to_proc)operator(\)) + reserved(end) + reserved(def) constant(MyClass)operator(.)ident(finalize)operator(()ident(id)operator(\)) + ident(puts) string<delimiter(")content(Object )inline<delimiter(#{)ident(id)delimiter(})>content( dying at )inline<delimiter(#{)constant(Time)operator(.)ident(new)delimiter(})>delimiter(")> + reserved(end) +reserved(end) + +comment(# test code) +integer(3)operator(.)ident(times) operator({) + constant(MyClass)operator(.)ident(new) +operator(}) +constant(ObjectSpace)operator(.)ident(garbage_collect) + + +comment(# @@PLEAC@@_13.3) +comment(# You can write getter and setter methods in a natural way:) +reserved(class) class(Person) + reserved(def) method(name) + instance_variable(@name) + reserved(end) + reserved(def) method(name=)operator(()ident(name)operator(\)) + instance_variable(@name) operator(=) ident(name) + reserved(end) +reserved(end) + +comment(# But there is a better and shorter way) +reserved(class) class(Person) + ident(attr_reader) symbol(:age) + ident(attr_writer) symbol(:name) + comment(# attr_reader and attr_writer are actually methods in class Class) + comment(# which set getter and setter methods for you.) +reserved(end) + +comment(# There is also attr_accessor to create both setters and getters) +reserved(class) class(Person) + ident(attr_accessor) symbol(:age)operator(,) symbol(:name) +reserved(end) + + +comment(# @@PLEAC@@_13.4) +reserved(class) class(Person) + comment(# Class variables (also called static attributes\) are prefixed by @@) + class_variable(@@person_counter) operator(=) integer(0) + + reserved(def) constant(Person)operator(.)ident(population) + class_variable(@@person_counter) + reserved(end) + reserved(def) method(initialize) + class_variable(@@person_counter) operator(+=) integer(1) + constant(ObjectSpace)operator(.)ident(define_finalizer)operator(()pre_constant(self)operator(,) + pre_constant(self)operator(.)ident(class)operator(.)ident(method)operator(()symbol(:finalize)operator(\))operator(.)ident(to_proc)operator(\)) + reserved(end) + reserved(def) constant(Person)operator(.)ident(finalize)operator(()ident(id)operator(\)) + class_variable(@@person_counter) operator(-=) integer(1) + reserved(end) +reserved(end) +ident(people) operator(=) operator([)operator(]) +integer(10)operator(.)ident(times) operator({) + ident(people)operator(.)ident(push)operator(()constant(Person)operator(.)ident(new)operator(\)) +operator(}) +ident(printf)operator(()string<delimiter(")content(There are %d people alive)delimiter(")>operator(,) constant(Person)operator(.)ident(population)operator(\)) + + +constant(FixedArray)operator(.)ident(class_max_bounds) operator(=) integer(100) +ident(alpha) operator(=) constant(FixedArray)operator(.)ident(new) +ident(puts) string<delimiter(")content(Bound on alpha is )inline<delimiter(#{)ident(alpha)operator(.)ident(max_bounds)delimiter(})>delimiter(")> + +ident(beta) operator(=) constant(FixedArray)operator(.)ident(new) +ident(beta)operator(.)ident(max_bounds) operator(=) integer(50) comment(# calls the instance method) +ident(beta)operator(.)ident(class)operator(.)ident(class_max_bounds) operator(=) integer(50) comment(# alternative, calls the class method) +ident(puts) string<delimiter(")content(Bound on alpha is )inline<delimiter(#{)ident(alpha)operator(.)ident(max_bounds)delimiter(})>delimiter(")> + +reserved(class) class(FixedArray) + class_variable(@@bounds) operator(=) integer(7) + + reserved(def) method(max_bounds) + class_variable(@@max_bounds) + reserved(end) + comment(# instance method, which sets the class variable) + reserved(def) method(max_bounds=)operator(()ident(value)operator(\)) + class_variable(@@max_bounds) operator(=) ident(value) + reserved(end) + comment(# class method. This can only be called on a class,) + comment(# but not on the instances) + reserved(def) constant(FixedArray)operator(.)ident(class_max_bounds)operator(=)operator(()ident(value)operator(\)) + class_variable(@@max_bounds) operator(=) ident(value) + reserved(end) +reserved(end) + + +comment(# @@PLEAC@@_13.5) +constant(PersonStruct) operator(=) constant(Struct)operator(.)ident(new)operator(()string<delimiter(")content(Person)delimiter(")>operator(,) symbol(:name)operator(,) symbol(:age)operator(,) symbol(:peers)operator(\)) +comment(# creates a class "Person::Struct", which is accessiable with the) +comment(# constant "PersonStruct") +ident(p) operator(=) constant(PersonStruct)operator(.)ident(new) +ident(p) operator(=) constant(Struct)operator(::)constant(Person)operator(.)ident(new) comment(# alternative using the classname) +ident(p)operator(.)ident(name) operator(=) string<delimiter(")content(Jason Smythe)delimiter(")> +ident(p)operator(.)ident(age) operator(=) integer(13) +ident(p)operator(.)ident(peers) operator(=) operator([)string<delimiter(")content(Wilbur)delimiter(")>operator(,) string<delimiter(")content(Ralph)delimiter(")>operator(,) string<delimiter(")content(Fred)delimiter(")>operator(]) +ident(p)operator([)symbol(:peers)operator(]) operator(=) operator([)string<delimiter(")content(Wilbur)delimiter(")>operator(,) string<delimiter(")content(Ralph)delimiter(")>operator(,) string<delimiter(")content(Fred)delimiter(")>operator(]) comment(# alternative access using symbol) +ident(p)operator([)string<delimiter(")content(peers)delimiter(")>operator(]) operator(=) operator([)string<delimiter(")content(Wilbur)delimiter(")>operator(,) string<delimiter(")content(Ralph)delimiter(")>operator(,) string<delimiter(")content(Fred)delimiter(")>operator(]) comment(# alternative access using name of field) +ident(p)operator([)integer(2)operator(]) operator(=) operator([)string<delimiter(")content(Wilbur)delimiter(")>operator(,) string<delimiter(")content(Ralph)delimiter(")>operator(,) string<delimiter(")content(Fred)delimiter(")>operator(]) comment(# alternative access using index of field) +ident(puts) string<delimiter(")content(At age )inline<delimiter(#{)ident(p)operator(.)ident(age)delimiter(})>content(, )inline<delimiter(#{)ident(p)operator(.)ident(name)delimiter(})>content('s first friend is )inline<delimiter(#{)ident(p)operator(.)ident(peers)operator([)integer(0)operator(])delimiter(})>delimiter(")> + +comment(# The fields of a struct have no special type, like other ruby variables) +comment(# you can put any objects in. Therefore the discussions how to specify) +comment(# the types of the fields do not apply to ruby.) + +constant(FamilyStruct) operator(=) constant(Struct)operator(.)ident(new)operator(()string<delimiter(")content(Family)delimiter(")>operator(,) symbol(:head)operator(,) symbol(:address)operator(,) symbol(:members)operator(\)) +ident(folks) operator(=) constant(FamilyStruct)operator(.)ident(new) +ident(folks)operator(.)ident(head) operator(=) constant(PersonStruct)operator(.)ident(new) +ident(dad) operator(=) ident(folks)operator(.)ident(head) +ident(dad)operator(.)ident(name) operator(=) string<delimiter(")content(John)delimiter(")> +ident(dad)operator(.)ident(age) operator(=) integer(34) + +comment(# supply of own accessor method for the struct for error checking) +reserved(class) class(PersonStruct) + reserved(def) method(age=)operator(()ident(value)operator(\)) + reserved(if) operator(!)ident(value)operator(.)ident(kind_of?)operator(()constant(Integer)operator(\)) + ident(raise)operator(()constant(ArgumentError)operator(,) string<delimiter(")content(Age )inline<delimiter(#{)ident(value)delimiter(})>content( isn't an Integer)delimiter(")>operator(\)) + reserved(elsif) ident(value) operator(>) integer(150) + ident(raise)operator(()constant(ArgumentError)operator(,) string<delimiter(")content(Age )inline<delimiter(#{)ident(value)delimiter(})>content( is unreasonable)delimiter(")>operator(\)) + reserved(end) + instance_variable(@age) operator(=) ident(value) + reserved(end) +reserved(end) + + +comment(# @@PLEAC@@_13.6) +comment(# The ruby Object class defines a dup and a clone method.) +comment(# The dup method is recommended for prototype object creation.) +comment(# The default implementation makes a shallow copy,) +comment(# but each class can override it, for example to make a deep copy.) + +comment(# If you want to call 'new' directly on the instances,) +comment(# you can create a instance method "new", which returns a new duplicate.) +comment(# This method is distinct from the class method new.) +comment(#) +reserved(class) class(A) + reserved(def) method(new) + ident(dup) + reserved(end) +reserved(end) + +ident(ob1) operator(=) constant(A)operator(.)ident(new) +comment(# later on) +ident(ob2) operator(=) ident(ob1)operator(.)ident(new) + + +comment(# @@PLEAC@@_13.7) +ident(methname) operator(=) string<delimiter(')content(flicker)delimiter(')> +ident(obj)operator(.)ident(send)operator(()ident(methname)operator(,) integer(10)operator(\)) comment(# calls obj.flicker(10\)) + +comment(# call three methods on the object, by name) +operator([)string<delimiter(')content(start)delimiter(')>operator(,) string<delimiter(')content(run)delimiter(')>operator(,) string<delimiter(')content(stop)delimiter(')>operator(])operator(.)ident(each) reserved(do) operator(|)ident(method_string)operator(|) + ident(obj)operator(.)ident(send)operator(()ident(method_string)operator(\)) +reserved(end) + +comment(# Another way is to create a Method object) +ident(method_obj) operator(=) ident(obj)operator(.)ident(method)operator(()string<delimiter(')content(flicker)delimiter(')>operator(\)) +comment(# And then call it) +ident(method_obj)operator(.)ident(call)operator(()integer(10)operator(\)) + + +comment(# @@PLEAC@@_13.8) +comment(# All classes in Ruby inherit from class Object) +comment(# and thus all objects share methods defined in this class) + +comment(# the class of the object) +ident(puts) ident(any_object)operator(.)ident(type) + +comment(# Ruby classes are actually objects of class Class and they) +comment(# respond to methods defined in Object class as well) + +comment(# the superclass of this class) +ident(puts) ident(any_object)operator(.)ident(class)operator(.)ident(superclass) + +comment(# ask an object whether it is an instance of particular class) +ident(n) operator(=) float(4.7) +ident(puts) ident(n)operator(.)ident(instance_of?)operator(()constant(Float)operator(\)) comment(# true) +ident(puts) ident(n)operator(.)ident(instance_of?)operator(()constant(Numeric)operator(\)) comment(# false) + +comment(# ask an object whether it is an instance of class, one of the) +comment(# superclasses of the object, or modules included in it) +ident(puts) ident(n)operator(.)ident(kind_of?)operator(()constant(Float)operator(\)) comment(# true (the class\)) +ident(puts) ident(n)operator(.)ident(kind_of?)operator(()constant(Numeric)operator(\)) comment(# true (an ancestor class\)) +ident(puts) ident(n)operator(.)ident(kind_of?)operator(()constant(Comparable)operator(\)) comment(# true (a mixin module\)) +ident(puts) ident(n)operator(.)ident(kind_of?)operator(()constant(String)operator(\)) comment(# false) + +comment(# ask an object whether it can respond to a particular method) +ident(puts) ident(n)operator(.)ident(respond_to?)operator(()string<delimiter(')content(+)delimiter(')>operator(\)) comment(# true) +ident(puts) ident(n)operator(.)ident(respond_to?)operator(()string<delimiter(')content(length)delimiter(')>operator(\)) comment(# false) + +comment(# all methods an object can respond to) +string<delimiter(')content(just a string)delimiter(')>operator(.)ident(methods)operator(.)ident(each) operator({) operator(|)ident(m)operator(|) ident(puts) ident(m) operator(}) + + +comment(# @@PLEAC@@_13.9) +comment(# Actually any class in Ruby is inheritable) +reserved(class) class(Person) + ident(attr_accessor) symbol(:age)operator(,) symbol(:name) + reserved(def) method(initialize) + instance_variable(@name) + instance_variable(@age) + reserved(end) +reserved(end) +comment(#-----------------------------) +ident(dude) operator(=) constant(Person)operator(.)ident(new) +ident(dude)operator(.)ident(name) operator(=) string<delimiter(')content(Jason)delimiter(')> +ident(dude)operator(.)ident(age) operator(=) integer(23) +ident(printf) string<delimiter(")content(%s is age %d.)char(\\n)delimiter(")>operator(,) ident(dude)operator(.)ident(name)operator(,) ident(dude)operator(.)ident(age) +comment(#-----------------------------) +comment(# Inheriting from Person) +reserved(class) class(Employee) operator(<) constant(Person) + ident(attr_accessor) symbol(:salary) +reserved(end) +comment(#-----------------------------) +ident(empl) operator(=) constant(Employee)operator(.)ident(new) +ident(empl)operator(.)ident(name) operator(=) string<delimiter(')content(Jason)delimiter(')> +ident(empl)operator(.)ident(age) operator(=) integer(23) +ident(empl)operator(.)ident(salary) operator(=) integer(200) +ident(printf) string<delimiter(")content(%s is age %d, the salary is %d.)char(\\n)delimiter(")>operator(,) ident(empl)operator(.)ident(name)operator(,) ident(empl)operator(.)ident(age)operator(,) ident(empl)operator(.)ident(salary) +comment(#-----------------------------) +comment(# Any built-in class can be inherited the same way) +reserved(class) class(WeirdString) operator(<) constant(String) + reserved(def) method(initialize)operator(()ident(obj)operator(\)) + reserved(super) ident(obj) + reserved(end) + reserved(def) method(+)operator(()ident(anotherObj)operator(\)) comment(# + method in this class is overridden) + comment(# to return the sum of string lengths) + pre_constant(self)operator(.)ident(length) operator(+) ident(anotherObj)operator(.)ident(length) comment(# 'self' can be omitted) + reserved(end) +reserved(end) +comment(#-----------------------------) +ident(a) operator(=) constant(WeirdString)operator(.)ident(new)operator(()string<delimiter(')content(hello)delimiter(')>operator(\)) +ident(b) operator(=) constant(WeirdString)operator(.)ident(new)operator(()string<delimiter(')content(bye)delimiter(')>operator(\)) + +ident(puts) ident(a) operator(+) ident(b) comment(# the overridden +) +comment(#=> 8) +ident(puts) ident(a)operator(.)ident(length) comment(# method from the superclass, String) +comment(#=> 5) + + +comment(# @@PLEAC@@_13.11) +comment(# In ruby you can override the method_missing method) +comment(# to have a solution similar to perls AUTOLOAD.) +reserved(class) class(Person) + + reserved(def) method(initialize) + instance_variable(@ok_fields) operator(=) string<delimiter(%w()content(name age peers parent)delimiter(\))> + reserved(end) + + reserved(def) method(valid_attribute?)operator(()ident(name)operator(\)) + instance_variable(@ok_fields)operator(.)ident(include?)operator(()ident(name)operator(\)) + reserved(end) + + reserved(def) method(method_missing)operator(()ident(namesymbol)operator(,) operator(*)ident(params)operator(\)) + ident(name) operator(=) ident(namesymbol)operator(.)ident(to_s) + reserved(return) reserved(if) ident(name) operator(=)operator(~) regexp<delimiter(/)content(^A-Z)delimiter(/)> + reserved(if) ident(name)operator(.)ident(to_s)operator([)integer(-1)operator(]) operator(==) operator(()string<delimiter(')content(=)delimiter(')>operator([)integer(0)operator(])operator(\)) comment(# we have a setter) + ident(isSetter) operator(=) pre_constant(true) + ident(name)operator(.)ident(sub!)operator(()regexp<delimiter(/)content(=$)delimiter(/)>operator(,) string<delimiter(')delimiter(')>operator(\)) + reserved(end) + reserved(if) ident(valid_attribute?)operator(()ident(name)operator(\)) + reserved(if) ident(isSetter) + ident(instance_variable_set)operator(()string<delimiter(")content(@)inline<delimiter(#{)ident(name)delimiter(})>delimiter(")>operator(,) operator(*)ident(params)operator(\)) + reserved(else) + ident(instance_variable_get)operator(()string<delimiter(")content(@)inline<delimiter(#{)ident(name)delimiter(})>delimiter(")>operator(,) operator(*)ident(params)operator(\)) + reserved(end) + reserved(else) + comment(# if no annestor is responsible,) + comment(# the Object class will throw a NoMethodError exception) + reserved(super)operator(()ident(namesymbol)operator(,) operator(*)ident(params)operator(\)) + reserved(end) + reserved(end) + + reserved(def) method(new) + ident(kid) operator(=) constant(Person)operator(.)ident(new) + ident(kid)operator(.)ident(parent) operator(=) pre_constant(self) + ident(kid) + reserved(end) + +reserved(end) + +ident(dad) operator(=) constant(Person)operator(.)ident(new) +ident(dad)operator(.)ident(name) operator(=) string<delimiter(")content(Jason)delimiter(")> +ident(dad)operator(.)ident(age) operator(=) integer(23) +ident(kid) operator(=) ident(dad)operator(.)ident(new) +ident(kid)operator(.)ident(name) operator(=) string<delimiter(")content(Rachel)delimiter(")> +ident(kid)operator(.)ident(age) operator(=) integer(2) +ident(puts) string<delimiter(")content(Kid's parent is )inline<delimiter(#{)ident(kid)operator(.)ident(parent)operator(.)ident(name)delimiter(})>delimiter(")> +ident(puts) ident(dad) +ident(puts) ident(kid) + +reserved(class) class(Employee) operator(<) constant(Person) + reserved(def) method(initialize) + reserved(super) + instance_variable(@ok_fields)operator(.)ident(push)operator(()string<delimiter(")content(salary)delimiter(")>operator(,) string<delimiter(")content(boss)delimiter(")>operator(\)) + reserved(end) + reserved(def) method(ok_fields) + instance_variable(@ok_fields) + reserved(end) +reserved(end) + + +comment(# @@PLEAC@@_13.13) +comment(# The ruby garbage collector pretends to cope with circular structures.) +comment(# You can test it with this code:) +reserved(class) class(RingNode) + ident(attr_accessor) symbol(:next) + ident(attr_accessor) symbol(:prev) + ident(attr_reader) symbol(:name) + + reserved(def) method(initialize)operator(()ident(aName)operator(\)) + instance_variable(@name) operator(=) ident(aName) + constant(ObjectSpace)operator(.)ident(define_finalizer)operator(()pre_constant(self)operator(,) + pre_constant(self)operator(.)ident(class)operator(.)ident(method)operator(()symbol(:finalize)operator(\))operator(.)ident(to_proc)operator(\)) + reserved(end) + + reserved(def) constant(RingNode)operator(.)ident(finalize)operator(()ident(id)operator(\)) + ident(puts) string<delimiter(")content(Node )inline<delimiter(#{)ident(id)delimiter(})>content( dying)delimiter(")> + reserved(end) + + reserved(def) constant(RingNode)operator(.)ident(show_all_objects) + constant(ObjectSpace)operator(.)ident(each_object) operator({)operator(|)ident(id)operator(|) + ident(puts) ident(id)operator(.)ident(name) reserved(if) ident(id)operator(.)ident(class) operator(==) constant(RingNode) + operator(}) + reserved(end) +reserved(end) + +reserved(def) method(create_test) + ident(a) operator(=) constant(RingNode)operator(.)ident(new)operator(()string<delimiter(")content(Node A)delimiter(")>operator(\)) + ident(b) operator(=) constant(RingNode)operator(.)ident(new)operator(()string<delimiter(")content(Node B)delimiter(")>operator(\)) + ident(c) operator(=) constant(RingNode)operator(.)ident(new)operator(()string<delimiter(")content(Node C)delimiter(")>operator(\)) + ident(a)operator(.)ident(next) operator(=) ident(b) + ident(b)operator(.)ident(next) operator(=) ident(c) + ident(c)operator(.)ident(next) operator(=) ident(a) + ident(a)operator(.)ident(prev) operator(=) ident(c) + ident(c)operator(.)ident(prev) operator(=) ident(b) + ident(b)operator(.)ident(prev) operator(=) ident(a) + + ident(a) operator(=) pre_constant(nil) + ident(b) operator(=) pre_constant(nil) + ident(c) operator(=) pre_constant(nil) +reserved(end) + +ident(create_test) +constant(RingNode)operator(.)ident(show_all_objects) +constant(ObjectSpace)operator(.)ident(garbage_collect) +ident(puts) string<delimiter(")content(After garbage collection)delimiter(")> +constant(RingNode)operator(.)ident(show_all_objects) + + +comment(# @@PLEAC@@_13.14) +reserved(class) class(String) + reserved(def) method(<=>)operator(()ident(other)operator(\)) + pre_constant(self)operator(.)ident(casecmp) ident(other) + reserved(end) +reserved(end) + +comment(# There is no way to directly overload the '""' (stringify\) ) +comment(# operator in Ruby. However, by convention, classes which ) +comment(# can reasonably be converted to a String will define a ) +comment(# 'to_s' method as in the TimeNumber class defined below.) +comment(# The 'puts' method will automatcally call an object's) +comment(# 'to_s' method as is demonstrated below.) +comment(# Furthermore, if a class defines a to_str method, an object of that) +comment(# class can be used most any place where the interpreter is looking ) +comment(# for a String value.) + +comment(#---------------------------------------) +comment(# NOTE: Ruby has a builtin Time class which would usually be used ) +comment(# to manipulate time objects, the following is supplied for) +comment(# educational purposes to demonstrate operator overloading.) +comment(#) +reserved(class) class(TimeNumber) + ident(attr_accessor) symbol(:hours)operator(,)symbol(:minutes)operator(,)symbol(:seconds) + reserved(def) method(initialize)operator(() ident(hours)operator(,) ident(minutes)operator(,) ident(seconds)operator(\)) + instance_variable(@hours) operator(=) ident(hours) + instance_variable(@minutes) operator(=) ident(minutes) + instance_variable(@seconds) operator(=) ident(seconds) + reserved(end) + + reserved(def) method(to_s) + reserved(return) ident(sprintf)operator(() string<delimiter(")content(%d:%02d:%02d)delimiter(")>operator(,) instance_variable(@hours)operator(,) instance_variable(@minutes)operator(,) instance_variable(@seconds)operator(\)) + reserved(end) + + reserved(def) method(to_str) + ident(to_s) + reserved(end) + + reserved(def) method(+)operator(() ident(other)operator(\)) + ident(seconds) operator(=) instance_variable(@seconds) operator(+) ident(other)operator(.)ident(seconds) + ident(minutes) operator(=) instance_variable(@minutes) operator(+) ident(other)operator(.)ident(minutes) + ident(hours) operator(=) instance_variable(@hours) operator(+) ident(other)operator(.)ident(hours) + reserved(if) ident(seconds) operator(>)operator(=) integer(60) + ident(seconds) operator(%=) integer(60) + ident(minutes) operator(+=) integer(1) + reserved(end) + reserved(if) ident(minutes) operator(>)operator(=) integer(60) + ident(minutes) operator(%=) integer(60) + ident(hours) operator(+=) integer(1) + reserved(end) + reserved(return) constant(TimeNumber)operator(.)ident(new)operator(()ident(hours)operator(,) ident(minutes)operator(,) ident(seconds)operator(\)) + reserved(end) + + reserved(def) method(-)operator(()ident(other)operator(\)) + ident(raise) constant(NotImplementedError) + reserved(end) + + reserved(def) method(*)operator(()ident(other)operator(\)) + ident(raise) constant(NotImplementedError) + reserved(end) + + reserved(def) method(/)operator(() ident(other)operator(\)) + ident(raise) constant(NotImplementedError) + reserved(end) +reserved(end) + +ident(t1) operator(=) constant(TimeNumber)operator(.)ident(new)operator(()integer(0)operator(,) integer(58)operator(,) integer(59)operator(\)) +ident(sec) operator(=) constant(TimeNumber)operator(.)ident(new)operator(()integer(0)operator(,) integer(0)operator(,) integer(1)operator(\)) +ident(min) operator(=) constant(TimeNumber)operator(.)ident(new)operator(()integer(0)operator(,) integer(1)operator(,) integer(0)operator(\)) +ident(puts) ident(t1) operator(+) ident(sec) operator(+) ident(min) operator(+) ident(min) + +comment(#-----------------------------) +comment(# StrNum class example: Ruby's builtin String class already has the ) +comment(# capabilities outlined in StrNum Perl example, however the '*' operator) +comment(# on Ruby's String class acts differently: It creates a string which) +comment(# is the original string repeated N times.) +comment(#) +comment(# Using Ruby's String class as is in this example:) +ident(x) operator(=) string<delimiter(")content(Red)delimiter(")>operator(;) ident(y) operator(=) string<delimiter(")content(Black)delimiter(")> +ident(z) operator(=) ident(x)operator(+)ident(y) +ident(r) operator(=) ident(z)operator(*)integer(3) comment(# r is "RedBlackRedBlackRedBlack") +ident(puts) string<delimiter(")content(values are )inline<delimiter(#{)ident(x)delimiter(})>content(, )inline<delimiter(#{)ident(y)delimiter(})>content(, )inline<delimiter(#{)ident(z)delimiter(})>content(, and )inline<delimiter(#{)ident(r)delimiter(})>delimiter(")> +ident(print) string<delimiter(")inline<delimiter(#{)ident(x)delimiter(})>content( is )delimiter(")>operator(,) ident(x) operator(<) ident(y) operator(?) string<delimiter(")content(LT)delimiter(")> operator(:) string<delimiter(")content(GE)delimiter(")>operator(,) string<delimiter(")content( )inline<delimiter(#{)ident(y)delimiter(})>char(\\n)delimiter(")> +comment(# prints:) +comment(# values are Red, Black, RedBlack, and RedBlackRedBlackRedBlack) +comment(# Red is GE Black) + +comment(#-----------------------------) +reserved(class) class(FixNum) + constant(REGEX) operator(=) regexp<delimiter(/)content(()char(\\.)char(\\d)content(*\))delimiter(/)> + constant(DEFAULT_PLACES) operator(=) integer(0) + ident(attr_accessor) symbol(:value)operator(,) symbol(:places) + reserved(def) method(initialize)operator(()ident(value)operator(,) ident(places) operator(=) pre_constant(nil)operator(\)) + instance_variable(@value) operator(=) ident(value) + reserved(if) ident(places) + instance_variable(@places) operator(=) ident(places) + reserved(else) + ident(m) operator(=) constant(REGEX)operator(.)ident(match)operator(()ident(value)operator(.)ident(to_s)operator(\)) + reserved(if) ident(m) + instance_variable(@places) operator(=) ident(m)operator([)integer(0)operator(])operator(.)ident(length) operator(-) integer(1) + reserved(else) + instance_variable(@places) operator(=) constant(DEFAULT_PLACES) + reserved(end) + reserved(end) + reserved(end) + + reserved(def) method(+)operator(()ident(other)operator(\)) + constant(FixNum)operator(.)ident(new)operator(()instance_variable(@value) operator(+) ident(other)operator(.)ident(value)operator(,) ident(max)operator(()instance_variable(@places)operator(,) ident(other)operator(.)ident(places)operator(\))operator(\)) + reserved(end) + + reserved(def) method(*)operator(()ident(other)operator(\)) + constant(FixNum)operator(.)ident(new)operator(()instance_variable(@value) operator(*) ident(other)operator(.)ident(value)operator(,) ident(max)operator(()instance_variable(@places)operator(,) ident(other)operator(.)ident(places)operator(\))operator(\)) + reserved(end) + + reserved(def) method(/)operator(()ident(other)operator(\)) + ident(puts) string<delimiter(")content(Divide: )inline<delimiter(#{)instance_variable(@value)operator(.)ident(to_f)operator(/)ident(other)operator(.)ident(value)operator(.)ident(to_f)delimiter(})>delimiter(")> + ident(result) operator(=) constant(FixNum)operator(.)ident(new)operator(()instance_variable(@value)operator(.)ident(to_f)operator(/)ident(other)operator(.)ident(value)operator(.)ident(to_f)operator(\)) + ident(result)operator(.)ident(places) operator(=) ident(max)operator(()ident(result)operator(.)ident(places)operator(,)ident(other)operator(.)ident(places)operator(\)) + ident(result) + reserved(end) + + reserved(def) method(to_s) + ident(sprintf)operator(()string<delimiter(")content(STR%s: %.*f)delimiter(")>operator(,) pre_constant(self)operator(.)ident(class)operator(.)ident(to_s) operator(,) instance_variable(@places)operator(,) instance_variable(@value)operator(\)) comment(#.) + reserved(end) + + reserved(def) method(to_str) + ident(to_s) + reserved(end) + + reserved(def) method(to_i) comment(#convert to int) + instance_variable(@value)operator(.)ident(to_i) + reserved(end) + + reserved(def) method(to_f) comment(#convert to float`) + instance_variable(@value)operator(.)ident(to_f) + reserved(end) + + ident(private) + reserved(def) method(max)operator(()ident(a)operator(,)ident(b)operator(\)) + ident(a) operator(>) ident(b) operator(?) ident(a) operator(:) ident(b) + reserved(end) +reserved(end) + +reserved(def) method(demo)operator(()operator(\)) + ident(x) operator(=) constant(FixNum)operator(.)ident(new)operator(()integer(40)operator(\)) + ident(y) operator(=) constant(FixNum)operator(.)ident(new)operator(()integer(12)operator(,) integer(0)operator(\)) + + ident(puts) string<delimiter(")content(sum of )inline<delimiter(#{)ident(x)delimiter(})>content( and )inline<delimiter(#{)ident(y)delimiter(})>content( is )inline<delimiter(#{)ident(x)operator(+)ident(y)delimiter(})>delimiter(")> + ident(puts) string<delimiter(")content(product of )inline<delimiter(#{)ident(x)delimiter(})>content( and )inline<delimiter(#{)ident(y)delimiter(})>content( is )inline<delimiter(#{)ident(x)operator(*)ident(y)delimiter(})>delimiter(")> + + ident(z) operator(=) ident(x)operator(/)ident(y) + ident(puts) string<delimiter(")inline<delimiter(#{)ident(z)delimiter(})>content( has )inline<delimiter(#{)ident(z)operator(.)ident(places)delimiter(})>content( places)delimiter(")> + reserved(unless) ident(z)operator(.)ident(places) + ident(z)operator(.)ident(places) operator(=) integer(2) + reserved(end) + + ident(puts) string<delimiter(")content(div of )inline<delimiter(#{)ident(x)delimiter(})>content( by )inline<delimiter(#{)ident(y)delimiter(})>content( is )inline<delimiter(#{)ident(z)delimiter(})>delimiter(")> + ident(puts) string<delimiter(")content(square of that is )inline<delimiter(#{)ident(z)operator(*)ident(z)delimiter(})>delimiter(")> +reserved(end) + +reserved(if) pre_constant(__FILE__) operator(==) global_variable($0) + ident(demo)operator(()operator(\)) +reserved(end) + + +comment(# @@PLEAC@@_14.1) +comment(# There are dbm, sdbm, gdbm modules) +comment(# and the bdb module for accessing the berkeley db) +comment(# sdbm seem to be available on the most systems,) +comment(# so we use it here) +comment(#) +ident(require) string<delimiter(")content(sdbm)delimiter(")> +constant(SDBM)operator(.)ident(open)operator(()string<delimiter(")content(filename)delimiter(")>operator(,) integer(0666)operator(\)) operator({) operator(|)ident(dbobj)operator(|) + comment(# raises exception if open error) + + comment(# the returned sdbm-dbobj has most of the methods of a hash) + ident(v) operator(=) ident(dbobj)operator([)string<delimiter(")content(key)delimiter(")>operator(]) + ident(dbobj)operator([)string<delimiter(")content(key)delimiter(")>operator(]) operator(=) string<delimiter(")content(newvalue)delimiter(")> + reserved(if) ident(dbobj)operator(.)ident(has_key?)operator(()string<delimiter(")content(key)delimiter(")>operator(\)) + comment(# ...) + reserved(end) + ident(dbobj)operator(.)ident(delete)operator(()string<delimiter(")content(key2)delimiter(")>operator(\)) +operator(}) +comment(# database is open only inside the block.) + +comment(# It is also possible to use a open .. close pair:) +ident(dbobj) operator(=) constant(SDBM)operator(.)ident(open)operator(()string<delimiter(")content(filename)delimiter(")>operator(,) integer(0666)operator(\)) +comment(#.. do something with dbobj) +ident(dbobj)operator(.)ident(close) + +comment(#!/usr/bin/ruby -w) +comment(# userstats - generate statistics on who is logged in) +comment(# call with usernames as argument to display the totals) +comment(# for the given usernames, call with "ALL" to display all users) + +ident(require) string<delimiter(")content(sdbm)delimiter(")> +ident(filename) operator(=) string<delimiter(')content(/tmp/userstats.db)delimiter(')> +constant(SDBM)operator(.)ident(open)operator(()ident(filename)operator(,) integer(0666)operator(\)) operator({) operator(|)ident(dbobj)operator(|) + reserved(if) pre_constant(ARGV)operator(.)ident(length) operator(>) integer(0) + reserved(if) pre_constant(ARGV)operator([)integer(0)operator(]) operator(==) string<delimiter(")content(ALL)delimiter(")> + comment(# ARGV is constant, so we need the variable userlist) + ident(userlist) operator(=) ident(dbobj)operator(.)ident(keys)operator(()operator(\))operator(.)ident(sort)operator(()operator(\)) + reserved(else) + ident(userlist) operator(=) pre_constant(ARGV) + reserved(end) + ident(userlist)operator(.)ident(each) operator({) operator(|)ident(user)operator(|) + ident(print) string<delimiter(")inline<delimiter(#{)ident(user)delimiter(})>char(\\t)inline<delimiter(#{)ident(dbobj)operator([)ident(user)operator(])delimiter(})>char(\\n)delimiter(")> + operator(}) + reserved(else) + ident(who) operator(=) shell<delimiter(`)content(who)delimiter(`)> + ident(who)operator(.)ident(split)operator(()string<delimiter(")char(\\n)delimiter(")>operator(\))operator(.)ident(each) operator({) operator(|)ident(line)operator(|) + ident(md) operator(=) regexp<delimiter(/)content(^()char(\\S)content(+\))delimiter(/)>operator(.)ident(match)operator(()ident(line)operator(\)) + ident(raise) string<delimiter(")content(Bad line from who: )inline<delimiter(#{)ident(line)delimiter(})>delimiter(")> reserved(unless) ident(md) + comment(# sdbm stores only strings, so "+=" doesn't work,) + comment(# we need to convert them expicitly back to integer.) + reserved(if) ident(dbobj)operator(.)ident(has_key?)operator(()ident(md)operator([)integer(0)operator(])operator(\)) + ident(dbobj)operator([)ident(md)operator([)integer(0)operator(])operator(]) operator(=) ident(dbobj)operator([)ident(md)operator([)integer(0)operator(])operator(])operator(.)ident(to_i) operator(+) integer(1) + reserved(else) + ident(dbobj)operator([)ident(md)operator([)integer(0)operator(])operator(]) operator(=) string<delimiter(")content(1)delimiter(")> + reserved(end) + operator(}) + reserved(end) +operator(}) + + +comment(# @@PLEAC@@_14.2) +comment(# using open and clear) +ident(dbobj) operator(=) constant(SDBM)operator(.)ident(open)operator(()string<delimiter(")content(filename)delimiter(")>operator(,) integer(0666)operator(\)) +ident(dbobj)operator(.)ident(clear)operator(()operator(\)) +ident(dbobj)operator(.)ident(close)operator(()operator(\)) +comment(# deleting file and recreating it) +comment(# the filenames depend on the flavor of dbm you use,) +comment(# for example sdbm has two files named filename.pag and filename.dir,) +comment(# so you need to delete both files) +reserved(begin) + constant(File)operator(.)ident(delete)operator(()string<delimiter(")content(filename)delimiter(")>operator(\)) + comment(# raises Exception if not exist) + ident(dbobj) operator(=) constant(SDBM)operator(.)ident(open)operator(()string<delimiter(")content(filename)delimiter(")>operator(,) integer(0666)operator(\)) +reserved(rescue) + comment(# add error handling here) +reserved(end) + + +comment(# @@PLEAC@@_14.3) +comment(# sdbm2gdbm: converts sdbm database to a gdbm database) +ident(require) string<delimiter(")content(sdbm)delimiter(")> +ident(require) string<delimiter(")content(gdbm)delimiter(")> + +reserved(unless) pre_constant(ARGV)operator(.)ident(length) operator(==) integer(2) + ident(fail) string<delimiter(")content(usage: sdbm2gdbm infile outfile)delimiter(")> +reserved(end) +ident(infile) operator(=) pre_constant(ARGV)operator([)integer(0)operator(]) +ident(outfile) operator(=) pre_constant(ARGV)operator([)integer(1)operator(]) + +ident(sdb) operator(=) constant(SDBM)operator(.)ident(open)operator(()ident(infile)operator(\)) +ident(gdb) operator(=) constant(GDBM)operator(.)ident(open)operator(()ident(outfile)operator(,) integer(0666)operator(\)) +ident(sdb)operator(.)ident(each) operator({) operator(|)ident(key)operator(,) ident(val)operator(|) + ident(gdb)operator([)ident(key)operator(]) operator(=) ident(val) +operator(}) +ident(gdb)operator(.)ident(close) +ident(sdb)operator(.)ident(close) + + +comment(# @@PLEAC@@_14.4) +comment(#!/usr/bin/ruby -w) +comment(# dbmmerge: merges two dbm databases) +ident(require) string<delimiter(")content(sdbm)delimiter(")> + +reserved(unless) pre_constant(ARGV)operator(.)ident(length) operator(==) integer(3) + ident(fail) string<delimiter(")content(usage: dbmmerge indb1 indb2 outdb)delimiter(")> +reserved(end) +ident(infile1) operator(=) pre_constant(ARGV)operator([)integer(0)operator(]) +ident(infile2) operator(=) pre_constant(ARGV)operator([)integer(0)operator(]) +ident(outfile) operator(=) pre_constant(ARGV)operator([)integer(2)operator(]) + +ident(in1) operator(=) constant(SDBM)operator(.)ident(open)operator(()ident(infile1)operator(,) pre_constant(nil)operator(\)) +ident(in2) operator(=) constant(SDBM)operator(.)ident(open)operator(()ident(infile2)operator(,) pre_constant(nil)operator(\)) +ident(outdb) operator(=) constant(SDBM)operator(.)ident(open)operator(()ident(outfile)operator(,) integer(0666)operator(\)) + +operator([)ident(in1)operator(,) ident(in2)operator(])operator(.)ident(each) operator({) operator(|)ident(indb)operator(|) + ident(indb)operator(.)ident(each) operator({) operator(|)ident(key)operator(,) ident(val)operator(|) + reserved(if) ident(outdb)operator(.)ident(has_key?)operator(()ident(key)operator(\)) + comment(# decide which value to set.) + comment(# set outdb[key] if necessary) + reserved(else) + ident(outdb)operator([)ident(key)operator(]) operator(=) ident(val) + reserved(end) + operator(}) +operator(}) +ident(in1)operator(.)ident(close) +ident(in2)operator(.)ident(close) +ident(outdb)operator(.)ident(close) + + +comment(# @@PLEAC@@_14.7) +comment(# we write a tie method that extends the Array class.) +comment(# It reads the file into the memory, executes the code block) +comment(# in which you can manipulate the array as needed, and writes) +comment(# the array back to the file after the end of the block execution) +reserved(class) class(Array) + reserved(def) method(tie)operator(()ident(filename)operator(,) ident(flags)operator(\)) + constant(File)operator(.)ident(open)operator(()ident(filename)operator(,) ident(flags)operator(\)) operator({) operator(|)ident(f)operator(|) + ident(f)operator(.)ident(each_line) operator({) operator(|)ident(line)operator(|) + pre_constant(self)operator(.)ident(push)operator(()ident(line)operator(.)ident(chomp)operator(\)) + operator(}) + reserved(yield) + ident(f)operator(.)ident(rewind) + ident(each) operator({) operator(|)ident(line)operator(|) + reserved(if) ident(line) + ident(f)operator(.)ident(puts)operator(()ident(line)operator(\)) + reserved(else) + ident(f)operator(.)ident(puts) string<delimiter(")delimiter(")> + reserved(end) + operator(}) + operator(}) + reserved(end) +reserved(end) + +ident(array) operator(=) constant(Array)operator(.)ident(new) +ident(array)operator(.)ident(tie)operator(()string<delimiter(")content(/tmp/textfile.txt)delimiter(")>operator(,) constant(File)operator(::)constant(RDWR)operator(|)constant(File)operator(::)constant(CREAT)operator(\)) operator({) + ident(array)operator([)integer(4)operator(]) operator(=) string<delimiter(")content(a new line 4)delimiter(")> +operator(}) + +comment(# The tied array can be manipulated like a normal array,) +comment(# so there is no need for a special API, and the recno_demo program) +comment(# to demonstrate is API is useless) + + +comment(# tied array demo: show how to use array with a tied file) +ident(filename) operator(=) string<delimiter(")content(db_file.txt)delimiter(")> +ident(lines) operator(=) constant(Array)operator(.)ident(new) +constant(File)operator(.)ident(unlink)operator(()ident(filename)operator(\)) reserved(if) constant(File)operator(.)ident(exists?)operator(()ident(filename)operator(\)) +ident(lines)operator(.)ident(tie)operator(()ident(filename)operator(,) constant(File)operator(::)constant(RDWR) operator(|) constant(File)operator(::)constant(CREAT)operator(\)) operator({) + comment(# first create a textfile to play with) + ident(lines)operator([)integer(0)operator(]) operator(=) string<delimiter(")content(zero)delimiter(")> + ident(lines)operator([)integer(1)operator(]) operator(=) string<delimiter(")content(one)delimiter(")> + ident(lines)operator([)integer(2)operator(]) operator(=) string<delimiter(")content(two)delimiter(")> + ident(lines)operator([)integer(3)operator(]) operator(=) string<delimiter(")content(three)delimiter(")> + ident(lines)operator([)integer(4)operator(]) operator(=) string<delimiter(")content(four)delimiter(")> + + comment(# print the records in order.) + comment(# Opposed to perl, the tied array behaves exactly as a normal array) + ident(puts) string<delimiter(")char(\\n)content(Original)delimiter(")> + reserved(for) ident(i) reserved(in) integer(0)operator(..)operator(()ident(lines)operator(.)ident(length)integer(-1)operator(\)) + ident(puts) string<delimiter(")inline<delimiter(#{)ident(i)delimiter(})>content(: )inline<delimiter(#{)ident(lines)operator([)ident(i)operator(])delimiter(})>delimiter(")> + reserved(end) + + comment(#use push and pop) + ident(a) operator(=) ident(lines)operator(.)ident(pop) + ident(lines)operator(.)ident(push)operator(()string<delimiter(")content(last)delimiter(")>operator(\)) + ident(puts)operator(()string<delimiter(")content(The last line was [)inline<delimiter(#{)ident(a)delimiter(})>content(])delimiter(")>operator(\)) + + comment(#use shift and unshift) + ident(a) operator(=) ident(lines)operator(.)ident(shift) + ident(lines)operator(.)ident(unshift)operator(()string<delimiter(")content(first)delimiter(")>operator(\)) + ident(puts)operator(()string<delimiter(")content(The first line was [)inline<delimiter(#{)ident(a)delimiter(})>content(])delimiter(")>operator(\)) + + comment(# add record after record 2) + ident(i) operator(=) integer(2) + ident(lines)operator(.)ident(insert)operator(()ident(i) operator(+) integer(1)operator(,) string<delimiter(")content(Newbie)delimiter(")>operator(\)) + + comment(# add record before record one) + ident(i) operator(=) integer(1) + ident(lines)operator(.)ident(insert)operator(()ident(i)operator(,) string<delimiter(")content(New One)delimiter(")>operator(\)) + + comment(# delete record 3) + ident(lines)operator(.)ident(delete_at)operator(()integer(3)operator(\)) + + comment(#now print the records in reverse order) + ident(puts) string<delimiter(")char(\\n)content(Reverse)delimiter(")> + operator(()ident(lines)operator(.)ident(length) operator(-) integer(1)operator(\))operator(.)ident(downto)operator(()integer(0)operator(\))operator({) operator(|)ident(i)operator(|) + ident(puts) string<delimiter(")inline<delimiter(#{)ident(i)delimiter(})>content(: )inline<delimiter(#{)ident(lines)operator([)ident(i)operator(])delimiter(})>delimiter(")> + operator(}) + +operator(}) + + +comment(# @@PLEAC@@_14.8) +comment(# example to store complex data in a database) +comment(# uses marshall from the standard library) +ident(require) string<delimiter(")content(sdbm)delimiter(")> +ident(db) operator(=) constant(SDBM)operator(.)ident(open)operator(()string<delimiter(")content(pleac14-8-database)delimiter(")>operator(,) integer(0666)operator(\)) + +comment(# convert the Objects into strings and back by using the Marshal module.) +comment(# Most normal objects can be converted out of the box,) +comment(# but not special things like procedure objects,) +comment(# IO instance variables, singleton objects) + +ident(db)operator([)string<delimiter(")content(Tom Christiansen)delimiter(")>operator(]) operator(=) constant(Marshal)operator(.)ident(dump)operator(()operator([)string<delimiter(")content(book author)delimiter(")>operator(,) string<delimiter(")content(tchrist@perl.com)delimiter(")>operator(])operator(\)) +ident(db)operator([)string<delimiter(")content(Tom Boutell)delimiter(")>operator(]) operator(=) constant(Marshal)operator(.)ident(dump)operator(()operator([)string<delimiter(")content(shareware author)delimiter(")>operator(,) +string<delimiter(")content(boutell@boutell.com)delimiter(")>operator(])operator(\)) + +ident(name1) operator(=) string<delimiter(")content(Tom Christiansen)delimiter(")> +ident(name2) operator(=) string<delimiter(")content(Tom Boutell)delimiter(")> + +ident(tom1) operator(=) constant(Marshal)operator(.)ident(load)operator(()ident(db)operator([)ident(name1)operator(])operator(\)) +ident(tom2) operator(=) constant(Marshal)operator(.)ident(load)operator(()ident(db)operator([)ident(name2)operator(])operator(\)) + +ident(puts) string<delimiter(")content(Two Toming: )inline<delimiter(#{)ident(tom1)delimiter(})>content( )inline<delimiter(#{)ident(tom2)delimiter(})>delimiter(")> + +reserved(if) ident(tom1)operator([)integer(0)operator(]) operator(==) ident(tom2)operator([)integer(0)operator(]) operator(&&) ident(tom1)operator([)integer(1)operator(]) operator(==) ident(tom2)operator([)integer(1)operator(]) + ident(puts) string<delimiter(")content(You're having runtime fun with one Tom made two.)delimiter(")> +reserved(else) + ident(puts) string<delimiter(")content(No two Toms are ever alike)delimiter(")> +reserved(end) + +comment(# To change parts of an entry, get the whole entry, change the parts,) +comment(# and save the whole entry back) +ident(entry) operator(=) constant(Marshal)operator(.)ident(load)operator(()ident(db)operator([)string<delimiter(")content(Tom Boutell)delimiter(")>operator(])operator(\)) +ident(entry)operator([)integer(0)operator(]) operator(=) string<delimiter(")content(Poet Programmer)delimiter(")> +ident(db)operator([)string<delimiter(")content(Tom Boutell)delimiter(")>operator(]) operator(=) constant(Marshal)operator(.)ident(dump)operator(()ident(entry)operator(\)) +ident(db)operator(.)ident(close) + + +comment(# @@PLEAC@@_14.9) +comment(# example to make data persistent) +comment(# uses Marshal from the standard lib) +comment(# Stores the data in a simple file,) +comment(# see 14.8 on how to store it in a dbm file) + +comment(# The BEGIN block is executed before the rest of the script) +comment(# we use global variables here because local variables) +comment(# will go out of scope and are not accessible from the main script) + +reserved(BEGIN) operator({) + global_variable($persistent_store) operator(=) string<delimiter(")content(persitence.dat)delimiter(")> + reserved(begin) + constant(File)operator(.)ident(open)operator(()global_variable($persistent_store)operator(\)) reserved(do) operator(|)ident(f)operator(|) + global_variable($stringvariable1) operator(=) constant(Marshal)operator(.)ident(load)operator(()ident(f)operator(\)) + global_variable($arrayvariable2) operator(=) constant(Marshal)operator(.)ident(load)operator(()ident(f)operator(\)) + reserved(end) + reserved(rescue) + ident(puts) string<delimiter(")content(Can not open )inline<delimiter(#{)global_variable($persistent_store)delimiter(})>delimiter(")> + comment(# Initialisation if this script runs the first time) + global_variable($stringvariable1) operator(=) string<delimiter(")delimiter(")> + global_variable($arrayvariable2) operator(=) operator([)operator(]) + reserved(end) +operator(}) + +reserved(END) operator({) + constant(File)operator(.)ident(open)operator(()global_variable($persistent_store)operator(,) string<delimiter(")content(w+)delimiter(")>operator(\)) reserved(do) operator(|)ident(f)operator(|) + constant(Marshal)operator(.)ident(dump)operator(()global_variable($stringvariable1)operator(,) ident(f)operator(\)) + constant(Marshal)operator(.)ident(dump)operator(()global_variable($arrayvariable2)operator(,) ident(f)operator(\)) + reserved(end) +operator(}) + +comment(# simple test program) +ident(puts) global_variable($stringvariable1) +ident(puts) global_variable($arrayvariable2) +global_variable($stringvariable1) operator(=) string<delimiter(")content(Hello World)delimiter(")> +global_variable($arrayvariable2)operator(.)ident(push)operator(()integer(5)operator(\)) +ident(puts) global_variable($stringvariable1) +ident(puts) global_variable($arrayvariable2) + + +comment(# @@PLEAC@@_14.10) +comment(#!/usr/bin/ruby -w) +comment(# Ruby has a dbi module with an architecture similar) +comment(# to the Perl dbi module: the dbi module provides an unified) +comment(# interface and uses specialized drivers for each dbms vendor) +comment(#) +reserved(begin) + constant(DBI)operator(.)ident(connect)operator(()string<delimiter(")content(DBI:driver:driverspecific)delimiter(")>operator(,) string<delimiter(")content(username)delimiter(")>operator(,) string<delimiter(")content(auth)delimiter(")>operator(\)) operator({) + operator(|)ident(dbh)operator(|) + + ident(dbh)operator(.)ident(do)operator(()constant(SQL1)operator(\)) + + ident(dbh)operator(.)ident(prepare)operator(()constant(SQL2)operator(\))operator({) operator(|)ident(sth)operator(|) + ident(sth)operator(.)ident(execute) + ident(sth)operator(.)ident(fetch) operator({)operator(|)ident(row)operator(|) + comment(# ...) + operator(}) + operator(}) comment(# end of block finishes the statement handle) + operator(}) comment(# end of block closes the database connection) +reserved(rescue) constant(DBI)operator(::)constant(DatabaseError) operator(=)operator(>) ident(e) + ident(puts) string<delimiter(")content(dbi error occurred)delimiter(")> + ident(puts) string<delimiter(")content(Error code: )inline<delimiter(#{)ident(e)operator(.)ident(err)delimiter(})>delimiter(")> + ident(puts) string<delimiter(")content(Error message: )inline<delimiter(#{)ident(e)operator(.)ident(errstr)delimiter(})>delimiter(")> +reserved(end) + +comment(#!/usr/bin/ruby -w) +comment(# dbusers - example for mysql which creates a table,) +comment(# fills it with values, retrieves the values back,) +comment(# and finally destroys the table.) + +ident(require) string<delimiter(")content(dbi)delimiter(")> + +comment(# replacement for the User::pwnt module) +reserved(def) method(getpwent) + ident(result) operator(=) operator([)operator(]) + constant(File)operator(.)ident(open)operator(()string<delimiter(")content(/etc/passwd)delimiter(")>operator(\)) operator({)operator(|)ident(file)operator(|) + ident(file)operator(.)ident(each_line) operator({)operator(|)ident(line)operator(|) + reserved(next) reserved(if) ident(line)operator(.)ident(match)operator(()regexp<delimiter(/)content(^#)delimiter(/)>operator(\)) + ident(cols) operator(=) ident(line)operator(.)ident(split)operator(()string<delimiter(")content(:)delimiter(")>operator(\)) + ident(result)operator(.)ident(push)operator(()operator([)ident(cols)operator([)integer(2)operator(])operator(,) ident(cols)operator([)integer(0)operator(])operator(])operator(\)) + operator(}) + operator(}) + ident(result) +reserved(end) + +reserved(begin) + constant(DBI)operator(.)ident(connect)operator(()string<delimiter(")content(DBI:Mysql:pleacdatabase)delimiter(")>operator(,) string<delimiter(")content(pleac)delimiter(")>operator(,) string<delimiter(")content(pleacpassword)delimiter(")>operator(\)) operator({) + operator(|)ident(conn)operator(|) + + ident(conn)operator(.)ident(do)operator(()string<delimiter(")content(CREATE TABLE users (uid INT, login CHAR(8\)\))delimiter(")>operator(\)) + + ident(users) operator(=) ident(getpwent) + + ident(conn)operator(.)ident(prepare)operator(()string<delimiter(")content(INSERT INTO users VALUES (?,?\))delimiter(")>operator(\)) operator({)operator(|)ident(sth)operator(|) + ident(users)operator(.)ident(each) operator({)operator(|)ident(entry)operator(|) + ident(sth)operator(.)ident(execute)operator(()ident(entry)operator([)integer(0)operator(])operator(,) ident(entry)operator([)integer(1)operator(])operator(\)) + operator(}) + operator(}) + + ident(conn)operator(.)ident(execute)operator(()string<delimiter(")content(SELECT uid, login FROM users WHERE uid < 50)delimiter(")>operator(\)) operator({)operator(|)ident(sth)operator(|) + ident(sth)operator(.)ident(fetch) operator({)operator(|)ident(row)operator(|) + ident(puts) ident(row)operator(.)ident(collect) operator({)operator(|)ident(col)operator(|) + reserved(if) ident(col)operator(.)ident(nil?) + string<delimiter(")content((null\))delimiter(")> + reserved(else) + ident(col) + reserved(end) + operator(})operator(.)ident(join)operator(()string<delimiter(")content(, )delimiter(")>operator(\)) + operator(}) + operator(}) + + ident(conn)operator(.)ident(do)operator(()string<delimiter(")content(DROP TABLE users)delimiter(")>operator(\)) + operator(}) +reserved(rescue) constant(DBI)operator(::)constant(DatabaseError) operator(=)operator(>) ident(e) + ident(puts) string<delimiter(")content(dbi error occurred)delimiter(")> + ident(puts) string<delimiter(")content(Error code: )inline<delimiter(#{)ident(e)operator(.)ident(err)delimiter(})>delimiter(")> + ident(puts) string<delimiter(")content(Error message: )inline<delimiter(#{)ident(e)operator(.)ident(errstr)delimiter(})>delimiter(")> +reserved(end) + + +comment(# @@PLEAC@@_15.1) +comment(# This test program demonstrates parsing program arguments.) +comment(# It uses the optparse library, which is included with ruby 1.8) +comment(# It handles classic unix style and gnu style options) +ident(require) string<delimiter(')content(optparse)delimiter(')> + +instance_variable(@debugmode) operator(=) pre_constant(false) +instance_variable(@verbose) operator(=) pre_constant(false) + +pre_constant(ARGV)operator(.)ident(options) reserved(do) operator(|)ident(opts)operator(|) + ident(opts)operator(.)ident(banner) operator(=) string<delimiter(")content(Usage: ruby )inline<delimiter(#{)global_variable($0)delimiter(})>content( [OPTIONS] INPUTFILES)delimiter(")> + + ident(opts)operator(.)ident(on)operator(()string<delimiter(")content(-h)delimiter(")>operator(,) string<delimiter(")content(--help)delimiter(")>operator(,) string<delimiter(")content(show this message)delimiter(")>operator(\)) operator({) + ident(puts) ident(opts) + ident(exit) + operator(}) + comment(# The OptionParser#on method is called with a specification of short) + comment(# options, of long options, a data type spezification and user help) + comment(# messages for this option.) + comment(# The method analyses the given parameter and decides what it is,) + comment(# so you can leave out the long option if you don't need it) + ident(opts)operator(.)ident(on)operator(()string<delimiter(")content(-v)delimiter(")>operator(,) string<delimiter(")content(--[no-]verbose=[FLAG])delimiter(")>operator(,) constant(TrueClass)operator(,) string<delimiter(")content(run verbosly)delimiter(")>operator(\)) operator({) + operator(|)instance_variable(@verbose)operator(|) comment(# sets @verbose to true or false) + operator(}) + ident(opts)operator(.)ident(on)operator(()string<delimiter(")content(-D)delimiter(")>operator(,) string<delimiter(")content(--DEBUG)delimiter(")>operator(,) constant(TrueClass)operator(,) string<delimiter(")content(turns on debug mode)delimiter(")> operator(\))operator({) + operator(|)instance_variable(@debugmode)operator(|) comment(# sets @debugmode to true) + operator(}) + ident(opts)operator(.)ident(on)operator(()string<delimiter(")content(-c)delimiter(")>operator(,) string<delimiter(")content(--count=NUMBER)delimiter(")>operator(,) constant(Integer)operator(,) string<delimiter(")content(how many times we do it)delimiter(")> operator(\))operator({) + operator(|)instance_variable(@count)operator(|) comment(# sets @count to given integer) + operator(}) + ident(opts)operator(.)ident(on)operator(()string<delimiter(")content(-o)delimiter(")>operator(,) string<delimiter(")content(--output=FILE)delimiter(")>operator(,) constant(String)operator(,) string<delimiter(")content(file to write output to)delimiter(")>operator(\))operator({) + operator(|)instance_variable(@outputfile)operator(|) comment(# sets @outputfile to given string) + operator(}) + ident(opts)operator(.)ident(parse!) +reserved(end) + +comment(# example to use the options in the main program) +ident(puts) string<delimiter(")content(Verbose is on)delimiter(")> reserved(if) instance_variable(@verbose) +ident(puts) string<delimiter(")content(Debugmode is on)delimiter(")> reserved(if) instance_variable(@debugmode) +ident(puts) string<delimiter(")content(Outfile is )inline<delimiter(#{)instance_variable(@outputfile)delimiter(})>delimiter(")> reserved(if) reserved(defined?) instance_variable(@outputfile) +ident(puts) string<delimiter(")content(Count is )inline<delimiter(#{)instance_variable(@count)delimiter(})>delimiter(")> reserved(if) reserved(defined?) instance_variable(@count) +pre_constant(ARGV)operator(.)ident(each) operator({) operator(|)ident(param)operator(|) + ident(puts) string<delimiter(")content(Got parameter )inline<delimiter(#{)ident(param)delimiter(})>delimiter(")> +operator(}) + + +comment(# @@PLEAC@@_15.4) +ident(buf) operator(=) string<delimiter(")char(\\0)delimiter(")> operator(*) integer(8) +global_variable($stdout)operator(.)ident(ioctl)operator(()integer(0x5413)operator(,) ident(buf)operator(\)) +ident(ws_row)operator(,) ident(ws_col)operator(,) ident(ws_xpixel)operator(,) ident(ws_ypixel) operator(=) ident(buf)operator(.)ident(unpack)operator(()string<delimiter(")content(S4)delimiter(")>operator(\)) + +ident(raise) string<delimiter(")content(You must have at least 20 characters)delimiter(")> reserved(unless) ident(ws_col) operator(>)operator(=) integer(20) +ident(max) operator(=) integer(0) +ident(values) operator(=) operator(()integer(1)operator(..)integer(5)operator(\))operator(.)ident(collect) operator({) ident(rand)operator(()integer(20)operator(\)) operator(}) comment(# generate an array[5] of rand values) +reserved(for) ident(i) reserved(in) ident(values) + ident(max) operator(=) ident(i) reserved(if) ident(max) operator(<) ident(i) +reserved(end) +ident(ratio) operator(=) ident(Float)operator(()ident(ws_col)integer(-12)operator(\))operator(/)ident(max) comment(# chars per unit) +reserved(for) ident(i) reserved(in) ident(values) + ident(printf) string<delimiter(")content(%8.1f %s)char(\\n)delimiter(")>operator(,) ident(i)operator(,) string<delimiter(")content(*)delimiter(")> operator(*) operator(()ident(ratio)operator(*)ident(i)operator(\)) +reserved(end) + +comment(# gives, for example:) +comment(# 15.0 *******************************) +comment(# 10.0 *********************) +comment(# 5.0 **********) +comment(# 14.0 *****************************) +comment(# 18.0 **************************************) + + +comment(# @@PLEAC@@_16.1) +ident(output) operator(=) shell<delimiter(`)content(program args)delimiter(`)> comment(# collect output into one multiline string) +ident(output) operator(=) shell<delimiter(`)content(program args)delimiter(`)>operator(.)ident(split) comment(# collect output into array, one line per) +ident(element) + +ident(readme) operator(=) constant(IO)operator(.)ident(popen)operator(()string<delimiter(")content(ls)delimiter(")>operator(\)) +ident(output) operator(=) string<delimiter(")delimiter(")> +reserved(while) ident(readme)operator(.)ident(gets) reserved(do) + ident(output) operator(+=) global_variable($_) +reserved(end) +ident(readme)operator(.)ident(close) + +shell<delimiter(`)content(fsck -y /dev/rsd1a)delimiter(`)> comment(# BAD AND SCARY in Perl because it's managed by the shell) + comment(# I donna in Ruby ...) + +comment(# so the "clean and secure" version) +ident(readme)operator(,) ident(writeme) operator(=) constant(IO)operator(.)ident(pipe) +ident(pid) operator(=) ident(fork) operator({) + comment(# child) + global_variable($stdout) operator(=) ident(writeme) + ident(readme)operator(.)ident(close) + ident(exec)operator(()string<delimiter(')content(find)delimiter(')>operator(,) string<delimiter(')content(..)delimiter(')>operator(\)) +operator(}) +comment(# parent) +constant(Process)operator(.)ident(waitpid)operator(()ident(pid)operator(,) integer(0)operator(\)) +ident(writeme)operator(.)ident(close) +reserved(while) ident(readme)operator(.)ident(gets) reserved(do) + comment(# do something with $_) +reserved(end) + + +comment(# @@PLEAC@@_16.2) +ident(status) operator(=) ident(system)operator(()string<delimiter(")content(xemacs )inline<delimiter(#{)ident(myfile)delimiter(})>delimiter(")>operator(\)) + +ident(status) operator(=) ident(system)operator(()string<delimiter(")content(xemacs)delimiter(")>operator(,) ident(myfile)operator(\)) + +ident(system)operator(()string<delimiter(")content(cmd1 args | cmd2 | cmd3 >outfile)delimiter(")>operator(\)) +ident(system)operator(()string<delimiter(")content(cmd args <infile >outfile 2>errfile)delimiter(")>operator(\)) + +comment(# stop if the command fails) +ident(raise) string<delimiter(")content($program exited funny: )inline<delimiter(#{)global_variable($?)delimiter(})>delimiter(")> reserved(unless) ident(system)operator(()string<delimiter(")content(cmd)delimiter(")>operator(,) string<delimiter(")content(args1)delimiter(")>operator(,) string<delimiter(")content(args2)delimiter(")>operator(\)) + +comment(# get the value of the signal sent to the child) +comment(# even if it is a SIGINT or SIGQUIT) +ident(system)operator(()ident(arglist)operator(\)) +ident(raise) string<delimiter(")content(program killed by signal )inline<delimiter(#{)global_variable($?)delimiter(})>delimiter(")> reserved(if) operator(()global_variable($?) operator(&) integer(127)operator(\)) operator(!=) integer(0) + +ident(pid) operator(=) ident(fork) operator({) + ident(trap)operator(()string<delimiter(")content(SIGINT)delimiter(")>operator(,) string<delimiter(")content(IGNORE)delimiter(")>operator(\)) + ident(exec)operator(()string<delimiter(")content(sleep)delimiter(")>operator(,) string<delimiter(")content(10)delimiter(")>operator(\)) +operator(}) +ident(trap) operator(()string<delimiter(")content(SIGINT)delimiter(")>operator(\)) operator({) + ident(puts) string<delimiter(")content(Tsk tsk, no process interruptus)delimiter(")> +operator(}) +constant(Process)operator(.)ident(waitpid)operator(()ident(pid)operator(,) integer(0)operator(\)) + +comment(# Ruby doesn't permit to lie to the program called by a 'system'.) +comment(# (ie specify what return argv[0] in C, $0 in Perl/Ruby ...\)) +comment(# A (dirty\) way is to create a link (under Unix\), run this link and) +comment(# erase it. Somebody has a best idea ?) + + +comment(# @@PLEAC@@_16.3) +ident(exec)operator(()string<delimiter(")content(archive *.data)delimiter(")>operator(\)) + +ident(exec)operator(()string<delimiter(")content(archive)delimiter(")>operator(,) string<delimiter(")content(accounting.data)delimiter(")>operator(\)) + +ident(exec)operator(()string<delimiter(")content(archive accounting.data)delimiter(")>operator(\)) + + +comment(# @@PLEAC@@_16.4) +comment(# read the output of a program) +constant(IO)operator(.)ident(popen)operator(()string<delimiter(")content(ls)delimiter(")>operator(\)) operator({)operator(|)ident(readme)operator(|) + reserved(while) ident(readme)operator(.)ident(gets) reserved(do) + comment(# ...) + reserved(end) +operator(}) +comment(# or) +ident(readme) operator(=) constant(IO)operator(.)ident(popen)operator(()string<delimiter(")content(ls)delimiter(")>operator(\)) +reserved(while) ident(readme)operator(.)ident(gets) reserved(do) + comment(# ...) +reserved(end) +ident(readme)operator(.)ident(close) + +comment(# "write" in a program) +constant(IO)operator(.)ident(popen)operator(()string<delimiter(")content(cmd args)delimiter(")>operator(,)string<delimiter(")content(w)delimiter(")>operator(\)) operator({)operator(|)ident(pipe)operator(|) + ident(pipe)operator(.)ident(puts)operator(()string<delimiter(")content(data)delimiter(")>operator(\)) + ident(pipe)operator(.)ident(puts)operator(()string<delimiter(")content(foo)delimiter(")>operator(\)) +operator(}) + +comment(# close wait for the end of the process) +ident(read) operator(=) constant(IO)operator(.)ident(popen)operator(()string<delimiter(")content(sleep 10000)delimiter(")>operator(\)) comment(# child goes to sleep) +ident(read)operator(.)ident(close) comment(# and the parent goes to lala land) + +ident(writeme) operator(=) constant(IO)operator(.)ident(popen)operator(()string<delimiter(")content(cmd args)delimiter(")>operator(,) string<delimiter(")content(w)delimiter(")>operator(\)) +ident(writeme)operator(.)ident(puts) string<delimiter(")content(hello)delimiter(")> comment(# program will get hello\\n on STDIN) +ident(writeme)operator(.)ident(close) comment(# program will get EOF on STDIN) + +comment(# send in a pager (eg less\) all output) +global_variable($stdout) operator(=) constant(IO)operator(.)ident(popen)operator(()string<delimiter(")content(/usr/bin/less)delimiter(")>operator(,)string<delimiter(")content(w)delimiter(")>operator(\)) +ident(print) string<delimiter(")content(huge string)char(\\n)delimiter(")> operator(*) integer(10000) + + +comment(# @@PLEAC@@_16.5) +comment(#-----------------------------) +reserved(def) method(head)operator(()ident(lines) operator(=) integer(20)operator(\)) + ident(pid) operator(=) ident(open)operator(()string<delimiter(")content(|-)delimiter(")>operator(,)string<delimiter(")content(w)delimiter(")>operator(\)) + reserved(if) ident(pid) operator(==) pre_constant(nil) + reserved(return) + reserved(else) + reserved(while) ident(gets)operator(()operator(\)) reserved(do) + ident(pid)operator(.)ident(print) + ident(lines) operator(-=) integer(1) + reserved(break) reserved(if) ident(lines) operator(==) integer(0) + reserved(end) + reserved(end) + ident(exit) +reserved(end) + +ident(head)operator(()integer(100)operator(\)) +reserved(while) ident(gets)operator(()operator(\)) reserved(do) + ident(print) +reserved(end) +comment(#-----------------------------) +integer(1)operator(:) operator(>) constant(Welcome) ident(to) constant(Linux)operator(,) ident(version) float(2.0)operator(.)integer(33) ident(on) ident(a) ident(i686) + +integer(2)operator(:) operator(>) + +integer(3)operator(:) operator(>) string<delimiter(")content(The software required `Windows 95 or better', + +4: > so I installed Linux.)delimiter(")> +comment(#-----------------------------) +operator(>) integer(1)operator(:) constant(Welcome) ident(to) constant(Linux)operator(,) constant(Kernel) ident(version) float(2.0)operator(.)integer(33) ident(on) ident(a) ident(i686) + +operator(>) integer(2)operator(:) + +operator(>) integer(3)operator(:) string<delimiter(")content(The software required `Windows 95 or better', + +> 4: so I installed Linux.)delimiter(")> +comment(#-----------------------------) +comment(#!/usr/bin/ruby) +comment(# qnumcat - demo additive output filters) + +reserved(def) method(number)operator(()operator(\)) + ident(pid) operator(=) ident(open)operator(()string<delimiter(")content(|-)delimiter(")>operator(,)string<delimiter(")content(w)delimiter(")>operator(\)) + reserved(if) ident(pid) operator(==) pre_constant(nil) + reserved(return) + reserved(else) + reserved(while) ident(gets)operator(()operator(\)) reserved(do) ident(pid)operator(.)ident(printf)operator(()string<delimiter(")content(%d: %s)delimiter(")>operator(,) global_variable($.)operator(,) global_variable($_)operator(\))operator(;) reserved(end) + reserved(end) + ident(exit) +reserved(end) + +reserved(def) method(quote)operator(()operator(\)) + ident(pid) operator(=) ident(open)operator(()string<delimiter(")content(|-)delimiter(")>operator(,)string<delimiter(")content(w)delimiter(")>operator(\)) + reserved(if) ident(pid) operator(==) pre_constant(nil) + reserved(return) + reserved(else) + reserved(while) ident(gets)operator(()operator(\)) reserved(do) ident(pid)operator(.)ident(print) string<delimiter(")content(> )inline<delimiter(#{)global_variable($_)delimiter(})>delimiter(")> reserved(end) + reserved(end) + ident(exit) +reserved(end) + +ident(number)operator(()operator(\)) +ident(quote)operator(()operator(\)) + +reserved(while) ident(gets)operator(()operator(\)) reserved(do) + ident(print) +reserved(end) +global_variable($stdout)operator(.)ident(close) +ident(exit) + + +comment(# @@PLEAC@@_16.6) +pre_constant(ARGV)operator(.)ident(map!) operator({) operator(|)ident(arg)operator(|) + ident(arg) operator(=)operator(~) regexp<delimiter(/)char(\\.)content((gz|Z\)$)delimiter(/)> operator(?) string<delimiter(")content(|gzip -dc )inline<delimiter(#{)ident(arg)delimiter(})>delimiter(")> operator(:) ident(arg) +operator(}) +reserved(for) ident(file) reserved(in) pre_constant(ARGV) + ident(fh) operator(=) ident(open)operator(()ident(file)operator(\)) + reserved(while) ident(fh)operator(.)ident(gets)operator(()operator(\)) reserved(do) + comment(# .......) + reserved(end) +reserved(end) +comment(#-----------------------------) +pre_constant(ARGV)operator(.)ident(map!) operator({) operator(|)ident(arg)operator(|) + ident(arg) operator(=)operator(~) regexp<delimiter(%r#)content(^)char(\\w)content(+://)delimiter(#)> operator(?) string<delimiter(")content(|GET )inline<delimiter(#{)ident(arg)delimiter(})>delimiter(")> operator(:) ident(arg) comment(#) +operator(}) +reserved(for) ident(file) reserved(in) pre_constant(ARGV) + ident(fh) operator(=) ident(open)operator(()ident(file)operator(\)) + reserved(while) ident(fh)operator(.)ident(gets)operator(()operator(\)) reserved(do) + comment(# .......) + reserved(end) +reserved(end) +comment(#-----------------------------) +ident(pwdinfo) operator(=) operator(()shell<delimiter(`)content(domainname)delimiter(`)> operator(=)operator(~) regexp<delimiter(/)content(^()char(\\()content(none)char(\\\))content(\)?$)delimiter(/)>operator(\)) operator(?) string<delimiter(')content(/etc/passwd)delimiter(')> operator(:) string<delimiter(')content(|ypcat passwd)delimiter(')>operator(;) +ident(pwd) operator(=) ident(open)operator(()ident(pwdinfo)operator(\))operator(;) +comment(#-----------------------------) +ident(puts) string<delimiter(")content(File, please? )delimiter(")>operator(;) +ident(file) operator(=) ident(gets)operator(()operator(\))operator(.)ident(chomp)operator(()operator(\))operator(;) +ident(fh) operator(=) ident(open)operator(()ident(file)operator(\))operator(;) + + +comment(# @@PLEAC@@_16.7) +ident(output) operator(=) shell<delimiter(`)content(cmd 2>&1)delimiter(`)> comment(# with backticks) +comment(# or) +ident(ph) operator(=) ident(open)operator(()string<delimiter(")content(|cmd 2>&1)delimiter(")>operator(\)) comment(# with an open pipe) +reserved(while) ident(ph)operator(.)ident(gets)operator(()operator(\)) operator({) operator(}) comment(# plus a read) +comment(#-----------------------------) +ident(output) operator(=) shell<delimiter(`)content(cmd 2>/dev/null)delimiter(`)> comment(# with backticks) +comment(# or) +ident(ph) operator(=) ident(open)operator(()string<delimiter(")content(|cmd 2>/dev/null)delimiter(")>operator(\)) comment(# with an open pipe) +reserved(while) ident(ph)operator(.)ident(gets)operator(()operator(\)) operator({) operator(}) comment(# plus a read) +comment(#-----------------------------) +ident(output) operator(=) shell<delimiter(`)content(cmd 2>&1 1>/dev/null)delimiter(`)> comment(# with backticks) +comment(# or) +ident(ph) operator(=) ident(open)operator(()string<delimiter(")content(|cmd 2>&1 1>/dev/null)delimiter(")>operator(\)) comment(# with an open pipe) +reserved(while) ident(ph)operator(.)ident(gets)operator(()operator(\)) operator({) operator(}) comment(# plus a read) +comment(#-----------------------------) +ident(output) operator(=) shell<delimiter(`)content(cmd 3>&1 1>&2 2>&3 3>&-)delimiter(`)> comment(# with backticks) +comment(# or) +ident(ph) operator(=) ident(open)operator(()string<delimiter(")content(|cmd 3>&1 1>&2 2>&3 3>&-)delimiter(")>operator(\)) comment(# with an open pipe) +reserved(while) ident(ph)operator(.)ident(gets)operator(()operator(\)) operator({) operator(}) comment(# plus a read) +comment(#-----------------------------) +ident(system)operator(()string<delimiter(")content(program args 1>/tmp/program.stdout 2>/tmp/program.stderr)delimiter(")>operator(\)) +comment(#-----------------------------) +ident(output) operator(=) shell<delimiter(`)content(cmd 3>&1 1>&2 2>&3 3>&-)delimiter(`)> +comment(#-----------------------------) +ident(fd3) operator(=) ident(fd1) +ident(fd1) operator(=) ident(fd2) +ident(fd2) operator(=) ident(fd3) +ident(fd3) operator(=) pre_constant(nil) +comment(#-----------------------------) +ident(system)operator(()string<delimiter(")content(prog args 1>tmpfile 2>&1)delimiter(")>operator(\)) +ident(system)operator(()string<delimiter(")content(prog args 2>&1 1>tmpfile)delimiter(")>operator(\)) +comment(#-----------------------------) +comment(# system ("prog args 1>tmpfile 2>&1"\) ) +ident(fd1) operator(=) string<delimiter(")content(tmpfile)delimiter(")> comment(# change stdout destination first) +ident(fd2) operator(=) ident(fd1) comment(# now point stderr there, too) +comment(#-----------------------------) +comment(# system("prog args 2>&1 1>tmpfile"\) ) +ident(fd2) operator(=) ident(fd1) comment(# stderr same destination as stdout) +ident(fd1) operator(=) string<delimiter(")content(tmpfile)delimiter(")> comment(# but change stdout destination ) +comment(#-----------------------------) +comment(# It is often better not to rely on the shell, ) +comment(# because of portability, possible security problems ) +comment(# and bigger resource usage. So, it is often better to use the open3 library. ) +comment(# See below for an example.) +comment(# opening stdin, stdout, stderr) +ident(require) string<delimiter(")content(open3)delimiter(")> +ident(stdin)operator(,) ident(stdout)operator(,) ident(stderr) operator(=) constant(Open3)operator(.)ident(popen)operator(()string<delimiter(')content(cmd)delimiter(')>operator(\)) + + +comment(# @@PLEAC@@_16.8) +comment(#-----------------------------) +comment(# Contrary to perl, we don't need to use a module in Ruby) +ident(fh) operator(=) constant(Kernel)operator(.)ident(open)operator(()string<delimiter(")content(|)delimiter(")> operator(+) ident(program)operator(,) string<delimiter(")content(w+)delimiter(")>operator(\)) +ident(fh)operator(.)ident(puts) string<delimiter(")content(here's your input)char(\\n)delimiter(")> +ident(output) operator(=) ident(fh)operator(.)ident(gets)operator(()operator(\)) +ident(fh)operator(.)ident(close)operator(()operator(\)) +comment(#-----------------------------) +constant(Kernel)operator(.)ident(open)operator(()string<delimiter(")content(|program)delimiter(")>operator(\))operator(,)string<delimiter(")content(w+)delimiter(")>operator(\)) comment(# RIGHT !) +comment(#-----------------------------) +comment(# Ruby has already object methods for I/O handles) +comment(#-----------------------------) +reserved(begin) + ident(fh) operator(=) constant(Kernel)operator(.)ident(open)operator(()string<delimiter(")content(|)delimiter(")> operator(+) ident(program_and_options)operator(,) string<delimiter(")content(w+)delimiter(")>operator(\)) +reserved(rescue) + reserved(if) operator(()global_variable($@) operator(~=) regexp<delimiter(/)content(^open)delimiter(/)>operator(\)) + global_variable($stderr)operator(.)ident(puts) string<delimiter(")content(open failed : )inline<delimiter(#{)global_variable($!)delimiter(})>content( )char(\\n)content( )inline<delimiter(#{)global_variable($@)delimiter(})>content( )char(\\n)delimiter(")> + reserved(break) + reserved(end) + ident(raise) comment(# reraise unforseen exception) +reserved(end) + + +comment(# @@PLEAC@@_16.13) +comment(#% kill -l) +comment(#HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE) +comment(#ALRM TERM CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM) +comment(#PROF WINCH POLL PWR) +comment(#-----------------------------) +comment(#% ruby -e 'puts Signal.list.keys.join(" "\)') +comment(#PWR USR1 BUS USR2 TERM SEGV KILL POLL STOP SYS TRAP IOT HUP INT #) +comment(#WINCH XCPU TTIN CLD TSTP FPE IO TTOU PROF CHLD CONT PIPE ABRT) +comment(#VTALRM QUIT ILL XFSZ URG ALRM) +comment(#-----------------------------) +comment(# After that, the perl script create an hash equivalent to Signal.list, ) +comment(# and an array. The array can be obtained by :) +ident(signame) operator(=) operator([)operator(]) +constant(Signal)operator(.)ident(list)operator(.)ident(each) operator({) operator(|)ident(name)operator(,) ident(i)operator(|) ident(signame)operator([)ident(i)operator(]) operator(=) ident(name) operator(}) + + +comment(# @@PLEAC@@_16.14) +constant(Process)operator(.)ident(kill)operator(()integer(9)operator(,) ident(pid)operator(\)) comment(# send $pid a signal 9) +constant(Process)operator(.)ident(kill)operator(()integer(-1)operator(,) constant(Process)operator(.)ident(getpgrp)operator(()operator(\))operator(\)) comment(# send whole job a signal 1) +constant(Process)operator(.)ident(kill)operator(()string<delimiter(")content(USR1)delimiter(")>operator(,) global_variable($$)operator(\)) comment(# send myself a SIGUSR1) +constant(Process)operator(.)ident(kill)operator(()string<delimiter(")content(HUP)delimiter(")>operator(,) ident(pid1)operator(,) ident(pid2)operator(,) ident(pid3)operator(\)) comment(# send a SIGHUP to processes in @pids) +comment(#-----------------------------) +reserved(begin) + constant(Process)operator(.)ident(kill)operator(()integer(0)operator(,) ident(minion)operator(\)) + ident(puts) string<delimiter(")inline<delimiter(#{)ident(minion)delimiter(})>content( is alive!)delimiter(")> +reserved(rescue) constant(Errno)operator(::)constant(EPERM) comment(# changed uid) + ident(puts) string<delimiter(")inline<delimiter(#{)ident(minion)delimiter(})>content( has escaped my control!)delimiter(")>operator(;) +reserved(rescue) constant(Errno)operator(::)constant(ESRCH) + ident(puts) string<delimiter(")inline<delimiter(#{)ident(minion)delimiter(})>content( is deceased.)delimiter(")>operator(;) comment(# or zombied) +reserved(rescue) + ident(puts) string<delimiter(")content(Odd; I couldn't check the status of )inline<delimiter(#{)ident(minion)delimiter(})>content( : )inline<delimiter(#{)global_variable($!)delimiter(})>delimiter(")> +reserved(end) + + +comment(# @@PLEAC@@_16.15) +constant(Kernel)operator(.)ident(trap)operator(()string<delimiter(")content(QUIT)delimiter(")>operator(,) ident(got_sig_quit)operator(\)) comment(# got_sig_quit = Proc.new { puts "Quit\\n" }) +ident(trap)operator(()string<delimiter(")content(PIPE)delimiter(")>operator(,) string<delimiter(")content(got_sig_quit)delimiter(")>operator(\)) comment(# def got_sig_pipe ...) +ident(trap)operator(()string<delimiter(")content(INT)delimiter(")>operator(\)) operator({) ident(ouch)operator(+)operator(+) operator(}) comment(# increment ouch for every SIGINT) +comment(#-----------------------------) +ident(trap)operator(()string<delimiter(")content(INT)delimiter(")>operator(,) string<delimiter(")content(IGNORE)delimiter(")>operator(\)) comment(# ignore the signal INT) +comment(#-----------------------------) +ident(trap)operator(()string<delimiter(")content(STOP)delimiter(")>operator(,) string<delimiter(")content(DEFAULT)delimiter(")>operator(\)) comment(# restore default STOP signal handling) + + +comment(# @@PLEAC@@_16.16) +comment(# the signal handler) +reserved(def) method(ding) + ident(trap)operator(()string<delimiter(")content(INT)delimiter(")>operator(,) string<delimiter(")content(ding)delimiter(")>operator(\)) + ident(puts) string<delimiter(")char(\\a)content(Enter your name!)delimiter(")> +reserved(end) + +comment(# prompt for name, overriding SIGINT) +reserved(def) method(get_name) + ident(save) operator(=) ident(trap)operator(()string<delimiter(")content(INT)delimiter(")>operator(,) string<delimiter(")content(ding)delimiter(")>operator(\)) + + ident(puts) string<delimiter(")content(Kindly Stranger, please enter your name: )delimiter(")> + ident(name) operator(=) ident(gets)operator(()operator(\))operator(.)ident(chomp)operator(()operator(\)) + ident(trap)operator(()string<delimiter(")content(INT)delimiter(")>operator(,) ident(save)operator(\)) + ident(name) +reserved(end) + + +comment(# @@PLEAC@@_16.21) +comment(# implemented thanks to http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/1760) +ident(require) string<delimiter(')content(timeout)delimiter(')> + +comment(# we'll do something vastly more useful than cookbook to demonstrate timeouts) +reserved(begin) + ident(timeout)operator(()integer(5)operator(\)) operator({) + ident(waitsec) operator(=) ident(rand)operator(()integer(10)operator(\)) + ident(puts) string<delimiter(")content(Let's see if a sleep of )inline<delimiter(#{)ident(waitsec)delimiter(})>content( seconds is longer than 5 seconds...)delimiter(")> + ident(system)operator(()string<delimiter(")content(sleep )inline<delimiter(#{)ident(waitsec)delimiter(})>delimiter(")>operator(\)) + operator(}) + ident(puts) string<delimiter(")content(Timeout didn't occur)delimiter(")> +reserved(rescue) constant(Timeout)operator(::)constant(Error) + ident(puts) string<delimiter(")content(Timed out!)delimiter(")> +reserved(end) + + +comment(# @@PLEAC@@_17.1) +comment(# A basic TCP client connection) +ident(require) string<delimiter(')content(socket)delimiter(')> +reserved(begin) + ident(t) operator(=) constant(TCPSocket)operator(.)ident(new)operator(()string<delimiter(')content(www.ruby-lang.org)delimiter(')>operator(,) string<delimiter(')content(www)delimiter(')>operator(\)) +reserved(rescue) + ident(puts) string<delimiter(")content(error: )inline<delimiter(#{)global_variable($!)delimiter(})>delimiter(")> +reserved(else) + comment(# ... do something with the socket) + ident(t)operator(.)ident(print) string<delimiter(")content(GET / HTTP/1.0)char(\\n)char(\\n)delimiter(")> + ident(answer) operator(=) ident(t)operator(.)ident(gets)operator(()pre_constant(nil)operator(\)) + comment(# and terminate the connection when we're done) + ident(t)operator(.)ident(close) +reserved(end) + +comment(# Using the evil low level socket API) +ident(require) string<delimiter(')content(socket)delimiter(')> +comment(# create a socket) +ident(s) operator(=) constant(Socket)operator(.)ident(new)operator(()constant(Socket)operator(::)constant(AF_INET)operator(,) constant(Socket)operator(::)constant(SOCK_STREAM)operator(,) integer(0)operator(\)) +comment(# build the address of the remote machine) +ident(sockaddr_server) operator(=) operator([)constant(Socket)operator(::)constant(AF_INET)operator(,) integer(80)operator(,) + constant(Socket)operator(.)ident(gethostbyname)operator(()string<delimiter(')content(www.ruby-lang.org)delimiter(')>operator(\))operator([)integer(3)operator(])operator(,) + integer(0)operator(,) integer(0)operator(])operator(.)ident(pack)operator(()string<delimiter(")content(snA4NN)delimiter(")>operator(\)) +comment(# connect) +reserved(begin) + ident(s)operator(.)ident(connect)operator(()ident(sockaddr_server)operator(\)) +reserved(rescue) + ident(puts) string<delimiter(")content(error: )inline<delimiter(#{)global_variable($!)delimiter(})>delimiter(")> +reserved(else) + comment(# ... do something with the socket) + ident(s)operator(.)ident(print) string<delimiter(")content(GET / HTTP/1.0)char(\\n)char(\\n)delimiter(")> + comment(# and terminate the connection when we're done) + ident(s)operator(.)ident(close) +reserved(end) + +comment(# TCP connection with management of error (DNS\)) +ident(require) string<delimiter(')content(socket)delimiter(')> +reserved(begin) + ident(client) operator(=) constant(TCPSocket)operator(.)ident(new)operator(()string<delimiter(')content(does not exists)delimiter(')>operator(,) string<delimiter(')content(www)delimiter(')>operator(\)) +reserved(rescue) + ident(puts) string<delimiter(")content(error: )inline<delimiter(#{)global_variable($!)delimiter(})>delimiter(")> +reserved(end) + +comment(# TCP connection with a time out) +ident(require) string<delimiter(')content(socket)delimiter(')> +ident(require) string<delimiter(')content(timeout)delimiter(')> +reserved(begin) + ident(timeout)operator(()integer(1)operator(\)) reserved(do) comment(#the server has one second to answer) + ident(client) operator(=) constant(TCPSocket)operator(.)ident(new)operator(()string<delimiter(')content(www.host.com)delimiter(')>operator(,) string<delimiter(')content(www)delimiter(')>operator(\)) + reserved(end) +reserved(rescue) + ident(puts) string<delimiter(")content(error: )inline<delimiter(#{)global_variable($!)delimiter(})>delimiter(")> +reserved(end) + + +comment(# @@PLEAC@@_17.12) +ident(require) string<delimiter(')content(socket)delimiter(')> + +reserved(class) class(Preforker) + ident(attr_reader) operator(()symbol(:child_count)operator(\)) + + reserved(def) method(initialize)operator(()ident(prefork)operator(,) ident(max_clients_per_child)operator(,) ident(port)operator(,) ident(client_handler)operator(\)) + instance_variable(@prefork) operator(=) ident(prefork) + instance_variable(@max_clients_per_child) operator(=) ident(max_clients_per_child) + instance_variable(@port) operator(=) ident(port) + instance_variable(@child_count) operator(=) integer(0) + + instance_variable(@reaper) operator(=) ident(proc) operator({) + ident(trap)operator(()string<delimiter(')content(CHLD)delimiter(')>operator(,) instance_variable(@reaper)operator(\)) + ident(pid) operator(=) constant(Process)operator(.)ident(wait) + instance_variable(@child_count) operator(-=) integer(1) + operator(}) + + instance_variable(@huntsman) operator(=) ident(proc) operator({) + ident(trap)operator(()string<delimiter(')content(CHLD)delimiter(')>operator(,) string<delimiter(')content(IGNORE)delimiter(')>operator(\)) + ident(trap)operator(()string<delimiter(')content(INT)delimiter(')>operator(,) string<delimiter(')content(IGNORE)delimiter(')>operator(\)) + constant(Process)operator(.)ident(kill)operator(()string<delimiter(')content(INT)delimiter(')>operator(,) integer(0)operator(\)) + ident(exit) + operator(}) + + instance_variable(@client_handler)operator(=)ident(client_handler) + reserved(end) + + reserved(def) method(child_handler) + ident(trap)operator(()string<delimiter(')content(INT)delimiter(')>operator(,) string<delimiter(')content(EXIT)delimiter(')>operator(\)) + instance_variable(@client_handler)operator(.)ident(setUp) + comment(# wish: sigprocmask UNblock SIGINT) + instance_variable(@max_clients_per_child)operator(.)ident(times) operator({) + ident(client) operator(=) instance_variable(@server)operator(.)ident(accept) reserved(or) reserved(break) + instance_variable(@client_handler)operator(.)ident(handle_request)operator(()ident(client)operator(\)) + ident(client)operator(.)ident(close) + operator(}) + instance_variable(@client_handler)operator(.)ident(tearDown) + reserved(end) + + reserved(def) method(make_new_child) + comment(# wish: sigprocmask block SIGINT) + instance_variable(@child_count) operator(+=) integer(1) + ident(pid) operator(=) ident(fork) reserved(do) + ident(child_handler) + reserved(end) + comment(# wish: sigprocmask UNblock SIGINT) + reserved(end) + + reserved(def) method(run) + instance_variable(@server) operator(=) constant(TCPserver)operator(.)ident(open)operator(()instance_variable(@port)operator(\)) + ident(trap)operator(()string<delimiter(')content(CHLD)delimiter(')>operator(,) instance_variable(@reaper)operator(\)) + ident(trap)operator(()string<delimiter(')content(INT)delimiter(')>operator(,) instance_variable(@huntsman)operator(\)) + ident(loop) operator({) + operator(()instance_variable(@prefork) operator(-) instance_variable(@child_count)operator(\))operator(.)ident(times) operator({) operator(|)ident(i)operator(|) + ident(make_new_child) + operator(}) + ident(sleep) operator(.)integer(1) + operator(}) + reserved(end) +reserved(end) + +comment(#-----------------------------) +comment(#!/usr/bin/ruby) + +ident(require) string<delimiter(')content(Preforker)delimiter(')> + +reserved(class) class(ClientHandler) + reserved(def) method(setUp) + reserved(end) + + reserved(def) method(tearDown) + reserved(end) + + reserved(def) method(handle_request)operator(()ident(client)operator(\)) + comment(# do stuff) + reserved(end) +reserved(end) + +ident(server) operator(=) constant(Preforker)operator(.)ident(new)operator(()integer(1)operator(,) integer(100)operator(,) integer(3102)operator(,) constant(ClientHandler)operator(.)ident(new)operator(\)) +ident(server)operator(.)ident(run) + + +comment(# @@PLEAC@@_18.2) +ident(require) string<delimiter(')content(net/ftp)delimiter(')> + +reserved(begin) + ident(ftp) operator(=) constant(Net)operator(::)constant(FTP)operator(::)ident(new)operator(()string<delimiter(")content(ftp.host.com)delimiter(")>operator(\)) + ident(ftp)operator(.)ident(login)operator(()ident(username)operator(,)ident(password)operator(\)) + ident(ftp)operator(.)ident(chdir)operator(()ident(directory)operator(\)) + ident(ftp)operator(.)ident(get)operator(()ident(filename)operator(\)) + ident(ftp)operator(.)ident(put)operator(()ident(filename)operator(\)) +reserved(rescue) constant(Net)operator(::)constant(FTPError) + global_variable($stderr)operator(.)ident(print) string<delimiter(")content(FTP failed: )delimiter(")> operator(+) global_variable($!) +reserved(ensure) + ident(ftp)operator(.)ident(close)operator(()operator(\)) reserved(if) ident(ftp) +reserved(end) + +comment(# A better solution for a local use could be :) +constant(Net)operator(::)constant(FTP)operator(::)ident(new)operator(()string<delimiter(")content(ftp.host.com)delimiter(")>operator(\)) reserved(do) operator(|)ident(ftp)operator(|) + ident(ftp)operator(.)ident(login)operator(()ident(username)operator(,)ident(password)operator(\)) + ident(ftp)operator(.)ident(chdir)operator(()ident(directory)operator(\)) + ident(ftp)operator(.)ident(get)operator(()ident(filename)operator(\)) + ident(ftp)operator(.)ident(put)operator(()ident(filename)operator(\)) +reserved(end) + +comment(# If you have only one file to get, there is a simple solution :) +ident(require) string<delimiter(')content(open-uri)delimiter(')> +ident(open)operator(()string<delimiter(")content(ftp://www.ruby-lang.org/path/filename)delimiter(")>operator(\)) reserved(do) operator(|)ident(fh)operator(|) + comment(# read from filehandle fh) +reserved(end) +comment(#--------------------------------------------) +comment(# to wait a defined time for the connection, ) +comment(# use the timeout module) +ident(require) string<delimiter(')content(timeout)delimiter(')> +reserved(begin) + ident(timeout)operator(()integer(30)operator(\))operator({) + ident(ftp) operator(=) constant(Net)operator(::)constant(FTP)operator(::)ident(new)operator(()string<delimiter(")content(ftp.host.com)delimiter(")>operator(\)) + ident(ftp)operator(.)ident(debug_mode) operator(=) pre_constant(true) + operator(}) +reserved(rescue) constant(Net)operator(::)constant(FTPError) + global_variable($stderr)operator(.)ident(puts) string<delimiter(")content(Couldn't connect.)delimiter(")> +reserved(rescue) constant(Timeout)operator(::)constant(Error) + global_variable($stderr)operator(.)ident(puts) string<delimiter(")content(Timeout while connecting to server.)delimiter(")> +reserved(end) + +reserved(begin) + ident(ftp)operator(.)ident(login)operator(()operator(\)) +reserved(rescue) constant(Net)operator(::)constant(FTPError) + global_variable($stderr)operator(.)ident(print) string<delimiter(")content(Couldn't authentificate.)char(\\n)delimiter(")> +reserved(end) + +reserved(begin) + ident(ftp)operator(.)ident(login)operator(()ident(username)operator(\)) +reserved(rescue) constant(Net)operator(::)constant(FTPError) + global_variable($stderr)operator(.)ident(print) string<delimiter(")content(Still couldn't authenticate.)char(\\n)delimiter(")> +reserved(end) + +reserved(begin) + ident(ftp)operator(.)ident(login)operator(()ident(username)operator(,) ident(password)operator(\)) +reserved(rescue) constant(Net)operator(::)constant(FTPError) + global_variable($stderr)operator(.)ident(print) string<delimiter(")content(Couldn't authenticate, even with explicit + username and password.)char(\\n)delimiter(")> +reserved(end) + +reserved(begin) + ident(ftp)operator(.)ident(login)operator(()ident(username)operator(,) ident(password)operator(,) ident(account)operator(\)) +reserved(rescue) constant(Net)operator(::)constant(FTPError) + global_variable($stderr)operator(.)ident(print) string<delimiter(")content(No dice. It hates me.)char(\\n)delimiter(")> +reserved(end) +comment(#-----------------------------) +ident(ftp)operator(.)ident(put)operator(()ident(localfile)operator(,) ident(remotefile)operator(\)) +comment(#-----------------------------) +comment(# Sending data from STDIN is not directly supported ) +comment(# by the ftp library module. A possible way to do it is to use the ) +comment(# storlines method directly to send raw commands to the ftp server.) +comment(#-----------------------------) +ident(ftp)operator(.)ident(get)operator(()ident(remotefile)operator(,) ident(localfile)operator(\)) +comment(#-----------------------------) +ident(ftp)operator(.)ident(get)operator(()ident(remotefile)operator(\)) operator({) operator(|)ident(data)operator(|) ident(puts) ident(data) operator(}) +comment(#-----------------------------) +ident(ftp)operator(.)ident(chdir)operator(()string<delimiter(")content(/pub/ruby)delimiter(")>operator(\)) +ident(print) string<delimiter(")content(I'm in the directory )delimiter(")>operator(,) ident(ftp)operator(.)ident(pwd)operator(()operator(\))operator(,) string<delimiter(")char(\\n)delimiter(")> +comment(#-----------------------------) +ident(ftp)operator(.)ident(mkdir)operator(()string<delimiter(")content(/pub/ruby/new_dir)delimiter(")>operator(\)) +comment(#-----------------------------) +ident(lines) operator(=) ident(ftp)operator(.)ident(ls)operator(()string<delimiter(")content(/pub/ruby/)delimiter(")>operator(\)) +comment(# => ["drwxr-xr-x 2 matz users 4096 July 17 1998 1.0", ... ]) + +ident(latest) operator(=) ident(ftp)operator(.)ident(dir)operator(()string<delimiter(")content(/pub/ruby/*.tgz)delimiter(")>operator(\))operator(.)ident(sort)operator(.)ident(last) + +ident(ftp)operator(.)ident(nlst)operator(()string<delimiter(")content(/pub/ruby)delimiter(")>operator(\)) +comment(# => ["/pub/ruby/1.0", ... ]) +comment(#-----------------------------) +ident(ftp)operator(.)ident(quit)operator(()operator(\)) + + +comment(# @@PLEAC@@_18.6) +ident(require) string<delimiter(')content(net/telnet)delimiter(')> +ident(t) operator(=) constant(Net)operator(::)constant(Telnet)operator(::)ident(new)operator(() string<delimiter(")content(Timeout)delimiter(")> operator(=)operator(>) integer(10)operator(,) + string<delimiter(")content(Prompt)delimiter(")> operator(=)operator(>) regexp<delimiter(/)content(%)delimiter(/)>operator(,) + string<delimiter(")content(Host)delimiter(")> operator(=)operator(>) ident(host) operator(\)) +ident(t)operator(.)ident(login)operator(()ident(username)operator(,) ident(password)operator(\)) +ident(files) operator(=) ident(t)operator(.)ident(cmd)operator(()string<delimiter(")content(ls)delimiter(")>operator(\)) +ident(t)operator(.)ident(print)operator(()string<delimiter(")content(top)delimiter(")>operator(\)) +ident(process_string) operator(=) ident(t)operator(.)ident(waitfor)operator(()regexp<delimiter(/)char(\\d)content(+ processes)delimiter(/)>operator(\)) +ident(t)operator(.)ident(close) +comment(#-----------------------------) +regexp<delimiter(/)content([$%#>] )char(\\z)delimiter(/)modifier(n)> +comment(#-----------------------------) +comment(# In case of an error, the telnet module throws an exception.) +comment(# For control of the behavior in case of an error,) +comment(# you just need to catch the exceptions and do your custom) +comment(# error handling.) +comment(#-----------------------------) +reserved(begin) + ident(telnet)operator(.)ident(login)operator(()ident(username)operator(,) ident(password)operator(\)) +reserved(rescue) constant(TimeoutError) + ident(fail) string<delimiter(")content(Login failed !)char(\\n)delimiter(")> +reserved(end) +comment(#-----------------------------) +ident(telnet)operator(.)ident(waitfor)operator(()string<delimiter(')content(/--more--/)delimiter(')>operator(\)) +comment(#-----------------------------) +ident(telnet)operator(.)ident(waitfor)operator(()constant(String) operator(=)operator(>) string<delimiter(')content(greasy smoke)delimiter(')>operator(,) constant(Timeout) operator(=)operator(>) integer(30)operator(\)) + + +comment(# @@PLEAC@@_18.7) +ident(require) string<delimiter(')content(ping)delimiter(')> + +ident(puts) string<delimiter(")inline<delimiter(#{)ident(host)delimiter(})>content( is alive.)char(\\n)delimiter(")> reserved(if) constant(Ping)operator(.)ident(pingecho)operator(()ident(host)operator(\))operator(;) +comment(#-----------------------------) +comment(# the ping module only use TCP ping, not ICMP even if we are root) +reserved(if) constant(Ping)operator(.)ident(pingecho)operator(()string<delimiter(")content(kingkong.com)delimiter(")>operator(\)) + ident(puts) string<delimiter(")content(The giant ape lives!)char(\\n)delimiter(")>operator(;) +reserved(else) + ident(puts) string<delimiter(")content(All hail mighty Gamera, friend of children!)char(\\n)delimiter(")>operator(;) +reserved(end) + + +comment(# @@PLEAC@@_19.0) +comment(#-----------------------------) +comment(# http://www.perl.com/CPAN/) +comment(# http://www.perl.com:8001/bad/mojo.html) +comment(# ftp://gatekeeper.dec.com/pub/misc/netlib.tar.Z) +comment(# ftp://anonymous@myplace:gatekeeper.dec.com/pub/misc/netlib.tar.Z) +comment(# file:///etc/motd) +comment(#-----------------------------) +comment(# http://mox.perl.com/cgi-bin/program?name=Johann&born=1685) +comment(#-----------------------------) +comment(# http://mox.perl.com/cgi-bin/program) +comment(#-----------------------------) + + +comment(# @@PLEAC@@_19.1) +comment(#!/usr/local/bin/ruby -w) +comment(# hiweb - load CGI class to decode information given by web server) + +ident(require) string<delimiter(')content(cgi)delimiter(')> + +ident(cgi) operator(=) constant(CGI)operator(.)ident(new)operator(()string<delimiter(')content(html3)delimiter(')>operator(\)) + +comment(# get a parameter from a form) +ident(value) operator(=) ident(cgi)operator(.)ident(params)operator([)string<delimiter(')content(PARAM_NAME)delimiter(')>operator(])operator([)integer(0)operator(]) + +comment(# output a document) +ident(cgi)operator(.)ident(out) operator({) + ident(cgi)operator(.)ident(html) operator({) + ident(cgi)operator(.)ident(head) operator({) ident(cgi)operator(.)ident(title) operator({) string<delimiter(")content(Howdy there!)delimiter(")> operator(}) operator(}) operator(+) + ident(cgi)operator(.)ident(body) operator({) ident(cgi)operator(.)ident(p) operator({) string<delimiter(")content(You typed: )delimiter(")> operator(+) ident(cgi)operator(.)ident(tt) operator({) + constant(CGI)operator(.)ident(escapeHTML)operator(()ident(value)operator(\)) operator(}) operator(}) operator(}) + operator(}) +operator(}) + +ident(require) string<delimiter(')content(cgi)delimiter(')> +ident(cgi) operator(=) constant(CGI)operator(.)ident(new) +ident(who) operator(=) ident(cgi)operator(.)ident(param)operator([)string<delimiter(")content(Name)delimiter(")>operator(])operator([)integer(0)operator(]) comment(# first param in list) +ident(phone) operator(=) ident(cgi)operator(.)ident(param)operator([)string<delimiter(")content(Number)delimiter(")>operator(])operator([)integer(0)operator(]) +ident(picks) operator(=) ident(cgi)operator(.)ident(param)operator([)string<delimiter(")content(Choices)delimiter(")>operator(]) comment(# complete list) + +ident(print) ident(cgi)operator(.)ident(header)operator(() string<delimiter(')content(type)delimiter(')> operator(=)operator(>) string<delimiter(')content(text/plain)delimiter(')>operator(,) + string<delimiter(')content(expires)delimiter(')> operator(=)operator(>) constant(Time)operator(.)ident(now) operator(+) operator(()integer(3) operator(*) integer(24) operator(*) integer(60) operator(*) integer(60)operator(\)) operator(\)) + + +comment(# @@PLEAC@@_19.3) +comment(#!/usr/local/bin/ruby -w) +comment(# webwhoami - show web user's id) +ident(require) string<delimiter(')content(etc)delimiter(')> +ident(print) string<delimiter(")content(Content-Type: text/plain)char(\\n)char(\\n)delimiter(")> +ident(print) string<delimiter(")content(Running as )delimiter(")> operator(+) constant(Etc)operator(.)ident(getpwuid)operator(.)ident(name) operator(+) string<delimiter(")char(\\n)delimiter(")> + +comment(# % ruby -wc cgi-script # just check syntax) + +comment(# % ruby -w cgi-script # params from stdin) +comment(# (offline mode: enter name=value pairs on standard input\)) +comment(# name=joe) +comment(# number=10) +comment(# ^D) + +comment(# % ruby -w cgi-script name=joe number=10 # run with mock form input) +comment(# % ruby -d cgi-script name=joe number=10 # ditto, under the debugger) + +comment(# POST method script in csh) +comment(# % (setenv HTTP_METHOD POST; ruby -w cgi-script name=joe number=10\)) +comment(# POST method script in sh) +comment(# % HTTP_METHOD=POST perl -w cgi-script name=joe number=10) + + +comment(# @@PLEAC@@_19.4) +comment(# ruby has several security levels, the level "1" is similar to perls taint mode.) +comment(# It can be switched on by providing the -T command line parameter) +comment(# or by setting $SAFE to 1. Setting $SAFE to 2,3 or 4 restricts possible) +comment(# harmful operations further.) + +comment(#!/usr/bin/ruby -T) +global_variable($SAFE) operator(=) integer(1) +constant(File)operator(.)ident(open)operator(()pre_constant(ARGV)operator([)integer(0)operator(])operator(,) string<delimiter(")content(w)delimiter(")>operator(\)) +comment(# ruby warns with:) +comment(# taint1.rb:2:in `initialize': Insecure operation - initialize (SecurityError\)) + +global_variable($SAFE) operator(=) integer(1) +ident(file) operator(=) pre_constant(ARGV)operator([)integer(0)operator(]) +reserved(unless) regexp<delimiter(/)content(^([)char(\\w)content(.-]+\)$)delimiter(/)>operator(.)ident(match)operator(()ident(file)operator(\)) + ident(raise) string<delimiter(")content(filename )inline<delimiter(#{)ident(file)delimiter(})>content( has invalid characters)delimiter(")> +reserved(end) +ident(file) operator(=) global_variable($1) +comment(# In ruby, even the back reference from a regular expression stays tainted.) +comment(# you need to explicitly untaint the variable:) +ident(file)operator(.)ident(untaint) +constant(File)operator(.)ident(open)operator(()ident(file)operator(,) string<delimiter(")content(w)delimiter(")>operator(\)) + +comment(# Race condition exists like in perl:) +reserved(unless) constant(File)operator(.)ident(exists)operator(()ident(filename)operator(\)) comment(# Wrong because of race condition) + constant(File)operator(.)ident(open)operator(()ident(filename)operator(,) string<delimiter(")content(w)delimiter(")>operator(\)) +reserved(end) + + +comment(# @@PLEAC@@_19.8) +ident(url) operator(=) string<delimiter(")content(http://pleac.sourceforge.net/pleac_ruby/)delimiter(")> +ident(print) string<delimiter(")content(Location: )inline<delimiter(#{)ident(url)delimiter(})>char(\\r)char(\\n)char(\\r)char(\\n)delimiter(")> +ident(exit) + +comment(#!/usr/bin/ruby) +ident(require) string<delimiter(')content(cgi)delimiter(')> + +ident(cgi) operator(=) constant(CGI)operator(.)ident(new) +ident(oreo) operator(=) constant(CGI)operator(::)constant(Cookie)operator(.)ident(new)operator(()string<delimiter(')content(name)delimiter(')> operator(=)operator(>) string<delimiter(')content(filling)delimiter(')>operator(,) + string<delimiter(')content(value)delimiter(')> operator(=)operator(>) string<delimiter(')content(vanilla creme)delimiter(')>operator(,) + string<delimiter(')content(expires)delimiter(')> operator(=)operator(>) constant(Time)operator(.)ident(now) operator(+) operator(()integer(3) operator(*) integer(30) operator(*) integer(24) operator(*) integer(60) operator(*) integer(60)operator(\))operator(,) + string<delimiter(')content(domain)delimiter(')> operator(=)operator(>) string<delimiter(')content(.pleac.sourceforge.net)delimiter(')>operator(\)) + +ident(whither) operator(=) string<delimiter(')content(http://pleac.sourceforge.net/pleac_ruby/cgiprogramming.html)delimiter(')> + +ident(cgi)operator(.)ident(out)operator(()string<delimiter(')content(cookie)delimiter(')> operator(=)operator(>) ident(oreo)operator(,) + string<delimiter(')content(Location)delimiter(')> operator(=)operator(>) ident(whither)operator(\))operator({)string<delimiter(")delimiter(")>operator(}) + +comment(#!/usr/bin/ruby) +comment(# os_snipe - redirect to a Jargon File entry about current OS) +ident(dir) operator(=) string<delimiter(')content(http://www.elsewhere.org/jargon/html/entry)delimiter(')> + +ident(agent) operator(=) constant(ENV)operator([)string<delimiter(')content(HTTP_USER_AGENT)delimiter(')>operator(]) + +ident(page) operator(=) reserved(case) + reserved(when) ident(agent) operator(=)operator(~) regexp<delimiter(/)content(Mac)delimiter(/)>operator(:) string<delimiter(')content(Macintrash.html)delimiter(')> + reserved(when) ident(agent) operator(=)operator(~) regexp<delimiter(/)content(Win(dows \)?NT)delimiter(/)>operator(:) string<delimiter(')content(evil_and_rude.html)delimiter(')> + reserved(when) ident(agent) operator(=)operator(~) regexp<delimiter(/)content(Win|MSIE|WebTV)delimiter(/)>operator(:) string<delimiter(')content(Microsloth_Windows.html)delimiter(')> + reserved(when) ident(agent) operator(=)operator(~) regexp<delimiter(/)content(Linux)delimiter(/)>operator(:) string<delimiter(')content(Linux.html)delimiter(')> + reserved(when) ident(agent) operator(=)operator(~) regexp<delimiter(/)content(HP-UX)delimiter(/)>operator(:) string<delimiter(')content(HP-SUX.html)delimiter(')> + reserved(when) ident(agent) operator(=)operator(~) regexp<delimiter(/)content(SunOS)delimiter(/)>operator(:) string<delimiter(')content(ScumOS.html)delimiter(')> + reserved(else) string<delimiter(')content(Appendix_B.html)delimiter(')> +reserved(end) + +ident(print) string<delimiter(")content(Location: )inline<delimiter(#{)ident(dir)delimiter(})>content(/)inline<delimiter(#{)ident(page)delimiter(})>char(\\n)char(\\n)delimiter(")> + +ident(require) string<delimiter(')content(cgi)delimiter(')> +ident(cgi) operator(=) constant(CGI)operator(.)ident(new) +ident(cgi)operator(.)ident(out)operator(()string<delimiter(')content(status)delimiter(')> operator(=)operator(>) string<delimiter(')content(204 No response)delimiter(')>operator(\))operator({)string<delimiter(")delimiter(")>operator(}) +comment(# this produces:) +comment(# Status: 204 No response) +comment(# Content-Type: text/html) +comment(# Content-Length: 0) +comment(# <blank line here>) + + +comment(# @@PLEAC@@_19.10) +ident(preference_value) operator(=) ident(cgi)operator(.)ident(cookies)operator([)string<delimiter(")content(preference name)delimiter(")>operator(])operator([)integer(0)operator(]) + +ident(packed_cookie) operator(=) constant(CGI)operator(::)constant(Cookie)operator(.)ident(new)operator(()string<delimiter(")content(name)delimiter(")> operator(=)operator(>) string<delimiter(")content(preference name)delimiter(")>operator(,) + string<delimiter(")content(value)delimiter(")> operator(=)operator(>) string<delimiter(")content(whatever you'd like)delimiter(")>operator(,) + string<delimiter(")content(expires)delimiter(")> operator(=)operator(>) constant(Time)operator(.)ident(local)operator(()constant(Time)operator(.)ident(now)operator(.)ident(year) operator(+) integer(2)operator(,) + constant(Time)operator(.)ident(now)operator(.)ident(mon)operator(,) constant(Time)operator(.)ident(now)operator(.)ident(day)operator(,) constant(Time)operator(.)ident(now)operator(.)ident(hour)operator(,) constant(Time)operator(.)ident(now)operator(.)ident(min)operator(,) constant(Time)operator(.)ident(now)operator(.)ident(sec)operator(\)) operator(\)) + +ident(cgi)operator(.)ident(header)operator(()string<delimiter(")content(cookie)delimiter(")> operator(=)operator(>) operator([)ident(packed_cookie)operator(])operator(\)) + +comment(#!/usr/local/bin/ruby -w) +comment(# ic_cookies - sample CGI script that uses a cookie) +ident(require) string<delimiter(')content(cgi)delimiter(')> + +ident(cgi) operator(=) constant(CGI)operator(.)ident(new)operator(()string<delimiter(')content(html3)delimiter(')>operator(\)) + +ident(cookname) operator(=) string<delimiter(")content(favorite ice cream)delimiter(")> +ident(favorite) operator(=) ident(cgi)operator(.)ident(params)operator([)string<delimiter(")content(flavor)delimiter(")>operator(])operator([)integer(0)operator(]) +ident(tasty) operator(=) ident(cgi)operator(.)ident(cookies)operator([)ident(cookname)operator(])operator([)integer(0)operator(]) operator(||) string<delimiter(')content(mint)delimiter(')> + +reserved(unless) ident(favorite) + ident(cgi)operator(.)ident(out) operator({) + ident(cgi)operator(.)ident(html) operator({) + ident(cgi)operator(.)ident(head) operator({) ident(cgi)operator(.)ident(title) operator({) string<delimiter(")content(Ice Cookies)delimiter(")> operator(}) operator(}) operator(+) + ident(cgi)operator(.)ident(body) operator({) + ident(cgi)operator(.)ident(h1) operator({) string<delimiter(")content(Hello Ice Cream)delimiter(")> operator(}) operator(+) + ident(cgi)operator(.)ident(hr) operator(+) + ident(cgi)operator(.)ident(form) operator({) + ident(cgi)operator(.)ident(p) operator({) string<delimiter(")content(Please select a flavor: )delimiter(")> operator(+) + ident(cgi)operator(.)ident(text_field)operator(()string<delimiter(")content(flavor)delimiter(")>operator(,) ident(tasty) operator(\)) operator(}) + operator(}) operator(+) + ident(cgi)operator(.)ident(hr) + operator(}) + operator(}) + operator(}) +reserved(else) + ident(cookie) operator(=) constant(CGI)operator(::)constant(Cookie)operator(.)ident(new)operator(() string<delimiter(")content(name)delimiter(")> operator(=)operator(>) ident(cookname)operator(,) + string<delimiter(")content(value)delimiter(")> operator(=)operator(>) ident(favorite)operator(,) + string<delimiter(")content(expires)delimiter(")> operator(=)operator(>) constant(Time)operator(.)ident(local)operator(()constant(Time)operator(.)ident(now)operator(.)ident(year) operator(+) integer(2)operator(,) +constant(Time)operator(.)ident(now)operator(.)ident(mon)operator(,) constant(Time)operator(.)ident(now)operator(.)ident(day)operator(,) constant(Time)operator(.)ident(now)operator(.)ident(hour)operator(,) constant(Time)operator(.)ident(now)operator(.)ident(min)operator(,) constant(Time)operator(.)ident(now)operator(.)ident(sec)operator(\)) operator(\)) + ident(cgi)operator(.)ident(out)operator(()string<delimiter(")content(cookie)delimiter(")> operator(=)operator(>) operator([)ident(cookie)operator(])operator(\)) operator({) + ident(cgi)operator(.)ident(html) operator({) + ident(cgi)operator(.)ident(head) operator({) ident(cgi)operator(.)ident(title) operator({) string<delimiter(")content(Ice Cookies)delimiter(")> operator(}) operator(}) operator(+) + ident(cgi)operator(.)ident(body) operator({) + ident(cgi)operator(.)ident(h1) operator({) string<delimiter(")content(Hello Ice Cream)delimiter(")> operator(}) operator(+) + ident(cgi)operator(.)ident(p) operator({) string<delimiter(")content(You chose as your favorite flavor `)inline<delimiter(#{)ident(favorite)delimiter(})>content('.)delimiter(")> operator(}) + operator(}) + operator(}) + operator(}) +reserved(end) + + +comment(# @@PLEAC@@_20.9) +reserved(def) method(templatefile)operator(()ident(filename)operator(,) ident(fillings)operator(\)) + ident(aFile) operator(=) constant(File)operator(.)ident(new)operator(()ident(filename)operator(,) string<delimiter(")content(r)delimiter(")>operator(\)) + ident(text) operator(=) ident(aFile)operator(.)ident(read)operator(()operator(\)) + ident(aFile)operator(.)ident(close)operator(()operator(\)) + ident(pattern) operator(=) constant(Regexp)operator(.)ident(new)operator(()string<delimiter(')content(%%(.*?\)%%)delimiter(')>operator(\)) + ident(text)operator(.)ident(gsub!)operator(()ident(pattern)operator(\)) operator({) + ident(fillings)operator([)global_variable($1)operator(]) operator(||) string<delimiter(")delimiter(")> + operator(}) + ident(text) +reserved(end) + +ident(fields) operator(=) operator({) + string<delimiter(')content(username)delimiter(')> operator(=)operator(>) ident(whats_his_name)operator(,) + string<delimiter(')content(count)delimiter(')> operator(=)operator(>) ident(login_count)operator(,) + string<delimiter(')content(total)delimiter(')> operator(=)operator(>) ident(minutes_used) +operator(}) +ident(puts) ident(templatefile)operator(()string<delimiter(')content(simple.template)delimiter(')>operator(,) ident(fields)operator(\)) + +comment(# @@INCOMPLETE@@) +comment(# An example using databases is missing) + + diff --git a/test/scanners/ruby/quotes.in.rb b/test/scanners/ruby/quotes.in.rb new file mode 100644 index 0000000..8c38e1f --- /dev/null +++ b/test/scanners/ruby/quotes.in.rb @@ -0,0 +1,3 @@ +puts %}#{%}b#{%}r}*5}}*7}, immer wieder\n}*5
+
+print "test\n\\\\".gsub(/[\n\\]/, '\\\\\&')
diff --git a/test/scanners/ruby/quotes.out.raydebug b/test/scanners/ruby/quotes.out.raydebug new file mode 100644 index 0000000..61fff05 --- /dev/null +++ b/test/scanners/ruby/quotes.out.raydebug @@ -0,0 +1,3 @@ +ident(puts) string<delimiter(%})inline<delimiter(#{)string<delimiter(%})content(b)inline<delimiter(#{)string<delimiter(%})content(r)delimiter(})>operator(*)integer(5)delimiter(})>delimiter(})>operator(*)integer(7)delimiter(})>content(, immer wieder)char(\\n)delimiter(})>operator(*)integer(5) + +ident(print) string<delimiter(")content(test)char(\\n)char(\\\\)char(\\\\)delimiter(")>operator(.)ident(gsub)operator(()regexp<delimiter(/)content([)char(\\n)char(\\\\)content(])delimiter(/)>operator(,) string<delimiter(')char(\\\\)char(\\\\)content(\\&)delimiter(')>operator(\)) diff --git a/test/scanners/ruby/sidebarize.in.rb b/test/scanners/ruby/sidebarize.in.rb new file mode 100644 index 0000000..6cb9e22 --- /dev/null +++ b/test/scanners/ruby/sidebarize.in.rb @@ -0,0 +1,145 @@ +#!/usr/bin/env ruby
+# Sidebarize is a quite simple converter, like a lot others.
+# But in one way Sidebarize is special: it converts
+# feeds into HTML-pages suitable for sidebars in Gecko-browsers.
+
+# import support for all kinds of feeds
+require 'rss/0.9'
+require 'rss/1.0'
+require 'rss/2.0'
+# import support for encodings
+require 'iconv'
+# import support for CGI
+require 'cgi'
+# import support for getting files from URLs
+require 'net/http'
+require 'uri'
+
+Version = '0.0.9'
+
+Header = %q(<!DOCTYPE html PUBLIC
+ "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>%s Sidebar</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+ <link rel="stylesheet" type="text/css" href="sidebarize.css" />
+ </head>
+
+ <body>
+ <p>%s</p>)
+
+Footer = %q( <p>
+ <img src="fourpiece32.png" width="32" height="32" class="logo" />
+ generated by Sidebarize %s
+ </p>
+ </body>
+</html>)
+
+Entry = %q( <div>
+ <img src="arrow.png" width="6" height="11" />
+ <a href="%s">%s</a>
+ </div>)
+
+class FeedConverter
+ def initialize
+ @xml_source = ''
+ @feed_data = []
+ @feed_version = ''
+ @feed_description = ''
+ end
+
+ def from_file(filename)
+ f = File::open(filename)
+ @xml_source = f.read
+ f.close
+ end
+
+ def from_url(url)
+ @xml_source = Net::HTTP.get(URI.parse(url))
+ end
+
+ def parse
+ feed = RSS::Parser.parse(@xml_source)
+ @feed_description = feed.channel.description
+ @feed_name = feed.channel.title
+
+
+ feed.items.each do |item|
+ item_data = {}
+ item_data['title'] = item.title
+ item_data['link'] = item.link
+ @feed_data << item_data
+ end
+ end
+
+ # Output HTML from the internal data structure
+ def to_html
+ # header
+ puts Header % [convert_entity(@feed_name), convert_entity(@feed_description)]
+
+ # the entries
+ @feed_data.each do |item|
+ puts Entry % [item['link'], convert_entity(item['title'])]
+ end
+
+ # footer
+ print Footer % Version
+ end
+end
+
+# Converts entities
+# uses code by murphy extended with iconv conversion
+def convert_entity(text)
+ text = Iconv.new('iso-8859-15', 'utf-8').iconv(text)
+
+ feed = text.inspect[1...-1]
+
+ feed.gsub!(/\\([0-7]+)|(.)/m) do
+ if $2
+ $&
+ else
+ '&#%s;' % $1.to_i(8).to_s(10)
+ end
+ end
+
+ feed.gsub!('\"', '"')
+
+ return feed
+end
+
+# Starter
+def main
+ fc = FeedConverter.new
+ cgi = CGI.new
+ if cgi.has_key? 'url'
+ # yeah, the user pointed us to an URL
+ fc.from_url(cgi['url'])
+ #fc.from_file('sd.xml')
+ #fc.from_file('sbarize_design.html')
+
+ begin
+ # try to parse it and to generate HTML
+ fc.parse
+
+ puts 'Content-Type: text/html'
+ puts
+ fc.to_html
+ rescue
+ # parsing failed so show an error message
+ puts 'Content-Type: text/html'
+ puts
+ puts Header % ['No', 'The specified feed is not valid.']
+ puts Footer % Version
+ end
+ else
+ # no, we've got no URL, generate error message
+ puts 'Content-Type: text/plain'
+ puts
+ puts Header % ['No', 'You have to set the url=http://domain.tld/path/feed.xml to your feed.']
+ puts Footer % Version
+ end
+end
+
+main if __FILE__ == $0
\ No newline at end of file diff --git a/test/scanners/ruby/sidebarize.out.raydebug b/test/scanners/ruby/sidebarize.out.raydebug new file mode 100644 index 0000000..fb7e255 --- /dev/null +++ b/test/scanners/ruby/sidebarize.out.raydebug @@ -0,0 +1,145 @@ +comment(#!/usr/bin/env ruby) +comment(# Sidebarize is a quite simple converter, like a lot others.) +comment(# But in one way Sidebarize is special: it converts) +comment(# feeds into HTML-pages suitable for sidebars in Gecko-browsers.) + +comment(# import support for all kinds of feeds) +ident(require) string<delimiter(')content(rss/0.9)delimiter(')> +ident(require) string<delimiter(')content(rss/1.0)delimiter(')> +ident(require) string<delimiter(')content(rss/2.0)delimiter(')> +comment(# import support for encodings) +ident(require) string<delimiter(')content(iconv)delimiter(')> +comment(# import support for CGI) +ident(require) string<delimiter(')content(cgi)delimiter(')> +comment(# import support for getting files from URLs) +ident(require) string<delimiter(')content(net/http)delimiter(')> +ident(require) string<delimiter(')content(uri)delimiter(')> + +constant(Version) operator(=) string<delimiter(')content(0.0.9)delimiter(')> + +constant(Header) operator(=) string<delimiter(%q()content(<!DOCTYPE html PUBLIC + "-//W3C//DTD XHTML 1.0 Strict//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <title>%s Sidebar</title> + <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> + <link rel="stylesheet" type="text/css" href="sidebarize.css" /> + </head> + + <body> + <p>%s</p>)delimiter(\))> + +constant(Footer) operator(=) string<delimiter(%q()content( <p> + <img src="fourpiece32.png" width="32" height="32" class="logo" /> + generated by Sidebarize %s + </p> + </body> +</html>)delimiter(\))> + +constant(Entry) operator(=) string<delimiter(%q()content( <div> + <img src="arrow.png" width="6" height="11" /> + <a href="%s">%s</a> + </div>)delimiter(\))> + +reserved(class) class(FeedConverter) + reserved(def) method(initialize) + instance_variable(@xml_source) operator(=) string<delimiter(')delimiter(')> + instance_variable(@feed_data) operator(=) operator([)operator(]) + instance_variable(@feed_version) operator(=) string<delimiter(')delimiter(')> + instance_variable(@feed_description) operator(=) string<delimiter(')delimiter(')> + reserved(end) + + reserved(def) method(from_file)operator(()ident(filename)operator(\)) + ident(f) operator(=) constant(File)operator(::)ident(open)operator(()ident(filename)operator(\)) + instance_variable(@xml_source) operator(=) ident(f)operator(.)ident(read) + ident(f)operator(.)ident(close) + reserved(end) + + reserved(def) method(from_url)operator(()ident(url)operator(\)) + instance_variable(@xml_source) operator(=) constant(Net)operator(::)constant(HTTP)operator(.)ident(get)operator(()constant(URI)operator(.)ident(parse)operator(()ident(url)operator(\))operator(\)) + reserved(end) + + reserved(def) method(parse) + ident(feed) operator(=) constant(RSS)operator(::)constant(Parser)operator(.)ident(parse)operator(()instance_variable(@xml_source)operator(\)) + instance_variable(@feed_description) operator(=) ident(feed)operator(.)ident(channel)operator(.)ident(description) + instance_variable(@feed_name) operator(=) ident(feed)operator(.)ident(channel)operator(.)ident(title) + + + ident(feed)operator(.)ident(items)operator(.)ident(each) reserved(do) operator(|)ident(item)operator(|) + ident(item_data) operator(=) operator({)operator(}) + ident(item_data)operator([)string<delimiter(')content(title)delimiter(')>operator(]) operator(=) ident(item)operator(.)ident(title) + ident(item_data)operator([)string<delimiter(')content(link)delimiter(')>operator(]) operator(=) ident(item)operator(.)ident(link) + instance_variable(@feed_data) operator(<<) ident(item_data) + reserved(end) + reserved(end) + + comment(# Output HTML from the internal data structure) + reserved(def) method(to_html) + comment(# header) + ident(puts) constant(Header) operator(%) operator([)ident(convert_entity)operator(()instance_variable(@feed_name)operator(\))operator(,) ident(convert_entity)operator(()instance_variable(@feed_description)operator(\))operator(]) + + comment(# the entries) + instance_variable(@feed_data)operator(.)ident(each) reserved(do) operator(|)ident(item)operator(|) + ident(puts) constant(Entry) operator(%) operator([)ident(item)operator([)string<delimiter(')content(link)delimiter(')>operator(])operator(,) ident(convert_entity)operator(()ident(item)operator([)string<delimiter(')content(title)delimiter(')>operator(])operator(\))operator(]) + reserved(end) + + comment(# footer) + ident(print) constant(Footer) operator(%) constant(Version) + reserved(end) +reserved(end) + +comment(# Converts entities) +comment(# uses code by murphy extended with iconv conversion) +reserved(def) method(convert_entity)operator(()ident(text)operator(\)) + ident(text) operator(=) constant(Iconv)operator(.)ident(new)operator(()string<delimiter(')content(iso-8859-15)delimiter(')>operator(,) string<delimiter(')content(utf-8)delimiter(')>operator(\))operator(.)ident(iconv)operator(()ident(text)operator(\)) + + ident(feed) operator(=) ident(text)operator(.)ident(inspect)operator([)integer(1)operator(...)integer(-1)operator(]) + + ident(feed)operator(.)ident(gsub!)operator(()regexp<delimiter(/)char(\\\\)content(([0-7]+\)|(.\))delimiter(/)modifier(m)>operator(\)) reserved(do) + reserved(if) global_variable($2) + global_variable($&) + reserved(else) + string<delimiter(')content(&#%s;)delimiter(')> operator(%) global_variable($1)operator(.)ident(to_i)operator(()integer(8)operator(\))operator(.)ident(to_s)operator(()integer(10)operator(\)) + reserved(end) + reserved(end) + + ident(feed)operator(.)ident(gsub!)operator(()string<delimiter(')content(\\")delimiter(')>operator(,) string<delimiter(')content(")delimiter(')>operator(\)) + + reserved(return) ident(feed) +reserved(end) + +comment(# Starter) +reserved(def) method(main) + ident(fc) operator(=) constant(FeedConverter)operator(.)ident(new) + ident(cgi) operator(=) constant(CGI)operator(.)ident(new) + reserved(if) ident(cgi)operator(.)ident(has_key?) string<delimiter(')content(url)delimiter(')> + comment(# yeah, the user pointed us to an URL) + ident(fc)operator(.)ident(from_url)operator(()ident(cgi)operator([)string<delimiter(')content(url)delimiter(')>operator(])operator(\)) + comment(#fc.from_file('sd.xml'\)) + comment(#fc.from_file('sbarize_design.html'\)) + + reserved(begin) + comment(# try to parse it and to generate HTML) + ident(fc)operator(.)ident(parse) + + ident(puts) string<delimiter(')content(Content-Type: text/html)delimiter(')> + ident(puts) + ident(fc)operator(.)ident(to_html) + reserved(rescue) + comment(# parsing failed so show an error message) + ident(puts) string<delimiter(')content(Content-Type: text/html)delimiter(')> + ident(puts) + ident(puts) constant(Header) operator(%) operator([)string<delimiter(')content(No)delimiter(')>operator(,) string<delimiter(')content(The specified feed is not valid.)delimiter(')>operator(]) + ident(puts) constant(Footer) operator(%) constant(Version) + reserved(end) + reserved(else) + comment(# no, we've got no URL, generate error message) + ident(puts) string<delimiter(')content(Content-Type: text/plain)delimiter(')> + ident(puts) + ident(puts) constant(Header) operator(%) operator([)string<delimiter(')content(No)delimiter(')>operator(,) string<delimiter(')content(You have to set the url=http://domain.tld/path/feed.xml to your feed.)delimiter(')>operator(]) + ident(puts) constant(Footer) operator(%) constant(Version) + reserved(end) +reserved(end) + +ident(main) reserved(if) pre_constant(__FILE__) operator(==) global_variable($0)
\ No newline at end of file diff --git a/test/scanners/ruby/simple.in.rb b/test/scanners/ruby/simple.in.rb new file mode 100644 index 0000000..3f5e390 --- /dev/null +++ b/test/scanners/ruby/simple.in.rb @@ -0,0 +1,2 @@ +puts "Hello, World!"
+p 2 * 19
diff --git a/test/scanners/ruby/simple.out.raydebug b/test/scanners/ruby/simple.out.raydebug new file mode 100644 index 0000000..b423e9f --- /dev/null +++ b/test/scanners/ruby/simple.out.raydebug @@ -0,0 +1,2 @@ +ident(puts) string<delimiter(")content(Hello, World!)delimiter(")> +ident(p) integer(2) operator(*) integer(19) diff --git a/test/scanners/ruby/strange.in.rb b/test/scanners/ruby/strange.in.rb new file mode 100644 index 0000000..8369aaa --- /dev/null +++ b/test/scanners/ruby/strange.in.rb @@ -0,0 +1,341 @@ +a.each{|el|anz[el]=anz[el]?anz[el]+1:1}
+while x<10000
+#a bis f dienen dazu die Nachbarschaft festzulegen. Man stelle sich die #Zahl von 1 bis 64 im Binärcode vor 1 bedeutet an 0 aus
+ b=(p[x]%32)/16<1 ? 0 : 1
+
+ (x-102>=0? n[x-102].to_i : 0)*a+(x-101>=0?n[x-101].to_i : 0)*e+n[x-100].to_i+(x-99>=0? n[x-99].to_i : 0)*f+(x-98>=0? n[x-98].to_i : 0)*a+
+ n[x+199].to_i*b+n[x+200].to_i*d+n[x+201].to_i*b
+
+#und die Ausgabe folgt
+g=%w{}
+x=0
+
+=begin
+class Hello
+ @hi #class-instance-variable
+ self <<class
+ attr_accessor :hi
+ end
+end
+=end
+
+while x<100
+ puts"#{g[x]}"
+ x+=1
+end
+
+puts""
+sleep(10)
+
+1E1E1
+puts 30.send(:/, 5) # prints 6
+
+"instance variables can be #@included, #@@class_variables\n and #$globals as well."
+`instance variables can be #@included, #@@class_variables\n and #$globals as well.`
+'instance variables can be #@included, #@@class_variables\n and #$globals as well.'
+/instance variables can be #@included, #@@class_variables\n and #$globals as well./mousenix
+:"instance variables can be #@included, #@@class_variables\n and #$globals as well."
+:'instance variables can be #@included, #@@class_variables\n and #$globals as well.'
+%'instance variables can be #@included, #@@class_variables\n and #$globals as well.'
+%q'instance variables can be #@included, #@@class_variables\n and #$globals as well.'
+%Q'instance variables can be #@included, #@@class_variables\n and #$globals as well.'
+%w'instance variables can be #@included, #@@class_variables\n and #$globals as well.'
+%W'instance variables can be #@included, #@@class_variables\n and #$globals as well.'
+%s'instance variables can be #@included, #@@class_variables\n and #$globals as well.'
+%r'instance variables can be #@included, #@@class_variables\n and #$globals as well.'
+%x'instance variables can be #@included, #@@class_variables\n and #$globals as well.'
+
+#%W[ but #@0illegal_values look strange.]
+
+%Quark dazu
+
+% abc # FIXME
+
+%s#ruby allows strange#{constructs}
+%s#ruby allows strange#$constructs
+%s#ruby allows strange#@@constructs
+
+%r\VERY STRANGE!\x00
+%x\VERY STRANGE!\x00
+
+~%r#<XMP>#i .. ~%r#</XMP>#i;
+
+a = <<"EOF"
+This is a multiline #$here document
+terminated by EOF on a line by itself
+EOF
+
+a = <<'EOF'
+This is a multiline #$here document
+terminated by EOF on a line by itself
+EOF
+
+b=(p[x] %32)/16<1 ? 0 : 1
+
+#<<""
+<<"X"
+#{test}
+#@bla
+#die suppe!!!
+\xfffff
+
+
+super <<-EOE % [
+ EOE
+
+<<X
+X
+X
+%s(uninter\)pre\ted)
+%q(uninter\)pre\ted)
+%Q(inter\)pre\ted)
+:"inter\)pre\ted"
+:'uninter\'pre\ted'
+
+%q[haha! [nesting [rocks] ] ! ]
+
+%Q[hehe! #{ %Q]nesting #{"really"} rocks] } ! ]
+
+"but it #{<<may} break"
+the code.
+may
+
+# this is a known bug.
+p <<this
+but it may break #{<<that}
+code.
+that
+this
+that
+
+##################################################################
+class NP
+def initialize a=@p=[], b=@b=[]; end
+def +@;@b<<1;b2c end;def-@;@b<<0;b2c end
+def b2c;if @b.size==8;c=0;@b.each{|b|c<<=1;c|=b};send(
+ 'lave'.reverse,(@p.join))if c==0;@p<<c.chr;@b=[] end
+ self end end ; begin _ = NP.new end
+c
+# ^ This is a bug :(
+
+# The Programming Language `NegaPosi'
++-+--++----+--+-+++--+-------+--++--+++---+-+++-+-+-+++-----+++-_
++--++++--+---++-+-+-+++--+--+-+------+--++++-++---++-++---++-++-_
++++--++-+-+--++--+++--+------+----+--++--+++-++-+----++------+--_
+-+-+----+++--+--+----+--+--+-++-++--+++-++++-++-----+-+-+----++-_
+---------+-+---- _
+##################################################################
+
+
+# date: 03/18/2004
+# title: primes less than 1000 ( 2005 Obfuscated Ruby Contest )
+# author: Jim Lawless
+# email: jimbo at radiks dotski net
+# comments: This program will display all positive prime integers
+# less than 1000. Program licens is the same as the Ruby
+# license ( http://www.ruby-lang.org/en/LICENSE.txt )
+
+ $e=""
+
+def a()
+ $a=$a+1
+end
+
+def b()
+ $a=$a+5
+end
+
+def c()
+ $e=$e+$a.chr
+end
+
+def d()
+ $a=10
+end
+
+def e()
+ $a=$a+16
+end
+
+d;e;b;a;a;a;a;a;c;d;e;e;e;e;e;e;b;a;a;a;a;c;d;e;e;e;a;a;a;c;d;e;e;b;b;
+a;c;d;c;d;e;e;e;e;e;e;b;b;a;a;a;c;d;e;e;e;e;e;b;b;a;a;a;a;c;d;e;e;e;e;
+e;b;b;a;a;a;a;a;c;d;e;e;e;e;e;e;a;a;c;d;e;e;e;e;e;b;b;a;c;d;e;b;a;c;
+d;e;b;a;a;a;a;a;c;d;e;e;e;e;e;e;b;a;a;a;a;c;d;e;e;e;a;a;c;d;e;e;b;a;a;
+c;d;e;e;b;a;c;d;e;e;b;a;c;d;e;e;b;a;c;d;c;d;e;b;a;a;a;a;a;c;d;e;e;e;e;e;b;
+b;a;a;a;a;a;c;d;e;e;e;a;a;a;c;d;e;e;b;a;a;a;c;d;c;d;e;b;a;a;a;a;a;c;d;e;
+e;e;e;e;b;b;a;a;c;d;e;e;e;e;e;e;a;a;a;a;a;c;d;e;e;e;e;e;e;b;b;a;c;
+d;e;e;e;e;e;e;a;a;a;a;c;d;e;e;e;e;e;b;a;a;a;a;a;c;d;e;e;e;a;a;a;c;d;e;
+e;b;a;c;d;c;d;e;e;e;e;e;e;b;b;a;a;a;c;d;e;e;e;e;e;b;b;a;a;a;a;c;d;e;e;
+e;e;e;b;b;a;a;a;a;a;c;d;e;e;e;e;e;e;a;a;c;d;e;e;e;e;e;b;b;a;c;d;e;b;
+a;c;d;e;b;a;a;a;a;a;c;d;e;e;e;e;e;b;b;a;a;a;a;a;c;d;e;e;e;a;a;c;d;e;b;
+a;a;a;a;a;c;d;e;e;e;e;e;e;b;a;a;a;a;c;d;e;b;a;c;d;c;d;e;e;e;e;e;b;b;a;
+a;a;a;a;c;d;e;e;e;e;e;b;b;a;a;c;d;e;b;b;a;a;a;a;c;d;e;b;a;c;d;e;b;b;a;
+a;a;a;c;d;e;b;a;a;a;a;a;c;d;e;e;e;e;e;e;b;a;a;a;a;c;d;e;e;a;a;a;a;c;
+d;e;e;e;e;e;e;a;a;a;c;d;e;e;e;e;e;e;a;a;a;a;a;c;d;e;e;e;e;e;b;a;a;a;
+a;a;c;d;e;e;e;e;e;e;b;b;a;c;d;e;e;e;e;e;e;a;a;c;d;e;e;e;e;e;e;a;a;a;
+a;a;c;d;e;b;b;a;a;a;a;c;d;e;b;a;a;a;a;a;c;d;e;e;e;e;e;b;b;a;a;a;a;a;
+c;d;e;b;b;a;a;a;a;a;c;d;e;b;b;a;a;a;a;a;c;d;e;e;e;a;a;a;c;d;e;e;e;a;a;
+a;c;d;e;e;b;a;c;d;e;b;b;a;a;a;a;a;c;d;e;b;a;c;d;c;d;e;b;a;a;a;a;a;c;d;e;e;
+e;e;e;b;b;a;a;c;d;e;e;e;e;e;e;a;a;a;a;a;c;d;e;e;e;e;e;e;b;b;a;c;d;e;
+e;e;e;e;e;a;a;a;a;c;d;e;e;e;e;e;b;a;a;a;a;a;c;d;e;e;e;a;a;a;c;d;e;e;
+b;a;a;c;d;c;d;e;e;e;e;e;b;a;a;a;c;d;e;e;e;e;e;e;b;a;a;a;c;d;e;e;e;e;e;
+b;b;a;c;d;e;e;e;e;e;b;a;a;c;d;e;e;e;e;e;e;a;c;d;c;d;e;e;e;e;e;b;b;a;c;
+d;e;e;e;e;e;e;a;a;a;a;c;d;e;e;e;e;e;b;a;a;a;a;a;c;d;c;d;e;b;a;a;a;a;a;
+c;d;e;e;e;e;e;b;b;a;a;a;a;a;c;d;e;e;e;a;a;a;c;d;e;b;a;a;a;a;a;c;d;e;e;
+e;e;e;b;b;a;a;a;a;a;c;d;e;e;a;c;d;e;e;b;a;a;c;d;c;d;e;e;e;e;e;b;b;a;a;
+a;a;a;c;d;e;e;e;e;e;b;b;a;a;c;d;e;b;a;c;d;e;b;b;a;a;a;a;c;d;e;b;b;a;a;
+a;a;c;d;e;b;a;a;a;a;a;c;d;e;e;e;e;e;b;b;a;a;a;a;a;c;d;e;b;b;b;a;c;d;e;
+b;a;a;a;a;a;c;d;e;e;e;e;e;b;b;a;a;a;a;a;c;d;e;b;b;a;a;a;a;a;c;d;e;e;
+e;a;a;a;a;c;d;e;b;a;a;a;a;a;c;d;e;e;e;e;e;e;b;a;a;a;a;c;d;e;b;b;a;a;
+a;a;a;c;d;c;d;e;e;e;e;e;b;a;a;a;c;d;e;e;e;e;e;e;b;a;a;a;c;d;e;e;e;e;e;
+b;b;a;c;d;e;e;e;e;e;b;a;a;c;d;e;e;e;e;e;e;a;c;d;c;d;e;e;e;e;e;b;b;a;c;
+d;e;e;e;e;e;e;a;a;a;a;c;d;e;e;e;e;e;b;a;a;a;a;a;c;d;c;d;e;e;e;e;e;b;b;
+a;c;d;e;e;e;e;e;e;a;a;a;a;c;d;e;e;e;e;e;b;a;a;a;a;a;c;d;c;d;e;e;e;e;e;
+b;b;a;a;a;a;a;c;d;e;e;e;e;e;b;b;a;a;c;d;e;b;b;a;a;a;a;c;d;e;b;a;a;a;
+a;a;c;d;e;e;e;e;e;b;b;a;a;c;d;e;e;e;e;e;e;a;a;a;a;a;c;d;e;e;e;e;e;e;
+b;b;a;c;d;e;e;e;e;e;e;a;a;a;a;c;d;e;e;e;e;e;b;a;a;a;a;a;c;d;e;e;e;a;
+a;a;c;d;e;e;e;a;a;a;c;d;e;e;b;a;c;d;e;b;b;a;a;a;a;a;c;d;e;b;a;c;d;c;d;e;e;
+e;e;e;e;b;a;c;d;e;e;e;e;e;e;b;b;a;c;d;e;e;e;e;e;e;b;a;a;a;a;a;c;d;e;
+e;e;e;e;e;b;a;a;a;a;c;d;e;b;a;c;d;e;b;a;a;a;c;d;e;b;a;a;a;a;c;d;e;e;e;
+e;e;e;e;a;c;d;e;b;a;a;a;a;a;c;d;e;e;e;e;e;e;b;a;a;a;a;c;d;e;e;e;e;e;
+e;e;a;a;a;c;d;e;b;a;c;d;e;e;e;e;e;b;b;a;a;a;a;a;c;d;e;e;e;e;e;e;b;a;
+a;a;a;c;d;e;b;a;c;d;e;e;e;e;e;e;b;a;c;d;e;e;e;e;e;e;b;a;a;a;c;d;e;e;e;
+e;e;b;b;a;a;a;a;a;c;d;e;e;e;e;e;e;a;a;a;c;d;e;e;e;e;e;b;b;a;c;d;e;b;
+a;a;a;c;d;c;d;e;e;e;e;e;b;b;a;c;d;e;e;e;e;e;e;a;a;a;a;c;d;e;e;e;e;e;b;
+a;a;a;a;a;c;d;c;d;e;b;a;a;a;a;a;c;d;e;e;e;e;e;e;b;a;a;a;a;c;d;e;b;a;c;
+d;e;e;e;a;a;a;c;d;e;b;a;c;d;e;b;a;a;a;a;a;c;d;e;e;e;e;e;e;b;a;a;a;a;c;
+d;e;b;a;c;d;e;e;a;c;d;e;b;a;c;d;e;e;b;a;a;c;d;c;d;e;e;e;e;e;b;b;a;c;d;e;e;e;
+e;e;e;a;a;a;a;c;d;e;e;e;e;e;b;a;a;a;a;a;c;d;c;d;e;b;a;c;d;e;b;a;c;d;e;b;
+a;c;d;e;b;a;c;d;e;b;a;c;d;e;b;a;c;d;e;b;a;c;eval $e
+
+$_=%{q,l= %w{Ruby\\ Quiz Loader}
+n,p,a= "\#{q.do#{%w{w a n c}.sort{|o,t|t<=>o}}se.d\x65l\x65t\x65(' ')}.com/",
+{"bmJzcA==\n".\x75np\x61ck("m")[0]=>" ","bHQ=\n".\x75np\x61ck((?n-1).chr)[0]=>
+:<,"Z3Q=\n".\x75np\x61ck("m")[0]=>:>,"YW1w\n".\x75np\x61ck((?l+1).chr)[0]=>:&},
+[[/^\\s+<\\/div>.+/m,""],[/^\\s+/,""],[/\n/,"\n\n"],[/<br \\/>/,"\n"],
+[/<hr \\/>/,"-="*40],[/<[^>]+>/,""],[/^ruby/,""],[/\n{3,}/,"\n\n"]];p\165ts"
+\#{l[0..-3]}ing...\n\n";send(Kernel.methods.find_all{|x|x[0]==?e}[-1],
+"re\#{q[5...8].downcase}re '111112101110-117114105'.scan(/-|\\\\d{3}/).
+inject(''){|m,v|v.length>1?m+v.to_i.chr: m+v}");o#{%w{e P}.sort.join.downcase
+}n("http://www.\#{n}"){|w|$F=w.read.sc\x61n(/li>.+?"([^"]+)..([^<]+)/)};\160uts\
+"\#{q}\n\n";$F.\145\141ch{|e|i=e[0][/\\d+/];s="%2s. %s"%[i,e[1]];i.to_i%2==0 ?
+\160ut\x73(s) : #{%w{s p}[-1]}rint("%-38s "%s)};p\x72\x69\x6et"\n? ";e\x76al(
+['puts"\n\#{l[0..3]}ing...\n\n"','$c=gets.chomp.to_i'].sort.join(";"));#{111.chr
+}pen("http://www.\#{n}"+$F[$c-1][0]){|n|$_=n.read[/^\\s+<span.+/m];#{('a'.."z").
+to_a[10-5*2]}.e\141ch{|(z,f)|\x67sub!(z,f)};\147sub!(/&(\\w+);/){|y|p.
+ke\171\077($1)?p[$1]:y};while$_=~/([^\n]{81,})/:z=$1.dup;f=$1.dup;f[f.rindex(
+" ",80),1]="\n";f.s\165b!(/\n[ \t]+/,"\n");s\165b!(/\#{R\x65g\x65xp.
+\x65scap\x65(z)}/,f)end};while\040\163ub!(/^(?:[^\n]*\n){20}/, ""):puts"\#$&
+--\x4dO\x52E--";g=$_;g#{"\145"}ts;;#{"excited"[0..4].delete("c")}\040if$_[0]==?q
+$_=g;end;$_.d#{"Internet Service Provider".scan(/[A-Z]/).join.downcase
+}lay};eval$_
+
+ d=[30644250780,9003106878,
+ 30636278846,66641217692,4501790980,
+ 671_24_603036,131_61973916,66_606629_920,
+ 30642677916,30643069058];a,s=[],$*[0]
+ s.each_byte{|b|a<<("%036b"%d[b.
+ chr.to_i]).scan(/\d{6}/)}
+ a.transpose.each{ |a|
+ a.join.each_byte{\
+ |i|print i==49?\
+ ($*[1]||"#")\
+ :32.chr}
+ puts
+ }
+
+#! /usr/bin/env ruby
+# License: If Ruby is licensed to the general public in a certain way, this is also licensed in that way.
+require'zlib';eval(Zlib::Inflate.inflate("x\332\355WKo\333F\020\276\367W\250\262\001\222\tM\357\246M\017\242\211\242h\200\036\212`\201\026\350\205`\f=h\233\301Zt%\273A-2\277\275\363\315\222\334\241,#v\214\366T\331\262\326\303y\3177\263\243M\371\347]\265)\203UuYnoO\257Wo\203\364>[T\353U\265\276L\257\353\325\235-'\277\226\233ui\323Uy1\251\027\027\341\253\371\346r\e\245u\366\216\205f\263\367\357\336&\353\362S\010zr=\277\3315w\315]r[\237o\333\344c]\255#>\343O\025\352\037\334\177\341\367\364\271\t\003\245\337|\027\304\364aM@:\363\260\316>\237\232\323(\326\252(\327\253\t\275\323\332h\253\224V\306d\247\037\362\371\311}\321\314f\356\363C\016\311\342\365\361ij\026\037\313\345\355\3577\363e\231\224\363\345\325y\315\204]\263l\3620\177\317\241\024M\376\263\235o\267Et\222/\223%\037\213\374D\323\373M\3214Kv-\373<\361\026\233&\\\304\253,\354\270\263\314)\232\3748\311\247]z\216v\3136\235\306\323\243\035\262\263\214\332\f\024\342\257\327\345\264\230\205\313o36\3122\254e2\260\236\2610\202\354\037\260\256 (f=/\313:Z\024\245\313\244Zoo\347\353ey~]\336^\325\253-\a\273k\252fqv6\235\333j\276\355\236tV\252\230\377F\276\n\333\277\257\241\345\206\262\323\306G\273\352\340\203t\332\246\2441`'\316\316\266\245\275H\0032\377l\253\017,=42E\002\360\236\246\345_s;Y\274^\305\367Q\233\036\233\276\016\312\2450=\256=\305U\202\230\254\"\222\265\004\217\237~\373\345\017\"h\243\210\307j\235\251\205V8\353\304X\372!1CGc-\251\240\337\020\317\361#\036\023\n\2556\254Cg3\002}\265\356s\235\202K[K\022\020 \243\206\216\241p3\33255\350\232\036\030q$\233\344!\363\204^},$\023Xg\235:\364r1\"1\344\277\261\207\031(\301DE\260\344\026Y\177\345\036\221\204mP\263\266Mk\305\366\210%3\220\302S\322\306IR\316\377!\203 S\336\310\216\215\203\315\002-\211 5D2\257\210\302\321p\234\364\205\222Jj\220\022E\321h\347\223RQ*94K\022\243\314H`4{LV\003\021N\f\333\364I\347l\327UR\305t\340\332i>\241x=Mu4R\245\373\223\244\251NB\211\247\236\3465\253^bx\332Yc\263\252M\220b\253\220\310\004\331\242\020,`\005T\021Y\251P@\020\365Ax\310z\364\264\240\265vj2\037?0\v\"en\244\374\251\032\225\253v\346\253\3712\215\032\322(o\206~A\006\010\f\324\22357\026\"\316\024\365\021\360@\277:\363.$\f\342\016$\200\v\341\302\230\020\340\341\201K\017\270+i\326-\312\313j\235\n[\376({\330u\254\266\334\034\031\367%:CK\210{\311h\aQH\333Q\023\250\210;e\360\322\362\213\202\247\216\266\340C&(p\274HT7\336&B\352\300\036z\206\204\375 \032z\304\233\217\034\267AK\207R\363\213\324u\334\203\272h\234 \304&\364S\302]|\024\233b\000\023E\034\005\300!\330\2274\026\205\316\363\203\364\"\316\245!\242\360Y?4\204b\023.\2009\036X\300\213p\200]\304\324\200$^\204\025\222D\325X \363\324\004\223\205\207\241M\245\352\341(s\3415\260w\226\313=\2422 \200\177\344\355\211\3350\004\341\217\207\215r%x\030\302\304\230\335{#\250#o\204h\327;\220\242\275B%j&\343e\005\226/\r\200\035\035\206K\243\027\216Z\230\323.\335\356^!\vF\002K\366\246kG\321\364E\301\362\250\275a\f\031\207i%\216\342&ie\205\260\324}\272\252ho\222\306\370\362!}6\364C\003\2717\206'!.\315\036mhMm\370\252\241\365\221g\275\326A\302\254\270X,\371\353\232:\222\321\253\025\217v%\222\023!\243r\272\364(\376\177\236\374\233\363\3048\330b\241xdTp\325\321\377\3428F\234\214\263\357\255f\324\306\226\257\022\"\000\354\003\024C\207\na\353\240&O\305\376\004ncy\350\f\276\357+Q|\201bBi\206\277\345u\251\273\310\367\242\303*\204d\n\271}\016\2345r8\034\201[\343:>\364*\242\266\025+HZ\263e\212\0247q\357\310X\267[\333(9_o}P\201\324>\266\364\000\217hh\352\225a\213q\260\031\334\022sg\360\e\206\234B=\246\2421\341e\364\270\321\224\347\0056L\267\227)\244\210\307\027\257<\343\257\000\303\264u{\235\326\352i\303^\332\200\n\236\243a\277\034J#~S\335'2\371\001q\3745$\356\027^\371\325\344\331\036\362\004\267\330\251<\212\237\257\345kr\371\302d\362r\376\344d\252C\311\374R6\017e\375\005\271yAV\363/\257\345\261(\340hW\020\222\a\027k)60\354\217\363\3501\263rt\0364\025\025|\265\031\355\276d\357\3159\367\225\025\223U\273n\027\324\321H\031\030\036\357\356\377\010\266\337\374\003\3375Q\335"))
+#include "ruby.h" /*
+ /sLaSh *
+ oBfUsCaTeD RuBy *
+ cOpYrIgHt 2005 *
+bY SiMoN StRaNdGaArD *
+ #{X=320;Y=200;Z=20} */
+
+#define GUN1 42:
+#define GUN2 43:
+#define bo do
+#define when(gun) /**/
+#define DATA "p 'Hello embedded world'"
+#define DIRTY(argc,argv)\
+argc,argv,char=eval(\
+"#{DATA.read}\n[3,2,1]"\
+);sun=O.new\
+if(0)
+
+int
+sun[]={12,9,16,9,2,1,7,1,3,9,27,4, 13,2,11,5,4,1,25,
+5,0,1,14,9,15,4,26,9,23,2,17,6,31, 6,10,8,22,9,21,1,
+24,8,20,8,18,9,29,5,9,5,1,1,28,8,8,1,30, 9,6,8, 5,1,
+19,9,36,19,43, 9,34,11,50,19,48,18,49,9, 35,8,42,18,
+51,8,44,11,32, 11,47,9,37,1,39,9,38,19, 45,8,40,12,
+41,9,46,12,33,1,57,1,85,5,88,28,83,4,87, 6,62,28,89,
+9,80,28,60,21,52,21,72,29,54,21,75,8,70,29,58,28,65,
+9,91,8,74,29,79,2,77,1,53,1,81,5, 69,2,64,21, 86,29,
+67,9,59,1,61,5,73,6,76,28,56,21,68,29,78,29,63,5,66,
+28,90,29, 71,4,55,9,84,28,82,29,101,5, 103,9, 98,35,
+97,1,94,35,93,1,100,35,92,31,99,5,96,39,95,5,102,35};
+
+void run(int gun=0) { // [gun]=[:GUN1,:GUN2]
+ printf("run() %i\n", gun);
+ switch(gun) {
+ case GUN1 when(2)
+ printf("when2\n");
+ break; // end
+ case GUN2 when(3)
+ printf("when3\n");
+ break; // end
+ }
+}
+
+int main(int argc, char** argv) {
+ printf("hello world. number of arguments=%i\n", argc);
+ int fun=5;
+ bo {
+ fun -= 1; //.id - gun = fun
+ run(fun);
+ } while(fun>0);
+ ruby_init();
+ rb_eval_string(DATA);
+ return 0;
+}
+
+#if 0 // nobody reads un-defined code
+def goto*s;$s=[];Y.times{s=[];X.times{s<<[0]*3};$s<< s}end;A=0.5
+include Math;def u g,h,i,j,k,l;f,*m=((j-h).abs>(k-i).abs)?[proc{
+|n,o| g[o] [n ]=l },[h ,i ],[j,k]]:[proc{
+|p,q| g[ p][ q] =l} ,[ i,h ], [k,j]];b,a=m.sort
+c,d=a [1 ]-b [1 ],a [0 ]-b [0 ];d.times{|e|f.
+call( e+b[ 0] ,c* e/d+b [1])};end;V=0;def bo&u
+$u||= V; ;$u += 1+V ;; return u.call if$u>1;q=128.0
+;x=(V .. 255 ). map {| y|f1,z =sin(y.to_f*PI/q),
+sin(( y. to_f + 200 )*PI/( q));[(f1*30.0+110.0).
+to_i,((f1+z)*10.0+40.0).to_i,(z*20.0+120.0).to_i]};Y.times{|i|X.
+times{|j|i1=((i*0.3+150)*(j*1.1+50)/50.0).to_i;i2=((i*0.8+510)*(
+j*0.9+1060)/51.0).to_i;$s[i][j]=x[(i1*i2)%255].clone}};$a=(0..25).
+inject([]){|a,i|a<<(V..3).inject([]){|r,j|r<<$c[i*4+j]}};u.call;end
+I=LocalJumpError;def run*a,&b;return if a.size==V;if a[V]==666;$b=b
+elsif$b;$b.call;end;end;def main s,&u;$m=V;u.call rescue I;end
+def rb_eval_string(*a);end # you promised not to look here
+def ruby_init;q=2.0;l=((X**q)*A+(Y**q)*A)**A;V.upto(Y-4){|s|V.
+upto(X-4){|q|d=((q-X/A)**q+(s-Y/A)**q)**A;e=(cos(d*PI/(l/q))/q
++A)*3.0+1.0;v=2;f=v/e;a,p,b=$s[s],$s[s+1],$s[s+v];r=a[q][V]*e+
+p[q][V]+a[q+1][V]+b[q][V]+a[q+v][V]+b[q+v/v][V]+p[q+v][V]+b[q+
+v][V]*f;g=[a[q][V],b[q][V],a[q+v][V],b[q+v][V]];h=(g.max-g.min
+)*f;$s[s][q][V]=[[(r/(e+f+6.0)+A+(h*0.4)).to_i,255].min,V].max
+}};File.open("res.ppm","w+"){|f|f.write(# secret.greetings :-)
+"P3\n# res.ppm\n#{X} #{Y}\n255\n"+$s.map{|a|a.map{|b|b.join' '
+}.join(' ')+"\n"}.join)};end;def switch i,&b;b.call;return unless
+defined?($m);b=(X*0.01).to_i;d=1.0/40.0;e=0.09;c=(Y*0.01).to_i
+a=$a.map{|(f,g,h,j)|[f*d,g*e,h*d,j*e]};a.each{|(k,l,m,n)|u($s,(k*X
+).to_i+b+i,(l*Y).to_i+c+i,(m*X).to_i+b+i,(n*Y).to_i+c+i,[Z]*3)}
+a.each{|(o,q,r,s)|u($s,(o*(X-Z)).to_i+i,(q*(Y-Z)).to_i+i,(r*(X-
+Z)).to_i+i,(s*(Y-Z)).to_i+i,[(1<<8)-1]*3)};end;Q=Object;class
+Regexp;def []=(v,is);is.each{|s|Q.send(:remove_const,s)if Q.
+const_defined? s;Q.const_set(s,v)};end;end;def int*ptr;666
+end;class O;def []=(a,b=nil);$c=a;end;end;alias:void:goto
+#endif // pretend as if you havn't seen anything
+=end
+
diff --git a/test/scanners/ruby/strange.out.raydebug b/test/scanners/ruby/strange.out.raydebug new file mode 100644 index 0000000..b2f7d50 --- /dev/null +++ b/test/scanners/ruby/strange.out.raydebug @@ -0,0 +1,341 @@ +ident(a)operator(.)ident(each)operator({)operator(|)ident(el)operator(|)ident(anz)operator([)ident(el)operator(])operator(=)ident(anz)operator([)ident(el)operator(])operator(?)ident(anz)operator([)ident(el)operator(])integer(+1)operator(:)integer(1)operator(}) +reserved(while) ident(x)operator(<)integer(10000) +comment(#a bis f dienen dazu die Nachbarschaft festzulegen. Man stelle sich die #Zahl von 1 bis 64 im Binärcode vor 1 bedeutet an 0 aus) + ident(b)operator(=)operator(()ident(p)operator([)ident(x)operator(])operator(%)integer(32)operator(\))operator(/)integer(16)operator(<)integer(1) operator(?) integer(0) operator(:) integer(1) + + operator(()ident(x)integer(-102)operator(>)operator(=)integer(0)operator(?) ident(n)operator([)ident(x)integer(-102)operator(])operator(.)ident(to_i) operator(:) integer(0)operator(\))operator(*)ident(a)operator(+)operator(()ident(x)integer(-101)operator(>)operator(=)integer(0)operator(?)ident(n)operator([)ident(x)integer(-101)operator(])operator(.)ident(to_i) operator(:) integer(0)operator(\))operator(*)ident(e)operator(+)ident(n)operator([)ident(x)integer(-100)operator(])operator(.)ident(to_i)operator(+)operator(()ident(x)integer(-99)operator(>)operator(=)integer(0)operator(?) ident(n)operator([)ident(x)integer(-99)operator(])operator(.)ident(to_i) operator(:) integer(0)operator(\))operator(*)ident(f)operator(+)operator(()ident(x)integer(-98)operator(>)operator(=)integer(0)operator(?) ident(n)operator([)ident(x)integer(-98)operator(])operator(.)ident(to_i) operator(:) integer(0)operator(\))operator(*)ident(a)operator(+) + ident(n)operator([)ident(x)integer(+199)operator(])operator(.)ident(to_i)operator(*)ident(b)operator(+)ident(n)operator([)ident(x)integer(+200)operator(])operator(.)ident(to_i)operator(*)ident(d)operator(+)ident(n)operator([)ident(x)integer(+201)operator(])operator(.)ident(to_i)operator(*)ident(b) + +comment(#und die Ausgabe folgt) +ident(g)operator(=)string<delimiter(%w{)delimiter(})> +ident(x)operator(=)integer(0) + +comment(=begin +class Hello + @hi #class-instance-variable + self <<class + attr_accessor :hi + end +end +=end) + +reserved(while) ident(x)operator(<)integer(100) + ident(puts)string<delimiter(")inline<delimiter(#{)ident(g)operator([)ident(x)operator(])delimiter(})>delimiter(")> + ident(x)operator(+=)integer(1) +reserved(end) + +ident(puts)string<delimiter(")delimiter(")> +ident(sleep)operator(()integer(10)operator(\)) + +float(1E1)constant(E1) +ident(puts) integer(30)operator(.)ident(send)operator(()symbol(:/)operator(,) integer(5)operator(\)) comment(# prints 6) + +string<delimiter(")content(instance variables can be )escape(#)instance_variable(@included)content(, )escape(#)class_variable(@@class_variables)char(\\n)content( and )escape(#)global_variable($globals)content( as well.)delimiter(")> +shell<delimiter(`)content(instance variables can be )escape(#)instance_variable(@included)content(, )escape(#)class_variable(@@class_variables)char(\\n)content( and )escape(#)global_variable($globals)content( as well.)delimiter(`)> +string<delimiter(')content(instance variables can be #@included, #@@class_variables)content(\\n)content( and #$globals as well.)delimiter(')> +regexp<delimiter(/)content(instance variables can be )escape(#)instance_variable(@included)content(, )escape(#)class_variable(@@class_variables)char(\\n)content( and )escape(#)global_variable($globals)content( as well.)delimiter(/)modifier(mousenix)> +symbol<symbol(:)delimiter(")content(instance variables can be )escape(#)instance_variable(@included)content(, )escape(#)class_variable(@@class_variables)char(\\n)content( and )escape(#)global_variable($globals)content( as well.)delimiter(")> +symbol<symbol(:)delimiter(')content(instance variables can be #@included, #@@class_variables)content(\\n)content( and #$globals as well.)delimiter(')> +string<delimiter(%')content(instance variables can be )escape(#)instance_variable(@included)content(, )escape(#)class_variable(@@class_variables)char(\\n)content( and )escape(#)global_variable($globals)content( as well.)delimiter(')> +string<delimiter(%q')content(instance variables can be #@included, #@@class_variables)content(\\n)content( and #$globals as well.)delimiter(')> +string<delimiter(%Q')content(instance variables can be )escape(#)instance_variable(@included)content(, )escape(#)class_variable(@@class_variables)char(\\n)content( and )escape(#)global_variable($globals)content( as well.)delimiter(')> +string<delimiter(%w')content(instance variables can be #@included, #@@class_variables)content(\\n)content( and #$globals as well.)delimiter(')> +string<delimiter(%W')content(instance variables can be )escape(#)instance_variable(@included)content(, )escape(#)class_variable(@@class_variables)char(\\n)content( and )escape(#)global_variable($globals)content( as well.)delimiter(')> +symbol<delimiter(%s')content(instance variables can be #@included, #@@class_variables)content(\\n)content( and #$globals as well.)delimiter(')> +regexp<delimiter(%r')content(instance variables can be )escape(#)instance_variable(@included)content(, )escape(#)class_variable(@@class_variables)char(\\n)content( and )escape(#)global_variable($globals)content( as well.)delimiter(')> +shell<delimiter(%x')content(instance variables can be )escape(#)instance_variable(@included)content(, )escape(#)class_variable(@@class_variables)char(\\n)content( and )escape(#)global_variable($globals)content( as well.)delimiter(')> + +comment(#%W[ but #@0illegal_values look strange.]) + +operator(%)constant(Quark) ident(dazu) + +operator(%) ident(abc) comment(# FIXME) + +symbol<delimiter(%s#)content(ruby allows strange)delimiter(#)>operator({)ident(constructs)operator(}) +symbol<delimiter(%s#)content(ruby allows strange)delimiter(#)>global_variable($constructs) +symbol<delimiter(%s#)content(ruby allows strange)delimiter(#)>class_variable(@@constructs) + +regexp<delimiter(%r\\)content(VERY STRANGE!)delimiter(\\)modifier(x)>integer(00) +shell<delimiter(%x\\)content(VERY STRANGE!)delimiter(\\)>ident(x00) + +operator(~)regexp<delimiter(%r#)content(<XMP>)delimiter(#)modifier(i)> operator(..) operator(~)regexp<delimiter(%r#)content(</XMP>)delimiter(#)modifier(i)>operator(;) + +ident(a) operator(=) string<delimiter(<<"EOF")>string<content( +This is a multiline )escape(#)global_variable($here)content( document +terminated by EOF on a line by itself)delimiter( +EOF)> + +ident(a) operator(=) string<delimiter(<<'EOF')>string<content( +This is a multiline #$here document +terminated by EOF on a line by itself)delimiter( +EOF)> + +ident(b)operator(=)operator(()ident(p)operator([)ident(x)operator(]) operator(%)integer(32)operator(\))operator(/)integer(16)operator(<)integer(1) operator(?) integer(0) operator(:) integer(1) + +comment(#<<"") +string<delimiter(<<"X")>string<content( +)inline<delimiter(#{)ident(test)delimiter(})>content( +)escape(#)instance_variable(@bla)content( +#die suppe!!! +)char(\\xff)content(fff + + +super <<-EOE % [ + EOE + +<<X)delimiter( +X)> +constant(X) +symbol<delimiter(%s()content(uninter)char(\\\))content(pre)content(\\t)content(ed)delimiter(\))> +string<delimiter(%q()content(uninter)char(\\\))content(pre)content(\\t)content(ed)delimiter(\))> +string<delimiter(%Q()content(inter)char(\\\))content(pre)char(\\t)content(ed)delimiter(\))> +symbol<symbol(:)delimiter(")content(inter)char(\\\))content(pre)char(\\t)content(ed)delimiter(")> +symbol<symbol(:)delimiter(')content(uninter)char(\\')content(pre)content(\\t)content(ed)delimiter(')> + +string<delimiter(%q[)content(haha! )nesting_delimiter([)content(nesting )nesting_delimiter([)content(rocks)nesting_delimiter(])content( )nesting_delimiter(])content( ! )delimiter(])> + +string<delimiter(%Q[)content(hehe! )inline<delimiter(#{) string<delimiter(%Q])content(nesting )inline<delimiter(#{)string<delimiter(")content(really)delimiter(")>delimiter(})>content( rocks)delimiter(])> delimiter(})>content( ! )delimiter(])> + +string<delimiter(")content(but it )inline<delimiter(#{)string<delimiter(<<may)>delimiter(})>content( break)delimiter(")> +ident(the) ident(code)operator(.) +ident(may) + +comment(# this is a known bug.) +ident(p) string<delimiter(<<this)>string<content( +but it may break )inline<delimiter(#{)string<delimiter(<<that)>delimiter(})>content( +code. +that)delimiter( +this)> +ident(that) + +comment(##################################################################) +reserved(class) class(NP) +reserved(def) method(initialize) ident(a)operator(=)instance_variable(@p)operator(=)operator([)operator(])operator(,) ident(b)operator(=)instance_variable(@b)operator(=)operator([)operator(])operator(;) reserved(end) +reserved(def) method(+@)operator(;)instance_variable(@b)operator(<<)integer(1)operator(;)ident(b2c) reserved(end)operator(;)reserved(def)method(-@)operator(;)instance_variable(@b)operator(<<)integer(0)operator(;)ident(b2c) reserved(end) +reserved(def) method(b2c)operator(;)reserved(if) instance_variable(@b)operator(.)ident(size)operator(==)integer(8)operator(;)ident(c)operator(=)integer(0)operator(;)instance_variable(@b)operator(.)ident(each)operator({)operator(|)ident(b)operator(|)ident(c)operator(<<)operator(=)integer(1)operator(;)ident(c)operator(|=)ident(b)operator(})operator(;)ident(send)operator(() + string<delimiter(')content(lave)delimiter(')>operator(.)ident(reverse)operator(,)operator(()instance_variable(@p)operator(.)ident(join)operator(\))operator(\))reserved(if) ident(c)operator(==)integer(0)operator(;)instance_variable(@p)operator(<<)ident(c)operator(.)ident(chr)operator(;)instance_variable(@b)operator(=)operator([)operator(]) reserved(end) + pre_constant(self) reserved(end) reserved(end) operator(;) reserved(begin) ident(_) operator(=) constant(NP)operator(.)ident(new) reserved(end) +ident(c) +comment(# ^ This is a bug :() + +comment(# The Programming Language `NegaPosi') +operator(+)operator(-)operator(+)operator(-)operator(-)operator(+)operator(+)operator(-)operator(-)operator(-)operator(-)operator(+)operator(-)operator(-)operator(+)operator(-)operator(+)operator(+)operator(+)operator(-)operator(-)operator(+)operator(-)operator(-)operator(-)operator(-)operator(-)operator(-)operator(-)operator(+)operator(-)operator(-)operator(+)operator(+)operator(-)operator(-)operator(+)operator(+)operator(+)operator(-)operator(-)operator(-)operator(+)operator(-)operator(+)operator(+)operator(+)operator(-)operator(+)operator(-)operator(+)operator(-)operator(+)operator(+)operator(+)operator(-)operator(-)operator(-)operator(-)operator(-)operator(+)operator(+)operator(+)operator(-)ident(_) +operator(+)operator(-)operator(-)operator(+)operator(+)operator(+)operator(+)operator(-)operator(-)operator(+)operator(-)operator(-)operator(-)operator(+)operator(+)operator(-)operator(+)operator(-)operator(+)operator(-)operator(+)operator(+)operator(+)operator(-)operator(-)operator(+)operator(-)operator(-)operator(+)operator(-)operator(+)operator(-)operator(-)operator(-)operator(-)operator(-)operator(-)operator(+)operator(-)operator(-)operator(+)operator(+)operator(+)operator(+)operator(-)operator(+)operator(+)operator(-)operator(-)operator(-)operator(+)operator(+)operator(-)operator(+)operator(+)operator(-)operator(-)operator(-)operator(+)operator(+)operator(-)operator(+)operator(+)operator(-)ident(_) +operator(+)operator(+)operator(+)operator(-)operator(-)operator(+)operator(+)operator(-)operator(+)operator(-)operator(+)operator(-)operator(-)operator(+)operator(+)operator(-)operator(-)operator(+)operator(+)operator(+)operator(-)operator(-)operator(+)operator(-)operator(-)operator(-)operator(-)operator(-)operator(-)operator(+)operator(-)operator(-)operator(-)operator(-)operator(+)operator(-)operator(-)operator(+)operator(+)operator(-)operator(-)operator(+)operator(+)operator(+)operator(-)operator(+)operator(+)operator(-)operator(+)operator(-)operator(-)operator(-)operator(-)operator(+)operator(+)operator(-)operator(-)operator(-)operator(-)operator(-)operator(-)operator(+)operator(-)operator(-)ident(_) +operator(-)operator(+)operator(-)operator(+)operator(-)operator(-)operator(-)operator(-)operator(+)operator(+)operator(+)operator(-)operator(-)operator(+)operator(-)operator(-)operator(+)operator(-)operator(-)operator(-)operator(-)operator(+)operator(-)operator(-)operator(+)operator(-)operator(-)operator(+)operator(-)operator(+)operator(+)operator(-)operator(+)operator(+)operator(-)operator(-)operator(+)operator(+)operator(+)operator(-)operator(+)operator(+)operator(+)operator(+)operator(-)operator(+)operator(+)operator(-)operator(-)operator(-)operator(-)operator(-)operator(+)operator(-)operator(+)operator(-)operator(+)operator(-)operator(-)operator(-)operator(-)operator(+)operator(+)operator(-)ident(_) +operator(-)operator(-)operator(-)operator(-)operator(-)operator(-)operator(-)operator(-)operator(-)operator(+)operator(-)operator(+)operator(-)operator(-)operator(-)operator(-) ident(_) +comment(##################################################################) + + +comment(# date: 03/18/2004) +comment(# title: primes less than 1000 ( 2005 Obfuscated Ruby Contest \)) +comment(# author: Jim Lawless) +comment(# email: jimbo at radiks dotski net) +comment(# comments: This program will display all positive prime integers) +comment(# less than 1000. Program licens is the same as the Ruby) +comment(# license ( http://www.ruby-lang.org/en/LICENSE.txt \)) + + global_variable($e)operator(=)string<delimiter(")delimiter(")> + +reserved(def) method(a)operator(()operator(\)) + global_variable($a)operator(=)global_variable($a)integer(+1) +reserved(end) + +reserved(def) method(b)operator(()operator(\)) + global_variable($a)operator(=)global_variable($a)integer(+5) +reserved(end) + +reserved(def) method(c)operator(()operator(\)) + global_variable($e)operator(=)global_variable($e)operator(+)global_variable($a)operator(.)ident(chr) +reserved(end) + +reserved(def) method(d)operator(()operator(\)) + global_variable($a)operator(=)integer(10) +reserved(end) + +reserved(def) method(e)operator(()operator(\)) + global_variable($a)operator(=)global_variable($a)integer(+16) +reserved(end) + +ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;) +ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;) +ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;) +ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;) +ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;) +ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;) +ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;) +ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;) +ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;) +ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;) +ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;) +ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;) +ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;) +ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;) +ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;) +ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;) +ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;) +ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(a)operator(;) +ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;) +ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;) +ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;) +ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;) +ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;) +ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;) +ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;) +ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;) +ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;) +ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;) +ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;) +ident(e)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;) +ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;) +ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;) +ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;) +ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;) +ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;) +ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;) +ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;) +ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;) +ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;) +ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;) +ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;) +ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;) +ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;) +ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;) +ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;) +ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;) +ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;) +ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;) +ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;) +ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(d)operator(;)ident(e)operator(;)ident(b)operator(;)ident(a)operator(;)ident(c)operator(;)ident(eval) global_variable($e) + +global_variable($_)operator(=)string<delimiter(%{)content(q,l= %w)nesting_delimiter({)content(Ruby)char(\\\\)content( Quiz Loader)nesting_delimiter(})content( +n,p,a= ")char(\\#)nesting_delimiter({)content(q.do)inline<delimiter(#{)string<delimiter(%w{)content(w a n c)delimiter(})>operator(.)ident(sort)operator({)operator(|)ident(o)operator(,)ident(t)operator(|)ident(t)operator(<=>)ident(o)operator(})delimiter(})>content(se.d)char(\\x65)content(l)char(\\x65)content(t)char(\\x65)content((' '\))nesting_delimiter(})content(.com/", +)nesting_delimiter({)content("bmJzcA==)char(\\n)content(".)char(\\x75)content(np)char(\\x61)content(ck("m"\)[0]=>" ","bHQ=)char(\\n)content(".)char(\\x75)content(np)char(\\x61)content(ck((?n-1\).chr\)[0]=> +:<,"Z3Q=)char(\\n)content(".)char(\\x75)content(np)char(\\x61)content(ck("m"\)[0]=>:>,"YW1w)char(\\n)content(".)char(\\x75)content(np)char(\\x61)content(ck((?l+1\).chr\)[0]=>:&)nesting_delimiter(})content(, +[[/^)char(\\\\)content(s+<)char(\\\\)content(/div>.+/m,""],[/^)char(\\\\)content(s+/,""],[/)char(\\n)content(/,")char(\\n)char(\\n)content("],[/<br )char(\\\\)content(/>/,")char(\\n)content("], +[/<hr )char(\\\\)content(/>/,"-="*40],[/<[^>]+>/,""],[/^ruby/,""],[/)char(\\n)nesting_delimiter({)content(3,)nesting_delimiter(})content(/,")char(\\n)char(\\n)content("]];p)char(\\165)content(ts" +)char(\\#)nesting_delimiter({)content(l[0..-3])nesting_delimiter(})content(ing...)char(\\n)char(\\n)content(";send(Kernel.methods.find_all)nesting_delimiter({)content(|x|x[0]==?e)nesting_delimiter(})content([-1], +"re)char(\\#)nesting_delimiter({)content(q[5...8].downcase)nesting_delimiter(})content(re '111112101110-117114105'.scan(/-|)char(\\\\)char(\\\\)content(d)nesting_delimiter({)content(3)nesting_delimiter(})content(/\). +inject(''\))nesting_delimiter({)content(|m,v|v.length>1?m+v.to_i.chr: m+v)nesting_delimiter(})content("\);o)inline<delimiter(#{)string<delimiter(%w{)content(e P)delimiter(})>operator(.)ident(sort)operator(.)ident(join)operator(.)ident(downcase) +delimiter(})>content(n("http://www.)char(\\#)nesting_delimiter({)content(n)nesting_delimiter(})content("\))nesting_delimiter({)content(|w|$F=w.read.sc)char(\\x61)content(n(/li>.+?"([^"]+\)..([^<]+\)/\))nesting_delimiter(})content(;)char(\\160)content(uts)char(\\ +)content(")char(\\#)nesting_delimiter({)content(q)nesting_delimiter(})char(\\n)char(\\n)content(";$F.)char(\\145)char(\\141)content(ch)nesting_delimiter({)content(|e|i=e[0][/)char(\\\\)content(d+/];s="%2s. %s"%[i,e[1]];i.to_i%2==0 ? +)char(\\160)content(ut)char(\\x73)content((s\) : )inline<delimiter(#{)string<delimiter(%w{)content(s p)delimiter(})>operator([)integer(-1)operator(])delimiter(})>content(rint("%-38s "%s\))nesting_delimiter(})content(;p)char(\\x72)char(\\x69)char(\\x6e)content(t")char(\\n)content(? ";e)char(\\x76)content(al( +['puts")char(\\n)char(\\#)nesting_delimiter({)content(l[0..3])nesting_delimiter(})content(ing...)char(\\n)char(\\n)content("','$c=gets.chomp.to_i'].sort.join(";"\)\);)inline<delimiter(#{)integer(111)operator(.)ident(chr) +delimiter(})>content(pen("http://www.)char(\\#)nesting_delimiter({)content(n)nesting_delimiter(})content("+$F[$c-1][0]\))nesting_delimiter({)content(|n|$_=n.read[/^)char(\\\\)content(s+<span.+/m];)inline<delimiter(#{)operator(()string<delimiter(')content(a)delimiter(')>operator(..)string<delimiter(")content(z)delimiter(")>operator(\))operator(.) +ident(to_a)operator([)integer(10)integer(-5)operator(*)integer(2)operator(])delimiter(})>content(.e)char(\\141)content(ch)nesting_delimiter({)content(|(z,f\)|)char(\\x67)content(sub!(z,f\))nesting_delimiter(})content(;)char(\\147)content(sub!(/&()char(\\\\)content(w+\);/\))nesting_delimiter({)content(|y|p. +ke)char(\\171)char(\\077)content(($1\)?p[$1]:y)nesting_delimiter(})content(;while$_=~/([^)char(\\n)content(])nesting_delimiter({)content(81,)nesting_delimiter(})content(\)/:z=$1.dup;f=$1.dup;f[f.rindex( +" ",80\),1]=")char(\\n)content(";f.s)char(\\165)content(b!(/)char(\\n)content([ )char(\\t)content(]+/,")char(\\n)content("\);s)char(\\165)content(b!(/)char(\\#)nesting_delimiter({)content(R)char(\\x65)content(g)char(\\x65)content(xp. +)char(\\x65)content(scap)char(\\x65)content((z\))nesting_delimiter(})content(/,f\)end)nesting_delimiter(})content(;while)char(\\040)char(\\163)content(ub!(/^(?:[^)char(\\n)content(]*)char(\\n)content(\))nesting_delimiter({)content(20)nesting_delimiter(})content(/, ""\):puts")char(\\#)content($& +--)char(\\x4d)content(O)char(\\x52)content(E--";g=$_;g)inline<delimiter(#{)string<delimiter(")char(\\145)delimiter(")>delimiter(})>content(ts;;)inline<delimiter(#{)string<delimiter(")content(excited)delimiter(")>operator([)integer(0)operator(..)integer(4)operator(])operator(.)ident(delete)operator(()string<delimiter(")content(c)delimiter(")>operator(\))delimiter(})>char(\\040)content(if$_[0]==?q +$_=g;end;$_.d)inline<delimiter(#{)string<delimiter(")content(Internet Service Provider)delimiter(")>operator(.)ident(scan)operator(()regexp<delimiter(/)content([A-Z])delimiter(/)>operator(\))operator(.)ident(join)operator(.)ident(downcase) +delimiter(})>content(lay)delimiter(})>operator(;)ident(eval)global_variable($_) + + ident(d)operator(=)operator([)integer(30644250780)operator(,)integer(9003106878)operator(,) + integer(30636278846)operator(,)integer(66641217692)operator(,)integer(4501790980)operator(,) + integer(671_24_603036)operator(,)integer(131_61973916)operator(,)integer(66_606629_920)operator(,) + integer(30642677916)operator(,)integer(30643069058)operator(])operator(;)ident(a)operator(,)ident(s)operator(=)operator([)operator(])operator(,)global_variable($*)operator([)integer(0)operator(]) + ident(s)operator(.)ident(each_byte)operator({)operator(|)ident(b)operator(|)ident(a)operator(<<)operator(()string<delimiter(")content(%036b)delimiter(")>operator(%)ident(d)operator([)ident(b)operator(.) + ident(chr)operator(.)ident(to_i)operator(])operator(\))operator(.)ident(scan)operator(()regexp<delimiter(/)char(\\d)content({6})delimiter(/)>operator(\))operator(}) + ident(a)operator(.)ident(transpose)operator(.)ident(each)operator({) operator(|)ident(a)operator(|) + ident(a)operator(.)ident(join)operator(.)ident(each_byte)operator({)\ + operator(|)ident(i)operator(|)ident(print) ident(i)operator(==)integer(49)operator(?)\ + operator(()global_variable($*)operator([)integer(1)operator(])operator(||)string<delimiter(")content(#)delimiter(")>operator(\))\ + operator(:)integer(32)operator(.)ident(chr)operator(}) + ident(puts) + operator(}) + +comment(#! /usr/bin/env ruby) +comment(# License: If Ruby is licensed to the general public in a certain way, this is also licensed in that way.) +ident(require)string<delimiter(')content(zlib)delimiter(')>operator(;)ident(eval)operator(()constant(Zlib)operator(::)constant(Inflate)operator(.)ident(inflate)operator(()string<delimiter(")content(x)char(\\332)char(\\355)content(WKo)char(\\333)content(F)char(\\020)char(\\276)char(\\367)content(W)char(\\250)char(\\262)char(\\001)char(\\222)char(\\t)content(M)char(\\357)char(\\246)content(M)char(\\017)char(\\242)char(\\211)char(\\242)content(h)char(\\200)char(\\036)char(\\212)content(`)char(\\201)char(\\026)char(\\350)char(\\205)content(`)char(\\f)content(=h)char(\\233)char(\\301)content(Zt%)char(\\273)content(A-2)char(\\277)char(\\275)char(\\363)char(\\315)char(\\222)char(\\334)char(\\241)content(,#v)char(\\214)char(\\366)content(T)char(\\331)char(\\262)char(\\326)char(\\303)content(y)char(\\317)content(7)char(\\263)char(\\243)content(M)char(\\371)char(\\347)content(])char(\\265)content(\))char(\\203)content(UuYnoO)char(\\257)content(Wo)char(\\203)char(\\364)content(>[T)char(\\353)content(U)char(\\265)char(\\276)content(L)char(\\257)char(\\353)char(\\325)char(\\235)content(-')char(\\277)char(\\226)char(\\233)content(ui)char(\\323)content(Uy1)char(\\251)char(\\027)char(\\027)char(\\341)char(\\253)char(\\371)char(\\346)content(r)char(\\e)char(\\245)content(u)char(\\366)char(\\216)char(\\205)content(f)char(\\263)char(\\367)char(\\357)char(\\336)content(&)char(\\353)char(\\362)content(S)char(\\010)content(zr=)char(\\277)char(\\331)content(5w)char(\\315)content(]r[)char(\\237)content(o)char(\\333)char(\\344)content(c])char(\\255)content(#>)char(\\343)content(O)char(\\025)char(\\352)char(\\037)char(\\334)char(\\177)char(\\341)char(\\367)char(\\364)char(\\271)char(\\t)char(\\003)char(\\245)char(\\337)content(|)char(\\027)char(\\304)char(\\364)content(aM@:)char(\\363)char(\\260)char(\\316)content(>)char(\\237)char(\\232)char(\\323)content(()char(\\326)char(\\252)content(()char(\\327)char(\\253)char(\\t)char(\\275)char(\\323)char(\\332)content(h)char(\\253)char(\\224)content(V)char(\\306)content(d)char(\\247)char(\\037)char(\\362)char(\\371)char(\\311)content(})char(\\321)char(\\314)content(f)char(\\356)char(\\363)content(C)char(\\016)char(\\311)char(\\342)char(\\365)char(\\361)content(ij)char(\\026)char(\\037)char(\\313)char(\\345)char(\\355)char(\\357)content(7)char(\\363)content(e)char(\\231)char(\\224)char(\\363)char(\\345)char(\\325)content(y)char(\\315)char(\\204)content(])char(\\263)content(l)char(\\362)content(0)char(\\177)char(\\317)char(\\241)char(\\024)content(M)char(\\376)char(\\263)char(\\235)content(o)char(\\267)content(Et)char(\\222)content(/)char(\\223)content(%)char(\\037)char(\\213)char(\\374)content(D)char(\\323)char(\\373)content(M)char(\\321)content(4Kv-)char(\\373)content(<)char(\\361)char(\\026)char(\\233)content(&)char(\\\\)char(\\304)char(\\253)content(,)char(\\354)char(\\270)char(\\263)char(\\314)content(\))char(\\232)char(\\374)content(8)char(\\311)char(\\247)content(]z)char(\\216)content(v)char(\\313)content(6)char(\\235)char(\\306)char(\\323)char(\\243)char(\\035)char(\\262)char(\\263)char(\\214)char(\\332)char(\\f)char(\\024)char(\\342)char(\\257)char(\\327)char(\\345)char(\\264)char(\\230)char(\\205)char(\\313)content(o36)char(\\312)content(2)char(\\254)content(e2)char(\\260)char(\\236)char(\\261)content(0)char(\\202)char(\\354)char(\\037)char(\\260)char(\\256)content( (f=/)char(\\313)content(:Z)char(\\024)char(\\245)char(\\313)char(\\244)content(Zoo)char(\\347)char(\\353)content(ey~])char(\\336)content(^)char(\\325)char(\\253)content(-)char(\\a)char(\\273)content(k)char(\\252)content(fqv6)char(\\235)char(\\333)content(j)char(\\276)char(\\355)char(\\236)content(tV)char(\\252)char(\\230)char(\\377)content(F)char(\\276)char(\\n)char(\\333)char(\\277)char(\\257)char(\\241)char(\\345)char(\\206)char(\\262)char(\\323)char(\\306)content(G)char(\\273)char(\\352)char(\\340)char(\\203)content(t)char(\\332)char(\\246)char(\\244)content(1`')char(\\316)char(\\316)char(\\266)char(\\245)char(\\275)content(H)char(\\003)content(2)char(\\377)content(l)char(\\253)char(\\017)content(,=42E)char(\\002)char(\\360)char(\\236)char(\\246)char(\\345)content(_s;Y)char(\\274)content(^)char(\\305)char(\\367)content(Q)char(\\233)char(\\036)char(\\233)char(\\276)char(\\016)char(\\312)char(\\245)content(0=)char(\\256)content(=)char(\\305)content(U)char(\\202)char(\\230)char(\\254)char(\\")char(\\222)char(\\265)char(\\004)char(\\217)char(\\237)content(~)char(\\373)char(\\345)char(\\017)char(\\")content(h)char(\\243)char(\\210)char(\\307)content(j)char(\\235)char(\\251)char(\\205)content(V8)char(\\353)char(\\304)content(X)char(\\372)content(!1CGc-)char(\\251)char(\\240)char(\\337)char(\\020)char(\\317)char(\\361)content(#)char(\\036)char(\\023)char(\\n)char(\\255)content(6)char(\\254)content(Cg3)char(\\002)content(})char(\\265)char(\\356)content(s)char(\\235)char(\\202)content(K[K)char(\\022)char(\\020)content( )char(\\243)char(\\206)char(\\216)char(\\241)content(p3)char(\\332)content(55)char(\\350)char(\\232)char(\\036)char(\\030)content(q$)char(\\233)char(\\344)content(!)char(\\363)char(\\204)content(^},$)char(\\023)content(Xg)char(\\235)content(:)char(\\364)content(r1)char(\\")content(1)char(\\344)char(\\277)char(\\261)char(\\207)char(\\031)content(()char(\\301)content(DE)char(\\260)char(\\344)char(\\026)content(Y)char(\\177)char(\\345)char(\\036)char(\\221)char(\\204)content(mP)char(\\263)char(\\266)content(Mk)char(\\305)char(\\366)char(\\210)content(%3)char(\\220)char(\\302)content(S)char(\\322)char(\\306)content(IR)char(\\316)char(\\377)content(!)char(\\203)content( S)char(\\336)char(\\310)char(\\216)char(\\215)char(\\203)char(\\315)char(\\002)content(-)char(\\211)content( 5D2)char(\\257)char(\\210)char(\\302)char(\\321)content(p)char(\\234)char(\\364)char(\\205)char(\\222)content(Jj)char(\\220)char(\\022)content(E)char(\\321)content(h)char(\\347)char(\\223)content(RQ*94K)char(\\022)char(\\243)char(\\314)content(H`4{LV)char(\\003)char(\\021)content(N)char(\\f)char(\\333)char(\\364)content(I)char(\\347)content(l)char(\\327)content(UR)char(\\305)content(t)char(\\340)char(\\332)content(i>)char(\\241)content(x=Mu4R)char(\\245)char(\\373)char(\\223)char(\\244)char(\\251)content(NB)char(\\211)char(\\247)char(\\236)char(\\346)content(5)char(\\253)content(^bx)char(\\332)content(Yc)char(\\263)char(\\252)content(M)char(\\220)content(b)char(\\253)char(\\220)char(\\310)char(\\004)char(\\331)char(\\242)char(\\020)content(,`)char(\\005)content(T)char(\\021)content(Y)char(\\251)content(P@)char(\\020)char(\\365)content(Ax)char(\\310)content(z)char(\\364)char(\\264)char(\\240)char(\\265)content(vj2)char(\\037)content(?0)char(\\v)char(\\")content(en)char(\\244)char(\\374)char(\\251)char(\\032)char(\\225)char(\\253)content(v)char(\\346)char(\\253)char(\\371)content(2)char(\\215)char(\\032)char(\\322)content((o)char(\\206)content(~A)char(\\006)char(\\010)char(\\f)char(\\324)char(\\223)content(57)char(\\026)char(\\")char(\\316)char(\\024)char(\\365)char(\\021)char(\\360)content(@)char(\\277)content(:)char(\\363)content(.$)char(\\f)char(\\342)char(\\016)content($)char(\\200)char(\\v)char(\\341)char(\\302)char(\\230)char(\\020)char(\\340)char(\\341)char(\\201)content(K)char(\\017)char(\\270)content(+i)char(\\326)content(-)char(\\312)char(\\313)content(j)char(\\235)char(\\n)content([)char(\\376)content(({)char(\\330)content(u)char(\\254)char(\\266)char(\\334)char(\\034)char(\\031)char(\\367)content(%:CK)char(\\210)content({)char(\\311)content(h)char(\\a)content(QH)char(\\333)content(Q)char(\\023)char(\\250)char(\\210)content(;e)char(\\360)char(\\322)char(\\362)char(\\213)char(\\202)char(\\247)char(\\216)char(\\266)char(\\340)content(C&(p)char(\\274)content(HT7)char(\\336)content(&B)char(\\352)char(\\300)char(\\036)content(z)char(\\206)char(\\204)char(\\375)content( )char(\\032)content(z)char(\\304)char(\\233)char(\\217)char(\\034)char(\\267)content(AK)char(\\207)content(R)char(\\363)char(\\213)char(\\324)content(u)char(\\334)char(\\203)char(\\272)content(h)char(\\234)content( )char(\\304)content(&)char(\\364)content(S)char(\\302)content(]|)char(\\024)char(\\233)content(b)char(\\000)char(\\023)content(E)char(\\034)char(\\005)char(\\300)content(!)char(\\330)char(\\227)content(4)char(\\026)char(\\205)char(\\316)char(\\363)char(\\203)char(\\364)char(\\")char(\\316)char(\\245)content(!)char(\\242)char(\\360)content(Y?4)char(\\204)content(b)char(\\023)content(.)char(\\200)content(9)char(\\036)content(X)char(\\300)char(\\213)content(p)char(\\200)content(])char(\\304)char(\\324)char(\\200)content($^)char(\\204)char(\\025)char(\\222)content(D)char(\\325)content(X )char(\\363)char(\\324)char(\\004)char(\\223)char(\\205)char(\\207)char(\\241)content(M)char(\\245)char(\\352)char(\\341)content((s)char(\\341)content(5)char(\\260)content(w)char(\\226)char(\\313)content(=)char(\\242)content(2 )char(\\200)char(\\177)char(\\344)char(\\355)char(\\211)char(\\335)content(0)char(\\004)char(\\341)char(\\217)char(\\207)char(\\215)content(r%x)char(\\030)char(\\302)char(\\304)char(\\230)char(\\335)content({#)char(\\250)content(#o)char(\\204)content(h)char(\\327)content(;)char(\\220)char(\\242)char(\\275)content(B%j&)char(\\343)content(e)char(\\005)char(\\226)content(/)char(\\r)char(\\200)char(\\035)char(\\035)char(\\206)content(K)char(\\243)char(\\027)char(\\216)content(Z)char(\\230)char(\\323)content(.)char(\\335)char(\\356)content(^!)char(\\v)content(F)char(\\002)content(K)char(\\366)char(\\246)content(kG)char(\\321)char(\\364)content(E)char(\\301)char(\\362)char(\\250)char(\\275)content(a)char(\\f)char(\\031)char(\\207)content(i%)char(\\216)char(\\342)content(&ie)char(\\205)char(\\260)char(\\324)content(})char(\\272)char(\\252)content(ho)char(\\222)char(\\306)char(\\370)char(\\362)content(!}6)char(\\364)content(C)char(\\003)char(\\271)content(7)char(\\206)content('!.)char(\\315)char(\\036)content(mhMm)char(\\370)char(\\252)char(\\241)char(\\365)char(\\221)content(g)char(\\275)char(\\326)content(A)char(\\302)char(\\254)char(\\270)content(X,)char(\\371)char(\\353)char(\\232)content(:)char(\\222)char(\\321)char(\\253)char(\\025)char(\\217)content(v%)char(\\222)char(\\023)content(!)char(\\243)content(r)char(\\272)char(\\364)content(()char(\\376)char(\\177)char(\\236)char(\\374)char(\\233)char(\\363)char(\\304)content(8)char(\\330)content(b)char(\\241)content(xdTp)char(\\325)char(\\321)char(\\377)char(\\342)content(8F)char(\\234)char(\\214)char(\\263)char(\\357)char(\\255)content(f)char(\\324)char(\\306)char(\\226)char(\\257)char(\\022)char(\\")char(\\000)char(\\354)char(\\003)char(\\024)content(C)char(\\207)char(\\n)content(a)char(\\353)char(\\240)content(&O)char(\\305)char(\\376)char(\\004)content(ncy)char(\\350)char(\\f)char(\\276)char(\\357)content(+Q|)char(\\201)content(bBi)char(\\206)char(\\277)char(\\345)content(u)char(\\251)char(\\273)char(\\310)char(\\367)char(\\242)char(\\303)content(*)char(\\204)content(d)char(\\n)char(\\271)content(})char(\\016)char(\\234)content(5r8)char(\\034)char(\\201)content([)char(\\343)content(:>)char(\\364)content(*)char(\\242)char(\\266)char(\\025)content(+HZ)char(\\263)content(e)char(\\212)char(\\024)content(7q)char(\\357)char(\\310)content(X)char(\\267)content([)char(\\333)content((9_o}P)char(\\201)char(\\324)content(>)char(\\266)char(\\364)char(\\000)char(\\217)content(hh)char(\\352)char(\\225)content(a)char(\\213)content(q)char(\\260)char(\\031)char(\\334)char(\\022)content(sg)char(\\360)char(\\e)char(\\206)char(\\234)content(B=)char(\\246)char(\\242)content(1)char(\\341)content(e)char(\\364)char(\\270)char(\\321)char(\\224)char(\\347)char(\\005)content(6L)char(\\267)char(\\227)content(\))char(\\244)char(\\210)char(\\307)char(\\027)char(\\257)content(<)char(\\343)char(\\257)char(\\000)char(\\303)char(\\264)content(u{)char(\\235)char(\\326)char(\\352)content(i)char(\\303)content(^)char(\\332)char(\\200)char(\\n)char(\\236)char(\\243)content(a)char(\\277)char(\\034)content(J#~S)char(\\335)content('2)char(\\371)char(\\001)content(q)char(\\374)content(5$)char(\\356)char(\\027)content(^)char(\\371)char(\\325)char(\\344)char(\\331)char(\\036)char(\\362)char(\\004)char(\\267)char(\\330)char(\\251)content(<)char(\\212)char(\\237)char(\\257)char(\\345)content(kr)char(\\371)char(\\302)content(d)char(\\362)content(r)char(\\376)char(\\344)content(d)char(\\252)content(C)char(\\311)char(\\374)content(R6)char(\\017)content(e)char(\\375)char(\\005)char(\\271)content(yAV)char(\\363)content(/)char(\\257)char(\\345)char(\\261)content(()char(\\340)content(hW)char(\\020)char(\\222)char(\\a)char(\\027)content(k\)60)char(\\354)char(\\217)char(\\363)char(\\350)content(1)char(\\263)content(rt)char(\\036)content(4)char(\\025)char(\\025)content(|)char(\\265)char(\\031)char(\\355)char(\\276)content(d)char(\\357)char(\\315)content(9)char(\\367)char(\\225)char(\\025)char(\\223)content(U)char(\\273)content(n)char(\\027)char(\\324)char(\\321)content(H)char(\\031)char(\\030)char(\\036)char(\\357)char(\\356)char(\\377)char(\\010)char(\\266)char(\\337)char(\\374)char(\\003)char(\\337)content(5Q)char(\\335)delimiter(")>operator(\))operator(\)) +comment(#include "ruby.h" /*) + regexp<delimiter(/)content(sLaSh * + oBfUsCaTeD RuBy * + cOpYrIgHt 2005 * +bY SiMoN StRaNdGaArD * + )inline<delimiter(#{)constant(X)operator(=)integer(320)operator(;)constant(Y)operator(=)integer(200)operator(;)constant(Z)operator(=)integer(20)delimiter(})>content( *)delimiter(/)> + +comment(#define GUN1 42:) +comment(#define GUN2 43:) +comment(#define bo do) +comment(#define when(gun\) /**/) +comment(#define DATA "p 'Hello embedded world'") +comment(#define DIRTY(argc,argv\)\\) +ident(argc)operator(,)ident(argv)operator(,)ident(char)operator(=)ident(eval)operator(()\ +string<delimiter(")inline<delimiter(#{)pre_constant(DATA)operator(.)ident(read)delimiter(})>char(\\n)content([3,2,1])delimiter(")>\ +operator(\))operator(;)ident(sun)operator(=)constant(O)operator(.)ident(new)\ +reserved(if)operator(()integer(0)operator(\)) + +ident(int) +ident(sun)operator([)operator(])operator(=)operator({)integer(12)operator(,)integer(9)operator(,)integer(16)operator(,)integer(9)operator(,)integer(2)operator(,)integer(1)operator(,)integer(7)operator(,)integer(1)operator(,)integer(3)operator(,)integer(9)operator(,)integer(27)operator(,)integer(4)operator(,) integer(13)operator(,)integer(2)operator(,)integer(11)operator(,)integer(5)operator(,)integer(4)operator(,)integer(1)operator(,)integer(25)operator(,) +integer(5)operator(,)integer(0)operator(,)integer(1)operator(,)integer(14)operator(,)integer(9)operator(,)integer(15)operator(,)integer(4)operator(,)integer(26)operator(,)integer(9)operator(,)integer(23)operator(,)integer(2)operator(,)integer(17)operator(,)integer(6)operator(,)integer(31)operator(,) integer(6)operator(,)integer(10)operator(,)integer(8)operator(,)integer(22)operator(,)integer(9)operator(,)integer(21)operator(,)integer(1)operator(,) +integer(24)operator(,)integer(8)operator(,)integer(20)operator(,)integer(8)operator(,)integer(18)operator(,)integer(9)operator(,)integer(29)operator(,)integer(5)operator(,)integer(9)operator(,)integer(5)operator(,)integer(1)operator(,)integer(1)operator(,)integer(28)operator(,)integer(8)operator(,)integer(8)operator(,)integer(1)operator(,)integer(30)operator(,) integer(9)operator(,)integer(6)operator(,)integer(8)operator(,) integer(5)operator(,)integer(1)operator(,) +integer(19)operator(,)integer(9)operator(,)integer(36)operator(,)integer(19)operator(,)integer(43)operator(,) integer(9)operator(,)integer(34)operator(,)integer(11)operator(,)integer(50)operator(,)integer(19)operator(,)integer(48)operator(,)integer(18)operator(,)integer(49)operator(,)integer(9)operator(,) integer(35)operator(,)integer(8)operator(,)integer(42)operator(,)integer(18)operator(,) +integer(51)operator(,)integer(8)operator(,)integer(44)operator(,)integer(11)operator(,)integer(32)operator(,) integer(11)operator(,)integer(47)operator(,)integer(9)operator(,)integer(37)operator(,)integer(1)operator(,)integer(39)operator(,)integer(9)operator(,)integer(38)operator(,)integer(19)operator(,) integer(45)operator(,)integer(8)operator(,)integer(40)operator(,)integer(12)operator(,) +integer(41)operator(,)integer(9)operator(,)integer(46)operator(,)integer(12)operator(,)integer(33)operator(,)integer(1)operator(,)integer(57)operator(,)integer(1)operator(,)integer(85)operator(,)integer(5)operator(,)integer(88)operator(,)integer(28)operator(,)integer(83)operator(,)integer(4)operator(,)integer(87)operator(,) integer(6)operator(,)integer(62)operator(,)integer(28)operator(,)integer(89)operator(,) +integer(9)operator(,)integer(80)operator(,)integer(28)operator(,)integer(60)operator(,)integer(21)operator(,)integer(52)operator(,)integer(21)operator(,)integer(72)operator(,)integer(29)operator(,)integer(54)operator(,)integer(21)operator(,)integer(75)operator(,)integer(8)operator(,)integer(70)operator(,)integer(29)operator(,)integer(58)operator(,)integer(28)operator(,)integer(65)operator(,) +integer(9)operator(,)integer(91)operator(,)integer(8)operator(,)integer(74)operator(,)integer(29)operator(,)integer(79)operator(,)integer(2)operator(,)integer(77)operator(,)integer(1)operator(,)integer(53)operator(,)integer(1)operator(,)integer(81)operator(,)integer(5)operator(,) integer(69)operator(,)integer(2)operator(,)integer(64)operator(,)integer(21)operator(,) integer(86)operator(,)integer(29)operator(,) +integer(67)operator(,)integer(9)operator(,)integer(59)operator(,)integer(1)operator(,)integer(61)operator(,)integer(5)operator(,)integer(73)operator(,)integer(6)operator(,)integer(76)operator(,)integer(28)operator(,)integer(56)operator(,)integer(21)operator(,)integer(68)operator(,)integer(29)operator(,)integer(78)operator(,)integer(29)operator(,)integer(63)operator(,)integer(5)operator(,)integer(66)operator(,) +integer(28)operator(,)integer(90)operator(,)integer(29)operator(,) integer(71)operator(,)integer(4)operator(,)integer(55)operator(,)integer(9)operator(,)integer(84)operator(,)integer(28)operator(,)integer(82)operator(,)integer(29)operator(,)integer(101)operator(,)integer(5)operator(,) integer(103)operator(,)integer(9)operator(,) integer(98)operator(,)integer(35)operator(,) +integer(97)operator(,)integer(1)operator(,)integer(94)operator(,)integer(35)operator(,)integer(93)operator(,)integer(1)operator(,)integer(100)operator(,)integer(35)operator(,)integer(92)operator(,)integer(31)operator(,)integer(99)operator(,)integer(5)operator(,)integer(96)operator(,)integer(39)operator(,)integer(95)operator(,)integer(5)operator(,)integer(102)operator(,)integer(35)operator(})operator(;) + +ident(void) ident(run)operator(()ident(int) ident(gun)operator(=)integer(0)operator(\)) operator({) regexp<delimiter(/)delimiter(/)> operator([)ident(gun)operator(])operator(=)operator([)symbol(:GUN1)operator(,)symbol(:GUN2)operator(]) + ident(printf)operator(()string<delimiter(")content(run(\) %i)char(\\n)delimiter(")>operator(,) ident(gun)operator(\))operator(;) + ident(switch)operator(()ident(gun)operator(\)) operator({) + reserved(case) constant(GUN1) reserved(when)operator(()integer(2)operator(\)) + ident(printf)operator(()string<delimiter(")content(when2)char(\\n)delimiter(")>operator(\))operator(;) + reserved(break)operator(;) regexp<delimiter(/)delimiter(/)> reserved(end) + reserved(case) constant(GUN2) reserved(when)operator(()integer(3)operator(\)) + ident(printf)operator(()string<delimiter(")content(when3)char(\\n)delimiter(")>operator(\))operator(;) + reserved(break)operator(;) regexp<delimiter(/)delimiter(/)> reserved(end) + operator(}) +operator(}) + +ident(int) ident(main)operator(()ident(int) ident(argc)operator(,) ident(char)operator(**) ident(argv)operator(\)) operator({) + ident(printf)operator(()string<delimiter(")content(hello world. number of arguments=%i)char(\\n)delimiter(")>operator(,) ident(argc)operator(\))operator(;) + ident(int) ident(fun)operator(=)integer(5)operator(;) + ident(bo) operator({) + ident(fun) operator(-=) integer(1)operator(;) regexp<delimiter(/)delimiter(/)>operator(.)ident(id) operator(-) ident(gun) operator(=) ident(fun) + ident(run)operator(()ident(fun)operator(\))operator(;) + operator(}) reserved(while)operator(()ident(fun)operator(>)integer(0)operator(\))operator(;) + ident(ruby_init)operator(()operator(\))operator(;) + ident(rb_eval_string)operator(()pre_constant(DATA)operator(\))operator(;) + reserved(return) integer(0)operator(;) +operator(}) + +comment(#if 0 // nobody reads un-defined code) +reserved(def) method(goto)operator(*)ident(s)operator(;)global_variable($s)operator(=)operator([)operator(])operator(;)constant(Y)operator(.)ident(times)operator({)ident(s)operator(=)operator([)operator(])operator(;)constant(X)operator(.)ident(times)operator({)ident(s)operator(<<)operator([)integer(0)operator(])operator(*)integer(3)operator(})operator(;)global_variable($s)operator(<<) ident(s)operator(})reserved(end)operator(;)constant(A)operator(=)float(0.5) +ident(include) constant(Math)operator(;)reserved(def) method(u) ident(g)operator(,)ident(h)operator(,)ident(i)operator(,)ident(j)operator(,)ident(k)operator(,)ident(l)operator(;)ident(f)operator(,)operator(*)ident(m)operator(=)operator(()operator(()ident(j)operator(-)ident(h)operator(\))operator(.)ident(abs)operator(>)operator(()ident(k)operator(-)ident(i)operator(\))operator(.)ident(abs)operator(\))operator(?)operator([)ident(proc)operator({) +operator(|)ident(n)operator(,)ident(o)operator(|) ident(g)operator([)ident(o)operator(]) operator([)ident(n) operator(])operator(=)ident(l) operator(})operator(,)operator([)ident(h) operator(,)ident(i) operator(])operator(,)operator([)ident(j)operator(,)ident(k)operator(])operator(])operator(:)operator([)ident(proc)operator({) +operator(|)ident(p)operator(,)ident(q)operator(|) ident(g)operator([) ident(p)operator(])operator([) ident(q)operator(]) operator(=)ident(l)operator(}) operator(,)operator([) ident(i)operator(,)ident(h) operator(])operator(,) operator([)ident(k)operator(,)ident(j)operator(])operator(])operator(;)ident(b)operator(,)ident(a)operator(=)ident(m)operator(.)ident(sort) +ident(c)operator(,)ident(d)operator(=)ident(a) operator([)integer(1) operator(])operator(-)ident(b) operator([)integer(1) operator(])operator(,)ident(a) operator([)integer(0) operator(])operator(-)ident(b) operator([)integer(0) operator(])operator(;)ident(d)operator(.)ident(times)operator({)operator(|)ident(e)operator(|)ident(f)operator(.) +ident(call)operator(() ident(e)operator(+)ident(b)operator([) integer(0)operator(]) operator(,)ident(c)operator(*) ident(e)operator(/)ident(d)operator(+)ident(b) operator([)integer(1)operator(])operator(\))operator(})operator(;)reserved(end)operator(;)constant(V)operator(=)integer(0)operator(;)reserved(def) method(bo)operator(&)ident(u) +global_variable($u)operator(||=) constant(V)operator(;) operator(;)global_variable($u) operator(+=) integer(1)operator(+)constant(V) operator(;)operator(;) reserved(return) ident(u)operator(.)ident(call) reserved(if)global_variable($u)operator(>)integer(1)operator(;)ident(q)operator(=)float(128.0) +operator(;)ident(x)operator(=)operator(()constant(V) operator(..) integer(255) operator(\))operator(.) ident(map) operator({)operator(|) ident(y)operator(|)ident(f1)operator(,)ident(z) operator(=)ident(sin)operator(()ident(y)operator(.)ident(to_f)operator(*)constant(PI)operator(/)ident(q)operator(\))operator(,) +ident(sin)operator(()operator(() ident(y)operator(.) ident(to_f) operator(+) integer(200) operator(\))operator(*)constant(PI)operator(/)operator(() ident(q)operator(\))operator(\))operator(;)operator([)operator(()ident(f1)operator(*)float(30.0)float(+110.0)operator(\))operator(.) +ident(to_i)operator(,)operator(()operator(()ident(f1)operator(+)ident(z)operator(\))operator(*)float(10.0)float(+40.0)operator(\))operator(.)ident(to_i)operator(,)operator(()ident(z)operator(*)float(20.0)float(+120.0)operator(\))operator(.)ident(to_i)operator(])operator(})operator(;)constant(Y)operator(.)ident(times)operator({)operator(|)ident(i)operator(|)constant(X)operator(.) +ident(times)operator({)operator(|)ident(j)operator(|)ident(i1)operator(=)operator(()operator(()ident(i)operator(*)float(0.3)integer(+150)operator(\))operator(*)operator(()ident(j)operator(*)float(1.1)integer(+50)operator(\))operator(/)float(50.0)operator(\))operator(.)ident(to_i)operator(;)ident(i2)operator(=)operator(()operator(()ident(i)operator(*)float(0.8)integer(+510)operator(\))operator(*)operator(() +ident(j)operator(*)float(0.9)integer(+1060)operator(\))operator(/)float(51.0)operator(\))operator(.)ident(to_i)operator(;)global_variable($s)operator([)ident(i)operator(])operator([)ident(j)operator(])operator(=)ident(x)operator([)operator(()ident(i1)operator(*)ident(i2)operator(\))operator(%)integer(255)operator(])operator(.)ident(clone)operator(})operator(})operator(;)global_variable($a)operator(=)operator(()integer(0)operator(..)integer(25)operator(\))operator(.) +ident(inject)operator(()operator([)operator(])operator(\))operator({)operator(|)ident(a)operator(,)ident(i)operator(|)ident(a)operator(<<)operator(()constant(V)operator(..)integer(3)operator(\))operator(.)ident(inject)operator(()operator([)operator(])operator(\))operator({)operator(|)ident(r)operator(,)ident(j)operator(|)ident(r)operator(<<)global_variable($c)operator([)ident(i)operator(*)integer(4)operator(+)ident(j)operator(])operator(})operator(})operator(;)ident(u)operator(.)ident(call)operator(;)reserved(end) +constant(I)operator(=)constant(LocalJumpError)operator(;)reserved(def) method(run)operator(*)ident(a)operator(,)operator(&)ident(b)operator(;)reserved(return) reserved(if) ident(a)operator(.)ident(size)operator(==)constant(V)operator(;)reserved(if) ident(a)operator([)constant(V)operator(])operator(==)integer(666)operator(;)global_variable($b)operator(=)ident(b) +reserved(elsif)global_variable($b)operator(;)global_variable($b)operator(.)ident(call)operator(;)reserved(end)operator(;)reserved(end)operator(;)reserved(def) method(main) ident(s)operator(,)operator(&)ident(u)operator(;)global_variable($m)operator(=)constant(V)operator(;)ident(u)operator(.)ident(call) reserved(rescue) constant(I)operator(;)reserved(end) +reserved(def) method(rb_eval_string)operator(()operator(*)ident(a)operator(\))operator(;)reserved(end) comment(# you promised not to look here) +reserved(def) method(ruby_init)operator(;)ident(q)operator(=)float(2.0)operator(;)ident(l)operator(=)operator(()operator(()constant(X)operator(**)ident(q)operator(\))operator(*)constant(A)operator(+)operator(()constant(Y)operator(**)ident(q)operator(\))operator(*)constant(A)operator(\))operator(**)constant(A)operator(;)constant(V)operator(.)ident(upto)operator(()constant(Y)integer(-4)operator(\))operator({)operator(|)ident(s)operator(|)constant(V)operator(.) +ident(upto)operator(()constant(X)integer(-4)operator(\))operator({)operator(|)ident(q)operator(|)ident(d)operator(=)operator(()operator(()ident(q)operator(-)constant(X)operator(/)constant(A)operator(\))operator(**)ident(q)operator(+)operator(()ident(s)operator(-)constant(Y)operator(/)constant(A)operator(\))operator(**)ident(q)operator(\))operator(**)constant(A)operator(;)ident(e)operator(=)operator(()ident(cos)operator(()ident(d)operator(*)constant(PI)operator(/)operator(()ident(l)operator(/)ident(q)operator(\))operator(\))operator(/)ident(q) +operator(+)constant(A)operator(\))operator(*)float(3.0)float(+1.0)operator(;)ident(v)operator(=)integer(2)operator(;)ident(f)operator(=)ident(v)operator(/)ident(e)operator(;)ident(a)operator(,)ident(p)operator(,)ident(b)operator(=)global_variable($s)operator([)ident(s)operator(])operator(,)global_variable($s)operator([)ident(s)integer(+1)operator(])operator(,)global_variable($s)operator([)ident(s)operator(+)ident(v)operator(])operator(;)ident(r)operator(=)ident(a)operator([)ident(q)operator(])operator([)constant(V)operator(])operator(*)ident(e)operator(+) +ident(p)operator([)ident(q)operator(])operator([)constant(V)operator(])operator(+)ident(a)operator([)ident(q)integer(+1)operator(])operator([)constant(V)operator(])operator(+)ident(b)operator([)ident(q)operator(])operator([)constant(V)operator(])operator(+)ident(a)operator([)ident(q)operator(+)ident(v)operator(])operator([)constant(V)operator(])operator(+)ident(b)operator([)ident(q)operator(+)ident(v)operator(/)ident(v)operator(])operator([)constant(V)operator(])operator(+)ident(p)operator([)ident(q)operator(+)ident(v)operator(])operator([)constant(V)operator(])operator(+)ident(b)operator([)ident(q)operator(+) +ident(v)operator(])operator([)constant(V)operator(])operator(*)ident(f)operator(;)ident(g)operator(=)operator([)ident(a)operator([)ident(q)operator(])operator([)constant(V)operator(])operator(,)ident(b)operator([)ident(q)operator(])operator([)constant(V)operator(])operator(,)ident(a)operator([)ident(q)operator(+)ident(v)operator(])operator([)constant(V)operator(])operator(,)ident(b)operator([)ident(q)operator(+)ident(v)operator(])operator([)constant(V)operator(])operator(])operator(;)ident(h)operator(=)operator(()ident(g)operator(.)ident(max)operator(-)ident(g)operator(.)ident(min) +operator(\))operator(*)ident(f)operator(;)global_variable($s)operator([)ident(s)operator(])operator([)ident(q)operator(])operator([)constant(V)operator(])operator(=)operator([)operator([)operator(()ident(r)operator(/)operator(()ident(e)operator(+)ident(f)float(+6.0)operator(\))operator(+)constant(A)operator(+)operator(()ident(h)operator(*)float(0.4)operator(\))operator(\))operator(.)ident(to_i)operator(,)integer(255)operator(])operator(.)ident(min)operator(,)constant(V)operator(])operator(.)ident(max) +operator(})operator(})operator(;)constant(File)operator(.)ident(open)operator(()string<delimiter(")content(res.ppm)delimiter(")>operator(,)string<delimiter(")content(w+)delimiter(")>operator(\))operator({)operator(|)ident(f)operator(|)ident(f)operator(.)ident(write)operator(()comment(# secret.greetings :-\)) +string<delimiter(")content(P3)char(\\n)content(# res.ppm)char(\\n)inline<delimiter(#{)constant(X)delimiter(})>content( )inline<delimiter(#{)constant(Y)delimiter(})>char(\\n)content(255)char(\\n)delimiter(")>operator(+)global_variable($s)operator(.)ident(map)operator({)operator(|)ident(a)operator(|)ident(a)operator(.)ident(map)operator({)operator(|)ident(b)operator(|)ident(b)operator(.)ident(join)string<delimiter(')content( )delimiter(')> +operator(})operator(.)ident(join)operator(()string<delimiter(')content( )delimiter(')>operator(\))operator(+)string<delimiter(")char(\\n)delimiter(")>operator(})operator(.)ident(join)operator(\))operator(})operator(;)reserved(end)operator(;)reserved(def) method(switch) ident(i)operator(,)operator(&)ident(b)operator(;)ident(b)operator(.)ident(call)operator(;)reserved(return) reserved(unless) +reserved(defined?)operator(()global_variable($m)operator(\))operator(;)ident(b)operator(=)operator(()constant(X)operator(*)float(0.01)operator(\))operator(.)ident(to_i)operator(;)ident(d)operator(=)float(1.0)operator(/)float(40.0)operator(;)ident(e)operator(=)float(0.09)operator(;)ident(c)operator(=)operator(()constant(Y)operator(*)float(0.01)operator(\))operator(.)ident(to_i) +ident(a)operator(=)global_variable($a)operator(.)ident(map)operator({)operator(|)operator(()ident(f)operator(,)ident(g)operator(,)ident(h)operator(,)ident(j)operator(\))operator(|)operator([)ident(f)operator(*)ident(d)operator(,)ident(g)operator(*)ident(e)operator(,)ident(h)operator(*)ident(d)operator(,)ident(j)operator(*)ident(e)operator(])operator(})operator(;)ident(a)operator(.)ident(each)operator({)operator(|)operator(()ident(k)operator(,)ident(l)operator(,)ident(m)operator(,)ident(n)operator(\))operator(|)ident(u)operator(()global_variable($s)operator(,)operator(()ident(k)operator(*)constant(X) +operator(\))operator(.)ident(to_i)operator(+)ident(b)operator(+)ident(i)operator(,)operator(()ident(l)operator(*)constant(Y)operator(\))operator(.)ident(to_i)operator(+)ident(c)operator(+)ident(i)operator(,)operator(()ident(m)operator(*)constant(X)operator(\))operator(.)ident(to_i)operator(+)ident(b)operator(+)ident(i)operator(,)operator(()ident(n)operator(*)constant(Y)operator(\))operator(.)ident(to_i)operator(+)ident(c)operator(+)ident(i)operator(,)operator([)constant(Z)operator(])operator(*)integer(3)operator(\))operator(}) +ident(a)operator(.)ident(each)operator({)operator(|)operator(()ident(o)operator(,)ident(q)operator(,)ident(r)operator(,)ident(s)operator(\))operator(|)ident(u)operator(()global_variable($s)operator(,)operator(()ident(o)operator(*)operator(()constant(X)operator(-)constant(Z)operator(\))operator(\))operator(.)ident(to_i)operator(+)ident(i)operator(,)operator(()ident(q)operator(*)operator(()constant(Y)operator(-)constant(Z)operator(\))operator(\))operator(.)ident(to_i)operator(+)ident(i)operator(,)operator(()ident(r)operator(*)operator(()constant(X)operator(-) +constant(Z)operator(\))operator(\))operator(.)ident(to_i)operator(+)ident(i)operator(,)operator(()ident(s)operator(*)operator(()constant(Y)operator(-)constant(Z)operator(\))operator(\))operator(.)ident(to_i)operator(+)ident(i)operator(,)operator([)operator(()integer(1)operator(<<)integer(8)operator(\))integer(-1)operator(])operator(*)integer(3)operator(\))operator(})operator(;)reserved(end)operator(;)constant(Q)operator(=)constant(Object)operator(;)reserved(class) +class(Regexp)operator(;)reserved(def) method([]=)operator(()ident(v)operator(,)ident(is)operator(\))operator(;)ident(is)operator(.)ident(each)operator({)operator(|)ident(s)operator(|)constant(Q)operator(.)ident(send)operator(()symbol(:remove_const)operator(,)ident(s)operator(\))reserved(if) constant(Q)operator(.) +ident(const_defined?) ident(s)operator(;)constant(Q)operator(.)ident(const_set)operator(()ident(s)operator(,)ident(v)operator(\))operator(})operator(;)reserved(end)operator(;)reserved(end)operator(;)reserved(def) method(int)operator(*)ident(ptr)operator(;)integer(666) +reserved(end)operator(;)reserved(class) class(O)operator(;)reserved(def) method([]=)operator(()ident(a)operator(,)ident(b)operator(=)pre_constant(nil)operator(\))operator(;)global_variable($c)operator(=)ident(a)operator(;)reserved(end)operator(;)reserved(end)operator(;)reserved(alias)symbol(:void)symbol(:goto) +comment(#endif // pretend as if you havn't seen anything) +operator(=)reserved(end) + diff --git a/test/scanners/ruby/suite.rb b/test/scanners/ruby/suite.rb new file mode 100644 index 0000000..c56b3bd --- /dev/null +++ b/test/scanners/ruby/suite.rb @@ -0,0 +1,3 @@ +class Ruby < CodeRay::TestCase + extension :rb +end diff --git a/test/scanners/ruby/test-fitter.in.rb b/test/scanners/ruby/test-fitter.in.rb new file mode 100644 index 0000000..7d00da6 --- /dev/null +++ b/test/scanners/ruby/test-fitter.in.rb @@ -0,0 +1,45 @@ +require 'benchmark'
+require 'fits'
+
+N = 100_000
+
+def test s
+ puts s
+ Benchmark.bm 10 do |bm|
+ bm.report 'default' do
+ N.times { s =~ /\A\w+\z/ }
+ end
+
+ bm.report 'fits?' do
+ N.times { s.fits? /\w+/ }
+ end
+
+ bm.report 'f' do
+ N.times { s =~ /\w+/.f }
+ end
+
+ re = /\w+/.f
+
+ bm.report 'preparsed' do
+ N.times { s =~ re }
+ end
+ end
+ puts
+end
+
+a.fits? / bla /x
+
+test 'harmlessline'
+
+test <<EOL
+<div style=\"font-size:2px\">Destroy my HTML!
+harmlessline
+EOL
+
+test <<EOL
+harmlessline
+harmlesslineharmlessline
+<div style=\"font-size:2px\">Destroy my HTML!
+harmlessline
+EOL
+
diff --git a/test/scanners/ruby/test-fitter.out.raydebug b/test/scanners/ruby/test-fitter.out.raydebug new file mode 100644 index 0000000..da35d8d --- /dev/null +++ b/test/scanners/ruby/test-fitter.out.raydebug @@ -0,0 +1,46 @@ +ident(require) string<delimiter(')content(benchmark)delimiter(')> +ident(require) string<delimiter(')content(fits)delimiter(')> + +constant(N) operator(=) integer(100_000) + +reserved(def) method(test) ident(s) + ident(puts) ident(s) + constant(Benchmark)operator(.)ident(bm) integer(10) reserved(do) operator(|)ident(bm)operator(|) + ident(bm)operator(.)ident(report) string<delimiter(')content(default)delimiter(')> reserved(do) + constant(N)operator(.)ident(times) operator({) ident(s) operator(=)operator(~) regexp<delimiter(/)char(\\A)char(\\w)content(+)char(\\z)delimiter(/)> operator(}) + reserved(end) + + ident(bm)operator(.)ident(report) string<delimiter(')content(fits?)delimiter(')> reserved(do) + constant(N)operator(.)ident(times) operator({) ident(s)operator(.)ident(fits?) regexp<delimiter(/)char(\\w)content(+)delimiter(/)> operator(}) + reserved(end) + + ident(bm)operator(.)ident(report) string<delimiter(')content(f)delimiter(')> reserved(do) + constant(N)operator(.)ident(times) operator({) ident(s) operator(=)operator(~) regexp<delimiter(/)char(\\w)content(+)delimiter(/)>operator(.)ident(f) operator(}) + reserved(end) + + ident(re) operator(=) regexp<delimiter(/)char(\\w)content(+)delimiter(/)>operator(.)ident(f) + + ident(bm)operator(.)ident(report) string<delimiter(')content(preparsed)delimiter(')> reserved(do) + constant(N)operator(.)ident(times) operator({) ident(s) operator(=)operator(~) ident(re) operator(}) + reserved(end) + reserved(end) + ident(puts) +reserved(end) + +ident(a)operator(.)ident(fits?) operator(/) ident(bla) regexp<delimiter(/)content(x + +test 'harmlessline' + +test <<EOL +<div style=)char(\\")content(font-size:2px)char(\\")content(>Destroy my HTML! +harmlessline +EOL + +test <<EOL +harmlessline +harmlesslineharmlessline +<div style=)char(\\")content(font-size:2px)char(\\")content(>Destroy my HTML! +harmlessline +EOL + +)>
\ No newline at end of file diff --git a/test/scanners/ruby/tk-calc.in.rb b/test/scanners/ruby/tk-calc.in.rb new file mode 100644 index 0000000..76272da --- /dev/null +++ b/test/scanners/ruby/tk-calc.in.rb @@ -0,0 +1,5 @@ +require 'tk';TkRoot.new;r,c,b=1,1,%w#7 8 9 + 4 5 6 - 1 2 3 * 0 . /#;d=TkEntry.new{
+grid("row"=>0,"column"=>1,"columnspan"=>4)};b.each_index{|i|TkButton.new{text b[i]
+command proc{d.insert("end",b[i])};grid("row"=>r,"column"=>c)};c+=1;if i&&(i+1)%##
+4==0then r+=1;c=1 end};TkButton.new{text"=";command proc{t=d.get;d.delete(0,"end")
+d.insert("end",eval(t))};grid("row"=>r,"column"=>c)};Tk.mainloop### by mawe :) ###
diff --git a/test/scanners/ruby/tk-calc.out.raydebug b/test/scanners/ruby/tk-calc.out.raydebug new file mode 100644 index 0000000..4bd4db0 --- /dev/null +++ b/test/scanners/ruby/tk-calc.out.raydebug @@ -0,0 +1,5 @@ +ident(require) string<delimiter(')content(tk)delimiter(')>operator(;)constant(TkRoot)operator(.)ident(new)operator(;)ident(r)operator(,)ident(c)operator(,)ident(b)operator(=)integer(1)operator(,)integer(1)operator(,)string<delimiter(%w#)content(7 8 9 + 4 5 6 - 1 2 3 * 0 . /)delimiter(#)>operator(;)ident(d)operator(=)constant(TkEntry)operator(.)ident(new)operator({) +ident(grid)operator(()string<delimiter(")content(row)delimiter(")>operator(=)operator(>)integer(0)operator(,)string<delimiter(")content(column)delimiter(")>operator(=)operator(>)integer(1)operator(,)string<delimiter(")content(columnspan)delimiter(")>operator(=)operator(>)integer(4)operator(\))operator(})operator(;)ident(b)operator(.)ident(each_index)operator({)operator(|)ident(i)operator(|)constant(TkButton)operator(.)ident(new)operator({)ident(text) ident(b)operator([)ident(i)operator(]) +ident(command) ident(proc)operator({)ident(d)operator(.)ident(insert)operator(()string<delimiter(")content(end)delimiter(")>operator(,)ident(b)operator([)ident(i)operator(])operator(\))operator(})operator(;)ident(grid)operator(()string<delimiter(")content(row)delimiter(")>operator(=)operator(>)ident(r)operator(,)string<delimiter(")content(column)delimiter(")>operator(=)operator(>)ident(c)operator(\))operator(})operator(;)ident(c)operator(+=)integer(1)operator(;)reserved(if) ident(i)operator(&&)operator(()ident(i)integer(+1)operator(\))operator(%)comment(##) +integer(4)operator(==)integer(0)reserved(then) ident(r)operator(+=)integer(1)operator(;)ident(c)operator(=)integer(1) reserved(end)operator(})operator(;)constant(TkButton)operator(.)ident(new)operator({)ident(text)string<delimiter(")content(=)delimiter(")>operator(;)ident(command) ident(proc)operator({)ident(t)operator(=)ident(d)operator(.)ident(get)operator(;)ident(d)operator(.)ident(delete)operator(()integer(0)operator(,)string<delimiter(")content(end)delimiter(")>operator(\)) +ident(d)operator(.)ident(insert)operator(()string<delimiter(")content(end)delimiter(")>operator(,)ident(eval)operator(()ident(t)operator(\))operator(\))operator(})operator(;)ident(grid)operator(()string<delimiter(")content(row)delimiter(")>operator(=)operator(>)ident(r)operator(,)string<delimiter(")content(column)delimiter(")>operator(=)operator(>)ident(c)operator(\))operator(})operator(;)constant(Tk)operator(.)ident(mainloop)comment(### by mawe :\) ###) diff --git a/test/scanners/ruby/undef.in.rb b/test/scanners/ruby/undef.in.rb new file mode 100644 index 0000000..795483d --- /dev/null +++ b/test/scanners/ruby/undef.in.rb @@ -0,0 +1,18 @@ +undef /
+undef ,
+undef --
+
+undef
+# bla
+[]=
+
+undef undef
+undef /,/,:/
+
+undef &,&&
+
+:simple
+:"bla"
+:"#{undef :blubb}#@@cv"
+
+undef :"bla", /, :"#{undef :blubb}#@@cv"
diff --git a/test/scanners/ruby/undef.out.raydebug b/test/scanners/ruby/undef.out.raydebug new file mode 100644 index 0000000..e306858 --- /dev/null +++ b/test/scanners/ruby/undef.out.raydebug @@ -0,0 +1,18 @@ +reserved(undef) method(/) +reserved(undef) operator(,) +reserved(undef) method(-)operator(-) + +reserved(undef) +comment(# bla) +method([]=) + +reserved(undef) method(undef) +reserved(undef) method(/)operator(,)method(/)operator(,)symbol(:/) + +reserved(undef) method(&)operator(,)method(&)operator(&) + +symbol(:simple) +symbol<symbol(:)delimiter(")content(bla)delimiter(")> +symbol<symbol(:)delimiter(")inline<delimiter(#{)reserved(undef) symbol(:blubb)delimiter(})>escape(#)class_variable(@@cv)delimiter(")> + +reserved(undef) symbol<symbol(:)delimiter(")content(bla)delimiter(")>operator(,) method(/)operator(,) symbol<symbol(:)delimiter(")inline<delimiter(#{)reserved(undef) symbol(:blubb)delimiter(})>escape(#)class_variable(@@cv)delimiter(")> diff --git a/test/scanners/ruby/zero.in.rb b/test/scanners/ruby/zero.in.rb new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/test/scanners/ruby/zero.in.rb diff --git a/test/scanners/ruby/zero.out.raydebug b/test/scanners/ruby/zero.out.raydebug new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/test/scanners/ruby/zero.out.raydebug diff --git a/test/scanners/suite.rb b/test/scanners/suite.rb new file mode 100644 index 0000000..970492d --- /dev/null +++ b/test/scanners/suite.rb @@ -0,0 +1,4 @@ +mydir = File.dirname(__FILE__)
+require File.join(mydir, 'coderay_suite')
+
+CodeRay::TestSuite.run
diff --git a/test/scanners/xml/kate.in.xml b/test/scanners/xml/kate.in.xml new file mode 100644 index 0000000..b13333b --- /dev/null +++ b/test/scanners/xml/kate.in.xml @@ -0,0 +1,76 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE language SYSTEM "language.dtd">
+<language name="Eiffel" version="1.02" kateversion="2.1" section="Sources" extensions="*.e" mimetype="text/x-eiffel-src">
+ <highlighting>
+ <list name="keywords">
+ <item> indexing </item>
+ <item> class </item>
+ <item> inherit </item>
+ <item> creation </item>
+ <item> feature </item>
+ <item> rename </item>
+ <item> redefine </item>
+ <item> undefine </item>
+ <item> select </item>
+ <item> export </item>
+ <item> local </item>
+ <item> deferred </item>
+ <item> do </item>
+ <item> is </item>
+ <item> once </item>
+ <item> alias </item>
+ <item> external </item>
+ <item> rescue </item>
+ <item> debug </item>
+ <item> if </item>
+ <item> inspect </item>
+ <item> from </item>
+ <item> else </item>
+ <item> elseif </item>
+ <item> when </item>
+ <item> until </item>
+ <item> loop </item>
+ <item> then </item>
+ <item> obsolete </item>
+ <item> end </item>
+ </list>
+ <list name="assertions">
+ <item> check </item>
+ <item> ensure </item>
+ <item> require </item>
+ <item> variant </item>
+ <item> invariant </item>
+ </list>
+ <contexts>
+ <context attribute="Normal Text" lineEndContext="#stay" name="Normal">
+ <keyword attribute="Keyword" context="#stay" String="keywords"/>
+ <Float attribute="Float" context="#stay"/>
+ <Int attribute="Decimal" context="#stay"/>
+ <RegExpr attribute="Char" context="#stay" String="'.'"/>
+ <DetectChar attribute="String" context="String" char="""/>
+ <Detect2Chars attribute="Comment" context="Comment" char="-" char1="-"/>
+ <keyword attribute="Assertions" context="#stay" String="assertions"/>
+ </context>
+ <context attribute="String" lineEndContext="#pop" name="String">
+ <DetectChar attribute="String" context="#pop" char="""/>
+ </context>
+ <context attribute="Comment" name="Comment" lineEndContext="#pop"/>
+ </contexts>
+ <itemDatas>
+ <itemData name="Normal Text" defStyleNum="dsNormal" />
+ <itemData name="Keyword" defStyleNum="dsKeyword" />
+ <itemData name="Decimal" defStyleNum="dsDecVal" />
+ <itemData name="Float" defStyleNum="dsFloat" />
+ <itemData name="Char" defStyleNum="dsChar" />
+ <itemData name="String" defStyleNum="dsString" />
+ <itemData name="Comment" defStyleNum="dsComment" />
+ <itemData name="Assertions" defStyleNum="dsOthers" />
+ </itemDatas>
+ </highlighting>
+ <general>
+ <comments>
+ <comment name="singleLine" start="--" />
+ </comments>
+ <keywords casesensitive="1" />
+ </general>
+</language>
diff --git a/test/scanners/xml/kate.out.raydebug b/test/scanners/xml/kate.out.raydebug new file mode 100644 index 0000000..01eec5a --- /dev/null +++ b/test/scanners/xml/kate.out.raydebug @@ -0,0 +1,76 @@ +preprocessor(<?xml version="1.0" encoding="UTF-8"?>) +preprocessor(<!DOCTYPE language SYSTEM "language.dtd">) +tag(<language) attribute_name(name)operator(=)string<delimiter(")content(Eiffel)delimiter(")> attribute_name(version)operator(=)string<delimiter(")content(1.02)delimiter(")> attribute_name(kateversion)operator(=)string<delimiter(")content(2.1)delimiter(")> attribute_name(section)operator(=)string<delimiter(")content(Sources)delimiter(")> attribute_name(extensions)operator(=)string<delimiter(")content(*.e)delimiter(")> attribute_name(mimetype)operator(=)string<delimiter(")content(text/x-eiffel-src)delimiter(")>tag(>) + tag(<highlighting>) + tag(<list) attribute_name(name)operator(=)string<delimiter(")content(keywords)delimiter(")>tag(>) + tag(<item>) plain(indexing )tag(</item>) + tag(<item>) plain(class )tag(</item>) + tag(<item>) plain(inherit )tag(</item>) + tag(<item>) plain(creation )tag(</item>) + tag(<item>) plain(feature )tag(</item>) + tag(<item>) plain(rename )tag(</item>) + tag(<item>) plain(redefine )tag(</item>) + tag(<item>) plain(undefine )tag(</item>) + tag(<item>) plain(select )tag(</item>) + tag(<item>) plain(export )tag(</item>) + tag(<item>) plain(local )tag(</item>) + tag(<item>) plain(deferred )tag(</item>) + tag(<item>) plain(do )tag(</item>) + tag(<item>) plain(is )tag(</item>) + tag(<item>) plain(once )tag(</item>) + tag(<item>) plain(alias )tag(</item>) + tag(<item>) plain(external )tag(</item>) + tag(<item>) plain(rescue )tag(</item>) + tag(<item>) plain(debug )tag(</item>) + tag(<item>) plain(if )tag(</item>) + tag(<item>) plain(inspect )tag(</item>) + tag(<item>) plain(from )tag(</item>) + tag(<item>) plain(else )tag(</item>) + tag(<item>) plain(elseif )tag(</item>) + tag(<item>) plain(when )tag(</item>) + tag(<item>) plain(until )tag(</item>) + tag(<item>) plain(loop )tag(</item>) + tag(<item>) plain(then )tag(</item>) + tag(<item>) plain(obsolete )tag(</item>) + tag(<item>) plain(end )tag(</item>) + tag(</list>) + tag(<list) attribute_name(name)operator(=)string<delimiter(")content(assertions)delimiter(")>tag(>) + tag(<item>) plain(check )tag(</item>) + tag(<item>) plain(ensure )tag(</item>) + tag(<item>) plain(require )tag(</item>) + tag(<item>) plain(variant )tag(</item>) + tag(<item>) plain(invariant )tag(</item>) + tag(</list>) + tag(<contexts>) + tag(<context) attribute_name(attribute)operator(=)string<delimiter(")content(Normal Text)delimiter(")> attribute_name(lineEndContext)operator(=)string<delimiter(")content(#stay)delimiter(")> attribute_name(name)operator(=)string<delimiter(")content(Normal)delimiter(")>tag(>) + tag(<keyword) attribute_name(attribute)operator(=)string<delimiter(")content(Keyword)delimiter(")> attribute_name(context)operator(=)string<delimiter(")content(#stay)delimiter(")> attribute_name(String)operator(=)string<delimiter(")content(keywords)delimiter(")>tag(/>) + tag(<Float) attribute_name(attribute)operator(=)string<delimiter(")content(Float)delimiter(")> attribute_name(context)operator(=)string<delimiter(")content(#stay)delimiter(")>tag(/>) + tag(<Int) attribute_name(attribute)operator(=)string<delimiter(")content(Decimal)delimiter(")> attribute_name(context)operator(=)string<delimiter(")content(#stay)delimiter(")>tag(/>) + tag(<RegExpr) attribute_name(attribute)operator(=)string<delimiter(")content(Char)delimiter(")> attribute_name(context)operator(=)string<delimiter(")content(#stay)delimiter(")> attribute_name(String)operator(=)string<delimiter(")content('.')delimiter(")>tag(/>) + tag(<DetectChar) attribute_name(attribute)operator(=)string<delimiter(")content(String)delimiter(")> attribute_name(context)operator(=)string<delimiter(")content(String)delimiter(")> attribute_name(char)operator(=)string<delimiter(")entity(")delimiter(")>tag(/>) + tag(<Detect2Chars) attribute_name(attribute)operator(=)string<delimiter(")content(Comment)delimiter(")> attribute_name(context)operator(=)string<delimiter(")content(Comment)delimiter(")> attribute_name(char)operator(=)string<delimiter(")content(-)delimiter(")> attribute_name(char1)operator(=)string<delimiter(")content(-)delimiter(")>tag(/>) + tag(<keyword) attribute_name(attribute)operator(=)string<delimiter(")content(Assertions)delimiter(")> attribute_name(context)operator(=)string<delimiter(")content(#stay)delimiter(")> attribute_name(String)operator(=)string<delimiter(")content(assertions)delimiter(")>tag(/>) + tag(</context>) + tag(<context) attribute_name(attribute)operator(=)string<delimiter(")content(String)delimiter(")> attribute_name(lineEndContext)operator(=)string<delimiter(")content(#pop)delimiter(")> attribute_name(name)operator(=)string<delimiter(")content(String)delimiter(")>tag(>) + tag(<DetectChar) attribute_name(attribute)operator(=)string<delimiter(")content(String)delimiter(")> attribute_name(context)operator(=)string<delimiter(")content(#pop)delimiter(")> attribute_name(char)operator(=)string<delimiter(")entity(")delimiter(")>tag(/>) + tag(</context>) + tag(<context) attribute_name(attribute)operator(=)string<delimiter(")content(Comment)delimiter(")> attribute_name(name)operator(=)string<delimiter(")content(Comment)delimiter(")> attribute_name(lineEndContext)operator(=)string<delimiter(")content(#pop)delimiter(")>tag(/>) + tag(</contexts>) + tag(<itemDatas>) + tag(<itemData) attribute_name(name)operator(=)string<delimiter(")content(Normal Text)delimiter(")> attribute_name(defStyleNum)operator(=)string<delimiter(")content(dsNormal)delimiter(")> tag(/>) + tag(<itemData) attribute_name(name)operator(=)string<delimiter(")content(Keyword)delimiter(")> attribute_name(defStyleNum)operator(=)string<delimiter(")content(dsKeyword)delimiter(")> tag(/>) + tag(<itemData) attribute_name(name)operator(=)string<delimiter(")content(Decimal)delimiter(")> attribute_name(defStyleNum)operator(=)string<delimiter(")content(dsDecVal)delimiter(")> tag(/>) + tag(<itemData) attribute_name(name)operator(=)string<delimiter(")content(Float)delimiter(")> attribute_name(defStyleNum)operator(=)string<delimiter(")content(dsFloat)delimiter(")> tag(/>) + tag(<itemData) attribute_name(name)operator(=)string<delimiter(")content(Char)delimiter(")> attribute_name(defStyleNum)operator(=)string<delimiter(")content(dsChar)delimiter(")> tag(/>) + tag(<itemData) attribute_name(name)operator(=)string<delimiter(")content(String)delimiter(")> attribute_name(defStyleNum)operator(=)string<delimiter(")content(dsString)delimiter(")> tag(/>) + tag(<itemData) attribute_name(name)operator(=)string<delimiter(")content(Comment)delimiter(")> attribute_name(defStyleNum)operator(=)string<delimiter(")content(dsComment)delimiter(")> tag(/>) + tag(<itemData) attribute_name(name)operator(=)string<delimiter(")content(Assertions)delimiter(")> attribute_name(defStyleNum)operator(=)string<delimiter(")content(dsOthers)delimiter(")> tag(/>) + tag(</itemDatas>) + tag(</highlighting>) + tag(<general>) + tag(<comments>) + tag(<comment) attribute_name(name)operator(=)string<delimiter(")content(singleLine)delimiter(")> attribute_name(start)operator(=)string<delimiter(")content(--)delimiter(")> tag(/>) + tag(</comments>) + tag(<keywords) attribute_name(casesensitive)operator(=)string<delimiter(")content(1)delimiter(")> tag(/>) + tag(</general>) +tag(</language>) diff --git a/test/scanners/xml/suite.rb b/test/scanners/xml/suite.rb new file mode 100644 index 0000000..b135c31 --- /dev/null +++ b/test/scanners/xml/suite.rb @@ -0,0 +1,2 @@ +class XML < CodeRay::TestCase +end |