Rev 3 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev | Author | Line No. | Line |
---|---|---|---|

2 | pj | 1 | `/*` |

2 | ` * Copyright (c) 1990, 1993` |
||

3 | ` * The Regents of the University of California. All rights reserved.` |
||

4 | ` *` |
||

5 | ` * Redistribution and use in source and binary forms, with or without` |
||

6 | ` * modification, are permitted provided that the following conditions` |
||

7 | ` * are met:` |
||

8 | ` * 1. Redistributions of source code must retain the above copyright` |
||

9 | ` * notice, this list of conditions and the following disclaimer.` |
||

10 | ` * 2. Redistributions in binary form must reproduce the above copyright` |
||

11 | ` * notice, this list of conditions and the following disclaimer in the` |
||

12 | ` * documentation and/or other materials provided with the distribution.` |
||

13 | ` * 3. All advertising materials mentioning features or use of this software` |
||

14 | ` * must display the following acknowledgement:` |
||

15 | ` * This product includes software developed by the University of` |
||

16 | ` * California, Berkeley and its contributors.` |
||

17 | ` * 4. Neither the name of the University nor the names of its contributors` |
||

18 | ` * may be used to endorse or promote products derived from this software` |
||

19 | ` * without specific prior written permission.` |
||

20 | ` *` |
||

21 | ` * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND` |
||

22 | ` * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE` |
||

23 | ` * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE` |
||

24 | ` * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE` |
||

25 | ` * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL` |
||

26 | ` * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS` |
||

27 | ` * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)` |
||

28 | ` * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT` |
||

29 | ` * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY` |
||

30 | ` * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF` |
||

31 | ` * SUCH DAMAGE.` |
||

32 | ` */` |
||

33 | |||

34 | `#if defined(LIBC_SCCS) && !defined(lint)` |
||

35 | static char sccsid[] = "@(#)strtoul.c 8.1 (Berkeley) 6/4/93"; |
||

36 | `#endif /* LIBC_SCCS and not lint */` |
||

37 | |||

38 | `#include <ll/limits.h>` |
||

39 | `#include <ll/ctype.h>` |
||

40 | `#include <ll/errno.h>` |
||

41 | `#include <ll/stdlib.h>` |
||

42 | |||

43 | FILE(strtoul); |
||

44 | |||

45 | `/*` |
||

46 | ` * Convert a string to an unsigned long integer.` |
||

47 | ` *` |
||

48 | ` * Ignores `locale' stuff. Assumes that the upper and lower case` |
||

49 | ` * alphabets and digits are each contiguous.` |
||

50 | ` */` |
||

51 | unsigned long strtoul(const char *nptr, char **endptr, int base) |
||

52 | `{` |
||

53 | register const char *s = nptr; |
||

54 | register unsigned long acc; |
||

55 | register unsigned char c; |
||

56 | register unsigned long cutoff; |
||

57 | register int neg = 0, any, cutlim; |
||

58 | |||

59 | ` /*` |
||

60 | ` * See strtol for comments as to the logic used.` |
||

61 | ` */` |
||

62 | do { |
||

63 | c = *s++; |
||

64 | } while (isspace(c)); |
||

65 | if (c == '-') { |
||

66 | neg = 1; |
||

67 | c = *s++; |
||

68 | } else if (c == '+') |
||

69 | c = *s++; |
||

70 | if ((base == 0 || base == 16) && |
||

71 | c == '0' && (*s == 'x' || *s == 'X')) { |
||

72 | c = s[1]; |
||

73 | s += 2; |
||

74 | base = 16; |
||

75 | ` }` |
||

76 | if (base == 0) |
||

77 | base = c == '0' ? 8 : 10; |
||

78 | cutoff = (unsigned long)ULONG_MAX / (unsigned long)base; |
||

79 | cutlim = (unsigned long)ULONG_MAX % (unsigned long)base; |
||

80 | for (acc = 0, any = 0;; c = *s++) { |
||

81 | `/* if (!isascii(c))*/` |
||

82 | if (!isalnum(c)) |
||

83 | break; |
||

84 | if (isdigit(c)) |
||

85 | c -= '0'; |
||

86 | else if (isalpha(c)) |
||

87 | c -= isupper(c) ? 'A' - 10 : 'a' - 10; |
||

88 | ` else` |
||

89 | break; |
||

90 | if (c >= base) |
||

91 | break; |
||

92 | if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim)) |
||

93 | any = -1; |
||

94 | else { |
||

95 | any = 1; |
||

96 | acc *= base; |
||

97 | acc += c; |
||

98 | ` }` |
||

99 | ` }` |
||

100 | if (any < 0) { |
||

101 | acc = ULONG_MAX; |
||

102 | errno = ERANGE; |
||

103 | } else if (neg) |
||

104 | acc = -acc; |
||

105 | if (endptr != 0) |
||

106 | *endptr = (char *)(any ? s - 1 : nptr); |
||

107 | return (acc); |
||

108 | `}` |