From 0ee38a307c146774523a2eb4ab1bb67ed37a81f2 Mon Sep 17 00:00:00 2001 From: Phil Hagelberg Date: Mon, 9 Jul 2018 08:57:26 -0700 Subject: [PATCH] Fix getFennelOutline. Now it loops thru each "(fn " match to find identifiers, treating whitespace or open-bracket as an end-of-identifier. There are other characters which could theoretically signal the end of an identifier, but none of them are valid in this position. --- src/luaapi.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/luaapi.c b/src/luaapi.c index e3fbbcb..156e0b7 100644 --- a/src/luaapi.c +++ b/src/luaapi.c @@ -1680,28 +1680,36 @@ static const tic_outline_item* getFennelOutline(const char* code, s32* size) while(true) { - static const char FuncString[] = "fn"; /* this probably doesn't work */ + static const char FuncString[] = "(fn "; ptr = strstr(ptr, FuncString); if(ptr) { - const char* end = ptr; - ptr += sizeof FuncString - 1; - while(end >= code && !isalnum_(*end)) end--; + const char* start = ptr; + const char* end = start; - const char* start = end; + while(*ptr) + { + char c = *ptr; - for (const char* val = start-1; val >= code && (isalnum_(*val)); val--, start--); + if(c == ' ' || c == '\t' || c == '\n' || c == '[') + { + end = ptr; + break; + } + + ptr++; + } if(end > start) { items = items ? realloc(items, (*size + 1) * Size) : malloc(Size); items[*size].pos = start - code; - items[*size].size = end - start + 1; + items[*size].size = end - start; (*size)++; }