8 int atoi(const char *str)
10 return strtol(str, 0, 10);
13 long atol(const char *str)
15 return strtol(str, 0, 10);
18 long strtol(const char *str, char **endp, int base)
23 const char *start = str;
25 while(isspace(*str)) str++;
29 if(str[1] == 'x' || str[1] == 'X') {
41 } else if(*str == '-') {
48 char c = tolower(*str);
52 } else if(c >= 'a' && c <= 'f') {
62 acc = acc * base + val;
67 *endp = (char*)(valid ? str : start);
70 return sign > 0 ? acc : -acc;
73 void itoa(int val, char *buf, int base)
89 int digit = val % base;
90 *ptr++ = digit < 10 ? (digit + '0') : (digit - 10 + 'a');
106 void utoa(unsigned int val, char *buf, int base)
108 static char rbuf[16];
116 unsigned int digit = val % base;
117 *ptr++ = digit < 10 ? (digit + '0') : (digit - 10 + 'a');
129 double atof(const char *str)
131 return strtod(str, 0);
135 double strtod(const char *str, char **endp)
138 const char *start = str;
140 long ival = 0, dval = 0;
145 ival = strtol(str, &ep, 10);
146 if(ep == str && *str != '.') {
147 if(endp) *endp = (char*)str;
150 if(ep != str) valid = 1;
151 str = *ep == '.' ? ep + 1 : ep;
157 dval = strtol(str, &ep, 10);
164 *endp = (char*)(valid ? str : start);
169 double d = (double)dval;
183 #define QSORT_THRESHOLD 4
184 #define ITEM(idx) ((char*)arr + (idx) * itemsz)
198 static void ins_sort(void *arr, size_t count, size_t itemsz, int (*cmp)(const void*, const void*))
203 if(count <= 1) return;
205 it = (char*)arr + itemsz;
206 for(i=1; i<count; i++) {
209 while(a > (char*)arr && cmp(a, (b = a - itemsz)) < 0) {
216 void qsort(void *arr, size_t count, size_t itemsz, int (*cmp)(const void*, const void*))
218 char *ma, *mb, *mc, *left, *right;
219 size_t sepidx, nleft, nright;
221 if(count <= 1) return;
223 if(count < QSORT_THRESHOLD) {
224 ins_sort(arr, count, itemsz, cmp);
229 mb = ITEM(count / 2);
230 mc = ITEM(count - 1);
231 if(cmp(ma, mb) < 0) SWAP(ma, mb);
232 if(cmp(mc, ma) < 0) SWAP(mc, ma);
237 while(cmp(left, ma) < 0) left += itemsz;
238 while(cmp(ma, right) < 0) right -= itemsz;
239 if(left >= right) break;
243 sepidx = (right - (char*)arr) / itemsz;
245 nright = count - nleft - 1;
247 qsort(ma, nleft, itemsz, cmp);
248 qsort(right + itemsz, nright, itemsz, cmp);