📄 t-scanf.c
字号:
else got_ret = (*fun) (data[i].input, fmt, got, &got_upto); break; case 2: case 3: got_d = -999L; if (ignore) got_ret = (*fun) (data[i].input, fmt, &got_upto, NULL); else got_ret = (*fun) (data[i].input, fmt, &got_d, &got_upto); mpf_set_d (got, got_d); break; default: ASSERT_ALWAYS (0); break; } MPF_CHECK_FORMAT (got); if (got_ret != want_ret) { printf ("%s wrong return value\n", name); error = 1; } if (want_ret == 1 && mpf_cmp (want, got) != 0) { printf ("%s wrong result\n", name); error = 1; } if (got_upto != want_upto) { printf ("%s wrong upto\n", name); error = 1; } if (got_ftell != -1 && want_ftell != -1 && got_ftell != want_ftell) { printf ("%s wrong ftell\n", name); error = 1; } if (error) { printf (" fmt \"%s\"\n", data[i].fmt); printf (" input \"%s\"\n", data[i].input); printf (" ret want=%d\n", want_ret); printf (" got =%d\n", got_ret); mpf_trace (" value want", want); mpf_trace (" got ", got); printf (" upto want=%d\n", want_upto); printf (" got =%d\n", got_upto); if (got_ftell != -1) { printf (" ftell want =%ld\n", want_ftell); printf (" got =%ld\n", got_ftell); } abort (); } } } mpf_clear (got); mpf_clear (want);}voidcheck_n (void){ int ret; /* %n suppressed */ { int n = 123; gmp_sscanf (" ", " %*n", &n); ASSERT_ALWAYS (n == 123); } { int n = 123; fromstring_gmp_fscanf (" ", " %*n", &n); ASSERT_ALWAYS (n == 123); }#define CHECK_N(type, string) \ do { \ type x[2]; \ char fmt[128]; \ int ret; \ \ x[0] = ~ (type) 0; \ x[1] = ~ (type) 0; \ sprintf (fmt, "abc%%%sn", string); \ ret = gmp_sscanf ("abc", fmt, &x[0]); \ \ ASSERT_ALWAYS (ret == 0); \ \ /* should write whole of x[0] and none of x[1] */ \ ASSERT_ALWAYS (x[0] == 3); \ ASSERT_ALWAYS (x[1] == (type) ~ (type) 0); \ \ } while (0) CHECK_N (char, "hh"); CHECK_N (long, "l");#if HAVE_LONG_LONG CHECK_N (long long, "L");#endif#if HAVE_INTMAX_T CHECK_N (intmax_t, "j");#endif#if HAVE_PTRDIFF_T CHECK_N (ptrdiff_t, "t");#endif CHECK_N (short, "h"); CHECK_N (size_t, "z"); /* %Zn */ { mpz_t x[2]; mpz_init_set_si (x[0], -987L); mpz_init_set_si (x[1], 654L); ret = gmp_sscanf ("xyz ", "xyz%Zn", x[0]); MPZ_CHECK_FORMAT (x[0]); MPZ_CHECK_FORMAT (x[1]); ASSERT_ALWAYS (ret == 0); ASSERT_ALWAYS (mpz_cmp_ui (x[0], 3L) == 0); ASSERT_ALWAYS (mpz_cmp_ui (x[1], 654L) == 0); mpz_clear (x[0]); mpz_clear (x[1]); } { mpz_t x; mpz_init (x); ret = fromstring_gmp_fscanf ("xyz ", "xyz%Zn", x); ASSERT_ALWAYS (ret == 0); ASSERT_ALWAYS (mpz_cmp_ui (x, 3L) == 0); mpz_clear (x); } /* %Qn */ { mpq_t x[2]; mpq_init (x[0]); mpq_init (x[1]); mpq_set_ui (x[0], -987L, 654L); mpq_set_ui (x[1], 4115L, 226L); ret = gmp_sscanf ("xyz ", "xyz%Qn", x[0]); MPQ_CHECK_FORMAT (x[0]); MPQ_CHECK_FORMAT (x[1]); ASSERT_ALWAYS (ret == 0); ASSERT_ALWAYS (mpq_cmp_ui (x[0], 3L, 1L) == 0); ASSERT_ALWAYS (mpq_cmp_ui (x[1], 4115L, 226L) == 0); mpq_clear (x[0]); mpq_clear (x[1]); } { mpq_t x; mpq_init (x); ret = fromstring_gmp_fscanf ("xyz ", "xyz%Qn", x); ASSERT_ALWAYS (ret == 0); ASSERT_ALWAYS (mpq_cmp_ui (x, 3L, 1L) == 0); mpq_clear (x); } /* %Fn */ { mpf_t x[2]; mpf_init (x[0]); mpf_init (x[1]); mpf_set_ui (x[0], -987L); mpf_set_ui (x[1], 654L); ret = gmp_sscanf ("xyz ", "xyz%Fn", x[0]); MPF_CHECK_FORMAT (x[0]); MPF_CHECK_FORMAT (x[1]); ASSERT_ALWAYS (ret == 0); ASSERT_ALWAYS (mpf_cmp_ui (x[0], 3L) == 0); ASSERT_ALWAYS (mpf_cmp_ui (x[1], 654L) == 0); mpf_clear (x[0]); mpf_clear (x[1]); } { mpf_t x; mpf_init (x); ret = fromstring_gmp_fscanf ("xyz ", "xyz%Fn", x); ASSERT_ALWAYS (ret == 0); ASSERT_ALWAYS (mpf_cmp_ui (x, 3L) == 0); mpf_clear (x); }}voidcheck_misc (void){ int ret, cmp; { int a=9, b=8, c=7, n=66; mpz_t z; mpz_init (z); ret = gmp_sscanf ("1 2 3 4", "%d %d %d %Zd%n", &a, &b, &c, z, &n); ASSERT_ALWAYS (ret == 4); ASSERT_ALWAYS (a == 1); ASSERT_ALWAYS (b == 2); ASSERT_ALWAYS (c == 3); ASSERT_ALWAYS (n == 7); ASSERT_ALWAYS (mpz_cmp_ui (z, 4L) == 0); mpz_clear (z); } { int a=9, b=8, c=7, n=66; mpz_t z; mpz_init (z); ret = fromstring_gmp_fscanf ("1 2 3 4", "%d %d %d %Zd%n", &a, &b, &c, z, &n); ASSERT_ALWAYS (ret == 4); ASSERT_ALWAYS (a == 1); ASSERT_ALWAYS (b == 2); ASSERT_ALWAYS (c == 3); ASSERT_ALWAYS (mpz_cmp_ui (z, 4L) == 0); ASSERT_ALWAYS (n == 7); ASSERT_ALWAYS (got_ftell == 7); mpz_clear (z); } { int a=9, n=8; mpz_t z; mpz_init (z); ret = gmp_sscanf ("1 2 3 4", "%d %*d %*d %Zd%n", &a, z, &n); ASSERT_ALWAYS (ret == 2); ASSERT_ALWAYS (a == 1); ASSERT_ALWAYS (mpz_cmp_ui (z, 4L) == 0); ASSERT_ALWAYS (n == 7); mpz_clear (z); } { int a=9, n=8; mpz_t z; mpz_init (z); ret = fromstring_gmp_fscanf ("1 2 3 4", "%d %*d %*d %Zd%n", &a, z, &n); ASSERT_ALWAYS (ret == 2); ASSERT_ALWAYS (a == 1); ASSERT_ALWAYS (mpz_cmp_ui (z, 4L) == 0); ASSERT_ALWAYS (n == 7); ASSERT_ALWAYS (got_ftell == 7); mpz_clear (z); } /* EOF for no matching */ { char buf[128]; ret = gmp_sscanf (" ", "%s", buf); ASSERT_ALWAYS (ret == EOF); ret = fromstring_gmp_fscanf (" ", "%s", buf); ASSERT_ALWAYS (ret == EOF); if (option_libc_scanf) { ret = sscanf (" ", "%s", buf); ASSERT_ALWAYS (ret == EOF); ret = fun_fscanf (" ", "%s", buf, NULL); ASSERT_ALWAYS (ret == EOF); } } /* suppressed field, then eof */ { int x; if (test_sscanf_eof_ok ()) { ret = gmp_sscanf ("123", "%*d%d", &x); ASSERT_ALWAYS (ret == EOF); } ret = fromstring_gmp_fscanf ("123", "%*d%d", &x); ASSERT_ALWAYS (ret == EOF); if (option_libc_scanf) { ret = sscanf ("123", "%*d%d", &x); ASSERT_ALWAYS (ret == EOF); ret = fun_fscanf ("123", "%*d%d", &x, NULL); ASSERT_ALWAYS (ret == EOF); } } { mpz_t x; mpz_init (x); ret = gmp_sscanf ("123", "%*Zd%Zd", x); ASSERT_ALWAYS (ret == EOF); ret = fromstring_gmp_fscanf ("123", "%*Zd%Zd", x); ASSERT_ALWAYS (ret == EOF); mpz_clear (x); } /* %[...], glibc only */#ifdef __GLIBC__ { char buf[128]; int n = -1; buf[0] = '\0'; ret = gmp_sscanf ("abcdefgh", "%[a-d]ef%n", buf, &n); ASSERT_ALWAYS (ret == 1); cmp = strcmp (buf, "abcd"); ASSERT_ALWAYS (cmp == 0); ASSERT_ALWAYS (n == 6); } { char buf[128]; int n = -1; buf[0] = '\0'; ret = gmp_sscanf ("xyza", "%[^a]a%n", buf, &n); ASSERT_ALWAYS (ret == 1); cmp = strcmp (buf, "xyz"); ASSERT_ALWAYS (cmp == 0); ASSERT_ALWAYS (n == 4); } { char buf[128]; int n = -1; buf[0] = '\0'; ret = gmp_sscanf ("ab]ab]", "%[]ab]%n", buf, &n); ASSERT_ALWAYS (ret == 1); cmp = strcmp (buf, "ab]ab]"); ASSERT_ALWAYS (cmp == 0); ASSERT_ALWAYS (n == 6); } { char buf[128]; int n = -1; buf[0] = '\0'; ret = gmp_sscanf ("xyzb", "%[^]ab]b%n", buf, &n); ASSERT_ALWAYS (ret == 1); cmp = strcmp (buf, "xyz"); ASSERT_ALWAYS (cmp == 0); ASSERT_ALWAYS (n == 4); }#endif /* %zd etc won't be accepted by sscanf on old systems, and running something to see if they work might be bad, so only try it on glibc, and only on a new enough version (glibc 2.0 doesn't have %zd) */#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 0) { mpz_t z; size_t s = -1; mpz_init (z); ret = gmp_sscanf ("456 789", "%zd %Zd", &s, z); ASSERT_ALWAYS (ret == 2); ASSERT_ALWAYS (s == 456); ASSERT_ALWAYS (mpz_cmp_ui (z, 789L) == 0); mpz_clear (z); } { mpz_t z; ptrdiff_t d = -1; mpz_init (z); ret = gmp_sscanf ("456 789", "%td %Zd", &d, z); ASSERT_ALWAYS (ret == 2); ASSERT_ALWAYS (d == 456); ASSERT_ALWAYS (mpz_cmp_ui (z, 789L) == 0); mpz_clear (z); } { mpz_t z; long long ll = -1; mpz_init (z); ret = gmp_sscanf ("456 789", "%Ld %Zd", &ll, z); ASSERT_ALWAYS (ret == 2); ASSERT_ALWAYS (ll == 456); ASSERT_ALWAYS (mpz_cmp_ui (z, 789L) == 0); mpz_clear (z); }#endif}intmain (int argc, char *argv[]){ if (argc > 1 && strcmp (argv[1], "-s") == 0) option_libc_scanf = 1; tests_start (); check_z (); check_q (); check_f (); check_n (); check_misc (); unlink (TEMPFILE); tests_end (); exit (0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -