<blockquote>
<p>we are trying to not diverge from those</p>
</blockquote>
<p>Too late:</p>
<div class="highlight highlight-source-diff"><pre><span class="pl-md">--- r-geany.c       2019-10-21 16:54:35.032407824 -0700</span>
<span class="pl-mi1">+++ r-upstream.c   2019-10-21 16:53:25.426404697 -0700</span>
<span class="pl-mdr">@@ -19,10 +19,10 @@</span>
 
 #include "debug.h"
 #include "entry.h"
<span class="pl-mi1"><span class="pl-mi1">+</span>#include "parse.h"</span>
 #include "read.h"
<span class="pl-mi1"><span class="pl-mi1">+</span>#include "selectors.h"</span>
 #include "vstring.h"
<span class="pl-md"><span class="pl-md">-</span>#include "routines.h"</span>
<span class="pl-md"><span class="pl-md">-</span></span>
 
 #define SKIPSPACE(ch) while (isspace((int)*ch)) \
   ch++
<span class="pl-mdr">@@ -31,22 +31,27 @@</span>
        K_FUNCTION,
        K_LIBRARY,
        K_SOURCE,
<span class="pl-mi1"><span class="pl-mi1">+</span>        K_GLOBALVAR,</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>        K_FUNCVAR,</span>
        KIND_COUNT
 } rKind;
 
