Changes in uspace/lib/posix/stdlib.c [cc3652db:823a929] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/posix/stdlib.c
rcc3652db r823a929 37 37 38 38 #include "stdlib.h" 39 #include "libc/sort.h"40 #include "libc/str.h"41 #include "libc/vfs/vfs.h"42 39 #include "internal/common.h" 43 #include <errno.h> // FIXME: use POSIX errno44 40 45 41 /** … … 58 54 /** 59 55 * 60 * @param i Input value.61 * @return Absolute value of the parameter.62 */63 int posix_abs(int i)64 {65 return i < 0 ? -i : i;66 }67 68 /**69 *70 * @param i Input value.71 * @return Absolute value of the parameter.72 */73 long posix_labs(long i)74 {75 return i < 0 ? -i : i;76 }77 78 /**79 *80 * @param i Input value.81 * @return Absolute value of the parameter.82 */83 long long posix_llabs(long long i)84 {85 return i < 0 ? -i : i;86 }87 88 posix_div_t posix_div(int numer, int denom)89 {90 return (posix_div_t) { .quot = numer / denom, .rem = numer % denom };91 }92 93 posix_ldiv_t posix_ldiv(long numer, long denom)94 {95 return (posix_ldiv_t) { .quot = numer / denom, .rem = numer % denom };96 }97 98 posix_lldiv_t posix_lldiv(long long numer, long long denom)99 {100 return (posix_lldiv_t) { .quot = numer / denom, .rem = numer % denom };101 }102 103 /**104 * Private helper function that serves as a compare function for qsort().105 *106 * @param elem1 First element to compare.107 * @param elem2 Second element to compare.108 * @param compare Comparison function without userdata parameter.109 *110 * @return Relative ordering of the elements.111 */112 static int sort_compare_wrapper(void *elem1, void *elem2, void *userdata)113 {114 int (*compare)(const void *, const void *) = userdata;115 return compare(elem1, elem2);116 }117 118 /**119 * Array sorting utilizing the quicksort algorithm.120 *121 56 * @param array 122 57 * @param count … … 124 59 * @param compare 125 60 */ 61 int posix_abs(int i) 62 { 63 // TODO 64 not_implemented(); 65 } 66 67 /** 68 * 69 * @param array 70 * @param count 71 * @param size 72 * @param compare 73 */ 126 74 void posix_qsort(void *array, size_t count, size_t size, 127 75 int (*compare)(const void *, const void *)) 128 76 { 129 /* Implemented in libc with one extra argument. */ 130 qsort(array, count, size, sort_compare_wrapper, compare); 131 } 132 133 /** 134 * Binary search in a sorted array. 135 * 136 * @param key Object to search for. 137 * @param base Pointer to the first element of the array. 138 * @param nmemb Number of elements in the array. 139 * @param size Size of each array element. 140 * @param compar Comparison function. 141 * @return Pointer to a matching element, or NULL if none can be found. 142 */ 143 void *posix_bsearch(const void *key, const void *base, 144 size_t nmemb, size_t size, int (*compar)(const void *, const void *)) 145 { 146 while (nmemb > 0) { 147 const void *middle = base + (nmemb / 2) * size; 148 int cmp = compar(key, middle); 149 if (cmp == 0) { 150 return (void *) middle; 151 } 152 if (middle == base) { 153 /* There is just one member left to check and it 154 * didn't match the key. Avoid infinite loop. 155 */ 156 break; 157 } 158 if (cmp < 0) { 159 nmemb = nmemb / 2; 160 } else if (cmp > 0) { 161 nmemb = nmemb - (nmemb / 2); 162 base = middle; 163 } 164 } 165 166 return NULL; 167 } 168 169 /** 170 * Retrieve a value of the given environment variable. 171 * Since HelenOS doesn't support env variables at the moment, 172 * this function always returns NULL. 77 // TODO 78 not_implemented(); 79 } 80 81 /** 173 82 * 174 83 * @param name 175 * @return Always NULL.84 * @return 176 85 */ 177 86 char *posix_getenv(const char *name) 178 87 { 179 return NULL; 88 // TODO 89 not_implemented(); 180 90 } 181 91 … … 193 103 194 104 /** 195 *196 * @param string String to be passed to a command interpreter.197 * @return198 */199 int posix_system(const char *string) {200 // TODO: does nothing at the moment201 return 0;202 }203 204 /**205 105 * 206 106 * @param name … … 210 110 char *posix_realpath(const char *name, char *resolved) 211 111 { 212 #ifndef PATH_MAX 213 assert(resolved == NULL); 214 #endif 215 216 if (name == NULL) { 217 errno = EINVAL; 218 return NULL; 219 } 220 221 // TODO: symlink resolution 222 223 /* Function absolutize is implemented in libc and declared in vfs.h. 224 * No more processing is required as HelenOS doesn't have symlinks 225 * so far (as far as I can tell), although this function will need 226 * to be updated when that support is implemented. 227 */ 228 char* absolute = absolutize(name, NULL); 229 230 if (absolute == NULL) { 231 /* POSIX requires some specific errnos to be set 232 * for some cases, but there is no way to find out from 233 * absolutize(). 234 */ 235 errno = EINVAL; 236 return NULL; 237 } 238 239 if (resolved == NULL) { 240 return absolute; 241 } else { 242 #ifdef PATH_MAX 243 str_cpy(resolved, PATH_MAX, absolute); 244 #endif 245 free(absolute); 246 return resolved; 247 } 112 // TODO 113 not_implemented(); 248 114 } 249 115 … … 253 119 * 254 120 * @param nptr 255 * @return 256 */ 257 double posix_atof(const char *nptr) 258 { 259 return posix_strtod(nptr, NULL); 121 * @param endptr 122 * @return 123 */ 124 float posix_strtof(const char *restrict nptr, char **restrict endptr) 125 { 126 return (float) posix_strtold(nptr, endptr); 260 127 } 261 128 … … 268 135 * @return 269 136 */ 270 float posix_strtof(const char *restrict nptr, char **restrict endptr)271 {272 return (float) posix_strtold(nptr, endptr);273 }274 275 /**276 * Converts a string representation of a floating-point number to277 * its native representation. See posix_strtold().278 *279 * @param nptr280 * @param endptr281 * @return282 */283 137 double posix_strtod(const char *restrict nptr, char **restrict endptr) 284 138 { 285 139 return (double) posix_strtold(nptr, endptr); 140 } 141 142 /** 143 * 144 * @param str 145 * @return 146 */ 147 int posix_atoi(const char *str) 148 { 149 // TODO 150 not_implemented(); 286 151 } 287 152
Note:
See TracChangeset
for help on using the changeset viewer.