input.c
来自「不错的东西 请查看 WINCE OS」· C语言 代码 · 共 1,160 行 · 第 1/3 页
C
1,160 行
started = 0;
if (started)
if (!suppress) {
++count;
assign_num:
#if _INTEGRAL_MAX_BITS >= 64
if ( integer64 )
*(__int64 UNALIGNED *)pointer = (unsigned __int64)num64;
else
#endif
if (longone)
*(long UNALIGNED *)pointer = (unsigned long)number;
else
*(short UNALIGNED *)pointer = (unsigned short)number;
} else /*NULL*/;
else
goto error_return;
break;
case CRT_T('n') : /* char count, don't inc return value */
number = charcount;
if(!suppress)
goto assign_num; /* found in number code above */
break;
case CRT_T('e') :
/* case CRT_T('E') : */
case CRT_T('f') :
case CRT_T('g') : /* scan a float */
/* case CRT_T('G') : */
#ifndef CRT_UNICODE
scanptr = floatstring;
if (CRT_T('-') == ch) {
*scanptr++ = CRT_T('-');
goto f_incwidth;
} else if (CRT_T('+') == ch) {
f_incwidth:
--width;
ch = INC();
}
if (!widthset || width > CVTBUFSIZE) /* must watch width */
width = CVTBUFSIZE;
/* now get integral part */
while (_ISDIGIT(ch) && width--) {
++started;
*scanptr++ = (char)ch;
ch = INC();
}
/* now check for decimal */
if ('.' == (char)ch && width--) {
ch = INC();
*scanptr++ = '.';
while (_ISDIGIT(ch) && width--) {
++started;
*scanptr++ = (char)ch;
ch = INC();
}
}
/* now check for exponent */
if (started && (CRT_T('e') == ch || CRT_T('E') == ch) && width--) {
*scanptr++ = 'e';
if (CRT_T('-') == (ch = INC())) {
*scanptr++ = '-';
goto f_incwidth2;
} else if (CRT_T('+') == ch) {
f_incwidth2:
if (!width--)
++width;
else
ch = INC();
}
while (_ISDIGIT(ch) && width--) {
++started;
*scanptr++ = (char)ch;
ch = INC();
}
}
UN_INC(ch);
if (started)
if (!suppress) {
++count;
*scanptr = '\0';
_fassign( longone-1, pointer , floatstring);
} else /*NULL */;
else
goto error_return;
#else /* CRT_UNICODE */
wptr = floatstring;
if (L'-' == ch) {
*wptr++ = L'-';
goto f_incwidthw;
} else if (L'+' == ch) {
f_incwidthw:
--width;
ch = INC();
}
if (!widthset || width > CVTBUFSIZE)
width = CVTBUFSIZE;
/* now get integral part */
while (_ISDIGIT(ch) && width--) {
++started;
*wptr++ = ch;
ch = INC();
}
/* now check for decimal */
if ('.' == ch && width--) {
ch = INC();
*wptr++ = '.';
while (_ISDIGIT(ch) && width--) {
++started;
*wptr++ = ch;
ch = INC();
}
}
/* now check for exponent */
if (started && (L'e' == ch || L'E' == ch) && width--) {
*wptr++ = L'e';
if (L'-' == (ch = INC())) {
*wptr++ = L'-';
goto f_incwidth2w;
} else if (L'+' == ch) {
f_incwidth2w:
if (!width--)
++width;
else
ch = INC();
}
while (_ISDIGIT(ch) && width--) {
++started;
*wptr++ = ch;
ch = INC();
}
}
UN_INC(ch);
if (started)
if (!suppress) {
++count;
*wptr = '\0';
{
/* convert floatstring to char string */
/* and do the conversion */
size_t cfslength;
char *cfloatstring;
cfslength =(wptr-floatstring+1)*sizeof(wchar_t);
cfloatstring = (char *)_malloc_crt (cfslength);
wcstombs (cfloatstring, floatstring, cfslength);
_fassign( longone-1, pointer , cfloatstring);
_free_crt (cfloatstring);
}
} else /*NULL */;
else
goto error_return;
#endif /* CRT_UNICODE */
break;
default: /* either found '%' or something else */
if ((int)*format != (int)ch) {
UN_INC(ch);
goto error_return;
}
else
match--; /* % found, compensate for inc below */
if (!suppress)
arglist = arglistsave;
} /* SWITCH */
match++; /* matched a format field - set flag */
} /* WHILE (width) */
else { /* zero-width field in format string */
UN_INC(ch); /* check for input error */
goto error_return;
}
++format; /* skip to next char */
} else /* ('%' != *format) */
{
if ((int)*format++ != (int)(ch = INC()))
{
UN_INC(ch);
goto error_return;
}
#ifndef CRT_UNICODE
if (isleadbyte((BYTE)ch))
{
int ch2;
if ((int)*format++ != (ch2=INC()))
{
UN_INC(ch2);
UN_INC(ch);
goto error_return;
}
--charcount; /* only count as one character read */
}
#endif
}
#ifndef CPRFLAG
if ( (_eof_char == ch) && ((*format != '%') || (*(format + 1) != 'n')) )
break;
#endif
} /* WHILE (*format) */
error_return:
#ifndef CPRFLAG
if (_eof_char == ch)
/* If any fields were matched or assigned, return count */
/* Phil Lucido (MS) email: "MSDN is wrong on fwscanf, and the
* new docs in VS7 have it correctly - the return value for errors
* is supposed to be EOF, not WEOF. (7/11/01)
*/
return ( (count || match) ? count : EOF);
else
#endif
return count;
}
/* _hextodec() returns a value of 0-15 and expects a char 0-9, a-f, A-F */
/* _inc() is the one place where we put the actual getc code. */
/* _whiteout() returns the first non-blank character, as defined by isspace() */
#ifndef CRT_UNICODE
static int __cdecl _hextodec (
int chr
)
{
return _ISDIGIT(chr) ? chr : (chr & ~(CRT_T('a') - CRT_T('A'))) - CRT_T('A') + 10 + CRT_T('0');
}
#else
static CRT__TCHAR __cdecl _hextodec (
CRT__TCHAR chr
)
{
if (_ISDIGIT(chr))
return chr;
if (_istlower(chr))
return (CRT__TCHAR)(chr - CRT_T('a') + 10 + CRT_T('0'));
else
return (CRT__TCHAR)(chr - CRT_T('A') + 10 + CRT_T('0'));
}
#endif
#ifdef CPRFLAG
static int __cdecl _inc (
void
)
{
return(_getche_lk());
}
static int __cdecl _whiteout (
REG1 int *counter
)
{
REG2 int ch;
while((_istspace)(ch = (++*counter, _inc())));
return ch;
}
#elif defined(CRT_UNICODE)
/*
* Manipulate wide-chars in a file.
* A wide-char is hard-coded to be two chars for efficiency.
*/
static wchar_t __cdecl _inc (
REG1 FILEX *fileptr
)
{
return(_getwc_lk(fileptr));
}
static void __cdecl _un_inc (
wchar_t chr,
FILEX *fileptr
)
{
if (WEOF != chr)
_ungetwc_lk(chr, fileptr);
}
static wchar_t __cdecl _whiteout (
REG1 int *counter,
REG3 FILEX *fileptr
)
{
REG2 wchar_t ch;
while((iswspace)(ch = (++*counter, _inc(fileptr))));
return ch;
}
#else
static int __cdecl _inc (
REG1 FILEX *fileptr
)
{
return(_getc_lk(fileptr));
}
static void __cdecl _un_inc (
int chr,
FILEX *fileptr
)
{
if (EOF != chr)
_ungetc_lk(chr, fileptr);
}
static int __cdecl _whiteout (
REG1 int *counter,
REG3 FILEX *fileptr
)
{
REG2 int ch;
while((isspace)((char)(ch = (++*counter, _inc(fileptr)))));
return ch;
}
#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?