[PATCH] Ruby debugger Emacs integration

I have two small patches that solve two problems I had when using the
Ruby debugger (debug.rb) from XEmacs. I use Ruby 1.8.3 (2005-06-23)
[i486-linux] and rubydb3x.el on XEmacs 21.4.

The first problem was that setting breakpoints from within a Ruby file
buffer (using C-x C-a C-b, i.e. gud-break) didn't work. The patch is
against rubydb3x.el:

--- rubydb3x.el.orig 2005-10-05 13:04:23.000000000 +0200
+++ rubydb3x.el 2005-10-05 13:04:33.000000000 +0200
@@ -97,7 +97,7 @@
                              (gud-find-file . gud-rubydb-find-file)))
     (gud-common-init command-line rubydb-command-name))

- (gud-def gud-break "b %l" "\C-b" "Set breakpoint at current line.")
+ (gud-def gud-break "b %d%f:%l" "\C-b" "Set breakpoint at current line.")
; (gud-def gud-remove "clear %l" "\C-d" "Remove breakpoint at current line")
   (gud-def gud-step "s" "\C-s" "Step one source line with display.")
   (gud-def gud-next "n" "\C-n" "Step one line (skip functions).")

The second problem was that using the "up" and "down" debugger
commands to move up and down the callstack from a breakpoint did not
make XEmacs jump to the corresponding line in the Ruby editor
buffer. The patch is against the debug.rb file:

--- debug.rb.orig 2005-10-05 13:04:47.000000000 +0200
+++ debug.rb 2005-10-05 13:04:58.000000000 +0200
@@ -457,7 +457,7 @@
            stdout.print "At toplevel\n"
          end
          binding, binding_file, binding_line = @frames[frame_pos]
- stdout.print format_frame(frame_pos)
+ stdout.print format_frame_emacs(frame_pos)

        when /^\s*down(?:\s+(\d+))?$/
          previous_line = nil
@@ -472,7 +472,7 @@
            stdout.print "At stack bottom\n"
          end
          binding, binding_file, binding_line = @frames[frame_pos]
- stdout.print format_frame(frame_pos)
+ stdout.print format_frame_emacs(frame_pos)

        when /^\s*fin(?:ish)?$/
          if frame_pos == @frames.size
@@ -620,6 +620,16 @@
       (id ? ":in `#{id.id2name}'" : "")
   end

+ def format_frame_emacs(pos)
+ bind, file, line, id = @frames[pos]
+ if ENV['EMACS']
+ stdout.printf "\032\032%s:%d:\n", file, line
+ else
+ sprintf "#%d %s:%s%s\n", pos + 1, file, line,
+ (id ? ":in `#{id.id2name}'" : "")
+ end
+ end

···

+
   def display_list(b, e, file, line)
     stdout.printf "[%d, %d] in %s\n", b, e, file
     if lines = SCRIPT_LINES__[file] and lines != true

Olaf