OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-src/] [newlib-1.18.0/] [newlib-1.18.0-or32-1.0rc2/] [newlib/] [libc/] [stdio/] [vfwscanf.c] - Diff between revs 207 and 520

Only display areas with differences | Details | Blame | View Log

Rev 207 Rev 520
/*-
/*-
 * Copyright (c) 1990 The Regents of the University of California.
 * Copyright (c) 1990 The Regents of the University of California.
 * All rights reserved.
 * All rights reserved.
 *
 *
 * Redistribution and use in source and binary forms are permitted
 * Redistribution and use in source and binary forms are permitted
 * provided that the above copyright notice and this paragraph are
 * provided that the above copyright notice and this paragraph are
 * duplicated in all such forms and that any documentation,
 * duplicated in all such forms and that any documentation,
 * advertising materials, and other materials related to such
 * advertising materials, and other materials related to such
 * distribution and use acknowledge that the software was developed
 * distribution and use acknowledge that the software was developed
 * by the University of California, Berkeley.  The name of the
 * by the University of California, Berkeley.  The name of the
 * University may not be used to endorse or promote products derived
 * University may not be used to endorse or promote products derived
 * from this software without specific prior written permission.
 * from this software without specific prior written permission.
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 */
 */
 
 
/*
/*
FUNCTION
FUNCTION
<<vfwscanf>>, <<vwscanf>>, <<vswscanf>>---scan and format argument list from wide character input
<<vfwscanf>>, <<vwscanf>>, <<vswscanf>>---scan and format argument list from wide character input
 
 
INDEX
INDEX
        vfwscanf
        vfwscanf
INDEX
INDEX
        _vfwscanf
        _vfwscanf
INDEX
INDEX
        vwscanf
        vwscanf
INDEX
INDEX
        _vwscanf
        _vwscanf
INDEX
INDEX
        vswscanf
        vswscanf
INDEX
INDEX
        _vswscanf
        _vswscanf
 
 
ANSI_SYNOPSIS
ANSI_SYNOPSIS
        #include <stdio.h>
        #include <stdio.h>
        #include <stdarg.h>
        #include <stdarg.h>
        int vwscanf(const wchar_t *<[fmt]>, va_list <[list]>);
        int vwscanf(const wchar_t *<[fmt]>, va_list <[list]>);
        int vfwscanf(FILE *<[fp]>, const wchar_t *<[fmt]>, va_list <[list]>);
        int vfwscanf(FILE *<[fp]>, const wchar_t *<[fmt]>, va_list <[list]>);
        int vswscanf(const wchar_t *<[str]>, const wchar_t *<[fmt]>, va_list <[list]>);
        int vswscanf(const wchar_t *<[str]>, const wchar_t *<[fmt]>, va_list <[list]>);
 
 
        int _vwscanf(struct _reent *<[reent]>, const wchar_t *<[fmt]>,
        int _vwscanf(struct _reent *<[reent]>, const wchar_t *<[fmt]>,
                       va_list <[list]>);
                       va_list <[list]>);
        int _vfwscanf(struct _reent *<[reent]>, FILE *<[fp]>, const wchar_t *<[fmt]>,
        int _vfwscanf(struct _reent *<[reent]>, FILE *<[fp]>, const wchar_t *<[fmt]>,
                       va_list <[list]>);
                       va_list <[list]>);
        int _vswscanf(struct _reent *<[reent]>, const wchar_t *<[str]>,
        int _vswscanf(struct _reent *<[reent]>, const wchar_t *<[str]>,
                       const wchar_t *<[fmt]>, va_list <[list]>);
                       const wchar_t *<[fmt]>, va_list <[list]>);
 
 
TRAD_SYNOPSIS
TRAD_SYNOPSIS
        #include <stdio.h>
        #include <stdio.h>
        #include <varargs.h>
        #include <varargs.h>
        int vwscanf( <[fmt]>, <[ist]>)
        int vwscanf( <[fmt]>, <[ist]>)
        wchar_t *<[fmt]>;
        wchar_t *<[fmt]>;
        va_list <[list]>;
        va_list <[list]>;
 
 
        int vfwscanf( <[fp]>, <[fmt]>, <[list]>)
        int vfwscanf( <[fp]>, <[fmt]>, <[list]>)
        FILE *<[fp]>;
        FILE *<[fp]>;
        wchar_t *<[fmt]>;
        wchar_t *<[fmt]>;
        va_list <[list]>;
        va_list <[list]>;
 
 
        int vswscanf( <[str]>, <[fmt]>, <[list]>)
        int vswscanf( <[str]>, <[fmt]>, <[list]>)
        wchar_t *<[str]>;
        wchar_t *<[str]>;
        wchar_t *<[fmt]>;
        wchar_t *<[fmt]>;
        va_list <[list]>;
        va_list <[list]>;
 
 
        int _vwscanf( <[reent]>, <[fmt]>, <[ist]>)
        int _vwscanf( <[reent]>, <[fmt]>, <[ist]>)
        struct _reent *<[reent]>;
        struct _reent *<[reent]>;
        wchar_t *<[fmt]>;
        wchar_t *<[fmt]>;
        va_list <[list]>;
        va_list <[list]>;
 
 
        int _vfwscanf( <[reent]>, <[fp]>, <[fmt]>, <[list]>)
        int _vfwscanf( <[reent]>, <[fp]>, <[fmt]>, <[list]>)
        struct _reent *<[reent]>;
        struct _reent *<[reent]>;
        FILE *<[fp]>;
        FILE *<[fp]>;
        wchar_t *<[fmt]>;
        wchar_t *<[fmt]>;
        va_list <[list]>;
        va_list <[list]>;
 
 
        int _vswscanf( <[reent]>, <[str]>, <[fmt]>, <[list]>)
        int _vswscanf( <[reent]>, <[str]>, <[fmt]>, <[list]>)
        struct _reent *<[reent]>;
        struct _reent *<[reent]>;
        wchar_t *<[str]>;
        wchar_t *<[str]>;
        wchar_t *<[fmt]>;
        wchar_t *<[fmt]>;
        va_list <[list]>;
        va_list <[list]>;
 
 
DESCRIPTION
DESCRIPTION
<<vwscanf>>, <<vfwscanf>>, and <<vswscanf>> are (respectively) variants
<<vwscanf>>, <<vfwscanf>>, and <<vswscanf>> are (respectively) variants
of <<wscanf>>, <<fwscanf>>, and <<swscanf>>.  They differ only in
of <<wscanf>>, <<fwscanf>>, and <<swscanf>>.  They differ only in
allowing their caller to pass the variable argument list as a
allowing their caller to pass the variable argument list as a
<<va_list>> object (initialized by <<va_start>>) rather than
<<va_list>> object (initialized by <<va_start>>) rather than
directly accepting a variable number of arguments.
directly accepting a variable number of arguments.
 
 
RETURNS
RETURNS
The return values are consistent with the corresponding functions:
The return values are consistent with the corresponding functions:
<<vwscanf>> returns the number of input fields successfully scanned,
<<vwscanf>> returns the number of input fields successfully scanned,
converted, and stored; the return value does not include scanned
converted, and stored; the return value does not include scanned
fields which were not stored.
fields which were not stored.
 
 
If <<vwscanf>> attempts to read at end-of-file, the return value
If <<vwscanf>> attempts to read at end-of-file, the return value
is <<EOF>>.
is <<EOF>>.
 
 
If no fields were stored, the return value is <<0>>.
If no fields were stored, the return value is <<0>>.
 
 
The routines <<_vwscanf>>, <<_vfwscanf>>, and <<_vswscanf>> are
The routines <<_vwscanf>>, <<_vfwscanf>>, and <<_vswscanf>> are
reentrant versions which take an additional first parameter which points
reentrant versions which take an additional first parameter which points
to the reentrancy structure.
to the reentrancy structure.
 
 
PORTABILITY
PORTABILITY
C99, POSIX-1.2008
C99, POSIX-1.2008
*/
*/
 
 
#include <_ansi.h>
#include <_ansi.h>
#include <reent.h>
#include <reent.h>
#include <newlib.h>
#include <newlib.h>
#include <ctype.h>
#include <ctype.h>
#include <wctype.h>
#include <wctype.h>
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdint.h>
#include <limits.h>
#include <limits.h>
#include <wchar.h>
#include <wchar.h>
#include <string.h>
#include <string.h>
#include <stdarg.h>
#include <stdarg.h>
#include <errno.h>
#include <errno.h>
#include "local.h"
#include "local.h"
 
 
#ifdef INTEGER_ONLY
#ifdef INTEGER_ONLY
#define VFWSCANF vfiwscanf
#define VFWSCANF vfiwscanf
#define _VFWSCANF_R _vfiwscanf_r
#define _VFWSCANF_R _vfiwscanf_r
#define __SVFWSCANF __svfiwscanf
#define __SVFWSCANF __svfiwscanf
#ifdef STRING_ONLY
#ifdef STRING_ONLY
#  define __SVFWSCANF_R __ssvfiwscanf_r
#  define __SVFWSCANF_R __ssvfiwscanf_r
#else
#else
#  define __SVFWSCANF_R __svfiwscanf_r
#  define __SVFWSCANF_R __svfiwscanf_r
#endif
#endif
#else
#else
#define VFWSCANF vfwscanf
#define VFWSCANF vfwscanf
#define _VFWSCANF_R _vfwscanf_r
#define _VFWSCANF_R _vfwscanf_r
#define __SVFWSCANF __svfwscanf
#define __SVFWSCANF __svfwscanf
#ifdef STRING_ONLY
#ifdef STRING_ONLY
#  define __SVFWSCANF_R __ssvfwscanf_r
#  define __SVFWSCANF_R __ssvfwscanf_r
#else
#else
#  define __SVFWSCANF_R __svfwscanf_r
#  define __SVFWSCANF_R __svfwscanf_r
#endif
#endif
#ifndef NO_FLOATING_POINT
#ifndef NO_FLOATING_POINT
#define FLOATING_POINT
#define FLOATING_POINT
#endif
#endif
#endif
#endif
 
 
#ifdef STRING_ONLY
#ifdef STRING_ONLY
#undef _flockfile
#undef _flockfile
#undef _funlockfile
#undef _funlockfile
#define _flockfile(x) {}
#define _flockfile(x) {}
#define _funlockfile(x) {}
#define _funlockfile(x) {}
#define _ungetwc_r _sungetwc_r
#define _ungetwc_r _sungetwc_r
#define __srefill_r __ssrefill_r
#define __srefill_r __ssrefill_r
#define _fgetwc_r _sfgetwc_r
#define _fgetwc_r _sfgetwc_r
#endif
#endif
 
 
#ifdef FLOATING_POINT
#ifdef FLOATING_POINT
#include <math.h>
#include <math.h>
#include <float.h>
#include <float.h>
 
 
/* Currently a test is made to see if long double processing is warranted.
/* Currently a test is made to see if long double processing is warranted.
   This could be changed in the future should the _ldtoa_r code be
   This could be changed in the future should the _ldtoa_r code be
   preferred over _dtoa_r.  */
   preferred over _dtoa_r.  */
