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

Diff of /m4/m4/builtin.c

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

revision 1.14 by gary, Fri Oct 12 19:57:29 2001 UTC revision 1.15 by gary, Thu Jun 5 16:12:16 2003 UTC
# Line 71  m4_builtin_find_by_func (const m4_builti Line 71  m4_builtin_find_by_func (const m4_builti
71  }  }
72    
73  m4_symbol *  m4_symbol *
74  m4_builtin_pushdef (const char *name, lt_dlhandle handle,  m4_symbol_token (const char *name, m4_data_t type, m4_token *token,
75                      m4_builtin_func *func, int flags, int min_args,                   m4_symbol *(*getter) (const char *name),
76                      int max_args)                   m4_symbol *(*setter) (m4_symbol *, m4_token *))
77  {  {
78    m4_symbol *symbol;    m4_symbol *symbol;
79    
80    assert (name);    assert (name);
81    assert (handle);    assert (!token || (TOKEN_TYPE (token) == type));
82    assert (func);    assert (getter);
83      assert (setter);
84    
85    symbol = m4_symbol_pushdef (name);    symbol = (*getter) (name);
86    
87    if (symbol)    if (symbol)
88      m4_symbol_builtin (symbol, handle, func, flags, min_args, max_args);      {
89          m4_token empty;
   return symbol;  
 }  
   
 m4_symbol *  
 m4_builtin_define (const char *name, lt_dlhandle handle,  
                    m4_builtin_func *func, int flags,  
                    int min_args, int max_args)  
 {  
   m4_symbol *symbol;  
90    
91    assert (name);        if (!token)
92    assert (handle);          {
93    assert (func);            bzero (&empty, sizeof (m4_token));
94              TOKEN_TYPE (&empty) = type;
95              switch (type)
96                {
97                case M4_TOKEN_TEXT:
98                  TOKEN_TEXT (&empty) = "";
99                  break;
100    
101                case M4_TOKEN_FUNC:
102                case M4_TOKEN_VOID:
103                  break;
104                }
105    
106    symbol = m4_symbol_define (name);            token = ∅
107            }
108    
109    if (symbol)        (*setter) (symbol, token);
110      m4_symbol_builtin (symbol, handle, func, flags, min_args, max_args);      }
111    
112    return symbol;    return symbol;
113  }  }
# Line 112  void Line 116  void
116  m4_builtin_table_install (lt_dlhandle handle, const m4_builtin *table)  m4_builtin_table_install (lt_dlhandle handle, const m4_builtin *table)
117  {  {
118    const m4_builtin *bp;    const m4_builtin *bp;
119      m4_token token;
120    
121    assert (handle);    assert (handle);
122    assert (table);    assert (table);
123    
124      bzero (&token, sizeof (m4_token));
125      TOKEN_TYPE (&token)           = M4_TOKEN_FUNC;
126      TOKEN_HANDLE (&token)         = handle;
127    
128    for (bp = table; bp->name != NULL; bp++)    for (bp = table; bp->name != NULL; bp++)
129      {      {
130        int flags = 0;        int flags = 0;
131        char *key;        char *name;
132    
133        if (prefix_all_builtins)        if (prefix_all_builtins)
134          {          {
135            static const char prefix[] = "m4_";            static const char prefix[] = "m4_";
136            size_t len = strlen (prefix) + strlen (bp->name);            size_t len = strlen (prefix) + strlen (bp->name);
137    
138            key = (char *) xmalloc (1+ len);            name = (char *) xmalloc (1+ len);
139            snprintf (key, 1+ len, "%s%s", prefix, bp->name);            snprintf (name, 1+ len, "%s%s", prefix, bp->name);
140          }          }
141        else        else
142          key = (char *) bp->name;          name = (char *) bp->name;
143    
144        if (bp->groks_macro_args) BIT_SET (flags, TOKEN_MACRO_ARGS_BIT);        if (bp->groks_macro_args) BIT_SET (flags, TOKEN_MACRO_ARGS_BIT);
145        if (bp->blind_if_no_args) BIT_SET (flags, TOKEN_BLIND_ARGS_BIT);        if (bp->blind_if_no_args) BIT_SET (flags, TOKEN_BLIND_ARGS_BIT);
146    
147        m4_builtin_pushdef (key, handle, bp->func, flags,        TOKEN_FUNC (&token)       = bp->func;
148                            bp->min_args, bp->max_args);        TOKEN_FLAGS (&token)      = flags;
149          TOKEN_MIN_ARGS (&token)   = bp->min_args;
150          TOKEN_MAX_ARGS (&token)   = bp->max_args;
151    
152          m4_builtin_pushdef (name, &token);
153    
154        if (prefix_all_builtins)        if (prefix_all_builtins)
155          xfree (key);          xfree (name);
156      }      }
157  }  }
158    
 m4_symbol *  
 m4_macro_pushdef (const char *name, lt_dlhandle handle, const char *text,  
                   int flags, int min_args, int max_args)  
 {  
   m4_symbol *symbol;  
   
   assert (name);  
   assert (text);  
   
   symbol = m4_symbol_pushdef (name);  
   
   if (symbol)  
     m4_symbol_macro (symbol, handle, text, flags, min_args, max_args);  
   
   return symbol;  
 }  
   
 m4_symbol *  
 m4_macro_define (const char *name, lt_dlhandle handle, const char *text,  
                  int flags, int min_args, int max_args)  
 {  
   m4_symbol *symbol;  
   
   assert (name);  
   assert (text);  
   
   symbol = m4_symbol_define (name);  
   
   if (symbol)  
     m4_symbol_macro (symbol, handle, text, flags, min_args, max_args);  
   
   return symbol;  
 }  
   
   
159  void  void
160  m4_macro_table_install (lt_dlhandle handle, const m4_macro *table)  m4_macro_table_install (lt_dlhandle handle, const m4_macro *table)
161  {  {
162    const m4_macro *mp;    const m4_macro *mp;
163      m4_token token;
164    
165      bzero (&token, sizeof (m4_token));
166      TOKEN_TYPE (&token)           = M4_TOKEN_TEXT;
167      TOKEN_HANDLE (&token)         = handle;
168    
169    for (mp = table; mp->name != NULL; mp++)    for (mp = table; mp->name != NULL; mp++)
170      m4_macro_pushdef (mp->name, handle, mp->value, 0, 0, -1);      {
171          TOKEN_TEXT (&token)       = (char *) mp->value;
172          m4_macro_pushdef (mp->name, &token);
173        }
174  }  }

Legend:
Removed from v.1.14  
changed lines
  Added in v.1.15

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