rwdtinker 1.67 → 1.68

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 (118) hide show
  1. data/Readme.txt +3 -0
  2. data/bin/rwdtinker +0 -0
  3. data/code/01rwdcore/01rwdcore.rb +0 -0
  4. data/code/01rwdcore/02helptexthashbegin.rb +0 -0
  5. data/code/01rwdcore/03helptexthash.rb +0 -0
  6. data/code/01rwdcore/04helptextend.rb +0 -0
  7. data/code/01rwdcore/jumplinkcommand.rb +0 -0
  8. data/code/01rwdcore/openhelpwindow.rb +0 -0
  9. data/code/01rwdcore/returntomain.rb +0 -0
  10. data/code/01rwdcore/rundocuments.rb +0 -0
  11. data/code/01rwdcore/runeditconfiguration.rb +0 -0
  12. data/code/01rwdcore/runhelpabout.rb +0 -0
  13. data/code/01rwdcore/runopentinkerdocument.rb +0 -0
  14. data/code/01rwdcore/rwdtinkerversion.rb +0 -0
  15. data/code/01rwdcore/rwdwindowreturn.rb +0 -0
  16. data/code/01rwdcore/selectiontab.rb +0 -0
  17. data/code/01rwdcore/setuphelpaboutoptions.rb +0 -0
  18. data/code/01rwdcore/setuptinkerdocuments.rb +0 -0
  19. data/code/01rwdcore/test_cases.rb +0 -0
  20. data/code/01rwdcore/test_harness.rb +0 -0
  21. data/code/01rwdcore/uploadreturns.rb +0 -0
  22. data/code/dd0viewphoto/dd0viewphoto.rb +0 -0
  23. data/code/superant.com.rwdtinkerbackwindow/controlclient.rb +0 -0
  24. data/code/superant.com.rwdtinkerbackwindow/diagnostictab.rb +0 -0
  25. data/code/superant.com.rwdtinkerbackwindow/helptexthashtinkerwin2.rb +0 -0
  26. data/code/superant.com.rwdtinkerbackwindow/installapplet.rb +0 -0
  27. data/code/superant.com.rwdtinkerbackwindow/installgemapplet.rb +0 -0
  28. data/code/superant.com.rwdtinkerbackwindow/installremotegem.rb +0 -0
  29. data/code/superant.com.rwdtinkerbackwindow/listgemdirs.rb +0 -0
  30. data/code/superant.com.rwdtinkerbackwindow/listgemzips.rb +0 -0
  31. data/code/superant.com.rwdtinkerbackwindow/listinstalledfiles.rb +0 -0
  32. data/code/superant.com.rwdtinkerbackwindow/listzips.rb +0 -0
  33. data/code/superant.com.rwdtinkerbackwindow/loadconfigurationrecord.rb +0 -0
  34. data/code/superant.com.rwdtinkerbackwindow/loadconfigurationvariables.rb +0 -0
  35. data/code/superant.com.rwdtinkerbackwindow/network.rb +0 -0
  36. data/code/superant.com.rwdtinkerbackwindow/openappletname.rb +0 -0
  37. data/code/superant.com.rwdtinkerbackwindow/openhelpwindowtinkerwin2.rb +0 -0
  38. data/code/superant.com.rwdtinkerbackwindow/remotegemlist.rb +0 -0
  39. data/code/superant.com.rwdtinkerbackwindow/removeapplet.rb +0 -0
  40. data/code/superant.com.rwdtinkerbackwindow/runremoteinstall.rb +0 -0
  41. data/code/superant.com.rwdtinkerbackwindow/runrwdtinkerbackwindow.rb +0 -0
  42. data/code/superant.com.rwdtinkerbackwindow/rwdtinkerwin2version.rb +0 -0
  43. data/code/superant.com.rwdtinkerbackwindow/saveconfigurationrecord.rb +0 -0
  44. data/code/superant.com.rwdtinkerbackwindow/viewappletcontents.rb +0 -0
  45. data/code/superant.com.rwdtinkerbackwindow/viewgemappletcontents.rb +0 -0
  46. data/code/zz0applicationend/zz0end.rb +0 -0
  47. data/configuration/language.dist +0 -0
  48. data/configuration/rwdapplicationidentity.dist +0 -0
  49. data/configuration/rwdtinker.dist +2 -2
  50. data/configuration/tinkerwin2variables.dist +0 -0
  51. data/ev/browser.rb +24 -10
  52. data/ev/ftools.rb +23 -19
  53. data/ev/mime.rb +328 -0
  54. data/ev/net.rb +154 -38
  55. data/ev/ruby.rb +96 -26
  56. data/ev/rwd.rb +162 -89
  57. data/ev/sgml.rb +1 -1
  58. data/ev/thread.rb +0 -0
  59. data/ev/tree.rb +33 -5
  60. data/ev/xml.rb +97 -0
  61. data/extras/rconftool.rb +0 -0
  62. data/extras/zip/ioextras.rb +0 -0
  63. data/extras/zip/stdrubyext.rb +0 -0
  64. data/extras/zip/tempfile_bugfixed.rb +0 -0
  65. data/extras/zip/zip.rb +0 -0
  66. data/extras/zip/zipfilesystem.rb +0 -0
  67. data/extras/zip/ziprequire.rb +0 -0
  68. data/gui/00coreguibegin/applicationguitop.rwd +0 -0
  69. data/gui/frontwindow0/viewlogo/cc0openphoto.rwd +0 -0
  70. data/gui/frontwindowselectionbegin/selectiontabbegin/00selectiontabbegin.rwd +0 -0
  71. data/gui/frontwindowselections/superant.com.rwdtinkerwin2selectiontab/jumplinkcommands.rwd +0 -0
  72. data/gui/frontwindowselectionzend/viewselectionzend/wwselectionend.rwd +0 -0
  73. data/gui/frontwindowselectionzend/viewselectionzend/zzdocumentbegin.rwd +0 -0
  74. data/gui/frontwindowtdocuments/superant.com.documents/tinkerdocuments.rwd +0 -0
  75. data/gui/helpaboutbegin/superant.com.helpaboutbegin/zzdocumentend.rwd +0 -0
  76. data/gui/helpaboutbegin/superant.com.helpaboutbegin/zzzrwdlasttab.rwd +0 -0
  77. data/gui/helpaboutbegin/superant.com.helpaboutbegin/zzzzhelpscreenstart.rwd +0 -0
  78. data/gui/helpaboutinstalled/superant.com.tinkerhelpabout/helpabouttab.rwd +0 -0
  79. data/gui/helpaboutzend/superant.com.helpaboutend/helpscreenend.rwd +0 -0
  80. data/gui/helpaboutzend/superant.com.helpaboutend/zhelpscreenstart2.rwd +0 -0
  81. data/gui/helpaboutzend/superant.com.helpaboutend/zzzzhelpabout2.rwd +0 -0
  82. data/gui/helpaboutzend/superant.com.helpaboutend/zzzzhelpscreen2end.rwd +0 -0
  83. data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/1appname.rwd +0 -0
  84. data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/40rwdlistzips.rwd +0 -0
  85. data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/45installremotezip.rwd +0 -0
  86. data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/50rwdlistapplets.rwd +0 -0
  87. data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/60editconfiguration.rwd +0 -0
  88. data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/70rwddiagnostics.rwd +0 -0
  89. data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/75rwdcontrol.rwd +0 -0
  90. data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/81jumplinkcommands.rwd +0 -0
  91. data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/9backend.rwd +0 -0
  92. data/gui/tinkerbackwindows/superant.com.tinkerhelpwindow/1appname.rwd +0 -0
  93. data/gui/tinkerbackwindows/superant.com.tinkerhelpwindow/9end.rwd +0 -0
  94. data/gui/tinkerbackwindows/superant.com.versionwindow/1appname.rwd +0 -0
  95. data/gui/tinkerbackwindows/superant.com.versionwindow/helpaboutwindow.rwd +0 -0
  96. data/gui/zzcoreguiend/tinkerapplicationguiend/yy9rwdend.rwd +0 -0
  97. data/init.rb +0 -0
  98. data/lang/en/rwdcore/languagefile.rb +0 -0
  99. data/lang/es/rwdcore/languagefile-es.rb +0 -0
  100. data/lang/jp/rwdcore/languagefile.rb +0 -0
  101. data/lang/nl/rwdcore/languagefile.rb +0 -0
  102. data/lib/temp.rb +0 -0
  103. data/rwd_files/HowTo_Tinker.txt +3 -0
  104. data/rwd_files/HowTo_TinkerWin2.txt +0 -0
  105. data/rwd_files/Readme.txt +0 -0
  106. data/rwd_files/RubyWebDialogs.html +0 -0
  107. data/rwd_files/favicon.ico +0 -0
  108. data/rwd_files/rdoc-style.css +0 -0
  109. data/rwd_files/rwdapplications.html +0 -0
  110. data/rwd_files/tinker.png +0 -0
  111. data/rwdconfig.dist +1 -1
  112. data/tests/checkdepends.sh +0 -0
  113. data/tests/cleancnf.sh +0 -0
  114. data/tests/makedist.rb +0 -0
  115. data/tests/rdep.rb +0 -0
  116. data/tests/totranslate.lang +0 -0
  117. metadata +170 -156
  118. data/zips/rwdahelloworld-0.5.zip +0 -0
