Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/posix/stdlib.c

    rcc3652db r823a929  
    3737
    3838#include "stdlib.h"
    39 #include "libc/sort.h"
    40 #include "libc/str.h"
    41 #include "libc/vfs/vfs.h"
    4239#include "internal/common.h"
    43 #include <errno.h>  // FIXME: use POSIX errno
    4440
    4541/**
     
    5854/**
    5955 *
    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  *
    12156 * @param array
    12257 * @param count
     
    12459 * @param compare
    12560 */
     61int 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 */
    12674void posix_qsort(void *array, size_t count, size_t size,
    12775    int (*compare)(const void *, const void *))
    12876{
    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/**
    17382 *
    17483 * @param name
    175  * @return Always NULL.
     84 * @return
    17685 */
    17786char *posix_getenv(const char *name)
    17887{
    179         return NULL;
     88        // TODO
     89        not_implemented();
    18090}
    18191
     
    193103
    194104/**
    195  *
    196  * @param string String to be passed to a command interpreter.
    197  * @return
    198  */
    199 int posix_system(const char *string) {
    200         // TODO: does nothing at the moment
    201         return 0;
    202 }
    203 
    204 /**
    205105 *
    206106 * @param name
     
    210110char *posix_realpath(const char *name, char *resolved)
    211111{
    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();
    248114}
    249115
     
    253119 *
    254120 * @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 */
     124float posix_strtof(const char *restrict nptr, char **restrict endptr)
     125{
     126        return (float) posix_strtold(nptr, endptr);
    260127}
    261128
     
    268135 * @return
    269136 */
    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 to
    277  * its native representation. See posix_strtold().
    278  *
    279  * @param nptr
    280  * @param endptr
    281  * @return
    282  */
    283137double posix_strtod(const char *restrict nptr, char **restrict endptr)
    284138{
    285139        return (double) posix_strtold(nptr, endptr);
     140}
     141
     142/**
     143 *
     144 * @param str
     145 * @return
     146 */
     147int posix_atoi(const char *str)
     148{
     149        // TODO
     150        not_implemented();
    286151}
    287152
Note: See TracChangeset for help on using the changeset viewer.