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

Diff of /m4/modules/m4.c

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

revision 1.50 by gary, Thu Jul 24 12:16:46 2003 UTC revision 1.51 by gary, Thu Jul 24 14:21:03 2003 UTC
# Line 35  extern int errno; Line 35  extern int errno;
35  #include <assert.h>  #include <assert.h>
36    
37  #include <m4module.h>  #include <m4module.h>
38    #include <modules/m4.h>
39    
40  #ifdef NDEBUG  #ifdef NDEBUG
41  /* Include this header for speed, which gives us direct access to  /* Include this header for speed, which gives us direct access to
# Line 49  extern int errno; Line 50  extern int errno;
50  #define m4_builtin_table        m4_LTX_m4_builtin_table  #define m4_builtin_table        m4_LTX_m4_builtin_table
51    
52  /* Exit code from last "syscmd" command.  */  /* Exit code from last "syscmd" command.  */
53  int m4_sysval = 0;  int  m4_sysval = 0;
54    
55  void m4_sysval_flush (m4 *context);  void m4_sysval_flush (m4 *context);
56    void m4_dump_symbols (m4 *context, m4_dump_symbol_data *data, int argc,
57                          m4_symbol_value **argv, boolean complain);
58    
59  m4_export m4_export_table[] = {  m4_export m4_export_table[] = {
60    { "m4_sysval",                &m4_sysval },    { "m4_sysval",                &m4_sysval },
61    { "m4_sysval_flush",          &m4_sysval_flush },    { "m4_sysval_flush",          &m4_sysval_flush },
62      { "m4_dump_symbols",          &m4_dump_symbols },
63    
64    { NULL,                       NULL }    { NULL,                       NULL }
65  };  };
# Line 107  typedef long int number; Line 112  typedef long int number;
112  typedef unsigned long int unumber;  typedef unsigned long int unumber;
113  #endif  #endif
114    
   
115  static void     include         (m4 *context, int argc, m4_symbol_value **argv,  static void     include         (m4 *context, int argc, m4_symbol_value **argv,
116                                   boolean silent);                                   boolean silent);
117    static int      dumpdef_cmp_CB  (const void *s1, const void *s2);
118  static void *   set_trace_CB    (m4_symbol_table *symtab, const char *ignored,  static void *   set_trace_CB    (m4_symbol_table *symtab, const char *ignored,
119                                   m4_symbol *symbol, void *userdata);                                   m4_symbol *symbol, void *userdata);
120    static void *   dump_symbol_CB  (m4_symbol_table *ignored, const char*name,
121                                     m4_symbol *symbol, void *userdata);
122  static const char *ntoa         (number value, int radix);  static const char *ntoa         (number value, int radix);
123  static void     numb_obstack    (m4_obstack *obs, const number value,  static void     numb_obstack    (m4_obstack *obs, const number value,
124                                   const int radix, int min);                                   const int radix, int min);
# Line 281  M4BUILTIN_HANDLER (ifelse) Line 288  M4BUILTIN_HANDLER (ifelse)
288  }  }
289    
290    
291    /* qsort comparison routine, for sorting the table made in m4_dumpdef ().  */
292    static int
293    dumpdef_cmp_CB (const void *s1, const void *s2)
294    {
295      return strcmp (*(const char **) s1, *(const char **) s2);
296    }
297    
298    /* The function m4_dump_symbols () is for use by "dumpdef".  It builds up a
299       table of all defined symbol names.  */
300    static void *
301    dump_symbol_CB (m4_symbol_table *ignored, const char *name, m4_symbol *symbol,
302                    void *userdata)
303    {
304      assert (name);
305      assert (symbol);
306    
307      if (!m4_is_symbol_value_void (m4_get_symbol_value (symbol)))
308        {
309          m4_dump_symbol_data *symbol_data = (m4_dump_symbol_data *) userdata;
310    
311          obstack_blank (symbol_data->obs, sizeof (const char *));
312          symbol_data->base = (const char **) obstack_base (symbol_data->obs);
313          symbol_data->base[symbol_data->size++] = (const char *) name;
314        }
315    
316      return NULL;
317    }
318    
319    /* If there are no arguments, build a sorted list of all defined
320       symbols, otherwise, only the specified symbols.  */
321    void
322    m4_dump_symbols (m4 *context, m4_dump_symbol_data *data, int argc,
323                     m4_symbol_value **argv, boolean complain)
324    {
325      data->base = (const char **) obstack_base (data->obs);
326      data->size = 0;
327    
328      if (argc == 1)
329        {
330          m4_symtab_apply (M4SYMTAB, dump_symbol_CB, data);
331        }
332      else
333        {
334          int i;
335          m4_symbol *symbol;
336    
337          for (i = 1; i < argc; i++)
338            {
339              symbol = m4_symbol_lookup (M4SYMTAB, M4ARG (i));
340              if (symbol != NULL
341                  && !m4_is_symbol_value_void (m4_get_symbol_value (symbol)))
342                {
343                  dump_symbol_CB (NULL, M4ARG (i), symbol, data);
344                }
345              else if (complain)
346                M4WARN ((m4_get_warning_status_opt (context), 0,
347                         _("Warning: %s: undefined name: %s"),
348                         M4ARG (0), M4ARG (i)));
349            }
350        }
351    
352      obstack_finish (data->obs);
353      qsort ((void*) data->base, data->size, sizeof (const char*), dumpdef_cmp_CB);
354    }
355    
356    
357  /* Implementation of "dumpdef" itself.  It builds up a table of pointers to  /* Implementation of "dumpdef" itself.  It builds up a table of pointers to
358     symbols, sorts it and prints the sorted table.  */     symbols, sorts it and prints the sorted table.  */
359  M4BUILTIN_HANDLER (dumpdef)  M4BUILTIN_HANDLER (dumpdef)
360  {  {
361    struct m4_dump_symbol_data data;    m4_dump_symbol_data data;
362    const m4_builtin *bp;    const m4_builtin *bp;
363    
364    data.obs = obs;    data.obs = obs;
# Line 316  M4BUILTIN_HANDLER (dumpdef) Line 389  M4BUILTIN_HANDLER (dumpdef)
389          }          }
390        else        else
391          {          {
392            assert (!"illegal token in m4_dumpdef");            assert (!"illegal token in builtin_dumpdef");
393          }          }
394      }      }
395  }  }

Legend:
Removed from v.1.50  
changed lines
  Added in v.1.51

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