From f75701d8334150eb6f5c20e88aa5fc12a2c91fd0 Mon Sep 17 00:00:00 2001 From: wenyuzifang Date: Tue, 8 Jul 2025 11:11:53 +0800 Subject: [PATCH] Update code from upstream --- ExtUtils-ParseXS-3.44.tar.gz | Bin 68942 -> 0 bytes ...ls-ParseXS-3.51-Add-perlxs-man-pages.patch | 4600 +++++++++++++++++ ExtUtils-ParseXS-3.51.tar.gz | Bin 0 -> 71496 bytes perl-ExtUtils-ParseXS.spec | 11 +- 4 files changed, 4608 insertions(+), 3 deletions(-) delete mode 100644 ExtUtils-ParseXS-3.44.tar.gz create mode 100644 ExtUtils-ParseXS-3.51-Add-perlxs-man-pages.patch create mode 100644 ExtUtils-ParseXS-3.51.tar.gz diff --git a/ExtUtils-ParseXS-3.44.tar.gz b/ExtUtils-ParseXS-3.44.tar.gz deleted file mode 100644 index 7bbc3fe86e1d6d3de9a6e826227dacae2ffba348..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68942 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 I(*Upp0H0X`UH||9 diff --git a/ExtUtils-ParseXS-3.51-Add-perlxs-man-pages.patch b/ExtUtils-ParseXS-3.51-Add-perlxs-man-pages.patch new file mode 100644 index 0000000..747b922 --- /dev/null +++ b/ExtUtils-ParseXS-3.51-Add-perlxs-man-pages.patch @@ -0,0 +1,4600 @@ +From bd2b15a246ebcb8cee2c060b18f9157481a084f9 Mon Sep 17 00:00:00 2001 +From: Jitka Plesnikova +Date: Fri, 7 Jan 2022 11:03:48 +0100 +Subject: [PATCH] Add perlxs* man pages + +--- + lib/perlxs.pod | 2429 +++++++++++++++++++++++++++++++++++++++++ + lib/perlxstut.pod | 1425 ++++++++++++++++++++++++ + lib/perlxstypemap.pod | 711 ++++++++++++ + 3 files changed, 4565 insertions(+) + create mode 100644 lib/perlxs.pod + create mode 100644 lib/perlxstut.pod + create mode 100644 lib/perlxstypemap.pod + +diff --git a/lib/perlxs.pod b/lib/perlxs.pod +new file mode 100644 +index 0000000..aa7ccad +--- /dev/null ++++ b/lib/perlxs.pod +@@ -0,0 +1,2429 @@ ++=head1 NAME ++ ++perlxs - XS language reference manual ++ ++=head1 DESCRIPTION ++ ++=head2 Introduction ++ ++XS is an interface description file format used to create an extension ++interface between Perl and C code (or a C library) which one wishes ++to use with Perl. The XS interface is combined with the library to ++create a new library which can then be either dynamically loaded ++or statically linked into perl. The XS interface description is ++written in the XS language and is the core component of the Perl ++extension interface. ++ ++Before writing XS, read the L section below. ++ ++An B forms the basic unit of the XS interface. After compilation ++by the B compiler, each XSUB amounts to a C function definition ++which will provide the glue between Perl calling conventions and C ++calling conventions. ++ ++The glue code pulls the arguments from the Perl stack, converts these ++Perl values to the formats expected by a C function, calls this C function, ++and then transfers the return values of the C function back to Perl. ++Return values here may be a conventional C return value or any C ++function arguments that may serve as output parameters. These return ++values may be passed back to Perl either by putting them on the ++Perl stack, or by modifying the arguments supplied from the Perl side. ++ ++The above is a somewhat simplified view of what really happens. Since ++Perl allows more flexible calling conventions than C, XSUBs may do much ++more in practice, such as checking input parameters for validity, ++throwing exceptions (or returning undef/empty list) if the return value ++from the C function indicates failure, calling different C functions ++based on numbers and types of the arguments, providing an object-oriented ++interface, etc. ++ ++Of course, one could write such glue code directly in C. However, this ++would be a tedious task, especially if one needs to write glue for ++multiple C functions, and/or one is not familiar enough with the Perl ++stack discipline and other such arcana. XS comes to the rescue here: ++instead of writing this glue C code in long-hand, one can write ++a more concise short-hand I of what should be done by ++the glue, and let the XS compiler B handle the rest. ++ ++The XS language allows one to describe the mapping between how the C ++routine is used, and how the corresponding Perl routine is used. It ++also allows creation of Perl routines which are directly translated to ++C code and which are not related to a pre-existing C function. In cases ++when the C interface coincides with the Perl interface, the XSUB ++declaration is almost identical to a declaration of a C function (in K&R ++style). In such circumstances, there is another tool called C ++that is able to translate an entire C header file into a corresponding ++XS file that will provide glue to the functions/macros described in ++the header file. ++ ++The XS compiler is called B. This compiler creates ++the constructs necessary to let an XSUB manipulate Perl values, and ++creates the glue necessary to let Perl call the XSUB. The compiler ++uses B to determine how to map C function parameters ++and output values to Perl values and back. The default typemap ++(which comes with Perl) handles many common C types. A supplementary ++typemap may also be needed to handle any special structures and types ++for the library being linked. For more information on typemaps, ++see L. ++ ++A file in XS format starts with a C language section which goes until the ++first C> directive. Other XS directives and XSUB definitions ++may follow this line. The "language" used in this part of the file ++is usually referred to as the XS language. B recognizes and ++skips POD (see L) in both the C and XS language sections, which ++allows the XS file to contain embedded documentation. ++ ++See L for a tutorial on the whole extension creation process. ++ ++Note: For some extensions, Dave Beazley's SWIG system may provide a ++significantly more convenient mechanism for creating the extension ++glue code. See L for more information. ++ ++For simple bindings to C libraries as well as other machine code libraries, ++consider instead using the much simpler ++L interface via CPAN modules like ++L or L. ++ ++=head2 On The Road ++ ++Many of the examples which follow will concentrate on creating an interface ++between Perl and the ONC+ RPC bind library functions. The rpcb_gettime() ++function is used to demonstrate many features of the XS language. This ++function has two parameters; the first is an input parameter and the second ++is an output parameter. The function also returns a status value. ++ ++ bool_t rpcb_gettime(const char *host, time_t *timep); ++ ++From C this function will be called with the following ++statements. ++ ++ #include ++ bool_t status; ++ time_t timep; ++ status = rpcb_gettime( "localhost", &timep ); ++ ++If an XSUB is created to offer a direct translation between this function ++and Perl, then this XSUB will be used from Perl with the following code. ++The $status and $timep variables will contain the output of the function. ++ ++ use RPC; ++ $status = rpcb_gettime( "localhost", $timep ); ++ ++The following XS file shows an XS subroutine, or XSUB, which ++demonstrates one possible interface to the rpcb_gettime() ++function. This XSUB represents a direct translation between ++C and Perl and so preserves the interface even from Perl. ++This XSUB will be invoked from Perl with the usage shown ++above. Note that the first three #include statements, for ++C, C, and C, will always be present at the ++beginning of an XS file. This approach and others will be ++expanded later in this document. A #define for C ++should be present to fetch the interpreter context more efficiently, ++see L for details. ++ ++ #define PERL_NO_GET_CONTEXT ++ #include "EXTERN.h" ++ #include "perl.h" ++ #include "XSUB.h" ++ #include ++ ++ MODULE = RPC PACKAGE = RPC ++ ++ bool_t ++ rpcb_gettime(host,timep) ++ char *host ++ time_t &timep ++ OUTPUT: ++ timep ++ ++Any extension to Perl, including those containing XSUBs, ++should have a Perl module to serve as the bootstrap which ++pulls the extension into Perl. This module will export the ++extension's functions and variables to the Perl program and ++will cause the extension's XSUBs to be linked into Perl. ++The following module will be used for most of the examples ++in this document and should be used from Perl with the C ++command as shown earlier. Perl modules are explained in ++more detail later in this document. ++ ++ package RPC; ++ ++ require Exporter; ++ require DynaLoader; ++ @ISA = qw(Exporter DynaLoader); ++ @EXPORT = qw( rpcb_gettime ); ++ ++ bootstrap RPC; ++ 1; ++ ++Throughout this document a variety of interfaces to the rpcb_gettime() ++XSUB will be explored. The XSUBs will take their parameters in different ++orders or will take different numbers of parameters. In each case the ++XSUB is an abstraction between Perl and the real C rpcb_gettime() ++function, and the XSUB must always ensure that the real rpcb_gettime() ++function is called with the correct parameters. This abstraction will ++allow the programmer to create a more Perl-like interface to the C ++function. ++ ++=head2 The Anatomy of an XSUB ++ ++The simplest XSUBs consist of 3 parts: a description of the return ++value, the name of the XSUB routine and the names of its arguments, ++and a description of types or formats of the arguments. ++ ++The following XSUB allows a Perl program to access a C library function ++called sin(). The XSUB will imitate the C function which takes a single ++argument and returns a single value. ++ ++ double ++ sin(x) ++ double x ++ ++Optionally, one can merge the description of types and the list of ++argument names, rewriting this as ++ ++ double ++ sin(double x) ++ ++This makes this XSUB look similar to an ANSI C declaration. An optional ++semicolon is allowed after the argument list, as in ++ ++ double ++ sin(double x); ++ ++Parameters with C pointer types can have different semantic: C functions ++with similar declarations ++ ++ bool string_looks_as_a_number(char *s); ++ bool make_char_uppercase(char *c); ++ ++are used in absolutely incompatible manner. Parameters to these functions ++could be described to B like this: ++ ++ char * s ++ char &c ++ ++Both these XS declarations correspond to the C C type, but they have ++different semantics, see L<"The & Unary Operator">. ++ ++It is convenient to think that the indirection operator ++C<*> should be considered as a part of the type and the address operator C<&> ++should be considered part of the variable. See L ++for more info about handling qualifiers and unary operators in C types. ++ ++The function name and the return type must be placed on ++separate lines and should be flush left-adjusted. ++ ++ INCORRECT CORRECT ++ ++ double sin(x) double ++ double x sin(x) ++ double x ++ ++The rest of the function description may be indented or left-adjusted. The ++following example shows a function with its body left-adjusted. Most ++examples in this document will indent the body for better readability. ++ ++ CORRECT ++ ++ double ++ sin(x) ++ double x ++ ++More complicated XSUBs may contain many other sections. Each section of ++an XSUB starts with the corresponding keyword, such as INIT: or CLEANUP:. ++However, the first two lines of an XSUB always contain the same data: ++descriptions of the return type and the names of the function and its ++parameters. Whatever immediately follows these is considered to be ++an INPUT: section unless explicitly marked with another keyword. ++(See L.) ++ ++An XSUB section continues until another section-start keyword is found. ++ ++=head2 The Argument Stack ++ ++The Perl argument stack is used to store the values which are ++sent as parameters to the XSUB and to store the XSUB's ++return value(s). In reality all Perl functions (including non-XSUB ++ones) keep their values on this stack all the same time, each limited ++to its own range of positions on the stack. In this document the ++first position on that stack which belongs to the active ++function will be referred to as position 0 for that function. ++ ++XSUBs refer to their stack arguments with the macro B, where I ++refers to a position in this XSUB's part of the stack. Position 0 for that ++function would be known to the XSUB as ST(0). The XSUB's incoming ++parameters and outgoing return values always begin at ST(0). For many ++simple cases the B compiler will generate the code necessary to ++handle the argument stack by embedding code fragments found in the ++typemaps. In more complex cases the programmer must supply the code. ++ ++=head2 The RETVAL Variable ++ ++The RETVAL variable is a special C variable that is declared automatically ++for you. The C type of RETVAL matches the return type of the C library ++function. The B compiler will declare this variable in each XSUB ++with non-C return type. By default the generated C function ++will use RETVAL to hold the return value of the C library function being ++called. In simple cases the value of RETVAL will be placed in ST(0) of ++the argument stack where it can be received by Perl as the return value ++of the XSUB. ++ ++If the XSUB has a return type of C then the compiler will ++not declare a RETVAL variable for that function. When using ++a PPCODE: section no manipulation of the RETVAL variable is required, the ++section may use direct stack manipulation to place output values on the stack. ++ ++If PPCODE: directive is not used, C return value should be used ++only for subroutines which do not return a value, I CODE: ++directive is used which sets ST(0) explicitly. ++ ++Older versions of this document recommended to use C return ++value in such cases. It was discovered that this could lead to ++segfaults in cases when XSUB was I C. This practice is ++now deprecated, and may be not supported at some future version. Use ++the return value C in such cases. (Currently C contains ++some heuristic code which tries to disambiguate between "truly-void" ++and "old-practice-declared-as-void" functions. Hence your code is at ++mercy of this heuristics unless you use C as return value.) ++ ++=head2 Returning SVs, AVs and HVs through RETVAL ++ ++When you're using RETVAL to return an C, there's some magic ++going on behind the scenes that should be mentioned. When you're ++manipulating the argument stack using the ST(x) macro, for example, ++you usually have to pay special attention to reference counts. (For ++more about reference counts, see L.) To make your life ++easier, the typemap file automatically makes C mortal when ++you're returning an C. Thus, the following two XSUBs are more ++or less equivalent: ++ ++ void ++ alpha() ++ PPCODE: ++ ST(0) = newSVpv("Hello World",0); ++ sv_2mortal(ST(0)); ++ XSRETURN(1); ++ ++ SV * ++ beta() ++ CODE: ++ RETVAL = newSVpv("Hello World",0); ++ OUTPUT: ++ RETVAL ++ ++This is quite useful as it usually improves readability. While ++this works fine for an C, it's unfortunately not as easy ++to have C or C as a return value. You I be ++able to write: ++ ++ AV * ++ array() ++ CODE: ++ RETVAL = newAV(); ++ /* do something with RETVAL */ ++ OUTPUT: ++ RETVAL ++ ++But due to an unfixable bug (fixing it would break lots of existing ++CPAN modules) in the typemap file, the reference count of the C ++is not properly decremented. Thus, the above XSUB would leak memory ++whenever it is being called. The same problem exists for C, ++C, and C (which indicates a scalar reference, not ++a general C). ++In XS code on perls starting with perl 5.16, you can override the ++typemaps for any of these types with a version that has proper ++handling of refcounts. In your C section, do ++ ++ AV* T_AVREF_REFCOUNT_FIXED ++ ++to get the repaired variant. For backward compatibility with older ++versions of perl, you can instead decrement the reference count ++manually when you're returning one of the aforementioned ++types using C: ++ ++ AV * ++ array() ++ CODE: ++ RETVAL = newAV(); ++ sv_2mortal((SV*)RETVAL); ++ /* do something with RETVAL */ ++ OUTPUT: ++ RETVAL ++ ++Remember that you don't have to do this for an C. The reference ++documentation for all core typemaps can be found in L. ++ ++=head2 The MODULE Keyword ++ ++The MODULE keyword is used to start the XS code and to specify the package ++of the functions which are being defined. All text preceding the first ++MODULE keyword is considered C code and is passed through to the output with ++POD stripped, but otherwise untouched. Every XS module will have a ++bootstrap function which is used to hook the XSUBs into Perl. The package ++name of this bootstrap function will match the value of the last MODULE ++statement in the XS source files. The value of MODULE should always remain ++constant within the same XS file, though this is not required. ++ ++The following example will start the XS code and will place ++all functions in a package named RPC. ++ ++ MODULE = RPC ++ ++=head2 The PACKAGE Keyword ++ ++When functions within an XS source file must be separated into packages ++the PACKAGE keyword should be used. This keyword is used with the MODULE ++keyword and must follow immediately after it when used. ++ ++ MODULE = RPC PACKAGE = RPC ++ ++ [ XS code in package RPC ] ++ ++ MODULE = RPC PACKAGE = RPCB ++ ++ [ XS code in package RPCB ] ++ ++ MODULE = RPC PACKAGE = RPC ++ ++ [ XS code in package RPC ] ++ ++The same package name can be used more than once, allowing for ++non-contiguous code. This is useful if you have a stronger ordering ++principle than package names. ++ ++Although this keyword is optional and in some cases provides redundant ++information it should always be used. This keyword will ensure that the ++XSUBs appear in the desired package. ++ ++=head2 The PREFIX Keyword ++ ++The PREFIX keyword designates prefixes which should be ++removed from the Perl function names. If the C function is ++C and the PREFIX value is C then Perl will ++see this function as C. ++ ++This keyword should follow the PACKAGE keyword when used. ++If PACKAGE is not used then PREFIX should follow the MODULE ++keyword. ++ ++ MODULE = RPC PREFIX = rpc_ ++ ++ MODULE = RPC PACKAGE = RPCB PREFIX = rpcb_ ++ ++=head2 The OUTPUT: Keyword ++ ++The OUTPUT: keyword indicates that certain function parameters should be ++updated (new values made visible to Perl) when the XSUB terminates or that ++certain values should be returned to the calling Perl function. For ++simple functions which have no CODE: or PPCODE: section, ++such as the sin() function above, the RETVAL variable is ++automatically designated as an output value. For more complex functions ++the B compiler will need help to determine which variables are output ++variables. ++ ++This keyword will normally be used to complement the CODE: keyword. ++The RETVAL variable is not recognized as an output variable when the ++CODE: keyword is present. The OUTPUT: keyword is used in this ++situation to tell the compiler that RETVAL really is an output ++variable. ++ ++The OUTPUT: keyword can also be used to indicate that function parameters ++are output variables. This may be necessary when a parameter has been ++modified within the function and the programmer would like the update to ++be seen by Perl. ++ ++ bool_t ++ rpcb_gettime(host,timep) ++ char *host ++ time_t &timep ++ OUTPUT: ++ timep ++ ++The OUTPUT: keyword will also allow an output parameter to ++be mapped to a matching piece of code rather than to a ++typemap. ++ ++ bool_t ++ rpcb_gettime(host,timep) ++ char *host ++ time_t &timep ++ OUTPUT: ++ timep sv_setnv(ST(1), (double)timep); ++ ++B emits an automatic C for all parameters in the ++OUTPUT section of the XSUB, except RETVAL. This is the usually desired ++behavior, as it takes care of properly invoking 'set' magic on output ++parameters (needed for hash or array element parameters that must be ++created if they didn't exist). If for some reason, this behavior is ++not desired, the OUTPUT section may contain a C line ++to disable it for the remainder of the parameters in the OUTPUT section. ++Likewise, C can be used to reenable it for the ++remainder of the OUTPUT section. See L for more details ++about 'set' magic. ++ ++=head2 The NO_OUTPUT Keyword ++ ++The NO_OUTPUT can be placed as the first token of the XSUB. This keyword ++indicates that while the C subroutine we provide an interface to has ++a non-C return type, the return value of this C subroutine should not ++be returned from the generated Perl subroutine. ++ ++With this keyword present L is created, and in the ++generated call to the subroutine this variable is assigned to, but the value ++of this variable is not going to be used in the auto-generated code. ++ ++This keyword makes sense only if C is going to be accessed by the ++user-supplied code. It is especially useful to make a function interface ++more Perl-like, especially when the C return value is just an error condition ++indicator. For example, ++ ++ NO_OUTPUT int ++ delete_file(char *name) ++ POSTCALL: ++ if (RETVAL != 0) ++ croak("Error %d while deleting file '%s'", RETVAL, name); ++ ++Here the generated XS function returns nothing on success, and will die() ++with a meaningful error message on error. ++ ++=head2 The CODE: Keyword ++ ++This keyword is used in more complicated XSUBs which require ++special handling for the C function. The RETVAL variable is ++still declared, but it will not be returned unless it is specified ++in the OUTPUT: section. ++ ++The following XSUB is for a C function which requires special handling of ++its parameters. The Perl usage is given first. ++ ++ $status = rpcb_gettime( "localhost", $timep ); ++ ++The XSUB follows. ++ ++ bool_t ++ rpcb_gettime(host,timep) ++ char *host ++ time_t timep ++ CODE: ++ RETVAL = rpcb_gettime( host, &timep ); ++ OUTPUT: ++ timep ++ RETVAL ++ ++=head2 The INIT: Keyword ++ ++The INIT: keyword allows initialization to be inserted into the XSUB before ++the compiler generates the call to the C function. Unlike the CODE: keyword ++above, this keyword does not affect the way the compiler handles RETVAL. ++ ++ bool_t ++ rpcb_gettime(host,timep) ++ char *host ++ time_t &timep ++ INIT: ++ printf("# Host is %s\n", host ); ++ OUTPUT: ++ timep ++ ++Another use for the INIT: section is to check for preconditions before ++making a call to the C function: ++ ++ long long ++ lldiv(a,b) ++ long long a ++ long long b ++ INIT: ++ if (a == 0 && b == 0) ++ XSRETURN_UNDEF; ++ if (b == 0) ++ croak("lldiv: cannot divide by 0"); ++ ++=head2 The NO_INIT Keyword ++ ++The NO_INIT keyword is used to indicate that a function ++parameter is being used only as an output value. The B ++compiler will normally generate code to read the values of ++all function parameters from the argument stack and assign ++them to C variables upon entry to the function. NO_INIT ++will tell the compiler that some parameters will be used for ++output rather than for input and that they will be handled ++before the function terminates. ++ ++The following example shows a variation of the rpcb_gettime() function. ++This function uses the timep variable only as an output variable and does ++not care about its initial contents. ++ ++ bool_t ++ rpcb_gettime(host,timep) ++ char *host ++ time_t &timep = NO_INIT ++ OUTPUT: ++ timep ++ ++=head2 The TYPEMAP: Keyword ++ ++Starting with Perl 5.16, you can embed typemaps into your XS code ++instead of or in addition to typemaps in a separate file. Multiple ++such embedded typemaps will be processed in order of appearance in ++the XS code and like local typemap files take precedence over the ++default typemap, the embedded typemaps may overwrite previous ++definitions of TYPEMAP, INPUT, and OUTPUT stanzas. The syntax for ++embedded typemaps is ++ ++ TYPEMAP: < keyword must appear in the first column of a ++new line. ++ ++Refer to L for details on writing typemaps. ++ ++=head2 Initializing Function Parameters ++ ++C function parameters are normally initialized with their values from ++the argument stack (which in turn contains the parameters that were ++passed to the XSUB from Perl). The typemaps contain the ++code segments which are used to translate the Perl values to ++the C parameters. The programmer, however, is allowed to ++override the typemaps and supply alternate (or additional) ++initialization code. Initialization code starts with the first ++C<=>, C<;> or C<+> on a line in the INPUT: section. The only ++exception happens if this C<;> terminates the line, then this C<;> ++is quietly ignored. ++ ++The following code demonstrates how to supply initialization code for ++function parameters. The initialization code is eval'ed within double ++quotes by the compiler before it is added to the output so anything ++which should be interpreted literally [mainly C<$>, C<@>, or C<\\>] ++must be protected with backslashes. The variables C<$var>, C<$arg>, ++and C<$type> can be used as in typemaps. ++ ++ bool_t ++ rpcb_gettime(host,timep) ++ char *host = (char *)SvPVbyte_nolen($arg); ++ time_t &timep = 0; ++ OUTPUT: ++ timep ++ ++This should not be used to supply default values for parameters. One ++would normally use this when a function parameter must be processed by ++another library function before it can be used. Default parameters are ++covered in the next section. ++ ++If the initialization begins with C<=>, then it is output in ++the declaration for the input variable, replacing the initialization ++supplied by the typemap. If the initialization ++begins with C<;> or C<+>, then it is performed after ++all of the input variables have been declared. In the C<;> ++case the initialization normally supplied by the typemap is not performed. ++For the C<+> case, the declaration for the variable will include the ++initialization from the typemap. A global ++variable, C<%v>, is available for the truly rare case where ++information from one initialization is needed in another ++initialization. ++ ++Here's a truly obscure example: ++ ++ bool_t ++ rpcb_gettime(host,timep) ++ time_t &timep; /* \$v{timep}=@{[$v{timep}=$arg]} */ ++ char *host + SvOK($v{timep}) ? SvPVbyte_nolen($arg) : NULL; ++ OUTPUT: ++ timep ++ ++The construct C<\$v{timep}=@{[$v{timep}=$arg]}> used in the above ++example has a two-fold purpose: first, when this line is processed by ++B, the Perl snippet C<$v{timep}=$arg> is evaluated. Second, ++the text of the evaluated snippet is output into the generated C file ++(inside a C comment)! During the processing of C line, ++C<$arg> will evaluate to C, and C<$v{timep}> will evaluate to ++C. ++ ++=head2 Default Parameter Values ++ ++Default values for XSUB arguments can be specified by placing an ++assignment statement in the parameter list. The default value may ++be a number, a string or the special string C. Defaults should ++always be used on the right-most parameters only. ++ ++To allow the XSUB for rpcb_gettime() to have a default host ++value the parameters to the XSUB could be rearranged. The ++XSUB will then call the real rpcb_gettime() function with ++the parameters in the correct order. This XSUB can be called ++from Perl with either of the following statements: ++ ++ $status = rpcb_gettime( $timep, $host ); ++ ++ $status = rpcb_gettime( $timep ); ++ ++The XSUB will look like the code which follows. A CODE: ++block is used to call the real rpcb_gettime() function with ++the parameters in the correct order for that function. ++ ++ bool_t ++ rpcb_gettime(timep,host="localhost") ++ char *host ++ time_t timep = NO_INIT ++ CODE: ++ RETVAL = rpcb_gettime( host, &timep ); ++ OUTPUT: ++ timep ++ RETVAL ++ ++=head2 The PREINIT: Keyword ++ ++The PREINIT: keyword allows extra variables to be declared immediately ++before or after the declarations of the parameters from the INPUT: section ++are emitted. ++ ++If a variable is declared inside a CODE: section it will follow any typemap ++code that is emitted for the input parameters. This may result in the ++declaration ending up after C code, which is C syntax error. Similar ++errors may happen with an explicit C<;>-type or C<+>-type initialization of ++parameters is used (see L<"Initializing Function Parameters">). Declaring ++these variables in an INIT: section will not help. ++ ++In such cases, to force an additional variable to be declared together ++with declarations of other variables, place the declaration into a ++PREINIT: section. The PREINIT: keyword may be used one or more times ++within an XSUB. ++ ++The following examples are equivalent, but if the code is using complex ++typemaps then the first example is safer. ++ ++ bool_t ++ rpcb_gettime(timep) ++ time_t timep = NO_INIT ++ PREINIT: ++ char *host = "localhost"; ++ CODE: ++ RETVAL = rpcb_gettime( host, &timep ); ++ OUTPUT: ++ timep ++ RETVAL ++ ++For this particular case an INIT: keyword would generate the ++same C code as the PREINIT: keyword. Another correct, but error-prone example: ++ ++ bool_t ++ rpcb_gettime(timep) ++ time_t timep = NO_INIT ++ CODE: ++ char *host = "localhost"; ++ RETVAL = rpcb_gettime( host, &timep ); ++ OUTPUT: ++ timep ++ RETVAL ++ ++Another way to declare C is to use a C block in the CODE: section: ++ ++ bool_t ++ rpcb_gettime(timep) ++ time_t timep = NO_INIT ++ CODE: ++ { ++ char *host = "localhost"; ++ RETVAL = rpcb_gettime( host, &timep ); ++ } ++ OUTPUT: ++ timep ++ RETVAL ++ ++The ability to put additional declarations before the typemap entries are ++processed is very handy in the cases when typemap conversions manipulate ++some global state: ++ ++ MyObject ++ mutate(o) ++ PREINIT: ++ MyState st = global_state; ++ INPUT: ++ MyObject o; ++ CLEANUP: ++ reset_to(global_state, st); ++ ++Here we suppose that conversion to C in the INPUT: section and from ++MyObject when processing RETVAL will modify a global variable C. ++After these conversions are performed, we restore the old value of ++C (to avoid memory leaks, for example). ++ ++There is another way to trade clarity for compactness: INPUT sections allow ++declaration of C variables which do not appear in the parameter list of ++a subroutine. Thus the above code for mutate() can be rewritten as ++ ++ MyObject ++ mutate(o) ++ MyState st = global_state; ++ MyObject o; ++ CLEANUP: ++ reset_to(global_state, st); ++ ++and the code for rpcb_gettime() can be rewritten as ++ ++ bool_t ++ rpcb_gettime(timep) ++ time_t timep = NO_INIT ++ char *host = "localhost"; ++ C_ARGS: ++ host, &timep ++ OUTPUT: ++ timep ++ RETVAL ++ ++=head2 The SCOPE: Keyword ++ ++The SCOPE: keyword allows scoping to be enabled for a particular XSUB. If ++enabled, the XSUB will invoke ENTER and LEAVE automatically. ++ ++To support potentially complex type mappings, if a typemap entry used ++by an XSUB contains a comment like C then scoping will ++be automatically enabled for that XSUB. ++ ++To enable scoping: ++ ++ SCOPE: ENABLE ++ ++To disable scoping: ++ ++ SCOPE: DISABLE ++ ++=head2 The INPUT: Keyword ++ ++The XSUB's parameters are usually evaluated immediately after entering the ++XSUB. The INPUT: keyword can be used to force those parameters to be ++evaluated a little later. The INPUT: keyword can be used multiple times ++within an XSUB and can be used to list one or more input variables. This ++keyword is used with the PREINIT: keyword. ++ ++The following example shows how the input parameter C can be ++evaluated late, after a PREINIT. ++ ++ bool_t ++ rpcb_gettime(host,timep) ++ char *host ++ PREINIT: ++ time_t tt; ++ INPUT: ++ time_t timep ++ CODE: ++ RETVAL = rpcb_gettime( host, &tt ); ++ timep = tt; ++ OUTPUT: ++ timep ++ RETVAL ++ ++The next example shows each input parameter evaluated late. ++ ++ bool_t ++ rpcb_gettime(host,timep) ++ PREINIT: ++ time_t tt; ++ INPUT: ++ char *host ++ PREINIT: ++ char *h; ++ INPUT: ++ time_t timep ++ CODE: ++ h = host; ++ RETVAL = rpcb_gettime( h, &tt ); ++ timep = tt; ++ OUTPUT: ++ timep ++ RETVAL ++ ++Since INPUT sections allow declaration of C variables which do not appear ++in the parameter list of a subroutine, this may be shortened to: ++ ++ bool_t ++ rpcb_gettime(host,timep) ++ time_t tt; ++ char *host; ++ char *h = host; ++ time_t timep; ++ CODE: ++ RETVAL = rpcb_gettime( h, &tt ); ++ timep = tt; ++ OUTPUT: ++ timep ++ RETVAL ++ ++(We used our knowledge that input conversion for C is a "simple" one, ++thus C is initialized on the declaration line, and our assignment ++C is not performed too early. Otherwise one would need to have the ++assignment C in a CODE: or INIT: section.) ++ ++=head2 The IN/OUTLIST/IN_OUTLIST/OUT/IN_OUT Keywords ++ ++In the list of parameters for an XSUB, one can precede parameter names ++by the C/C/C/C/C keywords. ++C keyword is the default, the other keywords indicate how the Perl ++interface should differ from the C interface. ++ ++Parameters preceded by C/C/C/C ++keywords are considered to be used by the C subroutine I. C/C keywords indicate that the C subroutine ++does not inspect the memory pointed by this parameter, but will write ++through this pointer to provide additional return values. ++ ++Parameters preceded by C keyword do not appear in the usage ++signature of the generated Perl function. ++ ++Parameters preceded by C/C/C I appear as ++parameters to the Perl function. With the exception of ++C-parameters, these parameters are converted to the corresponding ++C type, then pointers to these data are given as arguments to the C ++function. It is expected that the C function will write through these ++pointers. ++ ++The return list of the generated Perl function consists of the C return value ++from the function (unless the XSUB is of C return type or ++C was used) followed by all the C ++and C parameters (in the order of appearance). On the ++return from the XSUB the C/C Perl parameter will be ++modified to have the values written by the C function. ++ ++For example, an XSUB ++ ++ void ++ day_month(OUTLIST day, IN unix_time, OUTLIST month) ++ int day ++ int unix_time ++ int month ++ ++should be used from Perl as ++ ++ my ($day, $month) = day_month(time); ++ ++The C signature of the corresponding function should be ++ ++ void day_month(int *day, int unix_time, int *month); ++ ++The C/C/C/C/C keywords can be ++mixed with ANSI-style declarations, as in ++ ++ void ++ day_month(OUTLIST int day, int unix_time, OUTLIST int month) ++ ++(here the optional C keyword is omitted). ++ ++The C parameters are identical with parameters introduced with ++L and put into the C section (see ++L). The C parameters are very similar, ++the only difference being that the value C function writes through the ++pointer would not modify the Perl parameter, but is put in the output ++list. ++ ++The C/C parameter differ from C/C ++parameters only by the initial value of the Perl parameter not ++being read (and not being given to the C function - which gets some ++garbage instead). For example, the same C function as above can be ++interfaced with as ++ ++ void day_month(OUT int day, int unix_time, OUT int month); ++ ++or ++ ++ void ++ day_month(day, unix_time, month) ++ int &day = NO_INIT ++ int unix_time ++ int &month = NO_INIT ++ OUTPUT: ++ day ++ month ++ ++However, the generated Perl function is called in very C-ish style: ++ ++ my ($day, $month); ++ day_month($day, time, $month); ++ ++=head2 The C Keyword ++ ++If one of the input arguments to the C function is the length of a string ++argument C, one can substitute the name of the length-argument by ++C in the XSUB declaration. This argument must be omitted when ++the generated Perl function is called. E.g., ++ ++ void ++ dump_chars(char *s, short l) ++ { ++ short n = 0; ++ while (n < l) { ++ printf("s[%d] = \"\\%#03o\"\n", n, (int)s[n]); ++ n++; ++ } ++ } ++ ++ MODULE = x PACKAGE = x ++ ++ void dump_chars(char *s, short length(s)) ++ ++should be called as C. ++ ++This directive is supported with ANSI-type function declarations only. ++ ++=head2 Variable-length Parameter Lists ++ ++XSUBs can have variable-length parameter lists by specifying an ellipsis ++C<(...)> in the parameter list. This use of the ellipsis is similar to that ++found in ANSI C. The programmer is able to determine the number of ++arguments passed to the XSUB by examining the C variable which the ++B compiler supplies for all XSUBs. By using this mechanism one can ++create an XSUB which accepts a list of parameters of unknown length. ++ ++The I parameter for the rpcb_gettime() XSUB can be ++optional so the ellipsis can be used to indicate that the ++XSUB will take a variable number of parameters. Perl should ++be able to call this XSUB with either of the following statements. ++ ++ $status = rpcb_gettime( $timep, $host ); ++ ++ $status = rpcb_gettime( $timep ); ++ ++The XS code, with ellipsis, follows. ++ ++ bool_t ++ rpcb_gettime(timep, ...) ++ time_t timep = NO_INIT ++ PREINIT: ++ char *host = "localhost"; ++ CODE: ++ if( items > 1 ) ++ host = (char *)SvPVbyte_nolen(ST(1)); ++ RETVAL = rpcb_gettime( host, &timep ); ++ OUTPUT: ++ timep ++ RETVAL ++ ++=head2 The C_ARGS: Keyword ++ ++The C_ARGS: keyword allows creating of XSUBS which have different ++calling sequence from Perl than from C, without a need to write ++CODE: or PPCODE: section. The contents of the C_ARGS: paragraph is ++put as the argument to the called C function without any change. ++ ++For example, suppose that a C function is declared as ++ ++ symbolic nth_derivative(int n, symbolic function, int flags); ++ ++and that the default flags are kept in a global C variable ++C. Suppose that you want to create an interface which ++is called as ++ ++ $second_deriv = $function->nth_derivative(2); ++ ++To do this, declare the XSUB as ++ ++ symbolic ++ nth_derivative(function, n) ++ symbolic function ++ int n ++ C_ARGS: ++ n, function, default_flags ++ ++=head2 The PPCODE: Keyword ++ ++The PPCODE: keyword is an alternate form of the CODE: keyword and is used ++to tell the B compiler that the programmer is supplying the code to ++control the argument stack for the XSUBs return values. Occasionally one ++will want an XSUB to return a list of values rather than a single value. ++In these cases one must use PPCODE: and then explicitly push the list of ++values on the stack. The PPCODE: and CODE: keywords should not be used ++together within the same XSUB. ++ ++The actual difference between PPCODE: and CODE: sections is in the ++initialization of C macro (which stands for the I Perl ++stack pointer), and in the handling of data on the stack when returning ++from an XSUB. In CODE: sections SP preserves the value which was on ++entry to the XSUB: SP is on the function pointer (which follows the ++last parameter). In PPCODE: sections SP is moved backward to the ++beginning of the parameter list, which allows C macros ++to place output values in the place Perl expects them to be when ++the XSUB returns back to Perl. ++ ++The generated trailer for a CODE: section ensures that the number of return ++values Perl will see is either 0 or 1 (depending on the Cness of the ++return value of the C function, and heuristics mentioned in ++L<"The RETVAL Variable">). The trailer generated for a PPCODE: section ++is based on the number of return values and on the number of times ++C was updated by C<[X]PUSH*()> macros. ++ ++Note that macros C, C and C work equally ++well in CODE: sections and PPCODE: sections. ++ ++The following XSUB will call the C rpcb_gettime() function ++and will return its two output values, timep and status, to ++Perl as a single list. ++ ++ void ++ rpcb_gettime(host) ++ char *host ++ PREINIT: ++ time_t timep; ++ bool_t status; ++ PPCODE: ++ status = rpcb_gettime( host, &timep ); ++ EXTEND(SP, 2); ++ PUSHs(sv_2mortal(newSViv(status))); ++ PUSHs(sv_2mortal(newSViv(timep))); ++ ++Notice that the programmer must supply the C code necessary ++to have the real rpcb_gettime() function called and to have ++the return values properly placed on the argument stack. ++ ++The C return type for this function tells the B compiler that ++the RETVAL variable is not needed or used and that it should not be created. ++In most scenarios the void return type should be used with the PPCODE: ++directive. ++ ++The EXTEND() macro is used to make room on the argument ++stack for 2 return values. The PPCODE: directive causes the ++B compiler to create a stack pointer available as C, and it ++is this pointer which is being used in the EXTEND() macro. ++The values are then pushed onto the stack with the PUSHs() ++macro. ++ ++Now the rpcb_gettime() function can be used from Perl with ++the following statement. ++ ++ ($status, $timep) = rpcb_gettime("localhost"); ++ ++When handling output parameters with a PPCODE section, be sure to handle ++'set' magic properly. See L for details about 'set' magic. ++ ++=head2 Returning Undef And Empty Lists ++ ++Occasionally the programmer will want to return simply ++C or an empty list if a function fails rather than a ++separate status value. The rpcb_gettime() function offers ++just this situation. If the function succeeds we would like ++to have it return the time and if it fails we would like to ++have undef returned. In the following Perl code the value ++of $timep will either be undef or it will be a valid time. ++ ++ $timep = rpcb_gettime( "localhost" ); ++ ++The following XSUB uses the C return type as a mnemonic only, ++and uses a CODE: block to indicate to the compiler ++that the programmer has supplied all the necessary code. The ++sv_newmortal() call will initialize the return value to undef, making that ++the default return value. ++ ++ SV * ++ rpcb_gettime(host) ++ char * host ++ PREINIT: ++ time_t timep; ++ bool_t x; ++ CODE: ++ ST(0) = sv_newmortal(); ++ if( rpcb_gettime( host, &timep ) ) ++ sv_setnv( ST(0), (double)timep); ++ ++The next example demonstrates how one would place an explicit undef in the ++return value, should the need arise. ++ ++ SV * ++ rpcb_gettime(host) ++ char * host ++ PREINIT: ++ time_t timep; ++ bool_t x; ++ CODE: ++ if( rpcb_gettime( host, &timep ) ){ ++ ST(0) = sv_newmortal(); ++ sv_setnv( ST(0), (double)timep); ++ } ++ else{ ++ ST(0) = &PL_sv_undef; ++ } ++ ++To return an empty list one must use a PPCODE: block and ++then not push return values on the stack. ++ ++ void ++ rpcb_gettime(host) ++ char *host ++ PREINIT: ++ time_t timep; ++ PPCODE: ++ if( rpcb_gettime( host, &timep ) ) ++ PUSHs(sv_2mortal(newSViv(timep))); ++ else{ ++ /* Nothing pushed on stack, so an empty ++ * list is implicitly returned. */ ++ } ++ ++Some people may be inclined to include an explicit C in the above ++XSUB, rather than letting control fall through to the end. In those ++situations C should be used, instead. This will ensure that ++the XSUB stack is properly adjusted. Consult L for other ++C macros. ++ ++Since C macros can be used with CODE blocks as well, one can ++rewrite this example as: ++ ++ int ++ rpcb_gettime(host) ++ char *host ++ PREINIT: ++ time_t timep; ++ CODE: ++ RETVAL = rpcb_gettime( host, &timep ); ++ if (RETVAL == 0) ++ XSRETURN_UNDEF; ++ OUTPUT: ++ RETVAL ++ ++In fact, one can put this check into a POSTCALL: section as well. Together ++with PREINIT: simplifications, this leads to: ++ ++ int ++ rpcb_gettime(host) ++ char *host ++ time_t timep; ++ POSTCALL: ++ if (RETVAL == 0) ++ XSRETURN_UNDEF; ++ ++=head2 The REQUIRE: Keyword ++ ++The REQUIRE: keyword is used to indicate the minimum version of the ++B compiler needed to compile the XS module. An XS module which ++contains the following statement will compile with only B version ++1.922 or greater: ++ ++ REQUIRE: 1.922 ++ ++=head2 The CLEANUP: Keyword ++ ++This keyword can be used when an XSUB requires special cleanup procedures ++before it terminates. When the CLEANUP: keyword is used it must follow ++any CODE:, or OUTPUT: blocks which are present in the XSUB. The code ++specified for the cleanup block will be added as the last statements in ++the XSUB. ++ ++=head2 The POSTCALL: Keyword ++ ++This keyword can be used when an XSUB requires special procedures ++executed after the C subroutine call is performed. When the POSTCALL: ++keyword is used it must precede OUTPUT: and CLEANUP: blocks which are ++present in the XSUB. ++ ++See examples in L<"The NO_OUTPUT Keyword"> and L<"Returning Undef And Empty Lists">. ++ ++The POSTCALL: block does not make a lot of sense when the C subroutine ++call is supplied by user by providing either CODE: or PPCODE: section. ++ ++=head2 The BOOT: Keyword ++ ++The BOOT: keyword is used to add code to the extension's bootstrap ++function. The bootstrap function is generated by the B compiler and ++normally holds the statements necessary to register any XSUBs with Perl. ++With the BOOT: keyword the programmer can tell the compiler to add extra ++statements to the bootstrap function. ++ ++This keyword may be used any time after the first MODULE keyword and should ++appear on a line by itself. The first blank line after the keyword will ++terminate the code block. ++ ++ BOOT: ++ # The following message will be printed when the ++ # bootstrap function executes. ++ printf("Hello from the bootstrap!\n"); ++ ++=head2 The VERSIONCHECK: Keyword ++ ++The VERSIONCHECK: keyword corresponds to B's C<-versioncheck> and ++C<-noversioncheck> options. This keyword overrides the command line ++options. Version checking is enabled by default. When version checking is ++enabled the XS module will attempt to verify that its version matches the ++version of the PM module. ++ ++To enable version checking: ++ ++ VERSIONCHECK: ENABLE ++ ++To disable version checking: ++ ++ VERSIONCHECK: DISABLE ++ ++Note that if the version of the PM module is an NV (a floating point ++number), it will be stringified with a possible loss of precision ++(currently chopping to nine decimal places) so that it may not match ++the version of the XS module anymore. Quoting the $VERSION declaration ++to make it a string is recommended if long version numbers are used. ++ ++=head2 The PROTOTYPES: Keyword ++ ++The PROTOTYPES: keyword corresponds to B's C<-prototypes> and ++C<-noprototypes> options. This keyword overrides the command line options. ++Prototypes are disabled by default. When prototypes are enabled, XSUBs will ++be given Perl prototypes. This keyword may be used multiple times in an XS ++module to enable and disable prototypes for different parts of the module. ++Note that B will nag you if you don't explicitly enable or disable ++prototypes, with: ++ ++ Please specify prototyping behavior for Foo.xs (see perlxs manual) ++ ++To enable prototypes: ++ ++ PROTOTYPES: ENABLE ++ ++To disable prototypes: ++ ++ PROTOTYPES: DISABLE ++ ++=head2 The PROTOTYPE: Keyword ++ ++This keyword is similar to the PROTOTYPES: keyword above but can be used to ++force B to use a specific prototype for the XSUB. This keyword ++overrides all other prototype options and keywords but affects only the ++current XSUB. Consult L for information about Perl ++prototypes. ++ ++ bool_t ++ rpcb_gettime(timep, ...) ++ time_t timep = NO_INIT ++ PROTOTYPE: $;$ ++ PREINIT: ++ char *host = "localhost"; ++ CODE: ++ if( items > 1 ) ++ host = (char *)SvPVbyte_nolen(ST(1)); ++ RETVAL = rpcb_gettime( host, &timep ); ++ OUTPUT: ++ timep ++ RETVAL ++ ++If the prototypes are enabled, you can disable it locally for a given ++XSUB as in the following example: ++ ++ void ++ rpcb_gettime_noproto() ++ PROTOTYPE: DISABLE ++ ... ++ ++=head2 The ALIAS: Keyword ++ ++The ALIAS: keyword allows an XSUB to have two or more unique Perl names ++and to know which of those names was used when it was invoked. The Perl ++names may be fully-qualified with package names. Each alias is given an ++index. The compiler will setup a variable called C which contain the ++index of the alias which was used. When the XSUB is called with its ++declared name C will be 0. ++ ++The following example will create aliases C and ++C for this function. ++ ++ bool_t ++ rpcb_gettime(host,timep) ++ char *host ++ time_t &timep ++ ALIAS: ++ FOO::gettime = 1 ++ BAR::getit = 2 ++ INIT: ++ printf("# ix = %d\n", ix ); ++ OUTPUT: ++ timep ++ ++A warning will be produced when you create more than one alias to the same ++value. This may be worked around in a backwards compatible way by creating ++multiple defines which resolve to the same value, or with a modern version ++of ExtUtils::ParseXS you can use a symbolic alias, which are denoted with ++a C<< => >> instead of a C<< = >>. For instance you could change the above ++so that the alias section looked like this: ++ ++ ALIAS: ++ FOO::gettime = 1 ++ BAR::getit = 2 ++ BAZ::gettime => FOO::gettime ++ ++this would have the same effect as this: ++ ++ ALIAS: ++ FOO::gettime = 1 ++ BAR::getit = 2 ++ BAZ::gettime = 1 ++ ++except that the latter will produce warnings during the build process. A ++mechanism that would work in a backwards compatible way with older ++versions of our tool chain would be to do this: ++ ++ #define FOO_GETTIME 1 ++ #define BAR_GETIT 2 ++ #define BAZ_GETTIME 1 ++ ++ bool_t ++ rpcb_gettime(host,timep) ++ char *host ++ time_t &timep ++ ALIAS: ++ FOO::gettime = FOO_GETTIME ++ BAR::getit = BAR_GETIT ++ BAZ::gettime = BAZ_GETTIME ++ INIT: ++ printf("# ix = %d\n", ix ); ++ OUTPUT: ++ timep ++ ++=head2 The OVERLOAD: Keyword ++ ++Instead of writing an overloaded interface using pure Perl, you ++can also use the OVERLOAD keyword to define additional Perl names ++for your functions (like the ALIAS: keyword above). However, the ++overloaded functions must be defined in such a way as to accept the number ++of parameters supplied by perl's overload system. For most overload ++methods, it will be three parameters; for the C function it will ++be four. However, the bitwise operators C<&>, C<|>, C<^>, and C<~> may be ++called with three I five arguments (see L). ++ ++If any ++function has the OVERLOAD: keyword, several additional lines ++will be defined in the c file generated by xsubpp in order to ++register with the overload magic. ++ ++Since blessed objects are actually stored as RV's, it is useful ++to use the typemap features to preprocess parameters and extract ++the actual SV stored within the blessed RV. See the sample for ++T_PTROBJ_SPECIAL below. ++ ++To use the OVERLOAD: keyword, create an XS function which takes ++three input parameters (or use the C-style '...' definition) like ++this: ++ ++ SV * ++ cmp (lobj, robj, swap) ++ My_Module_obj lobj ++ My_Module_obj robj ++ IV swap ++ OVERLOAD: cmp <=> ++ { /* function defined here */} ++ ++In this case, the function will overload both of the three way ++comparison operators. For all overload operations using non-alpha ++characters, you must type the parameter without quoting, separating ++multiple overloads with whitespace. Note that "" (the stringify ++overload) should be entered as \"\" (i.e. escaped). ++ ++Since, as mentioned above, bitwise operators may take extra arguments, you ++may want to use something like C<(lobj, robj, swap, ...)> (with ++literal C<...>) as your parameter list. ++ ++=head2 The FALLBACK: Keyword ++ ++In addition to the OVERLOAD keyword, if you need to control how ++Perl autogenerates missing overloaded operators, you can set the ++FALLBACK keyword in the module header section, like this: ++ ++ MODULE = RPC PACKAGE = RPC ++ ++ FALLBACK: TRUE ++ ... ++ ++where FALLBACK can take any of the three values TRUE, FALSE, or ++UNDEF. If you do not set any FALLBACK value when using OVERLOAD, ++it defaults to UNDEF. FALLBACK is not used except when one or ++more functions using OVERLOAD have been defined. Please see ++L for more details. ++ ++=head2 The INTERFACE: Keyword ++ ++This keyword declares the current XSUB as a keeper of the given ++calling signature. If some text follows this keyword, it is ++considered as a list of functions which have this signature, and ++should be attached to the current XSUB. ++ ++For example, if you have 4 C functions multiply(), divide(), add(), ++subtract() all having the signature: ++ ++ symbolic f(symbolic, symbolic); ++ ++you can make them all to use the same XSUB using this: ++ ++ symbolic ++ interface_s_ss(arg1, arg2) ++ symbolic arg1 ++ symbolic arg2 ++ INTERFACE: ++ multiply divide ++ add subtract ++ ++(This is the complete XSUB code for 4 Perl functions!) Four generated ++Perl function share names with corresponding C functions. ++ ++The advantage of this approach comparing to ALIAS: keyword is that there ++is no need to code a switch statement, each Perl function (which shares ++the same XSUB) knows which C function it should call. Additionally, one ++can attach an extra function remainder() at runtime by using ++ ++ CV *mycv = newXSproto("Symbolic::remainder", ++ XS_Symbolic_interface_s_ss, __FILE__, "$$"); ++ XSINTERFACE_FUNC_SET(mycv, remainder); ++ ++say, from another XSUB. (This example supposes that there was no ++INTERFACE_MACRO: section, otherwise one needs to use something else instead of ++C, see the next section.) ++ ++=head2 The INTERFACE_MACRO: Keyword ++ ++This keyword allows one to define an INTERFACE using a different way ++to extract a function pointer from an XSUB. The text which follows ++this keyword should give the name of macros which would extract/set a ++function pointer. The extractor macro is given return type, C, ++and C for this C. The setter macro is given cv, ++and the function pointer. ++ ++The default value is C and C. ++An INTERFACE keyword with an empty list of functions can be omitted if ++INTERFACE_MACRO keyword is used. ++ ++Suppose that in the previous example functions pointers for ++multiply(), divide(), add(), subtract() are kept in a global C array ++C with offsets being C, C, C, ++C. Then one can use ++ ++ #define XSINTERFACE_FUNC_BYOFFSET(ret,cv,f) \ ++ ((XSINTERFACE_CVT_ANON(ret))fp[CvXSUBANY(cv).any_i32]) ++ #define XSINTERFACE_FUNC_BYOFFSET_set(cv,f) \ ++ CvXSUBANY(cv).any_i32 = CAT2( f, _off ) ++ ++in C section, ++ ++ symbolic ++ interface_s_ss(arg1, arg2) ++ symbolic arg1 ++ symbolic arg2 ++ INTERFACE_MACRO: ++ XSINTERFACE_FUNC_BYOFFSET ++ XSINTERFACE_FUNC_BYOFFSET_set ++ INTERFACE: ++ multiply divide ++ add subtract ++ ++in XSUB section. ++ ++=head2 The INCLUDE: Keyword ++ ++This keyword can be used to pull other files into the XS module. The other ++files may have XS code. INCLUDE: can also be used to run a command to ++generate the XS code to be pulled into the module. ++ ++The file F contains our C function: ++ ++ bool_t ++ rpcb_gettime(host,timep) ++ char *host ++ time_t &timep ++ OUTPUT: ++ timep ++ ++The XS module can use INCLUDE: to pull that file into it. ++ ++ INCLUDE: Rpcb1.xsh ++ ++If the parameters to the INCLUDE: keyword are followed by a pipe (C<|>) then ++the compiler will interpret the parameters as a command. This feature is ++mildly deprecated in favour of the C directive, as documented ++below. ++ ++ INCLUDE: cat Rpcb1.xsh | ++ ++Do not use this to run perl: C will run the perl that ++happens to be the first in your path and not necessarily the same perl that is ++used to run C. See L<"The INCLUDE_COMMAND: Keyword">. ++ ++=head2 The INCLUDE_COMMAND: Keyword ++ ++Runs the supplied command and includes its output into the current XS ++document. C assigns special meaning to the C<$^X> token ++in that it runs the same perl interpreter that is running C: ++ ++ INCLUDE_COMMAND: cat Rpcb1.xsh ++ ++ INCLUDE_COMMAND: $^X -e ... ++ ++=head2 The CASE: Keyword ++ ++The CASE: keyword allows an XSUB to have multiple distinct parts with each ++part acting as a virtual XSUB. CASE: is greedy and if it is used then all ++other XS keywords must be contained within a CASE:. This means nothing may ++precede the first CASE: in the XSUB and anything following the last CASE: is ++included in that case. ++ ++A CASE: might switch via a parameter of the XSUB, via the C ALIAS: ++variable (see L<"The ALIAS: Keyword">), or maybe via the C variable ++(see L<"Variable-length Parameter Lists">). The last CASE: becomes the ++B case if it is not associated with a conditional. The following ++example shows CASE switched via C with a function C ++having an alias C. When the function is called as ++C its parameters are the usual C<(char *host, time_t *timep)>, ++but when the function is called as C its parameters are ++reversed, C<(time_t *timep, char *host)>. ++ ++ long ++ rpcb_gettime(a,b) ++ CASE: ix == 1 ++ ALIAS: ++ x_gettime = 1 ++ INPUT: ++ # 'a' is timep, 'b' is host ++ char *b ++ time_t a = NO_INIT ++ CODE: ++ RETVAL = rpcb_gettime( b, &a ); ++ OUTPUT: ++ a ++ RETVAL ++ CASE: ++ # 'a' is host, 'b' is timep ++ char *a ++ time_t &b = NO_INIT ++ OUTPUT: ++ b ++ RETVAL ++ ++That function can be called with either of the following statements. Note ++the different argument lists. ++ ++ $status = rpcb_gettime( $host, $timep ); ++ ++ $status = x_gettime( $timep, $host ); ++ ++=head2 The EXPORT_XSUB_SYMBOLS: Keyword ++ ++The EXPORT_XSUB_SYMBOLS: keyword is likely something you will never need. ++In perl versions earlier than 5.16.0, this keyword does nothing. Starting ++with 5.16, XSUB symbols are no longer exported by default. That is, they ++are C functions. If you include ++ ++ EXPORT_XSUB_SYMBOLS: ENABLE ++ ++in your XS code, the XSUBs following this line will not be declared C. ++You can later disable this with ++ ++ EXPORT_XSUB_SYMBOLS: DISABLE ++ ++which, again, is the default that you should probably never change. ++You cannot use this keyword on versions of perl before 5.16 to make ++XSUBs C. ++ ++=head2 The & Unary Operator ++ ++The C<&> unary operator in the INPUT: section is used to tell B ++that it should convert a Perl value to/from C using the C type to the left ++of C<&>, but provide a pointer to this value when the C function is called. ++ ++This is useful to avoid a CODE: block for a C function which takes a parameter ++by reference. Typically, the parameter should be not a pointer type (an ++C or C but not an C or C). ++ ++The following XSUB will generate incorrect C code. The B compiler will ++turn this into code which calls C with parameters C<(char ++*host, time_t timep)>, but the real C wants the C ++parameter to be of type C rather than C. ++ ++ bool_t ++ rpcb_gettime(host,timep) ++ char *host ++ time_t timep ++ OUTPUT: ++ timep ++ ++That problem is corrected by using the C<&> operator. The B compiler ++will now turn this into code which calls C correctly with ++parameters C<(char *host, time_t *timep)>. It does this by carrying the ++C<&> through, so the function call looks like C. ++ ++ bool_t ++ rpcb_gettime(host,timep) ++ char *host ++ time_t &timep ++ OUTPUT: ++ timep ++ ++=head2 Inserting POD, Comments and C Preprocessor Directives ++ ++C preprocessor directives are allowed within BOOT:, PREINIT: INIT:, CODE:, ++PPCODE:, POSTCALL:, and CLEANUP: blocks, as well as outside the functions. ++Comments are allowed anywhere after the MODULE keyword. The compiler will ++pass the preprocessor directives through untouched and will remove the ++commented lines. POD documentation is allowed at any point, both in the ++C and XS language sections. POD must be terminated with a C<=cut> command; ++C will exit with an error if it does not. It is very unlikely that ++human generated C code will be mistaken for POD, as most indenting styles ++result in whitespace in front of any line starting with C<=>. Machine ++generated XS files may fall into this trap unless care is taken to ++ensure that a space breaks the sequence "\n=". ++ ++Comments can be added to XSUBs by placing a C<#> as the first ++non-whitespace of a line. Care should be taken to avoid making the ++comment look like a C preprocessor directive, lest it be interpreted as ++such. The simplest way to prevent this is to put whitespace in front of ++the C<#>. ++ ++If you use preprocessor directives to choose one of two ++versions of a function, use ++ ++ #if ... version1 ++ #else /* ... version2 */ ++ #endif ++ ++and not ++ ++ #if ... version1 ++ #endif ++ #if ... version2 ++ #endif ++ ++because otherwise B will believe that you made a duplicate ++definition of the function. Also, put a blank line before the ++#else/#endif so it will not be seen as part of the function body. ++ ++=head2 Using XS With C++ ++ ++If an XSUB name contains C<::>, it is considered to be a C++ method. ++The generated Perl function will assume that ++its first argument is an object pointer. The object pointer ++will be stored in a variable called THIS. The object should ++have been created by C++ with the new() function and should ++be blessed by Perl with the sv_setref_pv() macro. The ++blessing of the object by Perl can be handled by a typemap. An example ++typemap is shown at the end of this section. ++ ++If the return type of the XSUB includes C, the method is considered ++to be a static method. It will call the C++ ++function using the class::method() syntax. If the method is not static ++the function will be called using the THIS-Emethod() syntax. ++ ++The next examples will use the following C++ class. ++ ++ class color { ++ public: ++ color(); ++ ~color(); ++ int blue(); ++ void set_blue( int ); ++ ++ private: ++ int c_blue; ++ }; ++ ++The XSUBs for the blue() and set_blue() methods are defined with the class ++name but the parameter for the object (THIS, or "self") is implicit and is ++not listed. ++ ++ int ++ color::blue() ++ ++ void ++ color::set_blue( val ) ++ int val ++ ++Both Perl functions will expect an object as the first parameter. In the ++generated C++ code the object is called C, and the method call will ++be performed on this object. So in the C++ code the blue() and set_blue() ++methods will be called as this: ++ ++ RETVAL = THIS->blue(); ++ ++ THIS->set_blue( val ); ++ ++You could also write a single get/set method using an optional argument: ++ ++ int ++ color::blue( val = NO_INIT ) ++ int val ++ PROTOTYPE $;$ ++ CODE: ++ if (items > 1) ++ THIS->set_blue( val ); ++ RETVAL = THIS->blue(); ++ OUTPUT: ++ RETVAL ++ ++If the function's name is B then the C++ C function will be ++called and C will be given as its parameter. The generated C++ code for ++ ++ void ++ color::DESTROY() ++ ++will look like this: ++ ++ color *THIS = ...; // Initialized as in typemap ++ ++ delete THIS; ++ ++If the function's name is B then the C++ C function will be called ++to create a dynamic C++ object. The XSUB will expect the class name, which ++will be kept in a variable called C, to be given as the first ++argument. ++ ++ color * ++ color::new() ++ ++The generated C++ code will call C. ++ ++ RETVAL = new color(); ++ ++The following is an example of a typemap that could be used for this C++ ++example. ++ ++ TYPEMAP ++ color * O_OBJECT ++ ++ OUTPUT ++ # The Perl object is blessed into 'CLASS', which should be a ++ # char* having the name of the package for the blessing. ++ O_OBJECT ++ sv_setref_pv( $arg, CLASS, (void*)$var ); ++ ++ INPUT ++ O_OBJECT ++ if( sv_isobject($arg) && (SvTYPE(SvRV($arg)) == SVt_PVMG) ) ++ $var = ($type)SvIV((SV*)SvRV( $arg )); ++ else{ ++ warn(\"${Package}::$func_name() -- \" ++ \"$var is not a blessed SV reference\"); ++ XSRETURN_UNDEF; ++ } ++ ++=head2 Interface Strategy ++ ++When designing an interface between Perl and a C library a straight ++translation from C to XS (such as created by C) is often sufficient. ++However, sometimes the interface will look ++very C-like and occasionally nonintuitive, especially when the C function ++modifies one of its parameters, or returns failure inband (as in "negative ++return values mean failure"). In cases where the programmer wishes to ++create a more Perl-like interface the following strategy may help to ++identify the more critical parts of the interface. ++ ++Identify the C functions with input/output or output parameters. The XSUBs for ++these functions may be able to return lists to Perl. ++ ++Identify the C functions which use some inband info as an indication ++of failure. They may be ++candidates to return undef or an empty list in case of failure. If the ++failure may be detected without a call to the C function, you may want to use ++an INIT: section to report the failure. For failures detectable after the C ++function returns one may want to use a POSTCALL: section to process the ++failure. In more complicated cases use CODE: or PPCODE: sections. ++ ++If many functions use the same failure indication based on the return value, ++you may want to create a special typedef to handle this situation. Put ++ ++ typedef int negative_is_failure; ++ ++near the beginning of XS file, and create an OUTPUT typemap entry ++for C which converts negative values to C, or ++maybe croak()s. After this the return value of type C ++will create more Perl-like interface. ++ ++Identify which values are used by only the C and XSUB functions ++themselves, say, when a parameter to a function should be a contents of a ++global variable. If Perl does not need to access the contents of the value ++then it may not be necessary to provide a translation for that value ++from C to Perl. ++ ++Identify the pointers in the C function parameter lists and return ++values. Some pointers may be used to implement input/output or ++output parameters, they can be handled in XS with the C<&> unary operator, ++and, possibly, using the NO_INIT keyword. ++Some others will require handling of types like C, and one needs ++to decide what a useful Perl translation will do in such a case. When ++the semantic is clear, it is advisable to put the translation into a typemap ++file. ++ ++Identify the structures used by the C functions. In many ++cases it may be helpful to use the T_PTROBJ typemap for ++these structures so they can be manipulated by Perl as ++blessed objects. (This is handled automatically by C.) ++ ++If the same C type is used in several different contexts which require ++different translations, C several new types mapped to this C type, ++and create separate F entries for these new types. Use these ++types in declarations of return type and parameters to XSUBs. ++ ++=head2 Perl Objects And C Structures ++ ++When dealing with C structures one should select either ++B or B for the XS type. Both types are ++designed to handle pointers to complex objects. The ++T_PTRREF type will allow the Perl object to be unblessed ++while the T_PTROBJ type requires that the object be blessed. ++By using T_PTROBJ one can achieve a form of type-checking ++because the XSUB will attempt to verify that the Perl object ++is of the expected type. ++ ++The following XS code shows the getnetconfigent() function which is used ++with ONC+ TIRPC. The getnetconfigent() function will return a pointer to a ++C structure and has the C prototype shown below. The example will ++demonstrate how the C pointer will become a Perl reference. Perl will ++consider this reference to be a pointer to a blessed object and will ++attempt to call a destructor for the object. A destructor will be ++provided in the XS source to free the memory used by getnetconfigent(). ++Destructors in XS can be created by specifying an XSUB function whose name ++ends with the word B. XS destructors can be used to free memory ++which may have been malloc'd by another XSUB. ++ ++ struct netconfig *getnetconfigent(const char *netid); ++ ++A C will be created for C. The Perl ++object will be blessed in a class matching the name of the C ++type, with the tag C appended, and the name should not ++have embedded spaces if it will be a Perl package name. The ++destructor will be placed in a class corresponding to the ++class of the object and the PREFIX keyword will be used to ++trim the name to the word DESTROY as Perl will expect. ++ ++ typedef struct netconfig Netconfig; ++ ++ MODULE = RPC PACKAGE = RPC ++ ++ Netconfig * ++ getnetconfigent(netid) ++ char *netid ++ ++ MODULE = RPC PACKAGE = NetconfigPtr PREFIX = rpcb_ ++ ++ void ++ rpcb_DESTROY(netconf) ++ Netconfig *netconf ++ CODE: ++ printf("Now in NetconfigPtr::DESTROY\n"); ++ free( netconf ); ++ ++This example requires the following typemap entry. Consult ++L for more information about adding new typemaps ++for an extension. ++ ++ TYPEMAP ++ Netconfig * T_PTROBJ ++ ++This example will be used with the following Perl statements. ++ ++ use RPC; ++ $netconf = getnetconfigent("udp"); ++ ++When Perl destroys the object referenced by $netconf it will send the ++object to the supplied XSUB DESTROY function. Perl cannot determine, and ++does not care, that this object is a C struct and not a Perl object. In ++this sense, there is no difference between the object created by the ++getnetconfigent() XSUB and an object created by a normal Perl subroutine. ++ ++=head2 Safely Storing Static Data in XS ++ ++Starting with Perl 5.8, a macro framework has been defined to allow ++static data to be safely stored in XS modules that will be accessed from ++a multi-threaded Perl. ++ ++Although primarily designed for use with multi-threaded Perl, the macros ++have been designed so that they will work with non-threaded Perl as well. ++ ++It is therefore strongly recommended that these macros be used by all ++XS modules that make use of static data. ++ ++The easiest way to get a template set of macros to use is by specifying ++the C<-g> (C<--global>) option with h2xs (see L). ++ ++Below is an example module that makes use of the macros. ++ ++ #define PERL_NO_GET_CONTEXT ++ #include "EXTERN.h" ++ #include "perl.h" ++ #include "XSUB.h" ++ ++ /* Global Data */ ++ ++ #define MY_CXT_KEY "BlindMice::_guts" XS_VERSION ++ ++ typedef struct { ++ int count; ++ char name[3][100]; ++ } my_cxt_t; ++ ++ START_MY_CXT ++ ++ MODULE = BlindMice PACKAGE = BlindMice ++ ++ BOOT: ++ { ++ MY_CXT_INIT; ++ MY_CXT.count = 0; ++ strcpy(MY_CXT.name[0], "None"); ++ strcpy(MY_CXT.name[1], "None"); ++ strcpy(MY_CXT.name[2], "None"); ++ } ++ ++ int ++ newMouse(char * name) ++ PREINIT: ++ dMY_CXT; ++ CODE: ++ if (MY_CXT.count >= 3) { ++ warn("Already have 3 blind mice"); ++ RETVAL = 0; ++ } ++ else { ++ RETVAL = ++ MY_CXT.count; ++ strcpy(MY_CXT.name[MY_CXT.count - 1], name); ++ } ++ OUTPUT: ++ RETVAL ++ ++ char * ++ get_mouse_name(index) ++ int index ++ PREINIT: ++ dMY_CXT; ++ CODE: ++ if (index > MY_CXT.count) ++ croak("There are only 3 blind mice."); ++ else ++ RETVAL = MY_CXT.name[index - 1]; ++ OUTPUT: ++ RETVAL ++ ++ void ++ CLONE(...) ++ CODE: ++ MY_CXT_CLONE; ++ ++=head3 MY_CXT REFERENCE ++ ++=over 5 ++ ++=item MY_CXT_KEY ++ ++This macro is used to define a unique key to refer to the static data ++for an XS module. The suggested naming scheme, as used by h2xs, is to ++use a string that consists of the module name, the string "::_guts" ++and the module version number. ++ ++ #define MY_CXT_KEY "MyModule::_guts" XS_VERSION ++ ++=item typedef my_cxt_t ++ ++This struct typedef I always be called C. The other ++C macros assume the existence of the C typedef name. ++ ++Declare a typedef named C that is a structure that contains ++all the data that needs to be interpreter-local. ++ ++ typedef struct { ++ int some_value; ++ } my_cxt_t; ++ ++=item START_MY_CXT ++ ++Always place the START_MY_CXT macro directly after the declaration ++of C. ++ ++=for apidoc Amnh||START_MY_CXT ++ ++=item MY_CXT_INIT ++ ++The MY_CXT_INIT macro initializes storage for the C struct. ++ ++It I be called exactly once, typically in a BOOT: section. If you ++are maintaining multiple interpreters, it should be called once in each ++interpreter instance, except for interpreters cloned from existing ones. ++(But see L below.) ++ ++=for apidoc Amnh||MY_CXT_INIT ++ ++=item dMY_CXT ++ ++Use the dMY_CXT macro (a declaration) in all the functions that access ++MY_CXT. ++ ++=for apidoc Amnh||dMY_CXT ++ ++=item MY_CXT ++ ++Use the MY_CXT macro to access members of the C struct. For ++example, if C is ++ ++ typedef struct { ++ int index; ++ } my_cxt_t; ++ ++then use this to access the C member ++ ++ dMY_CXT; ++ MY_CXT.index = 2; ++ ++=item aMY_CXT/pMY_CXT ++ ++C may be quite expensive to calculate, and to avoid the overhead ++of invoking it in each function it is possible to pass the declaration ++onto other functions using the C/C macros, eg ++ ++=for apidoc Amnh||_aMY_CXT ++=for apidoc Amnh||aMY_CXT ++=for apidoc Amnh||aMY_CXT_ ++=for apidoc Amnh||_pMY_CXT ++=for apidoc Amnh||pMY_CXT ++=for apidoc Amnh||pMY_CXT_ ++=for apidoc Amnh||MY_CXT ++ ++ void sub1() { ++ dMY_CXT; ++ MY_CXT.index = 1; ++ sub2(aMY_CXT); ++ } ++ ++ void sub2(pMY_CXT) { ++ MY_CXT.index = 2; ++ } ++ ++Analogously to C, there are equivalent forms for when the macro is the ++first or last in multiple arguments, where an underscore represents a ++comma, i.e. C<_aMY_CXT>, C, C<_pMY_CXT> and C. ++ ++=item MY_CXT_CLONE ++ ++By default, when a new interpreter is created as a copy of an existing one ++(eg via C<< threads->create() >>), both interpreters share the same physical ++my_cxt_t structure. Calling C (typically via the package's ++C function), causes a byte-for-byte copy of the structure to be ++taken, and any future dMY_CXT will cause the copy to be accessed instead. ++ ++=for apidoc Amnh||MY_CXT_CLONE ++ ++=item MY_CXT_INIT_INTERP(my_perl) ++ ++=item dMY_CXT_INTERP(my_perl) ++ ++These are versions of the macros which take an explicit interpreter as an ++argument. ++ ++=back ++ ++Note that these macros will only work together within the I source ++file; that is, a dMY_CTX in one source file will access a different structure ++than a dMY_CTX in another source file. ++ ++=head2 Thread-aware system interfaces ++ ++Starting from Perl 5.8, in C/C++ level Perl knows how to wrap ++system/library interfaces that have thread-aware versions ++(e.g. getpwent_r()) into frontend macros (e.g. getpwent()) that ++correctly handle the multithreaded interaction with the Perl ++interpreter. This will happen transparently, the only thing ++you need to do is to instantiate a Perl interpreter. ++ ++This wrapping happens always when compiling Perl core source ++(PERL_CORE is defined) or the Perl core extensions (PERL_EXT is ++defined). When compiling XS code outside of the Perl core, the wrapping ++does not take place before Perl 5.28. Starting in that release you can ++ ++ #define PERL_REENTRANT ++ ++in your code to enable the wrapping. It is advisable to do so if you ++are using such functions, as intermixing the C<_r>-forms (as Perl compiled ++for multithreaded operation will do) and the C<_r>-less forms is neither ++well-defined (inconsistent results, data corruption, or even crashes ++become more likely), nor is it very portable. Unfortunately, not all ++systems have all the C<_r> forms, but using this C<#define> gives you ++whatever protection that Perl is aware is available on each system. ++ ++=head1 EXAMPLES ++ ++File C: Interface to some ONC+ RPC bind library functions. ++ ++ #define PERL_NO_GET_CONTEXT ++ #include "EXTERN.h" ++ #include "perl.h" ++ #include "XSUB.h" ++ ++ /* Note: On glibc 2.13 and earlier, this needs be */ ++ #include ++ ++ typedef struct netconfig Netconfig; ++ ++ MODULE = RPC PACKAGE = RPC ++ ++ SV * ++ rpcb_gettime(host="localhost") ++ char *host ++ PREINIT: ++ time_t timep; ++ CODE: ++ ST(0) = sv_newmortal(); ++ if( rpcb_gettime( host, &timep ) ) ++ sv_setnv( ST(0), (double)timep ); ++ ++ Netconfig * ++ getnetconfigent(netid="udp") ++ char *netid ++ ++ MODULE = RPC PACKAGE = NetconfigPtr PREFIX = rpcb_ ++ ++ void ++ rpcb_DESTROY(netconf) ++ Netconfig *netconf ++ CODE: ++ printf("NetconfigPtr::DESTROY\n"); ++ free( netconf ); ++ ++File C: Custom typemap for RPC.xs. (cf. L) ++ ++ TYPEMAP ++ Netconfig * T_PTROBJ ++ ++File C: Perl module for the RPC extension. ++ ++ package RPC; ++ ++ require Exporter; ++ require DynaLoader; ++ @ISA = qw(Exporter DynaLoader); ++ @EXPORT = qw(rpcb_gettime getnetconfigent); ++ ++ bootstrap RPC; ++ 1; ++ ++File C: Perl test program for the RPC extension. ++ ++ use RPC; ++ ++ $netconf = getnetconfigent(); ++ $a = rpcb_gettime(); ++ print "time = $a\n"; ++ print "netconf = $netconf\n"; ++ ++ $netconf = getnetconfigent("tcp"); ++ $a = rpcb_gettime("poplar"); ++ print "time = $a\n"; ++ print "netconf = $netconf\n"; ++ ++In Makefile.PL add -ltirpc and -I/usr/include/tirpc. ++ ++=head1 CAVEATS ++ ++XS code has full access to system calls including C library functions. ++It thus has the capability of interfering with things that the Perl core ++or other modules have set up, such as signal handlers or file handles. ++It could mess with the memory, or any number of harmful things. Don't. ++ ++Some modules have an event loop, waiting for user-input. It is highly ++unlikely that two such modules would work adequately together in a ++single Perl application. ++ ++In general, the perl interpreter views itself as the center of the ++universe as far as the Perl program goes. XS code is viewed as a ++help-mate, to accomplish things that perl doesn't do, or doesn't do fast ++enough, but always subservient to perl. The closer XS code adheres to ++this model, the less likely conflicts will occur. ++ ++One area where there has been conflict is in regards to C locales. (See ++L.) perl, with one exception and unless told otherwise, ++sets up the underlying locale the program is running in to the locale ++passed ++into it from the environment. This is an important difference from a ++generic C language program, where the underlying locale is the "C" ++locale unless the program changes it. As of v5.20, this underlying ++locale is completely hidden from pure Perl code outside the lexical ++scope of C> except for a couple of function calls in the ++POSIX module which of necessity use it. But the underlying locale, with ++that ++one exception is exposed to XS code, affecting all C library routines ++whose behavior is locale-dependent. Your XS code better not assume that ++the underlying locale is "C". The exception is the ++L|perllocale/Category LC_NUMERIC: Numeric Formatting> ++locale category, and the reason it is an exception is that experience ++has shown that it can be problematic for XS code, whereas we have not ++had reports of problems with the ++L. And the reason ++for this one category being problematic is that the character used as a ++decimal point can vary. Many European languages use a comma, whereas ++English, and hence Perl are expecting a dot (U+002E: FULL STOP). Many ++modules can handle only the radix character being a dot, and so perl ++attempts to make it so. Up through Perl v5.20, the attempt was merely ++to set C upon startup to the C<"C"> locale. Any ++L otherwise would change ++it; this caused some failures. Therefore, starting in v5.22, perl tries ++to keep C always set to C<"C"> for XS code. ++ ++To summarize, here's what to expect and how to handle locales in XS code: ++ ++=over ++ ++=item Non-locale-aware XS code ++ ++Keep in mind that even if you think your code is not locale-aware, it ++may call a library function that is. Hopefully the man page for such ++a function will indicate that dependency, but the documentation is ++imperfect. ++ ++The current locale is exposed to XS code except possibly C ++(explained in the next paragraph). ++There have not been reports of problems with the other categories. ++Perl initializes things on start-up so that the current locale is the ++one which is indicated by the user's environment in effect at that time. ++See L. ++ ++However, up through v5.20, Perl initialized things on start-up so that ++C was set to the "C" locale. But if any code anywhere ++changed it, it would stay changed. This means that your module can't ++count on C being something in particular, and you can't ++expect floating point numbers (including version strings) to have dots ++in them. If you don't allow for a non-dot, your code could break if ++anyone anywhere changed the locale. For this reason, v5.22 changed ++the behavior so that Perl tries to keep C in the "C" locale ++except around the operations internally where it should be something ++else. Misbehaving XS code will always be able to change the locale ++anyway, but the most common instance of this is checked for and ++handled. ++ ++=item Locale-aware XS code ++ ++If the locale from the user's environment is desired, there should be no ++need for XS code to set the locale except for C, as perl has ++already set the others up. XS code should avoid changing the locale, as ++it can adversely affect other, unrelated, code and may not be ++thread-safe. To minimize problems, the macros ++L, ++L, and ++L should be used to affect any needed ++change. ++ ++But, starting with Perl v5.28, locales are thread-safe on platforms that ++support this functionality. Windows has this starting with Visual ++Studio 2005. Many other modern platforms support the thread-safe POSIX ++2008 functions. The C C<#define> C will be ++defined iff this build is using these. From Perl-space, the read-only ++variable C<${SAFE_LOCALES}> is 1 if either the build is not threaded, or ++if C is defined; otherwise it is 0. ++ ++The way this works under-the-hood is that every thread has a choice of ++using a locale specific to it (this is the Windows and POSIX 2008 ++functionality), or the global locale that is accessible to all threads ++(this is the functionality that has always been there). The ++implementations for Windows and POSIX are completely different. On ++Windows, the runtime can be set up so that the standard ++L> function either only knows about the global locale or ++the locale for this thread. On POSIX, C always deals with ++the global locale, and other functions have been created to handle ++per-thread locales. Perl makes this transparent to perl-space code. It ++continues to use C, and the interpreter translates ++that into the per-thread functions. ++ ++All other locale-sensitive functions automatically use the per-thread ++locale, if that is turned on, and failing that, the global locale. Thus ++calls to C are ineffective on POSIX systems for the current ++thread if that thread is using a per-thread locale. If perl is compiled ++for single-thread operation, it does not use the per-thread functions, ++so C does work as expected. ++ ++If you have loaded the L> module you can use the methods given ++in L to call L|POSIX/setlocale> to safely ++change or query the locale (on systems where it is safe to do so), or ++you can use the new 5.28 function L instead, ++which is a drop-in replacement for the system L>, and ++handles single-threaded and multi-threaded applications transparently. ++ ++There are some locale-related library calls that still aren't ++thread-safe because they return data in a buffer global to all threads. ++In the past, these didn't matter as locales weren't thread-safe at all. ++But now you have to be aware of them in case your module is called in a ++multi-threaded application. The known ones are ++ ++ asctime() ++ ctime() ++ gcvt() [POSIX.1-2001 only (function removed in POSIX.1-2008)] ++ getdate() ++ wcrtomb() if its final argument is NULL ++ wcsrtombs() if its final argument is NULL ++ wcstombs() ++ wctomb() ++ ++Some of these shouldn't really be called in a Perl application, and for ++others there are thread-safe versions of these already implemented: ++ ++ asctime_r() ++ ctime_r() ++ Perl_langinfo() ++ ++The C<_r> forms are automatically used, starting in Perl 5.28, if you ++compile your code, with ++ ++ #define PERL_REENTRANT ++ ++See also L. ++You can use the methods given in L, to get the best available ++locale-safe versions of these ++ ++ POSIX::localeconv() ++ POSIX::wcstombs() ++ POSIX::wctomb() ++ ++And note, that some items returned by C are available ++through L. ++ ++The others shouldn't be used in a threaded application. ++ ++Some modules may call a non-perl library that is locale-aware. This is ++fine as long as it doesn't try to query or change the locale using the ++system C. But if these do call the system C, ++those calls may be ineffective. Instead, ++L|perlapi/Perl_setlocale> works in all circumstances. ++Plain setlocale is ineffective on multi-threaded POSIX 2008 systems. It ++operates only on the global locale, whereas each thread has its own ++locale, paying no attention to the global one. Since converting ++these non-Perl libraries to C is out of the question, ++there is a new function in v5.28 ++L|perlapi/switch_to_global_locale> that will ++switch the thread it is called from so that any system C ++calls will have their desired effect. The function ++L|perlapi/sync_locale> must be called before returning to ++perl. ++ ++This thread can change the locale all it wants and it won't affect any ++other thread, except any that also have been switched to the global ++locale. This means that a multi-threaded application can have a single ++thread using an alien library without a problem; but no more than a ++single thread can be so-occupied. Bad results likely will happen. ++ ++In perls without multi-thread locale support, some alien libraries, ++such as C change locales. This can cause problems for the Perl ++core and other modules. For these, before control is returned to ++perl, starting in v5.20.1, calling the function ++L from XS should be sufficient to ++avoid most of these problems. Prior to this, you need a pure Perl ++statement that does this: ++ ++ POSIX::setlocale(LC_ALL, POSIX::setlocale(LC_ALL)); ++ ++or use the methods given in L. ++ ++=back ++ ++=head1 XS VERSION ++ ++This document covers features supported by C ++(also known as C) 3.51 ++ ++=head1 AUTHOR DIAGNOSTICS ++ ++As of version 3.49 certain warnings are disabled by default. While developing ++you can set C<$ENV{AUTHOR_WARNINGS}> to true in your environment or in your ++Makefile.PL, or set C<$ExtUtils::ParseXS::AUTHOR_WARNINGS> to true via code, or ++pass C<< author_warnings=>1 >> into process_file() explicitly. Currently this will ++enable stricter alias checking but more warnings might be added in the future. ++The kind of warnings this will enable are only helpful to the author of the XS ++file, and the diagnostics produced will not include installation specific ++details so they are only useful to the maintainer of the XS code itself. ++ ++=head1 AUTHOR ++ ++Originally written by Dean Roehrich >. ++ ++Maintained since 1996 by The Perl Porters >. +diff --git a/lib/perlxstut.pod b/lib/perlxstut.pod +new file mode 100644 +index 0000000..fcafa58 +--- /dev/null ++++ b/lib/perlxstut.pod +@@ -0,0 +1,1425 @@ ++=head1 NAME ++ ++perlxstut - Tutorial for writing XSUBs ++ ++=head1 DESCRIPTION ++ ++This tutorial will educate the reader on the steps involved in creating ++a Perl extension. The reader is assumed to have access to L, ++L and L. ++ ++This tutorial starts with very simple examples and becomes more complex, ++with each new example adding new features. Certain concepts may not be ++completely explained until later in the tutorial in order to slowly ease ++the reader into building extensions. ++ ++This tutorial was written from a Unix point of view. Where I know them ++to be otherwise different for other platforms (e.g. Win32), I will list ++them. If you find something that was missed, please let me know. ++ ++=head1 SPECIAL NOTES ++ ++=head2 make ++ ++This tutorial assumes that the make program that Perl is configured to ++use is called C. Instead of running "make" in the examples that ++follow, you may have to substitute whatever make program Perl has been ++configured to use. Running B should tell you what it is. ++ ++=head2 Version caveat ++ ++When writing a Perl extension for general consumption, one should expect that ++the extension will be used with versions of Perl different from the ++version available on your machine. Since you are reading this document, ++the version of Perl on your machine is probably 5.005 or later, but the users ++of your extension may have more ancient versions. ++ ++To understand what kinds of incompatibilities one may expect, and in the rare ++case that the version of Perl on your machine is older than this document, ++see the section on "Troubleshooting these Examples" for more information. ++ ++If your extension uses some features of Perl which are not available on older ++releases of Perl, your users would appreciate an early meaningful warning. ++You would probably put this information into the F file, but nowadays ++installation of extensions may be performed automatically, guided by F ++module or other tools. ++ ++In MakeMaker-based installations, F provides the earliest ++opportunity to perform version checks. One can put something like this ++in F for this purpose: ++ ++ eval { require 5.007 } ++ or die < build them, but you must link the XSUBs subroutines with the ++rest of Perl, creating a new executable. This situation is similar to ++Perl 4. ++ ++This tutorial can still be used on such a system. The XSUB build mechanism ++will check the system and build a dynamically-loadable library if possible, ++or else a static library and then, optionally, a new statically-linked ++executable with that static library linked in. ++ ++Should you wish to build a statically-linked executable on a system which ++can dynamically load libraries, you may, in all the following examples, ++where the command "C" with no arguments is executed, run the command ++"C" instead. ++ ++If you have generated such a statically-linked executable by choice, then ++instead of saying "C", you should say "C". ++On systems that cannot build dynamically-loadable libraries at all, simply ++saying "C" is sufficient. ++ ++=head2 Threads and PERL_NO_GET_CONTEXT ++ ++For threaded builds, perl requires the context pointer for the current ++thread, without C, perl will call a function to ++retrieve the context. ++ ++For improved performance, include: ++ ++ #define PERL_NO_GET_CONTEXT ++ ++as shown below. ++ ++For more details, see L. ++ ++=head1 TUTORIAL ++ ++Now let's go on with the show! ++ ++=head2 EXAMPLE 1 ++ ++Our first extension will be very simple. When we call the routine in the ++extension, it will print out a well-known message and return. ++ ++Run "C". This creates a directory named Mytest, ++possibly under ext/ if that directory exists in the current working ++directory. Several files will be created under the Mytest dir, including ++MANIFEST, Makefile.PL, lib/Mytest.pm, Mytest.xs, t/Mytest.t, and Changes. ++ ++The MANIFEST file contains the names of all the files just created in the ++Mytest directory. ++ ++The file Makefile.PL should look something like this: ++ ++ use ExtUtils::MakeMaker; ++ ++ # See lib/ExtUtils/MakeMaker.pm for details of how to influence ++ # the contents of the Makefile that is written. ++ WriteMakefile( ++ NAME => 'Mytest', ++ VERSION_FROM => 'Mytest.pm', # finds $VERSION ++ LIBS => [''], # e.g., '-lm' ++ DEFINE => '', # e.g., '-DHAVE_SOMETHING' ++ INC => '-I', # e.g., '-I. -I/usr/include/other' ++ ); ++ ++The file Mytest.pm should start with something like this: ++ ++ package Mytest; ++ ++ use 5.008008; ++ use strict; ++ use warnings; ++ ++ require Exporter; ++ ++ our @ISA = qw(Exporter); ++ our %EXPORT_TAGS = ( 'all' => [ qw( ++ ++ ) ] ); ++ ++ our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); ++ ++ our @EXPORT = qw( ++ ++ ); ++ ++ our $VERSION = '0.01'; ++ ++ require XSLoader; ++ XSLoader::load('Mytest', $VERSION); ++ ++ # Preloaded methods go here. ++ ++ 1; ++ __END__ ++ # Below is the stub of documentation for your module. You better ++ # edit it! ++ ++The rest of the .pm file contains sample code for providing documentation for ++the extension. ++ ++Finally, the Mytest.xs file should look something like this: ++ ++ #define PERL_NO_GET_CONTEXT ++ #include "EXTERN.h" ++ #include "perl.h" ++ #include "XSUB.h" ++ ++ #include "ppport.h" ++ ++ MODULE = Mytest PACKAGE = Mytest ++ ++Let's edit the .xs file by adding this to the end of the file: ++ ++ void ++ hello() ++ CODE: ++ printf("Hello, world!\n"); ++ ++It is okay for the lines starting at the "CODE:" line to not be indented. ++However, for readability purposes, it is suggested that you indent CODE: ++one level and the lines following one more level. ++ ++Now we'll run "C". This will create a real Makefile, ++which make needs. Its output looks something like: ++ ++ % perl Makefile.PL ++ Checking if your kit is complete... ++ Looks good ++ Writing Makefile for Mytest ++ % ++ ++Now, running make will produce output that looks something like this (some ++long lines have been shortened for clarity and some extraneous lines have ++been deleted): ++ ++ % make ++ cp lib/Mytest.pm blib/lib/Mytest.pm ++ perl xsubpp -typemap typemap Mytest.xs > Mytest.xsc && \ ++ mv Mytest.xsc Mytest.c ++ Please specify prototyping behavior for Mytest.xs (see perlxs manual) ++ cc -c Mytest.c ++ Running Mkbootstrap for Mytest () ++ chmod 644 Mytest.bs ++ rm -f blib/arch/auto/Mytest/Mytest.so ++ cc -shared -L/usr/local/lib Mytest.o -o blib/arch/auto/Mytest/Mytest.so ++ ++ chmod 755 blib/arch/auto/Mytest/Mytest.so ++ cp Mytest.bs blib/arch/auto/Mytest/Mytest.bs ++ chmod 644 blib/arch/auto/Mytest/Mytest.bs ++ Manifying blib/man3/Mytest.3pm ++ % ++ ++You can safely ignore the line about "prototyping behavior" - it is ++explained in L. ++ ++Perl has its own special way of easily writing test scripts, but for this ++example only, we'll create our own test script. Create a file called hello ++that looks like this: ++ ++ #! /opt/perl5/bin/perl ++ ++ use ExtUtils::testlib; ++ ++ use Mytest; ++ ++ Mytest::hello(); ++ ++Now we make the script executable (C), run the script ++and we should see the following output: ++ ++ % ./hello ++ Hello, world! ++ % ++ ++=head2 EXAMPLE 2 ++ ++Now let's add to our extension a subroutine that will take a single numeric ++argument as input and return 1 if the number is even or 0 if the number ++is odd. ++ ++Add the following to the end of Mytest.xs: ++ ++ int ++ is_even(input) ++ int input ++ CODE: ++ RETVAL = (input % 2 == 0); ++ OUTPUT: ++ RETVAL ++ ++There does not need to be whitespace at the start of the "C" ++line, but it is useful for improving readability. Placing a semi-colon at ++the end of that line is also optional. Any amount and kind of whitespace ++may be placed between the "C" and "C". ++ ++Now re-run make to rebuild our new shared library. ++ ++Now perform the same steps as before, generating a Makefile from the ++Makefile.PL file, and running make. ++ ++In order to test that our extension works, we now need to look at the ++file Mytest.t. This file is set up to imitate the same kind of testing ++structure that Perl itself has. Within the test script, you perform a ++number of tests to confirm the behavior of the extension, printing "ok" ++when the test is correct, "not ok" when it is not. ++ ++ use Test::More tests => 4; ++ BEGIN { use_ok('Mytest') }; ++ ++ ######################### ++ ++ # Insert your test code below, the Test::More module is use()ed here ++ # so read its man page ( perldoc Test::More ) for help writing this ++ # test script. ++ ++ is( Mytest::is_even(0), 1 ); ++ is( Mytest::is_even(1), 0 ); ++ is( Mytest::is_even(2), 1 ); ++ ++We will be calling the test script through the command "C". You ++should see output that looks something like this: ++ ++ %make test ++ PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" ++ "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t ++ t/Mytest....ok ++ All tests successful. ++ Files=1, Tests=4, 0 wallclock secs ( 0.03 cusr + 0.00 csys = 0.03 CPU) ++ % ++ ++=head2 What has gone on? ++ ++The program h2xs is the starting point for creating extensions. In later ++examples we'll see how we can use h2xs to read header files and generate ++templates to connect to C routines. ++ ++h2xs creates a number of files in the extension directory. The file ++Makefile.PL is a perl script which will generate a true Makefile to build ++the extension. We'll take a closer look at it later. ++ ++The .pm and .xs files contain the meat of the extension. The .xs file holds ++the C routines that make up the extension. The .pm file contains routines ++that tell Perl how to load your extension. ++ ++Generating the Makefile and running C created a directory called blib ++(which stands for "build library") in the current working directory. This ++directory will contain the shared library that we will build. Once we have ++tested it, we can install it into its final location. ++ ++Invoking the test script via "C" did something very important. ++It invoked perl with all those C<-I> arguments so that it could find the ++various files that are part of the extension. It is I important that ++while you are still testing extensions that you use "C". If you ++try to run the test script all by itself, you will get a fatal error. ++Another reason it is important to use "C" to run your test ++script is that if you are testing an upgrade to an already-existing version, ++using "C" ensures that you will test your new extension, not the ++already-existing version. ++ ++When Perl sees a C, it searches for a file with the same name ++as the C'd extension that has a .pm suffix. If that file cannot be found, ++Perl dies with a fatal error. The default search path is contained in the ++C<@INC> array. ++ ++In our case, Mytest.pm tells perl that it will need the Exporter and Dynamic ++Loader extensions. It then sets the C<@ISA> and C<@EXPORT> arrays and the ++C<$VERSION> scalar; finally it tells perl to bootstrap the module. Perl ++will call its dynamic loader routine (if there is one) and load the shared ++library. ++ ++The two arrays C<@ISA> and C<@EXPORT> are very important. The C<@ISA> ++array contains a list of other packages in which to search for methods (or ++subroutines) that do not exist in the current package. This is usually ++only important for object-oriented extensions (which we will talk about ++much later), and so usually doesn't need to be modified. ++ ++The C<@EXPORT> array tells Perl which of the extension's variables and ++subroutines should be placed into the calling package's namespace. Because ++you don't know if the user has already used your variable and subroutine ++names, it's vitally important to carefully select what to export. Do I ++export method or variable names I without a good reason. ++ ++As a general rule, if the module is trying to be object-oriented then don't ++export anything. If it's just a collection of functions and variables, then ++you can export them via another array, called C<@EXPORT_OK>. This array ++does not automatically place its subroutine and variable names into the ++namespace unless the user specifically requests that this be done. ++ ++See L for more information. ++ ++The C<$VERSION> variable is used to ensure that the .pm file and the shared ++library are "in sync" with each other. Any time you make changes to ++the .pm or .xs files, you should increment the value of this variable. ++ ++=head2 Writing good test scripts ++ ++The importance of writing good test scripts cannot be over-emphasized. You ++should closely follow the "ok/not ok" style that Perl itself uses, so that ++it is very easy and unambiguous to determine the outcome of each test case. ++When you find and fix a bug, make sure you add a test case for it. ++ ++By running "C", you ensure that your Mytest.t script runs and uses ++the correct version of your extension. If you have many test cases, ++save your test files in the "t" directory and use the suffix ".t". ++When you run "C", all of these test files will be executed. ++ ++=head2 EXAMPLE 3 ++ ++Our third extension will take one argument as its input, round off that ++value, and set the I to the rounded value. ++ ++Add the following to the end of Mytest.xs: ++ ++ void ++ round(arg) ++ double arg ++ CODE: ++ if (arg > 0.0) { ++ arg = floor(arg + 0.5); ++ } else if (arg < 0.0) { ++ arg = ceil(arg - 0.5); ++ } else { ++ arg = 0.0; ++ } ++ OUTPUT: ++ arg ++ ++Edit the Makefile.PL file so that the corresponding line looks like this: ++ ++ LIBS => ['-lm'], # e.g., '-lm' ++ ++Generate the Makefile and run make. Change the test number in Mytest.t to ++"9" and add the following tests: ++ ++ my $i; ++ ++ $i = -1.5; ++ Mytest::round($i); ++ is( $i, -2.0, 'Rounding -1.5 to -2.0' ); ++ ++ $i = -1.1; ++ Mytest::round($i); ++ is( $i, -1.0, 'Rounding -1.1 to -1.0' ); ++ ++ $i = 0.0; ++ Mytest::round($i); ++ is( $i, 0.0, 'Rounding 0.0 to 0.0' ); ++ ++ $i = 0.5; ++ Mytest::round($i); ++ is( $i, 1.0, 'Rounding 0.5 to 1.0' ); ++ ++ $i = 1.2; ++ Mytest::round($i); ++ is( $i, 1.0, 'Rounding 1.2 to 1.0' ); ++ ++Running "C" should now print out that all nine tests are okay. ++ ++Notice that in these new test cases, the argument passed to round was a ++scalar variable. You might be wondering if you can round a constant or ++literal. To see what happens, temporarily add the following line to Mytest.t: ++ ++ Mytest::round(3); ++ ++Run "C" and notice that Perl dies with a fatal error. Perl won't ++let you change the value of constants! ++ ++=head2 What's new here? ++ ++=over 4 ++ ++=item * ++ ++We've made some changes to Makefile.PL. In this case, we've specified an ++extra library to be linked into the extension's shared library, the math ++library libm in this case. We'll talk later about how to write XSUBs that ++can call every routine in a library. ++ ++=item * ++ ++The value of the function is not being passed back as the function's return ++value, but by changing the value of the variable that was passed into the ++function. You might have guessed that when you saw that the return value ++of round is of type "void". ++ ++=back ++ ++=head2 Input and Output Parameters ++ ++You specify the parameters that will be passed into the XSUB on the line(s) ++after you declare the function's return value and name. Each input parameter ++line starts with optional whitespace, and may have an optional terminating ++semicolon. ++ ++The list of output parameters occurs at the very end of the function, just ++after the OUTPUT: directive. The use of RETVAL tells Perl that you ++wish to send this value back as the return value of the XSUB function. In ++Example 3, we wanted the "return value" placed in the original variable ++which we passed in, so we listed it (and not RETVAL) in the OUTPUT: section. ++ ++=head2 The XSUBPP Program ++ ++The B program takes the XS code in the .xs file and translates it into ++C code, placing it in a file whose suffix is .c. The C code created makes ++heavy use of the C functions within Perl. ++ ++=head2 The TYPEMAP file ++ ++The B program uses rules to convert from Perl's data types (scalar, ++array, etc.) to C's data types (int, char, etc.). These rules are stored ++in the typemap file ($PERLLIB/ExtUtils/typemap). There's a brief discussion ++below, but all the nitty-gritty details can be found in L. ++If you have a new-enough version of perl (5.16 and up) or an upgraded ++XS compiler (C 3.13_01 or better), then you can inline ++typemaps in your XS instead of writing separate files. ++Either way, this typemap thing is split into three parts: ++ ++The first section maps various C data types to a name, which corresponds ++somewhat with the various Perl types. The second section contains C code ++which B uses to handle input parameters. The third section contains ++C code which B uses to handle output parameters. ++ ++Let's take a look at a portion of the .c file created for our extension. ++The file name is Mytest.c: ++ ++ XS(XS_Mytest_round) ++ { ++ dXSARGS; ++ if (items != 1) ++ Perl_croak(aTHX_ "Usage: Mytest::round(arg)"); ++ PERL_UNUSED_VAR(cv); /* -W */ ++ { ++ double arg = (double)SvNV(ST(0)); /* XXXXX */ ++ if (arg > 0.0) { ++ arg = floor(arg + 0.5); ++ } else if (arg < 0.0) { ++ arg = ceil(arg - 0.5); ++ } else { ++ arg = 0.0; ++ } ++ sv_setnv(ST(0), (double)arg); /* XXXXX */ ++ SvSETMAGIC(ST(0)); ++ } ++ XSRETURN_EMPTY; ++ } ++ ++Notice the two lines commented with "XXXXX". If you check the first part ++of the typemap file (or section), you'll see that doubles are of type ++T_DOUBLE. In the INPUT part of the typemap, an argument that is T_DOUBLE ++is assigned to the variable arg by calling the routine SvNV on something, ++then casting it to double, then assigned to the variable arg. Similarly, ++in the OUTPUT section, once arg has its final value, it is passed to the ++sv_setnv function to be passed back to the calling subroutine. These two ++functions are explained in L; we'll talk more later about what ++that "ST(0)" means in the section on the argument stack. ++ ++=head2 Warning about Output Arguments ++ ++In general, it's not a good idea to write extensions that modify their input ++parameters, as in Example 3. Instead, you should probably return multiple ++values in an array and let the caller handle them (we'll do this in a later ++example). However, in order to better accommodate calling pre-existing C ++routines, which often do modify their input parameters, this behavior is ++tolerated. ++ ++=head2 EXAMPLE 4 ++ ++In this example, we'll now begin to write XSUBs that will interact with ++pre-defined C libraries. To begin with, we will build a small library of ++our own, then let h2xs write our .pm and .xs files for us. ++ ++Create a new directory called Mytest2 at the same level as the directory ++Mytest. In the Mytest2 directory, create another directory called mylib, ++and cd into that directory. ++ ++Here we'll create some files that will generate a test library. These will ++include a C source file and a header file. We'll also create a Makefile.PL ++in this directory. Then we'll make sure that running make at the Mytest2 ++level will automatically run this Makefile.PL file and the resulting Makefile. ++ ++In the mylib directory, create a file mylib.h that looks like this: ++ ++ #define TESTVAL 4 ++ ++ extern double foo(int, long, const char*); ++ ++Also create a file mylib.c that looks like this: ++ ++ #include ++ #include "mylib.h" ++ ++ double ++ foo(int a, long b, const char *c) ++ { ++ return (a + b + atof(c) + TESTVAL); ++ } ++ ++And finally create a file Makefile.PL that looks like this: ++ ++ use ExtUtils::MakeMaker; ++ $Verbose = 1; ++ WriteMakefile( ++ NAME => 'Mytest2::mylib', ++ SKIP => [qw(all static static_lib dynamic dynamic_lib)], ++ clean => {'FILES' => 'libmylib$(LIB_EXT)'}, ++ ); ++ ++ ++ sub MY::top_targets { ++ ' ++ all :: static ++ ++ pure_all :: static ++ ++ static :: libmylib$(LIB_EXT) ++ ++ libmylib$(LIB_EXT): $(O_FILES) ++ $(AR) cr libmylib$(LIB_EXT) $(O_FILES) ++ $(RANLIB) libmylib$(LIB_EXT) ++ ++ '; ++ } ++ ++Make sure you use a tab and not spaces on the lines beginning with "$(AR)" ++and "$(RANLIB)". Make will not function properly if you use spaces. ++It has also been reported that the "cr" argument to $(AR) is unnecessary ++on Win32 systems. ++ ++We will now create the main top-level Mytest2 files. Change to the directory ++above Mytest2 and run the following command: ++ ++ % h2xs -O -n Mytest2 Mytest2/mylib/mylib.h ++ ++This will print out a warning about overwriting Mytest2, but that's okay. ++Our files are stored in Mytest2/mylib, and will be untouched. ++ ++The normal Makefile.PL that h2xs generates doesn't know about the mylib ++directory. We need to tell it that there is a subdirectory and that we ++will be generating a library in it. Let's add the argument MYEXTLIB to ++the WriteMakefile call so that it looks like this: ++ ++ WriteMakefile( ++ NAME => 'Mytest2', ++ VERSION_FROM => 'Mytest2.pm', # finds $VERSION ++ LIBS => [''], # e.g., '-lm' ++ DEFINE => '', # e.g., '-DHAVE_SOMETHING' ++ INC => '', # e.g., '-I/usr/include/other' ++ MYEXTLIB => 'mylib/libmylib$(LIB_EXT)', ++ ); ++ ++and then at the end add a subroutine (which will override the pre-existing ++subroutine). Remember to use a tab character to indent the line beginning ++with "cd"! ++ ++ sub MY::postamble { ++ ' ++ $(MYEXTLIB): mylib/Makefile ++ cd mylib && $(MAKE) $(PASSTHRU) ++ '; ++ } ++ ++Let's also fix the MANIFEST file by appending the following three lines: ++ ++ mylib/Makefile.PL ++ mylib/mylib.c ++ mylib/mylib.h ++ ++To keep our namespace nice and unpolluted, edit the .pm file and change ++the variable C<@EXPORT> to C<@EXPORT_OK>. Finally, in the ++.xs file, edit the #include line to read: ++ ++ #include "mylib/mylib.h" ++ ++And also add the following function definition to the end of the .xs file: ++ ++ double ++ foo(a,b,c) ++ int a ++ long b ++ const char * c ++ OUTPUT: ++ RETVAL ++ ++Now we also need to create a typemap because the default Perl doesn't ++currently support the C type. Include a new TYPEMAP ++section in your XS code before the above function: ++ ++ TYPEMAP: <" and all should be well. There are some warnings on missing ++tests for the Mytest2::mylib extension, but you can ignore them. ++ ++=head2 What has happened here? ++ ++Unlike previous examples, we've now run h2xs on a real include file. This ++has caused some extra goodies to appear in both the .pm and .xs files. ++ ++=over 4 ++ ++=item * ++ ++In the .xs file, there's now a #include directive with the absolute path to ++the mylib.h header file. We changed this to a relative path so that we ++could move the extension directory if we wanted to. ++ ++=item * ++ ++There's now some new C code that's been added to the .xs file. The purpose ++of the C routine is to make the values that are #define'd in the ++header file accessible by the Perl script (by calling either C or ++C<&Mytest2::TESTVAL>). There's also some XS code to allow calls to the ++C routine. ++ ++=item * ++ ++The .pm file originally exported the name C in the C<@EXPORT> array. ++This could lead to name clashes. A good rule of thumb is that if the #define ++is only going to be used by the C routines themselves, and not by the user, ++they should be removed from the C<@EXPORT> array. Alternately, if you don't ++mind using the "fully qualified name" of a variable, you could move most ++or all of the items from the C<@EXPORT> array into the C<@EXPORT_OK> array. ++ ++=item * ++ ++If our include file had contained #include directives, these would not have ++been processed by h2xs. There is no good solution to this right now. ++ ++=item * ++ ++We've also told Perl about the library that we built in the mylib ++subdirectory. That required only the addition of the C variable ++to the WriteMakefile call and the replacement of the postamble subroutine ++to cd into the subdirectory and run make. The Makefile.PL for the ++library is a bit more complicated, but not excessively so. Again we ++replaced the postamble subroutine to insert our own code. This code ++simply specified that the library to be created here was a static archive ++library (as opposed to a dynamically loadable library) and provided the ++commands to build it. ++ ++=back ++ ++=head2 Anatomy of .xs file ++ ++The .xs file of L contained some new elements. To understand ++the meaning of these elements, pay attention to the line which reads ++ ++ MODULE = Mytest2 PACKAGE = Mytest2 ++ ++Anything before this line is plain C code which describes which headers ++to include, and defines some convenience functions. No translations are ++performed on this part, apart from having embedded POD documentation ++skipped over (see L) it goes into the generated output C file as is. ++ ++Anything after this line is the description of XSUB functions. ++These descriptions are translated by B into C code which ++implements these functions using Perl calling conventions, and which ++makes these functions visible from Perl interpreter. ++ ++Pay a special attention to the function C. This name appears ++twice in the generated .xs file: once in the first part, as a static C ++function, then another time in the second part, when an XSUB interface to ++this static C function is defined. ++ ++This is quite typical for .xs files: usually the .xs file provides ++an interface to an existing C function. Then this C function is defined ++somewhere (either in an external library, or in the first part of .xs file), ++and a Perl interface to this function (i.e. "Perl glue") is described in the ++second part of .xs file. The situation in L<"EXAMPLE 1">, L<"EXAMPLE 2">, ++and L<"EXAMPLE 3">, when all the work is done inside the "Perl glue", is ++somewhat of an exception rather than the rule. ++ ++=head2 Getting the fat out of XSUBs ++ ++In L the second part of .xs file contained the following ++description of an XSUB: ++ ++ double ++ foo(a,b,c) ++ int a ++ long b ++ const char * c ++ OUTPUT: ++ RETVAL ++ ++Note that in contrast with L<"EXAMPLE 1">, L<"EXAMPLE 2"> and L<"EXAMPLE 3">, ++this description does not contain the actual I for what is done ++during a call to Perl function foo(). To understand what is going ++on here, one can add a CODE section to this XSUB: ++ ++ double ++ foo(a,b,c) ++ int a ++ long b ++ const char * c ++ CODE: ++ RETVAL = foo(a,b,c); ++ OUTPUT: ++ RETVAL ++ ++However, these two XSUBs provide almost identical generated C code: B ++compiler is smart enough to figure out the C section from the first ++two lines of the description of XSUB. What about C section? In ++fact, that is absolutely the same! The C section can be removed ++as well, I section or C section> is not ++specified: B can see that it needs to generate a function call ++section, and will autogenerate the OUTPUT section too. Thus one can ++shortcut the XSUB to become: ++ ++ double ++ foo(a,b,c) ++ int a ++ long b ++ const char * c ++ ++Can we do the same with an XSUB ++ ++ int ++ is_even(input) ++ int input ++ CODE: ++ RETVAL = (input % 2 == 0); ++ OUTPUT: ++ RETVAL ++ ++of L<"EXAMPLE 2">? To do this, one needs to define a C function C. As we saw in L, a proper place ++for this definition is in the first part of .xs file. In fact a C function ++ ++ int ++ is_even(int arg) ++ { ++ return (arg % 2 == 0); ++ } ++ ++is probably overkill for this. Something as simple as a C<#define> will ++do too: ++ ++ #define is_even(arg) ((arg) % 2 == 0) ++ ++After having this in the first part of .xs file, the "Perl glue" part becomes ++as simple as ++ ++ int ++ is_even(input) ++ int input ++ ++This technique of separation of the glue part from the workhorse part has ++obvious tradeoffs: if you want to change a Perl interface, you need to ++change two places in your code. However, it removes a lot of clutter, ++and makes the workhorse part independent from idiosyncrasies of Perl calling ++convention. (In fact, there is nothing Perl-specific in the above description, ++a different version of B might have translated this to TCL glue or ++Python glue as well.) ++ ++=head2 More about XSUB arguments ++ ++With the completion of Example 4, we now have an easy way to simulate some ++real-life libraries whose interfaces may not be the cleanest in the world. ++We shall now continue with a discussion of the arguments passed to the ++B compiler. ++ ++When you specify arguments to routines in the .xs file, you are really ++passing three pieces of information for each argument listed. The first ++piece is the order of that argument relative to the others (first, second, ++etc). The second is the type of argument, and consists of the type ++declaration of the argument (e.g., int, char*, etc). The third piece is ++the calling convention for the argument in the call to the library function. ++ ++While Perl passes arguments to functions by reference, ++C passes arguments by value; to implement a C function which modifies data ++of one of the "arguments", the actual argument of this C function would be ++a pointer to the data. Thus two C functions with declarations ++ ++ int string_length(char *s); ++ int upper_case_char(char *cp); ++ ++may have completely different semantics: the first one may inspect an array ++of chars pointed by s, and the second one may immediately dereference C ++and manipulate C<*cp> only (using the return value as, say, a success ++indicator). From Perl one would use these functions in ++a completely different manner. ++ ++One conveys this info to B by replacing C<*> before the ++argument by C<&>. C<&> means that the argument should be passed to a library ++function by its address. The above two function may be XSUB-ified as ++ ++ int ++ string_length(s) ++ char * s ++ ++ int ++ upper_case_char(cp) ++ char &cp ++ ++For example, consider: ++ ++ int ++ foo(a,b) ++ char &a ++ char * b ++ ++The first Perl argument to this function would be treated as a char and ++assigned to the variable a, and its address would be passed into the function ++foo. The second Perl argument would be treated as a string pointer and assigned ++to the variable b. The I of b would be passed into the function foo. ++The actual call to the function foo that B generates would look like ++this: ++ ++ foo(&a, b); ++ ++B will parse the following function argument lists identically: ++ ++ char &a ++ char&a ++ char & a ++ ++However, to help ease understanding, it is suggested that you place a "&" ++next to the variable name and away from the variable type), and place a ++"*" near the variable type, but away from the variable name (as in the ++call to foo above). By doing so, it is easy to understand exactly what ++will be passed to the C function; it will be whatever is in the "last ++column". ++ ++You should take great pains to try to pass the function the type of variable ++it wants, when possible. It will save you a lot of trouble in the long run. ++ ++=head2 The Argument Stack ++ ++If we look at any of the C code generated by any of the examples except ++example 1, you will notice a number of references to ST(n), where n is ++usually 0. "ST" is actually a macro that points to the n'th argument ++on the argument stack. ST(0) is thus the first argument on the stack and ++therefore the first argument passed to the XSUB, ST(1) is the second ++argument, and so on. ++ ++When you list the arguments to the XSUB in the .xs file, that tells B ++which argument corresponds to which of the argument stack (i.e., the first ++one listed is the first argument, and so on). You invite disaster if you ++do not list them in the same order as the function expects them. ++ ++The actual values on the argument stack are pointers to the values passed ++in. When an argument is listed as being an OUTPUT value, its corresponding ++value on the stack (i.e., ST(0) if it was the first argument) is changed. ++You can verify this by looking at the C code generated for Example 3. ++The code for the round() XSUB routine contains lines that look like this: ++ ++ double arg = (double)SvNV(ST(0)); ++ /* Round the contents of the variable arg */ ++ sv_setnv(ST(0), (double)arg); ++ ++The arg variable is initially set by taking the value from ST(0), then is ++stored back into ST(0) at the end of the routine. ++ ++XSUBs are also allowed to return lists, not just scalars. This must be ++done by manipulating stack values ST(0), ST(1), etc, in a subtly ++different way. See L for details. ++ ++XSUBs are also allowed to avoid automatic conversion of Perl function arguments ++to C function arguments. See L for details. Some people prefer ++manual conversion by inspecting C even in the cases when automatic ++conversion will do, arguing that this makes the logic of an XSUB call clearer. ++Compare with L<"Getting the fat out of XSUBs"> for a similar tradeoff of ++a complete separation of "Perl glue" and "workhorse" parts of an XSUB. ++ ++While experts may argue about these idioms, a novice to Perl guts may ++prefer a way which is as little Perl-guts-specific as possible, meaning ++automatic conversion and automatic call generation, as in ++L<"Getting the fat out of XSUBs">. This approach has the additional ++benefit of protecting the XSUB writer from future changes to the Perl API. ++ ++=head2 Extending your Extension ++ ++Sometimes you might want to provide some extra methods or subroutines ++to assist in making the interface between Perl and your extension simpler ++or easier to understand. These routines should live in the .pm file. ++Whether they are automatically loaded when the extension itself is loaded ++or only loaded when called depends on where in the .pm file the subroutine ++definition is placed. You can also consult L for an alternate ++way to store and load your extra subroutines. ++ ++=head2 Documenting your Extension ++ ++There is absolutely no excuse for not documenting your extension. ++Documentation belongs in the .pm file. This file will be fed to pod2man, ++and the embedded documentation will be converted to the manpage format, ++then placed in the blib directory. It will be copied to Perl's ++manpage directory when the extension is installed. ++ ++You may intersperse documentation and Perl code within the .pm file. ++In fact, if you want to use method autoloading, you must do this, ++as the comment inside the .pm file explains. ++ ++See L for more information about the pod format. ++ ++=head2 Installing your Extension ++ ++Once your extension is complete and passes all its tests, installing it ++is quite simple: you simply run "make install". You will either need ++to have write permission into the directories where Perl is installed, ++or ask your system administrator to run the make for you. ++ ++Alternately, you can specify the exact directory to place the extension's ++files by placing a "PREFIX=/destination/directory" after the make install ++(or in between the make and install if you have a brain-dead version of make). ++This can be very useful if you are building an extension that will eventually ++be distributed to multiple systems. You can then just archive the files in ++the destination directory and distribute them to your destination systems. ++ ++=head2 EXAMPLE 5 ++ ++In this example, we'll do some more work with the argument stack. The ++previous examples have all returned only a single value. We'll now ++create an extension that returns an array. ++ ++This extension is very Unix-oriented (struct statfs and the statfs system ++call). If you are not running on a Unix system, you can substitute for ++statfs any other function that returns multiple values, you can hard-code ++values to be returned to the caller (although this will be a bit harder ++to test the error case), or you can simply not do this example. If you ++change the XSUB, be sure to fix the test cases to match the changes. ++ ++Return to the Mytest directory and add the following code to the end of ++Mytest.xs: ++ ++ void ++ statfs(path) ++ char * path ++ INIT: ++ int i; ++ struct statfs buf; ++ ++ PPCODE: ++ i = statfs(path, &buf); ++ if (i == 0) { ++ XPUSHs(sv_2mortal(newSVnv(buf.f_bavail))); ++ XPUSHs(sv_2mortal(newSVnv(buf.f_bfree))); ++ XPUSHs(sv_2mortal(newSVnv(buf.f_blocks))); ++ XPUSHs(sv_2mortal(newSVnv(buf.f_bsize))); ++ XPUSHs(sv_2mortal(newSVnv(buf.f_ffree))); ++ XPUSHs(sv_2mortal(newSVnv(buf.f_files))); ++ XPUSHs(sv_2mortal(newSVnv(buf.f_type))); ++ } else { ++ XPUSHs(sv_2mortal(newSVnv(errno))); ++ } ++ ++You'll also need to add the following code to the top of the .xs file, just ++after the include of "XSUB.h": ++ ++ #include ++ ++Also add the following code segment to Mytest.t while incrementing the "9" ++tests to "11": ++ ++ my @a; ++ ++ @a = Mytest::statfs("/blech"); ++ ok( scalar(@a) == 1 && $a[0] == 2 ); ++ ++ @a = Mytest::statfs("/"); ++ is( scalar(@a), 7 ); ++ ++=head2 New Things in this Example ++ ++This example added quite a few new concepts. We'll take them one at a time. ++ ++=over 4 ++ ++=item * ++ ++The INIT: directive contains code that will be placed immediately after ++the argument stack is decoded. C does not allow variable declarations at ++arbitrary locations inside a function, ++so this is usually the best way to declare local variables needed by the XSUB. ++(Alternatively, one could put the whole C section into braces, and ++put these declarations on top.) ++ ++=item * ++ ++This routine also returns a different number of arguments depending on the ++success or failure of the call to statfs. If there is an error, the error ++number is returned as a single-element array. If the call is successful, ++then a 7-element array is returned. Since only one argument is passed into ++this function, we need room on the stack to hold the 7 values which may be ++returned. ++ ++We do this by using the PPCODE: directive, rather than the CODE: directive. ++This tells B that we will be managing the return values that will be ++put on the argument stack by ourselves. ++ ++=item * ++ ++When we want to place values to be returned to the caller onto the stack, ++we use the series of macros that begin with "XPUSH". There are five ++different versions, for placing integers, unsigned integers, doubles, ++strings, and Perl scalars on the stack. In our example, we placed a ++Perl scalar onto the stack. (In fact this is the only macro which ++can be used to return multiple values.) ++ ++The XPUSH* macros will automatically extend the return stack to prevent ++it from being overrun. You push values onto the stack in the order you ++want them seen by the calling program. ++ ++=item * ++ ++The values pushed onto the return stack of the XSUB are actually mortal SV's. ++They are made mortal so that once the values are copied by the calling ++program, the SV's that held the returned values can be deallocated. ++If they were not mortal, then they would continue to exist after the XSUB ++routine returned, but would not be accessible. This is a memory leak. ++ ++=item * ++ ++If we were interested in performance, not in code compactness, in the success ++branch we would not use C macros, but C macros, and would ++pre-extend the stack before pushing the return values: ++ ++ EXTEND(SP, 7); ++ ++The tradeoff is that one needs to calculate the number of return values ++in advance (though overextending the stack will not typically hurt ++anything but memory consumption). ++ ++Similarly, in the failure branch we could use C I extending ++the stack: the Perl function reference comes to an XSUB on the stack, thus ++the stack is I large enough to take one return value. ++ ++=back ++ ++=head2 EXAMPLE 6 ++ ++In this example, we will accept a reference to an array as an input ++parameter, and return a reference to an array of hashes. This will ++demonstrate manipulation of complex Perl data types from an XSUB. ++ ++This extension is somewhat contrived. It is based on the code in ++the previous example. It calls the statfs function multiple times, ++accepting a reference to an array of filenames as input, and returning ++a reference to an array of hashes containing the data for each of the ++filesystems. ++ ++Return to the Mytest directory and add the following code to the end of ++Mytest.xs: ++ ++ SV * ++ multi_statfs(paths) ++ SV * paths ++ INIT: ++ AV * results; ++ SSize_t numpaths = 0, n; ++ int i; ++ struct statfs buf; ++ ++ SvGETMAGIC(paths); ++ if ((!SvROK(paths)) ++ || (SvTYPE(SvRV(paths)) != SVt_PVAV) ++ || ((numpaths = av_top_index((AV *)SvRV(paths))) < 0)) ++ { ++ XSRETURN_UNDEF; ++ } ++ results = (AV *)sv_2mortal((SV *)newAV()); ++ CODE: ++ for (n = 0; n <= numpaths; n++) { ++ HV * rh; ++ STRLEN l; ++ SV * path = *av_fetch((AV *)SvRV(paths), n, 0); ++ char * fn = SvPVbyte(path, l); ++ ++ i = statfs(fn, &buf); ++ if (i != 0) { ++ av_push(results, newSVnv(errno)); ++ continue; ++ } ++ ++ rh = (HV *)sv_2mortal((SV *)newHV()); ++ ++ hv_store(rh, "f_bavail", 8, newSVnv(buf.f_bavail), 0); ++ hv_store(rh, "f_bfree", 7, newSVnv(buf.f_bfree), 0); ++ hv_store(rh, "f_blocks", 8, newSVnv(buf.f_blocks), 0); ++ hv_store(rh, "f_bsize", 7, newSVnv(buf.f_bsize), 0); ++ hv_store(rh, "f_ffree", 7, newSVnv(buf.f_ffree), 0); ++ hv_store(rh, "f_files", 7, newSVnv(buf.f_files), 0); ++ hv_store(rh, "f_type", 6, newSVnv(buf.f_type), 0); ++ ++ av_push(results, newRV_inc((SV *)rh)); ++ } ++ RETVAL = newRV_inc((SV *)results); ++ OUTPUT: ++ RETVAL ++ ++And add the following code to Mytest.t, while incrementing the "11" ++tests to "13": ++ ++ my $results = Mytest::multi_statfs([ '/', '/blech' ]); ++ ok( ref $results->[0] ); ++ ok( ! ref $results->[1] ); ++ ++=head2 New Things in this Example ++ ++There are a number of new concepts introduced here, described below: ++ ++=over 4 ++ ++=item * ++ ++This function does not use a typemap. Instead, we declare it as accepting ++one SV* (scalar) parameter, and returning an SV* value, and we take care of ++populating these scalars within the code. Because we are only returning ++one value, we don't need a C directive - instead, we use C ++and C directives. ++ ++=item * ++ ++When dealing with references, it is important to handle them with caution. ++The C block first calls SvGETMAGIC(paths), in case ++paths is a tied variable. Then it checks that C returns ++true, which indicates that paths is a valid reference. (Simply ++checking C won't trigger FETCH on a tied variable.) It ++then verifies that the object referenced by paths is an array, using C ++to dereference paths, and C to discover its type. As an added test, ++it checks that the array referenced by paths is non-empty, using the ++C function (which returns -1 if the array is empty). The ++XSRETURN_UNDEF macro is used to abort the XSUB and return the undefined value ++whenever all three of these conditions are not met. ++ ++=item * ++ ++We manipulate several arrays in this XSUB. Note that an array is represented ++internally by an AV* pointer. The functions and macros for manipulating ++arrays are similar to the functions in Perl: C returns the ++highest index in an AV*, much like $#array; C fetches a single scalar ++value from an array, given its index; C pushes a scalar value onto the ++end of the array, automatically extending the array as necessary. ++ ++Specifically, we read pathnames one at a time from the input array, and ++store the results in an output array (results) in the same order. If ++statfs fails, the element pushed onto the return array is the value of ++errno after the failure. If statfs succeeds, though, the value pushed ++onto the return array is a reference to a hash containing some of the ++information in the statfs structure. ++ ++As with the return stack, it would be possible (and a small performance win) ++to pre-extend the return array before pushing data into it, since we know ++how many elements we will return: ++ ++ av_extend(results, numpaths); ++ ++=item * ++ ++We are performing only one hash operation in this function, which is storing ++a new scalar under a key using C. A hash is represented by an HV* ++pointer. Like arrays, the functions for manipulating hashes from an XSUB ++mirror the functionality available from Perl. See L and L ++for details. ++ ++=item * ++ ++To create a reference, we use the C function. Note that you can ++cast an AV* or an HV* to type SV* in this case (and many others). This ++allows you to take references to arrays, hashes and scalars with the same ++function. Conversely, the C function always returns an SV*, which may ++need to be cast to the appropriate type if it is something other than a ++scalar (check with C). ++ ++=item * ++ ++At this point, xsubpp is doing very little work - the differences between ++Mytest.xs and Mytest.c are minimal. ++ ++=back ++ ++=head2 EXAMPLE 7 (Coming Soon) ++ ++XPUSH args AND set RETVAL AND assign return value to array ++ ++=head2 EXAMPLE 8 (Coming Soon) ++ ++Setting $! ++ ++=head2 EXAMPLE 9 Passing open files to XSes ++ ++You would think passing files to an XS is difficult, with all the ++typeglobs and stuff. Well, it isn't. ++ ++Suppose that for some strange reason we need a wrapper around the ++standard C library function C. This is all we need: ++ ++ #define PERLIO_NOT_STDIO 0 /* For co-existence with stdio only */ ++ #define PERL_NO_GET_CONTEXT /* This is more efficient */ ++ #include "EXTERN.h" ++ #include "perl.h" ++ #include "XSUB.h" ++ ++ #include ++ ++ int ++ fputs(s, stream) ++ char * s ++ FILE * stream ++ ++The real work is done in the standard typemap. ++ ++For more details, see ++L. ++ ++B you lose all the fine stuff done by the perlio layers. This ++calls the stdio function C, which knows nothing about them. ++ ++The standard typemap offers three variants of PerlIO *: ++C (T_IN), C (T_INOUT) and C ++(T_OUT). A bare C is considered a T_INOUT. If it matters ++in your code (see below for why it might) #define or typedef ++one of the specific names and use that as the argument or result ++type in your XS file. ++ ++The standard typemap does not contain PerlIO * before perl 5.7, ++but it has the three stream variants. Using a PerlIO * directly ++is not backwards compatible unless you provide your own typemap. ++ ++For streams coming I perl the main difference is that ++C will get the output PerlIO * - which may make ++a difference on a socket. Like in our example... ++ ++For streams being handed I perl a new file handle is created ++(i.e. a reference to a new glob) and associated with the PerlIO * ++provided. If the read/write state of the PerlIO * is not correct then you ++may get errors or warnings from when the file handle is used. ++So if you opened the PerlIO * as "w" it should really be an ++C if open as "r" it should be an C. ++ ++Now, suppose you want to use perlio layers in your XS. We'll use the ++perlio C function as an example. ++ ++In the C part of the XS file (above the first MODULE line) you ++have ++ ++ #define OutputStream PerlIO * ++ or ++ typedef PerlIO * OutputStream; ++ ++ ++And this is the XS code: ++ ++ int ++ perlioputs(s, stream) ++ char * s ++ OutputStream stream ++ CODE: ++ RETVAL = PerlIO_puts(stream, s); ++ OUTPUT: ++ RETVAL ++ ++We have to use a C section because C has the arguments ++reversed compared to C, and we want to keep the arguments the same. ++ ++Wanting to explore this thoroughly, we want to use the stdio C ++on a PerlIO *. This means we have to ask the perlio system for a stdio ++C: ++ ++ int ++ perliofputs(s, stream) ++ char * s ++ OutputStream stream ++ PREINIT: ++ FILE *fp = PerlIO_findFILE(stream); ++ CODE: ++ if (fp != (FILE*) 0) { ++ RETVAL = fputs(s, fp); ++ } else { ++ RETVAL = -1; ++ } ++ OUTPUT: ++ RETVAL ++ ++Note: C will search the layers for a stdio ++layer. If it can't find one, it will call C to ++generate a new stdio C. Please only call C if ++you want a I C. It will generate one on each call and push a ++new stdio layer. So don't call it repeatedly on the same ++file. C will retrieve the stdio layer once it has been ++generated by C. ++ ++This applies to the perlio system only. For versions before 5.7, ++C is equivalent to C. ++ ++=head2 Troubleshooting these Examples ++ ++As mentioned at the top of this document, if you are having problems with ++these example extensions, you might see if any of these help you. ++ ++=over 4 ++ ++=item * ++ ++In versions of 5.002 prior to the gamma version, the test script in Example ++1 will not function properly. You need to change the "use lib" line to ++read: ++ ++ use lib './blib'; ++ ++=item * ++ ++In versions of 5.002 prior to version 5.002b1h, the test.pl file was not ++automatically created by h2xs. This means that you cannot say "make test" ++to run the test script. You will need to add the following line before the ++"use extension" statement: ++ ++ use lib './blib'; ++ ++=item * ++ ++In versions 5.000 and 5.001, instead of using the above line, you will need ++to use the following line: ++ ++ BEGIN { unshift(@INC, "./blib") } ++ ++=item * ++ ++This document assumes that the executable named "perl" is Perl version 5. ++Some systems may have installed Perl version 5 as "perl5". ++ ++=back ++ ++=head1 See also ++ ++For more information, consult L, L, L, L, ++L, and L ++ ++=head1 Author ++ ++Jeff Okamoto > ++ ++Reviewed and assisted by Dean Roehrich, Ilya Zakharevich, Andreas Koenig, ++and Tim Bunce. ++ ++PerlIO material contributed by Lupe Christoph, with some clarification ++by Nick Ing-Simmons. ++ ++Changes for h2xs as of Perl 5.8.x by Renee Baecker ++ ++This document is now maintained as part of Perl itself. ++ ++=head2 Last Changed ++ ++2020-10-05 +diff --git a/lib/perlxstypemap.pod b/lib/perlxstypemap.pod +new file mode 100644 +index 0000000..7d1f73c +--- /dev/null ++++ b/lib/perlxstypemap.pod +@@ -0,0 +1,711 @@ ++=head1 NAME ++ ++perlxstypemap - Perl XS C/Perl type mapping ++ ++=head1 DESCRIPTION ++ ++The more you think about interfacing between two languages, the more ++you'll realize that the majority of programmer effort has to go into ++converting between the data structures that are native to either of ++the languages involved. This trumps other matter such as differing ++calling conventions because the problem space is so much greater. ++There are simply more ways to shove data into memory than there are ++ways to implement a function call. ++ ++Perl XS' attempt at a solution to this is the concept of typemaps. ++At an abstract level, a Perl XS typemap is nothing but a recipe for ++converting from a certain Perl data structure to a certain C ++data structure and vice versa. Since there can be C types that ++are sufficiently similar to one another to warrant converting with ++the same logic, XS typemaps are represented by a unique identifier, ++henceforth called an B in this document. You can then tell ++the XS compiler that multiple C types are to be mapped with the same ++XS typemap. ++ ++In your XS code, when you define an argument with a C type or when ++you are using a C and an C section together with a ++C return type of your XSUB, it'll be the typemapping mechanism that ++makes this easy. ++ ++=head2 Anatomy of a typemap ++ ++In more practical terms, the typemap is a collection of code ++fragments which are used by the B compiler to map C function ++parameters and values to Perl values. The typemap file may consist ++of three sections labelled C, C, and C. ++An unlabelled initial section is assumed to be a C section. ++The INPUT section tells the compiler how to translate Perl values ++into variables of certain C types. The OUTPUT section tells the ++compiler how to translate the values from certain C types into values ++Perl can understand. The TYPEMAP section tells the compiler which ++of the INPUT and OUTPUT code fragments should be used to map a given ++C type to a Perl value. The section labels C, C, or ++C must begin in the first column on a line by themselves, ++and must be in uppercase. ++ ++Each type of section can appear an arbitrary number of times ++and does not have to appear at all. For example, a typemap may ++commonly lack C and C sections if all it needs to ++do is associate additional C types with core XS types like T_PTROBJ. ++Lines that start with a hash C<#> are considered comments and ignored ++in the C section, but are considered significant in C ++and C. Blank lines are generally ignored. ++ ++Traditionally, typemaps needed to be written to a separate file, ++conventionally called C in a CPAN distribution. With ++ExtUtils::ParseXS (the XS compiler) version 3.12 or better which ++comes with perl 5.16, typemaps can also be embedded directly into ++XS code using a HERE-doc like syntax: ++ ++ TYPEMAP: < can be replaced by other identifiers like with normal ++Perl HERE-docs. All details below about the typemap textual format ++remain valid. ++ ++The C section should contain one pair of C type and ++XS type per line as follows. An example from the core typemap file: ++ ++ TYPEMAP ++ # all variants of char* is handled by the T_PV typemap ++ char * T_PV ++ const char * T_PV ++ unsigned char * T_PV ++ ... ++ ++The C and C sections have identical formats, that is, ++each unindented line starts a new in- or output map respectively. ++A new in- or output map must start with the name of the XS type to ++map on a line by itself, followed by the code that implements it ++indented on the following lines. Example: ++ ++ INPUT ++ T_PV ++ $var = ($type)SvPV_nolen($arg) ++ T_PTR ++ $var = INT2PTR($type,SvIV($arg)) ++ ++We'll get to the meaning of those Perlish-looking variables in a ++little bit. ++ ++Finally, here's an example of the full typemap file for mapping C ++strings of the C type to Perl scalars/strings: ++ ++ TYPEMAP ++ char * T_PV ++ ++ INPUT ++ T_PV ++ $var = ($type)SvPV_nolen($arg) ++ ++ OUTPUT ++ T_PV ++ sv_setpv((SV*)$arg, $var); ++ ++Here's a more complicated example: suppose that you wanted ++C to be blessed into the class C. ++One way to do this is to use underscores (_) to separate package ++names, as follows: ++ ++ typedef struct netconfig * Net_Config; ++ ++And then provide a typemap entry C that maps ++underscores to double-colons (::), and declare C to be of ++that type: ++ ++ TYPEMAP ++ Net_Config T_PTROBJ_SPECIAL ++ ++ INPUT ++ T_PTROBJ_SPECIAL ++ if (sv_derived_from($arg, \"${(my $ntt=$ntype)=~s/_/::/g;\$ntt}\")){ ++ IV tmp = SvIV((SV*)SvRV($arg)); ++ $var = INT2PTR($type, tmp); ++ } ++ else ++ croak(\"$var is not of type ${(my $ntt=$ntype)=~s/_/::/g;\$ntt}\") ++ ++ OUTPUT ++ T_PTROBJ_SPECIAL ++ sv_setref_pv($arg, \"${(my $ntt=$ntype)=~s/_/::/g;\$ntt}\", ++ (void*)$var); ++ ++The INPUT and OUTPUT sections substitute underscores for double-colons ++on the fly, giving the desired effect. This example demonstrates some ++of the power and versatility of the typemap facility. ++ ++The C macro (defined in perl.h) casts an integer to a pointer ++of a given type, taking care of the possible different size of integers ++and pointers. There are also C, C, C macros, ++to map the other way, which may be useful in OUTPUT sections. ++ ++=head2 The Role of the typemap File in Your Distribution ++ ++The default typemap in the F directory of the Perl source ++contains many useful types which can be used by Perl extensions. Some ++extensions define additional typemaps which they keep in their own directory. ++These additional typemaps may reference INPUT and OUTPUT maps in the main ++typemap. The B compiler will allow the extension's own typemap to ++override any mappings which are in the default typemap. Instead of using ++an additional F file, typemaps may be embedded verbatim in XS ++with a heredoc-like syntax. See the documentation on the C XS ++keyword. ++ ++For CPAN distributions, you can assume that the XS types defined by ++the perl core are already available. Additionally, the core typemap ++has default XS types for a large number of C types. For example, if ++you simply return a C from your XSUB, the core typemap will ++have this C type associated with the T_PV XS type. That means your ++C string will be copied into the PV (pointer value) slot of a new scalar ++that will be returned from your XSUB to Perl. ++ ++If you're developing a CPAN distribution using XS, you may add your own ++file called F to the distribution. That file may contain ++typemaps that either map types that are specific to your code or that ++override the core typemap file's mappings for common C types. ++ ++=head2 Sharing typemaps Between CPAN Distributions ++ ++Starting with ExtUtils::ParseXS version 3.13_01 (comes with perl 5.16 ++and better), it is rather easy to share typemap code between multiple ++CPAN distributions. The general idea is to share it as a module that ++offers a certain API and have the dependent modules declare that as a ++built-time requirement and import the typemap into the XS. An example ++of such a typemap-sharing module on CPAN is ++C. Two steps to getting that module's ++typemaps available in your code: ++ ++=over 4 ++ ++=item * ++ ++Declare C as a build-time dependency ++in C (use C), or in your C ++(use C). ++ ++=item * ++ ++Include the following line in the XS section of your XS file: ++(don't break the line) ++ ++ INCLUDE_COMMAND: $^X -MExtUtils::Typemaps::Cmd ++ -e "print embeddable_typemap(q{Basic})" ++ ++=back ++ ++=head2 Writing typemap Entries ++ ++Each INPUT or OUTPUT typemap entry is a double-quoted Perl string that ++will be evaluated in the presence of certain variables to get the ++final C code for mapping a certain C type. ++ ++This means that you can embed Perl code in your typemap (C) code using ++constructs such as ++C<${ perl code that evaluates to scalar reference here }>. A common ++use case is to generate error messages that refer to the true function ++name even when using the ALIAS XS feature: ++ ++ ${ $ALIAS ? \q[GvNAME(CvGV(cv))] : \qq[\"$pname\"] } ++ ++For many typemap examples, refer to the core typemap file that can be ++found in the perl source tree at F. ++ ++The Perl variables that are available for interpolation into typemaps ++are the following: ++ ++=over 4 ++ ++=item * ++ ++I<$var> - the name of the input or output variable, eg. RETVAL for ++return values. ++ ++=item * ++ ++I<$type> - the raw C type of the parameter, any C<:> replaced with ++C<_>. ++e.g. for a type of C, I<$type> is C ++ ++=item * ++ ++I<$ntype> - the supplied type with C<*> replaced with C. ++e.g. for a type of C, I<$ntype> is C ++ ++=item * ++ ++I<$arg> - the stack entry, that the parameter is input from or output ++to, e.g. C ++ ++=item * ++ ++I<$argoff> - the argument stack offset of the argument. ie. 0 for the ++first argument, etc. ++ ++=item * ++ ++I<$pname> - the full name of the XSUB, with including the C ++name, with any C stripped. This is the non-ALIAS name. ++ ++=item * ++ ++I<$Package> - the package specified by the most recent C ++keyword. ++ ++=item * ++ ++I<$ALIAS> - non-zero if the current XSUB has any aliases declared with ++C. ++ ++=back ++ ++=head2 Full Listing of Core Typemaps ++ ++Each C type is represented by an entry in the typemap file that ++is responsible for converting perl variables (SV, AV, HV, CV, etc.) ++to and from that type. The following sections list all XS types ++that come with perl by default. ++ ++=over 4 ++ ++=item T_SV ++ ++This simply passes the C representation of the Perl variable (an SV*) ++in and out of the XS layer. This can be used if the C code wants ++to deal directly with the Perl variable. ++ ++=item T_SVREF ++ ++Used to pass in and return a reference to an SV. ++ ++Note that this typemap does not decrement the reference count ++when returning the reference to an SV*. ++See also: T_SVREF_REFCOUNT_FIXED ++ ++=item T_SVREF_FIXED ++ ++Used to pass in and return a reference to an SV. ++This is a fixed ++variant of T_SVREF that decrements the refcount appropriately ++when returning a reference to an SV*. Introduced in perl 5.15.4. ++ ++=item T_AVREF ++ ++From the perl level this is a reference to a perl array. ++From the C level this is a pointer to an AV. ++ ++Note that this typemap does not decrement the reference count ++when returning an AV*. See also: T_AVREF_REFCOUNT_FIXED ++ ++=item T_AVREF_REFCOUNT_FIXED ++ ++From the perl level this is a reference to a perl array. ++From the C level this is a pointer to an AV. This is a fixed ++variant of T_AVREF that decrements the refcount appropriately ++when returning an AV*. Introduced in perl 5.15.4. ++ ++=item T_HVREF ++ ++From the perl level this is a reference to a perl hash. ++From the C level this is a pointer to an HV. ++ ++Note that this typemap does not decrement the reference count ++when returning an HV*. See also: T_HVREF_REFCOUNT_FIXED ++ ++=item T_HVREF_REFCOUNT_FIXED ++ ++From the perl level this is a reference to a perl hash. ++From the C level this is a pointer to an HV. This is a fixed ++variant of T_HVREF that decrements the refcount appropriately ++when returning an HV*. Introduced in perl 5.15.4. ++ ++=item T_CVREF ++ ++From the perl level this is a reference to a perl subroutine ++(e.g. $sub = sub { 1 };). From the C level this is a pointer ++to a CV. ++ ++Note that this typemap does not decrement the reference count ++when returning an HV*. See also: T_HVREF_REFCOUNT_FIXED ++ ++=item T_CVREF_REFCOUNT_FIXED ++ ++From the perl level this is a reference to a perl subroutine ++(e.g. $sub = sub { 1 };). From the C level this is a pointer ++to a CV. ++ ++This is a fixed ++variant of T_HVREF that decrements the refcount appropriately ++when returning an HV*. Introduced in perl 5.15.4. ++ ++=item T_SYSRET ++ ++The T_SYSRET typemap is used to process return values from system calls. ++It is only meaningful when passing values from C to perl (there is ++no concept of passing a system return value from Perl to C). ++ ++System calls return -1 on error (setting ERRNO with the reason) ++and (usually) 0 on success. If the return value is -1 this typemap ++returns C. If the return value is not -1, this typemap ++translates a 0 (perl false) to "0 but true" (which ++is perl true) or returns the value itself, to indicate that the ++command succeeded. ++ ++The L module makes extensive use of this type. ++ ++=item T_UV ++ ++An unsigned integer. ++ ++=item T_IV ++ ++A signed integer. This is cast to the required integer type when ++passed to C and converted to an IV when passed back to Perl. ++ ++=item T_INT ++ ++A signed integer. This typemap converts the Perl value to a native ++integer type (the C type on the current platform). When returning ++the value to perl it is processed in the same way as for T_IV. ++ ++Its behaviour is identical to using an C type in XS with T_IV. ++ ++=item T_ENUM ++ ++An enum value. Used to transfer an enum component ++from C. There is no reason to pass an enum value to C since ++it is stored as an IV inside perl. ++ ++=item T_BOOL ++ ++A boolean type. This can be used to pass true and false values to and ++from C. ++ ++=item T_U_INT ++ ++This is for unsigned integers. It is equivalent to using T_UV ++but explicitly casts the variable to type C. ++The default type for C is T_UV. ++ ++=item T_SHORT ++ ++Short integers. This is equivalent to T_IV but explicitly casts ++the return to type C. The default typemap for C ++is T_IV. ++ ++=item T_U_SHORT ++ ++Unsigned short integers. This is equivalent to T_UV but explicitly ++casts the return to type C. The default typemap for ++C is T_UV. ++ ++T_U_SHORT is used for type C in the standard typemap. ++ ++=item T_LONG ++ ++Long integers. This is equivalent to T_IV but explicitly casts ++the return to type C. The default typemap for C ++is T_IV. ++ ++=item T_U_LONG ++ ++Unsigned long integers. This is equivalent to T_UV but explicitly ++casts the return to type C. The default typemap for ++C is T_UV. ++ ++T_U_LONG is used for type C in the standard typemap. ++ ++=item T_CHAR ++ ++Single 8-bit characters. ++ ++=item T_U_CHAR ++ ++An unsigned byte. ++ ++=item T_FLOAT ++ ++A floating point number. This typemap guarantees to return a variable ++cast to a C. ++ ++=item T_NV ++ ++A Perl floating point number. Similar to T_IV and T_UV in that the ++return type is cast to the requested numeric type rather than ++to a specific type. ++ ++=item T_DOUBLE ++ ++A double precision floating point number. This typemap guarantees to ++return a variable cast to a C. ++ ++=item T_PV ++ ++A string (char *). ++ ++=item T_PTR ++ ++A memory address (pointer). Typically associated with a C ++type. ++ ++=item T_PTRREF ++ ++Similar to T_PTR except that the pointer is stored in a scalar and the ++reference to that scalar is returned to the caller. This can be used ++to hide the actual pointer value from the programmer since it is usually ++not required directly from within perl. ++ ++The typemap checks that a scalar reference is passed from perl to XS. ++ ++=item T_PTROBJ ++ ++Similar to T_PTRREF except that the reference is blessed into a class. ++This allows the pointer to be used as an object. Most commonly used to ++deal with C structs. The typemap checks that the perl object passed ++into the XS routine is of the correct class (or part of a subclass). ++ ++The pointer is blessed into a class that is derived from the name ++of type of the pointer but with all '*' in the name replaced with ++'Ptr'. ++ ++For C XSUBs only, a T_PTROBJ is optimized to a T_PTRREF. This means ++the class check is skipped. ++ ++=item T_REF_IV_REF ++ ++NOT YET ++ ++=item T_REF_IV_PTR ++ ++Similar to T_PTROBJ in that the pointer is blessed into a scalar object. ++The difference is that when the object is passed back into XS it must be ++of the correct type (inheritance is not supported) while T_PTROBJ supports ++inheritance. ++ ++The pointer is blessed into a class that is derived from the name ++of type of the pointer but with all '*' in the name replaced with ++'Ptr'. ++ ++For C XSUBs only, a T_REF_IV_PTR is optimized to a T_PTRREF. This ++means the class check is skipped. ++ ++=item T_PTRDESC ++ ++NOT YET ++ ++=item T_REFREF ++ ++Similar to T_PTRREF, except the pointer stored in the referenced scalar ++is dereferenced and copied to the output variable. This means that ++T_REFREF is to T_PTRREF as T_OPAQUE is to T_OPAQUEPTR. All clear? ++ ++Only the INPUT part of this is implemented (Perl to XSUB) and there ++are no known users in core or on CPAN. ++ ++=item T_REFOBJ ++ ++Like T_REFREF, except it does strict type checking (inheritance is not ++supported). ++ ++For C XSUBs only, a T_REFOBJ is optimized to a T_REFREF. This means ++the class check is skipped. ++ ++=item T_OPAQUEPTR ++ ++This can be used to store bytes in the string component of the ++SV. Here the representation of the data is irrelevant to perl and the ++bytes themselves are just stored in the SV. It is assumed that the C ++variable is a pointer (the bytes are copied from that memory ++location). If the pointer is pointing to something that is ++represented by 8 bytes then those 8 bytes are stored in the SV (and ++length() will report a value of 8). This entry is similar to T_OPAQUE. ++ ++In principle the unpack() command can be used to convert the bytes ++back to a number (if the underlying type is known to be a number). ++ ++This entry can be used to store a C structure (the number ++of bytes to be copied is calculated using the C C function) ++and can be used as an alternative to T_PTRREF without having to worry ++about a memory leak (since Perl will clean up the SV). ++ ++=item T_OPAQUE ++ ++This can be used to store data from non-pointer types in the string ++part of an SV. It is similar to T_OPAQUEPTR except that the ++typemap retrieves the pointer directly rather than assuming it ++is being supplied. For example, if an integer is imported into ++Perl using T_OPAQUE rather than T_IV the underlying bytes representing ++the integer will be stored in the SV but the actual integer value will ++not be available. i.e. The data is opaque to perl. ++ ++The data may be retrieved using the C function if the ++underlying type of the byte stream is known. ++ ++T_OPAQUE supports input and output of simple types. ++T_OPAQUEPTR can be used to pass these bytes back into C if a pointer ++is acceptable. ++ ++=item Implicit array ++ ++xsubpp supports a special syntax for returning ++packed C arrays to perl. If the XS return type is given as ++ ++ array(type, nelem) ++ ++xsubpp will copy the contents of C bytes from ++RETVAL to an SV and push it onto the stack. This is only really useful ++if the number of items to be returned is known at compile time and you ++don't mind having a string of bytes in your SV. Use T_ARRAY to push a ++variable number of arguments onto the return stack (they won't be ++packed as a single string though). ++ ++This is similar to using T_OPAQUEPTR but can be used to process more ++than one element. ++ ++=item T_PACKED ++ ++Calls user-supplied functions for conversion. For C ++(XSUB to Perl), a function named C is called ++with the output Perl scalar and the C variable to convert from. ++C<$ntype> is the normalized C type that is to be mapped to ++Perl. Normalized means that all C<*> are replaced by the ++string C. The return value of the function is ignored. ++ ++Conversely for C (Perl to XSUB) mapping, the ++function named C is called with the input Perl ++scalar as argument and the return value is cast to the mapped ++C type and assigned to the output C variable. ++ ++An example conversion function for a typemapped struct ++C might be: ++ ++ static void ++ XS_pack_foo_tPtr(SV *out, foo_t *in) ++ { ++ dTHX; /* alas, signature does not include pTHX_ */ ++ HV* hash = newHV(); ++ hv_stores(hash, "int_member", newSViv(in->int_member)); ++ hv_stores(hash, "float_member", newSVnv(in->float_member)); ++ /* ... */ ++ ++ /* mortalize as thy stack is not refcounted */ ++ sv_setsv(out, sv_2mortal(newRV_noinc((SV*)hash))); ++ } ++ ++The conversion from Perl to C is left as an exercise to the reader, ++but the prototype would be: ++ ++ static foo_t * ++ XS_unpack_foo_tPtr(SV *in); ++ ++Instead of an actual C function that has to fetch the thread context ++using C, you can define macros of the same name and avoid the ++overhead. Also, keep in mind to possibly free the memory allocated by ++C. ++ ++=item T_PACKEDARRAY ++ ++T_PACKEDARRAY is similar to T_PACKED. In fact, the C (Perl ++to XSUB) typemap is identical, but the C typemap passes ++an additional argument to the C function. This ++third parameter indicates the number of elements in the output ++so that the function can handle C arrays sanely. The variable ++needs to be declared by the user and must have the name ++C where C<$ntype> is the normalized C type name ++as explained above. The signature of the function would be for ++the example above and C: ++ ++ static void ++ XS_pack_foo_tPtrPtr(SV *out, foo_t *in, UV count_foo_tPtrPtr); ++ ++The type of the third parameter is arbitrary as far as the typemap ++is concerned. It just has to be in line with the declared variable. ++ ++Of course, unless you know the number of elements in the ++C C array, within your XSUB, the return value from ++C will be hard to decipher. ++Since the details are all up to the XS author (the typemap user), ++there are several solutions, none of which particularly elegant. ++The most commonly seen solution has been to allocate memory for ++N+1 pointers and assign C to the (N+1)th to facilitate ++iteration. ++ ++Alternatively, using a customized typemap for your purposes in ++the first place is probably preferable. ++ ++=item T_DATAUNIT ++ ++NOT YET ++ ++=item T_CALLBACK ++ ++NOT YET ++ ++=item T_ARRAY ++ ++This is used to convert the perl argument list to a C array ++and for pushing the contents of a C array onto the perl ++argument stack. ++ ++The usual calling signature is ++ ++ @out = array_func( @in ); ++ ++Any number of arguments can occur in the list before the array but ++the input and output arrays must be the last elements in the list. ++ ++When used to pass a perl list to C the XS writer must provide a ++function (named after the array type but with 'Ptr' substituted for ++'*') to allocate the memory required to hold the list. A pointer ++should be returned. It is up to the XS writer to free the memory on ++exit from the function. The variable C is set to the number ++of elements in the new array. ++ ++When returning a C array to Perl the XS writer must provide an integer ++variable called C containing the number of elements in the ++array. This is used to determine how many elements should be pushed ++onto the return argument stack. This is not required on input since ++Perl knows how many arguments are on the stack when the routine is ++called. Ordinarily this variable would be called C. ++ ++Additionally, the type of each element is determined from the type of ++the array. If the array uses type C xsubpp will ++automatically work out that it contains variables of type C and ++use that typemap entry to perform the copy of each element. All ++pointer '*' and 'Array' tags are removed from the name to determine ++the subtype. ++ ++=item T_STDIO ++ ++This is used for passing perl filehandles to and from C using ++C structures. ++ ++=item T_INOUT ++ ++This is used for passing perl filehandles to and from C using ++C structures. The file handle can used for reading and ++writing. This corresponds to the C<+E> mode, see also T_IN ++and T_OUT. ++ ++See L for more information on the Perl IO abstraction ++layer. Perl must have been built with C<-Duseperlio>. ++ ++There is no check to assert that the filehandle passed from Perl ++to C was created with the right C mode. ++ ++Hint: The L tutorial covers the T_INOUT, T_IN, and T_OUT ++XS types nicely. ++ ++=item T_IN ++ ++Same as T_INOUT, but the filehandle that is returned from C to Perl ++can only be used for reading (mode C>). ++ ++=item T_OUT ++ ++Same as T_INOUT, but the filehandle that is returned from C to Perl ++is set to use the open mode C<+E>. ++ ++=back ++ +-- +2.31.1 + diff --git a/ExtUtils-ParseXS-3.51.tar.gz b/ExtUtils-ParseXS-3.51.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..f0d30bc0d425d053a82091b58a0ce6aeb057bffc GIT binary patch literal 71496 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 z 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

<*sa2<%NEqCRD|;snw(skfwz2C(r2SV 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 - 3.51-1 +- Updated to version 3.51 to fix xxxxxxxxx + + * Thu Apr 13 2023 Yuanhong Peng - 3.45-2 - Refactor the specfile @@ -75,4 +80,4 @@ make test - rebuild with perl 5.36.0 * Mon Apr 18 2022 gcdota930915 - 3.44-1 -- Init from upstream version 3.44 +- Init from upstream version 3.44 \ No newline at end of file -- Gitee