File: ChangeLog

package info (click to toggle)
m4 1.4.20-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 22,548 kB
  • sloc: ansic: 141,981; sh: 14,996; cpp: 2,200; lisp: 243; makefile: 165; sed: 16
file content (1300 lines) | stat: -rw-r--r-- 50,184 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
2025-05-10  Eric Blake  <eblake@redhat.com>

	version 1.4.20
	* NEWS: Record release date.

	maint: Prepare for 1.4.20 release
	* NEWS: Tweak release line before running 'make release-commit'.

	maint: Update to latest gnulib and bootstrap
	* gnulib: Update to latest.
	* gl-mod/bootstrap: Likewise.
	* bootstrap: Regenerate.

2025-04-20  Eric Blake  <eblake@redhat.com>

	builtin: Fewer ARG calls
	The ARG() macro invoves some conditionals and indirection. Anywhere
	the builtin needs to refer to the same argument, it is slightly better
	to grab it up front into a temporary variable.

	* src/builtin (m4_eval, m4_undivert, include, m4_debugmode): Reduce
	calls to ARG.

2025-04-19  Eric Blake  <eblake@redhat.com>

	maint: Ensure stable timestamp for manual
	Git likes to set mtime of files to the point where the working
	directory is checked out, rather than the point where the last content
	of the file was committed.  But Automake likes to populate the
	generated doc/version.texi based on the mtime of doc/m4.texi.  Any
	setup that uses a git checkout of m4 to build a new tarball will thus
	get different contents in the manual if checked out on a different
	date, breaking reproducible builds unless we take measures to
	guarantee that the mtime matches the time of the last commit.

	* configure.ac (st_touch): New code.
	* THANKS: Update.
	Suggested by Simon Josefsson, after a report by Santiago Vila:
	https://lists.gnu.org/archive/html/bug-m4/2025-04/msg00052.html

2025-04-19  Eric Blake  <eblake@redhat.com>

	maint: Drop duplicate check in configure.ac
	Commit e0c743b7 duplicated some code.
	* configure.ac (M4_cv_gcc_pragma_push_works): Only check once.

2025-04-19  Eric Blake  <eblake@redhat.com>

	maint: Update bootstrap and gnulib submodules to latest
	Pick up several fixes that were identified from a recent scratch
	release.

	* gnulib: Bump to latest.
	* gl-lib/bootstrap: Likewise.
	* bootstrap: Regenerate.

2025-04-19  Eric Blake  <eblake@redhat.com>

	tests: Fix typo in get-them script
	Spotted while considering whether to add another '@comment xerr:
	ignore' in the manual.  The bug was introduced in commit f63f456a
	(v1.4.11, 2008), but did not break any tests.

	* checks/get-them: Reset correct variable on an ignored example.

2025-04-14  Eric Blake  <eblake@redhat.com>

	eval: Don't forget division by zero on left side of expr
	Fix a regression introduced in e3c4d07c - when the left half of an
	expression was syntactically valid but computationally undefined, the
	parser was overwriting that status with a successful parse of the
	right half, when the second operator has lower precedence than the
	operator that caused the problem in the left half.  The simplest test
	case is "eval(1/0+1)"; also vulnerable was "eval(1/0||1/0)".

	* src/eval.c (evaluate): Adjust signature, to avoid losing error
	status of left half.
	(primary, evaluate): Update callers.
	* doc/m4.texi (Eval): Test it.

2025-04-13  Eric Blake  <eblake@redhat.com>

	maint: Update library names used by Gnulib.
	* src/Makefile.am (LDADD): Update library names according to Gnulib
	NEWS 2023-01-07, and add missing entries.
	* THANKS: Update.
	Reported by Collin Funk in
	https://lists.gnu.org/archive/html/bug-m4/2025-04/msg00030.html

2025-04-12  Eric Blake  <eblake@redhat.com>

	doc: Be more specific about regexp syntax
	As evidenced by recent gnulib traffic [1], GNU Emacs regexp syntax has
	diverged over time, to the point that RE_SYNTAX_EMACS==0 is no longer
	accurate: modern Emacs has since enabled a\{2\} interval repetition,
	as well as [[:alpha:]] char classes, neither of which is supported in
	current m4.  However, for back-compat reasons, we cannot blindly
	change m4 1.4.x away from syntax 0 even if it is no longer Emacs
	syntax.  Worse, at least Autoconf 2.72 has instances of regex where
	both "{" and "\{" are intended to match a literal "{".  Enabling
	intervals could cause regex that compile now to fail to compile and
	cause a warning, which is a change that can only be done on a major
	version bump to 1.6.  So for now, just document the limitations.  [1]
	https://lists.gnu.org/archive/html/bug-gnulib/2025-04/msg00064.html

	* doc/m4.texi (regexp): Document highlights for users that don't want
	to chase the link, and call out intentional lack of newer features
	in contrast to what Emacs now supports.
	(patsubst): Refer to regexp, rather than Emacs.

2025-04-07  Eric Blake  <eblake@redhat.com>

	maint: Require newer prerequisites
	Gnulib documents that it now requires automake 1.14 or later.  It also
	mentions Autoconf 2.64 or later, but I found it easier to require 2.69
	(released in 2012).

	* configure.ac (AC_PREREQ, AM_INIT_AUTOMAKE): Require newer baselines.
	* HACKING: Document this.

2025-04-07  Eric Blake  <eblake@redhat.com>

	doc: Mention upcoming 1.4.20 release.
	* doc/m4.texi (History): Add this week's activity.

2025-04-06  Eric Blake  <eblake@redhat.com>

	maint: Updates in preparation for release
	* HACKING: Make a few updates to match the latest code base.
	* cfg.mk (local-checks-to-skip): No longer exclude sc_bindtextdomain.
	* THANKS: Add some recent (and not-so-recent) credit.
	* NEWS: Capture a few more items of change.

2025-04-06  Eric Blake  <eblake@redhat.com>

	main: List correct default for -H
	Commit 5cdaf1bc2 (v1.4.18b) missed updating --help output.

	* src/m4.c (usage): Output correct -H default.

2025-04-05  Eric Blake  <eblake@redhat.com>

	maint: Drop BACKLOG
	A file describing unread mails from 30 years ago is not useful now;
	furthermore, version control can still get at this if someone cares.

	* BACKLOG: Delete.
	* README: Drop mention of it.

2025-04-05  Eric Blake  <eblake@redhat.com>

	symtab: Add more debug stats
	No impact to a normal build, but this will help in profiling to decide
	which bottlenecks are worth addressing.

	* src/symtab.c (struct profile) [DEBUG_SYM]: Collect more statistics.
	(profile_strcmp, lookup_symbol): Track more things.
	(show_profile): Adjust output when probing stats.

2025-04-05  Eric Blake  <eblake@redhat.com>

	doc: Tweak previous counter example
	* doc/m4.texi (Incr): Allow for negative seeds.

	doc: Add composite counter example
	* doc/m4.texi (Incr): Document a self-updating counter.
	Suggested by Barry Davidson in
	https://lists.gnu.org/archive/html/bug-m4/2023-08/msg00005.html

	doc: Add composite rquo/lquo example
	* doc/m4.texi (Changequote): Document how to output mismatched
	quotes, with a test added to the testsuite.
	Suggested by Barry Davidson in
	https://lists.gnu.org/archive/html/bug-m4/2023-08/msg00005.html