data/ev/net.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require "ev/ruby"
2
2
  require "ev/ftools"
3
+ require "ev/mime"
3
4
  require "net/http"
4
5
  require "socket"
5
6
  require "uri"
@@ -13,11 +14,11 @@ file = "#{home}/.evnet"
13
14
  if File.file?(file)
14
15
  Hash.file(file).each do |k, v|
15
16
  eval "$#{k} = '#{v}'" unless k=~ /^\#/
16
- #$proxy_auth = [$proxy_auth].pack("m").chomp if k == "proxy_auth"
17
17
  end
18
18
  end
19
19
 
20
20
  def uri2txt(s)
21
+ # ??? Werkt niet goed
21
22
  i = s.index(/%[[:digit:]]{2}/)
22
23
  while not i.nil?
23
24
  s = s[0..(i-1)] + s[(i+1)..(i+2)].unpack('H2').shift.to_i.chr + s[(i+3)..-1]
@@ -147,6 +148,8 @@ class EVURI
147
148
  rescue
148
149
  end
149
150
 
151
+ @path = "/" if (not @path.nil? and @path.empty? and @protocol == "http")
152
+
150
153
  @protocol = "" if @protocol.nil?
151
154
  @userpass = "" if @userpass.nil?
152
155
  @host = "" if @host.nil?
