aboutsummaryrefslogtreecommitdiff
path: root/newlib/libc/stdio/siscanf.c
blob: a64e2a891320396a7418e0ad22fb93fd39b4434c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
/*
 * 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.
 */

/*
FUNCTION
<<siscanf>>, <<fiscanf>>, <<iscanf>>---scan and format non-floating input

INDEX
	iscanf
INDEX
	fiscanf
INDEX
	siscanf

ANSI_SYNOPSIS
        #include <stdio.h>

        int iscanf(const char *<[format]> [, <[arg]>, ...]);
        int fiscanf(FILE *<[fd]>, const char *<[format]> [, <[arg]>, ...]);
        int siscanf(const char *<[str]>, const char *<[format]> 
                   [, <[arg]>, ...]);

        int _iscanf_r(struct _reent *<[ptr]>, const char *<[format]>
                   [, <[arg]>, ...]);
        int _fiscanf_r(struct _reent *<[ptr]>, FILE *<[fd]>, const char *<[format]>
                   [, <[arg]>, ...]);
        int _siscanf_r(struct _reent *<[ptr]>, const char *<[str]>,
                   const char *<[format]> [, <[arg]>, ...]);


TRAD_SYNOPSIS
	#include <stdio.h>

	int iscanf(<[format]> [, <[arg]>, ...])
	char *<[format]>;

	int fiscanf(<[fd]>, <[format]> [, <[arg]>, ...]);
	FILE *<[fd]>;
	char *<[format]>;

	int siscanf(<[str]>, <[format]> [, <[arg]>, ...]);
	char *<[str]>;
	char *<[format]>;

	int _iscanf_r(<[ptr]>, <[format]> [, <[arg]>, ...])
        struct _reent *<[ptr]>;
	char *<[format]>;

	int _fiscanf_r(<[ptr]>, <[fd]>, <[format]> [, <[arg]>, ...]);
        struct _reent *<[ptr]>;
	FILE *<[fd]>;
	char *<[format]>;

	int _siscanf_r(<[ptr]>, <[str]>, <[format]> [, <[arg]>, ...]);
        struct _reent *<[ptr]>;
	char *<[str]>;
	char *<[format]>;


DESCRIPTION
        <<iscanf>>, <<fiscanf>>, and <<siscanf>> are the same as
	<<scanf>>, <<fscanf>>, and <<sscanf>> respectively, only that
	they restrict the available formats to non-floating-point
	format specifiers.

        The routines <<_iscanf_r>>, <<_fiscanf_r>>, and <<_siscanf_r>> are reentrant
        versions of <<iscanf>>, <<fiscanf>>, and <<siscanf>> that take an additional
        first argument pointing to a reentrancy structure.

RETURNS
        <<iscanf>> returns the number of input fields successfully
        scanned, converted and stored; the return value does
        not include scanned fields which were not stored.

        If <<iscanf>> attempts to read at end-of-file, the return
        value is <<EOF>>.

        If no fields were stored, the return value is <<0>>.

PORTABILITY
<<iscanf>>, <<fiscanf>>, and <<siscanf>> are newlib extensions.

Supporting OS subroutines required: <<close>>, <<fstat>>, <<isatty>>,
<<lseek>>, <<read>>, <<sbrk>>, <<write>>.
*/

#include <_ansi.h>
#include <reent.h>
#include <stdio.h>
#include <string.h>
#ifdef _HAVE_STDC
#include <stdarg.h>
#else
#include <varargs.h>
#endif
#include "local.h"

/* | ARGSUSED */
/*SUPPRESS 590*/
static _READ_WRITE_RETURN_TYPE
_DEFUN(eofread, (ptr, cookie, buf, len),
       struct _reent *ptr _AND
       _PTR cookie _AND
       char *buf   _AND
       int len)
{
  return 0;
}

#ifndef _REENT_ONLY 

#ifdef _HAVE_STDC
int 
_DEFUN(siscanf, (str, fmt),
       _CONST char *str _AND
       _CONST char *fmt _DOTS)
#else
int 
siscanf(str, fmt, va_alist)
       _CONST char *str;
       _CONST char *fmt;
       va_dcl
#endif
{
  int ret;
  va_list ap;
  FILE f;

  f._flags = __SRD | __SSTR;
  f._bf._base = f._p = (unsigned char *) str;
  f._bf._size = f._r = strlen (str);
  f._read = eofread;
  f._ub._base = NULL;
  f._lb._base = NULL;
  f._file = -1;  /* No file. */
#ifdef _HAVE_STDC
  va_start (ap, fmt);
#else
  va_start (ap);
#endif
  ret = __ssvfiscanf_r (_REENT, &f, fmt, ap);
  va_end (ap);
  return ret;
}

#endif /* !_REENT_ONLY */

#ifdef _HAVE_STDC
int 
_DEFUN(_siscanf_r, (ptr, str, fmt), 
       struct _reent *ptr _AND
       _CONST char *str   _AND
       _CONST char *fmt _DOTS)
#else
int 
_siscanf_r(ptr, str, fmt, va_alist)
          struct _reent *ptr;
          _CONST char *str;
          _CONST char *fmt;
          va_dcl
#endif
{
  int ret;
  va_list ap;
  FILE f;

  f._flags = __SRD | __SSTR;
  f._bf._base = f._p = (unsigned char *) str;
  f._bf._size = f._r = strlen (str);
  f._read = eofread;
  f._ub._base = NULL;
  f._lb._base = NULL;
  f._file = -1;  /* No file. */
#ifdef _HAVE_STDC
  va_start (ap, fmt);
#else
  va_start (ap);
#endif
  ret = __ssvfiscanf_r (ptr, &f, fmt, ap);
  va_end (ap);
  return ret;
}