Hi,
In response to
XS on 64-bit: Warning from sv_vsetpvf call almut posted some code that led me to the following Inline::C script:
use warnings;
use Inline C => <<'EOC';
void vatest__(char* format, va_list* args) {
char buf[1024];
vsprintf(buf, format, *args);
errno = 0; // "Success"
perror(buf);
}
void vatest_(char* format, va_list* args) {
vatest__(format, args);
}
void vatest(char* format, ...) {
va_list args;
va_start (args, format);
vatest_(format, &args);
va_end (args);
}
SV * foo () {
char* msg0 = "vatest";
char* msg1 = "foo";
char* msg2 = "bar";
double d = 12.345;
unsigned long l = 1234567890;
vatest("%s %s", msg0, msg1);
vatest("%s %s %s %u %f", msg0, msg1, msg2, l, d);
return newSViv(0);
}
EOC
foo();
which outputs (on Win32):
vatest foo: No error
vatest foo bar 1234567890 12.345000: No error
which is correct and as expected.
But then I got to wondering whether vatest() could be called directly from perl - ie, instead of having the perl section of the above script do
foo(); have it do something like
vatest('%s %s', 'foo', 'bar'); which would output
foo bar: No error.
But, of course, that doesn't work - and I'm unable to find a way of making it work.
So, is there a way of accessing the XSub vatest() directly from perl (with either XS or Inline::C) ? I'm pretty sure there isn't ... but I'm so often wrong. Faik, there could well be some clever typemapping (or other technique) that makes it possible.
Cheers,
Rob
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.