Guest User

Untitled

a guest
May 19th, 2018
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 2.81 KB | None | 0 0
  1. (require 'pp)
  2.  
  3. (defun avs-masktool-postfix-format (expstr)
  4.   (let ((initlist (delete "" (split-string expstr "\"")))
  5.     (outlist nil))
  6.     (defun expstrproc (procstr state)
  7.       (defun append-outlist (separator-str)
  8.     (setq outlist (append outlist (delete "" (split-string (car procstr) separator-str)))))
  9.       (cond ((null procstr) outlist)
  10.         ((= state 0)
  11.         (append-outlist nil)
  12.         (expstrproc (cdr procstr) 1))
  13.         ((= state 1)
  14.         (append-outlist "+\\|\n\\|\s\\|\t\\|\r\\|\\\\")
  15.         (expstrproc (cdr procstr) 0))
  16.         (t nil)))
  17.     (expstrproc initlist 0)))
  18.  
  19. (defun avs-masktool-postfix-to-prefix-elisp (explist)
  20.   (let ((rpnstack nil)
  21.     (polish-symbol-table '(("+" 2) ("*" 2) ("/" 2) ("-" 2) ("^" 2) ("%" 2) ("?" 3) ("==" 2)
  22.                    ("=" 2) ("!=" 2) ("<=" 2) ("<" 2) (">=" 2) (">" 2) ("&" 2) ("|" 2)
  23.                    ("&!" 2) ("°" 2) ("@" 2) ("&u" 2) ("|u" 2) ("°u" 2) ("@u" 2) ("~u" 1)
  24.                    ("<<" 2) ("<<u" 2) (">>" 2) (">>u" 2) ("&s" 2) ("|s" 2) ("°s" 2) ("@s" 2)
  25.                    ("~s" 1) ("<<s" 2) (">>s" 2) ("cos" 1) ("sin" 1) ("tan" 1) ("log" 1) ("exp" 1)
  26.                    ("abs" 1) ("atan" 1) ("acos" 1) ("asin" 1) ("round" 1) ("clip" 3) ("min" 2) ("max" 2)
  27.                    ("ceil" 1) ("floor" 1) ("trunc" 1))))
  28.     (defun get-type (x) (cdr x))
  29.     (defun get-data (x) (car x))
  30.     (defun assoc-op-symbol (x) (assoc x polish-symbol-table))
  31.     (defun is-type-var (x) (equal (cdr x) "var"))
  32.     (defun concat-exp (x) (concat "(" (cdr x) " " (car x) ")"))
  33.     (defun is-op-accept-rest (x) (find x '("+" "*" "/" "-" "&") :test #'equal))
  34.     (defun poprpn (ele)
  35.       (let ((item (pop rpnstack)))
  36.     (cond ((assoc-op-symbol (get-data item)) (push item rpnstack) "*undef*")
  37.           ((null item) "*undef*")
  38.           (t (if (or (is-type-var item)
  39.              (and (equal ele (get-type item))
  40.                   (is-op-accept-rest (get-type item))))
  41.              (get-data item)
  42.            (concat-exp item))))))
  43.     (defun funop (argc ele)
  44.       (let ((item nil))
  45.     (loop for i from 1 to argc
  46.           do (setq item (concat (poprpn ele) (if item " " "") item))
  47.           finally (push (cons item ele) rpnstack))))
  48.     (let ((rpnelelist (delete "" explist)))
  49.       (dolist (ele rpnelelist)
  50.     (let ((eleargc (cadr (assoc-op-symbol ele))))
  51.       (if eleargc
  52.           (funop eleargc ele)
  53.         (push (cons ele "var") rpnstack)))))
  54.     (mapconcat #'(lambda (x) (if (is-type-var x) (get-data x) (concat-exp x))) rpnstack "\n")))
  55.  
  56. (defun avs-masktool-postfix-to-prefix (rstart rend)
  57.   (interactive "r")
  58.   (let ((data (buffer-substring-no-properties rstart rend))
  59.     (info nil)
  60.     (buf (get-buffer-create "*masktool helper*")))
  61.     (set-buffer buf)
  62.     (setq buffer-read-only nil)
  63.     (erase-buffer)
  64.     (setq info (avs-masktool-postfix-to-prefix-elisp (avs-masktool-postfix-format data)))
  65.     (insert info)
  66.     (pp-buffer)
  67.     (clipboard-kill-ring-save (point-min) (point-max))
  68.     (pop-to-buffer buf)
  69.     (message info)))
  70.  
  71. (provide 'avs-masktool-helper)
Add Comment
Please, Sign In to add comment