diff options
-rw-r--r-- | doc/ChangeLog | 4 | ||||
-rw-r--r-- | doc/gawk.info | 271 | ||||
-rw-r--r-- | doc/gawk.texi | 16 | ||||
-rw-r--r-- | extension/ChangeLog | 13 | ||||
-rw-r--r-- | extension/filefuncs.c | 31 | ||||
-rw-r--r-- | extension/fnmatch.c | 9 | ||||
-rw-r--r-- | extension/time.c | 12 | ||||
-rw-r--r-- | missing_d/ChangeLog | 4 | ||||
-rw-r--r-- | missing_d/fnmatch.c | 489 | ||||
-rw-r--r-- | missing_d/fnmatch.h | 85 | ||||
-rw-r--r-- | pc/ChangeLog | 14 | ||||
-rw-r--r-- | pc/Makefile | 8 | ||||
-rw-r--r-- | pc/config.sed | 4 | ||||
-rw-r--r-- | pc/dlfcn.h | 12 | ||||
-rw-r--r-- | pc/gawkmisc.pc | 86 |
15 files changed, 908 insertions, 150 deletions
diff --git a/doc/ChangeLog b/doc/ChangeLog index 37922b15..6a8214b0 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,3 +1,7 @@ +2013-02-08 Arnold D. Robbins <arnold@skeeve.com> + + * gawk.texi: Restore centering of text images. + 2013-02-07 Arnold D. Robbins <arnold@skeeve.com> * gawk.texi (Other Versions): Remove the description of xmlgawk. diff --git a/doc/gawk.info b/doc/gawk.info index 26720503..f5358d8d 100644 --- a/doc/gawk.info +++ b/doc/gawk.info @@ -21484,7 +21484,6 @@ fields are function pointers. This is shown in *note load-extension::. +-------+-+---+-+---+-+------------------+--------------------+ gawk Main Program Address Space Extension - Figure 16.1: Loading The Extension The extension can call functions inside `gawk' through these @@ -21505,7 +21504,6 @@ load-new-function::. +-------+-+---+-+---+-+------------------+--------------+-+---+ gawk Main Program Address Space Extension - Figure 16.2: Loading The New Function In the other direction, the extension registers its new functions @@ -21527,7 +21525,6 @@ calling convention. This is shown in *note call-new-function::. +-------+-+---+-+---+-+------------------+--------------+-+---+ gawk Main Program Address Space Extension - Figure 16.3: Calling The New Function The `do_XXX()' function, in turn, then uses the function pointers in @@ -27152,7 +27149,6 @@ data and produce results. See *note figure-general-flow::. +------+ / \ +---------+ | Data | -----> < Program > -----> | Results | +------+ \_______/ +---------+ - Figure D.1: General Program Flow The "program" in the figure can be either a compiled program(1) @@ -27174,7 +27170,6 @@ basic set of steps, as shown in *note figure-process-flow::: | +---------+ +-----+ Process | +---------+ - Figure D.2: Basic Program Steps Initialization @@ -29466,7 +29461,7 @@ Index * Aho, Alfred: History. (line 17) * alarm clock example program: Alarm Program. (line 9) * alarm.awk program: Alarm Program. (line 29) -* algorithms: Basic High Level. (line 70) +* algorithms: Basic High Level. (line 68) * Alpha (DEC): Manual History. (line 28) * amazing awk assembler (aaa): Glossary. (line 12) * amazingly workable formatter (awf): Glossary. (line 25) @@ -29871,7 +29866,7 @@ Index (line 60) * compatibility mode (gawk), specifying: Options. (line 95) * compiled programs <1>: Glossary. (line 165) -* compiled programs: Basic High Level. (line 16) +* compiled programs: Basic High Level. (line 15) * compiling gawk for Cygwin: Cygwin. (line 6) * compiling gawk for MS-DOS and MS-Windows: PC Compiling. (line 13) * compiling gawk for VMS: VMS Compilation. (line 6) @@ -29971,7 +29966,7 @@ Index * dark corner, strings, storing: Records. (line 196) * dark corner, value of ARGV[0]: Auto-set. (line 35) * data, fixed-width: Constant Size. (line 9) -* data-driven languages: Basic High Level. (line 87) +* data-driven languages: Basic High Level. (line 85) * database, group, reading: Group Functions. (line 6) * database, users, reading: Passwd Functions. (line 6) * date utility, GNU: Time Functions. (line 17) @@ -30343,7 +30338,7 @@ Index * field separators, regular expressions as: Field Separators. (line 50) * field separators, See Also OFS: Changing Fields. (line 64) * field separators, spaces as: Cut Program. (line 109) -* fields <1>: Basic High Level. (line 75) +* fields <1>: Basic High Level. (line 73) * fields <2>: Fields. (line 6) * fields: Reading Files. (line 14) * fields, adding: Changing Fields. (line 53) @@ -30799,7 +30794,7 @@ Index (line 6) * internationalizing a program: Explaining gettext. (line 6) * interpreted programs <1>: Glossary. (line 365) -* interpreted programs: Basic High Level. (line 16) +* interpreted programs: Basic High Level. (line 15) * interval expressions: Regexp Operators. (line 116) * inventory-shipped file: Sample Data Files. (line 32) * isarray() function (gawk): Type Functions. (line 11) @@ -30834,7 +30829,7 @@ Index * l debugger command (alias for list): Miscellaneous Debugger Commands. (line 74) * labels.awk program: Labels Program. (line 51) -* languages, data-driven: Basic High Level. (line 87) +* languages, data-driven: Basic High Level. (line 85) * Laurie, Dirk: Changing Precision. (line 6) * LC_ALL locale category: Explaining gettext. (line 120) * LC_COLLATE locale category: Explaining gettext. (line 93) @@ -31321,7 +31316,7 @@ Index * programming languages, data-driven vs. procedural: Getting Started. (line 12) * Programming languages, Java: Glossary. (line 388) -* programming, basic steps: Basic High Level. (line 21) +* programming, basic steps: Basic High Level. (line 20) * programming, concepts: Basic Concepts. (line 6) * pwcat program: Passwd Functions. (line 23) * q debugger command (alias for quit): Miscellaneous Debugger Commands. @@ -31363,7 +31358,7 @@ Index * record separators, changing: Records. (line 81) * record separators, regular expressions as: Records. (line 117) * record separators, with multiline records: Multiple Line. (line 10) -* records <1>: Basic High Level. (line 75) +* records <1>: Basic High Level. (line 73) * records: Reading Files. (line 14) * records, multiline: Multiple Line. (line 6) * records, printing: Print. (line 22) @@ -32299,130 +32294,130 @@ Node: Extension Intro864826 Node: Plugin License866034 Node: Extension Mechanism Outline866719 Ref: load-extension867136 -Ref: load-new-function868615 -Ref: call-new-function869611 -Node: Extension API Description871620 -Node: Extension API Functions Introduction872959 -Node: General Data Types877737 -Ref: General Data Types-Footnote-1883339 -Node: Requesting Values883638 -Ref: table-value-types-returned884369 -Node: Constructor Functions885323 -Node: Registration Functions888319 -Node: Extension Functions889004 -Node: Exit Callback Functions891178 -Node: Extension Version String892421 -Node: Input Parsers893071 -Node: Output Wrappers902788 -Node: Two-way processors907204 -Node: Printing Messages909334 -Ref: Printing Messages-Footnote-1910411 -Node: Updating `ERRNO'910563 -Node: Accessing Parameters911302 -Node: Symbol Table Access912532 -Node: Symbol table by name913044 -Node: Symbol table by cookie914617 -Ref: Symbol table by cookie-Footnote-1918746 -Node: Cached values918809 -Ref: Cached values-Footnote-1922252 -Node: Array Manipulation922343 -Ref: Array Manipulation-Footnote-1923441 -Node: Array Data Types923480 -Ref: Array Data Types-Footnote-1926183 -Node: Array Functions926275 -Node: Flattening Arrays930041 -Node: Creating Arrays936880 -Node: Extension API Variables941675 -Node: Extension Versioning942311 -Node: Extension API Informational Variables944212 -Node: Extension API Boilerplate945298 -Node: Finding Extensions949129 -Node: Extension Example949676 -Node: Internal File Description950414 -Node: Internal File Ops954102 -Ref: Internal File Ops-Footnote-1965549 -Node: Using Internal File Ops965689 -Ref: Using Internal File Ops-Footnote-1968042 -Node: Extension Samples968308 -Node: Extension Sample File Functions969832 -Node: Extension Sample Fnmatch978305 -Node: Extension Sample Fork980031 -Node: Extension Sample Inplace981249 -Node: Extension Sample Ord983041 -Node: Extension Sample Readdir983820 -Node: Extension Sample Revout985324 -Node: Extension Sample Rev2way985917 -Node: Extension Sample Read write array986607 -Node: Extension Sample Readfile988490 -Node: Extension Sample API Tests989247 -Node: Extension Sample Time989772 -Node: gawkextlib991079 -Node: Language History993460 -Node: V7/SVR3.1994982 -Node: SVR4997303 -Node: POSIX998745 -Node: BTL999753 -Node: POSIX/GNU1000558 -Node: Common Extensions1006093 -Node: Ranges and Locales1007200 -Ref: Ranges and Locales-Footnote-11011818 -Ref: Ranges and Locales-Footnote-21011845 -Ref: Ranges and Locales-Footnote-31012105 -Node: Contributors1012326 -Node: Installation1016622 -Node: Gawk Distribution1017516 -Node: Getting1018000 -Node: Extracting1018826 -Node: Distribution contents1020518 -Node: Unix Installation1025779 -Node: Quick Installation1026396 -Node: Additional Configuration Options1028358 -Node: Configuration Philosophy1029835 -Node: Non-Unix Installation1032177 -Node: PC Installation1032635 -Node: PC Binary Installation1033934 -Node: PC Compiling1035782 -Node: PC Testing1038726 -Node: PC Using1039902 -Node: Cygwin1044087 -Node: MSYS1045087 -Node: VMS Installation1045601 -Node: VMS Compilation1046204 -Ref: VMS Compilation-Footnote-11047211 -Node: VMS Installation Details1047269 -Node: VMS Running1048904 -Node: VMS Old Gawk1050511 -Node: Bugs1050985 -Node: Other Versions1054837 -Node: Notes1060167 -Node: Compatibility Mode1060967 -Node: Additions1061750 -Node: Accessing The Source1062677 -Node: Adding Code1064280 -Node: New Ports1070322 -Node: Derived Files1074457 -Ref: Derived Files-Footnote-11079778 -Ref: Derived Files-Footnote-21079812 -Ref: Derived Files-Footnote-31080412 -Node: Future Extensions1080510 -Node: Implementation Limitations1081091 -Node: Extension Design1082343 -Node: Old Extension Problems1083492 -Ref: Old Extension Problems-Footnote-11085000 -Node: Extension New Mechanism Goals1085057 -Ref: Extension New Mechanism Goals-Footnote-11088416 -Node: Extension Other Design Decisions1088602 -Node: Extension Future Growth1090708 -Node: Old Extension Mechansim1091529 -Node: Basic Concepts1093286 -Node: Basic High Level1093967 -Ref: figure-general-flow1094238 -Ref: figure-process-flow1094838 -Ref: Basic High Level-Footnote-11098068 -Node: Basic Data Typing1098253 -Node: Glossary1101608 -Node: Copying1126919 -Node: GNU Free Documentation License1164476 -Node: Index1189613 +Ref: load-new-function868614 +Ref: call-new-function869609 +Node: Extension API Description871617 +Node: Extension API Functions Introduction872956 +Node: General Data Types877734 +Ref: General Data Types-Footnote-1883336 +Node: Requesting Values883635 +Ref: table-value-types-returned884366 +Node: Constructor Functions885320 +Node: Registration Functions888316 +Node: Extension Functions889001 +Node: Exit Callback Functions891175 +Node: Extension Version String892418 +Node: Input Parsers893068 +Node: Output Wrappers902785 +Node: Two-way processors907201 +Node: Printing Messages909331 +Ref: Printing Messages-Footnote-1910408 +Node: Updating `ERRNO'910560 +Node: Accessing Parameters911299 +Node: Symbol Table Access912529 +Node: Symbol table by name913041 +Node: Symbol table by cookie914614 +Ref: Symbol table by cookie-Footnote-1918743 +Node: Cached values918806 +Ref: Cached values-Footnote-1922249 +Node: Array Manipulation922340 +Ref: Array Manipulation-Footnote-1923438 +Node: Array Data Types923477 +Ref: Array Data Types-Footnote-1926180 +Node: Array Functions926272 +Node: Flattening Arrays930038 +Node: Creating Arrays936877 +Node: Extension API Variables941672 +Node: Extension Versioning942308 +Node: Extension API Informational Variables944209 +Node: Extension API Boilerplate945295 +Node: Finding Extensions949126 +Node: Extension Example949673 +Node: Internal File Description950411 +Node: Internal File Ops954099 +Ref: Internal File Ops-Footnote-1965546 +Node: Using Internal File Ops965686 +Ref: Using Internal File Ops-Footnote-1968039 +Node: Extension Samples968305 +Node: Extension Sample File Functions969829 +Node: Extension Sample Fnmatch978302 +Node: Extension Sample Fork980028 +Node: Extension Sample Inplace981246 +Node: Extension Sample Ord983038 +Node: Extension Sample Readdir983817 +Node: Extension Sample Revout985321 +Node: Extension Sample Rev2way985914 +Node: Extension Sample Read write array986604 +Node: Extension Sample Readfile988487 +Node: Extension Sample API Tests989244 +Node: Extension Sample Time989769 +Node: gawkextlib991076 +Node: Language History993457 +Node: V7/SVR3.1994979 +Node: SVR4997300 +Node: POSIX998742 +Node: BTL999750 +Node: POSIX/GNU1000555 +Node: Common Extensions1006090 +Node: Ranges and Locales1007197 +Ref: Ranges and Locales-Footnote-11011815 +Ref: Ranges and Locales-Footnote-21011842 +Ref: Ranges and Locales-Footnote-31012102 +Node: Contributors1012323 +Node: Installation1016619 +Node: Gawk Distribution1017513 +Node: Getting1017997 +Node: Extracting1018823 +Node: Distribution contents1020515 +Node: Unix Installation1025776 +Node: Quick Installation1026393 +Node: Additional Configuration Options1028355 +Node: Configuration Philosophy1029832 +Node: Non-Unix Installation1032174 +Node: PC Installation1032632 +Node: PC Binary Installation1033931 +Node: PC Compiling1035779 +Node: PC Testing1038723 +Node: PC Using1039899 +Node: Cygwin1044084 +Node: MSYS1045084 +Node: VMS Installation1045598 +Node: VMS Compilation1046201 +Ref: VMS Compilation-Footnote-11047208 +Node: VMS Installation Details1047266 +Node: VMS Running1048901 +Node: VMS Old Gawk1050508 +Node: Bugs1050982 +Node: Other Versions1054834 +Node: Notes1060164 +Node: Compatibility Mode1060964 +Node: Additions1061747 +Node: Accessing The Source1062674 +Node: Adding Code1064277 +Node: New Ports1070319 +Node: Derived Files1074454 +Ref: Derived Files-Footnote-11079775 +Ref: Derived Files-Footnote-21079809 +Ref: Derived Files-Footnote-31080409 +Node: Future Extensions1080507 +Node: Implementation Limitations1081088 +Node: Extension Design1082340 +Node: Old Extension Problems1083489 +Ref: Old Extension Problems-Footnote-11084997 +Node: Extension New Mechanism Goals1085054 +Ref: Extension New Mechanism Goals-Footnote-11088413 +Node: Extension Other Design Decisions1088599 +Node: Extension Future Growth1090705 +Node: Old Extension Mechansim1091526 +Node: Basic Concepts1093283 +Node: Basic High Level1093964 +Ref: figure-general-flow1094235 +Ref: figure-process-flow1094834 +Ref: Basic High Level-Footnote-11098063 +Node: Basic Data Typing1098248 +Node: Glossary1101603 +Node: Copying1126914 +Node: GNU Free Documentation License1164471 +Node: Index1189608 End Tag Table diff --git a/doc/gawk.texi b/doc/gawk.texi index 169f8a22..307f21b5 100644 --- a/doc/gawk.texi +++ b/doc/gawk.texi @@ -28354,11 +28354,11 @@ This is shown in @ref{load-extension}. @float Figure,load-extension @caption{Loading The Extension} -@c FIXME: One day, makeinfo should correctly center the text file -@c as a block. At that time it should be enough to use the line -@c in the ifnotinfo block. This applies to the other figures as well. +@c FIXME: One day, it should not be necessary to have two cases, +@c but rather just the one without the "txt" final argument. +@c This applies to the other figures as well. @ifinfo -@image{api-figure1, , , Loading the extension, txt} +@center @image{api-figure1, , , Loading the extension, txt} @end ifinfo @ifnotinfo @center @image{api-figure1, , , Loading the extension} @@ -28374,7 +28374,7 @@ This is shown in @ref{load-new-function}. @float Figure,load-new-function @caption{Loading The New Function} @ifinfo -@image{api-figure2, , , Loading the new function, txt} +@center @image{api-figure2, , , Loading the new function, txt} @end ifinfo @ifnotinfo @center @image{api-figure2, , , Loading the new function} @@ -28391,7 +28391,7 @@ This is shown in @ref{call-new-function}. @float Figure,call-new-function @caption{Calling The New Function} @ifinfo -@image{api-figure3, , , Calling the new function, txt} +@center @image{api-figure3, , , Calling the new function, txt} @end ifinfo @ifnotinfo @center @image{api-figure3, , , Calling the new function} @@ -35109,7 +35109,7 @@ some input data and produce results. See @ref{figure-general-flow}. @float Figure,figure-general-flow @caption{General Program Flow} @ifinfo -@image{general-program, , , General program flow, txt} +@center @image{general-program, , , General program flow, txt} @end ifinfo @ifnotinfo @center @image{general-program, , , General program flow} @@ -35136,7 +35136,7 @@ in @ref{figure-process-flow}: @float Figure,figure-process-flow @caption{Basic Program Steps} @ifinfo -@image{process-flow, , , Basic Program Stages, txt} +@center @image{process-flow, , , Basic Program Stages, txt} @end ifinfo @ifnotinfo @center @image{process-flow, , , Basic Program Stages} diff --git a/extension/ChangeLog b/extension/ChangeLog index 231961f1..291b564d 100644 --- a/extension/ChangeLog +++ b/extension/ChangeLog @@ -1,3 +1,16 @@ +2013-02-11 Arnold D. Robbins <arnold@skeeve.com> + + * fnmatch.c: Pull in versions of C routine from missing_d + if the native system doesn't provide them. + +2013-02-11 Eli Zaretskii <eliz@gnu.org> + + * filefuncs.c (S_ISLNK, lstat, readlink, S_IRGRP, S_IWGRP, S_IXGRP, + S_IROTH, S_IWOTH, S_IXOTH, S_ISUID, S_ISGID, S_ISVTX, major, minor): + Define if needed. + (fill_stat_array, init_filefuncs, func_table): Fix for Win 32. + * time.c: Port to Win 32. + 2013-01-27 Arnold D. Robbins <arnold@skeeve.com> * gawkdirfd.h: New file. diff --git a/extension/filefuncs.c b/extension/filefuncs.c index 123aad3c..a4ae7560 100644 --- a/extension/filefuncs.c +++ b/extension/filefuncs.c @@ -55,6 +55,26 @@ #include "gawkfts.h" #include "stack.h" +#ifndef S_IFLNK +#define lstat stat +#define S_ISLNK(s) 0 +#define readlink(f,b,bs) (-1) +#endif + +#ifdef _WIN32 +#define S_IRGRP S_IRUSR +#define S_IWGRP S_IWUSR +#define S_IXGRP S_IXUSR +#define S_IROTH S_IRUSR +#define S_IWOTH S_IWUSR +#define S_IXOTH S_IXUSR +#define S_ISUID 0 +#define S_ISGID 0 +#define S_ISVTX 0 +#define major(s) (s) +#define minor(s) (0) +#endif + static const gawk_api_t *api; /* for convenience macros to work */ static awk_ext_id_t *ext_id; static awk_bool_t init_filefuncs(void); @@ -288,7 +308,11 @@ fill_stat_array(const char *name, awk_array_t array, struct stat *sbuf) array_set_numeric(array, "uid", sbuf->st_uid); array_set_numeric(array, "gid", sbuf->st_gid); array_set_numeric(array, "size", sbuf->st_size); +#ifdef _WIN32 + array_set_numeric(array, "blocks", sbuf->st_size / 4096); +#else array_set_numeric(array, "blocks", sbuf->st_blocks); +#endif array_set_numeric(array, "atime", sbuf->st_atime); array_set_numeric(array, "mtime", sbuf->st_mtime); array_set_numeric(array, "ctime", sbuf->st_ctime); @@ -391,6 +415,7 @@ init_filefuncs(void) int i; awk_value_t value; +#ifndef _WIN32 /* at least right now, only FTS needs initializing */ static struct flagtab { const char *name; @@ -414,9 +439,12 @@ init_filefuncs(void) errors++; } } +#endif return errors == 0; } +#ifndef _WIN32 + static int fts_errors = 0; /* fill_stat_element --- fill in stat element of array */ @@ -719,11 +747,14 @@ out: return make_number(ret, result); } +#endif /* !_WIN32 */ static awk_ext_func_t func_table[] = { { "chdir", do_chdir, 1 }, { "stat", do_stat, 2 }, +#ifndef _WIN32 { "fts", do_fts, 3 }, +#endif }; diff --git a/extension/fnmatch.c b/extension/fnmatch.c index c63fe136..7f8ab8d7 100644 --- a/extension/fnmatch.c +++ b/extension/fnmatch.c @@ -45,9 +45,16 @@ #define _(msgid) gettext(msgid) #define N_(msgid) msgid -#ifdef HAVE_FNMATCH_H #define _GNU_SOURCE 1 /* use GNU extensions if they're there */ +#ifdef HAVE_FNMATCH_H #include <fnmatch.h> +#else +#include "../missing_d/fnmatch.h" /* version that comes with gawk */ +#endif + +#ifndef HAVE_FNMATCH +#include "../missing_d/fnmatch.c" /* ditto */ +#define HAVE_FNMATCH #endif /* Provide GNU extensions as no-ops if not defined */ diff --git a/extension/time.c b/extension/time.c index 89811c41..dcafb8fa 100644 --- a/extension/time.c +++ b/extension/time.c @@ -61,6 +61,9 @@ int plugin_is_GPL_compatible; #if defined(HAVE_NANOSLEEP) && defined(HAVE_TIME_H) #include <time.h> #endif +#if defined(HAVE_GETSYSTEMTIMEASFILETIME) +#include <windows.h> +#endif /* * Returns time since 1/1/1970 UTC as a floating point value; should @@ -160,10 +163,17 @@ do_sleep(int nargs, awk_value_t *result) /* probably interrupted */ update_ERRNO_int(errno); } +#elif defined(HAVE_GETSYSTEMTIMEASFILETIME) + { + DWORD milliseconds = secs * 1000; + + Sleep (milliseconds); + rc = 0; + } #else /* no way to sleep on this platform */ rc = -1; - update_ERRNO_str(_("sleep: not supported on this platform")); + update_ERRNO_string(_("sleep: not supported on this platform")); #endif return make_number(rc, result); diff --git a/missing_d/ChangeLog b/missing_d/ChangeLog index 54825c8d..afa66d70 100644 --- a/missing_d/ChangeLog +++ b/missing_d/ChangeLog @@ -1,3 +1,7 @@ +2013-02-11 Arnold D. Robbins <arnold@skeeve.com> + + * fnmatch.h, fnmatch.c: New files, from GNU Make. + 2012-12-24 Arnold D. Robbins <arnold@skeeve.com> * 4.0.2: Release tar ball made. diff --git a/missing_d/fnmatch.c b/missing_d/fnmatch.c new file mode 100644 index 00000000..4da8c5fb --- /dev/null +++ b/missing_d/fnmatch.c @@ -0,0 +1,489 @@ +/* Copyright (C) 1991, 1992, 1993, 1996, 1997, 1998, 1999 Free Software +Foundation, Inc. +This file is part of the GNU C Library. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +This library 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public License +along with this library; see the file COPYING.LIB. If not, write to the Free +Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 +USA. */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +/* Enable GNU extensions in fnmatch.h. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#include <errno.h> +#include <fnmatch.h> +#include <ctype.h> + +#if HAVE_STRING_H || defined _LIBC +# include <string.h> +#else +# include <strings.h> +#endif + +#if defined STDC_HEADERS || defined _LIBC +# include <stdlib.h> +#endif + +/* For platform which support the ISO C amendement 1 functionality we + support user defined character classes. */ +#if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H) +/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>. */ +# include <wchar.h> +# include <wctype.h> +#endif + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. This code is part of the GNU C + Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object files, + it is simpler to just do this in the source for each such file. */ + +#if defined _LIBC || !defined __GNU_LIBRARY__ + + +# if defined STDC_HEADERS || !defined isascii +# define ISASCII(c) 1 +# else +# define ISASCII(c) isascii(c) +# endif + +# ifdef isblank +# define ISBLANK(c) (ISASCII (c) && isblank (c)) +# else +# define ISBLANK(c) ((c) == ' ' || (c) == '\t') +# endif +# ifdef isgraph +# define ISGRAPH(c) (ISASCII (c) && isgraph (c)) +# else +# define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c)) +# endif + +# define ISPRINT(c) (ISASCII (c) && isprint (c)) +# define ISDIGIT(c) (ISASCII (c) && isdigit (c)) +# define ISALNUM(c) (ISASCII (c) && isalnum (c)) +# define ISALPHA(c) (ISASCII (c) && isalpha (c)) +# define ISCNTRL(c) (ISASCII (c) && iscntrl (c)) +# define ISLOWER(c) (ISASCII (c) && islower (c)) +# define ISPUNCT(c) (ISASCII (c) && ispunct (c)) +# define ISSPACE(c) (ISASCII (c) && isspace (c)) +# define ISUPPER(c) (ISASCII (c) && isupper (c)) +# define ISXDIGIT(c) (ISASCII (c) && isxdigit (c)) + +# define STREQ(s1, s2) ((strcmp (s1, s2) == 0)) + +# if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H) +/* The GNU C library provides support for user-defined character classes + and the functions from ISO C amendement 1. */ +# ifdef CHARCLASS_NAME_MAX +# define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX +# else +/* This shouldn't happen but some implementation might still have this + problem. Use a reasonable default value. */ +# define CHAR_CLASS_MAX_LENGTH 256 +# endif + +# ifdef _LIBC +# define IS_CHAR_CLASS(string) __wctype (string) +# else +# define IS_CHAR_CLASS(string) wctype (string) +# endif +# else +# define CHAR_CLASS_MAX_LENGTH 6 /* Namely, `xdigit'. */ + +# define IS_CHAR_CLASS(string) \ + (STREQ (string, "alpha") || STREQ (string, "upper") \ + || STREQ (string, "lower") || STREQ (string, "digit") \ + || STREQ (string, "alnum") || STREQ (string, "xdigit") \ + || STREQ (string, "space") || STREQ (string, "print") \ + || STREQ (string, "punct") || STREQ (string, "graph") \ + || STREQ (string, "cntrl") || STREQ (string, "blank")) +# endif + +/* Avoid depending on library functions or files + whose names are inconsistent. */ + +# if !defined _LIBC && !defined getenv +extern char *getenv (); +# endif + +# ifndef errno +extern int errno; +# endif + +/* This function doesn't exist on most systems. */ + +# if !defined HAVE___STRCHRNUL && !defined _LIBC +static char * +__strchrnul (s, c) + const char *s; + int c; +{ + char *result = strchr (s, c); + if (result == NULL) + result = strchr (s, '\0'); + return result; +} +# endif + +# ifndef internal_function +/* Inside GNU libc we mark some function in a special way. In other + environments simply ignore the marking. */ +# define internal_function +# endif + +/* Match STRING against the filename pattern PATTERN, returning zero if + it matches, nonzero if not. */ +static int internal_fnmatch __P ((const char *pattern, const char *string, + int no_leading_period, int flags)) + internal_function; +static int +internal_function +internal_fnmatch (pattern, string, no_leading_period, flags) + const char *pattern; + const char *string; + int no_leading_period; + int flags; +{ + register const char *p = pattern, *n = string; + register unsigned char c; + +/* Note that this evaluates C many times. */ +# ifdef _LIBC +# define FOLD(c) ((flags & FNM_CASEFOLD) ? tolower (c) : (c)) +# else +# define FOLD(c) ((flags & FNM_CASEFOLD) && ISUPPER (c) ? tolower (c) : (c)) +# endif + + while ((c = *p++) != '\0') + { + c = FOLD (c); + + switch (c) + { + case '?': + if (*n == '\0') + return FNM_NOMATCH; + else if (*n == '/' && (flags & FNM_FILE_NAME)) + return FNM_NOMATCH; + else if (*n == '.' && no_leading_period + && (n == string + || (n[-1] == '/' && (flags & FNM_FILE_NAME)))) + return FNM_NOMATCH; + break; + + case '\\': + if (!(flags & FNM_NOESCAPE)) + { + c = *p++; + if (c == '\0') + /* Trailing \ loses. */ + return FNM_NOMATCH; + c = FOLD (c); + } + if (FOLD ((unsigned char) *n) != c) + return FNM_NOMATCH; + break; + + case '*': + if (*n == '.' && no_leading_period + && (n == string + || (n[-1] == '/' && (flags & FNM_FILE_NAME)))) + return FNM_NOMATCH; + + for (c = *p++; c == '?' || c == '*'; c = *p++) + { + if (*n == '/' && (flags & FNM_FILE_NAME)) + /* A slash does not match a wildcard under FNM_FILE_NAME. */ + return FNM_NOMATCH; + else if (c == '?') + { + /* A ? needs to match one character. */ + if (*n == '\0') + /* There isn't another character; no match. */ + return FNM_NOMATCH; + else + /* One character of the string is consumed in matching + this ? wildcard, so *??? won't match if there are + less than three characters. */ + ++n; + } + } + + if (c == '\0') + /* The wildcard(s) is/are the last element of the pattern. + If the name is a file name and contains another slash + this does mean it cannot match. */ + return ((flags & FNM_FILE_NAME) && strchr (n, '/') != NULL + ? FNM_NOMATCH : 0); + else + { + const char *endp; + + endp = __strchrnul (n, (flags & FNM_FILE_NAME) ? '/' : '\0'); + + if (c == '[') + { + int flags2 = ((flags & FNM_FILE_NAME) + ? flags : (flags & ~FNM_PERIOD)); + + for (--p; n < endp; ++n) + if (internal_fnmatch (p, n, + (no_leading_period + && (n == string + || (n[-1] == '/' + && (flags + & FNM_FILE_NAME)))), + flags2) + == 0) + return 0; + } + else if (c == '/' && (flags & FNM_FILE_NAME)) + { + while (*n != '\0' && *n != '/') + ++n; + if (*n == '/' + && (internal_fnmatch (p, n + 1, flags & FNM_PERIOD, + flags) == 0)) + return 0; + } + else + { + int flags2 = ((flags & FNM_FILE_NAME) + ? flags : (flags & ~FNM_PERIOD)); + + if (c == '\\' && !(flags & FNM_NOESCAPE)) + c = *p; + c = FOLD (c); + for (--p; n < endp; ++n) + if (FOLD ((unsigned char) *n) == c + && (internal_fnmatch (p, n, + (no_leading_period + && (n == string + || (n[-1] == '/' + && (flags + & FNM_FILE_NAME)))), + flags2) == 0)) + return 0; + } + } + + /* If we come here no match is possible with the wildcard. */ + return FNM_NOMATCH; + + case '[': + { + /* Nonzero if the sense of the character class is inverted. */ + static int posixly_correct; + register int not; + char cold; + + if (posixly_correct == 0) + posixly_correct = getenv ("POSIXLY_CORRECT") != NULL ? 1 : -1; + + if (*n == '\0') + return FNM_NOMATCH; + + if (*n == '.' && no_leading_period && (n == string + || (n[-1] == '/' + && (flags + & FNM_FILE_NAME)))) + return FNM_NOMATCH; + + if (*n == '/' && (flags & FNM_FILE_NAME)) + /* `/' cannot be matched. */ + return FNM_NOMATCH; + + not = (*p == '!' || (posixly_correct < 0 && *p == '^')); + if (not) + ++p; + + c = *p++; + for (;;) + { + unsigned char fn = FOLD ((unsigned char) *n); + + if (!(flags & FNM_NOESCAPE) && c == '\\') + { + if (*p == '\0') + return FNM_NOMATCH; + c = FOLD ((unsigned char) *p); + ++p; + + if (c == fn) + goto matched; + } + else if (c == '[' && *p == ':') + { + /* Leave room for the null. */ + char str[CHAR_CLASS_MAX_LENGTH + 1]; + size_t c1 = 0; +# if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H) + wctype_t wt; +# endif + const char *startp = p; + + for (;;) + { + if (c1 == CHAR_CLASS_MAX_LENGTH) + /* The name is too long and therefore the pattern + is ill-formed. */ + return FNM_NOMATCH; + + c = *++p; + if (c == ':' && p[1] == ']') + { + p += 2; + break; + } + if (c < 'a' || c >= 'z') + { + /* This cannot possibly be a character class name. + Match it as a normal range. */ + p = startp; + c = '['; + goto normal_bracket; + } + str[c1++] = c; + } + str[c1] = '\0'; + +# if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H) + wt = IS_CHAR_CLASS (str); + if (wt == 0) + /* Invalid character class name. */ + return FNM_NOMATCH; + + if (__iswctype (__btowc ((unsigned char) *n), wt)) + goto matched; +# else + if ((STREQ (str, "alnum") && ISALNUM ((unsigned char) *n)) + || (STREQ (str, "alpha") && ISALPHA ((unsigned char) *n)) + || (STREQ (str, "blank") && ISBLANK ((unsigned char) *n)) + || (STREQ (str, "cntrl") && ISCNTRL ((unsigned char) *n)) + || (STREQ (str, "digit") && ISDIGIT ((unsigned char) *n)) + || (STREQ (str, "graph") && ISGRAPH ((unsigned char) *n)) + || (STREQ (str, "lower") && ISLOWER ((unsigned char) *n)) + || (STREQ (str, "print") && ISPRINT ((unsigned char) *n)) + || (STREQ (str, "punct") && ISPUNCT ((unsigned char) *n)) + || (STREQ (str, "space") && ISSPACE ((unsigned char) *n)) + || (STREQ (str, "upper") && ISUPPER ((unsigned char) *n)) + || (STREQ (str, "xdigit") && ISXDIGIT ((unsigned char) *n))) + goto matched; +# endif + } + else if (c == '\0') + /* [ (unterminated) loses. */ + return FNM_NOMATCH; + else + { + normal_bracket: + if (FOLD (c) == fn) + goto matched; + + cold = c; + c = *p++; + + if (c == '-' && *p != ']') + { + /* It is a range. */ + unsigned char cend = *p++; + if (!(flags & FNM_NOESCAPE) && cend == '\\') + cend = *p++; + if (cend == '\0') + return FNM_NOMATCH; + + if (cold <= fn && fn <= FOLD (cend)) + goto matched; + + c = *p++; + } + } + + if (c == ']') + break; + } + + if (!not) + return FNM_NOMATCH; + break; + + matched: + /* Skip the rest of the [...] that already matched. */ + while (c != ']') + { + if (c == '\0') + /* [... (unterminated) loses. */ + return FNM_NOMATCH; + + c = *p++; + if (!(flags & FNM_NOESCAPE) && c == '\\') + { + if (*p == '\0') + return FNM_NOMATCH; + /* XXX 1003.2d11 is unclear if this is right. */ + ++p; + } + else if (c == '[' && *p == ':') + { + do + if (*++p == '\0') + return FNM_NOMATCH; + while (*p != ':' || p[1] == ']'); + p += 2; + c = *p; + } + } + if (not) + return FNM_NOMATCH; + } + break; + + default: + if (c != FOLD ((unsigned char) *n)) + return FNM_NOMATCH; + } + + ++n; + } + + if (*n == '\0') + return 0; + + if ((flags & FNM_LEADING_DIR) && *n == '/') + /* The FNM_LEADING_DIR flag says that "foo*" matches "foobar/frobozz". */ + return 0; + + return FNM_NOMATCH; + +# undef FOLD +} + + +int +fnmatch (pattern, string, flags) + const char *pattern; + const char *string; + int flags; +{ + return internal_fnmatch (pattern, string, flags & FNM_PERIOD, flags); +} + +#endif /* _LIBC or not __GNU_LIBRARY__. */ diff --git a/missing_d/fnmatch.h b/missing_d/fnmatch.h new file mode 100644 index 00000000..a788c8e1 --- /dev/null +++ b/missing_d/fnmatch.h @@ -0,0 +1,85 @@ +/* Copyright (C) 1991, 1992, 1993, 1996, 1997, 1998, 1999 Free Software +Foundation, Inc. +This file is part of the GNU C Library. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GNU C Library 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public License +along with this library; see the file COPYING.LIB. If not, write to the Free +Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 +USA. */ + +#ifndef _FNMATCH_H +#define _FNMATCH_H 1 + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined __cplusplus || (defined __STDC__ && __STDC__) || defined WINDOWS32 +# if !defined __GLIBC__ +# undef __P +# define __P(protos) protos +# endif +#else /* Not C++ or ANSI C. */ +# undef __P +# define __P(protos) () +/* We can get away without defining `const' here only because in this file + it is used only inside the prototype for `fnmatch', which is elided in + non-ANSI C where `const' is problematical. */ +#endif /* C++ or ANSI C. */ + +#ifndef const +# if (defined __STDC__ && __STDC__) || defined __cplusplus || defined WINDOWS32 +# define __const const +# else +# define __const +# endif +#endif + +/* We #undef these before defining them because some losing systems + (HP-UX A.08.07 for example) define these in <unistd.h>. */ +#undef FNM_PATHNAME +#undef FNM_NOESCAPE +#undef FNM_PERIOD + +/* Bits set in the FLAGS argument to `fnmatch'. */ +#define FNM_PATHNAME (1 << 0) /* No wildcard can ever match `/'. */ +#define FNM_NOESCAPE (1 << 1) /* Backslashes don't quote special chars. */ +#define FNM_PERIOD (1 << 2) /* Leading `.' is matched only explicitly. */ + +#if !defined _POSIX_C_SOURCE || _POSIX_C_SOURCE < 2 || defined _GNU_SOURCE +# define FNM_FILE_NAME FNM_PATHNAME /* Preferred GNU name. */ +# define FNM_LEADING_DIR (1 << 3) /* Ignore `/...' after a match. */ +# define FNM_CASEFOLD (1 << 4) /* Compare without regard to case. */ +#endif + +/* Value returned by `fnmatch' if STRING does not match PATTERN. */ +#define FNM_NOMATCH 1 + +/* This value is returned if the implementation does not support + `fnmatch'. Since this is not the case here it will never be + returned but the conformance test suites still require the symbol + to be defined. */ +#ifdef _XOPEN_SOURCE +# define FNM_NOSYS (-1) +#endif + +/* Match NAME against the filename pattern PATTERN, + returning zero if it matches, FNM_NOMATCH if not. */ +extern int fnmatch __P ((__const char *__pattern, __const char *__name, + int __flags)); + +#ifdef __cplusplus +} +#endif + +#endif /* fnmatch.h */ diff --git a/pc/ChangeLog b/pc/ChangeLog index 15ce56ec..e7378b5f 100644 --- a/pc/ChangeLog +++ b/pc/ChangeLog @@ -1,3 +1,17 @@ +2013-02-09 Eli Zaretskii <eliz@gnu.org> + + * gawkmisc.pc (dlopen, dlerror, dlclose, dlsym) [DYNAMIC]: New + functions for _WIN32 build. + + * dlfcn.h: New file. + + * Makefile (pkgextensiondir, DEFLIBPATH, SHLIBEXT): New variables. + (AWKOBJS4): New sub-list of object files; add gawkapi$O. + (ALLOBJS): Include AWKOBJS4. + (CFLAGS): Add -DDEFLIBPATH=$(DEFLIBPATH) -DSHLIBEXT=$(SHLIBEXT). + + * config.sed (DYNAMIC): Define for _WIN32 build. + 2013-02-07 Scott Deifik <scottd.mail@sbcglobal.net> * Makefile.tst: Sync with mainline. diff --git a/pc/Makefile b/pc/Makefile index 52354f34..71197c53 100644 --- a/pc/Makefile +++ b/pc/Makefile @@ -68,6 +68,9 @@ MAK = $(MAKE) $(MAKEFILE) #prefix = prefix = c:/gnu pkgdatadir = $(prefix)/lib/awk +pkgextensiondir = $(prefix)/lib/gawk +DEFLIBPATH = "\"$(pkgextensiondir)\"" +SHLIBEXT = "\"dll\"" # # Define the install method. Method 1 is Unix-like (and requires cat # and cp); method 2 uses gawk and batch files. @@ -183,13 +186,14 @@ BIND = EMPTY PBIND = EMPTY EMPTY= -CFLAGS = $(CF) -DGAWK -I. -DHAVE_CONFIG_H +CFLAGS = $(CF) -DGAWK -I. -DHAVE_CONFIG_H -DDEFLIBPATH=$(DEFLIBPATH) -DSHLIBEXT=$(SHLIBEXT) # object files AWKOBJS1 = array$O builtin$O eval$O field$O floatcomp$O gawkmisc$O io$O main$O AWKOBJS2 = ext$O msg$O node$O profile$O re$O replace$O version$O symbol$O AWKOBJS3 = debug$O cint_array$O int_array$O mpfr$O str_array$O command$O -AWKOBJS = $(AWKOBJS1) $(AWKOBJS2) $(AWKOBJS3) +AWKOBJS4 = gawkapi$O +AWKOBJS = $(AWKOBJS1) $(AWKOBJS2) $(AWKOBJS3) $(AWKOBJS4) ALLOBJS = $(AWKOBJS) awkgram$O getid$O $(OBJ) diff --git a/pc/config.sed b/pc/config.sed index 5e57e82b..6f76f43e 100644 --- a/pc/config.sed +++ b/pc/config.sed @@ -26,6 +26,10 @@ /configh\.in/a\ /* pc/config.h. Generated automatically by pc/config.sed. */ +/^#undef DYNAMIC$\c +#ifdef _WIN32\ +#define DYNAMIC 1\ +#endif s/^#undef GETPGRP_VOID *$/#define GETPGRP_VOID 1/ s/^#undef GETGROUPS_T *$/#define GETGROUPS_T gid_t/ /^#undef GETPGRP_VOID$/c\ diff --git a/pc/dlfcn.h b/pc/dlfcn.h new file mode 100644 index 00000000..64ef4bc5 --- /dev/null +++ b/pc/dlfcn.h @@ -0,0 +1,12 @@ +/* dlfcn.h replacement for MS-Windows build. */ +#ifndef DLFCN_H +#define DLFCN_H + +#define RTLD_LAZY 1 + +extern void *dlopen (const char *, int); +extern int dlclose (void *); +extern void *dlsym (void *, const char *); +extern char *dlerror (void); + +#endif /* DLFCN_H */ diff --git a/pc/gawkmisc.pc b/pc/gawkmisc.pc index e44191cd..5e412d71 100644 --- a/pc/gawkmisc.pc +++ b/pc/gawkmisc.pc @@ -609,6 +609,92 @@ int execvp(const char *file, const char *const *argv) return -1; } + +#ifdef DYNAMIC + +#include <dlfcn.h> + +static DWORD last_err; + +void * +dlopen (const char *file, int mode) +{ + char dllfn[MAX_PATH], *p; + HANDLE dllhandle; + + if (mode != RTLD_LAZY) + { + errno = EINVAL; + last_err = ERROR_INVALID_PARAMETER; + return NULL; + } + + /* MSDN says to be sure to use backslashes in the DLL file name. */ + strcpy (dllfn, file); + for (p = dllfn; *p; p++) + if (*p == '/') + *p = '\\'; + + dllhandle = LoadLibrary (dllfn); + if (!dllhandle) + last_err = GetLastError (); + + return dllhandle; +} + +char * +dlerror (void) +{ + static char errbuf[1024]; + DWORD ret; + + if (!last_err) + return NULL; + + ret = FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM + | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, last_err, 0, errbuf, sizeof (errbuf), NULL); + while (ret > 0 && (errbuf[ret - 1] == '\n' || errbuf[ret - 1] == '\r')) + --ret; + + errbuf[ret] = '\0'; + if (!ret) + sprintf (errbuf, "Error code %lu", last_err); + + last_err = 0; + return errbuf; +} + +int +dlclose (void *handle) +{ + if (!handle || handle == INVALID_HANDLE_VALUE) + return -1; + if (!FreeLibrary (handle)) + return -1; + + return 0; +} + +void * +dlsym (void *handle, const char *name) +{ + FARPROC addr = NULL; + + if (!handle || handle == INVALID_HANDLE_VALUE) + { + last_err = ERROR_INVALID_PARAMETER; + return NULL; + } + + addr = GetProcAddress (handle, name); + if (!addr) + last_err = GetLastError (); + + return (void *)addr; +} +#endif + #endif /* __MINGW32__ */ #ifdef __DJGPP__ |