@@ -163,7 +166,7 @@ class EVURI
163
166
  @port = @port.to_i
164
167
  end
165
168
 
166
- def + (url2)
169
+ def +(url2)
167
170
  url1 = self.to_s
168
171
  url2 = url2.to_s if url2.kind_of?(self.class)
169
172
 
@@ -174,7 +177,7 @@ class EVURI
174
177
  protocol = @protocol
175
178
  userpass = @userpass
176
179
  host = @host
177
- port = @port.to_s
180
+ port = @port
178
181
  path = @path
179
182
  vars = varstring
180
183
  anchor = @anchor
@@ -196,6 +199,33 @@ class EVURI
196
199
  return res
197
200
  end
198
201
 
202
+ def localname
203
+ protocol = @protocol
204
+ userpass = @userpass
205
+ host = @host
206
+ port = @port
207
+ path = @path
208
+ vars = varstring
209
+ anchor = @anchor
210
+
211
+ protocol = nil if @protocol.empty?
212
+ userpass = nil if @userpass.empty?
213
+ host = nil if @host.empty?
214
+ port = nil if @port.zero?
215
+ path = nil if @path.empty?
216
+ vars = nil if @vars.empty?
217
+ anchor = nil if @anchor.empty?
218
+
219
+ path = "#{path}." if path =~ /[\/\\]$/
220
+
221
+ f = MD5.new(protocol.to_s + userpass.to_s + host.to_s + port.to_s + File.dirname(path.to_s) + vars.to_s).to_s
222
+ e = File.basename(path.to_s).gsub(/[^\w\.\-]/, "_").gsub(/_+/, "_")
223
+ res = f + "." + e
224
+ res.gsub!(/[^\w]+$/, "")
225
+
226
+ return res
227
+ end
228
+
199
229
  def varstring
200
230
  res = []
201
231
  vars = @vars.dup
@@ -281,36 +311,52 @@ class HTTPClient
281
311
  end
282
312
  end
283
313
 
314
+ class NoAddressException < StandardError
315
+ end
316
+
317
+ def self.getaddress(host)
318
+ if not @@hosts.include?(host)
319
+ @@hosts[host] = ""
320
+ evtimeout(5) do # ??? Doet 'ut niet?...
321
+ @@hosts[host] = IPSocket.getaddress(host)
322
+ end
323
+ end
324
+
325
+ raise NoAddressException, host if @@hosts[host].empty?
326
+
327
+ @@hosts[host]
328
+ end
329
+
284
330
  def self.head(uri, form={}, recursive=true)
285
331
  header = Header.new(nil)
286
332
 
287
333
  begin
288
334
  while not uri.nil?
