Revision: 3449 http://geany.svn.sourceforge.net/geany/?rev=3449&view=rev Author: eht16 Date: 2009-01-06 14:53:31 +0000 (Tue, 06 Jan 2009)
Log Message: ----------- Fix some bugs in parsing FreeBasic code (#2489605).
Modified Paths: -------------- trunk/ChangeLog trunk/tagmanager/basic.c
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2009-01-04 23:32:33 UTC (rev 3448) +++ trunk/ChangeLog 2009-01-06 14:53:31 UTC (rev 3449) @@ -1,3 +1,9 @@ +2009-01-06 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de> + + * tagmanager/basic.c: + Fix some bugs in parsing FreeBasic code (#2489605). + + 2009-01-04 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
* wscript, THANKS, data/filetype_extensions.conf, src/templates.c,
Modified: trunk/tagmanager/basic.c =================================================================== --- trunk/tagmanager/basic.c 2009-01-04 23:32:33 UTC (rev 3448) +++ trunk/tagmanager/basic.c 2009-01-06 14:53:31 UTC (rev 3449) @@ -71,9 +71,14 @@ /* Match the name of a dim or const starting at pos. */ static int extract_dim (char const *pos, vString * name, BasicKind kind) { + const char *old_pos = pos; while (isspace (*pos)) pos++;
+ /* create tags only if there is some space between the keyword and the identifier */ + if (old_pos == pos) + return 0; + vStringClear (name);
if (strncasecmp (pos, "shared", 6) == 0) @@ -95,15 +100,20 @@ pos++; /* now we are at the name */ } - /* capture "dim as foo ptr bar" */ - if (strncasecmp (pos, "ptr", 3) == 0) + if (strncasecmp (pos, "ptr", 3) == 0 && isspace(*(pos+4))) { pos += 3; /* skip keyword "ptr" */ - while (isspace (*pos)) pos++; } + /* capture "dim as string * 4096 chunk" */ + if (strncmp (pos, "*", 1) == 0) + { + pos += 1; /* skip "*" */ + while (isspace (*pos) || isdigit(*pos) || ispunct(*pos)) + pos++; + }
for (; *pos && !isspace (*pos) && *pos != '(' && *pos != ',' && *pos != '='; pos++) vStringPut (name, *pos); @@ -155,6 +165,7 @@ vString *name; size_t i; int j; + const char *old_p; for (i = 0; i < strlen (kw->token); i++) { if (tolower (p[i]) != kw->token[i]) @@ -167,6 +178,17 @@ kw == &freebasic_keywords[2]) return extract_dim (p, name, kw->kind); /* extract_dim adds the found tag(s) */
+ old_p = p; + while (isspace (*p)) + p++; + + /* create tags only if there is some space between the keyword and the identifier */ + if (old_p == p) + { + vStringDelete (name); + return 0; + } + for (j = 0; j < 1; j++) { p = extract_name (p, name); @@ -207,8 +229,8 @@ while (isspace (*p)) p++;
- /* Empty line? */ - if (!*p) + /* Empty line or comment? */ + if (!*p || *p == ''') continue;
/* In Basic, keywords always are at the start of the line. */
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.