This directory contains all bundled modules for GNU m4. Dynamic modules are only available if the host operating system provides one (or more!) of libltdl's required APIs. Implementation details are in ../m4/module.c A module is a compiled shared object, i.e., modules are written in C and then compiled. The compiled file can then be loaded into a running m4 process by calling m4 with the module name listed on the command line, or by calling the builtin "include". This gives GNU m4 potential access to any system feature with a C interface. Modules are searched for in M4PATH, if set, else in a module directory defined at configure time, $prefix/lib/m4/ by default. Extra directories can also be added to the search patch by specifying them on the command line with the `-I' or `-B' options. A module extends GNU m4 by defining new builtins, It can define builtins with the same names as existing builtins, which will shadow the existing builtins, making them temporarily unavailable. A module cannot redefine internal functions of GNU m4, such as the input parser or argument handling (yet!). Each module should include the installed header file, `$prefix/include/m4module.h'. This will define all the necessary macros, type declarations and function prototypes required to implement a module. The module system uses libtool's libltdl for dynamic module loading, and that in turn requires that any non-static symbols in the module to be be in their own namespace to avoid namespace clashes with symbols exported from other modules (which may be loaded too!). This is usually done by `#define'ing these symbols to libltdl's naming scheme at the top of the file. The scheme is to prefix each symbol with the module name, followed by `_LTX_' and then the original symbol name. For example, to export "m4_macro_table" in a source file which will become part of a module, "mymod", we would add the following to the top of the source file: `#define m4_macro_table mymod_LTX_m4_macro_table'. See the included modules for more examples. Each module *must* define one or more entry points from the following: "m4_builtin_table", "m4_macro_table" and "m4_init_module". The symbol "m4_builtin_table" is a pointer to a table of "m4_builtin" (defined in m4module.h), listing each new builtin that it implements. The symbol "m4_macro_table", is a pointer to a table of "m4_macro", listing each text macro initialised by the module. These tables end with an entry where name == NULL. If a module defines the symbol "m4_init_module", it is supposed to be a function with a prototype of "void m4_init_module (struct obstack *obs)", and it will be called as soon as the module is loaded. Any non-finished object left on the obstack will be the expansion of the call of the builtin "include". The obstack pointer might be NULL (in the future). If a module defines the symbol "m4_finish_module", it is supposed to be a function with a prototype of "void m4_finish_module (void)", and it will be called just before the module is unloaded or GNU m4 exits. This will allow a module to clean up before exit. There is no way of communicating information to the user, as GNU m4 exits immediately afterwards. No other symbols will be used by GNU m4. All other symbols within the module are private and should be declared `static' so that they will not be accessible to GNU m4 or to other modules. Modules are allowed to call external functions already defined within the GNU m4module library. These have prototypes in m4module.h. Loading and unloading of modules, and symbol namespace resolution strategies are illustrated by shadow.c and shadow.m4. To try the demos, compile with `make' and run them with the commands as: tests/m4 doc/examples/time.m4 or in the case of time2.m4 tests/m4 -I tests time -I doc/examples time2.m4 ======================================================================== Copyright (C) 2000-2001, 2006, 2010, 2013 Free Software Foundation, Inc. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the license is included in the ``GNU Free Documentation License'' file as part of this distribution.