#!/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) # # 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") $\="\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"; open PERL, ">$PERL_FILE" or die "Can't create $PERL_FILE"; open ELISP, ">$ELISP_FILE" or die "Can't create $ELISP_FILE"; # PERL preamble print PERL 'package Ratpoison;'; print PERL '$RATPOISON="',$RATPOISON,'";'; print PERL 'sub rp_cmd { return `$RATPOISON -c "@_"`; }'; # ELISP preamble print ELISP '(defvar ratpoison-program "',$RATPOISON,'")'; print ELISP < (point-max) 1) (- (point-max) 1) (point-max))))) PREAMBLE # bindings while () { if (m!/\*\@begin !) { while () { last if (m!/\*\@end !); if (/{\"(.+)\".+},/) { $nbindings++; print PERL "sub $1 { return rp_cmd (\"$1\", \@_); }"; print ELISP "(defun-ratpoison $1)"; } } } } print "$nbindings bindings."; # PERL postamble # ELISP postamble print ELISP '(provide \'ratpoison-cmd)'; close PERL; print "Created $PERL_FILE"; close ELISP; print "Created $ELISP_FILE";