#pragma lib
[m6w6/ext-psi] / psi.d / stdlib.psi
index 8a5257205e3433e9c7b404777e7f9bc14ef04ee9..35cf171aa30f396aad11ee94e7e9c1c8d0c9c4d0 100644 (file)
@@ -1,22 +1,67 @@
+#ifdef __linux__
+#pragma lib "crypt";
+#endif
+
+#include <stdlib.h>
+
 function psi\abs(int $i) : int {
        let n = intval($i);
-       return to_int(abs);
+       return abs(n) as to_int(abs);
 }
 
 function psi\div(int $numerator, int $denominator) : array {
        let numerator = intval($numerator);
        let denominator = intval($denominator);
-       return to_array(div, to_int(quot), to_int(rem));
+       pre_assert denominator != 0;
+       return div(numerator, denominator)
+               as to_array(div, to_int(quot), to_int(rem));
 }
 
 function psi\ldiv(int $numerator, int $denominator) : array {
        let numerator = intval($numerator);
        let denominator = intval($denominator);
-       return to_array(ldiv, to_int(quot), to_int(rem));
+       pre_assert denominator != 0;
+       return ldiv(numerator, denominator)
+               as to_array(ldiv, to_int(quot), to_int(rem));
 }
 
 function psi\lldiv(int $numerator, int $denominator) : array {
        let numerator = intval($numerator);
        let denominator = intval($denominator);
-       return to_array(lldiv, to_int(quot), to_int(rem));
+       pre_assert denominator != 0;
+       return lldiv(numerator, denominator)
+               as to_array(lldiv, to_int(quot), to_int(rem));
+}
+
+function psi\strtold(string $str, string &$end = null) : float {
+       let nptr = strval($str);
+       let endptr = &NULL;
+       return strtold(nptr, endptr)
+               as to_float(strtold);
+       set $end = to_string(*endptr);
+}
+
+function psi\free(object $memory) : void {
+       let ptr = objval($memory);
+       return free(ptr) as void(free);
+}
+
+function psi\malloc(int $size) : object {
+       let size = intval($size);
+       pre_assert size >= 0;
+       return malloc(size) as to_object(malloc);
+}
+
+function psi\calloc(int $nmemb, int $size) : object {
+       let nmemb = intval($nmemb);
+       let size = intval($size);
+       pre_assert size >= 0;
+       return calloc(nmemb, size) as to_object(calloc);
+}
+
+function psi\realloc(object $obj, int $size) : object {
+       let ptr = objval($obj);
+       let size = intval($size);
+       pre_assert size >= 0;
+       return realloc(ptr, size) as to_object(realloc);
 }