home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-03-02 | 132.8 KB | 2,311 lines |
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- NNNNAAAAMMMMEEEE
- perlcall - Perl calling conventions from C
-
- DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNN
- The purpose of this document is to show you how to call
- Perl subroutines directly from C, i.e. how to write
- _c_a_l_l_b_a_c_k_s.
-
- Apart from discussing the C interface provided by Perl for
- writing callbacks the document uses a series of examples
- to show how the interface actually works in practice. In
- addition some techniques for coding callbacks are covered.
-
- Examples where callbacks are necessary include
-
- +o An Error Handler
- You have created an XSUB interface to an
- application's C API.
-
- A fairly common feature in applications is to allow
- you to define a C function that will be called
- whenever something nasty occurs. What we would like
- is to be able to specify a Perl subroutine that will
- be called instead.
-
- +o An Event Driven Program
- The classic example of where callbacks are used is
- when writing an event driven program like for an X
- windows application. In this case your register
- functions to be called whenever specific events
- occur, e.g. a mouse button is pressed, the cursor
- moves into a window or a menu item is selected.
-
- Although the techniques described here are applicable when
- embedding Perl in a C program, this is not the primary
- goal of this document. There are other details that must
- be considered and are specific to embedding Perl. For
- details on embedding Perl in C refer to the _p_e_r_l_e_m_b_e_d
- manpage.
-
- Before you launch yourself head first into the rest of
- this document, it would be a good idea to have read the
- following two documents - the _p_e_r_l_x_s manpage and the
- _p_e_r_l_g_u_t_s manpage.
-
- TTTTHHHHEEEE PPPPEEEERRRRLLLL____CCCCAAAALLLLLLLL FFFFUUUUNNNNCCCCTTTTIIIIOOOONNNNSSSS
- Although this stuff is easier to explain using examples,
- you first need be aware of a few important definitions.
-
- Perl has a number of C functions that allow you to call
- Perl subroutines. They are
-
-
-
-
-
-
- 29/Jan/96 perl 5.002 with 1
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- IIII33332222 ppppeeeerrrrllll____ccccaaaallllllll____ssssvvvv((((SSSSVVVV**** ssssvvvv,,,, IIII33332222 ffffllllaaaaggggssss)))) ;;;;
- IIII33332222 ppppeeeerrrrllll____ccccaaaallllllll____ppppvvvv((((cccchhhhaaaarrrr ****ssssuuuubbbbnnnnaaaammmmeeee,,,, IIII33332222 ffffllllaaaaggggssss)))) ;;;;
- IIII33332222 ppppeeeerrrrllll____ccccaaaallllllll____mmmmeeeetttthhhhoooodddd((((cccchhhhaaaarrrr ****mmmmeeeetttthhhhnnnnaaaammmmeeee,,,, IIII33332222 ffffllllaaaaggggssss)))) ;;;;
- IIII33332222 ppppeeeerrrrllll____ccccaaaallllllll____aaaarrrrggggvvvv((((cccchhhhaaaarrrr ****ssssuuuubbbbnnnnaaaammmmeeee,,,, IIII33332222 ffffllllaaaaggggssss,,,, rrrreeeeggggiiiisssstttteeeerrrr cccchhhhaaaarrrr ********aaaarrrrggggvvvv)))) ;;;;
-
- The key function is _p_e_r_l___c_a_l_l___s_v. All the other functions
- are fairly simple wrappers which make it easier to call
- Perl subroutines in special cases. At the end of the day
- they will all call _p_e_r_l___c_a_l_l___s_v to actually invoke the
- Perl subroutine.
-
- All the _p_e_r_l___c_a_l_l___* functions have a ffffllllaaaaggggssss parameter which
- is used to pass a bit mask of options to Perl. This bit
- mask operates identically for each of the functions. The
- settings available in the bit mask are discussed in the
- section on _F_L_A_G _V_A_L_U_E_S.
-
- Each of the functions will now be discussed in turn.
-
- ppppeeeerrrrllll____ccccaaaallllllll____ssssvvvv
- _p_e_r_l___c_a_l_l___s_v takes two parameters, the first, ssssvvvv, is
- an SV*. This allows you to specify the Perl
- subroutine to be called either as a C string (which
- has first been converted to an SV) or a reference to
- a subroutine. The section, _U_s_i_n_g _p_e_r_l___c_a_l_l___s_v, shows
- how you can make use of _p_e_r_l___c_a_l_l___s_v.
-
- ppppeeeerrrrllll____ccccaaaallllllll____ppppvvvv
- The function, _p_e_r_l___c_a_l_l___p_v, is similar to
- _p_e_r_l___c_a_l_l___s_v except it expects its first parameter to
- be a C char* which identifies the Perl subroutine you
- want to call, e.g. ppppeeeerrrrllll____ccccaaaallllllll____ppppvvvv((((""""ffffrrrreeeedddd"""",,,, 0000)))). If the
- subroutine you want to call is in another package,
- just include the package name in the string, e.g.
- """"ppppkkkkgggg::::::::ffffrrrreeeedddd"""".
-
- ppppeeeerrrrllll____ccccaaaallllllll____mmmmeeeetttthhhhoooodddd
- The function _p_e_r_l___c_a_l_l___m_e_t_h_o_d is used to call a
- method from a Perl class. The parameter mmmmeeeetttthhhhnnnnaaaammmmeeee
- corresponds to the name of the method to be called.
- Note that the class that the method belongs to is
- passed on the Perl stack rather than in the parameter
- list. This class can be either the name of the class
- (for a static method) or a reference to an object
- (for a virtual method). See the _p_e_r_l_o_b_j manpage for
- more information on static and virtual methods and
- the section on _U_s_i_n_g _p_e_r_l___c_a_l_l___m_e_t_h_o_d for an example
- of using _p_e_r_l___c_a_l_l___m_e_t_h_o_d.
-
- ppppeeeerrrrllll____ccccaaaallllllll____aaaarrrrggggvvvv
- _p_e_r_l___c_a_l_l___a_r_g_v calls the Perl subroutine specified by
- the C string stored in the ssssuuuubbbbnnnnaaaammmmeeee parameter. It also
- takes the usual ffffllllaaaaggggssss parameter. The final
- parameter, aaaarrrrggggvvvv, consists of a NULL terminated list
-
-
-
- 29/Jan/96 perl 5.002 with 2
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- of C strings to be passed as parameters to the Perl
- subroutine. See _U_s_i_n_g _p_e_r_l___c_a_l_l___a_r_g_v.
-
- All the functions return an integer. This is a count of
- the number of items returned by the Perl subroutine. The
- actual items returned by the subroutine are stored on the
- Perl stack.
-
- As a general rule you should _a_l_w_a_y_s check the return value
- from these functions. Even if you are expecting only a
- particular number of values to be returned from the Perl
- subroutine, there is nothing to stop someone from doing
- something unexpected - don't say you haven't been warned.
-
- FFFFLLLLAAAAGGGG VVVVAAAALLLLUUUUEEEESSSS
- The ffffllllaaaaggggssss parameter in all the _p_e_r_l___c_a_l_l___* functions is a
- bit mask which can consist of any combination of the
- symbols defined below, OR'ed together.
-
- GGGG____SSSSCCCCAAAALLLLAAAARRRR
-
- Calls the Perl subroutine in a scalar context. This is
- the default context flag setting for all the _p_e_r_l___c_a_l_l___*
- functions.
-
- This flag has 2 effects
-
- 1. it indicates to the subroutine being called that it
- is executing in a scalar context (if it executes
- _w_a_n_t_a_r_r_a_y the result will be false).
-
- 2. it ensures that only a scalar is actually returned
- from the subroutine. The subroutine can, of course,
- ignore the _w_a_n_t_a_r_r_a_y and return a list anyway. If so,
- then only the last element of the list will be
- returned.
-
- The value returned by the _p_e_r_l___c_a_l_l___* function indicates
- how may items have been returned by the Perl subroutine -
- in this case it will be either 0 or 1.
-
- If 0, then you have specified the G_DISCARD flag.
-
- If 1, then the item actually returned by the Perl
- subroutine will be stored on the Perl stack - the section
- _R_e_t_u_r_n_i_n_g _a _S_c_a_l_a_r shows how to access this value on the
- stack. Remember that regardless of how many items the
- Perl subroutine returns, only the last one will be
- accessible from the stack - think of the case where only
- one value is returned as being a list with only one
- element. Any other items that were returned will not
- exist by the time control returns from the _p_e_r_l___c_a_l_l___*
- function. The section _R_e_t_u_r_n_i_n_g _a _l_i_s_t _i_n _a _s_c_a_l_a_r
- _c_o_n_t_e_x_t shows an example of this behaviour.
-
-
-
- 29/Jan/96 perl 5.002 with 3
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- GGGG____AAAARRRRRRRRAAAAYYYY
-
- Calls the Perl subroutine in a list context.
-
- As with G_SCALAR, this flag has 2 effects
-
- 1. it indicates to the subroutine being called that it
- is executing in an array context (if it executes
- _w_a_n_t_a_r_r_a_y the result will be true).
-
- 2. it ensures that all items returned from the
- subroutine will be accessible when control returns
- from the _p_e_r_l___c_a_l_l___* function.
-
- The value returned by the _p_e_r_l___c_a_l_l___* function indicates
- how may items have been returned by the Perl subroutine.
-
- If 0, the you have specified the G_DISCARD flag.
-
- If not 0, then it will be a count of the number of items
- returned by the subroutine. These items will be stored on
- the Perl stack. The section _R_e_t_u_r_n_i_n_g _a _l_i_s_t _o_f _v_a_l_u_e_s
- gives an example of using the G_ARRAY flag and the
- mechanics of accessing the returned items from the Perl
- stack.
-
- GGGG____DDDDIIIISSSSCCCCAAAARRRRDDDD
-
- By default, the _p_e_r_l___c_a_l_l___* functions place the items
- returned from by the Perl subroutine on the stack. If you
- are not interested in these items, then setting this flag
- will make Perl get rid of them automatically for you.
- Note that it is still possible to indicate a context to
- the Perl subroutine by using either G_SCALAR or G_ARRAY.
-
- If you do not set this flag then it is _v_e_r_y important that
- you make sure that any temporaries (i.e. parameters passed
- to the Perl subroutine and values returned from the
- subroutine) are disposed of yourself. The section
- _R_e_t_u_r_n_i_n_g _a _S_c_a_l_a_r gives details of how to explicitly
- dispose of these temporaries and the section _U_s_i_n_g _P_e_r_l _t_o
- _d_i_s_p_o_s_e _o_f _t_e_m_p_o_r_a_r_i_e_s discusses the specific
- circumstances where you can ignore the problem and let
- Perl deal with it for you.
-
- GGGG____NNNNOOOOAAAARRRRGGGGSSSS
-
- Whenever a Perl subroutine is called using one of the
- _p_e_r_l___c_a_l_l___* functions, it is assumed by default that
- parameters are to be passed to the subroutine. If you are
- not passing any parameters to the Perl subroutine, you can
- save a bit of time by setting this flag. It has the
- effect of not creating the @@@@____ array for the Perl
- subroutine.
-
-
-
- 29/Jan/96 perl 5.002 with 4
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- Although the functionality provided by this flag may seem
- straightforward, it should be used only if there is a good
- reason to do so. The reason for being cautious is that
- even if you have specified the G_NOARGS flag, it is still
- possible for the Perl subroutine that has been called to
- think that you have passed it parameters.
-
- In fact, what can happen is that the Perl subroutine you
- have called can access the @@@@____ array from a previous Perl
- subroutine. This will occur when the code that is
- executing the _p_e_r_l___c_a_l_l___* function has itself been called
- from another Perl subroutine. The code below illustrates
- this
-
- ssssuuuubbbb ffffrrrreeeedddd
- {{{{ pppprrrriiiinnnntttt """"@@@@____\\\\nnnn"""" }}}}
-
- ssssuuuubbbb jjjjooooeeee
- {{{{ &&&&ffffrrrreeeedddd }}}}
-
- &&&&jjjjooooeeee((((1111,,,,2222,,,,3333)))) ;;;;
-
- This will print
-
- 1111 2222 3333
-
- What has happened is that ffffrrrreeeedddd accesses the @@@@____ array which
- belongs to jjjjooooeeee.
-
- GGGG____EEEEVVVVAAAALLLL
-
- It is possible for the Perl subroutine you are calling to
- terminate abnormally, e.g. by calling _d_i_e explicitly or by
- not actually existing. By default, when either of these
- of events occurs, the process will terminate immediately.
- If though, you want to trap this type of event, specify
- the G_EVAL flag. It will put an _e_v_a_l _{ _} around the
- subroutine call.
-
- Whenever control returns from the _p_e_r_l___c_a_l_l___* function you
- need to check the $$$$@@@@ variable as you would in a normal
- Perl script.
-
- The value returned from the _p_e_r_l___c_a_l_l___* function is
- dependent on what other flags have been specified and
- whether an error has occurred. Here are all the different
- cases that can occur
-
- +o If the _p_e_r_l___c_a_l_l___* function returns normally, then
- the value returned is as specified in the previous
- sections.
-
- +o If G_DISCARD is specified, the return value will
- always be 0.
-
-
-
- 29/Jan/96 perl 5.002 with 5
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- +o If G_ARRAY is specified _a_n_d an error has occurred,
- the return value will always be 0.
-
- +o If G_SCALAR is specified _a_n_d an error has occurred,
- the return value will be 1 and the value on the top
- of the stack will be _u_n_d_e_f. This means that if you
- have already detected the error by checking $$$$@@@@ and
- you want the program to continue, you must remember
- to pop the _u_n_d_e_f from the stack.
-
- See _U_s_i_n_g _G___E_V_A_L for details of using G_EVAL.
-
- GGGG____KKKKEEEEEEEEPPPPEEEERRRRRRRR
-
- You may have noticed that using the G_EVAL flag described
- above will aaaallllwwwwaaaayyyyssss clear the $$$$@@@@ variable and set it to a
- string describing the error iff there was an error in the
- called code. This unqualified resetting of $$$$@@@@ can be
- problematic in the reliable identification of errors using
- the eeeevvvvaaaallll {{{{}}}} mechanism, because the possibility exists that
- perl will call other code (end of block processing code,
- for example) between the time the error causes $$$$@@@@ to be
- set within eeeevvvvaaaallll {{{{}}}}, and the subsequent statement which
- checks for the value of $$$$@@@@ gets executed in the user's
- script.
-
- This scenario will mostly be applicable to code that is
- meant to be called from within destructors, asynchronous
- callbacks, signal handlers, ________DDDDIIIIEEEE________ or ________WWWWAAAARRRRNNNN________ hooks, and
- ttttiiiieeee functions. In such situations, you will not want to
- clear $$$$@@@@ at all, but simply to append any new errors to
- any existing value of $$$$@@@@.
-
- The G_KEEPERR flag is meant to be used in conjunction with
- G_EVAL in _p_e_r_l___c_a_l_l___* functions that are used to implement
- such code. This flag has no effect when G_EVAL is not
- used.
-
- When G_KEEPERR is used, any errors in the called code will
- be prefixed with the string "\t(in cleanup)", and appended
- to the current value of $$$$@@@@.
-
- The G_KEEPERR flag was introduced in Perl version 5.002.
-
- See _U_s_i_n_g _G___K_E_E_P_E_R_R for an example of a situation that
- warrants the use of this flag.
-
- DDDDeeeetttteeeerrrrmmmmiiiinnnniiiinnnngggg tttthhhheeee CCCCoooonnnntttteeeexxxxtttt
-
- As mentioned above, you can determine the context of the
- currently executing subroutine in Perl with _w_a_n_t_a_r_r_a_y. The
- equivalent test can be made in C by using the GGGGIIIIMMMMMMMMEEEE macro.
- This will return GGGG____SSSSCCCCAAAALLLLAAAARRRR if you have been called in a
- scalar context and GGGG____AAAARRRRRRRRAAAAYYYY if in an array context. An
-
-
-
- 29/Jan/96 perl 5.002 with 6
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- example of using the GGGGIIIIMMMMMMMMEEEE macro is shown in section _U_s_i_n_g
- _G_I_M_M_E.
-
- KKKKNNNNOOOOWWWWNNNN PPPPRRRROOOOBBBBLLLLEEEEMMMMSSSS
- This section outlines all known problems that exist in the
- _p_e_r_l___c_a_l_l___* functions.
-
- 1. If you are intending to make use of both the G_EVAL
- and G_SCALAR flags in your code, use a version of
- Perl greater than 5.000. There is a bug in version
- 5.000 of Perl which means that the combination of
- these two flags will not work as described in the
- section _F_L_A_G _V_A_L_U_E_S.
-
- Specifically, if the two flags are used when calling
- a subroutine and that subroutine does not call _d_i_e,
- the value returned by _p_e_r_l___c_a_l_l___* will be wrong.
-
- 2. In Perl 5.000 and 5.001 there is a problem with using
- _p_e_r_l___c_a_l_l___* if the Perl sub you are calling attempts
- to trap a _d_i_e.
-
- The symptom of this problem is that the called Perl
- sub will continue to completion, but whenever it
- attempts to pass control back to the XSUB, the
- program will immediately terminate.
-
- For example, say you want to call this Perl sub
-
- ssssuuuubbbb ffffrrrreeeedddd
- {{{{
- eeeevvvvaaaallll {{{{ ddddiiiieeee """"FFFFaaaattttaaaallll EEEErrrrrrrroooorrrr"""" ;;;; }}}}
- pppprrrriiiinnnntttt """"TTTTrrrraaaappppppppeeeedddd eeeerrrrrrrroooorrrr:::: $$$$@@@@\\\\nnnn""""
- iiiiffff $$$$@@@@ ;;;;
- }}}}
-
- via this XSUB
-
- vvvvooooiiiidddd
- CCCCaaaallllllll____ffffrrrreeeedddd(((())))
- CCCCOOOODDDDEEEE::::
- PPPPUUUUSSSSHHHHMMMMAAAARRRRKKKK((((sssspppp)))) ;;;;
- ppppeeeerrrrllll____ccccaaaallllllll____ppppvvvv((((""""ffffrrrreeeedddd"""",,,, GGGG____DDDDIIIISSSSCCCCAAAARRRRDDDD||||GGGG____NNNNOOOOAAAARRRRGGGGSSSS)))) ;;;;
- ffffpppprrrriiiinnnnttttffff((((ssssttttddddeeeerrrrrrrr,,,, """"bbbbaaaacccckkkk iiiinnnn CCCCaaaallllllll____ffffrrrreeeedddd\\\\nnnn"""")))) ;;;;
-
- When CCCCaaaallllllll____ffffrrrreeeedddd is executed it will print
-
- TTTTrrrraaaappppppppeeeedddd eeeerrrrrrrroooorrrr:::: FFFFaaaattttaaaallll EEEErrrrrrrroooorrrr
-
- As control never returns to CCCCaaaallllllll____ffffrrrreeeedddd, the """"bbbbaaaacccckkkk iiiinnnn
- CCCCaaaallllllll____ffffrrrreeeedddd"""" string will not get printed.
-
- To work around this problem, you can either upgrade
- to Perl 5.002 (or later), or use the G_EVAL flag with
-
-
-
- 29/Jan/96 perl 5.002 with 7
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- _p_e_r_l___c_a_l_l___* as shown below
-
- vvvvooooiiiidddd
- CCCCaaaallllllll____ffffrrrreeeedddd(((())))
- CCCCOOOODDDDEEEE::::
- PPPPUUUUSSSSHHHHMMMMAAAARRRRKKKK((((sssspppp)))) ;;;;
- ppppeeeerrrrllll____ccccaaaallllllll____ppppvvvv((((""""ffffrrrreeeedddd"""",,,, GGGG____EEEEVVVVAAAALLLL||||GGGG____DDDDIIIISSSSCCCCAAAARRRRDDDD||||GGGG____NNNNOOOOAAAARRRRGGGGSSSS)))) ;;;;
- ffffpppprrrriiiinnnnttttffff((((ssssttttddddeeeerrrrrrrr,,,, """"bbbbaaaacccckkkk iiiinnnn CCCCaaaallllllll____ffffrrrreeeedddd\\\\nnnn"""")))) ;;;;
-
-
- EEEEXXXXAAAAMMMMPPPPLLLLEEEESSSS
- Enough of the definition talk, let's have a few examples.
-
- Perl provides many macros to assist in accessing the Perl
- stack. Wherever possible, these macros should always be
- used when interfacing to Perl internals. Hopefully this
- should make the code less vulnerable to any changes made
- to Perl in the future.
-
- Another point worth noting is that in the first series of
- examples I have made use of only the _p_e_r_l___c_a_l_l___p_v
- function. This has been done to keep the code simpler and
- ease you into the topic. Wherever possible, if the choice
- is between using _p_e_r_l___c_a_l_l___p_v and _p_e_r_l___c_a_l_l___s_v, you should
- always try to use _p_e_r_l___c_a_l_l___s_v. See _U_s_i_n_g _p_e_r_l___c_a_l_l___s_v
- for details.
-
- NNNNoooo PPPPaaaarrrraaaammmmeeeetttteeeerrrrssss,,,, NNNNooootttthhhhiiiinnnngggg rrrreeeettttuuuurrrrnnnneeeedddd
-
- This first trivial example will call a Perl subroutine,
- _P_r_i_n_t_U_I_D, to print out the UID of the process.
-
- ssssuuuubbbb PPPPrrrriiiinnnnttttUUUUIIIIDDDD
- {{{{
- pppprrrriiiinnnntttt """"UUUUIIIIDDDD iiiissss $$$$<<<<\\\\nnnn"""" ;;;;
- }}}}
-
- and here is a C function to call it
-
- ssssttttaaaattttiiiicccc vvvvooooiiiidddd
- ccccaaaallllllll____PPPPrrrriiiinnnnttttUUUUIIIIDDDD(((())))
- {{{{
- ddddSSSSPPPP ;;;;
-
- PPPPUUUUSSSSHHHHMMMMAAAARRRRKKKK((((sssspppp)))) ;;;;
- ppppeeeerrrrllll____ccccaaaallllllll____ppppvvvv((((""""PPPPrrrriiiinnnnttttUUUUIIIIDDDD"""",,,, GGGG____DDDDIIIISSSSCCCCAAAARRRRDDDD||||GGGG____NNNNOOOOAAAARRRRGGGGSSSS)))) ;;;;
- }}}}
-
- Simple, eh.
-
- A few points to note about this example.
-
- 1. Ignore ddddSSSSPPPP and PPPPUUUUSSSSHHHHMMMMAAAARRRRKKKK((((sssspppp)))) for now. They will be
- discussed in the next example.
-
-
-
- 29/Jan/96 perl 5.002 with 8
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- 2. We aren't passing any parameters to _P_r_i_n_t_U_I_D so
- G_NOARGS can be specified.
-
- 3. We aren't interested in anything returned from
- _P_r_i_n_t_U_I_D, so G_DISCARD is specified. Even if _P_r_i_n_t_U_I_D
- was changed to actually return some _v_a_l_u_e(s), having
- specified G_DISCARD will mean that they will be wiped
- by the time control returns from _p_e_r_l___c_a_l_l___p_v.
-
- 4. As _p_e_r_l___c_a_l_l___p_v is being used, the Perl subroutine is
- specified as a C string. In this case the subroutine
- name has been 'hard-wired' into the code.
-
- 5. Because we specified G_DISCARD, it is not necessary
- to check the value returned from _p_e_r_l___c_a_l_l___p_v. It
- will always be 0.
-
- PPPPaaaassssssssiiiinnnngggg PPPPaaaarrrraaaammmmeeeetttteeeerrrrssss
-
- Now let's make a slightly more complex example. This time
- we want to call a Perl subroutine, LLLLeeeeffffttttSSSSttttrrrriiiinnnngggg, which will
- take 2 parameters - a string ($$$$ssss) and an integer ($$$$nnnn).
- The subroutine will simply print the first $$$$nnnn characters
- of the string.
-
- So the Perl subroutine would look like this
-
- ssssuuuubbbb LLLLeeeeffffttttSSSSttttrrrriiiinnnngggg
- {{{{
- mmmmyyyy(((($$$$ssss,,,, $$$$nnnn)))) ==== @@@@____ ;;;;
- pppprrrriiiinnnntttt ssssuuuubbbbssssttttrrrr(((($$$$ssss,,,, 0000,,,, $$$$nnnn)))),,,, """"\\\\nnnn"""" ;;;;
- }}}}
-
- The C function required to call _L_e_f_t_S_t_r_i_n_g would look like
- this.
-
- ssssttttaaaattttiiiicccc vvvvooooiiiidddd
- ccccaaaallllllll____LLLLeeeeffffttttSSSSttttrrrriiiinnnngggg((((aaaa,,,, bbbb))))
- cccchhhhaaaarrrr **** aaaa ;;;;
- iiiinnnntttt bbbb ;;;;
- {{{{
- ddddSSSSPPPP ;;;;
-
- PPPPUUUUSSSSHHHHMMMMAAAARRRRKKKK((((sssspppp)))) ;;;;
- XXXXPPPPUUUUSSSSHHHHssss((((ssssvvvv____2222mmmmoooorrrrttttaaaallll((((nnnneeeewwwwSSSSVVVVppppvvvv((((aaaa,,,, 0000))))))))))));;;;
- XXXXPPPPUUUUSSSSHHHHssss((((ssssvvvv____2222mmmmoooorrrrttttaaaallll((((nnnneeeewwwwSSSSVVVViiiivvvv((((bbbb))))))))))));;;;
- PPPPUUUUTTTTBBBBAAAACCCCKKKK ;;;;
-
- ppppeeeerrrrllll____ccccaaaallllllll____ppppvvvv((((""""LLLLeeeeffffttttSSSSttttrrrriiiinnnngggg"""",,,, GGGG____DDDDIIIISSSSCCCCAAAARRRRDDDD))));;;;
- }}}}
-
- Here are a few notes on the C function _c_a_l_l___L_e_f_t_S_t_r_i_n_g.
-
-
-
-
-
- 29/Jan/96 perl 5.002 with 9
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- 1. Parameters are passed to the Perl subroutine using
- the Perl stack. This is the purpose of the code
- beginning with the line ddddSSSSPPPP and ending with the line
- PPPPUUUUTTTTBBBBAAAACCCCKKKK.
-
- 2. If you are going to put something onto the Perl
- stack, you need to know where to put it. This is the
- purpose of the macro ddddSSSSPPPP - it declares and
- initializes a _l_o_c_a_l copy of the Perl stack pointer.
-
- All the other macros which will be used in this
- example require you to have used this macro.
-
- The exception to this rule is if you are calling a
- Perl subroutine directly from an XSUB function. In
- this case it is not necessary to explicitly use the
- ddddSSSSPPPP macro - it will be declared for you
- automatically.
-
- 3. Any parameters to be pushed onto the stack should be
- bracketed by the PPPPUUUUSSSSHHHHMMMMAAAARRRRKKKK and PPPPUUUUTTTTBBBBAAAACCCCKKKK macros. The
- purpose of these two macros, in this context, is to
- automatically count the number of parameters you are
- pushing. Then whenever Perl is creating the @@@@____ array
- for the subroutine, it knows how big to make it.
-
- The PPPPUUUUSSSSHHHHMMMMAAAARRRRKKKK macro tells Perl to make a mental note
- of the current stack pointer. Even if you aren't
- passing any parameters (like the example shown in the
- section _N_o _P_a_r_a_m_e_t_e_r_s_, _N_o_t_h_i_n_g _r_e_t_u_r_n_e_d) you must
- still call the PPPPUUUUSSSSHHHHMMMMAAAARRRRKKKK macro before you can call any
- of the _p_e_r_l___c_a_l_l___* functions - Perl still needs to
- know that there are no parameters.
-
- The PPPPUUUUTTTTBBBBAAAACCCCKKKK macro sets the global copy of the stack
- pointer to be the same as our local copy. If we
- didn't do this _p_e_r_l___c_a_l_l___p_v wouldn't know where the
- two parameters we pushed were - remember that up to
- now all the stack pointer manipulation we have done
- is with our local copy, _n_o_t the global copy.
-
- 4. The only flag specified this time is G_DISCARD. Since
- we are passing 2 parameters to the Perl subroutine
- this time, we have not specified G_NOARGS.
-
- 5. Next, we come to XPUSHs. This is where the parameters
- actually get pushed onto the stack. In this case we
- are pushing a string and an integer.
-
- See the section the section on _X_S_U_B_'_S _a_n_d _t_h_e
- _A_r_g_u_m_e_n_t _S_t_a_c_k in the _p_e_r_l_g_u_t_s manpage for details on
- how the XPUSH macros work.
-
-
-
-
-
- 29/Jan/96 perl 5.002 with 10
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- 6. Finally, _L_e_f_t_S_t_r_i_n_g can now be called via the
- _p_e_r_l___c_a_l_l___p_v function.
-
- RRRReeeettttuuuurrrrnnnniiiinnnngggg aaaa SSSSccccaaaallllaaaarrrr
-
- Now for an example of dealing with the items returned from
- a Perl subroutine.
-
- Here is a Perl subroutine, _A_d_d_e_r, which takes 2 integer
- parameters and simply returns their sum.
-
- ssssuuuubbbb AAAAddddddddeeeerrrr
- {{{{
- mmmmyyyy(((($$$$aaaa,,,, $$$$bbbb)))) ==== @@@@____ ;;;;
- $$$$aaaa ++++ $$$$bbbb ;;;;
- }}}}
-
- Since we are now concerned with the return value from
- _A_d_d_e_r, the C function required to call it is now a bit
- more complex.
-
- ssssttttaaaattttiiiicccc vvvvooooiiiidddd
- ccccaaaallllllll____AAAAddddddddeeeerrrr((((aaaa,,,, bbbb))))
- iiiinnnntttt aaaa ;;;;
- iiiinnnntttt bbbb ;;;;
- {{{{
- ddddSSSSPPPP ;;;;
- iiiinnnntttt ccccoooouuuunnnntttt ;;;;
-
- EEEENNNNTTTTEEEERRRR ;;;;
- SSSSAAAAVVVVEEEETTTTMMMMPPPPSSSS;;;;
-
- PPPPUUUUSSSSHHHHMMMMAAAARRRRKKKK((((sssspppp)))) ;;;;
- XXXXPPPPUUUUSSSSHHHHssss((((ssssvvvv____2222mmmmoooorrrrttttaaaallll((((nnnneeeewwwwSSSSVVVViiiivvvv((((aaaa))))))))))));;;;
- XXXXPPPPUUUUSSSSHHHHssss((((ssssvvvv____2222mmmmoooorrrrttttaaaallll((((nnnneeeewwwwSSSSVVVViiiivvvv((((bbbb))))))))))));;;;
- PPPPUUUUTTTTBBBBAAAACCCCKKKK ;;;;
-
- ccccoooouuuunnnntttt ==== ppppeeeerrrrllll____ccccaaaallllllll____ppppvvvv((((""""AAAAddddddddeeeerrrr"""",,,, GGGG____SSSSCCCCAAAALLLLAAAARRRR))));;;;
-
- SSSSPPPPAAAAGGGGAAAAIIIINNNN ;;;;
-
- iiiiffff ((((ccccoooouuuunnnntttt !!!!==== 1111))))
- ccccrrrrooooaaaakkkk((((""""BBBBiiiigggg ttttrrrroooouuuubbbblllleeee\\\\nnnn"""")))) ;;;;
-
- pppprrrriiiinnnnttttffff ((((""""TTTThhhheeee ssssuuuummmm ooooffff %%%%dddd aaaannnndddd %%%%dddd iiiissss %%%%dddd\\\\nnnn"""",,,, aaaa,,,, bbbb,,,, PPPPOOOOPPPPiiii)))) ;;;;
-
- PPPPUUUUTTTTBBBBAAAACCCCKKKK ;;;;
- FFFFRRRREEEEEEEETTTTMMMMPPPPSSSS ;;;;
- LLLLEEEEAAAAVVVVEEEE ;;;;
- }}}}
-
- Points to note this time are
-
-
-
-
-
- 29/Jan/96 perl 5.002 with 11
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- 1. The only flag specified this time was G_SCALAR. That
- means the @@@@____ array will be created and that the value
- returned by _A_d_d_e_r will still exist after the call to
- _p_e_r_l___c_a_l_l___p_v.
-
- 2. Because we are interested in what is returned from
- _A_d_d_e_r we cannot specify G_DISCARD. This means that we
- will have to tidy up the Perl stack and dispose of
- any temporary values ourselves. This is the purpose
- of
-
- EEEENNNNTTTTEEEERRRR ;;;;
- SSSSAAAAVVVVEEEETTTTMMMMPPPPSSSS ;;;;
-
- at the start of the function, and
-
- FFFFRRRREEEEEEEETTTTMMMMPPPPSSSS ;;;;
- LLLLEEEEAAAAVVVVEEEE ;;;;
-
- at the end. The EEEENNNNTTTTEEEERRRR/SSSSAAAAVVVVEEEETTTTMMMMPPPPSSSS pair creates a
- boundary for any temporaries we create. This means
- that the temporaries we get rid of will be limited to
- those which were created after these calls.
-
- The FFFFRRRREEEEEEEETTTTMMMMPPPPSSSS/LLLLEEEEAAAAVVVVEEEE pair will get rid of any values
- returned by the Perl subroutine, plus it will also
- dump the mortal SV's we have created. Having
- EEEENNNNTTTTEEEERRRR/SSSSAAAAVVVVEEEETTTTMMMMPPPPSSSS at the beginning of the code makes
- sure that no other mortals are destroyed.
-
- Think of these macros as working a bit like using {{{{
- and }}}} in Perl to limit the scope of local variables.
-
- See the section _U_s_i_n_g _P_e_r_l _t_o _d_i_s_p_o_s_e _o_f _t_e_m_p_o_r_a_r_i_e_s
- for details of an alternative to using these macros.
-
- 3. The purpose of the macro SSSSPPPPAAAAGGGGAAAAIIIINNNN is to refresh the
- local copy of the stack pointer. This is necessary
- because it is possible that the memory allocated to
- the Perl stack has been re-allocated whilst in the
- _p_e_r_l___c_a_l_l___p_v call.
-
- If you are making use of the Perl stack pointer in
- your code you must always refresh the your local copy
- using SPAGAIN whenever you make use of the
- _p_e_r_l___c_a_l_l___* functions or any other Perl internal
- function.
-
- 4. Although only a single value was expected to be
- returned from _A_d_d_e_r, it is still good practice to
- check the return code from _p_e_r_l___c_a_l_l___p_v anyway.
-
- Expecting a single value is not quite the same as
- knowing that there will be one. If someone modified
-
-
-
- 29/Jan/96 perl 5.002 with 12
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- _A_d_d_e_r to return a list and we didn't check for that
- possibility and take appropriate action the Perl
- stack would end up in an inconsistent state. That is
- something you _r_e_a_l_l_y don't want to ever happen.
-
- 5. The PPPPOOOOPPPPiiii macro is used here to pop the return value
- from the stack. In this case we wanted an integer,
- so PPPPOOOOPPPPiiii was used.
-
- Here is the complete list of POP macros available,
- along with the types they return.
-
- PPPPOOOOPPPPssss SSSSVVVV
- PPPPOOOOPPPPpppp ppppooooiiiinnnntttteeeerrrr
- PPPPOOOOPPPPnnnn ddddoooouuuubbbblllleeee
- PPPPOOOOPPPPiiii iiiinnnntttteeeeggggeeeerrrr
- PPPPOOOOPPPPllll lllloooonnnngggg
-
-
- 6. The final PPPPUUUUTTTTBBBBAAAACCCCKKKK is used to leave the Perl stack in
- a consistent state before exiting the function. This
- is necessary because when we popped the return value
- from the stack with PPPPOOOOPPPPiiii it updated only our local
- copy of the stack pointer. Remember, PPPPUUUUTTTTBBBBAAAACCCCKKKK sets
- the global stack pointer to be the same as our local
- copy.
-
- RRRReeeettttuuuurrrrnnnniiiinnnngggg aaaa lllliiiisssstttt ooooffff vvvvaaaalllluuuueeeessss
-
- Now, let's extend the previous example to return both the
- sum of the parameters and the difference.
-
- Here is the Perl subroutine
-
- ssssuuuubbbb AAAAddddddddSSSSuuuubbbbttttrrrraaaacccctttt
- {{{{
- mmmmyyyy(((($$$$aaaa,,,, $$$$bbbb)))) ==== @@@@____ ;;;;
- (((($$$$aaaa++++$$$$bbbb,,,, $$$$aaaa----$$$$bbbb)))) ;;;;
- }}}}
-
- and this is the C function
-
- ssssttttaaaattttiiiicccc vvvvooooiiiidddd
- ccccaaaallllllll____AAAAddddddddSSSSuuuubbbbttttrrrraaaacccctttt((((aaaa,,,, bbbb))))
- iiiinnnntttt aaaa ;;;;
- iiiinnnntttt bbbb ;;;;
- {{{{
- ddddSSSSPPPP ;;;;
- iiiinnnntttt ccccoooouuuunnnntttt ;;;;
-
- EEEENNNNTTTTEEEERRRR ;;;;
- SSSSAAAAVVVVEEEETTTTMMMMPPPPSSSS;;;;
-
-
-
-
-
- 29/Jan/96 perl 5.002 with 13
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- PPPPUUUUSSSSHHHHMMMMAAAARRRRKKKK((((sssspppp)))) ;;;;
- XXXXPPPPUUUUSSSSHHHHssss((((ssssvvvv____2222mmmmoooorrrrttttaaaallll((((nnnneeeewwwwSSSSVVVViiiivvvv((((aaaa))))))))))));;;;
- XXXXPPPPUUUUSSSSHHHHssss((((ssssvvvv____2222mmmmoooorrrrttttaaaallll((((nnnneeeewwwwSSSSVVVViiiivvvv((((bbbb))))))))))));;;;
- PPPPUUUUTTTTBBBBAAAACCCCKKKK ;;;;
-
- ccccoooouuuunnnntttt ==== ppppeeeerrrrllll____ccccaaaallllllll____ppppvvvv((((""""AAAAddddddddSSSSuuuubbbbttttrrrraaaacccctttt"""",,,, GGGG____AAAARRRRRRRRAAAAYYYY))));;;;
-
- SSSSPPPPAAAAGGGGAAAAIIIINNNN ;;;;
-
- iiiiffff ((((ccccoooouuuunnnntttt !!!!==== 2222))))
- ccccrrrrooooaaaakkkk((((""""BBBBiiiigggg ttttrrrroooouuuubbbblllleeee\\\\nnnn"""")))) ;;;;
-
- pppprrrriiiinnnnttttffff ((((""""%%%%dddd ---- %%%%dddd ==== %%%%dddd\\\\nnnn"""",,,, aaaa,,,, bbbb,,,, PPPPOOOOPPPPiiii)))) ;;;;
- pppprrrriiiinnnnttttffff ((((""""%%%%dddd ++++ %%%%dddd ==== %%%%dddd\\\\nnnn"""",,,, aaaa,,,, bbbb,,,, PPPPOOOOPPPPiiii)))) ;;;;
-
- PPPPUUUUTTTTBBBBAAAACCCCKKKK ;;;;
- FFFFRRRREEEEEEEETTTTMMMMPPPPSSSS ;;;;
- LLLLEEEEAAAAVVVVEEEE ;;;;
- }}}}
-
- If _c_a_l_l___A_d_d_S_u_b_t_r_a_c_t is called like this
-
- ccccaaaallllllll____AAAAddddddddSSSSuuuubbbbttttrrrraaaacccctttt((((7777,,,, 4444)))) ;;;;
-
- then here is the output
-
- 7777 ---- 4444 ==== 3333
- 7777 ++++ 4444 ==== 11111111
-
- Notes
-
- 1. We wanted array context, so G_ARRAY was used.
-
- 2. Not surprisingly PPPPOOOOPPPPiiii is used twice this time because
- we were retrieving 2 values from the stack. The
- important thing to note is that when using the PPPPOOOOPPPP****
- macros they come off the stack in _r_e_v_e_r_s_e order.
-
- RRRReeeettttuuuurrrrnnnniiiinnnngggg aaaa lllliiiisssstttt iiiinnnn aaaa ssssccccaaaallllaaaarrrr ccccoooonnnntttteeeexxxxtttt
-
- Say the Perl subroutine in the previous section was called
- in a scalar context, like this
-
- ssssttttaaaattttiiiicccc vvvvooooiiiidddd
- ccccaaaallllllll____AAAAddddddddSSSSuuuubbbbSSSSccccaaaallllaaaarrrr((((aaaa,,,, bbbb))))
- iiiinnnntttt aaaa ;;;;
- iiiinnnntttt bbbb ;;;;
- {{{{
- ddddSSSSPPPP ;;;;
- iiiinnnntttt ccccoooouuuunnnntttt ;;;;
- iiiinnnntttt iiii ;;;;
-
- EEEENNNNTTTTEEEERRRR ;;;;
- SSSSAAAAVVVVEEEETTTTMMMMPPPPSSSS;;;;
-
-
-
- 29/Jan/96 perl 5.002 with 14
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- PPPPUUUUSSSSHHHHMMMMAAAARRRRKKKK((((sssspppp)))) ;;;;
- XXXXPPPPUUUUSSSSHHHHssss((((ssssvvvv____2222mmmmoooorrrrttttaaaallll((((nnnneeeewwwwSSSSVVVViiiivvvv((((aaaa))))))))))));;;;
- XXXXPPPPUUUUSSSSHHHHssss((((ssssvvvv____2222mmmmoooorrrrttttaaaallll((((nnnneeeewwwwSSSSVVVViiiivvvv((((bbbb))))))))))));;;;
- PPPPUUUUTTTTBBBBAAAACCCCKKKK ;;;;
-
- ccccoooouuuunnnntttt ==== ppppeeeerrrrllll____ccccaaaallllllll____ppppvvvv((((""""AAAAddddddddSSSSuuuubbbbttttrrrraaaacccctttt"""",,,, GGGG____SSSSCCCCAAAALLLLAAAARRRR))));;;;
-
- SSSSPPPPAAAAGGGGAAAAIIIINNNN ;;;;
-
- pppprrrriiiinnnnttttffff ((((""""IIIItttteeeemmmmssss RRRReeeettttuuuurrrrnnnneeeedddd ==== %%%%dddd\\\\nnnn"""",,,, ccccoooouuuunnnntttt)))) ;;;;
-
- ffffoooorrrr ((((iiii ==== 1111 ;;;; iiii <<<<==== ccccoooouuuunnnntttt ;;;; ++++++++iiii))))
- pppprrrriiiinnnnttttffff ((((""""VVVVaaaalllluuuueeee %%%%dddd ==== %%%%dddd\\\\nnnn"""",,,, iiii,,,, PPPPOOOOPPPPiiii)))) ;;;;
-
- PPPPUUUUTTTTBBBBAAAACCCCKKKK ;;;;
- FFFFRRRREEEEEEEETTTTMMMMPPPPSSSS ;;;;
- LLLLEEEEAAAAVVVVEEEE ;;;;
- }}}}
-
- The other modification made is that _c_a_l_l___A_d_d_S_u_b_S_c_a_l_a_r will
- print the number of items returned from the Perl
- subroutine and their value (for simplicity it assumes that
- they are integer). So if _c_a_l_l___A_d_d_S_u_b_S_c_a_l_a_r is called
-
- ccccaaaallllllll____AAAAddddddddSSSSuuuubbbbSSSSccccaaaallllaaaarrrr((((7777,,,, 4444)))) ;;;;
-
- then the output will be
-
- IIIItttteeeemmmmssss RRRReeeettttuuuurrrrnnnneeeedddd ==== 1111
- VVVVaaaalllluuuueeee 1111 ==== 3333
-
- In this case the main point to note is that only the last
- item in the list returned from the subroutine, _A_d_d_e_r
- actually made it back to _c_a_l_l___A_d_d_S_u_b_S_c_a_l_a_r.
-
- RRRReeeettttuuuurrrrnnnniiiinnnngggg DDDDaaaattttaaaa ffffrrrroooommmm PPPPeeeerrrrllll vvvviiiiaaaa tttthhhheeee ppppaaaarrrraaaammmmeeeetttteeeerrrr lllliiiisssstttt
-
- It is also possible to return values directly via the
- parameter list - whether it is actually desirable to do it
- is another matter entirely.
-
- The Perl subroutine, _I_n_c, below takes 2 parameters and
- increments each directly.
-
- ssssuuuubbbb IIIInnnncccc
- {{{{
- ++++++++ $$$$____[[[[0000]]]] ;;;;
- ++++++++ $$$$____[[[[1111]]]] ;;;;
- }}}}
-
- and here is a C function to call it.
-
-
-
-
-
-
- 29/Jan/96 perl 5.002 with 15
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- ssssttttaaaattttiiiicccc vvvvooooiiiidddd
- ccccaaaallllllll____IIIInnnncccc((((aaaa,,,, bbbb))))
- iiiinnnntttt aaaa ;;;;
- iiiinnnntttt bbbb ;;;;
- {{{{
- ddddSSSSPPPP ;;;;
- iiiinnnntttt ccccoooouuuunnnntttt ;;;;
- SSSSVVVV **** ssssvvvvaaaa ;;;;
- SSSSVVVV **** ssssvvvvbbbb ;;;;
-
- EEEENNNNTTTTEEEERRRR ;;;;
- SSSSAAAAVVVVEEEETTTTMMMMPPPPSSSS;;;;
-
- ssssvvvvaaaa ==== ssssvvvv____2222mmmmoooorrrrttttaaaallll((((nnnneeeewwwwSSSSVVVViiiivvvv((((aaaa)))))))) ;;;;
- ssssvvvvbbbb ==== ssssvvvv____2222mmmmoooorrrrttttaaaallll((((nnnneeeewwwwSSSSVVVViiiivvvv((((bbbb)))))))) ;;;;
-
- PPPPUUUUSSSSHHHHMMMMAAAARRRRKKKK((((sssspppp)))) ;;;;
- XXXXPPPPUUUUSSSSHHHHssss((((ssssvvvvaaaa))));;;;
- XXXXPPPPUUUUSSSSHHHHssss((((ssssvvvvbbbb))));;;;
- PPPPUUUUTTTTBBBBAAAACCCCKKKK ;;;;
-
- ccccoooouuuunnnntttt ==== ppppeeeerrrrllll____ccccaaaallllllll____ppppvvvv((((""""IIIInnnncccc"""",,,, GGGG____DDDDIIIISSSSCCCCAAAARRRRDDDD))));;;;
-
- iiiiffff ((((ccccoooouuuunnnntttt !!!!==== 0000))))
- ccccrrrrooooaaaakkkk ((((""""ccccaaaallllllll____IIIInnnncccc:::: eeeexxxxppppeeeecccctttteeeedddd 0000 vvvvaaaalllluuuueeeessss ffffrrrroooommmm ''''IIIInnnncccc'''',,,, ggggooootttt %%%%dddd\\\\nnnn"""",,,,
- ccccoooouuuunnnntttt)))) ;;;;
-
- pppprrrriiiinnnnttttffff ((((""""%%%%dddd ++++ 1111 ==== %%%%dddd\\\\nnnn"""",,,, aaaa,,,, SSSSvvvvIIIIVVVV((((ssssvvvvaaaa)))))))) ;;;;
- pppprrrriiiinnnnttttffff ((((""""%%%%dddd ++++ 1111 ==== %%%%dddd\\\\nnnn"""",,,, bbbb,,,, SSSSvvvvIIIIVVVV((((ssssvvvvbbbb)))))))) ;;;;
-
- FFFFRRRREEEEEEEETTTTMMMMPPPPSSSS ;;;;
- LLLLEEEEAAAAVVVVEEEE ;;;;
- }}}}
-
- To be able to access the two parameters that were pushed
- onto the stack after they return from _p_e_r_l___c_a_l_l___p_v it is
- necessary to make a note of their addresses - thus the two
- variables ssssvvvvaaaa and ssssvvvvbbbb.
-
- The reason this is necessary is that the area of the Perl
- stack which held them will very likely have been
- overwritten by something else by the time control returns
- from _p_e_r_l___c_a_l_l___p_v.
-
- UUUUssssiiiinnnngggg GGGG____EEEEVVVVAAAALLLL
-
- Now an example using G_EVAL. Below is a Perl subroutine
- which computes the difference of its 2 parameters. If this
- would result in a negative result, the subroutine calls
- _d_i_e.
-
- ssssuuuubbbb SSSSuuuubbbbttttrrrraaaacccctttt
- {{{{
- mmmmyyyy (((($$$$aaaa,,,, $$$$bbbb)))) ==== @@@@____ ;;;;
-
-
-
- 29/Jan/96 perl 5.002 with 16
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- ddddiiiieeee """"ddddeeeeaaaatttthhhh ccccaaaannnn bbbbeeee ffffaaaattttaaaallll\\\\nnnn"""" iiiiffff $$$$aaaa <<<< $$$$bbbb ;;;;
-
- $$$$aaaa ---- $$$$bbbb ;;;;
- }}}}
-
- and some C to call it
-
- ssssttttaaaattttiiiicccc vvvvooooiiiidddd
- ccccaaaallllllll____SSSSuuuubbbbttttrrrraaaacccctttt((((aaaa,,,, bbbb))))
- iiiinnnntttt aaaa ;;;;
- iiiinnnntttt bbbb ;;;;
- {{{{
- ddddSSSSPPPP ;;;;
- iiiinnnntttt ccccoooouuuunnnntttt ;;;;
-
- EEEENNNNTTTTEEEERRRR ;;;;
- SSSSAAAAVVVVEEEETTTTMMMMPPPPSSSS;;;;
-
- PPPPUUUUSSSSHHHHMMMMAAAARRRRKKKK((((sssspppp)))) ;;;;
- XXXXPPPPUUUUSSSSHHHHssss((((ssssvvvv____2222mmmmoooorrrrttttaaaallll((((nnnneeeewwwwSSSSVVVViiiivvvv((((aaaa))))))))))));;;;
- XXXXPPPPUUUUSSSSHHHHssss((((ssssvvvv____2222mmmmoooorrrrttttaaaallll((((nnnneeeewwwwSSSSVVVViiiivvvv((((bbbb))))))))))));;;;
- PPPPUUUUTTTTBBBBAAAACCCCKKKK ;;;;
-
- ccccoooouuuunnnntttt ==== ppppeeeerrrrllll____ccccaaaallllllll____ppppvvvv((((""""SSSSuuuubbbbttttrrrraaaacccctttt"""",,,, GGGG____EEEEVVVVAAAALLLL||||GGGG____SSSSCCCCAAAALLLLAAAARRRR))));;;;
-
- SSSSPPPPAAAAGGGGAAAAIIIINNNN ;;;;
-
- ////**** CCCChhhheeeecccckkkk tttthhhheeee eeeevvvvaaaallll ffffiiiirrrrsssstttt ****////
- iiiiffff ((((SSSSvvvvTTTTRRRRUUUUEEEE((((GGGGvvvvSSSSVVVV((((eeeerrrrrrrrggggvvvv))))))))))))
- {{{{
- pppprrrriiiinnnnttttffff ((((""""UUUUhhhh oooohhhh ---- %%%%ssss\\\\nnnn"""",,,, SSSSvvvvPPPPVVVV((((GGGGvvvvSSSSVVVV((((eeeerrrrrrrrggggvvvv)))),,,, nnnnaaaa)))))))) ;;;;
- PPPPOOOOPPPPssss ;;;;
- }}}}
- eeeellllsssseeee
- {{{{
- iiiiffff ((((ccccoooouuuunnnntttt !!!!==== 1111))))
- ccccrrrrooooaaaakkkk((((""""ccccaaaallllllll____SSSSuuuubbbbttttrrrraaaacccctttt:::: wwwwaaaannnntttteeeedddd 1111 vvvvaaaalllluuuueeee ffffrrrroooommmm ''''SSSSuuuubbbbttttrrrraaaacccctttt'''',,,, ggggooootttt %%%%dddd\\\\nnnn"""",,,,
- ccccoooouuuunnnntttt)))) ;;;;
-
- pppprrrriiiinnnnttttffff ((((""""%%%%dddd ---- %%%%dddd ==== %%%%dddd\\\\nnnn"""",,,, aaaa,,,, bbbb,,,, PPPPOOOOPPPPiiii)))) ;;;;
- }}}}
-
- PPPPUUUUTTTTBBBBAAAACCCCKKKK ;;;;
- FFFFRRRREEEEEEEETTTTMMMMPPPPSSSS ;;;;
- LLLLEEEEAAAAVVVVEEEE ;;;;
- }}}}
-
- If _c_a_l_l___S_u_b_t_r_a_c_t is called thus
-
- ccccaaaallllllll____SSSSuuuubbbbttttrrrraaaacccctttt((((4444,,,, 5555))))
-
- the following will be printed
-
- UUUUhhhh oooohhhh ---- ddddeeeeaaaatttthhhh ccccaaaannnn bbbbeeee ffffaaaattttaaaallll
-
-
-
- 29/Jan/96 perl 5.002 with 17
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- Notes
-
- 1. We want to be able to catch the _d_i_e so we have used
- the G_EVAL flag. Not specifying this flag would mean
- that the program would terminate immediately at the
- _d_i_e statement in the subroutine _S_u_b_t_r_a_c_t.
-
- 2. The code
-
- iiiiffff ((((SSSSvvvvTTTTRRRRUUUUEEEE((((GGGGvvvvSSSSVVVV((((eeeerrrrrrrrggggvvvv))))))))))))
- {{{{
- pppprrrriiiinnnnttttffff ((((""""UUUUhhhh oooohhhh ---- %%%%ssss\\\\nnnn"""",,,, SSSSvvvvPPPPVVVV((((GGGGvvvvSSSSVVVV((((eeeerrrrrrrrggggvvvv)))),,,, nnnnaaaa)))))))) ;;;;
- PPPPOOOOPPPPssss ;;;;
- }}}}
-
- is the direct equivalent of this bit of Perl
-
- pppprrrriiiinnnntttt """"UUUUhhhh oooohhhh ---- $$$$@@@@\\\\nnnn"""" iiiiffff $$$$@@@@ ;;;;
-
- eeeerrrrrrrrggggvvvv is a perl global of type GGGGVVVV **** that points to
- the symbol table entry containing the error.
- GGGGvvvvSSSSVVVV((((eeeerrrrrrrrggggvvvv)))) therefore refers to the C equivalent of
- $$$$@@@@.
-
- 3. Note that the stack is popped using PPPPOOOOPPPPssss in the block
- where SSSSvvvvTTTTRRRRUUUUEEEE((((GGGGvvvvSSSSVVVV((((eeeerrrrrrrrggggvvvv)))))))) is true. This is necessary
- because whenever a _p_e_r_l___c_a_l_l___* function invoked with
- G_EVAL|G_SCALAR returns an error, the top of the
- stack holds the value _u_n_d_e_f. Since we want the
- program to continue after detecting this error, it is
- essential that the stack is tidied up by removing the
- _u_n_d_e_f.
-
- UUUUssssiiiinnnngggg GGGG____KKKKEEEEEEEEPPPPEEEERRRRRRRR
-
- Consider this rather facetious example, where we have used
- an XS version of the call_Subtract example above inside a
- destructor:
-
- ppppaaaacccckkkkaaaaggggeeee FFFFoooooooo;;;;
- ssssuuuubbbb nnnneeeewwww {{{{ bbbblllleeeessssssss {{{{}}}},,,, $$$$____[[[[0000]]]] }}}}
- ssssuuuubbbb SSSSuuuubbbbttttrrrraaaacccctttt {{{{
- mmmmyyyy(((($$$$aaaa,,,,$$$$bbbb)))) ==== @@@@____;;;;
- ddddiiiieeee """"ddddeeeeaaaatttthhhh ccccaaaannnn bbbbeeee ffffaaaattttaaaallll"""" iiiiffff $$$$aaaa <<<< $$$$bbbb ;;;;
- $$$$aaaa ---- $$$$bbbb;;;;
- }}}}
- ssssuuuubbbb DDDDEEEESSSSTTTTRRRROOOOYYYY {{{{ ccccaaaallllllll____SSSSuuuubbbbttttrrrraaaacccctttt((((5555,,,, 4444))));;;; }}}}
- ssssuuuubbbb ffffoooooooo {{{{ ddddiiiieeee """"ffffoooooooo ddddiiiieeeessss"""";;;; }}}}
-
- ppppaaaacccckkkkaaaaggggeeee mmmmaaaaiiiinnnn;;;;
- eeeevvvvaaaallll {{{{ FFFFoooooooo---->>>>nnnneeeewwww---->>>>ffffoooooooo }}}};;;;
- pppprrrriiiinnnntttt """"SSSSaaaawwww:::: $$$$@@@@"""" iiiiffff $$$$@@@@;;;; #### sssshhhhoooouuuulllldddd bbbbeeee,,,, bbbbuuuutttt iiiissssnnnn''''tttt
-
- This example will fail to recognize that an error occurred
-
-
-
- 29/Jan/96 perl 5.002 with 18
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- inside the eeeevvvvaaaallll {{{{}}}}. Here's why: the call_Subtract code
- got executed while perl was cleaning up temporaries when
- exiting the eval block, and since call_Subtract is
- implemented with _p_e_r_l___c_a_l_l___p_v using the G_EVAL flag, it
- promptly reset $$$$@@@@. This results in the failure of the
- outermost test for $$$$@@@@, and thereby the failure of the
- error trap.
-
- Appending the G_KEEPERR flag, so that the _p_e_r_l___c_a_l_l___p_v
- call in call_Subtract reads:
-
- ccccoooouuuunnnntttt ==== ppppeeeerrrrllll____ccccaaaallllllll____ppppvvvv((((""""SSSSuuuubbbbttttrrrraaaacccctttt"""",,,, GGGG____EEEEVVVVAAAALLLL||||GGGG____SSSSCCCCAAAALLLLAAAARRRR||||GGGG____KKKKEEEEEEEEPPPPEEEERRRRRRRR))));;;;
-
- will preserve the error and restore reliable error
- handling.
-
- UUUUssssiiiinnnngggg ppppeeeerrrrllll____ccccaaaallllllll____ssssvvvv
-
- In all the previous examples I have 'hard-wired' the name
- of the Perl subroutine to be called from C. Most of the
- time though, it is more convenient to be able to specify
- the name of the Perl subroutine from within the Perl
- script.
-
- Consider the Perl code below
-
- ssssuuuubbbb ffffrrrreeeedddd
- {{{{
- pppprrrriiiinnnntttt """"HHHHeeeelllllllloooo tttthhhheeeerrrreeee\\\\nnnn"""" ;;;;
- }}}}
-
- CCCCaaaallllllllSSSSuuuubbbbPPPPVVVV((((""""ffffrrrreeeedddd"""")))) ;;;;
-
- Here is a snippet of XSUB which defines _C_a_l_l_S_u_b_P_V.
-
- vvvvooooiiiidddd
- CCCCaaaallllllllSSSSuuuubbbbPPPPVVVV((((nnnnaaaammmmeeee))))
- cccchhhhaaaarrrr **** nnnnaaaammmmeeee
- CCCCOOOODDDDEEEE::::
- PPPPUUUUSSSSHHHHMMMMAAAARRRRKKKK((((sssspppp)))) ;;;;
- ppppeeeerrrrllll____ccccaaaallllllll____ppppvvvv((((nnnnaaaammmmeeee,,,, GGGG____DDDDIIIISSSSCCCCAAAARRRRDDDD||||GGGG____NNNNOOOOAAAARRRRGGGGSSSS)))) ;;;;
-
- That is fine as far as it goes. The thing is, the Perl
- subroutine can be specified only as a string. For Perl 4
- this was adequate, but Perl 5 allows references to
- subroutines and anonymous subroutines. This is where
- _p_e_r_l___c_a_l_l___s_v is useful.
-
- The code below for _C_a_l_l_S_u_b_S_V is identical to _C_a_l_l_S_u_b_P_V
- except that the nnnnaaaammmmeeee parameter is now defined as an SV*
- and we use _p_e_r_l___c_a_l_l___s_v instead of _p_e_r_l___c_a_l_l___p_v.
-
-
-
-
-
-
- 29/Jan/96 perl 5.002 with 19
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- vvvvooooiiiidddd
- CCCCaaaallllllllSSSSuuuubbbbSSSSVVVV((((nnnnaaaammmmeeee))))
- SSSSVVVV **** nnnnaaaammmmeeee
- CCCCOOOODDDDEEEE::::
- PPPPUUUUSSSSHHHHMMMMAAAARRRRKKKK((((sssspppp)))) ;;;;
- ppppeeeerrrrllll____ccccaaaallllllll____ssssvvvv((((nnnnaaaammmmeeee,,,, GGGG____DDDDIIIISSSSCCCCAAAARRRRDDDD||||GGGG____NNNNOOOOAAAARRRRGGGGSSSS)))) ;;;;
-
- Since we are using an SV to call _f_r_e_d the following can
- all be used
-
- CCCCaaaallllllllSSSSuuuubbbbSSSSVVVV((((""""ffffrrrreeeedddd"""")))) ;;;;
- CCCCaaaallllllllSSSSuuuubbbbSSSSVVVV((((\\\\&&&&ffffrrrreeeedddd)))) ;;;;
- $$$$rrrreeeeffff ==== \\\\&&&&ffffrrrreeeedddd ;;;;
- CCCCaaaallllllllSSSSuuuubbbbSSSSVVVV(((($$$$rrrreeeeffff)))) ;;;;
- CCCCaaaallllllllSSSSuuuubbbbSSSSVVVV(((( ssssuuuubbbb {{{{ pppprrrriiiinnnntttt """"HHHHeeeelllllllloooo tttthhhheeeerrrreeee\\\\nnnn"""" }}}} )))) ;;;;
-
- As you can see, _p_e_r_l___c_a_l_l___s_v gives you much greater
- flexibility in how you can specify the Perl subroutine.
-
- You should note that if it is necessary to store the SV
- (nnnnaaaammmmeeee in the example above) which corresponds to the Perl
- subroutine so that it can be used later in the program, it
- not enough to just store a copy of the pointer to the SV.
- Say the code above had been like this
-
- ssssttttaaaattttiiiicccc SSSSVVVV **** rrrreeeemmmmeeeemmmmbbbbeeeerrrrSSSSuuuubbbb ;;;;
-
- vvvvooooiiiidddd
- SSSSaaaavvvveeeeSSSSuuuubbbb1111((((nnnnaaaammmmeeee))))
- SSSSVVVV **** nnnnaaaammmmeeee
- CCCCOOOODDDDEEEE::::
- rrrreeeemmmmeeeemmmmbbbbeeeerrrrSSSSuuuubbbb ==== nnnnaaaammmmeeee ;;;;
-
- vvvvooooiiiidddd
- CCCCaaaallllllllSSSSaaaavvvveeeeddddSSSSuuuubbbb1111(((())))
- CCCCOOOODDDDEEEE::::
- PPPPUUUUSSSSHHHHMMMMAAAARRRRKKKK((((sssspppp)))) ;;;;
- ppppeeeerrrrllll____ccccaaaallllllll____ssssvvvv((((rrrreeeemmmmeeeemmmmbbbbeeeerrrrSSSSuuuubbbb,,,, GGGG____DDDDIIIISSSSCCCCAAAARRRRDDDD||||GGGG____NNNNOOOOAAAARRRRGGGGSSSS)))) ;;;;
-
- The reason this is wrong is that by the time you come to
- use the pointer rrrreeeemmmmeeeemmmmbbbbeeeerrrrSSSSuuuubbbb in CCCCaaaallllllllSSSSaaaavvvveeeeddddSSSSuuuubbbb1111, it may or
- may not still refer to the Perl subroutine that was
- recorded in SSSSaaaavvvveeeeSSSSuuuubbbb1111. This is particularly true for these
- cases
-
- SSSSaaaavvvveeeeSSSSuuuubbbb1111((((\\\\&&&&ffffrrrreeeedddd)))) ;;;;
- CCCCaaaallllllllSSSSaaaavvvveeeeddddSSSSuuuubbbb1111(((()))) ;;;;
-
- SSSSaaaavvvveeeeSSSSuuuubbbb1111(((( ssssuuuubbbb {{{{ pppprrrriiiinnnntttt """"HHHHeeeelllllllloooo tttthhhheeeerrrreeee\\\\nnnn"""" }}}} )))) ;;;;
- CCCCaaaallllllllSSSSaaaavvvveeeeddddSSSSuuuubbbb1111(((()))) ;;;;
-
- By the time each of the SSSSaaaavvvveeeeSSSSuuuubbbb1111 statements above have
- been executed, the SV*'s which corresponded to the
- parameters will no longer exist. Expect an error message
-
-
-
- 29/Jan/96 perl 5.002 with 20
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- from Perl of the form
-
- CCCCaaaannnn''''tttt uuuusssseeee aaaannnn uuuunnnnddddeeeeffffiiiinnnneeeedddd vvvvaaaalllluuuueeee aaaassss aaaa ssssuuuubbbbrrrroooouuuuttttiiiinnnneeee rrrreeeeffffeeeerrrreeeennnncccceeee aaaatttt ............
-
- for each of the CCCCaaaallllllllSSSSaaaavvvveeeeddddSSSSuuuubbbb1111 lines.
-
- Similarly, with this code
-
- $$$$rrrreeeeffff ==== \\\\&&&&ffffrrrreeeedddd ;;;;
- SSSSaaaavvvveeeeSSSSuuuubbbb1111(((($$$$rrrreeeeffff)))) ;;;;
- $$$$rrrreeeeffff ==== 44447777 ;;;;
- CCCCaaaallllllllSSSSaaaavvvveeeeddddSSSSuuuubbbb1111(((()))) ;;;;
-
- you can expect one of these messages (which you actually
- get is dependant on the version of Perl you are using)
-
- NNNNooootttt aaaa CCCCOOOODDDDEEEE rrrreeeeffffeeeerrrreeeennnncccceeee aaaatttt ............
- UUUUnnnnddddeeeeffffiiiinnnneeeedddd ssssuuuubbbbrrrroooouuuuttttiiiinnnneeee &&&&mmmmaaaaiiiinnnn::::::::44447777 ccccaaaalllllllleeeedddd ............
-
- The variable $$$$rrrreeeeffff may have referred to the subroutine ffffrrrreeeedddd
- whenever the call to SSSSaaaavvvveeeeSSSSuuuubbbb1111 was made but by the time
- CCCCaaaallllllllSSSSaaaavvvveeeeddddSSSSuuuubbbb1111 gets called it now holds the number 44447777.
- Since we saved only a pointer to the original SV in
- SSSSaaaavvvveeeeSSSSuuuubbbb1111, any changes to $$$$rrrreeeeffff will be tracked by the
- pointer rrrreeeemmmmeeeemmmmbbbbeeeerrrrSSSSuuuubbbb. This means that whenever
- CCCCaaaallllllllSSSSaaaavvvveeeeddddSSSSuuuubbbb1111 gets called, it will attempt to execute the
- code which is referenced by the SV* rrrreeeemmmmeeeemmmmbbbbeeeerrrrSSSSuuuubbbb. In this
- case though, it now refers to the integer 44447777, so expect
- Perl to complain loudly.
-
- A similar but more subtle problem is illustrated with this
- code
-
- $$$$rrrreeeeffff ==== \\\\&&&&ffffrrrreeeedddd ;;;;
- SSSSaaaavvvveeeeSSSSuuuubbbb1111(((($$$$rrrreeeeffff)))) ;;;;
- $$$$rrrreeeeffff ==== \\\\&&&&jjjjooooeeee ;;;;
- CCCCaaaallllllllSSSSaaaavvvveeeeddddSSSSuuuubbbb1111(((()))) ;;;;
-
- This time whenever CCCCaaaallllllllSSSSaaaavvvveeeeddddSSSSuuuubbbb1111 get called it will
- execute the Perl subroutine jjjjooooeeee (assuming it exists)
- rather than ffffrrrreeeedddd as was originally requested in the call
- to SSSSaaaavvvveeeeSSSSuuuubbbb1111.
-
- To get around these problems it is necessary to take a
- full copy of the SV. The code below shows SSSSaaaavvvveeeeSSSSuuuubbbb2222
- modified to do that
-
- ssssttttaaaattttiiiicccc SSSSVVVV **** kkkkeeeeeeeeppppSSSSuuuubbbb ==== ((((SSSSVVVV****))))NNNNUUUULLLLLLLL ;;;;
-
-
-
-
-
-
-
-
-
- 29/Jan/96 perl 5.002 with 21
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- vvvvooooiiiidddd
- SSSSaaaavvvveeeeSSSSuuuubbbb2222((((nnnnaaaammmmeeee))))
- SSSSVVVV **** nnnnaaaammmmeeee
- CCCCOOOODDDDEEEE::::
- ////**** TTTTaaaakkkkeeee aaaa ccccooooppppyyyy ooooffff tttthhhheeee ccccaaaallllllllbbbbaaaacccckkkk ****////
- iiiiffff ((((kkkkeeeeeeeeppppSSSSuuuubbbb ======== ((((SSSSVVVV****))))NNNNUUUULLLLLLLL))))
- ////**** FFFFiiiirrrrsssstttt ttttiiiimmmmeeee,,,, ssssoooo ccccrrrreeeeaaaatttteeee aaaa nnnneeeewwww SSSSVVVV ****////
- kkkkeeeeeeeeppppSSSSuuuubbbb ==== nnnneeeewwwwSSSSVVVVssssvvvv((((nnnnaaaammmmeeee)))) ;;;;
- eeeellllsssseeee
- ////**** BBBBeeeeeeeennnn hhhheeeerrrreeee bbbbeeeeffffoooorrrreeee,,,, ssssoooo oooovvvveeeerrrrwwwwrrrriiiitttteeee ****////
- SSSSvvvvSSSSeeeettttSSSSVVVV((((kkkkeeeeeeeeppppSSSSuuuubbbb,,,, nnnnaaaammmmeeee)))) ;;;;
-
- vvvvooooiiiidddd
- CCCCaaaallllllllSSSSaaaavvvveeeeddddSSSSuuuubbbb2222(((())))
- CCCCOOOODDDDEEEE::::
- PPPPUUUUSSSSHHHHMMMMAAAARRRRKKKK((((sssspppp)))) ;;;;
- ppppeeeerrrrllll____ccccaaaallllllll____ssssvvvv((((kkkkeeeeeeeeppppSSSSuuuubbbb,,,, GGGG____DDDDIIIISSSSCCCCAAAARRRRDDDD||||GGGG____NNNNOOOOAAAARRRRGGGGSSSS)))) ;;;;
-
- In order to avoid creating a new SV every time SSSSaaaavvvveeeeSSSSuuuubbbb2222 is
- called, the function first checks to see if it has been
- called before. If not, then space for a new SV is
- allocated and the reference to the Perl subroutine, nnnnaaaammmmeeee
- is copied to the variable kkkkeeeeeeeeppppSSSSuuuubbbb in one operation using
- nnnneeeewwwwSSSSVVVVssssvvvv. Thereafter, whenever SSSSaaaavvvveeeeSSSSuuuubbbb2222 is called the
- existing SV, kkkkeeeeeeeeppppSSSSuuuubbbb, is overwritten with the new value
- using SSSSvvvvSSSSeeeettttSSSSVVVV.
-
- UUUUssssiiiinnnngggg ppppeeeerrrrllll____ccccaaaallllllll____aaaarrrrggggvvvv
-
- Here is a Perl subroutine which prints whatever parameters
- are passed to it.
-
- ssssuuuubbbb PPPPrrrriiiinnnnttttLLLLiiiisssstttt
- {{{{
- mmmmyyyy((((@@@@lllliiiisssstttt)))) ==== @@@@____ ;;;;
-
- ffffoooorrrreeeeaaaacccchhhh ((((@@@@lllliiiisssstttt)))) {{{{ pppprrrriiiinnnntttt """"$$$$____\\\\nnnn"""" }}}}
- }}}}
-
- and here is an example of _p_e_r_l___c_a_l_l___a_r_g_v which will call
- _P_r_i_n_t_L_i_s_t.
-
- ssssttttaaaattttiiiicccc cccchhhhaaaarrrr **** wwwwoooorrrrddddssss[[[[]]]] ==== {{{{""""aaaallllpppphhhhaaaa"""",,,, """"bbbbeeeettttaaaa"""",,,, """"ggggaaaammmmmmmmaaaa"""",,,, """"ddddeeeellllttttaaaa"""",,,, NNNNUUUULLLLLLLL}}}} ;;;;
-
- ssssttttaaaattttiiiicccc vvvvooooiiiidddd
- ccccaaaallllllll____PPPPrrrriiiinnnnttttLLLLiiiisssstttt(((())))
- {{{{
- ddddSSSSPPPP ;;;;
-
- ppppeeeerrrrllll____ccccaaaallllllll____aaaarrrrggggvvvv((((""""PPPPrrrriiiinnnnttttLLLLiiiisssstttt"""",,,, GGGG____DDDDIIIISSSSCCCCAAAARRRRDDDD,,,, wwwwoooorrrrddddssss)))) ;;;;
- }}}}
-
- Note that it is not necessary to call PPPPUUUUSSSSHHHHMMMMAAAARRRRKKKK in this
- instance. This is because _p_e_r_l___c_a_l_l___a_r_g_v will do it for
-
-
-
- 29/Jan/96 perl 5.002 with 22
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- you.
-
- UUUUssssiiiinnnngggg ppppeeeerrrrllll____ccccaaaallllllll____mmmmeeeetttthhhhoooodddd
-
- Consider the following Perl code
-
- {{{{
- ppppaaaacccckkkkaaaaggggeeee MMMMiiiinnnneeee ;;;;
-
- ssssuuuubbbb nnnneeeewwww
- {{{{
- mmmmyyyy(((($$$$ttttyyyyppppeeee)))) ==== sssshhhhiiiifffftttt ;;;;
- bbbblllleeeessssssss [[[[@@@@____]]]]
- }}}}
-
- ssssuuuubbbb DDDDiiiissssppppllllaaaayyyy
- {{{{
- mmmmyyyy (((($$$$sssseeeellllffff,,,, $$$$iiiinnnnddddeeeexxxx)))) ==== @@@@____ ;;;;
- pppprrrriiiinnnntttt """"$$$$iiiinnnnddddeeeexxxx:::: $$$$$$$$sssseeeellllffff[[[[$$$$iiiinnnnddddeeeexxxx]]]]\\\\nnnn"""" ;;;;
- }}}}
-
- ssssuuuubbbb PPPPrrrriiiinnnnttttIIIIDDDD
- {{{{
- mmmmyyyy(((($$$$ccccllllaaaassssssss)))) ==== @@@@____ ;;;;
- pppprrrriiiinnnntttt """"TTTThhhhiiiissss iiiissss CCCCllllaaaassssssss $$$$ccccllllaaaassssssss vvvveeeerrrrssssiiiioooonnnn 1111....0000\\\\nnnn"""" ;;;;
- }}}}
- }}}}
-
- It just implements a very simple class to manage an array.
- Apart from the constructor, nnnneeeewwww, it declares methods, one
- static and one virtual. The static method, PPPPrrrriiiinnnnttttIIIIDDDD, simply
- prints out the class name and a version number. The
- virtual method, DDDDiiiissssppppllllaaaayyyy, prints out a single element of
- the array. Here is an all Perl example of using it.
-
- $$$$aaaa ==== nnnneeeewwww MMMMiiiinnnneeee ((((''''rrrreeeedddd'''',,,, ''''ggggrrrreeeeeeeennnn'''',,,, ''''bbbblllluuuueeee'''')))) ;;;;
- $$$$aaaa---->>>>DDDDiiiissssppppllllaaaayyyy((((1111)))) ;;;;
- PPPPrrrriiiinnnnttttIIIIDDDD MMMMiiiinnnneeee;;;;
-
- will print
-
- 1111:::: ggggrrrreeeeeeeennnn
- TTTThhhhiiiissss iiiissss CCCCllllaaaassssssss MMMMiiiinnnneeee vvvveeeerrrrssssiiiioooonnnn 1111....0000
-
- Calling a Perl method from C is fairly straightforward.
- The following things are required
-
- +o a reference to the object for a virtual method or the
- name of the class for a static method.
-
- +o the name of the method.
-
- +o any other parameters specific to the method.
-
-
-
-
- 29/Jan/96 perl 5.002 with 23
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- Here is a simple XSUB which illustrates the mechanics of
- calling both the PPPPrrrriiiinnnnttttIIIIDDDD and DDDDiiiissssppppllllaaaayyyy methods from C.
-
- vvvvooooiiiidddd
- ccccaaaallllllll____MMMMeeeetttthhhhoooodddd((((rrrreeeeffff,,,, mmmmeeeetttthhhhoooodddd,,,, iiiinnnnddddeeeexxxx))))
- SSSSVVVV **** rrrreeeeffff
- cccchhhhaaaarrrr **** mmmmeeeetttthhhhoooodddd
- iiiinnnntttt iiiinnnnddddeeeexxxx
- CCCCOOOODDDDEEEE::::
- PPPPUUUUSSSSHHHHMMMMAAAARRRRKKKK((((sssspppp))));;;;
- XXXXPPPPUUUUSSSSHHHHssss((((rrrreeeeffff))));;;;
- XXXXPPPPUUUUSSSSHHHHssss((((ssssvvvv____2222mmmmoooorrrrttttaaaallll((((nnnneeeewwwwSSSSVVVViiiivvvv((((iiiinnnnddddeeeexxxx)))))))))))) ;;;;
- PPPPUUUUTTTTBBBBAAAACCCCKKKK;;;;
-
- ppppeeeerrrrllll____ccccaaaallllllll____mmmmeeeetttthhhhoooodddd((((mmmmeeeetttthhhhoooodddd,,,, GGGG____DDDDIIIISSSSCCCCAAAARRRRDDDD)))) ;;;;
-
- vvvvooooiiiidddd
- ccccaaaallllllll____PPPPrrrriiiinnnnttttIIIIDDDD((((ccccllllaaaassssssss,,,, mmmmeeeetttthhhhoooodddd))))
- cccchhhhaaaarrrr **** ccccllllaaaassssssss
- cccchhhhaaaarrrr **** mmmmeeeetttthhhhoooodddd
- CCCCOOOODDDDEEEE::::
- PPPPUUUUSSSSHHHHMMMMAAAARRRRKKKK((((sssspppp))));;;;
- XXXXPPPPUUUUSSSSHHHHssss((((ssssvvvv____2222mmmmoooorrrrttttaaaallll((((nnnneeeewwwwSSSSVVVVppppvvvv((((ccccllllaaaassssssss,,,, 0000)))))))))))) ;;;;
- PPPPUUUUTTTTBBBBAAAACCCCKKKK;;;;
-
- ppppeeeerrrrllll____ccccaaaallllllll____mmmmeeeetttthhhhoooodddd((((mmmmeeeetttthhhhoooodddd,,,, GGGG____DDDDIIIISSSSCCCCAAAARRRRDDDD)))) ;;;;
-
- So the methods PPPPrrrriiiinnnnttttIIIIDDDD and DDDDiiiissssppppllllaaaayyyy can be invoked like
- this
-
- $$$$aaaa ==== nnnneeeewwww MMMMiiiinnnneeee ((((''''rrrreeeedddd'''',,,, ''''ggggrrrreeeeeeeennnn'''',,,, ''''bbbblllluuuueeee'''')))) ;;;;
- ccccaaaallllllll____MMMMeeeetttthhhhoooodddd(((($$$$aaaa,,,, ''''DDDDiiiissssppppllllaaaayyyy'''',,,, 1111)))) ;;;;
- ccccaaaallllllll____PPPPrrrriiiinnnnttttIIIIDDDD((((''''MMMMiiiinnnneeee'''',,,, ''''PPPPrrrriiiinnnnttttIIIIDDDD'''')))) ;;;;
-
- The only thing to note is that in both the static and
- virtual methods, the method name is not passed via the
- stack - it is used as the first parameter to
- _p_e_r_l___c_a_l_l___m_e_t_h_o_d.
-
- UUUUssssiiiinnnngggg GGGGIIIIMMMMMMMMEEEE
-
- Here is a trivial XSUB which prints the context in which
- it is currently executing.
-
- vvvvooooiiiidddd
- PPPPrrrriiiinnnnttttCCCCoooonnnntttteeeexxxxtttt(((())))
- CCCCOOOODDDDEEEE::::
- iiiiffff ((((GGGGIIIIMMMMMMMMEEEE ======== GGGG____SSSSCCCCAAAALLLLAAAARRRR))))
- pppprrrriiiinnnnttttffff ((((""""CCCCoooonnnntttteeeexxxxtttt iiiissss SSSSccccaaaallllaaaarrrr\\\\nnnn"""")))) ;;;;
- eeeellllsssseeee
- pppprrrriiiinnnnttttffff ((((""""CCCCoooonnnntttteeeexxxxtttt iiiissss AAAArrrrrrrraaaayyyy\\\\nnnn"""")))) ;;;;
-
- and here is some Perl to test it
-
-
-
-
- 29/Jan/96 perl 5.002 with 24
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- $$$$aaaa ==== PPPPrrrriiiinnnnttttCCCCoooonnnntttteeeexxxxtttt ;;;;
- @@@@aaaa ==== PPPPrrrriiiinnnnttttCCCCoooonnnntttteeeexxxxtttt ;;;;
-
- The output from that will be
-
- CCCCoooonnnntttteeeexxxxtttt iiiissss SSSSccccaaaallllaaaarrrr
- CCCCoooonnnntttteeeexxxxtttt iiiissss AAAArrrrrrrraaaayyyy
-
-
- UUUUssssiiiinnnngggg PPPPeeeerrrrllll ttttoooo ddddiiiissssppppoooosssseeee ooooffff tttteeeemmmmppppoooorrrraaaarrrriiiieeeessss
-
- In the examples given to date, any temporaries created in
- the callback (i.e. parameters passed on the stack to the
- _p_e_r_l___c_a_l_l___* function or values returned via the stack)
- have been freed by one of these methods
-
- +o specifying the G_DISCARD flag with _p_e_r_l___c_a_l_l___*.
-
- +o explicitly disposed of using the EEEENNNNTTTTEEEERRRR/SSSSAAAAVVVVEEEETTTTMMMMPPPPSSSS -
- FFFFRRRREEEEEEEETTTTMMMMPPPPSSSS/LLLLEEEEAAAAVVVVEEEE pairing.
-
- There is another method which can be used, namely letting
- Perl do it for you automatically whenever it regains
- control after the callback has terminated. This is done
- by simply not using the
-
- EEEENNNNTTTTEEEERRRR ;;;;
- SSSSAAAAVVVVEEEETTTTMMMMPPPPSSSS ;;;;
- ............
- FFFFRRRREEEEEEEETTTTMMMMPPPPSSSS ;;;;
- LLLLEEEEAAAAVVVVEEEE ;;;;
-
- sequence in the callback (and not, of course, specifying
- the G_DISCARD flag).
-
- If you are going to use this method you have to be aware
- of a possible memory leak which can arise under very
- specific circumstances. To explain these circumstances
- you need to know a bit about the flow of control between
- Perl and the callback routine.
-
- The examples given at the start of the document (an error
- handler and an event driven program) are typical of the
- two main sorts of flow control that you are likely to
- encounter with callbacks. There is a very important
- distinction between them, so pay attention.
-
- In the first example, an error handler, the flow of
- control could be as follows. You have created an
- interface to an external library. Control can reach the
- external library like this
-
- ppppeeeerrrrllll -------->>>> XXXXSSSSUUUUBBBB -------->>>> eeeexxxxtttteeeerrrrnnnnaaaallll lllliiiibbbbrrrraaaarrrryyyy
-
-
-
-
- 29/Jan/96 perl 5.002 with 25
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- Whilst control is in the library, an error condition
- occurs. You have previously set up a Perl callback to
- handle this situation, so it will get executed. Once the
- callback has finished, control will drop back to Perl
- again. Here is what the flow of control will be like in
- that situation
-
- ppppeeeerrrrllll -------->>>> XXXXSSSSUUUUBBBB -------->>>> eeeexxxxtttteeeerrrrnnnnaaaallll lllliiiibbbbrrrraaaarrrryyyy
- ............
- eeeerrrrrrrroooorrrr ooooccccccccuuuurrrrssss
- ............
- eeeexxxxtttteeeerrrrnnnnaaaallll lllliiiibbbbrrrraaaarrrryyyy -------->>>> ppppeeeerrrrllll____ccccaaaallllllll -------->>>> ppppeeeerrrrllll
- ||||
- ppppeeeerrrrllll <<<<-------- XXXXSSSSUUUUBBBB <<<<-------- eeeexxxxtttteeeerrrrnnnnaaaallll lllliiiibbbbrrrraaaarrrryyyy <<<<-------- ppppeeeerrrrllll____ccccaaaallllllll <<<<----------------++++
-
- After processing of the error using _p_e_r_l___c_a_l_l___* is
- completed, control reverts back to Perl more or less
- immediately.
-
- In the diagram, the further right you go the more deeply
- nested the scope is. It is only when control is back with
- perl on the extreme left of the diagram that you will have
- dropped back to the enclosing scope and any temporaries
- you have left hanging around will be freed.
-
- In the second example, an event driven program, the flow
- of control will be more like this
-
- ppppeeeerrrrllll -------->>>> XXXXSSSSUUUUBBBB -------->>>> eeeevvvveeeennnntttt hhhhaaaannnnddddlllleeeerrrr
- ............
- eeeevvvveeeennnntttt hhhhaaaannnnddddlllleeeerrrr -------->>>> ppppeeeerrrrllll____ccccaaaallllllll -------->>>> ppppeeeerrrrllll
- ||||
- eeeevvvveeeennnntttt hhhhaaaannnnddddlllleeeerrrr <<<<-------- ppppeeeerrrrllll____ccccaaaallllllll --------<<<<--------++++
- ............
- eeeevvvveeeennnntttt hhhhaaaannnnddddlllleeeerrrr -------->>>> ppppeeeerrrrllll____ccccaaaallllllll -------->>>> ppppeeeerrrrllll
- ||||
- eeeevvvveeeennnntttt hhhhaaaannnnddddlllleeeerrrr <<<<-------- ppppeeeerrrrllll____ccccaaaallllllll --------<<<<--------++++
- ............
- eeeevvvveeeennnntttt hhhhaaaannnnddddlllleeeerrrr -------->>>> ppppeeeerrrrllll____ccccaaaallllllll -------->>>> ppppeeeerrrrllll
- ||||
- eeeevvvveeeennnntttt hhhhaaaannnnddddlllleeeerrrr <<<<-------- ppppeeeerrrrllll____ccccaaaallllllll --------<<<<--------++++
-
- In this case the flow of control can consist of only the
- repeated sequence
-
- eeeevvvveeeennnntttt hhhhaaaannnnddddlllleeeerrrr -------->>>> ppppeeeerrrrllll____ccccaaaallllllll -------->>>> ppppeeeerrrrllll
-
- for the practically the complete duration of the program.
- This means that control may _n_e_v_e_r drop back to the
- surrounding scope in Perl at the extreme left.
-
- So what is the big problem? Well, if you are expecting
- Perl to tidy up those temporaries for you, you might be in
- for a long wait. For Perl to actually dispose of your
-
-
-
- 29/Jan/96 perl 5.002 with 26
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- temporaries, control must drop back to the enclosing scope
- at some stage. In the event driven scenario that may
- never happen. This means that as time goes on, your
- program will create more and more temporaries, none of
- which will ever be freed. As each of these temporaries
- consumes some memory your program will eventually consume
- all the available memory in your system - kapow!
-
- So here is the bottom line - if you are sure that control
- will revert back to the enclosing Perl scope fairly
- quickly after the end of your callback, then it isn't
- absolutely necessary to explicitly dispose of any
- temporaries you may have created. Mind you, if you are at
- all uncertain about what to do, it doesn't do any harm to
- tidy up anyway.
-
- SSSSttttrrrraaaatttteeeeggggiiiieeeessss ffffoooorrrr ssssttttoooorrrriiiinnnngggg CCCCaaaallllllllbbbbaaaacccckkkk CCCCoooonnnntttteeeexxxxtttt IIIInnnnffffoooorrrrmmmmaaaattttiiiioooonnnn
-
- Potentially one of the trickiest problems to overcome when
- designing a callback interface can be figuring out how to
- store the mapping between the C callback function and the
- Perl equivalent.
-
- To help understand why this can be a real problem first
- consider how a callback is set up in an all C environment.
- Typically a C API will provide a function to register a
- callback. This will expect a pointer to a function as one
- of its parameters. Below is a call to a hypothetical
- function rrrreeeeggggiiiisssstttteeeerrrr____ffffaaaattttaaaallll which registers the C function to
- get called when a fatal error occurs.
-
- rrrreeeeggggiiiisssstttteeeerrrr____ffffaaaattttaaaallll((((ccccbbbb1111)))) ;;;;
-
- The single parameter ccccbbbb1111 is a pointer to a function, so
- you must have defined ccccbbbb1111 in your code, say something like
- this
-
- ssssttttaaaattttiiiicccc vvvvooooiiiidddd
- ccccbbbb1111(((())))
- {{{{
- pppprrrriiiinnnnttttffff ((((""""FFFFaaaattttaaaallll EEEErrrrrrrroooorrrr\\\\nnnn"""")))) ;;;;
- eeeexxxxiiiitttt((((1111)))) ;;;;
- }}}}
-
- Now change that to call a Perl subroutine instead
-
- ssssttttaaaattttiiiicccc SSSSVVVV **** ccccaaaallllllllbbbbaaaacccckkkk ==== ((((SSSSVVVV****))))NNNNUUUULLLLLLLL;;;;
-
- ssssttttaaaattttiiiicccc vvvvooooiiiidddd
- ccccbbbb1111(((())))
- {{{{
- ddddSSSSPPPP ;;;;
-
- PPPPUUUUSSSSHHHHMMMMAAAARRRRKKKK((((sssspppp)))) ;;;;
-
-
-
- 29/Jan/96 perl 5.002 with 27
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- ////**** CCCCaaaallllllll tttthhhheeee PPPPeeeerrrrllll ssssuuuubbbb ttttoooo pppprrrroooocccceeeessssssss tttthhhheeee ccccaaaallllllllbbbbaaaacccckkkk ****////
- ppppeeeerrrrllll____ccccaaaallllllll____ssssvvvv((((ccccaaaallllllllbbbbaaaacccckkkk,,,, GGGG____DDDDIIIISSSSCCCCAAAARRRRDDDD)))) ;;;;
- }}}}
-
- vvvvooooiiiidddd
- rrrreeeeggggiiiisssstttteeeerrrr____ffffaaaattttaaaallll((((ffffnnnn))))
- SSSSVVVV **** ffffnnnn
- CCCCOOOODDDDEEEE::::
- ////**** RRRReeeemmmmeeeemmmmbbbbeeeerrrr tttthhhheeee PPPPeeeerrrrllll ssssuuuubbbb ****////
- iiiiffff ((((ccccaaaallllllllbbbbaaaacccckkkk ======== ((((SSSSVVVV****))))NNNNUUUULLLLLLLL))))
- ccccaaaallllllllbbbbaaaacccckkkk ==== nnnneeeewwwwSSSSVVVVssssvvvv((((ffffnnnn)))) ;;;;
- eeeellllsssseeee
- SSSSvvvvSSSSeeeettttSSSSVVVV((((ccccaaaallllllllbbbbaaaacccckkkk,,,, ffffnnnn)))) ;;;;
-
- ////**** rrrreeeeggggiiiisssstttteeeerrrr tttthhhheeee ccccaaaallllllllbbbbaaaacccckkkk wwwwiiiitttthhhh tttthhhheeee eeeexxxxtttteeeerrrrnnnnaaaallll lllliiiibbbbrrrraaaarrrryyyy ****////
- rrrreeeeggggiiiisssstttteeeerrrr____ffffaaaattttaaaallll((((ccccbbbb1111)))) ;;;;
-
- where the Perl equivalent of rrrreeeeggggiiiisssstttteeeerrrr____ffffaaaattttaaaallll and the
- callback it registers, ppppccccbbbb1111, might look like this
-
- #### RRRReeeeggggiiiisssstttteeeerrrr tttthhhheeee ssssuuuubbbb ppppccccbbbb1111
- rrrreeeeggggiiiisssstttteeeerrrr____ffffaaaattttaaaallll((((\\\\&&&&ppppccccbbbb1111)))) ;;;;
-
- ssssuuuubbbb ppppccccbbbb1111
- {{{{
- ddddiiiieeee """"IIII''''mmmm ddddyyyyiiiinnnngggg............\\\\nnnn"""" ;;;;
- }}}}
-
- The mapping between the C callback and the Perl equivalent
- is stored in the global variable ccccaaaallllllllbbbbaaaacccckkkk.
-
- This will be adequate if you ever need to have only 1
- callback registered at any time. An example could be an
- error handler like the code sketched out above. Remember
- though, repeated calls to rrrreeeeggggiiiisssstttteeeerrrr____ffffaaaattttaaaallll will replace the
- previously registered callback function with the new one.
-
- Say for example you want to interface to a library which
- allows asynchronous file i/o. In this case you may be
- able to register a callback whenever a read operation has
- completed. To be of any use we want to be able to call
- separate Perl subroutines for each file that is opened.
- As it stands, the error handler example above would not be
- adequate as it allows only a single callback to be defined
- at any time. What we require is a means of storing the
- mapping between the opened file and the Perl subroutine we
- want to be called for that file.
-
- Say the i/o library has a function aaaassssyyyynnnncccchhhh____rrrreeeeaaaadddd which
- associates a C function PPPPrrrroooocccceeeessssssssRRRReeeeaaaadddd with a file handle ffffhhhh
- - this assumes that it has also provided some routine to
- open the file and so obtain the file handle.
-
- aaaassssyyyynnnncccchhhh____rrrreeeeaaaadddd((((ffffhhhh,,,, PPPPrrrroooocccceeeessssssssRRRReeeeaaaadddd))))
-
-
-
- 29/Jan/96 perl 5.002 with 28
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- This may expect the C _P_r_o_c_e_s_s_R_e_a_d function of this form
-
- vvvvooooiiiidddd
- PPPPrrrroooocccceeeessssssssRRRReeeeaaaadddd((((ffffhhhh,,,, bbbbuuuuffffffffeeeerrrr))))
- iiiinnnntttt ffffhhhh ;;;;
- cccchhhhaaaarrrr **** bbbbuuuuffffffffeeeerrrr ;;;;
- {{{{
- ............
- }}}}
-
- To provide a Perl interface to this library we need to be
- able to map between the ffffhhhh parameter and the Perl
- subroutine we want called. A hash is a convenient
- mechanism for storing this mapping. The code below shows
- a possible implementation
-
- ssssttttaaaattttiiiicccc HHHHVVVV **** MMMMaaaappppppppiiiinnnngggg ==== ((((HHHHVVVV****))))NNNNUUUULLLLLLLL ;;;;
-
- vvvvooooiiiidddd
- aaaassssyyyynnnncccchhhh____rrrreeeeaaaadddd((((ffffhhhh,,,, ccccaaaallllllllbbbbaaaacccckkkk))))
- iiiinnnntttt ffffhhhh
- SSSSVVVV **** ccccaaaallllllllbbbbaaaacccckkkk
- CCCCOOOODDDDEEEE::::
- ////**** IIIIffff tttthhhheeee hhhhaaaasssshhhh ddddooooeeeessssnnnn''''tttt aaaallllrrrreeeeaaaaddddyyyy eeeexxxxiiiisssstttt,,,, ccccrrrreeeeaaaatttteeee iiiitttt ****////
- iiiiffff ((((MMMMaaaappppppppiiiinnnngggg ======== ((((HHHHVVVV****))))NNNNUUUULLLLLLLL))))
- MMMMaaaappppppppiiiinnnngggg ==== nnnneeeewwwwHHHHVVVV(((()))) ;;;;
-
- ////**** SSSSaaaavvvveeee tttthhhheeee ffffhhhh ---->>>> ccccaaaallllllllbbbbaaaacccckkkk mmmmaaaappppppppiiiinnnngggg ****////
- hhhhvvvv____ssssttttoooorrrreeee((((MMMMaaaappppppppiiiinnnngggg,,,, ((((cccchhhhaaaarrrr****))))&&&&ffffhhhh,,,, ssssiiiizzzzeeeeooooffff((((ffffhhhh)))),,,, nnnneeeewwwwSSSSVVVVssssvvvv((((ccccaaaallllllllbbbbaaaacccckkkk)))),,,, 0000)))) ;;;;
-
- ////**** RRRReeeeggggiiiisssstttteeeerrrr wwwwiiiitttthhhh tttthhhheeee CCCC LLLLiiiibbbbrrrraaaarrrryyyy ****////
- aaaassssyyyynnnncccchhhh____rrrreeeeaaaadddd((((ffffhhhh,,,, aaaassssyyyynnnncccchhhh____rrrreeeeaaaadddd____iiiiffff)))) ;;;;
-
- and aaaassssyyyynnnncccchhhh____rrrreeeeaaaadddd____iiiiffff could look like this
-
- ssssttttaaaattttiiiicccc vvvvooooiiiidddd
- aaaassssyyyynnnncccchhhh____rrrreeeeaaaadddd____iiiiffff((((ffffhhhh,,,, bbbbuuuuffffffffeeeerrrr))))
- iiiinnnntttt ffffhhhh ;;;;
- cccchhhhaaaarrrr **** bbbbuuuuffffffffeeeerrrr ;;;;
- {{{{
- ddddSSSSPPPP ;;;;
- SSSSVVVV ******** ssssvvvv ;;;;
-
- ////**** GGGGeeeetttt tttthhhheeee ccccaaaallllllllbbbbaaaacccckkkk aaaassssssssoooocccciiiiaaaatttteeeedddd wwwwiiiitttthhhh ffffhhhh ****////
- ssssvvvv ==== hhhhvvvv____ffffeeeettttcccchhhh((((MMMMaaaappppppppiiiinnnngggg,,,, ((((cccchhhhaaaarrrr****))))&&&&ffffhhhh ,,,, ssssiiiizzzzeeeeooooffff((((ffffhhhh)))),,,, FFFFAAAALLLLSSSSEEEE)))) ;;;;
- iiiiffff ((((ssssvvvv ======== ((((SSSSVVVV********))))NNNNUUUULLLLLLLL))))
- ccccrrrrooooaaaakkkk((((""""IIIInnnntttteeeerrrrnnnnaaaallll eeeerrrrrrrroooorrrr............\\\\nnnn"""")))) ;;;;
-
- PPPPUUUUSSSSHHHHMMMMAAAARRRRKKKK((((sssspppp)))) ;;;;
- XXXXPPPPUUUUSSSSHHHHssss((((ssssvvvv____2222mmmmoooorrrrttttaaaallll((((nnnneeeewwwwSSSSVVVViiiivvvv((((ffffhhhh)))))))))))) ;;;;
- XXXXPPPPUUUUSSSSHHHHssss((((ssssvvvv____2222mmmmoooorrrrttttaaaallll((((nnnneeeewwwwSSSSVVVVppppvvvv((((bbbbuuuuffffffffeeeerrrr,,,, 0000)))))))))))) ;;;;
- PPPPUUUUTTTTBBBBAAAACCCCKKKK ;;;;
-
-
-
-
-
- 29/Jan/96 perl 5.002 with 29
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- ////**** CCCCaaaallllllll tttthhhheeee PPPPeeeerrrrllll ssssuuuubbbb ****////
- ppppeeeerrrrllll____ccccaaaallllllll____ssssvvvv((((****ssssvvvv,,,, GGGG____DDDDIIIISSSSCCCCAAAARRRRDDDD)))) ;;;;
- }}}}
-
- For completeness, here is aaaassssyyyynnnncccchhhh____cccclllloooosssseeee. This shows how to
- remove the entry from the hash MMMMaaaappppppppiiiinnnngggg.
-
- vvvvooooiiiidddd
- aaaassssyyyynnnncccchhhh____cccclllloooosssseeee((((ffffhhhh))))
- iiiinnnntttt ffffhhhh
- CCCCOOOODDDDEEEE::::
- ////**** RRRReeeemmmmoooovvvveeee tttthhhheeee eeeennnnttttrrrryyyy ffffrrrroooommmm tttthhhheeee hhhhaaaasssshhhh ****////
- ((((vvvvooooiiiidddd)))) hhhhvvvv____ddddeeeelllleeeetttteeee((((MMMMaaaappppppppiiiinnnngggg,,,, ((((cccchhhhaaaarrrr****))))&&&&ffffhhhh,,,, ssssiiiizzzzeeeeooooffff((((ffffhhhh)))),,,, GGGG____DDDDIIIISSSSCCCCAAAARRRRDDDD)))) ;;;;
-
- ////**** NNNNoooowwww ccccaaaallllllll tttthhhheeee rrrreeeeaaaallll aaaassssyyyynnnncccchhhh____cccclllloooosssseeee ****////
- aaaassssyyyynnnncccchhhh____cccclllloooosssseeee((((ffffhhhh)))) ;;;;
-
- So the Perl interface would look like this
-
- ssssuuuubbbb ccccaaaallllllllbbbbaaaacccckkkk1111
- {{{{
- mmmmyyyy(((($$$$hhhhaaaannnnddddlllleeee,,,, $$$$bbbbuuuuffffffffeeeerrrr)))) ==== @@@@____ ;;;;
- }}}}
-
- #### RRRReeeeggggiiiisssstttteeeerrrr tttthhhheeee PPPPeeeerrrrllll ccccaaaallllllllbbbbaaaacccckkkk
- aaaassssyyyynnnncccchhhh____rrrreeeeaaaadddd(((($$$$ffffhhhh,,,, \\\\&&&&ccccaaaallllllllbbbbaaaacccckkkk1111)))) ;;;;
-
- aaaassssyyyynnnncccchhhh____cccclllloooosssseeee(((($$$$ffffhhhh)))) ;;;;
-
- The mapping between the C callback and Perl is stored in
- the global hash MMMMaaaappppppppiiiinnnngggg this time. Using a hash has the
- distinct advantage that it allows an unlimited number of
- callbacks to be registered.
-
- What if the interface provided by the C callback doesn't
- contain a parameter which allows the file handle to Perl
- subroutine mapping? Say in the asynchronous i/o package,
- the callback function gets passed only the bbbbuuuuffffffffeeeerrrr
- parameter like this
-
- vvvvooooiiiidddd
- PPPPrrrroooocccceeeessssssssRRRReeeeaaaadddd((((bbbbuuuuffffffffeeeerrrr))))
- cccchhhhaaaarrrr **** bbbbuuuuffffffffeeeerrrr ;;;;
- {{{{
- ............
- }}}}
-
- Without the file handle there is no straightforward way to
- map from the C callback to the Perl subroutine.
-
- In this case a possible way around this problem is to pre-
- define a series of C functions to act as the interface to
- Perl, thus
-
-
-
-
- 29/Jan/96 perl 5.002 with 30
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- ####ddddeeeeffffiiiinnnneeee MMMMAAAAXXXX____CCCCBBBB 3333
- ####ddddeeeeffffiiiinnnneeee NNNNUUUULLLLLLLL____HHHHAAAANNNNDDDDLLLLEEEE ----1111
- ttttyyyyppppeeeeddddeeeeffff vvvvooooiiiidddd ((((****FFFFnnnnMMMMaaaapppp))))(((()))) ;;;;
-
- ssssttttrrrruuuucccctttt MMMMaaaappppSSSSttttrrrruuuucccctttt {{{{
- FFFFnnnnMMMMaaaapppp FFFFuuuunnnnccccttttiiiioooonnnn ;;;;
- SSSSVVVV **** PPPPeeeerrrrllllSSSSuuuubbbb ;;;;
- iiiinnnntttt HHHHaaaannnnddddlllleeee ;;;;
- }}}} ;;;;
-
- ssssttttaaaattttiiiicccc vvvvooooiiiidddd ffffnnnn1111(((()))) ;;;;
- ssssttttaaaattttiiiicccc vvvvooooiiiidddd ffffnnnn2222(((()))) ;;;;
- ssssttttaaaattttiiiicccc vvvvooooiiiidddd ffffnnnn3333(((()))) ;;;;
-
- ssssttttaaaattttiiiicccc ssssttttrrrruuuucccctttt MMMMaaaappppSSSSttttrrrruuuucccctttt MMMMaaaapppp [[[[MMMMAAAAXXXX____CCCCBBBB]]]] ====
- {{{{
- {{{{ ffffnnnn1111,,,, NNNNUUUULLLLLLLL,,,, NNNNUUUULLLLLLLL____HHHHAAAANNNNDDDDLLLLEEEE }}}},,,,
- {{{{ ffffnnnn2222,,,, NNNNUUUULLLLLLLL,,,, NNNNUUUULLLLLLLL____HHHHAAAANNNNDDDDLLLLEEEE }}}},,,,
- {{{{ ffffnnnn3333,,,, NNNNUUUULLLLLLLL,,,, NNNNUUUULLLLLLLL____HHHHAAAANNNNDDDDLLLLEEEE }}}}
- }}}} ;;;;
-
- ssssttttaaaattttiiiicccc vvvvooooiiiidddd
- PPPPccccbbbb((((iiiinnnnddddeeeexxxx,,,, bbbbuuuuffffffffeeeerrrr))))
- iiiinnnntttt iiiinnnnddddeeeexxxx ;;;;
- cccchhhhaaaarrrr **** bbbbuuuuffffffffeeeerrrr ;;;;
- {{{{
- ddddSSSSPPPP ;;;;
-
- PPPPUUUUSSSSHHHHMMMMAAAARRRRKKKK((((sssspppp)))) ;;;;
- XXXXPPPPUUUUSSSSHHHHssss((((ssssvvvv____2222mmmmoooorrrrttttaaaallll((((nnnneeeewwwwSSSSVVVVppppvvvv((((bbbbuuuuffffffffeeeerrrr,,,, 0000)))))))))))) ;;;;
- PPPPUUUUTTTTBBBBAAAACCCCKKKK ;;;;
-
- ////**** CCCCaaaallllllll tttthhhheeee PPPPeeeerrrrllll ssssuuuubbbb ****////
- ppppeeeerrrrllll____ccccaaaallllllll____ssssvvvv((((MMMMaaaapppp[[[[iiiinnnnddddeeeexxxx]]]]....PPPPeeeerrrrllllSSSSuuuubbbb,,,, GGGG____DDDDIIIISSSSCCCCAAAARRRRDDDD)))) ;;;;
- }}}}
-
- ssssttttaaaattttiiiicccc vvvvooooiiiidddd
- ffffnnnn1111((((bbbbuuuuffffffffeeeerrrr))))
- cccchhhhaaaarrrr **** bbbbuuuuffffffffeeeerrrr ;;;;
- {{{{
- PPPPccccbbbb((((0000,,,, bbbbuuuuffffffffeeeerrrr)))) ;;;;
- }}}}
-
- ssssttttaaaattttiiiicccc vvvvooooiiiidddd
- ffffnnnn2222((((bbbbuuuuffffffffeeeerrrr))))
- cccchhhhaaaarrrr **** bbbbuuuuffffffffeeeerrrr ;;;;
- {{{{
- PPPPccccbbbb((((1111,,,, bbbbuuuuffffffffeeeerrrr)))) ;;;;
- }}}}
-
-
-
-
-
-
-
-
- 29/Jan/96 perl 5.002 with 31
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- ssssttttaaaattttiiiicccc vvvvooooiiiidddd
- ffffnnnn3333((((bbbbuuuuffffffffeeeerrrr))))
- cccchhhhaaaarrrr **** bbbbuuuuffffffffeeeerrrr ;;;;
- {{{{
- PPPPccccbbbb((((2222,,,, bbbbuuuuffffffffeeeerrrr)))) ;;;;
- }}}}
-
- vvvvooooiiiidddd
- aaaarrrrrrrraaaayyyy____aaaassssyyyynnnncccchhhh____rrrreeeeaaaadddd((((ffffhhhh,,,, ccccaaaallllllllbbbbaaaacccckkkk))))
- iiiinnnntttt ffffhhhh
- SSSSVVVV **** ccccaaaallllllllbbbbaaaacccckkkk
- CCCCOOOODDDDEEEE::::
- iiiinnnntttt iiiinnnnddddeeeexxxx ;;;;
- iiiinnnntttt nnnnuuuullllllll____iiiinnnnddddeeeexxxx ==== MMMMAAAAXXXX____CCCCBBBB ;;;;
-
- ////**** FFFFiiiinnnndddd tttthhhheeee ssssaaaammmmeeee hhhhaaaannnnddddlllleeee oooorrrr aaaannnn eeeemmmmppppttttyyyy eeeennnnttttrrrryyyy ****////
- ffffoooorrrr ((((iiiinnnnddddeeeexxxx ==== 0000 ;;;; iiiinnnnddddeeeexxxx <<<< MMMMAAAAXXXX____CCCCBBBB ;;;; ++++++++iiiinnnnddddeeeexxxx))))
- {{{{
- iiiiffff ((((MMMMaaaapppp[[[[iiiinnnnddddeeeexxxx]]]]....HHHHaaaannnnddddlllleeee ======== ffffhhhh))))
- bbbbrrrreeeeaaaakkkk ;;;;
-
- iiiiffff ((((MMMMaaaapppp[[[[iiiinnnnddddeeeexxxx]]]]....HHHHaaaannnnddddlllleeee ======== NNNNUUUULLLLLLLL____HHHHAAAANNNNDDDDLLLLEEEE))))
- nnnnuuuullllllll____iiiinnnnddddeeeexxxx ==== iiiinnnnddddeeeexxxx ;;;;
- }}}}
-
- iiiiffff ((((iiiinnnnddddeeeexxxx ======== MMMMAAAAXXXX____CCCCBBBB &&&&&&&& nnnnuuuullllllll____iiiinnnnddddeeeexxxx ======== MMMMAAAAXXXX____CCCCBBBB))))
- ccccrrrrooooaaaakkkk ((((""""TTTToooooooo mmmmaaaannnnyyyy ccccaaaallllllllbbbbaaaacccckkkk ffffuuuunnnnccccttttiiiioooonnnnssss rrrreeeeggggiiiisssstttteeeerrrreeeedddd\\\\nnnn"""")))) ;;;;
-
- iiiiffff ((((iiiinnnnddddeeeexxxx ======== MMMMAAAAXXXX____CCCCBBBB))))
- iiiinnnnddddeeeexxxx ==== nnnnuuuullllllll____iiiinnnnddddeeeexxxx ;;;;
-
- ////**** SSSSaaaavvvveeee tttthhhheeee ffffiiiilllleeee hhhhaaaannnnddddlllleeee ****////
- MMMMaaaapppp[[[[iiiinnnnddddeeeexxxx]]]]....HHHHaaaannnnddddlllleeee ==== ffffhhhh ;;;;
-
- ////**** RRRReeeemmmmeeeemmmmbbbbeeeerrrr tttthhhheeee PPPPeeeerrrrllll ssssuuuubbbb ****////
- iiiiffff ((((MMMMaaaapppp[[[[iiiinnnnddddeeeexxxx]]]]....PPPPeeeerrrrllllSSSSuuuubbbb ======== ((((SSSSVVVV****))))NNNNUUUULLLLLLLL))))
- MMMMaaaapppp[[[[iiiinnnnddddeeeexxxx]]]]....PPPPeeeerrrrllllSSSSuuuubbbb ==== nnnneeeewwwwSSSSVVVVssssvvvv((((ccccaaaallllllllbbbbaaaacccckkkk)))) ;;;;
- eeeellllsssseeee
- SSSSvvvvSSSSeeeettttSSSSVVVV((((MMMMaaaapppp[[[[iiiinnnnddddeeeexxxx]]]]....PPPPeeeerrrrllllSSSSuuuubbbb,,,, ccccaaaallllllllbbbbaaaacccckkkk)))) ;;;;
-
- aaaassssyyyynnnncccchhhh____rrrreeeeaaaadddd((((ffffhhhh,,,, MMMMaaaapppp[[[[iiiinnnnddddeeeexxxx]]]]....FFFFuuuunnnnccccttttiiiioooonnnn)))) ;;;;
-
- vvvvooooiiiidddd
- aaaarrrrrrrraaaayyyy____aaaassssyyyynnnncccchhhh____cccclllloooosssseeee((((ffffhhhh))))
- iiiinnnntttt ffffhhhh
- CCCCOOOODDDDEEEE::::
- iiiinnnntttt iiiinnnnddddeeeexxxx ;;;;
-
- ////**** FFFFiiiinnnndddd tttthhhheeee ffffiiiilllleeee hhhhaaaannnnddddlllleeee ****////
- ffffoooorrrr ((((iiiinnnnddddeeeexxxx ==== 0000;;;; iiiinnnnddddeeeexxxx <<<< MMMMAAAAXXXX____CCCCBBBB ;;;; ++++++++ iiiinnnnddddeeeexxxx))))
- iiiiffff ((((MMMMaaaapppp[[[[iiiinnnnddddeeeexxxx]]]]....HHHHaaaannnnddddlllleeee ======== ffffhhhh))))
- bbbbrrrreeeeaaaakkkk ;;;;
-
-
-
-
-
- 29/Jan/96 perl 5.002 with 32
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- iiiiffff ((((iiiinnnnddddeeeexxxx ======== MMMMAAAAXXXX____CCCCBBBB))))
- ccccrrrrooooaaaakkkk ((((""""ccccoooouuuulllldddd nnnnooootttt cccclllloooosssseeee ffffhhhh %%%%dddd\\\\nnnn"""",,,, ffffhhhh)))) ;;;;
-
- MMMMaaaapppp[[[[iiiinnnnddddeeeexxxx]]]]....HHHHaaaannnnddddlllleeee ==== NNNNUUUULLLLLLLL____HHHHAAAANNNNDDDDLLLLEEEE ;;;;
- SSSSvvvvRRRREEEEFFFFCCCCNNNNTTTT____ddddeeeecccc((((MMMMaaaapppp[[[[iiiinnnnddddeeeexxxx]]]]....PPPPeeeerrrrllllSSSSuuuubbbb)))) ;;;;
- MMMMaaaapppp[[[[iiiinnnnddddeeeexxxx]]]]....PPPPeeeerrrrllllSSSSuuuubbbb ==== ((((SSSSVVVV****))))NNNNUUUULLLLLLLL ;;;;
-
- aaaassssyyyynnnncccchhhh____cccclllloooosssseeee((((ffffhhhh)))) ;;;;
-
- In this case the functions ffffnnnn1111, ffffnnnn2222 and ffffnnnn3333 are used to
- remember the Perl subroutine to be called. Each of the
- functions holds a separate hard-wired index which is used
- in the function PPPPccccbbbb to access the MMMMaaaapppp array and actually
- call the Perl subroutine.
-
- There are some obvious disadvantages with this technique.
-
- Firstly, the code is considerably more complex than with
- the previous example.
-
- Secondly, there is a hard-wired limit (in this case 3) to
- the number of callbacks that can exist simultaneously. The
- only way to increase the limit is by modifying the code to
- add more functions and then re-compiling. None the less,
- as long as the number of functions is chosen with some
- care, it is still a workable solution and in some cases is
- the only one available.
-
- To summarize, here are a number of possible methods for
- you to consider for storing the mapping between C and the
- Perl callback
-
- 1. Ignore the problem - Allow only 1 callback
- For a lot of situations, like interfacing to an error
- handler, this may be a perfectly adequate solution.
-
- 2. Create a sequence of callbacks - hard wired limit
- If it is impossible to tell from the parameters
- passed back from the C callback what the context is,
- then you may need to create a sequence of C callback
- interface functions, and store pointers to each in an
- array.
-
- 3. Use a parameter to map to the Perl callback
- A hash is an ideal mechanism to store the mapping
- between C and Perl.
-
- AAAAlllltttteeeerrrrnnnnaaaatttteeee SSSSttttaaaacccckkkk MMMMaaaannnniiiippppuuuullllaaaattttiiiioooonnnn
-
- Although I have made use of only the PPPPOOOOPPPP**** macros to access
- values returned from Perl subroutines, it is also possible
- to bypass these macros and read the stack using the SSSSTTTT
- macro (See the _p_e_r_l_x_s manpage for a full description of
- the SSSSTTTT macro).
-
-
-
- 29/Jan/96 perl 5.002 with 33
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- Most of the time the PPPPOOOOPPPP**** macros should be adequate, the
- main problem with them is that they force you to process
- the returned values in sequence. This may not be the most
- suitable way to process the values in some cases. What we
- want is to be able to access the stack in a random order.
- The SSSSTTTT macro as used when coding an XSUB is ideal for this
- purpose.
-
- The code below is the example given in the section
- _R_e_t_u_r_n_i_n_g _a _l_i_s_t _o_f _v_a_l_u_e_s recoded to use SSSSTTTT instead of
- PPPPOOOOPPPP****.
-
- ssssttttaaaattttiiiicccc vvvvooooiiiidddd
- ccccaaaallllllll____AAAAddddddddSSSSuuuubbbbttttrrrraaaacccctttt2222((((aaaa,,,, bbbb))))
- iiiinnnntttt aaaa ;;;;
- iiiinnnntttt bbbb ;;;;
- {{{{
- ddddSSSSPPPP ;;;;
- IIII33332222 aaaaxxxx ;;;;
- iiiinnnntttt ccccoooouuuunnnntttt ;;;;
-
- EEEENNNNTTTTEEEERRRR ;;;;
- SSSSAAAAVVVVEEEETTTTMMMMPPPPSSSS;;;;
-
- PPPPUUUUSSSSHHHHMMMMAAAARRRRKKKK((((sssspppp)))) ;;;;
- XXXXPPPPUUUUSSSSHHHHssss((((ssssvvvv____2222mmmmoooorrrrttttaaaallll((((nnnneeeewwwwSSSSVVVViiiivvvv((((aaaa))))))))))));;;;
- XXXXPPPPUUUUSSSSHHHHssss((((ssssvvvv____2222mmmmoooorrrrttttaaaallll((((nnnneeeewwwwSSSSVVVViiiivvvv((((bbbb))))))))))));;;;
- PPPPUUUUTTTTBBBBAAAACCCCKKKK ;;;;
-
- ccccoooouuuunnnntttt ==== ppppeeeerrrrllll____ccccaaaallllllll____ppppvvvv((((""""AAAAddddddddSSSSuuuubbbbttttrrrraaaacccctttt"""",,,, GGGG____AAAARRRRRRRRAAAAYYYY))));;;;
-
- SSSSPPPPAAAAGGGGAAAAIIIINNNN ;;;;
- sssspppp ----==== ccccoooouuuunnnntttt ;;;;
- aaaaxxxx ==== ((((sssspppp ---- ssssttttaaaacccckkkk____bbbbaaaasssseeee)))) ++++ 1111 ;;;;
-
- iiiiffff ((((ccccoooouuuunnnntttt !!!!==== 2222))))
- ccccrrrrooooaaaakkkk((((""""BBBBiiiigggg ttttrrrroooouuuubbbblllleeee\\\\nnnn"""")))) ;;;;
-
- pppprrrriiiinnnnttttffff ((((""""%%%%dddd ++++ %%%%dddd ==== %%%%dddd\\\\nnnn"""",,,, aaaa,,,, bbbb,,,, SSSSvvvvIIIIVVVV((((SSSSTTTT((((0000)))))))))))) ;;;;
- pppprrrriiiinnnnttttffff ((((""""%%%%dddd ---- %%%%dddd ==== %%%%dddd\\\\nnnn"""",,,, aaaa,,,, bbbb,,,, SSSSvvvvIIIIVVVV((((SSSSTTTT((((1111)))))))))))) ;;;;
-
- PPPPUUUUTTTTBBBBAAAACCCCKKKK ;;;;
- FFFFRRRREEEEEEEETTTTMMMMPPPPSSSS ;;;;
- LLLLEEEEAAAAVVVVEEEE ;;;;
- }}}}
-
- Notes
-
- 1. Notice that it was necessary to define the variable
- aaaaxxxx. This is because the SSSSTTTT macro expects it to
- exist. If we were in an XSUB it would not be
- necessary to define aaaaxxxx as it is already defined for
- you.
-
-
-
-
- 29/Jan/96 perl 5.002 with 34
-
-
-
-
-
- PERLCALL(1) User Contributed Perl Documentation PERLCALL(1)
-
-
- 2. The code
-
- SSSSPPPPAAAAGGGGAAAAIIIINNNN ;;;;
- sssspppp ----==== ccccoooouuuunnnntttt ;;;;
- aaaaxxxx ==== ((((sssspppp ---- ssssttttaaaacccckkkk____bbbbaaaasssseeee)))) ++++ 1111 ;;;;
-
- sets the stack up so that we can use the SSSSTTTT macro.
-
- 3. Unlike the original coding of this example, the
- returned values are not accessed in reverse order.
- So SSSSTTTT((((0000)))) refers to the first value returned by the
- Perl subroutine and SSSSTTTT((((ccccoooouuuunnnntttt----1111)))) refers to the last.
-
- SSSSEEEEEEEE AAAALLLLSSSSOOOO
- the _p_e_r_l_x_s manpage, the _p_e_r_l_g_u_t_s manpage, the _p_e_r_l_e_m_b_e_d
- manpage
-
- AAAAUUUUTTTTHHHHOOOORRRR
- Paul Marquess <pmarquess@bfsec.bt.co.uk>
-
- Special thanks to the following people who assisted in the
- creation of the document.
-
- Jeff Okamoto, Tim Bunce, Nick Gianniotis, Steve Kelem,
- Gurusamy Sarathy and Larry Wall.
-
- DDDDAAAATTTTEEEE
- Version 1.2, 16th Jan 1996
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 29/Jan/96 perl 5.002 with 35
-
-
-