Skip to content

Commit 82e721d

Browse files
committed
Sh: consider keywords for declaring variables
Signed-off-by: Masatake YAMATO <[email protected]>
1 parent 910a460 commit 82e721d

File tree

1 file changed

+15
-2
lines changed

1 file changed

+15
-2
lines changed

parsers/sh.c

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ enum eShKeywordId {
106106
KEYWORD_alias,
107107
KEYWORD_source,
108108
KEYWORD_autoload,
109+
KEYWORD_declare, /* declare, typeset, local, export, readonly, float(zsh), integer */
109110
};
110111

111112
const char *dialectMap [] = {
@@ -117,6 +118,13 @@ static const struct dialectalKeyword KeywordTable [] = {
117118
{ "alias", KEYWORD_alias, { 1, 1 } },
118119
{ "source", KEYWORD_source, { 1, 1 } },
119120
{ "autoload", KEYWORD_autoload, { 0, 1 } },
121+
{ "declare", KEYWORD_declare, { 1, 1 } },
122+
{ "typset", KEYWORD_declare, { 1, 1 } },
123+
{ "local", KEYWORD_declare, { 1, 1 } },
124+
{ "export", KEYWORD_declare, { 1, 1 } },
125+
{ "readonly", KEYWORD_declare, { 1, 1 } },
126+
{ "float", KEYWORD_declare, { 0, 1 } },
127+
{ "integer", KEYWORD_declare, { 0, 1 } },
120128
};
121129

122130
/*
@@ -355,6 +363,10 @@ static size_t handleShKeyword (int keyword,
355363
*role = R_SCRIPT_LOADED;
356364
*check_char = isFileChar;
357365
break;
366+
case KEYWORD_declare:
367+
*kind = K_VARIABLE;
368+
*check_char = isIdentChar;
369+
break;
358370
default:
359371
AssertNotReached();
360372
break;
@@ -523,7 +535,8 @@ static bool doesLineCotinue(const unsigned char *start, const unsigned char *cp)
523535

524536
while (start < cp)
525537
{
526-
if (*cp == ';' || *cp == '|' || *cp == '&')
538+
if (*cp == ';' || *cp == '|' || *cp == '&'
539+
|| *cp == '(' || *cp == '{')
527540
return false;
528541
else if (isspace(*cp))
529542
cp--;
@@ -540,7 +553,7 @@ static bool handleVariableAssignment (vString *input)
540553

541554
while (*cp != '\0')
542555
{
543-
if (*cp == '=')
556+
if (*cp == '=' || (*cp == '+' && *(cp + 1) == '='))
544557
{
545558
size_t len = cp - base;
546559
if (len > 0)

0 commit comments

Comments
 (0)