From: Vincent Belaïche Date: Fri, 3 Jan 2014 14:18:24 +0000 (+0100) Subject: Reverted 2014-01-02T21:05:34Z!vincentb1@users.sourceforge.net. X-Git-Tag: emacs-24.3.90~173^2^2~42^2~45^2~387^2~80 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=e9c04e8bf2a24811a1c335b826816055b6bbf5dc;p=emacs.git Reverted 2014-01-02T21:05:34Z!vincentb1@users.sourceforge.net. --- diff --git a/doc/misc/ChangeLog b/doc/misc/ChangeLog index 4509aaff3c1..4d0f08fb0c9 100644 --- a/doc/misc/ChangeLog +++ b/doc/misc/ChangeLog @@ -19,10 +19,6 @@ * eshell.texi (top): Fix incorrect info filename in an xref. -2014-01-02 Vincent Belaïche - - * ses.texi: Add documentation for local printer functions. - 2014-01-02 Glenn Morris * Makefile.in (cc_mode_deps): Rename from (typo) ccmode_deps. diff --git a/doc/misc/ses.texi b/doc/misc/ses.texi index 11fd55e8dcb..e57ed802459 100644 --- a/doc/misc/ses.texi +++ b/doc/misc/ses.texi @@ -434,13 +434,6 @@ Centering with dashes and spill-over. Centering with tildes (~) and spill-over. @end table -You can define printer function local to a sheet with command -@code{ses-define-local-printer}. For instance define printer -@samp{foo} to @code{"%.2f"} and then use symbol @samp{foo} as a -printer function. Then, if you call again -@code{ses-define-local-printer} on @samp{foo} to redefine it as -@code{"%.3f"} all the cells using printer @samp{foo} will be reprinted -accordingly. @node Clearing cells @section Clearing cells diff --git a/lisp/ChangeLog b/lisp/ChangeLog index f74ede68cd1..df00ef0bacf 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -45,34 +45,6 @@ * mail/rmail.el (rmail-get-coding-function): Variable. (rmail-get-coding-system): Use it. -2014-01-02 Vincent Belaïche - - * ses.el (ses-initial-global-parameters-re): New defconst, a - specific regexp is needed now that ses.el can handle both - file-format 2 (no local printers) and 3 (may have local printers). - (silence compiler): Add local variables needed for local printer - handling. - (ses-set-localvars): Handle hashmap initialisation. - (ses-paramlines-plist): Add param-line for number of local printers. - (ses-paramfmt-plist): New defconst, needed for code factorization - between functions `ses-set-parameter' and - `ses-file-format-extend-paramter-list' - (ses-make-local-printer-info): New defsubst. - (ses-locprn-get-compiled, ses-locprn-compiled-aset) - (ses-locprn-get-def, ses-locprn-def-aset, ses-locprn-get-number) - (ses-cell-printer-aset): New defmacro. - (ses-local-printer-compile): New defun. - (ses-local-printer): New defmacro. - (ses-printer-validate, ses-call-printer): Add support for local - printer functions. - (ses-file-format-extend-paramter-list): New defun. - (ses-set-parameter): Use const `ses-paramfmt-plist' for code factorization. - (ses-load): Add support for local - printer functions. - (ses-read-printer): Update docstring and add support for local printer functions. - (ses-refresh-local-printer, ses-define-local-printer): New defun. - (ses-safe-printer): Add support for local printer functions. - 2013-12-31 Eli Zaretskii * international/mule-conf.el: Unify the charset indian-is13194. diff --git a/lisp/ses.el b/lisp/ses.el index cdf479398ed..feaa7bd91d4 100644 --- a/lisp/ses.el +++ b/lisp/ses.el @@ -238,10 +238,6 @@ Each function is called with ARG=1." "\n( ;Global parameters (these are read first)\n 2 ;SES file-format\n 1 ;numrows\n 1 ;numcols\n)\n\n" "Initial contents for the three-element list at the bottom of the data area.") -(defconst ses-initial-global-parameters-re - "\n( ;Global parameters (these are read first)\n [23] ;SES file-format\n [0-9]+ ;numrows\n [0-9]+ ;numcols\n\\( [0-9]+ ;numlocprn\n\\)?)\n\n" - "Match Global parameters for .") - (defconst ses-initial-file-trailer ";; Local Variables:\n;; mode: ses\n;; End:\n" "Initial contents for the file-trailer area at the bottom of the file.") @@ -275,17 +271,11 @@ default printer and then modify its output.") ;; Local variables and constants ;;---------------------------------------------------------------------------- -(eval-and-compile ; silence compiler +(eval-and-compile (defconst ses-localvars '(ses--blank-line ses--cells ses--col-printers ses--col-widths ses--curcell ses--curcell-overlay ses--default-printer - (ses--local-printer-hashmap . :hashmap) - ;; the list is there to remember the order of local printers like there - ;; are written to the SES filen which service the hashmap does not - ;; provide. - ses--local-printer-list - (ses--numlocprn . 0); count of local printers ses--deferred-narrow ses--deferred-recalc ses--deferred-write ses--file-format ses--named-cell-hashmap @@ -308,20 +298,7 @@ default printer and then modify its output.") ((symbolp x) (set (make-local-variable x) nil)) ((consp x) - (cond - ((integerp (cdr x)) - (set (make-local-variable (car x)) (cdr x))) - ((eq (cdr x) :hashmap) - (set (make-local-variable (car x)) - (if (boundp (car x)) - (let ((xv (symbol-value (car x)))) - (if (hash-table-p xv) - (clrhash xv) - (warn "Unexpected value of symbol %S, should be a hash table" x) - (make-hash-table :test 'eq))) - (make-hash-table :test 'eq)))) - (t (error "Unexpected initializer `%S' in list `ses-localvars' for entry %S" - (cdr x) (car x)) ) )) + (set (make-local-variable (car x)) (cdr x))) (t (error "Unexpected elements `%S' in list `ses-localvars'" x)))))) (eval-when-compile ; silence compiler @@ -333,21 +310,10 @@ default printer and then modify its output.") (defconst ses-paramlines-plist '(ses--col-widths -5 ses--col-printers -4 ses--default-printer -3 ses--header-row -2 ses--file-format 1 ses--numrows 2 - ses--numcols 3 ses--numlocprn 4) + ses--numcols 3) "Offsets from 'Global parameters' line to various parameter lines in the data area of a spreadsheet.") -(defconst ses-paramfmt-plist - '(ses--col-widths "(ses-column-widths %S)" - ses--col-printers "(ses-column-printers %S)" - ses--default-printer "(ses-default-printer %S)" - ses--header-row "(ses-header-row %S)" - ses--file-format " %S ;SES file-format" - ses--numrows " %S ;numrows" - ses--numcols " %S ;numcols" - ses--numlocprn " %S ;numlocprn") - "Formats of 'Global parameters' various parameters in the data -area of a spreadsheet.") ;; ;; "Side-effect variables". They are set in one function, altered in @@ -388,30 +354,6 @@ when to emit a progress message.") property-list) (vector symbol formula printer references property-list)) -(defsubst ses-make-local-printer-info (def &optional compiled-def number) - (let ((v (vector def - (or compiled-def (ses-local-printer-compile def)) - (or number ses--numlocprn) - nil))) - (push v ses--local-printer-list) - (aset v 3 ses--local-printer-list) - v)) - -(defmacro ses-locprn-get-compiled (locprn) - `(aref ,locprn 1)) - -(defmacro ses-locprn-compiled-aset (locprn compiled) - `(aset ,locprn 1 ,compiled)) - -(defmacro ses-locprn-get-def (locprn) - `(aref ,locprn 0)) - -(defmacro ses-locprn-def-aset (locprn def) - `(aset ,locprn 0 ,def)) - -(defmacro ses-locprn-get-number (locprn) - `(aref ,locprn 2)) - (defmacro ses-cell-symbol (row &optional col) "From a CELL or a pair (ROW,COL), get the symbol that names the local-variable holding its value. (0,0) => A1." `(aref ,(if col `(ses-get-cell ,row ,col) row) 0)) @@ -429,10 +371,6 @@ when to emit a progress message.") "From a CELL or a pair (ROW,COL), get the function that prints its value." `(aref ,(if col `(ses-get-cell ,row ,col) row) 2)) -(defmacro ses-cell-printer-aset (cell printer) - "From a CELL set the printer that prints its value." - `(aset ,cell 2 ,printer)) - (defmacro ses-cell-references (row &optional col) "From a CELL or a pair (ROW,COL), get the list of symbols for cells whose functions refer to its value." @@ -612,29 +550,6 @@ PRINTER are deferred until first use." (set sym value) sym) -(defun ses-local-printer-compile (printer) - "Convert local printer function into faster printer -definition." - (cond - ((functionp printer) printer) - ((stringp printer) - `(lambda (x) (format ,printer x))) - (t (error "Invalid printer %S" printer)))) - -(defmacro ses-local-printer (printer-name printer-def) - "Define a local printer with name PRINTER-NAME and definition -PRINTER-DEF. Return the printer info." - (or - (and (symbolp printer-name) - (ses-printer-validate printer-def)) - (error "Invalid local printer definition")) - (and (gethash printer-name ses--local-printer-hashmap) - (error "Duplicate printer definition %S" printer-name)) - (add-to-list 'ses-read-printer-history (symbol-name printer-name)) - (puthash printer-name - (ses-make-local-printer-info (ses-safe-printer printer-def)) - ses--local-printer-hashmap)) - (defmacro ses-column-widths (widths) "Load the vector of column widths from the spreadsheet file. This is a macro to prevent propagate-on-load viruses." @@ -748,8 +663,6 @@ is a vector--if a symbol, the new vector is assigned as the symbol's value." "Signal an error if PRINTER is not a valid SES cell printer." (or (not printer) (stringp printer) - ;; printer is a local printer - (and (symbolp printer) (gethash printer ses--local-printer-hashmap)) (functionp printer) (and (stringp (car-safe printer)) (not (cdr printer))) (error "Invalid printer function")) @@ -1347,13 +1260,7 @@ printer signaled one (and \"%s\" is used as the default printer), else nil." (format (car printer) value) "")) (t - (setq value (funcall - (or (and (symbolp printer) - (let ((locprn (gethash printer ses--local-printer-hashmap))) - (and locprn - (ses-locprn-get-compiled locprn)))) - printer) - (or value ""))) + (setq value (funcall printer (or value ""))) (if (stringp value) value (or (stringp (car-safe value)) @@ -1426,22 +1333,6 @@ ses--default-printer, ses--numrows, or ses--numcols." (goto-char ses--params-marker) (forward-line def)))) -(defun ses-file-format-extend-paramter-list (new-file-format) - "Extend the global parameters list when file format is updated -from 2 to 3. This happens when local printer function are added -to a sheet that was created with SES version 2. This is not -undoable. Return nil when there was no change, and non nil otherwise." - (save-excursion - (cond - ((and (= ses--file-format 2) (= 3 new-file-format)) - (ses-set-parameter 'ses--file-format 3 ) - (ses-widen) - (goto-char ses--params-marker) - (forward-line (plist-get ses-paramlines-plist 'ses--numlocprn )) - (insert (format (plist-get ses-paramfmt-plist 'ses--numlocprn) ses--numlocprn) - ?\n) - t) ))) - (defun ses-set-parameter (def value &optional elem) "Set parameter DEF to VALUE (with undo) and write the value to the data area. See `ses-goto-data' for meaning of DEF. Newlines in the data are escaped. @@ -1451,7 +1342,13 @@ If ELEM is specified, it is the array subscript within DEF to be set to VALUE." ;; in case one of them is being changed. (ses-goto-data def) (let ((inhibit-read-only t) - (fmt (plist-get ses-paramfmt-plist + (fmt (plist-get '(ses--col-widths "(ses-column-widths %S)" + ses--col-printers "(ses-column-printers %S)" + ses--default-printer "(ses-default-printer %S)" + ses--header-row "(ses-header-row %S)" + ses--file-format " %S ;SES file-format" + ses--numrows " %S ;numrows" + ses--numcols " %S ;numcols") def)) oldval) (if elem @@ -1837,38 +1734,29 @@ Does not execute cell formulas or print functions." (search-backward ";; Local Variables:\n" nil t) (backward-list 1) (setq ses--params-marker (point-marker)) - (let* ((params (ignore-errors (read (current-buffer)))) - (params-len (safe-length params))) - (or (and (>= params-len 3) - (<= params-len 4) + (let ((params (ignore-errors (read (current-buffer))))) + (or (and (= (safe-length params) 3) (numberp (car params)) (numberp (cadr params)) (>= (cadr params) 0) (numberp (nth 2 params)) - (> (nth 2 params) 0) - (or (<= params-len 3) - (let ((numlocprn (nth 3 params))) - (and (integerp numlocprn) (>= numlocprn 0))))) + (> (nth 2 params) 0)) (error "Invalid SES file")) (setq ses--file-format (car params) ses--numrows (cadr params) - ses--numcols (nth 2 params) - ses--numlocprn (or (nth 3 params) 0)) + ses--numcols (nth 2 params)) (when (= ses--file-format 1) (let (buffer-undo-list) ; This is not undoable. (ses-goto-data 'ses--header-row) (insert "(ses-header-row 0)\n") - (ses-set-parameter 'ses--file-format 3) + (ses-set-parameter 'ses--file-format 2) (message "Upgrading from SES-1 file format"))) - (or (> ses--file-format 3) + (or (= ses--file-format 2) (error "This file needs a newer version of the SES library code")) ;; Initialize cell array. (setq ses--cells (make-vector ses--numrows nil)) (dotimes (row ses--numrows) - (aset ses--cells row (make-vector ses--numcols nil))) - ;; initialize local printer map. - (clrhash ses--local-printer-hashmap)) - + (aset ses--cells row (make-vector ses--numcols nil)))) ;; Skip over print area, which we assume is correct. (goto-char (point-min)) (forward-line ses--numrows) @@ -1879,22 +1767,7 @@ Does not execute cell formulas or print functions." (forward-char (1- (length ses-print-data-boundary))) ;; Initialize printer and symbol lists. (mapc 'ses-printer-record ses-standard-printer-functions) - (setq ses--symbolic-formulas nil) - - ;; Load local printer definitions. - ;; This must be loaded *BEFORE* cells and column printers because the latters - ;; may call them. - (save-excursion - (forward-line (* ses--numrows (1+ ses--numcols))) - (let ((numlocprn ses--numlocprn)) - (setq ses--numlocprn 0) - (dotimes (lp numlocprn) - (let ((x (read (current-buffer)))) - (or (and (looking-at-p "\n") - (eq (car-safe x) 'ses-local-printer) - (eval x)) - (error "local printer-def error")) - (setq ses--numlocprn (1+ ses--numlocprn)))))) + (setq ses--symbolic-formulas nil) ;; Load cell definitions. (dotimes (row ses--numrows) (dotimes (col ses--numcols) @@ -1907,8 +1780,6 @@ Does not execute cell formulas or print functions." (eval x))) (or (looking-at-p "\n\n") (error "Missing blank line between rows"))) - ;; Skip local printer function declaration --- that were already loaded. - (forward-line (+ 2 ses--numlocprn)) ;; Load global parameters. (let ((widths (read (current-buffer))) (n1 (char-after (point))) @@ -1933,7 +1804,8 @@ Does not execute cell formulas or print functions." (1value (eval head-row))) ;; Should be back at global-params. (forward-char 1) - (or (looking-at-p ses-initial-global-parameters-re) + (or (looking-at-p (replace-regexp-in-string "1" "[0-9]+" + ses-initial-global-parameters)) (error "Problem with column-defs or global-params")) ;; Check for overall newline count in definitions area. (forward-line 3) @@ -2517,10 +2389,8 @@ cells." ;;---------------------------------------------------------------------------- (defun ses-read-printer (prompt default) - "Common code for functions `ses-read-cell-printer', `ses-read-column-printer', -`ses-read-default-printer' and `ses-define-local-printer'. -PROMPT should end with \": \". Result is t if operation was -canceled." + "Common code for `ses-read-cell-printer', `ses-read-column-printer', and `ses-read-default-printer'. +PROMPT should end with \": \". Result is t if operation was canceled." (barf-if-buffer-read-only) (if (eq default t) (setq default "") @@ -2540,7 +2410,6 @@ canceled." (or (not new) (stringp new) (stringp (car-safe new)) - (and (symbolp new) (gethash new ses--local-printer-hashmap)) (ses-warn-unsafe new 'unsafep-function) (setq new t))) new)) @@ -3474,71 +3343,6 @@ highlighted range in the spreadsheet." (symbol-name new-name))) (force-mode-line-update))) -(defun ses-refresh-local-printer (name compiled-value) - "Refresh printout of spreadsheet for all cells with printer - defined to local printer named NAME using the value COMPILED-VALUE for this printer" - (message "Refreshing cells using printer %S" name) - (let (new-print) - (dotimes (row ses--numrows) - (dotimes (col ses--numcols) - (let ((cell-printer (ses-cell-printer row col))) - (when (eq cell-printer name) - (unless new-print - (setq new-print t) - (ses-begin-change)) - (ses-print-cell row col))))))) - -(defun ses-define-local-printer (printer-name) - "Define a local printer with name PRINTER-NAME." - (interactive "*SEnter printer name: ") - (let* ((cur-printer (gethash printer-name ses--local-printer-hashmap)) - (default (and (vectorp cur-printer) (ses-locprn-get-def cur-printer))) - printer-def-text - create-printer - (new-printer (ses-read-printer (format "Enter definition of printer %S: " printer-name) default))) - (cond - ;; cancelled operation => do nothing - ((eq new-printer t)) - ;; no change => do nothing - ((and (vectorp cur-printer) (equal new-printer default))) - ;; re-defined printer - ((vectorp cur-printer) - (setq create-printer 0) - (ses-locprn-def-aset cur-printer new-printer) - (ses-refresh-local-printer - printer-name - (ses-locprn-compiled-aset cur-printer (ses-local-printer-compile new-printer)))) - ;; new definition - (t - (setq create-printer 1) - (puthash printer-name - (setq cur-printer - (ses-make-local-printer-info new-printer)) - ses--local-printer-hashmap))) - (when create-printer - (setq printer-def-text - (concat - "(ses-local-printer " - (symbol-name printer-name) - " " - (prin1-to-string (ses-locprn-get-def cur-printer)) - ")")) - (save-excursion - (ses-goto-data ses--numrows - (ses-locprn-get-number cur-printer)) - (let ((inhibit-read-only t)) - ;; Special undo since it's outside the narrowed buffer. - (let (buffer-undo-list) - (if (= create-printer 0) - (delete-region (point) (line-end-position)) - (insert ?\n) - (backward-char)) - (insert printer-def-text) - (when (= create-printer 1) - (ses-file-format-extend-paramter-list 3) - (ses-set-parameter 'ses--numlocprn (+ ses--numlocprn create-printer))) ))))) ) - - ;;---------------------------------------------------------------------------- ;; Checking formulas for safety ;;---------------------------------------------------------------------------- @@ -3548,7 +3352,6 @@ highlighted range in the spreadsheet." (if (or (stringp printer) (stringp (car-safe printer)) (not printer) - (and (symbolp printer) (gethash printer ses--local-printer-hashmap)) (ses-warn-unsafe printer 'unsafep-function)) printer 'ses-unsafe))