📄 _strtol.c
字号:
/*************************************************************************
*
* Copyright Mentor Graphics Corporation 2002
* All Rights Reserved.
*
* THIS WORK CONTAINS TRADE SECRET AND PROPRIETARY INFORMATION WHICH IS
* THE PROPERTY OF MENTOR GRAPHICS CORPORATION OR ITS LICENSORS AND IS
* SUBJECT TO LICENSE TERMS.
*
*************************************************************************/
/*************************************************************************
* FILE NAME VERSION
*
* _strtol.c Nucleus Common Library 1.1
*
* DESCRIPTION
*
* This file contains the implementation of NCL_strtol.
*
* DATA STRUCTURES
*
* None.
*
* FUNCTIONS
*
* NCL_strtol
*
* DEPENDENCIES
*
* ncl.h
* abbr.h
* errno.h
* convert.h
* nucleus.h
*
************************************************************************/
#define NU_NCL_SOURCE_FILE
#include "ncl\inc\ncl.h"
#include "ncl\inc\abbr.h" /* rcchar */
#include "ncl\inc\errno.h"
#include "ncl\inc\convert.h"
#include "plus\nucleus.h" /* MMU Support */
/*************************************************************************
*
* FUNCTION
*
* NCL__strtol
*
* DESCRIPTION
*
* This routine is used to scan a single long integer from at most
* 'width' characters in a string. If 'width' is negative, the
* number of characters scanned is unlimited. The integer may be
* preceeded by an optional sign character, but whitespace
* characters are invalid. In other respects, it acts like "strtol".
*
* INPUTS
*
* nptr Null-terminated string to convert
* base Number system (binary, hex, octal, etc...)
* width The most chars in the string this function
* will operate upon. If negative, there is
* no limit for this function.
* max Largest value that will not cause an overflow
*
* OUTPUTS
*
* long Value the string represents
*
*************************************************************************/
long NCL__strtol (const char *nptr, char **endptr, int base, int width)
{
rcchar *ptr = nptr;
ulong uvalue;
long svalue;
int neg = 0;
char *eptr;
NU_SUPERV_USER_VARIABLES
if (*ptr == '-')
{
neg = 1;
goto do_sign;
} /* get optional sign */
if (*ptr == '+')
{
do_sign:
if (width == 0)
{
eptr = (char *)nptr;
svalue = 0L;
goto exit;
}
if (width > 0)
--width;
++ptr;
}
switch (NCL__str2ul (&uvalue, ptr, &eptr, width, base))
{
case S2L_ERROR:
svalue = 0L;
eptr = (char *)nptr;
if (width && *ptr == '0') /* "0x?" is valid */
eptr = (char *)(ptr + 1);
break;
case S2L_VALID:
if (neg)
{
if (uvalue > - (unsigned long) LONG_MIN)
goto overflow;
svalue = SNEGATE(uvalue);
}
else /* positive */
{
if (uvalue > (unsigned long) LONG_MAX)
goto overflow;
svalue = (long) uvalue;
}
break;
case S2L_OVFLW:
overflow:
svalue = ((neg) ? LONG_MIN : LONG_MAX);
NU_SUPERVISOR_MODE();
errno = ERANGE;
NU_USER_MODE();
break;
}
exit:
if (endptr != (char**)0)
*endptr = eptr;
return (svalue);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -