nckernel  0.1
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
stdlib.c
Go to the documentation of this file.
1 #include <sys/types.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <stdarg.h>
5 #include <stddef.h>
6 #include <stdint.h>
7 #include <unistd.h>
8 #include <ctype.h> /* isXXXX */
9 #include <errno.h>
10 
11 char **environ;
12 
13 int atoi(const char *nptr)
14 {
15  int i;
16 
17  for (i = 0; *nptr; nptr++) {
18  i = (i * 10) + (*nptr - '0');
19  }
20 
21  return i;
22 }
23 
24 long atol(const char *nptr)
25 {
26  long i;
27 
28  for (i = 0; *nptr; nptr++) {
29  i = (i * 10) + (*nptr - '0');
30  }
31 
32  return i;
33 }
34 
35 long long atoll(const char *nptr)
36 {
37  return 0;
38 }
39 
40 long long atoq(const char *nptr)
41 {
42  return 0;
43 }
44 
45 int setenv(const char *name, const char *value, int overwrite)
46 {
47  return 0;
48 }
49 
50 char *getenv(const char *name)
51 {
52  register int i;
53  int namelen = strlen(name);
54 
55  for (i = 0; environ[i]; i++) {
56  if (!strncmp(name, environ[i], namelen)) {
57  if (environ[i][namelen] == '=') {
58  return environ[i] + namelen + 1;
59  }
60  }
61  }
62 
63  return NULL;
64 }
65 
66 static inline int todigit(char ch)
67 {
68  int tmp;
69 
70  if (isdigit(ch)) {
71  tmp = ch - '0';
72  } else if (isupper(ch)) {
73  tmp = ch - 'A';
74  } else if (islower(ch)) {
75  tmp = ch - 'a';
76  } else {
77  tmp = -EINVAL;
78  }
79 
80  return tmp;
81 }
82 
83 long int strtol(const char *nptr, char **endptr, int base)
84 {
85  long sign = 1;
86  long ret;
87  int tmp;
88 
89  if (isspace(*nptr)) {
90  nptr++;
91  }
92 
93  if (*nptr == '-') {
94  sign = -1;
95  nptr++;
96  } else if (*nptr == '+') {
97  nptr++;
98  }
99 
100  if (nptr[0] == '0') {
101  if (nptr[1] == 'x') {
102  base = 16;
103  } else {
104  base = 8;
105  }
106  }
107 
108  *endptr = NULL;
109  if (!base) {
110  char *ptr;
111 
112  ptr = (char *)nptr;
113  while (*ptr) {
114  tmp = todigit(*ptr);
115  if (tmp < 0) {
116  break;
117  }
118 
119  base = (base > tmp) ? base : tmp;
120  ptr++;
121  }
122  *endptr = ptr;
123  }
124 
125  ret = 0;
126  if (*endptr) {
127  while (nptr != *endptr) {
128  ret *= base;
129 
130  tmp = todigit(*nptr);
131  if (tmp < 0) {
132  break;
133  }
134  ret += tmp;
135  nptr++;
136  }
137 
139  } else {
140  while (*nptr) {
141  ret *= base;
142 
143  tmp = todigit(*nptr);
144  if (tmp < 0) {
145  break;
146  }
147 
148  if (tmp >= base) {
149  break;
150  }
151 
152  ret += tmp;
153  nptr++;
154  }
155 
156  *endptr = (char *)nptr;
157  }
158 
159  ret *= sign;
160  return ret;
161 }
162 
163 long long int strtoll(const char *nptr, char **endptr, int base)
164 {
165  return 0ll;
166 }
167 
168 unsigned long int strtoul(const char *nptr, char **endptr, int base)
169 {
170  long ret;
171  ret = strtol(nptr, endptr, base);
172  return (unsigned long)ret;
173 }
174 
175 unsigned long long int strtoull(const char *nptr, char **endptr,
176  int base)
177 {
178  long long ret;
179  ret = strtoll(nptr, endptr, base);
180  return (unsigned long long)ret;
181 }
182 
183 /* End of a file */