Joshua Isom wrote:
I'm trying to use libc to be able to do a directory listing, and and if I used the DATATYPE_CSTR I get a segfault, and if I use DATATYPE_STRING,

It's neither nor. A DATATYPE_CSTR would be a pointer to a cstring. But when you look at the definition of struct dirent, you see an inlined array of chars with size 256. After fixing this and specifying d_fileno is DATATYPE_INT64, the program works:

leo
.sub _main @MAIN
     .local pmc libc
     .local pmc opendir
     .local pmc readdir
     .local pmc closedir
     null libc
     dlfunc opendir, libc, 'opendir', 'pt'
     dlfunc readdir, libc, 'readdir', 'pp'
     dlfunc closedir, libc, 'closedir', 'ip'
     store_global 'libc::opendir', opendir
     store_global 'libc::readdir', readdir
     store_global 'libc::closedir', closedir
     .local pmc curdir
     curdir = libc::opendir(".")
     .local OrderedHash entry
     entry = libc::readdir(curdir)
     entry = libc::readdir(curdir)
     entry = libc::readdir(curdir)

     .include "datatypes.pasm"
     new $P2, .OrderedHash
     set $P2["d_fileno"], .DATATYPE_INT64
     push $P2, 0
     push $P2, 0
     set $P2["d_reclen"], .DATATYPE_SHORT
     push $P2, 0
     push $P2, 0
     set $P2["d_type"], .DATATYPE_CHAR
     push $P2, 0
     push $P2, 0
     set $P2["d_name"], .DATATYPE_CHAR
     push $P2, 256
     push $P2, 0           # 11
     assign entry, $P2

    $I1 = 0
loop:
     $I0 = entry["d_name";$I1]
     unless $I0 goto ex
     chr $S0, $I0
     print $S0
     inc $I1
     goto loop
 ex:
     print "\n"
.end

Reply via email to