Function: calc-embedded-update

calc-embedded-update is a byte-compiled function defined in calc-embed.el.gz.

Signature

(calc-embedded-update INFO WHICH NEED-EVAL NEED-DISPLAY &optional STR ENTRY OLD-VAL)

Source Code

;; Defined in /usr/src/emacs/lisp/calc/calc-embed.el.gz
(defun calc-embedded-update (info which need-eval need-display
				  &optional str entry old-val)
  (let* ((calc-embed-prev-modes nil)
	 (open-plain calc-embedded-open-plain)
	 (close-plain calc-embedded-close-plain)
	 (calc-embed-vars-used nil)
	 (evalled nil)
	 (val (aref info 8))
	 (old-eval (aref info 11)))
    (or old-val (setq old-val val))
    (if (eq (car-safe val) 'calcFunc-evalto)
	(setq need-display t))
    (unwind-protect
	(progn
	  (set-buffer (aref info 1))
	  (and which
	       (calc-embedded-set-modes (aref info 15) (aref info 12)
					(aref info which)
					(if need-display 'full t)))
	  (if (memq (car-safe val) '(calcFunc-evalto calcFunc-assign))
	      (calc-embedded-find-vars val))
	  (if need-eval
	      (let ((calc-embedded-info info))
		(setq val (math-evaluate-expr val)
		      evalled val)))
	  (if (or (eq need-eval 'eval) (eq (car-safe val) 'calcFunc-evalto))
	      (aset info 8 val))
	  (aset info 9 nil)
	  (aset info 10 calc-embed-vars-used)
	  (aset info 11 nil)
	  (if (or need-display (eq (car-safe val) 'calcFunc-evalto))
	      (let ((extra (if (eq calc-language 'big) 1 0)))
		(or entry (setq entry (list val 1 nil)))
		(or str (progn
			  (setq str (let ((calc-line-numbering nil))
				      (math-format-stack-value entry)))
			  (if (eq calc-language 'big)
			      (setq str (substring str 0 -1)))))
		(and calc-show-plain
		     (setq str (concat open-plain
				       (math-showing-full-precision
					(math-format-flat-expr val 0))
				       close-plain
				       str)))
		(save-excursion
		  (calc-embedded-original-buffer t info)
		  (or (equal str (aref info 6))
		      (let ((delta (- (aref info 5) (aref info 3)))
                            (adjbot 0)
			    (buffer-read-only nil))
			(goto-char (aref info 2))
			(delete-region (point) (aref info 3))
			(and (> (nth 1 entry) (1+ extra))
			     (aref info 7)
			     (progn
			       (delete-horizontal-space)
                               (if (looking-at "\n")
                                   ;; If there's a newline there, don't add one
                                   (insert "\n")
                                 (insert "\n\n")
                                 (delete-horizontal-space)
                                 (setq adjbot 1)
;                               (setq delta (1+ delta))
                                 (backward-char 1))))
			(insert str)
			(set-marker (aref info 3) (+ (point) adjbot))
			(set-marker (aref info 5) (+ (point) delta))
			(aset info 6 str))))))
	  (if (eq (car-safe val) 'calcFunc-evalto)
	      (progn
		(setq evalled (nth 2 val)
		      val (nth 1 val))))
	  (if (eq (car-safe val) 'calcFunc-assign)
	      (progn
		(aset info 9 (nth 1 val))
		(aset info 11 (or evalled
				  (let ((calc-embedded-info info))
				    (math-evaluate-expr (nth 2 val)))))
		(or (equal old-eval (aref info 11))
		    (calc-embedded-var-change (nth 1 val) (aref info 0))))
	    (if (eq (car-safe old-val) 'calcFunc-evalto)
		(setq old-val (nth 1 old-val)))
	    (if (eq (car-safe old-val) 'calcFunc-assign)
		(calc-embedded-var-change (nth 1 old-val) (aref info 0)))))
      (set-buffer (aref info 1))
      (while calc-embed-prev-modes
	(cond ((eq (car (car calc-embed-prev-modes)) 'the-language)
	       (if need-display
		   (calc-embedded-set-language (cdr (car calc-embed-prev-modes)))))
	      ((eq (car (car calc-embed-prev-modes)) 'the-display-just)
	       (if need-display
		   (calc-embedded-set-justify (cdr (car calc-embed-prev-modes)))))
	      (t
	       (set (car (car calc-embed-prev-modes))
                    (cdr (car calc-embed-prev-modes)))))
	(setq calc-embed-prev-modes (cdr calc-embed-prev-modes))))))