To: vim-dev@vim.org Subject: Patch 5.6a.003 Fcc: outbox From: Bram Moolenaar ------------ Patch 5.6a.003 Problem: Defining a function inside a function didn't give an error message. A missing ":endfunction" doesn't give an error message. Solution: Allow defining a function inside a function. Files: src/eval.c, runtime/doc/eval.txt *** ../vim-5.6a.2/src/eval.c Mon Dec 20 09:59:08 1999 --- src/eval.c Tue Dec 21 12:32:17 1999 *************** *** 4737,4742 **** --- 4782,4788 ---- int flags = 0; struct ufunc *fp; int indent; + int nesting; /* * ":function" without argument: list functions. *************** *** 4881,4886 **** --- 4927,4933 ---- cmdline_row = msg_row; } indent = 2; + nesting = 0; for (;;) { msg_scroll = TRUE; *************** *** 4891,4901 **** theline = getline(':', cookie, indent); lines_left = Rows - 1; if (theline == NULL) goto erret; for (p = theline; vim_iswhite(*p) || *p == ':'; ++p) ; ! if (STRNCMP(p, "endf", 4) == 0) { vim_free(theline); break; --- 4938,4951 ---- theline = getline(':', cookie, indent); lines_left = Rows - 1; if (theline == NULL) + { + EMSG("Missing :endfunction"); goto erret; + } for (p = theline; vim_iswhite(*p) || *p == ':'; ++p) ; ! if (STRNCMP(p, "endf", 4) == 0 && nesting-- == 0) { vim_free(theline); break; *************** *** 4904,4909 **** --- 4954,4974 ---- indent -= 2; else if (STRNCMP(p, "if", 2) == 0 || STRNCMP(p, "wh", 2) == 0) indent += 2; + /* Check for defining a function inside this function. */ + if (STRNCMP(p, "fu", 2) == 0) + { + p = skipwhite(skiptowhite(p)); + if (isupper(*p)) + { + while (isalpha(*p) || isdigit(*p) || *p == '_') + ++p; + if (*skipwhite(p) == '(') + { + ++nesting; + indent += 2; + } + } + } if (ga_grow(&newlines, 1) == FAIL) goto erret; ((char_u **)(newlines.ga_data))[newlines.ga_len] = theline; *** ../vim-5.6a.2/runtime/doc/eval.txt Mon Dec 20 09:59:29 1999 --- runtime/doc/eval.txt Tue Dec 21 12:20:00 1999 *************** *** 1,4 **** ! *eval.txt* For Vim version 5.6a. Last change: 1999 Dec 04 VIM REFERENCE MANUAL by Bram Moolenaar --- 1,4 ---- ! *eval.txt* For Vim version 5.6a. Last change: 1999 Dec 21 VIM REFERENCE MANUAL by Bram Moolenaar *************** *** 195,201 **** results in the mathematical difference (comparing byte values), not necessarily the alphabetical difference in the local language. ! When using the opreators with a trailing '#", or the short version and 'ignorecase' is off, the comparing is done with strcmp(). When using the operators with a trailing '?', or the short version and --- 195,201 ---- results in the mathematical difference (comparing byte values), not necessarily the alphabetical difference in the local language. ! When using the operators with a trailing '#", or the short version and 'ignorecase' is off, the comparing is done with strcmp(). When using the operators with a trailing '?', or the short version and *************** *** 1432,1440 **** ============================================================================== 5. Defining functions *user-functions* ! New functions can be defined. These can be called with "Name()", just like ! builtin functions. The name must start with an uppercase letter, to avoid ! confusion with builtin functions. *:fu* *:function* :fu[nction] List all functions and their arguments. --- 1432,1444 ---- ============================================================================== 5. Defining functions *user-functions* ! New functions can be defined. These can be called just like builtin ! functions. ! ! The function name must start with an uppercase letter, to avoid confusion with ! builtin functions. To prevent from using the same name in different scripts ! avoid obvious, short names. A good habit is to start the function name with ! the name of the script, e.g., "HTMLcolor()". *:fu* *:function* :fu[nction] List all functions and their arguments. *************** *** 1461,1467 **** It is also possible to define a function without any arguments. You must still supply the () then. The body of the function follows in the next lines, ! until ":endfunction". When a function by this name already exists and [!] is not used an error message is given. When [!] is used, an existing function is silently replaced. --- 1465,1472 ---- It is also possible to define a function without any arguments. You must still supply the () then. The body of the function follows in the next lines, ! until the matching |:endfunction|. It is allowed to ! define another function inside a function body. When a function by this name already exists and [!] is not used an error message is given. When [!] is used, an existing function is silently replaced. *** ../vim-5.6a.2/src/version.c Tue Dec 21 12:21:20 1999 --- src/version.c Tue Dec 21 12:21:44 1999 *************** *** 420,421 **** --- 420,423 ---- { /* Add new patch number below this line */ + /**/ + 3, /**/ -- So when I saw the post to comp.editors, I rushed over to the FTP site to grab it. So I yank apart the tarball, light x candles, where x= the vim version multiplied by the md5sum of the source divided by the MAC of my NIC (8A3FA78155A8A1D346C3C4A), put on black robes, dim the lights, wave a dead chicken over the hard drive, and summon the power of GNU GCC with the magic words "make config ; make!". [Jason Spence, compiling Vim 5.0] --/-/---- Bram Moolenaar ---- Bram@moolenaar.net ---- Bram@vim.org ---\-\-- \ \ www.vim.org/iccf www.moolenaar.net www.vim.org / /