| To: vim_dev@googlegroups.com |
| Subject: Patch 7.3.377 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.3.377 |
| Problem: No support for bitwise AND, OR, XOR and invert. |
| Solution: Add and(), or(), invert() and xor() functions. |
| Files: src/eval.c, src/testdir/test49.in, src/testdir/test65.in, |
| src/testdir/test65.ok, runtime/doc/eval.txt |
| |
| |
| |
| |
| |
| *** 474,479 **** |
| --- 474,480 ---- |
| static void f_acos __ARGS((typval_T *argvars, typval_T *rettv)); |
| #endif |
| static void f_add __ARGS((typval_T *argvars, typval_T *rettv)); |
| + static void f_and __ARGS((typval_T *argvars, typval_T *rettv)); |
| static void f_append __ARGS((typval_T *argvars, typval_T *rettv)); |
| static void f_argc __ARGS((typval_T *argvars, typval_T *rettv)); |
| static void f_argidx __ARGS((typval_T *argvars, typval_T *rettv)); |
| |
| *** 602,607 **** |
| --- 603,609 ---- |
| static void f_inputsave __ARGS((typval_T *argvars, typval_T *rettv)); |
| static void f_inputsecret __ARGS((typval_T *argvars, typval_T *rettv)); |
| static void f_insert __ARGS((typval_T *argvars, typval_T *rettv)); |
| + static void f_invert __ARGS((typval_T *argvars, typval_T *rettv)); |
| static void f_isdirectory __ARGS((typval_T *argvars, typval_T *rettv)); |
| static void f_islocked __ARGS((typval_T *argvars, typval_T *rettv)); |
| static void f_items __ARGS((typval_T *argvars, typval_T *rettv)); |
| |
| *** 640,645 **** |
| --- 642,648 ---- |
| #endif |
| static void f_nextnonblank __ARGS((typval_T *argvars, typval_T *rettv)); |
| static void f_nr2char __ARGS((typval_T *argvars, typval_T *rettv)); |
| + static void f_or __ARGS((typval_T *argvars, typval_T *rettv)); |
| static void f_pathshorten __ARGS((typval_T *argvars, typval_T *rettv)); |
| #ifdef FEAT_FLOAT |
| static void f_pow __ARGS((typval_T *argvars, typval_T *rettv)); |
| |
| *** 751,756 **** |
| --- 754,760 ---- |
| static void f_winsaveview __ARGS((typval_T *argvars, typval_T *rettv)); |
| static void f_winwidth __ARGS((typval_T *argvars, typval_T *rettv)); |
| static void f_writefile __ARGS((typval_T *argvars, typval_T *rettv)); |
| + static void f_xor __ARGS((typval_T *argvars, typval_T *rettv)); |
| |
| static int list2fpos __ARGS((typval_T *arg, pos_T *posp, int *fnump)); |
| static pos_T *var2fpos __ARGS((typval_T *varp, int dollar_lnum, int *fnum)); |
| |
| *** 7715,7720 **** |
| --- 7719,7725 ---- |
| {"acos", 1, 1, f_acos}, /* WJMc */ |
| #endif |
| {"add", 2, 2, f_add}, |
| + {"and", 2, 2, f_and}, |
| {"append", 2, 2, f_append}, |
| {"argc", 0, 0, f_argc}, |
| {"argidx", 0, 0, f_argidx}, |
| |
| *** 7850,7855 **** |
| --- 7855,7861 ---- |
| {"inputsave", 0, 0, f_inputsave}, |
| {"inputsecret", 1, 2, f_inputsecret}, |
| {"insert", 2, 3, f_insert}, |
| + {"invert", 1, 1, f_invert}, |
| {"isdirectory", 1, 1, f_isdirectory}, |
| {"islocked", 1, 1, f_islocked}, |
| {"items", 1, 1, f_items}, |
| |
| *** 7888,7893 **** |
| --- 7894,7900 ---- |
| #endif |
| {"nextnonblank", 1, 1, f_nextnonblank}, |
| {"nr2char", 1, 1, f_nr2char}, |
| + {"or", 2, 2, f_or}, |
| {"pathshorten", 1, 1, f_pathshorten}, |
| #ifdef FEAT_FLOAT |
| {"pow", 2, 2, f_pow}, |
| |
| *** 7999,8004 **** |
| --- 8006,8012 ---- |
| {"winsaveview", 0, 0, f_winsaveview}, |
| {"winwidth", 1, 1, f_winwidth}, |
| {"writefile", 2, 3, f_writefile}, |
| + {"xor", 2, 2, f_xor}, |
| }; |
| |
| #if defined(FEAT_CMDL_COMPL) || defined(PROTO) |
| |
| *** 8572,8577 **** |
| --- 8580,8597 ---- |
| } |
| |
| /* |
| + * "and(expr, expr)" function |
| + */ |
| + static void |
| + f_and(argvars, rettv) |
| + typval_T *argvars; |
| + typval_T *rettv; |
| + { |
| + rettv->vval.v_number = get_tv_number_chk(&argvars[0], NULL) |
| + & get_tv_number_chk(&argvars[1], NULL); |
| + } |
| + |
| + /* |
| * "append(lnum, string/list)" function |
| */ |
| static void |
| |
| *** 12958,12963 **** |
| --- 12978,12994 ---- |
| } |
| |
| /* |
| + * "invert(expr)" function |
| + */ |
| + static void |
| + f_invert(argvars, rettv) |
| + typval_T *argvars; |
| + typval_T *rettv; |
| + { |
| + rettv->vval.v_number = ~get_tv_number_chk(&argvars[0], NULL); |
| + } |
| + |
| + /* |
| * "isdirectory()" function |
| */ |
| static void |
| |
| *** 14108,14113 **** |
| --- 14139,14156 ---- |
| } |
| |
| /* |
| + * "or(expr, expr)" function |
| + */ |
| + static void |
| + f_or(argvars, rettv) |
| + typval_T *argvars; |
| + typval_T *rettv; |
| + { |
| + rettv->vval.v_number = get_tv_number_chk(&argvars[0], NULL) |
| + | get_tv_number_chk(&argvars[1], NULL); |
| + } |
| + |
| + /* |
| * "pathshorten()" function |
| */ |
| static void |
| |
| *** 18394,18399 **** |
| --- 18437,18455 ---- |
| } |
| |
| /* |
| + * "xor(expr, expr)" function |
| + */ |
| + static void |
| + f_xor(argvars, rettv) |
| + typval_T *argvars; |
| + typval_T *rettv; |
| + { |
| + rettv->vval.v_number = get_tv_number_chk(&argvars[0], NULL) |
| + ^ get_tv_number_chk(&argvars[1], NULL); |
| + } |
| + |
| + |
| + /* |
| * Translate a String variable into a position. |
| * Returns NULL when there is an error. |
| */ |
| |
| |
| |
| *** 1,4 **** |
| ! Test for floating point. |
| |
| STARTTEST |
| :so small.vim |
| --- 1,4 ---- |
| ! Test for floating point and logical operators. |
| |
| STARTTEST |
| :so small.vim |
| |
| *** 72,77 **** |
| --- 72,94 ---- |
| :$put ='float2nr' |
| :$put =float2nr(123.456) |
| :$put =float2nr(-123.456) |
| + :$put ='AND' |
| + :$put =and(127, 127) |
| + :$put =and(127, 16) |
| + :$put =and(127, 128) |
| + :$put ='OR' |
| + :$put =or(16, 7) |
| + :$put =or(8, 7) |
| + :$put =or(0, 123) |
| + :$put ='XOR' |
| + :$put =xor(127, 127) |
| + :$put =xor(127, 16) |
| + :$put =xor(127, 128) |
| + :$put ='invert' |
| + :$put =and(invert(127), 65535) |
| + :$put =and(invert(16), 65535) |
| + :$put =and(invert(128), 65535) |
| + :$put =invert(1.0) |
| :/^Results/,$wq! test.out |
| ENDTEST |
| |
| |
| |
| |
| *** 54,56 **** |
| --- 54,73 ---- |
| float2nr |
| 123 |
| -123 |
| + AND |
| + 127 |
| + 16 |
| + 0 |
| + OR |
| + 23 |
| + 15 |
| + 123 |
| + XOR |
| + 0 |
| + 111 |
| + 255 |
| + invert |
| + 65408 |
| + 65519 |
| + 65407 |
| + 0 |
| |
| |
| |
| *** 798,808 **** |
| For |Lists| only "+" is possible and then both expr6 must be a list. The |
| result is a new list with the two lists Concatenated. |
| |
| ! expr7 * expr7 .. number multiplication *expr-star* |
| ! expr7 / expr7 .. number division *expr-/* |
| ! expr7 % expr7 .. number modulo *expr-%* |
| |
| For all, except ".", Strings are converted to Numbers. |
| |
| Note the difference between "+" and ".": |
| "123" + "456" = 579 |
| --- 800,811 ---- |
| For |Lists| only "+" is possible and then both expr6 must be a list. The |
| result is a new list with the two lists Concatenated. |
| |
| ! expr7 * expr7 .. Number multiplication *expr-star* |
| ! expr7 / expr7 .. Number division *expr-/* |
| ! expr7 % expr7 .. Number modulo *expr-%* |
| |
| For all, except ".", Strings are converted to Numbers. |
| + For bitwise operators see |and()|, |or()| and |xor()|. |
| |
| Note the difference between "+" and ".": |
| "123" + "456" = 579 |
| |
| *** 1679,1684 **** |
| --- 1688,1694 ---- |
| abs( {expr}) Float or Number absolute value of {expr} |
| acos( {expr}) Float arc cosine of {expr} |
| add( {list}, {item}) List append {item} to |List| {list} |
| + and( {expr}, {expr}) Number bitwise AND |
| append( {lnum}, {string}) Number append {string} below line {lnum} |
| append( {lnum}, {list}) Number append lines {list} below line {lnum} |
| argc() Number number of files in the argument list |
| |
| *** 1817,1822 **** |
| --- 1827,1833 ---- |
| inputsave() Number save and clear typeahead |
| inputsecret( {prompt} [, {text}]) String like input() but hiding the text |
| insert( {list}, {item} [, {idx}]) List insert {item} in {list} [before {idx}] |
| + invert( {expr}) Number bitwise invert |
| isdirectory( {directory}) Number TRUE if {directory} is a directory |
| islocked( {expr}) Number TRUE if {expr} is locked |
| items( {dict}) List key-value pairs in {dict} |
| |
| *** 1856,1861 **** |
| --- 1868,1874 ---- |
| mzeval( {expr}) any evaluate |MzScheme| expression |
| nextnonblank( {lnum}) Number line nr of non-blank line >= {lnum} |
| nr2char( {expr}) String single char with ASCII value {expr} |
| + or( {expr}, {expr}) Number bitwise OR |
| pathshorten( {expr}) String shorten directory names in a path |
| pow( {x}, {y}) Float {x} to the power of {y} |
| prevnonblank( {lnum}) Number line nr of non-blank line <= {lnum} |
| |
| *** 1978,1983 **** |
| --- 1992,1998 ---- |
| winwidth( {nr}) Number width of window {nr} |
| writefile( {list}, {fname} [, {binary}]) |
| Number write list of lines to file {fname} |
| + xor( {expr}, {expr}) Number bitwise XOR |
| |
| abs({expr}) *abs()* |
| Return the absolute value of {expr}. When {expr} evaluates to |
| |
| *** 2017,2022 **** |
| --- 2032,2044 ---- |
| Use |insert()| to add an item at another position. |
| |
| |
| + and({expr}, {expr}) *and()* |
| + Bitwise AND on the two arguments. The arguments are converted |
| + to a number. A List, Dict or Float argument causes an error. |
| + Example: > |
| + :let flag = and(bits, 0x80) |
| + |
| + |
| append({lnum}, {expr}) *append()* |
| When {expr} is a |List|: Append each item of the |List| as a |
| text line below line {lnum} in the current buffer. |
| |
| *** 3770,3775 **** |
| --- 3798,3808 ---- |
| Note that when {item} is a |List| it is inserted as a single |
| item. Use |extend()| to concatenate |Lists|. |
| |
| + invert({expr}) *invert()* |
| + Bitwise invert. The argument is converted to a number. A |
| + List, Dict or Float argument causes an error. Example: > |
| + :let bits = invert(bits) |
| + |
| isdirectory({directory}) *isdirectory()* |
| The result is a Number, which is non-zero when a directory |
| with the name {directory} exists. If {directory} doesn't |
| |
| *** 4334,4339 **** |
| --- 4368,4380 ---- |
| call setpos('.', save_cursor) |
| < Also see |setpos()|. |
| |
| + or({expr}, {expr}) *or()* |
| + Bitwise OR on the two arguments. The arguments are converted |
| + to a number. A List, Dict or Float argument causes an error. |
| + Example: > |
| + :let bits = or(bits, 0x80) |
| + |
| + |
| pathshorten({expr}) *pathshorten()* |
| Shorten directory names in the path {expr} and return the |
| result. The tail, the file name, is kept as-is. The other |
| |
| *** 6097,6103 **** |
| To copy a file byte for byte: > |
| :let fl = readfile("foo", "b") |
| :call writefile(fl, "foocopy", "b") |
| ! < |
| |
| *feature-list* |
| There are three types of features: |
| --- 6149,6163 ---- |
| To copy a file byte for byte: > |
| :let fl = readfile("foo", "b") |
| :call writefile(fl, "foocopy", "b") |
| ! |
| ! |
| ! xor({expr}, {expr}) *xor()* |
| ! Bitwise XOR on the two arguments. The arguments are converted |
| ! to a number. A List, Dict or Float argument causes an error. |
| ! Example: > |
| ! :let bits = xor(bits, 0x80) |
| ! |
| ! |
| |
| *feature-list* |
| There are three types of features: |
| |
| |
| |
| *** 716,717 **** |
| --- 716,719 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 377, |
| /**/ |
| |
| -- |
| DINGO: Wicked wicked Zoot ... she is a bad person and she must pay the |
| penalty. And here in Castle Anthrax, we have but one punishment |
| ... you must tie her down on a bed ... and spank her. Come! |
| GIRLS: A spanking! A spanking! |
| "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD |
| |
| /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ |
| /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ |
| \\\ an exciting new programming language -- http://www.Zimbu.org /// |
| \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |