aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJuergen Kahrs <Juergen.Kahrs@googlemail.com>2013-02-12 09:41:29 +0100
committerJuergen Kahrs <Juergen.Kahrs@googlemail.com>2013-02-12 09:41:29 +0100
commitd8d656a2929d9fd54d9263634c803b92dab568c3 (patch)
tree4bca99b303c048554ae8fbb4247fb256464b4611
parent2f8d4e37f5dffe7f5b8d28a21d785b37d6e09e0f (diff)
parent038e70b403210a1ad298666b61369e03fb6d6ca6 (diff)
downloadegawk-d8d656a2929d9fd54d9263634c803b92dab568c3.tar.gz
egawk-d8d656a2929d9fd54d9263634c803b92dab568c3.tar.bz2
egawk-d8d656a2929d9fd54d9263634c803b92dab568c3.zip
Merge remote-tracking branch 'origin/master' into cmake
-rw-r--r--doc/ChangeLog4
-rw-r--r--doc/gawk.info271
-rw-r--r--doc/gawk.texi16
-rw-r--r--extension/ChangeLog13
-rw-r--r--extension/filefuncs.c31
-rw-r--r--extension/fnmatch.c9
-rw-r--r--extension/time.c12
-rw-r--r--missing_d/ChangeLog4
-rw-r--r--missing_d/fnmatch.c489
-rw-r--r--missing_d/fnmatch.h85
-rw-r--r--pc/ChangeLog14
-rw-r--r--pc/Makefile8
-rw-r--r--pc/config.sed4
-rw-r--r--pc/dlfcn.h12
-rw-r--r--pc/gawkmisc.pc86
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__