extract-curves 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. data/Changelog +21 -0
  2. data/bin/ec_rect2polar +22 -0
  3. data/bin/ec_rect2polar.rb +22 -0
  4. data/bin/ec_rev_lines +5 -0
  5. data/bin/ec_rev_lines.rb +5 -0
  6. data/bin/ec_sph_area +30 -0
  7. data/bin/ec_sph_area.rb +30 -0
  8. data/bin/extract_curves +1670 -0
  9. data/bin/extract_curves.rb +1670 -0
  10. data/ruby_ext/pav/cstr.c +82 -0
  11. data/ruby_ext/pav/cstr.h +17 -0
  12. data/ruby_ext/pav/extconf.rb +22 -0
  13. data/ruby_ext/pav/pav.c +162 -0
  14. data/ruby_ext/pav/pgtk.c +40 -0
  15. data/ruby_ext/pav/pgtk.h +14 -0
  16. data/ruby_ext/pav/pix.c +806 -0
  17. data/ruby_ext/pav/pix.h +236 -0
  18. data/ruby_ext/pav/t.rb +35 -0
  19. data/ruby_ext/pav/t1.rb +35 -0
  20. data/ruby_libs/pav/attr_cache.rb +211 -0
  21. data/ruby_libs/pav/attr_cache.t1.rb +32 -0
  22. data/ruby_libs/pav/cache.rb +31 -0
  23. data/ruby_libs/pav/collection/std.rb +58 -0
  24. data/ruby_libs/pav/dbg_log.rb +458 -0
  25. data/ruby_libs/pav/floatsio.rb +53 -0
  26. data/ruby_libs/pav/generator_cache.rb +165 -0
  27. data/ruby_libs/pav/graph/node.rb +602 -0
  28. data/ruby_libs/pav/graph/node_grp.rb +865 -0
  29. data/ruby_libs/pav/gtk.rb +6 -0
  30. data/ruby_libs/pav/gtk/button.rb +118 -0
  31. data/ruby_libs/pav/gtk/dialog.rb +29 -0
  32. data/ruby_libs/pav/gtk/guiobj.rb +772 -0
  33. data/ruby_libs/pav/gtk/icons.rb +124 -0
  34. data/ruby_libs/pav/gtk/rulers.rb +264 -0
  35. data/ruby_libs/pav/gtk/toolbar.rb +189 -0
  36. data/ruby_libs/pav/guiobj.rb +2 -0
  37. data/ruby_libs/pav/guiobj/info_asm.rb +41 -0
  38. data/ruby_libs/pav/guiobj/method.rb +211 -0
  39. data/ruby_libs/pav/guiobj/obj.rb +134 -0
  40. data/ruby_libs/pav/guiobj/signals.rb +9 -0
  41. data/ruby_libs/pav/heap.rb +54 -0
  42. data/ruby_libs/pav/icons/alt_handle.xcf +0 -0
  43. data/ruby_libs/pav/icons/alt_handle.xpm +3832 -0
  44. data/ruby_libs/pav/icons/alt_handle_hover.xcf +0 -0
  45. data/ruby_libs/pav/icons/alt_handle_hover.xpm +3368 -0
  46. data/ruby_libs/pav/icons/alt_handle_pressed.xcf +0 -0
  47. data/ruby_libs/pav/icons/alt_handle_pressed.xpm +3828 -0
  48. data/ruby_libs/pav/icons/blob.gif +0 -0
  49. data/ruby_libs/pav/icons/clover_base.xcf +0 -0
  50. data/ruby_libs/pav/icons/contour.gif +0 -0
  51. data/ruby_libs/pav/icons/contour.xcf +0 -0
  52. data/ruby_libs/pav/icons/contour_carpet.gif +0 -0
  53. data/ruby_libs/pav/icons/contour_carpet.xcf +0 -0
  54. data/ruby_libs/pav/icons/curve.gif +0 -0
  55. data/ruby_libs/pav/icons/curve.xcf +0 -0
  56. data/ruby_libs/pav/icons/curve_carpet.gif +0 -0
  57. data/ruby_libs/pav/icons/curve_carpet.xcf +0 -0
  58. data/ruby_libs/pav/icons/expand_base.xcf +0 -0
  59. data/ruby_libs/pav/icons/expand_closed.xpm +1791 -0
  60. data/ruby_libs/pav/icons/expand_closed_hover.xpm +1775 -0
  61. data/ruby_libs/pav/icons/expand_open.xpm +1788 -0
  62. data/ruby_libs/pav/icons/expand_open_hover.xpm +1752 -0
  63. data/ruby_libs/pav/icons/extract_curves/extract_curves-icon-rgb.ppm +14 -0
  64. data/ruby_libs/pav/icons/extract_curves/extract_curves-logo-rgb.gif +0 -0
  65. data/ruby_libs/pav/icons/extract_curves/extract_curves-logo-rgb.xcf +0 -0
  66. data/ruby_libs/pav/icons/extract_curves/trace_mark.xcf +0 -0
  67. data/ruby_libs/pav/icons/extract_curves/trace_mark.xpm +38 -0
  68. data/ruby_libs/pav/icons/handle.xcf +0 -0
  69. data/ruby_libs/pav/icons/handle.xpm +213 -0
  70. data/ruby_libs/pav/icons/loop.gif +0 -0
  71. data/ruby_libs/pav/icons/loop.xcf +0 -0
  72. data/ruby_libs/pav/icons/loop_carpet.gif +0 -0
  73. data/ruby_libs/pav/icons/loop_carpet.xcf +0 -0
  74. data/ruby_libs/pav/icons/next.xpm +29 -0
  75. data/ruby_libs/pav/icons/next_hover.xpm +315 -0
  76. data/ruby_libs/pav/icons/next_pressed.xpm +144 -0
  77. data/ruby_libs/pav/icons/prev.xpm +29 -0
  78. data/ruby_libs/pav/icons/prev_hover.xpm +315 -0
  79. data/ruby_libs/pav/icons/prev_pressed.xpm +144 -0
  80. data/ruby_libs/pav/icons/shaved-core.gif +0 -0
  81. data/ruby_libs/pav/icons/vnext.xpm +29 -0
  82. data/ruby_libs/pav/icons/vprev.xpm +29 -0
  83. data/ruby_libs/pav/numeric/ext.rb +21 -0
  84. data/ruby_libs/pav/patterns/hsep.gif +0 -0
  85. data/ruby_libs/pav/patterns/tnode.gif +0 -0
  86. data/ruby_libs/pav/patterns/tnode_w_link.gif +0 -0
  87. data/ruby_libs/pav/patterns/vlink.gif +0 -0
  88. data/ruby_libs/pav/patterns/vsep.gif +0 -0
  89. data/ruby_libs/pav/patterns/yg_hrope.xpm +492 -0
  90. data/ruby_libs/pav/patterns/yg_hrope_thick.xpm +1904 -0
  91. data/ruby_libs/pav/patterns/yg_hrope_thin.xpm +130 -0
  92. data/ruby_libs/pav/patterns/yg_tnode.xpm +180 -0
  93. data/ruby_libs/pav/patterns/yg_tnode_thick.xpm +615 -0
  94. data/ruby_libs/pav/patterns/yg_tnode_thin.xpm +55 -0
  95. data/ruby_libs/pav/patterns/yg_tnode_w_link.xpm +190 -0
  96. data/ruby_libs/pav/patterns/yg_tnode_w_link_thick.xpm +676 -0
  97. data/ruby_libs/pav/patterns/yg_tnode_w_link_thin.xpm +62 -0
  98. data/ruby_libs/pav/patterns/yg_vrope.xpm +563 -0
  99. data/ruby_libs/pav/patterns/yg_vrope_thick.xpm +2047 -0
  100. data/ruby_libs/pav/patterns/yg_vrope_thin.xpm +166 -0
  101. data/ruby_libs/pav/pav_find.rb +90 -0
  102. data/ruby_libs/pav/pix.rb +402 -0
  103. data/ruby_libs/pav/pix/aapix.rb +378 -0
  104. data/ruby_libs/pav/pix/blob.rb +678 -0
  105. data/ruby_libs/pav/pix/circle.rb +73 -0
  106. data/ruby_libs/pav/pix/contour.rb +676 -0
  107. data/ruby_libs/pav/pix/contour/calc_situations.rb +9 -0
  108. data/ruby_libs/pav/pix/contour/carp_calc.rb +212 -0
  109. data/ruby_libs/pav/pix/contour/situations.dmp +0 -0
  110. data/ruby_libs/pav/pix/contour/situations.rb +21 -0
  111. data/ruby_libs/pav/pix/curve.rb +1544 -0
  112. data/ruby_libs/pav/pix/img_obj.rb +865 -0
  113. data/ruby_libs/pav/pix/node.rb +159 -0
  114. data/ruby_libs/pav/pix/shaved_core.rb +697 -0
  115. data/ruby_libs/pav/pix/subpix.rb +212 -0
  116. data/ruby_libs/pav/rand_accessible.rb +16 -0
  117. data/ruby_libs/pav/rangeset.rb +63 -0
  118. data/ruby_libs/pav/search.rb +210 -0
  119. data/ruby_libs/pav/set.rb +130 -0
  120. data/ruby_libs/pav/string/bits.rb +523 -0
  121. data/ruby_libs/pav/string/ext.rb +58 -0
  122. data/ruby_libs/pav/string/observable.rb +155 -0
  123. data/ruby_libs/pav/string/text.rb +79 -0
  124. data/ruby_libs/pav/string/words.rb +42 -0
  125. data/ruby_libs/pav/sub_arr.rb +56 -0
  126. data/ruby_libs/pav/traced_obj.rb +79 -0
  127. data/web/index.html +280 -0
  128. data/web/media/icons/alt_handle.xcf +0 -0
  129. data/web/media/icons/alt_handle.xpm +3832 -0
  130. data/web/media/icons/alt_handle_hover.xcf +0 -0
  131. data/web/media/icons/alt_handle_hover.xpm +3368 -0
  132. data/web/media/icons/alt_handle_pressed.xcf +0 -0
  133. data/web/media/icons/alt_handle_pressed.xpm +3828 -0
  134. data/web/media/icons/blob.gif +0 -0
  135. data/web/media/icons/clover_base.xcf +0 -0
  136. data/web/media/icons/contour.gif +0 -0
  137. data/web/media/icons/contour.xcf +0 -0
  138. data/web/media/icons/contour_carpet.gif +0 -0
  139. data/web/media/icons/contour_carpet.xcf +0 -0
  140. data/web/media/icons/curve.gif +0 -0
  141. data/web/media/icons/curve.xcf +0 -0
  142. data/web/media/icons/curve_carpet.gif +0 -0
  143. data/web/media/icons/curve_carpet.xcf +0 -0
  144. data/web/media/icons/expand_base.xcf +0 -0
  145. data/web/media/icons/expand_closed.xpm +1791 -0
  146. data/web/media/icons/expand_closed_hover.xpm +1775 -0
  147. data/web/media/icons/expand_open.xpm +1788 -0
  148. data/web/media/icons/expand_open_hover.xpm +1752 -0
  149. data/web/media/icons/extract_curves/extract_curves-icon-rgb.ppm +14 -0
  150. data/web/media/icons/extract_curves/extract_curves-logo-rgb.gif +0 -0
  151. data/web/media/icons/extract_curves/extract_curves-logo-rgb.xcf +0 -0
  152. data/web/media/icons/extract_curves/trace_mark.xcf +0 -0
  153. data/web/media/icons/extract_curves/trace_mark.xpm +38 -0
  154. data/web/media/icons/handle.xcf +0 -0
  155. data/web/media/icons/handle.xpm +213 -0
  156. data/web/media/icons/loop.gif +0 -0
  157. data/web/media/icons/loop.xcf +0 -0
  158. data/web/media/icons/loop_carpet.gif +0 -0
  159. data/web/media/icons/loop_carpet.xcf +0 -0
  160. data/web/media/icons/next.xpm +29 -0
  161. data/web/media/icons/next_hover.xpm +315 -0
  162. data/web/media/icons/next_pressed.xpm +144 -0
  163. data/web/media/icons/prev.xpm +29 -0
  164. data/web/media/icons/prev_hover.xpm +315 -0
  165. data/web/media/icons/prev_pressed.xpm +144 -0
  166. data/web/media/icons/shaved-core.gif +0 -0
  167. data/web/media/icons/vnext.xpm +29 -0
  168. data/web/media/icons/vprev.xpm +29 -0
  169. data/web/media/title.jpeg +0 -0
  170. data/web/media/title.xcf +0 -0
  171. data/web/stylesheets/default.css +20 -0
  172. metadata +229 -0
