perlfaq update from From Tom Christiansen and Nathan Torkington
[p5sagit/p5-mst-13.2.git] / pod / perlxs.pod
CommitLineData
a0d0e21e 1=head1 NAME
2
8e07c86e 3perlxs - XS language reference manual
a0d0e21e 4
5=head1 DESCRIPTION
6
7=head2 Introduction
8
9XS is a language used to create an extension interface
10between Perl and some C library which one wishes to use with
11Perl. The XS interface is combined with the library to
12create a new library which can be linked to Perl. An B<XSUB>
13is a function in the XS language and is the core component
14of the Perl application interface.
15
16The XS compiler is called B<xsubpp>. This compiler will embed
17the constructs necessary to let an XSUB, which is really a C
18function in disguise, manipulate Perl values and creates the
19glue necessary to let Perl access the XSUB. The compiler
20uses B<typemaps> to determine how to map C function parameters
21and variables to Perl values. The default typemap handles
22many common C types. A supplement typemap must be created
23to handle special structures and types for the library being
24linked.
25
cb1a09d0 26See L<perlxstut> for a tutorial on the whole extension creation process.
8e07c86e 27
7b8d334a 28Note: For many extensions, Dave Beazley's SWIG system provides a
29significantly more convenient mechanism for creating the XS glue
30code. See L<http://www.cs.utah.edu/~beazley/SWIG> for more
31information.
32
8e07c86e 33=head2 On The Road
34
a5f75d66 35Many of the examples which follow will concentrate on creating an interface
36between Perl and the ONC+ RPC bind library functions. The rpcb_gettime()
37function is used to demonstrate many features of the XS language. This
38function has two parameters; the first is an input parameter and the second
39is an output parameter. The function also returns a status value.
a0d0e21e 40
41 bool_t rpcb_gettime(const char *host, time_t *timep);
42
43From C this function will be called with the following
44statements.
45
46 #include <rpc/rpc.h>
47 bool_t status;
48 time_t timep;
49 status = rpcb_gettime( "localhost", &timep );
50
51If an XSUB is created to offer a direct translation between this function
52and Perl, then this XSUB will be used from Perl with the following code.
53The $status and $timep variables will contain the output of the function.
54
55 use RPC;
56 $status = rpcb_gettime( "localhost", $timep );
57
58The following XS file shows an XS subroutine, or XSUB, which
59demonstrates one possible interface to the rpcb_gettime()
60function. This XSUB represents a direct translation between
61C and Perl and so preserves the interface even from Perl.
62This XSUB will be invoked from Perl with the usage shown
63above. Note that the first three #include statements, for
64C<EXTERN.h>, C<perl.h>, and C<XSUB.h>, will always be present at the
65beginning of an XS file. This approach and others will be
66expanded later in this document.
67
68 #include "EXTERN.h"
69 #include "perl.h"
70 #include "XSUB.h"
71 #include <rpc/rpc.h>
72
73 MODULE = RPC PACKAGE = RPC
74
75 bool_t
76 rpcb_gettime(host,timep)
8e07c86e 77 char *host
78 time_t &timep
a0d0e21e 79 OUTPUT:
80 timep
81
82Any extension to Perl, including those containing XSUBs,
83should have a Perl module to serve as the bootstrap which
84pulls the extension into Perl. This module will export the
85extension's functions and variables to the Perl program and
86will cause the extension's XSUBs to be linked into Perl.
87The following module will be used for most of the examples
88in this document and should be used from Perl with the C<use>
89command as shown earlier. Perl modules are explained in
90more detail later in this document.
91
92 package RPC;
93
94 require Exporter;
95 require DynaLoader;
96 @ISA = qw(Exporter DynaLoader);
97 @EXPORT = qw( rpcb_gettime );
98
99 bootstrap RPC;
100 1;
101
102Throughout this document a variety of interfaces to the rpcb_gettime()
103XSUB will be explored. The XSUBs will take their parameters in different
104orders or will take different numbers of parameters. In each case the
105XSUB is an abstraction between Perl and the real C rpcb_gettime()
106function, and the XSUB must always ensure that the real rpcb_gettime()
107function is called with the correct parameters. This abstraction will
108allow the programmer to create a more Perl-like interface to the C
109function.
110
111=head2 The Anatomy of an XSUB
112
8e07c86e 113The following XSUB allows a Perl program to access a C library function
114called sin(). The XSUB will imitate the C function which takes a single
115argument and returns a single value.
a0d0e21e 116
117 double
118 sin(x)
8e07c86e 119 double x
a0d0e21e 120
8e07c86e 121When using C pointers the indirection operator C<*> should be considered
122part of the type and the address operator C<&> should be considered part of
123the variable, as is demonstrated in the rpcb_gettime() function above. See
124the section on typemaps for more about handling qualifiers and unary
125operators in C types.
a0d0e21e 126
a0d0e21e 127The function name and the return type must be placed on
128separate lines.
129
130 INCORRECT CORRECT
131
132 double sin(x) double
8e07c86e 133 double x sin(x)
134 double x
a0d0e21e 135
c07a80fd 136The function body may be indented or left-adjusted. The following example
137shows a function with its body left-adjusted. Most examples in this
138document will indent the body.
139
140 CORRECT
141
142 double
143 sin(x)
144 double x
145
a0d0e21e 146=head2 The Argument Stack
147
148The argument stack is used to store the values which are
149sent as parameters to the XSUB and to store the XSUB's
150return value. In reality all Perl functions keep their
151values on this stack at the same time, each limited to its
152own range of positions on the stack. In this document the
153first position on that stack which belongs to the active
154function will be referred to as position 0 for that function.
155
8e07c86e 156XSUBs refer to their stack arguments with the macro B<ST(x)>, where I<x>
157refers to a position in this XSUB's part of the stack. Position 0 for that
a0d0e21e 158function would be known to the XSUB as ST(0). The XSUB's incoming
159parameters and outgoing return values always begin at ST(0). For many
160simple cases the B<xsubpp> compiler will generate the code necessary to
161handle the argument stack by embedding code fragments found in the
162typemaps. In more complex cases the programmer must supply the code.
163
164=head2 The RETVAL Variable
165
166The RETVAL variable is a magic variable which always matches
167the return type of the C library function. The B<xsubpp> compiler will
168supply this variable in each XSUB and by default will use it to hold the
169return value of the C library function being called. In simple cases the
170value of RETVAL will be placed in ST(0) of the argument stack where it can
171be received by Perl as the return value of the XSUB.
172
173If the XSUB has a return type of C<void> then the compiler will
174not supply a RETVAL variable for that function. When using
e7ea3e70 175the PPCODE: directive the RETVAL variable is not needed, unless used
176explicitly.
177
178If PPCODE: directive is not used, C<void> return value should be used
179only for subroutines which do not return a value, I<even if> CODE:
54310121 180directive is used which sets ST(0) explicitly.
e7ea3e70 181
182Older versions of this document recommended to use C<void> return
183value in such cases. It was discovered that this could lead to
184segfaults in cases when XSUB was I<truely> C<void>. This practice is
185now deprecated, and may be not supported at some future version. Use
186the return value C<SV *> in such cases. (Currently C<xsubpp> contains
187some heuristic code which tries to disambiguate between "truely-void"
188and "old-practice-declared-as-void" functions. Hence your code is at
189mercy of this heuristics unless you use C<SV *> as return value.)
a0d0e21e 190
191=head2 The MODULE Keyword
192
193The MODULE keyword is used to start the XS code and to
194specify the package of the functions which are being
195defined. All text preceding the first MODULE keyword is
196considered C code and is passed through to the output
197untouched. Every XS module will have a bootstrap function
198which is used to hook the XSUBs into Perl. The package name
199of this bootstrap function will match the value of the last
200MODULE statement in the XS source files. The value of
201MODULE should always remain constant within the same XS
202file, though this is not required.
203
204The following example will start the XS code and will place
205all functions in a package named RPC.
206
207 MODULE = RPC
208
209=head2 The PACKAGE Keyword
210
211When functions within an XS source file must be separated into packages
212the PACKAGE keyword should be used. This keyword is used with the MODULE
213keyword and must follow immediately after it when used.
214
215 MODULE = RPC PACKAGE = RPC
216
217 [ XS code in package RPC ]
218
219 MODULE = RPC PACKAGE = RPCB
220
221 [ XS code in package RPCB ]
222
223 MODULE = RPC PACKAGE = RPC
224
225 [ XS code in package RPC ]
226
227Although this keyword is optional and in some cases provides redundant
228information it should always be used. This keyword will ensure that the
229XSUBs appear in the desired package.
230
231=head2 The PREFIX Keyword
232
233The PREFIX keyword designates prefixes which should be
234removed from the Perl function names. If the C function is
235C<rpcb_gettime()> and the PREFIX value is C<rpcb_> then Perl will
236see this function as C<gettime()>.
237
238This keyword should follow the PACKAGE keyword when used.
239If PACKAGE is not used then PREFIX should follow the MODULE
240keyword.
241
242 MODULE = RPC PREFIX = rpc_
243
244 MODULE = RPC PACKAGE = RPCB PREFIX = rpcb_
245
246=head2 The OUTPUT: Keyword
247
248The OUTPUT: keyword indicates that certain function parameters should be
249updated (new values made visible to Perl) when the XSUB terminates or that
250certain values should be returned to the calling Perl function. For
251simple functions, such as the sin() function above, the RETVAL variable is
252automatically designated as an output value. In more complex functions
253the B<xsubpp> compiler will need help to determine which variables are output
254variables.
255
256This keyword will normally be used to complement the CODE: keyword.
257The RETVAL variable is not recognized as an output variable when the
258CODE: keyword is present. The OUTPUT: keyword is used in this
259situation to tell the compiler that RETVAL really is an output
260variable.
261
262The OUTPUT: keyword can also be used to indicate that function parameters
263are output variables. This may be necessary when a parameter has been
264modified within the function and the programmer would like the update to
8e07c86e 265be seen by Perl.
a0d0e21e 266
267 bool_t
268 rpcb_gettime(host,timep)
8e07c86e 269 char *host
270 time_t &timep
a0d0e21e 271 OUTPUT:
272 timep
273
274The OUTPUT: keyword will also allow an output parameter to
275be mapped to a matching piece of code rather than to a
ef50df4b 276typemap.
a0d0e21e 277
278 bool_t
279 rpcb_gettime(host,timep)
8e07c86e 280 char *host
281 time_t &timep
a0d0e21e 282 OUTPUT:
ef50df4b 283 timep sv_setnv(ST(1), (double)timep);
284
285B<xsubpp> emits an automatic C<SvSETMAGIC()> for all parameters in the
286OUTPUT section of the XSUB, except RETVAL. This is the usually desired
287behavior, as it takes care of properly invoking 'set' magic on output
288parameters (needed for hash or array element parameters that must be
289created if they didn't exist). If for some reason, this behavior is
290not desired, the OUTPUT section may contain a C<SETMAGIC: DISABLE> line
291to disable it for the remainder of the parameters in the OUTPUT section.
292Likewise, C<SETMAGIC: ENABLE> can be used to reenable it for the
293remainder of the OUTPUT section. See L<perlguts> for more details
294about 'set' magic.
a0d0e21e 295
296=head2 The CODE: Keyword
297
298This keyword is used in more complicated XSUBs which require
299special handling for the C function. The RETVAL variable is
300available but will not be returned unless it is specified
301under the OUTPUT: keyword.
302
303The following XSUB is for a C function which requires special handling of
304its parameters. The Perl usage is given first.
305
306 $status = rpcb_gettime( "localhost", $timep );
307
54310121 308The XSUB follows.
a0d0e21e 309
d1b91892 310 bool_t
311 rpcb_gettime(host,timep)
8e07c86e 312 char *host
313 time_t timep
a0d0e21e 314 CODE:
315 RETVAL = rpcb_gettime( host, &timep );
316 OUTPUT:
317 timep
318 RETVAL
319
c07a80fd 320=head2 The INIT: Keyword
321
322The INIT: keyword allows initialization to be inserted into the XSUB before
323the compiler generates the call to the C function. Unlike the CODE: keyword
324above, this keyword does not affect the way the compiler handles RETVAL.
325
326 bool_t
327 rpcb_gettime(host,timep)
328 char *host
329 time_t &timep
330 INIT:
331 printf("# Host is %s\n", host );
332 OUTPUT:
333 timep
a0d0e21e 334
335=head2 The NO_INIT Keyword
336
337The NO_INIT keyword is used to indicate that a function
54310121 338parameter is being used only as an output value. The B<xsubpp>
a0d0e21e 339compiler will normally generate code to read the values of
340all function parameters from the argument stack and assign
341them to C variables upon entry to the function. NO_INIT
342will tell the compiler that some parameters will be used for
343output rather than for input and that they will be handled
344before the function terminates.
345
346The following example shows a variation of the rpcb_gettime() function.
54310121 347This function uses the timep variable only as an output variable and does
a0d0e21e 348not care about its initial contents.
349
350 bool_t
351 rpcb_gettime(host,timep)
8e07c86e 352 char *host
353 time_t &timep = NO_INIT
a0d0e21e 354 OUTPUT:
355 timep
356
357=head2 Initializing Function Parameters
358
359Function parameters are normally initialized with their
360values from the argument stack. The typemaps contain the
361code segments which are used to transfer the Perl values to
362the C parameters. The programmer, however, is allowed to
7ad6fb0b 363override the typemaps and supply alternate (or additional)
364initialization code.
a0d0e21e 365
366The following code demonstrates how to supply initialization code for
7ad6fb0b 367function parameters. The initialization code is eval'd within double
368quotes by the compiler before it is added to the output so anything
369which should be interpreted literally [mainly C<$>, C<@>, or C<\\>]
370must be protected with backslashes. The variables C<$var>, C<$arg>,
371and C<$type> can be used as in typemaps.
a0d0e21e 372
373 bool_t
374 rpcb_gettime(host,timep)
7ad6fb0b 375 char *host = (char *)SvPV($arg,na);
8e07c86e 376 time_t &timep = 0;
a0d0e21e 377 OUTPUT:
378 timep
379
380This should not be used to supply default values for parameters. One
381would normally use this when a function parameter must be processed by
382another library function before it can be used. Default parameters are
383covered in the next section.
384
7ad6fb0b 385If the initialization begins with C<=>, then it is output on
386the same line where the input variable is declared. If the
387initialization begins with C<;> or C<+>, then it is output after
388all of the input variables have been declared. The C<=> and C<;>
389cases replace the initialization normally supplied from the typemap.
390For the C<+> case, the initialization from the typemap will preceed
391the initialization code included after the C<+>. A global
392variable, C<%v>, is available for the truely rare case where
393information from one initialization is needed in another
394initialization.
395
396 bool_t
397 rpcb_gettime(host,timep)
398 time_t &timep ; /*\$v{time}=@{[$v{time}=$arg]}*/
399 char *host + SvOK($v{time}) ? SvPV($arg,na) : NULL;
400 OUTPUT:
401 timep
402
a0d0e21e 403=head2 Default Parameter Values
404
405Default values can be specified for function parameters by
406placing an assignment statement in the parameter list. The
407default value may be a number or a string. Defaults should
408always be used on the right-most parameters only.
409
410To allow the XSUB for rpcb_gettime() to have a default host
411value the parameters to the XSUB could be rearranged. The
412XSUB will then call the real rpcb_gettime() function with
413the parameters in the correct order. Perl will call this
414XSUB with either of the following statements.
415
416 $status = rpcb_gettime( $timep, $host );
417
418 $status = rpcb_gettime( $timep );
419
420The XSUB will look like the code which follows. A CODE:
421block is used to call the real rpcb_gettime() function with
422the parameters in the correct order for that function.
423
424 bool_t
425 rpcb_gettime(timep,host="localhost")
8e07c86e 426 char *host
427 time_t timep = NO_INIT
a0d0e21e 428 CODE:
429 RETVAL = rpcb_gettime( host, &timep );
430 OUTPUT:
431 timep
432 RETVAL
433
c07a80fd 434=head2 The PREINIT: Keyword
435
436The PREINIT: keyword allows extra variables to be declared before the
437typemaps are expanded. If a variable is declared in a CODE: block then that
438variable will follow any typemap code. This may result in a C syntax
439error. To force the variable to be declared before the typemap code, place
440it into a PREINIT: block. The PREINIT: keyword may be used one or more
441times within an XSUB.
442
443The following examples are equivalent, but if the code is using complex
444typemaps then the first example is safer.
445
446 bool_t
447 rpcb_gettime(timep)
448 time_t timep = NO_INIT
449 PREINIT:
450 char *host = "localhost";
451 CODE:
452 RETVAL = rpcb_gettime( host, &timep );
453 OUTPUT:
454 timep
455 RETVAL
456
457A correct, but error-prone example.
458
459 bool_t
460 rpcb_gettime(timep)
461 time_t timep = NO_INIT
462 CODE:
463 char *host = "localhost";
464 RETVAL = rpcb_gettime( host, &timep );
465 OUTPUT:
466 timep
467 RETVAL
468
84287afe 469=head2 The SCOPE: Keyword
470
471The SCOPE: keyword allows scoping to be enabled for a particular XSUB. If
472enabled, the XSUB will invoke ENTER and LEAVE automatically.
473
474To support potentially complex type mappings, if a typemap entry used
475by this XSUB contains a comment like C</*scope*/> then scoping will
476automatically be enabled for that XSUB.
477
478To enable scoping:
479
480 SCOPE: ENABLE
481
482To disable scoping:
483
484 SCOPE: DISABLE
485
c07a80fd 486=head2 The INPUT: Keyword
487
488The XSUB's parameters are usually evaluated immediately after entering the
489XSUB. The INPUT: keyword can be used to force those parameters to be
490evaluated a little later. The INPUT: keyword can be used multiple times
491within an XSUB and can be used to list one or more input variables. This
492keyword is used with the PREINIT: keyword.
493
494The following example shows how the input parameter C<timep> can be
495evaluated late, after a PREINIT.
496
497 bool_t
498 rpcb_gettime(host,timep)
499 char *host
500 PREINIT:
501 time_t tt;
502 INPUT:
503 time_t timep
504 CODE:
505 RETVAL = rpcb_gettime( host, &tt );
506 timep = tt;
507 OUTPUT:
508 timep
509 RETVAL
510
511The next example shows each input parameter evaluated late.
512
513 bool_t
514 rpcb_gettime(host,timep)
515 PREINIT:
516 time_t tt;
517 INPUT:
518 char *host
519 PREINIT:
520 char *h;
521 INPUT:
522 time_t timep
523 CODE:
524 h = host;
525 RETVAL = rpcb_gettime( h, &tt );
526 timep = tt;
527 OUTPUT:
528 timep
529 RETVAL
530
a0d0e21e 531=head2 Variable-length Parameter Lists
532
533XSUBs can have variable-length parameter lists by specifying an ellipsis
534C<(...)> in the parameter list. This use of the ellipsis is similar to that
535found in ANSI C. The programmer is able to determine the number of
536arguments passed to the XSUB by examining the C<items> variable which the
537B<xsubpp> compiler supplies for all XSUBs. By using this mechanism one can
538create an XSUB which accepts a list of parameters of unknown length.
539
540The I<host> parameter for the rpcb_gettime() XSUB can be
541optional so the ellipsis can be used to indicate that the
542XSUB will take a variable number of parameters. Perl should
d1b91892 543be able to call this XSUB with either of the following statements.
a0d0e21e 544
545 $status = rpcb_gettime( $timep, $host );
546
547 $status = rpcb_gettime( $timep );
548
549The XS code, with ellipsis, follows.
550
551 bool_t
552 rpcb_gettime(timep, ...)
8e07c86e 553 time_t timep = NO_INIT
c07a80fd 554 PREINIT:
a0d0e21e 555 char *host = "localhost";
c07a80fd 556 CODE:
557 if( items > 1 )
558 host = (char *)SvPV(ST(1), na);
559 RETVAL = rpcb_gettime( host, &timep );
a0d0e21e 560 OUTPUT:
561 timep
562 RETVAL
563
cfc02341 564=head2 The C_ARGS: Keyword
565
566The C_ARGS: keyword allows creating of XSUBS which have different
567calling sequence from Perl than from C, without a need to write
568CODE: or CPPCODE: section. The contents of the C_ARGS: paragraph is
569put as the argument to the called C function without any change.
570
571For example, suppose that C function is declared as
572
573 symbolic nth_derivative(int n, symbolic function, int flags);
574
575and that the default flags are kept in a global C variable
576C<default_flags>. Suppose that you want to create an interface which
577is called as
578
579 $second_deriv = $function->nth_derivative(2);
580
581To do this, declare the XSUB as
582
583 symbolic
584 nth_derivative(function, n)
585 symbolic function
586 int n
587 C_ARGS:
588 n, function, default_flags
589
a0d0e21e 590=head2 The PPCODE: Keyword
591
592The PPCODE: keyword is an alternate form of the CODE: keyword and is used
593to tell the B<xsubpp> compiler that the programmer is supplying the code to
d1b91892 594control the argument stack for the XSUBs return values. Occasionally one
a0d0e21e 595will want an XSUB to return a list of values rather than a single value.
596In these cases one must use PPCODE: and then explicitly push the list of
597values on the stack. The PPCODE: and CODE: keywords are not used
598together within the same XSUB.
599
600The following XSUB will call the C rpcb_gettime() function
601and will return its two output values, timep and status, to
602Perl as a single list.
603
d1b91892 604 void
605 rpcb_gettime(host)
8e07c86e 606 char *host
c07a80fd 607 PREINIT:
a0d0e21e 608 time_t timep;
609 bool_t status;
c07a80fd 610 PPCODE:
a0d0e21e 611 status = rpcb_gettime( host, &timep );
924508f0 612 EXTEND(SP, 2);
cb1a09d0 613 PUSHs(sv_2mortal(newSViv(status)));
614 PUSHs(sv_2mortal(newSViv(timep)));
a0d0e21e 615
616Notice that the programmer must supply the C code necessary
617to have the real rpcb_gettime() function called and to have
618the return values properly placed on the argument stack.
619
620The C<void> return type for this function tells the B<xsubpp> compiler that
621the RETVAL variable is not needed or used and that it should not be created.
622In most scenarios the void return type should be used with the PPCODE:
623directive.
624
625The EXTEND() macro is used to make room on the argument
626stack for 2 return values. The PPCODE: directive causes the
924508f0 627B<xsubpp> compiler to create a stack pointer available as C<SP>, and it
a0d0e21e 628is this pointer which is being used in the EXTEND() macro.
629The values are then pushed onto the stack with the PUSHs()
630macro.
631
632Now the rpcb_gettime() function can be used from Perl with
633the following statement.
634
635 ($status, $timep) = rpcb_gettime("localhost");
636
ef50df4b 637When handling output parameters with a PPCODE section, be sure to handle
638'set' magic properly. See L<perlguts> for details about 'set' magic.
639
a0d0e21e 640=head2 Returning Undef And Empty Lists
641
5f05dabc 642Occasionally the programmer will want to return simply
a0d0e21e 643C<undef> or an empty list if a function fails rather than a
644separate status value. The rpcb_gettime() function offers
645just this situation. If the function succeeds we would like
646to have it return the time and if it fails we would like to
647have undef returned. In the following Perl code the value
648of $timep will either be undef or it will be a valid time.
649
650 $timep = rpcb_gettime( "localhost" );
651
7b8d334a 652The following XSUB uses the C<SV *> return type as a mnemonic only,
e7ea3e70 653and uses a CODE: block to indicate to the compiler
a0d0e21e 654that the programmer has supplied all the necessary code. The
655sv_newmortal() call will initialize the return value to undef, making that
656the default return value.
657
e7ea3e70 658 SV *
a0d0e21e 659 rpcb_gettime(host)
660 char * host
c07a80fd 661 PREINIT:
a0d0e21e 662 time_t timep;
663 bool_t x;
c07a80fd 664 CODE:
a0d0e21e 665 ST(0) = sv_newmortal();
666 if( rpcb_gettime( host, &timep ) )
667 sv_setnv( ST(0), (double)timep);
a0d0e21e 668
669The next example demonstrates how one would place an explicit undef in the
670return value, should the need arise.
671
e7ea3e70 672 SV *
a0d0e21e 673 rpcb_gettime(host)
674 char * host
c07a80fd 675 PREINIT:
a0d0e21e 676 time_t timep;
677 bool_t x;
c07a80fd 678 CODE:
a0d0e21e 679 ST(0) = sv_newmortal();
680 if( rpcb_gettime( host, &timep ) ){
681 sv_setnv( ST(0), (double)timep);
682 }
683 else{
684 ST(0) = &sv_undef;
685 }
a0d0e21e 686
687To return an empty list one must use a PPCODE: block and
688then not push return values on the stack.
689
690 void
691 rpcb_gettime(host)
8e07c86e 692 char *host
c07a80fd 693 PREINIT:
a0d0e21e 694 time_t timep;
c07a80fd 695 PPCODE:
a0d0e21e 696 if( rpcb_gettime( host, &timep ) )
cb1a09d0 697 PUSHs(sv_2mortal(newSViv(timep)));
a0d0e21e 698 else{
699 /* Nothing pushed on stack, so an empty */
700 /* list is implicitly returned. */
701 }
a0d0e21e 702
f27cfbbe 703Some people may be inclined to include an explicit C<return> in the above
704XSUB, rather than letting control fall through to the end. In those
705situations C<XSRETURN_EMPTY> should be used, instead. This will ensure that
706the XSUB stack is properly adjusted. Consult L<perlguts/"API LISTING"> for
707other C<XSRETURN> macros.
708
4633a7c4 709=head2 The REQUIRE: Keyword
710
711The REQUIRE: keyword is used to indicate the minimum version of the
712B<xsubpp> compiler needed to compile the XS module. An XS module which
5f05dabc 713contains the following statement will compile with only B<xsubpp> version
4633a7c4 7141.922 or greater:
715
716 REQUIRE: 1.922
717
a0d0e21e 718=head2 The CLEANUP: Keyword
719
720This keyword can be used when an XSUB requires special cleanup procedures
721before it terminates. When the CLEANUP: keyword is used it must follow
722any CODE:, PPCODE:, or OUTPUT: blocks which are present in the XSUB. The
723code specified for the cleanup block will be added as the last statements
724in the XSUB.
725
726=head2 The BOOT: Keyword
727
728The BOOT: keyword is used to add code to the extension's bootstrap
729function. The bootstrap function is generated by the B<xsubpp> compiler and
730normally holds the statements necessary to register any XSUBs with Perl.
731With the BOOT: keyword the programmer can tell the compiler to add extra
732statements to the bootstrap function.
733
734This keyword may be used any time after the first MODULE keyword and should
735appear on a line by itself. The first blank line after the keyword will
736terminate the code block.
737
738 BOOT:
739 # The following message will be printed when the
740 # bootstrap function executes.
741 printf("Hello from the bootstrap!\n");
742
c07a80fd 743=head2 The VERSIONCHECK: Keyword
744
745The VERSIONCHECK: keyword corresponds to B<xsubpp>'s C<-versioncheck> and
5f05dabc 746C<-noversioncheck> options. This keyword overrides the command line
c07a80fd 747options. Version checking is enabled by default. When version checking is
748enabled the XS module will attempt to verify that its version matches the
749version of the PM module.
750
751To enable version checking:
752
753 VERSIONCHECK: ENABLE
754
755To disable version checking:
756
757 VERSIONCHECK: DISABLE
758
759=head2 The PROTOTYPES: Keyword
760
761The PROTOTYPES: keyword corresponds to B<xsubpp>'s C<-prototypes> and
54310121 762C<-noprototypes> options. This keyword overrides the command line options.
c07a80fd 763Prototypes are enabled by default. When prototypes are enabled XSUBs will
764be given Perl prototypes. This keyword may be used multiple times in an XS
765module to enable and disable prototypes for different parts of the module.
766
767To enable prototypes:
768
769 PROTOTYPES: ENABLE
770
771To disable prototypes:
772
773 PROTOTYPES: DISABLE
774
775=head2 The PROTOTYPE: Keyword
776
777This keyword is similar to the PROTOTYPES: keyword above but can be used to
778force B<xsubpp> to use a specific prototype for the XSUB. This keyword
779overrides all other prototype options and keywords but affects only the
780current XSUB. Consult L<perlsub/Prototypes> for information about Perl
781prototypes.
782
783 bool_t
784 rpcb_gettime(timep, ...)
785 time_t timep = NO_INIT
786 PROTOTYPE: $;$
787 PREINIT:
788 char *host = "localhost";
789 CODE:
790 if( items > 1 )
791 host = (char *)SvPV(ST(1), na);
792 RETVAL = rpcb_gettime( host, &timep );
793 OUTPUT:
794 timep
795 RETVAL
796
797=head2 The ALIAS: Keyword
798
cfc02341 799The ALIAS: keyword allows an XSUB to have two or more unique Perl names
c07a80fd 800and to know which of those names was used when it was invoked. The Perl
801names may be fully-qualified with package names. Each alias is given an
802index. The compiler will setup a variable called C<ix> which contain the
803index of the alias which was used. When the XSUB is called with its
804declared name C<ix> will be 0.
805
806The following example will create aliases C<FOO::gettime()> and
807C<BAR::getit()> for this function.
808
809 bool_t
810 rpcb_gettime(host,timep)
811 char *host
812 time_t &timep
813 ALIAS:
814 FOO::gettime = 1
815 BAR::getit = 2
816 INIT:
817 printf("# ix = %d\n", ix );
818 OUTPUT:
819 timep
820
cfc02341 821=head2 The INTERFACE: Keyword
822
823This keyword declares the current XSUB as a keeper of the given
824calling signature. If some text follows this keyword, it is
825considered as a list of functions which have this signature, and
826should be attached to XSUBs.
827
828Say, if you have 4 functions multiply(), divide(), add(), subtract() all
829having the signature
830
831 symbolic f(symbolic, symbolic);
832
833you code them all by using XSUB
834
835 symbolic
836 interface_s_ss(arg1, arg2)
837 symbolic arg1
838 symbolic arg2
839 INTERFACE:
840 multiply divide
841 add subtract
842
843The advantage of this approach comparing to ALIAS: keyword is that one
844can attach an extra function remainder() at runtime by using
845
846 CV *mycv = newXSproto("Symbolic::remainder",
847 XS_Symbolic_interface_s_ss, __FILE__, "$$");
848 XSINTERFACE_FUNC_SET(mycv, remainder);
849
850(This example supposes that there was no INTERFACE_MACRO: section,
851otherwise one needs to use something else instead of
852C<XSINTERFACE_FUNC_SET>.)
853
854=head2 The INTERFACE_MACRO: Keyword
855
856This keyword allows one to define an INTERFACE using a different way
857to extract a function pointer from an XSUB. The text which follows
858this keyword should give the name of macros which would extract/set a
859function pointer. The extractor macro is given return type, C<CV*>,
860and C<XSANY.any_dptr> for this C<CV*>. The setter macro is given cv,
861and the function pointer.
862
863The default value is C<XSINTERFACE_FUNC> and C<XSINTERFACE_FUNC_SET>.
864An INTERFACE keyword with an empty list of functions can be omitted if
865INTERFACE_MACRO keyword is used.
866
867Suppose that in the previous example functions pointers for
868multiply(), divide(), add(), subtract() are kept in a global C array
869C<fp[]> with offsets being C<multiply_off>, C<divide_off>, C<add_off>,
870C<subtract_off>. Then one can use
871
872 #define XSINTERFACE_FUNC_BYOFFSET(ret,cv,f) \
873 ((XSINTERFACE_CVT(ret,))fp[CvXSUBANY(cv).any_i32])
874 #define XSINTERFACE_FUNC_BYOFFSET_set(cv,f) \
875 CvXSUBANY(cv).any_i32 = CAT2( f, _off )
876
877in C section,
878
879 symbolic
880 interface_s_ss(arg1, arg2)
881 symbolic arg1
882 symbolic arg2
883 INTERFACE_MACRO:
884 XSINTERFACE_FUNC_BYOFFSET
885 XSINTERFACE_FUNC_BYOFFSET_set
886 INTERFACE:
887 multiply divide
888 add subtract
889
890in XSUB section.
891
c07a80fd 892=head2 The INCLUDE: Keyword
893
894This keyword can be used to pull other files into the XS module. The other
895files may have XS code. INCLUDE: can also be used to run a command to
896generate the XS code to be pulled into the module.
897
898The file F<Rpcb1.xsh> contains our C<rpcb_gettime()> function:
899
900 bool_t
901 rpcb_gettime(host,timep)
902 char *host
903 time_t &timep
904 OUTPUT:
905 timep
906
907The XS module can use INCLUDE: to pull that file into it.
908
909 INCLUDE: Rpcb1.xsh
910
911If the parameters to the INCLUDE: keyword are followed by a pipe (C<|>) then
912the compiler will interpret the parameters as a command.
913
914 INCLUDE: cat Rpcb1.xsh |
915
916=head2 The CASE: Keyword
917
918The CASE: keyword allows an XSUB to have multiple distinct parts with each
919part acting as a virtual XSUB. CASE: is greedy and if it is used then all
920other XS keywords must be contained within a CASE:. This means nothing may
921precede the first CASE: in the XSUB and anything following the last CASE: is
922included in that case.
923
924A CASE: might switch via a parameter of the XSUB, via the C<ix> ALIAS:
925variable (see L<"The ALIAS: Keyword">), or maybe via the C<items> variable
926(see L<"Variable-length Parameter Lists">). The last CASE: becomes the
927B<default> case if it is not associated with a conditional. The following
928example shows CASE switched via C<ix> with a function C<rpcb_gettime()>
929having an alias C<x_gettime()>. When the function is called as
b772cb6e 930C<rpcb_gettime()> its parameters are the usual C<(char *host, time_t *timep)>,
931but when the function is called as C<x_gettime()> its parameters are
c07a80fd 932reversed, C<(time_t *timep, char *host)>.
933
934 long
935 rpcb_gettime(a,b)
936 CASE: ix == 1
937 ALIAS:
938 x_gettime = 1
939 INPUT:
940 # 'a' is timep, 'b' is host
941 char *b
942 time_t a = NO_INIT
943 CODE:
944 RETVAL = rpcb_gettime( b, &a );
945 OUTPUT:
946 a
947 RETVAL
948 CASE:
949 # 'a' is host, 'b' is timep
950 char *a
951 time_t &b = NO_INIT
952 OUTPUT:
953 b
954 RETVAL
955
956That function can be called with either of the following statements. Note
957the different argument lists.
958
959 $status = rpcb_gettime( $host, $timep );
960
961 $status = x_gettime( $timep, $host );
962
963=head2 The & Unary Operator
964
965The & unary operator is used to tell the compiler that it should dereference
966the object when it calls the C function. This is used when a CODE: block is
967not used and the object is a not a pointer type (the object is an C<int> or
968C<long> but not a C<int*> or C<long*>).
969
970The following XSUB will generate incorrect C code. The xsubpp compiler will
971turn this into code which calls C<rpcb_gettime()> with parameters C<(char
972*host, time_t timep)>, but the real C<rpcb_gettime()> wants the C<timep>
973parameter to be of type C<time_t*> rather than C<time_t>.
974
975 bool_t
976 rpcb_gettime(host,timep)
977 char *host
978 time_t timep
979 OUTPUT:
980 timep
981
982That problem is corrected by using the C<&> operator. The xsubpp compiler
983will now turn this into code which calls C<rpcb_gettime()> correctly with
984parameters C<(char *host, time_t *timep)>. It does this by carrying the
985C<&> through, so the function call looks like C<rpcb_gettime(host, &timep)>.
986
987 bool_t
988 rpcb_gettime(host,timep)
989 char *host
990 time_t &timep
991 OUTPUT:
992 timep
993
a0d0e21e 994=head2 Inserting Comments and C Preprocessor Directives
995
f27cfbbe 996C preprocessor directives are allowed within BOOT:, PREINIT: INIT:,
5f05dabc 997CODE:, PPCODE:, and CLEANUP: blocks, as well as outside the functions.
f27cfbbe 998Comments are allowed anywhere after the MODULE keyword. The compiler
999will pass the preprocessor directives through untouched and will remove
1000the commented lines.
b772cb6e 1001
f27cfbbe 1002Comments can be added to XSUBs by placing a C<#> as the first
1003non-whitespace of a line. Care should be taken to avoid making the
1004comment look like a C preprocessor directive, lest it be interpreted as
1005such. The simplest way to prevent this is to put whitespace in front of
1006the C<#>.
1007
f27cfbbe 1008If you use preprocessor directives to choose one of two
1009versions of a function, use
1010
1011 #if ... version1
1012 #else /* ... version2 */
1013 #endif
1014
1015and not
1016
1017 #if ... version1
1018 #endif
1019 #if ... version2
1020 #endif
1021
1022because otherwise xsubpp will believe that you made a duplicate
1023definition of the function. Also, put a blank line before the
1024#else/#endif so it will not be seen as part of the function body.
a0d0e21e 1025
1026=head2 Using XS With C++
1027
1028If a function is defined as a C++ method then it will assume
1029its first argument is an object pointer. The object pointer
1030will be stored in a variable called THIS. The object should
1031have been created by C++ with the new() function and should
cb1a09d0 1032be blessed by Perl with the sv_setref_pv() macro. The
1033blessing of the object by Perl can be handled by a typemap. An example
1034typemap is shown at the end of this section.
a0d0e21e 1035
1036If the method is defined as static it will call the C++
1037function using the class::method() syntax. If the method is not static
f27cfbbe 1038the function will be called using the THIS-E<gt>method() syntax.
a0d0e21e 1039
cb1a09d0 1040The next examples will use the following C++ class.
a0d0e21e 1041
a5f75d66 1042 class color {
cb1a09d0 1043 public:
a5f75d66 1044 color();
1045 ~color();
cb1a09d0 1046 int blue();
1047 void set_blue( int );
1048
1049 private:
1050 int c_blue;
1051 };
1052
1053The XSUBs for the blue() and set_blue() methods are defined with the class
1054name but the parameter for the object (THIS, or "self") is implicit and is
1055not listed.
1056
1057 int
1058 color::blue()
a0d0e21e 1059
1060 void
cb1a09d0 1061 color::set_blue( val )
1062 int val
a0d0e21e 1063
cb1a09d0 1064Both functions will expect an object as the first parameter. The xsubpp
1065compiler will call that object C<THIS> and will use it to call the specified
1066method. So in the C++ code the blue() and set_blue() methods will be called
1067in the following manner.
a0d0e21e 1068
cb1a09d0 1069 RETVAL = THIS->blue();
a0d0e21e 1070
cb1a09d0 1071 THIS->set_blue( val );
a0d0e21e 1072
cb1a09d0 1073If the function's name is B<DESTROY> then the C++ C<delete> function will be
1074called and C<THIS> will be given as its parameter.
a0d0e21e 1075
d1b91892 1076 void
cb1a09d0 1077 color::DESTROY()
1078
1079The C++ code will call C<delete>.
1080
1081 delete THIS;
a0d0e21e 1082
cb1a09d0 1083If the function's name is B<new> then the C++ C<new> function will be called
1084to create a dynamic C++ object. The XSUB will expect the class name, which
1085will be kept in a variable called C<CLASS>, to be given as the first
1086argument.
a0d0e21e 1087
cb1a09d0 1088 color *
1089 color::new()
a0d0e21e 1090
cb1a09d0 1091The C++ code will call C<new>.
a0d0e21e 1092
cb1a09d0 1093 RETVAL = new color();
1094
1095The following is an example of a typemap that could be used for this C++
1096example.
1097
1098 TYPEMAP
1099 color * O_OBJECT
1100
1101 OUTPUT
1102 # The Perl object is blessed into 'CLASS', which should be a
1103 # char* having the name of the package for the blessing.
1104 O_OBJECT
1105 sv_setref_pv( $arg, CLASS, (void*)$var );
a6006777 1106
cb1a09d0 1107 INPUT
1108 O_OBJECT
1109 if( sv_isobject($arg) && (SvTYPE(SvRV($arg)) == SVt_PVMG) )
1110 $var = ($type)SvIV((SV*)SvRV( $arg ));
1111 else{
1112 warn( \"${Package}::$func_name() -- $var is not a blessed SV reference\" );
1113 XSRETURN_UNDEF;
1114 }
a0d0e21e 1115
d1b91892 1116=head2 Interface Strategy
a0d0e21e 1117
1118When designing an interface between Perl and a C library a straight
1119translation from C to XS is often sufficient. The interface will often be
1120very C-like and occasionally nonintuitive, especially when the C function
1121modifies one of its parameters. In cases where the programmer wishes to
1122create a more Perl-like interface the following strategy may help to
1123identify the more critical parts of the interface.
1124
1125Identify the C functions which modify their parameters. The XSUBs for
1126these functions may be able to return lists to Perl, or may be
1127candidates to return undef or an empty list in case of failure.
1128
d1b91892 1129Identify which values are used by only the C and XSUB functions
a0d0e21e 1130themselves. If Perl does not need to access the contents of the value
1131then it may not be necessary to provide a translation for that value
1132from C to Perl.
1133
1134Identify the pointers in the C function parameter lists and return
1135values. Some pointers can be handled in XS with the & unary operator on
1136the variable name while others will require the use of the * operator on
1137the type name. In general it is easier to work with the & operator.
1138
1139Identify the structures used by the C functions. In many
1140cases it may be helpful to use the T_PTROBJ typemap for
1141these structures so they can be manipulated by Perl as
1142blessed objects.
1143
a0d0e21e 1144=head2 Perl Objects And C Structures
1145
1146When dealing with C structures one should select either
1147B<T_PTROBJ> or B<T_PTRREF> for the XS type. Both types are
1148designed to handle pointers to complex objects. The
1149T_PTRREF type will allow the Perl object to be unblessed
1150while the T_PTROBJ type requires that the object be blessed.
1151By using T_PTROBJ one can achieve a form of type-checking
d1b91892 1152because the XSUB will attempt to verify that the Perl object
a0d0e21e 1153is of the expected type.
1154
1155The following XS code shows the getnetconfigent() function which is used
8e07c86e 1156with ONC+ TIRPC. The getnetconfigent() function will return a pointer to a
a0d0e21e 1157C structure and has the C prototype shown below. The example will
1158demonstrate how the C pointer will become a Perl reference. Perl will
1159consider this reference to be a pointer to a blessed object and will
1160attempt to call a destructor for the object. A destructor will be
1161provided in the XS source to free the memory used by getnetconfigent().
1162Destructors in XS can be created by specifying an XSUB function whose name
1163ends with the word B<DESTROY>. XS destructors can be used to free memory
1164which may have been malloc'd by another XSUB.
1165
1166 struct netconfig *getnetconfigent(const char *netid);
1167
1168A C<typedef> will be created for C<struct netconfig>. The Perl
1169object will be blessed in a class matching the name of the C
1170type, with the tag C<Ptr> appended, and the name should not
1171have embedded spaces if it will be a Perl package name. The
1172destructor will be placed in a class corresponding to the
1173class of the object and the PREFIX keyword will be used to
1174trim the name to the word DESTROY as Perl will expect.
1175
1176 typedef struct netconfig Netconfig;
1177
1178 MODULE = RPC PACKAGE = RPC
1179
1180 Netconfig *
1181 getnetconfigent(netid)
8e07c86e 1182 char *netid
a0d0e21e 1183
1184 MODULE = RPC PACKAGE = NetconfigPtr PREFIX = rpcb_
1185
1186 void
1187 rpcb_DESTROY(netconf)
8e07c86e 1188 Netconfig *netconf
a0d0e21e 1189 CODE:
1190 printf("Now in NetconfigPtr::DESTROY\n");
1191 free( netconf );
1192
1193This example requires the following typemap entry. Consult the typemap
1194section for more information about adding new typemaps for an extension.
1195
1196 TYPEMAP
1197 Netconfig * T_PTROBJ
1198
1199This example will be used with the following Perl statements.
1200
1201 use RPC;
1202 $netconf = getnetconfigent("udp");
1203
1204When Perl destroys the object referenced by $netconf it will send the
1205object to the supplied XSUB DESTROY function. Perl cannot determine, and
1206does not care, that this object is a C struct and not a Perl object. In
1207this sense, there is no difference between the object created by the
1208getnetconfigent() XSUB and an object created by a normal Perl subroutine.
1209
a0d0e21e 1210=head2 The Typemap
1211
1212The typemap is a collection of code fragments which are used by the B<xsubpp>
1213compiler to map C function parameters and values to Perl values. The
1214typemap file may consist of three sections labeled C<TYPEMAP>, C<INPUT>, and
1215C<OUTPUT>. The INPUT section tells the compiler how to translate Perl values
1216into variables of certain C types. The OUTPUT section tells the compiler
1217how to translate the values from certain C types into values Perl can
1218understand. The TYPEMAP section tells the compiler which of the INPUT and
1219OUTPUT code fragments should be used to map a given C type to a Perl value.
1220Each of the sections of the typemap must be preceded by one of the TYPEMAP,
1221INPUT, or OUTPUT keywords.
1222
1223The default typemap in the C<ext> directory of the Perl source contains many
1224useful types which can be used by Perl extensions. Some extensions define
1225additional typemaps which they keep in their own directory. These
1226additional typemaps may reference INPUT and OUTPUT maps in the main
1227typemap. The B<xsubpp> compiler will allow the extension's own typemap to
1228override any mappings which are in the default typemap.
1229
1230Most extensions which require a custom typemap will need only the TYPEMAP
1231section of the typemap file. The custom typemap used in the
1232getnetconfigent() example shown earlier demonstrates what may be the typical
1233use of extension typemaps. That typemap is used to equate a C structure
1234with the T_PTROBJ typemap. The typemap used by getnetconfigent() is shown
1235here. Note that the C type is separated from the XS type with a tab and
1236that the C unary operator C<*> is considered to be a part of the C type name.
1237
1238 TYPEMAP
1239 Netconfig *<tab>T_PTROBJ
1240
1748e8dd 1241Here's a more complicated example: suppose that you wanted C<struct
1242netconfig> to be blessed into the class C<Net::Config>. One way to do
1243this is to use underscores (_) to separate package names, as follows:
1244
1245 typedef struct netconfig * Net_Config;
1246
1247And then provide a typemap entry C<T_PTROBJ_SPECIAL> that maps underscores to
1248double-colons (::), and declare C<Net_Config> to be of that type:
1249
1250
1251 TYPEMAP
1252 Net_Config T_PTROBJ_SPECIAL
1253
1254 INPUT
1255 T_PTROBJ_SPECIAL
1256 if (sv_derived_from($arg, \"${(my $ntt=$ntype)=~s/_/::/g;\$ntt}\")) {
1257 IV tmp = SvIV((SV*)SvRV($arg));
1258 $var = ($type) tmp;
1259 }
1260 else
1261 croak(\"$var is not of type ${(my $ntt=$ntype)=~s/_/::/g;\$ntt}\")
1262
1263 OUTPUT
1264 T_PTROBJ_SPECIAL
1265 sv_setref_pv($arg, \"${(my $ntt=$ntype)=~s/_/::/g;\$ntt}\",
1266 (void*)$var);
1267
1268The INPUT and OUTPUT sections substitute underscores for double-colons
1269on the fly, giving the desired effect. This example demonstrates some
1270of the power and versatility of the typemap facility.
1271
a0d0e21e 1272=head1 EXAMPLES
1273
1274File C<RPC.xs>: Interface to some ONC+ RPC bind library functions.
1275
1276 #include "EXTERN.h"
1277 #include "perl.h"
1278 #include "XSUB.h"
1279
1280 #include <rpc/rpc.h>
1281
1282 typedef struct netconfig Netconfig;
1283
1284 MODULE = RPC PACKAGE = RPC
1285
e7ea3e70 1286 SV *
a0d0e21e 1287 rpcb_gettime(host="localhost")
8e07c86e 1288 char *host
c07a80fd 1289 PREINIT:
a0d0e21e 1290 time_t timep;
c07a80fd 1291 CODE:
a0d0e21e 1292 ST(0) = sv_newmortal();
1293 if( rpcb_gettime( host, &timep ) )
1294 sv_setnv( ST(0), (double)timep );
a0d0e21e 1295
1296 Netconfig *
1297 getnetconfigent(netid="udp")
8e07c86e 1298 char *netid
a0d0e21e 1299
1300 MODULE = RPC PACKAGE = NetconfigPtr PREFIX = rpcb_
1301
1302 void
1303 rpcb_DESTROY(netconf)
8e07c86e 1304 Netconfig *netconf
a0d0e21e 1305 CODE:
1306 printf("NetconfigPtr::DESTROY\n");
1307 free( netconf );
1308
1309File C<typemap>: Custom typemap for RPC.xs.
1310
1311 TYPEMAP
1312 Netconfig * T_PTROBJ
1313
1314File C<RPC.pm>: Perl module for the RPC extension.
1315
1316 package RPC;
1317
1318 require Exporter;
1319 require DynaLoader;
1320 @ISA = qw(Exporter DynaLoader);
1321 @EXPORT = qw(rpcb_gettime getnetconfigent);
1322
1323 bootstrap RPC;
1324 1;
1325
1326File C<rpctest.pl>: Perl test program for the RPC extension.
1327
1328 use RPC;
1329
1330 $netconf = getnetconfigent();
1331 $a = rpcb_gettime();
1332 print "time = $a\n";
1333 print "netconf = $netconf\n";
1334
1335 $netconf = getnetconfigent("tcp");
1336 $a = rpcb_gettime("poplar");
1337 print "time = $a\n";
1338 print "netconf = $netconf\n";
1339
1340
c07a80fd 1341=head1 XS VERSION
1342
f27cfbbe 1343This document covers features supported by C<xsubpp> 1.935.
c07a80fd 1344
a0d0e21e 1345=head1 AUTHOR
1346
9607fc9c 1347Dean Roehrich <F<roehrich@cray.com>>
b772cb6e 1348Jul 8, 1996