Mercurial > vim
annotate runtime/indent/occam.vim @ 27673:ba7dcf54d309 v8.2.4362
patch 8.2.4362: :retab may allocate too much memory
Commit: https://github.com/vim/vim/commit/33f3c5985491032d5bdfc30e722e85d5a0285e64
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Feb 12 20:46:15 2022 +0000
patch 8.2.4362: :retab may allocate too much memory
Problem: :retab may allocate too much memory.
Solution: Bail out when allocating more than MAXCOL bytes.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 12 Feb 2022 22:00:03 +0100 |
parents | 9c221ad9634a |
children | 6dd88e45d47d |
rev | line source |
---|---|
7 | 1 " Vim indent file |
2 " Language: occam | |
25880 | 3 " Maintainer: Mario Schweigler <ms44@kent.ac.uk> (Invalid email address) |
4 " Doug Kearns <dougkearns@gmail.com> | |
7 | 5 " Last Change: 23 April 2003 |
6 | |
7 " Only load this indent file when no other was loaded. | |
8 if exists("b:did_indent") | |
9 finish | |
10 endif | |
11 let b:did_indent = 1 | |
12 | |
13 "{{{ Settings | |
14 " Set the occam indent function | |
15 setlocal indentexpr=GetOccamIndent() | |
16 " Indent after new line and after initial colon | |
17 setlocal indentkeys=o,O,0=: | |
18 "}}} | |
19 | |
20 " Only define the function once | |
21 if exists("*GetOccamIndent") | |
22 finish | |
23 endif | |
3526
dd6c2497c997
Fix more 'cpo' issues in runtime files.
Bram Moolenaar <bram@vim.org>
parents:
7
diff
changeset
|
24 let s:keepcpo= &cpo |
dd6c2497c997
Fix more 'cpo' issues in runtime files.
Bram Moolenaar <bram@vim.org>
parents:
7
diff
changeset
|
25 set cpo&vim |
7 | 26 |
27 "{{{ Indent definitions | |
28 " Define carriage return indent | |
29 let s:FirstLevelIndent = '^\C\s*\(IF\|ALT\|PRI\s\+ALT\|PAR\|SEQ\|PRI\s\+PAR\|WHILE\|VALOF\|CLAIM\|FORKING\)\>\|\(--.*\)\@<!\(\<PROC\>\|??\|\<CASE\>\s*\(--.*\)\=\_$\)' | |
30 let s:FirstLevelNonColonEndIndent = '^\C\s*PROTOCOL\>\|\(--.*\)\@<!\<\(\(CHAN\|DATA\)\s\+TYPE\|FUNCTION\)\>' | |
31 let s:SecondLevelIndent = '^\C\s*\(IF\|ALT\|PRI\s\+ALT\)\>\|\(--.*\)\@<!?\s*\<CASE\>\s*\(--.*\)\=\_$' | |
32 let s:SecondLevelNonColonEndIndent = '\(--.*\)\@<!\<\(CHAN\|DATA\)\s\+TYPE\>' | |
33 | |
34 " Define colon indent | |
35 let s:ColonIndent = '\(--.*\)\@<!\<PROC\>' | |
36 let s:ColonNonColonEndIndent = '^\C\s*PROTOCOL\>\|\(--.*\)\@<!\<\(\(CHAN\|DATA\)\s\+TYPE\|FUNCTION\)\>' | |
37 | |
38 let s:ColonEnd = '\(--.*\)\@<!:\s*\(--.*\)\=$' | |
39 let s:ColonStart = '^\s*:\s*\(--.*\)\=$' | |
40 | |
41 " Define comment | |
42 let s:CommentLine = '^\s*--' | |
43 "}}} | |
44 | |
45 "{{{ function GetOccamIndent() | |
46 " Auxiliary function to get the correct indent for a line of occam code | |
47 function GetOccamIndent() | |
48 | |
49 " Ensure magic is on | |
50 let save_magic = &magic | |
51 setlocal magic | |
52 | |
53 " Get reference line number | |
54 let linenum = prevnonblank(v:lnum - 1) | |
55 while linenum > 0 && getline(linenum) =~ s:CommentLine | |
56 let linenum = prevnonblank(linenum - 1) | |
57 endwhile | |
58 | |
59 " Get current indent | |
60 let curindent = indent(linenum) | |
61 | |
62 " Get current line | |
63 let line = getline(linenum) | |
64 | |
65 " Get previous line number | |
66 let prevlinenum = prevnonblank(linenum - 1) | |
67 while prevlinenum > 0 && getline(prevlinenum) =~ s:CommentLine | |
68 let prevlinenum = prevnonblank(prevlinenum - 1) | |
69 endwhile | |
70 | |
71 " Get previous line | |
72 let prevline = getline(prevlinenum) | |
73 | |
74 " Colon indent | |
75 if getline(v:lnum) =~ s:ColonStart | |
76 | |
77 let found = 0 | |
78 | |
79 while found < 1 | |
80 | |
81 if line =~ s:ColonStart | |
82 let found = found - 1 | |
83 elseif line =~ s:ColonIndent || (line =~ s:ColonNonColonEndIndent && line !~ s:ColonEnd) | |
84 let found = found + 1 | |
85 endif | |
86 | |
87 if found < 1 | |
88 let linenum = prevnonblank(linenum - 1) | |
89 if linenum > 0 | |
90 let line = getline(linenum) | |
91 else | |
92 let found = 1 | |
93 endif | |
94 endif | |
95 | |
96 endwhile | |
97 | |
98 if linenum > 0 | |
99 let curindent = indent(linenum) | |
100 else | |
101 let colonline = getline(v:lnum) | |
102 let tabstr = '' | |
103 while strlen(tabstr) < &tabstop | |
104 let tabstr = ' ' . tabstr | |
105 endwhile | |
106 let colonline = substitute(colonline, '\t', tabstr, 'g') | |
107 let curindent = match(colonline, ':') | |
108 endif | |
109 | |
110 " Restore magic | |
111 if !save_magic|setlocal nomagic|endif | |
112 | |
113 return curindent | |
114 endif | |
115 | |
116 if getline(v:lnum) =~ '^\s*:' | |
117 let colonline = getline(v:lnum) | |
118 let tabstr = '' | |
119 while strlen(tabstr) < &tabstop | |
120 let tabstr = ' ' . tabstr | |
121 endwhile | |
122 let colonline = substitute(colonline, '\t', tabstr, 'g') | |
123 let curindent = match(colonline, ':') | |
124 | |
125 " Restore magic | |
126 if !save_magic|setlocal nomagic|endif | |
127 | |
128 return curindent | |
129 endif | |
130 | |
131 " Carriage return indenat | |
132 if line =~ s:FirstLevelIndent || (line =~ s:FirstLevelNonColonEndIndent && line !~ s:ColonEnd) | |
133 \ || (line !~ s:ColonStart && (prevline =~ s:SecondLevelIndent | |
134 \ || (prevline =~ s:SecondLevelNonColonEndIndent && prevline !~ s:ColonEnd))) | |
11518 | 135 let curindent = curindent + shiftwidth() |
7 | 136 |
137 " Restore magic | |
138 if !save_magic|setlocal nomagic|endif | |
139 | |
140 return curindent | |
141 endif | |
142 | |
143 " Commented line | |
144 if getline(prevnonblank(v:lnum - 1)) =~ s:CommentLine | |
145 | |
146 " Restore magic | |
147 if !save_magic|setlocal nomagic|endif | |
148 | |
149 return indent(prevnonblank(v:lnum - 1)) | |
150 endif | |
151 | |
152 " Look for previous second level IF / ALT / PRI ALT | |
153 let found = 0 | |
154 | |
155 while !found | |
156 | |
11518 | 157 if indent(prevlinenum) == curindent - shiftwidth() |
7 | 158 let found = 1 |
159 endif | |
160 | |
161 if !found | |
162 let prevlinenum = prevnonblank(prevlinenum - 1) | |
163 while prevlinenum > 0 && getline(prevlinenum) =~ s:CommentLine | |
164 let prevlinenum = prevnonblank(prevlinenum - 1) | |
165 endwhile | |
166 if prevlinenum == 0 | |
167 let found = 1 | |
168 endif | |
169 endif | |
170 | |
171 endwhile | |
172 | |
173 if prevlinenum > 0 | |
174 if getline(prevlinenum) =~ s:SecondLevelIndent | |
11518 | 175 let curindent = curindent + shiftwidth() |
7 | 176 endif |
177 endif | |
178 | |
179 " Restore magic | |
180 if !save_magic|setlocal nomagic|endif | |
181 | |
182 return curindent | |
183 | |
184 endfunction | |
185 "}}} | |
3526
dd6c2497c997
Fix more 'cpo' issues in runtime files.
Bram Moolenaar <bram@vim.org>
parents:
7
diff
changeset
|
186 |
dd6c2497c997
Fix more 'cpo' issues in runtime files.
Bram Moolenaar <bram@vim.org>
parents:
7
diff
changeset
|
187 let &cpo = s:keepcpo |
dd6c2497c997
Fix more 'cpo' issues in runtime files.
Bram Moolenaar <bram@vim.org>
parents:
7
diff
changeset
|
188 unlet s:keepcpo |