add "scan helper getc" and rework strtod, etc. to use it
the immediate benefit is a significant debloating of the float parsing code by moving the responsibility for keeping track of the number of characters read to a different module. by linking shgetc with the stdio buffer logic, counting logic is defered to buffer refill time, keeping the calls to shgetc fast and light. in the future, shgetc will also be useful for integrating the new float code with scanf, which needs to not only count the characters consumed, but also limit the number of characters read based on field width specifiers. shgetc may also become a useful tool for simplifying the integer parsing code.
This commit is contained in:
parent
4fb6aa02c8
commit
2162541f38
6 changed files with 115 additions and 75 deletions
|
|
@ -1,4 +1,5 @@
|
|||
#include <stdlib.h>
|
||||
#include "shgetc.h"
|
||||
#include "floatscan.h"
|
||||
#include "stdio_impl.h"
|
||||
|
||||
|
|
@ -10,8 +11,9 @@ static long double strtox(const char *s, char **p, int prec)
|
|||
.buf = (void *)t, .rpos = (void *)t,
|
||||
.rend = (void *)-1, .lock = -1
|
||||
};
|
||||
off_t cnt;
|
||||
long double y = __floatscan(&f, -1, prec, 1, &cnt);
|
||||
shlim(&f, 0);
|
||||
long double y = __floatscan(&f, -1, prec, 1);
|
||||
off_t cnt = shcnt(&f);
|
||||
if (p) *p = cnt ? t + cnt : (char *)s;
|
||||
return y;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue