]>
Commit | Line | Data |
---|---|---|
c6060300 MT |
1 | To: vim_dev@googlegroups.com |
2 | Subject: Patch 7.3.377 | |
3 | Fcc: outbox | |
4 | From: Bram Moolenaar <Bram@moolenaar.net> | |
5 | Mime-Version: 1.0 | |
6 | Content-Type: text/plain; charset=UTF-8 | |
7 | Content-Transfer-Encoding: 8bit | |
8 | ------------ | |
9 | ||
10 | Patch 7.3.377 | |
11 | Problem: No support for bitwise AND, OR, XOR and invert. | |
12 | Solution: Add and(), or(), invert() and xor() functions. | |
13 | Files: src/eval.c, src/testdir/test49.in, src/testdir/test65.in, | |
14 | src/testdir/test65.ok, runtime/doc/eval.txt | |
15 | ||
16 | ||
17 | *** ../vim-7.3.376/src/eval.c 2011-11-30 15:19:25.000000000 +0100 | |
18 | --- src/eval.c 2011-12-11 13:49:31.000000000 +0100 | |
19 | *************** | |
20 | *** 474,479 **** | |
21 | --- 474,480 ---- | |
22 | static void f_acos __ARGS((typval_T *argvars, typval_T *rettv)); | |
23 | #endif | |
24 | static void f_add __ARGS((typval_T *argvars, typval_T *rettv)); | |
25 | + static void f_and __ARGS((typval_T *argvars, typval_T *rettv)); | |
26 | static void f_append __ARGS((typval_T *argvars, typval_T *rettv)); | |
27 | static void f_argc __ARGS((typval_T *argvars, typval_T *rettv)); | |
28 | static void f_argidx __ARGS((typval_T *argvars, typval_T *rettv)); | |
29 | *************** | |
30 | *** 602,607 **** | |
31 | --- 603,609 ---- | |
32 | static void f_inputsave __ARGS((typval_T *argvars, typval_T *rettv)); | |
33 | static void f_inputsecret __ARGS((typval_T *argvars, typval_T *rettv)); | |
34 | static void f_insert __ARGS((typval_T *argvars, typval_T *rettv)); | |
35 | + static void f_invert __ARGS((typval_T *argvars, typval_T *rettv)); | |
36 | static void f_isdirectory __ARGS((typval_T *argvars, typval_T *rettv)); | |
37 | static void f_islocked __ARGS((typval_T *argvars, typval_T *rettv)); | |
38 | static void f_items __ARGS((typval_T *argvars, typval_T *rettv)); | |
39 | *************** | |
40 | *** 640,645 **** | |
41 | --- 642,648 ---- | |
42 | #endif | |
43 | static void f_nextnonblank __ARGS((typval_T *argvars, typval_T *rettv)); | |
44 | static void f_nr2char __ARGS((typval_T *argvars, typval_T *rettv)); | |
45 | + static void f_or __ARGS((typval_T *argvars, typval_T *rettv)); | |
46 | static void f_pathshorten __ARGS((typval_T *argvars, typval_T *rettv)); | |
47 | #ifdef FEAT_FLOAT | |
48 | static void f_pow __ARGS((typval_T *argvars, typval_T *rettv)); | |
49 | *************** | |
50 | *** 751,756 **** | |
51 | --- 754,760 ---- | |
52 | static void f_winsaveview __ARGS((typval_T *argvars, typval_T *rettv)); | |
53 | static void f_winwidth __ARGS((typval_T *argvars, typval_T *rettv)); | |
54 | static void f_writefile __ARGS((typval_T *argvars, typval_T *rettv)); | |
55 | + static void f_xor __ARGS((typval_T *argvars, typval_T *rettv)); | |
56 | ||
57 | static int list2fpos __ARGS((typval_T *arg, pos_T *posp, int *fnump)); | |
58 | static pos_T *var2fpos __ARGS((typval_T *varp, int dollar_lnum, int *fnum)); | |
59 | *************** | |
60 | *** 7715,7720 **** | |
61 | --- 7719,7725 ---- | |
62 | {"acos", 1, 1, f_acos}, /* WJMc */ | |
63 | #endif | |
64 | {"add", 2, 2, f_add}, | |
65 | + {"and", 2, 2, f_and}, | |
66 | {"append", 2, 2, f_append}, | |
67 | {"argc", 0, 0, f_argc}, | |
68 | {"argidx", 0, 0, f_argidx}, | |
69 | *************** | |
70 | *** 7850,7855 **** | |
71 | --- 7855,7861 ---- | |
72 | {"inputsave", 0, 0, f_inputsave}, | |
73 | {"inputsecret", 1, 2, f_inputsecret}, | |
74 | {"insert", 2, 3, f_insert}, | |
75 | + {"invert", 1, 1, f_invert}, | |
76 | {"isdirectory", 1, 1, f_isdirectory}, | |
77 | {"islocked", 1, 1, f_islocked}, | |
78 | {"items", 1, 1, f_items}, | |
79 | *************** | |
80 | *** 7888,7893 **** | |
81 | --- 7894,7900 ---- | |
82 | #endif | |
83 | {"nextnonblank", 1, 1, f_nextnonblank}, | |
84 | {"nr2char", 1, 1, f_nr2char}, | |
85 | + {"or", 2, 2, f_or}, | |
86 | {"pathshorten", 1, 1, f_pathshorten}, | |
87 | #ifdef FEAT_FLOAT | |
88 | {"pow", 2, 2, f_pow}, | |
89 | *************** | |
90 | *** 7999,8004 **** | |
91 | --- 8006,8012 ---- | |
92 | {"winsaveview", 0, 0, f_winsaveview}, | |
93 | {"winwidth", 1, 1, f_winwidth}, | |
94 | {"writefile", 2, 3, f_writefile}, | |
95 | + {"xor", 2, 2, f_xor}, | |
96 | }; | |
97 | ||
98 | #if defined(FEAT_CMDL_COMPL) || defined(PROTO) | |
99 | *************** | |
100 | *** 8572,8577 **** | |
101 | --- 8580,8597 ---- | |
102 | } | |
103 | ||
104 | /* | |
105 | + * "and(expr, expr)" function | |
106 | + */ | |
107 | + static void | |
108 | + f_and(argvars, rettv) | |
109 | + typval_T *argvars; | |
110 | + typval_T *rettv; | |
111 | + { | |
112 | + rettv->vval.v_number = get_tv_number_chk(&argvars[0], NULL) | |
113 | + & get_tv_number_chk(&argvars[1], NULL); | |
114 | + } | |
115 | + | |
116 | + /* | |
117 | * "append(lnum, string/list)" function | |
118 | */ | |
119 | static void | |
120 | *************** | |
121 | *** 12958,12963 **** | |
122 | --- 12978,12994 ---- | |
123 | } | |
124 | ||
125 | /* | |
126 | + * "invert(expr)" function | |
127 | + */ | |
128 | + static void | |
129 | + f_invert(argvars, rettv) | |
130 | + typval_T *argvars; | |
131 | + typval_T *rettv; | |
132 | + { | |
133 | + rettv->vval.v_number = ~get_tv_number_chk(&argvars[0], NULL); | |
134 | + } | |
135 | + | |
136 | + /* | |
137 | * "isdirectory()" function | |
138 | */ | |
139 | static void | |
140 | *************** | |
141 | *** 14108,14113 **** | |
142 | --- 14139,14156 ---- | |
143 | } | |
144 | ||
145 | /* | |
146 | + * "or(expr, expr)" function | |
147 | + */ | |
148 | + static void | |
149 | + f_or(argvars, rettv) | |
150 | + typval_T *argvars; | |
151 | + typval_T *rettv; | |
152 | + { | |
153 | + rettv->vval.v_number = get_tv_number_chk(&argvars[0], NULL) | |
154 | + | get_tv_number_chk(&argvars[1], NULL); | |
155 | + } | |
156 | + | |
157 | + /* | |
158 | * "pathshorten()" function | |
159 | */ | |
160 | static void | |
161 | *************** | |
162 | *** 18394,18399 **** | |
163 | --- 18437,18455 ---- | |
164 | } | |
165 | ||
166 | /* | |
167 | + * "xor(expr, expr)" function | |
168 | + */ | |
169 | + static void | |
170 | + f_xor(argvars, rettv) | |
171 | + typval_T *argvars; | |
172 | + typval_T *rettv; | |
173 | + { | |
174 | + rettv->vval.v_number = get_tv_number_chk(&argvars[0], NULL) | |
175 | + ^ get_tv_number_chk(&argvars[1], NULL); | |
176 | + } | |
177 | + | |
178 | + | |
179 | + /* | |
180 | * Translate a String variable into a position. | |
181 | * Returns NULL when there is an error. | |
182 | */ | |
183 | *** ../vim-7.3.376/src/testdir/test65.in 2010-08-15 21:57:29.000000000 +0200 | |
184 | --- src/testdir/test65.in 2011-12-11 13:55:06.000000000 +0100 | |
185 | *************** | |
186 | *** 1,4 **** | |
187 | ! Test for floating point. | |
188 | ||
189 | STARTTEST | |
190 | :so small.vim | |
191 | --- 1,4 ---- | |
192 | ! Test for floating point and logical operators. | |
193 | ||
194 | STARTTEST | |
195 | :so small.vim | |
196 | *************** | |
197 | *** 72,77 **** | |
198 | --- 72,94 ---- | |
199 | :$put ='float2nr' | |
200 | :$put =float2nr(123.456) | |
201 | :$put =float2nr(-123.456) | |
202 | + :$put ='AND' | |
203 | + :$put =and(127, 127) | |
204 | + :$put =and(127, 16) | |
205 | + :$put =and(127, 128) | |
206 | + :$put ='OR' | |
207 | + :$put =or(16, 7) | |
208 | + :$put =or(8, 7) | |
209 | + :$put =or(0, 123) | |
210 | + :$put ='XOR' | |
211 | + :$put =xor(127, 127) | |
212 | + :$put =xor(127, 16) | |
213 | + :$put =xor(127, 128) | |
214 | + :$put ='invert' | |
215 | + :$put =and(invert(127), 65535) | |
216 | + :$put =and(invert(16), 65535) | |
217 | + :$put =and(invert(128), 65535) | |
218 | + :$put =invert(1.0) | |
219 | :/^Results/,$wq! test.out | |
220 | ENDTEST | |
221 | ||
222 | *** ../vim-7.3.376/src/testdir/test65.ok 2010-08-15 21:57:29.000000000 +0200 | |
223 | --- src/testdir/test65.ok 2011-12-11 13:55:30.000000000 +0100 | |
224 | *************** | |
225 | *** 54,56 **** | |
226 | --- 54,73 ---- | |
227 | float2nr | |
228 | 123 | |
229 | -123 | |
230 | + AND | |
231 | + 127 | |
232 | + 16 | |
233 | + 0 | |
234 | + OR | |
235 | + 23 | |
236 | + 15 | |
237 | + 123 | |
238 | + XOR | |
239 | + 0 | |
240 | + 111 | |
241 | + 255 | |
242 | + invert | |
243 | + 65408 | |
244 | + 65519 | |
245 | + 65407 | |
246 | + 0 | |
247 | *** ../vim-7.3.376/runtime/doc/eval.txt 2011-06-19 02:55:32.000000000 +0200 | |
248 | --- runtime/doc/eval.txt 2011-12-14 15:28:23.000000000 +0100 | |
249 | *************** | |
250 | *** 798,808 **** | |
251 | For |Lists| only "+" is possible and then both expr6 must be a list. The | |
252 | result is a new list with the two lists Concatenated. | |
253 | ||
254 | ! expr7 * expr7 .. number multiplication *expr-star* | |
255 | ! expr7 / expr7 .. number division *expr-/* | |
256 | ! expr7 % expr7 .. number modulo *expr-%* | |
257 | ||
258 | For all, except ".", Strings are converted to Numbers. | |
259 | ||
260 | Note the difference between "+" and ".": | |
261 | "123" + "456" = 579 | |
262 | --- 800,811 ---- | |
263 | For |Lists| only "+" is possible and then both expr6 must be a list. The | |
264 | result is a new list with the two lists Concatenated. | |
265 | ||
266 | ! expr7 * expr7 .. Number multiplication *expr-star* | |
267 | ! expr7 / expr7 .. Number division *expr-/* | |
268 | ! expr7 % expr7 .. Number modulo *expr-%* | |
269 | ||
270 | For all, except ".", Strings are converted to Numbers. | |
271 | + For bitwise operators see |and()|, |or()| and |xor()|. | |
272 | ||
273 | Note the difference between "+" and ".": | |
274 | "123" + "456" = 579 | |
275 | *************** | |
276 | *** 1679,1684 **** | |
277 | --- 1688,1694 ---- | |
278 | abs( {expr}) Float or Number absolute value of {expr} | |
279 | acos( {expr}) Float arc cosine of {expr} | |
280 | add( {list}, {item}) List append {item} to |List| {list} | |
281 | + and( {expr}, {expr}) Number bitwise AND | |
282 | append( {lnum}, {string}) Number append {string} below line {lnum} | |
283 | append( {lnum}, {list}) Number append lines {list} below line {lnum} | |
284 | argc() Number number of files in the argument list | |
285 | *************** | |
286 | *** 1817,1822 **** | |
287 | --- 1827,1833 ---- | |
288 | inputsave() Number save and clear typeahead | |
289 | inputsecret( {prompt} [, {text}]) String like input() but hiding the text | |
290 | insert( {list}, {item} [, {idx}]) List insert {item} in {list} [before {idx}] | |
291 | + invert( {expr}) Number bitwise invert | |
292 | isdirectory( {directory}) Number TRUE if {directory} is a directory | |
293 | islocked( {expr}) Number TRUE if {expr} is locked | |
294 | items( {dict}) List key-value pairs in {dict} | |
295 | *************** | |
296 | *** 1856,1861 **** | |
297 | --- 1868,1874 ---- | |
298 | mzeval( {expr}) any evaluate |MzScheme| expression | |
299 | nextnonblank( {lnum}) Number line nr of non-blank line >= {lnum} | |
300 | nr2char( {expr}) String single char with ASCII value {expr} | |
301 | + or( {expr}, {expr}) Number bitwise OR | |
302 | pathshorten( {expr}) String shorten directory names in a path | |
303 | pow( {x}, {y}) Float {x} to the power of {y} | |
304 | prevnonblank( {lnum}) Number line nr of non-blank line <= {lnum} | |
305 | *************** | |
306 | *** 1978,1983 **** | |
307 | --- 1992,1998 ---- | |
308 | winwidth( {nr}) Number width of window {nr} | |
309 | writefile( {list}, {fname} [, {binary}]) | |
310 | Number write list of lines to file {fname} | |
311 | + xor( {expr}, {expr}) Number bitwise XOR | |
312 | ||
313 | abs({expr}) *abs()* | |
314 | Return the absolute value of {expr}. When {expr} evaluates to | |
315 | *************** | |
316 | *** 2017,2022 **** | |
317 | --- 2032,2044 ---- | |
318 | Use |insert()| to add an item at another position. | |
319 | ||
320 | ||
321 | + and({expr}, {expr}) *and()* | |
322 | + Bitwise AND on the two arguments. The arguments are converted | |
323 | + to a number. A List, Dict or Float argument causes an error. | |
324 | + Example: > | |
325 | + :let flag = and(bits, 0x80) | |
326 | + | |
327 | + | |
328 | append({lnum}, {expr}) *append()* | |
329 | When {expr} is a |List|: Append each item of the |List| as a | |
330 | text line below line {lnum} in the current buffer. | |
331 | *************** | |
332 | *** 3770,3775 **** | |
333 | --- 3798,3808 ---- | |
334 | Note that when {item} is a |List| it is inserted as a single | |
335 | item. Use |extend()| to concatenate |Lists|. | |
336 | ||
337 | + invert({expr}) *invert()* | |
338 | + Bitwise invert. The argument is converted to a number. A | |
339 | + List, Dict or Float argument causes an error. Example: > | |
340 | + :let bits = invert(bits) | |
341 | + | |
342 | isdirectory({directory}) *isdirectory()* | |
343 | The result is a Number, which is non-zero when a directory | |
344 | with the name {directory} exists. If {directory} doesn't | |
345 | *************** | |
346 | *** 4334,4339 **** | |
347 | --- 4368,4380 ---- | |
348 | call setpos('.', save_cursor) | |
349 | < Also see |setpos()|. | |
350 | ||
351 | + or({expr}, {expr}) *or()* | |
352 | + Bitwise OR on the two arguments. The arguments are converted | |
353 | + to a number. A List, Dict or Float argument causes an error. | |
354 | + Example: > | |
355 | + :let bits = or(bits, 0x80) | |
356 | + | |
357 | + | |
358 | pathshorten({expr}) *pathshorten()* | |
359 | Shorten directory names in the path {expr} and return the | |
360 | result. The tail, the file name, is kept as-is. The other | |
361 | *************** | |
362 | *** 6097,6103 **** | |
363 | To copy a file byte for byte: > | |
364 | :let fl = readfile("foo", "b") | |
365 | :call writefile(fl, "foocopy", "b") | |
366 | ! < | |
367 | ||
368 | *feature-list* | |
369 | There are three types of features: | |
370 | --- 6149,6163 ---- | |
371 | To copy a file byte for byte: > | |
372 | :let fl = readfile("foo", "b") | |
373 | :call writefile(fl, "foocopy", "b") | |
374 | ! | |
375 | ! | |
376 | ! xor({expr}, {expr}) *xor()* | |
377 | ! Bitwise XOR on the two arguments. The arguments are converted | |
378 | ! to a number. A List, Dict or Float argument causes an error. | |
379 | ! Example: > | |
380 | ! :let bits = xor(bits, 0x80) | |
381 | ! | |
382 | ! | |
383 | ||
384 | *feature-list* | |
385 | There are three types of features: | |
386 | *** ../vim-7.3.376/src/version.c 2011-12-14 15:23:53.000000000 +0100 | |
387 | --- src/version.c 2011-12-14 15:28:39.000000000 +0100 | |
388 | *************** | |
389 | *** 716,717 **** | |
390 | --- 716,719 ---- | |
391 | { /* Add new patch number below this line */ | |
392 | + /**/ | |
393 | + 377, | |
394 | /**/ | |
395 | ||
396 | -- | |
397 | DINGO: Wicked wicked Zoot ... she is a bad person and she must pay the | |
398 | penalty. And here in Castle Anthrax, we have but one punishment | |
399 | ... you must tie her down on a bed ... and spank her. Come! | |
400 | GIRLS: A spanking! A spanking! | |
401 | "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD | |
402 | ||
403 | /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ | |
404 | /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ | |
405 | \\\ an exciting new programming language -- http://www.Zimbu.org /// | |
406 | \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |