* src/eval.c (parse_expr): Allow for missing primary between ? and :.
* doc/m4.texi (eval): Document this.
---

I have finished forward-porting everything from branch-1.4 into
branch-1.6.  In the process, I also added this patch.

branch-1.6 already added the a?b:c operator long ago, but this patch
improves it to support a?:c like gcc.

 doc/m4.texi |  7 +++++--
 src/eval.c  | 16 +++++++++++++++-
 2 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/doc/m4.texi b/doc/m4.texi
index 84f84f96..10314d42 100644
--- a/doc/m4.texi
+++ b/doc/m4.texi
@@ -6978,8 +6978,9 @@ Eval
 As a GNU extension, the operator @samp{**} performs integral
 exponentiation.  The operator is right-associative, and if evaluated,
 the exponent must be non-negative, and at least one of the arguments
-must be non-zero, or a warning is issued.  Also, the C operator
-@samp{?:} is supported.
+must be non-zero, or a warning is issued.  Also, the ternary C operator
+@samp{?:} is supported, including the GNU extension of reusing the
+non-zero value of the left side if the middle term is empty.

 @example
 eval(`2 ** 3 ** 2')
@@ -7009,6 +7010,8 @@ Eval
 eval(`1/0 ? 2 : 3')
 @error{}m4:stdin:12: warning: eval: divide by zero: '1/0 ? 2 : 3'
 @result{}
+eval(`2 ?: 3')
+@result{}2
 @end example

 Within @var{expression}, (but not @var{radix} or @var{width}), numbers
diff --git a/src/eval.c b/src/eval.c
index 67b5ce85..bd10e250 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -393,7 +393,21 @@ parse_expr (int32_t *v1, eval_error er, unsigned min_prec)
   et = eval_lex (&v2);
   while (et / 10 >= min_prec)
     {
-      if ((er2 = primary (&v2)) >= SYNTAX_ERROR)
+      if (et == QUESTION)
+        {
+          et2 = eval_lex (&v2);
+          eval_undo ();
+          if (et2 == COLON)
+            {
+              v2 = *v1;
+              er2 = er;
+            }
+          else
+            er2 = primary (&v2);
+        }
+      else
+        er2 = primary (&v2);
+      if (er2 >= SYNTAX_ERROR)
         return er2;
       et2 = eval_lex (&v3);
       /* Handle binary operators of higher precedence or right-associativity */

base-commit: ea03ca2db779dcdb8f05749568f94dc1f735c539
prerequisite-patch-id: 2d73b0c8f625b6262b2b914fc4cf327b0c2efcde
prerequisite-patch-id: 01a4a4c345a62dc1e7bbb398b3d5c2201a348843
prerequisite-patch-id: b1e9adc6a858a998ce53aba8f2823973ca5a696f
prerequisite-patch-id: d64134ddef7d0c0f1f481a4d41a9f3fb337571e3
prerequisite-patch-id: 1cd25e0313a7f8a3efa95e1dc5b091b81aba91ea
prerequisite-patch-id: 2d7bcdf1d4829a6c046afdfa04e7ae5d1289c60e
prerequisite-patch-id: 6f8e951145dc3d09e26ebd083332cce3c622f41e
prerequisite-patch-id: 637aa4482c39672b27a9777dd314a476a57b8015
prerequisite-patch-id: 69ed8e2d700121a512b3c497679c8611f4372962
prerequisite-patch-id: 2df3bc587d819f032cb38414d29a1c0d5e32966b
prerequisite-patch-id: 4ae3b881ca3ed5c31417d1d43d3a912c682a5622
prerequisite-patch-id: 20f656c5e58543e835b2c4a6b79dd11550fbe888
prerequisite-patch-id: a03501fddea75a554d8a9b6c0ecf6e27fee419fc
prerequisite-patch-id: 5c6c629c80f70704cbd8219eb0a2a8e25f981383
prerequisite-patch-id: 87c98f5fc7740f97c008b2a6611e290a645bda91
prerequisite-patch-id: 655fa83c92a6f96de2b1b75d282ecf9564c01396
prerequisite-patch-id: b62711aeec2715cee28203a097ba75c5fbb211f3
prerequisite-patch-id: 63013b638a5644b5bda37332a846d9d9361fad10
prerequisite-patch-id: 4548e5f9fe0c5e69a373cf429d2185ddc0306498
prerequisite-patch-id: 1b45c8538e1a4a83fb338d51ca00198e9624b1b1
prerequisite-patch-id: bb97a8023da547327f3dbfde3a616063c5dce93d
prerequisite-patch-id: 2e4115c94faf45ac79d0526d544b2a7248afdd70
prerequisite-patch-id: aa0fa49c94651a6cc12aebe237119a525b8e295f
prerequisite-patch-id: 80f15b65fbaa60065c873fb6d6f5e7356e535c45
prerequisite-patch-id: 6f2847acaeee5594cc92a99de6825c5172145963
prerequisite-patch-id: 0ff98530e6e54ae9a7d01b3deb58d8e022fce4d0
prerequisite-patch-id: 3aba714c3ba663eabe11d681420274145376c86d
prerequisite-patch-id: 9773fa68f05560d31f9276ca8c36521ade7f7f7e
prerequisite-patch-id: 0fb1495d24c29e0b0c7d656b033a66445b0c9c26
prerequisite-patch-id: 6a3dbad11a8ba1717d8c79b6b87aabc2730a7d04
prerequisite-patch-id: 18eccf2ed437b341d5c4940261208a3064dc747e
prerequisite-patch-id: 1d35614ade6f3c8881c802ebdbf0f5a3d16c3dfe
prerequisite-patch-id: 7ba9916c42d35e03950afe231e0736bd2d7d6778
prerequisite-patch-id: 25c40b593c4842c9340884dcd52ca2c1599e8e72
prerequisite-patch-id: dadf9a517fa852cecd1786d329c30b14e2947fb9
prerequisite-patch-id: 350f29595ccba7ef86e85eab948dea3f3cd40828
prerequisite-patch-id: af489cd9232dbef78ce0aab3e5367b89aac6968c
prerequisite-patch-id: 08b3299fab74b330ad7191715fdf488eb711cbde
prerequisite-patch-id: a1dd0d1a50515ebbefe020ac34fa47423b1248a5
prerequisite-patch-id: 18c35ac86b1b5e778d75cdd816d59047347234f8
prerequisite-patch-id: 4a0028f0447df0e42624f46a0f5abf6e8b018a93
prerequisite-patch-id: ad1c55f6185a82e49fb8a48305ed321a0639cf83
prerequisite-patch-id: 7510898d0df466edef26d3bb6bb99626a3c143c1
prerequisite-patch-id: 345ff8085cc1bbd19810ae06a0c999d0fc42acea
prerequisite-patch-id: afbcf349cf144980009c36a7b47ada3c995c4af9
prerequisite-patch-id: 1c21b2385633d8501327e398204f4ac1e5dba539
prerequisite-patch-id: 0d34ffa7e1f95932099e29820fe66f479af92d7b
prerequisite-patch-id: ed495b851009bee57451cd704dc2e2c52fdad0d6
prerequisite-patch-id: 0853352aa2280beaa28409680bbae93535e0c8d0
prerequisite-patch-id: 83388ccd81e03b88d575fa638a126892250c1fc5
prerequisite-patch-id: 5952240a5b2a6fc0d8c55e7cc4e215b895b7cb50
prerequisite-patch-id: 2220d4356c59d08a862517d10627413a4483d93e
prerequisite-patch-id: 080bcfc2eac06c2ba526460798ed68b9ef2a62e5
prerequisite-patch-id: 197108b661fb4495a405b356b0a01da4bafed5d6
prerequisite-patch-id: a1ddb980e5824fc1deb4938029f4a870fd6940b8
prerequisite-patch-id: 50e8ef586969b035bbcfc985e7be4d1d82413c53
prerequisite-patch-id: cf08bde56de70e7629f5033c33c7ce4f01f0288d
prerequisite-patch-id: 3d8033fedf539e17ed0222acd0319e060d5a0514
prerequisite-patch-id: f2be8ef266b5816f072dcb878a800c2055569646
prerequisite-patch-id: 2bfaf00080dbeef2afd6cde88be0c23d19e47f9f
prerequisite-patch-id: fa06e61a1105e4ba3c72813870b9cfa6b5c54204
prerequisite-patch-id: 9a66f9e6ca6a55d1cc26d9051ed693776cb2e6e5
prerequisite-patch-id: d6962f1654cbfad441aad8fee70e8c296c666fbf
prerequisite-patch-id: b37230620a4eb746e445ad21bd82a4912ecbcac8
prerequisite-patch-id: 206935451fba873dfdf26158c2a2b503722d9649
prerequisite-patch-id: 3a259b4ce9048cf9f0d609b0fc713761bc8dff21
prerequisite-patch-id: eb927ed45a605c2206ef94e26b86a371850c54da
prerequisite-patch-id: 9599175d7ddf1bd1d0786e806d5679715768ccd9
prerequisite-patch-id: 5793b88f4ca1c42878e9cc2dddd5303a8b0ad155
prerequisite-patch-id: 78a0bdc2c07ffae5a6d76247d28c9297638da6ec
prerequisite-patch-id: 2255e8ec9c45df7fc18dc4245e74f84a0b44e192
prerequisite-patch-id: e6a6816fcb69cb5a14feff0988633811ab282257
prerequisite-patch-id: a0d907cfaa64c5999ecd0b5819e9a34f99e4e387
prerequisite-patch-id: 7b16d3edcfaddc10c145193775350ad6317ec543
prerequisite-patch-id: 7d01d851fa4d4fba981abbbbc6852fa9a75156dd
prerequisite-patch-id: 87d362e44b3b6893ffb55005c23db75659b8dd57
prerequisite-patch-id: d20ee6a1b355295eeb0b7926d62facf23f884620
prerequisite-patch-id: 3d7e2c6c0a1318c493d057da23dd6c153ee5bddd
prerequisite-patch-id: 21dea49e37e94f9762c1aa6ff0ba295b68fbdb27
prerequisite-patch-id: b0b5d862836679bb7dff1ed104d68561837e76f9
prerequisite-patch-id: 40c7a61bf00dae516e0a14818fc4d569363d6a5c
prerequisite-patch-id: 25ee83ccfebf4ce34e81c04f54bfae8fefb78219
prerequisite-patch-id: 408c9bacc96cd4bc5d2cfab8238ea8d1fef1b669
prerequisite-patch-id: af0fcba5161ce42fa6227560a3b08c80bad967ed
prerequisite-patch-id: f68f08e73e92727120a4bc76c0a04e243ccbea4f
prerequisite-patch-id: c63b8dedd1c5c461282b60f3dfc8c12eb87fdbcc
prerequisite-patch-id: 16aa3a317307a19b45432417a1321c22d631ec13
prerequisite-patch-id: cd4caccd841b516546962b2b1bdfbafde3e42458
prerequisite-patch-id: 58e427450ae22cced5340a1c6156825bb9da9ffd
prerequisite-patch-id: 83a659929164b8cb96eb95ff15cf6f87bccf289b
prerequisite-patch-id: 54672ff223e8c5cdb928bce324202d58c265e65d
prerequisite-patch-id: 8b05b41ab4817eec89527b4768909520ab245cce
prerequisite-patch-id: 3abf6a325fe1f56bbd1be076911fb4a449dc5f07
prerequisite-patch-id: 247589f629960a4192fd43de70a14c798ba6d5b9
prerequisite-patch-id: dd766f712ac2927069824b3bedf684bfd71e1176
prerequisite-patch-id: e4fbf6427e1acd91c5d13ce7ec0b9c011f4e7e11
prerequisite-patch-id: 34d4507c4c276e1e1048ac0bbc0b7f6913db7ecc
prerequisite-patch-id: 81131e4bb37afd0eda51b703b2b65ba20ad737ed
prerequisite-patch-id: 0e74d67a2ee62f29019148a7b39c33d07bcbbd3f
prerequisite-patch-id: ac60584a7e5d7196efa02bae35b74db9ff552a46
prerequisite-patch-id: d0d5ad104b1cbe31f2187a634938e9132a3b6a57
prerequisite-patch-id: 0ff0385e594ca2103e2c1fcd2fcd2aed64844794
prerequisite-patch-id: 9fe2226245b7cbedff7a594d6d0f58a932a1db71
prerequisite-patch-id: 03c4fae76ab75af7cc373d5389b83fc07f5ee78a
prerequisite-patch-id: 4902537a12be7e35c5cbb97b12608bbe3d351ffd
prerequisite-patch-id: 8dbf779753b7852a3ebba7b71f4e13ff65a09b78
prerequisite-patch-id: 66be860a82ecac4d69ac34565166ddb64fe57b56
prerequisite-patch-id: 5cfe495efdbae08f420ec62fb87283d3e170e1da
prerequisite-patch-id: a0127c6fd8cb6718ae924e442a995632dd65d7d3
prerequisite-patch-id: 399b15fbd9f9cd2137ac5b8751fce1ac0887924f
prerequisite-patch-id: ac7289b4fd18812b8d003fcfc63e8acb1cae35e3
prerequisite-patch-id: bb4addbedb1f28ce01b185d2a8b39597c92c169a
prerequisite-patch-id: 58a755981214013b59f979c7347a4b89106adb71
prerequisite-patch-id: eed777e38b4a33cb2da4b71112d52c15b9968c2d
prerequisite-patch-id: c0134cebde1987a754c1706bc69b2358dcbba193
prerequisite-patch-id: 0a3e70af9f99657c34ab5a45cad65b7d35f4b7d2
prerequisite-patch-id: 5b5a594965fc74db54aef1ce3b28a5e84a8e113c
prerequisite-patch-id: 0770343ca9602068b93d60b1fd74e474f75c2f57
prerequisite-patch-id: 13b324508d8e1b73b1b730686210d8b777225cb4
prerequisite-patch-id: 32d4c1b7f7b2739909fa49b6e20d2749ebc5d248
prerequisite-patch-id: 83adb99f3e440da432d50b356b2eddf4df40a3c2
prerequisite-patch-id: b048e10552a8acd526b1c9dac0124ec8ba5996d3
prerequisite-patch-id: 40e616c41ebcfef050bdcba4b938089ff7b7cd2b
prerequisite-patch-id: 71aac1eef8a54b5425b825e52664966fef1f92ad
prerequisite-patch-id: 00d91a5705fbf222652c84035d0cd4b67fdc542f
prerequisite-patch-id: 0c9519828ed244d9e6e02ac36d507052d1308a44
prerequisite-patch-id: 71da71f6445f55d27982750b03921e4698f3ea9f
prerequisite-patch-id: 4cc89a5fd9e5861cae788461a54b839bfd9bb3c5
prerequisite-patch-id: ac4e797f95c0beeff96c1a679eb797a386ce5f24
prerequisite-patch-id: 5a9b29a34a8a598d6b58e23559870c561c9c31e5
prerequisite-patch-id: 45387de7960eb4dd74d15a92d4486901ad0aab0b
prerequisite-patch-id: 905171a56311ec2385d74216c3d44b4cae5f609c
prerequisite-patch-id: 1b6b7945f0506e358c4f1637facd97db32d5a940
prerequisite-patch-id: b48ca60b4ae4060f81b94bc386f90569f34f87ca
prerequisite-patch-id: 2a40082bcc25499b114256b019035e6605c575be
-- 
2.49.0


_______________________________________________
M4-patches mailing list
M4-patches@gnu.org
https://lists.gnu.org/mailman/listinfo/m4-patches

Reply via email to