46 lines
		
	
	
	
		
			934 B
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			46 lines
		
	
	
	
		
			934 B
			
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * stdlib functions
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Author: Scott Wood <scottwood@freescale.com>
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Copyright (c) 2007 Freescale Semiconductor, Inc.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This program is free software; you can redistribute it and/or modify it
							 | 
						||
| 
								 | 
							
								 * under the terms of the GNU General Public License version 2 as published
							 | 
						||
| 
								 | 
							
								 * by the Free Software Foundation.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "stdlib.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Not currently supported: leading whitespace, sign, 0x prefix, zero base */
							 | 
						||
| 
								 | 
							
								unsigned long long int strtoull(const char *ptr, char **end, int base)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									unsigned long long ret = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if (base > 36)
							 | 
						||
| 
								 | 
							
										goto out;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									while (*ptr) {
							 | 
						||
| 
								 | 
							
										int digit;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if (*ptr >= '0' && *ptr <= '9' && *ptr < '0' + base)
							 | 
						||
| 
								 | 
							
											digit = *ptr - '0';
							 | 
						||
| 
								 | 
							
										else if (*ptr >= 'A' && *ptr < 'A' + base - 10)
							 | 
						||
| 
								 | 
							
											digit = *ptr - 'A' + 10;
							 | 
						||
| 
								 | 
							
										else if (*ptr >= 'a' && *ptr < 'a' + base - 10)
							 | 
						||
| 
								 | 
							
											digit = *ptr - 'a' + 10;
							 | 
						||
| 
								 | 
							
										else
							 | 
						||
| 
								 | 
							
											break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										ret *= base;
							 | 
						||
| 
								 | 
							
										ret += digit;
							 | 
						||
| 
								 | 
							
										ptr++;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								out:
							 | 
						||
| 
								 | 
							
									if (end)
							 | 
						||
| 
								 | 
							
										*end = (char *)ptr;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return ret;
							 | 
						||
| 
								 | 
							
								}
							 |