aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lisp/ChangeLog29
-rw-r--r--lisp/imenu.el2
-rw-r--r--lisp/profiler.el2
-rw-r--r--lisp/progmodes/cc-engine.el104
-rw-r--r--lisp/progmodes/python.el5
-rw-r--r--lisp/xml.el2
-rw-r--r--src/ChangeLog17
-rw-r--r--src/coding.c29
-rw-r--r--src/w32.c106
-rw-r--r--src/w32heap.c6
10 files changed, 223 insertions, 79 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 5efa7810ad2..1fc7b5d49ce 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,32 @@
12013-01-25 Fabián Ezequiel Gallina <fgallina@cuca>
2
3 * progmodes/python.el: Enhancements to header documentation about
4 skeletons. (Bug#5716)
5
6 * imenu.el (imenu-default-create-index-function): Remove useless
7 infinite loop check. (Bug#13438)
8
92013-01-25 Alan Mackenzie <acm@muc.de>
10
11 Fix a bug in the state cache mechanism. Refactor this a bit.
12
13 * progmodes/cc-engine.el (c-parse-state-get-strategy): Remove the
14 `cache-pos' element from the return value.
15 (c-append-lower-brace-pair-to-state-cache): "Narrow" to end of
16 buffer to enable proper searching from beyond HERE. Amend the
17 test for detecting the sought brace pair. Amend the value written
18 to the "brace desert cache" when the brace isn't found.
19 (c-remove-stale-state-cache): Rename `good-pos' to `start-point',
20 and several other variables analogously.
21 (c-remove-stale-state-cache-backwards): Change `cache-pos' from a
22 parameter to a locally calculated variable.
23 (c-parse-state-1): Change the calling conventions to the two
24 defuns involving `cache-pos'.
25
262013-01-25 Chong Yidong <cyd@gnu.org>
27
28 * xml.el (xml-entity-or-char-ref-re): Fix regexp.
29
12013-01-24 Aaron Ecay <aaronecay@gmail.com> (tiny change) 302013-01-24 Aaron Ecay <aaronecay@gmail.com> (tiny change)
2 31
3 * paren.el (show-paren-function): Make sure to set 'priority and 32 * paren.el (show-paren-function): Make sure to set 'priority and
diff --git a/lisp/imenu.el b/lisp/imenu.el
index f64d1afe951..ba0275099a1 100644
--- a/lisp/imenu.el
+++ b/lisp/imenu.el
@@ -683,8 +683,6 @@ The alternate method, which is the one most often used, is to call
683 (goto-char (point-max)) 683 (goto-char (point-max))
684 ;; Search for the function 684 ;; Search for the function
685 (while (funcall imenu-prev-index-position-function) 685 (while (funcall imenu-prev-index-position-function)
686 (when (= pos (point))
687 (error "Infinite loop at %s:%d: imenu-prev-index-position-function does not move point" (buffer-name) pos))
688 (setq pos (point)) 686 (setq pos (point))
689 (save-excursion 687 (save-excursion
690 (setq name (funcall imenu-extract-index-name-function))) 688 (setq name (funcall imenu-extract-index-name-function)))
diff --git a/lisp/profiler.el b/lisp/profiler.el
index 9c73fc6e590..73b751c3fcd 100644
--- a/lisp/profiler.el
+++ b/lisp/profiler.el
@@ -20,7 +20,7 @@
20 20
21;;; Commentary: 21;;; Commentary:
22 22
23;; 23;; See Info node `(elisp)Profiling'.
24 24
25;;; Code: 25;;; Code:
26 26
diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el
index 560b66bf3b0..1eac45d06e0 100644
--- a/lisp/progmodes/cc-engine.el
+++ b/lisp/progmodes/cc-engine.el
@@ -2545,14 +2545,12 @@ comment at the start of cc-engine.el for more info."
2545 ;; 2545 ;;
2546 ;; The return value is a list, one of the following: 2546 ;; The return value is a list, one of the following:
2547 ;; 2547 ;;
2548 ;; o - ('forward CACHE-POS START-POINT) - scan forward from START-POINT, 2548 ;; o - ('forward START-POINT) - scan forward from START-POINT,
2549 ;; which is not less than CACHE-POS. 2549 ;; which is not less than the highest position in `c-state-cache' below here.
2550 ;; o - ('backward CACHE-POS nil) - scan backwards (from HERE). 2550 ;; o - ('backward nil) - scan backwards (from HERE).
2551 ;; o - ('BOD nil START-POINT) - scan forwards from START-POINT, which is at the 2551 ;; o - ('BOD START-POINT) - scan forwards from START-POINT, which is at the
2552 ;; top level. 2552 ;; top level.
2553 ;; o - ('IN-LIT nil nil) - point is inside the literal containing point-min. 2553 ;; o - ('IN-LIT nil) - point is inside the literal containing point-min.
2554 ;; , where CACHE-POS is the highest position recorded in `c-state-cache' at
2555 ;; or below HERE.
2556 (let ((cache-pos (c-get-cache-scan-pos here)) ; highest position below HERE in cache (or 1) 2554 (let ((cache-pos (c-get-cache-scan-pos here)) ; highest position below HERE in cache (or 1)
2557 BOD-pos ; position of 2nd BOD before HERE. 2555 BOD-pos ; position of 2nd BOD before HERE.
2558 strategy ; 'forward, 'backward, 'BOD, or 'IN-LIT. 2556 strategy ; 'forward, 'backward, 'BOD, or 'IN-LIT.
@@ -2590,7 +2588,6 @@ comment at the start of cc-engine.el for more info."
2590 2588
2591 (list 2589 (list
2592 strategy 2590 strategy
2593 (and (memq strategy '(forward backward)) cache-pos)
2594 (and (memq strategy '(forward BOD)) start-point)))) 2591 (and (memq strategy '(forward BOD)) start-point))))
2595 2592
2596 2593
@@ -2657,7 +2654,8 @@ comment at the start of cc-engine.el for more info."
2657 ;; reduce the time wasted in repeated fruitless searches in brace deserts. 2654 ;; reduce the time wasted in repeated fruitless searches in brace deserts.
2658 (save-excursion 2655 (save-excursion
2659 (save-restriction 2656 (save-restriction
2660 (let* (new-cons 2657 (let* ((here (point-max))
2658 new-cons
2661 (cache-pos (c-state-cache-top-lparen)) ; might be nil. 2659 (cache-pos (c-state-cache-top-lparen)) ; might be nil.
2662 (macro-start-or-from 2660 (macro-start-or-from
2663 (progn (goto-char from) 2661 (progn (goto-char from)
@@ -2692,6 +2690,7 @@ comment at the start of cc-engine.el for more info."
2692 ;; search bound, even though the algorithm below would skip 2690 ;; search bound, even though the algorithm below would skip
2693 ;; over the new paren pair. 2691 ;; over the new paren pair.
2694 (cache-lim (and cache-pos (< cache-pos from) cache-pos))) 2692 (cache-lim (and cache-pos (< cache-pos from) cache-pos)))
2693 (widen)
2695 (narrow-to-region 2694 (narrow-to-region
2696 (cond 2695 (cond
2697 ((and desert-lim cache-lim) 2696 ((and desert-lim cache-lim)
@@ -2711,16 +2710,18 @@ comment at the start of cc-engine.el for more info."
2711 (while 2710 (while
2712 (and (setq ce (scan-lists bra -1 -1)) ; back past )/]/}; might signal 2711 (and (setq ce (scan-lists bra -1 -1)) ; back past )/]/}; might signal
2713 (setq bra (scan-lists ce -1 1)) ; back past (/[/{; might signal 2712 (setq bra (scan-lists ce -1 1)) ; back past (/[/{; might signal
2714 (or (> ce upper-lim) 2713 (or (> bra here) ;(> ce here)
2715 (not (eq (char-after bra) ?\{)) 2714 (and
2716 (and (goto-char bra) 2715 (< ce here)
2717 (c-beginning-of-macro) 2716 (or (not (eq (char-after bra) ?\{))
2718 (< (point) macro-start-or-from)))))) 2717 (and (goto-char bra)
2718 (c-beginning-of-macro)
2719 (< (point) macro-start-or-from))))))))
2719 (and ce (< ce bra))) 2720 (and ce (< ce bra)))
2720 (setq bra ce)) ; If we just backed over an unbalanced closing 2721 (setq bra ce)) ; If we just backed over an unbalanced closing
2721 ; brace, ignore it. 2722 ; brace, ignore it.
2722 2723
2723 (if (and ce (< bra ce) (eq (char-after bra) ?\{)) 2724 (if (and ce (< ce here) (< bra ce) (eq (char-after bra) ?\{))
2724 ;; We've found the desired brace-pair. 2725 ;; We've found the desired brace-pair.
2725 (progn 2726 (progn
2726 (setq new-cons (cons bra (1+ ce))) 2727 (setq new-cons (cons bra (1+ ce)))
@@ -2734,7 +2735,11 @@ comment at the start of cc-engine.el for more info."
2734 (t (setq c-state-cache (cons new-cons c-state-cache))))) 2735 (t (setq c-state-cache (cons new-cons c-state-cache)))))
2735 2736
2736 ;; We haven't found a brace pair. Record this in the cache. 2737 ;; We haven't found a brace pair. Record this in the cache.
2737 (setq c-state-brace-pair-desert (cons cache-pos from)))))))) 2738 (setq c-state-brace-pair-desert
2739 (cons (if (and ce (< bra ce) (> ce here)) ; {..} straddling HERE?
2740 bra
2741 (point-min))
2742 (min here from)))))))))
2738 2743
2739(defsubst c-state-push-any-brace-pair (bra+1 macro-start-or-here) 2744(defsubst c-state-push-any-brace-pair (bra+1 macro-start-or-here)
2740 ;; If BRA+1 is nil, do nothing. Otherwise, BRA+1 is the buffer position 2745 ;; If BRA+1 is nil, do nothing. Otherwise, BRA+1 is the buffer position
@@ -2852,19 +2857,19 @@ comment at the start of cc-engine.el for more info."
2852 (paren+1) 2857 (paren+1)
2853 (t from))))) 2858 (t from)))))
2854 2859
2855(defun c-remove-stale-state-cache (good-pos pps-point) 2860(defun c-remove-stale-state-cache (start-point pps-point)
2856 ;; Remove stale entries from the `c-cache-state', i.e. those which will 2861 ;; Remove stale entries from the `c-cache-state', i.e. those which will
2857 ;; not be in it when it is amended for position (point-max). 2862 ;; not be in it when it is amended for position (point-max).
2858 ;; Additionally, the "outermost" open-brace entry before (point-max) 2863 ;; Additionally, the "outermost" open-brace entry before (point-max)
2859 ;; will be converted to a cons if the matching close-brace is scanned. 2864 ;; will be converted to a cons if the matching close-brace is scanned.
2860 ;; 2865 ;;
2861 ;; GOOD-POS is a "maximal" "safe position" - there must be no open 2866 ;; START-POINT is a "maximal" "safe position" - there must be no open
2862 ;; parens/braces/brackets between GOOD-POS and (point-max). 2867 ;; parens/braces/brackets between START-POINT and (point-max).
2863 ;; 2868 ;;
2864 ;; As a second thing, calculate the result of parse-partial-sexp at 2869 ;; As a second thing, calculate the result of parse-partial-sexp at
2865 ;; PPS-POINT, w.r.t. GOOD-POS. The motivation here is that 2870 ;; PPS-POINT, w.r.t. START-POINT. The motivation here is that
2866 ;; `c-state-cache-good-pos' may become PPS-POINT, but the caller may need to 2871 ;; `c-state-cache-good-pos' may become PPS-POINT, but the caller may need to
2867 ;; adjust it to get outside a string/comment. (Sorry about this! The code 2872 ;; adjust it to get outside a string/comment. (Sorry about this! The code
2868 ;; needs to be FAST). 2873 ;; needs to be FAST).
2869 ;; 2874 ;;
2870 ;; Return a list (GOOD-POS SCAN-BACK-POS PPS-STATE), where 2875 ;; Return a list (GOOD-POS SCAN-BACK-POS PPS-STATE), where
@@ -2872,7 +2877,9 @@ comment at the start of cc-engine.el for more info."
2872 ;; to be good (we aim for this to be as high as possible); 2877 ;; to be good (we aim for this to be as high as possible);
2873 ;; o - SCAN-BACK-POS, if not nil, indicates there may be a brace pair 2878 ;; o - SCAN-BACK-POS, if not nil, indicates there may be a brace pair
2874 ;; preceding POS which needs to be recorded in `c-state-cache'. It is a 2879 ;; preceding POS which needs to be recorded in `c-state-cache'. It is a
2875 ;; position to scan backwards from. 2880 ;; position to scan backwards from. It is the position of the "{" of the
2881 ;; last element to be removed from `c-state-cache', when that elt is a
2882 ;; cons, otherwise nil.
2876 ;; o - PPS-STATE is the parse-partial-sexp state at PPS-POINT. 2883 ;; o - PPS-STATE is the parse-partial-sexp state at PPS-POINT.
2877 (save-restriction 2884 (save-restriction
2878 (narrow-to-region 1 (point-max)) 2885 (narrow-to-region 1 (point-max))
@@ -2882,21 +2889,21 @@ comment at the start of cc-engine.el for more info."
2882 (goto-char (point-max)) 2889 (goto-char (point-max))
2883 (and (c-beginning-of-macro) 2890 (and (c-beginning-of-macro)
2884 (point)))) 2891 (point))))
2885 (good-pos-actual-macro-start ; Start of macro containing good-pos 2892 (start-point-actual-macro-start ; Start of macro containing
2886 ; or nil 2893 ; start-point or nil
2887 (and (< good-pos (point-max)) 2894 (and (< start-point (point-max))
2888 (save-excursion 2895 (save-excursion
2889 (goto-char good-pos) 2896 (goto-char start-point)
2890 (and (c-beginning-of-macro) 2897 (and (c-beginning-of-macro)
2891 (point))))) 2898 (point)))))
2892 (good-pos-actual-macro-end ; End of this macro, (maybe 2899 (start-point-actual-macro-end ; End of this macro, (maybe
2893 ; (point-max)), or nil. 2900 ; (point-max)), or nil.
2894 (and good-pos-actual-macro-start 2901 (and start-point-actual-macro-start
2895 (save-excursion 2902 (save-excursion
2896 (goto-char good-pos-actual-macro-start) 2903 (goto-char start-point-actual-macro-start)
2897 (c-end-of-macro) 2904 (c-end-of-macro)
2898 (point)))) 2905 (point))))
2899 pps-state ; Will be 9 or 10 elements long. 2906 pps-state ; Will be 9 or 10 elements long.
2900 pos 2907 pos
2901 upper-lim ; ,beyond which `c-state-cache' entries are removed 2908 upper-lim ; ,beyond which `c-state-cache' entries are removed
2902 scan-back-pos 2909 scan-back-pos
@@ -2926,15 +2933,15 @@ comment at the start of cc-engine.el for more info."
2926 ;; The next loop jumps forward out of a nested level of parens each 2933 ;; The next loop jumps forward out of a nested level of parens each
2927 ;; time round; the corresponding elements in `c-state-cache' are 2934 ;; time round; the corresponding elements in `c-state-cache' are
2928 ;; removed. `pos' is just after the brace-pair or the open paren at 2935 ;; removed. `pos' is just after the brace-pair or the open paren at
2929 ;; (car c-state-cache). There can be no open parens/braces/brackets 2936 ;; (car c-state-cache). There can be no open parens/braces/brackets
2930 ;; between `good-pos'/`good-pos-actual-macro-start' and (point-max), 2937 ;; between `start-point'/`start-point-actual-macro-start' and (point-max),
2931 ;; due to the interface spec to this function. 2938 ;; due to the interface spec to this function.
2932 (setq pos (if (and good-pos-actual-macro-end 2939 (setq pos (if (and start-point-actual-macro-end
2933 (not (eq good-pos-actual-macro-start 2940 (not (eq start-point-actual-macro-start
2934 in-macro-start))) 2941 in-macro-start)))
2935 (1+ good-pos-actual-macro-end) ; get outside the macro as 2942 (1+ start-point-actual-macro-end) ; get outside the macro as
2936 ; marked by a `category' text property. 2943 ; marked by a `category' text property.
2937 good-pos)) 2944 start-point))
2938 (goto-char pos) 2945 (goto-char pos)
2939 (while (and c-state-cache 2946 (while (and c-state-cache
2940 (< (point) (point-max))) 2947 (< (point) (point-max)))
@@ -2993,14 +3000,14 @@ comment at the start of cc-engine.el for more info."
2993 3000
2994 (list pos scan-back-pos pps-state))))) 3001 (list pos scan-back-pos pps-state)))))
2995 3002
2996(defun c-remove-stale-state-cache-backwards (here cache-pos) 3003(defun c-remove-stale-state-cache-backwards (here)
2997 ;; Strip stale elements of `c-state-cache' by moving backwards through the 3004 ;; Strip stale elements of `c-state-cache' by moving backwards through the
2998 ;; buffer, and inform the caller of the scenario detected. 3005 ;; buffer, and inform the caller of the scenario detected.
2999 ;; 3006 ;;
3000 ;; HERE is the position we're setting `c-state-cache' for. 3007 ;; HERE is the position we're setting `c-state-cache' for.
3001 ;; CACHE-POS is just after the latest recorded position in `c-state-cache' 3008 ;; CACHE-POS (a locally bound variable) is just after the latest recorded
3002 ;; before HERE, or a position at or near point-min which isn't in a 3009 ;; position in `c-state-cache' before HERE, or a position at or near
3003 ;; literal. 3010 ;; point-min which isn't in a literal.
3004 ;; 3011 ;;
3005 ;; This function must only be called only when (> `c-state-cache-good-pos' 3012 ;; This function must only be called only when (> `c-state-cache-good-pos'
3006 ;; HERE). Usually the gap between CACHE-POS and HERE is large. It is thus 3013 ;; HERE). Usually the gap between CACHE-POS and HERE is large. It is thus
@@ -3023,10 +3030,11 @@ comment at the start of cc-engine.el for more info."
3023 ;; The comments in this defun use "paren" to mean parenthesis or square 3030 ;; The comments in this defun use "paren" to mean parenthesis or square
3024 ;; bracket (as contrasted with a brace), and "(" and ")" likewise. 3031 ;; bracket (as contrasted with a brace), and "(" and ")" likewise.
3025 ;; 3032 ;;
3026 ;; . {..} (..) (..) ( .. { } ) (...) ( .... . ..) 3033 ;; . {..} (..) (..) ( .. { } ) (...) ( .... . ..)
3027 ;; | | | | | | 3034 ;; | | | | | |
3028 ;; CP E here D C good 3035 ;; CP E here D C good
3029 (let ((pos c-state-cache-good-pos) 3036 (let ((cache-pos (c-get-cache-scan-pos here)) ; highest position below HERE in cache (or 1)
3037 (pos c-state-cache-good-pos)
3030 pa ren ; positions of "(" and ")" 3038 pa ren ; positions of "(" and ")"
3031 dropped-cons ; whether the last element dropped from `c-state-cache' 3039 dropped-cons ; whether the last element dropped from `c-state-cache'
3032 ; was a cons (representing a brace-pair) 3040 ; was a cons (representing a brace-pair)
@@ -3263,7 +3271,8 @@ comment at the start of cc-engine.el for more info."
3263 cache-pos ; highest position below HERE already existing in 3271 cache-pos ; highest position below HERE already existing in
3264 ; cache (or 1). 3272 ; cache (or 1).
3265 good-pos 3273 good-pos
3266 start-point 3274 start-point ; (when scanning forward) a place below HERE where there
3275 ; are no open parens/braces between it and HERE.
3267 bopl-state 3276 bopl-state
3268 res 3277 res
3269 scan-backward-pos scan-forward-p) ; used for 'backward. 3278 scan-backward-pos scan-forward-p) ; used for 'backward.
@@ -3274,8 +3283,7 @@ comment at the start of cc-engine.el for more info."
3274 ;; Strategy? 3283 ;; Strategy?
3275 (setq res (c-parse-state-get-strategy here c-state-cache-good-pos) 3284 (setq res (c-parse-state-get-strategy here c-state-cache-good-pos)
3276 strategy (car res) 3285 strategy (car res)
3277 cache-pos (cadr res) 3286 start-point (cadr res))
3278 start-point (nth 2 res))
3279 3287
3280 (when (eq strategy 'BOD) 3288 (when (eq strategy 'BOD)
3281 (setq c-state-cache nil 3289 (setq c-state-cache nil
@@ -3302,7 +3310,7 @@ comment at the start of cc-engine.el for more info."
3302 good-pos))) 3310 good-pos)))
3303 3311
3304 ((eq strategy 'backward) 3312 ((eq strategy 'backward)
3305 (setq res (c-remove-stale-state-cache-backwards here cache-pos) 3313 (setq res (c-remove-stale-state-cache-backwards here)
3306 good-pos (car res) 3314 good-pos (car res)
3307 scan-backward-pos (cadr res) 3315 scan-backward-pos (cadr res)
3308 scan-forward-p (car (cddr res))) 3316 scan-forward-p (car (cddr res)))
diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index 0e5f4c82090..2f353feb323 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -155,7 +155,10 @@
155;; dabbrev. If you have `dabbrev-mode' activated and 155;; dabbrev. If you have `dabbrev-mode' activated and
156;; `python-skeleton-autoinsert' is set to t, then whenever you type 156;; `python-skeleton-autoinsert' is set to t, then whenever you type
157;; the name of any of those defined and hit SPC, they will be 157;; the name of any of those defined and hit SPC, they will be
158;; automatically expanded. 158;; automatically expanded. As an alternative you can use the defined
159;; skeleton commands: `python-skeleton-class', `python-skeleton-def'
160;; `python-skeleton-for', `python-skeleton-if', `python-skeleton-try'
161;; and `python-skeleton-while'.
159 162
160;; FFAP: You can find the filename for a given module when using ffap 163;; FFAP: You can find the filename for a given module when using ffap
161;; out of the box. This feature needs an inferior python shell 164;; out of the box. This feature needs an inferior python shell
diff --git a/lisp/xml.el b/lisp/xml.el
index b6c37612ab3..2232746f02a 100644
--- a/lisp/xml.el
+++ b/lisp/xml.el
@@ -200,7 +200,7 @@ See also `xml-get-attribute-or-nil'."
200;; [68] EntityRef ::= '&' Name ';' 200;; [68] EntityRef ::= '&' Name ';'
201(defconst xml-entity-ref (concat "&" xml-name-re ";")) 201(defconst xml-entity-ref (concat "&" xml-name-re ";"))
202 202
203(defconst xml-entity-or-char-ref-re (concat "&\\(?:#\\(x\\)?\\([0-9]+\\)\\|\\(" 203(defconst xml-entity-or-char-ref-re (concat "&\\(?:#\\(x\\)?\\([0-9a-fA-F]+\\)\\|\\("
204 xml-name-re "\\)\\);")) 204 xml-name-re "\\)\\);"))
205 205
206;; [69] PEReference ::= '%' Name ';' 206;; [69] PEReference ::= '%' Name ';'
diff --git a/src/ChangeLog b/src/ChangeLog
index ffa4bdf927f..7d9647cbb11 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,20 @@
12013-01-25 Eli Zaretskii <eliz@gnu.org>
2
3 * w32.c (max_filename_mbslen): New function.
4 (normalize_filename, readdir): Use it to detect locales where ANSI
5 encoding of file names uses a double-byte character set (DBCS).
6 If a DBCS encoding is used, advance by characters using
7 CharNextExA, instead of incrementing a 'char *' pointer. Use
8 _mbslwr instead of _strlwr. (Bug#13515)
9
10 * w32heap.c (allocate_heap) [!_WIN64]: Decrease the initial
11 request of memory reservation to 1.7GB. (Bug#13065)
12
132013-01-25 Andreas Schwab <schwab@linux-m68k.org>
14
15 * coding.c (detect_coding_iso_2022): Move back mis-reordered code
16 at check_extra_latin label. (Bug#13505)
17
12013-01-24 Dmitry Antipov <dmantipov@yandex.ru> 182013-01-24 Dmitry Antipov <dmantipov@yandex.ru>
2 19
3 * nsfont.m (ns_escape_name, ns_unescape_name, ns_registry_to_script): 20 * nsfont.m (ns_escape_name, ns_unescape_name, ns_registry_to_script):
diff --git a/src/coding.c b/src/coding.c
index a9bf9032a69..93da9db0d36 100644
--- a/src/coding.c
+++ b/src/coding.c
@@ -3057,20 +3057,7 @@ detect_coding_iso_2022 (struct coding_system *coding,
3057 } 3057 }
3058 if (single_shifting) 3058 if (single_shifting)
3059 break; 3059 break;
3060 check_extra_latin: 3060 goto check_extra_latin;
3061 if (! VECTORP (Vlatin_extra_code_table)
3062 || NILP (AREF (Vlatin_extra_code_table, c)))
3063 {
3064 rejected = CATEGORY_MASK_ISO;
3065 break;
3066 }
3067 if (CODING_ISO_FLAGS (&coding_categories[coding_category_iso_8_1])
3068 & CODING_ISO_FLAG_LATIN_EXTRA)
3069 found |= CATEGORY_MASK_ISO_8_1;
3070 else
3071 rejected |= CATEGORY_MASK_ISO_8_1;
3072 rejected |= CATEGORY_MASK_ISO_8_2;
3073 break;
3074 3061
3075 default: 3062 default:
3076 if (c < 0) 3063 if (c < 0)
@@ -3121,6 +3108,20 @@ detect_coding_iso_2022 (struct coding_system *coding,
3121 } 3108 }
3122 break; 3109 break;
3123 } 3110 }
3111 check_extra_latin:
3112 if (! VECTORP (Vlatin_extra_code_table)
3113 || NILP (AREF (Vlatin_extra_code_table, c)))
3114 {
3115 rejected = CATEGORY_MASK_ISO;
3116 break;
3117 }
3118 if (CODING_ISO_FLAGS (&coding_categories[coding_category_iso_8_1])
3119 & CODING_ISO_FLAG_LATIN_EXTRA)
3120 found |= CATEGORY_MASK_ISO_8_1;
3121 else
3122 rejected |= CATEGORY_MASK_ISO_8_1;
3123 rejected |= CATEGORY_MASK_ISO_8_2;
3124 break;
3124 } 3125 }
3125 } 3126 }
3126 detect_info->rejected |= CATEGORY_MASK_ISO; 3127 detect_info->rejected |= CATEGORY_MASK_ISO;
diff --git a/src/w32.c b/src/w32.c
index d014609076e..f722bc5f397 100644
--- a/src/w32.c
+++ b/src/w32.c
@@ -37,7 +37,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
37/* must include CRT headers *before* config.h */ 37/* must include CRT headers *before* config.h */
38 38
39#include <config.h> 39#include <config.h>
40#include <mbstring.h> /* for _mbspbrk */ 40#include <mbstring.h> /* for _mbspbrk and _mbslwr */
41 41
42#undef access 42#undef access
43#undef chdir 43#undef chdir
@@ -1531,6 +1531,67 @@ srandom (int seed)
1531 srand (seed); 1531 srand (seed);
1532} 1532}
1533 1533
1534/* Current codepage for encoding file names. */
1535static int file_name_codepage;
1536
1537/* Return the maximum length in bytes of a multibyte character
1538 sequence encoded in the current ANSI codepage. This is required to
1539 correctly walk the encoded file names one character at a time. */
1540static int
1541max_filename_mbslen (void)
1542{
1543 /* A simple cache to avoid calling GetCPInfo every time we need to
1544 normalize a file name. The file-name encoding is not supposed to
1545 be changed too frequently, if ever. */
1546 static Lisp_Object last_file_name_encoding;
1547 static int last_max_mbslen;
1548 Lisp_Object current_encoding;
1549
1550 current_encoding = Vfile_name_coding_system;
1551 if (NILP (current_encoding))
1552 current_encoding = Vdefault_file_name_coding_system;
1553
1554 if (!EQ (last_file_name_encoding, current_encoding))
1555 {
1556 CPINFO cp_info;
1557
1558 last_file_name_encoding = current_encoding;
1559 /* Default to the current ANSI codepage. */
1560 file_name_codepage = w32_ansi_code_page;
1561 if (!NILP (current_encoding))
1562 {
1563 char *cpname = SDATA (SYMBOL_NAME (current_encoding));
1564 char *cp = NULL, *end;
1565 int cpnum;
1566
1567 if (strncmp (cpname, "cp", 2) == 0)
1568 cp = cpname + 2;
1569 else if (strncmp (cpname, "windows-", 8) == 0)
1570 cp = cpname + 8;
1571
1572 if (cp)
1573 {
1574 end = cp;
1575 cpnum = strtol (cp, &end, 10);
1576 if (cpnum && *end == '\0' && end - cp >= 2)
1577 file_name_codepage = cpnum;
1578 }
1579 }
1580
1581 if (!file_name_codepage)
1582 file_name_codepage = CP_ACP; /* CP_ACP = 0, but let's not assume that */
1583
1584 if (!GetCPInfo (file_name_codepage, &cp_info))
1585 {
1586 file_name_codepage = CP_ACP;
1587 if (!GetCPInfo (file_name_codepage, &cp_info))
1588 emacs_abort ();
1589 }
1590 last_max_mbslen = cp_info.MaxCharSize;
1591 }
1592
1593 return last_max_mbslen;
1594}
1534 1595
1535/* Normalize filename by converting all path separators to 1596/* Normalize filename by converting all path separators to
1536 the specified separator. Also conditionally convert upper 1597 the specified separator. Also conditionally convert upper
@@ -1540,14 +1601,20 @@ static void
1540normalize_filename (register char *fp, char path_sep) 1601normalize_filename (register char *fp, char path_sep)
1541{ 1602{
1542 char sep; 1603 char sep;
1543 char *elem; 1604 char *elem, *p2;
1605 int dbcs_p = max_filename_mbslen () > 1;
1544 1606
1545 /* Always lower-case drive letters a-z, even if the filesystem 1607 /* Always lower-case drive letters a-z, even if the filesystem
1546 preserves case in filenames. 1608 preserves case in filenames.
1547 This is so filenames can be compared by string comparison 1609 This is so filenames can be compared by string comparison
1548 functions that are case-sensitive. Even case-preserving filesystems 1610 functions that are case-sensitive. Even case-preserving filesystems
1549 do not distinguish case in drive letters. */ 1611 do not distinguish case in drive letters. */
1550 if (fp[1] == ':' && *fp >= 'A' && *fp <= 'Z') 1612 if (dbcs_p)
1613 p2 = CharNextExA (file_name_codepage, fp, 0);
1614 else
1615 p2 = fp + 1;
1616
1617 if (*p2 == ':' && *fp >= 'A' && *fp <= 'Z')
1551 { 1618 {
1552 *fp += 'a' - 'A'; 1619 *fp += 'a' - 'A';
1553 fp += 2; 1620 fp += 2;
@@ -1559,7 +1626,10 @@ normalize_filename (register char *fp, char path_sep)
1559 { 1626 {
1560 if (*fp == '/' || *fp == '\\') 1627 if (*fp == '/' || *fp == '\\')
1561 *fp = path_sep; 1628 *fp = path_sep;
1562 fp++; 1629 if (!dbcs_p)
1630 fp++;
1631 else
1632 fp = CharNextExA (file_name_codepage, fp, 0);
1563 } 1633 }
1564 return; 1634 return;
1565 } 1635 }
@@ -1582,13 +1652,20 @@ normalize_filename (register char *fp, char path_sep)
1582 if (elem && elem != fp) 1652 if (elem && elem != fp)
1583 { 1653 {
1584 *fp = 0; /* temporary end of string */ 1654 *fp = 0; /* temporary end of string */
1585 _strlwr (elem); /* while we convert to lower case */ 1655 _mbslwr (elem); /* while we convert to lower case */
1586 } 1656 }
1587 *fp = sep; /* convert (or restore) path separator */ 1657 *fp = sep; /* convert (or restore) path separator */
1588 elem = fp + 1; /* next element starts after separator */ 1658 elem = fp + 1; /* next element starts after separator */
1589 sep = path_sep; 1659 sep = path_sep;
1590 } 1660 }
1591 } while (*fp++); 1661 if (*fp)
1662 {
1663 if (!dbcs_p)
1664 fp++;
1665 else
1666 fp = CharNextExA (file_name_codepage, fp, 0);
1667 }
1668 } while (*fp);
1592} 1669}
1593 1670
1594/* Destructively turn backslashes into slashes. */ 1671/* Destructively turn backslashes into slashes. */
@@ -2860,15 +2937,22 @@ readdir (DIR *dirp)
2860 strcpy (dir_static.d_name, dir_find_data.cFileName); 2937 strcpy (dir_static.d_name, dir_find_data.cFileName);
2861 dir_static.d_namlen = strlen (dir_static.d_name); 2938 dir_static.d_namlen = strlen (dir_static.d_name);
2862 if (dir_is_fat) 2939 if (dir_is_fat)
2863 _strlwr (dir_static.d_name); 2940 _mbslwr (dir_static.d_name);
2864 else if (downcase) 2941 else if (downcase)
2865 { 2942 {
2866 register char *p; 2943 register char *p;
2867 for (p = dir_static.d_name; *p; p++) 2944 int dbcs_p = max_filename_mbslen () > 1;
2868 if (*p >= 'a' && *p <= 'z') 2945 for (p = dir_static.d_name; *p; )
2869 break; 2946 {
2947 if (*p >= 'a' && *p <= 'z')
2948 break;
2949 if (dbcs_p)
2950 p = CharNextExA (file_name_codepage, p, 0);
2951 else
2952 p++;
2953 }
2870 if (!*p) 2954 if (!*p)
2871 _strlwr (dir_static.d_name); 2955 _mbslwr (dir_static.d_name);
2872 } 2956 }
2873 2957
2874 return &dir_static; 2958 return &dir_static;
diff --git a/src/w32heap.c b/src/w32heap.c
index 9c189dbda6d..81206ce2834 100644
--- a/src/w32heap.c
+++ b/src/w32heap.c
@@ -98,7 +98,11 @@ allocate_heap (void)
98#ifdef _WIN64 98#ifdef _WIN64
99 size_t size = 0x4000000000i64; /* start by asking for 32GB */ 99 size_t size = 0x4000000000i64; /* start by asking for 32GB */
100#else 100#else
101 size_t size = 0x80000000; /* start by asking for 2GB */ 101 /* We used to start with 2GB here, but on Windows 7 that would leave
102 too little room in the address space for threads started by
103 Windows on our behalf, e.g. when we pop up the file selection
104 dialog. */
105 size_t size = 0x68000000; /* start by asking for 1.7GB */
102#endif 106#endif
103 void *ptr = NULL; 107 void *ptr = NULL;
104 108