Add Posix functions for porting compatibility. Fix compliance issues with ISO/IEC 9899:199409 New Functions: setenv(), fparseln(), GetFileNameFromPath(), rename(), realpath(), setprogname(), getprogname(), strlcat(), strlcpy(), strsep(), setitimer(), getitimer(), timegm(), getopt(), basename(), mkstemp(), ffs(), vsnprintf(), snprintf(), getpass(), usleep(), select(), writev(), strcasecmp(), getcwd(), chdir(), tcgetpgrp(), getpgrp(), gettimeofday(), bcopy(), git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12061 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			134 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
 | |
|   This program and the accompanying materials
 | |
|   are licensed and made available under the terms and conditions of the BSD License
 | |
|   which accompanies this distribution.  The full text of the license may be found at
 | |
|   http://opensource.org/licenses/bsd-license.php
 | |
| 
 | |
|   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | |
|   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | |
| 
 | |
|   Copyright (c) 1990, 1993
 | |
|   The 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.
 | |
| 
 | |
|   Original version ID:
 | |
|   @(#)strtoul.c  8.1 (Berkeley) 6/4/93
 | |
|   Citrus: xpg4dl/FreeBSD/lib/libc/locale/wcstoul.c,v 1.2 2001/09/21 16:11:41 yamt Exp
 | |
|   NetBSD: wcstoul.c,v 1.1 2001/09/27 16:30:37 yamt Exp
 | |
|   NetBSD: _wcstoul.h,v 1.3 2005/11/29 03:11:59 christos Exp
 | |
|  */
 | |
| 
 | |
| #include <Library/BaseLib.h>
 | |
| 
 | |
| /*
 | |
|  * function template for wcstoul, wcstoull and wcstoumax.
 | |
|  *
 | |
|  * parameters:
 | |
|  *  _FUNCNAME  : function name
 | |
|  *      __wUINT     : return type
 | |
|  *      __wINT      : signed version of __wUINT
 | |
|  *      __wUINT_MAX : upper limit of the return type
 | |
|  */
 | |
| 
 | |
| __wUINT
 | |
| _FUNCNAME(
 | |
|   const wchar_t *nptr,
 | |
|   wchar_t **endptr,
 | |
|   int base
 | |
|   )
 | |
| {
 | |
|   const wchar_t *s;
 | |
|   __wUINT acc, cutoff;
 | |
|   wint_t wc;
 | |
|   int i;
 | |
|   int neg, any, cutlim;
 | |
| 
 | |
|   _DIAGASSERT(nptr != NULL);
 | |
|   /* endptr may be NULL */
 | |
| 
 | |
|   if (base && (base < 2 || base > 36)) {
 | |
|     errno = EINVAL;
 | |
|     return 0;
 | |
|   }
 | |
| 
 | |
|   /*
 | |
|    * Skip white space and pick up leading +/- sign if any.
 | |
|    * If base is 0, allow 0x for hex and 0 for octal, else
 | |
|    * assume decimal; if base is already 16, allow 0x.
 | |
|    */
 | |
|   s = nptr;
 | |
|   do {
 | |
|     wc = (wchar_t) *s++;
 | |
|   } while (iswspace(wc));
 | |
|   if (wc == L'-') {
 | |
|     neg = 1;
 | |
|     wc = *s++;
 | |
|   } else {
 | |
|     neg = 0;
 | |
|     if (wc == L'+')
 | |
|       wc = *s++;
 | |
|   }
 | |
|   if ((base == 0 || base == 16) &&
 | |
|       wc == L'0' && (*s == L'x' || *s == L'X')) {
 | |
|     wc = s[1];
 | |
|     s += 2;
 | |
|     base = 16;
 | |
|   }
 | |
|   if (base == 0)
 | |
|     base = wc == L'0' ? 8 : 10;
 | |
| 
 | |
|   /*
 | |
|    * See strtoul for comments as to the logic used.
 | |
|    */
 | |
|   cutoff = (__wUINT)DivU64x32 ((UINT64) __wUINT_MAX, (UINT32) base);
 | |
|   cutlim = (int) ModU64x32 ((UINT64) __wUINT_MAX, (UINT32) base);
 | |
|   for (acc = 0, any = 0;; wc = (wint_t) *s++) {
 | |
|     i = __wctoint((wchar_t)wc);
 | |
|     if (i == -1) {
 | |
|       break;
 | |
|     }
 | |
|     if (i >= base)
 | |
|       break;
 | |
|     if (any < 0)
 | |
|       continue;
 | |
|     if (acc > cutoff || (acc == cutoff && i > cutlim)) {
 | |
|       any = -1;
 | |
|       acc = __wUINT_MAX;
 | |
|       errno = ERANGE;
 | |
|     } else {
 | |
|       any = 1;
 | |
|       acc *= (__wUINT)base;
 | |
|       acc += i;
 | |
|     }
 | |
|   }
 | |
|   if (neg && any > 0)
 | |
|     acc = (__wUINT)(-((__wINT)acc));
 | |
|   if (endptr != 0)
 | |
|     *endptr = __UNCONST(any ? s - 1 : nptr);
 | |
|   return (acc);
 | |
| }
 |