home *** CD-ROM | disk | FTP | other *** search
/ Amiga Magazin: Amiga-CD 1996 July / AMIGA_1996_7.BIN / ausgabe_7_96 / pd-programmierung / perl5_002bin.lha / man / catp / perlxstut.0 < prev   
Text File  |  1996-03-02  |  57KB  |  1,057 lines

  1.  
  2.  
  3.  
  4. PERLXSTUT(1)   User Contributed Perl Documentation   PERLXSTUT(1)
  5.  
  6.  
  7. NNNNAAAAMMMMEEEE
  8.        perlXStut - Tutorial for XSUB's
  9.  
  10. DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNN
  11.        This tutorial will educate the reader on the steps
  12.        involved in creating a Perl extension.  The reader is
  13.        assumed to have access to the _p_e_r_l_g_u_t_s manpage and the
  14.        _p_e_r_l_x_s manpage.
  15.  
  16.        This tutorial starts with very simple examples and becomes
  17.        more complex, with each new example adding new features.
  18.        Certain concepts may not be completely explained until
  19.        later in the tutorial in order to slowly ease the reader
  20.        into building extensions.
  21.  
  22.        VVVVEEEERRRRSSSSIIIIOOOONNNN CCCCAAAAVVVVEEEEAAAATTTT
  23.  
  24.        This tutorial tries hard to keep up with the latest
  25.        development versions of Perl.  This often means that it is
  26.        sometimes in advance of the latest released version of
  27.        Perl, and that certain features described here might not
  28.        work on earlier versions.  This section will keep track of
  29.        when various features were added to Perl 5.
  30.  
  31.        +o   In versions of 5.002 prior to version beta 3, then the
  32.            line in the .xs file about "PROTOTYPES: DISABLE" will
  33.            cause a compiler error.  Simply remove that line from
  34.            the file.
  35.  
  36.        +o   In versions of 5.002 prior to version 5.002b1h, the
  37.            test.pl file was not automatically created by h2xs.
  38.            This means that you cannot say "make test" to run the
  39.            test script.  You will need to add the following line
  40.            before the "use extension" statement:
  41.  
  42.                    uuuusssseeee lllliiiibbbb ''''....////bbbblllliiiibbbb'''';;;;
  43.  
  44.  
  45.        +o   In versions 5.000 and 5.001, instead of using the
  46.            above line, you will need to use the following line:
  47.  
  48.                    BBBBEEEEGGGGIIIINNNN {{{{ uuuunnnnsssshhhhiiiifffftttt((((@@@@IIIINNNNCCCC,,,, """"....////bbbblllliiiibbbb"""")))) }}}}
  49.  
  50.  
  51.        +o   This document assumes that the executable named "perl"
  52.            is Perl version 5.  Some systems may have installed
  53.            Perl version 5 as "perl5".
  54.  
  55.        DDDDYYYYNNNNAAAAMMMMIIIICCCC VVVVEEEERRRRSSSSUUUUSSSS SSSSTTTTAAAATTTTIIIICCCC
  56.  
  57.        It is commonly thought that if a system does not have the
  58.        capability to dynamically load a library, you cannot build
  59.        XSUB's.  This is incorrect.  You _c_a_n build them, but you
  60.        must link the XSUB's subroutines with the rest of Perl,
  61.  
  62.  
  63.  
  64. 12/Feb/96                perl 5.002 with                        1
  65.  
  66.  
  67.  
  68.  
  69.  
  70. PERLXSTUT(1)   User Contributed Perl Documentation   PERLXSTUT(1)
  71.  
  72.  
  73.        creating a new executable.  This situation is similar to
  74.        Perl 4.
  75.  
  76.        This tutorial can still be used on such a system.  The
  77.        XSUB build mechanism will check the system and build a
  78.        dynamically-loadable library if possible, or else a static
  79.        library and then, optionally, a new statically-linked
  80.        executable with that static library linked in.
  81.  
  82.        Should you wish to build a statically-linked executable on
  83.        a system which can dynamically load libraries, you may, in
  84.        all the following examples, where the command "make" with
  85.        no arguments is executed, run the command "make perl"
  86.        instead.
  87.  
  88.        If you have generated such a statically-linked executable
  89.        by choice, then instead of saying "make test", you should
  90.        say "make test_static".  On systems that cannot build
  91.        dynamically-loadable libraries at all, simply saying "make
  92.        test" is sufficient.
  93.  
  94.        EEEEXXXXAAAAMMMMPPPPLLLLEEEE 1111
  95.  
  96.        Our first extension will be very simple.  When we call the
  97.        routine in the extension, it will print out a well-known
  98.        message and return.
  99.  
  100.        Run "h2xs -A -n Mytest".  This creates a directory named
  101.        Mytest, possibly under ext/ if that directory exists in
  102.        the current working directory.  Several files will be
  103.        created in the Mytest dir, including MANIFEST,
  104.        Makefile.PL, Mytest.pm, Mytest.xs, test.pl, and Changes.
  105.  
  106.        The MANIFEST file contains the names of all the files
  107.        created.
  108.  
  109.        The file Makefile.PL should look something like this:
  110.  
  111.                uuuusssseeee EEEExxxxttttUUUUttttiiiillllssss::::::::MMMMaaaakkkkeeeeMMMMaaaakkkkeeeerrrr;;;;
  112.                #### SSSSeeeeeeee lllliiiibbbb////EEEExxxxttttUUUUttttiiiillllssss////MMMMaaaakkkkeeeeMMMMaaaakkkkeeeerrrr....ppppmmmm ffffoooorrrr ddddeeeettttaaaaiiiillllssss ooooffff hhhhoooowwww ttttoooo iiiinnnnfffflllluuuueeeennnncccceeee
  113.                #### tttthhhheeee ccccoooonnnntttteeeennnnttttssss ooooffff tttthhhheeee MMMMaaaakkkkeeeeffffiiiilllleeee tttthhhhaaaatttt iiiissss wwwwrrrriiiitttttttteeeennnn....
  114.                WWWWrrrriiiitttteeeeMMMMaaaakkkkeeeeffffiiiilllleeee((((
  115.                    ''''NNNNAAAAMMMMEEEE''''      ====>>>> ''''MMMMyyyytttteeeesssstttt'''',,,,
  116.                    ''''VVVVEEEERRRRSSSSIIIIOOOONNNN____FFFFRRRROOOOMMMM'''' ====>>>> ''''MMMMyyyytttteeeesssstttt....ppppmmmm'''',,,, #### ffffiiiinnnnddddssss $$$$VVVVEEEERRRRSSSSIIIIOOOONNNN
  117.                    ''''LLLLIIIIBBBBSSSS''''      ====>>>> [[[['''''''']]]],,,,   #### eeee....gggg....,,,, ''''----llllmmmm''''
  118.                    ''''DDDDEEEEFFFFIIIINNNNEEEE''''    ====>>>> '''''''',,,,     #### eeee....gggg....,,,, ''''----DDDDHHHHAAAAVVVVEEEE____SSSSOOOOMMMMEEEETTTTHHHHIIIINNNNGGGG''''
  119.                    ''''IIIINNNNCCCC''''       ====>>>> '''''''',,,,     #### eeee....gggg....,,,, ''''----IIII////uuuussssrrrr////iiiinnnncccclllluuuuddddeeee////ooootttthhhheeeerrrr''''
  120.                ))));;;;
  121.  
  122.        The file Mytest.pm should start with something like this:
  123.  
  124.                ppppaaaacccckkkkaaaaggggeeee MMMMyyyytttteeeesssstttt;;;;
  125.  
  126.  
  127.  
  128.  
  129.  
  130. 12/Feb/96                perl 5.002 with                        2
  131.  
  132.  
  133.  
  134.  
  135.  
  136. PERLXSTUT(1)   User Contributed Perl Documentation   PERLXSTUT(1)
  137.  
  138.  
  139.                rrrreeeeqqqquuuuiiiirrrreeee EEEExxxxppppoooorrrrtttteeeerrrr;;;;
  140.                rrrreeeeqqqquuuuiiiirrrreeee DDDDyyyynnnnaaaaLLLLooooaaaaddddeeeerrrr;;;;
  141.  
  142.                @@@@IIIISSSSAAAA ==== qqqqwwww((((EEEExxxxppppoooorrrrtttteeeerrrr DDDDyyyynnnnaaaaLLLLooooaaaaddddeeeerrrr))));;;;
  143.                #### IIIItttteeeemmmmssss ttttoooo eeeexxxxppppoooorrrrtttt iiiinnnnttttoooo ccccaaaalllllllleeeerrrrssss nnnnaaaammmmeeeessssppppaaaacccceeee bbbbyyyy ddddeeeeffffaaaauuuulllltttt.... NNNNooootttteeee:::: ddddoooo nnnnooootttt eeeexxxxppppoooorrrrtttt
  144.                #### nnnnaaaammmmeeeessss bbbbyyyy ddddeeeeffffaaaauuuulllltttt wwwwiiiitttthhhhoooouuuutttt aaaa vvvveeeerrrryyyy ggggoooooooodddd rrrreeeeaaaassssoooonnnn.... UUUUsssseeee EEEEXXXXPPPPOOOORRRRTTTT____OOOOKKKK iiiinnnnsssstttteeeeaaaadddd....
  145.                #### DDDDoooo nnnnooootttt ssssiiiimmmmppppllllyyyy eeeexxxxppppoooorrrrtttt aaaallllllll yyyyoooouuuurrrr ppppuuuubbbblllliiiicccc ffffuuuunnnnccccttttiiiioooonnnnssss////mmmmeeeetttthhhhooooddddssss////ccccoooonnnnssssttttaaaannnnttttssss....
  146.                @@@@EEEEXXXXPPPPOOOORRRRTTTT ==== qqqqwwww((((
  147.  
  148.                ))));;;;
  149.                $$$$VVVVEEEERRRRSSSSIIIIOOOONNNN ==== ''''0000....00001111'''';;;;
  150.  
  151.                bbbboooooooottttssssttttrrrraaaapppp MMMMyyyytttteeeesssstttt $$$$VVVVEEEERRRRSSSSIIIIOOOONNNN;;;;
  152.  
  153.                #### PPPPrrrreeeellllooooaaaaddddeeeedddd mmmmeeeetttthhhhooooddddssss ggggoooo hhhheeeerrrreeee....
  154.  
  155.                #### AAAAuuuuttttoooollllooooaaaadddd mmmmeeeetttthhhhooooddddssss ggggoooo aaaafffftttteeeerrrr ________EEEENNNNDDDD________,,,, aaaannnndddd aaaarrrreeee pppprrrroooocccceeeesssssssseeeedddd bbbbyyyy tttthhhheeee aaaauuuuttttoooosssspppplllliiiitttt pppprrrrooooggggrrrraaaammmm....
  156.  
  157.                1111;;;;
  158.                ________EEEENNNNDDDD________
  159.                #### BBBBeeeelllloooowwww iiiissss tttthhhheeee ssssttttuuuubbbb ooooffff ddddooooccccuuuummmmeeeennnnttttaaaattttiiiioooonnnn ffffoooorrrr yyyyoooouuuurrrr mmmmoooodddduuuulllleeee.... YYYYoooouuuu bbbbeeeetttttttteeeerrrr eeeeddddiiiitttt iiiitttt!!!!
  160.  
  161.        And the Mytest.xs file should look something like this:
  162.  
  163.                ####iiiiffffddddeeeeffff ________ccccpppplllluuuusssspppplllluuuussss
  164.                eeeexxxxtttteeeerrrrnnnn """"CCCC"""" {{{{
  165.                ####eeeennnnddddiiiiffff
  166.                ####iiiinnnncccclllluuuuddddeeee """"EEEEXXXXTTTTEEEERRRRNNNN....hhhh""""
  167.                ####iiiinnnncccclllluuuuddddeeee """"ppppeeeerrrrllll....hhhh""""
  168.                ####iiiinnnncccclllluuuuddddeeee """"XXXXSSSSUUUUBBBB....hhhh""""
  169.                ####iiiiffffddddeeeeffff ________ccccpppplllluuuusssspppplllluuuussss
  170.                }}}}
  171.                ####eeeennnnddddiiiiffff
  172.  
  173.                PPPPRRRROOOOTTTTOOOOTTTTYYYYPPPPEEEESSSS:::: DDDDIIIISSSSAAAABBBBLLLLEEEE
  174.  
  175.                MMMMOOOODDDDUUUULLLLEEEE ==== MMMMyyyytttteeeesssstttt         PPPPAAAACCCCKKKKAAAAGGGGEEEE ==== MMMMyyyytttteeeesssstttt
  176.  
  177.        Let's edit the .xs file by adding this to the end of the
  178.        file:
  179.  
  180.                vvvvooooiiiidddd
  181.                hhhheeeelllllllloooo(((())))
  182.                        CCCCOOOODDDDEEEE::::
  183.                        pppprrrriiiinnnnttttffff((((""""HHHHeeeelllllllloooo,,,, wwwwoooorrrrlllldddd!!!!\\\\nnnn""""))));;;;
  184.  
  185.        Now we'll run "perl Makefile.PL".  This will create a real
  186.        Makefile, which make needs.  It's output looks something
  187.        like:
  188.  
  189.  
  190.  
  191.  
  192.  
  193.  
  194.  
  195.  
  196. 12/Feb/96                perl 5.002 with                        3
  197.  
  198.  
  199.  
  200.  
  201.  
  202. PERLXSTUT(1)   User Contributed Perl Documentation   PERLXSTUT(1)
  203.  
  204.  
  205.                %%%% ppppeeeerrrrllll MMMMaaaakkkkeeeeffffiiiilllleeee....PPPPLLLL
  206.                CCCChhhheeeecccckkkkiiiinnnngggg iiiiffff yyyyoooouuuurrrr kkkkiiiitttt iiiissss ccccoooommmmpppplllleeeetttteeee............
  207.                LLLLooooooookkkkssss ggggoooooooodddd
  208.                WWWWrrrriiiittttiiiinnnngggg MMMMaaaakkkkeeeeffffiiiilllleeee ffffoooorrrr MMMMyyyytttteeeesssstttt
  209.                %%%%
  210.  
  211.        Now, running make will produce output that looks something
  212.        like this (some long lines shortened for clarity):
  213.  
  214.                %%%% mmmmaaaakkkkeeee
  215.                uuuummmmaaaasssskkkk 0000 &&&&&&&& ccccpppp MMMMyyyytttteeeesssstttt....ppppmmmm ....////bbbblllliiiibbbb////MMMMyyyytttteeeesssstttt....ppppmmmm
  216.                ppppeeeerrrrllll xxxxssssuuuubbbbpppppppp ----ttttyyyyppppeeeemmmmaaaapppp ttttyyyyppppeeeemmmmaaaapppp MMMMyyyytttteeeesssstttt....xxxxssss >>>>MMMMyyyytttteeeesssstttt....ttttcccc &&&&&&&& mmmmvvvv MMMMyyyytttteeeesssstttt....ttttcccc MMMMyyyytttteeeesssstttt....cccc
  217.                cccccccc ----cccc MMMMyyyytttteeeesssstttt....cccc
  218.                RRRRuuuunnnnnnnniiiinnnngggg MMMMkkkkbbbboooooooottttssssttttrrrraaaapppp ffffoooorrrr MMMMyyyytttteeeesssstttt (((())))
  219.                cccchhhhmmmmoooodddd 666644444444 MMMMyyyytttteeeesssstttt....bbbbssss
  220.                LLLLDDDD____RRRRUUUUNNNN____PPPPAAAATTTTHHHH===="""""""" lllldddd ----oooo ....////bbbblllliiiibbbb////PPPPAAAA----RRRRIIIISSSSCCCC1111....1111////aaaauuuuttttoooo////MMMMyyyytttteeeesssstttt////MMMMyyyytttteeeesssstttt....ssssllll ----bbbb MMMMyyyytttteeeesssstttt....oooo
  221.                cccchhhhmmmmoooodddd 777755555555 ....////bbbblllliiiibbbb////PPPPAAAA----RRRRIIIISSSSCCCC1111....1111////aaaauuuuttttoooo////MMMMyyyytttteeeesssstttt////MMMMyyyytttteeeesssstttt....ssssllll
  222.                ccccpppp MMMMyyyytttteeeesssstttt....bbbbssss ....////bbbblllliiiibbbb////PPPPAAAA----RRRRIIIISSSSCCCC1111....1111////aaaauuuuttttoooo////MMMMyyyytttteeeesssstttt////MMMMyyyytttteeeesssstttt....bbbbssss
  223.                cccchhhhmmmmoooodddd 666644444444 ....////bbbblllliiiibbbb////PPPPAAAA----RRRRIIIISSSSCCCC1111....1111////aaaauuuuttttoooo////MMMMyyyytttteeeesssstttt////MMMMyyyytttteeeesssstttt....bbbbssss
  224.  
  225.        Now, although there is already a test.pl template ready
  226.        for us, for this example only, we'll create a special test
  227.        script.  Create a file called hello that looks like this:
  228.  
  229.                ####!!!! ////oooopppptttt////ppppeeeerrrrllll5555////bbbbiiiinnnn////ppppeeeerrrrllll
  230.  
  231.                uuuusssseeee lllliiiibbbb ''''....////bbbblllliiiibbbb'''';;;;
  232.  
  233.                uuuusssseeee MMMMyyyytttteeeesssstttt;;;;
  234.  
  235.                MMMMyyyytttteeeesssstttt::::::::hhhheeeelllllllloooo(((())));;;;
  236.  
  237.        Now we run the script and we should see the following
  238.        output:
  239.  
  240.                %%%% ppppeeeerrrrllll hhhheeeelllllllloooo
  241.                HHHHeeeelllllllloooo,,,, wwwwoooorrrrlllldddd!!!!
  242.                %%%%
  243.  
  244.  
  245.        EEEEXXXXAAAAMMMMPPPPLLLLEEEE 2222
  246.  
  247.        Now let's add to our extension a subroutine that will take
  248.        a single argument and return 0 if the argument is even, 1
  249.        if the argument is odd.
  250.  
  251.        Add the following to the end of Mytest.xs:
  252.  
  253.  
  254.  
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261.  
  262. 12/Feb/96                perl 5.002 with                        4
  263.  
  264.  
  265.  
  266.  
  267.  
  268. PERLXSTUT(1)   User Contributed Perl Documentation   PERLXSTUT(1)
  269.  
  270.  
  271.                iiiinnnntttt
  272.                iiiissss____eeeevvvveeeennnn((((iiiinnnnppppuuuutttt))))
  273.                        iiiinnnntttt     iiiinnnnppppuuuutttt
  274.                        CCCCOOOODDDDEEEE::::
  275.                        RRRREEEETTTTVVVVAAAALLLL ==== ((((iiiinnnnppppuuuutttt %%%% 2222 ======== 0000))));;;;
  276.                        OOOOUUUUTTTTPPPPUUUUTTTT::::
  277.                        RRRREEEETTTTVVVVAAAALLLL
  278.  
  279.        There does not need to be white space at the start of the
  280.        "int input" line, but it is useful for improving
  281.        readability.  The semi-colon at the end of that line is
  282.        also optional.
  283.  
  284.        Any white space may be between the "int" and "input".  It
  285.        is also okay for the four lines starting at the "CODE:"
  286.        line to not be indented.  However, for readability
  287.        purposes, it is suggested that you indent them 8 spaces
  288.        (or one normal tab stop).
  289.  
  290.        Now re-run make to rebuild our new shared library.
  291.  
  292.        Now perform the same steps as before, generating a
  293.        Makefile from the Makefile.PL file, and running make.
  294.  
  295.        In order to test that our extension works, we now need to
  296.        look at the file test.pl.  This file is set up to imitate
  297.        the same kind of testing structure that Perl itself has.
  298.        Within the test script, you perform a number of tests to
  299.        confirm the behavior of the extension, printing "ok" when
  300.        the test is correct, "not ok" when it is not.
  301.  
  302.        Remove the line that starts with "use lib", change the
  303.        print statement in the BEGIN block to print "1..4", and
  304.        add the following code to the end of the file:
  305.  
  306.                pppprrrriiiinnnntttt &&&&MMMMyyyytttteeeesssstttt::::::::iiiissss____eeeevvvveeeennnn((((0000)))) ======== 1111 ???? """"ooookkkk 2222"""" :::: """"nnnnooootttt ooookkkk 2222"""",,,, """"\\\\nnnn"""";;;;
  307.                pppprrrriiiinnnntttt &&&&MMMMyyyytttteeeesssstttt::::::::iiiissss____eeeevvvveeeennnn((((1111)))) ======== 0000 ???? """"ooookkkk 3333"""" :::: """"nnnnooootttt ooookkkk 3333"""",,,, """"\\\\nnnn"""";;;;
  308.                pppprrrriiiinnnntttt &&&&MMMMyyyytttteeeesssstttt::::::::iiiissss____eeeevvvveeeennnn((((2222)))) ======== 1111 ???? """"ooookkkk 4444"""" :::: """"nnnnooootttt ooookkkk 4444"""",,,, """"\\\\nnnn"""";;;;
  309.  
  310.        We will be calling the test script through the command
  311.        "make test".  You should see output that looks something
  312.        like this:
  313.  
  314.                %%%% mmmmaaaakkkkeeee tttteeeesssstttt
  315.                PPPPEEEERRRRLLLL____DDDDLLLL____NNNNOOOONNNNLLLLAAAAZZZZYYYY====1111 ////oooopppptttt////ppppeeeerrrrllll5555....000000002222bbbb2222////bbbbiiiinnnn////ppppeeeerrrrllll ((((lllloooottttssss ooooffff ----IIII aaaarrrrgggguuuummmmeeeennnnttttssss)))) tttteeeesssstttt....ppppllll
  316.                1111........4444
  317.                ooookkkk 1111
  318.                ooookkkk 2222
  319.                ooookkkk 3333
  320.                ooookkkk 4444
  321.                %%%%
  322.  
  323.  
  324.  
  325.  
  326.  
  327.  
  328. 12/Feb/96                perl 5.002 with                        5
  329.  
  330.  
  331.  
  332.  
  333.  
  334. PERLXSTUT(1)   User Contributed Perl Documentation   PERLXSTUT(1)
  335.  
  336.  
  337.        WWWWHHHHAAAATTTT HHHHAAAASSSS GGGGOOOONNNNEEEE OOOONNNN????
  338.  
  339.        The program h2xs is the starting point for creating
  340.        extensions.  In later examples we'll see how we can use
  341.        h2xs to read header files and generate templates to
  342.        connect to C routines.
  343.  
  344.        h2xs creates a number of files in the extension directory.
  345.        The file Makefile.PL is a perl script which will generate
  346.        a true Makefile to build the extension.  We'll take a
  347.        closer look at it later.
  348.  
  349.        The files <extension>.pm and <extension>.xs contain the
  350.        meat of the extension.  The .xs file holds the C routines
  351.        that make up the extension.  The .pm file contains
  352.        routines that tell Perl how to load your extension.
  353.  
  354.        Generating and invoking the Makefile created a directory
  355.        blib (which stands for "build library") in the current
  356.        working directory.  This directory will contain the shared
  357.        library that we will build.  Once we have tested it, we
  358.        can install it into its final location.
  359.  
  360.        Invoking the test script via "make test" did something
  361.        very important.  It invoked perl with all those -I
  362.        arguments so that it could find the various files that are
  363.        part of the extension.
  364.  
  365.        It is _v_e_r_y important that while you are still testing
  366.        extensions that you use "make test".  If you try to run
  367.        the test script all by itself, you will get a fatal error.
  368.  
  369.        Another reason it is important to use "make test" to run
  370.        your test script is that if you are testing an upgrade to
  371.        an already-existing version, using "make test" insures
  372.        that you use your new extension, not the already-existing
  373.        version.
  374.  
  375.        When Perl sees a uuuusssseeee eeeexxxxtttteeeennnnssssiiiioooonnnn;;;;, it searches for a file
  376.        with the same name as the use'd extension that has a .pm
  377.        suffix.  If that file cannot be found, Perl dies with a
  378.        fatal error.  The default search path is contained in the
  379.        @@@@IIIINNNNCCCC array.
  380.  
  381.        In our case, Mytest.pm tells perl that it will need the
  382.        Exporter and Dynamic Loader extensions.  It then sets the
  383.        @@@@IIIISSSSAAAA and @@@@EEEEXXXXPPPPOOOORRRRTTTT arrays and the $$$$VVVVEEEERRRRSSSSIIIIOOOONNNN scalar; finally
  384.        it tells perl to bootstrap the module.  Perl will call its
  385.        dynamic loader routine (if there is one) and load the
  386.        shared library.
  387.  
  388.        The two arrays that are set in the .pm file are very
  389.        important.  The @@@@IIIISSSSAAAA array contains a list of other
  390.        packages in which to search for methods (or subroutines)
  391.  
  392.  
  393.  
  394. 12/Feb/96                perl 5.002 with                        6
  395.  
  396.  
  397.  
  398.  
  399.  
  400. PERLXSTUT(1)   User Contributed Perl Documentation   PERLXSTUT(1)
  401.  
  402.  
  403.        that do not exist in the current package.  The @@@@EEEEXXXXPPPPOOOORRRRTTTT
  404.        array tells Perl which of the extension's routines should
  405.        be placed into the calling package's namespace.
  406.  
  407.        It's important to select what to export carefully.  Do NOT
  408.        export method names and do NOT export anything else _b_y
  409.        _d_e_f_a_u_l_t without a good reason.
  410.  
  411.        As a general rule, if the module is trying to be object-
  412.        oriented then don't export anything.  If it's just a
  413.        collection of functions then you can export any of the
  414.        functions via another array, called @@@@EEEEXXXXPPPPOOOORRRRTTTT____OOOOKKKK.
  415.  
  416.        See the _p_e_r_l_m_o_d manpage for more information.
  417.  
  418.        The $$$$VVVVEEEERRRRSSSSIIIIOOOONNNN variable is used to ensure that the .pm file
  419.        and the shared library are "in sync" with each other.  Any
  420.        time you make changes to the .pm or .xs files, you should
  421.        increment the value of this variable.
  422.  
  423.        WWWWRRRRIIIITTTTIIIINNNNGGGG GGGGOOOOOOOODDDD TTTTEEEESSSSTTTT SSSSCCCCRRRRIIIIPPPPTTTTSSSS
  424.  
  425.        The importance of writing good test scripts cannot be
  426.        overemphasized.  You should closely follow the "ok/not ok"
  427.        style that Perl itself uses, so that it is very easy and
  428.        unambiguous to determine the outcome of each test case.
  429.        When you find and fix a bug, make sure you add a test case
  430.        for it.
  431.  
  432.        By running "make test", you ensure that your test.pl
  433.        script runs and uses the correct version of your
  434.        extension.  If you have many test cases, you might want to
  435.        copy Perl's test style.  Create a directory named "t", and
  436.        ensure all your test files end with the suffix ".t".  The
  437.        Makefile will properly run all these test files.
  438.  
  439.        EEEEXXXXAAAAMMMMPPPPLLLLEEEE 3333
  440.  
  441.        Our third extension will take one argument as its input,
  442.        round off that value, and set the _a_r_g_u_m_e_n_t to the rounded
  443.        value.
  444.  
  445.        Add the following to the end of Mytest.xs:
  446.  
  447.  
  448.  
  449.  
  450.  
  451.  
  452.  
  453.  
  454.  
  455.  
  456.  
  457.  
  458.  
  459.  
  460. 12/Feb/96                perl 5.002 with                        7
  461.  
  462.  
  463.  
  464.  
  465.  
  466. PERLXSTUT(1)   User Contributed Perl Documentation   PERLXSTUT(1)
  467.  
  468.  
  469.                vvvvooooiiiidddd
  470.                rrrroooouuuunnnndddd((((aaaarrrrgggg))))
  471.                        ddddoooouuuubbbblllleeee  aaaarrrrgggg
  472.                        CCCCOOOODDDDEEEE::::
  473.                        iiiiffff ((((aaaarrrrgggg >>>> 0000....0000)))) {{{{
  474.                                aaaarrrrgggg ==== fffflllloooooooorrrr((((aaaarrrrgggg ++++ 0000....5555))));;;;
  475.                        }}}} eeeellllsssseeee iiiiffff ((((aaaarrrrgggg <<<< 0000....0000)))) {{{{
  476.                                aaaarrrrgggg ==== cccceeeeiiiillll((((aaaarrrrgggg ---- 0000....5555))));;;;
  477.                        }}}} eeeellllsssseeee {{{{
  478.                                aaaarrrrgggg ==== 0000....0000;;;;
  479.                        }}}}
  480.                        OOOOUUUUTTTTPPPPUUUUTTTT::::
  481.                        aaaarrrrgggg
  482.  
  483.        Edit the Makefile.PL file so that the corresponding line
  484.        looks like this:
  485.  
  486.                ''''LLLLIIIIBBBBSSSS''''      ====>>>> [[[[''''----llllmmmm'''']]]],,,,   #### eeee....gggg....,,,, ''''----llllmmmm''''
  487.  
  488.        Generate the Makefile and run make.  Change the BEGIN
  489.        block to print out "1..9" and add the following to
  490.        test.pl:
  491.  
  492.                $$$$iiii ==== ----1111....5555;;;; &&&&MMMMyyyytttteeeesssstttt::::::::rrrroooouuuunnnndddd(((($$$$iiii))));;;; pppprrrriiiinnnntttt $$$$iiii ======== ----2222....0000 ???? """"ooookkkk 5555"""" :::: """"nnnnooootttt ooookkkk 5555"""",,,, """"\\\\nnnn"""";;;;
  493.                $$$$iiii ==== ----1111....1111;;;; &&&&MMMMyyyytttteeeesssstttt::::::::rrrroooouuuunnnndddd(((($$$$iiii))));;;; pppprrrriiiinnnntttt $$$$iiii ======== ----1111....0000 ???? """"ooookkkk 6666"""" :::: """"nnnnooootttt ooookkkk 6666"""",,,, """"\\\\nnnn"""";;;;
  494.                $$$$iiii ==== 0000....0000;;;; &&&&MMMMyyyytttteeeesssstttt::::::::rrrroooouuuunnnndddd(((($$$$iiii))));;;; pppprrrriiiinnnntttt $$$$iiii ======== 0000....0000 ???? """"ooookkkk 7777"""" :::: """"nnnnooootttt ooookkkk 7777"""",,,, """"\\\\nnnn"""";;;;
  495.                $$$$iiii ==== 0000....5555;;;; &&&&MMMMyyyytttteeeesssstttt::::::::rrrroooouuuunnnndddd(((($$$$iiii))));;;; pppprrrriiiinnnntttt $$$$iiii ======== 1111....0000 ???? """"ooookkkk 8888"""" :::: """"nnnnooootttt ooookkkk 8888"""",,,, """"\\\\nnnn"""";;;;
  496.                $$$$iiii ==== 1111....2222;;;; &&&&MMMMyyyytttteeeesssstttt::::::::rrrroooouuuunnnndddd(((($$$$iiii))));;;; pppprrrriiiinnnntttt $$$$iiii ======== 1111....0000 ???? """"ooookkkk 9999"""" :::: """"nnnnooootttt ooookkkk 9999"""",,,, """"\\\\nnnn"""";;;;
  497.  
  498.        Running "make test" should now print out that all nine
  499.        tests are okay.
  500.  
  501.        You might be wondering if you can round a constant.  To
  502.        see what happens, add the following line to test.pl
  503.        temporarily:
  504.  
  505.                &&&&MMMMyyyytttteeeesssstttt::::::::rrrroooouuuunnnndddd((((3333))));;;;
  506.  
  507.        Run "make test" and notice that Perl dies with a fatal
  508.        error.  Perl won't let you change the value of constants!
  509.  
  510.        WWWWHHHHAAAATTTT''''SSSS NNNNEEEEWWWW HHHHEEEERRRREEEE????
  511.  
  512.        Two things are new here.  First, we've made some changes
  513.        to Makefile.PL.  In this case, we've specified an extra
  514.        library to link in, in this case the math library, libm.
  515.        We'll talk later about how to write XSUBs that can call
  516.        every routine in a library.
  517.  
  518.        Second, the value of the function is being passed back not
  519.        as the function's return value, but through the same
  520.        variable that was passed into the function.
  521.  
  522.  
  523.  
  524.  
  525.  
  526. 12/Feb/96                perl 5.002 with                        8
  527.  
  528.  
  529.  
  530.  
  531.  
  532. PERLXSTUT(1)   User Contributed Perl Documentation   PERLXSTUT(1)
  533.  
  534.  
  535.        IIIINNNNPPPPUUUUTTTT AAAANNNNDDDD OOOOUUUUTTTTPPPPUUUUTTTT PPPPAAAARRRRAAAAMMMMEEEETTTTEEEERRRRSSSS
  536.  
  537.        You specify the parameters that will be passed into the
  538.        XSUB just after you declare the function return value and
  539.        name.  Each parameter line starts with optional white
  540.        space, and may have an optional terminating semicolon.
  541.  
  542.        The list of output parameters occurs after the OUTPUT:
  543.        directive.  The use of RETVAL tells Perl that you wish to
  544.        send this value back as the return value of the XSUB
  545.        function.  In Example 3, the value we wanted returned was
  546.        contained in the same variable we passed in, so we listed
  547.        it (and not RETVAL) in the OUTPUT: section.
  548.  
  549.        TTTTHHHHEEEE XXXXSSSSUUUUBBBBPPPPPPPP CCCCOOOOMMMMPPPPIIIILLLLEEEERRRR
  550.  
  551.        The compiler xsubpp takes the XS code in the .xs file and
  552.        converts it into C code, placing it in a file whose suffix
  553.        is .c.  The C code created makes heavy use of the C
  554.        functions within Perl.
  555.  
  556.        TTTTHHHHEEEE TTTTYYYYPPPPEEEEMMMMAAAAPPPP FFFFIIIILLLLEEEE
  557.  
  558.        The xsubpp compiler uses rules to convert from Perl's data
  559.        types (scalar, array, etc.) to C's data types (int, char
  560.        *, etc.).  These rules are stored in the typemap file
  561.        ($PERLLIB/ExtUtils/typemap).  This file is split into
  562.        three parts.
  563.  
  564.        The first part attempts to map various C data types to a
  565.        coded flag, which has some correspondence with the various
  566.        Perl types.  The second part contains C code which xsubpp
  567.        uses for input parameters.  The third part contains C code
  568.        which xsubpp uses for output parameters.  We'll talk more
  569.        about the C code later.
  570.  
  571.        Let's now take a look at a portion of the .c file created
  572.        for our extension.
  573.  
  574.  
  575.  
  576.  
  577.  
  578.  
  579.  
  580.  
  581.  
  582.  
  583.  
  584.  
  585.  
  586.  
  587.  
  588.  
  589.  
  590.  
  591.  
  592. 12/Feb/96                perl 5.002 with                        9
  593.  
  594.  
  595.  
  596.  
  597.  
  598. PERLXSTUT(1)   User Contributed Perl Documentation   PERLXSTUT(1)
  599.  
  600.  
  601.                XXXXSSSS((((XXXXSSSS____MMMMyyyytttteeeesssstttt____rrrroooouuuunnnndddd))))
  602.                {{{{
  603.                    ddddXXXXSSSSAAAARRRRGGGGSSSS;;;;
  604.                    iiiiffff ((((iiiitttteeeemmmmssss !!!!==== 1111))))
  605.                        ccccrrrrooooaaaakkkk((((""""UUUUssssaaaaggggeeee:::: MMMMyyyytttteeeesssstttt::::::::rrrroooouuuunnnndddd((((aaaarrrrgggg))))""""))));;;;
  606.                    {{{{
  607.                        ddddoooouuuubbbblllleeee  aaaarrrrgggg ==== ((((ddddoooouuuubbbblllleeee))))SSSSvvvvNNNNVVVV((((SSSSTTTT((((0000))))))));;;;      ////**** XXXXXXXXXXXXXXXXXXXX ****////
  608.                        iiiiffff ((((aaaarrrrgggg >>>> 0000....0000)))) {{{{
  609.                                aaaarrrrgggg ==== fffflllloooooooorrrr((((aaaarrrrgggg ++++ 0000....5555))));;;;
  610.                        }}}} eeeellllsssseeee iiiiffff ((((aaaarrrrgggg <<<< 0000....0000)))) {{{{
  611.                                aaaarrrrgggg ==== cccceeeeiiiillll((((aaaarrrrgggg ---- 0000....5555))));;;;
  612.                        }}}} eeeellllsssseeee {{{{
  613.                                aaaarrrrgggg ==== 0000....0000;;;;
  614.                        }}}}
  615.                        ssssvvvv____sssseeeettttnnnnvvvv((((SSSSTTTT((((0000)))),,,, ((((ddddoooouuuubbbblllleeee))))aaaarrrrgggg))));;;;   ////**** XXXXXXXXXXXXXXXXXXXX ****////
  616.                    }}}}
  617.                    XXXXSSSSRRRREEEETTTTUUUURRRRNNNN((((1111))));;;;
  618.                }}}}
  619.  
  620.        Notice the two lines marked with "XXXXX".  If you check
  621.        the first section of the typemap file, you'll see that
  622.        doubles are of type T_DOUBLE.  In the INPUT section, an
  623.        argument that is T_DOUBLE is assigned to the variable arg
  624.        by calling the routine SvNV on something, then casting it
  625.        to double, then assigned to the variable arg.  Similarly,
  626.        in the OUTPUT section, once arg has its final value, it is
  627.        passed to the sv_setnv function to be passed back to the
  628.        calling subroutine.  These two functions are explained in
  629.        the _p_e_r_l_g_u_t_s manpage; we'll talk more later about what
  630.        that "_S_T(0)" means in the section on the argument stack.
  631.  
  632.        WWWWAAAARRRRNNNNIIIINNNNGGGG
  633.  
  634.        In general, it's not a good idea to write extensions that
  635.        modify their input parameters, as in Example 3.  However,
  636.        in order to better accomodate calling pre-existing C
  637.        routines, which often do modify their input parameters,
  638.        this behavior is tolerated.
  639.  
  640.        EEEEXXXXAAAAMMMMPPPPLLLLEEEE 4444
  641.  
  642.        In this example, we'll now begin to write XSUB's that will
  643.        interact with pre-defined C libraries.  To begin with, we
  644.        will build a small library of our own, then let h2xs write
  645.        our .pm and .xs files for us.
  646.  
  647.        Create a new directory called Mytest2 at the same level as
  648.        the directory Mytest.  In the Mytest2 directory, create
  649.        another directory called mylib, and cd into that
  650.        directory.
  651.  
  652.        Here we'll create some files that will generate a test
  653.        library.  These will include a C source file and a header
  654.        file.  We'll also create a Makefile.PL in this directory.
  655.  
  656.  
  657.  
  658. 12/Feb/96                perl 5.002 with                       10
  659.  
  660.  
  661.  
  662.  
  663.  
  664. PERLXSTUT(1)   User Contributed Perl Documentation   PERLXSTUT(1)
  665.  
  666.  
  667.        Then we'll make sure that running make at the Mytest2
  668.        level will automatically run this Makefile.PL file and the
  669.        resulting Makefile.
  670.  
  671.        In the testlib directory, create a file mylib.h that looks
  672.        like this:
  673.  
  674.                ####ddddeeeeffffiiiinnnneeee TTTTEEEESSSSTTTTVVVVAAAALLLL 4444
  675.  
  676.                eeeexxxxtttteeeerrrrnnnn ddddoooouuuubbbblllleeee   ffffoooooooo((((iiiinnnntttt,,,, lllloooonnnngggg,,,, ccccoooonnnnsssstttt cccchhhhaaaarrrr****))));;;;
  677.  
  678.        Also create a file mylib.c that looks like this:
  679.  
  680.                ####iiiinnnncccclllluuuuddddeeee <<<<ssssttttddddlllliiiibbbb....hhhh>>>>
  681.                ####iiiinnnncccclllluuuuddddeeee """"....////mmmmyyyylllliiiibbbb....hhhh""""
  682.  
  683.                ddddoooouuuubbbblllleeee
  684.                ffffoooooooo((((aaaa,,,, bbbb,,,, cccc))))
  685.                iiiinnnntttt             aaaa;;;;
  686.                lllloooonnnngggg            bbbb;;;;
  687.                ccccoooonnnnsssstttt cccchhhhaaaarrrr ****    cccc;;;;
  688.                {{{{
  689.                        rrrreeeettttuuuurrrrnnnn ((((aaaa ++++ bbbb ++++ aaaattttooooffff((((cccc)))) ++++ TTTTEEEESSSSTTTTVVVVAAAALLLL))));;;;
  690.                }}}}
  691.  
  692.        And finally create a file Makefile.PL that looks like
  693.        this:
  694.  
  695.                uuuusssseeee EEEExxxxttttUUUUttttiiiillllssss::::::::MMMMaaaakkkkeeeeMMMMaaaakkkkeeeerrrr;;;;
  696.                $$$$VVVVeeeerrrrbbbboooosssseeee ==== 1111;;;;
  697.                WWWWrrrriiiitttteeeeMMMMaaaakkkkeeeeffffiiiilllleeee((((
  698.                    ''''NNNNAAAAMMMMEEEE'''' ====>>>> ''''MMMMyyyytttteeeesssstttt2222::::::::mmmmyyyylllliiiibbbb'''',,,,
  699.                    ''''cccclllleeeeaaaannnn''''     ====>>>> {{{{''''FFFFIIIILLLLEEEESSSS'''' ====>>>> ''''lllliiiibbbbmmmmyyyylllliiiibbbb....aaaa''''}}}},,,,
  700.                ))));;;;
  701.  
  702.                ssssuuuubbbb MMMMYYYY::::::::ppppoooossssttttaaaammmmbbbblllleeee {{{{
  703.                        ''''
  704.                aaaallllllll :::::::: ssssttttaaaattttiiiicccc
  705.  
  706.                ssssttttaaaattttiiiicccc ::::::::       lllliiiibbbbmmmmyyyylllliiiibbbb$$$$((((LLLLIIIIBBBB____EEEEXXXXTTTT))))
  707.  
  708.                lllliiiibbbbmmmmyyyylllliiiibbbb$$$$((((LLLLIIIIBBBB____EEEEXXXXTTTT)))):::: $$$$((((OOOO____FFFFIIIILLLLEEEESSSS))))
  709.                        $$$$((((AAAARRRR)))) ccccrrrr lllliiiibbbbmmmmyyyylllliiiibbbb$$$$((((LLLLIIIIBBBB____EEEEXXXXTTTT)))) $$$$((((OOOO____FFFFIIIILLLLEEEESSSS))))
  710.                        $$$$((((RRRRAAAANNNNLLLLIIIIBBBB)))) lllliiiibbbbmmmmyyyylllliiiibbbb$$$$((((LLLLIIIIBBBB____EEEEXXXXTTTT))))
  711.  
  712.                '''';;;;
  713.                }}}}
  714.  
  715.        We will now create the main top-level Mytest2 files.
  716.        Change to the directory above Mytest2 and run the
  717.        following command:
  718.  
  719.                %%%% hhhh2222xxxxssss ----OOOO ----nnnn MMMMyyyytttteeeesssstttt2222 <<<< ....////MMMMyyyytttteeeesssstttt2222////mmmmyyyylllliiiibbbb////mmmmyyyylllliiiibbbb....hhhh
  720.  
  721.  
  722.  
  723.  
  724. 12/Feb/96                perl 5.002 with                       11
  725.  
  726.  
  727.  
  728.  
  729.  
  730. PERLXSTUT(1)   User Contributed Perl Documentation   PERLXSTUT(1)
  731.  
  732.  
  733.        This will print out a warning about overwriting Mytest2,
  734.        but that's okay.  Our files are stored in Mytest2/mylib,
  735.        and will be untouched.
  736.  
  737.        The normal Makefile.PL that h2xs generates doesn't know
  738.        about the mylib directory.  We need to tell it that there
  739.        is a subdirectory and that we will be generating a library
  740.        in it.  Let's add the following key-value pair to the
  741.        WriteMakefile call:
  742.  
  743.                ''''MMMMYYYYEEEEXXXXTTTTLLLLIIIIBBBB'''' ====>>>> ''''mmmmyyyylllliiiibbbb////lllliiiibbbbmmmmyyyylllliiiibbbb$$$$((((LLLLIIIIBBBB____EEEEXXXXTTTT))))'''',,,,
  744.  
  745.        and a new replacement subroutine too:
  746.  
  747.                ssssuuuubbbb MMMMYYYY::::::::ppppoooossssttttaaaammmmbbbblllleeee {{{{
  748.                ''''
  749.                $$$$((((MMMMYYYYEEEEXXXXTTTTLLLLIIIIBBBB)))):::: mmmmyyyylllliiiibbbb////MMMMaaaakkkkeeeeffffiiiilllleeee
  750.                        ccccdddd mmmmyyyylllliiiibbbb &&&&&&&& $$$$((((MMMMAAAAKKKKEEEE))))
  751.                '''';;;;
  752.                }}}}
  753.  
  754.        (Note: Most makes will require that there be a tab
  755.        character that indents the line "cd mylib && $(MAKE)".)
  756.  
  757.        Let's also fix the MANIFEST file so that it accurately
  758.        reflects the contents of our extension.  The single line
  759.        that says "mylib" should be replaced by the following
  760.        three lines:
  761.  
  762.                mmmmyyyylllliiiibbbb////MMMMaaaakkkkeeeeffffiiiilllleeee....PPPPLLLL
  763.                mmmmyyyylllliiiibbbb////mmmmyyyylllliiiibbbb....cccc
  764.                mmmmyyyylllliiiibbbb////mmmmyyyylllliiiibbbb....hhhh
  765.  
  766.        To keep our namespace nice and unpolluted, edit the .pm
  767.        file and change the line setting @@@@EEEEXXXXPPPPOOOORRRRTTTT to @@@@EEEEXXXXPPPPOOOORRRRTTTT____OOOOKKKK.
  768.        And finally, in the .xs file, edit the #include line to
  769.        read:
  770.  
  771.                ####iiiinnnncccclllluuuuddddeeee """"mmmmyyyylllliiiibbbb////mmmmyyyylllliiiibbbb....hhhh""""
  772.  
  773.        And also add the following function definition to the end
  774.        of the .xs file:
  775.  
  776.                ddddoooouuuubbbblllleeee
  777.                ffffoooooooo((((aaaa,,,,bbbb,,,,cccc))))
  778.                        iiiinnnntttt             aaaa
  779.                        lllloooonnnngggg            bbbb
  780.                        ccccoooonnnnsssstttt cccchhhhaaaarrrr ****    cccc
  781.                        OOOOUUUUTTTTPPPPUUUUTTTT::::
  782.                        RRRREEEETTTTVVVVAAAALLLL
  783.  
  784.        Now we also need to create a typemap file because the
  785.        default Perl doesn't currently support the const char *
  786.        type.  Create a file called typemap and place the
  787.  
  788.  
  789.  
  790. 12/Feb/96                perl 5.002 with                       12
  791.  
  792.  
  793.  
  794.  
  795.  
  796. PERLXSTUT(1)   User Contributed Perl Documentation   PERLXSTUT(1)
  797.  
  798.  
  799.        following in it:
  800.  
  801.                ccccoooonnnnsssstttt cccchhhhaaaarrrr ****    TTTT____PPPPVVVV
  802.  
  803.        Now run perl on the top-level Makefile.PL.  Notice that it
  804.        also created a Makefile in the mylib directory.  Run make
  805.        and see that it does cd into the mylib directory and run
  806.        make in there as well.
  807.  
  808.        Now edit the test.pl script and change the BEGIN block to
  809.        print "1..4", and add the following lines to the end of
  810.        the script:
  811.  
  812.                pppprrrriiiinnnntttt &&&&MMMMyyyytttteeeesssstttt2222::::::::ffffoooooooo((((1111,,,, 2222,,,, """"HHHHeeeelllllllloooo,,,, wwwwoooorrrrlllldddd!!!!"""")))) ======== 7777 ???? """"ooookkkk 2222\\\\nnnn"""" :::: """"nnnnooootttt ooookkkk 2222\\\\nnnn"""";;;;
  813.                pppprrrriiiinnnntttt &&&&MMMMyyyytttteeeesssstttt2222::::::::ffffoooooooo((((1111,,,, 2222,,,, """"0000....0000"""")))) ======== 7777 ???? """"ooookkkk 3333\\\\nnnn"""" :::: """"nnnnooootttt ooookkkk 3333\\\\nnnn"""";;;;
  814.                pppprrrriiiinnnntttt aaaabbbbssss((((&&&&MMMMyyyytttteeeesssstttt2222::::::::ffffoooooooo((((0000,,,, 0000,,,, """"----3333....4444"""")))) ---- 0000....6666)))) <<<<==== 0000....00001111 ???? """"ooookkkk 4444\\\\nnnn"""" :::: """"nnnnooootttt ooookkkk 4444\\\\nnnn"""";;;;
  815.  
  816.        (When dealing with floating-point comparisons, it is often
  817.        useful to not check for equality, but rather the
  818.        difference being below a certain epsilon factor, 0.01 in
  819.        this case)
  820.  
  821.        Run "make test" and all should be well.  Unlike previous
  822.        examples, we've now run h2xs on a real include file.  This
  823.        has caused some extra goodies to appear in both the .pm
  824.        and .xs files.
  825.  
  826.        +o
  827.        In the .xs file, there's now a #include declaration with
  828.        the full path to the mylib.h header file.
  829.  
  830.        +o
  831.        There's now some new C code that's been added to the .xs
  832.        file.  The purpose of the ccccoooonnnnssssttttaaaannnntttt routine is to make the
  833.        values that are #define'd in the header file available to
  834.        the Perl script (in this case, by calling &&&&mmmmaaaaiiiinnnn::::::::TTTTEEEESSSSTTTTVVVVAAAALLLL).
  835.        There's also some XS code to allow calls to the ccccoooonnnnssssttttaaaannnntttt
  836.        routine.
  837.  
  838.        +o
  839.        The .pm file has exported the name TESTVAL in the @@@@EEEEXXXXPPPPOOOORRRRTTTT
  840.        array.  This could lead to name clashes.  A good rule of
  841.        thumb is that if the #define is only going to be used by
  842.        the C routines themselves, and not by the user, they
  843.        should be removed from the @@@@EEEEXXXXPPPPOOOORRRRTTTT array.  Alternately, if
  844.        you don't mind using the "fully qualified name" of a
  845.        variable, you could remove most or all of the items in the
  846.        @@@@EEEEXXXXPPPPOOOORRRRTTTT array.
  847.  
  848.        We've also told Perl about the library that we built in
  849.        the mylib subdirectory.  That required only the addition
  850.        of the MYEXTLIB variable to the WriteMakefile call and the
  851.        replacement of the postamble subroutine to cd into the
  852.        subdirectory and run make.  The Makefile.PL for the
  853.  
  854.  
  855.  
  856. 12/Feb/96                perl 5.002 with                       13
  857.  
  858.  
  859.  
  860.  
  861.  
  862. PERLXSTUT(1)   User Contributed Perl Documentation   PERLXSTUT(1)
  863.  
  864.  
  865.        library is a bit more complicated, but not excessively so.
  866.        Again we replaced the postamble subroutine to insert our
  867.        own code.  This code simply specified that the library to
  868.        be created here was a static archive (as opposed to a
  869.        dynamically loadable library) and provided the commands to
  870.        build it.
  871.  
  872.        SSSSPPPPEEEECCCCIIIIFFFFYYYYIIIINNNNGGGG AAAARRRRGGGGUUUUMMMMEEEENNNNTTTTSSSS TTTTOOOO XXXXSSSSUUUUBBBBPPPPPPPP
  873.  
  874.        With the completion of Example 4, we now have an easy way
  875.        to simulate some real-life libraries whose interfaces may
  876.        not be the cleanest in the world.  We shall now continue
  877.        with a discussion of the arguments passed to the xsubpp
  878.        compiler.
  879.  
  880.        When you specify arguments in the .xs file, you are really
  881.        passing three pieces of information for each one listed.
  882.        The first piece is the order of that argument relative to
  883.        the others (first, second, etc).  The second is the type
  884.        of argument, and consists of the type declaration of the
  885.        argument (e.g., int, char*, etc).  The third piece is the
  886.        exact way in which the argument should be used in the call
  887.        to the library function from this XSUB.  This would mean
  888.        whether or not to place a "&" before the argument or not,
  889.        meaning the argument expects to be passed the address of
  890.        the specified data type.
  891.  
  892.        There is a difference between the two arguments in this
  893.        hypothetical function:
  894.  
  895.                iiiinnnntttt
  896.                ffffoooooooo((((aaaa,,,,bbbb))))
  897.                        cccchhhhaaaarrrr    &&&&aaaa
  898.                        cccchhhhaaaarrrr ****  bbbb
  899.  
  900.        The first argument to this function would be treated as a
  901.        char and assigned to the variable a, and its address would
  902.        be passed into the function foo.  The second argument
  903.        would be treated as a string pointer and assigned to the
  904.        variable b.  The _v_a_l_u_e of b would be passed into the
  905.        function foo.  The actual call to the function foo that
  906.        xsubpp generates would look like this:
  907.  
  908.                ffffoooooooo((((&&&&aaaa,,,, bbbb))));;;;
  909.  
  910.        Xsubpp will identically parse the following function
  911.        argument lists:
  912.  
  913.                cccchhhhaaaarrrr    &&&&aaaa
  914.                cccchhhhaaaarrrr&&&&aaaa
  915.                cccchhhhaaaarrrr    &&&& aaaa
  916.  
  917.        However, to help ease understanding, it is suggested that
  918.        you place a "&" next to the variable name and away from
  919.  
  920.  
  921.  
  922. 12/Feb/96                perl 5.002 with                       14
  923.  
  924.  
  925.  
  926.  
  927.  
  928. PERLXSTUT(1)   User Contributed Perl Documentation   PERLXSTUT(1)
  929.  
  930.  
  931.        the variable type), and place a "*" near the variable
  932.        type, but away from the variable name (as in the complete
  933.        example above).  By doing so, it is easy to understand
  934.        exactly what will be passed to the C function -- it will
  935.        be whatever is in the "last column".
  936.  
  937.        You should take great pains to try to pass the function
  938.        the type of variable it wants, when possible.  It will
  939.        save you a lot of trouble in the long run.
  940.  
  941.        TTTTHHHHEEEE AAAARRRRGGGGUUUUMMMMEEEENNNNTTTT SSSSTTTTAAAACCCCKKKK
  942.  
  943.        If we look at any of the C code generated by any of the
  944.        examples except example 1, you will notice a number of
  945.        references to _S_T(n), where n is usually 0.  The "ST" is
  946.        actually a macro that points to the n'th argument on the
  947.        argument stack.  _S_T(0) is thus the first argument passed
  948.        to the XSUB, _S_T(1) is the second argument, and so on.
  949.  
  950.        When you list the arguments to the XSUB in the .xs file,
  951.        that tell xsubpp which argument corresponds to which of
  952.        the argument stack (i.e., the first one listed is the
  953.        first argument, and so on).  You invite disaster if you do
  954.        not list them in the same order as the function expects
  955.        them.
  956.  
  957.        EEEEXXXXTTTTEEEENNNNDDDDIIIINNNNGGGG YYYYOOOOUUUURRRR EEEEXXXXTTTTEEEENNNNSSSSIIIIOOOONNNN
  958.  
  959.        Sometimes you might want to provide some extra methods or
  960.        subroutines to assist in making the interface between Perl
  961.        and your extension simpler or easier to understand.  These
  962.        routines should live in the .pm file.  Whether they are
  963.        automatically loaded when the extension itself is loaded
  964.        or only loaded when called depends on where in the .pm
  965.        file the subroutine definition is placed.
  966.  
  967.        DDDDOOOOCCCCUUUUMMMMEEEENNNNTTTTIIIINNNNGGGG YYYYOOOOUUUURRRR EEEEXXXXTTTTEEEENNNNSSSSIIIIOOOONNNN
  968.  
  969.        There is absolutely no excuse for not documenting your
  970.        extension.  Documentation belongs in the .pm file.  This
  971.        file will be fed to pod2man, and the embedded
  972.        documentation will be converted to the man page format,
  973.        then placed in the blib directory.  It will be copied to
  974.        Perl's man page directory when the extension is installed.
  975.  
  976.        You may intersperse documentation and Perl code within the
  977.        .pm file.  In fact, if you want to use method autoloading,
  978.        you must do this, as the comment inside the .pm file
  979.        explains.
  980.  
  981.        See the _p_e_r_l_p_o_d manpage for more information about the pod
  982.        format.
  983.  
  984.  
  985.  
  986.  
  987.  
  988. 12/Feb/96                perl 5.002 with                       15
  989.  
  990.  
  991.  
  992.  
  993.  
  994. PERLXSTUT(1)   User Contributed Perl Documentation   PERLXSTUT(1)
  995.  
  996.  
  997.        IIIINNNNSSSSTTTTAAAALLLLLLLLIIIINNNNGGGG YYYYOOOOUUUURRRR EEEEXXXXTTTTEEEENNNNSSSSIIIIOOOONNNN
  998.  
  999.        Once your extension is complete and passes all its tests,
  1000.        installing it is quite simple: you simply run "make
  1001.        install".  You will either need to have write permission
  1002.        into the directories where Perl is installed, or ask your
  1003.        system administrator to run the make for you.
  1004.  
  1005.        SSSSEEEEEEEE AAAALLLLSSSSOOOO
  1006.  
  1007.        For more information, consult the _p_e_r_l_g_u_t_s manpage, the
  1008.        _p_e_r_l_x_s manpage, the _p_e_r_l_m_o_d manpage, and the _p_e_r_l_p_o_d
  1009.        manpage.
  1010.  
  1011.        AAAAuuuutttthhhhoooorrrr
  1012.  
  1013.        Jeff Okamoto <okamoto@corp.hp.com>
  1014.  
  1015.        Reviewed and assisted by Dean Roehrich, Ilya Zakharevich,
  1016.        Andreas Koenig, and Tim Bunce.
  1017.  
  1018.        LLLLaaaasssstttt CCCChhhhaaaannnnggggeeeedddd
  1019.  
  1020.        1996/2/9
  1021.  
  1022.  
  1023.  
  1024.  
  1025.  
  1026.  
  1027.  
  1028.  
  1029.  
  1030.  
  1031.  
  1032.  
  1033.  
  1034.  
  1035.  
  1036.  
  1037.  
  1038.  
  1039.  
  1040.  
  1041.  
  1042.  
  1043.  
  1044.  
  1045.  
  1046.  
  1047.  
  1048.  
  1049.  
  1050.  
  1051.  
  1052.  
  1053.  
  1054. 12/Feb/96                perl 5.002 with                       16
  1055.  
  1056.  
  1057.