aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Eßer <se@FreeBSD.org>2021-11-30 17:33:40 +0000
committerStefan Eßer <se@FreeBSD.org>2021-11-30 17:33:40 +0000
commite63540eed295749528548c2e3a90f5a6e57275c8 (patch)
tree3f13b12f70880dde11aaca408130a2f40012cc95
parent23aff1240891b4ba4bb000345824ca0b87b9b3e3 (diff)
vendor/bc: import release 5.2.1vendor/bc/5.2.1
This release fixes two parse bugs when in POSIX standard mode. One of these bugs was due to a quirk of the POSIX grammar, and the other was because bc was too strict.
-rw-r--r--NEWS.md6
-rwxr-xr-xconfigure.sh4
-rw-r--r--include/status.h4
-rw-r--r--include/version.h2
-rw-r--r--locales/de_DE.ISO8859-1.msg10
-rw-r--r--locales/de_DE.UTF-8.msg10
-rw-r--r--locales/en_US.msg10
-rw-r--r--locales/es_ES.ISO8859-1.msg10
-rw-r--r--locales/es_ES.UTF-8.msg10
-rw-r--r--locales/fr_FR.ISO8859-1.msg10
-rw-r--r--locales/fr_FR.UTF-8.msg10
-rw-r--r--locales/ja_JP.UTF-8.msg10
-rw-r--r--locales/ja_JP.eucJP.msg10
-rw-r--r--locales/nl_NL.ISO8859-1.msg10
-rw-r--r--locales/nl_NL.UTF-8.msg10
-rw-r--r--locales/pl_PL.ISO8859-2.msg10
-rw-r--r--locales/pl_PL.UTF-8.msg10
-rw-r--r--locales/pt_PT.ISO8859-1.msg10
-rw-r--r--locales/pt_PT.UTF-8.msg10
-rw-r--r--locales/ru_RU.CP1251.msg10
-rw-r--r--locales/ru_RU.CP866.msg10
-rw-r--r--locales/ru_RU.ISO8859-5.msg10
-rw-r--r--locales/ru_RU.KOI8-R.msg10
-rw-r--r--locales/ru_RU.UTF-8.msg10
-rw-r--r--locales/zh_CN.GB18030.msg10
-rw-r--r--locales/zh_CN.GB2312.msg10
-rw-r--r--locales/zh_CN.GBK.msg10
-rw-r--r--locales/zh_CN.UTF-8.msg10
-rw-r--r--locales/zh_CN.eucCN.msg10
-rw-r--r--src/bc_parse.c28
-rw-r--r--src/data.c3
-rw-r--r--tests/bc/all.txt1
-rw-r--r--tests/bc/misc8.txt8
-rw-r--r--tests/bc/misc8_results.txt3
-rw-r--r--tests/bc/posix_errors.txt1
35 files changed, 206 insertions, 104 deletions
diff --git a/NEWS.md b/NEWS.md
index fa2df6749783..5d0126b821a8 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -1,5 +1,11 @@
# News
+## 5.2.1
+
+This is a production release that fixes two parse bugs when in POSIX standard
+mode. One of these bugs was due to a quirk of the POSIX grammar, and the other
+was because `bc` was too strict.
+
## 5.2.0
This is a production release that adds a new feature, fixes some bugs, and adds
diff --git a/configure.sh b/configure.sh
index 8a6a7817fd2a..76ffb2b9a18e 100755
--- a/configure.sh
+++ b/configure.sh
@@ -52,13 +52,15 @@ usage() {
printf 'usage:\n'
printf ' %s -h\n' "$script"
printf ' %s --help\n' "$script"
- printf ' %s [-a|-bD|-dB|-c] [-CEfgGHlmMNPtTvz] [-O OPT_LEVEL] [-k KARATSUBA_LEN]\n' "$script"
+ printf ' %s [-a|-bD|-dB|-c] [-CEfgGHlmMNtTvz] [-O OPT_LEVEL] [-k KARATSUBA_LEN]\\\n' "$script"
+ printf ' [-s SETTING] [-S SETTING]\n'
printf ' %s \\\n' "$script"
printf ' [--library|--bc-only --disable-dc|--dc-only --disable-bc|--coverage] \\\n'
printf ' [--force --debug --disable-extra-math --disable-generated-tests] \\\n'
printf ' [--disable-history --disable-man-pages --disable-nls --disable-strip] \\\n'
printf ' [--install-all-locales] [--opt=OPT_LEVEL] \\\n'
printf ' [--karatsuba-len=KARATSUBA_LEN] \\\n'
+ printf ' [--set-default-on=SETTING] [--set-default-off=SETTING] \\\n'
printf ' [--prefix=PREFIX] [--bindir=BINDIR] [--datarootdir=DATAROOTDIR] \\\n'
printf ' [--datadir=DATADIR] [--mandir=MANDIR] [--man1dir=MAN1DIR] \\\n'
printf '\n'
diff --git a/include/status.h b/include/status.h
index 3a23b09dc873..993b5e698fb3 100644
--- a/include/status.h
+++ b/include/status.h
@@ -480,6 +480,10 @@ typedef enum BcErr {
/// Empty statements in POSIX for loop error.
BC_ERR_POSIX_FOR,
+ /// POSIX's grammar does not allow a function definition right after a
+ /// semicolon.
+ BC_ERR_POSIX_FUNC_AFTER_SEMICOLON,
+
/// Non-POSIX exponential (scientific or engineering) number used error.
BC_ERR_POSIX_EXP_NUM,
diff --git a/include/version.h b/include/version.h
index 296dbc79b547..eca73baf508f 100644
--- a/include/version.h
+++ b/include/version.h
@@ -37,6 +37,6 @@
#define BC_VERSION_H
/// The current version.
-#define VERSION 5.2.0
+#define VERSION 5.2.1
#endif // BC_VERSION_H
diff --git a/locales/de_DE.ISO8859-1.msg b/locales/de_DE.ISO8859-1.msg
index 76f2ac4190f6..dc7545e3ed72 100644
--- a/locales/de_DE.ISO8859-1.msg
+++ b/locales/de_DE.ISO8859-1.msg
@@ -77,10 +77,12 @@ $set 4
22 "POSIX erlaubt keine Vergleichsoperatoren auerhalb von if-Anweisungen oder Schleifen"
23 "POSIX bentigt 0 oder 1 Vergleichsoperatoren pro Bedingung"
24 "POSIX erlaubt keinen leeren Ausdruck in einer for-Schleife"
-25 "POSIX erlaubt keine exponentielle Notation"
-26 "POSIX erlaubt keine Feld-Referenzen als Funktionsparameter"
-27 "POSIX erfordert, dass die linke Klammer auf der gleichen Linie wie der Funktionskopf steht"
-28 "POSIX erlaubt keine Zuweisung von Strings an Variablen oder Arrays"
+25 "POSIX verlangt einen Zeilenumbruch zwischen einem Semikolon und einer Funktionsdefinition"
+26 "POSIX erlaubt keine exponentielle Notation"
+27 "POSIX erlaubt keine Feld-Referenzen als Funktionsparameter"
+28 "POSIX erlaubt keine ungltigen Funktionen"
+29 "POSIX erfordert, dass die linke Klammer auf der gleichen Linie wie der Funktionskopf steht"
+30 "POSIX erlaubt keine Zuweisung von Strings an Variablen oder Arrays"
$ Runtime errors.
$set 5
diff --git a/locales/de_DE.UTF-8.msg b/locales/de_DE.UTF-8.msg
index c4dad4cd3a60..7956615e849f 100644
--- a/locales/de_DE.UTF-8.msg
+++ b/locales/de_DE.UTF-8.msg
@@ -77,10 +77,12 @@ $set 4
22 "POSIX erlaubt keine Vergleichsoperatoren außerhalb von if-Anweisungen oder Schleifen"
23 "POSIX benötigt 0 oder 1 Vergleichsoperatoren pro Bedingung"
24 "POSIX erlaubt keinen leeren Ausdruck in einer for-Schleife"
-25 "POSIX erlaubt keine exponentielle Notation"
-26 "POSIX erlaubt keine Feld-Referenzen als Funktionsparameter"
-27 "POSIX erfordert, dass die linke Klammer auf der gleichen Linie wie der Funktionskopf steht"
-28 "POSIX erlaubt keine Zuweisung von Strings an Variablen oder Arrays"
+25 "POSIX verlangt einen Zeilenumbruch zwischen einem Semikolon und einer Funktionsdefinition"
+26 "POSIX erlaubt keine exponentielle Notation"
+27 "POSIX erlaubt keine Feld-Referenzen als Funktionsparameter"
+28 "POSIX erlaubt keine ungültigen Funktionen"
+29 "POSIX erfordert, dass die linke Klammer auf der gleichen Linie wie der Funktionskopf steht"
+30 "POSIX erlaubt keine Zuweisung von Strings an Variablen oder Arrays"
$ Runtime errors.
$set 5
diff --git a/locales/en_US.msg b/locales/en_US.msg
index 707950a5767d..adc1cc4537b9 100644
--- a/locales/en_US.msg
+++ b/locales/en_US.msg
@@ -77,10 +77,12 @@ $set 4
22 "POSIX does not allow comparison operators outside if statements or loops"
23 "POSIX requires 0 or 1 comparison operators per condition"
24 "POSIX requires all 3 parts of a for loop to be non-empty"
-25 "POSIX does not allow exponential notation"
-26 "POSIX does not allow array references as function parameters"
-27 "POSIX requires the left brace be on the same line as the function header"
-28 "POSIX does not allow strings to be assigned to variables or arrays"
+25 "POSIX requires a newline between a semicolon and a function definition",
+26 "POSIX does not allow exponential notation"
+27 "POSIX does not allow array references as function parameters"
+28 "POSIX does not allow void functions",
+29 "POSIX requires the left brace be on the same line as the function header"
+30 "POSIX does not allow strings to be assigned to variables or arrays"
$ Runtime errors.
$set 5
diff --git a/locales/es_ES.ISO8859-1.msg b/locales/es_ES.ISO8859-1.msg
index 8d74f884f811..30c965111de6 100644
--- a/locales/es_ES.ISO8859-1.msg
+++ b/locales/es_ES.ISO8859-1.msg
@@ -77,10 +77,12 @@ $set 4
22 "POSIX no permite operadores de comparacin aparte de \"if\" expresin o bucles"
23 "POSIX requiere 0 o 1 operadores de comparisn para cada condicin"
24 "POSIX requiere todos 3 partes de una bucla que no esta vaco"
-25 "POSIX no permite una notacin exponencial"
-26 "POSIX no permite una referencia a una matriz como un parmetro de funcin"
-27 "POSIX requiere el llave de la izquierda que sea en la misma lnea que los parmetros de la funcin"
-28 "POSIX no permite asignar cadenas a variables o matrices"
+25 "POSIX requiere una nueva lnea entre un punto y coma y una definicin de funcin"
+26 "POSIX no permite una notacin exponencial"
+27 "POSIX no permite una referencia a una matriz como un parmetro de funcin"
+28 "POSIX no permite funciones void"
+29 "POSIX requiere el llave de la izquierda que sea en la misma lnea que los parmetros de la funcin"
+30 "POSIX no permite asignar cadenas a variables o matrices"
$ Runtime errors.
$set 5
diff --git a/locales/es_ES.UTF-8.msg b/locales/es_ES.UTF-8.msg
index 26559e6e9b88..1721dd3d8f2a 100644
--- a/locales/es_ES.UTF-8.msg
+++ b/locales/es_ES.UTF-8.msg
@@ -77,10 +77,12 @@ $set 4
22 "POSIX no permite operadores de comparación aparte de \"if\" expresión o bucles"
23 "POSIX requiere 0 o 1 operadores de comparisón para cada condición"
24 "POSIX requiere todos 3 partes de una bucla que no esta vacío"
-25 "POSIX no permite una notación exponencial"
-26 "POSIX no permite una referencia a una matriz como un parámetro de función"
-27 "POSIX requiere el llave de la izquierda que sea en la misma línea que los parámetros de la función"
-28 "POSIX no permite asignar cadenas a variables o matrices"
+25 "POSIX requiere una nueva línea entre un punto y coma y una definición de función"
+26 "POSIX no permite una notación exponencial"
+27 "POSIX no permite una referencia a una matriz como un parámetro de función"
+28 "POSIX no permite funciones void"
+29 "POSIX requiere el llave de la izquierda que sea en la misma línea que los parámetros de la función"
+30 "POSIX no permite asignar cadenas a variables o matrices"
$ Runtime errors.
$set 5
diff --git a/locales/fr_FR.ISO8859-1.msg b/locales/fr_FR.ISO8859-1.msg
index 8e894e043bbc..5d772abcc4ef 100644
--- a/locales/fr_FR.ISO8859-1.msg
+++ b/locales/fr_FR.ISO8859-1.msg
@@ -77,10 +77,12 @@ $set 4
22 "POSIX interdit les opérateurs de comparaison en dehors des expressions 'if' ou des boucles"
23 "POSIX impose 0 ou 1 opérateur de comparaison par condition"
24 "POSIX interdit une expression vide dans une boucle 'for'"
-25 "POSIX interdit la notation exponentielle"
-26 "POSIX interdit les références à un tableau dans les paramètres d'une fonction"
-27 "POSIX impose que l'en-tête de la fonction et le '{' soient sur la même ligne"
-28 "POSIX interdit pas d'assigner des chaînes de caractères à des variables ou à des tableaux"
+25 "POSIX exige une nouvelle ligne entre un point-virgule et une définition de fonction"
+26 "POSIX interdit la notation exponentielle"
+27 "POSIX interdit les références à un tableau dans les paramètres d'une fonction"
+28 "POSIX n'autorise pas les fonctions void"
+29 "POSIX impose que l'en-tête de la fonction et le '{' soient sur la même ligne"
+30 "POSIX interdit pas d'assigner des chaînes de caractères à des variables ou à des tableaux"
$ Runtime errors.
$set 5
diff --git a/locales/fr_FR.UTF-8.msg b/locales/fr_FR.UTF-8.msg
index 8e894e043bbc..6393ab0e5f70 100644
--- a/locales/fr_FR.UTF-8.msg
+++ b/locales/fr_FR.UTF-8.msg
@@ -77,10 +77,12 @@ $set 4
22 "POSIX interdit les opérateurs de comparaison en dehors des expressions 'if' ou des boucles"
23 "POSIX impose 0 ou 1 opérateur de comparaison par condition"
24 "POSIX interdit une expression vide dans une boucle 'for'"
-25 "POSIX interdit la notation exponentielle"
-26 "POSIX interdit les références à un tableau dans les paramètres d'une fonction"
-27 "POSIX impose que l'en-tête de la fonction et le '{' soient sur la même ligne"
-28 "POSIX interdit pas d'assigner des chaînes de caractères à des variables ou à des tableaux"
+25 "POSIX exige une nouvelle ligne entre un point-virgule et une définition de fonction."
+26 "POSIX interdit la notation exponentielle"
+27 "POSIX interdit les références à un tableau dans les paramètres d'une fonction"
+28 "POSIX n'autorise pas les fonctions void"
+29 "POSIX impose que l'en-tête de la fonction et le '{' soient sur la même ligne"
+30 "POSIX interdit pas d'assigner des chaînes de caractères à des variables ou à des tableaux"
$ Runtime errors.
$set 5
diff --git a/locales/ja_JP.UTF-8.msg b/locales/ja_JP.UTF-8.msg
index 4477f2bc548b..3c51aca8194f 100644
--- a/locales/ja_JP.UTF-8.msg
+++ b/locales/ja_JP.UTF-8.msg
@@ -77,10 +77,12 @@ $set 4
22 "POSIX は if 文やループの外の比較演算子を許可しません。"
23 "POSIXは条件ごとに0または1の比較演算子を必要とします。"
24 "POSIXはforループの3つの部分がすべて空でないことを要求します。"
-25 "POSIXは指数表記を許可しません。"
-26 "POSIX は関数パラメータとして配列参照を許可しません。"
-27 "POSIXでは、関数ヘッダと同じ行に左中括弧があることが必要です。"
-28 "POSIXでは、変数や配列に文字列を割り当てることはできません。"
+25 "POSIXでは、セミコロンと関数定義の間に改行を入れる必要があります。"
+26 "POSIXは指数表記を許可しません。"
+27 "POSIX は関数パラメータとして配列参照を許可しません。"
+28 "POSIXではvoid関数を認めていません。"
+29 "POSIXでは、関数ヘッダと同じ行に左中括弧があることが必要です。"
+30 "POSIXでは、変数や配列に文字列を割り当てることはできません。"
$ ランタイムエラー。
$set 5
diff --git a/locales/ja_JP.eucJP.msg b/locales/ja_JP.eucJP.msg
index a907cd7cf0e3..74bd09c27fd5 100644
--- a/locales/ja_JP.eucJP.msg
+++ b/locales/ja_JP.eucJP.msg
@@ -77,10 +77,12 @@ $set 4
22 "POSIX if ʸ롼פγӱ黻ҤĤޤ"
23 "POSIXϾ老Ȥ0ޤ1ӱ黻ҤɬפȤޤ"
24 "POSIXfor롼פ3Ĥʬ٤ƶǤʤȤ׵ᤷޤ"
-25 "POSIXϻؿɽĤޤ"
-26 "POSIX ϴؿѥ᡼Ȥ󻲾ȤĤޤ"
-27 "POSIXǤϡؿإåƱԤ˺̤뤳ȤɬפǤ"
-28 "POSIXǤϡѿʸƤ뤳ȤϤǤޤ"
+25 "POSIXǤϡߥȴؿδ֤˲Ԥɬפޤ"
+26 "POSIXϻؿɽĤޤ"
+27 "POSIX ϴؿѥ᡼Ȥ󻲾ȤĤޤ"
+28 "POSIXǤvoidؿǧƤޤ"
+29 "POSIXǤϡؿإåƱԤ˺̤뤳ȤɬפǤ"
+30 "POSIXǤϡѿʸƤ뤳ȤϤǤޤ"
$ 󥿥२顼
$set 5
diff --git a/locales/nl_NL.ISO8859-1.msg b/locales/nl_NL.ISO8859-1.msg
index 76b8577108e8..2f60de23cca1 100644
--- a/locales/nl_NL.ISO8859-1.msg
+++ b/locales/nl_NL.ISO8859-1.msg
@@ -77,10 +77,12 @@ $set 4
22 "POSIX laat geen vergelijking toe tussen operatoren buiten als verklaringen of lussen"
23 "POSIX vereist 0 of 1 vergelijkingsoperator per conditie"
24 "POSIX vereist dat alle 3 de delen van een lus niet leeg zijn"
-25 "POSIX laat geen exponentile notatie toe"
-26 "POSIX staat geen arrayreferenties toe als functieparameters"
-27 "POSIX vereist dat de linkse beugel op dezelfde regel staat als de functiehoofding"
-28 "POSIX staat niet toe dat strings worden toegewezen aan variabelen of arrays"
+25 "POSIX vereist een nieuwe regel tussen een puntkomma en een functiedefinitie"
+26 "POSIX laat geen exponentile notatie toe"
+27 "POSIX staat geen arrayreferenties toe als functieparameters"
+28 "POSIX staat geen lege functies toe"
+29 "POSIX vereist dat de linkse beugel op dezelfde regel staat als de functiehoofding"
+30 "POSIX staat niet toe dat strings worden toegewezen aan variabelen of arrays"
$ Runtime fouten.
$set 5
diff --git a/locales/nl_NL.UTF-8.msg b/locales/nl_NL.UTF-8.msg
index 51acb9867e22..599628a6cc51 100644
--- a/locales/nl_NL.UTF-8.msg
+++ b/locales/nl_NL.UTF-8.msg
@@ -77,10 +77,12 @@ $set 4
22 "POSIX laat geen vergelijking toe tussen operatoren buiten als verklaringen of lussen"
23 "POSIX vereist 0 of 1 vergelijkingsoperator per conditie"
24 "POSIX vereist dat alle 3 de delen van een lus niet leeg zijn"
-25 "POSIX laat geen exponentiële notatie toe"
-26 "POSIX staat geen arrayreferenties toe als functieparameters"
-27 "POSIX vereist dat de linkse beugel op dezelfde regel staat als de functiehoofding"
-28 "POSIX staat niet toe dat strings worden toegewezen aan variabelen of arrays"
+25 "POSIX vereist een nieuwe regel tussen een puntkomma en een functiedefinitie"
+26 "POSIX laat geen exponentiële notatie toe"
+27 "POSIX staat geen arrayreferenties toe als functieparameters"
+28 "POSIX staat geen lege functies toe"
+29 "POSIX vereist dat de linkse beugel op dezelfde regel staat als de functiehoofding"
+30 "POSIX staat niet toe dat strings worden toegewezen aan variabelen of arrays"
$ Runtime fouten.
$set 5
diff --git a/locales/pl_PL.ISO8859-2.msg b/locales/pl_PL.ISO8859-2.msg
index d1d77d7e0b57..a36d5fe8beb5 100644
--- a/locales/pl_PL.ISO8859-2.msg
+++ b/locales/pl_PL.ISO8859-2.msg
@@ -77,10 +77,12 @@ $set 4
22 "POSIX nie pozwala na porwnywanie operatorw na zewntrz, jeli deklaracje lub ptle"
23 "POSIX wymaga 0 lub 1 operatora porwnawczego na jeden warunek"
24 "POSIX wymaga, aby wszystkie 3 czci ptli nie byy puste"
-25 "POSIX nie pozwala na notacj wykadnicz"
-26 "POSIX nie zezwala na odniesienia do tablicy jako parametrw funkcji"
-27 "POSIX wymaga, aby lewe usztywnienie znajdowao si na tej samej linii co nagwek funkcji"
-28 "POSIX nie pozwala na przypisywanie cigw znakw do zmiennych lub tablic"
+25 "POSIX wymaga nowej linii pomidzy rednikiem a definicj funkcji"
+26 "POSIX nie pozwala na notacj wykadnicz"
+27 "POSIX nie zezwala na odniesienia do tablicy jako parametrw funkcji"
+28 "POSIX nie dopuszcza funkcji void"
+29 "POSIX wymaga, aby lewe usztywnienie znajdowao si na tej samej linii co nagwek funkcji"
+30 "POSIX nie pozwala na przypisywanie cigw znakw do zmiennych lub tablic"
$ Bdy Runtime'u.
$set 5
diff --git a/locales/pl_PL.UTF-8.msg b/locales/pl_PL.UTF-8.msg
index a23a98edd1d2..ee297161a895 100644
--- a/locales/pl_PL.UTF-8.msg
+++ b/locales/pl_PL.UTF-8.msg
@@ -77,10 +77,12 @@ $set 4
22 "POSIX nie pozwala na porównywanie operatorów na zewnątrz, jeśli deklaracje lub pętle"
23 "POSIX wymaga 0 lub 1 operatora porównawczego na jeden warunek"
24 "POSIX wymaga, aby wszystkie 3 części pętli nie były puste"
-25 "POSIX nie pozwala na notację wykładniczą"
-26 "POSIX nie zezwala na odniesienia do tablicy jako parametrów funkcji"
-27 "POSIX wymaga, aby lewe usztywnienie znajdowało się na tej samej linii co nagłówek funkcji"
-28 "POSIX nie pozwala na przypisywanie ciągów znaków do zmiennych lub tablic"
+25 "POSIX wymaga nowej linii pomiędzy średnikiem a definicją funkcji"
+26 "POSIX nie pozwala na notację wykładniczą"
+27 "POSIX nie zezwala na odniesienia do tablicy jako parametrów funkcji"
+28 "POSIX nie dopuszcza funkcji void"
+29 "POSIX wymaga, aby lewe usztywnienie znajdowało się na tej samej linii co nagłówek funkcji"
+30 "POSIX nie pozwala na przypisywanie ciągów znaków do zmiennych lub tablic"
$ Błędy Runtime'u.
$set 5
diff --git a/locales/pt_PT.ISO8859-1.msg b/locales/pt_PT.ISO8859-1.msg
index 7a17f0642cc9..6197a73d0fe2 100644
--- a/locales/pt_PT.ISO8859-1.msg
+++ b/locales/pt_PT.ISO8859-1.msg
@@ -77,10 +77,12 @@ $set 4
22 "POSIX no permite operadores de comparao fora das expresses 'if' ou loops"
23 "POSIX requer operadores 0 ou 1 de comparao por condio"
24 "POSIX no permite uma expresso vazia em um loop 'for'"
-25 "POSIX no permite notao exponencial"
-26 "POSIX no permite referncias de matriz como parmetros de funo"
-27 "POSIX requer que o cabealho da funo '{' estejam na mesma linha"
-28 "POSIX no permite a atribuio de cadeias de caracteres a variveis ou matrizes"
+25 "POSIX requer uma nova linha entre um ponto-e-vrgula e uma definio de funo"
+26 "POSIX no permite notao exponencial"
+27 "POSIX no permite referncias de matriz como parmetros de funo"
+28 "POSIX no permite funes nulas"
+29 "POSIX requer que o cabealho da funo '{' estejam na mesma linha"
+30 "POSIX no permite a atribuio de cadeias de caracteres a variveis ou matrizes"
$ Runtime errors.
$set 5
diff --git a/locales/pt_PT.UTF-8.msg b/locales/pt_PT.UTF-8.msg
index 2f6a4683a376..768f8807ebfc 100644
--- a/locales/pt_PT.UTF-8.msg
+++ b/locales/pt_PT.UTF-8.msg
@@ -77,10 +77,12 @@ $set 4
22 "POSIX não permite operadores de comparação fora das expressões 'if' ou loops"
23 "POSIX requer operadores 0 ou 1 de comparação por condição"
24 "POSIX não permite uma expressão vazia em um loop 'for'"
-25 "POSIX não permite notação exponencial"
-26 "POSIX não permite referências de matriz como parâmetros de função"
-27 "POSIX requer que o cabeçalho da função '{' estejam na mesma linha"
-28 "POSIX não permite a atribuição de cadeias de caracteres a variáveis ou matrizes"
+25 "POSIX requer uma nova linha entre um ponto-e-vírgula e uma definição de função"
+26 "POSIX não permite notação exponencial"
+27 "POSIX não permite referências de matriz como parâmetros de função"
+28 "POSIX não permite funções nulas"
+29 "POSIX requer que o cabeçalho da função '{' estejam na mesma linha"
+30 "POSIX não permite a atribuição de cadeias de caracteres a variáveis ou matrizes"
$ Runtime errors.
$set 5
diff --git a/locales/ru_RU.CP1251.msg b/locales/ru_RU.CP1251.msg
index 6b1d93aa2110..a094e08e4afb 100644
--- a/locales/ru_RU.CP1251.msg
+++ b/locales/ru_RU.CP1251.msg
@@ -77,10 +77,12 @@ $set 4
22 "POSIX , "
23 "POSIX 0 1 "
24 "POSIX , 3 "
-25 "POSIX "
-26 "POSIX "
-27 "POSIX , , "
-28 "POSIX "
+25 "POSIX "
+26 "POSIX "
+27 "POSIX "
+28 "POSIX "
+29 "POSIX , , "
+30 "POSIX "
$ .
$set 5
diff --git a/locales/ru_RU.CP866.msg b/locales/ru_RU.CP866.msg
index b693428b9a3c..79070cda2e0c 100644
--- a/locales/ru_RU.CP866.msg
+++ b/locales/ru_RU.CP866.msg
@@ -77,10 +77,12 @@ $set 4
22 "POSIX ࠧ蠥 ࠬ ࠢ 室 ।, ᫨ ⢥ত 横"
23 "POSIX ॡ 0 1 ࠢ ᫮"
24 "POSIX ॡ, ⮡ 3 ⫨ 뫨 묨"
-25 "POSIX ᪠ ᯮ樠쭮 樨"
-26 "POSIX ᪠ 뫪 ᨢ ⢥ ࠬ஢ 㭪樨"
-27 "POSIX ॡ, ⮡ ᪮ 뫠 ⮩ , 㭪樨"
-28 "POSIX ᢠ ப ६ ᨢ"
+25 "POSIX ॡ ப 窮 ⮩ । 㭪樨"
+26 "POSIX ᪠ ᯮ樠쭮 樨"
+27 "POSIX ᪠ 뫪 ᨢ ⢥ ࠬ஢ 㭪樨"
+28 "POSIX ࠧ蠥 㭪樨 "
+29 "POSIX ॡ, ⮡ ᪮ 뫠 ⮩ , 㭪樨"
+30 "POSIX ᢠ ப ६ ᨢ"
$ 訡 믮.
$set 5
diff --git a/locales/ru_RU.ISO8859-5.msg b/locales/ru_RU.ISO8859-5.msg
index 35af400c5831..4c544e94f846 100644
--- a/locales/ru_RU.ISO8859-5.msg
+++ b/locales/ru_RU.ISO8859-5.msg
@@ -77,10 +77,12 @@ $set 4
22 "POSIX , "
23 "POSIX 0 1 "
24 "POSIX , 3 "
-25 "POSIX "
-26 "POSIX "
-27 "POSIX , , "
-28 "POSIX "
+25 "POSIX "
+26 "POSIX "
+27 "POSIX "
+28 "POSIX "
+29 "POSIX , , "
+30 "POSIX "
$ .
$set 5
diff --git a/locales/ru_RU.KOI8-R.msg b/locales/ru_RU.KOI8-R.msg
index 98c667095852..50c716b5ca2e 100644
--- a/locales/ru_RU.KOI8-R.msg
+++ b/locales/ru_RU.KOI8-R.msg
@@ -77,10 +77,12 @@ $set 4
22 "POSIX , "
23 "POSIX 0 1 "
24 "POSIX , 3 "
-25 "POSIX "
-26 "POSIX "
-27 "POSIX , , "
-28 "POSIX "
+25 "POSIX "
+26 "POSIX "
+27 "POSIX "
+28 "POSIX "
+29 "POSIX , , "
+30 "POSIX "
$ .
$set 5
diff --git a/locales/ru_RU.UTF-8.msg b/locales/ru_RU.UTF-8.msg
index f7c1dc58c4db..e37bb2182caf 100644
--- a/locales/ru_RU.UTF-8.msg
+++ b/locales/ru_RU.UTF-8.msg
@@ -77,10 +77,12 @@ $set 4
22 "POSIX не разрешает операторам сравнения выходить за пределы, если утверждения или циклы"
23 "POSIX требует 0 или 1 оператора сравнения на условие"
24 "POSIX требует, чтобы все 3 части петли были непустыми"
-25 "POSIX не допускает экспоненциальной нотации"
-26 "POSIX не допускает ссылки на массив в качестве параметров функции"
-27 "POSIX требует, чтобы левая скобка была на той же линии, что и заголовок функции"
-28 "POSIX не позволяет присваивать строки переменным или массивам"
+25 "POSIX требует наличия новой строки между точкой с запятой и определением функции"
+26 "POSIX не допускает экспоненциальной нотации"
+27 "POSIX не допускает ссылки на массив в качестве параметров функции"
+28 "POSIX не разрешает функции пустоты"
+29 "POSIX требует, чтобы левая скобка была на той же линии, что и заголовок функции"
+30 "POSIX не позволяет присваивать строки переменным или массивам"
$ Ошибки выполнения.
$set 5
diff --git a/locales/zh_CN.GB18030.msg b/locales/zh_CN.GB18030.msg
index fb80db7de55d..a2210b19ed29 100644
--- a/locales/zh_CN.GB18030.msg
+++ b/locales/zh_CN.GB18030.msg
@@ -77,10 +77,12 @@ $set 4
22 "POSIXifѭ֮ıȽ"
23 "POSIXҪÿıȽΪ01"
24 "POSIXҪforѭ3ֱǷǿյ"
-25 "POSIXʹָ"
-26 "POSIXΪ"
-27 "POSIXҪߵźͺͷͬһ"
-28 "POSIXַ"
+25 "POSIXҪڷֺźͺ֮ʹûз"
+26 "POSIXʹָ"
+27 "POSIXΪ"
+28 "POSIXЧ"
+29 "POSIXҪߵźͺͷͬһ"
+30 "POSIXַ"
$ ʱ
$set 5
diff --git a/locales/zh_CN.GB2312.msg b/locales/zh_CN.GB2312.msg
index fb80db7de55d..a2210b19ed29 100644
--- a/locales/zh_CN.GB2312.msg
+++ b/locales/zh_CN.GB2312.msg
@@ -77,10 +77,12 @@ $set 4
22 "POSIXifѭ֮ıȽ"
23 "POSIXҪÿıȽΪ01"
24 "POSIXҪforѭ3ֱǷǿյ"
-25 "POSIXʹָ"
-26 "POSIXΪ"
-27 "POSIXҪߵźͺͷͬһ"
-28 "POSIXַ"
+25 "POSIXҪڷֺźͺ֮ʹûз"
+26 "POSIXʹָ"
+27 "POSIXΪ"
+28 "POSIXЧ"
+29 "POSIXҪߵźͺͷͬһ"
+30 "POSIXַ"
$ ʱ
$set 5
diff --git a/locales/zh_CN.GBK.msg b/locales/zh_CN.GBK.msg
index fb80db7de55d..a2210b19ed29 100644
--- a/locales/zh_CN.GBK.msg
+++ b/locales/zh_CN.GBK.msg
@@ -77,10 +77,12 @@ $set 4
22 "POSIXifѭ֮ıȽ"
23 "POSIXҪÿıȽΪ01"
24 "POSIXҪforѭ3ֱǷǿյ"
-25 "POSIXʹָ"
-26 "POSIXΪ"
-27 "POSIXҪߵźͺͷͬһ"
-28 "POSIXַ"
+25 "POSIXҪڷֺźͺ֮ʹûз"
+26 "POSIXʹָ"
+27 "POSIXΪ"
+28 "POSIXЧ"
+29 "POSIXҪߵźͺͷͬһ"
+30 "POSIXַ"
$ ʱ
$set 5
diff --git a/locales/zh_CN.UTF-8.msg b/locales/zh_CN.UTF-8.msg
index c327c0b1b98c..92d1bb767cb0 100644
--- a/locales/zh_CN.UTF-8.msg
+++ b/locales/zh_CN.UTF-8.msg
@@ -77,10 +77,12 @@ $set 4
22 "POSIX不允许在if语句或循环之外的比较运算符"
23 "POSIX要求每个条件的比较运算符为0或1个"
24 "POSIX要求for循环的所有3个部分必须是非空的"
-25 "POSIX不允许使用指数符号"
-26 "POSIX不允许数组引用作为函数参数"
-27 "POSIX要求左边的括号和函数头在同一行上"
-28 "POSIX不允许将字符串分配给变量或数组"
+25 "POSIX要求在分号和函数定义之间使用换行符"
+26 "POSIX不允许使用指数符号"
+27 "POSIX不允许数组引用作为函数参数"
+28 "POSIX不允许无效函数"
+29 "POSIX要求左边的括号和函数头在同一行上"
+30 "POSIX不允许将字符串分配给变量或数组"
$ 运行时错误。
$set 5
diff --git a/locales/zh_CN.eucCN.msg b/locales/zh_CN.eucCN.msg
index fb80db7de55d..a2210b19ed29 100644
--- a/locales/zh_CN.eucCN.msg
+++ b/locales/zh_CN.eucCN.msg
@@ -77,10 +77,12 @@ $set 4
22 "POSIXifѭ֮ıȽ"
23 "POSIXҪÿıȽΪ01"
24 "POSIXҪforѭ3ֱǷǿյ"
-25 "POSIXʹָ"
-26 "POSIXΪ"
-27 "POSIXҪߵźͺͷͬһ"
-28 "POSIXַ"
+25 "POSIXҪڷֺźͺ֮ʹûз"
+26 "POSIXʹָ"
+27 "POSIXΪ"
+28 "POSIXЧ"
+29 "POSIXҪߵźͺͷͬһ"
+30 "POSIXַ"
$ ʱ
$set 5
diff --git a/src/bc_parse.c b/src/bc_parse.c
index 91de31ad5389..8849c1b8e9c7 100644
--- a/src/bc_parse.c
+++ b/src/bc_parse.c
@@ -79,6 +79,7 @@ static bool bc_parse_inst_isLeaf(BcInst t) {
* that can legally end a statement. In bc's case, it could be a newline, a
* semicolon, and a brace in certain cases.
* @param p The parser.
+ * @return True if the token is a legal delimiter.
*/
static bool bc_parse_isDelimiter(const BcParse *p) {
@@ -128,6 +129,23 @@ static bool bc_parse_isDelimiter(const BcParse *p) {
}
/**
+ * Returns true if we are in top level of a function body. The POSIX grammar
+ * is defined such that anything is allowed after a function body, so we must
+ * use this function to detect that case when ending a function body.
+ * @param p The parser.
+ * @return True if we are in the top level of parsing a function body.
+ */
+static bool bc_parse_TopFunc(const BcParse *p) {
+
+ bool good = p->flags.len == 2;
+
+ uint16_t val = BC_PARSE_FLAG_BRACE | BC_PARSE_FLAG_FUNC_INNER;
+ val |= BC_PARSE_FLAG_FUNC;
+
+ return good && BC_PARSE_TOP_FLAG(p) == val;
+}
+
+/**
* Sets a previously defined exit label. What are labels? See the bc Parsing
* section of the Development manual (manuals/development.md).
* @param p The parser.
@@ -881,7 +899,7 @@ static void bc_parse_endBody(BcParse *p, bool brace) {
bc_lex_next(&p->l);
// If the next token is not a delimiter, that is a problem.
- if (BC_ERR(!bc_parse_isDelimiter(p)))
+ if (BC_ERR(!bc_parse_isDelimiter(p) && !bc_parse_TopFunc(p)))
bc_parse_err(p, BC_ERR_PARSE_TOKEN);
}
@@ -1741,6 +1759,14 @@ static void bc_parse_stmt(BcParse *p) {
// Make sure semicolons are eaten.
while (p->l.t == BC_LEX_SCOLON) bc_lex_next(&p->l);
+
+ // POSIX's grammar does not allow a function definition after a semicolon
+ // without a newline, so check specifically for that case and error if
+ // the POSIX standard flag is set.
+ if (p->l.last == BC_LEX_SCOLON && p->l.t == BC_LEX_KW_DEFINE && BC_IS_POSIX)
+ {
+ bc_parse_err(p, BC_ERR_POSIX_FUNC_AFTER_SEMICOLON);
+ }
}
void bc_parse_parse(BcParse *p) {
diff --git a/src/data.c b/src/data.c
index 82475299ed78..959af600c1af 100644
--- a/src/data.c
+++ b/src/data.c
@@ -202,7 +202,7 @@ const uchar bc_err_ids[] = {
BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
- BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
+ BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
#endif // BC_ENABLED
};
@@ -273,6 +273,7 @@ const char* const bc_err_msgs[] = {
"POSIX does not allow comparison operators outside if statements or loops",
"POSIX requires 0 or 1 comparison operators per condition",
"POSIX requires all 3 parts of a for loop to be non-empty",
+ "POSIX requires a newline between a semicolon and a function definition",
#if BC_ENABLE_EXTRA_MATH
"POSIX does not allow exponential notation",
#else
diff --git a/tests/bc/all.txt b/tests/bc/all.txt
index 23244773b933..f85491d12424 100644
--- a/tests/bc/all.txt
+++ b/tests/bc/all.txt
@@ -43,6 +43,7 @@ misc4
misc5
misc6
misc7
+misc8
void
rand
recursive_arrays
diff --git a/tests/bc/misc8.txt b/tests/bc/misc8.txt
new file mode 100644
index 000000000000..8bef63316ef8
--- /dev/null
+++ b/tests/bc/misc8.txt
@@ -0,0 +1,8 @@
+define a(){
+ return 5
+}define b(){
+ return 6
+}
+24
+a()
+b()
diff --git a/tests/bc/misc8_results.txt b/tests/bc/misc8_results.txt
new file mode 100644
index 000000000000..daee0f1b2fbf
--- /dev/null
+++ b/tests/bc/misc8_results.txt
@@ -0,0 +1,3 @@
+24
+5
+6
diff --git a/tests/bc/posix_errors.txt b/tests/bc/posix_errors.txt
index d880600f7bb1..584a0198b5b3 100644
--- a/tests/bc/posix_errors.txt
+++ b/tests/bc/posix_errors.txt
@@ -7,6 +7,7 @@ halt
define x(e) { return 0; }
define x(e) { return 4*(e+e); }
define x(e) { return (e+e)*4; }
+define a() { return (5); };define b() { return (6); }
limits
.
if (q!=0) { x=3; } else { x=4; }