@@ -0,0 +1,32 @@
1
+ require 'pav/attr_cache'
2
+
3
+ class C
4
+ include AttrCache
5
+
6
+ def f(x)
7
+ x
8
+ end
9
+
10
+ cache_attr! :f
11
+ end
12
+
13
+ a = C.new
14
+ b = C.new
15
+ p a.f("a")
16
+ p b.f("b")
17
+ c = C.new
18
+ d = C.new
19
+ p c.f("c")
20
+ p a.f(1)
21
+ p b.f(2)
22
+ p c.f(3)
23
+ p d.uncache_attr!(:f)
24
+ a.uncache_attr!(:f)
25
+ p a.f(0)
26
+ p a.f(1)
27
+ p a.cache_attr!(:f)
28
+ p a.f(2)
29
+ p a.f(3)
30
+ p a.kill_attr_cache!(:f)
31
+ p a.f(4)
32
+ p a.f(5)
@@ -0,0 +1,31 @@
1
+ #begin
2
+ require 'pav/pav'
3
+ #rescue LoadError
4
+
5
+ require 'weakref'
6
+
7
+ class PCache
8
+ attr_reader :tbl, :args
9
+
10
+ def initialize(*args)
11
+ @args = args
12
+ #@tbl = WeakRef.new(Hash.new(*@args))
13
+ end
14
+
15
+ def method_missing(id, *args)
16
+ return @args[0]
17
+ gc_dis = GC.disable
18
+ unless @tbl.weakref_alive?
19
+ @tbl = WeakRef.new(Hash.new(*@args))
20
+ end
21
+ begin
22
+ res = @tbl.send(id, *args)
23
+ rescue WeakRef::RefError
24
+ res = @args[0]
25
+ end
26
+ GC.enable unless gc_dis
27
+ res
28
+ end
29
+ end
30
+
31
+ #end # require 'pav/pav'
@@ -0,0 +1,58 @@
1
+ # Ensure Collection < Map < | Array
2
+ # | Hash
3
+
4
+ module Collection
5
+ end
6
+
7
+ module Map # (key, value) pairs
8
+ include Collection
9
+ end
10
+
11
+ module PCollEnumerable
12
+ def detect_value
13
+ self.each_value { |val|
14
+ if (res = yield(val))
15
+ return val
16
+ end
17
+ }
18
+ nil
19
+ end
20
+
21
+ def detect_key
22
+ self.each_key { |key|
23
+ if (res = yield(key))
24
+ return key
25
+ end
26
+ }
27
+ nil
28
+ end
29
+
30
+ alias_method :find_value, :detect_value
31
+ alias_method :find_key, :detect_key
32
+ end
33
+
34
+ class Array
35
+ include Map
36
+ include PCollEnumerable
37
+
38
+ def each_key_value
39
+ self.each_with_index { |lm, i| yield(i, lm) }
40
+ end
41
+
42
+ def keys_to_a
43
+ (0...self.length).to_a
44
+ end
45
+
46
+ alias_method :each_value, :each
47
+ alias_method :each_key, :each_index
48
+ alias_method :delete_key, :delete_at
49
+ end
50
+
51
+ class Hash
52
+ include Map
53
+ include PCollEnumerable
54
+
55
+ alias_method :each_key_value, :each_pair
56
+ alias_method :delete_key, :delete
57
+ alias_method :keys_to_a, :keys
58
+ end
@@ -0,0 +1,458 @@
1
+ require 'logger'
2
+
3
+ class PLogProgrBar
4
+ attr_reader :pdbglog, :progr_units, :total_progr_units, :show_as,
5
+ :fmt_str
6
+
7
+ def initialize(pdbglog)
8
+ @pdbglog = pdbglog
9
+ @total_progr_units = nil
10
+ @progr_units = 0
11
+ @show_as = "%"
12
+ end
13
+
14
+ def incr(progr_units=1)
15
+ @progr_units += progr_units
16
+ self.disp_progr(progr_units)
17
+ end
18
+
19
+ def progr_units=(val)
20
+ change = val - @progr_units
21
+ @progr_units = val
22
+ self.disp_progr(change)
23
+ end
24
+
25
+ def total_progr_units=(val)
26
+ @total_progr_units = val
27
+ @fmt_str = val > 0 ? "%.#{[Math.log10(val).ceil - 2, 0].max}f" :
28
+ "%f"
29
+ end
30
+
31
+ def show_as=(spec)
32
+ if !["%", "/"].include?(spec[0,1])
33
+ raise ArgumentError, "spec start with \"%\" or \"/\""
34
+ end
35
+ @show_as = spec
36
+ end
37
+
38
+ def finish
39
+ end
40
+ end
41
+
42
+ class PLogTextProgrBar < PLogProgrBar
43
+ ROT_LN_CHARS = ["-", "\\", "|", "/"]
44
+ BUBBLE_CHARS = [".", "o", "0", "O", "0", "o"]
45
+ attr_reader :progr_char_i, :bs_len
46
+ attr_accessor :progr_rot_chars, :progr_mark, :neg_progr_rot_chars,
47
+ :neg_progr_mark
48
+
49
+ def initialize(pdbglog)
50
+ super(pdbglog)
51
+ @progr_char_i = 0
52
+ @progr_rot_chars = ROT_LN_CHARS
53
+ @neg_progr_rot_chars = BUBBLE_CHARS
54
+ @progr_mark = "."
55
+ @neg_progr_mark = "!"
56
+ @bs_len = 0
57
+ end
58
+
59
+ def undisp_progr
60
+ self.pdbglog.print_progr(self.pdbglog.backspc * @bs_len, 2)
61
+ @bs_len = 0
62
+ end
63
+
64
+ def disp_progr(progr_units_change)
65
+ if self.total_progr_units
66
+ if self.pdbglog.outp.tty? && self.pdbglog.had_progr
67
+ str = self.pdbglog.backspc * @bs_len
68
+ elsif self.pdbglog.had_progr
69
+ str = " "
70
+ else
71
+ str = ""
72
+ end
73
+ if self.show_as[0,1] == "%"
74
+ pct = self.fmt_str % (100.0*self.progr_units /
75
+ self.total_progr_units)
76
+ else
77
+ pct = "#{self.progr_units}/#{
78
+ self.total_progr_units}"
79
+ end
80
+ pct += self.show_as[1, self.show_as.length-1]
81
+ @bs_len = pct.length
82
+ str += pct
83
+ elsif self.show_as == "%"
84
+ if progr_units_change > 0
85
+ chars = @progr_rot_chars; mark = @progr_mark
86
+ elsif progr_units_change < 0
87
+ chars = @neg_progr_rot_chars
88
+ mark = @neg_progr_mark
89
+ end
90
+ if self.pdbglog.outp.tty?
91
+ new_char_i = (@progr_char_i+progr_units_change)%
92
+ chars.length
93
+ if new_char_i == @progr_char_i
94
+ new_char_i = (new_char_i+1)%chars.length
95
+ end
96
+ if self.pdbglog.had_progr
97
+ str = self.pdbglog.backspc * @bs_len
98
+ else
99
+ str = ""
100
+ end
101
+ str += chars[new_char_i] +
102
+ self.show_as[1, self.show_as.length-1]
103
+ @progr_char_i = new_char_i
104
+ @bs_len = chars[new_char_i].length +
105
+ self.show_as.length-1
106
+ else
107
+ str = ""
108
+ str += mark*(progr_units_change/mark.length) +
109
+ mark[0, progr_units_change%mark.length]+
110
+ self.show_as[1, self.show_as.length-1]
111
+ end
112
+ else
113
+ if self.pdbglog.outp.tty? && self.pdbglog.had_progr
114
+ str = self.pdbglog.backspc * @bs_len
115
+ else
116
+ str = ""
117
+ end
118
+ pct = "#{self.progr_units}" +
119
+ self.show_as[1, self.show_as.length-1]
120
+ @bs_len = pct.length
121
+ str += pct
122
+ end
123
+ self.pdbglog.print_progr(str, 2)
124
+ end
125
+ end
126
+
127
+ class PDbgLog
128
+ PARSE_BT_PAT = Regexp.compile(
129
+ /^([^:]*):([0-9]*)(?:[:]in `([a-zA-Z0-9_!?=]*)'|)/)
130
+
131
+ def self.parse_bt_lm(str)
132
+ m = PARSE_BT_PAT.match(str)
133
+ m ? m[1, m.length-1] : []
134
+ end
135
+
136
+ attr_reader :outp, :indent, :trace, :had_lf, :traced_call_levs
137
+ attr_accessor :outp_ln_num, :msg_indent, :func_indent, :logger_severity,
138
+ :auto_lf, :class_pfx, :fmt_indent, :indent_omit_levs_cnt,
139
+ :fmt_func_pfx, :backspc, :progr_class, :progr_init_args,
140
+ :had_progr, :auto_had_progr
141
+
142
+ def outp=(outp_spec)
143
+ if outp_spec.kind_of?(String)
144
+ @outp = open(outp_spec, "w")
145
+ else
146
+ @outp = outp_spec
147
+ end
148
+ end
149
+
150
+ def initialize(outp_spec=$stderr, fmt_indent_func=nil, &fmt_func_pfx)
151
+ self.outp = outp_spec
152
+ if fmt_indent_func
153
+ @fmt_indent = fmt_indent_func
154
+ else
155
+ @fmt_indent = proc { |stack_lev|
156
+ if stack_lev < @indent_omit_levs_cnt
157
+ ""
158
+ elsif stack_lev - @indent_omit_levs_cnt < 5
159
+ (@func_indent + @msg_indent) *
160
+ (stack_lev - @indent_omit_levs_cnt)
161
+ else
162
+ " >lev %3d-- " % stack_lev
163
+ end
164
+ }
165
+ end
166
+ if block_given?
167
+ @fmt_func_pfx = fmt_func_pfx
168
+ else
169
+ @fmt_func_pfx = proc { |bt_lm, first_entry|
170
+ file, ln, meth = *PDbgLog.parse_bt_lm(bt_lm)
171
+ meth = "<unknown/main>" unless meth
172
+ if @outp_ln_num && ln
173
+ @class_pfx + meth + ":#{ln}: "
174
+ else
175
+ @class_pfx + meth + ": "
176
+ end
177
+ }
178
+ end
179
+ @outp_ln_num = outp_ln_num
180
+ @trace = false
181
+ @indent = true
182
+ @msg_indent = " "
183
+ @func_indent = " "
184
+ @indent_omit_levs_cnt = 0
185
+ @call_lev = 0
186
+ @traced_call_levs = [nil]
187
+ @bt_skip_levs_stack = [[nil, 1], [nil, 1]]
188
+ @logger_severity = Logger::DEBUG
189
+ @msg = ""
190
+ @auto_lf = true
191
+ @had_lf = true
192
+ @class_pfx = ""
193
+ @class_pfx_stack = [""]
194
+ ObjectSpace.define_finalizer(self) {
195
+ self.print(@msg[-1,1]=="\n" ? "":"\n") if @msg.length>0
196
+ }
197
+ @reentry = false
198
+ @backspc = "\b"
199
+ @progr_levs = [[nil, nil]]
200
+ @had_progr = false
201
+ @auto_had_progr = true
202
+ @progr_class = PLogTextProgrBar
203
+ @progr_init_args = []
204
+ end
205
+
206
+ def install_tracer
207
+ set_trace_func(proc{|event, file, line, id, binding, klass, *|
208
+ if event == "call"
209
+ obj = ObjectSpace._id2ref(id)
210
+ @class_pfx = klass + (obj.kind_of?(Class) ||
211
+ obj.kind_of?(Module) ? "#" : ".")
212
+ if @bt_skip_levs_stack.last[1] != 1 ||
213
+ @bt_skip_levs_stack[-2][1] != 1
214
+ @bt_skip_levs_stack.push([@call_lev, 1])
215
+ end
216
+ @call_lev += 1
217
+ elsif event == "return"
218
+ obj = ObjectSpace._id2ref(id)
219
+ @class_pfx = klass + (obj.kind_of?(Class) ||
220
+ obj.kind_of?(Module) ? "#" : ".")
221
+ if @call_lev == @traced_call_levs.last
222
+ @traced_call_levs.pop
223
+ if @auto_lf && !@had_lf
224
+ @msg += "\n"; @had_lf = true
225
+ end
226
+ @reentry = true
227
+ end
228
+ if @bt_skip_levs_stack.last[0] == @call_lev
229
+ @bt_skip_levs_stack.pop
230
+ end
231
+ self.finish_progr
232
+ @call_lev -= 1
233
+ end
234
+ })
235
+ end
236
+
237
+ def indent=(flag)
238
+ return if flag == @indent
239
+ if flag
240
+ @call_lev = 0
241
+ self.install_tracer if @trace
242
+ else
243
+ set_trace_func(nil)
244
+ end
245
+ @indent = flag
246
+ end
247
+
248
+ def trace=(flag)
249
+ return if flag == @trace
250
+ if flag
251
+ self.install_tracer if @indent
252
+ else
253
+ set_trace_func(nil)
254
+ end
255
+ @trace = flag
256
+ end
257
+
258
+ def progr
259
+ @progr_levs.last[1]
260
+ end
261
+
262
+ def write(str)
263
+ @msg += str
264
+ if @outp.kind_of?(IO)
265
+ @outp.write(@msg)
266
+ @had_lf = (@msg[-1,1] == "\n") if @msg.length > 0
267
+ elsif @outp.kind_of?(Logger)
268
+ @outp.add(@logger_severity, @msg)
269
+ @had_lf = true
270
+ end
271
+ @msg = ""
272
+ end
273
+
274
+ def print(str)
275
+ @msg += str
276
+ if @outp.kind_of?(IO)
277
+ @outp.print(@msg)
278
+ @had_lf = (@msg[-1, 1] == "\n") if @msg.length > 0
279
+ @msg = ""
280
+ elsif @outp.kind_of?(Logger)
281
+ res_msg = ""
282
+ @had_lf = true
283
+ @msg.each_line { |ln|
284
+ if !ln[-1, 1] == "\n"
285
+ res_msg = ln
286
+ @had_lf = false
287
+ break
288
+ end
289
+ @outp.add(@logger_severity, ln.chop!)
290
+ }
291
+ @msg = res_msg
292
+ end
293
+ end
294
+
295
+ def puts(str)
296
+ if @outp.kind_of?(IO)
297
+ @outp.puts(@msg + str)
298
+ elsif @outp.kind_of?(Logger)
299
+ (@msg + str + "\n").each_line { |ln|
300
+ @outp.add(@logger_severity, ln.chop!)
301
+ }
302
+ end
303
+ @msg = ""
304
+ @had_lf = true
305
+ end
306
+
307
+ def mk_indent_str(call_bt_lm)
308
+ if @call_lev != @traced_call_levs.last
309
+ @traced_call_levs.push(@call_lev)
310
+ if @indent
311
+ @class_pfx = @class_pfx_stack.last unless @trace
312
+ @class_pfx = "" unless @class_pfx
313
+ indent_str = @fmt_indent.call(
314
+ @traced_call_levs.length - 1) +
315
+ @fmt_func_pfx.call(call_bt_lm, true)
316
+ else
317
+ indent_str = ""
318
+ end
319
+ if @auto_lf && !@had_lf
320
+ @msg += "\n"; @had_lf = true
321
+ end
322
+ else
323
+ if @indent
324
+ indent_str = @fmt_indent.call(
325
+ @traced_call_levs.length - 1) +
326
+ @msg_indent
327
+ if @reentry
328
+ @class_pfx=@class_pfx_stack.last unless
329
+ @trace
330
+ @class_pfx = "" unless @class_pfx
331
+ indent_str += @fmt_func_pfx.call(
332
+ call_bt_lm, false)
333
+ end
334
+ else
335
+ indent_str = ""
336
+ end
337
+ end
338
+ @reentry = false
339
+ indent_str
340
+ end
341
+
342
+ def print_msg(str)
343
+ str = str.to_s unless str.kind_of?(String)
344
+ indent_str=self.mk_indent_str(caller(
345
+ @bt_skip_levs_stack[-2][1])[0])
346
+ if indent_str.length > 0
347
+ if !@had_lf
348
+ ind = ""
349
+ str.each_line { |ln| self.print(ind + ln)
350
+ ind = indent_str }
351
+ else
352
+ str.each_line {|ln| self.print(indent_str + ln)}
353
+ end
354
+ else
355
+ self.print(str)
356
+ end
357
+ @had_progr = false if @auto_had_progr
358
+ end
359
+
360
+ def puts_msg(str)
361
+ str = str.to_s unless str.kind_of?(String)
362
+ indent_str=self.mk_indent_str(caller(
363
+ @bt_skip_levs_stack[-2][1])[0])
364
+ if indent_str.length > 0
365
+ if !@had_lf
366
+ ind = ""
367
+ (str + "\n").each_line { |ln|
368
+ self.print(ind + ln); ind = indent_str }
369
+ else
370
+ (str + "\n").each_line { |ln|
371
+ self.print(indent_str + ln) }
372
+ end
373
+ else
374
+ self.puts(str)
375
+ end
376
+ @had_progr = false if @auto_had_progr
377
+ end
378
+
379
+ def print_progr(str, extra_bt_levs=1)
380
+ str = str.to_s unless str.kind_of?(String)
381
+ indent_str=self.mk_indent_str(caller(
382
+ @bt_skip_levs_stack[-2][1] + extra_bt_levs)[0])
383
+ if indent_str.length > 0
384
+ if !@had_lf
385
+ ind = ""
386
+ str.each_line { |ln| self.print(ind + ln)
387
+ ind = indent_str }
388
+ else
389
+ str.each_line {|ln| self.print(indent_str + ln)}
390
+ end
391
+ else
392
+ self.print(str)
393
+ end
394
+ @had_progr = true if @auto_had_progr
395
+ end
396
+
397
+ def sig_wrapped_call
398
+ @bt_skip_levs_stack.last[1] += 1
399
+ end
400
+
401
+ def sig_wrapped_return
402
+ @bt_skip_levs_stack.last[1] -= 1 if
403
+ @bt_skip_levs_stack.last[1] > 1
404
+ end
405
+
406
+ def sig_call(class_pfx="")
407
+ return if @trace && @indent
408
+ if class_pfx.kind_of?(String)
409
+ @class_pfx = class_pfx
410
+ elsif class_pfx.kind_of?(Class) || class_pfx.kind_of?(Module)
411
+ @class_pfx = class_pfx.name + "#"
412
+ else
413
+ @class_pfx = class_pfx.class.name + "."
414
+ end
415
+ @class_pfx_stack.push(@class_pfx)
416
+ @call_lev += 1
417
+ if @bt_skip_levs_stack.last[1] != 1 ||
418
+ @bt_skip_levs_stack[-2][1] != 1
419
+ @bt_skip_levs_stack.push([@call_lev, 1])
420
+ end
421
+ end
422
+
423
+ def sig_return(msg="")
424
+ if (msg = msg.to_s).length > 0
425
+ @bt_skip_levs_stack[-2][1] += 1
426
+ self.print_msg(msg)
427
+ @bt_skip_levs_stack[-2][1] -= 1
428
+ end
429
+ return if @trace && @indent
430
+ if @call_lev == @traced_call_levs.last
431
+ @traced_call_levs.pop
432
+ if @auto_lf && !@had_lf
433
+ @msg += "\n"; @had_lf = true
434
+ end
435
+ @reentry = true
436
+ end
437
+ if @bt_skip_levs_stack.last[0] == @call_lev
438
+ @bt_skip_levs_stack.pop
439
+ end
440
+ self.finish_progr
441
+ @class_pfx_stack.pop
442
+ @call_lev -= 1
443
+ end
444
+
445
+ def new_progr
446
+ @progr_levs.push([@call_lev,
447
+ @progr_class.new(*[self].concat(@progr_init_args))])
448
+ end
449
+
450
+ def finish_progr
451
+ if @call_lev == @progr_levs.last[0]
452
+ @progr_levs.pop[1].finish
453
+ @had_progr = false if @auto_had_progr
454
+ end
455
+ end
456
+ end
457
+
458
+ $PDbgLog = PDbgLog.new