289
- if $proxy.nil? or $proxy.empty?
290
- uri = EVURI.new(uri) if uri.kind_of? String
291
- host = uri.host
292
- port = uri.port
335
+ uri = EVURI.new(uri) if uri.kind_of? String
336
+ host = uri.host
337
+ port = uri.port
338
+
339
+ if $proxy.nil? or $proxy.empty? or host == "localhost"
293
340
  io = nil
294
341
 
295
342
  @@mutex.synchronize do
296
- @@hosts[host] = IPSocket.getaddress(host) if not @@hosts.include?(host)
297
- io = TCPSocket.new(@@hosts[host], port.zero? ? 80 : port)
343
+ io = TCPSocket.new(getaddress(host), port.zero? ? 80 : port)
298
344
  end
299
345
 
300
346
  io.write("HEAD #{uri.path or '/'}#{uri.varstring.empty? ? '' : '?' + uri.varstring} HTTP/1.0\r\nHost: #{host}\r\n\r\n")
301
347
  else
302
348
  proxy = EVURI.new($proxy)
303
- host = proxy.host
304
- port = proxy.port
305
-
306
- io = TCPSocket.new(host, port.zero? ? 8080 : port)
349
+ io = TCPSocket.new(proxy.host, proxy.port.zero? ? 8080 : proxy.port)
307
350
 
308
351
  io.write("HEAD #{uri} HTTP/1.0\r\n#{"Proxy-Authorization: Basic "+$proxy_auth+"\r\n" if not $proxy_auth.nil?}\r\n\r\n")
309
352
  end
310
353
 
311
354
  io.close_write
312
355
 
313
- res = io.read
356
+ res = io.read
357
+
358
+ io.close_read
359
+
314
360
  header, data = nil, nil
315
361
  header, data = res.split(/\r*\n\r*\n/, 2) if not res.nil?
316
362
  header = Header.new(header)
@@ -321,14 +367,23 @@ class HTTPClient
321
367
  uri = nil
322
368
  end
323
369
  end
324
- rescue
370
+ rescue Errno::ECONNRESET, Errno::EHOSTUNREACH => e
371
+ $stderr.puts e.message
372
+ sleep 1
373
+ retry
374
+ rescue Errno::ECONNREFUSED => e
375
+ data = nil
376
+ rescue NoAddressException => e
377
+ $stderr.puts e.message
325
378
  header = Header.new(nil)
326
379
  end
327
380
 
381
+ GC.start
382
+
328
383
  return header
329
384
  end
330
385
 
331
- def self.get(uri, form={})
386
+ def self.get(uri, httpheader={}, form={})
332
387
  post = Array.new
333
388
  form.each_pair do |var, value|
334
389
  post << "#{var.to_html}=#{value.to_html}"
@@ -339,15 +394,14 @@ class HTTPClient
339
394
 
340
395
  begin
341
396
  while not uri.nil?
342
- if $proxy.nil? or $proxy.empty?
343
- uri = EVURI.new(uri) if uri.kind_of? String
344
- host = uri.host
345
- port = uri.port
397
+ uri = EVURI.new(uri) if uri.kind_of? String
398
+ host = uri.host
399
+ port = uri.port
346
400
 
401
+ if $proxy.nil? or $proxy.empty? or host == "localhost"
347
402
  io = nil
348
403
  @@mutex.synchronize do
349
- @@hosts[host] = IPSocket.getaddress(host) if not @@hosts.include?(host)
350
- io = TCPSocket.new(@@hosts[host], port.zero? ? 80 : port)
404
+ io = TCPSocket.new(getaddress(host), port.zero? ? 80 : port)
351
405
  end
352
406
 
353
407
  if post.empty?
@@ -357,10 +411,7 @@ class HTTPClient
357
411
  end
358
412
  else
359
413
  proxy = EVURI.new($proxy)
360
- host = proxy.host
361
- port = proxy.port
362
-
363
- io = TCPSocket.new(host, port.zero? ? 8080 : port)
414
+ io = TCPSocket.new(proxy.host, proxy.port.zero? ? 8080 : proxy.port)
364
415
 
365
416
  if post.empty?
366
417
  io.write "GET %s HTTP/1.0\r\n" % uri
@@ -370,22 +421,32 @@ class HTTPClient
370
421
  end
371
422
 
372
423
  io.write "Host: %s\r\n" % host
373
- io.write "User-Agent: evwget\r\n"
374
- io.write "Proxy-Authorization: Basic %s\r\n" % $proxy_auth unless $proxy_auth.nil?
424
+ io.write "User-Agent: xyz\r\n"
425
+ io.write "Proxy-Authorization: Basic %s\r\n" % $proxy_auth unless $proxy_auth.nil?
375
426
  #io.write "Accept-Encoding: deflate\r\n"
