Changeset 9d8307a in mainline
- Timestamp:
- 2018-07-19T11:55:19Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 0d83cf6f
- Parents:
- 42f5860
- git-author:
- Jiri Svoboda <jiri@…> (2018-07-18 17:54:45)
- git-committer:
- Jiri Svoboda <jiri@…> (2018-07-19 11:55:19)
- Location:
- uspace/lib
- Files:
-
- 1 added
- 1 deleted
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/private/sstream.h
r42f5860 r9d8307a 39 39 40 40 extern void __sstream_init(const char *, FILE *); 41 extern const char *__sstream_getpos(FILE *); 41 42 42 43 #endif -
uspace/lib/c/generic/stdio/scanf.c
r42f5860 r9d8307a 46 46 #include <stdio.h> 47 47 #include <stdlib.h> 48 49 #include "../private/scanf.h" 48 50 49 51 typedef enum { … … 348 350 * @return EOK on success, ENOMEM if out of memory 349 351 */ 350 static int strbuf_init(strbuf_t *strbuf, cvtspec_t *spec, va_encaps_t *va)352 static errno_t strbuf_init(strbuf_t *strbuf, cvtspec_t *spec, va_encaps_t *va) 351 353 { 352 354 if (spec->noassign) { … … 393 395 * @return EOK on sucess, ENOMEM if out of memory 394 396 */ 395 static int strbuf_write(strbuf_t *strbuf, size_t idx, char c)397 static errno_t strbuf_write(strbuf_t *strbuf, size_t idx, char c) 396 398 { 397 399 if (strbuf->memalloc && idx >= strbuf->size) { … … 449 451 450 452 /* Skip whitespace in input stream */ 451 static int vfscanf_skip_ws(FILE *f, int *numchar)453 static errno_t vfscanf_skip_ws(FILE *f, int *numchar) 452 454 { 453 455 int c; … … 471 473 472 474 /* Match whitespace. */ 473 static int vfscanf_match_ws(FILE *f, int *numchar, const char **fmt)474 { 475 int rc;475 static errno_t vfscanf_match_ws(FILE *f, int *numchar, const char **fmt) 476 { 477 errno_t rc; 476 478 477 479 rc = vfscanf_skip_ws(f, numchar); … … 492 494 * @return EOK on success, EIO on I/O error, EINVAL if input is not valid 493 495 */ 494 static int __fstrtoimax(FILE *f, int *numchar, int base, size_t width,496 static errno_t __fstrtoimax(FILE *f, int *numchar, int base, size_t width, 495 497 intmax_t *dest) 496 498 { 499 errno_t rc; 497 500 int c; 498 501 intmax_t v; 499 502 int digit; 500 503 int sign; 504 505 rc = vfscanf_skip_ws(f, numchar); 506 if (rc == EIO) 507 return EIO; 501 508 502 509 c = __fgetc(f, numchar); … … 579 586 * @return EOK on success, EIO on I/O error, EINVAL if input is not valid 580 587 */ 581 static int __fstrtoumax(FILE *f, int *numchar, int base, size_t width,588 static errno_t __fstrtoumax(FILE *f, int *numchar, int base, size_t width, 582 589 uintmax_t *dest) 583 590 { 591 errno_t rc; 584 592 int c; 585 593 uintmax_t v; 586 594 int digit; 595 596 rc = vfscanf_skip_ws(f, numchar); 597 if (rc == EIO) 598 return EIO; 587 599 588 600 c = __fgetc(f, numchar); … … 653 665 * @return EOK on success, EIO on I/O error, EINVAL if input is not valid 654 666 */ 655 static int __fstrtold(FILE *f, int *numchar, size_t width, long double *dest) 656 { 667 errno_t __fstrtold(FILE *f, int *numchar, size_t width, 668 long double *dest) 669 { 670 errno_t rc; 657 671 int c; 658 672 long double v; … … 665 679 int exp; 666 680 int expsign; 681 682 rc = vfscanf_skip_ws(f, numchar); 683 if (rc == EIO) 684 return EIO; 667 685 668 686 c = __fgetc(f, numchar); … … 823 841 824 842 /* Read characters from stream */ 825 static int __fgetchars(FILE *f, int *numchar, size_t width, strbuf_t *strbuf,826 s ize_t *nread)843 static errno_t __fgetchars(FILE *f, int *numchar, size_t width, 844 strbuf_t *strbuf, size_t *nread) 827 845 { 828 846 size_t cnt; 829 847 int c; 830 int rc; 831 848 errno_t rc; 849 850 *nread = 0; 832 851 for (cnt = 0; cnt < width; cnt++) { 833 852 c = __fgetc(f, numchar); … … 849 868 850 869 /* Read non-whitespace string from stream */ 851 static int __fgetstr(FILE *f, int *numchar, size_t width, strbuf_t *strbuf,870 static errno_t __fgetstr(FILE *f, int *numchar, size_t width, strbuf_t *strbuf, 852 871 size_t *nread) 853 872 { 854 873 size_t cnt; 855 874 int c; 856 int rc; 857 int rc2; 875 errno_t rc; 876 errno_t rc2; 877 878 *nread = 0; 879 880 rc = vfscanf_skip_ws(f, numchar); 881 if (rc == EIO) 882 return EIO; 858 883 859 884 rc = EOK; … … 949 974 950 975 /* Read string of characters from scanset from stream */ 951 static int __fgetscanstr(FILE *f, int *numchar, size_t width,976 static errno_t __fgetscanstr(FILE *f, int *numchar, size_t width, 952 977 const char *scanset, strbuf_t *strbuf, size_t *nread) 953 978 { 954 979 size_t cnt; 955 980 int c; 956 int rc;957 int rc2;981 errno_t rc; 982 errno_t rc2; 958 983 959 984 rc = EOK; … … 990 1015 991 1016 /** Perform a single conversion. */ 992 static int vfscanf_cvt(FILE *f, const char **fmt, va_encaps_t *va,1017 static errno_t vfscanf_cvt(FILE *f, const char **fmt, va_encaps_t *va, 993 1018 int *numchar, unsigned *ncvt) 994 1019 { 995 int rc;1020 errno_t rc; 996 1021 int c; 997 1022 intmax_t ival; … … 1027 1052 cvtspec_parse(fmt, &cvtspec); 1028 1053 1029 if (cvtspec.spcr != cs_set && cvtspec.spcr != cs_char &&1030 cvtspec.spcr != cs_numchar) {1031 /* Skip whitespace */1032 rc = vfscanf_skip_ws(f, numchar);1033 if (rc == EIO)1034 return EIO;1035 1036 assert(rc == EOK);1037 }1038 1039 1054 width = cvtspec.have_width ? cvtspec.width : SIZE_MAX; 1040 1055 … … 1042 1057 case cs_percent: 1043 1058 /* Match % character */ 1059 rc = vfscanf_skip_ws(f, numchar); 1060 if (rc == EOF) 1061 return EIO; 1062 1044 1063 c = __fgetc(f, numchar); 1045 1064 if (c == EOF) -
uspace/lib/c/generic/stdio/sstream.c
r42f5860 r9d8307a 99 99 } 100 100 101 /** Return current string stream position. 102 * 103 * @param stream String stream 104 * @return Pointer into the backing string at the current position 105 */ 106 const char *__sstream_getpos(FILE *stream) 107 { 108 assert(stream->ops == &stdio_str_ops); 109 return (char *) stream->arg; 110 } 111 101 112 /** @} 102 113 */ -
uspace/lib/c/generic/stdlib.c
r42f5860 r9d8307a 38 38 #include <stdlib.h> 39 39 #include "private/libc.h" 40 #include "private/scanf.h" 40 41 #include "private/stdlib.h" 42 #include "private/stdio.h" 43 #include "private/sstream.h" 41 44 42 45 static int glbl_seed = 1; … … 48 51 static FIBRIL_MUTEX_INITIALIZE(quick_exit_handlers_lock); 49 52 53 /** Convert string to long double. 54 * 55 */ 56 long double strtold(const char *nptr, char **endptr) 57 { 58 int numchar; 59 long double ld; 60 errno_t rc; 61 FILE f; 62 63 numchar = 0; 64 __sstream_init(nptr, &f); 65 66 rc = __fstrtold(&f, &numchar, SIZE_MAX, &ld); 67 if (rc != EOK) { 68 ld = 0; 69 if (endptr != NULL) 70 *endptr = (char *) nptr; 71 errno = rc; 72 } else { 73 if (endptr != NULL) 74 *endptr = (char *) __sstream_getpos(&f); 75 } 76 77 return ld; 78 } 50 79 51 80 int rand(void) -
uspace/lib/c/include/stdlib.h
r42f5860 r9d8307a 78 78 #define MB_CUR_MAX 4 79 79 80 extern long double strtold(const char *, char **); 81 80 82 extern int rand(void); 81 83 extern void srand(unsigned int); -
uspace/lib/c/test/stdlib.c
r42f5860 r9d8307a 90 90 } 91 91 92 /** strtold function */ 93 #include <stdio.h> 94 PCUT_TEST(strtold) 95 { 96 long double ld; 97 const char *str = " \t4.2e1@"; 98 char *endptr; 99 100 ld = strtold(str, &endptr); 101 printf("ld=%.10lf\n", (double)ld); 102 PCUT_ASSERT_TRUE(ld == 42.0); 103 } 104 92 105 /** strtol function */ 93 106 PCUT_TEST(strtol) -
uspace/lib/posix/Makefile
r42f5860 r9d8307a 70 70 src/stdio.c \ 71 71 src/stdlib.c \ 72 src/stdlib/strtold.c \73 72 src/string.c \ 74 73 src/strings.c \ -
uspace/lib/posix/include/posix/stdlib.h
r42f5860 r9d8307a 52 52 extern float strtof(const char *__restrict__ nptr, char **__restrict__ endptr); 53 53 extern double strtod(const char *__restrict__ nptr, char **__restrict__ endptr); 54 extern long double strtold(const char *__restrict__ nptr, char **__restrict__ endptr);55 54 56 55 /* Temporary Files */
Note:
See TracChangeset
for help on using the changeset viewer.