⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 strtoul.c

📁 早期freebsd实现
💻 C
字号:
/* * strtol : convert a string to long. * * Andy Wilson, 2-Oct-89. */#include <errno.h>#include <ctype.h>#include <stdio.h>#include "ansidecl.h"#ifndef ULONG_MAX#define	ULONG_MAX	((unsigned long)(~0L))		/* 0xFFFFFFFF */#endifextern int errno;unsigned longstrtoul(s, ptr, base)     CONST char *s; char **ptr; int base;{  unsigned long total = 0, tmp = 0;  unsigned digit;  CONST char *start=s;  int did_conversion=0;  int negate = 0;  if (s==NULL)    {      errno = ERANGE;      if (!ptr)	*ptr = (char *)start;      return 0L;    }  while (isspace(*s))    s++;  if (*s == '+')    s++;  else if (*s == '-')    s++, negate = 1;  if (base==0 || base==16) /*  the 'base==16' is for handling 0x */    {      /*       * try to infer base from the string       */      if (*s != '0')        tmp = 10;	/* doesn't start with 0 - assume decimal */      else if (s[1] == 'X' || s[1] == 'x')	tmp = 16, s += 2; /* starts with 0x or 0X - hence hex */      else	tmp = 8;	/* starts with 0 - hence octal */      if (base==0)	base = (int)tmp;    }  while ( digit = *s )    {      if (digit >= '0' && digit < ('0'+base))	digit -= '0';      else	if (base > 10)	  {	    if (digit >= 'a' && digit < ('a'+(base-10)))	      digit = digit - 'a' + 10;	    else if (digit >= 'A' && digit < ('A'+(base-10)))	      digit = digit - 'A' + 10;	    else	      break;	  }	else	  break;      did_conversion = 1;      tmp = (total * base) + digit;      if (tmp < total)	/* check overflow */	{	  errno = ERANGE;	  if (ptr != NULL)	    *ptr = (char *)s;	  return (ULONG_MAX);	}      total = tmp;      s++;    }  if (ptr != NULL)    *ptr = (char *) ((did_conversion) ? (char *)s : (char *)start);  return negate ? -total : total;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -