📄 strtoul.cxx
字号:
//===========================================================================//// strtoul.cxx//// ANSI standard string to long int conversion function defined in// section 7.10.1.6 of the standard////===========================================================================//####COPYRIGHTBEGIN####// // ------------------------------------------- // The contents of this file are subject to the Red Hat eCos Public License // Version 1.1 (the "License"); you may not use this file except in // compliance with the License. You may obtain a copy of the License at // http://www.redhat.com/ // // Software distributed under the License is distributed on an "AS IS" // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the // License for the specific language governing rights and limitations under // the License. // // The Original Code is eCos - Embedded Configurable Operating System, // released September 30, 1998. // // The Initial Developer of the Original Code is Red Hat. // Portions created by Red Hat are // Copyright (C) 1998, 1999, 2000 Red Hat, Inc. // All Rights Reserved. // ------------------------------------------- // //####COPYRIGHTEND####//===========================================================================//#####DESCRIPTIONBEGIN####//// Author(s): jlarmour// Contributors: jlarmour// Date: 1998-02-13// Purpose: // Description: // Usage: ////####DESCRIPTIONEND####////===========================================================================//// This code is based on original code with the following copyright:///* * Copyright (c) 1990 Regents of the University of California. * 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. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 THE REGENTS OR CONTRIBUTORS 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. */// CONFIGURATION#include <pkgconf/libc.h> // Configuration header// Include the C library?#ifdef CYGPKG_LIBC // INCLUDES#include <cyg/infra/cyg_type.h> // Common type definitions and support#include <cyg/infra/cyg_trac.h> // Tracing support#include <cyg/infra/cyg_ass.h> // Assertion support#include <limits.h> // Definition of ULONG_MAX#include <ctype.h> // Definition of many ctype functions#include <errno.h> // Error code definitions#include <stdlib.h> // Header for all stdlib functions // (like this one)#include "clibincl/stdlibsupp.hxx" // Support for stdlib functions// EXPORTED SYMBOLSexternC unsigned longstrtoul( const char *nptr, char **endptr, int base ) \ CYGPRI_LIBC_WEAK_ALIAS("_strtoul");// FUNCTIONS//// Convert a string to an unsigned long integer.//// Ignores `locale' stuff. Assumes that the upper and lower case// alphabets and digits are each contiguous.//unsigned long_strtoul( const char *nptr, char **endptr, int base ){ const char *s = nptr; unsigned long acc; int c; unsigned long cutoff; int neg = 0, any, cutlim; CYG_REPORT_FUNCNAMETYPE( "_strtoul", "returning long %d" ); CYG_REPORT_FUNCARG3( "nptr=%08x, endptr=%08x, base=%d", nptr, endptr, base ); CYG_CHECK_DATA_PTR( nptr, "nptr is not a valid pointer!" ); if (endptr != NULL) CYG_CHECK_DATA_PTR( endptr, "endptr is not a valid pointer!" ); // // See strtol for comments as to the logic used. // do { c = *s++; } while (isspace(c)); if (c == '-') { neg = 1; c = *s++; } else if (c == '+') c = *s++; if ((base == 0 || base == 16) && c == '0' && (*s == 'x' || *s == 'X')) { c = s[1]; s += 2; base = 16; } if (base == 0) base = c == '0' ? 8 : 10; cutoff = (unsigned long)ULONG_MAX / (unsigned long)base; cutlim = (unsigned long)ULONG_MAX % (unsigned long)base; for (acc = 0, any = 0;; c = *s++) { if (isdigit(c)) c -= '0'; else if (isalpha(c)) c -= isupper(c) ? 'A' - 10 : 'a' - 10; else break; if (c >= base) break; if (any < 0 || acc > cutoff || acc == cutoff && c > cutlim) any = -1; else { any = 1; acc *= base; acc += c; } } if (any < 0) { acc = ULONG_MAX; errno = ERANGE; } else if (neg) acc = -acc; if (endptr != 0) *endptr = (char *) (any ? s - 1 : nptr); CYG_REPORT_RETVAL( acc ); return acc;} // _strtoul()#endif // ifdef CYGPKG_LIBC // EOF strtoul.cxx
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -