@@ -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
111112const 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