376
- #io.write "Connection: close\r\n"
427
+ #io.write "Accept-Charset: ISO-8859-1\r\n"
428
+ io.write "Connection: close\r\n"
377
429
  io.write "Content-Type: application/x-www-form-urlencoded\r\n" unless post.empty?
378
430
  io.write "Content-Length: %s\r\n" % post.length unless post.empty?
431
+ httpheader.each do |k, v|
432
+ $stderr.puts "%s: %s\r\n" % [k, v]
433
+ io.write "%s: %s\r\n" % [k, v]
434
+ end
379
435
  io.write "\r\n"
380
436
  io.write post unless post.empty?
381
437
 
382
438
  io.close_write
383
439
 
384
440
  res = io.read
441
+
442
+ io.close_read
443
+
385
444
  header, data = nil, nil
386
445
  header, data = res.split(/\r*\n\r*\n/, 2) if not res.nil?
387
446
 
388
447
  header = Header.new(header)
448
+ length = header.header["content-length"]
449
+ data = "" if length == "0"
389
450
 
390
451
  if header.header["location"] != uri.to_s
391
452
  uri = EVURI.new(uri) + header.header["location"]
@@ -397,12 +458,25 @@ class HTTPClient
397
458
  data = Chunk.new(data).to_s if not data.nil?
398
459
  end
399
460
 
461
+ #if header.header["content-encoding"] == "gzip"
462
+ #data = "gzip -d".exec(data) if not data.nil?
463
+ #end
464
+
400
465
  data = nil unless header.code == 200
401
466
  end
402
- rescue
467
+ rescue Errno::ECONNRESET, Errno::EHOSTUNREACH => e
468
+ $stderr.puts e.message
469
+ sleep 1
470
+ retry
471
+ rescue Errno::ECONNREFUSED => e
472
+ data = nil
473
+ rescue NoAddressException, Errno::ECONNREFUSED => e
474
+ $stderr.puts e.message
403
475
  data = nil
404
476
  end
405
477
 
478
+ GC.start
479
+
406
480
  return data
407
481
  end
408
482
 
@@ -422,7 +496,7 @@ class HTTPClient
422
496
  file = "#{dir}/#{hash}"
423
497
  data = nil
424
498
 
425
- Dir.mkdirrec(dir)
499
+ File.mkpath(dir)
426
500
 
427
501
  expire = 356*24*60*60
428
502
 
@@ -447,7 +521,7 @@ end
447
521
  class RequestGet < Hash
448
522
  def initialize(data)
449
523
  CGI.parse(data).each do |k, v|
450
- self[k] = v.join(" ")
524
+ self[k] = v
451
525
  end
452
526
  end
453
527
  end
@@ -455,7 +529,7 @@ end
455
529
  class RequestPost < Hash
456
530
  def initialize(data)
457
531
  CGI.parse(data).each do |k, v|
458
- self[k] = v.join(" ")
532
+ self[k] = v
459
533
  end
460
534
  end
461
535
  end
@@ -493,6 +567,8 @@ class Request < Hash
493
567
  attr_reader :request
494
568
  attr_reader :cookies
495
569
  attr_reader :vars
570
+ attr_reader :user
571
+ attr_writer :user
496
572
 
497
573
  def initialize(io)
498
574
  @io = io
@@ -562,6 +638,7 @@ end
562
638
 
563
639
  class Response < Hash
564
640
  attr_writer :response
641
+ attr_writer :file
565
642
  attr_reader :cookies
566
643
  attr_reader :stop
567
644
  attr_reader :at_stop
@@ -574,10 +651,20 @@ class Response < Hash
574
651
  @syncd = false
575
652
  @stop = false
576
653
  @at_stop = lambda{}
654
+ @file = nil
577
655
  end
578
656
 
579
657
  def flush
580
658
  sync
659
+
660
+ if @file
661
+ File.open(@file, "rb") do |f|
662
+ while data = f.read(10_000)
663
+ @io.write data
664
+ end
665
+ end
666
+ end
667
+
581
668
  @io.close
582
669
  end
583
670
 
@@ -595,6 +682,21 @@ class Response < Hash
595
682
  end
596
683
 
597
684
  def sync