#define _NO_LONGDBL
#define _NO_LONGDBL
#if defined _WANT_IO_LONG_DOUBLE && (LDBL_MANT_DIG > DBL_MANT_DIG)
#if defined _WANT_IO_LONG_DOUBLE && (LDBL_MANT_DIG > DBL_MANT_DIG)
#undef _NO_LONGDBL
#undef _NO_LONGDBL
extern _LONG_DOUBLE _wcstold_r _PARAMS((wchar_t *s, wchar_t **sptr));
extern _LONG_DOUBLE _wcstold_r _PARAMS((wchar_t *s, wchar_t **sptr));
#endif
#endif
 
 
#include "floatio.h"
#include "floatio.h"
 
 
#if ((MAXEXP+MAXFRACT+3) > MB_LEN_MAX)
#if ((MAXEXP+MAXFRACT+3) > MB_LEN_MAX)
#  define BUF (MAXEXP+MAXFRACT+3)        /* 3 = sign + decimal point + NUL */
#  define BUF (MAXEXP+MAXFRACT+3)        /* 3 = sign + decimal point + NUL */
#else
#else
#  define BUF MB_LEN_MAX
#  define BUF MB_LEN_MAX
#endif
#endif
 
 
/* An upper bound for how long a long prints in decimal.  4 / 13 approximates
/* An upper bound for how long a long prints in decimal.  4 / 13 approximates
   log (2).  Add one char for roundoff compensation and one for the sign.  */
   log (2).  Add one char for roundoff compensation and one for the sign.  */
#define MAX_LONG_LEN ((CHAR_BIT * sizeof (long)  - 1) * 4 / 13 + 2)
#define MAX_LONG_LEN ((CHAR_BIT * sizeof (long)  - 1) * 4 / 13 + 2)
#else
#else
#define BUF     40
#define BUF     40
#endif
#endif
 
 
#define _NO_LONGLONG
#define _NO_LONGLONG
#if defined _WANT_IO_LONG_LONG \
#if defined _WANT_IO_LONG_LONG \
        && (defined __GNUC__ || __STDC_VERSION__ >= 199901L)
        && (defined __GNUC__ || __STDC_VERSION__ >= 199901L)
# undef _NO_LONGLONG
# undef _NO_LONGLONG
#endif
#endif
 
 
#define _NO_POS_ARGS
#define _NO_POS_ARGS
#ifdef _WANT_IO_POS_ARGS
#ifdef _WANT_IO_POS_ARGS
# undef _NO_POS_ARGS
# undef _NO_POS_ARGS
# ifdef NL_ARGMAX
# ifdef NL_ARGMAX
#  define MAX_POS_ARGS NL_ARGMAX
#  define MAX_POS_ARGS NL_ARGMAX
# else
# else
#  define MAX_POS_ARGS 32
#  define MAX_POS_ARGS 32
# endif
# endif
 
 
static void * get_arg (int, va_list *, int *, void **);
static void * get_arg (int, va_list *, int *, void **);
#endif /* _WANT_IO_POS_ARGS */
#endif /* _WANT_IO_POS_ARGS */
 
 
/*
/*
 * Flags used during conversion.
 * Flags used during conversion.
 */
 */
 
 
#define LONG            0x01    /* l: long or double */
#define LONG            0x01    /* l: long or double */
#define LONGDBL         0x02    /* L/ll: long double or long long */
#define LONGDBL         0x02    /* L/ll: long double or long long */
#define SHORT           0x04    /* h: short */
#define SHORT           0x04    /* h: short */
#define CHAR            0x08    /* hh: 8 bit integer */
#define CHAR            0x08    /* hh: 8 bit integer */
#define SUPPRESS        0x10    /* suppress assignment */
#define SUPPRESS        0x10    /* suppress assignment */
#define POINTER         0x20    /* weird %p pointer (`fake hex') */
#define POINTER         0x20    /* weird %p pointer (`fake hex') */
#define NOSKIP          0x40    /* do not skip blanks */
#define NOSKIP          0x40    /* do not skip blanks */
 
 
/*
/*
 * The following are used in numeric conversions only:
 * The following are used in numeric conversions only:
 * SIGNOK, NDIGITS, DPTOK, and EXPOK are for floating point;
 * SIGNOK, NDIGITS, DPTOK, and EXPOK are for floating point;
 * SIGNOK, NDIGITS, PFXOK, and NZDIGITS are for integral.
 * SIGNOK, NDIGITS, PFXOK, and NZDIGITS are for integral.
 */
 */
 
 
#define SIGNOK          0x80    /* +/- is (still) legal */
#define SIGNOK          0x80    /* +/- is (still) legal */
#define NDIGITS         0x100   /* no digits detected */
#define NDIGITS         0x100   /* no digits detected */
 
 
#define DPTOK           0x200   /* (float) decimal point is still legal */
#define DPTOK           0x200   /* (float) decimal point is still legal */
#define EXPOK           0x400   /* (float) exponent (e+3, etc) still legal */
#define EXPOK           0x400   /* (float) exponent (e+3, etc) still legal */
 
 
#define PFXOK           0x200   /* 0x prefix is (still) legal */
#define PFXOK           0x200   /* 0x prefix is (still) legal */
#define NZDIGITS        0x400   /* no zero digits detected */
#define NZDIGITS        0x400   /* no zero digits detected */
#define HAVESIGN        0x10000 /* sign detected */
#define HAVESIGN        0x10000 /* sign detected */
 
 
/*
/*
 * Conversion types.
 * Conversion types.
 */
 */
 
 
#define CT_CHAR         0        /* %c conversion */
#define CT_CHAR         0        /* %c conversion */
#define CT_CCL          1       /* %[...] conversion */
#define CT_CCL          1       /* %[...] conversion */
#define CT_STRING       2       /* %s conversion */
#define CT_STRING       2       /* %s conversion */
#define CT_INT          3       /* integer, i.e., wcstol or wcstoul */
#define CT_INT          3       /* integer, i.e., wcstol or wcstoul */
#define CT_FLOAT        4       /* floating, i.e., wcstod */
#define CT_FLOAT        4       /* floating, i.e., wcstod */
 
 
#define INCCL(_c)       \
#define INCCL(_c)       \
        (cclcompl ? (wmemchr(ccls, (_c), ccle - ccls) == NULL) : \
        (cclcompl ? (wmemchr(ccls, (_c), ccle - ccls) == NULL) : \
        (wmemchr(ccls, (_c), ccle - ccls) != NULL))
        (wmemchr(ccls, (_c), ccle - ccls) != NULL))
 
 
/*
/*
 * vfwscanf
 * vfwscanf
 */
 */
 
 
#ifndef STRING_ONLY
#ifndef STRING_ONLY
 
 
#ifndef _REENT_ONLY
#ifndef _REENT_ONLY
 
 
int
int
_DEFUN(VFWSCANF, (fp, fmt, ap),
_DEFUN(VFWSCANF, (fp, fmt, ap),
       register FILE *fp _AND
       register FILE *fp _AND
       _CONST wchar_t *fmt _AND
       _CONST wchar_t *fmt _AND
       va_list ap)
       va_list ap)
{
{
  CHECK_INIT(_REENT, fp);
  CHECK_INIT(_REENT, fp);
  return __SVFWSCANF_R (_REENT, fp, fmt, ap);
  return __SVFWSCANF_R (_REENT, fp, fmt, ap);
}
}
 
 
int
int
_DEFUN(__SVFWSCANF, (fp, fmt0, ap),
_DEFUN(__SVFWSCANF, (fp, fmt0, ap),
       register FILE *fp _AND
       register FILE *fp _AND
       wchar_t _CONST *fmt0 _AND
       wchar_t _CONST *fmt0 _AND
       va_list ap)
       va_list ap)
{
{
  return __SVFWSCANF_R (_REENT, fp, fmt0, ap);
  return __SVFWSCANF_R (_REENT, fp, fmt0, ap);
}
}
 
 
#endif /* !_REENT_ONLY */
#endif /* !_REENT_ONLY */
 
 
int
int
_DEFUN(_VFWSCANF_R, (data, fp, fmt, ap),
_DEFUN(_VFWSCANF_R, (data, fp, fmt, ap),
       struct _reent *data _AND
       struct _reent *data _AND
       register FILE *fp   _AND
       register FILE *fp   _AND
       _CONST wchar_t *fmt    _AND
       _CONST wchar_t *fmt    _AND
       va_list ap)
       va_list ap)
{
{
  CHECK_INIT(data, fp);
  CHECK_INIT(data, fp);
  return __SVFWSCANF_R (data, fp, fmt, ap);
  return __SVFWSCANF_R (data, fp, fmt, ap);
}
}
#endif /* !STRING_ONLY */
#endif /* !STRING_ONLY */
 
 
#ifdef STRING_ONLY
#ifdef STRING_ONLY
/* When dealing with the swscanf family, we don't want to use the
/* When dealing with the swscanf family, we don't want to use the
 * regular ungetwc which will drag in file I/O items we don't need.
 * regular ungetwc which will drag in file I/O items we don't need.
 * So, we create our own trimmed-down version.  */
 * So, we create our own trimmed-down version.  */
