Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (require 'pp)
- (defun avs-masktool-postfix-format (expstr)
- (let ((initlist (delete "" (split-string expstr "\"")))
- (outlist nil))
- (defun expstrproc (procstr state)
- (defun append-outlist (separator-str)
- (setq outlist (append outlist (delete "" (split-string (car procstr) separator-str)))))
- (cond ((null procstr) outlist)
- ((= state 0)
- (append-outlist nil)
- (expstrproc (cdr procstr) 1))
- ((= state 1)
- (append-outlist "+\\|\n\\|\s\\|\t\\|\r\\|\\\\")
- (expstrproc (cdr procstr) 0))
- (t nil)))
- (expstrproc initlist 0)))
- (defun avs-masktool-postfix-to-prefix-elisp (explist)
- (let ((rpnstack nil)
- (polish-symbol-table '(("+" 2) ("*" 2) ("/" 2) ("-" 2) ("^" 2) ("%" 2) ("?" 3) ("==" 2)
- ("=" 2) ("!=" 2) ("<=" 2) ("<" 2) (">=" 2) (">" 2) ("&" 2) ("|" 2)
- ("&!" 2) ("°" 2) ("@" 2) ("&u" 2) ("|u" 2) ("°u" 2) ("@u" 2) ("~u" 1)
- ("<<" 2) ("<<u" 2) (">>" 2) (">>u" 2) ("&s" 2) ("|s" 2) ("°s" 2) ("@s" 2)
- ("~s" 1) ("<<s" 2) (">>s" 2) ("cos" 1) ("sin" 1) ("tan" 1) ("log" 1) ("exp" 1)
- ("abs" 1) ("atan" 1) ("acos" 1) ("asin" 1) ("round" 1) ("clip" 3) ("min" 2) ("max" 2)
- ("ceil" 1) ("floor" 1) ("trunc" 1))))
- (defun get-type (x) (cdr x))
- (defun get-data (x) (car x))
- (defun assoc-op-symbol (x) (assoc x polish-symbol-table))
- (defun is-type-var (x) (equal (cdr x) "var"))
- (defun concat-exp (x) (concat "(" (cdr x) " " (car x) ")"))
- (defun is-op-accept-rest (x) (find x '("+" "*" "/" "-" "&") :test #'equal))
- (defun poprpn (ele)
- (let ((item (pop rpnstack)))
- (cond ((assoc-op-symbol (get-data item)) (push item rpnstack) "*undef*")
- ((null item) "*undef*")
- (t (if (or (is-type-var item)
- (and (equal ele (get-type item))
- (is-op-accept-rest (get-type item))))
- (get-data item)
- (concat-exp item))))))
- (defun funop (argc ele)
- (let ((item nil))
- (loop for i from 1 to argc
- do (setq item (concat (poprpn ele) (if item " " "") item))
- finally (push (cons item ele) rpnstack))))
- (let ((rpnelelist (delete "" explist)))
- (dolist (ele rpnelelist)
- (let ((eleargc (cadr (assoc-op-symbol ele))))
- (if eleargc
- (funop eleargc ele)
- (push (cons ele "var") rpnstack)))))
- (mapconcat #'(lambda (x) (if (is-type-var x) (get-data x) (concat-exp x))) rpnstack "\n")))
- (defun avs-masktool-postfix-to-prefix (rstart rend)
- (interactive "r")
- (let ((data (buffer-substring-no-properties rstart rend))
- (info nil)
- (buf (get-buffer-create "*masktool helper*")))
- (set-buffer buf)
- (setq buffer-read-only nil)
- (erase-buffer)
- (setq info (avs-masktool-postfix-to-prefix-elisp (avs-masktool-postfix-format data)))
- (insert info)
- (pp-buffer)
- (clipboard-kill-ring-save (point-min) (point-max))
- (pop-to-buffer buf)
- (message info)))
- (provide 'avs-masktool-helper)
Add Comment
Please, Sign In to add comment