Diff for /gforth/prim between versions 1.189 and 1.202

version 1.189, 2006/02/19 17:27:12 version 1.202, 2006/10/30 15:50:52
Line 809  n = n1*n2; Line 809  n = n1*n2;

/       ( n1 n2 -- n )          core    slash  /       ( n1 n2 -- n )          core    slash
n = n1/n2;  n = n1/n2;
if(FLOORED_DIV && ((n1^n2) < 0) && (n1%n2 != 0)) n--;  if (CHECK_DIVISION_SW && n2 == 0)
throw(BALL_DIVZERO);
if (CHECK_DIVISION_SW && n2 == -1 && n1 == CELL_MIN)
throw(BALL_RESULTRANGE);
if (FLOORED_DIV && ((n1^n2) < 0) && (n1%n2 != 0))
n--;
:  :
/mod nip ;   /mod nip ;

mod     ( n1 n2 -- n )          core  mod     ( n1 n2 -- n )          core
n = n1%n2;  n = n1%n2;
if (CHECK_DIVISION_SW && n2 == 0)
throw(BALL_DIVZERO);
if (CHECK_DIVISION_SW && n2 == -1 && n1 == CELL_MIN)
throw(BALL_RESULTRANGE);
if(FLOORED_DIV && ((n1^n2) < 0) && n!=0) n += n2;  if(FLOORED_DIV && ((n1^n2) < 0) && n!=0) n += n2;
:  :
/mod drop ;   /mod drop ;
Line 822  if(FLOORED_DIV && ((n1^n2) < 0) && n!=0) Line 831  if(FLOORED_DIV && ((n1^n2) < 0) && n!=0)
/mod    ( n1 n2 -- n3 n4 )              core            slash_mod  /mod    ( n1 n2 -- n3 n4 )              core            slash_mod
n4 = n1/n2;  n4 = n1/n2;
n3 = n1%n2; /* !! is this correct? look into C standard! */  n3 = n1%n2; /* !! is this correct? look into C standard! */
if (CHECK_DIVISION_SW && n2 == 0)
throw(BALL_DIVZERO);
if (CHECK_DIVISION_SW && n2 == -1 && n1 == CELL_MIN)
throw(BALL_RESULTRANGE);
if (FLOORED_DIV && ((n1^n2) < 0) && n3!=0) {  if (FLOORED_DIV && ((n1^n2) < 0) && n3!=0) {
n4--;    n4--;
n3+=n2;    n3+=n2;
Line 836  DCell d = mmul(n1,n2); Line 849  DCell d = mmul(n1,n2);
#else  #else
DCell d = (DCell)n1 * (DCell)n2;  DCell d = (DCell)n1 * (DCell)n2;
#endif  #endif
#ifdef BUGGY_LL_DIV  #ifdef ASM_SM_SLASH_REM
DCell r = fmdiv(d,n3);  ASM_SM_SLASH_REM(DLO(d), DHI(d), n3, n4, n5);
n4=DHI(r);  if (((DHI(d)^n3)<0) && n4!=0) {
n5=DLO(r);    if (CHECK_DIVISION && n5 == CELL_MIN)
#else      throw(BALL_RESULTRANGE);
/* assumes that the processor uses either floored or symmetric division */
n5 = d/n3;
n4 = d%n3;
if (FLOORED_DIV && ((DHI(d)^n3)<0) && n4!=0) {
n5--;    n5--;
n4+=n3;    n4+=n3;
}  }
#else
DCell r = fmdiv(d,n3);
n4=DHI(r);
n5=DLO(r);
#endif  #endif
:  :
>r m* r> fm/mod ;   >r m* r> fm/mod ;
Line 859  DCell d = mmul(n1,n2); Line 872  DCell d = mmul(n1,n2);
#else  #else
DCell d = (DCell)n1 * (DCell)n2;  DCell d = (DCell)n1 * (DCell)n2;
#endif  #endif
#ifdef BUGGY_LL_DIV  #ifdef ASM_SM_SLASH_REM
Cell remainder;
ASM_SM_SLASH_REM(DLO(d), DHI(d), n3, remainder, n4);
if (((DHI(d)^n3)<0) && remainder!=0) {
if (CHECK_DIVISION && n4 == CELL_MIN)
throw(BALL_RESULTRANGE);
n4--;
}
#else
DCell r = fmdiv(d,n3);  DCell r = fmdiv(d,n3);
n4=DLO(r);  n4=DLO(r);
#else
/* assumes that the processor uses either floored or symmetric division */
n4 = d/n3;
if (FLOORED_DIV && ((DHI(d)^n3)<0) && (d%n3)!=0) n4--;
#endif  #endif
:  :
*/mod nip ;   */mod nip ;
Line 889  n2 = n1>>1; Line 906  n2 = n1>>1;

fm/mod  ( d1 n1 -- n2 n3 )              core            f_m_slash_mod  fm/mod  ( d1 n1 -- n2 n3 )              core            f_m_slash_mod
""Floored division: @i{d1} = @i{n3}*@i{n1}+@i{n2}, @i{n1}>@i{n2}>=0 or 0>=@i{n2}>@i{n1}.""  ""Floored division: @i{d1} = @i{n3}*@i{n1}+@i{n2}, @i{n1}>@i{n2}>=0 or 0>=@i{n2}>@i{n1}.""
#ifdef BUGGY_LL_DIV
#ifdef ASM_SM_SLASH_REM  #ifdef ASM_SM_SLASH_REM
#ifdef BUGGY_LL_DIV
ASM_SM_SLASH_REM(d1.lo, d1.hi, n1, n2, n3);  ASM_SM_SLASH_REM(d1.lo, d1.hi, n1, n2, n3);
if (((DHI(d1)^n1)<0) && n2!=0) {  if (((DHI(d1)^n1)<0) && n2!=0) {
if (CHECK_DIVISION && n3 == CELL_MIN)
throw(BALL_RESULTRANGE);
n3--;    n3--;
n2+=n1;    n2+=n1;
}  }
#else /* !defined(ASM_SM_SLASH_REM) */
DCell r = fmdiv(d1,n1);
n2=DHI(r);
n3=DLO(r);
#endif /* !defined(ASM_SM_SLASH_REM) */
#else  #else
#ifdef ASM_SM_SLASH_REM4
ASM_SM_SLASH_REM4(d1, n1, n2, n3);  ASM_SM_SLASH_REM4(d1, n1, n2, n3);
if (((DHI(d1)^n1)<0) && n2!=0) {  if (((DHI(d1)^n1)<0) && n2!=0) {
if (CHECK_DIVISION && n3 == CELL_MIN)
throw(BALL_RESULTRANGE);
n3--;    n3--;
n2+=n1;    n2+=n1;
}  }
#else /* !defined(ASM_SM_SLASH_REM4) */
/* assumes that the processor uses either floored or symmetric division */
n3 = d1/n1;
n2 = d1%n1;
/* note that this 1%-3>0 is optimized by the compiler */
if (1%-3>0 && ((DHI(d1)^n1)<0) && n2!=0) {
n3--;
n2+=n1;
}
#endif /* !defined(ASM_SM_SLASH_REM4) */
#endif  #endif
#else /* !defined(ASM_SM_SLASH_REM) */
DCell r = fmdiv(d1,n1);
n2=DHI(r);
n3=DLO(r);
:  :
dup >r dup 0< IF  negate >r dnegate r>  THEN   dup >r dup 0< IF  negate >r dnegate r>  THEN
over       0< IF  tuck + swap  THEN   over       0< IF  tuck + swap  THEN
Line 940  n3=DLO(r); Line 950  n3=DLO(r);
ASM_SM_SLASH_REM4(d1, n1, n2, n3);  ASM_SM_SLASH_REM4(d1, n1, n2, n3);
#else /* !defined(ASM_SM_SLASH_REM4) */  #else /* !defined(ASM_SM_SLASH_REM4) */
/* assumes that the processor uses either floored or symmetric division */  /* assumes that the processor uses either floored or symmetric division */
n3 = d1/n1;  DCell d3 = d1/n1;
n2 = d1%n1;  n2 = d1%n1;
if (CHECK_DIVISION_SW && n1 == 0)
throw(BALL_DIVZERO);
/* note that this 1%-3<0 is optimized by the compiler */  /* note that this 1%-3<0 is optimized by the compiler */
if (1%-3<0 && ((DHI(d1)^n1)<0) && n2!=0) {  if (1%-3<0 && ((DHI(d1)^n1)<0) && n2!=0) {
n3++;    d3++;
n2-=n1;    n2-=n1;
}  }
n3 = d3;
if (CHECK_DIVISION && d3 != n3)
throw(BALL_RESULTRANGE);
#endif /* !defined(ASM_SM_SLASH_REM4) */  #endif /* !defined(ASM_SM_SLASH_REM4) */
#endif  #endif
:  :
Line 996  u3=DLO(r); Line 1011  u3=DLO(r);
#ifdef ASM_UM_SLASH_MOD4  #ifdef ASM_UM_SLASH_MOD4
ASM_UM_SLASH_MOD4(ud, u1, u2, u3);  ASM_UM_SLASH_MOD4(ud, u1, u2, u3);
#else /* !defined(ASM_UM_SLASH_MOD4) */  #else /* !defined(ASM_UM_SLASH_MOD4) */
u3 = ud/u1;  UDCell ud3 = ud/u1;
u2 = ud%u1;  u2 = ud%u1;
if (CHECK_DIVISION_SW && u1 == 0)
throw(BALL_DIVZERO);
u3 = ud3;
if (CHECK_DIVISION && ud3 != u3)
throw(BALL_RESULTRANGE);
#endif /* !defined(ASM_UM_SLASH_MOD4) */  #endif /* !defined(ASM_UM_SLASH_MOD4) */
#endif  #endif
:  :

up!     ( a_addr -- )   gforth  up_store  up!     ( a_addr -- )   gforth  up_store
:  :
up ! ;   up ! ;
Variable UP  Variable UP
Line 1646  n=1; Line 1666  n=1;

\g hostos  \g hostos

key-file        ( wfileid -- n )                gforth  paren_key_file  key-file        ( wfileid -- c )                gforth  paren_key_file
""Read one character @i{c} from @i{wfileid}.  This word disables
buffering for @i{wfileid}.  If you want to read characters from a
terminal in non-canonical (raw) mode, you have to put the terminal in
non-canonical mode yourself (using the C interface); the exception is
@code{stdin}: Gforth automatically puts it into non-canonical mode.""
#ifdef HAS_FILE  #ifdef HAS_FILE
fflush(stdout);  fflush(stdout);
n = key((FILE*)wfileid);  c = key((FILE*)wfileid);
#else  #else
n = key(stdin);  c = key(stdin);
#endif  #endif

key?-file       ( wfileid -- n )                gforth  key_q_file  key?-file       ( wfileid -- f )                gforth  key_q_file
""@i{f} is true if at least one character can be read from @i{wfileid}
without blocking.  If you also want to use @code{read-file} or
@code{read-line} on the file, you have to call @code{key?-file} or
@code{key-file} first (these two words disable buffering).""
#ifdef HAS_FILE  #ifdef HAS_FILE
fflush(stdout);  fflush(stdout);
n = key_query((FILE*)wfileid);  f = key_query((FILE*)wfileid);
#else  #else
n = key_query(stdin);  f = key_query(stdin);
#endif  #endif

\+os  \+os

stdin   ( -- wfileid )  gforth  stdin   ( -- wfileid )  gforth
""The standard input file of the Gforth process.""
wfileid = (Cell)stdin;  wfileid = (Cell)stdin;

stdout  ( -- wfileid )  gforth  stdout  ( -- wfileid )  gforth
""The standard output file of the Gforth process.""
wfileid = (Cell)stdout;  wfileid = (Cell)stdout;

stderr  ( -- wfileid )  gforth  stderr  ( -- wfileid )  gforth
""The standard error output file of the Gforth process.""
wfileid = (Cell)stderr;  wfileid = (Cell)stderr;

form    ( -- urows ucols )      gforth  form    ( -- urows ucols )      gforth
Line 1711  is the host operating system's expansion Line 1743  is the host operating system's expansion
environment variable does not exist, @i{c-addr2 u2} specifies a string 0 characters  environment variable does not exist, @i{c-addr2 u2} specifies a string 0 characters
in length.""  in length.""
/* close ' to keep fontify happy */  /* close ' to keep fontify happy */

open-pipe       ( c_addr u wfam -- wfileid wior )       gforth  open_pipe  open-pipe       ( c_addr u wfam -- wfileid wior )       gforth  open_pipe
wfileid=(Cell)popen(cstr(c_addr,u,1),pfileattr[wfam]); /* ~ expansion of 1st arg? */  wfileid=(Cell)popen(cstr(c_addr,u,1),pfileattr[wfam]); /* ~ expansion of 1st arg? */
Line 1788  else Line 1820  else
wior = IOR(a_addr2==NULL);      /* !! Define a return code */  wior = IOR(a_addr2==NULL);      /* !! Define a return code */

strerror        ( n -- c_addr u )       gforth  strerror        ( n -- c_addr u )       gforth

strsignal       ( n -- c_addr u )       gforth  strsignal       ( n -- c_addr u )       gforth

call-c  ( ... w -- ... )        gforth  call_c  call-c  ( ... w -- ... )        gforth  call_c
""Call the C function pointed to by @i{w}. The C function has to  ""Call the C function pointed to by @i{w}. The C function has to
Line 1929  if(dent == NULL) { Line 1961  if(dent == NULL) {
u2 = 0;    u2 = 0;
flag = 0;    flag = 0;
} else {  } else {
u2 = strlen(dent->d_name);    u2 = strlen((char *)dent->d_name);
if(u2 > u1) {    if(u2 > u1) {
u2 = u1;      u2 = u1;
wior = -512-ENAMETOOLONG;      wior = -512-ENAMETOOLONG;
Line 1954  wior = IOR(chdir(tilde_cstr(c_addr, u, 1 Line 1986  wior = IOR(chdir(tilde_cstr(c_addr, u, 1
""Store the current directory in the buffer specified by @{c-addr1, u1}.  ""Store the current directory in the buffer specified by @{c-addr1, u1}.
If the buffer size is not sufficient, return 0 0""  If the buffer size is not sufficient, return 0 0""
} else {  } else {
u2 = 0;    u2 = 0;
}  }
Line 1974  char newline[] = { Line 2006  char newline[] = {
'\r','\n'  '\r','\n'
#endif  #endif
};  };
u=sizeof(newline);  u=sizeof(newline);
:  :
"newline count ;   "newline count ;
Line 2166  sig=ecvt(r, u, &decpt, &flag); Line 2198  sig=ecvt(r, u, &decpt, &flag);
n=(r==0. ? 1 : decpt);  n=(r==0. ? 1 : decpt);
f1=FLAG(flag!=0);  f1=FLAG(flag!=0);
f2=FLAG(isdigit((unsigned)(sig[0]))!=0);  f2=FLAG(isdigit((unsigned)(sig[0]))!=0);
siglen=strlen(sig);  siglen=strlen((char *)sig);
if (siglen>u) /* happens in glibc-2.1.3 if 999.. is rounded up */  if (siglen>u) /* happens in glibc-2.1.3 if 999.. is rounded up */
siglen=u;    siglen=u;
if (!f2) /* workaround Cygwin trailing 0s for Inf and Nan */  if (!f2) /* workaround Cygwin trailing 0s for Inf and Nan */
Line 2587  alloc-callback ( a_ip -- c_addr ) gforth Line 2619  alloc-callback ( a_ip -- c_addr ) gforth
c_addr = (char *)alloc_callback(gforth_callback, (Xt *)a_ip);  c_addr = (char *)alloc_callback(gforth_callback, (Xt *)a_ip);

va-start-void   ( -- )  gforth  va_start_void  va-start-void   ( -- )  gforth  va_start_void
va_start_void(clist);  va_start_void(gforth_clist);

va-start-int    ( -- )  gforth  va_start_int  va-start-int    ( -- )  gforth  va_start_int
va_start_int(clist);  va_start_int(gforth_clist);

va-start-longlong       ( -- )  gforth  va_start_longlong  va-start-longlong       ( -- )  gforth  va_start_longlong
va_start_longlong(clist);  va_start_longlong(gforth_clist);

va-start-ptr    ( -- )  gforth  va_start_ptr  va-start-ptr    ( -- )  gforth  va_start_ptr
va_start_ptr(clist, (char *));  va_start_ptr(gforth_clist, (char *));

va-start-float  ( -- )  gforth  va_start_float  va-start-float  ( -- )  gforth  va_start_float
va_start_float(clist);  va_start_float(gforth_clist);

va-start-double ( -- )  gforth  va_start_double  va-start-double ( -- )  gforth  va_start_double
va_start_double(clist);  va_start_double(gforth_clist);

va-arg-int      ( -- w )        gforth  va_arg_int  va-arg-int      ( -- w )        gforth  va_arg_int
w = va_arg_int(clist);  w = va_arg_int(gforth_clist);

va-arg-longlong ( -- d )        gforth  va_arg_longlong  va-arg-longlong ( -- d )        gforth  va_arg_longlong
#ifdef BUGGY_LONG_LONG  #ifdef BUGGY_LONG_LONG
DLO_IS(d, va_arg_longlong(clist));  DLO_IS(d, va_arg_longlong(gforth_clist));
DHI_IS(d, 0);  DHI_IS(d, 0);
#else  #else
d = va_arg_longlong(clist);  d = va_arg_longlong(gforth_clist);
#endif  #endif

va-arg-ptr      ( -- c_addr )   gforth  va_arg_ptr  va-arg-ptr      ( -- c_addr )   gforth  va_arg_ptr

va-arg-float    ( -- r )        gforth  va_arg_float  va-arg-float    ( -- r )        gforth  va_arg_float
r = va_arg_float(clist);  r = va_arg_float(gforth_clist);

va-arg-double   ( -- r )        gforth  va_arg_double  va-arg-double   ( -- r )        gforth  va_arg_double
r = va_arg_double(clist);  r = va_arg_double(gforth_clist);

va-return-void ( -- )   gforth va_return_void  va-return-void ( -- )   gforth va_return_void
va_return_void(clist);  va_return_void(gforth_clist);
return 0;  return 0;

va-return-int ( w -- )  gforth va_return_int  va-return-int ( w -- )  gforth va_return_int
va_return_int(clist, w);  va_return_int(gforth_clist, w);
return 0;  return 0;

va-return-ptr ( c_addr -- )     gforth va_return_ptr  va-return-ptr ( c_addr -- )     gforth va_return_ptr
return 0;  return 0;

va-return-longlong ( d -- )     gforth va_return_longlong  va-return-longlong ( d -- )     gforth va_return_longlong
#ifdef BUGGY_LONG_LONG  #ifdef BUGGY_LONG_LONG
va_return_longlong(clist, d.lo);  va_return_longlong(gforth_clist, d.lo);
#else  #else
va_return_longlong(clist, d);  va_return_longlong(gforth_clist, d);
#endif  #endif
return 0;  return 0;

va-return-float ( r -- )        gforth va_return_float  va-return-float ( r -- )        gforth va_return_float
va_return_float(clist, r);  va_return_float(gforth_clist, r);
return 0;  return 0;

va-return-double ( r -- )       gforth va_return_double  va-return-double ( r -- )       gforth va_return_double
va_return_double(clist, r);  va_return_double(gforth_clist, r);
return 0;  return 0;

\+  \+
Line 2673  static int ffi_sizes[] = Line 2705  static int ffi_sizes[] =
n2 = ffi_sizes[n1];  n2 = ffi_sizes[n1];

ffi-prep-cif ( a_atypes n a_rtype a_cif -- w )  gforth ffi_prep_cif  ffi-prep-cif ( a_atypes n a_rtype a_cif -- w )  gforth ffi_prep_cif
w = ffi_prep_cif(a_cif, FFI_DEFAULT_ABI, n, a_rtype, a_atypes);  w = ffi_prep_cif((ffi_cif *)a_cif, FFI_DEFAULT_ABI, n,
(ffi_type *)a_rtype, (ffi_type **)a_atypes);

ffi-call ( a_avalues a_rvalue a_ip a_cif -- )   gforth ffi_call  ffi-call ( a_avalues a_rvalue a_ip a_cif -- )   gforth ffi_call
SAVE_REGS  SAVE_REGS
ffi_call(a_cif, a_ip, a_rvalue, a_avalues);  ffi_call((ffi_cif *)a_cif, (void(*)())a_ip, (void *)a_rvalue, (void **)a_avalues);
REST_REGS  REST_REGS

ffi-prep-closure ( a_ip a_cif a_closure -- w )  gforth ffi_prep_closure  ffi-prep-closure ( a_ip a_cif a_closure -- w )  gforth ffi_prep_closure
w = ffi_prep_closure(a_closure, a_cif, gforth_callback, a_ip);  w = ffi_prep_closure((ffi_closure *)a_closure, (ffi_cif *)a_cif, gforth_callback, (void *)a_ip);

ffi-2@ ( a_addr -- d )  gforth ffi_2fetch  ffi-2@ ( a_addr -- d )  gforth ffi_2fetch
#ifdef BUGGY_LONG_LONG  #ifdef BUGGY_LONG_LONG
DHI_IS(d, 0);  DHI_IS(d, 0);
#else  #else
Line 2699  ffi-2! ( d a_addr -- ) gforth ffi_2store Line 2732  ffi-2! ( d a_addr -- ) gforth ffi_2store
#endif  #endif

ffi-arg-int ( -- w )    gforth ffi_arg_int  ffi-arg-int ( -- w )    gforth ffi_arg_int
w = *(int *)(*clist++);  w = *(int *)(*gforth_clist++);

ffi-arg-long ( -- w )   gforth ffi_arg_long
w = *(long *)(*gforth_clist++);

ffi-arg-longlong ( -- d )       gforth ffi_arg_longlong  ffi-arg-longlong ( -- d )       gforth ffi_arg_longlong
#ifdef BUGGY_LONG_LONG  #ifdef BUGGY_LONG_LONG
DLO_IS(d, (Cell*)(*clist++));  DLO_IS(d, *(Cell*)(*gforth_clist++));
DHI_IS(d, 0);  DHI_IS(d, -(*(Cell*)(*gforth_clist++)<0));
#else
d = *(DCell*)(*gforth_clist++);
#endif

ffi-arg-dlong ( -- d )  gforth ffi_arg_dlong
#ifdef BUGGY_LONG_LONG
DLO_IS(d, *(Cell*)(*gforth_clist++));
DHI_IS(d, -(*(Cell*)(*gforth_clist++)<0));
#else  #else
d = *(DCell*)(*clist++);  d = *(Cell*)(*gforth_clist++);
#endif  #endif

ffi-arg-ptr ( -- c_addr )       gforth ffi_arg_ptr  ffi-arg-ptr ( -- c_addr )       gforth ffi_arg_ptr

ffi-arg-float ( -- r )  gforth ffi_arg_float  ffi-arg-float ( -- r )  gforth ffi_arg_float
r = *(float*)(*clist++);  r = *(float*)(*gforth_clist++);

ffi-arg-double ( -- r ) gforth ffi_arg_double  ffi-arg-double ( -- r ) gforth ffi_arg_double
r = *(double*)(*clist++);  r = *(double*)(*gforth_clist++);

ffi-ret-void ( -- )     gforth ffi_ret_void  ffi-ret-void ( -- )     gforth ffi_ret_void
return 0;  return 0;

ffi-ret-int ( w -- )    gforth ffi_ret_int  ffi-ret-int ( w -- )    gforth ffi_ret_int
*(int*)(ritem) = w;  *(int*)(gforth_ritem) = w;
return 0;  return 0;

ffi-ret-longlong ( d -- )       gforth ffi_ret_longlong  ffi-ret-longlong ( d -- )       gforth ffi_ret_longlong
#ifdef BUGGY_LONG_LONG  #ifdef BUGGY_LONG_LONG
*(Cell*)(ritem) = DLO(d);  *(Cell*)(gforth_ritem) = DLO(d);
#else
*(DCell*)(gforth_ritem) = d;
#endif
return 0;

ffi-ret-dlong ( d -- )  gforth ffi_ret_dlong
#ifdef BUGGY_LONG_LONG
*(Cell*)(gforth_ritem) = DLO(d);
#else  #else
*(DCell*)(ritem) = d;  *(Cell*)(gforth_ritem) = d;
#endif  #endif
return 0;  return 0;

ffi-ret-long ( n -- )   gforth ffi_ret_long
*(Cell*)(gforth_ritem) = n;
return 0;

ffi-ret-ptr ( c_addr -- )       gforth ffi_ret_ptr  ffi-ret-ptr ( c_addr -- )       gforth ffi_ret_ptr
return 0;  return 0;

ffi-ret-float ( r -- )  gforth ffi_ret_float  ffi-ret-float ( r -- )  gforth ffi_ret_float
*(float*)(ritem) = r;  *(float*)(gforth_ritem) = r;
return 0;  return 0;

ffi-ret-double ( r -- ) gforth ffi_ret_double  ffi-ret-double ( r -- ) gforth ffi_ret_double
*(double*)(ritem) = r;  *(double*)(gforth_ritem) = r;
return 0;  return 0;

\+  \+

 Removed from v.1.189 changed lines Added in v.1.202

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>