685
+ size = (@data or "").length
686
+
687
+ if @file
688
+ ext = @file.scan(/\.[^\.]*$/)
689
+ ext = ext.shift
690
+ ext = ext[1..-1] unless ext.nil?
691
+ mimetype = EVMime::MimeType[ext]
692
+
693
+ self["Content-Type"] = mimetype unless mimetype.nil?
694
+
695
+ size += File.size(@file) if File.file?(@file)
696
+ end
697
+
698
+ self["Content-Length"] = size
699
+
598
700
  @io.write("#{to_s}\r\n") unless @syncd
599
701
  @io.write(@data)
600
702
  @data = ""
@@ -605,6 +707,10 @@ class Response < Hash
605
707
  @data << s
606
708
  end
607
709
 
710
+ def clean
711
+ @data = ""
712
+ end
713
+
608
714
  def inspect
609
715
  "(Response: %s)" % [@response, @data].join(", ")
610
716
  end
@@ -640,7 +746,7 @@ class HTTPServer
640
746
  count = 0
641
747
 
642
748
  at_exit do
643
- $stderr.puts "Received #{count} requests"
749
+ #$stderr.puts "Received #{count} requests"
644
750
  end
645
751
 
646
752
  serverthread =
@@ -678,7 +784,7 @@ class HTTPServer
678
784
  end
679
785
 
680
786
  if (not remote) or (remote and (auth.nil? or auth.empty? or authenticate(auth, realm, req, resp)))
681
- $stderr.puts "#{count2}, #{Time.new.strftime("%Y-%m-%d.%H:%M:%S")}, #{ip}, #{req.request.to_s.strip}"
787
+ $stderr.puts "#{count2} #{Time.new.strftime("%Y-%m-%d %H:%M:%S")} #{ip} #{req.user} #{req.request.to_s.strip}"
682
788
 
683
789
  begin
684
790
  yield(req, resp)
@@ -687,6 +793,16 @@ class HTTPServer
687
793
  $stderr.puts e.class.to_s + ": " + e.message
688
794
  $stderr.puts e.backtrace.collect{|s| "\t"+s}.join("\n")
689
795
  end
796
+ resp["Content-Type"] = "text/plain"
797
+ resp.response = "HTTP/1.0 200 ???"
798
+ resp.clean
799
+ resp << e.class.to_s + ": " + e.message
800
+ resp << "\n"
801
+ resp << "\n"
802
+ resp << e.backtrace.collect{|s| "\t"+s}.join("\n")
803
+ resp << "\n"
804
+ resp << "\n"
805
+ resp << "(You can use the back button and stop the application properly, if appropriate.)"
690
806
  end
691
807
 
692
808
  stop = true if resp.stop?
@@ -738,13 +854,13 @@ class HTTPServer
738
854
 
739
855
  ok = (auths.include?(u) and auths[u] == p)
740
856
 
741
- if ok
742
-
743
- else
857
+ unless ok
744
858
  resp["WWW-Authenticate"] = "Basic realm=\"#{realm}\""
745
859
  resp.response = "HTTP/1.0 401 Unauthorized"
746
860
  end
747
861
 
862
+ req.user = u
863
+
748
864
  return ok
749
865
  end
750
866
  end
data/ev/ruby.rb CHANGED
@@ -18,14 +18,16 @@ tekens23 = tekens + "'"
18
18
 
19
19
  tekens31 = '\w\s\r\n'
20
20
 