2025-04-05  Eric Blake  <eblake@redhat.com>

	eval: Overhaul implementation for speed and correctness
	While a recursive descent parser is easy to write, it involves a LOT
	of function calls and boilerplate.  Merely parsing "eval(1)" requires
	descending through ALL 11 levels of operator precedence, only for each
	layer to discover there is no operator.  Better is the Pratt style of
	LR(1) parsing [1], which can handle any grammar where no two
	consecutive non-terminals or epsilon appear in the right side of any
	rule [2].  Now, parsing is done with just two mutually recursive
	functions; "eval(1)" works with just two function calls (primary()
	determines the value, and parse_expr() determines no operators are
	present), while more complicated expressions still produce the correct
	results but with less recursion.

	While at it, I noticed that "eval(1||(1/0))" used to produce a cryptic
	message:

	m4:stdin:1: bad expression in eval (excess input): 1||(1/0)

	despite the similar "eval(1||1/0)" suppressing that as part of
	short-circuiting.  It turns out that my initial implementation of
	short-circuiting in 1.4.8b (back in 2007!) was never fully tested on
	more complex situations.

	To test that the new implementation is indeed faster, I wrote an m4
	solution [3] to an Advent of Code challenge [4] that required
	computing 2000 iterations of a 24-bit linear feedback shift register
	over 2000 input values (--trace shows nearly 20 million eval calls).
	On my machine, runtime with an unoptimized pre-patch m4 was at 78
	seconds, post-patch it completes in 66 seconds.

	[1] https://journal.stuffwithstuff.com/2011/03/19/pratt-parsers-expression-parsing-made-easy/
	[2] https://en.wikipedia.org/wiki/Operator-precedence_parser
	[3] https://repo.or.cz/aoc_eblake.git/blob/1b122791d4:/2024/day22.m4
	[4] https://adventofcode.com/2024/day/22

	* NEWS: Document the bug fix. Also document recent compilation fixes.
	* cfg.mk (indent_args): Teach indent not to mangle int casts.
	* doc/m4.text (Eval): Add coverage for the bug fix.  Adjust one
	error output that is now more precise.
	* src/eval.c (logical_or_term, logical_and_term, or_term, xor_term)
	(and_term, equality_term, cmp_term, shift_term, add_term, mult_term)
	(exp_term, unary_term, simple_term): Delete, replaced by...
	(primary, parse_expr): ...new functions.
	(evaluate): Adjust caller.

2025-04-05  Eric Blake  <eblake@redhat.com>

	eval: refactor in preparation for next patch
	* src/eval.c (enum eval_token): Reorder to be in precedence order,
	with values assigned in groups of 10. No semantic impact.

2025-04-05  Eric Blake  <eblake@redhat.com>

	builtin: favor xmemdup0 over xstrdup when length is known
	When the source length is already known, it is faster to copy memory
	without re-scanning for the length.

	* m4/gnulib-cache.m4: Import xmemdup0 module.
	* src/m4.h: Include "xmemdup0.h" for all files.
	* src/builtin.c (define_user_macro): Use it.
	* src/symtab.c (free_symbol, lookup_symbol): Likewise.

2025-04-05  Eric Blake  <eblake@redhat.com>

	symtab: Reduce redundant strlen on macro names
	In many cases, the length of a macro name was previously learned; no
	need to repeat the effort on a strlen.

	* src/m4.h (struct symbol): Add len member.
	(SYMBOL_NAME_LEN): New macro.
	(lookup_symbol, define_user_macro): Update prototypes.
	* src/symtab (lookup_symbol): Update signature to take length.
	(symtab_debug, symtab_print_list): Adjust callers.
	* src/builtin.c (define_user_macro): Update signature to take lengths.
	(define_builtin, builtin_init, define_macro, m4_undefine, m4_popdef)
	(m4_ifdef, m4_dumpdef, m4_indir, m4_defn, set_trace, m4_traceon)
	(m4_traceoff): Adjust callers.
	* src/freeze.c (reload_frozen_state): Likewise.
	* src/m4.c (main): Likewise.
	* src/macro.c (expand_token, collect_arguments): Likewise.

2025-04-05  Eric Blake  <eblake@redhat.com>

	builtin: Reduce use of redundant strlen
	When dealing with tokens, we often know the length of the token from
	the time it was parsed or created by expansion; save this information
	alongside the token instead of calling strlen() everywhere to re-learn
	it, for a slight optimization.  The placement of the new member in
	struct token_data is intentional to avoid changing the size of the
	struct on 64-bit machines, even if the size only matters for text
	tokens.  The code already has a number of places that assume a maximum
	token length bounded by int; scrubbing that to allow a full size_t
	would be a larger patch.

	* src/m4.h (token_data): Add size member.
	(TOKEN_DATA_LEN, SYMBOL_TEXT_LEN): New macros.
	* src/input.c (next_token): Remember size.
	* src/macro.c (expand_argument, collect_arguments): Likewise.
	* src/builtin.c (ARGLEN): New macro.
	(define_user_macro): Set length, and warn user on oversize content.
	(m4_eval): Use compile-time bound for radix.
	(dump_args, m4_ifdef, m4_ifelse, m4_builtin, m4_indir, m4_defn)
	(m4_maketemp, m4_mkstemp, m4_m4wrap, m4_len, m4_substr, m4_translit)
	(m4_regexp, m4_patsubst, expand_user_macro): Utilize known size.

2025-04-05  Eric Blake  <eblake@redhat.com>

	builtin: Reduce use of trivial strlen
	When the length is already known and likely to be short, avoiding the
	function call to strlen can be a slight optimization.  Two obvious
	places: when ntoa() builds a number and already knows where the \0 is,
	and when dumping arguments when the separator is always a single byte.

	* src/builtin:c (dump_args): Change type of sep.
	(m4_shift, m4_errprint, m4_m4wrap, expand_user_macro): Adjust all
	callers.
	(ntoa): Add optional end parameter.
	(shipout_int, m4_eval, m4_maketemp): Adjust all callers.
	* src/debug.c (trace_format): Likewise.
	* src/output.c (shipout_text): Likewise.
	* src/m4.h (ntoa): Adjust prototype.

2025-04-05  Eric Blake  <eblake@redhat.com>

	maint: update to latest gnulib
	* gnulib: Update to latest, which now runs codespell during
	'make syntax-check'.
	* BACKLOG: Typo fix.
	* HACKING: Likewise.
	* Changelog-2014: Swap to UTF-8 spelling of past maintainer names.
	* NEWS: Likewise.
	* cfg.mk (old_NEWS_hash): Run 'make update-NEWS-hash'.
	(exclude_file_name_regexp--sc_codespell, codespell_ignore_words_list):
	New variables to silence codespell false positives.
	* doc/m4.texi (Changeword): Swap example to use 'abc' instead of 'foo'
	so that codespell doesn't complain about 'fo'.

