builtin: make 5 C functions trusted, tweak signatures (#8730)
parent
ea803113c3
commit
b07f373433
|
@ -7,6 +7,7 @@ fn C.memcmp(byteptr, byteptr, int) int
|
||||||
|
|
||||||
fn C.memmove(byteptr, byteptr, int) voidptr
|
fn C.memmove(byteptr, byteptr, int) voidptr
|
||||||
|
|
||||||
|
[trusted]
|
||||||
fn C.calloc(int, int) byteptr
|
fn C.calloc(int, int) byteptr
|
||||||
|
|
||||||
fn C.malloc(int) byteptr
|
fn C.malloc(int) byteptr
|
||||||
|
@ -15,6 +16,7 @@ fn C.realloc(a byteptr, b int) byteptr
|
||||||
|
|
||||||
fn C.free(ptr voidptr)
|
fn C.free(ptr voidptr)
|
||||||
|
|
||||||
|
[trusted]
|
||||||
fn C.exit(code int)
|
fn C.exit(code int)
|
||||||
|
|
||||||
fn C.qsort(base voidptr, items size_t, item_size size_t, cb qsort_callback_func)
|
fn C.qsort(base voidptr, items size_t, item_size size_t, cb qsort_callback_func)
|
||||||
|
@ -25,7 +27,8 @@ fn C.strlen(s charptr) int
|
||||||
|
|
||||||
fn C.sscanf(byteptr, byteptr, ...byteptr) int
|
fn C.sscanf(byteptr, byteptr, ...byteptr) int
|
||||||
|
|
||||||
fn C.isdigit(s byteptr) bool
|
[trusted]
|
||||||
|
fn C.isdigit(c int) bool
|
||||||
|
|
||||||
// stdio.h
|
// stdio.h
|
||||||
fn C.popen(c charptr, t charptr) voidptr
|
fn C.popen(c charptr, t charptr) voidptr
|
||||||
|
@ -70,7 +73,7 @@ fn C.pclose() int
|
||||||
// process execution, os.process:
|
// process execution, os.process:
|
||||||
fn C.getpid() int
|
fn C.getpid() int
|
||||||
|
|
||||||
fn C.system() int
|
fn C.system(cmd charptr) int
|
||||||
|
|
||||||
fn C.posix_spawn(child_pid &int, path charptr, file_actions voidptr, attrp voidptr, argv &charptr, envp &charptr) int
|
fn C.posix_spawn(child_pid &int, path charptr, file_actions voidptr, attrp voidptr, argv &charptr, envp &charptr) int
|
||||||
|
|
||||||
|
@ -78,6 +81,7 @@ fn C.posix_spawnp(child_pid &int, exefile charptr, file_actions voidptr, attrp v
|
||||||
|
|
||||||
fn C.execve(cmd_path charptr, args voidptr, envs voidptr) int
|
fn C.execve(cmd_path charptr, args voidptr, envs voidptr) int
|
||||||
|
|
||||||
|
[trusted]
|
||||||
fn C.fork() int
|
fn C.fork() int
|
||||||
|
|
||||||
fn C.wait(status &int) int
|
fn C.wait(status &int) int
|
||||||
|
@ -112,7 +116,7 @@ fn C.memset() int
|
||||||
|
|
||||||
fn C.sigemptyset() int
|
fn C.sigemptyset() int
|
||||||
|
|
||||||
fn C.getcwd() int
|
fn C.getcwd(buf charptr, size size_t) charptr
|
||||||
|
|
||||||
fn C.signal(signal int, handlercb voidptr) voidptr
|
fn C.signal(signal int, handlercb voidptr) voidptr
|
||||||
|
|
||||||
|
@ -131,7 +135,13 @@ fn C.closedir() int
|
||||||
|
|
||||||
fn C.mkdir() int
|
fn C.mkdir() int
|
||||||
|
|
||||||
fn C.srand() int
|
// C.rand returns a pseudorandom integer from 0 (inclusive) to C.RAND_MAX (exclusive)
|
||||||
|
[trusted]
|
||||||
|
fn C.rand() int
|
||||||
|
|
||||||
|
// C.srand seeds the internal PRNG with the given value.
|
||||||
|
[trusted]
|
||||||
|
fn C.srand(seed uint)
|
||||||
|
|
||||||
fn C.atof() int
|
fn C.atof() int
|
||||||
|
|
||||||
|
|
|
@ -9,10 +9,11 @@ import rand.constants
|
||||||
|
|
||||||
// Implementation note:
|
// Implementation note:
|
||||||
// ====================
|
// ====================
|
||||||
// C.rand() is okay to use within its defined range of C.RAND_MAX.
|
// C.rand returns a pseudorandom integer from 0 (inclusive) to C.RAND_MAX (exclusive)
|
||||||
|
// C.rand() is okay to use within its defined range.
|
||||||
// (See: https://web.archive.org/web/20180801210127/http://eternallyconfuzzled.com/arts/jsw_art_rand.aspx)
|
// (See: https://web.archive.org/web/20180801210127/http://eternallyconfuzzled.com/arts/jsw_art_rand.aspx)
|
||||||
// The problem is, this value varies with the libc implementation. On windows,
|
// The problem is, this value varies with the libc implementation. On windows,
|
||||||
// for example, RAND_MAX is usually a measly 32767, whereas on (newer) linux it's generaly
|
// for example, RAND_MAX is usually a measly 32767, whereas on (newer) linux it's generally
|
||||||
// 2147483647. The repetition period also varies wildly. In order to provide more entropy
|
// 2147483647. The repetition period also varies wildly. In order to provide more entropy
|
||||||
// without altering the underlying algorithm too much, this implementation simply
|
// without altering the underlying algorithm too much, this implementation simply
|
||||||
// requests for more random bits until the necessary width for the integers is achieved.
|
// requests for more random bits until the necessary width for the integers is achieved.
|
||||||
|
@ -29,11 +30,6 @@ fn calculate_iterations_for(bits int) int {
|
||||||
return base + extra
|
return base + extra
|
||||||
}
|
}
|
||||||
|
|
||||||
// C.rand returns a pseudorandom integer from 0 (inclusive) to C.RAND_MAX (exclusive)
|
|
||||||
fn C.rand() int
|
|
||||||
|
|
||||||
// C.srand seeds the internal PRNG with the given int seed.
|
|
||||||
// fn C.srand(seed int)
|
|
||||||
// SysRNG is the PRNG provided by default in the libc implementiation that V uses.
|
// SysRNG is the PRNG provided by default in the libc implementiation that V uses.
|
||||||
pub struct SysRNG {
|
pub struct SysRNG {
|
||||||
mut:
|
mut:
|
||||||
|
@ -47,7 +43,7 @@ pub fn (mut r SysRNG) seed(seed_data []u32) {
|
||||||
exit(1)
|
exit(1)
|
||||||
}
|
}
|
||||||
r.seed = seed_data[0]
|
r.seed = seed_data[0]
|
||||||
unsafe { C.srand(int(r.seed)) }
|
C.srand(r.seed)
|
||||||
}
|
}
|
||||||
|
|
||||||
// r.default_rand() exposes the default behavior of the system's RNG
|
// r.default_rand() exposes the default behavior of the system's RNG
|
||||||
|
|
Loading…
Reference in New Issue