*
* Sep 6, 2002
* Patch from Tero_Lyytikäinen <tero@paravant.fi> to fix bug in matchchar case.
+ *
+ * May 15, 2003
+ * Hopefully fix handling of 0 bytes with %s, %c, and %[ specifiers.
*/
#define _ISOC99_SOURCE /* for LLONG_MAX primarily... */
{
FILE string[1];
- string->filedes = -2; /* for debugging */
+ string->filedes = -2;
string->modeflags = (__FLAG_NARROW|__FLAG_READONLY);
string->bufstart = string->bufpos = (unsigned char *) ((void *) sp);
- string->bufgetc = (char *) ((unsigned) -1);
+ string->bufgetc = string->bufstart + strlen(sp);
#ifdef __STDIO_MBSTATE
__INIT_MBSTATE(&(string->state));
sc->width_flag = 1;
if (--sc->width < 0) {
sc->ungot_flag = 1;
- return 0;
+ return -1;
}
sc->ungot_flag = 0;
if (sc->ungot_char > 0) {
if (p-spec < 5) { /* [,c,s - string conversions */
invert = 0;
if (*p == 'c') {
- invert = 1;
+ invert = 0;
if (sc.width == INT_MAX) {
sc.width = 1;
}
b = buf;
}
cc = scan_getc(&sc);
- if (cc <= 0) {
+ if (cc < 0) {
scan_ungetc(&sc);
goto done; /* return EOF if cnt == 0 */
}
+ if (*p == 'c') {
+ goto c_spec;
+ }
i = 0;
- while ((cc>0) && (scanset[cc] != invert)) {
+ while ((cc>=0) && (scanset[cc] != invert)) {
+ c_spec:
i = 1; /* yes, we stored something */
*b = cc;
b += store;
* Also fix _stdio_fopen to support fdopen() with append specified when
* the underlying file didn't have O_APPEND set. It now sets the
* O_APPEND flag as recommended by SUSv3 and is done by glibc.
+ *
+ * May 15, 2003
+ * Modify __stdio_fread to deal with fake streams used by *sscanf.
+ * Set EOF to end of buffer when fmemopen used on a readonly stream.
+ * Note: I really need to run some tests on this to see what the
+ * glibc code does in each case.
*/
/* Before we include anything, convert L_ctermid to L_ctermid_function
if (fp != NULL) {
cookie->fp = fp;
+ if (fp->modeflags & __FLAG_READONLY) {
+ cookie->eof = len;
+ }
if ((fp->modeflags & __FLAG_APPEND) && (len > 0)) {
for (i = 0 ; i < len ; i++) {
if (cookie->buf[i] == 0) {
*p++ = *stream->bufpos++;
}
- if (bytes > 0) {
+ if ((bytes > 0) && (stream->filedes != -2)) {
ssize_t len;
/* The buffer is exhausted, but we still need chars. */