153 lines
5 KiB
C
153 lines
5 KiB
C
|
/***
|
||
|
*sscanf.c - read formatted data from string
|
||
|
*
|
||
|
* Copyright (c) 1985-2001, Microsoft Corporation. All rights reserved.
|
||
|
*
|
||
|
*Purpose:
|
||
|
* defines scanf() - reads formatted data from string
|
||
|
*
|
||
|
*Revision History:
|
||
|
* 09-02-83 RN initial version
|
||
|
* 04-13-87 JCR added const to declaration
|
||
|
* 06-24-87 JCR (1) Made declaration conform to ANSI prototype and use
|
||
|
* the va_ macros; (2) removed SS_NE_DS conditionals.
|
||
|
* 12-11-87 JCR Added "_LOAD_DS" to declaration
|
||
|
* 06-13-88 JCR Fake _iob entry is now static so that other routines can
|
||
|
* assume _iob entries are in DGROUP.
|
||
|
* 06-06-89 JCR 386 mthread support -- threads share one locked iob.
|
||
|
* 08-18-89 GJF Clean up, now specific to OS/2 2.0 (i.e., 386 flat
|
||
|
* model). Also fixed indents.
|
||
|
* 02-16-90 GJF Fixed copyright
|
||
|
* 03-19-90 GJF Made calling type _CALLTYPE2, added #include
|
||
|
* <cruntime.h> and removed #include <register.h>.
|
||
|
* 03-26-90 GJF Added #include <string.h>.
|
||
|
* 07-23-90 SBM Replaced <assertm.h> by <assert.h>
|
||
|
* 10-03-90 GJF New-style function declarator.
|
||
|
* 02-18-93 SRW Make FILE a local and remove lock usage.
|
||
|
* 04-06-93 SKS Replace _CRTAPI* with __cdecl
|
||
|
* 02-06-94 CFW assert -> _ASSERTE.
|
||
|
* 01-06-99 GJF Changes for 64-bit size_t.
|
||
|
*
|
||
|
*******************************************************************************/
|
||
|
|
||
|
#include <cruntime.h>
|
||
|
#include <stdio.h>
|
||
|
#include <dbgint.h>
|
||
|
#include <stdarg.h>
|
||
|
#include <string.h>
|
||
|
#include <internal.h>
|
||
|
#include <mtdll.h>
|
||
|
#include <tchar.h>
|
||
|
|
||
|
/***
|
||
|
*int sscanf(string, format, ...) - read formatted data from string
|
||
|
*
|
||
|
*Purpose:
|
||
|
* Reads formatted data from string into arguments. _input does the real
|
||
|
* work here. Sets up a FILE so file i/o operations can be used, makes
|
||
|
* string look like a huge buffer to it, but _filbuf will refuse to refill
|
||
|
* it if it is exhausted.
|
||
|
*
|
||
|
* Allocate the 'fake' _iob[] entryit statically instead of on
|
||
|
* the stack so that other routines can assume that _iob[] entries are in
|
||
|
* are in DGROUP and, thus, are near.
|
||
|
*
|
||
|
* Multi-thread: (1) Since there is no stream, this routine must never try
|
||
|
* to get the stream lock (i.e., there is no stream lock either). (2)
|
||
|
* Also, since there is only one staticly allocated 'fake' iob, we must
|
||
|
* lock/unlock to prevent collisions.
|
||
|
*
|
||
|
*Entry:
|
||
|
* char *string - string to read data from
|
||
|
* char *format - format string
|
||
|
* followed by list of pointers to storage for the data read. The number
|
||
|
* and type are controlled by the format string.
|
||
|
*
|
||
|
*Exit:
|
||
|
* returns number of fields read and assigned
|
||
|
*
|
||
|
*Exceptions:
|
||
|
*
|
||
|
*******************************************************************************/
|
||
|
/***
|
||
|
*int snscanf(string, size, format, ...) - read formatted data from string of
|
||
|
* given length
|
||
|
*
|
||
|
*Purpose:
|
||
|
* Reads formatted data from string into arguments. _input does the real
|
||
|
* work here. Sets up a FILE so file i/o operations can be used, makes
|
||
|
* string look like a huge buffer to it, but _filbuf will refuse to refill
|
||
|
* it if it is exhausted.
|
||
|
*
|
||
|
* Allocate the 'fake' _iob[] entryit statically instead of on
|
||
|
* the stack so that other routines can assume that _iob[] entries are in
|
||
|
* are in DGROUP and, thus, are near.
|
||
|
*
|
||
|
* Multi-thread: (1) Since there is no stream, this routine must never try
|
||
|
* to get the stream lock (i.e., there is no stream lock either). (2)
|
||
|
* Also, since there is only one staticly allocated 'fake' iob, we must
|
||
|
* lock/unlock to prevent collisions.
|
||
|
*
|
||
|
*Entry:
|
||
|
* char *string - string to read data from
|
||
|
* size_t count - length of string
|
||
|
* char *format - format string
|
||
|
* followed by list of pointers to storage for the data read. The number
|
||
|
* and type are controlled by the format string.
|
||
|
*
|
||
|
*Exit:
|
||
|
* returns number of fields read and assigned
|
||
|
*
|
||
|
*Exceptions:
|
||
|
*
|
||
|
*******************************************************************************/
|
||
|
#ifdef _UNICODE
|
||
|
#ifdef _SNSCANF
|
||
|
int __cdecl _snwscanf (
|
||
|
#else
|
||
|
int __cdecl swscanf (
|
||
|
#endif
|
||
|
#else
|
||
|
#ifdef _SNSCANF
|
||
|
int __cdecl _snscanf (
|
||
|
#else
|
||
|
int __cdecl sscanf (
|
||
|
#endif
|
||
|
#endif
|
||
|
REG2 const _TCHAR *string,
|
||
|
#ifdef _SNSCANF
|
||
|
size_t count,
|
||
|
#endif
|
||
|
const _TCHAR *format,
|
||
|
...
|
||
|
)
|
||
|
/*
|
||
|
* 'S'tring 'SCAN', 'F'ormatted
|
||
|
*/
|
||
|
{
|
||
|
va_list arglist;
|
||
|
FILE str;
|
||
|
REG1 FILE *infile = &str;
|
||
|
REG2 int retval;
|
||
|
|
||
|
va_start(arglist, format);
|
||
|
|
||
|
_ASSERTE(string != NULL);
|
||
|
_ASSERTE(format != NULL);
|
||
|
|
||
|
infile->_flag = _IOREAD|_IOSTRG|_IOMYBUF;
|
||
|
infile->_ptr = infile->_base = (char *) string;
|
||
|
#ifdef _SNSCANF
|
||
|
infile->_cnt = (int)count*sizeof(_TCHAR);
|
||
|
#else
|
||
|
infile->_cnt = ((int)_tcslen(string))*sizeof(_TCHAR);
|
||
|
#endif
|
||
|
#ifdef _UNICODE
|
||
|
retval = (_winput(infile,format,arglist));
|
||
|
#else
|
||
|
retval = (_input(infile,format,arglist));
|
||
|
#endif
|
||
|
|
||
|
return(retval);
|
||
|
}
|