|
Szabolcs Nagy |
93a5f6 |
// testing musl internal __pleval api used in dcngettext
|
|
Szabolcs Nagy |
93a5f6 |
#include <string.h>
|
|
Szabolcs Nagy |
93a5f6 |
#include "test.h"
|
|
Szabolcs Nagy |
93a5f6 |
|
|
Szabolcs Nagy |
93a5f6 |
unsigned long __pleval(const char *, unsigned long);
|
|
Szabolcs Nagy |
93a5f6 |
|
|
Szabolcs Nagy |
93a5f6 |
static void t(const char *s, unsigned long n, unsigned long want)
|
|
Szabolcs Nagy |
93a5f6 |
{
|
|
Szabolcs Nagy |
93a5f6 |
unsigned long got = __pleval(s, n);
|
|
Szabolcs Nagy |
93a5f6 |
if (got != want)
|
|
Szabolcs Nagy |
93a5f6 |
t_error("__pleval(\"%s\",%lu) failed: got %lu want %lu\n", s, n, got, want);
|
|
Szabolcs Nagy |
93a5f6 |
}
|
|
Szabolcs Nagy |
93a5f6 |
|
|
Szabolcs Nagy |
93a5f6 |
// evals the expr with the compiler: gettext plural rules follow c syntax
|
|
Szabolcs Nagy |
93a5f6 |
#define T(e) do { \
|
|
Szabolcs Nagy |
93a5f6 |
unsigned long n, _w; \
|
|
Szabolcs Nagy |
93a5f6 |
for (n=0; n<200; n++) { \
|
|
Szabolcs Nagy |
93a5f6 |
_w = e \
|
|
Szabolcs Nagy |
93a5f6 |
t(#e, n, _w); \
|
|
Szabolcs Nagy |
93a5f6 |
} \
|
|
Szabolcs Nagy |
93a5f6 |
} while(0)
|
|
Szabolcs Nagy |
93a5f6 |
|
|
Szabolcs Nagy |
93a5f6 |
int main()
|
|
Szabolcs Nagy |
93a5f6 |
{
|
|
Szabolcs Nagy |
93a5f6 |
char buf[210];
|
|
Szabolcs Nagy |
93a5f6 |
|
|
Szabolcs Nagy |
93a5f6 |
// recursion depth limit check
|
|
Szabolcs Nagy |
93a5f6 |
memset(buf, '!', 200);
|
|
Szabolcs Nagy |
93a5f6 |
memcpy(buf+200, "n;", 3);
|
|
Szabolcs Nagy |
93a5f6 |
t(buf, 7, -1);
|
|
Szabolcs Nagy |
93a5f6 |
|
|
Szabolcs Nagy |
93a5f6 |
memcpy(buf+51, "n;", 3);
|
|
Szabolcs Nagy |
93a5f6 |
t(buf, 3, 0);
|
|
Szabolcs Nagy |
93a5f6 |
t(buf, 0, 1);
|
|
Szabolcs Nagy |
93a5f6 |
memcpy(buf+50, "n;", 3);
|
|
Szabolcs Nagy |
93a5f6 |
t(buf, 3, 1);
|
|
Szabolcs Nagy |
93a5f6 |
t(buf, 0, 0);
|
|
Szabolcs Nagy |
93a5f6 |
|
|
Szabolcs Nagy |
93a5f6 |
// bad expr
|
|
Szabolcs Nagy |
93a5f6 |
t("!n n;", 1, -1);
|
|
Szabolcs Nagy |
93a5f6 |
t("32n;", 1, -1);
|
|
Szabolcs Nagy |
93a5f6 |
t("n/n;", 0, -1);
|
|
Szabolcs Nagy |
93a5f6 |
t("n*3-;", 1, -1);
|
|
Szabolcs Nagy |
93a5f6 |
t("4*;", 13, -1);
|
|
Szabolcs Nagy |
93a5f6 |
t("n?1:;", 13, -1);
|
|
Szabolcs Nagy |
93a5f6 |
|
|
Szabolcs Nagy |
93a5f6 |
// good expr
|
|
Szabolcs Nagy |
93a5f6 |
T(n % 4;);
|
|
Szabolcs Nagy |
93a5f6 |
T(n== 1 || n == 2 ||n%9==7;);
|
|
Szabolcs Nagy |
93a5f6 |
T((n==1)+!n+(n ==3););
|
|
Szabolcs Nagy |
93a5f6 |
T(n - 13 - 5 + n * 3 / 7 - 8;);
|
|
Szabolcs Nagy |
93a5f6 |
T(n+n>n==n-n
|
|
Szabolcs Nagy |
93a5f6 |
T((n<=3>=0)+n+n+n-n-n*1*1*1/1%12345678;);
|
|
Szabolcs Nagy |
93a5f6 |
T(5<6-4*n&&n%3==n-1;);
|
|
Szabolcs Nagy |
93a5f6 |
T(n%7&&n||0&&n-;;);
|
|
Szabolcs Nagy |
93a5f6 |
|
|
Szabolcs Nagy |
93a5f6 |
// the following plural rules are from
|
|
Szabolcs Nagy |
93a5f6 |
// http://localization-guide.readthedocs.org/en/latest/l10n/pluralforms.html
|
|
Szabolcs Nagy |
93a5f6 |
T(0;);
|
|
Szabolcs Nagy |
93a5f6 |
T((n > 1););
|
|
Szabolcs Nagy |
93a5f6 |
T((n != 1););
|
|
Szabolcs Nagy |
93a5f6 |
T((n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5););
|
|
Szabolcs Nagy |
93a5f6 |
T((n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2););
|
|
Szabolcs Nagy |
93a5f6 |
T((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;);
|
|
Szabolcs Nagy |
93a5f6 |
T((n==1) ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;);
|
|
Szabolcs Nagy |
93a5f6 |
T((n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2););
|
|
Szabolcs Nagy |
93a5f6 |
T((n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;);
|
|
Szabolcs Nagy |
93a5f6 |
T((n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2););
|
|
Szabolcs Nagy |
93a5f6 |
T((n==1) ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4;);
|
|
Szabolcs Nagy |
93a5f6 |
T((n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : (n > 2 && n < 20) ? 2 : 3;);
|
|
Szabolcs Nagy |
93a5f6 |
T((n%10!=1 || n%100==11););
|
|
Szabolcs Nagy |
93a5f6 |
T((n != 0););
|
|
Szabolcs Nagy |
93a5f6 |
T((n==1) ? 0 : (n==2) ? 1 : (n == 3) ? 2 : 3;);
|
|
Szabolcs Nagy |
93a5f6 |
T((n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2););
|
|
Szabolcs Nagy |
93a5f6 |
T((n==0 ? 0 : n==1 ? 1 : 2););
|
|
Szabolcs Nagy |
93a5f6 |
T((n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3););
|
|
Szabolcs Nagy |
93a5f6 |
T((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;);
|
|
Szabolcs Nagy |
93a5f6 |
T((n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0););
|
|
Szabolcs Nagy |
93a5f6 |
|
|
Szabolcs Nagy |
93a5f6 |
return t_status;
|
|
Szabolcs Nagy |
93a5f6 |
}
|