<span class="pl-md"><span class="pl-md">-</span>static kindDefinition RKinds [KIND_COUNT] = {</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>static kindDefinition RKinds[KIND_COUNT] = {</span>
        {true, 'f', "function", "functions"},
        {true, 'l', "library", "libraries"},
        {true, 's', "source", "sources"},
<span class="pl-mi1"><span class="pl-mi1">+</span>        {true, 'g', "globalVar", "global variables"},</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>        {true, 'v', "functionVar", "function variables"},</span>
 };
 
 static void makeRTag (const vString * const name, rKind kind)
 {
        tagEntryInfo e;
<span class="pl-md"><span class="pl-md">-</span>  initTagEntry(&e, vStringValue(name), kind);</span>
 
        Assert (kind < KIND_COUNT);
 
<span class="pl-mi1"><span class="pl-mi1">+</span>        initTagEntry (&e, vStringValue (name), kind);</span>
<span class="pl-mi1"><span class="pl-mi1">+</span></span>
        makeTagEntry (&e);
 }
 
<span class="pl-mdr">@@ -66,93 +71,124 @@</span>
                {
                        /* iterate to the end of line or to a comment */
                        ikind = -1;
<span class="pl-md"><span class="pl-md">-</span>                  switch (*cp) {</span>
<span class="pl-md"><span class="pl-md">-</span>                          case 'l':</span>
<span class="pl-md"><span class="pl-md">-</span>                          case 's':</span>
<span class="pl-md"><span class="pl-md">-</span>                                  if (strncasecmp((const char*)cp, "library", (size_t)7) == 0) {</span>
<span class="pl-md"><span class="pl-md">-</span>                                          /* load a library: library(tools) */</span>
<span class="pl-md"><span class="pl-md">-</span>                                          cp += 7;</span>
<span class="pl-md"><span class="pl-md">-</span>                                          SKIPSPACE(cp);</span>
<span class="pl-md"><span class="pl-md">-</span>                                          if (*cp == '(')</span>
<span class="pl-md"><span class="pl-md">-</span>                                                  ikind = K_LIBRARY;</span>
<span class="pl-md"><span class="pl-md">-</span>                                          else</span>
<span class="pl-md"><span class="pl-md">-</span>                                                  cp -= 7;</span>
<span class="pl-md"><span class="pl-md">-</span>                                  } else if (strncasecmp((const char*)cp, "source", (size_t)6) == 0) {</span>
<span class="pl-md"><span class="pl-md">-</span>                                          /* load a source file: source("myfile.r") */</span>
<span class="pl-md"><span class="pl-md">-</span>                                          cp += 6;</span>
<span class="pl-md"><span class="pl-md">-</span>                                          SKIPSPACE(cp);</span>
<span class="pl-md"><span class="pl-md">-</span>                                          if (*cp == '(')</span>
<span class="pl-md"><span class="pl-md">-</span>                                                  ikind = K_SOURCE;</span>
<span class="pl-md"><span class="pl-md">-</span>                                          else</span>
<span class="pl-md"><span class="pl-md">-</span>                                                  cp -= 6;</span>
<span class="pl-md"><span class="pl-md">-</span>                                  }</span>
<span class="pl-md"><span class="pl-md">-</span>                                  if (ikind != -1) {</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                        switch (*cp)</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                        {</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                        case 'l':</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                        case 's':</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                if (strncasecmp ((const char *) cp, "library", (size_t) 7) == 0)</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                {</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                        /* load a library: library(tools) */</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                        cp += 7;</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                        SKIPSPACE (cp);</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                        if (*cp == '(')</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                ikind = K_LIBRARY;</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                        else</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                cp -= 7;</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                }</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                else if (strncasecmp ((const char *) cp, "source",</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                (size_t) 6) == 0)</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                {</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                        /* load a source file: source("myfile.r") */</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                        cp += 6;</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                        SKIPSPACE (cp);</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                        if (*cp == '(')</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                ikind = K_SOURCE;</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                        else</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                cp -= 6;</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                }</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                if (ikind != -1)</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                {</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                        cp++;</span>
<span class="pl-mi1"><span class="pl-mi1">+</span></span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                        vStringClear (name);</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                        while ((!isspace ((int) *cp)) && *cp != '\0' && *cp != ')')</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                        {</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                vStringPut (name, (int) *cp);</span>
                                                cp++;
<span class="pl-mi1"><span class="pl-mi1">+</span>                                        }</span>
<span class="pl-mi1"><span class="pl-mi1">+</span></span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                        /* if the string really exists, make a tag of it */</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                        if (vStringLength (name) > 0)</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                makeRTag (name, ikind);</span>
<span class="pl-mi1"><span class="pl-mi1">+</span></span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                        /* prepare for the next iteration */</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                        vStringClear (name);</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                }</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                else</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                {</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                        vStringPut (name, (int) *cp);</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                        cp++;</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                }</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                break;</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                        case '<':</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                cp++;</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                if (*cp == '-')</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                {</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                        /* assignment: ident <- someval */</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                        cp++;</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                        SKIPSPACE (cp);</span>
 
<span class="pl-md"><span class="pl-md">-</span>                                          vStringClear(name);</span>
<span class="pl-md"><span class="pl-md">-</span>                                          while ((!isspace((int)*cp)) && *cp != '\0' && *cp != ')') {</span>
<span class="pl-md"><span class="pl-md">-</span>                                                  vStringPut(name, (int)*cp);</span>
<span class="pl-md"><span class="pl-md">-</span>                                                  cp++;</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                        if (*cp == '\0')</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                        {</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                /* not in this line, read next */</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                /* sometimes functions are declared this way:</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                 * ident <-</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                 * function(...)</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                 * {</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                 * ...</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                 * }</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                 * I don't know if there is a reason to write the function keyword</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                 * in a new line</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                 */</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                if ((line = readLineFromInputFile ()) != NULL)</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                {</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                        cp = (const unsigned char *) line;</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                        SKIPSPACE (cp);</span>
                                                }
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                else</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                        break;</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                        }</span>
 
<span class="pl-mi1"><span class="pl-mi1">+</span>                                        if (strncasecmp ((const char *) cp, "function",</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                        (size_t) 8) == 0)</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                        {</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                /* it's a function: ident <- function(args) */</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                cp += 8;</span>
                                                /* if the string really exists, make a tag of it */
<span class="pl-md"><span class="pl-md">-</span>                                          if (vStringLength(name) > 0)</span>
<span class="pl-md"><span class="pl-md">-</span>                                                  makeRTag(name, ikind);</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                if (vStringLength (name) > 0)</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                        makeRTag (name, K_FUNCTION);</span>
 
                                                /* prepare for the next iteration */
<span class="pl-md"><span class="pl-md">-</span>                                          vStringClear(name);</span>
<span class="pl-md"><span class="pl-md">-</span>                                  } else {</span>
<span class="pl-md"><span class="pl-md">-</span>                                          vStringPut(name, (int)*cp);</span>
<span class="pl-md"><span class="pl-md">-</span>                                          cp++;</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                vStringClear (name);</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                break;</span>
                                        }
<span class="pl-md"><span class="pl-md">-</span>                                  break;</span>
<span class="pl-md"><span class="pl-md">-</span>                          case '<':</span>
<span class="pl-md"><span class="pl-md">-</span>                                  cp++;</span>
<span class="pl-md"><span class="pl-md">-</span>                                  if (*cp == '-') {</span>
<span class="pl-md"><span class="pl-md">-</span>                                          /* assignment: ident <- someval */</span>
<span class="pl-md"><span class="pl-md">-</span>                                          cp++;</span>
<span class="pl-md"><span class="pl-md">-</span>                                          SKIPSPACE(cp);</span>
<span class="pl-md"><span class="pl-md">-</span></span>
<span class="pl-md"><span class="pl-md">-</span>                                          if (*cp == '\0') {</span>
<span class="pl-md"><span class="pl-md">-</span>                                                  /* not in this line, read next */</span>
<span class="pl-md"><span class="pl-md">-</span>                                                  /* sometimes functions are declared this way:</span>
<span class="pl-md"><span class="pl-md">-</span>                                                          ident <-</span>
<span class="pl-md"><span class="pl-md">-</span>                                                          function(...)</span>
<span class="pl-md"><span class="pl-md">-</span>                                                          {</span>
<span class="pl-md"><span class="pl-md">-</span>                                                                  ...</span>
<span class="pl-md"><span class="pl-md">-</span>                                                          }</span>
<span class="pl-md"><span class="pl-md">-</span>                                                          I don't know if there is a reason to write the function keyword</span>
<span class="pl-md"><span class="pl-md">-</span>                                                          in a new line</span>
<span class="pl-md"><span class="pl-md">-</span>                                                  */</span>
<span class="pl-md"><span class="pl-md">-</span>                                                  if ((line = readLineFromInputFile()) != NULL) {</span>
<span class="pl-md"><span class="pl-md">-</span>                                                          cp = (const unsigned char*)line;</span>
<span class="pl-md"><span class="pl-md">-</span>                                                          SKIPSPACE(cp);</span>
<span class="pl-md"><span class="pl-md">-</span>                                                  }</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                        else</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                        {</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                /* it's a variable: ident <- value */</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                /* if the string really exists, make a tag of it */</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                if (vStringLength (name) > 0)</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                {</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                        if (line[0] == ' ' || line[0] == '\t')</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                                makeRTag (name, K_FUNCVAR);</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                        else</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                                makeRTag (name, K_GLOBALVAR);</span>
                                                }
 
<span class="pl-md"><span class="pl-md">-</span>                                          if (strncasecmp((const char*)cp, "function", (size_t)8) == 0) {</span>
<span class="pl-md"><span class="pl-md">-</span>                                                  /* it's a function: ident <- function(args) */</span>
<span class="pl-md"><span class="pl-md">-</span>                                                  cp += 8;</span>
<span class="pl-md"><span class="pl-md">-</span>                                                  /* if the string really exists, make a tag of it */</span>
<span class="pl-md"><span class="pl-md">-</span>                                                  if (vStringLength(name) > 0)</span>
<span class="pl-md"><span class="pl-md">-</span>                                                          makeRTag(name, K_FUNCTION);</span>
<span class="pl-md"><span class="pl-md">-</span></span>
<span class="pl-md"><span class="pl-md">-</span>                                                  /* prepare for the next iteration */</span>
<span class="pl-md"><span class="pl-md">-</span>                                                  vStringClear(name);</span>
<span class="pl-md"><span class="pl-md">-</span>                                                  break;</span>
<span class="pl-md"><span class="pl-md">-</span>                                          }</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                /* prepare for the next iteration */</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                vStringClear (name);</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                                break;</span>
                                        }
<span class="pl-md"><span class="pl-md">-</span>                                  /* fall through */</span>
<span class="pl-md"><span class="pl-md">-</span>                          case ' ':</span>
<span class="pl-md"><span class="pl-md">-</span>                          case '\x009':</span>
<span class="pl-md"><span class="pl-md">-</span>                                  /* skip whitespace */</span>
<span class="pl-md"><span class="pl-md">-</span>                                  cp++;</span>
<span class="pl-md"><span class="pl-md">-</span>                                  break;</span>
<span class="pl-md"><span class="pl-md">-</span>                          default:</span>
<span class="pl-md"><span class="pl-md">-</span>                                  /* collect all characters that could be a part of an identifier */</span>
<span class="pl-md"><span class="pl-md">-</span>                                  vStringPut(name, (int)*cp);</span>
<span class="pl-md"><span class="pl-md">-</span>                                  cp++;</span>
<span class="pl-md"><span class="pl-md">-</span>                                  break;</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                }</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                        case ' ':</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                        case '\x009':</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                /* skip whitespace */</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                cp++;</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                break;</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                        default:</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                /* collect all characters that could be a part of an identifier */</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                vStringPut (name, (int) *cp);</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                cp++;</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                break;</span>
                        }
                }
        }
<span class="pl-mdr">@@ -163,14 +199,17 @@</span>
 
 extern parserDefinition *RParser (void)
 {
<span class="pl-md"><span class="pl-md">-</span>  /* *.r: R files</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>        /* *.r;*.R: R files</span>
         * *.s;*.q: S files
         */
<span class="pl-md"><span class="pl-md">-</span>  static const char *const extensions [] = { "r", "s", "q", NULL };</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>        static const char *const extensions[] = { "r", "R", "s", "q", NULL };</span>
        parserDefinition *const def = parserNew ("R");
<span class="pl-md"><span class="pl-md">-</span>  def->kindTable  = RKinds;</span>
<span class="pl-md"><span class="pl-md">-</span>  def->kindCount  = ARRAY_SIZE (RKinds);</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>        static selectLanguage selectors[] = { selectByArrowOfR,</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>                                              NULL };</span>
        def->extensions = extensions;
<span class="pl-md"><span class="pl-md">-</span>  def->parser     = createRTags;</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>        def->kindTable = RKinds;</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>        def->kindCount = KIND_COUNT;</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>        def->parser = createRTags;</span>
<span class="pl-mi1"><span class="pl-mi1">+</span>        def->selectLanguage = selectors;</span>
        return def;
 }</pre></div>

<p style="font-size:small;-webkit-text-size-adjust:none;color:#666;">—<br />You are receiving this because you are subscribed to this thread.<br />Reply to this email directly, <a href="https://github.com/geany/geany/pull/2376?email_source=notifications&email_token=AAIOWJ5ENSENQEE4GA7DLD3QPY6SPA5CNFSM4JC4YTC2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEB4FBBI#issuecomment-544755845">view it on GitHub</a>, or <a href="https://github.com/notifications/unsubscribe-auth/AAIOWJ57IEP76MISFG66DBDQPY6SPANCNFSM4JC4YTCQ">unsubscribe</a>.<img src="https://github.com/notifications/beacon/AAIOWJ3BM3T62WOTDIXI45DQPY6SPA5CNFSM4JC4YTC2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEB4FBBI.gif" height="1" width="1" alt="" /></p>
<script type="application/ld+json">[
{
"@context": "http://schema.org",
"@type": "EmailMessage",
"potentialAction": {
"@type": "ViewAction",
"target": "https://github.com/geany/geany/pull/2376?email_source=notifications\u0026email_token=AAIOWJ5ENSENQEE4GA7DLD3QPY6SPA5CNFSM4JC4YTC2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEB4FBBI#issuecomment-544755845",
"url": "https://github.com/geany/geany/pull/2376?email_source=notifications\u0026email_token=AAIOWJ5ENSENQEE4GA7DLD3QPY6SPA5CNFSM4JC4YTC2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEB4FBBI#issuecomment-544755845",
"name": "View Pull Request"
},
"description": "View this Pull Request on GitHub",
"publisher": {
"@type": "Organization",
"name": "GitHub",
"url": "https://github.com"
}
}
]</script>