Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* $OpenBSD: gcvt_test.c,v 1.5 2019/01/25 00:19:26 millert Exp $ */
- /*
- * Public domain, 2010, Todd C. Miller <millert@openbsd.org>
- *
- * Modified for my_fcvt() and my_gcvt()
- * by SASANO Takayoshi <uaa@cvs.openbsd.org>
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- static struct test_vector {
- double d;
- int ndig;
- } test_vectors[] = {
- /* adapted from perl's Configure test */
- { 0.1, 8, },
- { 0.01, 8, },
- { 0.001, 8, },
- { 0.0001, 8, },
- { 0.00009, 8, },
- { 1.0, 8, },
- { 1.1, 8, },
- { 1.01, 8, },
- { 1.001, 8, },
- { 1.0001, 8, },
- { 1.00001, 8, },
- { 1.0, 8, },
- { 0.0, 8, },
- { -1.0, 8, },
- { 100000, 8, },
- { -100000, 8, },
- { 123.456, 8, },
- { 1e34, 8, },
- /* adapted from emx */
- { 0.0, -1, },
- { 0.0, 0, },
- { 0.0, 1, },
- { 0.0, 2, },
- { 1.0, -1, },
- { 1.0, 0, },
- { 1.0, 2, },
- { 1.0, 10, },
- { 1.236, -1, },
- { 1.236, 0, },
- { 1.236, 1, },
- { 1.236, 2, },
- { 1.236, 3, },
- { 1.236, 4, },
- { 1.236, 5, },
- { 1.236, 6, },
- { 12.36, -1, },
- { 12.36, 0, },
- { 12.36, 1, },
- { 12.36, 2, },
- { 12.36, 3, },
- { 12.36, 4, },
- { 12.36, 5, },
- { 12.36, 6, },
- { 123.6, -1, },
- { 123.6, 0, },
- { 123.6, 1, },
- { 123.6, 2, },
- { 123.6, 3, },
- { 123.6, 4, },
- { 123.6, 5, },
- { 123.6, 6, },
- { 1236, -1, },
- { 1236.0, 0, },
- { 1236.0, 1, },
- { 1236.0, 2, },
- { 1236.0, 3, },
- { 1236.0, 4, },
- { 1236.0, 5, },
- { 1236.0, 6, },
- { 1e100, 10, },
- { 1e100, 20, },
- { 0.01236, -1, },
- { 0.01236, 0, },
- { 0.01236, 1, },
- { 0.01236, 2, },
- { 0.01236, 3, },
- { 0.01236, 4, },
- { 1e-100, 20, },
- { 1e-100, -1, },
- { -1.2, 5, },
- { -0.03, 5, },
- { 0.1, 1, },
- { 0.1, 0, },
- { 0.099999, 10, },
- { 0.99999, 10, },
- };
- #define NTESTVEC (sizeof(test_vectors) / sizeof(test_vectors[0]))
- char *my_gcvt(double value, int ndigit, char *buf)
- {
- sprintf(buf, "%.*g", ndigit, value);
- return buf;
- }
- char *my_fcvt(double value, int ndigit, int *decpt, int *sign)
- {
- #define FCVT_BUFFER_SIZE 512
- int m, n, s;
- static char buf[FCVT_BUFFER_SIZE];
- char tmp[FCVT_BUFFER_SIZE], *p = tmp, *q;
- s = m = n = 0;
- if (ndigit == 0) {
- *p = '\0';
- } else if (ndigit > 0) {
- snprintf(tmp, sizeof(tmp), "%#+.*f", ndigit, value);
- s = (*p == '-');
- p++;
- if (value == 0.0f) {
- p += 2;
- } else if (*p == '0') {
- p += 2;
- for (n = 0; *p == '0'; p++, n--);
- } else {
- q = strchr(p, '.');
- m = q - p;
- memcpy(buf, p, m);
- p += m + 1;
- }
- } else {
- // XXX ndigit < 0 not supported
- return NULL;
- }
- if (sign != NULL) *sign = s;
- if (decpt != NULL) *decpt = m + n;
- strcpy(buf + m, p);
- return buf;
- }
- static int
- dotest_gcvt(struct test_vector *tv)
- {
- char buf0[256], buf1[256];
- gcvt(tv->d, tv->ndig, buf0);
- my_gcvt(tv->d, tv->ndig, buf1);
- if (strcmp(buf0, buf1)) {
- fprintf(stderr, "%g @ %d: expected %s got %s\n",
- tv->d, tv->ndig, buf0, buf1);
- return 1;
- }
- return 0;
- }
- static int
- dotest_fcvt(struct test_vector *tv)
- {
- char *p, buf0[256], buf1[256];
- int decpt0, decpt1, sign0, sign1;
- decpt0 = sign0 = 0;
- memset(buf0, 0, sizeof(buf0));
- p = fcvt(tv->d, tv->ndig, &decpt0, &sign0);
- if (p != NULL)
- strcpy(buf0, p);
- decpt1 = sign1 = 0;
- memset(buf1, 0, sizeof(buf1));
- p = my_fcvt(tv->d, tv->ndig, &decpt1, &sign1);
- if (p != NULL)
- strcpy(buf1, p);
- if (strcmp(buf0, buf1) || decpt0 != decpt1 || sign0 != sign1) {
- fprintf(stderr, "%g @ %d: expected %s %d %d got %s %d %d\n",
- tv->d, tv->ndig,
- buf0, decpt0, sign0, buf1, decpt1, sign1);
- return 1;
- }
- return 0;
- }
- int
- main(int argc, char *argv[])
- {
- int i, failures = 0;
- for (i = 0; i < NTESTVEC; i++) {
- failures += dotest_gcvt(&test_vectors[i]);
- }
- for (i = 0; i < NTESTVEC; i++) {
- failures += dotest_fcvt(&test_vectors[i]);
- }
- return failures;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement