1
0
mirror of https://github.com/m00natic/vlfi.git synced 2025-02-07 13:40:49 +00:00

Try utf-8 and if not successful, auto detect when adjusting chunk for

proper decoding.
This commit is contained in:
Andrey Kotlarski 2013-04-28 01:12:07 +03:00
parent d2bd47c2b4
commit ca13beac24

108
vlfi.el
View File

@ -296,6 +296,7 @@ When given MINIMAL flag, skip non important operations."
(let ((changed (not (verify-visited-file-modtime (let ((changed (not (verify-visited-file-modtime
(current-buffer)))) (current-buffer))))
(modified (buffer-modified-p)) (modified (buffer-modified-p))
(inhibit-read-only t)
(start (max 0 start)) (start (max 0 start))
(end (min end vlfi-file-size))) (end (min end vlfi-file-size)))
(if changed (if changed
@ -310,13 +311,14 @@ When given MINIMAL flag, skip non important operations."
(throw 'abort nil)) (throw 'abort nil))
(setq vlfi-start-pos start (setq vlfi-start-pos start
vlfi-end-pos end) vlfi-end-pos end)
(let ((inhibit-read-only t) (let ((pos (position-bytes (point))))
(pos (position-bytes (point))))
(erase-buffer) (erase-buffer)
(insert-file-contents-literally (insert-file-contents-literally
buffer-file-name nil vlfi-start-pos vlfi-end-pos) buffer-file-name nil vlfi-start-pos vlfi-end-pos)
(goto-char (or (byte-to-position (setq pos (+ pos (vlfi-prepare-chunk)))
(+ pos (vlfi-adjust-chunk))) (decode-coding-region (point-min) (point-max)
buffer-file-coding-system)
(goto-char (or (byte-to-position pos)
(point-max)))) (point-max))))
(set-buffer-modified-p nil)) (set-buffer-modified-p nil))
(if (and modified (if (and modified
@ -324,19 +326,16 @@ When given MINIMAL flag, skip non important operations."
(< 3 (- start vlfi-start-pos))) (< 3 (- start vlfi-start-pos)))
(not (y-or-n-p "Buffer modified, are you sure? "))) (not (y-or-n-p "Buffer modified, are you sure? ")))
(throw 'abort nil)) (throw 'abort nil))
(let ((pos (+ (position-bytes (point)) (let* ((pos (+ (position-bytes (point))
vlfi-start-pos)) vlfi-start-pos))
(adjust-encoding (or (< vlfi-end-pos end) (adjust-chunk (< start vlfi-start-pos))
(< start vlfi-start-pos))) (adjust-encoding (or adjust-chunk
(adjust-chunk (< start vlfi-start-pos))) (< vlfi-end-pos end))))
(if adjust-encoding (if adjust-encoding
(let ((inhibit-read-only t))
(encode-coding-region (point-min) (point-max) (encode-coding-region (point-min) (point-max)
buffer-file-coding-system))) buffer-file-coding-system))
(vlfi-print-offset "require goto:" start end)
(cond ((< end vlfi-end-pos) ; adjust ends (cond ((< end vlfi-end-pos) ; adjust ends
(let ((inhibit-read-only t) (let ((offset (- end vlfi-start-pos)))
(offset (- end vlfi-start-pos)))
(if adjust-encoding (if adjust-encoding
(progn (delete-region offset (point-max)) (progn (delete-region offset (point-max))
(setq vlfi-end-pos end))) (setq vlfi-end-pos end)))
@ -347,19 +346,16 @@ When given MINIMAL flag, skip non important operations."
(1- offset)))))) (1- offset))))))
((< vlfi-end-pos end) ((< vlfi-end-pos end)
(goto-char (point-max)) (goto-char (point-max))
(let ((inhibit-read-only t))
(insert-file-contents-literally (insert-file-contents-literally
buffer-file-name nil vlfi-end-pos end)) buffer-file-name nil vlfi-end-pos end)
(setq vlfi-end-pos end))) (setq vlfi-end-pos end)))
(cond ((< start vlfi-start-pos) ; adjust start (cond ((< start vlfi-start-pos) ; adjust start
(goto-char (point-min)) (goto-char (point-min))
(let ((inhibit-read-only t))
(insert-file-contents-literally (insert-file-contents-literally
buffer-file-name nil start vlfi-start-pos)) buffer-file-name nil start vlfi-start-pos)
(setq vlfi-start-pos start)) (setq vlfi-start-pos start))
((< 3 (- start vlfi-start-pos)) ((< 3 (- start vlfi-start-pos))
(let ((inhibit-read-only t) (let ((offset (- start vlfi-start-pos)))
(offset (- start vlfi-start-pos)))
(if adjust-encoding (if adjust-encoding
(progn (delete-region (point-min) offset) (progn (delete-region (point-min) offset)
(setq vlfi-start-pos start)) (setq vlfi-start-pos start))
@ -369,12 +365,11 @@ When given MINIMAL flag, skip non important operations."
(1+ offset)))) (1+ offset))))
(delete-region (point-min) offset))) (delete-region (point-min) offset)))
(setq vlfi-start-pos start))) (setq vlfi-start-pos start)))
(vlfi-print-offset "actual goto:" vlfi-start-pos vlfi-end-pos) (when adjust-encoding
(if adjust-chunk (vlfi-adjust-chunk)) (if adjust-chunk
(if adjust-encoding (vlfi-prepare-chunk))
(let ((inhibit-read-only t))
(decode-coding-region (point-min) (point-max) (decode-coding-region (point-min) (point-max)
buffer-file-coding-system))) buffer-file-coding-system))
(or modified (set-buffer-modified-p nil)) (or modified (set-buffer-modified-p nil))
(goto-char (goto-char
(cond ((< pos vlfi-start-pos) (point-min)) (cond ((< pos vlfi-start-pos) (point-min))
@ -384,38 +379,49 @@ When given MINIMAL flag, skip non important operations."
(if changed (set-visited-file-modtime))) (if changed (set-visited-file-modtime)))
(or minimal (vlfi-update-buffer-name)))) (or minimal (vlfi-update-buffer-name))))
(defun vlfi-print-offset (text start end) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(message "%s: %d %d" text start end)) ;;; encoding
(defun vlfi-adjust-chunk () (defun vlfi-prepare-chunk ()
"Adjust chunk beginning until content can be properly decoded. "Apply proper decoding and adjust chunk start if needed.
Return number of bytes moved back for this to happen." Return number of bytes moved back for this to happen."
(with-coding-priority '(utf-8) (let ((status (vlfi-adjust-chunk 'utf-8)))
(setq buffer-file-coding-system 'utf-8;; (detect-coding-region (point-min) (unless (car status) ; no success with utf-8, auto-detect
;; (point-max) (delete-region (point-min) (+ (point-min) (cdr status)))
;; t) (setq vlfi-start-pos (+ vlfi-start-pos (cdr status))
) status (vlfi-adjust-chunk)))
(cdr status)))
(defun vlfi-adjust-chunk (&optional encoding)
"Adjust chunk beginning until content can be properly decoded.
Try with explicit ENCODING if given, otherwise auto-detect.
Return cons \(success-status . number-of-bytes-moved-back\)."
(setq buffer-file-coding-system
(or encoding
(detect-coding-region (point-min) (point-max) t)))
(let ((shift 0) (let ((shift 0)
(inhibit-read-only t)) (success nil)
(while (and (not (zerop vlfi-start-pos)) (chunk-size (- vlfi-end-pos vlfi-start-pos)))
(< shift 3) (while (and (< shift 4)
(/= (- vlfi-end-pos vlfi-start-pos) (not (setq success (vlfi-decode-status chunk-size)))
(length (encode-coding-string (not (zerop vlfi-start-pos)))
(decode-coding-region (goto-char (point-min))
(point-min) (point-max) (insert-file-contents-literally ; insert 1 byte
buffer-file-name nil (1- vlfi-start-pos) vlfi-start-pos)
(setq shift (1+ shift)
chunk-size (1+ chunk-size)
vlfi-start-pos (1- vlfi-start-pos)
buffer-file-coding-system
(or encoding
(detect-coding-region (point-min) (point-max) t))))
(cons success shift)))
(defun vlfi-decode-status (size)
"Check if decoding followed by encoding results in SIZE bytes."
(= size (length (encode-coding-string
(decode-coding-region (point-min) (point-max)
buffer-file-coding-system t) buffer-file-coding-system t)
buffer-file-coding-system t)))) buffer-file-coding-system t))))
(setq shift (1+ shift)
vlfi-start-pos (1- vlfi-start-pos))
(goto-char (point-min))
(insert-file-contents-literally
buffer-file-name nil vlfi-start-pos (1+ vlfi-start-pos))
(setq buffer-file-coding-system 'utf-8
;; (detect-coding-region (point-min) (point-max) t)
))
(decode-coding-region (point-min) (point-max)
buffer-file-coding-system)
shift)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; search ;;; search