2025-04-05  Eric Blake  <eblake@redhat.com>

	maint: Switch bootstrap to use a submodule
	Upstream development on bootstrap now favors use of a git submodule,
	rather than manually copying in files to the existing gl/ override
	(although gl/ remains available for other gnulib overrides).  Update
	to the newest gnulib, to pull in several fixes.

	* .gitmodules: Add gl-mod/bootstrap as a submodule.
	* gl-mod/bootstrap: New git submodule.
	* bootstrap: Regenerate.
	* m4/gnulib-cache.m4: Likewise.
	* bootstrap.conf (gnulib_non_module_files): Drop.
	(local_gl_path, gnulib_git_submodules): Update to use submodule instead.
	* gl/*: Remove files that used to be hand-copied from bootstrap project.

2025-04-05  Eric Blake  <eblake@redhat.com>

	changeword: Fix coredump on invalid regex
	The docs are clear that the only valid use of the experimental
	changeword is to pass a regex where all prefixes of a desired
	acceptable word are also accepted.  If this constraint is not met, and
	the regex can match a longer string but not the one-byte prefix of
	that string, then the fastmap of that regex will still be set on that
	byte (as it could be a valid anchor to try searching for a longer
	match), but when re_search() then fails to match, we are left with
	garbage in regs.start.

	The docs even had an example where this constraint is not met, but
	because of the way the test was written, the first macro parsed after
	changeword was "dnl", which populated regs with something that happens
	to work on the next attempt to parse with failure to match "f".  But
	the test added here demonstrates that without a prior regex match, if
	the first byte after changeword is in the fastmap but fails to parse,
	then regs.start will still be NULL and crash m4.  And even when m4
	didn't crash, it's still better to only rely on regs after re-running
	the regex on the largest string that did match, rather than whatever
	is left in regs after the first failure to match a one-byte-longer
	string.

	I _really_ want to get rid of changeword.  It slows things down, and
	is a nightmare to maintain.  And the fact that NO ONE reported this
	regression introduced in 2008 (because most distros wisely refuse to
	build with --enable-changeword) means it won't be missed.  But
	removing a feature, even experimental, should be done for 1.6, not
	1.4.x.

	* NEWS: Document the bug fix.  Also a whitespace fix.
	* cfg.mk (old_NEWS_hash): Run 'make update-NEWS-hash'.
	* m4.texi (Changeword): Test for the bug.
	* input.c (word_start) [ENABLE_CHANGEWORD]: Revert commit cde8ed62,
	but this time use a static array rather than malloc'd pointer.
	(set_word_regexp): Populate word_start.
	(peek_token): Use it.
	(next_token): Likewise, and don't use regs.start[1] if regex did not
	have \(\) grouping.

2025-04-04  Eric Blake  <eblake@redhat.com>

	freeze: Open frozen file in binary
	Frozen files must not undergo newline munging.  To support this, teach
	m4_path_search whether a file is okay in text mode (normal m4 input)
	or must be binary (a frozen file).

	* src/m4.h (m4_path_search): Update prototype.
	* src/path.c (m4_fopen, m4_path_search): Honor binary mode.
	* src/builtin.c (m4_undivert, include): Update callers.
	* src/freeze.c (reload_frozen_state): Likewise.
	* src/m4.c (process_file): Likewise.
	Reported by Juan Manuel Guerrero in
	https://lists.gnu.org/archive/html/bug-m4/2023-01/msg00006.html

2025-04-04  Eric Blake  <eblake@redhat.com>

	maint: typo fixes
	* ChangeLog-2014: Address findings from codespell.
	* HACKING: Likewise.
	* NEWS: Likewise.
	* TODO: Likewise.
	* doc/m4.texi: Likewise.
	* examples/hanoi.m4: Likewise.
	* examples/include.m4: Likewise.
	* examples/indir.m4: Likewise.
	* examples/trace.m4: Likewise.
	* src/builtin.c: Likewise.
	* src/debug.c: Likewise.
	* src/output.c: Likewise.
	* cfg.mk: Run 'make update-NEWS-hash'.

	maint: Fix 'make syntax-check' for previous patch
	* doc/Makefile.am (MAKEINFO): Avoid @@ replacement; to avoid
	infinite recursion, we must instead change...
	(AM_MAKEINFOFLAGS): ...this variable.

2025-04-04  Bruno Haible  <bruno@clisp.org>

	build: Ensure that makeinfo ≥ 6.8 checks the @menu structure.
	See <https://lists.gnu.org/archive/html/bug-texinfo/2023-06/msg00015.html>.

	* doc/Makefile.am (MAKEINFO): New variable.

2025-04-04  Bruno Haible  <bruno@clisp.org>

	Fix two occurrences of undefined behaviour.
	* src/path.c (include_env_init): When path_end becomes NULL, terminate
	the loop without computing path_end + 1.
	* src/macro.c (expand_macro): Pass a signed negative value to
	obstack_blank_fast. This avoids a pointer overflow.

2025-04-04  Bruno Haible  <bruno@clisp.org>

	syscmd: Make it work again for most commands on FreeBSD and AIX.
	Regression from 2021-11-19. Fix proposed by Eric Blake.

	* src/builtin.c (m4_syscmd): On Unix, prepend a space to the command before
	executing it.
	(m4_esyscmd): Likewise.

2025-04-04  Eric Blake  <eblake@redhat.com>

	doc: Fix typo in forloop example
	* doc/m4.texi (Improved forloop): s/foreach/forloop/ to match example.
	Reported by Barry Davidson in
	https://lists.gnu.org/archive/html/bug-m4/2023-08/msg00005.html

2025-04-04  Bruno Haible  <bruno@clisp.org>

	build: Fix failure of "./configure; make dist".
	* Makefile.am (BUILT_SOURCES): Add doc/m4.1, checks-files.
	(doc/m4.1): New target.
	(checks-files): New phony target.

2025-04-04  Eric Blake  <eblake@redhat.com>

	maint: Fix build under clang
	Clang also understands '#pragma GCC diagnostic ignored
	"-Wformat-nonliteral"', and refuses to build format.c with -Werror
	without it.
	(Note - even with this patch, a clang build still fails the gnulib
	portion of 'make check' due to a link error in tests/test-gettimeofday;
	that will be fixed in a later patch)

	* src/m4.h: Prefer _GL_GNUC_PREREQ over bare __GNUC__ probes.
	* src/format.c (expand_format): Likewise, and widen scope to
	also appease clang.
	Reported by David Arnstein in:
	https://lists.gnu.org/archive/html/bug-m4/2024-12/msg00002.html

2025-04-03  Eric Blake  <eblake@redhat.com>

	maint: fix 'make syntax-check' errors
	* cfg (indent_args): Inform indent of our no-TAB policy.
	* src/*: Run 'make indent'.
	* src/builtin.c (define_user_macro): Touch up odd split in _()
	by reducing a layer of indentation.
	* src/symtab.c (struct profile): Reformat comment to avoid
	long line from indent.
	* src/input.c (next_char_1): Likewise.
	* src/m4.c (long_options): Likewise.
	(includes): Prefer <error.h> over "error.h".
	* src/m4.h: Likewise for <assert.h>.
	(m4_error, m4_placeholder): Work around indent's inability to
	grok ATTRIBUTE_COLD.
	* Makefile.am (DISTCHECK_CONFIGURE_FLAGS): Rename to
	AM_DISTCHECK_CONFIGURE_FLAGS.

2025-04-02  Eric Blake  <eblake@redhat.com>

	doc: better rendering of macros
	texi2any 7.0 added a new feature [1] to allow the elision of the space
	between the macro name and its argument list in a @deffn.  Since m4
	must not have a space there, we want to use it.

	[1] https://lists.gnu.org/archive/html/bug-texinfo/2022-07/msg00086.html

	* doc/m4.texi: Elide space in rendering of macro definitions.
	* bootstrap.conf (buildreq): Require new-enough makeinfo to support it.

2025-04-01  Eric Blake  <eblake@redhat.com>

	maint: Silence compiler false positive
	gcc 14.2.1 warned that output_text() could be calling memcpy() with
	output_cursor NULL and length non-zero, after a call to
	make_room_for().  But this is a false positive: if output_cursor is
	NULL after make_room_for(), it is because the diversion switched over
	to an active output_file.

	* src/output.c (output_text): Add assertion to silence gcc.

2025-01-01  Paul Eggert  <eggert@cs.ucla.edu>

	maint: adjust to Gnulib module renaming

2025-01-01  Paul Eggert  <eggert@cs.ucla.edu>

	Update copyright year
	Since this wasn't done last year, this year I ran:

	  UPDATE_COPYRIGHT_YEAR=2024 make update-copyright
	  make update-copyright

2025-01-01  Paul Eggert  <eggert@cs.ucla.edu>

	build: update gnulib submodule to latest
	* src/builtin.c (m4_syscmd): Adjust to Gnulib API change.

2024-12-02  Bruno Haible  <bruno@clisp.org>

	maint: Avoid a gcc 14 warning that makes --enable-gcc-warnings break.
	* src/output.c: Disable -Wnull-dereference warnings in this file.

2024-08-17  Paul Eggert  <eggert@cs.ucla.edu>

	maint: update POTFILES.in
	* po/POTFILES.in: Remove verror.c.
	Problem reported by Bruno Haible in:
	https://lists.gnu.org/r/bug-gnulib/2024-08/msg00117.html

2024-08-15  Paul Eggert  <eggert@cs.ucla.edu>

	build: update gnulib submodule to latest
	* m4/gnulib-cache.m4: Adjust to match current tool output.
	* src/m4.h: Don't include verror.hl
	(m4_error, m4_error_at_line, m4_placeholder): Now ATTRIBUTE_COLD,
	to pacify gcc with new Gnulib.

2023-01-13  Eric Blake  <eblake@redhat.com>

	output: Avoid tickling UBSAN with memcpy(dest, NULL, 0)
	Even though all libc handle it sanely (because size 0 says there is
	nothing to copy), NULL is not a valid source pointer per a strict
	reading of C, so UBSAN flags it:

	+output.c:511:9: runtime error: null pointer passed as argument 2, which is declared to never be null

	* src/output.c (make_room_for): Skip no-op memcpy.
	Fixes: https://savannah.gnu.org/support/index.php?110809
	Reported-by: Sam James

2023-01-13  Eric Blake  <eblake@redhat.com>

	format: force C locale on floating point
	A minor release is not the time for format(`%.1f', `4.0') to complain
	about 4.0 not being a number followed by outputting "4,0" in locales
	where the decimal point is a comma.  Such a change belongs better in a
	major release where more thought is put into locale-awareness across
	the board.

	* src/m4.c (main): Force LC_NUMERIC to c.
	Reported-by: Bruno Haible in
	https://lists.gnu.org/r/bug-m4/2021-06/msg00021.html

2023-01-13  Eric Blake  <eblake@redhat.com>

	maint: update to latest gnulib
	* gnulib: Update to latest.
	* m4/gnulib-cache.m4: Copyright date is bumped as a result.

2023-01-13  Eric Blake  <eblake@redhat.com>

	symtab: Fix memory corruption when tracing a popdef'd macro
	While debugging a script with 'm4 -daeqt', I was surprised to see
	uninitialized memory in the trace for one of the macro invocations.
	Rerunning it under valgrind confirmed a use-after-free.

	* src/symtab.c (free_symbol): When popdef marks an in-expansion nested
	definition unused, clone its name in case it is being traced.
	(lookup_symbol) [SYMBOL_INSERT]: Consistently use SYMBOL_NAME(), and
	share the name across a symbol stack instead of needing to clone.
	* doc/m4.texi (Undefine): Test this.
	* NEWS: Document the fix.

	Fixes: ee427b83b5 ("symtab: use less memory in pushdef stacks")

2023-01-13  Sam James  <sam@gentoo.org>

	build: Don't add _FORTIFY_SOURCE if already set by user/toolchain
	Newer toolchains (GCC 12+ or Clang 9+, glibc-2.34) allow _FORTIFY_SOURCE=3.

	The current macro used in configure.ac will forcefully downgrade to F_S=2
	and emit a warning if the user set something else:
	```
	x86_64-pc-linux-gnu-gcc -DEXEEXT=\"\" -I. -I../lib  -DIN_M4_GNULIB_TESTS=1 -I. -I. -I.. -I./.. -I../lib -I./../lib   -O2 -pipe -march=native -fdiagnostics-color=always -frecord-gcc-switches -Wreturn-type      -ggdb3 -Werror=implicit-function-declaration -Werror=implicit-int -c -o glthread/thread.o glthread/thread.c
	In file included from glthread/thread.c:20:
	../lib/config.h:202: warning: "_FORTIFY_SOURCE" redefined
	  202 |    # define _FORTIFY_SOURCE 2
	      |
	<built-in>: note: this is the location of the previous definition
	```

	See: 390d259efe8e1c7e4b6babb4738fef7427416857
	Message-Id: <20230109080431.1320075-1-sam@gentoo.org>

2023-01-13  Eric Blake  <eblake@redhat.com>

	maint: update bootstrap
	Done via:
	  for f in gl/build-aux/*; do cp ~/bootstrap/build-aux/$(basename $f) $f; done
	  gl/build-aux/inline-source gl/build-aux/bootstrap.in > bootstrap

	* gl/build-aux/*: Sync from upstream.
	* bootstrap: Regenerate.

2023-01-13  Eric Blake  <eblake@redhat.com>

	maint: bump copyright year
	Run 'make update-copyright' for 2023.

2022-01-26  Paul Eggert  <eggert@cs.ucla.edu>

	maint: fix possible NULL dereference
	Problem found by --enable-gcc-warnings.
	* src/m4.h: Include intprops.h.
	* src/output.c (m4_tmpname): Do not assume that xasprintf
	returns non-null pointer.

	maint: omit duplicate include
	* src/format.c: Do not include xvasprintf.h,
	as m4.h does that.

	maint: pacify --enable-gcc-warnings
	* src/symtab.c (lookup_symbol): Reword slightly,
	to work around bug in GCC 11.2.0 when --enable-gcc-warnings.

	maint: bump copyright year
	Run 'make update-copyright' for 2022.

	maint: update gnulib submodule to latest

2022-01-08  Bruno Haible  <bruno@clisp.org>

	Add documentation license into version control.
	This fixes a gnulib-tool warning

	Notice from module fdl-1.3:
	  Don't use this module! Instead, copy the referenced license file into your version control repository.

	* doc/fdl-1.3.texi: New file, from gnulib/doc/fdl-1.3.texi.
	* m4/gnulib-cache.m4: Don't import Gnulib module fdl-1.3.

2022-01-08  Bruno Haible  <bruno@clisp.org>

	Add license into version control.
	This gets rid of an autoreconf warning:

	Makefile.am: installing './COPYING' using GNU General Public License v3 file
	Makefile.am:     Consider adding the COPYING file to the version control system
	Makefile.am:     for your code, to avoid questions about which license your project uses

	* COPYING: New file, copied from gnulib/doc/COPYINGv3.

2021-11-19  Eric Blake  <eblake@redhat.com>

	NEWS: Mention previous syscmd fix
	* NEWS: Add a line.

2021-11-19  Eric Blake  <eblake@redhat.com>

	syscmd: Allow commands with leading - or +
	As POSIX recently pointed out[1], anything with semantics like
	system() or popen() should be passing "--" between "-c" and the user's
	string, in case the user intends to execute a utility beginning with
	'-' or '+'.  POSIX recommends that users should not name files
	beginning with '-', but does not have a similar discouragement against
	files beginning with '+'.  In particular, if your /bin/sh is bash and
	you want m4 to fork to a script named "+O" rather than incorrectly
	printing a list of shopt settings, this patch is essential.  If you
	need to be portable to older m4, you can always prepend a space in
	your arguments to syscmd().

	[1] https://www.austingroupbugs.net/view.php?id=1440

	* src/builtin.c (m4_syscmd, m4_esyscmd): Pass "--" to sh prior to
	user's string.

2021-10-26  Eric Blake  <eblake@redhat.com>

	doc: Fix rendering of dumpdef examples
	doc/m4.texi (tabchar): Fix macro so that @c does not eat rest of line.
	Fix suggested by Patrice Dumas <pertusus@free.fr>
	Reported-by: 4dr14n31t0r Th3 G4m3r <4dr14n31t0r@gmail.com>
	https://lists.gnu.org/archive/html/bug-m4/2021-10/msg00000.html
	Fixes: 81795b2967716

2021-07-12  Eric Blake  <eblake@redhat.com>

	maint: mention another spot to edit on release
	* HACKING: Document how to edit main web page.
	Based on an off-list report by David Apps.

2021-06-01  Eric Blake  <eblake@redhat.com>

	tests: Fix 198.sysval
	In my attempt to avoid test failures on Haiku, I caused test failures
	on platforms where sh is noisy when reporting a killed sub-process.

	* doc/m4.texi (Sysval): Avoid stderr noise during test.
	Fixes: 17011ea76a (tests: Skip signal detection on Haiku)
	Fixes: https://lists.gnu.org/archive/html/bug-m4/2021-05/msg00029.html

2021-05-29  Eric Blake  <eblake@redhat.com>

	doc: Minor formatting tweak.
	* doc/m4.texi (Sysval): Fix overfull /hbox.

	maint: Document another release step.
	* HACKING: Add translation project step.

2021-05-28  Eric Blake  <eblake@redhat.com>

	maint: post-release administrivia
	* NEWS: Add header line for next release.
	* .prev-version: Record previous version.
	* cfg.mk (old_NEWS_hash): Auto-update.

	version 1.4.19
	* NEWS: Record release date.

2021-05-28  Eric Blake  <eblake@redhat.com>

	tests: Skip signal detection on Haiku
	On Haiku, using 'kill -9' fromm /bin/shactually causes a process to
	die with the non-standard SIGKILLTHR 15, which causes 198.sysval to
	fail from the unexpected value.

	* doc/m4.texi (Sysval): Skip test on Haiku.
	Reported by Bruno Haible,
	https://lists.gnu.org/archive/html/bug-m4/2021-05/msg00004.html

2021-05-26  Bruno Haible  <bruno@clisp.org>

	Enable more single-thread optimizations in gnulib code
	On many systems (esp. BSD ones), building a recent m4 snapshot produces these
	warnings:

	--------------------------------------------------------------------------------
	  CC       regex.o
	In file included from ../../lib/regex_internal.h:57:0,
	                 from ../../lib/regex.c:70:
	../../lib/regcomp.c: In function 'rpl_regfree':
	../../lib/glthread/lock.h:640:38: warning: statement with no effect [-Wunused-value]
	 # define glthread_lock_destroy(NAME) 0
	                                      ^
	../../lib/regex_internal.h:60:26: note: in expansion of macro 'glthread_lock_destroy'
	 # define lock_fini(lock) glthread_lock_destroy (&(lock))
	                          ^
	...
	--------------------------------------------------------------------------------
	According to the Gnulib documentation section "Optimizations of multithreaded
	code" several more optimizations can be enabled. This patch
	  - enables these single-threading optimizations,
	  - by doing so, gets rid of the warnings in regex.c,
	  - causes no test failures.

	* configure.ac (GNULIB_REGEX_SINGLE_THREAD, GNULIB_MBRTOWC_SINGLE_THREAD,
	GNULIB_WCHAR_SINGLE_LOCALE): Define as C macros.
	Message-Id: <3311608.oHEOCP8NKg@omega>

2021-05-26  Eric Blake  <eblake@redhat.com>

	maint: Update to newer gnulib
	Gnulib has improved stack overflow detection (the c-stack module now
	uses gnulib's stripped-down libsigsegv on more platforms, without
	having to install GNU libsigsegv); with this update, GNU Linux systems
	get stack overflow protection without an external library dependency.
	* gnulib: Update to latest.
	* NEWS: Mention the impact.

2021-05-12  Eric Blake  <eblake@redhat.com>

	maint: translation string tweak
	* src/m4.c (usage): Tweak translation of a newline.
	Reported by Benno Schulenberg,
	https://lists.gnu.org/archive/html/m4-discuss/2021-05/msg00011.html

2021-05-11  Eric Blake  <eblake@redhat.com>

	maint: post-release administrivia
	* NEWS: Add header line for next release.
	* .prev-version: Record previous version.
	* cfg.mk (old_NEWS_hash): Auto-update.

	version 1.4.18d
	* NEWS: Recored release date.

2021-05-10  Eric Blake  <eblake@redhat.com>

	po: fix syntax-check
	* po/POTFILES.in: Update list to match previous patch.

	m4: translate more strings
	* src/m4.c (usage): Split large paragraphs, and mark for translation.
	(main): Translate more strings.
	* src/builtin.c: Likewise.
	* src/eval.c (evaluate): Likewise.
	* src/format.c (expand_format): Likewise.
	* src/freeze.c: Likewise.
	* src/input.c: Likewise.
	* src/macro.c: Likewise.
	* src/output.c: Likewise.
	Reported by Benno Schulenberg:
	https://lists.gnu.org/archive/html/m4-discuss/2021-05/msg00005.html

2021-05-10  Eric Blake  <eblake@redhat.com>

	maint: update gnulib
	Fix several issues reported by Bruno Haible while testing 1.4.18b:
	https://lists.gnu.org/archive/html/bug-m4/2021-05/msg00002.html
	https://lists.gnu.org/archive/html/bug-m4/2021-05/msg00003.html

	* gnulib: Bump to latest, for various fixes.
	* NEWS: Mention this.

2021-05-10  Eric Blake  <eblake@redhat.com>

	maint: update m4-latest* symlinks during upload
	Avoid the situation we had for several years where m4-latest.tar.xz
	pointed to m4-1.4.17.tar.xz in spite of m4-1.4.18.tar.xz existing.
	https://lists.gnu.org/archive/html/m4-discuss/2021-05/msg00003.html

	* cfg.mk (GNUPLOADFLAGS): Update *-latest symlinks during gnupload.

2021-05-10  Eric Blake  <eblake@redhat.com>

	maint: mention ci project
	Bruno Haible has added a continuous integration environment:
	https://lists.gnu.org/archive/html/bug-m4/2020-03/msg00000.html

	* HACKING (Continuous Integration): New section.

2021-05-10  Bruno Haible  <bruno@clisp.org>

	eval: avoid undefined behaviour when parsing -2147483648
	* src/eval.c (eval_lex): Use an unsigned variable for accumulating the
	value.
	https://lists.gnu.org/archive/html/bug-m4/2021-05/msg00001.html

2021-05-07  Eric Blake  <eblake@redhat.com>

	maint: post-release administrivia
	* NEWS: Add header line for next release.
	* .prev-version: Record previous version.
	* cfg.mk (old_NEWS_hash): Auto-update.

	version 1.4.18b
	* NEWS: Record release date.

	maint: prepare for beta release
	* all: Prefer https over http in URLs.
	* doc/m4.texi (History): Update URLs to follow redirects.
	* NEWS: Prepare for release.
	* cfg.mk (old_NEWS_hash): Regenerate via 'make update-NEWS-hash'
	* HACKING: Update URL to gnulib, drop reference to CVS.

	maint: update gnulib to latest
	* gnulib: Pick up latest in preparation for release.

2021-05-07  Eric Blake  <eblake@redhat.com>

	maint: update bootstrap, (re-)enable po file generation
	In commit 4694c4e67, I disabled bootstrap pulling in po files, because
	I got an error while attempting to get them, and remembered that while
	the experimental 2.0 has a .pot file, branch-1.4 (and the 1.4.18
	release) historically did not.  Basically, since the translation
	project does not have any m4.pot corresponding to a released m4 that
	needs it, they deleted tp/latest/m4, and with nothing to pull from,
	rsync fails.  I did not, however, realize that commit 610290de had
	intentionally added translation support, such that m4 1.4.19 WILL have
	translations; so until I get that directory reinstated by releasing
	1.4.18b, I'll just use './bootstrap --skip-po'.

	Meanwhile, Gary's upstream bootstrap has had some commits
	(https://github.com/gnulib-modules/bootstrap.git)
	Regenerate them via:
	for f in gl/build-aux/*; do cp ~/bootstrap/build-aux/$(basename $f) $f; done
	gl/build-aux/inline-source gl/build-aux/bootstrap.in > bootstrap

	* gl/build-aux/*: Sync from upstream.
	* bootstrap: Regenerate.
	* bootstrap.conf (m4_bootstrap_options_prep): Re-enable po.
	* NEWS: Document this as intentional.
	Fixes: 4694c4e67

2021-05-07  Eric Blake  <eblake@redhat.com>

	maint: fix syntax-check issues
	* src/Makefile.am (m4_LDADD): Rename...
	(LDADD): ...to this, and use spelling that satisfies syntax-check.
	* po/POTFILES.in: Update to satisfy syntax-check.
	* cfg.mk (old_NEWS_hash): Update with 'make update-NEWS-hash'.

	maint: bump copyright year
	* all: Use 'make update-copyright' to add 2021.

	README: add GNU Project notice
	* README: Add section to attract more people towards the GNU project.
	Inspired by a suggestion from Jose E. Marchesi <jemarch@gnu.org> on
	the gnu-prog-discuss mailing list.

2021-04-22  Eric Blake  <eblake@redhat.com>

	m4: change command-line -H default
	* src/m4.h (HASHMAX): Bump to ~64k.
	* doc/m4.texi (Limits control): Document it.
	* NEWS: Likewise.

	maint: another gnulib update
	* gnulib: Update to latest, to fix build on rawhide.

2021-04-21  Eric Blake  <eblake@redhat.com>

	symtab: use less memory in pushdef stacks
	No need to xstrdup identical names when we can share the same name
	across the pushdef stack.

	* src/symtab.c (free_symbol): Don't free shared name.
	(lookup_symbol): Share name across pushdef stack.

2021-04-21  Eric Blake  <eblake@redhat.com>

	symtab: make symtab private
	No need for a leaky abstraction of freezing to have to duplicate how
	our symbol hash table is organized; use the public function
	hack_all_symbols instead.  This will make it easier to refactor the
	symbol table (such as automatic resizing, or switching to a trie).

	* src/m4.h (symtab, SYMBOL_NEXT): Make private.
	* src/freeze.c (produce_frozen_state): Split out...
	(freeze_symbol): ...new helper, for use by hack_all_symbols.
	* src/symtab.c (lookup_symbol, symtab_print_list): Update to treat
	next as internal-only code.

2021-04-21  Eric Blake  <eblake@redhat.com>

	symtab: sort by hash before name
	It is faster to do an integer compare than a string compare when
	managing hash table collisions (reserving a string compare for ties).
	Testing with CFLAGS=-DDEBUG_SYM=1 and 'time M4=src/m4 autoconf -f',
	the results are noticeable; on my machine, execution speeds up from
	2.3s to 2.2s, and the debug trace that used to report:

	m4: lookup mode 0 called 1243301 times, 7859589 compares, 6734330 misses, 23941043 bytes

	now reports

	m4: lookup mode 0 called 1243301 times, 1125259 compares, 0 misses, 12433237 bytes

	* src/m4.h (struct symbol): Add hash member.
	* src/symtab.c (lookup_symbol): Sort by hash first, then name.
	(symtab_print_list): Add hash debug.

2021-04-21  Eric Blake  <eblake@redhat.com>

	maint: switch from git:// to https:// for gnulib submodule
	https:// is nicer than git:// for a transport for avoiding
	man-in-the-middle attacks, provided that the server is using a
	new-enough version of git to make https:// efficient (which
	savannah does).
	* .gitmodules: Prefer better URL.

2021-04-21  Paul Eggert  <eggert@cs.ucla.edu>

	maint: port to Solaris 10
	Add libraries needed by current Gnulib.
	* src/Makefile.am (m4_LDADD): Add LIB_CLOCK_GETTIME,
	LIB_GETRANDOM, LIB_HARD_LOCALE, LIB_POSIX_SPAWN,
	LIB_SETLOCALE_NULL, LIBUNISTRING, INTL_MACOSX_LIBS.
	These are all needed by current Gnulib, according to gnulib-tool.
	LIB_CLOCK_GETTIME is certainly needed for Solaris 10; otherwise
	the m4 link fails with clock_gettime not found.

	maint: port to macOS 11.2.3 (arm64)
	* m4/gnulib-cache.m4: Add fopen-gnu, replacing cloexec and fopen.
	Avoid getopt-posix-tests, since they are not needed for m4
	and currently fail on macOS 11.2.3 (arm64).
	* src/builtin.c (m4_incr, m4_decr): Avoid undefined behavior
	on integer overflow that causes tests to fail on macOS.
	* src/debug.c (debug_set_output):
	* src/output.c (m4_tmpfile, m4_tmpopen):
	* src/path.c (m4_fopen):
	Use GNU fopen with "e" rather than set_cloexec_flag.  This is
	simpler, and works around a Gnulib bug on macOS with fopen
	being replaced by rpl_fopen sometimes but not other times.
	* src/freeze.c (produce_frozen_state): Use GNU fopen with "e";
	no need to expose the fd to subprocesses.

	build: update gnulib submodule to latest

2021-04-17  Eric Blake  <eblake@redhat.com>

	symtab: drop redundant symbol flag
	In writing the previous patch, I noticed that the shadow flag is only
	ever set when a pushdef stack is present, which makes it redundant now
	that the pushdef stack is separate from the hash collision stack.

	* src/m4.h (SYMBOL_SHADOWED): Delete.
	* src/builtin.c (dump_symbol): Simplify, now that hack_all_symbols
	no longer visits shadowed macros.
	* src/symtab.c (lookup_symbol, symtab_print_list): Simplify.

2021-04-17  Eric Blake  <eblake@redhat.com>

	symtab: better handling of macro stacks
	I ran into a scenario where running a program took 22s with the
	default -H509, but less than a second with -H517 [1].  The culprit?  A
	collision between 'stack' and 'substr' in the default hash table size
	caused lookups for substr to get progressively slower as pushdef stack
	got deeper.  This is easy enough to fix, and may also make it easier
	to dynamically grow the hashtable.

	[1] https://lists.gnu.org/archive/html/bug-m4/2021-04/msg00000.html

	* src/m4.h (struct symbol): Add stack member.
	* src/symtab.c (lookup_symbol): Separate stack from bucket list.
	(symtab_print_list): Update traversal to match.
	* src/freeze.c (produce_frozen_state): Likewise.
	(reverse_symbol_list): Reverse stack, not bucket.

2021-04-17  Eric Blake  <eblake@redhat.com>

	input: optimize macro tail-call memory usage
	I encountered an m4 program that performed over 20 million iterations
	of a tail-call recursion paradigm.  Without this patch, memory usage
	grew to over 6 gigabytes, pausing the program for several seconds when
	the recursion finally ended just to reclaim the memory.  But with the
	patch, m4 never needed more than 3 megabytes of resident memory.

	* src/input.c (push_string_init): Prune empty string blocks before
	starting another one.

2021-04-17  Eric Blake  <eblake@redhat.com>

	maint: update gnulib and fix build failures
	I got failures when trying to bootstrap:

	bootstrap: getting translations into po/.reference for m4...
	receiving incremental file list
	rsync: change_dir "/latest/m4" (in tp) failed: No such file or directory (2)

	since m4-1.4 has no translation files, and the translation project
	dropped the stale .po files for the unreleased 1.9 development branch.

	Once that was fixed, I also got compilation failures, from an
	incomplete update to the gnulib execute module:

	builtin.c: In function 'm4_syscmd':
	builtin.c:968:44: error: passing argument 3 of 'execute' from incompatible pointer type [-Werror=incompatible-pointer-types]
	  968 |   status = execute (ARG (0), SYSCMD_SHELL, prog_args, NULL, false,
	      |                                            ^~~~~~~~~
	      |                                            |
	      |                                            const char **

	Fixes: 4e5c2c0157

	* gnulib: Update to latest.
	* bootstrap.conf (copyright_holder): Silence bootstrap warning.
	(m4_bootstrap_options_prep): Turn off po update.

2020-12-12  Bruno Haible  <bruno@clisp.org>

	Update after gnulib changed.
	* src/builtin.c (m4_syscmd): Update 'execute' invocation.
	(m4_esyscmd): Update 'create_pipe_in' invocation.
	* po/POTFILES.in: Remove lib/w32spawn.h. Add lib/openat-die.c, lib/os2-spawn.c.

2020-08-23  Paul Eggert  <eggert@cs.ucla.edu>

	* HACKING: Autoconf 2.64 required now.

2020-08-23  Bruno Haible  <bruno@clisp.org>

	build: Fix bootstrap failure with the newest gnulib.
	* configure.ac: Require Autoconf 2.64 at least.

2020-07-17  Paul Eggert  <eggert@cs.ucla.edu>

	Port recent changes to AIX 7.1
	* src/Makefile.am (m4_LDADD): Add LIB_MBRTOWC, LIB_SETLOCALE.
	AIX 7.1 needs these to get the pthread support linked in.

2020-07-13  Paul Eggert  <eggert@cs.ucla.edu>

	Support gettext and proper names
	This way, ‘m4 --version’ outputs “Written by René Seindal”
	instead of “Written by Rene' Seindal” when in a UTF-8 locale.
	As the Translation project adds translations, NLS should
	get better.
	* .gitignore: Add translation-related file names.
	* AUTHORS, ChangeLog-2014, NEWS, README, acinclude.m4, c-boxes.el:
	Spell “François” and “René” without ASCIIfying.
	* HACKING: Add Gettext as a prereq.
	* Makefile.am (SUBDIRS): Add po.
	* configure.ac: Do not use -Wvla.  Add AM_GNU_GETTEXT
	and AM_GNU_GETTEXT_VERSION calls.
	* lib/Makefile.am (MAINTAINERCLEANFILES): Define to empty.
	* m4/gnulib-cache.m4: Add configmake, gettext-h, propername,
	and setlocale modules.
	* po/POTFILES.in: New file.
	* src/Makefile.am (m4_LDADD): Add $(LIBICONV), $(LIBINTL).
	* src/m4.c: Include configmake.h, propername.h.
	(main): Set the locale.
	* src/m4.h: Include locale.h, gettext.h.
	(textdomain, bindtextdomain) [!ENABLE_NLS]: Provide defaults.
	(_): Now an alias for gettext, instead of a no-op.

	Use c-ctype.h instead of ctype.h
	This simplifies the code a bit, and prepares for setlocale.
	* m4/gnulib-cache.m4: Add c-ctype module.
	* src/builtin.c (numeric_arg, m4_undivert, expand_user_macro):
	* src/eval.c (eval_lex):
	* src/format.c (arg_int, arg_long, arg_double, expand_format):
	* src/freeze.c (GET_NUMBER): m
	* src/input.c (next_token, peek_token):
	* src/macro.c (expand_argument):
	Prefer c-ctype macros to ctype macros.
	Omit now-unnecessary calls to to_uchar.
	* src/m4.h: Include c-ctype.h instead of ctype.h.

2020-07-11  Paul Eggert  <eggert@cs.ucla.edu>

	Regenerate bootstrap

	Convert m4.texi from Latin-1 to UTF-8
	* HACKING: Texinfo 4.11 and Autoconf 2.63 are now prereqs.
	* doc/m4.texi: Convert to UTF-8.

2020-07-05  Paul Eggert  <eggert@cs.ucla.edu>

	Port to recent GCC with --enable-gcc-warnings
	* m4/gnulib-cache.m4: Add attribute, verify.
	* src/m4.c (m4_failure, m4_failure_at_line): New functions.
	These replace all uses of M4ERROR ((EXIT_FAILURE, ...)) and
	M4ERROR_WITH_LINE ((EXIT_FAILURE, ...), so that the compiler can
	deduce they do not return.
	* src/m4.h: Include attribute.h, verify.h.
	(M4_GNUC_ATTRIBUTE, M4_GNUC_UNUSED, M4_GNUC_PRINTF)
	(M4_GNUC_NORETURN, M4_GNUC_PURE): Remove.
	All uses replaced by corresponding attributes from attribute.h.
	Also, use attribute.h’s FALLTHROUGH macro as needed in all files.
	* src/macro.c (expand_macro): Cast to uintptr_t instead of to char *
	to pacify GCC alignment warning.

	maint: update copyright date
	Arrived at via:
	make update-copyright
	gl/build-aux/inline-source gl/build-aux/bootstrap.in > bootstrap

	build: adjust to gnulib changes
	* configure.ac: Require Autoconf 2.63; needed by Gnulib.
	* m4/gnulib-cache.m4: Regenerate.

2020-07-05  Bruno Haible  <bruno@clisp.org>

	Update after gnulib changed
	* src/output.c (m4_tmpfile, m4_tmpopen): Update fopen_temp invocations.
	* gl/lib/clean-temp.c.diff: Remove file, no longer needed.

2020-07-05  Paul Eggert  <eggert@cs.ucla.edu>

	build: update gnulib submodule to latest

2017-01-02  Eric Blake  <eblake@redhat.com>

	maint: bump copyright year
	Needed to keep 'make syntax-check' passing.

	* gnulib: Update to latest.
	* bootstrap: Regenerate.
	* all files: Use 'make update-copyright' to bump year.

2016-12-31  Eric Blake  <eblake@redhat.com>

	maint: post-release administrivia
	* NEWS: Add header line for next release.
	* .prev-version: Record previous version.
	* cfg.mk (old_NEWS_hash): Auto-update.

	version 1.4.18
	* NEWS: Record release date.

	doc: abbreviate and update release history
	* doc/m4.texi (History): Shorten, and call out today's release.

2016-12-31  Eric Blake  <eblake@redhat.com>

	maint: automate creation of release tag
	The gnulib makefile was already set up to automate things with
	'make release ...', but we were still doing things by hand, and
	thereby risking missing some steps.

	* m4/gnulib-cache.m4 (gl_MODULES): Import do-release-commit-and-tag.
	* gnulib: Update, for latest version of the script.
	* HACKING: Mention its use.

2016-12-31  Eric Blake  <eblake@redhat.com>

	maint: generate ChangeLog from git commits
	Follow the practice set in numerous other GNU projects, where
	the ChangeLog (since 2015) is generated from git commit messages.
	This avoids duplication or subtle differences between the two,
	as well as making it easier to merge patches across branches
	(as good as Bruno Haible's 'git-merge-changelog' helper program
	is, it still doesn't handle cross-branch cherry-picks very well).

	* ChangeLog: Move...
	* ChangeLog-2014: ...to this.
	* Makefile.am (EXTRA_DIST): Ship renamed file.
	(gen-ChangeLog): New rule, copied mostly from coreutils.
	(dist-hook): Generate the ChangeLog.
	* m4/gnulib-cache.m4 (gl_MODULES): Import gitlog-to-changelog.
	* .gitignore: Ignore ChangeLog.
	* .gitattributes: Likewise.
	* HACKING: Reword to match new procedure, and simplify by
	referring to an external description of ChangeLog style.

2016-12-31  Eric Blake  <eblake@redhat.com>

	maint: summarize highlights of pending release
	* NEWS: Add some blurbs.

2016-12-31  Eric Blake  <eblake@redhat.com>

	maint: make silent builds the default
	The user still has full control over verbosity levels, both setting
	their per-project defaults at configure time (or even in a config.site
	file), as well as a per-run override. But these days, most projects
	are defaulting to silent rules without user intervention.

	* configure.ac (AM_SILENT_RULES): Add, to match what most projects
	are doing these days.

2016-12-31  Eric Blake  <eblake@redhat.com>

	maint: release no longer creates a diff file
	Ever since commit f1cf390 (1.4.14 release), we no longer create
	diff files as part of the release process.  These days, it is
	assumed that it is easier to download a fresh tarball rather
	than to try and use a diff file to patch an older tarball.

2016-12-30  Eric Blake  <eblake@redhat.com>

	doc: drop obsolete @setcontentsaftertitlepage
	texinfo 6.1 complains (during 'make dvi'):

	/home/eblake/m4-1.4/doc/./m4.texi:9: @setcontentsaftertitlepage has been remove
	d as a Texinfo command; move your @contents command if you want the contents af
	ter the title page..

	It turns out that eliminating the command has no effect - modern
	tools correctly emit the contents in-place, right after the title
	page, so it was leftover cruft from an older time.

	* doc/m4.texi: Satisfy newer texinfo.

2016-12-29  Eric Blake  <eblake@redhat.com>

	build: update to latest gnulib
	I hit a weird failure during 'make check', and traced it to a recent
	gnulib regression in parallel test safety.  Pick up the gnulib fix.

	* gnulib: Update to latest, to fix failure in getopt tests.

2016-12-29  Eric Blake  <eblake@redhat.com>

	maint: regenerate bootstrap
	Missed during the copyright update.

	* bootstrap: Regenerate.

2016-12-29  Eric Blake  <eblake@redhat.com>

	maint: bump copyright year
	Sadly, there's no commit in 2015, which means we don't get to benefit
	from using a copyright range.

	Done with 'make update-copyright'.

	* all files: Version control now has a commit in 2016.

2016-12-29  Eric Blake  <eblake@redhat.com>

	gnulib: Update to latest
	* gnulib: Update to latest.
	* m4/gnulib-cache.m4: Regenerate.
	* src/macro.c (expand_macro): Deal with obstack API change.
	* src/builtin.c (mkstemp_helper): Likewise.