Explorar o código

Add program_invocation_short_name

Jeremy Soller %!s(int64=4) %!d(string=hai) anos
pai
achega
1a0edd8eeb

+ 1 - 0
include/bits/errno.h

@@ -9,6 +9,7 @@ extern "C" {
 
 #define errno (*__errno_location())
 #define program_invocation_name (*__program_invocation_name())
+#define program_invocation_short_name (*__program_invocation_short_name())
 
 #ifdef __cplusplus
 } // extern "C"

+ 17 - 0
src/header/errno/mod.rs

@@ -18,6 +18,23 @@ pub unsafe extern "C" fn __program_invocation_name() -> *mut *mut c_char {
     &mut platform::inner_argv[0]
 }
 
+#[no_mangle]
+pub unsafe extern "C" fn __program_invocation_short_name() -> *mut *mut c_char {
+    let mut ptr = platform::inner_argv[0];
+    let mut slash_ptr = ptr;
+    loop {
+        let b = *ptr as u8;
+        if b == 0 {
+            return &mut slash_ptr;
+        } else {
+            ptr = ptr.add(1);
+            if b == b'/' {
+                slash_ptr = ptr;
+            }
+        }
+    }
+}
+
 pub const EPERM: c_int = 1; /* Operation not permitted */
 pub const ENOENT: c_int = 2; /* No such file or directory */
 pub const ESRCH: c_int = 3; /* No such process */

+ 2 - 0
tests/errno.c

@@ -5,9 +5,11 @@
 int main(int argc, char **argv) {
     puts(argv[0]);
     puts(program_invocation_name);
+    puts(program_invocation_short_name);
 
     program_invocation_name = "yes, you can change this";
 
     puts(argv[0]);
     puts(program_invocation_name);
+    puts(program_invocation_short_name);
 }

+ 2 - 0
tests/expected/bins_dynamic/errno.stdout

@@ -1,4 +1,6 @@
 bins_dynamic/errno
 bins_dynamic/errno
+errno
+yes, you can change this
 yes, you can change this
 yes, you can change this

+ 2 - 0
tests/expected/bins_static/errno.stdout

@@ -1,4 +1,6 @@
 bins_static/errno
 bins_static/errno
+errno
+yes, you can change this
 yes, you can change this
 yes, you can change this