[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[gawk-diffs] [SCM] gawk branch, feature/api-min-max, updated. gawk-4.1.0
From: |
Arnold Robbins |
Subject: |
[gawk-diffs] [SCM] gawk branch, feature/api-min-max, updated. gawk-4.1.0-2361-g0855ef4 |
Date: |
Wed, 14 Dec 2016 19:25:51 +0000 (UTC) |
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "gawk".
The branch, feature/api-min-max has been updated
via 0855ef4db6d8e0d1d57776eb273c9de321bfd6cf (commit)
from 539de0a854fb94fd6ba47e91cee55f22fcd851a3 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.sv.gnu.org/cgit/gawk.git/commit/?id=0855ef4db6d8e0d1d57776eb273c9de321bfd6cf
commit 0855ef4db6d8e0d1d57776eb273c9de321bfd6cf
Author: Arnold D. Robbins <address@hidden>
Date: Wed Dec 14 21:25:20 2016 +0200
Fix lint stuff, arg checking. Add a data pointer. Pass finfo to functions.
diff --git a/ChangeLog b/ChangeLog
index efe20f2..5298056 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2016-12-14 Arnold D. Robbins <address@hidden>
+
+ MAJOR BREAKING API CHANGE.
+
+ * awk.h (INSTRUCTION): Update extension function pointer to
+ take 3rd argument of pointer to struct awk_ext_func.
+ * gawkapi.c (api_add_ext_func): Update third arg to not be const.
+ * gawkapi.h (awk_ext_func_t): Put min before max. Add suppress_lint
+ and data pointer.
+ [gawk_api_major_version]: Update to 2.
+ [gawk_api_minor_version]: Reset to 0.
+ (api_add_ext_func): Update third arg to not be const.
+ * interpret.h (Op_ext_symbol): Revise lint check.
+
2016-12-12 Arnold D. Robbins <address@hidden>
* awk.h (INSTRUCTION): Replace min_required and max_expected
diff --git a/NEWS b/NEWS
index 98d9949..c0b781e 100644
--- a/NEWS
+++ b/NEWS
@@ -90,6 +90,12 @@ Changes from 4.1.x to 4.2.0
22. Passing negative operands to any of the bitwise functions now
produces a fatal error.
+23. The C API has undergone changes that break both binary and source
+ code compatibility with the previous version. Thus the API version
+ is now at 2.0. YOU WILL NEED TO REVISE YOUR EXTENSIONS to work
+ with this version of gawk. Fortunately, the changes are fairly
+ minor and straightforward.
+
Changes from 4.1.3 to 4.1.4
---------------------------
diff --git a/awk.h b/awk.h
index 4e365ba..854ecea 100644
--- a/awk.h
+++ b/awk.h
@@ -767,7 +767,9 @@ typedef struct exp_instruction {
NODE *dn;
struct exp_instruction *di;
NODE *(*fptr)(int);
- awk_value_t *(*efptr)(int, awk_value_t *);
+ awk_value_t *(*efptr)(int num_actual_args,
+ awk_value_t *result,
+ struct awk_ext_func *finfo);
long dl;
char *name;
} d;
diff --git a/doc/ChangeLog b/doc/ChangeLog
index c948bcd..61c4f94 100644
--- a/doc/ChangeLog
+++ b/doc/ChangeLog
@@ -1,3 +1,7 @@
+2016-12-14 Arnold D. Robbins <address@hidden>
+
+ * gawktexi.in: Update description of awk_ext_func_t structure.
+
2016-11-21 Arnold D. Robbins <address@hidden>
* gawktexi.in: Finish off discussion of strongly typed regexp
diff --git a/doc/gawk.info b/doc/gawk.info
index 3bb2f35..c197aa1 100644
--- a/doc/gawk.info
+++ b/doc/gawk.info
@@ -23859,8 +23859,13 @@ Extension functions are described by the following
record:
typedef struct awk_ext_func {
const char *name;
- awk_value_t *(*function)(int num_actual_args, awk_value_t *result);
- size_t max_expected_args;
+ awk_value_t *(*const function)(int num_actual_args,
+ awk_value_t *result,
+ struct awk_ext_func *finfo);
+ const size_t min_required_args;
+ const size_t max_expected_args;
+ awk_bool_t suppress_lint;
+ void *data; /* opaque pointer to any extra state */
} awk_ext_func_t;
The fields are:
@@ -23874,7 +23879,7 @@ Extension functions are described by the following
record:
which may be followed by any number of letters, digits, and
underscores. Letter case in function names is significant.
-'awk_value_t *(*function)(int num_actual_args, awk_value_t *result);'
+'awk_value_t *(*const function)(int num_actual_args, awk_value_t *result,
struct awk_ext_func *finfo);'
This is a pointer to the C function that provides the extension's
functionality. The function must fill in '*result' with either a
number or a string. 'gawk' takes ownership of any string memory.
@@ -23884,20 +23889,39 @@ Extension functions are described by the following
record:
The 'num_actual_args' argument tells the C function how many actual
parameters were passed from the calling 'awk' code.
+ The 'finfo' parameter is a pointer to the 'awk_ext_func_t' for this
+ function. The called function may access data within it as
+ desired, or not.
+
The function must return the value of 'result'. This is for the
convenience of the calling code inside 'gawk'.
-'size_t max_expected_args;'
- This is the maximum number of arguments the function expects to
- receive. Each extension function may decide what to do if the
- number of arguments isn't what it expected. As with real 'awk'
- functions, it is likely OK to ignore extra arguments. This value
- does not affect actual program execution.
+'const size_t min_required_args;'
+ This is the minimum number of arguments the function expects to
+ receive. If called with fewer arguments, 'gawk' prints a fatal
+ error message and exits.
- Extension functions should compare this value to the number of
- actual arguments passed and possibly issue a lint warning if there
- is an undesirable mismatch. Of course, if '--lint=fatal' is used,
- this would cause the program to exit.
+'const size_t max_expected_args;'
+ This is the maximum number of arguments the function expects to
+ receive. If called with more arguments than this, and if lint
+ checking has been enabled, then 'gawk' prints a warning message.
+ For more information, see the next item in this list.
+
+'awk_bool_t suppress_lint;'
+ This flag tells 'gawk' not to print a lint message if lint checking
+ has been enabled and if more arguments were supplied in the call
+ than expected. An extension function can tell if 'gawk' already
+ printed at least one such message by checking if 'num_actual_args >
+ finfo->max_expected_args'. If so, and the function does not want
+ more lint messages to be printed, it should set
+ 'finfo->suppress_lint' to 'awk_true'.
+
+'void *data;'
+ This is an opaque pointer to any data that an extension function
+ may wish to have available when called. Passing the
+ 'awk_ext_funct_t' structure to the extension function, and having
+ this pointer available in it enables writing a single C or C++
+ function that implements multiple 'awk'-level extension functions.
Once you have a record representing your extension function, you
register it with 'gawk' using this API function:
@@ -35758,135 +35782,135 @@ Ref: Memory Allocation Functions-Footnote-1966474
Node: Constructor Functions966573
Node: Registration Functions968318
Node: Extension Functions969003
-Node: Exit Callback Functions971626
-Node: Extension Version String972876
-Node: Input Parsers973539
-Node: Output Wrappers983421
-Node: Two-way processors987933
-Node: Printing Messages990198
-Ref: Printing Messages-Footnote-1991369
-Node: Updating ERRNO991522
-Node: Requesting Values992261
-Ref: table-value-types-returned992998
-Node: Accessing Parameters993881
-Node: Symbol Table Access995116
-Node: Symbol table by name995628
-Node: Symbol table by cookie997649
-Ref: Symbol table by cookie-Footnote-11001801
-Node: Cached values1001865
-Ref: Cached values-Footnote-11005372
-Node: Array Manipulation1005463
-Ref: Array Manipulation-Footnote-11006554
-Node: Array Data Types1006591
-Ref: Array Data Types-Footnote-11009249
-Node: Array Functions1009341
-Node: Flattening Arrays1013199
-Node: Creating Arrays1020107
-Node: Redirection API1024876
-Node: Extension API Variables1027707
-Node: Extension Versioning1028340
-Ref: gawk-api-version1028777
-Node: Extension API Informational Variables1030533
-Node: Extension API Boilerplate1031597
-Node: Finding Extensions1035411
-Node: Extension Example1035970
-Node: Internal File Description1036768
-Node: Internal File Ops1040848
-Ref: Internal File Ops-Footnote-11052610
-Node: Using Internal File Ops1052750
-Ref: Using Internal File Ops-Footnote-11055133
-Node: Extension Samples1055407
-Node: Extension Sample File Functions1056936
-Node: Extension Sample Fnmatch1064585
-Node: Extension Sample Fork1066072
-Node: Extension Sample Inplace1067290
-Node: Extension Sample Ord1070500
-Node: Extension Sample Readdir1071336
-Ref: table-readdir-file-types1072225
-Node: Extension Sample Revout1073030
-Node: Extension Sample Rev2way1073619
-Node: Extension Sample Read write array1074359
-Node: Extension Sample Readfile1076301
-Node: Extension Sample Time1077396
-Node: Extension Sample API Tests1078744
-Node: gawkextlib1079236
-Node: Extension summary1081683
-Node: Extension Exercises1085385
-Node: Language History1086883
-Node: V7/SVR3.11088539
-Node: SVR41090691
-Node: POSIX1092125
-Node: BTL1093504
-Node: POSIX/GNU1094233
-Node: Feature History1100095
-Node: Common Extensions1114465
-Node: Ranges and Locales1115748
-Ref: Ranges and Locales-Footnote-11120364
-Ref: Ranges and Locales-Footnote-21120391
-Ref: Ranges and Locales-Footnote-31120626
-Node: Contributors1120847
-Node: History summary1126407
-Node: Installation1127787
-Node: Gawk Distribution1128731
-Node: Getting1129215
-Node: Extracting1130176
-Node: Distribution contents1131814
-Node: Unix Installation1137899
-Node: Quick Installation1138581
-Node: Shell Startup Files1140995
-Node: Additional Configuration Options1142073
-Node: Configuration Philosophy1143878
-Node: Non-Unix Installation1146247
-Node: PC Installation1146707
-Node: PC Binary Installation1147545
-Node: PC Compiling1147980
-Node: PC Using1149097
-Node: Cygwin1152142
-Node: MSYS1152912
-Node: VMS Installation1153413
-Node: VMS Compilation1154204
-Ref: VMS Compilation-Footnote-11155433
-Node: VMS Dynamic Extensions1155491
-Node: VMS Installation Details1157176
-Node: VMS Running1159429
-Node: VMS GNV1163708
-Node: VMS Old Gawk1164443
-Node: Bugs1164914
-Node: Bug address1165577
-Node: Usenet1167974
-Node: Maintainers1168749
-Node: Other Versions1170125
-Node: Installation summary1176709
-Node: Notes1177744
-Node: Compatibility Mode1178609
-Node: Additions1179391
-Node: Accessing The Source1180316
-Node: Adding Code1181751
-Node: New Ports1187970
-Node: Derived Files1192458
-Ref: Derived Files-Footnote-11197943
-Ref: Derived Files-Footnote-21197978
-Ref: Derived Files-Footnote-31198576
-Node: Future Extensions1198690
-Node: Implementation Limitations1199348
-Node: Extension Design1200531
-Node: Old Extension Problems1201685
-Ref: Old Extension Problems-Footnote-11203203
-Node: Extension New Mechanism Goals1203260
-Ref: Extension New Mechanism Goals-Footnote-11206624
-Node: Extension Other Design Decisions1206813
-Node: Extension Future Growth1208926
-Node: Old Extension Mechanism1209762
-Node: Notes summary1211525
-Node: Basic Concepts1212707
-Node: Basic High Level1213388
-Ref: figure-general-flow1213670
-Ref: figure-process-flow1214355
-Ref: Basic High Level-Footnote-11217656
-Node: Basic Data Typing1217841
-Node: Glossary1221169
-Node: Copying1253116
-Node: GNU Free Documentation License1290655
-Node: Index1315773
+Node: Exit Callback Functions972816
+Node: Extension Version String974066
+Node: Input Parsers974729
+Node: Output Wrappers984611
+Node: Two-way processors989123
+Node: Printing Messages991388
+Ref: Printing Messages-Footnote-1992559
+Node: Updating ERRNO992712
+Node: Requesting Values993451
+Ref: table-value-types-returned994188
+Node: Accessing Parameters995071
+Node: Symbol Table Access996306
+Node: Symbol table by name996818
+Node: Symbol table by cookie998839
+Ref: Symbol table by cookie-Footnote-11002991
+Node: Cached values1003055
+Ref: Cached values-Footnote-11006562
+Node: Array Manipulation1006653
+Ref: Array Manipulation-Footnote-11007744
+Node: Array Data Types1007781
+Ref: Array Data Types-Footnote-11010439
+Node: Array Functions1010531
+Node: Flattening Arrays1014389
+Node: Creating Arrays1021297
+Node: Redirection API1026066
+Node: Extension API Variables1028897
+Node: Extension Versioning1029530
+Ref: gawk-api-version1029967
+Node: Extension API Informational Variables1031723
+Node: Extension API Boilerplate1032787
+Node: Finding Extensions1036601
+Node: Extension Example1037160
+Node: Internal File Description1037958
+Node: Internal File Ops1042038
+Ref: Internal File Ops-Footnote-11053800
+Node: Using Internal File Ops1053940
+Ref: Using Internal File Ops-Footnote-11056323
+Node: Extension Samples1056597
+Node: Extension Sample File Functions1058126
+Node: Extension Sample Fnmatch1065775
+Node: Extension Sample Fork1067262
+Node: Extension Sample Inplace1068480
+Node: Extension Sample Ord1071690
+Node: Extension Sample Readdir1072526
+Ref: table-readdir-file-types1073415
+Node: Extension Sample Revout1074220
+Node: Extension Sample Rev2way1074809
+Node: Extension Sample Read write array1075549
+Node: Extension Sample Readfile1077491
+Node: Extension Sample Time1078586
+Node: Extension Sample API Tests1079934
+Node: gawkextlib1080426
+Node: Extension summary1082873
+Node: Extension Exercises1086575
+Node: Language History1088073
+Node: V7/SVR3.11089729
+Node: SVR41091881
+Node: POSIX1093315
+Node: BTL1094694
+Node: POSIX/GNU1095423
+Node: Feature History1101285
+Node: Common Extensions1115655
+Node: Ranges and Locales1116938
+Ref: Ranges and Locales-Footnote-11121554
+Ref: Ranges and Locales-Footnote-21121581
+Ref: Ranges and Locales-Footnote-31121816
+Node: Contributors1122037
+Node: History summary1127597
+Node: Installation1128977
+Node: Gawk Distribution1129921
+Node: Getting1130405
+Node: Extracting1131366
+Node: Distribution contents1133004
+Node: Unix Installation1139089
+Node: Quick Installation1139771
+Node: Shell Startup Files1142185
+Node: Additional Configuration Options1143263
+Node: Configuration Philosophy1145068
+Node: Non-Unix Installation1147437
+Node: PC Installation1147897
+Node: PC Binary Installation1148735
+Node: PC Compiling1149170
+Node: PC Using1150287
+Node: Cygwin1153332
+Node: MSYS1154102
+Node: VMS Installation1154603
+Node: VMS Compilation1155394
+Ref: VMS Compilation-Footnote-11156623
+Node: VMS Dynamic Extensions1156681
+Node: VMS Installation Details1158366
+Node: VMS Running1160619
+Node: VMS GNV1164898
+Node: VMS Old Gawk1165633
+Node: Bugs1166104
+Node: Bug address1166767
+Node: Usenet1169164
+Node: Maintainers1169939
+Node: Other Versions1171315
+Node: Installation summary1177899
+Node: Notes1178934
+Node: Compatibility Mode1179799
+Node: Additions1180581
+Node: Accessing The Source1181506
+Node: Adding Code1182941
+Node: New Ports1189160
+Node: Derived Files1193648
+Ref: Derived Files-Footnote-11199133
+Ref: Derived Files-Footnote-21199168
+Ref: Derived Files-Footnote-31199766
+Node: Future Extensions1199880
+Node: Implementation Limitations1200538
+Node: Extension Design1201721
+Node: Old Extension Problems1202875
+Ref: Old Extension Problems-Footnote-11204393
+Node: Extension New Mechanism Goals1204450
+Ref: Extension New Mechanism Goals-Footnote-11207814
+Node: Extension Other Design Decisions1208003
+Node: Extension Future Growth1210116
+Node: Old Extension Mechanism1210952
+Node: Notes summary1212715
+Node: Basic Concepts1213897
+Node: Basic High Level1214578
+Ref: figure-general-flow1214860
+Ref: figure-process-flow1215545
+Ref: Basic High Level-Footnote-11218846
+Node: Basic Data Typing1219031
+Node: Glossary1222359
+Node: Copying1254306
+Node: GNU Free Documentation License1291845
+Node: Index1316963
End Tag Table
diff --git a/doc/gawk.texi b/doc/gawk.texi
index 5f3d6ef..c482f8d 100644
--- a/doc/gawk.texi
+++ b/doc/gawk.texi
@@ -32799,8 +32799,13 @@ Extension functions are described by the following
record:
@example
typedef struct awk_ext_func @{
@ @ @ @ const char *name;
-@ @ @ @ awk_value_t *(*function)(int num_actual_args, awk_value_t *result);
-@ @ @ @ size_t max_expected_args;
+@ @ @ @ awk_value_t *(*const function)(int num_actual_args,
+@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @
awk_value_t *result,
+@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ struct
awk_ext_func *finfo);
+@ @ @ @ const size_t min_required_args;
+@ @ @ @ const size_t max_expected_args;
+@ @ @ @ awk_bool_t suppress_lint;
+@ @ @ @ void *data; /* opaque pointer to any extra state */
@} awk_ext_func_t;
@end example
@@ -32818,7 +32823,7 @@ or an underscore, which may be followed by any number of
letters, digits, and underscores.
Letter case in function names is significant.
address@hidden awk_value_t *(*function)(int num_actual_args, awk_value_t
*result);
address@hidden awk_value_t *(*const function)(int num_actual_args, awk_value_t
*result, struct awk_ext_func *finfo);
This is a pointer to the C function that provides the extension's
functionality.
The function must fill in @code{*result} with either a number
@@ -32829,20 +32834,38 @@ As mentioned earlier, string memory @emph{must} come
from one of
The @code{num_actual_args} argument tells the C function how many
actual parameters were passed from the calling @command{awk} code.
+The @code{finfo} parameter is a pointer to the @code{awk_ext_func_t} for
+this function. The called function may access data within it as desired, or
not.
+
The function must return the value of @code{result}.
This is for the convenience of the calling code inside @command{gawk}.
address@hidden size_t max_expected_args;
address@hidden const size_t min_required_args;
+This is the minimum number of arguments the function expects to receive.
+If called with fewer arguments, @command{gawk} prints a fatal error
+message and exits.
+
address@hidden const size_t max_expected_args;
This is the maximum number of arguments the function expects to receive.
-Each extension function may decide what to do if the number of
-arguments isn't what it expected. As with real @command{awk} functions, it
-is likely OK to ignore extra arguments. This value does not affect
-actual program execution.
-
-Extension functions should compare this value to the number of actual
-arguments passed and possibly issue a lint warning if there is an
-undesirable mismatch. Of course, if
address@hidden is used, this would cause the program to exit.
+If called with more arguments than this, and if lint checking has
+been enabled, then @command{gawk} prints a warning message. For more
+information, see the next item in this list.
+
address@hidden awk_bool_t suppress_lint;
+This flag tells @command{gawk} not to print a lint message if lint
+checking has been enabled and if more arguments were supplied in the call
+than expected. An extension function can tell if @command{gawk} already
+printed at least one such message by checking if @samp{num_actual_args >
+finfo->max_expected_args}. If so, and the function does not want more
+lint messages to be printed, it should set @code{finfo->suppress_lint}
+to @code{awk_true}.
+
address@hidden void *data;
+This is an opaque pointer to any data that an extension function may
+wish to have available when called. Passing the @code{awk_ext_funct_t}
+structure to the extension function, and having this pointer available
+in it enables writing a single C or C++ function that implements multiple
address@hidden extension functions.
@end table
Once you have a record representing your extension function, you register
diff --git a/doc/gawktexi.in b/doc/gawktexi.in
index 857be3a..7f7a7b2 100644
--- a/doc/gawktexi.in
+++ b/doc/gawktexi.in
@@ -31813,8 +31813,13 @@ Extension functions are described by the following
record:
@example
typedef struct awk_ext_func @{
@ @ @ @ const char *name;
-@ @ @ @ awk_value_t *(*function)(int num_actual_args, awk_value_t *result);
-@ @ @ @ size_t max_expected_args;
+@ @ @ @ awk_value_t *(*const function)(int num_actual_args,
+@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @
awk_value_t *result,
+@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ struct
awk_ext_func *finfo);
+@ @ @ @ const size_t min_required_args;
+@ @ @ @ const size_t max_expected_args;
+@ @ @ @ awk_bool_t suppress_lint;
+@ @ @ @ void *data; /* opaque pointer to any extra state */
@} awk_ext_func_t;
@end example
@@ -31832,7 +31837,7 @@ or an underscore, which may be followed by any number of
letters, digits, and underscores.
Letter case in function names is significant.
address@hidden awk_value_t *(*function)(int num_actual_args, awk_value_t
*result);
address@hidden awk_value_t *(*const function)(int num_actual_args, awk_value_t
*result, struct awk_ext_func *finfo);
This is a pointer to the C function that provides the extension's
functionality.
The function must fill in @code{*result} with either a number
@@ -31843,20 +31848,38 @@ As mentioned earlier, string memory @emph{must} come
from one of
The @code{num_actual_args} argument tells the C function how many
actual parameters were passed from the calling @command{awk} code.
+The @code{finfo} parameter is a pointer to the @code{awk_ext_func_t} for
+this function. The called function may access data within it as desired, or
not.
+
The function must return the value of @code{result}.
This is for the convenience of the calling code inside @command{gawk}.
address@hidden size_t max_expected_args;
address@hidden const size_t min_required_args;
+This is the minimum number of arguments the function expects to receive.
+If called with fewer arguments, @command{gawk} prints a fatal error
+message and exits.
+
address@hidden const size_t max_expected_args;
This is the maximum number of arguments the function expects to receive.
-Each extension function may decide what to do if the number of
-arguments isn't what it expected. As with real @command{awk} functions, it
-is likely OK to ignore extra arguments. This value does not affect
-actual program execution.
-
-Extension functions should compare this value to the number of actual
-arguments passed and possibly issue a lint warning if there is an
-undesirable mismatch. Of course, if
address@hidden is used, this would cause the program to exit.
+If called with more arguments than this, and if lint checking has
+been enabled, then @command{gawk} prints a warning message. For more
+information, see the next item in this list.
+
address@hidden awk_bool_t suppress_lint;
+This flag tells @command{gawk} not to print a lint message if lint
+checking has been enabled and if more arguments were supplied in the call
+than expected. An extension function can tell if @command{gawk} already
+printed at least one such message by checking if @samp{num_actual_args >
+finfo->max_expected_args}. If so, and the function does not want more
+lint messages to be printed, it should set @code{finfo->suppress_lint}
+to @code{awk_true}.
+
address@hidden void *data;
+This is an opaque pointer to any data that an extension function may
+wish to have available when called. Passing the @code{awk_ext_funct_t}
+structure to the extension function, and having this pointer available
+in it enables writing a single C or C++ function that implements multiple
address@hidden extension functions.
@end table
Once you have a record representing your extension function, you register
diff --git a/extension/ChangeLog b/extension/ChangeLog
index edacc2f..831a15f 100644
--- a/extension/ChangeLog
+++ b/extension/ChangeLog
@@ -1,3 +1,19 @@
+2016-12-14 Arnold D. Robbins <address@hidden>
+
+ * filefuncs.c: Update do_xxx to match new API. Update func_table.
+ * fnmatch.c: Ditto.
+ * fork.c: Ditto.
+ * inplace.c: Ditto.
+ * ordchr.c: Ditto.
+ * readdir.c: Ditto.
+ * readfile.c: Ditto.
+ * revoutput.c: Ditto.
+ * revtwoway.c: Ditto.
+ * rwarray.c: Ditto.
+ * rwarray0.c: Ditto.
+ * testext.c: Ditto.
+ * time.c: Ditto.
+
2016-12-12 Arnold D. Robbins <address@hidden>
* filefuncs.c (func_table): Adjust ordering of min and max
@@ -14,6 +30,7 @@
* fork.c: Ditto.
* inplace.c: Ditto.
* ordchr.c: Ditto.
+ * readdir.c: Ditto.
* readfile.c: Ditto.
* rwarray.c: Ditto.
* rwarray0.c: Ditto.
diff --git a/extension/filefuncs.c b/extension/filefuncs.c
index de293be..696a859 100644
--- a/extension/filefuncs.c
+++ b/extension/filefuncs.c
@@ -153,7 +153,7 @@ int plugin_is_GPL_compatible;
/* do_chdir --- provide dynamically loaded chdir() function for gawk */
static awk_value_t *
-do_chdir(int nargs, awk_value_t *result)
+do_chdir(int nargs, awk_value_t *result, struct awk_ext_func *unused)
{
awk_value_t newdir;
int ret = -1;
@@ -458,7 +458,7 @@ fill_stat_array(const char *name, awk_array_t array, struct
stat *sbuf)
/* do_stat --- provide a stat() function for gawk */
static awk_value_t *
-do_stat(int nargs, awk_value_t *result)
+do_stat(int nargs, awk_value_t *result, struct awk_ext_func *unused)
{
awk_value_t file_param, array_param;
char *name;
@@ -503,7 +503,7 @@ do_stat(int nargs, awk_value_t *result)
/* do_statvfs --- provide a statvfs() function for gawk */
static awk_value_t *
-do_statvfs(int nargs, awk_value_t *result)
+do_statvfs(int nargs, awk_value_t *result, struct awk_ext_func *unused)
{
awk_value_t file_param, array_param;
char *name;
@@ -599,7 +599,7 @@ init_filefuncs(void)
*/
static awk_value_t *
-do_fts(int nargs, awk_value_t *result)
+do_fts(int nargs, awk_value_t *result, struct awk_ext_func *unused)
{
fatal(ext_id, _("fts is not supported on this system"));
@@ -814,7 +814,7 @@ process(FTS *heirarchy, awk_array_t destarray, int seedot)
*/
static awk_value_t *
-do_fts(int nargs, awk_value_t *result)
+do_fts(int nargs, awk_value_t *result, struct awk_ext_func *unused)
{
awk_value_t pathlist, flagval, dest;
awk_flat_array_t *path_array = NULL;
@@ -913,13 +913,13 @@ out:
#endif /* ! __MINGW32__ */
static awk_ext_func_t func_table[] = {
- { "chdir", do_chdir, 1, 1 },
- { "stat", do_stat, 3, 2 },
+ { "chdir", do_chdir, 1, 1, awk_false, NULL },
+ { "stat", do_stat, 2, 3, awk_false, NULL },
#ifndef __MINGW32__
- { "fts", do_fts, 3, 3 },
+ { "fts", do_fts, 3, 3, awk_false, NULL },
#endif
#if defined(HAVE_SYS_STATVFS_H) && defined(HAVE_STATVFS)
- { "statvfs", do_statvfs, 2, 2 },
+ { "statvfs", do_statvfs, 2, 2, awk_false, NULL },
#endif
};
diff --git a/extension/fnmatch.c b/extension/fnmatch.c
index caf64a7..5382e4b 100644
--- a/extension/fnmatch.c
+++ b/extension/fnmatch.c
@@ -95,7 +95,7 @@ int plugin_is_GPL_compatible;
/* do_fnmatch --- implement the fnmatch interface */
static awk_value_t *
-do_fnmatch(int nargs, awk_value_t *result)
+do_fnmatch(int nargs, awk_value_t *result, struct awk_ext_func *unused)
{
#ifdef HAVE_FNMATCH_H
static int flags_mask =
@@ -194,7 +194,7 @@ init_fnmatch(void)
}
static awk_ext_func_t func_table[] = {
- { "fnmatch", do_fnmatch, 3, 3 },
+ { "fnmatch", do_fnmatch, 3, 3, awk_false, NULL },
};
/* define the dl_load function using the boilerplate macro */
diff --git a/extension/fork.c b/extension/fork.c
index 064a2a8..823506d 100644
--- a/extension/fork.c
+++ b/extension/fork.c
@@ -71,7 +71,7 @@ array_set_numeric(awk_array_t array, const char *sub, double
num)
/* do_fork --- provide dynamically loaded fork() builtin for gawk */
static awk_value_t *
-do_fork(int nargs, awk_value_t *result)
+do_fork(int nargs, awk_value_t *result, struct awk_ext_func *unused)
{
int ret = -1;
@@ -103,7 +103,7 @@ do_fork(int nargs, awk_value_t *result)
/* do_waitpid --- provide dynamically loaded waitpid() builtin for gawk */
static awk_value_t *
-do_waitpid(int nargs, awk_value_t *result)
+do_waitpid(int nargs, awk_value_t *result, struct awk_ext_func *unused)
{
awk_value_t pid;
int ret = -1;
@@ -126,7 +126,7 @@ do_waitpid(int nargs, awk_value_t *result)
/* do_wait --- provide dynamically loaded wait() builtin for gawk */
static awk_value_t *
-do_wait(int nargs, awk_value_t *result)
+do_wait(int nargs, awk_value_t *result, struct awk_ext_func *unused)
{
int ret;
@@ -141,9 +141,9 @@ do_wait(int nargs, awk_value_t *result)
}
static awk_ext_func_t func_table[] = {
- { "fork", do_fork, 0, 0 },
- { "waitpid", do_waitpid, 1, 1 },
- { "wait", do_wait, 0, 0 },
+ { "fork", do_fork, 0, 0, awk_false, NULL },
+ { "waitpid", do_waitpid, 1, 1, awk_false, NULL },
+ { "wait", do_wait, 0, 0, awk_false, NULL },
};
/* define the dl_load function using the boilerplate macro */
diff --git a/extension/inplace.c b/extension/inplace.c
index 19ee560..5457287 100644
--- a/extension/inplace.c
+++ b/extension/inplace.c
@@ -118,7 +118,7 @@ invalid_filename(const awk_string_t *filename)
/* do_inplace_begin --- start in-place editing */
static awk_value_t *
-do_inplace_begin(int nargs, awk_value_t *result)
+do_inplace_begin(int nargs, awk_value_t *result, struct awk_ext_func *unused)
{
awk_value_t filename;
struct stat sbuf;
@@ -201,7 +201,7 @@ do_inplace_begin(int nargs, awk_value_t *result)
/* do_inplace_end --- finish in-place editing */
static awk_value_t *
-do_inplace_end(int nargs, awk_value_t *result)
+do_inplace_end(int nargs, awk_value_t *result, struct awk_ext_func *unused)
{
awk_value_t filename, suffix;
@@ -262,8 +262,8 @@ do_inplace_end(int nargs, awk_value_t *result)
}
static awk_ext_func_t func_table[] = {
- { "inplace_begin", do_inplace_begin, 2, 2 },
- { "inplace_end", do_inplace_end, 2, 2 },
+ { "inplace_begin", do_inplace_begin, 2, 2, awk_false, NULL },
+ { "inplace_end", do_inplace_end, 2, 2, awk_false, NULL },
};
static awk_bool_t init_inplace(void)
diff --git a/extension/ordchr.c b/extension/ordchr.c
index 3722ced..c7451f6 100644
--- a/extension/ordchr.c
+++ b/extension/ordchr.c
@@ -58,7 +58,7 @@ int plugin_is_GPL_compatible;
/* do_ord --- return numeric value of first char of string */
static awk_value_t *
-do_ord(int nargs, awk_value_t *result)
+do_ord(int nargs, awk_value_t *result, struct awk_ext_func *unused)
{
awk_value_t str;
double ret = -1;
@@ -77,7 +77,7 @@ do_ord(int nargs, awk_value_t *result)
/* do_chr --- turn numeric value into a string */
static awk_value_t *
-do_chr(int nargs, awk_value_t *result)
+do_chr(int nargs, awk_value_t *result, struct awk_ext_func *unused)
{
awk_value_t num;
unsigned int ret = 0;
@@ -102,8 +102,8 @@ do_chr(int nargs, awk_value_t *result)
}
static awk_ext_func_t func_table[] = {
- { "ord", do_ord, 1, 1 },
- { "chr", do_chr, 1, 1 },
+ { "ord", do_ord, 1, 1, awk_false, NULL },
+ { "chr", do_chr, 1, 1, awk_false, NULL },
};
/* define the dl_load function using the boilerplate macro */
diff --git a/extension/readdir.c b/extension/readdir.c
index 6106a44..39acba6 100644
--- a/extension/readdir.c
+++ b/extension/readdir.c
@@ -316,7 +316,7 @@ init_readdir()
}
static awk_ext_func_t func_table[] = {
- { NULL, NULL, 0 }
+ { NULL, NULL, 0, 0, awk_false, NULL }
};
/* define the dl_load function using the boilerplate macro */
diff --git a/extension/readfile.c b/extension/readfile.c
index cc9a4c1..b453da2 100644
--- a/extension/readfile.c
+++ b/extension/readfile.c
@@ -98,7 +98,7 @@ done:
/* do_readfile --- read a file into memory */
static awk_value_t *
-do_readfile(int nargs, awk_value_t *result)
+do_readfile(int nargs, awk_value_t *result, struct awk_ext_func *unused)
{
awk_value_t filename;
int ret;
@@ -238,7 +238,7 @@ init_readfile()
}
static awk_ext_func_t func_table[] = {
- { "readfile", do_readfile, 1, 1 },
+ { "readfile", do_readfile, 1, 1, awk_false, NULL },
};
/* define the dl_load function using the boilerplate macro */
diff --git a/extension/revoutput.c b/extension/revoutput.c
index 84d0aaa..5862ed6 100644
--- a/extension/revoutput.c
+++ b/extension/revoutput.c
@@ -134,7 +134,7 @@ init_revoutput()
}
static awk_ext_func_t func_table[] = {
- { NULL, NULL, 0 }
+ { NULL, NULL, 0, 0, awk_false, NULL }
};
/* define the dl_load function using the boilerplate macro */
diff --git a/extension/revtwoway.c b/extension/revtwoway.c
index 82fabb2..ac4e22c 100644
--- a/extension/revtwoway.c
+++ b/extension/revtwoway.c
@@ -336,7 +336,7 @@ init_revtwoway()
}
static awk_ext_func_t func_table[] = {
- { NULL, NULL, 0 }
+ { NULL, NULL, 0, 0, awk_false, NULL }
};
/* define the dl_load function using the boilerplate macro */
diff --git a/extension/rwarray.c b/extension/rwarray.c
index 8c3200e..00ded7b 100644
--- a/extension/rwarray.c
+++ b/extension/rwarray.c
@@ -99,7 +99,7 @@ static awk_bool_t read_value(FILE *fp, awk_value_t *value);
/* do_writea --- write an array */
static awk_value_t *
-do_writea(int nargs, awk_value_t *result)
+do_writea(int nargs, awk_value_t *result, struct awk_ext_func *unused)
{
awk_value_t filename, array;
FILE *fp = NULL;
@@ -251,7 +251,7 @@ write_value(FILE *fp, awk_value_t *val)
/* do_reada --- read an array */
static awk_value_t *
-do_reada(int nargs, awk_value_t *result)
+do_reada(int nargs, awk_value_t *result, struct awk_ext_func *unused)
{
awk_value_t filename, array;
FILE *fp = NULL;
@@ -464,8 +464,8 @@ read_value(FILE *fp, awk_value_t *value)
}
static awk_ext_func_t func_table[] = {
- { "writea", do_writea, 2, 2 },
- { "reada", do_reada, 2, 2 },
+ { "writea", do_writea, 2, 2, awk_false, NULL },
+ { "reada", do_reada, 2, 2, awk_false, NULL },
};
diff --git a/extension/rwarray0.c b/extension/rwarray0.c
index 35e0a70..faa7378 100644
--- a/extension/rwarray0.c
+++ b/extension/rwarray0.c
@@ -95,7 +95,7 @@ static awk_bool_t read_value(int fd, awk_value_t *value);
/* do_writea --- write an array */
static awk_value_t *
-do_writea(int nargs, awk_value_t *result)
+do_writea(int nargs, awk_value_t *result, struct awk_ext_func *unused)
{
awk_value_t filename, array;
int fd = -1;
@@ -247,7 +247,7 @@ write_value(int fd, awk_value_t *val)
/* do_reada --- read an array */
static awk_value_t *
-do_reada(int nargs, awk_value_t *result)
+do_reada(int nargs, awk_value_t *result, struct awk_ext_func *unused)
{
awk_value_t filename, array;
int fd = -1;
@@ -459,8 +459,8 @@ read_value(int fd, awk_value_t *value)
}
static awk_ext_func_t func_table[] = {
- { "writea", do_writea, 2, 2 },
- { "reada", do_reada, 2, 2 },
+ { "writea", do_writea, 2, 2, awk_false, NULL },
+ { "reada", do_reada, 2, 2, awk_false, NULL },
};
diff --git a/extension/testext.c b/extension/testext.c
index 227714e..bf34218 100644
--- a/extension/testext.c
+++ b/extension/testext.c
@@ -107,7 +107,7 @@ BEGIN {
}
*/
static awk_value_t *
-dump_array_and_delete(int nargs, awk_value_t *result)
+dump_array_and_delete(int nargs, awk_value_t *result, struct awk_ext_func
*unused)
{
awk_value_t value, value2, value3;
awk_flat_array_t *flat_array;
@@ -201,7 +201,7 @@ BEGIN {
*/
static awk_value_t *
-try_modify_environ(int nargs, awk_value_t *result)
+try_modify_environ(int nargs, awk_value_t *result, struct awk_ext_func *unused)
{
awk_value_t value, index, newvalue;
awk_flat_array_t *flat_array;
@@ -290,7 +290,7 @@ BEGIN {
*/
static awk_value_t *
-var_test(int nargs, awk_value_t *result)
+var_test(int nargs, awk_value_t *result, struct awk_ext_func *unused)
{
awk_value_t value, value2;
awk_value_t *valp;
@@ -357,7 +357,7 @@ BEGIN {
}
*/
static awk_value_t *
-test_errno(int nargs, awk_value_t *result)
+test_errno(int nargs, awk_value_t *result, struct awk_ext_func *unused)
{
assert(result != NULL);
make_number(0.0, result);
@@ -386,7 +386,7 @@ BEGIN {
}
*/
static awk_value_t *
-test_deferred(int nargs, awk_value_t *result)
+test_deferred(int nargs, awk_value_t *result, struct awk_ext_func *unused)
{
awk_value_t arr;
awk_value_t index, value;
@@ -465,7 +465,7 @@ BEGIN {
*/
static awk_value_t *
-test_array_size(int nargs, awk_value_t *result)
+test_array_size(int nargs, awk_value_t *result, struct awk_ext_func *unused)
{
awk_value_t value;
size_t count = 0;
@@ -529,7 +529,7 @@ BEGIN {
}
*/
static awk_value_t *
-test_array_elem(int nargs, awk_value_t *result)
+test_array_elem(int nargs, awk_value_t *result, struct awk_ext_func *unused)
{
awk_value_t array, index, index2, value;
@@ -617,7 +617,7 @@ BEGIN {
*/
static awk_value_t *
-test_array_param(int nargs, awk_value_t *result)
+test_array_param(int nargs, awk_value_t *result, struct awk_ext_func *unused)
{
awk_value_t new_array;
awk_value_t arg0;
@@ -660,7 +660,7 @@ BEGIN {
}
*/
static awk_value_t *
-print_do_lint(int nargs, awk_value_t *result)
+print_do_lint(int nargs, awk_value_t *result, struct awk_ext_func *unused)
{
assert(result != NULL);
make_number(0.0, result);
@@ -696,7 +696,7 @@ BEGIN {
/* test_scalar --- test scalar cookie */
static awk_value_t *
-test_scalar(int nargs, awk_value_t *result)
+test_scalar(int nargs, awk_value_t *result, struct awk_ext_func *unused)
{
awk_value_t new_value, new_value2;
awk_value_t the_scalar;
@@ -743,7 +743,7 @@ BEGIN {
/* test_scalar_reserved --- test scalar cookie on special variable */
static awk_value_t *
-test_scalar_reserved(int nargs, awk_value_t *result)
+test_scalar_reserved(int nargs, awk_value_t *result, struct awk_ext_func
*unused)
{
awk_value_t new_value;
awk_value_t the_scalar;
@@ -796,7 +796,7 @@ BEGIN {
/* test_indirect_vars --- test that access to NR, NF, get correct vales */
static awk_value_t *
-test_indirect_vars(int nargs, awk_value_t *result)
+test_indirect_vars(int nargs, awk_value_t *result, struct awk_ext_func *unused)
{
awk_value_t value;
char *name = "NR";
@@ -844,7 +844,7 @@ BEGIN {
/* test_get_file --- test that we can create a file */
static awk_value_t *
-test_get_file(int nargs, awk_value_t *result)
+test_get_file(int nargs, awk_value_t *result, struct awk_ext_func *unused)
{
awk_value_t filename, alias;
int fd;
@@ -882,7 +882,7 @@ test_get_file(int nargs, awk_value_t *result)
/* do_get_file --- provide access to get_file API */
static awk_value_t *
-do_get_file(int nargs, awk_value_t *result)
+do_get_file(int nargs, awk_value_t *result, struct awk_ext_func *unused)
{
awk_value_t filename, filetype, fd, res;
const awk_input_buf_t *ibuf;
@@ -1024,20 +1024,20 @@ static void at_exit2(void *data, int exit_status)
}
static awk_ext_func_t func_table[] = {
- { "dump_array_and_delete", dump_array_and_delete, 2, 2 },
- { "try_modify_environ", try_modify_environ, 0, 0 },
- { "var_test", var_test, 1, 1 },
- { "test_deferred", test_deferred, 0, 0 },
- { "test_errno", test_errno, 0, 0 },
- { "test_array_size", test_array_size, 1, 1 },
- { "test_array_elem", test_array_elem, 2, 2 },
- { "test_array_param", test_array_param, 1, 1 },
- { "print_do_lint", print_do_lint, 0, 0 },
- { "test_scalar", test_scalar, 1, 1 },
- { "test_scalar_reserved", test_scalar_reserved, 0, 0 },
- { "test_indirect_vars", test_indirect_vars, 0, 0 },
- { "test_get_file", test_get_file, 2, 2 },
- { "get_file", do_get_file, 4, 4 },
+ { "dump_array_and_delete", dump_array_and_delete, 2, 2, awk_false, NULL
},
+ { "try_modify_environ", try_modify_environ, 0, 0, awk_false, NULL },
+ { "var_test", var_test, 1, 1, awk_false, NULL },
+ { "test_deferred", test_deferred, 0, 0, awk_false, NULL },
+ { "test_errno", test_errno, 0, 0, awk_false, NULL },
+ { "test_array_size", test_array_size, 1, 1, awk_false, NULL },
+ { "test_array_elem", test_array_elem, 2, 2, awk_false, NULL },
+ { "test_array_param", test_array_param, 1, 1, awk_false, NULL },
+ { "print_do_lint", print_do_lint, 0, 0, awk_false, NULL },
+ { "test_scalar", test_scalar, 1, 1, awk_false, NULL },
+ { "test_scalar_reserved", test_scalar_reserved, 0, 0, awk_false, NULL },
+ { "test_indirect_vars", test_indirect_vars, 0, 0, awk_false, NULL },
+ { "test_get_file", test_get_file, 2, 2, awk_false, NULL },
+ { "get_file", do_get_file, 4, 4, awk_false, NULL },
};
/* init_testext --- additional initialization function */
diff --git a/extension/time.c b/extension/time.c
index 6700275..01be778 100644
--- a/extension/time.c
+++ b/extension/time.c
@@ -103,7 +103,7 @@ int plugin_is_GPL_compatible;
* on the platform
*/
static awk_value_t *
-do_gettimeofday(int nargs, awk_value_t *result)
+do_gettimeofday(int nargs, awk_value_t *result, struct awk_ext_func *unused)
{
double curtime;
@@ -150,7 +150,7 @@ do_gettimeofday(int nargs, awk_value_t *result)
* did not complete successfully (perhaps interrupted)
*/
static awk_value_t *
-do_sleep(int nargs, awk_value_t *result)
+do_sleep(int nargs, awk_value_t *result, struct awk_ext_func *unused)
{
awk_value_t num;
double secs;
@@ -206,8 +206,8 @@ do_sleep(int nargs, awk_value_t *result)
}
static awk_ext_func_t func_table[] = {
- { "gettimeofday", do_gettimeofday, 0, 0 },
- { "sleep", do_sleep, 1, 1 },
+ { "gettimeofday", do_gettimeofday, 0, 0, awk_false, NULL },
+ { "sleep", do_sleep, 1, 1, awk_false, NULL },
};
/* define the dl_load function using the boilerplate macro */
diff --git a/gawkapi.c b/gawkapi.c
index 958c3c1..0b17dae 100644
--- a/gawkapi.c
+++ b/gawkapi.c
@@ -326,7 +326,7 @@ api_unset_ERRNO(awk_ext_id_t id)
static awk_bool_t
api_add_ext_func(awk_ext_id_t id,
const char *namespace,
- const awk_ext_func_t *func)
+ awk_ext_func_t *func)
{
(void) id;
(void) namespace;
diff --git a/gawkapi.h b/gawkapi.h
index d1ad9a2..8998d07 100644
--- a/gawkapi.h
+++ b/gawkapi.h
@@ -260,8 +260,8 @@ typedef struct awk_two_way_processor {
awk_const struct awk_two_way_processor *awk_const next; /* for use by
gawk */
} awk_two_way_processor_t;
-#define gawk_api_major_version 1
-#define gawk_api_minor_version 2
+#define gawk_api_major_version 2
+#define gawk_api_minor_version 0
/* Current version of the API. */
enum {
@@ -389,9 +389,13 @@ typedef struct awk_flat_array {
*/
typedef struct awk_ext_func {
const char *name;
- awk_value_t *(*function)(int num_actual_args, awk_value_t *result);
- size_t max_expected_args;
- size_t min_required_args;
+ awk_value_t *(*const function)(int num_actual_args,
+ awk_value_t *result,
+ struct awk_ext_func *finfo);
+ const size_t min_required_args;
+ const size_t max_expected_args;
+ awk_bool_t suppress_lint;
+ void *data; /* opaque pointer to any extra state */
} awk_ext_func_t;
typedef void *awk_ext_id_t; /* opaque type for extension id */
@@ -426,7 +430,7 @@ typedef struct gawk_api {
/* Add a function to the interpreter, returns true upon success */
awk_bool_t (*api_add_ext_func)(awk_ext_id_t id, const char *namespace,
- const awk_ext_func_t *func);
+ awk_ext_func_t *func);
/* Register an input parser; for opening files read-only */
void (*api_register_input_parser)(awk_ext_id_t id,
diff --git a/interpret.h b/interpret.h
index db4bd32..79e7228 100644
--- a/interpret.h
+++ b/interpret.h
@@ -965,14 +965,12 @@ arrayfor:
fatal(_("%s: called with %d arguments,
expecting at least %d"),
pc[1].func_name, arg_count,
min_req);
- if (do_lint && max_expect > 0 && arg_count >
max_expect) {
- lintwarn(_("%s: called with %d arguments,
expecting no more than %d; check all calls"),
+ if (do_lint && ! f->suppress_lint && arg_count >
max_expect)
+ lintwarn(_("%s: called with %d arguments,
expecting no more than %d"),
pc[1].func_name, arg_count,
max_expect);
- f->max_expected_args = 0; // avoid
multiple lint messages
- }
PUSH_CODE(pc);
- r = awk_value_to_node(pc->extfunc(arg_count, & result));
+ r = awk_value_to_node(pc->extfunc(arg_count, & result,
f));
(void) POP_CODE();
while (arg_count-- > 0) {
t1 = POP();
-----------------------------------------------------------------------
Summary of changes:
ChangeLog | 14 +++
NEWS | 6 +
awk.h | 4 +-
doc/ChangeLog | 4 +
doc/gawk.info | 310 ++++++++++++++++++++++++++-----------------------
doc/gawk.texi | 49 +++++---
doc/gawktexi.in | 49 +++++---
extension/ChangeLog | 17 +++
extension/filefuncs.c | 18 +--
extension/fnmatch.c | 4 +-
extension/fork.c | 12 +-
extension/inplace.c | 8 +-
extension/ordchr.c | 8 +-
extension/readdir.c | 2 +-
extension/readfile.c | 4 +-
extension/revoutput.c | 2 +-
extension/revtwoway.c | 2 +-
extension/rwarray.c | 8 +-
extension/rwarray0.c | 8 +-
extension/testext.c | 56 ++++-----
extension/time.c | 8 +-
gawkapi.c | 2 +-
gawkapi.h | 16 ++-
interpret.h | 8 +-
24 files changed, 367 insertions(+), 252 deletions(-)
hooks/post-receive
--
gawk
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [gawk-diffs] [SCM] gawk branch, feature/api-min-max, updated. gawk-4.1.0-2361-g0855ef4,
Arnold Robbins <=