Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F142652185
D29007.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D29007.diff
View Options
Index: lib/libc/stdio/vsscanf.c
===================================================================
--- lib/libc/stdio/vsscanf.c
+++ lib/libc/stdio/vsscanf.c
@@ -48,15 +48,40 @@
#include "local.h"
#include "xlocale_private.h"
-static int
-eofread(void *, char *, int);
+struct _sscancookie {
+ FILE *fp;
+ const char *str;
+};
+
+static int _vsscanf_read(void *, char *, int);
+
+#ifndef VSSCANF_CHUNK_SIZE
+#define VSSCANF_CHUNK_SIZE 128
+#endif
/* ARGSUSED */
static int
-eofread(void *cookie, char *buf, int len)
+_vsscanf_read(void *cookie, char *buf, int len)
{
+ int n;
+ struct _sscancookie *sc;
+
+ sc = (struct _sscancookie *)cookie;
+
+ if (sc->str[0] == '\x00')
+ return (0);
- return (0);
+ n = strnlen(sc->str, VSSCANF_CHUNK_SIZE);
+
+ /*
+ * fp->_p is set in __srefill before calling us, this overwrites
+ * it so we don't have to copy the string into the buffer.
+ */
+ sc->fp->_p = (unsigned char *)sc->str;
+
+ sc->str += n;
+
+ return (n);
}
int
@@ -64,17 +89,25 @@
const char * __restrict fmt, __va_list ap)
{
FILE f = FAKE_FILE;
+ struct _sscancookie sc;
FIX_LOCALE(locale);
f._flags = __SRD;
f._bf._base = f._p = (unsigned char *)str;
- f._bf._size = f._r = strlen(str);
- f._read = eofread;
+ f._bf._size = f._r = strnlen(str, VSSCANF_CHUNK_SIZE);
+ f._read = _vsscanf_read;
+
+ sc = (struct _sscancookie){
+ .fp = &f,
+ .str = str + f._r,
+ };
+ f._cookie = ≻
+
return (__svfscanf(&f, locale, fmt, ap));
}
int
vsscanf(const char * __restrict str, const char * __restrict fmt,
__va_list ap)
{
- return vsscanf_l(str, __get_locale(), fmt, ap);
+ return (vsscanf_l(str, __get_locale(), fmt, ap));
}
Index: lib/libc/string/strnlen.c
===================================================================
--- lib/libc/string/strnlen.c
+++ lib/libc/string/strnlen.c
@@ -32,13 +32,14 @@
#include <string.h>
size_t
-strnlen(const char *s, size_t maxlen)
+strnlen(const char *ptr, size_t maxlen)
{
- size_t len;
+ const char *r;
- for (len = 0; len < maxlen; len++, s++) {
- if (!*s)
- break;
- }
- return (len);
+ r = memchr(ptr, '\0', maxlen);
+
+ if (r == NULL)
+ return (maxlen);
+
+ return (r - ptr);
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Jan 22, 9:33 PM (19 h, 40 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27863833
Default Alt Text
D29007.diff (2 KB)
Attached To
Mode
D29007: address a performance problem w/ partial sscanf on long strings...
Attached
Detach File
Event Timeline
Log In to Comment