public
Created

[newLISP]文字列ポインタを扱う際のメモ

  • Download Gist
environ.c
C
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
/*
* $ gcc -fPIC -shared environ.c -o environ.so && strip environ.so
* or
* $ gcc -DMAIN environ.c
* $ ./a.out
*/
 
extern char **environ;
 
char **envp() {
return environ;
}
 
#ifdef MAIN
#include <stdio.h>
 
int main(void)
{
char **env;
 
env = envp();
while (*env)
puts(*env++);
 
return 0;
}
#endif
environ.lsp
Common Lisp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
#!/usr/bin/newlisp
 
;; 共有ライブラリからの返り値が文字列のポインタだったりすると
;; アーキテクチャによって型のサイズが違うので処理が面倒だねという話。
 
;; len_void* == sizeof(void *);
(cond
;; 64-bit
((= 256 (& 256 (sys-info 9)))
(define get-ptr get-long)
(define len_void* 8))
;; 32-bit
(true
(define get-ptr get-int)
(define len_void* 4)))
 
(define NULL 0)
(import "./environ.so" "envp") ; 付属のenviron.cからshared-objectファイルを作成しておく
(import "libc.so.6" "puts")
(import "libc.so.6" "printf")
 
(setf environ (envp))
 
(while (!= (get-ptr environ) NULL)
(printf "%s\n" (get-ptr environ))
(++ environ len_void*)
)
 
(exit)

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.