#!/usr/bin/perl -w # genrpbindings -- generate ratpoison bindings for various languages # # Ryan Yeske # Tue Dec 4 16:15:53 PST 2001 # # currently generates bindings for: # * Perl (Ratpoison.pm) # * Emacs Lisp (ratpoison-cmd.el) # * Ruby (ratpoison.rb) [Doug Kearns ] # add more languages! # # Bindings are just very thin wrappers, no argument checking is done. # All of the functions return a string. # # Example: ratpoison --command='echo hello world' # # #!perl # use Ratpoison; # Ratpoison::echo ("hello world") # # ;;; elisp # (require 'ratpoison-cmd) # (ratpoison-echo "hello world") # # #!ruby # require "ratpoison" # Ratpoison.echo ("hello world") # $\="\n"; # set this to your rp binary $RATPOISON="/usr/local/bin/ratpoison"; # open source file $ACTIONS_C="../src/actions.c"; open ACTIONS_C or die "Can't open $ACTIONS_C"; # open target files $PERL_FILE="./Ratpoison.pm"; $ELISP_FILE="./ratpoison-cmd.el"; $RUBY_FILE="./ratpoison.rb"; open PERL, ">$PERL_FILE" or die "Can't create $PERL_FILE"; open ELISP, ">$ELISP_FILE" or die "Can't create $ELISP_FILE"; open RUBY, ">$RUBY_FILE" or die "Can't create $RUBY_FILE"; # PERL preamble print PERL 'package Ratpoison;'; print PERL '$RATPOISON="',$RATPOISON,'";'; print PERL 'sub command { return `$RATPOISON -c "@_"`; }'; # ELISP preamble print ELISP '(defvar ratpoison-program "',$RATPOISON,'")'; print ELISP < (point-max) 1) (- (point-max) 1) (point-max))))) PREAMBLE # RUBY preamble print RUBY <) { if (m!/\*\@begin !) { while () { last if (m!/\*\@end !); if (/{\"(.+)\".+},/) { $nbindings++; print PERL "sub $1 { return command (\"$1\", \@_); }"; print ELISP "(defun-ratpoison $1)"; print RUBY " def $1 (*args)"; print RUBY " return command (\"$1\", args)"; print RUBY " end"; print RUBY " module_function :$1\n"; } } } } print "$nbindings bindings."; # PERL postamble # nothing # ELISP postamble print ELISP '(provide \'ratpoison-cmd)'; # RUBY postamble print RUBY "end"; close PERL; print "Created $PERL_FILE"; close ELISP; print "Created $ELISP_FILE"; close RUBY; print "Created $RUBY_FILE";