@@ -106,6 +106,7 @@ enum eShKeywordId {
106
106
KEYWORD_alias ,
107
107
KEYWORD_source ,
108
108
KEYWORD_autoload ,
109
+ KEYWORD_declare , /* declare, typeset, local, export, readonly, float(zsh), integer */
109
110
};
110
111
111
112
const char * dialectMap [] = {
@@ -117,6 +118,13 @@ static const struct dialectalKeyword KeywordTable [] = {
117
118
{ "alias" , KEYWORD_alias , { 1 , 1 } },
118
119
{ "source" , KEYWORD_source , { 1 , 1 } },
119
120
{ "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 } },
120
128
};
121
129
122
130
/*
@@ -355,6 +363,10 @@ static size_t handleShKeyword (int keyword,
355
363
* role = R_SCRIPT_LOADED ;
356
364
* check_char = isFileChar ;
357
365
break ;
366
+ case KEYWORD_declare :
367
+ * kind = K_VARIABLE ;
368
+ * check_char = isIdentChar ;
369
+ break ;
358
370
default :
359
371
AssertNotReached ();
360
372
break ;
@@ -523,7 +535,8 @@ static bool doesLineCotinue(const unsigned char *start, const unsigned char *cp)
523
535
524
536
while (start < cp )
525
537
{
526
- if (* cp == ';' || * cp == '|' || * cp == '&' )
538
+ if (* cp == ';' || * cp == '|' || * cp == '&'
539
+ || * cp == '(' || * cp == '{' )
527
540
return false;
528
541
else if (isspace (* cp ))
529
542
cp -- ;
@@ -540,7 +553,7 @@ static bool handleVariableAssignment (vString *input)
540
553
541
554
while (* cp != '\0' )
542
555
{
543
- if (* cp == '=' )
556
+ if (* cp == '=' || ( * cp == '+' && * ( cp + 1 ) == '=' ) )
544
557
{
545
558
size_t len = cp - base ;
546
559
if (len > 0 )
0 commit comments