axiom-developer
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Axiom-developer] sock_get_string_buf


From: Waldek Hebisch
Subject: [Axiom-developer] sock_get_string_buf
Date: Wed, 1 Nov 2006 19:16:12 +0100 (CET)

I again had problem with "sock_get_string_buf": trying to use hypertex
functions which require Axiom (for example search or tutorial input)
gives:

(1) ->
   >> System error:
   Unexpected end of #<string-input stream from "                ...">.

Recent patch to gcl fixed the problem on many machines. But on one
machine (using 2.4.31 kerenel) I was still getting this error.

So I tried the patch below and it solved the problem.  AFAICS the
problem is that GCL string parameter wants to preserve string
_value_, but what Axiom want is pass by reference.  My undersanding
is that GCL has full right to copy the string, so the only relaiable
solution must use 'object' type and extract string address from it.

Remark1: It seems that "official" GCL foreign function interface is
is very incomplete for real world needs. I would suggest either
promoting 'object' structure as documented, official low level
interface, or adding few more arguments types (mostly arrays by reference).

Remark 2: This may be related to Debian bug 328480 (but what Camm
wrote seem indicate different problem).



diff -ru pp/build-improvements/src/interp/sockio.lisp.pamphlet 
build-improvements/src/interp/sockio.lisp.pamphlet
--- pp/build-improvements/src/interp/sockio.lisp.pamphlet       Sun Oct 29 
21:57:59 2006
+++ build-improvements/src/interp/sockio.lisp.pamphlet  Sun Oct 29 13:33:48 2006
@@ -73,10 +73,14 @@
 (progn
   (clines "extern double plus_infinity(), minus_infinity(), NANQ();")
   (clines "extern double sock_get_float();")
+  (clines "int sock_get_string_buf_wrapper(int i, object x, int j)"
+          "{ if (type_of(x)!=t_string) FEwrong_type_argument(sLstring,x);"
+          "   return sock_get_string_buf(i, x->st.st_self, j); }")
   (defentry open_server (string) (int "open_server"))
   (defentry sock_get_int (int) (int "sock_get_int"))
   (defentry sock_send_int (int int) (int "sock_send_int"))
-  (defentry sock_get_string_buf (int string int) (int "sock_get_string_buf"))
+  (defentry sock_get_string_buf (int object int) 
+     (int "sock_get_string_buf_wrapper"))
   (defentry sock_send_string_len (int string int) (int "sock_send_string_len"))
   (defentry sock_get_float (int) (double "sock_get_float"))
   (defentry sock_send_float (int double) (int "sock_send_float"))


-- 
                              Waldek Hebisch
address@hidden 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]