Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/stdio/nano-vfscanf.c')
-rw-r--r--newlib/libc/stdio/nano-vfscanf.c497
1 files changed, 0 insertions, 497 deletions
diff --git a/newlib/libc/stdio/nano-vfscanf.c b/newlib/libc/stdio/nano-vfscanf.c
deleted file mode 100644
index 6a827567a..000000000
--- a/newlib/libc/stdio/nano-vfscanf.c
+++ /dev/null
@@ -1,497 +0,0 @@
-/*-
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-/*
- * Copyright (c) 2012-2014 ARM Ltd
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the company may not be used to endorse or promote
- * products derived from this software without specific prior written
- * permission.
- *
- * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
-FUNCTION
-<<vfscanf>>, <<vscanf>>, <<vsscanf>>---format argument list
-
-INDEX
- vfscanf
-INDEX
- _vfscanf_r
-INDEX
- vscanf
-INDEX
- _vscanf_r
-INDEX
- vsscanf
-INDEX
- _vsscanf_r
-
-ANSI_SYNOPSIS
- #include <stdio.h>
- #include <stdarg.h>
- int vscanf(const char *<[fmt]>, va_list <[list]>);
- int vfscanf(FILE *<[fp]>, const char *<[fmt]>, va_list <[list]>);
- int vsscanf(const char *<[str]>, const char *<[fmt]>, va_list <[list]>);
-
- int _vscanf_r(struct _reent *<[reent]>, const char *<[fmt]>,
- va_list <[list]>);
- int _vfscanf_r(struct _reent *<[reent]>, FILE *<[fp]>, const char *<[fmt]>,
- va_list <[list]>);
- int _vsscanf_r(struct _reent *<[reent]>, const char *<[str]>,
- const char *<[fmt]>, va_list <[list]>);
-
-TRAD_SYNOPSIS
- #include <stdio.h>
- #include <varargs.h>
- int vscanf( <[fmt]>, <[ist]>)
- char *<[fmt]>;
- va_list <[list]>;
-
- int vfscanf( <[fp]>, <[fmt]>, <[list]>)
- FILE *<[fp]>;
- char *<[fmt]>;
- va_list <[list]>;
-
- int vsscanf( <[str]>, <[fmt]>, <[list]>)
- char *<[str]>;
- char *<[fmt]>;
- va_list <[list]>;
-
- int _vscanf_r( <[reent]>, <[fmt]>, <[ist]>)
- struct _reent *<[reent]>;
- char *<[fmt]>;
- va_list <[list]>;
-
- int _vfscanf_r( <[reent]>, <[fp]>, <[fmt]>, <[list]>)
- struct _reent *<[reent]>;
- FILE *<[fp]>;
- char *<[fmt]>;
- va_list <[list]>;
-
- int _vsscanf_r( <[reent]>, <[str]>, <[fmt]>, <[list]>)
- struct _reent *<[reent]>;
- char *<[str]>;
- char *<[fmt]>;
- va_list <[list]>;
-
-DESCRIPTION
-<<vscanf>>, <<vfscanf>>, and <<vsscanf>> are (respectively) variants
-of <<scanf>>, <<fscanf>>, and <<sscanf>>. They differ only in
-allowing their caller to pass the variable argument list as a
-<<va_list>> object (initialized by <<va_start>>) rather than
-directly accepting a variable number of arguments.
-
-RETURNS
-The return values are consistent with the corresponding functions:
-<<vscanf>> returns the number of input fields successfully scanned,
-converted, and stored; the return value does not include scanned
-fields which were not stored.
-
-If <<vscanf>> attempts to read at end-of-file, the return value
-is <<EOF>>.
-
-If no fields were stored, the return value is <<0>>.
-
-The routines <<_vscanf_r>>, <<_vfscanf_f>>, and <<_vsscanf_r>> are
-reentrant versions which take an additional first parameter which points to the
-reentrancy structure.
-
-PORTABILITY
-These are GNU extensions.
-
-Supporting OS subroutines required:
-*/
-
-#include <_ansi.h>
-#include <reent.h>
-#include <newlib.h>
-#include <ctype.h>
-#include <wctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <limits.h>
-#include <wchar.h>
-#include <string.h>
-#include <stdarg.h>
-#include <errno.h>
-#include "local.h"
-#include "../stdlib/local.h"
-#include "nano-vfscanf_local.h"
-
-#define VFSCANF vfscanf
-#define _VFSCANF_R _vfscanf_r
-#define __SVFSCANF __svfscanf
-#ifdef STRING_ONLY
-# define __SVFSCANF_R __ssvfscanf_r
-#else
-# define __SVFSCANF_R __svfscanf_r
-#endif
-
-/* vfscanf. */
-
-#ifndef STRING_ONLY
-
-#ifndef _REENT_ONLY
-
-int
-_DEFUN(VFSCANF, (fp, fmt, ap),
- register FILE *fp _AND
- _CONST char *fmt _AND
- va_list ap)
-{
- CHECK_INIT(_REENT, fp);
- return __SVFSCANF_R (_REENT, fp, fmt, ap);
-}
-
-int
-_EXFUN(vfiscanf, (FILE *, const char *, __VALIST)
- _ATTRIBUTE ((__alias__("vfscanf"))));
-
-int
-_DEFUN(__SVFSCANF, (fp, fmt0, ap),
- register FILE *fp _AND
- char _CONST *fmt0 _AND
- va_list ap)
-{
- return __SVFSCANF_R (_REENT, fp, fmt0, ap);
-}
-
-#endif
-
-int
-_DEFUN(_VFSCANF_R, (data, fp, fmt, ap),
- struct _reent *data _AND
- register FILE *fp _AND
- _CONST char *fmt _AND
- va_list ap)
-{
- CHECK_INIT(data, fp);
- return __SVFSCANF_R (data, fp, fmt, ap);
-}
-
-int
-_EXFUN(_vfiscanf_r, (struct _reent *, FILE *, const char *, __VALIST)
- _ATTRIBUTE ((__alias__("_vfscanf_r"))));
-#endif /* !STRING_ONLY. */
-
-#if defined (STRING_ONLY)
-/* When dealing with the sscanf family, we don't want to use the
- regular ungetc which will drag in file I/O items we don't need.
- So, we create our own trimmed-down version. */
-int
-_DEFUN(_sungetc_r, (data, fp, ch),
- struct _reent *data _AND
- int c _AND
- register FILE *fp)
-{
- if (c == EOF)
- return (EOF);
-
- /* After ungetc, we won't be at eof anymore. */
- fp->_flags &= ~__SEOF;
- c = (unsigned char) c;
-
- /* If we are in the middle of ungetc'ing, just continue.
- This may require expanding the current ungetc buffer. */
-
- if (HASUB (fp))
- {
- if (fp->_r >= fp->_ub._size && __submore (data, fp))
- return EOF;
-
- *--fp->_p = c;
- fp->_r++;
- return c;
- }
-
- /* If we can handle this by simply backing up, do so,
- but never replace the original character.
- (This makes sscanf() work when scanning `const' data). */
- if (fp->_bf._base != NULL && fp->_p > fp->_bf._base && fp->_p[-1] == c)
- {
- fp->_p--;
- fp->_r++;
- return c;
- }
-
- /* Create an ungetc buffer.
- Initially, we will use the `reserve' buffer. */
- fp->_ur = fp->_r;
- fp->_up = fp->_p;
- fp->_ub._base = fp->_ubuf;
- fp->_ub._size = sizeof (fp->_ubuf);
- fp->_ubuf[sizeof (fp->_ubuf) - 1] = c;
- fp->_p = &fp->_ubuf[sizeof (fp->_ubuf) - 1];
- fp->_r = 1;
- return c;
-}
-
-/* String only version of __srefill_r for sscanf family. */
-int
-_DEFUN(__ssrefill_r, (ptr, fp),
- struct _reent * ptr _AND
- register FILE * fp)
-{
- /* Our only hope of further input is the ungetc buffer.
- If there is anything in that buffer to read, return. */
- if (HASUB (fp))
- {
- FREEUB (ptr, fp);
- if ((fp->_r = fp->_ur) != 0)
- {
- fp->_p = fp->_up;
- return 0;
- }
- }
-
- /* Otherwise we are out of character input. */
- fp->_p = fp->_bf._base;
- fp->_r = 0;
- fp->_flags |= __SEOF;
- return EOF;
-}
-
-#else
-int _EXFUN (_sungetc_r, (struct _reent *, int, register FILE *));
-int _EXFUN (__ssrefill_r, (struct _reent *, register FILE *));
-size_t _EXFUN (_sfread_r, (struct _reent *, _PTR buf, size_t, size_t, FILE *));
-#endif /* !STRING_ONLY. */
-
-int
-_DEFUN(__SVFSCANF_R, (rptr, fp, fmt0, ap),
- struct _reent *rptr _AND
- register FILE *fp _AND
- char _CONST *fmt0 _AND
- va_list ap)
-{
- register u_char *fmt = (u_char *) fmt0;
- register int c; /* Character from format, or conversion. */
- register char *p; /* Points into all kinds of strings. */
- char ccltab[256]; /* Character class table for %[...]. */
-
- int ret;
- char *cp;
-
- struct _scan_data_t scan_data;
- int (*scan_func)(struct _reent*, struct _scan_data_t*, FILE *, va_list *);
-
- _newlib_flockfile_start (fp);
-
- scan_data.nassigned = 0;
- scan_data.nread = 0;
- scan_data.ccltab = ccltab;
- scan_data.pfn_ungetc = _ungetc_r;
- scan_data.pfn_refill = __srefill_r;
-
- for (;;)
- {
- if (*fmt == 0)
- goto all_done;
-
- if (isspace (*fmt))
- {
- while ((fp->_r > 0 || !scan_data.pfn_refill(rptr, fp))
- && isspace (*fp->_p))
- {
- scan_data.nread++;
- fp->_r--;
- fp->_p++;
- }
- fmt++;
- continue;
- }
- if ((c = *fmt++) != '%')
- goto literal;
-
- scan_data.width = 0;
- scan_data.flags = 0;
-
- if (*fmt == '*')
- {
- scan_data.flags |= SUPPRESS;
- fmt++;
- }
-
- for (; is_digit (*fmt); fmt++)
- scan_data.width = 10 * scan_data.width + to_digit (*fmt);
-
- /* The length modifiers. */
- p = "hlL";
- if ((cp = memchr (p, *fmt, 3)) != NULL) {
- scan_data.flags |= (SHORT << (cp - p));
- fmt++;
- }
-
- /* Switch on the format. continue if done; break once format
- type is derived. */
- c = *fmt++;
- switch (c)
- {
- case '%':
- literal:
- if ((fp->_r <= 0 && scan_data.pfn_refill(rptr, fp)))
- goto input_failure;
- if (*fp->_p != c)
- goto match_failure;
- fp->_r--, fp->_p++;
- scan_data.nread++;
- continue;
-
- case 'p':
- scan_data.flags |= POINTER;
- case 'x':
- scan_data.flags |= PFXOK;
- scan_data.base = 16;
- goto number;
- case 'd':
- case 'u':
- scan_data.base = 10;
- goto number;
- case 'i':
- scan_data.base = 0;
- goto number;
- case 'o':
- scan_data.base = 8;
- number:
- scan_data.code = (c < 'o') ? CT_INT : CT_UINT;
- break;
-
- case '[':
- fmt = (u_char *) __sccl (ccltab, (unsigned char *) fmt);
- scan_data.flags |= NOSKIP;
- scan_data.code = CT_CCL;
- break;
- case 'c':
- scan_data.flags |= NOSKIP;
- scan_data.code = CT_CHAR;
- break;
- case 's':
- scan_data.code = CT_STRING;
- break;
-
- case 'n':
- if (scan_data.flags & SUPPRESS) /* ??? */
- continue;
-
- if (scan_data.flags & SHORT)
- *GET_ARG (N, ap, short *) = scan_data.nread;
- else if (scan_data.flags & LONG)
- *GET_ARG (N, ap, long *) = scan_data.nread;
- else
- *GET_ARG (N, ap, int *) = scan_data.nread;
-
- continue;
-
- /* Disgusting backwards compatibility hacks. XXX. */
- case '\0': /* compat. */
- _newlib_flockfile_exit (fp);
- return EOF;
-
-#ifdef FLOATING_POINT
- case 'e':
- case 'f':
- case 'g':
- scan_data.code = CT_FLOAT;
- break;
-#endif
- default: /* compat. */
- scan_data.code = CT_INT;
- scan_data.base = 10;
- break;
- }
-
- /* We have a conversion that requires input. */
- if ((fp->_r <= 0 && scan_data.pfn_refill (rptr, fp)))
- goto input_failure;
-
- /* Consume leading white space, except for formats that
- suppress this. */
- if ((scan_data.flags & NOSKIP) == 0)
- {
- while (isspace (*fp->_p))
- {
- scan_data.nread++;
- if (--fp->_r > 0)
- fp->_p++;
- else if (scan_data.pfn_refill (rptr, fp))
- goto input_failure;
- }
- /* Note that there is at least one character in the
- buffer, so conversions that do not set NOSKIP ca
- no longer result in an input failure. */
- }
- ret = 0;
- if (scan_data.code < CT_INT)
- ret = _scanf_chars (rptr, &scan_data, fp, &ap);
- else if (scan_data.code < CT_FLOAT)
- ret = _scanf_i (rptr, &scan_data, fp, &ap);
-#ifdef FLOATING_POINT
- else if (_scanf_float)
- ret = _scanf_float (rptr, &scan_data, fp, &ap);
-#endif
-
- if (ret == MATCH_FAILURE)
- goto match_failure;
- else if (ret == INPUT_FAILURE)
- goto input_failure;
- }
-input_failure:
- /* On read failure, return EOF failure regardless of matches; errno
- should have been set prior to here. On EOF failure (including
- invalid format string), return EOF if no matches yet, else number
- of matches made prior to failure. */
- _newlib_flockfile_exit (fp);
- return scan_data.nassigned && !(fp->_flags & __SERR) ? scan_data.nassigned
- : EOF;
-match_failure:
-all_done:
- /* Return number of matches, which can be 0 on match failure. */
- _newlib_flockfile_end (fp);
- return scan_data.nassigned;
-}
-
-#ifdef STRING_ONLY
-int
-_EXFUN(__ssvfiscanf_r, (struct _reent *, FILE *, const char *, __VALIST)
- _ATTRIBUTE ((__alias__("__ssvfscanf_r"))));
-#else
-int
-_EXFUN(__svfiscanf_r, (struct _reent *, FILE *, const char *, __VALIST)
- _ATTRIBUTE ((__alias__("__svfscanf_r"))));
-#endif
-