r3wp [groups: 83 posts: 189283]
  • Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search
 

World: r3wp

[!REBOL3 Extensions] REBOL 3 Extensions discussions

Maxim
9-Nov-2010
[1678x2]
actually... its:    arg.index = 0;
we could propose a usefull macro to not get bitten by  this  again:

something like:

#define NEW_RXIARG(v) RXIARG v; v.index=0
Andreas
9-Nov-2010
[1680x2]
CLEARS(&a);
RXIARG a;
CLEARS(&a);

is the most sensible way. but then you'll better #include <string.h> 
(at least until some include woes in the hostkit headers are straightened 
out).
Maxim
9-Nov-2010
[1682]
however we do it, the problem is not in how, but that we forget to 
do it in the first place.
Andreas
9-Nov-2010
[1683]
that's C for you :)
Maxim
9-Nov-2010
[1684]
which is why a standard macro which takes care of that would be nice... 
in the same idea than the RL_MAKE_BLOCK (which I know isn't exactly 
the same since its just a wrapper around the RL vector)
Andreas
9-Nov-2010
[1685]
you have to make sure to initialise all stack- and heap-allocated 
memory
Maxim
9-Nov-2010
[1686]
yep.
Oldes
10-Nov-2010
[1687x2]
Ah.. thanks.. so I made another small step in learning extensions:) 
Thanks. I'm sure I will have more questions later. But I must work 
now for a while.
When I have command like:
	test: command [str [string!]]
And on C side I need a pointer to this string, how to get it?
Maxim
10-Nov-2010
[1689]
str_arg = RXA_SERIES(frm, 1);
Oldes
10-Nov-2010
[1690]
with:
 char *str_arg;
?
Maxim
10-Nov-2010
[1691]
sorry..

REBSER * str_arg = RXA_SERIES(frm, 1);
Oldes
10-Nov-2010
[1692x2]
That's not working, the function I'm trying to call is:

char **MagickQueryConfigureOptions(const char *pattern, unsigned 
long *number_options)
And I would like to use REBOL input for the *pattern.
Does it mean that I must use FOR loop with RL_GET_CHAR or I can get 
the pointer directly?
Maxim
10-Nov-2010
[1694x3]
loop with RL_GET_CHAR
to get the length of the REBOL string you need to use this:
RL_Series(str_arg, RXI_SER_TAIL)
Oldes
10-Nov-2010
[1697x2]
with RL_Series I have this error:  undefined reference to `_imp__RL_Series'
This works:
            REBSER *ser;
            i32 len;
            
            ser = RXA_SERIES(frm, 1);

            len = RL_SERIES (ser, RXI_SER_TAIL) - RXA_INDEX(frm, 1);

            char pattern[len]; 
            for(n = 0; n < len; ++n)   
                pattern[n] = RL_GET_CHAR(ser, n);
Maxim
10-Nov-2010
[1699]
yeah... sorry... I have my own defines, which include the required 
files.
Oldes
10-Nov-2010
[1700]
What I must include to be able use RL_Print?
Maxim
10-Nov-2010
[1701]
AFAIK, you should just need 

#include "reb-host.h"
Oldes
10-Nov-2010
[1702x2]
That I have, but I get the similar error: undefined reference to 
`_imp__RL_Print'
It would be much more easier to play with extensions with the ability 
to trace it.
Maxim
10-Nov-2010
[1704]
is your file a .c or .cpp  ?
Oldes
10-Nov-2010
[1705]
.c
Maxim
10-Nov-2010
[1706]
you can try adding 

extern  void RL_Print(char *fmt, ...);

at the begining of your file.
Oldes
10-Nov-2010
[1707]
That does not works.
Maxim
10-Nov-2010
[1708x2]
are you using gcc of VS ?
of = or
Oldes
10-Nov-2010
[1710x3]
GCC
it's not working with Andreas' minimal example as well - http://www.curecode.org/rebol3/ticket.rsp?id=1727
(wrong link, this one https://gist.github.com/0c6305d7c25e40742b31
)
Maxim
10-Nov-2010
[1713x2]
ah, I did a little bit of searching and I think I understand... 

try using RL_PRINT() instead.
its strange that I've never had a problem with this though cause 
I use RL_Print in all my files, but I realize that it might just 
be luck, that in my setup I don't have the linking problem you are 
having.
Oldes
10-Nov-2010
[1715]
That works, but only with 2 args.
Maxim
10-Nov-2010
[1716x5]
RL_PRINT should work in any uses of the host_kit
ok... that is easy to fix.
open reb-lib.h
and replace:
#define RL_PRINT(a,b)               RL->print(a,b)

with:
#define RL_PRINT(a,b)               RL->print(a,__VA_ARGS__)

can't test it right now, but that should work.
the function itself is defined with variable arguments, its just 
the #define which isn't ... the above redefines it so it matches 
the function declaration.
Oldes
10-Nov-2010
[1721]
__VA_ARGS__ can only appear in the expansion of a C99 variadic macro
Never mind... I really have to do real work now :)
Maxim
10-Nov-2010
[1722]
what?  I'm using it my own gcc compiled version of the host-kit... 
I don't understand... Andreas will have to step in... I don't know 
why you're having that error.
Oldes
10-Nov-2010
[1723]
Actually it's:

../src/include/reb-lib.h:270:49: warning: __VA_ARGS__ can only appear 
in the expansion of a C99 variadic macro

wand.c:74:43: macro "RL_PRINT" passed 3 arguments, but takes just 
2
wand.c: In function `RX_Call':

wand.c:74: error: `RL_PRINT' undeclared (first use in this function)
Maxim
10-Nov-2010
[1724]
ok, well, I guess you'll have to use just two args for now  ;-)
Oldes
10-Nov-2010
[1725]
But I have a solution, this works:
RL->print("%d %s\n", n,item);
Maxim
10-Nov-2010
[1726x2]
true.


btw, keep reb-lib.h open when you code extension stuff, its the best 
source to get the proper argument information for all the available 
RLxxxxx functions.
if you look at the web version it mangles the argument types, by 
stripping away any pointer use... so it gets really screwed up.