<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>