static wint_t
static wint_t
_DEFUN(_sungetwc_r, (data, fp, ch),
_DEFUN(_sungetwc_r, (data, fp, ch),
        struct _reent *data _AND
        struct _reent *data _AND
        wint_t wc           _AND
        wint_t wc           _AND
        register FILE *fp)
        register FILE *fp)
{
{
  if (wc == WEOF)
  if (wc == WEOF)
    return (WEOF);
    return (WEOF);
 
 
  /* After ungetc, we won't be at eof anymore */
  /* After ungetc, we won't be at eof anymore */
  fp->_flags &= ~__SEOF;
  fp->_flags &= ~__SEOF;
 
 
  /*
  /*
   * If we are in the middle of ungetwc'ing, just continue.
   * If we are in the middle of ungetwc'ing, just continue.
   * This may require expanding the current ungetc buffer.
   * This may require expanding the current ungetc buffer.
   */
   */
 
 
  if (HASUB (fp))
  if (HASUB (fp))
    {
    {
      if (fp->_r >= fp->_ub._size && __submore (data, fp))
      if (fp->_r >= fp->_ub._size && __submore (data, fp))
        {
        {
          return EOF;
          return EOF;
        }
        }
      fp->_p -= sizeof (wchar_t);
      fp->_p -= sizeof (wchar_t);
      *fp->_p = (wchar_t) wc;
      *fp->_p = (wchar_t) wc;
      fp->_r += sizeof (wchar_t);
      fp->_r += sizeof (wchar_t);
      return wc;
      return wc;
    }
    }
 
 
  /*
  /*
   * If we can handle this by simply backing up, do so,
   * If we can handle this by simply backing up, do so,
   * but never replace the original character.
   * but never replace the original character.
   * (This makes swscanf() work when scanning `const' data.)
   * (This makes swscanf() work when scanning `const' data.)
   */
   */
 
 
  if (fp->_bf._base != NULL && fp->_p > fp->_bf._base
  if (fp->_bf._base != NULL && fp->_p > fp->_bf._base
      && ((wchar_t *)fp->_p)[-1] == wc)
      && ((wchar_t *)fp->_p)[-1] == wc)
    {
    {
      fp->_p -= sizeof (wchar_t);
      fp->_p -= sizeof (wchar_t);
      fp->_r += sizeof (wchar_t);
      fp->_r += sizeof (wchar_t);
      return wc;
      return wc;
    }
    }
 
 
  /*
  /*
   * Create an ungetc buffer.
   * Create an ungetc buffer.
   * Initially, we will use the `reserve' buffer.
   * Initially, we will use the `reserve' buffer.
   */
   */
 
 
  fp->_ur = fp->_r;
  fp->_ur = fp->_r;
  fp->_up = fp->_p;
  fp->_up = fp->_p;
  fp->_ub._base = fp->_ubuf;
  fp->_ub._base = fp->_ubuf;
  fp->_ub._size = sizeof (fp->_ubuf);
  fp->_ub._size = sizeof (fp->_ubuf);
  fp->_p = &fp->_ubuf[sizeof (fp->_ubuf) - sizeof (wchar_t)];
  fp->_p = &fp->_ubuf[sizeof (fp->_ubuf) - sizeof (wchar_t)];
  *(wchar_t *) fp->_p = wc;
  *(wchar_t *) fp->_p = wc;
  fp->_r = 2;
  fp->_r = 2;
  return wc;
  return wc;
}
}
 
 
extern int __ssrefill_r _PARAMS ((struct _reent *ptr, register FILE * fp));
extern int __ssrefill_r _PARAMS ((struct _reent *ptr, register FILE * fp));
 
 
static size_t
static size_t
_DEFUN(_sfgetwc_r, (ptr, fp),
_DEFUN(_sfgetwc_r, (ptr, fp),
       struct _reent * ptr _AND
       struct _reent * ptr _AND
       FILE * fp)
       FILE * fp)
{
{
  wchar_t wc;
  wchar_t wc;
 
 
  if (fp->_r <= 0 && __ssrefill_r (ptr, fp))
  if (fp->_r <= 0 && __ssrefill_r (ptr, fp))
    return (WEOF);
    return (WEOF);
  wc = *(wchar_t *) fp->_p;
  wc = *(wchar_t *) fp->_p;
  fp->_p += sizeof (wchar_t);
  fp->_p += sizeof (wchar_t);
  fp->_r -= sizeof (wchar_t);
  fp->_r -= sizeof (wchar_t);
  return (wc);
  return (wc);
}
}
#endif /* STRING_ONLY */
#endif /* STRING_ONLY */
 
 
int
int
_DEFUN(__SVFWSCANF_R, (rptr, fp, fmt0, ap),
_DEFUN(__SVFWSCANF_R, (rptr, fp, fmt0, ap),
       struct _reent *rptr _AND
       struct _reent *rptr _AND
       register FILE *fp   _AND
       register FILE *fp   _AND
       wchar_t _CONST *fmt0   _AND
       wchar_t _CONST *fmt0   _AND
       va_list ap)
       va_list ap)
{
{
  register wchar_t *fmt = (wchar_t *) fmt0;
  register wchar_t *fmt = (wchar_t *) fmt0;
  register wint_t c;            /* character from format, or conversion */
  register wint_t c;            /* character from format, or conversion */
  register size_t width;        /* field width, or 0 */
  register size_t width;        /* field width, or 0 */
  register wchar_t *p = NULL;   /* points into all kinds of strings */
  register wchar_t *p = NULL;   /* points into all kinds of strings */
  register int n;               /* handy integer */
  register int n;               /* handy integer */
  register int flags;           /* flags as defined above */
  register int flags;           /* flags as defined above */
  register wchar_t *p0;         /* saves original value of p when necessary */
  register wchar_t *p0;         /* saves original value of p when necessary */
  int nassigned;                /* number of fields assigned */
  int nassigned;                /* number of fields assigned */
  int nread;                    /* number of characters consumed from fp */
  int nread;                    /* number of characters consumed from fp */
#ifndef _NO_POS_ARGS
#ifndef _NO_POS_ARGS
  int N;                        /* arg number */
  int N;                        /* arg number */
  int arg_index = 0;             /* index into args processed directly */
  int arg_index = 0;             /* index into args processed directly */
  int numargs = 0;               /* number of varargs read */
  int numargs = 0;               /* number of varargs read */
  void *args[MAX_POS_ARGS];     /* positional args read */
  void *args[MAX_POS_ARGS];     /* positional args read */
  int is_pos_arg;               /* is current format positional? */
  int is_pos_arg;               /* is current format positional? */
#endif
#endif
  int base = 0;                  /* base argument to wcstol/wcstoul */
  int base = 0;                  /* base argument to wcstol/wcstoul */
 
 
  mbstate_t mbs;                /* value to keep track of multibyte state */
  mbstate_t mbs;                /* value to keep track of multibyte state */
 
 
  #define CCFN_PARAMS   _PARAMS((struct _reent *, const wchar_t *, wchar_t **, int))
  #define CCFN_PARAMS   _PARAMS((struct _reent *, const wchar_t *, wchar_t **, int))
  unsigned long (*ccfn)CCFN_PARAMS=0;    /* conversion function (wcstol/wcstoul) */
  unsigned long (*ccfn)CCFN_PARAMS=0;    /* conversion function (wcstol/wcstoul) */
  wchar_t buf[BUF];             /* buffer for numeric conversions */
  wchar_t buf[BUF];             /* buffer for numeric conversions */
  const wchar_t *ccls;          /* character class start */
  const wchar_t *ccls;          /* character class start */
  const wchar_t *ccle;          /* character class end */
  const wchar_t *ccle;          /* character class end */
  int cclcompl = 0;             /* ccl is complemented? */
  int cclcompl = 0;             /* ccl is complemented? */
  wint_t wi;                    /* handy wint_t */
  wint_t wi;                    /* handy wint_t */
  char *mbp = NULL;             /* multibyte string pointer for %c %s %[ */
  char *mbp = NULL;             /* multibyte string pointer for %c %s %[ */
  size_t nconv;                 /* number of bytes in mb. conversion */
  size_t nconv;                 /* number of bytes in mb. conversion */
  char mbbuf[MB_LEN_MAX];       /* temporary mb. character buffer */
  char mbbuf[MB_LEN_MAX];       /* temporary mb. character buffer */
 
 
  char *cp;
  char *cp;
  short *sp;
  short *sp;
  int *ip;
  int *ip;
#ifdef FLOATING_POINT
#ifdef FLOATING_POINT
  float *flp;
  float *flp;
  _LONG_DOUBLE *ldp;
  _LONG_DOUBLE *ldp;
  double *dp;
  double *dp;
#endif
#endif
  long *lp;
  long *lp;
#ifndef _NO_LONGLONG
#ifndef _NO_LONGLONG
  long long *llp;
  long long *llp;
#endif
#endif
 
 
  /* `basefix' is used to avoid `if' tests in the integer scanner */
  /* `basefix' is used to avoid `if' tests in the integer scanner */
  static _CONST short basefix[17] =
  static _CONST short basefix[17] =
    {10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
    {10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
 
 
  /* Macro to support positional arguments */
  /* Macro to support positional arguments */
#ifndef _NO_POS_ARGS
#ifndef _NO_POS_ARGS
# define GET_ARG(n, ap, type)                                   \
# define GET_ARG(n, ap, type)                                   \
  ((type) (is_pos_arg                                           \
  ((type) (is_pos_arg                                           \
           ? (n < numargs                                       \
           ? (n < numargs                                       \
              ? args[n]                                         \
              ? args[n]                                         \
              : get_arg (n, &ap, &numargs, args))               \
              : get_arg (n, &ap, &numargs, args))               \
           : (arg_index++ < numargs                             \
           : (arg_index++ < numargs                             \
              ? args[n]                                         \
              ? args[n]                                         \
              : (numargs < MAX_POS_ARGS                         \
              : (numargs < MAX_POS_ARGS                         \
                 ? args[numargs++] = va_arg (ap, void *)        \
                 ? args[numargs++] = va_arg (ap, void *)        \
                 : va_arg (ap, void *)))))
                 : va_arg (ap, void *)))))
#else
#else
# define GET_ARG(n, ap, type) (va_arg (ap, type))
# define GET_ARG(n, ap, type) (va_arg (ap, type))
#endif
#endif
 
 
  __sfp_lock_acquire ();
  __sfp_lock_acquire ();
  _flockfile (fp);
  _flockfile (fp);
 
 
  ORIENT (fp, 1);
  ORIENT (fp, 1);
 
 
  nassigned = 0;
  nassigned = 0;
  nread = 0;
  nread = 0;
  ccls = ccle = NULL;
  ccls = ccle = NULL;
  for (;;)
  for (;;)
    {
    {
      c = *fmt++;
      c = *fmt++;
      if (c == L'\0')
      if (c == L'\0')
        goto all_done;
        goto all_done;
      if (iswspace (c))
      if (iswspace (c))
        {
        {
          while ((c = _fgetwc_r (rptr, fp)) != WEOF && iswspace(c))
          while ((c = _fgetwc_r (rptr, fp)) != WEOF && iswspace(c))
            ;
            ;
          if (c != WEOF)
          if (c != WEOF)
            _ungetwc_r (rptr, c, fp);
            _ungetwc_r (rptr, c, fp);
          continue;
          continue;
        }
        }
      if (c != L'%')
      if (c != L'%')
        goto literal;
        goto literal;
      width = 0;
      width = 0;
      flags = 0;
      flags = 0;
#ifndef _NO_POS_ARGS
#ifndef _NO_POS_ARGS
      N = arg_index;
      N = arg_index;
      is_pos_arg = 0;
      is_pos_arg = 0;
#endif
#endif
 
 
      /*
      /*
       * switch on the format.  continue if done; break once format
       * switch on the format.  continue if done; break once format
       * type is derived.
       * type is derived.
       */
       */
 
 
    again:
    again:
      c = *fmt++;
      c = *fmt++;
 
 
      switch (c)
      switch (c)
        {
        {
        case L'%':
        case L'%':
        literal:
        literal:
          if ((wi = _fgetwc_r (rptr, fp)) == WEOF)
          if ((wi = _fgetwc_r (rptr, fp)) == WEOF)
            goto input_failure;
            goto input_failure;
          if (wi != c)
          if (wi != c)
            {
            {
              _ungetwc_r (rptr, wi, fp);
              _ungetwc_r (rptr, wi, fp);
              goto input_failure;
              goto input_failure;
            }
            }
          nread++;
          nread++;
          continue;
          continue;
 
 
        case L'*':
        case L'*':
          flags |= SUPPRESS;
          flags |= SUPPRESS;
          goto again;
          goto again;
        case L'l':
        case L'l':
#if defined _WANT_IO_C99_FORMATS || !defined _NO_LONGLONG
#if defined _WANT_IO_C99_FORMATS || !defined _NO_LONGLONG
          if (*fmt == L'l')     /* Check for 'll' = long long (SUSv3) */
          if (*fmt == L'l')     /* Check for 'll' = long long (SUSv3) */
            {
            {
              ++fmt;
              ++fmt;
              flags |= LONGDBL;
              flags |= LONGDBL;
            }
            }
          else
          else
#endif
#endif
            flags |= LONG;
            flags |= LONG;
          goto again;
          goto again;
        case L'L':
        case L'L':
          flags |= LONGDBL;
          flags |= LONGDBL;
          goto again;
          goto again;
        case L'h':
        case L'h':
#ifdef _WANT_IO_C99_FORMATS
#ifdef _WANT_IO_C99_FORMATS
          if (*fmt == 'h')      /* Check for 'hh' = char int (SUSv3) */
          if (*fmt == 'h')      /* Check for 'hh' = char int (SUSv3) */
            {
            {
              ++fmt;
              ++fmt;
              flags |= CHAR;
              flags |= CHAR;
            }
            }
          else
          else
#endif
#endif
            flags |= SHORT;
            flags |= SHORT;
          goto again;
          goto again;
#ifdef _WANT_IO_C99_FORMATS
#ifdef _WANT_IO_C99_FORMATS
        case L'j': /* intmax_t */
        case L'j': /* intmax_t */
          if (sizeof (intmax_t) == sizeof (long))
          if (sizeof (intmax_t) == sizeof (long))
            flags |= LONG;
            flags |= LONG;
          else
          else
            flags |= LONGDBL;
            flags |= LONGDBL;
          goto again;
          goto again;
        case L't': /* ptrdiff_t */
        case L't': /* ptrdiff_t */
          if (sizeof (ptrdiff_t) < sizeof (int))
          if (sizeof (ptrdiff_t) < sizeof (int))
            /* POSIX states ptrdiff_t is 16 or more bits, as
            /* POSIX states ptrdiff_t is 16 or more bits, as
               is short.  */
               is short.  */
            flags |= SHORT;
            flags |= SHORT;
          else if (sizeof (ptrdiff_t) == sizeof (int))
          else if (sizeof (ptrdiff_t) == sizeof (int))
            /* no flag needed */;
            /* no flag needed */;
          else if (sizeof (ptrdiff_t) <= sizeof (long))
          else if (sizeof (ptrdiff_t) <= sizeof (long))
            flags |= LONG;
            flags |= LONG;
          else
          else
            /* POSIX states that at least one programming
            /* POSIX states that at least one programming
               environment must support ptrdiff_t no wider than
               environment must support ptrdiff_t no wider than
               long, but that means other environments can
               long, but that means other environments can
               have ptrdiff_t as wide as long long.  */
               have ptrdiff_t as wide as long long.  */
            flags |= LONGDBL;
            flags |= LONGDBL;
          goto again;
          goto again;
        case L'z': /* size_t */
        case L'z': /* size_t */
          if (sizeof (size_t) < sizeof (int))
          if (sizeof (size_t) < sizeof (int))
            /* POSIX states size_t is 16 or more bits, as is short.  */
            /* POSIX states size_t is 16 or more bits, as is short.  */
            flags |= SHORT;
            flags |= SHORT;
          else if (sizeof (size_t) == sizeof (int))
          else if (sizeof (size_t) == sizeof (int))
            /* no flag needed */;
            /* no flag needed */;
          else if (sizeof (size_t) <= sizeof (long))
          else if (sizeof (size_t) <= sizeof (long))
            flags |= LONG;
            flags |= LONG;
          else
          else
            /* POSIX states that at least one programming
            /* POSIX states that at least one programming
               environment must support size_t no wider than
               environment must support size_t no wider than
               long, but that means other environments can
               long, but that means other environments can
               have size_t as wide as long long.  */
               have size_t as wide as long long.  */
            flags |= LONGDBL;
            flags |= LONGDBL;
          goto again;
          goto again;
#endif /* _WANT_IO_C99_FORMATS */
#endif /* _WANT_IO_C99_FORMATS */
 
 
        case L'0':
        case L'0':
        case L'1':
        case L'1':
        case L'2':
        case L'2':
        case L'3':
        case L'3':
        case L'4':
        case L'4':
        case L'5':
        case L'5':
        case L'6':
        case L'6':
        case L'7':
        case L'7':
        case L'8':
        case L'8':
        case L'9':
        case L'9':
          width = width * 10 + c - L'0';
          width = width * 10 + c - L'0';
          goto again;
          goto again;
 
 
#ifndef _NO_POS_ARGS
#ifndef _NO_POS_ARGS
        case L'$':
        case L'$':
          if (width <= MAX_POS_ARGS)
          if (width <= MAX_POS_ARGS)
            {
            {
              N = width - 1;
              N = width - 1;
              is_pos_arg = 1;
              is_pos_arg = 1;
              width = 0;
              width = 0;
              goto again;
              goto again;
            }
            }
          rptr->_errno = EINVAL;
          rptr->_errno = EINVAL;
          goto input_failure;
          goto input_failure;
#endif /* !_NO_POS_ARGS */
#endif /* !_NO_POS_ARGS */
 
 
        case L'd':
        case L'd':
          c = CT_INT;
          c = CT_INT;
          ccfn = (unsigned long (*)CCFN_PARAMS)_wcstol_r;
          ccfn = (unsigned long (*)CCFN_PARAMS)_wcstol_r;
          base = 10;
          base = 10;
          break;
          break;
 
 
        case L'i':
        case L'i':
          c = CT_INT;
          c = CT_INT;
          ccfn = (unsigned long (*)CCFN_PARAMS)_wcstol_r;
          ccfn = (unsigned long (*)CCFN_PARAMS)_wcstol_r;
          base = 0;
          base = 0;
          break;
          break;
 
 
        case L'o':
        case L'o':
          c = CT_INT;
          c = CT_INT;
          ccfn = _wcstoul_r;
          ccfn = _wcstoul_r;
          base = 8;
          base = 8;
          break;
          break;
 
 
        case L'u':
        case L'u':
          c = CT_INT;
          c = CT_INT;
          ccfn = _wcstoul_r;
          ccfn = _wcstoul_r;
          base = 10;
          base = 10;
          break;
          break;
 
 
        case L'X':
        case L'X':
        case L'x':
        case L'x':
          flags |= PFXOK;       /* enable 0x prefixing */
          flags |= PFXOK;       /* enable 0x prefixing */
          c = CT_INT;
          c = CT_INT;
          ccfn = _wcstoul_r;
          ccfn = _wcstoul_r;
          base = 16;
          base = 16;
          break;
          break;
 
 
#ifdef FLOATING_POINT
#ifdef FLOATING_POINT
# ifdef _WANT_IO_C99_FORMATS
# ifdef _WANT_IO_C99_FORMATS
        case L'A':
        case L'A':
        case L'a':
        case L'a':
        case L'F':
        case L'F':
# endif
# endif
        case L'E':
        case L'E':
        case L'G':
        case L'G':
        case L'e':
        case L'e':
        case L'f':
        case L'f':
        case L'g':
        case L'g':
          c = CT_FLOAT;
          c = CT_FLOAT;
          break;
          break;
#endif
#endif
 
 
#ifdef _WANT_IO_C99_FORMATS
#ifdef _WANT_IO_C99_FORMATS
        case L'S':
        case L'S':
          flags |= LONG;
          flags |= LONG;
          /* FALLTHROUGH */
          /* FALLTHROUGH */
#endif
#endif
 
 
        case L's':
        case L's':
          c = CT_STRING;
          c = CT_STRING;
          break;
          break;
 
 
        case L'[':
        case L'[':
          ccls = fmt;
          ccls = fmt;
          if (*fmt == '^')
          if (*fmt == '^')
            {
            {
              cclcompl = 1;
              cclcompl = 1;
              ++fmt;
              ++fmt;
            }
            }
          else
          else
            cclcompl = 0;
            cclcompl = 0;
          if (*fmt == ']')
          if (*fmt == ']')
            fmt++;
            fmt++;
          while (*fmt != '\0' && *fmt != ']')
          while (*fmt != '\0' && *fmt != ']')
            fmt++;
            fmt++;
          ccle = fmt;
          ccle = fmt;
          fmt++;
          fmt++;
          flags |= NOSKIP;
          flags |= NOSKIP;
          c = CT_CCL;
          c = CT_CCL;
          break;
          break;
 
 
#ifdef _WANT_IO_C99_FORMATS
#ifdef _WANT_IO_C99_FORMATS
        case 'C':
        case 'C':
          flags |= LONG;
          flags |= LONG;
          /* FALLTHROUGH */
          /* FALLTHROUGH */
#endif
#endif
 
 
        case 'c':
        case 'c':
          flags |= NOSKIP;
          flags |= NOSKIP;
          c = CT_CHAR;
          c = CT_CHAR;
          break;
          break;
 
 
        case 'p':               /* pointer format is like hex */
        case 'p':               /* pointer format is like hex */
          flags |= POINTER | PFXOK;
          flags |= POINTER | PFXOK;
          c = CT_INT;
          c = CT_INT;
          ccfn = _wcstoul_r;
          ccfn = _wcstoul_r;
          base = 16;
          base = 16;
          break;
          break;
 
 
        case 'n':
        case 'n':
          if (flags & SUPPRESS) /* ??? */
          if (flags & SUPPRESS) /* ??? */
            continue;
            continue;
#ifdef _WANT_IO_C99_FORMATS
#ifdef _WANT_IO_C99_FORMATS
          if (flags & CHAR)
          if (flags & CHAR)
            {
            {
              cp = GET_ARG (N, ap, char *);
              cp = GET_ARG (N, ap, char *);
              *cp = nread;
              *cp = nread;
            }
            }
          else
          else
#endif
#endif
          if (flags & SHORT)
          if (flags & SHORT)
            {
            {
              sp = GET_ARG (N, ap, short *);
              sp = GET_ARG (N, ap, short *);
              *sp = nread;
              *sp = nread;
            }
            }
          else if (flags & LONG)
          else if (flags & LONG)
            {
            {
              lp = GET_ARG (N, ap, long *);
              lp = GET_ARG (N, ap, long *);
              *lp = nread;
              *lp = nread;
            }
            }
#ifndef _NO_LONGLONG
#ifndef _NO_LONGLONG
          else if (flags & LONGDBL)
          else if (flags & LONGDBL)
            {
            {
              llp = GET_ARG (N, ap, long long*);
              llp = GET_ARG (N, ap, long long*);
              *llp = nread;
              *llp = nread;
            }
            }
#endif
#endif
          else
          else
            {
            {
              ip = GET_ARG (N, ap, int *);
              ip = GET_ARG (N, ap, int *);
              *ip = nread;
              *ip = nread;
            }
            }
          continue;
          continue;
 
 
          /*
          /*
           * Disgusting backwards compatibility hacks.  XXX
           * Disgusting backwards compatibility hacks.  XXX
           */
           */
        case L'\0':             /* compat */
        case L'\0':             /* compat */
          _funlockfile (fp);
          _funlockfile (fp);
          __sfp_lock_release ();
          __sfp_lock_release ();
          return EOF;
          return EOF;
 
 
        default:                /* compat */
        default:                /* compat */
          goto match_failure;
          goto match_failure;
        }
        }
 
 
      /*
      /*
       * Consume leading white space, except for formats that
       * Consume leading white space, except for formats that
       * suppress this.
       * suppress this.
       */
       */
      if ((flags & NOSKIP) == 0)
      if ((flags & NOSKIP) == 0)
        {
        {
          while ((wi = _fgetwc_r (rptr, fp)) != WEOF && iswspace (wi))
          while ((wi = _fgetwc_r (rptr, fp)) != WEOF && iswspace (wi))
            nread++;
            nread++;
          if (wi == WEOF)
          if (wi == WEOF)
            goto input_failure;
            goto input_failure;
          _ungetwc_r (rptr, wi, fp);
          _ungetwc_r (rptr, wi, fp);
        }
        }
 
 
      /*
      /*
       * Do the conversion.
       * Do the conversion.
       */
       */
      switch (c)
      switch (c)
        {
        {
 
 
        case CT_CHAR:
        case CT_CHAR:
          /* scan arbitrary characters (sets NOSKIP) */
          /* scan arbitrary characters (sets NOSKIP) */
          if (width == 0)
          if (width == 0)
            width = 1;
            width = 1;
          if (flags & LONG)
          if (flags & LONG)
            {
            {
              if (!(flags & SUPPRESS))
              if (!(flags & SUPPRESS))
                p = va_arg(ap, wchar_t *);
                p = va_arg(ap, wchar_t *);
              n = 0;
              n = 0;
              while (width-- != 0 && (wi = _fgetwc_r (rptr, fp)) != WEOF)
              while (width-- != 0 && (wi = _fgetwc_r (rptr, fp)) != WEOF)
                {
                {
                  if (!(flags & SUPPRESS))
                  if (!(flags & SUPPRESS))
                    *p++ = (wchar_t) wi;
                    *p++ = (wchar_t) wi;
                  n++;
                  n++;
                }
                }
              if (n == 0)
              if (n == 0)
                goto input_failure;
                goto input_failure;
              nread += n;
              nread += n;
              if (!(flags & SUPPRESS))
              if (!(flags & SUPPRESS))
                nassigned++;
                nassigned++;
            }
            }
          else
          else
            {
            {
              if (!(flags & SUPPRESS))
              if (!(flags & SUPPRESS))
                mbp = va_arg(ap, char *);
                mbp = va_arg(ap, char *);
              n = 0;
              n = 0;
              memset ((_PTR)&mbs, '\0', sizeof (mbstate_t));
              memset ((_PTR)&mbs, '\0', sizeof (mbstate_t));
              while (width != 0 && (wi = _fgetwc_r (rptr, fp)) != WEOF)
              while (width != 0 && (wi = _fgetwc_r (rptr, fp)) != WEOF)
                {
                {
                  if (width >= MB_CUR_MAX && !(flags & SUPPRESS))
                  if (width >= MB_CUR_MAX && !(flags & SUPPRESS))
                    {
                    {
                      nconv = _wcrtomb_r (rptr, mbp, wi, &mbs);
                      nconv = _wcrtomb_r (rptr, mbp, wi, &mbs);
                      if (nconv == (size_t) -1)
                      if (nconv == (size_t) -1)
                        goto input_failure;
                        goto input_failure;
                    }
                    }
                  else
                  else
                    {
                    {
                      nconv = _wcrtomb_r (rptr, mbbuf, wi, &mbs);
                      nconv = _wcrtomb_r (rptr, mbbuf, wi, &mbs);
                      if (nconv == (size_t) -1)
                      if (nconv == (size_t) -1)
                        goto input_failure;
                        goto input_failure;
                      if (nconv > width)
                      if (nconv > width)
                        {
                        {
                          _ungetwc_r (rptr, wi, fp);
                          _ungetwc_r (rptr, wi, fp);
                          break;
                          break;
                        }
                        }
                      if (!(flags & SUPPRESS))
                      if (!(flags & SUPPRESS))
                        memcpy(mbp, mbbuf, nconv);
                        memcpy(mbp, mbbuf, nconv);
                    }
                    }
                  if (!(flags & SUPPRESS))
                  if (!(flags & SUPPRESS))
                    mbp += nconv;
                    mbp += nconv;
                  width -= nconv;
                  width -= nconv;
                  n++;
                  n++;
                }
                }
              if (n == 0)
              if (n == 0)
                goto input_failure;
                goto input_failure;
              nread += n;
              nread += n;
              if (!(flags & SUPPRESS))
              if (!(flags & SUPPRESS))
                nassigned++;
                nassigned++;
            }
            }
          break;
          break;
 
 
        case CT_CCL:
        case CT_CCL:
          /* scan a (nonempty) character class (sets NOSKIP) */
          /* scan a (nonempty) character class (sets NOSKIP) */
          if (width == 0)
          if (width == 0)
            width = (size_t) ~0;         /* `infinity' */
            width = (size_t) ~0;         /* `infinity' */
          /* take only those things in the class */
          /* take only those things in the class */
          if ((flags & SUPPRESS) && (flags & LONG))
          if ((flags & SUPPRESS) && (flags & LONG))
            {
            {
              n = 0;
              n = 0;
              while ((wi = _fgetwc_r (rptr, fp)) != WEOF
              while ((wi = _fgetwc_r (rptr, fp)) != WEOF
                     && width-- != 0 && INCCL (wi))
                     && width-- != 0 && INCCL (wi))
                n++;
                n++;
              if (wi != WEOF)
              if (wi != WEOF)
                _ungetwc_r (rptr, wi, fp);
                _ungetwc_r (rptr, wi, fp);
              if (n == 0)
              if (n == 0)
                goto match_failure;
                goto match_failure;
            }
            }
          else if (flags & LONG)
          else if (flags & LONG)
            {
            {
              p0 = p = va_arg(ap, wchar_t *);
              p0 = p = va_arg(ap, wchar_t *);
              while ((wi = _fgetwc_r (rptr, fp)) != WEOF
              while ((wi = _fgetwc_r (rptr, fp)) != WEOF
                     && width-- != 0 && INCCL (wi))
                     && width-- != 0 && INCCL (wi))
                *p++ = (wchar_t) wi;
                *p++ = (wchar_t) wi;
              if (wi != WEOF)
              if (wi != WEOF)
                _ungetwc_r (rptr, wi, fp);
                _ungetwc_r (rptr, wi, fp);
              n = p - p0;
              n = p - p0;
              if (n == 0)
              if (n == 0)
                goto match_failure;
                goto match_failure;
            }
            }
          else
          else
            {
            {
              if (!(flags & SUPPRESS))
              if (!(flags & SUPPRESS))
                mbp = va_arg(ap, char *);
                mbp = va_arg(ap, char *);
              n = 0;
              n = 0;
              memset ((_PTR) &mbs, '\0', sizeof (mbstate_t));
              memset ((_PTR) &mbs, '\0', sizeof (mbstate_t));
              while ((wi = _fgetwc_r (rptr, fp)) != WEOF
              while ((wi = _fgetwc_r (rptr, fp)) != WEOF
                     && width-- != 0 && INCCL (wi))
                     && width-- != 0 && INCCL (wi))
                {
                {
                  if (width >= MB_CUR_MAX && !(flags & SUPPRESS))
                  if (width >= MB_CUR_MAX && !(flags & SUPPRESS))
                    {
                    {
                      nconv = _wcrtomb_r (rptr, mbp, wi, &mbs);
                      nconv = _wcrtomb_r (rptr, mbp, wi, &mbs);
                      if (nconv == (size_t) -1)
                      if (nconv == (size_t) -1)
                        goto input_failure;
                        goto input_failure;
                    }
                    }
                  else
                  else
                    {
                    {
                      nconv = wcrtomb(mbbuf, wi, &mbs);
                      nconv = wcrtomb(mbbuf, wi, &mbs);
                      if (nconv == (size_t) -1)
                      if (nconv == (size_t) -1)
                        goto input_failure;
                        goto input_failure;
                      if (nconv > width)
                      if (nconv > width)
                        break;
                        break;
                      if (!(flags & SUPPRESS))
                      if (!(flags & SUPPRESS))
                        memcpy(mbp, mbbuf, nconv);
                        memcpy(mbp, mbbuf, nconv);
                    }
                    }
                  if (!(flags & SUPPRESS))
                  if (!(flags & SUPPRESS))
                    mbp += nconv;
                    mbp += nconv;
                  width -= nconv;
                  width -= nconv;
                  n++;
                  n++;
                }
                }
              if (wi != WEOF)
              if (wi != WEOF)
                _ungetwc_r (rptr, wi, fp);
                _ungetwc_r (rptr, wi, fp);
              if (!(flags & SUPPRESS))
              if (!(flags & SUPPRESS))
                {
                {
                  *mbp = 0;
                  *mbp = 0;
                  nassigned++;
                  nassigned++;
                }
                }
            }
            }
          nread += n;
          nread += n;
          break;
          break;
 
 
        case CT_STRING:
        case CT_STRING:
          /* like CCL, but zero-length string OK, & no NOSKIP */
          /* like CCL, but zero-length string OK, & no NOSKIP */
          if (width == 0)
          if (width == 0)
            width = (size_t)~0;
            width = (size_t)~0;
          if ((flags & SUPPRESS) && (flags & LONG))
          if ((flags & SUPPRESS) && (flags & LONG))
            {
            {
              while ((wi = _fgetwc_r (rptr, fp)) != WEOF
              while ((wi = _fgetwc_r (rptr, fp)) != WEOF
                     && width-- != 0 && !iswspace (wi))
                     && width-- != 0 && !iswspace (wi))
                nread++;
                nread++;
              if (wi != WEOF)
              if (wi != WEOF)
                _ungetwc_r (rptr, wi, fp);
                _ungetwc_r (rptr, wi, fp);
            }
            }
          else if (flags & LONG)
          else if (flags & LONG)
            {
            {
              p0 = p = va_arg(ap, wchar_t *);
              p0 = p = va_arg(ap, wchar_t *);
              while ((wi = _fgetwc_r (rptr, fp)) != WEOF
              while ((wi = _fgetwc_r (rptr, fp)) != WEOF
                     && width-- != 0 && !iswspace (wi))
                     && width-- != 0 && !iswspace (wi))
                {
                {
                  *p++ = (wchar_t) wi;
                  *p++ = (wchar_t) wi;
                  nread++;
                  nread++;
                }
                }
              if (wi != WEOF)
              if (wi != WEOF)
                _ungetwc_r (rptr, wi, fp);
                _ungetwc_r (rptr, wi, fp);
              *p = '\0';
              *p = '\0';
              nassigned++;
              nassigned++;
            }
            }
          else
          else
            {
            {
              if (!(flags & SUPPRESS))
              if (!(flags & SUPPRESS))
                mbp = va_arg(ap, char *);
                mbp = va_arg(ap, char *);
              memset ((_PTR) &mbs, '\0', sizeof (mbstate_t));
              memset ((_PTR) &mbs, '\0', sizeof (mbstate_t));
              while ((wi = _fgetwc_r (rptr, fp)) != WEOF
              while ((wi = _fgetwc_r (rptr, fp)) != WEOF
                     && width != 0 && !iswspace (wi))
                     && width != 0 && !iswspace (wi))
                {
                {
                  if (width >= MB_CUR_MAX && !(flags & SUPPRESS))
                  if (width >= MB_CUR_MAX && !(flags & SUPPRESS))
                    {
                    {
                      nconv = wcrtomb(mbp, wi, &mbs);
                      nconv = wcrtomb(mbp, wi, &mbs);
                      if (nconv == (size_t)-1)
                      if (nconv == (size_t)-1)
                        goto input_failure;
                        goto input_failure;
                    }
                    }
                  else
                  else
                    {
                    {
                      nconv = wcrtomb(mbbuf, wi, &mbs);
                      nconv = wcrtomb(mbbuf, wi, &mbs);
                      if (nconv == (size_t)-1)
                      if (nconv == (size_t)-1)
                        goto input_failure;
                        goto input_failure;
                      if (nconv > width)
                      if (nconv > width)
                        break;
                        break;
                      if (!(flags & SUPPRESS))
                      if (!(flags & SUPPRESS))
                        memcpy(mbp, mbbuf, nconv);
                        memcpy(mbp, mbbuf, nconv);
                    }
                    }
                  if (!(flags & SUPPRESS))
                  if (!(flags & SUPPRESS))
                    mbp += nconv;
                    mbp += nconv;
                  width -= nconv;
                  width -= nconv;
                  nread++;
                  nread++;
                }
                }
              if (wi != WEOF)
              if (wi != WEOF)
                _ungetwc_r (rptr, wi, fp);
                _ungetwc_r (rptr, wi, fp);
              if (!(flags & SUPPRESS))
              if (!(flags & SUPPRESS))
                {
                {
                  *mbp = 0;
                  *mbp = 0;
                  nassigned++;
                  nassigned++;
                }
                }
            }
            }
          continue;
          continue;
 
 
        case CT_INT:
        case CT_INT:
        {
        {
          /* scan an integer as if by wcstol/wcstoul */
          /* scan an integer as if by wcstol/wcstoul */
          if (width == 0 || width > sizeof (buf) / sizeof (*buf) - 1)
          if (width == 0 || width > sizeof (buf) / sizeof (*buf) - 1)
            width = sizeof(buf) / sizeof (*buf) - 1;
            width = sizeof(buf) / sizeof (*buf) - 1;
          flags |= SIGNOK | NDIGITS | NZDIGITS;
          flags |= SIGNOK | NDIGITS | NZDIGITS;
          for (p = buf; width; width--)
          for (p = buf; width; width--)
            {
            {
              c = _fgetwc_r (rptr, fp);
              c = _fgetwc_r (rptr, fp);
              /*
              /*
               * Switch on the character; `goto ok' if we
               * Switch on the character; `goto ok' if we
               * accept it as a part of number.
               * accept it as a part of number.
               */
               */
              switch (c)
              switch (c)
                {
                {
                  /*
                  /*
                   * The digit 0 is always legal, but is special.
                   * The digit 0 is always legal, but is special.
                   * For %i conversions, if no digits (zero or nonzero)
                   * For %i conversions, if no digits (zero or nonzero)
                   * have been scanned (only signs), we will have base==0.
                   * have been scanned (only signs), we will have base==0.
                   * In that case, we should set it to 8 and enable 0x
                   * In that case, we should set it to 8 and enable 0x
                   * prefixing. Also, if we have not scanned zero digits
                   * prefixing. Also, if we have not scanned zero digits
                   * before this, do not turn off prefixing (someone else
                   * before this, do not turn off prefixing (someone else
                   * will turn it off if we have scanned any nonzero digits).
                   * will turn it off if we have scanned any nonzero digits).
                   */
                   */
                case L'0':
                case L'0':
                  if (base == 0)
                  if (base == 0)
                    {
                    {
                      base = 8;
                      base = 8;
                      flags |= PFXOK;
                      flags |= PFXOK;
                    }
                    }
                  if (flags & NZDIGITS)
                  if (flags & NZDIGITS)
                    flags &= ~(SIGNOK | NZDIGITS | NDIGITS);
                    flags &= ~(SIGNOK | NZDIGITS | NDIGITS);
                  else
                  else
                    flags &= ~(SIGNOK | PFXOK | NDIGITS);
                    flags &= ~(SIGNOK | PFXOK | NDIGITS);
                  goto ok;
                  goto ok;
 
 
                  /* 1 through 7 always legal */
                  /* 1 through 7 always legal */
                case L'1':
                case L'1':
                case L'2':
                case L'2':
                case L'3':
                case L'3':
                case L'4':
                case L'4':
                case L'5':
                case L'5':
                case L'6':
                case L'6':
                case L'7':
                case L'7':
                  base = basefix[base];
                  base = basefix[base];
                  flags &= ~(SIGNOK | PFXOK | NDIGITS);
                  flags &= ~(SIGNOK | PFXOK | NDIGITS);
                  goto ok;
                  goto ok;
 
 
                  /* digits 8 and 9 ok iff decimal or hex */
                  /* digits 8 and 9 ok iff decimal or hex */
                case L'8':
                case L'8':
                case L'9':
                case L'9':
                  base = basefix[base];
                  base = basefix[base];
                  if (base <= 8)
                  if (base <= 8)
                    break;      /* not legal here */
                    break;      /* not legal here */
                  flags &= ~(SIGNOK | PFXOK | NDIGITS);
                  flags &= ~(SIGNOK | PFXOK | NDIGITS);
                  goto ok;
                  goto ok;
 
 
                  /* letters ok iff hex */
                  /* letters ok iff hex */
                case L'A':
                case L'A':
                case L'B':
                case L'B':
                case L'C':
                case L'C':
                case L'D':
                case L'D':
                case L'E':
                case L'E':
                case L'F':
                case L'F':
                case L'a':
                case L'a':
                case L'b':
                case L'b':
                case L'c':
                case L'c':
                case L'd':
                case L'd':
                case L'e':
                case L'e':
                case L'f':
                case L'f':
                  /* no need to fix base here */
                  /* no need to fix base here */
                  if (base <= 10)
                  if (base <= 10)
                    break;      /* not legal here */
                    break;      /* not legal here */
                  flags &= ~(SIGNOK | PFXOK | NDIGITS);
                  flags &= ~(SIGNOK | PFXOK | NDIGITS);
                  goto ok;
                  goto ok;
 
 
                  /* sign ok only as first character */
                  /* sign ok only as first character */
                case L'+':
                case L'+':
                case L'-':
                case L'-':
                  if (flags & SIGNOK)
                  if (flags & SIGNOK)
                    {
                    {
                      flags &= ~SIGNOK;
                      flags &= ~SIGNOK;
                      flags |= HAVESIGN;
                      flags |= HAVESIGN;
                      goto ok;
                      goto ok;
                    }
                    }
                  break;
                  break;
 
 
                  /* x ok iff flag still set & single 0 seen */
                  /* x ok iff flag still set & single 0 seen */
                case L'x':
                case L'x':
                case L'X':
                case L'X':
                  if ((flags & PFXOK) && p == buf + 1 + !!(flags & HAVESIGN))
                  if ((flags & PFXOK) && p == buf + 1 + !!(flags & HAVESIGN))
                    {
                    {
                      base = 16;/* if %i */
                      base = 16;/* if %i */
                      flags &= ~PFXOK;
                      flags &= ~PFXOK;
                      goto ok;
                      goto ok;
                    }
                    }
                  break;
                  break;
                }
                }
 
 
              /*
              /*
               * If we got here, c is not a legal character
               * If we got here, c is not a legal character
               * for a number.  Stop accumulating digits.
               * for a number.  Stop accumulating digits.
               */
               */
              if (c != WEOF)
              if (c != WEOF)
                _ungetwc_r (rptr, c, fp);
                _ungetwc_r (rptr, c, fp);
              break;
              break;
            ok:
            ok:
              /*
              /*
               * c is legal: store it and look at the next.
               * c is legal: store it and look at the next.
               */
               */
              *p++ = (wchar_t) c;
              *p++ = (wchar_t) c;
            }
            }
          /*
          /*
           * If we had only a sign, it is no good; push back the sign.
           * If we had only a sign, it is no good; push back the sign.
           * If the number ends in `x', it was [sign] '0' 'x', so push back
           * If the number ends in `x', it was [sign] '0' 'x', so push back
           * the x and treat it as [sign] '0'.
           * the x and treat it as [sign] '0'.
           * Use of ungetc here and below assumes ASCII encoding; we are only
           * Use of ungetc here and below assumes ASCII encoding; we are only
           * pushing back 7-bit characters, so casting to unsigned char is
           * pushing back 7-bit characters, so casting to unsigned char is
           * not necessary.
           * not necessary.
           */
           */
          if (flags & NDIGITS)
          if (flags & NDIGITS)
            {
            {
              if (p > buf)
              if (p > buf)
                _ungetwc_r (rptr, *--p, fp); /* [-+xX] */
                _ungetwc_r (rptr, *--p, fp); /* [-+xX] */
              goto match_failure;
              goto match_failure;
            }
            }
          c = p[-1];
          c = p[-1];
          if (c == L'x' || c == L'X')
          if (c == L'x' || c == L'X')
            {
            {
              --p;
              --p;
              _ungetwc_r (rptr, c, fp);
              _ungetwc_r (rptr, c, fp);
            }
            }
          if ((flags & SUPPRESS) == 0)
          if ((flags & SUPPRESS) == 0)
            {
            {
              unsigned long res;
              unsigned long res;
 
 
              *p = 0;
              *p = 0;
              res = (*ccfn) (rptr, buf, (wchar_t **) NULL, base);
              res = (*ccfn) (rptr, buf, (wchar_t **) NULL, base);
              if (flags & POINTER)
              if (flags & POINTER)
                {
                {
                  void **vp = GET_ARG (N, ap, void **);
                  void **vp = GET_ARG (N, ap, void **);
#ifndef _NO_LONGLONG
#ifndef _NO_LONGLONG
                  if (sizeof (uintptr_t) > sizeof (unsigned long))
                  if (sizeof (uintptr_t) > sizeof (unsigned long))
                    {
                    {
                      unsigned long long resll;
                      unsigned long long resll;
                      resll = _wcstoull_r (rptr, buf, (wchar_t **) NULL, base);
                      resll = _wcstoull_r (rptr, buf, (wchar_t **) NULL, base);
                      *vp = (void *) (uintptr_t) resll;
                      *vp = (void *) (uintptr_t) resll;
                    }
                    }
                  else
                  else
#endif /* !_NO_LONGLONG */
#endif /* !_NO_LONGLONG */
                    *vp = (void *) (uintptr_t) res;
                    *vp = (void *) (uintptr_t) res;
                }
                }
#ifdef _WANT_IO_C99_FORMATS
#ifdef _WANT_IO_C99_FORMATS
              else if (flags & CHAR)
              else if (flags & CHAR)
                {
                {
                  cp = GET_ARG (N, ap, char *);
                  cp = GET_ARG (N, ap, char *);
                  *cp = res;
                  *cp = res;
                }
                }
#endif
#endif
              else if (flags & SHORT)
              else if (flags & SHORT)
                {
                {
                  sp = GET_ARG (N, ap, short *);
                  sp = GET_ARG (N, ap, short *);
                  *sp = res;
                  *sp = res;
                }
                }
              else if (flags & LONG)
              else if (flags & LONG)
                {
                {
                  lp = GET_ARG (N, ap, long *);
                  lp = GET_ARG (N, ap, long *);
                  *lp = res;
                  *lp = res;
                }
                }
#ifndef _NO_LONGLONG
#ifndef _NO_LONGLONG
              else if (flags & LONGDBL)
              else if (flags & LONGDBL)
                {
                {
                  unsigned long long resll;
                  unsigned long long resll;
                  if (ccfn == _wcstoul_r)
                  if (ccfn == _wcstoul_r)
                    resll = _wcstoull_r (rptr, buf, (wchar_t **) NULL, base);
                    resll = _wcstoull_r (rptr, buf, (wchar_t **) NULL, base);
                  else
                  else
                    resll = _wcstoll_r (rptr, buf, (wchar_t **) NULL, base);
                    resll = _wcstoll_r (rptr, buf, (wchar_t **) NULL, base);
                  llp = GET_ARG (N, ap, long long*);
                  llp = GET_ARG (N, ap, long long*);
                  *llp = resll;
                  *llp = resll;
                }
                }
#endif
#endif
              else
              else
                {
                {
                  ip = GET_ARG (N, ap, int *);
                  ip = GET_ARG (N, ap, int *);
                  *ip = res;
                  *ip = res;
                }
                }
              nassigned++;
              nassigned++;
            }
            }
          nread += p - buf;
          nread += p - buf;
          break;
          break;
        }
        }
#ifdef FLOATING_POINT
#ifdef FLOATING_POINT
        case CT_FLOAT:
        case CT_FLOAT:
        {
        {
          /* scan a floating point number as if by wcstod */
          /* scan a floating point number as if by wcstod */
          /* This code used to assume that the number of digits is reasonable.
          /* This code used to assume that the number of digits is reasonable.
             However, ANSI / ISO C makes no such stipulation; we have to get
             However, ANSI / ISO C makes no such stipulation; we have to get
             exact results even when there is an unreasonable amount of
             exact results even when there is an unreasonable amount of
             leading zeroes.  */
             leading zeroes.  */
          long leading_zeroes = 0;
          long leading_zeroes = 0;
          long zeroes, exp_adjust;
          long zeroes, exp_adjust;
          wchar_t *exp_start = NULL;
          wchar_t *exp_start = NULL;
          unsigned width_left = 0;
          unsigned width_left = 0;
          char nancount = 0;
          char nancount = 0;
          char infcount = 0;
          char infcount = 0;
#ifdef hardway
#ifdef hardway
          if (width == 0 || width > sizeof (buf) - 1)
          if (width == 0 || width > sizeof (buf) - 1)
#else
#else
          /* size_t is unsigned, hence this optimisation */
          /* size_t is unsigned, hence this optimisation */
          if (width - 1 > sizeof (buf) - 2)
          if (width - 1 > sizeof (buf) - 2)
#endif
#endif
            {
            {
              width_left = width - (sizeof (buf) - 1);
              width_left = width - (sizeof (buf) - 1);
              width = sizeof (buf) - 1;
              width = sizeof (buf) - 1;
            }
            }
          flags |= SIGNOK | NDIGITS | DPTOK | EXPOK;
          flags |= SIGNOK | NDIGITS | DPTOK | EXPOK;
          zeroes = 0;
          zeroes = 0;
          exp_adjust = 0;
          exp_adjust = 0;
          for (p = buf; width; )
          for (p = buf; width; )
            {
            {
              c = _fgetwc_r (rptr, fp);
              c = _fgetwc_r (rptr, fp);
              /*
              /*
               * This code mimicks the integer conversion
               * This code mimicks the integer conversion
               * code, but is much simpler.
               * code, but is much simpler.
               */
               */
              switch (c)
              switch (c)
                {
                {
                case L'0':
                case L'0':
                  if (flags & NDIGITS)
                  if (flags & NDIGITS)
                    {
                    {
                      flags &= ~SIGNOK;
                      flags &= ~SIGNOK;
                      zeroes++;
                      zeroes++;
                      if (width_left)
                      if (width_left)
                        {
                        {
                          width_left--;
                          width_left--;
                          width++;
                          width++;
                        }
                        }
                      goto fskip;
                      goto fskip;
                    }
                    }
                  /* Fall through.  */
                  /* Fall through.  */
                case L'1':
                case L'1':
                case L'2':
                case L'2':
                case L'3':
                case L'3':
                case L'4':
                case L'4':
                case L'5':
                case L'5':
                case L'6':
                case L'6':
                case L'7':
                case L'7':
                case L'8':
                case L'8':
                case L'9':
                case L'9':
                  if (nancount + infcount == 0)
                  if (nancount + infcount == 0)
                    {
                    {
                      flags &= ~(SIGNOK | NDIGITS);
                      flags &= ~(SIGNOK | NDIGITS);
                      goto fok;
                      goto fok;
                    }
                    }
                  break;
                  break;
 
 
                case L'+':
                case L'+':
                case L'-':
                case L'-':
                  if (flags & SIGNOK)
                  if (flags & SIGNOK)
                    {
                    {
                      flags &= ~SIGNOK;
                      flags &= ~SIGNOK;
                      goto fok;
                      goto fok;
                    }
                    }
                  break;
                  break;
                case L'n':
                case L'n':
                case L'N':
                case L'N':
                  if (nancount == 0 && zeroes == 0
                  if (nancount == 0 && zeroes == 0
                      && (flags & (NDIGITS | DPTOK | EXPOK)) ==
                      && (flags & (NDIGITS | DPTOK | EXPOK)) ==
                                  (NDIGITS | DPTOK | EXPOK))
                                  (NDIGITS | DPTOK | EXPOK))
                    {
                    {
                      flags &= ~(SIGNOK | DPTOK | EXPOK | NDIGITS);
                      flags &= ~(SIGNOK | DPTOK | EXPOK | NDIGITS);
                      nancount = 1;
                      nancount = 1;
                      goto fok;
                      goto fok;
                    }
                    }
                  if (nancount == 2)
                  if (nancount == 2)
                    {
                    {
                      nancount = 3;
                      nancount = 3;
                      goto fok;
                      goto fok;
                    }
                    }
                  if (infcount == 1 || infcount == 4)
                  if (infcount == 1 || infcount == 4)
                    {
                    {
                      infcount++;
                      infcount++;
                      goto fok;
                      goto fok;
                    }
                    }
                  break;
                  break;
                case L'a':
                case L'a':
                case L'A':
                case L'A':
                  if (nancount == 1)
                  if (nancount == 1)
                    {
                    {
                      nancount = 2;
                      nancount = 2;
                      goto fok;
                      goto fok;
                    }
                    }
                  break;
                  break;
                case L'i':
                case L'i':
                  if (infcount == 0 && zeroes == 0
                  if (infcount == 0 && zeroes == 0
                      && (flags & (NDIGITS | DPTOK | EXPOK)) ==
                      && (flags & (NDIGITS | DPTOK | EXPOK)) ==
                                  (NDIGITS | DPTOK | EXPOK))
                                  (NDIGITS | DPTOK | EXPOK))
                    {
                    {
                      flags &= ~(SIGNOK | DPTOK | EXPOK | NDIGITS);
                      flags &= ~(SIGNOK | DPTOK | EXPOK | NDIGITS);
                      infcount = 1;
                      infcount = 1;
                      goto fok;
                      goto fok;
                    }
                    }
                  if (infcount == 3 || infcount == 5)
                  if (infcount == 3 || infcount == 5)
                    {
                    {
                      infcount++;
                      infcount++;
                      goto fok;
                      goto fok;
                    }
                    }
                  break;
                  break;
                case L'f':
                case L'f':
                case L'F':
                case L'F':
                  if (infcount == 2)
                  if (infcount == 2)
                    {
                    {
                      infcount = 3;
                      infcount = 3;
                      goto fok;
                      goto fok;
                    }
                    }
                  break;
                  break;
                case L't':
                case L't':
                case L'T':
                case L'T':
                  if (infcount == 6)
                  if (infcount == 6)
                    {
                    {
                      infcount = 7;
                      infcount = 7;
                      goto fok;
                      goto fok;
                    }
                    }
                  break;
                  break;
                case L'y':
                case L'y':
                case L'Y':
                case L'Y':
                  if (infcount == 7)
                  if (infcount == 7)
                    {
                    {
                      infcount = 8;
                      infcount = 8;
                      goto fok;
                      goto fok;
                    }
                    }
                  break;
                  break;
                case L'.':
                case L'.':
                  if (flags & DPTOK)
                  if (flags & DPTOK)
                    {
                    {
                      flags &= ~(SIGNOK | DPTOK);
                      flags &= ~(SIGNOK | DPTOK);
                      leading_zeroes = zeroes;
                      leading_zeroes = zeroes;
                      goto fok;
                      goto fok;
                    }
                    }
                  break;
                  break;
                case L'e':
                case L'e':
                case L'E':
                case L'E':
                  /* no exponent without some digits */
                  /* no exponent without some digits */
                  if ((flags & (NDIGITS | EXPOK)) == EXPOK
                  if ((flags & (NDIGITS | EXPOK)) == EXPOK
                      || ((flags & EXPOK) && zeroes))
                      || ((flags & EXPOK) && zeroes))
                    {
                    {
                      if (! (flags & DPTOK))
                      if (! (flags & DPTOK))
                        {
                        {
                          exp_adjust = zeroes - leading_zeroes;
                          exp_adjust = zeroes - leading_zeroes;
                          exp_start = p;
                          exp_start = p;
                        }
                        }
                      flags =
                      flags =
                        (flags & ~(EXPOK | DPTOK)) |
                        (flags & ~(EXPOK | DPTOK)) |
                        SIGNOK | NDIGITS;
                        SIGNOK | NDIGITS;
                      zeroes = 0;
                      zeroes = 0;
                      goto fok;
                      goto fok;
                    }
                    }
                  break;
                  break;
                }
                }
              if (c != WEOF)
              if (c != WEOF)
                _ungetwc_r (rptr, c, fp);
                _ungetwc_r (rptr, c, fp);
              break;
              break;
            fok:
            fok:
              *p++ = c;
              *p++ = c;
            fskip:
            fskip:
              width--;
              width--;
              ++nread;
              ++nread;
            }
            }
          if (zeroes)
          if (zeroes)
            flags &= ~NDIGITS;
            flags &= ~NDIGITS;
          /* We may have a 'N' or possibly even [sign] 'N' 'a' as the
          /* We may have a 'N' or possibly even [sign] 'N' 'a' as the
             start of 'NaN', only to run out of chars before it was
             start of 'NaN', only to run out of chars before it was
             complete (or having encountered a non-matching char).  So
             complete (or having encountered a non-matching char).  So
             check here if we have an outstanding nancount, and if so
             check here if we have an outstanding nancount, and if so
             put back the chars we did swallow and treat as a failed
             put back the chars we did swallow and treat as a failed
             match.
             match.
 
 
             FIXME - we still don't handle NAN([0xdigits]).  */
             FIXME - we still don't handle NAN([0xdigits]).  */
          if (nancount - 1U < 2U) /* nancount && nancount < 3 */
          if (nancount - 1U < 2U) /* nancount && nancount < 3 */
            {
            {
              /* Newlib's ungetc works even if we called __srefill in
              /* Newlib's ungetc works even if we called __srefill in
                 the middle of a partial parse, but POSIX does not
                 the middle of a partial parse, but POSIX does not
                 guarantee that in all implementations of ungetc.  */
                 guarantee that in all implementations of ungetc.  */
              while (p > buf)
              while (p > buf)
                {
                {
                  _ungetwc_r (rptr, *--p, fp); /* [-+nNaA] */
                  _ungetwc_r (rptr, *--p, fp); /* [-+nNaA] */
                  --nread;
                  --nread;
                }
                }
              goto match_failure;
              goto match_failure;
            }
            }
          /* Likewise for 'inf' and 'infinity'.  But be careful that
          /* Likewise for 'inf' and 'infinity'.  But be careful that
             'infinite' consumes only 3 characters, leaving the stream
             'infinite' consumes only 3 characters, leaving the stream
             at the second 'i'.  */
             at the second 'i'.  */
          if (infcount - 1U < 7U) /* infcount && infcount < 8 */
          if (infcount - 1U < 7U) /* infcount && infcount < 8 */
            {
            {
              if (infcount >= 3) /* valid 'inf', but short of 'infinity' */
              if (infcount >= 3) /* valid 'inf', but short of 'infinity' */
                while (infcount-- > 3)
                while (infcount-- > 3)
                  {
                  {
                    _ungetwc_r (rptr, *--p, fp); /* [iInNtT] */
                    _ungetwc_r (rptr, *--p, fp); /* [iInNtT] */
                    --nread;
                    --nread;
                  }
                  }
              else
              else
                {
                {
                  while (p > buf)
                  while (p > buf)
                    {
                    {
                      _ungetwc_r (rptr, *--p, fp); /* [-+iInN] */
                      _ungetwc_r (rptr, *--p, fp); /* [-+iInN] */
                      --nread;
                      --nread;
                    }
                    }
                  goto match_failure;
                  goto match_failure;
                }
                }
            }
            }
          /*
          /*
           * If no digits, might be missing exponent digits
           * If no digits, might be missing exponent digits
           * (just give back the exponent) or might be missing
           * (just give back the exponent) or might be missing
           * regular digits, but had sign and/or decimal point.
           * regular digits, but had sign and/or decimal point.
           */
           */
          if (flags & NDIGITS)
          if (flags & NDIGITS)
            {
            {
              if (flags & EXPOK)
              if (flags & EXPOK)
                {
                {
                  /* no digits at all */
                  /* no digits at all */
                  while (p > buf)
                  while (p > buf)
                    {
                    {
                      _ungetwc_r (rptr, *--p, fp); /* [-+.] */
                      _ungetwc_r (rptr, *--p, fp); /* [-+.] */
                      --nread;
                      --nread;
                    }
                    }
                  goto match_failure;
                  goto match_failure;
                }
                }
              /* just a bad exponent (e and maybe sign) */
              /* just a bad exponent (e and maybe sign) */
              c = *--p;
              c = *--p;
              --nread;
              --nread;
              if (c != L'e' && c != L'E')
              if (c != L'e' && c != L'E')
                {
                {
                  _ungetwc_r (rptr, c, fp); /* [-+] */
                  _ungetwc_r (rptr, c, fp); /* [-+] */
                  c = *--p;
                  c = *--p;
                  --nread;
                  --nread;
                }
                }
              _ungetwc_r (rptr, c, fp); /* [eE] */
              _ungetwc_r (rptr, c, fp); /* [eE] */
            }
            }
          if ((flags & SUPPRESS) == 0)
          if ((flags & SUPPRESS) == 0)
            {
            {
              double res = 0;
              double res = 0;
#ifdef _NO_LONGDBL
#ifdef _NO_LONGDBL
#define QUAD_RES res;
#define QUAD_RES res;
#else  /* !_NO_LONG_DBL */
#else  /* !_NO_LONG_DBL */
              long double qres = 0;
              long double qres = 0;
#define QUAD_RES qres;
#define QUAD_RES qres;
#endif /* !_NO_LONG_DBL */
#endif /* !_NO_LONG_DBL */
              long new_exp = 0;
              long new_exp = 0;
 
 
              *p = 0;
              *p = 0;
              if ((flags & (DPTOK | EXPOK)) == EXPOK)
              if ((flags & (DPTOK | EXPOK)) == EXPOK)
                {
                {
                  exp_adjust = zeroes - leading_zeroes;
                  exp_adjust = zeroes - leading_zeroes;
                  new_exp = -exp_adjust;
                  new_exp = -exp_adjust;
                  exp_start = p;
                  exp_start = p;
                }
                }
              else if (exp_adjust)
              else if (exp_adjust)
                new_exp = _wcstol_r (rptr, (exp_start + 1), NULL, 10) - exp_adjust;
                new_exp = _wcstol_r (rptr, (exp_start + 1), NULL, 10) - exp_adjust;
              if (exp_adjust)
              if (exp_adjust)
                {
                {
 
 
                  /* If there might not be enough space for the new exponent,
                  /* If there might not be enough space for the new exponent,
                     truncate some trailing digits to make room.  */
                     truncate some trailing digits to make room.  */
                  if (exp_start >= buf + sizeof (buf) - MAX_LONG_LEN)
                  if (exp_start >= buf + sizeof (buf) - MAX_LONG_LEN)
                    exp_start = buf + sizeof (buf) - MAX_LONG_LEN - 1;
                    exp_start = buf + sizeof (buf) - MAX_LONG_LEN - 1;
                 swprintf (exp_start, MAX_LONG_LEN, L"e%ld", new_exp);
                 swprintf (exp_start, MAX_LONG_LEN, L"e%ld", new_exp);
                }
                }
 
 
              /* FIXME: We don't have wcstold yet. */
              /* FIXME: We don't have wcstold yet. */
#if 0//ndef _NO_LONGDBL /* !_NO_LONGDBL */
#if 0//ndef _NO_LONGDBL /* !_NO_LONGDBL */
              if (flags & LONGDBL)
              if (flags & LONGDBL)
                qres = _wcstold_r (rptr, buf, NULL);
                qres = _wcstold_r (rptr, buf, NULL);
              else
              else
#endif
#endif
                res = _wcstod_r (rptr, buf, NULL);
                res = _wcstod_r (rptr, buf, NULL);
 
 
              if (flags & LONG)
              if (flags & LONG)
                {
                {
                  dp = GET_ARG (N, ap, double *);
                  dp = GET_ARG (N, ap, double *);
                  *dp = res;
                  *dp = res;
                }
                }
              else if (flags & LONGDBL)
              else if (flags & LONGDBL)
                {
                {
                  ldp = GET_ARG (N, ap, _LONG_DOUBLE *);
                  ldp = GET_ARG (N, ap, _LONG_DOUBLE *);
                  *ldp = QUAD_RES;
                  *ldp = QUAD_RES;
                }
                }
              else
              else
                {
                {
                  flp = GET_ARG (N, ap, float *);
                  flp = GET_ARG (N, ap, float *);
                  if (isnan (res))
                  if (isnan (res))
                    *flp = nanf (NULL);
                    *flp = nanf (NULL);
                  else
                  else
                    *flp = res;
                    *flp = res;
                }
                }
              nassigned++;
              nassigned++;
            }
            }
          break;
          break;
        }
        }
#endif /* FLOATING_POINT */
#endif /* FLOATING_POINT */
        }
        }
    }
    }
input_failure:
input_failure:
  /* On read failure, return EOF failure regardless of matches; errno
  /* On read failure, return EOF failure regardless of matches; errno
     should have been set prior to here.  On EOF failure (including
     should have been set prior to here.  On EOF failure (including
     invalid format string), return EOF if no matches yet, else number
     invalid format string), return EOF if no matches yet, else number
     of matches made prior to failure.  */
     of matches made prior to failure.  */
  _funlockfile (fp);
  _funlockfile (fp);
  __sfp_lock_release ();
  __sfp_lock_release ();
  return nassigned && !(fp->_flags & __SERR) ? nassigned : EOF;
  return nassigned && !(fp->_flags & __SERR) ? nassigned : EOF;
match_failure:
match_failure:
all_done:
all_done:
  /* Return number of matches, which can be 0 on match failure.  */
  /* Return number of matches, which can be 0 on match failure.  */
  _funlockfile (fp);
  _funlockfile (fp);
  __sfp_lock_release ();
  __sfp_lock_release ();
  return nassigned;
  return nassigned;
}
}
 
 
#ifndef _NO_POS_ARGS
#ifndef _NO_POS_ARGS
/* Process all intermediate arguments.  Fortunately, with wscanf, all
/* Process all intermediate arguments.  Fortunately, with wscanf, all
   intermediate arguments are sizeof(void*), so we don't need to scan
   intermediate arguments are sizeof(void*), so we don't need to scan
   ahead in the format string.  */
   ahead in the format string.  */
static void *
static void *
get_arg (int n, va_list *ap, int *numargs_p, void **args)
get_arg (int n, va_list *ap, int *numargs_p, void **args)
{
{
  int numargs = *numargs_p;
  int numargs = *numargs_p;
  while (n >= numargs)
  while (n >= numargs)
    args[numargs++] = va_arg (*ap, void *);
    args[numargs++] = va_arg (*ap, void *);
  *numargs_p = numargs;
  *numargs_p = numargs;
  return args[n];
  return args[n];
}
}
#endif /* !_NO_POS_ARGS */
#endif /* !_NO_POS_ARGS */
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.