github.com/aergoio/aergo@v1.3.1/libtool/src/gmp-6.1.2/tests/mpf/t-inp_str.c (about) 1 /* Test mpf_inp_str. 2 3 Copyright 2001, 2002 Free Software Foundation, Inc. 4 5 This file is part of the GNU MP Library test suite. 6 7 The GNU MP Library test suite is free software; you can redistribute it 8 and/or modify it under the terms of the GNU General Public License as 9 published by the Free Software Foundation; either version 3 of the License, 10 or (at your option) any later version. 11 12 The GNU MP Library test suite is distributed in the hope that it will be 13 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 15 Public License for more details. 16 17 You should have received a copy of the GNU General Public License along with 18 the GNU MP Library test suite. If not, see https://www.gnu.org/licenses/. */ 19 20 #include "config.h" 21 22 #include <stdio.h> 23 #include <stdlib.h> 24 #include <string.h> 25 #if HAVE_UNISTD_H 26 #include <unistd.h> /* for unlink */ 27 #endif 28 29 #include "gmp.h" 30 #include "gmp-impl.h" 31 #include "tests.h" 32 33 34 #define FILENAME "t-inp_str.tmp" 35 36 37 void 38 check_data (void) 39 { 40 static const struct { 41 const char *inp; 42 int base; 43 const char *want; 44 int want_nread; 45 46 } data[] = { 47 48 { "0", 10, "0", 1 }, 49 50 { "abc", 10, "0", 0 }, 51 { "ghi", 16, "0", 0 }, 52 53 { "125", 10, "125", 3 }, 54 { "125e1", 10, "1250", 5 }, 55 { "12e+2", 10, "1200", 5 }, 56 { "125e-1", 10, "12.5", 6 }, 57 58 { "ff", 16, "255", 2 }, 59 { "-ff", 16, "-255", 3 }, 60 { "FF", 16, "255", 2 }, 61 { "-FF", 16, "-255", 3 }, 62 63 { "100", 16, "256", 3 }, 64 { "100@1", 16, "4096", 5 }, 65 { "100@10", 16, "4722366482869645213696", 6 }, 66 { "100@10", -16, "281474976710656", 6 }, 67 { "100@-1", 16, "16", 6 }, 68 { "10000000000000000@-10", 16, "1", 21 }, 69 { "10000000000@-10", -16, "1", 15 }, 70 71 { "z", 36, "35", 1 }, 72 { "Z", 36, "35", 1 }, 73 { "z@1", 36, "1260", 3 }, 74 { "Z@1", 36, "1260", 3 }, 75 76 { "0", 0, "0", 1 }, 77 }; 78 79 mpf_t got, want; 80 long ftell_nread; 81 int i, pre, post, j, got_nread, want_nread; 82 FILE *fp; 83 84 mpf_init (got); 85 mpf_init (want); 86 87 for (i = 0; i < numberof (data); i++) 88 { 89 for (pre = 0; pre <= 3; pre++) 90 { 91 for (post = 0; post <= 2; post++) 92 { 93 mpf_set_str_or_abort (want, data[i].want, 10); 94 MPF_CHECK_FORMAT (want); 95 96 /* create the file new each time to ensure its length is what 97 we want */ 98 fp = fopen (FILENAME, "w+"); 99 ASSERT_ALWAYS (fp != NULL); 100 for (j = 0; j < pre; j++) 101 putc (' ', fp); 102 fputs (data[i].inp, fp); 103 for (j = 0; j < post; j++) 104 putc (' ', fp); 105 fflush (fp); 106 ASSERT_ALWAYS (! ferror(fp)); 107 108 rewind (fp); 109 got_nread = mpf_inp_str (got, fp, data[i].base); 110 111 if (got_nread != 0) 112 { 113 ftell_nread = ftell (fp); 114 if (got_nread != ftell_nread) 115 { 116 printf ("mpf_inp_str nread wrong\n"); 117 printf (" inp \"%s\"\n", data[i].inp); 118 printf (" base %d\n", data[i].base); 119 printf (" pre %d\n", pre); 120 printf (" post %d\n", post); 121 printf (" got_nread %d\n", got_nread); 122 printf (" ftell_nread %ld\n", ftell_nread); 123 abort (); 124 } 125 } 126 127 /* if data[i].inp is a whole string to read and there's no post 128 whitespace then expect to have EOF */ 129 if (post == 0 && data[i].want_nread == strlen(data[i].inp)) 130 { 131 int c = getc(fp); 132 if (c != EOF) 133 { 134 printf ("mpf_inp_str didn't read to EOF\n"); 135 printf (" inp \"%s\"\n", data[i].inp); 136 printf (" base %d\n", data[i].base); 137 printf (" pre %d\n", pre); 138 printf (" post %d\n", post); 139 printf (" c '%c' %#x\n", c, c); 140 abort (); 141 } 142 } 143 144 /* only expect "pre" included in the count when non-zero */ 145 want_nread = data[i].want_nread; 146 if (want_nread != 0) 147 want_nread += pre; 148 149 if (got_nread != want_nread) 150 { 151 printf ("mpf_inp_str nread wrong\n"); 152 printf (" inp \"%s\"\n", data[i].inp); 153 printf (" base %d\n", data[i].base); 154 printf (" pre %d\n", pre); 155 printf (" post %d\n", post); 156 printf (" got_nread %d\n", got_nread); 157 printf (" want_nread %d\n", want_nread); 158 abort (); 159 } 160 161 MPF_CHECK_FORMAT (got); 162 163 if (mpf_cmp (got, want) != 0) 164 { 165 printf ("mpf_inp_str wrong result\n"); 166 printf (" inp \"%s\"\n", data[i].inp); 167 printf (" base %d\n", data[i].base); 168 mpf_trace (" got ", got); 169 mpf_trace (" want", want); 170 abort (); 171 } 172 173 ASSERT_ALWAYS (fclose (fp) == 0); 174 } 175 } 176 } 177 178 mpf_clear (got); 179 mpf_clear (want); 180 } 181 182 int 183 main (void) 184 { 185 tests_start (); 186 187 check_data (); 188 189 unlink (FILENAME); 190 tests_end (); 191 exit (0); 192 }