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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
|
To-do list for xgawk enhancements:
- Finish implementing new interface using gawkapi.h
- Consider behavior when -i and -f include the same file. Currently,
-f always loads the code, regardless of whether it has already been loaded
using -i or -f. By contrast, -i will ignore the file if has already been
loaded with either -i or -f. Thus, if you say "gawk -f lib.awk -i lib.awk",
it will not be included the second time. But if you flip the order
and say "gawk -i lib.awk -f lib.awk", the file will be loaded twice.
Is this the most sensible behavior?
- Add time extension to the gawk distro. This defines sleep and gettimeofday.
Rename existing gettimeofday by adding some underscores. Awaiting
confirmation of copyright assignment from FSF...
- Running "make install" should install gawkapi.h in /usr/include.
- Decide how to transition from the old extension API to the new one.
When will the old approach be abandoned?
- 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. I think AC_CONFIG_SUBDIRS may do this. Should building
the extensions be optional (e.g. by adding a --without-extensions option
to the top-level configure)? If not, I do not understand what is
accomplished by using a separate configure script for the extensions...
- 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));
- Review open hook implementation. Arnold's comments on this:
I think the code flow in io.c needs reviewing. It's not
clear to me under what circumstances open hooks (a) are called, or
(b) should be called. Only the XML extension uses them now, but I
think it'd be a nice mechanism to generalize if possible, and to
document.
E.g., I can easily envision an open hook to turn directories into records
of the form
type link-count mode owner group atime mtime ctime name
I could also envision an open hook to provide an interface to libiconv
(somehow). More discussion / explanation of the vision behind this
would be welcome.
- Can the IOBUF internals be removed from gawkapi.h? I think this may be
possible if we revise the open hook implementation.
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?
Low priority:
- Fix extension/rwarray.c. It does not currently compile due to changes
in the NODE structure relating to array support. The MPFR changes will
also make this more complicated. John is best equipped to solve this
problem.
- 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.
- 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.
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.
|