[BACK]Return to parse.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / usr.bin / make

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/usr.bin/make/parse.c between version 1.388 and 1.389

version 1.388, 2020/10/18 20:07:26 version 1.389, 2020/10/18 20:14:27
Line 1753  out:
Line 1753  out:
         Lst_Free(curTargs);          Lst_Free(curTargs);
 }  }
   
   typedef struct VarAssignParsed {
       const char *nameStart;      /* unexpanded */
       const char *nameEnd;        /* before operator adjustment */
       const char *eq;             /* the '=' of the assignment operator */
   } VarAssignParsed;
   
 /* Determine the assignment operator and adjust the end of the variable  /* Determine the assignment operator and adjust the end of the variable
  * name accordingly. */   * name accordingly. */
 static void  static void
 ParseVarassignOp(VarAssign *var)  AdjustVarassignOp(const VarAssignParsed *pvar, const char *value,
                     VarAssign *out_var)
 {  {
     const char *op = var->eq;      const char *op = pvar->eq;
     const char * const name = var->nameStart;      const char * const name = pvar->nameStart;
     VarAssignOp type;      VarAssignOp type;
   
     if (op > name && op[-1] == '+') {      if (op > name && op[-1] == '+') {
Line 1792  ParseVarassignOp(VarAssign *var)
Line 1799  ParseVarassignOp(VarAssign *var)
     }      }
   
     {      {
         const char *nameEnd = var->nameEndDraft < op ? var->nameEndDraft : op;          const char *nameEnd = pvar->nameEnd < op ? pvar->nameEnd : op;
         var->varname = bmake_strsedup(var->nameStart, nameEnd);          out_var->varname = bmake_strsedup(pvar->nameStart, nameEnd);
         var->op = type;          out_var->op = type;
           out_var->value = value;
     }      }
 }  }
   
Line 1806  ParseVarassignOp(VarAssign *var)
Line 1814  ParseVarassignOp(VarAssign *var)
 Boolean  Boolean
 Parse_IsVar(const char *p, VarAssign *out_var)  Parse_IsVar(const char *p, VarAssign *out_var)
 {  {
       VarAssignParsed pvar;
     const char *firstSpace = NULL;      const char *firstSpace = NULL;
     char ch;      char ch;
     int level = 0;      int level = 0;
Line 1818  Parse_IsVar(const char *p, VarAssign *ou
Line 1827  Parse_IsVar(const char *p, VarAssign *ou
      * as part of the variable name.  It is later corrected, as is the ':sh'       * as part of the variable name.  It is later corrected, as is the ':sh'
      * modifier. Of these two (nameEnd and op), the earlier one determines the       * modifier. Of these two (nameEnd and op), the earlier one determines the
      * actual end of the variable name. */       * actual end of the variable name. */
     out_var->nameStart = p;      pvar.nameStart = p;
 #ifdef CLEANUP  #ifdef CLEANUP
     out_var->nameEndDraft = NULL;      pvar.nameEnd = NULL;
     out_var->varname = NULL;      pvar.eq = NULL;
     out_var->eq = NULL;  
     out_var->op = VAR_NORMAL;  
     out_var->value = NULL;  
 #endif  #endif
   
     /* Scan for one of the assignment operators outside a variable expansion */      /* Scan for one of the assignment operators outside a variable expansion */
Line 1854  Parse_IsVar(const char *p, VarAssign *ou
Line 1860  Parse_IsVar(const char *p, VarAssign *ou
         }          }
 #endif  #endif
         if (ch == '=') {          if (ch == '=') {
             out_var->eq = p - 1;              pvar.eq = p - 1;
             out_var->nameEndDraft = firstSpace != NULL ? firstSpace : p - 1;              pvar.nameEnd = firstSpace != NULL ? firstSpace : p - 1;
             out_var->op = VAR_NORMAL;  
             cpp_skip_whitespace(&p);              cpp_skip_whitespace(&p);
             out_var->value = p;              AdjustVarassignOp(&pvar, p, out_var);
             return TRUE;              return TRUE;
         }          }
         if (*p == '=' && (ch == '+' || ch == ':' || ch == '?' || ch == '!')) {          if (*p == '=' && (ch == '+' || ch == ':' || ch == '?' || ch == '!')) {
             out_var->eq = p;              pvar.eq = p;
             out_var->nameEndDraft = firstSpace != NULL ? firstSpace : p;              pvar.nameEnd = firstSpace != NULL ? firstSpace : p;
             out_var->op = ch == '+' ? VAR_APPEND :  
                           ch == ':' ? VAR_SUBST :  
                           ch == '?' ? VAR_DEFAULT : VAR_SHELL;  
             p++;              p++;
             cpp_skip_whitespace(&p);              cpp_skip_whitespace(&p);
             out_var->value = p;              AdjustVarassignOp(&pvar, p, out_var);
             return TRUE;              return TRUE;
         }          }
         if (firstSpace != NULL)          if (firstSpace != NULL)
Line 2013  Parse_DoVar(VarAssign *var, GNode *ctxt)
Line 2015  Parse_DoVar(VarAssign *var, GNode *ctxt)
     const char *avalue;         /* actual value (maybe expanded) */      const char *avalue;         /* actual value (maybe expanded) */
     void *avalue_freeIt;      void *avalue_freeIt;
   
     ParseVarassignOp(var);  
   
     VarCheckSyntax(var->op, var->value, ctxt);      VarCheckSyntax(var->op, var->value, ctxt);
     if (VarAssign_Eval(var, ctxt, &avalue, &avalue_freeIt))      if (VarAssign_Eval(var, ctxt, &avalue, &avalue_freeIt))
         VarAssignSpecial(var->varname, avalue);          VarAssignSpecial(var->varname, avalue);

Legend:
Removed from v.1.388  
changed lines
  Added in v.1.389

CVSweb <webmaster@jp.NetBSD.org>