21
- RegExpStringWord = "([#{tekens11}]+)" ; RegExpWord = Regexp.new(RegExpStringWord)
22
- RegExpStringWord2 = "([#{tekens21}]([#{tekens22}]*[#{tekens23}])?)" ; RegExpWord2 = Regexp.new(RegExpStringWord2)
23
- RegExpStringText = "([#{tekens31}]+)" ; RegExpText = Regexp.new(RegExpStringText)
24
- RegExpStringFile = '(\w[\w\.\-]*)' ; RegExpFile = Regexp.new(RegExpStringFile)
25
- RegExpStringEmail = '([\w\-\.]+@[\w\-\.]+)' ; RegExpEmail = Regexp.new(RegExpStringEmail)
26
- RegExpStringURL = '(\w+:\/\/[\w\.\-]+(:\d*)?\/[\w\.\-\/\#\?\=\%]*)' ; RegExpURL = Regexp.new(RegExpStringURL)
27
- RegExpStringPrint = '([\w \t\r\n\`\~\!\@\#\$\%\^\&\*\(\)\-\+\=\[\]\{\}\;\:\'\"\,\.\/\<\>\?\\\|]+)' ; RegExpPrint = Regexp.new(RegExpStringPrint)
28
- RegExpStringDiff = '(^[\-\+]([^\-\+].*)?)' ; RegExpDiff = Regexp.new(RegExpStringDiff)
21
+ RegExpStringWord = "([#{tekens11}]+)" ; RegExpWord = Regexp.new(RegExpStringWord)
22
+ RegExpStringWord2 = "([#{tekens21}]([#{tekens22}]*[#{tekens23}])?)" ; RegExpWord2 = Regexp.new(RegExpStringWord2)
23
+ RegExpStringText = "([#{tekens31}]+)" ; RegExpText = Regexp.new(RegExpStringText)
24
+ RegExpStringFile = '(\w[\w\.\-]*)' ; RegExpFile = Regexp.new(RegExpStringFile)
25
+ RegExpStringEmail = '([\w\-\.]+@[\w\-\.]+)' ; RegExpEmail = Regexp.new(RegExpStringEmail)
26
+ RegExpStringURL = '(\w+:\/\/[\w\.\-]+(:\d*)?\/[\w\.\-\/\#\?\=\%]*)' ; RegExpURL = Regexp.new(RegExpStringURL)
27
+ RegExpStringPrint = '([\w \t\r\n\`\~\!\@\#\$\%\^\&\*\(\)\-\+\=\[\]\{\}\;\:\'\"\,\.\/\<\>\?\\\|]+)' ; RegExpPrint = Regexp.new(RegExpStringPrint)
28
+ RegExpStringDiff = '(^[\-\+]([^\-\+].*)?)' ; RegExpDiff = Regexp.new(RegExpStringDiff)
29
+ RegExpStringHTHLink = '(`[\w\,]*\ba\b[^`]*`)' ; RegExpHTHLink = Regexp.new(RegExpStringHTHLink)
30
+ RegExpStringHTHSpecial = '(`[^`]*`)' ; RegExpHTHSpecial = Regexp.new(RegExpStringHTHSpecial)
29
31
 
30
32
  module Enumerable
31
33
  def deep_dup
@@ -64,6 +66,10 @@ class Numeric
64
66
  def to_fs
65
67
  to_f
66
68
  end
69
+
70
+ def to_html(eolconversion=true)
71
+ self.to_s.to_html(eolconversion)
72
+ end
67
73
  end
68
74
 
69
75
  class Integer
@@ -211,8 +217,8 @@ class String
211
217
  end
212
218
 
213
219
  def splitwords(tokens=[])
214
- tokens = [tokens] unless tokens.kind_of?(Array)
215
- res = []
220
+ tokens = [tokens] unless tokens.kind_of?(Array)
221
+ res = []
216
222
 
217
223
  self.splitblocks(["'", "'"], ['"', '"']).each do |type, s|
218
224
  case type
@@ -437,13 +443,14 @@ class Array
437
443
  end
438
444
 
439
445
  def format(format)
446
+ format = format.gsub(/\s/, "")
440
447
  res = []
441
448
 
442
449
  [format.length, self.length].min.times do |n|
443
- case format[n].chr
444
- when "i" then res << self[n].to_i
445
- when "s" then res << self[n].to_s
446
- when "x" then res << self[n]
450
+ case format[n].chr.downcase
451
+ when "i" then res << self[n].to_i
452
+ when "s" then res << self[n].to_s
453
+ else res << self[n]
447
454
  end
448
455
  end
449
456
 
@@ -540,6 +547,36 @@ class Array
540
547
  def ids
541
548
  collect{|e| e.ids}
542
549
  end
550
+
551
+ def rotate
552
+ raise "Array has to be 2D (An Array of Arrays)." unless self.dup.delete_if{|a| a.kind_of?(Array)}.empty?
553
+
554
+ res = []
555
+
556
+ self[0].length.times do |x|
557
+ a = []
558
+
559
+ self.length.times do |y|
560
+ a << self[y][x]
561
+ end
562
+
563
+ res << a
564
+ end
565
+
566
+ res
567
+ end
568
+
569
+ def to_h
570
+ raise "Array has to be 2D (An Array of Arrays)." unless self.dup.delete_if{|a| a.kind_of?(Array)}.empty?
571
+
572
+ res = {}
573
+
574
+ self.each do |k, v, *rest|
575
+ res[k] = v
576
+ end
577
+
578
+ res
579
+ end
543
580
  end
544
581
 
545
582
  class Hash
@@ -699,7 +736,11 @@ def trap(signal)
699
736
  end
700
737
 
701
738
  def linux?
