[comp.lang.lisp] passing strings in AKCL

djb@stoney.mitre.org (David J. Braunegg) (12/01/90)

I figured out how to pass strings from a C function into Lisp in AKCL.
I give it below in #1 for the interested.

I want to write the Lisp function machine-instance and I am trying to
use the C system function gethostname(2) (see #2 below).  However, the
call to gethostname goes bad (#3 below).  However, the equivalent C
code compiled with cc *does* work (#4 below).  If anyone has any
clues as to why the Clines is failing, please let me know.

Thanks,
Dave



1) Passing strings (this works):


(in-package 'user)

(Clines
 "
#include <strings.h>

object abc()
{
  char *abc_string;

  abc_string = (char *)malloc(4*(sizeof(char)));

  strcpy(abc_string, \"abc\");

  return(make_simple_string(abc_string));
}")

(defentry abc-lisp () (object abc))

(defun test ()
  (abc-lisp))


(test)
"abc"




2) I tried the same thing using gethostname (which does work if I
write and compile the equivalent C code).  The code and error are
shown below:


(in-package 'user)

(Clines
 "
#include <sys/param.h>
#include <syscall.h>

object foobar()
{
  char *hostname_string;

  hostname_string = (char *)malloc(MAXHOSTNAMELEN*(sizeof(char)));

  gethostname(hostname_string, MAXHOSTNAMELEN);

  return(make_simple_string(hostname_string));
}")

(defentry foo-bar () (object foobar))

(defun test ()
  (foo-bar))




3) The error I get has to do with gethostname.


>(compile-file "clines")
Compiling clines.lsp.
End of Pass 1.  
End of Pass 2.  
OPTIMIZE levels: Safety=0 (No runtime error checking), Space=0, Speed=3
Finished compiling clines.
#"clines.o"

>(load "clines")
Loading clines.o
undefined _gethostname symbolstart address -T 2815bc Finished loading clines.o
240

>(test)

Error: NIL is not a VECTOR
Error signalled by TEST.

Broken at TEST.  Type :H for Help.
>>:q




4) The following C code, however, runs fine using cc:


#include <sys/param.h>
#include <syscall.h>

char *foobar()
{
  char *hostname_string;

  hostname_string = (char *)malloc(MAXHOSTNAMELEN*(sizeof(char)));

  gethostname(hostname_string, MAXHOSTNAMELEN);

  return(hostname_string);
}

main(argc, argv)
     int argc;
     char *argv[];
{
  printf("%s\n", foobar());
}



Then

a.out
stoney		(the machine name)