To-do list for xgawk enhancements: - In gawkapi.c - review switch statements and use of default. - In extensions/configure.ac - add compiler warnings if GCC. Low priority: - Enhance extension/fork.c waitpid to allow the caller to specify the options. And add an optional array argument to wait and waitpid in which to return exit status information. Possible future changes requiring (further) discussion: - Change from dlopen to using the libltdl library (i.e. lt_dlopen). This may support more platforms. - Implement namespaces. Arnold suggested the following in an email: - Extend the definition of an 'identifier' to include "." as a valid character although an identifier can't start with it. - Extension libraries install functions and global variables with names that have a "." in them: XML.parse(), XML.name, whatever. - Awk code can read/write such variables and call such functions, but they cannot define such functions function XML.foo() { .. } # error or create a variable with such a name if it doesn't exist. This would be a run-time error, not a parse-time error. - This last rule may be too restrictive. I don't want to get into fancy rules a la perl and file-scope visibility etc, I'd like to keep things simple. But how we design this is going to be very important. Unlikely: - Include a sample rpm spec file in a new packaging subdirectory. - Patch lexer for @include and @load to make quotes optional. Done: - Add AWKLIBPATH with default pointing to ${libexecdir}/$PACKAGE/$VERSION - Change default shared library extension from ".so" to ".$shlibext" - Patch build infrastructure so that the current code in the extension subdirectory gets built and installed into the default $AWKLIBPATH location. - Implement @load - Patch ERRNO handling to create a simple API for use by extensions: extern void update_ERRNO_int(int) enum errno_translate { TRANSLATE, DONT_TRANSLATE }; extern void update_ERRNO_string(const char *string, enum errno_translate); extern void unset_ERRNO(void); - Add valgrind-noleak target. - Fix minor bug in fork extension, and add wait function. - Patch filefuncs extension to read symbolic links more robustly. - Add shared library tests. - Delete extension/xreadlink.[ch] - Add a -i (--include) option. - Enable default ".awk" search in io.c:find_source(). The simple change is to add this code inline in io.c: #ifndef DEFAULT_FILETYPE #define DEFAULT_FILETYPE ".awk" #endif - The -f flag should not eliminate duplicates. - Eliminate libtool from the top-level configure.ac. Create a separate configure.ac in the extensions subdirectory, and hide all the libtool stuff in there. - Running "make install" should install gawkapi.h in /usr/include. - Add time extension to the gawk distro. This defines sleep and gettimeofday. Renamed existing gettimeofday to getlocaltime. - Finish implementing new interface using gawkapi.h - api_get_curfunc_param not honoring requested type in node_to_awk_value - should api_sym_lookup also accept a type request? - must update the API do_lint value when changed by set_LINT - what is the proper return value for load_ext? It does not matter unless called by the "extension" function that nobody uses. - Hide private parts of IOBUF from extensions. - Fix extension/rwarray.c. - Fix lint complaints about shared library functions being called without having been defined. For example, try: gawk --lint -lordchr 'BEGIN {print chr(65)}' gawk: warning: function `chr' called but never defined A In ext.c, make_builtin needs to call awkgram.y:func_use. If done naively, I think this would result in complaints about shared library functions defined but not used. So there should probably be an enhancement to func_use and ftable to indicate if it's a shared library function. - Develop a libgawk shared library for use by extensions. Should this be hosted in a separate project? A few existing extensions use a hash API for mapping string handles to structures. In xgawk, we had this API inside array.c, but it probably belongs in a separate libgawk shared library: typedef struct _strhash strhash; extern strhash *strhash_create P((size_t min_table_size)); /* Find an entry in the hash table. If it is not found, the insert_if_missing argument indicates whether a new entry should be created. The caller may set the "data" field to any desired value. If it is a new entry, "data" will be initialized to NULL. */ extern strhash_entry *strhash_get P((strhash *, const char *s, size_t len, int insert_if_missing)); typedef void (*strhash_delete_func)(void *data, void *opaque, strhash *, strhash_entry *); extern int strhash_delete P((strhash *, const char *s, size_t len, strhash_delete_func, void *opaque)); extern void strhash_destroy P((strhash *, strhash_delete_func, void *opaque)); - Separate projects for major standalone extensions. We need to set up hosting for these projects: - XML - PostgreSQL - GD - MPFR. This is probably not useful now that MPFR support has been integrated into gawk. Are there any users who need this extension? - Review open hook implementation. * Mostly done. * Still to go: Rework iop_alloc, interaction with open hooks, and skipping command line directories. - Attempting to load the same file with -f and -i (or @include) should be a fatal error. - Consider adding a way to access gawk special vars read only.