702
- not windows? and not cygwin?
739
+ not (target_os.downcase =~ /linux/).nil?
740
+ end
741
+
742
+ def darwin?
743
+ not (target_os.downcase =~ /darwin/).nil?
703
744
  end
704
745
 
705
746
  def windows?
@@ -727,8 +768,9 @@ def temp
727
768
  end
728
769
 
729
770
  def stdtmp
730
- $stderr = $stdout = File.new("#{temp}/ruby.#{Process.pid}.log", "a") unless ARGV.include?("--rwd-exit")
771
+ $stderr = $stdout = File.new("#{temp}/ruby.#{Process.pid}.log", "a")
731
772
  end
773
+ stdtmp if defined?(RUBYSCRIPT2EXE) and (RUBYSCRIPT2EXE =~ /rubyw/i)
732
774
 
733
775
  $nobm = false
734
776
 
@@ -745,7 +787,7 @@ def bm(label="")
745
787
  end
746
788
  end
747
789
 
748
- label = label.to_s
790
+ label = label.inspect #unless label.kind_of?(String)
749
791
  res = nil
750
792
 
751
793
  $bm_mutex = ($bm_mutex or Mutex.new)
@@ -757,29 +799,41 @@ def bm(label="")
757
799
  $bm = {}
758
800
 
759
801
  at_exit do
760
- format1 = "%10s %10s %10s %10s %10s %10s %10s"
761
- format2 = "%10s %10.6f %10.6f %10.6f %10.6f %10.6f %10d"
762
-
763
- $stderr.puts format1 % ["LABEL", "USERCPU", "SYSCPU", "CUSERCPU", "CSYSCPU", "ELAPSED", "TIMES"]
764
- $bm.sort{|a, b| [a[1], a[0]] <=> [b[1], b[0]]}.each do |k, v|
765
- $stderr.puts format2 % [k, *v]
802
+ l = $bm.keys.collect{|s| s.length}.max
803
+ #format1 = "%10s %10s %10s %10s %10s %10s %s"
804
+ #format2 = "%10.6f %10.6f %10.6f %10.6f %10.6f %10d %s"
805
+ #$stderr.puts format1 % ["USERCPU", "SYSCPU", "CUSERCPU", "CSYSCPU", "ELAPSED", "COUNT", "LABEL"]
806
+ #$bm.sort{|a, b| [b[1], b[0]] <=> [a[1], a[0]]}.each do |k, v|
807
+ #$stderr.puts format2 % (v + [k])
808
+ #end
809
+
810
+ format1 = "%10s %10s %10s %s"
811
+ format2 = "%10.6f %10.6f %10d %s"
812
+ $bm.each do |k, v|
813
+ $bm[k] = [v[0]+v[1], v[4], v[5]]
814
+ end
815
+ $stderr.puts format1 % ["CPU", "ELAPSED", "COUNT", "LABEL"]
816
+ $bm.sort{|a, b| [b[1], b[0]] <=> [a[1], a[0]]}.each do |k, v|
817
+ $stderr.puts format2 % (v + [k])
766
818
  end
767
819
  end
768
820
  end
769
821
 
770
822
  $bm[label] = [0.0]*5 + [0] unless $bm.include?(label)
823
+ $bm[label][5] += 1
771
824
  end
772
825
 
773
826
  if block_given?
774
827
  bm = Benchmark.measure{res = yield}
775
828
  bma = bm.to_a # [dummy label, user CPU time, system CPU time, childrens user CPU time, childrens system CPU time, elapsed real time]
776
829
 
830
+ $bm_last = bma
831
+
777
832
  $bm_mutex.synchronize do
833
+ e = $bm[label]
778
834
  0.upto(4) do |n|
779
- $bm[label][n] += bma[n+1]
835
+ e[n] += bma[n+1]
780
836
  end
781
-
782
- $bm[label][5] += 1
783
837
  end
784
838
  end
785
839
 
@@ -817,3 +871,19 @@ def lambda_cached(&block)
817
871
  res
818
872
  end
819
873
  end
874
+
875
+ def ask(options, text=false)
876
+ i = 0
877
+ $stderr.puts ""
878
+ options.each do |s|
879
+ $stderr.puts " %d %s" % [i+=1, s]
880
+ end
881
+ $stderr.puts ""
882
+ $stderr.print "? "
883
+ res = $stdin.gets
884
+ unless res.nil?
885
+ res = res.strip
886
+ res = options[res.to_i-1] if text and not res.empty?
887
+ end
888
+ res
889
+ end