summaryrefslogtreecommitdiff
path: root/tests/modtest.c
blob: 161b3e77b851832dc8ca7d9760ea388ee1f3efdf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/* GNU m4 -- A simple macro processor
   Copyright (C) 1999-2001, 2003-2004, 2006-2008, 2010, 2013-2014 Free
   Software Foundation, Inc.

   This file is part of GNU M4.

   GNU M4 is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   GNU M4 is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include <config.h>

/* Build using only the exported interfaces, unless NDEBUG is set, in
   which case use private symbols to speed things up as much as possible.  */
#ifndef NDEBUG
#  include <m4/m4module.h>
#else
#  include "m4private.h"
#endif

extern bool export_test (const char *foo);

/*         function     macros  blind   side    minargs maxargs */
#define builtin_functions                                       \
  BUILTIN (test,        false,  false,  false,  0,      0)

#define BUILTIN(handler, macros, blind, side, min, max) M4BUILTIN (handler)
  builtin_functions
#undef BUILTIN

static const m4_builtin m4_builtin_table[] =
{
#define BUILTIN(handler, macros, blind, side, min, max)                 \
  M4BUILTIN_ENTRY (handler, #handler, macros, blind, side, min, max)

  builtin_functions
#undef BUILTIN

  { NULL, NULL, 0, 0, 0 },
};

static const m4_macro m4_macro_table[] =
{
  /* name               text            min     max */
  { "__test__",         "`modtest'",    0,      0 },
  { "onearg",           "$1",           1,      1 },
  { "manyargs",         "$@",           0,      SIZE_MAX },
  { NULL,               NULL,           0,      0 },
};



/**
 * modtest()
 **/
void
include_modtest (m4 *context, m4_module *module, m4_obstack *obs)
{
  const char *s = "Test module loaded.\n";

  m4_install_builtins (context, module, m4_builtin_table);
  m4_install_macros   (context, module, m4_macro_table);

  /* Don't depend on OBS so that the traces are the same when used
     directly, or via a frozen file.  */
  fputs (s, stderr);
}


/**
 * test()
 **/
M4BUILTIN_HANDLER (test)
{
  const char *s = "Test module called.";

  assert (obs != 0);
  obstack_grow (obs, s, strlen(s));
}


/**
 * export_test()
 **/
bool
export_test (const char *foo)
{
  if (foo)
    xfprintf (stderr, "%s\n", foo);
  return (bool) (foo != 0);
}