/[m4]/m4/m4/symtab.c
ViewVC logotype

Diff of /m4/m4/symtab.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.9 by akim, Mon Sep 3 15:06:24 2001 UTC revision 1.10 by akim, Wed Sep 5 07:24:58 2001 UTC
# Line 136  m4_symbol_delete (m4_symbol *symbol) Line 136  m4_symbol_delete (m4_symbol *symbol)
136  m4_symbol *  m4_symbol *
137  m4_lookup_symbol (const char *name, m4_symbol_lookup mode)  m4_lookup_symbol (const char *name, m4_symbol_lookup mode)
138  {  {
139    if (mode == M4_SYMBOL_IGNORE)    m4_symbol **psymbol = (m4_symbol **) m4_hash_lookup (m4_symtab, name);
     return 0;  
140    
141    {    switch (mode)
142      m4_symbol **psymbol = (m4_symbol **) m4_hash_lookup (m4_symtab, name);      {
143        case M4_SYMBOL_LOOKUP:
144      switch (mode)        /* If just searching, return status of search.  */
145          return psymbol ? *psymbol : 0;
146    
147        case M4_SYMBOL_INSERT:
148          /* Return the symbol, if the name was found in the table.
149             Otherwise, just insert the name, and return the new symbol.  */
150          if (psymbol)
151            return *psymbol;
152          /* NOBREAK */
153    
154        case M4_SYMBOL_PUSHDEF:
155          /* Insert a name in the symbol table.  If there is already a symbol
156             with the name, push the new value on top of the value stack for
157             this symbol.  */
158        {        {
159        case M4_SYMBOL_LOOKUP:          m4_symbol *symbol               = 0;
160          /* If just searching, return status of search.  */          m4_token_data *value            = XCALLOC (m4_token_data, 1);
161          return psymbol ? *psymbol : 0;  
   
       case M4_SYMBOL_INSERT:  
         /* Return the symbol, if the name was found in the table.  
            Otherwise, just insert the name, and return the new symbol.  */  
162          if (psymbol)          if (psymbol)
163            return *psymbol;            {
164          /* NOBREAK */              symbol = *psymbol;
165                M4_TOKEN_DATA_NEXT (value)= M4_SYMBOL_DATA (symbol);
166              }
167            else
168              symbol = XCALLOC (m4_symbol, 1);
169    
170        case M4_SYMBOL_PUSHDEF:          M4_SYMBOL_DATA (symbol) = value;
171          /* Insert a name in the symbol table.  If there is already a symbol          M4_SYMBOL_TYPE (symbol) = M4_TOKEN_VOID;
            with the name, push the new value on top of the value stack for  
            this symbol.  */  
         {  
           m4_symbol *symbol             = 0;  
           m4_token_data *value          = XCALLOC (m4_token_data, 1);  
172    
173            if (psymbol)          if (!psymbol)
174              {            m4_hash_insert (m4_symtab, xstrdup (name), symbol);
               symbol = *psymbol;  
               M4_TOKEN_DATA_NEXT (value)= M4_SYMBOL_DATA (symbol);  
             }  
           else  
             symbol = XCALLOC (m4_symbol, 1);  
   
           M4_SYMBOL_DATA (symbol)       = value;  
           M4_SYMBOL_TYPE (symbol)       = M4_TOKEN_VOID;  
175    
176            if (!psymbol)          return symbol;
177              m4_hash_insert (m4_symtab, xstrdup (name), symbol);        }
178    
179            return symbol;      case M4_SYMBOL_POPDEF:
180          /* Delete the first occurence of a symbol with NAME.  */
181          if (psymbol)
182            {
183              if (M4_SYMBOL_DATA_NEXT (*psymbol))
184                m4_symbol_popdef (*psymbol);
185              else
186                {
187                  xfree (m4_hash_remove (m4_symtab, name));
188                  m4_symbol_delete (*psymbol);
189                }
190          }          }
191          return 0;
192    
193        case M4_SYMBOL_POPDEF:      case M4_SYMBOL_DELETE:
194          /* Delete the first occurence of a symbol with NAME.  */        /* Delete all occurences of symbols with NAME.  */
195          if (psymbol)        if (psymbol)
196            {          {
197              if (M4_SYMBOL_DATA_NEXT (*psymbol))            xfree (m4_hash_remove (m4_symtab, name));
198                m4_symbol_popdef (*psymbol);            m4_symbol_delete (*psymbol);
199              else          }
200                {        else
201                  xfree (m4_hash_remove (m4_symtab, name));          M4ERROR ((warning_status, 0,
                 m4_symbol_delete (*psymbol);  
               }  
           }  
         return 0;  
   
       case M4_SYMBOL_DELETE:  
         /* Delete all occurences of symbols with NAME.  */  
         if (psymbol)  
           {  
             xfree (m4_hash_remove (m4_symtab, name));  
             m4_symbol_delete (*psymbol);  
           }  
         else  
           M4ERROR ((warning_status, 0,  
202                    _("INTERNAL ERROR: Attempt to delete non-existant symbol: %s"),                    _("INTERNAL ERROR: Attempt to delete non-existant symbol: %s"),
203                      name));                    name));
204          return 0;        return 0;
205        }      }
   }  
206    
207    M4ERROR ((warning_status, 0,    M4ERROR ((warning_status, 0,
208              _("INTERNAL ERROR: Illegal mode to m4_symbol_lookup (%s, %d)"),              _("INTERNAL ERROR: Illegal mode to m4_symbol_lookup (%s, %d)"),

Legend:
Removed from v.1.9  
changed lines
  Added in v.1.10

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26