The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
COPYRIGHT 11
GIT_CHANGES 26360
INSTALL 14
KNOWN_PROBLEMS 04
MANIFEST 2436
MANIFEST.SKIP 02
META.json 050
META.yml 2222
MYMETA.json 050
MYMETA.yml 026
Makefile.PL 3356
OpenGL.pm 45
OpenGL.pod 33
OpenGL.xs 30
README 34
Release_Notes 189
TODO 5193
examples/glxgears.pl 0291
examples/simple.pl 11
examples/with-glut.txt 01
examples/with-glx.txt 010
frank-vbo.pl 0191
funlist.c 01200
gl_const.h 18
gl_util.c 3090
glpm_const.h 990
glut_util.h 1623
hang.pl 01653
include/GL/SGIFreeSWLicB.1.1.pdf --
opengl_glut.xs 01484
pixel_buffer_object.txt 01434
pogl-api.txt 0973
pogl_const.xs 21
pogl_gl_Pixe_Ver2.xs 25
pogl_gl_top.xs 191
pogl_glu.xs 48
pogl_glut.xs 34717
ppport.h 49547258
t/10_opengl_array.t 313315
test.pl 11
utils/strawberry.bat 030
41 files changed (This is a version diff) 885015350
@@ -1,7 +1,7 @@
 
  Copyright (c) 1998,1999 Kenneth Albanowski. All rights reserved.
  Copyright (c) 2007 Bob Free. All rights reserved.
- Copyright (c) 2009 Chris Marshall. All rights reserved.
+ Copyright (c) 2009-2013 Chris Marshall. All rights reserved.
  This program is free software; you can redistribute it and/or
  modify it under the same terms as Perl itself.
 
@@ -1,2636 +0,0 @@
-commit 578abaa6a694c109b815bea5c978bf96e11ab710
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Fri Jul 29 09:08:04 2011 -0400
-
-    Update readme-type files for OpenGL-0.66 release
-
- OpenGL.pm     |    2 +-
- OpenGL.pod    |   14 +++++++-------
- Release_Notes |   29 ++++++-----------------------
- SUPPORTS      |   11 +++++++++++
- 4 files changed, 25 insertions(+), 31 deletions(-)
-
-commit 7185e7c7226bb0a036ecc2db0d2ccdad6b67cfc8
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Fri Jul 29 09:05:16 2011 -0400
-
-    SKIP failing OpenGL::RPN calc tests
-    
-    These tests are for development against.  Because they
-    might cause crashes, we have to use Test::More's SKIP
-    feature rather than TODO.
-
- KNOWN_PROBLEMS      |    6 +-
- t/10_opengl_array.t |  938 ++++++++++++++++++++++++++-------------------------
- 2 files changed, 474 insertions(+), 470 deletions(-)
-
-commit 7ea902bb3070c99635a5afc0bbb46db743fac32c
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Jul 25 08:34:26 2011 -0400
-
-    Add t/10_opengl_array.t fails to KNOWN_PROBLEMS
-    
-    The TODO tests fails to ignore test failures when the
-    failure results in a crash of the interpreter itself.
-    Adding this fact to KNWON_PROBLEMS.  While the OpenGL::Array
-    problems are being debugged, maybe we could come up with a
-    way to make TODO skips work through crashes---perhaps by
-    spawning a separate interpreter for the tests?
-
- .gitignore     |    2 +-
- KNOWN_PROBLEMS |    6 +++++-
- 2 files changed, 6 insertions(+), 2 deletions(-)
-
-commit 3a28c9d0cd19bdbb7a36008e25e87fa5ac9fac44
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Fri Jul 22 10:10:54 2011 -0400
-
-    Update VERSION to 0.65_001 for more development
-
- OpenGL.pm     |    2 +-
- OpenGL.pod    |    2 +-
- Release_Notes |   35 +++++++++++++++++++++++++++++++++--
- 3 files changed, 35 insertions(+), 4 deletions(-)
-
-commit bb12e7f24e5c3430e07fee1c1f0f11cedcc2a50d
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Fri Jul 22 09:23:34 2011 -0400
-
-    Update docs and VERSION for 0.65 release
-
- KNOWN_PROBLEMS   |    4 +++
- OpenGL.pm        |    2 +-
- OpenGL.pod       |   67 +++++++++++++++++++++++++----------------------------
- Release_Notes    |   62 ++++++++++++++++++++++++++++++++++---------------
- SUPPORTS         |   11 +++++++++
- Tessellation.pod |    2 +-
- 6 files changed, 92 insertions(+), 56 deletions(-)
-
-commit 67e7fcbfe1f63a858b3fa4a01fcae3ffe6f53d3f
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Jul 18 14:09:01 2011 -0400
-
-    Update TODO list
-
- TODO |    8 +++++++-
- 1 files changed, 7 insertions(+), 1 deletions(-)
-
-commit c1b6ff5bee2e0047b2e820da9668e9628aa4ca43
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Jul 18 09:53:55 2011 -0400
-
-    Add release build pattern to .gitignore
-
- .gitignore |    1 +
- 1 files changed, 1 insertions(+), 0 deletions(-)
-
-commit 075fc18113f8533f3ae3e2f3299ad909fa19593e
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Jul 18 09:49:31 2011 -0400
-
-    Update VERSION to 0.64_005 for more development
-
- OpenGL.pm     |    2 +-
- OpenGL.pod    |    2 +-
- Release_Notes |   33 +++++++++++++++++++++++++++++++++
- 3 files changed, 35 insertions(+), 2 deletions(-)
-
-commit 2d05a0dfb416208ceb026c7d13b3ffec7b2d68e1
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Jul 18 08:59:32 2011 -0400
-
-    Update Release_Notes for CPAN 0.64_004 release
-
- Release_Notes |    6 +++++-
- 1 files changed, 5 insertions(+), 1 deletions(-)
-
-commit c0172473ee5ba6f2bae172fb5b723d658b4cec09
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Tue Jul 12 09:43:26 2011 -0400
-
-    Fix bug in check if @ARGV has values in it
-    
-    The test was $#ARGV which should have either been
-    ($#ARGV > -1) or scalar(@ARGV).  Fixed in line 75
-
- test.pl |    2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
-commit 18abc4c4ad327df48f689a1756dcea3731afcc16
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Jul 11 13:12:05 2011 -0400
-
-    Add info to build for META.yml and MANIFEST/git
-
- .gitignore    |    1 +
- MANIFEST.SKIP |    2 ++
- META.yml      |   13 -------------
- Makefile.PL   |   10 +++++++++-
- 4 files changed, 12 insertions(+), 14 deletions(-)
-
-commit b05cb1c311e611e7800261fdfd5d98e4f2523893
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Jul 11 11:14:27 2011 -0400
-
-    Update version to 0.64_004 for more development
-
- OpenGL.pm     |    2 +-
- OpenGL.pod    |    2 +-
- Release_Notes |   14 ++++++++++++++
- 3 files changed, 16 insertions(+), 2 deletions(-)
-
-commit a8f87b90906b0e9b07924f21d3dcab941af4f1da
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Jul 11 10:56:33 2011 -0400
-
-    Update readme-type files for cpan devel release
-
- KNOWN_PROBLEMS |    4 -
- README         |  244 ++++++++++++++++++++++++++++----------------------------
- Release_Notes  |    8 ++-
- 3 files changed, 128 insertions(+), 128 deletions(-)
-
-commit 543a942d90ba05dae86d3fe686a3e29b99f0748f
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Thu Jul 7 14:45:28 2011 -0400
-
-    Fix interface=W32API build for cygwin
-    
-    If you don't specify interface=W32API or interface=WGL
-    on cygwin, it will fall through to a GLX/X11 build
-    and mesa rendering.
-
- FreeGLUT/freeglut.dll |  Bin 233472 -> 233472 bytes
- Makefile.PL           |    3 +-
- gl_exclude.h          |  173 +-----------------------------------------------
- test.pl               |    3 +-
- utils/Makefile.cygwin |    8 +-
- 5 files changed, 12 insertions(+), 175 deletions(-)
-
-commit a2dd91db3176d2a9c8c570d1de5d6a012efa2fa1
-Author: sisyphus_ <sisyphus1@optusnet.com.au>
-Date:   Thu Jul 7 22:06:28 2011 +1000
-
-    Fix LDFROM in Makefile.PL
-    
-    LDFROM wasn't being set as intended in $build_config.
-
- Makefile.PL |    8 ++++----
- 1 files changed, 4 insertions(+), 4 deletions(-)
-
-commit e54ec0af6405eb6c2dded2e1e50b4c2a67b7b8fb
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Tue Jun 28 17:33:29 2011 -0400
-
-    Start point sprite support
-
- gl_util.c |    8 ++++++++
- 1 files changed, 8 insertions(+), 0 deletions(-)
-
-commit 0d442d856cb327e8dce89b2fe97397d8de5fc9a0
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Tue Jun 28 17:31:57 2011 -0400
-
-    Apply Dmitry Karasik fixes to Makefile.PL
-    
-    Mostly support 'use strict', some better missing value
-    handling, and a broken edit.  Thanks.
-
- Makefile.PL |   18 +++++++++++-------
- 1 files changed, 11 insertions(+), 7 deletions(-)
-
-commit b91992fcd2b7cb09ca28f11d95fe83e4c380ea2b
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sat Mar 19 15:09:37 2011 -0400
-
-    Update notes and version for more development
-    
-    VERSION now 0.64_003.  Also add .swp files to
-    MANIFEST.SKIP so they are not picked up when
-    'make manifest' is run.
-
- MANIFEST.SKIP |    1 +
- OpenGL.pm     |    2 +-
- OpenGL.pod    |    2 +-
- Release_Notes |   14 ++++++++++++++
- 4 files changed, 17 insertions(+), 2 deletions(-)
-
-commit ba4735713ec99457069b0ca2b82cb6f6ba5a2136
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sat Mar 19 14:46:55 2011 -0400
-
-    Update VERSION, Release_Notes for 0.64_002
-
- MANIFEST.SKIP |    4 ++++
- OpenGL.pm     |    2 +-
- OpenGL.pod    |    2 +-
- Release_Notes |   21 +++++++++++++++++++++
- 4 files changed, 27 insertions(+), 2 deletions(-)
-
-commit 8dce1f0a108dd9ede8220647bc2bf048416e36cf
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sat Mar 19 14:39:42 2011 -0400
-
-    Make this test all TODO
-    
-    This causes failures not to be fatal which will
-    allow an official OpenGL release while the remaining
-    issues in the new tests or functionality are
-    resolved.
-
- t/10_opengl_array.t | 1167 ++++++++++++++++++++++++++-------------------------
- 1 files changed, 585 insertions(+), 582 deletions(-)
-
-commit fd3a1b371e711fe56cbef333d510494c01e6006b
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sat Mar 19 14:38:42 2011 -0400
-
-    Update included freeglut.dll to 2.6.0
-    
-    Thanks, Rob.  We'll see how this works in the next
-    developers release of OpenGL.
-
- FreeGLUT/freeglut.dll |  Bin 229376 -> 233472 bytes
- FreeGLUT/freeglut.lib |  Bin 32452 -> 34394 bytes
- 2 files changed, 0 insertions(+), 0 deletions(-)
-
-commit 426553c3a4c9e1577c0bc6e75cb5a2050a17dce1
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sat Mar 19 14:37:10 2011 -0400
-
-    Convert DOS files to UNIX format text
-
- Array.pod        |  996 +++++++++++++++++-----------------
- Tessellation.pod | 1634 +++++++++++++++++++++++++++---------------------------
- 2 files changed, 1315 insertions(+), 1315 deletions(-)
-
-commit 343f41df1f62dd995f7579d195e1d3a30a84efc3
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sun Mar 13 13:02:04 2011 -0400
-
-    Apply Paul Seamons' OpenGL::Array fixes
-    
-     - Added a perldoc (based on http://graphcomp.com/pogl.cgi?v=0111s3p1&r=s3p6)
-     - Correct the documentation about store,load, and set rpn operations.
-     - Fixed bug in new_pointer when trying to assign to the array.
-     - Appears to be a copy paste bug from new_from_pointer.
-     - Fixed bugs in swap rpn to actually swap.
-     - Added dump rpn operation to print a copy of the stack to STDERR.
-     - Added floor rpn operation.
-     - Added colget, colset, rowget, rowset array manipulation operations.
-     - Fixed returnrow and returnrowif operations to set the data correctly before
-         leaving the row (it used to be incorrect on the first few rows and
-         segfault on the last row).
-
- Array.pod           |  498 +++++++++++++++++++++++++++++++++++++++++++
- Makefile.PL         |    1 +
- pogl_rpn.xs         |  165 +++++++++++++--
- t/10_opengl_array.t |  582 +++++++++++++++++++++++++++++++++++++++++++++++++++
- 4 files changed, 1231 insertions(+), 15 deletions(-)
-
-commit 989b36615b08ff943984580325bd7cd00d343d44
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Mar 7 22:34:58 2011 -0500
-
-    Add OpenGL::Tessellation POD from Paul Seamons
-
- Makefile.PL      |    1 +
- Tessellation.pod |  817 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
- 2 files changed, 818 insertions(+), 0 deletions(-)
-
-commit 3642fb8d271fb57d21d6030c89c30d46367a8db4
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sat Mar 5 15:18:53 2011 -0500
-
-    Rename examples to end with .pl
-    
-    Since the goal is to increase cross-platform
-    portability of POGL, naming these files *.pl
-    will make it clear that they are perl scripts
-    that can be run.
-
- examples/planets    |  273 ---------------------------------------------------
- examples/planets.pl |  273 +++++++++++++++++++++++++++++++++++++++++++++++++++
- 2 files changed, 273 insertions(+), 273 deletions(-)
-
-commit 620db497a37fdafa3471eafdb0c595732a2fffc7
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sat Mar 5 15:12:23 2011 -0500
-
-    Update Release_Notes for 0.64_001 devel release
-
- Release_Notes |   17 +++++++++++++++++
- 1 files changed, 17 insertions(+), 0 deletions(-)
-
-commit 01d8406ddcd0fe3870b6220da483b5f7932a6c0f
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sat Mar 5 15:08:13 2011 -0500
-
-    Add Paul Seamons tesselation support (revised)
-    
-    After some hiatus I've gone back and added proper support for
-    tessellation.  I've added full support for the full realm of
-    opaque data passing.  I have written the code against the CPAN
-    version 0.64.
-
- OpenGL.pm                |   22 ++-
- examples/clip            |  116 ----------
- examples/clip.pl         |  116 ++++++++++
- examples/cube            |   69 ------
- examples/cube.pl         |   69 ++++++
- examples/depth           |   39 ----
- examples/depth.pl        |   39 ++++
- examples/double          |   75 -------
- examples/double.pl       |   75 +++++++
- examples/fun             |  384 --------------------------------
- examples/fun.pl          |  384 ++++++++++++++++++++++++++++++++
- examples/glu_test        |   68 ------
- examples/glu_test.pl     |   68 ++++++
- examples/light           |  127 -----------
- examples/light.pl        |  127 +++++++++++
- examples/plane           |  109 ---------
- examples/plane.pl        |  109 +++++++++
- examples/quest           |  357 ------------------------------
- examples/quest.pl        |  357 ++++++++++++++++++++++++++++++
- examples/simple          |   26 ---
- examples/simple.pl       |   26 +++
- examples/smooth          |   38 ----
- examples/smooth.pl       |   38 ++++
- examples/tessellation.pl |  308 ++++++++++++++++++++++++++
- examples/texhack         |   82 -------
- examples/texhack.pl      |   82 +++++++
- examples/texture         |  132 -----------
- examples/texture.pl      |  132 +++++++++++
- examples/tk_demo         |  104 ---------
- examples/tk_demo.pl      |  104 +++++++++
- examples/tk_steal        |  120 ----------
- examples/tk_steal.pl     |  120 ++++++++++
- examples/try             |   22 --
- examples/try.pl          |   22 ++
- gl_exclude.h             |   36 +++-
- glu_const.h              |   21 ++
- pogl_glu.xs              |  546 +++++++++++++++++++++++++++++++++++++--------
- typemap                  |    2 +-
- 38 files changed, 2695 insertions(+), 1976 deletions(-)
-
-commit b7e54f1449760d52e6aa81ca5c99682a5fc09b09
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sun Feb 13 15:00:03 2011 -0500
-
-    Update TODO with PM on OS/2 info
-    
-    We'll be discontinuing support of PM on OS/2 for GLX since
-    that platform does not appear to be in use.  This may be
-    moot since we have already moved from GLX to FreeGLUT for
-    windows.  Now only need to add the ability to use OpenGL
-    routines when passed appropriate platform contexts (GLX,WGL,AGL).
-
- TODO |   23 ++++++++++++++++++-----
- 1 files changed, 18 insertions(+), 5 deletions(-)
-
-commit 42dc5ba6a30ec29fc7d14b85444cd8bb11718500
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Jan 10 11:01:10 2011 -0500
-
-    Make planets example work using GLUT
-    
-    And update the TODO file with some needed improvements
-    for examples and re making the planets demo look more
-    realistic (or at least better!)
-
- TODO             |   17 +++++++++++++++-
- examples/planets |   57 ++++++++++++++++++++++++++---------------------------
- 2 files changed, 44 insertions(+), 30 deletions(-)
-
-commit 0ed8b3eacaa3c8ccc5f542bb1b1257cc5c4d3fda
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Dec 20 07:31:26 2010 -0500
-
-    Add GLUT constant/function export control to TODO
-
- TODO |    5 +++++
- 1 files changed, 5 insertions(+), 0 deletions(-)
-
-commit ef5547b9ab831e5fd83d94a26060b6b029e3addb
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sat Nov 13 22:23:53 2010 -0500
-
-    Add win==0 handling to TODO list
-    
-    The GLUT binding code calls glutGetWindow() but
-    then never checks or handles the case where
-    win==0 which indicates "If no windows exist
-    or the previously current window was destroyed,
-    glutGetWindow returns zero."
-
- TODO |    5 +++++
- 1 files changed, 5 insertions(+), 0 deletions(-)
-
-commit 66e784c798f0f372ccaf7c9b0327dc0dffe7df49
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Tue Sep 28 21:21:24 2010 -0400
-
-    VERSION to 0.64_001/add gl_exclude.h to .gitignore
-
- .gitignore |    1 +
- OpenGL.pm  |    2 +-
- OpenGL.pod |    2 +-
- 3 files changed, 3 insertions(+), 2 deletions(-)
-
-commit a1e6694209a786ca73a301f0e163f658d382c4ee
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Tue Sep 14 19:33:59 2010 -0400
-
-    Update VERISON to 0.64 in prep for CPAN release
-    
-    This is a very minor point release to support some fixes
-    for buildability and portability.
-
- KNOWN_PROBLEMS |    4 ----
- OpenGL.pm      |    2 +-
- OpenGL.pod     |    2 +-
- Release_Notes  |   19 +++++++++++++++++++
- SUPPORTS       |   13 +++++++++++++
- 5 files changed, 34 insertions(+), 6 deletions(-)
-
-commit f1198a8d8ea60ae97a4eb49be2b6f041414f1536
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sun Aug 15 11:02:45 2010 -0400
-
-    Add Test::More as a prerequisite
-    
-    And update VERSION to 0.63_002 for further development.
-
- Makefile.PL   |    1 +
- OpenGL.pm     |    2 +-
- OpenGL.pod    |    2 +-
- Release_Notes |   32 ++++++++++++++++++++++++++++++++
- 4 files changed, 35 insertions(+), 2 deletions(-)
-
-commit c16207f2215d5463b5fe6c4cfccab2d47c973c98
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Fri Aug 6 13:53:05 2010 -0400
-
-    Attempted fix for rt.cpan.org #52350 for gcc 3.2.3
-    
-    This version of gcc crashes when compiling pogl_const.c with
-    -O2 optimization on.  The work around is to check for that
-    version of gcc in %Config and set OPTIMIZE => '-O0' in that
-    case for WriteMakefile.
-
- Makefile.PL |   23 ++++++-----------------
- 1 files changed, 6 insertions(+), 17 deletions(-)
-
-commit 3a713c484339194a71f90508c016be3504d286a2
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sat Jul 10 14:26:40 2010 -0400
-
-    Update VERSION to 0.63_001 for more development
-
- OpenGL.pm  |    2 +-
- OpenGL.pod |    2 +-
- 2 files changed, 2 insertions(+), 2 deletions(-)
-
-commit a420c2045b4d896cbf5e493e2bdf1342959bb0cf
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sat Jul 10 14:19:55 2010 -0400
-
-    Update README-type files for CPAN release
-
- INSTALL        |    9 ---------
- KNOWN_PROBLEMS |    9 ---------
- Release_Notes  |   23 +++++++++++++++++++++++
- SUPPORTS       |    9 +++++++++
- TODO           |    2 +-
- 5 files changed, 33 insertions(+), 19 deletions(-)
-
-commit 8adc43649d5433f2521094e3ad2d15e9c036a23d
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sat Jul 10 14:07:14 2010 -0400
-
-    Update VERISON to 0.63 for CPAN release
-
- OpenGL.pm  |    2 +-
- OpenGL.pod |    2 +-
- 2 files changed, 2 insertions(+), 2 deletions(-)
-
-commit acd4b53745d19e9f21c32d37ef3ef1f7e8c661a0
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sat Jul 10 13:59:09 2010 -0400
-
-    Make glpDisplay() handle all XOpenDisplay args
-    
-    Now the glpDisplay() is pretty much an XS binding to
-    plain old XOpenDisplay and it can be used to test for
-    the ability to connect to an X11 display to work around
-    a limitation of glutInit() where it exits on error...
-
- OpenGL.pod     |   26 +++++++++++++-------------
- pogl_gl_top.xs |   11 +++++++----
- 2 files changed, 20 insertions(+), 17 deletions(-)
-
-commit aec2bb14eaab5f4ef21caa4cabdb13269847eeec
-Merge: 407fa0c ab6ec76
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon May 24 06:00:07 2010 -0400
-
-    Fix merge conflict from restore diffs git repo del
-    
-    Conflicts:
-    	test.pl
-
-commit 407fa0c26750e3c2beef9b91a6c92bbad59c8efa
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon May 24 05:51:19 2010 -0400
-
-    Remove use Math::Trig from test.pl
-    
-    No methods/subs were apparently being used from that module.
-    This avoids a conflict with PDL.
-
- test.pl |    7 ++++++-
- 1 files changed, 6 insertions(+), 1 deletions(-)
-
-commit ab6ec762bc36bfae6ff50cfba9b9e62c25de7530
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sun May 9 12:38:15 2010 -0400
-
-    Take use Math::Trig out of test.pl
-    
-    It doesn't appear to be needed and its use caused a CPAN
-    Testers failure where the Math::Trig prerequisite was not
-    installed for the build test.
-
- test.pl |    3 ++-
- 1 files changed, 2 insertions(+), 1 deletions(-)
-
-commit 93e9e06833ca9319a63051f2fe8b1cdb6ecd0af8
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sun Feb 21 17:06:39 2010 -0500
-
-    Fix typo reported in OpenGL.pod
-
- OpenGL.pod |    2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
-commit bbe1f7add59fb769c50ea91e56ddf1c342f6920b
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Tue Jan 5 20:34:20 2010 -0500
-
-    Add /usr/local/freeglut/* to Makefile.PL
-    
-    This is another common location for the FreeGLUT include and
-    libs on Solaris.  Still need to add support for Devel::CheckLib
-    to probe these various options...
-
- Makefile.PL |    2 ++
- 1 files changed, 2 insertions(+), 0 deletions(-)
-
-commit 1b251e7a937c02d0cca857e0dde9a037626e377e
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sun Dec 27 16:55:56 2009 -0500
-
-    Add gcc-3.2.3 crash on RHEL3 to KNOWN_PROBLEMS
-
- KNOWN_PROBLEMS |    4 ++++
- 1 files changed, 4 insertions(+), 0 deletions(-)
-
-commit e821cab5f216071b5d72e8a2ce6521a108de4e17
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sun Dec 27 16:55:39 2009 -0500
-
-    Set version to 0.62_001 for development
-
- OpenGL.pm  |    2 +-
- OpenGL.pod |    2 +-
- 2 files changed, 2 insertions(+), 2 deletions(-)
-
-commit 1c193f070663bb9813dddb2e8d23b9d22b7f328b
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sun Dec 27 10:04:16 2009 -0500
-
-    Update VERSION and readmes for 0.62 release
-
- KNOWN_PROBLEMS |    7 +--
- OpenGL.pm      |  210 ++++++++++++++++++++++++++++----------------------------
- OpenGL.pod     |   25 ++++++-
- Release_Notes  |   22 ++++++
- SUPPORTS       |   11 +++
- 5 files changed, 161 insertions(+), 114 deletions(-)
-
-commit 10be1914beb366c07180f14258e2e5ab446ae407
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Wed Dec 9 14:56:16 2009 -0500
-
-    Add /opt/csw/{include,lib} for solaris
-    
-    This appears to be the location of a free software package
-    built for solaris.  They only have freeglut 2.2 in their
-    repository.  I need to determine if there is a reason that
-    they are not current.
-
- Makefile.PL |    2 ++
- 1 files changed, 2 insertions(+), 0 deletions(-)
-
-commit 0d1462adaf7748d6c792ccb499295f7ae0ebceb2
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Tue Nov 24 12:20:51 2009 -0500
-
-    Apply fix to prevent freeglut.dll.bat install
-    
-    The new code is probably better than doing an install of
-    freeglut.dll to some systemwide location.  If we can verify
-    that the paths are set up correctly and the code works, we
-    should remove the alternate install since it is less
-    problematic to keep libraries installed for perl in the
-    perl locations rather than global install locations.
-
- Makefile.PL |   22 ++++++++++------------
- 1 files changed, 10 insertions(+), 12 deletions(-)
-
-commit b90cb83aacdd7483a2c3bdca2fc6798aa4b58f62
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sun Nov 22 13:50:44 2009 -0500
-
-    Fix build for AGL to only use AGL, not X11
-    
-    This fixes the build for Mac OS X systems using the recommended
-    Apple OpenGL and GLUT frameworks.  Additional installation of
-    X11 should no longer be required.  The build still uses the
-    glext_procs.h and the ../include/GL/gl.h includes since there
-    is a conflict between the Apple gl.h and the POGL glext_procs.h.
-
- Makefile.PL           |    2 +-
- glu_util.h            |    4 ++++
- glut_util.h           |   11 +++++++++++
- utils/Makefile.macosx |    4 ++--
- utils/glversion.c     |    8 ++++++++
- 5 files changed, 26 insertions(+), 3 deletions(-)
-
-commit a7bdc829716f6131a9b74a219c0df5247b1dc2b5
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Fri Nov 20 13:25:34 2009 -0500
-
-    Fix more _have_freeglut checks: should call sub
-    
-    There was some confusion about the _have_freeglut() routine
-    in OpenGL which is a subroutine call and not a scalar value.
-    In test.pl and some other code, $OpenGL::_have_freeglut was
-    checked and silently failed since a non-existing variable
-    returns undef.
-
- test.pl |    4 ++--
- 1 files changed, 2 insertions(+), 2 deletions(-)
-
-commit e699cc3843c912dce91473f1c1ff8bd02ad23dd7
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Fri Nov 20 13:25:18 2009 -0500
-
-    Set VERSION to 0.61_002 for more development
-
- OpenGL.pm  |    2 +-
- OpenGL.pod |    2 +-
- 2 files changed, 2 insertions(+), 2 deletions(-)
-
-commit 81755ec75df4ec718a3e16fc086a1213a02b211d
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Nov 16 21:58:39 2009 -0500
-
-    Prepare for OpenGL-0.61_001 CPAN developers rel
-    
-    Update version number info and the Release_Notes.
-
- OpenGL.pm     |    2 +-
- OpenGL.pod    |    2 +-
- Release_Notes |   11 +++++++++++
- 3 files changed, 13 insertions(+), 2 deletions(-)
-
-commit f54bc3ebb84114687e4749066eb9e6b7b20c4ceb
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Nov 16 21:56:42 2009 -0500
-
-    Fix glut_const.h typos that broke some GLUT macros
-    
-    The result, among other things, was that the FreeGLUT event loop
-    exit handling did not work.  test.pl was broken in another way
-    so though it appeared to work correctly, it did not---just quietly
-    skipped the exit code which is why we saw no problems there.
-
- glut_const.h |    4 ++--
- test.pl      |    2 +-
- 2 files changed, 3 insertions(+), 3 deletions(-)
-
-commit 061a2c1d52bd6516c20122168d1bd121c88a5532
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Nov 9 21:52:18 2009 -0500
-
-    Update META.yml for OpenGL-0.61 release
-
- META.yml |    2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
-commit b3832c9295cf6ed2ddaf1cb3f99b8b49178cb643
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Nov 9 21:44:52 2009 -0500
-
-    Multiple updates to docs and VERSION for CPAN
-    
-    Updated META.yml and Release_Notes, SUPPORTS, TODO for OpenGL-0.61
-    release.  Updated version info in OpenGL.pm and OpenGL.pod.
-
- META.yml      |   23 +++++++++++++----------
- OpenGL.pm     |    2 +-
- OpenGL.pod    |    2 +-
- Release_Notes |    7 ++++++-
- SUPPORTS      |   13 +++++++++++++
- TODO          |    4 ++--
- 6 files changed, 36 insertions(+), 15 deletions(-)
-
-commit b5928746c2aca957fe576896db0c34c1049ef8c1
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Wed Oct 28 13:23:34 2009 -0400
-
-    Fix Mac OS X glversion build include path
-    
-    The ../include should not be used except by the win32
-    code which is installing the FreeGLUT library.
-
- utils/Makefile.macosx |    4 +++-
- 1 files changed, 3 insertions(+), 1 deletions(-)
-
-commit 3b1c3ca79c57e45397545865be00ef74ca6980e4
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sun Oct 25 14:45:17 2009 -0400
-
-    Add -DHAVE_FREEGLUT_H to HG freeglut patch
-
- Makefile.PL |    2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
-commit f6c5829c44fcb1f8c5165e7ec3c5135b56dfba14
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sun Oct 25 14:31:00 2009 -0400
-
-    Apply debian probe for FreeGLUT patch
-    
-    Thanks Henning Glawe!
-
- Makefile.PL |   14 ++++++++++++++
- 1 files changed, 14 insertions(+), 0 deletions(-)
-
-commit 89f3304455af78a0a21cdd3efe3d24544c2a790a
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sun Oct 25 14:24:02 2009 -0400
-
-    Placeholder for freeglut.dll.bat problem
-    
-    This is a proposed fix for the current use of EXE_FILES in Makefile.PL
-    to install freeglut.dll on win32 machines.  EXE_FILES is for perl
-    scripts and not binaries.  The fix does work but it has the problem
-    of performing the install at configure time.  The whole process needs
-    to be reworked to happen at install time.
-
- Makefile.PL |   13 +++++++++++++
- 1 files changed, 13 insertions(+), 0 deletions(-)
-
-commit 74f258dd4fd29e125e34744c8775995056d20ee9
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Fri Oct 23 13:35:25 2009 -0400
-
-    VERSION to 0.60_001 for more development
-    
-    And added some notes in KNOWN_PROBLEMS and TODO regarding
-    the failure of the ASPerl automated PPM build machinery to
-    build OpenGL PPMs on *any* platform.  Need to do something
-    about this for the next release.
-
- KNOWN_PROBLEMS |    7 +++++++
- OpenGL.pm      |    2 +-
- OpenGL.pod     |    2 +-
- TODO           |    9 ++++++++-
- 4 files changed, 17 insertions(+), 3 deletions(-)
-
-commit 704670ffd8d7de232551970d6dde66834fbda509
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Oct 19 13:19:03 2009 -0400
-
-    Final OpenGL-0.60 releaes fixes
-
- KNOWN_PROBLEMS |   26 +++++++++++++++++++++++++-
- OpenGL.pm      |    2 +-
- OpenGL.pod     |    2 +-
- README         |    2 +-
- Release_Notes  |    6 +++---
- SUPPORTS       |   12 +++++++++++-
- TODO           |   14 ++++----------
- glut_util.h    |    2 ++
- 8 files changed, 48 insertions(+), 18 deletions(-)
-
-commit 380232c244c56be74fb39da5fd8496084c2041eb
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Fri Oct 16 17:47:57 2009 -0400
-
-    Update VERSION and readme-type information
-
- KNOWN_PROBLEMS |   11 ++++++++---
- OpenGL.pm      |    2 +-
- OpenGL.pod     |    2 +-
- Release_Notes  |    3 ++-
- TODO           |    3 ++-
- 5 files changed, 14 insertions(+), 7 deletions(-)
-
-commit 56a847436c9e452c1b178879e4a5a48f1175d1f0
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Fri Oct 16 10:28:12 2009 -0400
-
-    Fixed freeglut font not found error
-    
-    The problem was the macro to generate the font
-    ID constants was coercing the type to int before
-    calling newSViv() which broke things if the
-    value being generated was a pointer on a 64-bit
-    system with ints defined as 4byte quantities.
-
- OpenGL.pm     |    2 +-
- OpenGL.pod    |    2 +-
- glut_const.h  |   18 +++++++++---------
- pogl_const.xs |    3 ++-
- pogl_glut.xs  |    8 ++++----
- 5 files changed, 17 insertions(+), 16 deletions(-)
-
-commit f22bf1b4ece04ed9c84a96dcdb46e8ad0126a0b1
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Thu Oct 15 14:11:01 2009 -0400
-
-    Start 0.59_001 developers release
-    
-    It looks like another OpenGL release will be needed to
-    resolve build issues for GLUT only systems and for
-    platforms with both GLUT and FreeGLUT present to ensure
-    that FreeGLUT is used for the module build/compile/test.
-
- OpenGL.pm  |    2 +-
- OpenGL.pod |    2 +-
- TODO       |    5 ++++-
- 3 files changed, 6 insertions(+), 3 deletions(-)
-
-commit 21b377d17d89a976a33a51f9048322c7b7899b92
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Thu Oct 15 14:05:08 2009 -0400
-
-    Add HAVE_FREEGLUT to skip if GLUT only
-    
-    Problems building POGL have been reported for systems
-    when GLUT is being used instead of FreeGLUT for two reasons:
-    (1) FreeGLUT is not installed in which case we would like the
-    build to work but perhaps with less capability, or (2) both
-    GLUT and FreeGLUT are available but the wrong include file is
-    being used (i.e. glut.h instead of freeglut.h).
-
- glut_const.h |    2 ++
- 1 files changed, 2 insertions(+), 0 deletions(-)
-
-commit 432033682a7ec79e3066417c795cc2ae72893821
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Oct 5 16:18:38 2009 -0400
-
-    Update VERSION and Readmes for 0.59 release
-
- KNOWN_PROBLEMS |    4 ++++
- OpenGL.pm      |    2 +-
- OpenGL.pod     |    5 ++++-
- README         |    2 +-
- Release_Notes  |   35 +++++++++++++++++++++++++++++++++++
- SUPPORTS       |    8 ++++++++
- TODO           |    4 ++--
- 7 files changed, 55 insertions(+), 5 deletions(-)
-
-commit 4e1c361df9a1272bae34b5e9d54ad7cf69cced51
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sat Oct 3 15:34:39 2009 -0400
-
-    Add DISPALY_MODE check for MSWin32 systems
-    
-    In FreeGLUT, the code does nothing and we don't really support
-    GLUT only at this time.  The tests in t/ still are run so the
-    fact that the test.pl example program is not as safe as it
-    could be for win32 systems should be ok.
-
- test.pl |   22 ++++++++++++++--------
- 1 files changed, 14 insertions(+), 8 deletions(-)
-
-commit 39f39c9e42bb6982d0d593df29490fa20170efcc
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sat Oct 3 09:40:58 2009 -0400
-
-    Revert "Added GLU tessellation support"
-    
-    This reverts commit 0acc729f3560e4b86c5c7f44554f53b021ae9ecf.
-
- OpenGL.pm       |   22 +-
- glu_const.h     |   22 -
- pogl_glu.xs     | 1692 +++++++++++++++++++++++++------------------------------
- tessellation.pl |  256 ---------
- typemap         |   83 ++--
- 5 files changed, 816 insertions(+), 1259 deletions(-)
-
-commit 7db9ca2c75a0ec3f5b5b01b06884b27c4d3843c9
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Fri Oct 2 22:02:16 2009 -0400
-
-    Add glutBitmapString implementation for Mac GLUT
-
- OpenGL.pm    |    2 +-
- OpenGL.pod   |    2 +-
- pogl_glut.xs |   16 +++++++++++-----
- 3 files changed, 13 insertions(+), 7 deletions(-)
-
-commit 88482e64c6831e04b9f29682f9be9ff45d9af27e
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Fri Oct 2 21:02:19 2009 -0400
-
-    Update KNOWN_PROBLEMS for  CPAN Developers release
-
- KNOWN_PROBLEMS |    3 ---
- 1 files changed, 0 insertions(+), 3 deletions(-)
-
-commit a040e328b78caeca4feccddb60099fb39323841e
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Fri Oct 2 15:03:30 2009 -0400
-
-    Add S Evert patch for generic_glut_WMClose_handler
-    
-    And increment the VERSION to 0.58_007 for push to sf.net
-
- OpenGL.pm    |    2 +-
- OpenGL.pod   |    2 +-
- pogl_glut.xs |    4 ++++
- 3 files changed, 6 insertions(+), 2 deletions(-)
-
-commit febd29d1308cddc955a6df3b12870009ea41a77b
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Thu Oct 1 17:54:53 2009 -0400
-
-    Switch order between AGL_GLUT and FREEGLUT detect
-    
-    In the aliasing of the glutCheckLoop() to glutMainLoopEvent().
-
- pogl_glut.xs |    6 +++---
- 1 files changed, 3 insertions(+), 3 deletions(-)
-
-commit 463e38955a46427c4cd92c1f351360ca3fbd812b
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Thu Oct 1 14:19:05 2009 -0400
-
-    VERSION to 0.58_006 in prep for CPAN release
-
- OpenGL.pm  |    2 +-
- OpenGL.pod |    2 +-
- 2 files changed, 2 insertions(+), 2 deletions(-)
-
-commit 36bcd033c65d481ca3ad8d09254a9ef1b2671c63
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Thu Oct 1 14:17:21 2009 -0400
-
-    AGL GLUT for glutMainEventLoop() and glutCloseFunc()
-    
-    If darwin is the OS and FreeGLUT is not being used, then we
-    alias glutWMCloseFunc() and glutCheckLoop() as their FreeGLUT
-    equivalents.
-
- Makefile.PL  |    1 +
- pogl_glut.xs |    7 ++++++-
- 2 files changed, 7 insertions(+), 1 deletions(-)
-
-commit 356ae99edc303f9af9deab6b37c26d9ace8ecd2a
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Wed Sep 30 07:54:19 2009 -0400
-
-    Fix MinGW detection logic for ActivePerl
-    
-    This is simply to cater for the latest builds of ActivePerl which, for
-    some reason, set $Config{make} and $Config{cc} to the fully qualified
-    filenames - eg, something like 'C:\_32\ap1005\site\bin\dmake.exe' and
-    'C:/_32/ap1005/site/bin/gcc.exe'.
-
- Makefile.PL |    2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
-commit cc9075e3c869c7b36d077cb600ec2573cfadb390
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Tue Sep 29 18:41:08 2009 -0400
-
-    Added improved compile/link handling to TODO
-
- TODO |    5 +++++
- 1 files changed, 5 insertions(+), 0 deletions(-)
-
-commit f65100f965e0541025a41948355541a792dc6a91
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sun Sep 27 23:51:38 2009 -0400
-
-    Fix bad format for gluErrorString print
-
- pogl_gl_top.xs |    4 ++--
- 1 files changed, 2 insertions(+), 2 deletions(-)
-
-commit a1bf6625cdffdd4508cc5b8bc4c465c0026a0b53
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sat Sep 26 22:19:42 2009 -0400
-
-    README-type file edits and cleanup
-    
-    Gradually bringing the README's in line with the actual state
-    of POGL.  POGL modifications for PDL development appear to be
-    stable.  Plan to release an official POGL next week to freeze
-    until PDL 3D graphics is complete.
-
- INSTALL        |   56 ++++++++++++++++++++++++++++++++++----------------------
- KNOWN_PROBLEMS |   12 ++++++++++++
- SUPPORTS       |    3 ++-
- TODO           |    5 +++--
- 4 files changed, 51 insertions(+), 25 deletions(-)
-
-commit 9e5e31a2dae7270856d570ec8ffcc018d7680b33
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sat Sep 26 21:25:11 2009 -0400
-
-    Add GLUT_INIT_STATE and GLUT_WINDOW_FORMAT_ID
-    
-    These are some FreeGLUT state extensions that were missing.
-    Added to the FreeGLUT section.  Don't know if they are supported
-    by Mac GLUT.  Need to check.
-
- OpenGL.pm    |    2 ++
- glut_const.h |    2 ++
- 2 files changed, 4 insertions(+), 0 deletions(-)
-
-commit 0f3b3f1897c28e4eb3cab5eab6704ce36bc338a3
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sat Sep 26 21:17:16 2009 -0400
-
-    VERSION to 0.58_006git for development
-
- OpenGL.pm |    2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
-commit 72eba44e70a75a90c88f3247b138c812af1f684b
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Fri Sep 25 16:41:47 2009 -0400
-
-    Prep for an OpenGL-0.58_005 release
-
- README   |   11 ++++++-----
- SUPPORTS |    1 +
- TODO     |    3 ++-
- 3 files changed, 9 insertions(+), 6 deletions(-)
-
-commit b3f6ef10ede07c1cc0d2b7af366f10289d90e1aa
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Fri Sep 25 10:43:53 2009 -0400
-
-    Fix mingw/dmake build problems
-    
-    The global state variable, debug, was moved out of the HAVE_GLpc
-    code sections since it is independent of the GLX stuff.  Added
-    a fallback display mode without GLUT_ALPHA to test.pl to fix
-    failures on systems without hardware alpha.  This may also fix
-    the reported mingw/dmake problem.
-
- pogl_gl_top.xs |    3 ++-
- test.pl        |   11 +++++++++--
- 2 files changed, 11 insertions(+), 3 deletions(-)
-
-commit 6e32342b1517d496091f77e057cfd80f9f04565f
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Tue Sep 22 16:21:11 2009 -0400
-
-    Update version to 0.58_005 for development
-
- OpenGL.pm  |    2 +-
- OpenGL.pod |    2 +-
- 2 files changed, 2 insertions(+), 2 deletions(-)
-
-commit f4566c6b1641b92c2967ff8d35e5d3bd934704b2
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Tue Sep 22 16:10:55 2009 -0400
-
-    Prep for OpenGL-0.58_004 developers release
-    
-    Updated readme-type files a bit.  This release
-    includes some minor changes in the library searches
-    for testing.  Support for GLU tessellation is new.
-
- INSTALL         |   16 ++++++++--------
- KNOWN_PROBLEMS  |    4 ++--
- OpenGL.pod      |    2 +-
- README          |   23 +++++++++++++----------
- TODO            |    7 +------
- 5 files changed, 25 insertions(+), 27 deletions(-)
-
-commit c568349a81d2b72193e8aa8819e6e2aed04c1551
-Author: Chris Marshall <marshallch@sourceforge.net>
-Date:   Tue Sep 22 15:35:15 2009 -0400
-
-    Remove GLX from lib check list
-    
-    On Mesa/DRI systems, the GLX library is in libGL
-    so we don't need to look for it specifically.  We
-    can add more thorough checks when we move to a
-    compile/link test framework to probe (e.g. Devel::CheckLib)
-
- Makefile.PL |    3 ---
- 1 files changed, 0 insertions(+), 3 deletions(-)
-
-commit 31dc0aab861c84c3f4d82c298e1c5ec5556f6949
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Tue Sep 22 11:42:43 2009 -0400
-
-    Remove X driver paths from library search
-    
-    The library probe was finding libraries in locations used by
-    the X server to load drivers and extensions.  These are not
-    link libraries.  On linux systems, GLX is apparently in libGL
-    so we should check there rather than:
-    
-        /usr/lib/xorg/modules
-        /usr/X11R6/lib/modules
-        /usr/lib/xorg/modules/extensions
-        /usr/X11R6/lib/modules/extensions
-
- Makefile.PL |    4 ----
- 1 files changed, 0 insertions(+), 4 deletions(-)
-
-commit f285d38588b772c9cba14c151fecff82014a7775
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Sep 21 23:31:27 2009 -0400
-
-    Move glpSetDebug() out of HAVE_glpc condition
-    
-    This fixes part of the problem with using or not using GLX with GLUT
-    since glpSetDebug() is independent of that choice.  Still need to
-    fix the includes, defines, and link to work.
-
- pogl_gl_top.xs |   21 +++++++++++----------
- 1 files changed, 11 insertions(+), 10 deletions(-)
-
-commit 0acc729f3560e4b86c5c7f44554f53b021ae9ecf
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Sep 21 21:59:48 2009 -0400
-
-    Added GLU tessellation support
-    
-    This folds in the GLU tessellation support work
-    by Paul Seamons.  Thanks, Paul!
-
- OpenGL.pm       |   22 +-
- glu_const.h     |   22 +
- pogl_glu.xs     | 1692 ++++++++++++++++++++++++++++++-------------------------
- tessellation.pl |  256 +++++++++
- typemap         |   83 ++--
- 5 files changed, 1259 insertions(+), 816 deletions(-)
-
-commit 0b5fa812f37eadd36194f6cc1c7ece092d42478f
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sun Sep 20 19:13:12 2009 -0400
-
-    Rm git from version number and edit TODO
-
- OpenGL.pm |    2 +-
- TODO      |    9 ++++++---
- 2 files changed, 7 insertions(+), 4 deletions(-)
-
-commit d6a47e3cc3f4362426749a33536ddfcb954d7902
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Fri Sep 18 16:00:20 2009 -0400
-
-    Don't remove HAVE_GLX define with *GLUT on linux
-    
-    As part of an attempted cleanup of configuration output,
-    HAVE_GLX was being deleted on non-cygwin systems using
-    GLUT or FreeGLUT.  This issue will be addressed in a planned
-    refactoring of the POGL configuration info to make explicit
-    things the build system *has* versus the things the build
-    system *used* to make POGL, e.g. use FreeGLUT but has GLX also.
-
- Makefile.PL |   34 +++++++++++++++++-----------------
- 1 files changed, 17 insertions(+), 17 deletions(-)
-
-commit 1ebe1a0a3d729218f6d490add15190ffbd2b1c9e
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Tue Sep 15 09:46:40 2009 -0400
-
-    VERSION to 0.58_004git for development
-
- OpenGL.pm  |    2 +-
- OpenGL.pod |    2 +-
- 2 files changed, 2 insertions(+), 2 deletions(-)
-
-commit e948f8fcfa3794e51b544a9cc146d141bb59eeaa
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Tue Sep 15 09:15:46 2009 -0400
-
-    Prepare for quick release of 0.58_003 w fixes
-
- KNOWN_PROBLEMS |    2 +-
- OpenGL.pm      |    2 +-
- OpenGL.pod     |    2 +-
- TODO           |    3 ++-
- 4 files changed, 5 insertions(+), 4 deletions(-)
-
-commit 5002639eeaa560cc2ab88579b08dcd75d98101fe
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Tue Sep 15 09:13:33 2009 -0400
-
-    Fix test.pl to handle display availability better
-    
-    Now test.pl will quietly exit if the desired OpenGL
-    display options are not available.  Also cleaned up
-    the @ARGV handling a bit.
-
- test.pl |    7 ++++++-
- 1 files changed, 6 insertions(+), 1 deletions(-)
-
-commit 1cd37c05115cc98a0e6599f10629bf1bb6cc8e47
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Sep 14 16:38:06 2009 -0400
-
-    Update README for 0.58_002 release
-
- README |    1 -
- 1 files changed, 0 insertions(+), 1 deletions(-)
-
-commit 7325e4233a16ac947a3493319c3fef325deb2c99
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Sep 14 16:25:39 2009 -0400
-
-    glpcOpenWindow() refactoring completed
-    
-    Merging and reconciling the code from the PDL branch of OpenGL
-    and the Perl OpenGL module is complete.  The two basic changes
-    from the previous POGL function are:
-    
-    (1) Argument order changed reversing steal and event_mask
-          This change should have minimal impact on POGL users
-          since the glpcOpenWindow() is the raw, internal function.
-          Users should be using the glpOpenWindow() perl wrapper.
-    (2) glpcOpenWindow() now returns a hash containing fields:
-          Display, Window, and Context for X Server configuration and
-          GL_Version, GL_Vendor, and GL_Renderer for OpenGL info.
-
- pogl_gl_top.xs |   48 +++++++++++++++++++++++++++++++++++-------------
- 1 files changed, 35 insertions(+), 13 deletions(-)
-
-commit 5828a79afe6f67f335528f465911d5d8e2e59bfc
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Sep 14 15:33:58 2009 -0400
-
-    glpcOpenWindow merged through glXMakeCurrent call
-    
-    All of the differences between the POGL and PDL versions of the
-    glpcOpenWindow() XS routine have been merged as far as the
-    display/window/context creation stuff goes.
-
- pogl_gl_top.xs |   11 ++++++-----
- 1 files changed, 6 insertions(+), 5 deletions(-)
-
-commit d4b1d2c12201b9cbaf3d35fe5465e6efe80a1ef5
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Sep 14 15:26:02 2009 -0400
-
-    glpcOpenWindow merged thru XMapWindow call
-
- pogl_gl_top.xs |   17 ++++++++++++-----
- 1 files changed, 12 insertions(+), 5 deletions(-)
-
-commit 01a05ccb0d2eba1dfbba3ccd13c85d57b340fa1a
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Sep 14 15:16:23 2009 -0400
-
-    Merged glXCreateContext and XCreateColormap
-    
-    glpcOpenWindow() routines merged code from glXCreateContext()
-    through XCreateColormap.
-
- pogl_gl_top.xs |    9 ++++++---
- 1 files changed, 6 insertions(+), 3 deletions(-)
-
-commit 9f02afdc5a41698122e4aa170d8eaa15471f1daf
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Sep 14 15:10:28 2009 -0400
-
-    glpcOpenWindow merged glXChooseVisual code
-    
-    POGL and PDL code merged through glXChooseVisual.
-    Argument checking bug fixed in glpOpenWindow (was using defined
-    rather than exists and so generated a warning every time any
-    attributes were given.
-
- OpenGL.pm      |   20 ++++++++++----------
- pogl_gl_top.xs |   40 +++++++++++++++++++++++-----------------
- 2 files changed, 33 insertions(+), 27 deletions(-)
-
-commit 26194a2d8ef02ed2a6d92703937f8ba819935a26
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Sep 14 14:49:36 2009 -0400
-
-    glpcOpenWindow attributes merge, reorder args
-    
-    Reordered event_mask and steal arguments to clean up PDL interface.
-    Added debug code to attributes handling.
-
- OpenGL.pm      |    4 +-
- pogl_gl_top.xs |  194 +++++++++++++++++++++++++++++---------------------------
- 2 files changed, 102 insertions(+), 96 deletions(-)
-
-commit b2eddff9f15d0c1820a22c7a229512d358087f98
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sun Sep 13 17:31:47 2009 -0400
-
-    Remove glpcOpenWindow() from EXPORT_OK
-    
-    For improved compatibility, remove glpcOpenWindow() from OpenGL
-    EXPORT_OK to encourage use of the glpOpenWindow() front end
-    which offers all the functionality but allows for the lower
-    level interface to change while maintaining backwards compatibility.
-    
-    Update OpenGL.pod with history of implementation indicating the
-    current state of flux in the API.
-
- OpenGL.pm  |    6 +++++-
- OpenGL.pod |   47 +++++++++++++++++++++++++++--------------------
- 2 files changed, 32 insertions(+), 21 deletions(-)
-
-commit 2df514873fe699064938fadededa9ce74d64c124
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Fri Sep 11 17:33:58 2009 -0400
-
-    Update VERSION to 0.58_002 for development
-
- OpenGL.pm  |    2 +-
- OpenGL.pod |    2 +-
- 2 files changed, 2 insertions(+), 2 deletions(-)
-
-commit 700f80bfaeb35fcf63532fac4383afaa5d0ea885
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Fri Sep 11 16:18:13 2009 -0400
-
-    Prep for 0.58_001 developers release
-
- CHANGES        |    9 ++++++++-
- INSTALL        |   15 ++++++++-------
- KNOWN_PROBLEMS |    3 +++
- README         |    9 +++++----
- 4 files changed, 24 insertions(+), 12 deletions(-)
-
-commit 620097ffefe9cd0b146f7c43193249cc68ac7828
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Fri Sep 11 15:27:24 2009 -0400
-
-    Final HAVE_FREEGLUT only ifdef stubs
-    
-    Thanks to some debugging help from Stefan Evert on his
-    Mac OS X + GLUT platform!
-
- pogl_glut.xs |   38 ++++++++++++++++++++++++++++++++++++++
- 1 files changed, 38 insertions(+), 0 deletions(-)
-
-commit 00448fddb68789415b4e0bd9b62661513267e5e3
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Fri Sep 11 14:39:08 2009 -0400
-
-    Add ifdef protection for FreeGLUT only callbacks
-    
-    Add stubs for glutWindowStatusFunc, glutMouseWheelFunc,
-    glutPassiveMotionFunc, glutMenuStateFunc, glutMenuDestroyFunc,
-    glutCloseFunc when HAVE_FREEGLUT not defined.
-
- pogl_glut.xs |   26 +++++++++++++++++++++-----
- 1 files changed, 21 insertions(+), 5 deletions(-)
-
-commit dc93ac5eaeb77df1c7f09967348103a6e2d954e9
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Fri Sep 11 13:03:06 2009 -0400
-
-    Fix include paths for Makefile.macosx
-    
-    Put system include locations ahead of ../include
-    and added item in TODO to revisit what makes sense
-    in terms of bundling our own include files.
-
- TODO                  |    9 ++++++++-
- utils/Makefile.macosx |    2 +-
- 2 files changed, 9 insertions(+), 2 deletions(-)
-
-commit c3e35f6ab139ccf1d3183476997be47b3ac2da22
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Fri Sep 11 12:25:32 2009 -0400
-
-    Fix HAVE_FREEGLUT skip for glutMenuDestroyFunc
-    
-    So tests don't fail when building with GLUT only.
-    Added TODO item for better documentation and install
-    info re getting/installing FreeGLUT.
-
- TODO         |    7 ++++++-
- pogl_glut.xs |   11 +++++++----
- 2 files changed, 13 insertions(+), 5 deletions(-)
-
-commit 38ad9d4b23b582f0541b1c3a262a32f1b50d86b1
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Fri Sep 11 10:10:29 2009 -0400
-
-    Remove git from VERSION and add FreeGLUT ifdef
-    
-    The 0.58_001git as VERSION for OpenGL causes the require
-    test to fail, removed git from the end of the string.
-    Also added another ifdef to stub out glutMainLoopEvent()
-    if HAVE_FREEGLUT not set.
-
- OpenGL.pm    |    2 +-
- OpenGL.pod   |    2 +-
- pogl_glut.xs |    9 ++++++++-
- 3 files changed, 10 insertions(+), 3 deletions(-)
-
-commit 0aa425a6a0558376f33624e64745148aaa6ecad2
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Fri Sep 11 08:51:27 2009 -0400
-
-    Skip FreeGLUT only funs unless HAVE_FREEGLUT set
-    
-    This fixes build problems with GLUT by building empty
-    stubs for FreeGLUT functionality that is missing from GLUT.
-    Things should work ok as long as one doesn't use these
-    functions or expect them to actually do anything.
-
- pogl_glut.xs |   26 +++++++++++++++++++++++---
- 1 files changed, 23 insertions(+), 3 deletions(-)
-
-commit b2bffbfcd9a9b7216ed9a71af6f4c8065f035b48
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Thu Sep 10 17:42:25 2009 -0400
-
-    Add missing glp* functions from PDL OpenGL module
-    
-    Added three missing glp functions: glpSetDebug(),
-    glpPrintString(), and glpRasterFont() to support
-    PDL.  The glpSetDebug() support in POGL is on the
-    TODO list and the two string/font routines will be
-    superceded by the new GLUT functionality.
-
- OpenGL.pm      |    2 +-
- OpenGL.pod     |    3 +++
- pogl_gl_top.xs |   50 +++++++++++++++++++++++++++++++++++++++++++++++++-
- typemap        |    1 +
- 4 files changed, 54 insertions(+), 2 deletions(-)
-
-commit f57e43aa89cfd45ad5c191f106b7b0f38e2712e7
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Wed Sep 9 17:15:21 2009 -0400
-
-    Changed cx variable to ctx
-    
-    cx is the variable containing the GLX context.  I've
-    changed the name on the way to refactoring with PDL.
-
- pogl_gl_top.xs |   16 ++++++++--------
- 1 files changed, 8 insertions(+), 8 deletions(-)
-
-commit 331912150cac03c3e8687b137a8e2081a8e9056c
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Wed Sep 9 13:06:08 2009 -0400
-
-    Add x/y_root & state to glpXNextEvent ButtonEvents
-    
-    Added x_root, y_root, and state fields to the event
-    args returned by glpXNextEvent().  These follow the
-    existing args in POGL so the change should be transparent
-    but PDL implemented those fields so am putting in for
-    better conpatibility.
-
- pogl_gl_top.xs |    7 +++++--
- 1 files changed, 5 insertions(+), 2 deletions(-)
-
-commit 74b2b2c6c9471cc3b9649eb203437783fba64208
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sun Sep 6 15:37:16 2009 -0400
-
-    Update version to 0.58_001git for GIT repo create
-
- OpenGL.pm  |    2 +-
- OpenGL.pod |    2 +-
- 2 files changed, 2 insertions(+), 2 deletions(-)
-
-commit fb3ee0277317b075e28239343ce17cb9c690a9e5
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sun Sep 6 14:39:28 2009 -0400
-
-    Final readme type file updates for 0.58 release
-
- KNOWN_PROBLEMS  |   15 +++++++++++++++
- SUPPORTS        |    4 ++--
- TODO            |    9 +++++----
- examples/README |    2 --
- 4 files changed, 22 insertions(+), 8 deletions(-)
-
-commit d7ff6e90ac7a040499f8f9e472a4b051dc35ca62
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sun Sep 6 14:34:01 2009 -0400
-
-    Revert partial _p to _oga conversion for 0.58
-    
-    Although the usages of some of the _p routines with OpenGL::Array
-    arguments is inconsistent with the rest of the _p routines, will
-    leave them as is until all can be fixed together.
-
- OpenGL.pod           |    4 ++--
- pogl_gl_Accu_GetM.xs |   10 +++++-----
- 2 files changed, 7 insertions(+), 7 deletions(-)
-
-commit 3b3dceae5b4c802838cbf75360cf4374078a875f
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sun Sep 6 14:10:54 2009 -0400
-
-    Update CHANGE and Copyright info for 2009
-    
-    Added a copyright notice for CHM to the list of authors.
-
- CHANGES               |    5 ++---
- COPYRIGHT             |    1 +
- OpenGL.xs             |    3 ++-
- pogl_const.xs         |    3 ++-
- pogl_gl_Accu_GetM.xs  |    3 ++-
- pogl_gl_GetP_Pass.xs  |    3 ++-
- pogl_gl_Mult_Prog.xs  |    3 ++-
- pogl_gl_Pixe_Ver2.xs  |    3 ++-
- pogl_gl_Prog_Clam.xs  |    3 ++-
- pogl_gl_Tex2_Draw.xs  |    3 ++-
- pogl_gl_Ver3_Tex1.xs  |    3 ++-
- pogl_gl_Vert_Multi.xs |    3 ++-
- pogl_gl_top.xs        |    3 ++-
- pogl_glu.xs           |    3 ++-
- pogl_glut.xs          |    3 ++-
- pogl_rpn.xs           |    3 ++-
- 16 files changed, 31 insertions(+), 17 deletions(-)
-
-commit 3692f2f048135e5b94abeedd88ef2078f7485a49
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sun Sep 6 13:47:29 2009 -0400
-
-    Update VERSION to 0.58 and some docs for release
-
- OpenGL.pm  |    3 +-
- OpenGL.pod | 1602 ++++++++++++++++++++++++++++++------------------------------
- 2 files changed, 810 insertions(+), 795 deletions(-)
-
-commit 36688c2fc47c64956c8d688a3b63f33aa26df1e3
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sun Sep 6 13:45:50 2009 -0400
-
-    Renamed some Pointer_p functions to _oga
-    
-    The name was inconsistent with the usage of other _p routines.
-    This makes it explicit.  Work is underway to unify the _s, _c,
-    _p namespaces via smarter dispatch from perl which should fix
-    this problem.
-
- pogl_gl_Accu_GetM.xs  |   10 +++++-----
- pogl_gl_Vert_Multi.xs |   10 +++++-----
- 2 files changed, 10 insertions(+), 10 deletions(-)
-
-commit 1e7199aeb54e179bc4f2e9fac417292fc761666a
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sun Sep 6 13:42:53 2009 -0400
-
-    Added 1.03 requirement for OpenGL::Image
-    
-    This was documented as a compatibility requirement.  This makes
-    it explicit in test.pl which should help folks avoid incompatible
-    version problems.
-
- test.pl |    2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
-commit d31bfd200e5f444a63cb70f961d80439123bdaf9
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Wed Sep 2 09:41:40 2009 -0400
-
-    Updated TODO list and reformatted
-    
-    The style used is 4 space indentation with * marking
-    entries.  This allows for easier outline view in vim.
-
- .gitignore |    3 +-
- TODO       |  240 +++++++++++++++++++++++++++++++-----------------------------
- 2 files changed, 127 insertions(+), 116 deletions(-)
-
-commit f81933445fe61aad6e0035514c3339bb762bed06
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Tue Sep 1 14:11:37 2009 -0400
-
-    Fix .gitignore nit.
-
- .gitignore |    2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
-commit 83cb09386aeea81d369d27a6e4f24e48f2b539be
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Tue Sep 1 14:10:52 2009 -0400
-
-    Fix .gitignore nit.
-
- .gitignore |    1 +
- 1 files changed, 1 insertions(+), 0 deletions(-)
-
-commit 9ba7d5ea3807bf5f5f6d20542dd19d764af30003
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Tue Sep 1 14:10:01 2009 -0400
-
-    Fix MANIFEST.SKIP nits
-
- MANIFEST.SKIP |    1 +
- 1 files changed, 1 insertions(+), 0 deletions(-)
-
-commit f2941ac973d8c5a4bab47a9f78a5aaa12ae40d09
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Tue Sep 1 13:47:35 2009 -0400
-
-    Update examples/README to say most work
-
- examples/README |    2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
-commit a83b4fe40755c7d5b39137a4f5429ed3779ba514
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Tue Sep 1 13:46:37 2009 -0400
-
-    Fixed minor problems with eg programs
-    
-    isosurf.pl was missing glutInit() and oga.pl was
-    use-ing OpenGL::Image and OpenGL::Shader although
-    that was not required for the program to run.
-
- isosurf.pl |    1 +
- oga.pl     |    4 ++--
- 2 files changed, 3 insertions(+), 2 deletions(-)
-
-commit 05024e3d43697461ece7b80c7709dc41e268d53a
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Tue Sep 1 13:45:44 2009 -0400
-
-    Remove GIT_CHANGES from MANIFEST.SKIP
-    
-    It should not have been in there since we want it
-    in the distribution.
-
- MANIFEST.SKIP |    3 ---
- 1 files changed, 0 insertions(+), 3 deletions(-)
-
-commit 21da04e1dea1b4a7c0b35aac2ed4d66bc7ba87f6
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Tue Sep 1 11:04:32 2009 -0400
-
-    Update readme files and add GIT_CHANGES
-    
-    This is an update of several of the "readme" files and
-    the introduction of the GIT_CHANGES file which is generated
-    for each release from the output of git log --stat command.
-    
-    Once 0.58 is released to CPAN and the PDL POGL refactoring
-    is implemented we need a complete rewrite pass to correct
-    and clean up the documentation for this module to match the
-    reality of the current approach and code.
-
- .gitignore      |    1 +
- CHANGES         |   26 ++----
- INSTALL         |   22 ++--
- MANIFEST.SKIP   |    3 +
- README          |  311 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
- SUPPORTS        |   68 +++++++------
- TODO            |   31 ++++--
- examples/README |    4 +
- 8 files changed, 381 insertions(+), 85 deletions(-)
-
-commit 298b14dc08b2cb6cca1fb5ad762176f40b87b205
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Aug 31 18:07:20 2009 -0400
-
-    Remove OpenGLUT funs and update FreeGLUT info
-    
-    A number of functions planned for POGL GLUT support
-    were from OpenGLUT however, we have since decided to
-    go to FreeGLUT (with backwards GLUT support as possible).
-    The offending OpenGLUT routines were removed, some info
-    on a few incomplete FreeGLUT bindings updated and TODO
-    was cleaned up to reflect current status.
-
- OpenGL.pm       |   15 +--------------
- TODO            |   16 ++++------------
- pogl_glut.xs    |   34 +---------------------------------
- 3 files changed, 6 insertions(+), 59 deletions(-)
-
-commit 3bc9564f17f3dc76597b41cbe6339b16951571c8
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Aug 3 16:59:01 2009 -0400
-
-    Fix glversion prob with GLUT_LIB= or GLUT_DEF=
-    
-    There were some cases where the $lib or $def was not defined
-    resulting in empty arguments to the make command for glversion.
-    Added conditional tests to set the parameters only if defined.
-
- Makefile.PL |   29 +++++++++--------------------
- 1 files changed, 9 insertions(+), 20 deletions(-)
-
-commit cead0769de4af6dd2db586dfe856f11e9749c984
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Aug 3 16:21:56 2009 -0400
-
-    GLX cleanup and remove OSMesa from list of libs
-    
-    The Mesa off-screen rendering library is a Mesa only feature
-    and is not supported by OpenGL.  Removed the associated library
-    file for checking in Makefile configuration and generation.
-
- Makefile.PL |   49 +++++++++++++++++++++++--------------------------
- 1 files changed, 23 insertions(+), 26 deletions(-)
-
-commit 5e6b71ae8d1de08cd5ae333f7ce453216278a1b3
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Aug 3 15:33:29 2009 -0400
-
-    Clean out more of GLX residue from Makefile.PL
-    
-    Add clear messages to Makefile.PL waring that GLX is not directly
-    supported by OpenGL.  You must access window system operations
-    via either GLUT or FreeGLUT---both are available for GLX platforms.
-
- Makefile.PL |   52 +++++++++++++++++++++++++++++-----------------------
- 1 files changed, 29 insertions(+), 23 deletions(-)
-
-commit eb739819862f1c2c5bb76a14498a69737c9e18f2
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Aug 3 14:27:16 2009 -0400
-
-    Add WGL interface type and make verbose variable
-    
-    Add WGL as a synonym for W32API in the interface types and clean
-    up some of the description in preparation for phasing out X11 support.
-    
-    Made the verbose option repeatable to increase the verbosity.
-
- Makefile.PL |   19 +++++++++++--------
- 1 files changed, 11 insertions(+), 8 deletions(-)
-
-commit f148ff8ff49e3212d3a7708fbf5aadc99330e3c0
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Aug 3 14:12:27 2009 -0400
-
-    Removed "fix" for old ExtUtils::Liblist breakage
-    
-    There was a supposed fix for ExtUtils::Liblist breakage that
-    does not seem to be needed anymore.  At the very least, we
-    should see if there are any problems with more recent versions
-    from ExtUtils-MakeMaker.
-
- Makefile.PL |   12 ++++--------
- 1 files changed, 4 insertions(+), 8 deletions(-)
-
-commit 6072fc1a6dc102cef600fe234c04fb1fbfac42c6
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Aug 3 10:51:19 2009 -0400
-
-    Set VERSION to 0.57_02 for development
-
- OpenGL.pm |    2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
-commit 2dea63ae8970a15a094054bfabd154f11e1b2759
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Mon Aug 3 10:44:02 2009 -0400
-
-    Clean up bad dirs in $LIBS and $INCS
-    
-    Added two routines to clean up the $LIBS and $INCS values
-    removing non-existent directories with -L in $LIBS and -I
-    in $INCS before writing the Makefile. TODO: strip out missing
-    libraries as well.
-
- Makefile.PL |   38 ++++++++++++++++++++++++++++++++++++++
- 1 files changed, 38 insertions(+), 0 deletions(-)
-
-commit 304845eb3b287529c4ca644bb245706120ebb504
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Sun Jul 26 23:03:18 2009 -0400
-
-    Rm'd test.lib which does not seem to do anything
-
- test.lib |  Bin 288 -> 0 bytes
- 1 files changed, 0 insertions(+), 0 deletions(-)
-
-commit b9821f9b00298bd16082efe8c0b05e9ab8538e0a
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Fri Jul 24 14:30:01 2009 -0400
-
-    Added pogl branch containing backport to OpenGL
-    
-    This branch changes the names back to OpenGL
-    ones for release of a developer's version to
-    CPAN and for final integration and testing with
-    the new PDL stuff.
-
- MANIFEST.SKIP         |   12 +-------
- META.yml              |    4 +-
- Makefile.PL           |    4 +-
- OpenGL.pm             |   12 ++++----
- OpenGL.pod            |   24 ++++++++--------
- OpenGL.xs             |   30 +++++++++++-----------
- README                |    6 ++++
- gl_util.h             |    2 +-
- pogl_const.xs         |    4 +-
- pogl_gl_Accu_GetM.xs  |    8 +++---
- pogl_gl_GetP_Pass.xs  |    8 +++---
- pogl_gl_Mult_Prog.xs  |    4 +-
- pogl_gl_Pixe_Ver2.xs  |    8 +++---
- pogl_gl_Prog_Clam.xs  |    4 +-
- pogl_gl_Tex2_Draw.xs  |    4 +-
- pogl_gl_Ver3_Tex1.xs  |    4 +-
- pogl_gl_Vert_Multi.xs |   26 +++++++++---------
- pogl_gl_top.xs        |    4 +-
- pogl_glu.xs           |    4 +-
- pogl_glut.xs          |    4 +-
- pogl_rpn.xs           |   52 ++++++++++++++++++------------------
- t/00_require.t        |    2 +-
- t/01_use.t            |    2 +-
- test.pl               |   68 ++++++++++++++++++++++++------------------------
- typemap               |    2 +-
- 25 files changed, 150 insertions(+), 152 deletions(-)
-
-commit 6975a992af646eb6522c866cda322cf1dcba0c25
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Wed Jul 15 10:10:31 2009 -0400
-
-    Final XS split; removed original pogl_gl.xs
-    
-    All the functionality from pogl_gl.xs has been
-    split into nine smaller XS files, each less than
-    about 2K lines of XS source.  The only remaining
-    large compile is the constants.
-
- .gitignore            |    8 +-
- pogl_gl.xs            |13067 -------------------------------------------
- pogl_gl_Accu_GetM.xs  |11527 +--------------------------------------
- pogl_gl_GetP_Pass.xs  |14512 +++++------------------------------------------
- pogl_gl_Mult_Prog.xs  |14916 +++++++------------------------------------------
- pogl_gl_Pixe_Ver2.xs  |14606 ++++++------------------------------------------
- pogl_gl_Prog_Clam.xs  |11064 +------------------------------------
- pogl_gl_Tex2_Draw.xs  |14509 +++++------------------------------------------
- pogl_gl_Ver3_Tex1.xs  |11679 +--------------------------------------
- pogl_gl_Vert_Multi.xs |14756 ++++++------------------------------------------
- 10 files changed, 8264 insertions(+), 112380 deletions(-)
-
-commit 297f714082ec9523dde4c476a32d8be135567a47
-Author: Chris Marshall <devel.chm.01@gmail.com>
-Date:   Wed Jul 15 09:56:50 2009 -0400
-
-    Completed 8-part split of pogl_gl.xs
-    
-    This splits the OpenGL bindings section of
-    pogl_gl.xs into pogl_gl_top.xs which contains
-    the general and misc stuff and 8 other XS
-    files with the specific bindings for the
-    GL and GLU routines.  Probably should rename
-    pogl_gl_top.xs to pogl_gl.xs at some point.
-
- Makefile.PL           |    2 +-
- OpenGL.xs             |   50 +-
- pogl_gl.xs            |  693 +---
- pogl_gl_Accu_GetM.xs  |13067 +++++++++++++++++++++++++++++++++++++++++++++++++
- pogl_gl_GetP_Pass.xs  |13067 +++++++++++++++++++++++++++++++++++++++++++++++++
- pogl_gl_Mult_Prog.xs  |13067 +++++++++++++++++++++++++++++++++++++++++++++++++
- pogl_gl_Pixe_Ver2.xs  |13067 +++++++++++++++++++++++++++++++++++++++++++++++++
- pogl_gl_Prog_Clam.xs  |13067 +++++++++++++++++++++++++++++++++++++++++++++++++
- pogl_gl_Tex2_Draw.xs  |13067 +++++++++++++++++++++++++++++++++++++++++++++++++
- pogl_gl_Ver3_Tex1.xs  |13067 +++++++++++++++++++++++++++++++++++++++++++++++++
- pogl_gl_Vert_Multi.xs |13067 +++++++++++++++++++++++++++++++++++++++++++++++++
- pogl_gl_top.xs        |   24 +-
- pogl_glu.xs           |   24 +-
- pogl_glut.xs          |   24 +-
- pogl_rpn.xs           |   24 +-
- 15 files changed, 104551 insertions(+), 826 deletions(-)
-
-commit 82eceb110c5f6bffdb972f4df0ebc81c5faebbfb
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Tue Jul 14 17:22:46 2009 -0400
-
-    Split top/bot from pogl_gl.xs into pogl_gl_top.xs
-    
-    This first refactoring of pogl_gl.xs creates a new
-    pogl_gl_top.xs file with all the odd pieces at the
-    beginning and end of the file.  The only stuff left
-    in pogl_gl.xs is the OpenGL stuff which can be
-    split cleanly.
-
- Makefile.PL    |    2 +-
- OpenGL.xs      |    3 +-
- pogl_gl.xs     |   54 +++--
- pogl_gl_top.xs |  740 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- 4 files changed, 771 insertions(+), 28 deletions(-)
-
-commit 21bd5bddb53a150144ab1a2a0f3666b87e491fca
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Tue Jul 14 16:23:07 2009 -0400
-
-    Add ifdef IN_POGL_CONST_XS to isolate neoconstant
-    
-    Wrapped the neoconstant section of the xs files
-    with #ifdef IN_POGL_CONST_XS .. #endif pairs to
-    turn the code off everywhere but pogl_const.xs.
-    Everything builds and passes the tests so can probably
-    removed the now skipped code at some future point.
-
- OpenGL.xs     |    7 +++----
- pogl_const.xs |    4 +++-
- pogl_gl.xs    |   32 +++++++++++++++++---------------
- pogl_glu.xs   |    4 +++-
- pogl_glut.xs  |    6 ++++--
- pogl_rpn.xs   |    8 +++++---
- 6 files changed, 35 insertions(+), 26 deletions(-)
-
-commit bfbebde4f00afc2add69302b05e63104ef9ba0b9
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Tue Jul 14 15:24:04 2009 -0400
-
-    Remove ifdef IN_POGL_GL_XS sections in pogl_gl.xs
-    
-    This is not needed since the file has already been
-    split.  The idea is to clean things up a bit before
-    the final split into smaller compilation units.
-
- pogl_gl.xs |   15 +--------------
- 1 files changed, 1 insertions(+), 14 deletions(-)
-
-commit 6a73e6b0e994c05b7a15258c2d7064163507a185
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Tue Jul 14 15:09:43 2009 -0400
-
-    Add another junk file name to .gitignore
-
- .gitignore |    1 +
- 1 files changed, 1 insertions(+), 0 deletions(-)
-
-commit 241f519dc2a34da03fc01514f9aeb56a7beb9364
-Author: U-TESSERACT-3\chm <chm@tesseract-3.(none)>
-Date:   Sun Jul 12 23:24:12 2009 -0400
-
-    Set version to 0.01_07git for development
-
- OpenGL.pm |    2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
-commit b905c77522274454486e3348158d4a67e92574aa
-Author: U-TESSERACT-3\chm <chm@tesseract-3.(none)>
-Date:   Sun Jul 12 18:00:56 2009 -0400
-
-    Updated MANIFEST.SKIP
-
- MANIFEST.SKIP |    1 +
- 1 files changed, 1 insertions(+), 0 deletions(-)
-
-commit a29be51b0cd551e0830f3eaf6d97f8dbd0a22877
-Author: U-TESSERACT-3\chm <chm@tesseract-3.(none)>
-Date:   Sun Jul 12 13:04:50 2009 -0400
-
-    Update version to 0.01_06 for release to CPAN
-
- OpenGL.pm |    2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
-commit a14e0fd7ecb4bb3dbdc14c7490a1c0f06800b633
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Fri Jul 10 17:47:34 2009 -0400
-
-    Added some more entries to .gitignore
-
- .gitignore |    5 +++++
- 1 files changed, 5 insertions(+), 0 deletions(-)
-
-commit 250c95e7eaa73450319854a310fc8ba3060df600
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Fri Jul 10 17:43:08 2009 -0400
-
-    Minor word-smithing re version number and pod docs
-    
-    CHANGES - updated for git development
-    MANIFEST.SKIP - added a few more files
-    OpenGL.pod - fixed version docs to match module
-    OpenGL.xs - fixed minor podchecker bugs
-    examples/README - add current state of affairs NOTE here
-
- CHANGES         |    2 +-
- MANIFEST.SKIP   |   22 ++++++++++++----------
- OpenGL.pod      |    2 +-
- OpenGL.xs       |    6 +++++-
- examples/README |    7 +++++++
- 5 files changed, 26 insertions(+), 13 deletions(-)
-
-commit fd57f8ac5d5fb85bea5408dff370313d0269955b
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Thu Jul 9 18:01:46 2009 -0400
-
-    Renamed tests to t/##_xxxx.t convention
-    
-    This allows for sequential ordering of tests
-    based on their number prefix which means simpler
-    functionality can be tested before more complex
-    functions without checking in each file for the
-    earlier capability.
-
- t/00_require.t |    3 +++
- t/01_use.t     |    3 +++
- t/require.t    |    3 ---
- t/use.t        |    3 ---
- 4 files changed, 6 insertions(+), 6 deletions(-)
-
-commit b786d038e8cdeb26dbb4bfaf9720ebc795b47317
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Thu Jul 9 14:39:38 2009 -0400
-
-    Revert to glutInitDisplayMode() in test.pl
-    
-    glutInitDisplayString() is not fully implemented
-    in FreeGLUT so it is not possible to request
-    either an alpha channel buffer or one without
-    an alpha channel.  It may be possible to work
-    around with a try-and-die hack which would
-    try a couple of test applications to see which
-    end up running.
-
- test.pl |    4 ++--
- 1 files changed, 2 insertions(+), 2 deletions(-)
-
-commit 08400e2d88ae201d9ac0f0fd4a13ad203683a07b
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Thu Jul 9 14:23:32 2009 -0400
-
-    Add exit 0 to Makefile.PL if no *GLUT found
-    
-    This explicitly exits the configure process
-    if GLUT or FreeGLUT libraries are not found.
-    Since GLUT (and FreeGLUT) both will build on
-    an X11/GLX system, this just makes explicit
-    the GLUT requirement in a fashion consistent
-    with CPAN Testers reporting definitions.
-
- Makefile.PL |    7 ++++++-
- 1 files changed, 6 insertions(+), 1 deletions(-)
-
-commit 7e078e1fa304697dff8dbf5451597a974a41cdc3
-Author: U-TESSERACT-3\chm <chm@tesseract-3.(none)>
-Date:   Sat Jun 13 22:46:45 2009 -0400
-
-    Update version to 0.01_06git for more development
-
- OpenGL.pm |    2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
-commit 03e8caf2465b52c3abb8a5a90c86944eb3449595
-Author: U-TESSERACT-3\chm <chm@tesseract-3.(none)>
-Date:   Sat Jun 13 19:16:36 2009 -0400
-
-    Added glutInitDisplayString() to pogl_glut.xs
-    
-    This allows for much greater flexibility in display
-    mode selection.  For example, on hardware without alpha
-    support, this allows you to request an alpha capability
-    but accept none.
-
- pogl_glut.xs |    7 ++++++-
- test.pl      |    3 ++-
- 2 files changed, 8 insertions(+), 2 deletions(-)
-
-commit 36923e42aef50d815b90105674cc45475ea71a3f
-Author: U-TESSERACT-3\chm <chm@tesseract-3.(none)>
-Date:   Sat Jun 13 18:59:36 2009 -0400
-
-    Fixed skip of Makefile.PL in MANIFEST.SKIP
-
- MANIFEST.SKIP |    2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
-commit f0c476227257cbc17252f50338e88eac4955cd0c
-Author: U-TESSERACT-3\chm <chm@tesseract-3.(none)>
-Date:   Sat Jun 13 18:20:35 2009 -0400
-
-    Make glut/freeglut the interface choices for cygwin
-
- Makefile.PL |   29 ++++++++++++++++-------------
- 1 files changed, 16 insertions(+), 13 deletions(-)
-
-commit dc1f6aa2f1bd7bb9d4a65f0bc055457119c5d593
-Author: U-TESSERACT-3\chm <chm@tesseract-3.(none)>
-Date:   Sat Jun 13 18:19:11 2009 -0400
-
-    Taking MANIFEST out of git version control
-
- .gitignore    |    1 +
- MANIFEST      |  106 ---------------------------------------------------------
- MANIFEST.SKIP |    3 ++
- 3 files changed, 4 insertions(+), 106 deletions(-)
-
-commit 4710fd075fd1424d4757a7cef1ef4376712738b9
-Author: U-TESSERACT-3\chm <chm@tesseract-3.(none)>
-Date:   Sat Jun 13 15:10:45 2009 -0400
-
-    Split out OpenGL constants into pogl_const.xs
-    
-    This reduces the size of the files to be compiled
-    and their ultimate size.  We need to subdivide
-    further the GL specific constants and functions to
-    make the maximum compile size significantly smaller.
-
- .gitignore    |    2 +
- MANIFEST      |   17 +++++++++++-
- MANIFEST.SKIP |   57 +++++++++++++++++++++++++++++++++++++++++
- Makefile.PL   |    2 +-
- OpenGL.pm     |    2 +-
- OpenGL.xs     |    8 ++---
- pogl_const.xs |   79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- 7 files changed, 158 insertions(+), 9 deletions(-)
-
-commit aa1cde36ffe8da11037abe2a2156333a04d8b544
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Fri Jun 12 13:30:25 2009 -0400
-
-    Change perms on pogl_gl_funcs.txt list file.
-
- 0 files changed, 0 insertions(+), 0 deletions(-)
-
-commit efedafa7b873a64d5bdb6060f2e58a002b28a99c
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Fri Jun 12 10:41:30 2009 -0400
-
-    Add a ref list of all bindings in pogl_gl.xs
-
- pogl_gl_funcs.txt |  982 +++++++++++++++++++++++++++++++++++++++++++++++++++++
- 1 files changed, 982 insertions(+), 0 deletions(-)
-
-commit 2a909fe19ca5f18f1900103107c054e828e2b928
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Fri Jun 12 10:03:23 2009 -0400
-
-    Updated idea for split of XS
-
- TODO |   21 ++++++++++++++++++---
- 1 files changed, 18 insertions(+), 3 deletions(-)
-
-commit 2aa9a5a8e18e87adf4223dcb249527d4152c8e7f
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Fri Jun 12 10:01:49 2009 -0400
-
-    Split out GLU from pogl_gl.xs to pogl_glu.xs
-    
-    The main split left is to subdivide the pogl_gl.xs
-    OpenGL routine bindings.  Possible splits are by
-    function category, alphabetically, c, string, perl
-    interfaces, ...
-
- Makefile.PL |    2 +-
- OpenGL.xs   |    3 +-
- pogl_gl.xs  |  754 +--------------------------------------------------------
- pogl_glu.xs |  792 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- 4 files changed, 797 insertions(+), 754 deletions(-)
-
-commit 908ced3818a6e81922e3b879dbf5b7147ae1d21e
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Fri Jun 12 10:00:54 2009 -0400
-
-    Added EL-ELI.c source for easy reference to binding
-
- EL-ELI.c |   37 +++++++++++++++++++++++++++++++++++++
- 1 files changed, 37 insertions(+), 0 deletions(-)
-
-commit 3478bad6b029e8fc98bc0ded71628c04b3ccbf51
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Wed Jun 10 11:26:45 2009 -0400
-
-    Updated TODO to add GLUI bindings to the list
-
- TODO |    5 ++++-
- 1 files changed, 4 insertions(+), 1 deletions(-)
-
-commit 53c595b330ec1287b70596ae6c0c7f4cdaffb62d
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Wed Jun 10 11:14:50 2009 -0400
-
-    Updated TODO with all outstanding port notes
-    
-    The big realization here: GLUT or FreeGLUT builds on
-    all GLX platforms so we lose nothing by dropping GLX
-    support from POGL!  The main work will be supporting
-    the glp*() functions via a GLUT framework rather than
-    the current GLX+X11+XEvent stuff.
-
- TODO |  181 ++++++++++++++++++++++++++++++++++++++++++++---------------------
- 1 files changed, 122 insertions(+), 59 deletions(-)
-
-commit 1174055741afc6fabe8907cf6291584344e310c0
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Wed Jun 10 11:14:10 2009 -0400
-
-    Update version to 0.01_05git
-
- OpenGL.pm |    2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
-commit 7d0ddeb212321d405ba31edb6d25a479a1fc91b1
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Wed Jun 10 09:56:11 2009 -0400
-
-    Renamed pogl_main.xs to pogl_gl.xs
-    
-    This is the planned final name for the file
-    making the GL bindings.  It currently has
-    everything that has not been split out.
-    Similarly, pogl_rpn.xs contains the OGA
-    stuff due to the dependencies in the current
-    code.  Once the RPN declarations have been
-    refactored into an include file, the OGA
-    stuff will move to pogl_array.xs.
-
- .gitignore   |    9 +-
- Makefile.PL  |    2 +-
- OpenGL.xs    |    6 +-
- pogl_gl.xs   |14517 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- pogl_main.xs |14517 ----------------------------------------------------------
- 5 files changed, 14529 insertions(+), 14522 deletions(-)
-
-commit 8602b439e813657dd611f709f83070549d0ed3d4
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Wed Jun 10 09:39:16 2009 -0400
-
-    Added t/ directory with use_ok() and require_ok()
-    
-    The "make test" command now runs all the tests in
-    t/ and finishes by running the original test.pl.
-    We need to add specific subtests for each main
-    interface for regression testing and cross-platform
-    diagnostics.
-
- t/require.t |    3 +++
- t/use.t     |    3 +++
- 2 files changed, 6 insertions(+), 0 deletions(-)
-
-commit 9ed9b29bf5e139d7d57bc7375a7dfd93754bcd30
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Wed Jun 10 09:38:44 2009 -0400
-
-    Added pogl_xxx.c intermediate filenames
-
- .gitignore |   17 ++++++++++-------
- 1 files changed, 10 insertions(+), 7 deletions(-)
-
-commit 2d4881e5b8996d2b1ab32cae5f48af546437db24
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Tue Jun 9 10:07:04 2009 -0400
-
-    Added Config.pm to list of files to clean.
-
- Makefile.PL |    1 +
- 1 files changed, 1 insertions(+), 0 deletions(-)
-
-commit 32596be1a38da4455124c73c8a7d76bd08436125
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Tue Jun 9 09:53:59 2009 -0400
-
-    Preliminary split of OpenGL.xs completed
-    
-    Using the technology from the Glib module,
-    we have split out the XS intefaces for
-    GLUT/FreeGLUT, RPN+OGA, and GL+GLU+GLX
-    into separate XS files:
-    
-      pogl_glut.xs  -- GLUT/FreeGLUT bindings
-      pogl_rpn.xs   -- RPN and OGA interfaces
-      pogl_main.xs  -- GL, GLU, and GLX stuff
-    
-    This resulted in new MODULES for each of the
-    resulting files:
-    
-      PDL::Graphics::OpenGL::Perl::OpenGL::GLUT
-      PDL::Graphics::OpenGL::Perl::OpenGL::RPN
-      PDL::Graphics::OpenGL::Perl::OpenGL::Rest
-    
-    Need to determine if no index ought to be
-    specified here.
-    
-    TODO:
-    
-      Still need to split GL, GLU, and GLX
-      Subdivide GL to reduce compile pressure
-      Add includes to allow RPN and Array to decouple
-
- Makefile.PL  |    2 +-
- OpenGL.xs    |17859 +---------------------------------------------------------
- pogl_glut.xs |16384 +-----------------------------------------------------
- pogl_main.xs | 5516 ++++---------------
- pogl_rpn.xs  | 1803 ++++++
- 5 files changed, 2942 insertions(+), 38622 deletions(-)
-
-commit b570c7ac1c306ed0646e3ea025ed29ee8ef0fb87
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Tue Jun 9 09:53:00 2009 -0400
-
-    Added a list of FreeGLUT only funs for reference
-
- freeglut-funs-name.txt |   22 ++++++++++++++++++++++
- 1 files changed, 22 insertions(+), 0 deletions(-)
-
-commit ccd0c90b90a9ebf5d83fa63c2c5e6f098507d578
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Tue Jun 9 09:52:17 2009 -0400
-
-    Update VERSION to 0.05 in prep for test release
-
- OpenGL.pm |    2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
-commit d4ccbad90ec7ec15e1cb4d8be9aa7a80bddebdc9
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Mon Jun 8 17:42:49 2009 -0400
-
-    Introduce new files to split XS across
-    
-    After the split booting works with the
-    two files, I'll see about extending it
-    to work with all the different categories.
-
- pogl_glut.xs |17973 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- pogl_main.xs |17973 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- 2 files changed, 35946 insertions(+), 0 deletions(-)
-
-commit 455ca65edb54c41bbf25c7a02122c3033ce3f0c2
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Mon Jun 8 17:41:25 2009 -0400
-
-    First attempt to split out XS files
-    
-    I'm getting duplicate generation of the
-    boot functions.  Will try to set separate
-    MODULE values for each file and see if that
-    helps
-
- Makefile.PL |    2 +-
- OpenGL.xs   |   16 ++++++++--------
- 2 files changed, 9 insertions(+), 9 deletions(-)
-
-commit 900f345317c6de9421ad5208eccf900450e7c5fb
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Mon Jun 8 16:45:20 2009 -0400
-
-    Added _have_freeglut parameter and checks
-    
-    If HAVE_FREEGLUT is defined, then so will _have_freeglut.
-    test.pl was modified to avoid FreeGLUT functionality so
-    it should run with GLUT only.
-
- OpenGL.xs |   16 ++++++++++++++--
- test.pl   |   10 +++++++---
- 2 files changed, 21 insertions(+), 5 deletions(-)
-
-commit 6294fc10a3d199343c200fa1605bc71c3c5e4406
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Mon Jun 8 16:07:09 2009 -0400
-
-    Make FreeGLUT over GLX the default for cygwin make
-    
-    There is still a problem with using w32api and the
-    freeglut.dll distributed with POGL.  I make the
-    FreeGLUT + GLX the default for cygwin and determined
-    build options that work with the explicit freeglut.dll
-    but work needs to be done to get this running with
-    the full perl module.
-
- utils/Makefile.cygwin |   10 +++++++---
- utils/glversion.c     |    8 ++++++++
- 2 files changed, 15 insertions(+), 3 deletions(-)
-
-commit 80dc1ce705de07a0fdc1770ae6c09f52c9296427
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Fri May 29 18:25:05 2009 -0400
-
-    OpenGL.xs has partitions...next to split to files.
-    
-    The #ifdef IN_POGL_XXX_XS dividers are in place in
-    OpenGL.xs and it should be ready to create the actual
-    split out XS files.  Note: I discovered that you cannot
-    span a MODULE directive line in an XS file with #ifdef
-    to #endif (or #else).  Either side works ok.
-
- OpenGL.xs |   28 +++++++++++++++++++++++++++-
- 1 files changed, 27 insertions(+), 1 deletions(-)
-
-commit c69cd2930b05b265a66287505adfa06b5394f28a
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Fri May 29 18:02:00 2009 -0400
-
-    Another step to XS splitting and cleanup
-
- OpenGL.xs  |   33 ++++++++++++++++++++++++++++-
- gl_const.h |    2 +-
- gl_util.h  |   65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
- 3 files changed, 93 insertions(+), 7 deletions(-)
-
-commit d7ca39a5008b97f9e33f19a36f0189d879d94a6e
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Fri May 29 16:52:54 2009 -0400
-
-    More XS split and move PackCallbackST to pgopogl.h
-    
-    Another checkpoint in the XS file partition process.
-    A bit of cleanup on the #defines and move a macro
-    definition from the XS file to pgopogl.h.
-
- OpenGL.xs |   13 +++++++++++--
- pgopogl.h |   13 +++++++++++++
- 2 files changed, 24 insertions(+), 2 deletions(-)
-
-commit cc6c9bff9227292311a4808e44dbe3cbf864ec4a
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Fri May 29 15:55:01 2009 -0400
-
-    Add OpenGL.xs-orig to .gitignore
-
- .gitignore |    1 +
- 1 files changed, 1 insertions(+), 0 deletions(-)
-
-commit 545bc3011252c792007cf68a5d51ac73dcc0520a
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Fri May 29 15:50:46 2009 -0400
-
-    Safety snapshot of partial xs file split
-    
-    By using #ifdef's and #defines such as IN_POGL_GL_XS, I am
-    segmenting the original OpenGL.xs file by the planned final
-    XS file location.  Once all the partitioning #ifdef--#endif
-    pairs are in, we'll copy the file to the new .xs names and
-    set only the specific #define for that file.  When the split
-    version is debugged and working we will remove the redundant
-    code sections.
-
- OpenGL.xs |   70 +++++++++++++++++++++++++++++++++++++++++++++++++-----------
- 1 files changed, 57 insertions(+), 13 deletions(-)
-
-commit 95616470cbbe4a9027a633ae96ea7fe7bdc80c19
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Fri May 29 15:46:07 2009 -0400
-
-    Add indentation so folds work for big sections
-    
-    The large arrays and other structure associated with
-    the constants, functions and other identifiers for the
-    OpenGL module result in lots of lines.  By adding some
-    default indentation, vim allows folds to hide these
-    long line groups allowing for better visualization of
-    the file contents.
-
- OpenGL.pm | 9224 ++++++++++++++++++++++++++++++------------------------------
- 1 files changed, 4612 insertions(+), 4612 deletions(-)
-
-commit a0329e895f5329e1141be3c628403215e534da0f
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Fri May 29 15:45:14 2009 -0400
-
-    Add more stuff to .gitignore
-
- .gitignore |    2 ++
- 1 files changed, 2 insertions(+), 0 deletions(-)
-
-commit c30ef516a49808e4effabc7eaefdb63147925f95
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Fri May 29 15:44:24 2009 -0400
-
-    Factor out common XS includes and ppport.h
-
- pgopogl.h |    1 +
- 1 files changed, 1 insertions(+), 0 deletions(-)
-
-commit a88993e8a7db449e7b771634157aa77ce1415f65
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Fri May 29 14:06:30 2009 -0400
-
-    Put basic .gitignore for module development
-
- .gitignore |   11 +++++++++++
- 1 files changed, 11 insertions(+), 0 deletions(-)
-
-commit 44132c292f59ed900ed7205184f695629b2cfba1
-Author: Chris Marshall <chm@alum.mit.edu>
-Date:   Fri May 29 13:39:02 2009 -0400
-
-    Initial commit of PGOPOGL module to git
-    
-    Getting started to split the XS file to reduce the
-    size of the compile processes so things can build
-    on systems with lower memory requirements.  This may
-    reduce the time to compile as well.  Need to check.
-
- CHANGES                          |  116 +
- COPYRIGHT                        |   82 +
- FreeGLUT/README.txt              |    2 +
- FreeGLUT/freeglut.dll            |  Bin 0 -> 229376 bytes
- FreeGLUT/freeglut.lib            |  Bin 0 -> 32452 bytes
- INSTALL                          |  122 +
- MANIFEST                         |   93 +
- META.yml                         |   10 +
- Makefile.PL                      |  938 ++
- OpenGL.pm                        | 6276 ++++++++++++++
- OpenGL.pod                       | 1886 ++++
- OpenGL.xs                        |17853 ++++++++++++++++++++++++++++++++++++++
- README                           |   16 +
- SUPPORTS                         |   35 +
- TODO                             |   59 +
- examples/README                  |    5 +
- examples/clip                    |  116 +
- examples/cube                    |   69 +
- examples/depth                   |   39 +
- examples/double                  |   75 +
- examples/fun                     |  384 +
- examples/glu_test                |   68 +
- examples/light                   |  127 +
- examples/plane                   |  109 +
- examples/planets                 |  274 +
- examples/quest                   |  357 +
- examples/simple                  |   26 +
- examples/smooth                  |   38 +
- examples/spaceship.nff           |  230 +
- examples/stan.ppm                |  823 ++
- examples/texhack                 |   82 +
- examples/texture                 |  132 +
- examples/tk_demo                 |  104 +
- examples/tk_steal                |  120 +
- examples/try                     |   22 +
- examples/with-glut.txt           |    1 +
- examples/with-glx.txt            |   10 +
- examples/wolf.bin                |  Bin 0 -> 49160 bytes
- fragment.arb                     |   11 +
- fragment.cg                      |   23 +
- fragment.glsl                    |    8 +
- genvars.pl                       |   73 +
- gl_const.h                       | 3124 +++++++
- gl_exclude.h                     |  151 +
- gl_util.c                        | 1479 ++++
- gl_util.h                        |  337 +
- glext_procs.h                    | 8589 ++++++++++++++++++
- glpm_const.h                     |   99 +
- glu_const.h                      |  107 +
- glu_util.h                       |   14 +
- glut_const.h                     |  189 +
- glut_util.h                      |   20 +
- glx_const.h                      |  170 +
- glx_util.h                       |    1 +
- include/GL/SGIFreeSWLicB.1.1.pdf |  Bin 0 -> 24888 bytes
- include/GL/freeglut.h            |   22 +
- include/GL/freeglut_ext.h        |  115 +
- include/GL/freeglut_std.h        |  547 ++
- include/GL/gl.h                  | 1914 ++++
- include/GL/glext.h               | 6495 ++++++++++++++
- include/GL/glprocs.h             | 2213 +++++
- include/GL/glu.h                 |  584 ++
- include/GL/glut.h                |   21 +
- include/GL/glxext.h              |  706 ++
- include/GL/wglext.h              |  631 ++
- isosurf.bin                      |  Bin 0 -> 86148 bytes
- isosurf.pl                       |  326 +
- menutest.pl                      |   23 +
- oga.pl                           |  187 +
- os2pm_X.h                        |  618 ++
- pgopogl.h                        |   46 +
- pgopogl.xs                       |   58 +
- ppport.h                         | 4954 +++++++++++
- test.jpg                         |  Bin 0 -> 10546 bytes
- test.lib                         |  Bin 0 -> 288 bytes
- test.pl                          | 1590 ++++
- test.png                         |  Bin 0 -> 28939 bytes
- test.tga                         |  Bin 0 -> 65580 bytes
- typemap                          |   40 +
- utils/Makefile                   |   36 +
- utils/Makefile.cygwin            |   27 +
- utils/Makefile.macosx            |   23 +
- utils/cleanup.pl                 |   91 +
- utils/const.pl                   |    9 +
- utils/exports.pl                 |   13 +
- utils/exports.txt                |  337 +
- utils/glext_procs.pl             |  128 +
- utils/glversion.c                |   37 +
- utils/glxinfo.c                  |  798 ++
- utils/hdr_diff.pl                |   44 +
- utils/makefile.mak               |   30 +
- utils/makefile.mingw             |   24 +
- utils/mingw.bat                  |   30 +
- utils/opengl32.txt               |  394 +
- utils/wgl_ext.txt                |  122 +
- vertex.arb                       |   26 +
- vertex.cg                        |   40 +
- vertex.glsl                      |   23 +
- 98 files changed, 68416 insertions(+), 0 deletions(-)
@@ -5,7 +5,10 @@
     from your vendor.
 
     Install FreeGLUT (or compatible) - you can find this at
-    http://freeglut.sourceforge.net/.
+    http://freeglut.sourceforge.net/.  NOTE: Strawberry Perl
+    includes the FreeGLUT library and the binary distributions
+    at http://www.sisyphusion.tk provide the needed FreeGLUT
+    as well.
 
     On 32-bit MS Windows, a binary FreeGLUT library is installed
     automatically by this module if needed.
@@ -1,3 +1,7 @@
+* Does not support dynamic detection of OpenGL API support
+  and does not have bindings for modern OpenGL API since
+  approximately version 2.0
+
 * No way to specify/override the compile and link
   options which causes problems on systems with multiple
   OpenGL libraries installed (e.g., 32-bit and 64-bit).
@@ -1,33 +1,18 @@
 Array.pod
 CHANGES
 COPYRIGHT
-FreeGLUT/README.txt
-FreeGLUT/freeglut.dll
-FreeGLUT/freeglut.lib
-INSTALL
-KNOWN_PROBLEMS
-MANIFEST			This list of files
-MANIFEST.SKIP
-Makefile.PL
-OpenGL.pm
-OpenGL.pod
-OpenGL.xs
-README
-Release_Notes
-SUPPORTS
-TODO
-Tessellation.pod
-examples/README
 examples/clip.pl
 examples/cube.pl
 examples/depth.pl
 examples/double.pl
 examples/fun.pl
 examples/glu_test.pl
+examples/glxgears.pl
 examples/light.pl
 examples/plane.pl
 examples/planets.pl
 examples/quest.pl
+examples/README
 examples/simple.pl
 examples/smooth.pl
 examples/spaceship.nff
@@ -38,22 +23,29 @@ examples/texture.pl
 examples/tk_demo.pl
 examples/tk_steal.pl
 examples/try.pl
+examples/with-glut.txt
+examples/with-glx.txt
 examples/wolf.bin
 fragment.arb
 fragment.cg
 fragment.glsl
+frank-vbo.pl
+FreeGLUT/freeglut.dll
+FreeGLUT/freeglut.lib
+FreeGLUT/README.txt
+funlist.c
 genvars.pl
 gl_const.h
 gl_util.c
 gl_util.h
 glext_procs.h
-glpm_const.h
 glu_const.h
 glu_util.h
 glut_const.h
 glut_util.h
 glx_const.h
 glx_util.h
+hang.pl
 include/GL/freeglut.h
 include/GL/freeglut_ext.h
 include/GL/freeglut_std.h
@@ -63,14 +55,28 @@ include/GL/glprocs.h
 include/GL/glu.h
 include/GL/glut.h
 include/GL/glxext.h
+include/GL/SGIFreeSWLicB.1.1.pdf
 include/GL/wglext.h
+INSTALL
 isosurf.bin
 isosurf.pl
+KNOWN_PROBLEMS
+Makefile.PL
+MANIFEST			This list of files
+MANIFEST.SKIP
 menutest.pl
+MYMETA.json
+MYMETA.yml
 oga.pl
+OpenGL.pm
+OpenGL.pod
+OpenGL.xs
+opengl_glut.xs
 os2pm_X.h
 pgopogl.h
 pgopogl.xs
+pixel_buffer_object.txt
+pogl-api.txt
 pogl_const.xs
 pogl_gl_Accu_GetM.xs
 pogl_gl_GetP_Pass.xs
@@ -78,23 +84,25 @@ pogl_gl_Mult_Prog.xs
 pogl_gl_Pixe_Ver2.xs
 pogl_gl_Prog_Clam.xs
 pogl_gl_Tex2_Draw.xs
+pogl_gl_top.xs
 pogl_gl_Ver3_Tex1.xs
 pogl_gl_Vert_Multi.xs
-pogl_gl_top.xs
 pogl_glu.xs
 pogl_glut.xs
 pogl_rpn.xs
 ppport.h
+README
+Release_Notes
+SUPPORTS
 t/00_require.t
 t/01_use.t
 t/10_opengl_array.t
+Tessellation.pod
 test.jpg
 test.pl
 test.tga
+TODO
 typemap
-utils/Makefile
-utils/Makefile.cygwin
-utils/Makefile.macosx
 utils/cleanup.pl
 utils/const.pl
 utils/exports.pl
@@ -102,13 +110,17 @@ utils/exports.txt
 utils/glext_procs.pl
 utils/glversion.c
 utils/hdr_diff.pl
+utils/Makefile
+utils/Makefile.cygwin
+utils/Makefile.macosx
 utils/makefile.mak
 utils/makefile.mingw
 utils/mingw.bat
 utils/opengl32.txt
+utils/strawberry.bat
 utils/wgl_ext.txt
 vertex.arb
 vertex.cg
 vertex.glsl
-GIT_CHANGES
-META.yml                                 Module meta-data (added by MakeMaker)
+META.yml                                 Module YAML meta-data (added by MakeMaker)
+META.json                                Module JSON meta-data (added by MakeMaker)
@@ -41,6 +41,8 @@ EL-ELI.c
 ^.git
 ^Config.pm
 ^Makefile$
+^MYMETA.json
+^MYMETA.yml
 ^META.yml$
 ^OpenGL.bs
 ^OpenGL.c
@@ -0,0 +1,50 @@
+{
+   "abstract" : "Perl bindings to the OpenGL API, GLU, and GLUT/FreeGLUT",
+   "author" : [
+      "Chris Marshall <chm at cpan dot org>"
+   ],
+   "dynamic_config" : 1,
+   "generated_by" : "ExtUtils::MakeMaker version 6.66, CPAN::Meta::Converter version 2.130880",
+   "license" : [
+      "unknown"
+   ],
+   "meta-spec" : {
+      "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
+      "version" : "2"
+   },
+   "name" : "OpenGL",
+   "no_index" : {
+      "directory" : [
+         "t",
+         "inc"
+      ]
+   },
+   "prereqs" : {
+      "build" : {
+         "requires" : {
+            "ExtUtils::MakeMaker" : "0"
+         }
+      },
+      "configure" : {
+         "requires" : {
+            "ExtUtils::MakeMaker" : "0"
+         }
+      },
+      "runtime" : {
+         "requires" : {
+            "Test::More" : "0"
+         }
+      }
+   },
+   "release_status" : "stable",
+   "resources" : {
+      "bugtracker" : {
+         "web" : "http://sourceforge.net/tracker/?group_id=562483&atid=2281758"
+      },
+      "homepage" : "http://sourceforge.net/projects/pogl/",
+      "repository" : {
+         "url" : "git://pogl.git.sourceforge.net/gitroot/pogl/pogl"
+      }
+   },
+   "version" : "0.6703"
+}
@@ -1,26 +1,26 @@
---- #YAML:1.0
-name:               OpenGL
-version:            0.66
-abstract:           Perl bindings to the OpenGL API, GLU, and GLUT/FreeGLUT
+---
+abstract: 'Perl bindings to the OpenGL API, GLU, and GLUT/FreeGLUT'
 author:
-    - Chris Marshall <chm at cpan dot org>
-license:            unknown
-distribution_type:  module
-configure_requires:
-    ExtUtils::MakeMaker:  0
+  - 'Chris Marshall <chm at cpan dot org>'
 build_requires:
-    ExtUtils::MakeMaker:  0
+  ExtUtils::MakeMaker: 0
+configure_requires:
+  ExtUtils::MakeMaker: 0
+dynamic_config: 1
+generated_by: 'ExtUtils::MakeMaker version 6.66, CPAN::Meta::Converter version 2.130880'
+license: unknown
+meta-spec:
+  url: http://module-build.sourceforge.net/META-spec-v1.4.html
+  version: 1.4
+name: OpenGL
+no_index:
+  directory:
+    - t
+    - inc
 requires:
-    Test::More:  0
+  Test::More: 0
 resources:
-    bugtracker:  http://sourceforge.net/tracker/?group_id=562483&atid=2281758
-    homepage:    http://sourceforge.net/projects/pogl/
-    repository:  git://pogl.git.sourceforge.net/gitroot/pogl/pogl
-no_index:
-    directory:
-        - t
-        - inc
-generated_by:       ExtUtils::MakeMaker version 6.55_02
-meta-spec:
-    url:      http://module-build.sourceforge.net/META-spec-v1.4.html
-    version:  1.4
+  bugtracker: http://sourceforge.net/tracker/?group_id=562483&atid=2281758
+  homepage: http://sourceforge.net/projects/pogl/
+  repository: git://pogl.git.sourceforge.net/gitroot/pogl/pogl
+version: 0.6703
@@ -0,0 +1,50 @@
+{
+   "abstract" : "Perl bindings to the OpenGL API, GLU, and GLUT/FreeGLUT",
+   "author" : [
+      "Chris Marshall <chm at cpan dot org>"
+   ],
+   "dynamic_config" : 0,
+   "generated_by" : "ExtUtils::MakeMaker version 6.66, CPAN::Meta::Converter version 2.130880",
+   "license" : [
+      "unknown"
+   ],
+   "meta-spec" : {
+      "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
+      "version" : "2"
+   },
+   "name" : "OpenGL",
+   "no_index" : {
+      "directory" : [
+         "t",
+         "inc"
+      ]
+   },
+   "prereqs" : {
+      "build" : {
+         "requires" : {
+            "ExtUtils::MakeMaker" : "0"
+         }
+      },
+      "configure" : {
+         "requires" : {
+            "ExtUtils::MakeMaker" : "0"
+         }
+      },
+      "runtime" : {
+         "requires" : {
+            "Test::More" : "0"
+         }
+      }
+   },
+   "release_status" : "stable",
+   "resources" : {
+      "bugtracker" : {
+         "web" : "http://sourceforge.net/tracker/?group_id=562483&atid=2281758"
+      },
+      "homepage" : "http://sourceforge.net/projects/pogl/",
+      "repository" : {
+         "url" : "git://pogl.git.sourceforge.net/gitroot/pogl/pogl"
+      }
+   },
+   "version" : "0.6703"
+}
@@ -0,0 +1,26 @@
+---
+abstract: 'Perl bindings to the OpenGL API, GLU, and GLUT/FreeGLUT'
+author:
+  - 'Chris Marshall <chm at cpan dot org>'
+build_requires:
+  ExtUtils::MakeMaker: 0
+configure_requires:
+  ExtUtils::MakeMaker: 0
+dynamic_config: 0
+generated_by: 'ExtUtils::MakeMaker version 6.66, CPAN::Meta::Converter version 2.130880'
+license: unknown
+meta-spec:
+  url: http://module-build.sourceforge.net/META-spec-v1.4.html
+  version: 1.4
+name: OpenGL
+no_index:
+  directory:
+    - t
+    - inc
+requires:
+  Test::More: 0
+resources:
+  bugtracker: http://sourceforge.net/tracker/?group_id=562483&atid=2281758
+  homepage: http://sourceforge.net/projects/pogl/
+  repository: git://pogl.git.sourceforge.net/gitroot/pogl/pogl
+version: 0.6703
@@ -57,28 +57,6 @@ sub Usage
 Usage() if (@ARGV and $ARGV[0] =~ m|^([-/]*)?h(elp)?|i);
 
 
-# Detect CYGWIN - some versions don't report $^O correctly
-open(SAVEERR, ">&STDERR");
-close(STDERR);
-my $uname = `uname`;
-open(STDERR, ">&SAVEERR");
-our $IS_CYGWIN = $^O eq 'cygwin';
-our $IS_W32API = ($IS_CYGWIN && grep { m/^interface=(W32API|WGL)/i } @ARGV );
-
-
-# Detect MINGW
-our $IS_MINGW = 0;
-if ($^O eq 'MSWin32' && !$IS_CYGWIN)
-{
-#  open(SAVEERR, ">&STDERR");
-#  close(STDERR);
-#  $IS_MINGW = `gcc -dumpversion`;
-#  open(STDERR, ">&SAVEERR");
-
-  $IS_MINGW = (($Config{make} =~ /\bdmake/i) && ($Config{cc} =~ /\bgcc/i))
-}
-
-
 # Get debugging flags
 our $verbose = 0;
 if ( grep { if (m/^verbose/i) { $verbose++; 1; } else { 0; } } @ARGV )
@@ -108,6 +86,34 @@ if ( grep { m/^dist=/i } @ARGV )
   # Strip out interface args
   @ARGV = grep { !m/^dist=/i } @ARGV;
 }
+
+
+# Detect CYGWIN
+our $IS_CYGWIN = $^O eq 'cygwin';
+print "Build platform \$IS_CYGWIN==$IS_CYGWIN\n" if $IS_CYGWIN and $verbose;
+
+our $IS_W32API = ($IS_CYGWIN && grep { m/^interface=(W32API|WGL)/i } @ARGV );
+print "Build platform \$IS_W32API==$IS_W32API\n" if $IS_W32API and $verbose;
+
+
+# Detect MINGW
+our $IS_MINGW = 0;
+if ($^O eq 'MSWin32' && !$IS_CYGWIN)
+{
+  $IS_MINGW = (($Config{make} =~ /\bdmake/i) && ($Config{cc} =~ /\bgcc/i));
+  print "Build platform \$IS_MINGW==$IS_MINGW\n" if $IS_MINGW and $verbose;
+}
+
+
+# Detect Strawberry Perl
+our $IS_STRAWBERRY = 0;
+if ($IS_MINGW)
+{
+  $IS_STRAWBERRY = ($Config{cf_by} =~ m/strawberry-perl/i);
+  print "Build platform \$IS_STRAWBERRY==$IS_STRAWBERRY\n" if $IS_STRAWBERRY and $verbose;
+}
+
+
 # Default to NO_EXCLUSIONS on Windows
 if ($^O eq 'MSWin32' || $IS_W32API)
 {
@@ -344,7 +350,15 @@ print "\nUsing interface: $interface_lib\n\n";
 
 # Marshall compiler defines
 our $DEFS = $DIST_DEFS;
-if (($^O eq 'MSWin32') || $IS_W32API || $IS_MINGW)
+if ($IS_STRAWBERRY)
+{
+  delete($found_libs->{'GLX'});
+  delete($found_libs->{'MESA'});
+  $found_libs->{'GLU'} = $found_libs->{'GLU32'};
+  $found_libs->{'GL'} = $found_libs->{'OPENGL32'};
+  $DEFS .= " -DIS_STRAWBERRY";
+}
+elsif (($^O eq 'MSWin32') || $IS_W32API || $IS_MINGW)
 {
   delete($found_libs->{'GLX'});
   delete($found_libs->{'MESA'});
@@ -394,6 +408,10 @@ if ($IS_W32API || (($^O eq 'MSWin32') && !$IS_CYGWIN))		# Win32
   {
     $glut_lib .= '-lglut32';
   }
+  elsif ($interface_lib eq 'FREEGLUT' and $IS_STRAWBERRY)
+  {
+    $glut_lib .= '-lglut';
+  }
   else
   {
     $glut_lib .= '-LFreeGLUT -lfreeglut';
@@ -465,12 +483,6 @@ else # Everyone else
   {
     #delete($found_libs->{GLX});
     $DEFS .= " -DHAVE_GLX";
-
-    # Handle OS2 - why?
-    if ($^O eq 'os2')
-    {
-       $DEFS .= ' -DOS2_GL_DISABLE_MISSING_EXT -DAPIENTRY= -D__PM__';
-    }
   }
   elsif (!$found_libs->{GLX} && $verbose)
   {
@@ -655,7 +667,14 @@ sub get_libs
   }
 
   # Win32
-  if (($^O eq 'MSWin32') || $IS_W32API)
+  if ($IS_STRAWBERRY)
+  {
+     # libs for strawberry perl go here
+     $found->{FREEGLUT} = 'glut';
+     $found->{OPENGL32} = 'opengl32';
+     $found->{GLU32} = 'glu32';
+  }
+  elsif (($^O eq 'MSWin32') || $IS_W32API)
   {
     my $paths = $ENV{PATH};
     $paths =~ s|\\|/|g;
@@ -681,7 +700,7 @@ sub get_libs
     }
 
     # Install FreeGLUT if not found
-    if (!$found->{FREEGLUT32})
+    if (!$found->{FREEGLUT32} and !$IS_STRAWBERRY)
     {
       my $dll_dir = $Config{installsitebin};
 
@@ -797,10 +816,14 @@ sub get_extensions
 
   # Platform-specific makefiles for glversion
   my $make_ver;
-  if ($IS_MINGW)
+  if ($IS_STRAWBERRY)
+  {
+    $make_ver = "&strawberry.bat";
+    print "strawberry glversion: '$make_ver'\n" if $verbose>1;
+  }
+  elsif ($IS_MINGW)
   {
     $make_ver = "&mingw.bat";
-#    $make_ver = '&dmake -f makefile.mingw GLUT_DEF='.$def;
     print "mingw glversion: '$make_ver'\n" if $verbose>1;
   }
   elsif ($IS_W32API)
@@ -11,7 +11,7 @@ require DynaLoader;
 
 use Carp;
 
-$VERSION = '0.66';
+$VERSION = '0.6703';
 $BUILD_VERSION = $XS_VERSION = $VERSION;
 $VERSION = eval($VERSION);
 
@@ -4058,7 +4058,6 @@ our $glext_dependencies =
    GL_DRAW_BUFFER13_ATI
    GL_DRAW_BUFFER14_ATI
    GL_DRAW_BUFFER15_ATI
-   GL_TYPE_RGBA_FLOAT_ATI
    GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI
    GL_MODULATE_ADD_ATI
    GL_MODULATE_SIGNED_ADD_ATI
@@ -6180,8 +6179,10 @@ sub glpMultMatrixf { glMultMatrixf_p(@_) }
 
 sub glpMainLoop {
   if (_have_glx()) {
-    print "Control-D to quit...\n";
-    while(<>){;} # control-D to quit
+     ## print "Control-D to quit...\n";
+     ## while(<>){;} # control-D to quit
+    print "Type <Enter> to quit...\n";
+    until(<>){;} # control-D to quit
   } else {				# OS/2 PM
     OS2::Process_Messages(0) while 1;  
   }
@@ -1,7 +1,7 @@
 
 =head1 NAME
 
-OpenGL - v0.66
+OpenGL - v0.6703
 
 =head1 SYNOPSIS
 
@@ -1917,8 +1917,8 @@ L<http://graphcomp.com/opengl>.
 =head2 SOURCE
 
   CPAN: http://search.cpan.org/~chm/
-  GIT:  git://pogl.git.sourceforge.net/gitroot/pogl/pogl (Read only)
-  TARBALL: http://sourceforge.net/projects/pogl/files/
+  GIT:  git clone git://git.code.sf.net/p/pogl/code pogl-code (Read only)
+  TARBALL: http://sourceforge.net/p/pogl/code/ci/master/tarball
 
 =head2 WINDOWS BINARIES
 
@@ -125,6 +125,3 @@ BOOT:
   PGOPOGL_CALL_BOOT(boot_OpenGL__GL__VertMulti);
   PGOPOGL_CALL_BOOT(boot_OpenGL__GLU);
   PGOPOGL_CALL_BOOT(boot_OpenGL__GLUT);
-#ifdef __PM__
-  InitSys();
-#endif /* defined __PM__ */
@@ -1,7 +1,7 @@
  Copyright (c) 1998,1999 Kenneth Albanowski. All rights reserved.
  Copyright (c) 2000 Ilya Zakharevich. All rights reserved.
  Copyright (c) 2007 Bob Free. All rights reserved.
- Copyright (c) 2009 Chris Marshall. All rights reserved.
+ Copyright (c) 2009-2013 Chris Marshall. All rights reserved.
  This program is free software; you can redistribute it and/or
  modify it under the same terms as Perl itself. 
 
@@ -24,7 +24,8 @@ As such, FreeGLUT is assumed.  See INSTALL for options to override
 this default.
 
 
-NOTE: POGL automatically installs a binary FreeGLUT library on win32.
+NOTE: POGL automatically installs a binary FreeGLUT library on 32bit
+      win32 perl platforms.
 
 
 POGL provides access to most of the OpenGL 1.0, 1.1, and 1.2 APIs, and
@@ -98,7 +99,7 @@ PPM for 64-bit perl 5.10+: http://www.sisyphusion.tk/ppm/OpenGL.ppd
 
 Changes:
 
-0.58+:  Chris Marhall <devel DOT chm DOT 01 at gmail DOT com>
+0.58+:  Chris Marshall <devel DOT chm DOT 01 at gmail DOT com>
         See GIT_CHANGES file in CPAN releases or use git log --stat on
         a git repository
 
@@ -1,4 +1,93 @@
 +------------------------------------------------------------------------+
+|                  OpenGL-0.6703
++------------------------------------------------------------------------+
+
+General Notes:
+
+ * Minor update to tolerate absence of several extensions removed
+   in Mesa 9.2.0.  Thanks to Colin Watson for reporting and fixing
+   the problem.
+
+
+Highlights:
+
+  * Tolerate absence of several extensions removed in Mesa 9.2.0
+
+
+
++------------------------------------------------------------------------+
+|                  OpenGL-0.6702
++------------------------------------------------------------------------+
+
+General Notes:
+
+ * This release fixes some minor build issures for Strawberry Perl 32bit
+   where the wrong FreeGLUT library would be linked in---this failed at
+   runtime during the 'perl Makefile.PL' step.
+
+Highlights:
+
+  * Clean up INSTALL, README, and bring more up-to-date.
+
+  * Put util/strawberry.bat under git configuration management.
+
+  * glutCloseFunc() feature has been disabled.  A warning is given
+    the first time the close handler is called.
+
+  * Strawberry perl builds are now detected and the build configuration
+    is corrected.  This should allow for automated builds.
+
+
+
++------------------------------------------------------------------------+
+|                  OpenGL-0.6701
++------------------------------------------------------------------------+
+
+General Notes:
+
+ * This is a work-around release to work around a problem with
+   segfaults during the glutCloseFunc() processing.  Until a
+   real fix is found, the feature has been disabled.
+
+Highlights:
+
+  * glutCloseFunc() feature has been disabled.  A warning is given
+    the first time the close handler is called.
+
+  * Strawberry perl builds are now detected and the build configuration
+    is corrected.  This should allow for automated builds.
+
+
+
++------------------------------------------------------------------------+
+|                  OpenGL-0.67
++------------------------------------------------------------------------+
+
+General Notes:
+
+ * This is a quick bugfix release to work around a build
+   problem for Debian sid on AMD platforms.
+
+Highlights:
+
+  * Comment out failing tests in t/10_opengl_array.t.  Ideally,
+    we could replace this implementation with something using
+    pdls instead.
+
+  * Some GLUT cleanup for POGL
+
+  * Remove GL_TYPE_RGBA_FLOAT_ATI support.  The sid debian build
+    for AMD has problems with this.
+
+  * New example/glxgears.pl ported by Brian Medley (thanks!)
+
+  * Removed OS/2 support code (no longer supported)
+
+  * Various other fixes (see GIT_CHANGES)
+
+
+
++------------------------------------------------------------------------+
 |                  OpenGL-0.66
 +------------------------------------------------------------------------+
 
@@ -13,7 +102,6 @@ General Notes:
 
 
 
-
 +------------------------------------------------------------------------+
 |                  OpenGL-0.65
 +------------------------------------------------------------------------+
@@ -1,30 +1,47 @@
-Last saved: Mon 18 Jul 2011 02:08:52 PM 
+Last saved: Tue 20 Sep 2011 09:52:40 AM 
 
 
-Update POD documentation
-    * OpenGL.pod refer to POGL project at sf.net
-    * Clean up refs to source, bins, information
-    * Deprecate old support and clean up bindings
+Fix segfault in glutMainLoop() for test.pl on vista
+    * Build debug perl for win32
+    * Get gdb for MinGW
+    * Same with MSVC 6.0 and latest
+    * Does same code with Prima::OpenGL not segfault?
 
 
-Remove support for PM on OS/2
-    * Strip out
-    * Add documentation to last version with support
-    * May be moot since GLX needs to go as well
-       * All we need as far as GLX goes is the ability
-         to create an X11 window and context for rendering
-	 via Perl OpenGL.  Should be able to take a GLX
-	 context (Tk embedding, for example)
+Fix current POGL configuration and build process
+    * Clean up use of configuration information
+    * Make the compile and config results unambiguous
+        * Compile flags have two types
+            * System info flags: HAVE_GLX, HAVE_GLUT, ...
+            * Build flags: BUILD_GLUT, BUILD_FREEGLUT, ...
+        * Exactly what libraries are being used
+	* Library versions and locations/paths
+        * What are the compile and link configuration
+	    * split out compile/link by libraries
+	        * OpenGL
+		* GLU
+		* GLUT
+		* GLX
+        * What bindings are actually enabled?
+        * Use the same information to build POGL as glversion
+    * Refactor Makefile.PL to be comprehensible.
+        * strip out unused options
+        * remove include and link directories that do not exist
+        * replace make of glversion by perl based functionality
+        * toolkit option: GLUT and FreeGLUT
+        * interface option: GLX/unix, WGL/win32, [ AGL/CGL? ]
 
 
-Add support for more GLUT variant export control:
-    * :freeglutconstants and :freeglutfunctions
-    * :appleglutconstants and :appleglutfunctions
+Refactor config/build for portability and simplicity
+    * use Module::Build framework
+    * use constant rather than XS constant function
+    * use GLEW and autogeneration for bindings
+        * why does GLEW require GLX_VERSION_1_2?
 
 
-Make code handle "missing" windows:
-    * Calls glutGetWindow() and assumes win is valid
-    * If win==0, need to handle appropriately and *not* do anything with win
+Miscellaneous portability improvements
+    * Convert malloc() and calloc() calls to Newx(), Newxc(), and Newxz()
+    * Convert free() to Safefree() to match.
 
 
 Resolve ASPerl PPM build problems:
@@ -40,25 +57,29 @@ Evaluate local include directory usage
     * if not, why not
 
 
-Refactor XS files partition
-    * move common macro defs to single place
-    * make separate include headers for RPN, OGA ...
-    * split out constants by library
-    * resplit pogl_gl.xs by function groups
+Evaluate strategy for legacy POGL going forward:
+    * Factor out RPN, OGA, ...
+    * Can implementation be less OGA specific
+    * Support OGA, PDLs, ...
+    * What about using just PDL::Core stuff
 
 
 Enhance CPAN Testers automated testing support
     * Improve diagnostic output for debugging test results
     * Add a "compile and link only" build of POGL
+    * Base on GLEW or GLee implementation
+       * Start with GLEW for more cross-platform
+       * Can implementation be made wrapper library independent?
 
 
 Improve library and headers checks in Makefile.PL
-    * Required libraries are OpenGL and GLUT/FreeGLUT
-        * what about GLU, GLX, others?
+    * Required libraries are OpenGL and a GUI/context providing toolkit
+        * GLUT/FreeGLUT, Prima::OpenGL, GTk+, WxWidgets,...
         * GLUT is available on *all* GLX platforms
 	* Mac OS X has a non-X11 GLUT library with extensions:
 	    * glutCheckLoop()   -- same as glutMainLoopEvent()
 	    * glutWMCloseFunc() -- same as glutCloseFunc()
+        * what about GLU, GLX, others?
     * If libraries and headers are not available exit 0
     * Devel::CheckLib to check
 
@@ -68,22 +89,25 @@ Evaluate backwards compatibility
     * provide feedback info to report issuues
     * primary goal is OpenGL, GLUT, GLU support
     * secondary goal is more perlish interface
+    * move to common, clear choice as default!
 
 
 Clean up glp*() routine support:
     * add friendlier display selection function (glpInitDisplayString?)
     * backwards compatible where possible
     * strip out required GLX or X11 specific code
-    * layer over GLUT environment
+    * layer over GLUT or other GUI/context environment
         * N.B. *GLUT is on *all* GLX systems but may not use GLX
 	* What is needed to support Tk+X11 bindings (just context?)
-	* Is Tk even being used?
 	* Investigate Gtk+ or wxWidgets for embedding
 	* GLUI as an easy, simple starter (performance?)
 
 
 Fix examples/ directory
     * update to use GLUT rather than glp()
+        * make simple toolkit wrapper
+	* hide details of the underlying GUI layer
+	* simplify demo code
     * verify all examples work (most appear to)
     * remove broken cruft
     * redo planets example to be more realistic:
@@ -109,17 +133,20 @@ Add Geometry Shader support
 Add bindings to GLUI
 
 
-Move test apps to t/ subdirectory from test.pl
-    * Split into interactive and non-interactive tests
-    * Skip interactive tests if no OpenGL context
-    * need to test for each major functionality
-        * GL
-        * GLU
-        * GLUT/FreeGLUT
-        * RPN
-        * Array
-        * back compatibility (glp routines)
-    * NOTE: require_ok() and use_ok() don't like $VERSION w git suffix
+Add support for more GLUT variant export control:
+    * Split GLUT into a separate module
+        * I.e., remove GUI dependencies from POGL
+        * Need generic context interface standard
+	* Should be able to use Prima instead
+	* or WxWidgets or GTk or ...
+    * :freeglutconstants and :freeglutfunctions
+    * :appleglutconstants and :appleglutfunctions
+
+
+Make code handle "missing" windows:
+    * This is for OpenGL::GLUT
+    * Calls glutGetWindow() and assumes win is valid
+    * If win==0, need to handle appropriately and *not* do anything with win
 
 
 Implement safe glutInit
@@ -138,6 +165,8 @@ Fix OpenGL/GLUT error handling for perl
         * No return value if not in debug mode (or always undef?)
         * undef for error; 1 for void or vice versa?
     * Add toggle & display of OpenGL errors a la glutReportErrors()
+        * Call glGetError in a loop until no errors returned
+	* Do check for all OpenGL commands
 
 
 Finish perl bindings to remaining FreeGLUT functions:
@@ -150,16 +179,9 @@ Finish perl bindings to remaining FreeGLUT functions:
         * document current function
 
 
-Improve support for non-standard OpenGL configurations
-    * Add command line options for perl Makefile.PL
-        * set CFLAGS and other build options
-        * Make single point override for INCLUDE information
-    * Document how to edit Makefile.PL
-
-
 OpenGLUT support for building
-    * OpenGLUT appears to be a dead project, use FreeGLUT.
-    * OpenGL support not planned at this time
+    * OpenGLUT is a dead project, use FreeGLUT.
+    * Add info to docs re *no* OpenGLUT
 
 
 Make POGL GLUT-proof
@@ -202,13 +224,33 @@ Fix current POGL configuration and build process
 Refactor config/build for portability and simplicity
     * use Module::Build framework
     * use constant rather than XS constant function
+       * Extract GL, GLX, and WGL constants from glew.h, glxew.h and wglew.h
+       * Extract GLU constants from glu.h
+       * Extract GLUT and FreeGLUT from glut.h and freeglut_*.h
+       * Verify that these pre-extracted versions work ok
     * use GLEW and autogeneration for bindings
         * why does GLEW require GLX_VERSION_1_2?
 
 
-Miscellaneous portability improvements
-    * Convert malloc() and calloc() calls to Newx(), Newxc(), and Newxz()
-    * Convert free() to Safefree() to match.
+Move test apps to t/ subdirectory from test.pl
+    * Split into interactive and non-interactive tests
+    * Skip interactive tests if no OpenGL context
+    * need to test for each major functionality
+        * GL
+        * GLU
+        * GLUT/FreeGLUT
+        * RPN
+        * Array
+        * back compatibility (glp routines)
+	* PDL object support
+    * NOTE: require_ok() and use_ok() don't like $VERSION w git suffix
+
+
+Improve support for non-standard OpenGL configurations
+    * Add command line options for perl Makefile.PL
+        * set CFLAGS and other build options
+        * Make single point override for INCLUDE information
+    * Document how to edit Makefile.PL
 
 
 Implement complete matrix test capability
@@ -0,0 +1,291 @@
+#!/usr/bin/perl
+
+# 
+# Ported by: Brian Medley <freesoftware@bmedley.org>
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself. 
+# 
+#
+
+use strict;
+use warnings;
+
+use OpenGL qw/ :all /;
+use OpenGL::Config;
+use Math::Trig;
+
+my ($gear1, $gear2, $gear3);
+my $angle = 0;
+my $view_rotx = 20.0; 
+my $view_roty = 30.0;
+my $view_rotz = 0.0;
+
+# Window and texture IDs, window width and height.
+my $Window_ID;
+my $Window_Width = 640;
+my $Window_Height = 480;
+
+use constant PROGRAM_TITLE => "glxgears.pl";
+use constant M_PI => 3.14159265;
+
+# Inits OpenGL.  Calls our own init function, then passes control onto OpenGL.
+MAIN:
+{
+	glutInit();
+
+	print("CTRL-C to quit\n");
+
+	# To see OpenGL drawing, take out the GLUT_DOUBLE request.
+	glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH | GLUT_ALPHA);
+	# glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_ALPHA);
+
+ 	# skip these MODE checks on win32, they don't work
+	if ($^O ne 'MSWin32' and $OpenGL::Config->{DEFINE} !~ /-DHAVE_W32API/) {
+
+	   if (not glutGet(GLUT_DISPLAY_MODE_POSSIBLE))
+	   {
+	      warn "glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH | GLUT_ALPHA) not possible";
+	      warn "...trying without GLUT_ALPHA";
+	      # try without GLUT_ALPHA
+	      glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
+	      if (not glutGet(GLUT_DISPLAY_MODE_POSSIBLE))
+	      {
+		 warn "glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH) not possible, exiting quietly";
+		 exit 0;
+	      }
+	   }
+	}
+
+	glutInitWindowSize($Window_Width, $Window_Height);
+	$Window_ID = glutCreateWindow( PROGRAM_TITLE );
+
+	# Register the callback function to do the drawing.
+	glutDisplayFunc(\&draw);
+
+	# If there's nothing to do, draw.
+	glutIdleFunc(\&draw);
+
+	# It's a good idea to know when our window's resized.
+	glutReshapeFunc(\&reshape);
+
+	# OK, OpenGL's ready to go.  Let's call our own init function.
+	ourInit($Window_Width, $Window_Height);
+
+	glutMainLoop();
+	exit(0);
+}
+
+sub ourInit
+{
+  my ($Width, $Height) = @_;
+
+   my @pos = ( 5.0, 5.0, 10.0, 0.0 );
+   my @red = ( 0.8, 0.1, 0.0, 1.0 );
+   my @green = ( 0.0, 0.8, 0.2, 1.0 );
+   my @blue = ( 0.2, 0.2, 1.0, 1.0 );
+
+   glLightfv_p(GL_LIGHT0, GL_POSITION, @pos);
+   glEnable(GL_CULL_FACE);
+   glEnable(GL_LIGHTING);
+   glEnable(GL_LIGHT0);
+   glEnable(GL_DEPTH_TEST);
+
+   $gear1 = glGenLists(1);
+   glNewList($gear1, GL_COMPILE);
+   glMaterialfv_s(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, pack("f4", @red));
+   gear(1.0, 4.0, 1.0, 20, 0.7);
+   glEndList();
+
+   $gear2 = glGenLists(1);
+   glNewList($gear2, GL_COMPILE);
+   glMaterialfv_s(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, pack("f4", @green));
+   gear(0.5, 2.0, 2.0, 10, 0.7);
+   glEndList();
+
+   $gear3 = glGenLists(1);
+   glNewList($gear3, GL_COMPILE);
+   glMaterialfv_s(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, pack("f4", @blue));
+   gear(1.3, 2.0, 0.5, 10, 0.7);
+   glEndList();
+
+   glEnable(GL_NORMALIZE);
+
+   reshape($Width, $Height);
+}
+
+sub gear
+{
+   my ($inner_radius, $outer_radius, $width, $teeth, $tooth_depth) = @_;
+   my  $i;
+   my ($r0, $r1, $r2);
+   my ($angle, $da);
+   my ($u, $v, $len);
+
+   $r0 = $inner_radius;
+   $r1 = $outer_radius - $tooth_depth / 2.0;
+   $r2 = $outer_radius + $tooth_depth / 2.0;
+
+   $da = 2.0 * M_PI / $teeth / 4.0;
+
+   glShadeModel(GL_FLAT);
+
+   glNormal3f(0.0, 0.0, 1.0);
+
+   # /* draw front face */
+   glBegin(GL_QUAD_STRIP);
+   for ($i = 0; $i <= $teeth; $i++) {
+      $angle = $i * 2.0 * M_PI / $teeth;
+      glVertex3f($r0 * cos($angle), $r0 * sin($angle), $width * 0.5);
+      glVertex3f($r1 * cos($angle), $r1 * sin($angle), $width * 0.5);
+      if ($i < $teeth) {
+         glVertex3f($r0 * cos($angle), $r0 * sin($angle), $width * 0.5);
+         glVertex3f($r1 * cos($angle + 3 * $da), $r1 * sin($angle + 3 * $da),
+                    $width * 0.5);
+      }
+   }
+   glEnd();
+
+   # /* draw front sides of teeth */
+   glBegin(GL_QUADS);
+   $da = 2.0 * M_PI / $teeth / 4.0;
+   for ($i = 0; $i < $teeth; $i++) {
+      $angle = $i * 2.0 * M_PI / $teeth;
+
+      glVertex3f($r1 * cos($angle), $r1 * sin($angle), $width * 0.5);
+      glVertex3f($r2 * cos($angle + $da), $r2 * sin($angle + $da), $width * 0.5);
+      glVertex3f($r2 * cos($angle + 2 * $da), $r2 * sin($angle + 2 * $da),
+                 $width * 0.5);
+      glVertex3f($r1 * cos($angle + 3 * $da), $r1 * sin($angle + 3 * $da),
+                 $width * 0.5);
+   }
+   glEnd();
+
+   glNormal3f(0.0, 0.0, -1.0);
+
+   # /* draw back face */
+   glBegin(GL_QUAD_STRIP);
+   for ($i = 0; $i <= $teeth; $i++) {
+      $angle = $i * 2.0 * M_PI / $teeth;
+      glVertex3f($r1 * cos($angle), $r1 * sin($angle), -$width * 0.5);
+      glVertex3f($r0 * cos($angle), $r0 * sin($angle), -$width * 0.5);
+      if ($i < $teeth) {
+         glVertex3f($r1 * cos($angle + 3 * $da), $r1 * sin($angle + 3 * $da),
+                    -$width * 0.5);
+         glVertex3f($r0 * cos($angle), $r0 * sin($angle), -$width * 0.5);
+      }
+   }
+   glEnd();
+
+   # /* draw back sides of teeth */
+   glBegin(GL_QUADS);
+   $da = 2.0 * M_PI / $teeth / 4.0;
+   for ($i = 0; $i < $teeth; $i++) {
+      $angle = $i * 2.0 * M_PI / $teeth;
+
+      glVertex3f($r1 * cos($angle + 3 * $da), $r1 * sin($angle + 3 * $da),
+                 -$width * 0.5);
+      glVertex3f($r2 * cos($angle + 2 * $da), $r2 * sin($angle + 2 * $da),
+                 -$width * 0.5);
+      glVertex3f($r2 * cos($angle + $da), $r2 * sin($angle + $da), -$width * 0.5);
+      glVertex3f($r1 * cos($angle), $r1 * sin($angle), -$width * 0.5);
+   }
+   glEnd();
+
+   # /* draw outward faces of teeth */
+   glBegin(GL_QUAD_STRIP);
+   for ($i = 0; $i < $teeth; $i++) {
+      $angle = $i * 2.0 * M_PI / $teeth;
+
+      glVertex3f($r1 * cos($angle), $r1 * sin($angle), $width * 0.5);
+      glVertex3f($r1 * cos($angle), $r1 * sin($angle), -$width * 0.5);
+      $u = $r2 * cos($angle + $da) - $r1 * cos($angle);
+      $v = $r2 * sin($angle + $da) - $r1 * sin($angle);
+      $len = sqrt($u * $u + $v * $v);
+      $u /= $len;
+      $v /= $len;
+      glNormal3f($v, -$u, 0.0);
+      glVertex3f($r2 * cos($angle + $da), $r2 * sin($angle + $da), $width * 0.5);
+      glVertex3f($r2 * cos($angle + $da), $r2 * sin($angle + $da), -$width * 0.5);
+      glNormal3f(cos($angle), sin($angle), 0.0);
+      glVertex3f($r2 * cos($angle + 2 * $da), $r2 * sin($angle + 2 * $da),
+                 $width * 0.5);
+      glVertex3f($r2 * cos($angle + 2 * $da), $r2 * sin($angle + 2 * $da),
+                 -$width * 0.5);
+      $u = $r1 * cos($angle + 3 * $da) - $r2 * cos($angle + 2 * $da);
+      $v = $r1 * sin($angle + 3 * $da) - $r2 * sin($angle + 2 * $da);
+      glNormal3f($v, -$u, 0.0);
+      glVertex3f($r1 * cos($angle + 3 * $da), $r1 * sin($angle + 3 * $da),
+                 $width * 0.5);
+      glVertex3f($r1 * cos($angle + 3 * $da), $r1 * sin($angle + 3 * $da),
+                 -$width * 0.5);
+      glNormal3f(cos($angle), sin($angle), 0.0);
+   }
+
+   glVertex3f($r1 * cos(0), $r1 * sin(0), $width * 0.5);
+   glVertex3f($r1 * cos(0), $r1 * sin(0), -$width * 0.5);
+
+   glEnd();
+
+   glShadeModel(GL_SMOOTH);
+
+   # /* draw inside radius cylinder */
+   glBegin(GL_QUAD_STRIP);
+   for ($i = 0; $i <= $teeth; $i++) {
+      $angle = $i * 2.0 * M_PI / $teeth;
+      glNormal3f(-cos($angle), -sin($angle), 0.0);
+      glVertex3f($r0 * cos($angle), $r0 * sin($angle), -$width * 0.5);
+      glVertex3f($r0 * cos($angle), $r0 * sin($angle), $width * 0.5);
+   }
+   glEnd();
+}
+
+sub draw
+{
+   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+      $angle += 2.0;
+
+   glPushMatrix();
+   glRotatef($view_rotx, 1.0, 0.0, 0.0);
+   glRotatef($view_roty, 0.0, 1.0, 0.0);
+   glRotatef($view_rotz, 0.0, 0.0, 1.0);
+
+   glPushMatrix();
+   glTranslatef(-3.0, -2.0, 0.0);
+   glRotatef($angle, 0.0, 0.0, 1.0);
+   glCallList($gear1);
+   glPopMatrix();
+
+   glPushMatrix();
+   glTranslatef(3.1, -2.0, 0.0);
+   glRotatef(-2.0 * $angle - 9.0, 0.0, 0.0, 1.0);
+   glCallList($gear2);
+   glPopMatrix();
+
+   glPushMatrix();
+   glTranslatef(-3.1, 4.2, 0.0);
+   glRotatef(-2.0 * $angle - 25.0, 0.0, 0.0, 1.0);
+   glCallList($gear3);
+   glPopMatrix();
+
+   glPopMatrix();
+   
+  # Double-buffer and done
+  glutSwapBuffers();
+}
+
+sub reshape
+{
+   my ($width, $height) = @_;
+
+   my $h = $height / $width;
+
+   glViewport(0, 0, $width, $height);
+   glMatrixMode(GL_PROJECTION);
+   glLoadIdentity();
+   glFrustum(-1.0, 1.0, -$h, $h, 5.0, 60.0);
+   glMatrixMode(GL_MODELVIEW);
+   glLoadIdentity();
+   glTranslatef(0.0, 0.0, -40.0);
+}
@@ -22,5 +22,5 @@ glBegin(GL_POLYGON);
 glEnd();
 glpFlush();
 
-print "Program 1-1 Simple, hit control-D to quit:\n\n";
+print "Program 1-1 Simple, hit Enter in terminal window to quit:\n\n";
 glpMainLoop;
@@ -0,0 +1 @@
+planets
@@ -0,0 +1,10 @@
+clip:    glXSwapBuffers;
+double:    glXSwapBuffers;
+fun:	glXSwapBuffers;
+light:    glXSwapBuffers();
+planets:  glXSwapBuffers();
+quest:    glXSwapBuffers;
+quest:    glXSwapBuffers;
+quest:    glXSwapBuffers;
+texhack:    glXSwapBuffers();
+texture:    glXSwapBuffers();
@@ -0,0 +1,191 @@
+#!/usr/bin/perl -w
+
+use strict;
+use OpenGL qw(:all);
+
+use PDL;
+use PDL::Constants qw(PI);
+     $PDL::BIGPDL = 1;
+
+my $pending = 0;
+
+#--- init demo data
+my $tsl      = 60000; # time slices;
+my $channels =  10; # channels to plot
+
+my $time_points  = pdl( sequence( $tsl ) /1000 )->float();
+my $f0   = 2; # Hz
+my $data = pdl( zeroes($channels,$time_points->dim(-1) ) )->float();
+
+    print"---> START init demo data\n";
+    print"     Channels: $channels\n";
+    print"     TSLs    : $tsl\n";
+
+my $t00 = time;
+
+my $f    = pdl( sequence($channels) ) +1 * $f0;
+  # $data.= (sin( $time_points * $f->transpose *2* PI) )->transpose;
+    $data.= (sin( $time_points * $f->transpose * PI) + cos( $time_points
+*  $f->transpose * rand(100) * PI ) )->transpose;
+
+    $t00 = time() - $t00;
+    print"---> DONE init demo data: $t00\n";
+
+
+#---------------------------------------------------------#
+#---- update_plot_pdl_to_vbo     -------------------------#
+#---  copy pdl data to opengl vertex buffer
+#---  generates a sub plot for each channel #---------------------------------------------------------#
+sub update_plot_pdl_to_vbo{
+my ($x,$y) = @_;
+
+    return if ( $pending );
+    $pending = 1;
+my $t00 = time;
+
+#--- init data for vertex buffer obj
+my $data_4_vbo             = pdl( zeroes(2,$data->dim(-1) ) )->float();
+my $data_4_vbo_timepoints  = $data_4_vbo->slice("(0),:");
+my $data_4_vbo_signal      = $data_4_vbo->slice("(1),:");
+    $data_4_vbo_timepoints .= $time_points;
+my $data_vbo               = $data_4_vbo->flat;
+
+my $float_size = 4;
+
+    glClear(GL_COLOR_BUFFER_BIT);
+    glMatrixMode(GL_MODELVIEW);
+    glLoadIdentity();
+    glColor3f(0.0,0.0,1.0);
+
+#--- create OGL verts buffer
+    glDisableClientState(GL_VERTEX_ARRAY);
+
+my $VertexObjID = glGenBuffersARB_p(1);
+    glBindBufferARB(GL_ARRAY_BUFFER_ARB,$VertexObjID);
+
+my $ogl_array = OpenGL::Array->new_scalar(GL_FLOAT,
+$data_vbo->get_dataref,$data_vbo->dim(0)*$float_size);
+    glBufferDataARB_p(GL_ARRAY_BUFFER_ARB,$ogl_array,GL_DYNAMIC_DRAW_ARB);
+    $ogl_array->bind($VertexObjID);
+    glVertexPointer_p(2,$ogl_array);
+    glEnableClientState(GL_VERTEX_ARRAY);
+
+#---start sub plots
+my $w = glutGet( GLUT_WINDOW_WIDTH );
+my $h = glutGet( GLUT_WINDOW_HEIGHT );
+
+my $w0 = 10;
+my $w1 = $w-10;
+
+my $h0 = 0;
+my $dh = int( $h / $data->dim(0) );
+my $h1 = $dh;
+
+my $xmin = $time_points->min;
+my $xmax = $time_points->max;
+my $ymin = $data->min * 1.2;
+my $ymax = $data->max * 1.2;
+
+
+#--- copy data to VBO
+    for ( my $i=0; $i < $data->dim(0); $i++ )
+     {
+
+#--- sub plot window
+       setViewport($w0,$w1,$h0,$h1);
+       setWindow($xmin,$xmax,$ymin,$ymax );
+
+#--- draw zero line
+       glLineWidth(1);
+       glColor3f(1,1,1);
+
+       glBegin(GL_LINES);
+         glVertex2f($xmin,0.0);
+         glVertex2f($xmax,0.0);
+       glEnd();
+
+#--- start drawing signal
+       glLineWidth(2);
+       glColor3f(rand(1), rand(1),1.0);# mix color for each signal
+
+#--- copy pdl data to VBO thank's vividsnow !!!
+       $data_4_vbo_signal .= $data->slice("($i),:");
+       $ogl_array =
+OpenGL::Array->new_scalar(GL_FLOAT,$data_vbo->get_dataref,$data_vbo->dim(0)*$float_size);
+
+       glBufferSubDataARB_p(GL_ARRAY_BUFFER_ARB,0,$ogl_array);
+
+       glDrawArrays(GL_LINE_STRIP,0,$data_4_vbo_timepoints->dim(-1)-1 );
+
+       $h0 += $dh;
+       $h1 += $dh + 1;
+
+      } # for
+
+   glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
+   glDisableClientState(GL_VERTEX_ARRAY);
+
+   glFlush();
+   glutSwapBuffers();
+
+   $pending = undef;
+
+   $t00 = time() - $t00;
+
+   print" done  <update_plot_pdl_to_vbo> Time to update: $t00\n";
+
+} # end of update_plot_pdl_to_vbo
+
+
+#---------------------------------------------------------#
+#---- setWindow                  -------------------------#
+#---------------------------------------------------------#
+sub setWindow{
+my ($l,$r,$b,$t) = @_;
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  gluOrtho2D($l,$r,$b,$t);
+} # end of setWindow
+
+#---------------------------------------------------------#
+#---- setViewport                -------------------------#
+#---------------------------------------------------------#
+sub setViewport{
+my ($l,$r,$b,$t) = @_;
+  glViewport($l,$b,$r-$l,$t-$b);
+}# end of setViewport
+
+#---------------------------------------------------------#
+#---- myReshape                  -------------------------#
+#---------------------------------------------------------#
+sub myReshape{
+
+my($w,$h) = @_;
+
+return if (  $pending );
+
+glViewport(0,0,$w,$h);
+glMatrixMode(GL_PROJECTION);
+glLoadIdentity();
+gluOrtho2D(0.0,$w,0.0,$h);
+
+} # end of reshape
+
+
+#=== MAIN ===============================================
+glClearColor(1.0,1.0,1.0,0.0);
+glColor3f(0.0,0.0,1.0);
+glLineWidth(2);
+
+glutInit();
+
+glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_ALPHA);
+
+glutInitWindowSize(300,400);
+glutInitWindowPosition(10,10);
+
+my $IDwindow = glutCreateWindow("PDL OGL TEST"); glutDisplayFunc( sub{ update_plot_pdl_to_vbo(@_) } );
+
+glutReshapeFunc( sub{ myReshape(@_) } );
+
+glutMainLoop();
@@ -0,0 +1,1200 @@
+char * gluErrorString(error)
+char * gluGetString(name)
+
+int glpHasGLUT()
+int glpHasGPGPU()
+int glpRasterFont(name,base,number,d)
+int glpXNextEvent(d=dpy)
+
+int glutBitmapHeight(font)
+int glutBitmapLength(font, string)
+int glutBitmapWidth(font, character)
+int glutCreateMenu(handler=0, ...)
+int glutCreateSubWindow(win, x, y, width, height)
+int glutCreateWindow(name)
+int glutDeviceGet(info)
+int glutEnterGameMode()
+int glutExtensionSupported(extension)
+int glutGameModeGet(mode)
+int glutGet(state)
+int glutGetMenu()
+int glutGetModifiers()
+int glutGetWindow()
+int glutLayerGet(info)
+int glutStrokeWidth(font, character)
+
+static SV * neoconstant(char * name, int arg)
+static int not_here(s)
+
+glAccum(op, value)
+glActiveTextureARB(texture)
+glAlphaFunc(func, ref)
+glAreTexturesResidentEXT_p(...)
+glAreTexturesResident_c(n, textures, residences)
+glAreTexturesResident_p(...)
+glAreTexturesResident_s(n, textures, residences)
+glArrayElement(i)
+glArrayElementEXT(i)
+glAttachObjectARB(containerObj, obj)
+glBegin(mode)
+glBindAttribLocationARB(programObj, index, name)
+glBindBufferARB(target,buffer)
+glBindFramebufferEXT(target,framebuffer)
+glBindProgramARB(target,program)
+glBindRenderbufferEXT(target,renderbuffer)
+glBindTexture(target, texture)
+glBindTextureEXT(target, texture)
+glBitmap_c(width, height, xorig, yorig, xmove, ymove, bitmap)
+glBitmap_p(width, height, xorig, yorig, xmove, ymove, ...)
+glBitmap_s(width, height, xorig, yorig, xmove, ymove, bitmap)
+glBlendColor(red, green, blue, alpha)
+glBlendColorEXT(red, green, blue, alpha)
+glBlendEquation(mode)
+glBlendEquationEXT(mode)
+glBlendFunc(sfactor, dfactor)
+glBufferDataARB_c(target,size,data,usage)
+glBufferDataARB_p(target,oga,usage)
+glBufferDataARB_s(target,size,data,usage)
+glBufferSubDataARB_c(target,offset,size,data)
+glBufferSubDataARB_p(target,offset,oga)
+glBufferSubDataARB_s(target,offset,size,data)
+glCallList(list)
+glCallLists_c(n, type, lists)
+glCallLists_p(...)
+glCallLists_s(n, type, lists)
+glCheckFramebufferStatusEXT(target)
+glClampColorARB(target,clamp)
+glClear(mask)
+glClearAccum(red, green, blue, alpha)
+glClearColor(red, green, blue, alpha)
+glClearDepth(depth)
+glClearIndex(c)
+glClearStencil(s)
+glClientActiveTextureARB(texture)
+glClipPlane_c(plane, eqn)
+glClipPlane_p(plane, eqn0, eqn1, eqn2, eqn3)
+glClipPlane_s(plane, eqn)
+glColor3b(red, green, blue)
+glColor3bv_c(v)
+glColor3bv_p(red, green, blue)
+glColor3bv_s(v)
+glColor3d(red, green, blue)
+glColor3dv_c(v)
+glColor3dv_p(red, green, blue)
+glColor3dv_s(v)
+glColor3f(red, green, blue)
+glColor3fv_c(v)
+glColor3fv_p(red, green, blue)
+glColor3fv_s(v)
+glColor3i(red, green, blue)
+glColor3iv_c(v)
+glColor3iv_p(red, green, blue)
+glColor3iv_s(v)
+glColor3s(red, green, blue)
+glColor3sv_c(v)
+glColor3sv_p(red, green, blue)
+glColor3sv_s(v)
+glColor3ub(red, green, blue)
+glColor3ubv_c(v)
+glColor3ubv_p(red, green, blue)
+glColor3ubv_s(v)
+glColor3ui(red, green, blue)
+glColor3uiv_c(v)
+glColor3uiv_p(red, green, blue)
+glColor3uiv_s(v)
+glColor3us(red, green, blue)
+glColor3usv_c(v)
+glColor3usv_p(red, green, blue)
+glColor3usv_s(v)
+glColor4b(red, green, blue, alpha)
+glColor4bv_c(v)
+glColor4bv_p(red, green, blue, alpha)
+glColor4bv_s(v)
+glColor4d(red, green, blue, alpha)
+glColor4dv_c(v)
+glColor4dv_p(red, green, blue, alpha)
+glColor4dv_s(v)
+glColor4f(red, green, blue, alpha)
+glColor4fv_c(v)
+glColor4fv_p(red, green, blue, alpha)
+glColor4fv_s(v)
+glColor4i(red, green, blue, alpha)
+glColor4iv_c(v)
+glColor4iv_p(red, green, blue, alpha)
+glColor4iv_s(v)
+glColor4s(red, green, blue, alpha)
+glColor4sv_c(v)
+glColor4sv_p(red, green, blue, alpha)
+glColor4sv_s(v)
+glColor4ub(red, green, blue, alpha)
+glColor4ubv_c(v)
+glColor4ubv_p(red, green, blue, alpha)
+glColor4ubv_s(v)
+glColor4ui(red, green, blue, alpha)
+glColor4uiv_c(v)
+glColor4uiv_p(red, green, blue, alpha)
+glColor4uiv_s(v)
+glColor4us(red, green, blue, alpha)
+glColor4usv_c(v)
+glColor4usv_p(red, green, blue, alpha)
+glColor4usv_s(v)
+glColorMask(red, green, blue, alpha)
+glColorMaterial(face, mode)
+glColorPointerEXT_c(size, type, stride, count, pointer)
+glColorPointerEXT_oga(size, oga)
+glColorPointerEXT_s(size, type, stride, count, pointer)
+glColorPointer_c(size, type, stride, pointer)
+glColorPointer_p(size, oga)
+glColorPointer_s(size, type, stride, pointer)
+glCompileShaderARB(shaderObj)
+glCopyPixels(x, y, width, height, type)
+glCopyTexImage1D(target, level, internalFormat, x, y, width, border)
+glCopyTexImage1DEXT(target, level, internalFormat, x, y, width, border)
+glCopyTexImage2D(target, level, internalFormat, x, y, width, height, border)
+glCopyTexImage2DEXT(target, level, internalFormat, x, y, width, height, border)
+glCopyTexSubImage1D(target, level, xoffset, x, y, width)
+glCopyTexSubImage1DEXT(target, level, xoffset, x, y, width)
+glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height)
+glCopyTexSubImage2DEXT(target, level, xoffset, yoffset, x, y, width, height)
+glCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height)
+glCopyTexSubImage3DEXT(target, level, xoffset, yoffset, zoffset, x, y, width, height)
+glCreateProgramObjectARB()
+glCreateShaderObjectARB(shaderType)
+glCullFace(mode)
+glDeleteBuffersARB_c(n,buffers)
+glDeleteBuffersARB_p(...)
+glDeleteBuffersARB_s(n,buffers)
+glDeleteFramebuffersEXT_c(n,framebuffers)
+glDeleteFramebuffersEXT_p(...)
+glDeleteFramebuffersEXT_s(n,framebuffers)
+glDeleteLists(list, range)
+glDeleteObjectARB(obj)
+glDeleteProgramsARB_c(n,programs)
+glDeleteProgramsARB_p(...)
+glDeleteProgramsARB_s(n,programs)
+glDeleteRenderbuffersEXT_c(n,renderbuffers)
+glDeleteRenderbuffersEXT_p(...)
+glDeleteRenderbuffersEXT_s(n,renderbuffers)
+glDeleteTexturesEXT_p(...);
+glDeleteTextures_c(items, list)
+glDeleteTextures_p(...)
+glDeleteTextures_s(items, list)
+glDepthFunc(func)
+glDepthMask(flag)
+glDepthRange(zNear, zFar)
+glDetachObjectARB(containerObj, attachedObj)
+glDisable(cap)
+glDisableClientState(cap)
+glDisableVertexAttribArrayARB(index)
+glDrawArrays(mode, first, count)
+glDrawArraysEXT(mode, first, count)
+glDrawBuffer(mode)
+glDrawBuffersARB_c(n,buffers)
+glDrawBuffersARB_p(...)
+glDrawBuffersARB_s(n,buffers)
+glDrawBuffers_c(n,buffers)
+glDrawBuffers_p(...)
+glDrawBuffers_s(n,buffers)
+glDrawElements_c(mode, count, type, indices)
+glDrawElements_p(mode, ...)
+glDrawElements_s(mode, count, type, indices)
+glDrawPixels_c(width, height, format, type, pixels)
+glDrawPixels_p(width, height, format, type, ...)
+glDrawPixels_s(width, height, format, type, pixels)
+glDrawRangeElements_c(mode, start, end, count, type, indices)
+glDrawRangeElements_p(mode, start, count, ...)
+glDrawRangeElements_s(mode, start, end, count, type, indices)
+glEdgeFlag(flag)
+glEdgeFlagPointerEXT_c(stride, count, pointer)
+glEdgeFlagPointerEXT_oga(oga)
+glEdgeFlagPointerEXT_s(stride, count, pointer)
+glEdgeFlagPointer_c(stride, pointer)
+glEdgeFlagPointer_p(oga)
+glEdgeFlagPointer_s(stride, pointer)
+glEnable(cap)
+glEnableClientState(cap)
+glEnableVertexAttribArrayARB(index)
+glEnd()
+glEndList()
+glEvalCoord1d(u)
+glEvalCoord1f(u)
+glEvalCoord2d(u, v)
+glEvalCoord2f(u, v)
+glEvalMesh1(mode, i1, i2)
+glEvalMesh2(mode, i1, i2, j1, j2)
+glEvalPoint1(i)
+glEvalPoint2(i, j)
+glFeedbackBuffer_c(size, type, buffer)
+glFinish()
+glFlush()
+glFogf(pname, param)
+glFogfv_c(pname, params)
+glFogfv_p(pname, param1, param2=0, param3=0, param4=0)
+glFogfv_s(pname, params)
+glFogi(pname, param)
+glFogiv_c(pname, params)
+glFogiv_p(pname, param1, param2=0, param3=0, param4=0)
+glFogiv_s(pname, params)
+glFramebufferRenderbufferEXT(target,attachment,renderbuffertarget,renderbuffer)
+glFramebufferTexture1DEXT(target,attachment,textarget,texture,level)
+glFramebufferTexture2DEXT(target,attachment,textarget,texture,level)
+glFramebufferTexture3DEXT(target,attachment,textarget,texture,level,zoffset)
+glFrontFace(mode)
+glFrustum(left, right, bottom, top, zNear, zFar)
+glGenBuffersARB_c(n,buffers)
+glGenBuffersARB_p(n)
+glGenBuffersARB_s(n,buffers)
+glGenFramebuffersEXT_c(n,framebuffers)
+glGenFramebuffersEXT_p(n)
+glGenFramebuffersEXT_s(n,framebuffers)
+glGenLists(range)
+glGenProgramsARB_c(n,programs)
+glGenProgramsARB_p(n)
+glGenProgramsARB_s(n,programs)
+glGenRenderbuffersEXT_c(n,renderbuffers)
+glGenRenderbuffersEXT_p(n)
+glGenRenderbuffersEXT_s(n,renderbuffers)
+glGenTexturesEXT_p(n)
+glGenTextures_c(n, textures)
+glGenTextures_p(n)
+glGenTextures_s(n, textures)
+glGenerateMipmapEXT(target)
+glGetActiveAttribARB_c(programObj, index, maxLength, length, size, type, name)
+glGetActiveAttribARB_p(programObj, index)
+glGetActiveAttribARB_s(programObj, index, maxLength, length, size, type, name)
+glGetActiveUniformARB_c(programObj, index, maxLength, length, size, type, name)
+glGetActiveUniformARB_p(programObj, index)
+glGetActiveUniformARB_s(programObj, index, maxLength, length, size, type, name)
+glGetAttachedObjectsARB_c(containerObj, maxCount, count, obj)
+glGetAttachedObjectsARB_p(containerObj)
+glGetAttachedObjectsARB_s(containerObj, maxCount, count, obj)
+glGetAttribLocationARB_c(programObj, name)
+glGetAttribLocationARB_p(programObj, ...)
+glGetBooleanv_c(pname, params)
+glGetBooleanv_p(param)
+glGetBooleanv_s(pname, params)
+glGetBufferParameterivARB_c(target,pname,params)
+glGetBufferParameterivARB_p(target,pname)
+glGetBufferParameterivARB_s(target,pname,params)
+glGetBufferPointervARB_c(target,pname,params)
+glGetBufferPointervARB_p(target,pname,...)
+glGetBufferPointervARB_s(target,pname,params)
+glGetBufferSubDataARB_c(target,offset,size,data)
+glGetBufferSubDataARB_p(target,offset,count,...)
+glGetBufferSubDataARB_s(target,offset,size,data)
+glGetClipPlane_c(plane, eqn)
+glGetClipPlane_p(plane)
+glGetClipPlane_s(plane, eqn)
+glGetDoublev_c(pname, params)
+glGetDoublev_p(param)
+glGetDoublev_s(pname, params)
+glGetError()
+glGetFloatv_c(pname, params)
+glGetFloatv_p(param)
+glGetFloatv_s(pname, params)
+glGetFramebufferAttachmentParameterivEXT_c(target,attachment,pname,params)
+glGetFramebufferAttachmentParameterivEXT_s(target,attachment,pname,params)
+glGetHandleARB(pname)
+glGetInfoLogARB_c(obj, maxLength, length, infoLog)
+glGetInfoLogARB_p(obj)
+glGetIntegerv_c(pname, params)
+glGetIntegerv_p(param)
+glGetIntegerv_s(pname, params)
+glGetLightfv_c(light, pname, p)
+glGetLightfv_p(light, pname)
+glGetLightfv_s(light, pname, p)
+glGetLightiv_c(light, pname, p)
+glGetLightiv_p(light, pname)
+glGetLightiv_s(light, pname, p)
+glGetMapdv_c(target, query, v)
+glGetMapdv_p(target, query)
+glGetMapdv_s(target, query, v)
+glGetMapfv_c(target, query, v)
+glGetMapfv_p(target, query)
+glGetMapfv_s(target, query, v)
+glGetMapiv_c(target, query, v)
+glGetMapiv_p(target, query)
+glGetMapiv_s(target, query, v)
+glGetMaterialfv_c(face, query, params)
+glGetMaterialfv_p(face, query)
+glGetMaterialfv_s(face, query, params)
+glGetMaterialiv_c(face, query, params)
+glGetMaterialiv_p(face, query)
+glGetMaterialiv_s(face, query, params)
+glGetObjectParameterfvARB_c(obj,pname,params)
+glGetObjectParameterfvARB_p(obj,pname)
+glGetObjectParameterfvARB_s(obj,pname,params)
+glGetObjectParameterivARB_c(obj,pname,params)
+glGetObjectParameterivARB_p(obj,pname)
+glGetObjectParameterivARB_s(obj,pname,params)
+glGetPixelMapfv_c(map, values)
+glGetPixelMapfv_p(map)
+glGetPixelMapfv_s(map, values)
+glGetPixelMapuiv_c(map, values)
+glGetPixelMapuiv_p(map)
+glGetPixelMapuiv_s(map, values)
+glGetPixelMapusv_c(map, values)
+glGetPixelMapusv_p(map)
+glGetPixelMapusv_s(map, values)
+glGetPointerv_c(pname, params)
+glGetPointerv_p(pname)
+glGetPointerv_s(pname, params)
+glGetPolygonStipple_c(mask)
+glGetPolygonStipple_p()
+glGetPolygonStipple_s(mask)
+glGetProgramEnvParameterdvARB_c(target,index,params)
+glGetProgramEnvParameterdvARB_p(target,index)
+glGetProgramEnvParameterdvARB_s(target,index,params)
+glGetProgramEnvParameterfvARB_c(target,index,params)
+glGetProgramEnvParameterfvARB_p(target,index)
+glGetProgramEnvParameterfvARB_s(target,index,params)
+glGetProgramLocalParameterdvARB_c(target,index,params)
+glGetProgramLocalParameterdvARB_p(target,index)
+glGetProgramLocalParameterdvARB_s(target,index,params)
+glGetProgramLocalParameterfvARB_c(target,index,params)
+glGetProgramLocalParameterfvARB_p(target,index)
+glGetProgramLocalParameterfvARB_s(target,index,params)
+glGetProgramStringARB_c(target,pname,string)
+glGetProgramStringARB_p(target,pname=GL_PROGRAM_STRING_ARB)
+glGetProgramStringARB_s(target,pname,string)
+glGetProgramivARB_c(target,pname,params)
+glGetProgramivARB_p(target,pname)
+glGetProgramivARB_s(target,pname,params)
+glGetRenderbufferParameterivEXT_c(target,pname,params)
+glGetRenderbufferParameterivEXT_s(target,pname,params)
+glGetShaderSourceARB_c(obj, maxLength, length, source)
+glGetShaderSourceARB_p(obj)
+glGetString(name)
+glGetTexEnvfv_c(target, pname, params)
+glGetTexEnvfv_p(target, pname)
+glGetTexEnvfv_s(target, pname, params)
+glGetTexEnviv_c(target, pname, params)
+glGetTexEnviv_p(target, pname)
+glGetTexEnviv_s(target, pname, params)
+glGetTexGendv_c(coord, pname, params)
+glGetTexGendv_p(coord, pname)
+glGetTexGendv_s(coord, pname, params)
+glGetTexGenfv_c(coord, pname, params)
+glGetTexGenfv_p(coord, pname)
+glGetTexGenfv_s(coord, pname, params)
+glGetTexGeniv_c(coord, pname, params)
+glGetTexGeniv_p(coord, pname)
+glGetTexGeniv_s(coord, pname, params)
+glGetTexImage_c(target, level, format, type, pixels)
+glGetTexImage_p(target, level, format, type)
+glGetTexImage_s(target, level, format, type, pixels)
+glGetTexLevelParameterfv_c(target, level, pname, params)
+glGetTexLevelParameterfv_p(target, level, pname)
+glGetTexLevelParameterfv_s(target, level, pname, params)
+glGetTexLevelParameteriv_c(target, level, pname, params)
+glGetTexLevelParameteriv_p(target, level, pname)
+glGetTexLevelParameteriv_s(target, level, pname, params)
+glGetTexParameterfv_c(target, pname, params)
+glGetTexParameterfv_p(target, pname)
+glGetTexParameterfv_s(target, pname, params)
+glGetTexParameteriv_c(target, pname, params)
+glGetTexParameteriv_p(target, pname)
+glGetTexParameteriv_s(target, pname, params)
+glGetUniformLocationARB_c(programObj, name)
+glGetUniformLocationARB_p(programObj, ...)
+glGetUniformfvARB_c(programObj, location, params)
+glGetUniformfvARB_p(programObj, location, count=1)
+glGetUniformivARB_c(programObj, location, params)
+glGetUniformivARB_p(programObj, location, count=1)
+glGetVertexAttribPointervARB_c(index,pname,pointer)
+glGetVertexAttribPointervARB_p(index,pname)
+glGetVertexAttribdvARB_c(index,pname,params)
+glGetVertexAttribdvARB_p(index,pname)
+glGetVertexAttribdvARB_s(index,pname,params)
+glGetVertexAttribfvARB_c(index,pname,params)
+glGetVertexAttribfvARB_p(index,pname)
+glGetVertexAttribfvARB_s(index,pname,params)
+glGetVertexAttribivARB_c(index,pname,params)
+glGetVertexAttribivARB_p(index,pname)
+glGetVertexAttribivARB_s(index,pname,params)
+glHint(target, mode)
+glIndexMask(mask)
+glIndexPointerEXT_c(type, stride, count, pointer)
+glIndexPointerEXT_p(oga)
+glIndexPointerEXT_s(type, stride, count, pointer)
+glIndexPointer_c(type, stride, pointer)
+glIndexPointer_p(oga)
+glIndexPointer_s(type, stride, pointer)
+glIndexd(c)
+glIndexi(c)
+glInitNames()
+glInterleavedArrays_c(format, stride, pointer)
+glIsBufferARB(buffer)
+glIsEnabled(cap)
+glIsFramebufferEXT(framebuffer)
+glIsList(list)
+glIsProgramARB(program)
+glIsRenderbufferEXT(renderbuffer)
+glIsTexture(list)
+glIsTextureEXT(list)
+glLightModelf(pname, param)
+glLightModelfv_c(pname, params)
+glLightModelfv_p(pname, ...)
+glLightModelfv_s(pname, params)
+glLightModeli(pname, param)
+glLightModeliv_c(pname, params)
+glLightModeliv_p(pname, ...)
+glLightModeliv_s(pname, params)
+glLightf(light, pname, param)
+glLightfv_c(light, pname, params)
+glLightfv_p(light, pname, ...)
+glLightfv_s(light, pname, params)
+glLighti(light, pname, param)
+glLightiv_c(light, pname, params)
+glLightiv_p(light, pname, ...)
+glLightiv_s(light, pname, params)
+glLineStipple(factor, pattern)
+glLineWidth(width)
+glLinkProgramARB(programObj)
+glListBase(base)
+glLoadIdentity()
+glLoadMatrixd_c(m)
+glLoadMatrixd_p(...)
+glLoadMatrixd_s(m)
+glLoadMatrixf_c(m)
+glLoadMatrixf_p(...)
+glLoadMatrixf_s(m)
+glLoadName(name)
+glLogicOp(opcode)
+glMap1d_c(target, u1, u2, stride, order, points)
+glMap1d_p(target, u1, u2, ...)
+glMap1d_s(target, u1, u2, stride, order, points)
+glMap1f_c(target, u1, u2, stride, order, points)
+glMap1f_p(target, u1, u2, ...)
+glMap1f_s(target, u1, u2, stride, order, points)
+glMap2d_c(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points)
+glMap2d_p(target, u1, u2, uorder, v1, v2, ...)
+glMap2d_s(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points)
+glMap2f_c(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points)
+glMap2f_p(target, u1, u2, uorder, v1, v2, ...)
+glMap2f_s(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points)
+glMapBufferARB_c(target,access)
+glMapBufferARB_p(target,access,...)
+glMapGrid1d(un, u1, u2)
+glMapGrid1f(un, u1, u2)
+glMapGrid2d(un, u1, u2, vn, v1, v2)
+glMapGrid2f(un, u1, u2, vn, v1, v2)
+glMaterialf(face, pname, param)
+glMaterialfv_c(face, pname, param)
+glMaterialfv_p(face, pname, ...)
+glMaterialfv_s(face, pname, param)
+glMateriali(face, pname, param)
+glMaterialiv_c(face, pname, param)
+glMaterialiv_p(face, pname, ...)
+glMaterialiv_s(face, pname, param)
+glMatrixMode(mode)
+glMultMatrixd_p(...)
+glMultMatrixf_p(...)
+glMultiTexCoord1dARB(target,s)
+glMultiTexCoord1dvARB_c(target,v)
+glMultiTexCoord1dvARB_p(target,s)
+glMultiTexCoord1dvARB_s(target,v)
+glMultiTexCoord1fARB(target,s)
+glMultiTexCoord1fvARB_c(target,v)
+glMultiTexCoord1fvARB_p(target,s)
+glMultiTexCoord1fvARB_s(target,v)
+glMultiTexCoord1iARB(target,s)
+glMultiTexCoord1ivARB_c(target,v)
+glMultiTexCoord1ivARB_p(target,s)
+glMultiTexCoord1ivARB_s(target,v)
+glMultiTexCoord1sARB(target,s)
+glMultiTexCoord1svARB_c(target,v)
+glMultiTexCoord1svARB_p(target,s)
+glMultiTexCoord1svARB_s(target,v)
+glMultiTexCoord2dARB(target,s,t)
+glMultiTexCoord2dvARB_c(target,v)
+glMultiTexCoord2dvARB_p(target,s,t)
+glMultiTexCoord2dvARB_s(target,v)
+glMultiTexCoord2fARB(target,s,t)
+glMultiTexCoord2fvARB_c(target,v)
+glMultiTexCoord2fvARB_p(target,s,t)
+glMultiTexCoord2fvARB_s(target,v)
+glMultiTexCoord2iARB(target,s,t)
+glMultiTexCoord2ivARB_c(target,v)
+glMultiTexCoord2ivARB_p(target,s,t)
+glMultiTexCoord2ivARB_s(target,v)
+glMultiTexCoord2sARB(target,s,t)
+glMultiTexCoord2svARB_c(target,v)
+glMultiTexCoord2svARB_p(target,s,t)
+glMultiTexCoord2svARB_s(target,v)
+glMultiTexCoord3dARB(target,s,t,r)
+glMultiTexCoord3dvARB_c(target,v)
+glMultiTexCoord3dvARB_p(target,s,t,r)
+glMultiTexCoord3dvARB_s(target,v)
+glMultiTexCoord3fARB(target,s,t,r)
+glMultiTexCoord3fvARB_c(target,v)
+glMultiTexCoord3fvARB_p(target,s,t,r)
+glMultiTexCoord3fvARB_s(target,v)
+glMultiTexCoord3iARB(target,s,t,r)
+glMultiTexCoord3ivARB_c(target,v)
+glMultiTexCoord3ivARB_p(target,s,t,r)
+glMultiTexCoord3ivARB_s(target,v)
+glMultiTexCoord3sARB(target,s,t,r)
+glMultiTexCoord3svARB_c(target,v)
+glMultiTexCoord3svARB_p(target,s,t,r)
+glMultiTexCoord3svARB_s(target,v)
+glMultiTexCoord4dARB(target,s,t,r,q)
+glMultiTexCoord4dvARB_c(target,v)
+glMultiTexCoord4dvARB_p(target,s,t,r,q)
+glMultiTexCoord4dvARB_s(target,v)
+glMultiTexCoord4fARB(target,s,t,r,q)
+glMultiTexCoord4fvARB_c(target,v)
+glMultiTexCoord4fvARB_p(target,s,t,r,q)
+glMultiTexCoord4fvARB_s(target,v)
+glMultiTexCoord4iARB(target,s,t,r,q)
+glMultiTexCoord4ivARB_c(target,v)
+glMultiTexCoord4ivARB_p(target,s,t,r,q)
+glMultiTexCoord4ivARB_s(target,v)
+glMultiTexCoord4sARB(target,s,t,r,q)
+glMultiTexCoord4svARB_c(target,v)
+glMultiTexCoord4svARB_p(target,s,t,r,q)
+glMultiTexCoord4svARB_s(target,v)
+glNewList(list, mode)
+glNormal3b(nx, ny, nz)
+glNormal3bv_c(v)
+glNormal3bv_p(nx, ny, nz)
+glNormal3bv_s(v)
+glNormal3d(nx, ny, nz)
+glNormal3dv_c(v)
+glNormal3dv_p(nx, ny, nz)
+glNormal3dv_s(v)
+glNormal3f(nx, ny, nz)
+glNormal3fv_c(v)
+glNormal3fv_p(nx, ny, nz)
+glNormal3fv_s(v)
+glNormal3i(nx, ny, nz)
+glNormal3iv_c(v)
+glNormal3iv_p(nx, ny, nz)
+glNormal3iv_s(v)
+glNormal3s(nx, ny, nz)
+glNormal3sv_c(v)
+glNormal3sv_p(nx, ny, nz)
+glNormal3sv_s(v)
+glNormalPointerEXT_c(type, stride, count, pointer)
+glNormalPointerEXT_p(oga)
+glNormalPointerEXT_s(type, stride, count, pointer)
+glNormalPointer_c(type, stride, pointer)
+glNormalPointer_p(oga)
+glNormalPointer_s(type, stride, pointer)
+glOrtho(left, right, bottom, top, zNear, zFar)
+glPassThrough(token)
+glPixelMapfv_c(map, mapsize, values)
+glPixelMapfv_p(map, ...)
+glPixelMapfv_s(map, mapsize, values)
+glPixelMapuiv_c(map, mapsize, values)
+glPixelMapuiv_p(map, ...)
+glPixelMapuiv_s(map, mapsize, values)
+glPixelMapusv_c(map, mapsize, values)
+glPixelMapusv_p(map, ...)
+glPixelMapusv_s(map, mapsize, values)
+glPixelStoref(pname, param)
+glPixelStorei(pname, param)
+glPixelTransferf(pname, param)
+glPixelTransferi(pname, param)
+glPixelZoom(xfactor, yfactor)
+glPointParameterfARB(pname,param)
+glPointParameterfvARB_c(pname,params)
+glPointParameterfvARB_p(pname, ...)
+glPointParameterfvARB_s(pname,params)
+glPointSize(size)
+glPolygonMode(face, mode)
+glPolygonOffset(factor, units)
+glPolygonOffsetEXT(factor, bias)
+glPolygonStipple_c(mask)
+glPolygonStipple_p(...)
+glPolygonStipple_s(mask)
+glPopAttrib()
+glPopClientAttrib()
+glPopMatrix()
+glPopName()
+glPrioritizeTexturesEXT_p(...)
+glPrioritizeTextures_c(n, textures, priorities)
+glPrioritizeTextures_p(...)
+glPrioritizeTextures_s(n, textures, priorities)
+glProgramEnvParameter4dARB(target,index,x,y,z,w)
+glProgramEnvParameter4dvARB_c(target,index,v)
+glProgramEnvParameter4dvARB_p(target,index,x,y,z,w)
+glProgramEnvParameter4dvARB_s(target,index,v)
+glProgramEnvParameter4fARB(target,index,x,y,z,w)
+glProgramEnvParameter4fvARB_c(target,index,v)
+glProgramEnvParameter4fvARB_p(target,index,x,y,z,w)
+glProgramEnvParameter4fvARB_s(target,index,v)
+glProgramLocalParameter4dARB(target,index,x,y,z,w)
+glProgramLocalParameter4dvARB_c(target,index,v)
+glProgramLocalParameter4dvARB_p(target,index,x,y,z,w)
+glProgramLocalParameter4dvARB_s(target,index,v)
+glProgramLocalParameter4fARB(target,index,x,y,z,w)
+glProgramLocalParameter4fvARB_c(target,index,v)
+glProgramLocalParameter4fvARB_p(target,index,x,y,z,w)
+glProgramLocalParameter4fvARB_s(target,index,v)
+glProgramStringARB_c(target,format,len,string)
+glProgramStringARB_p(target,string)
+glProgramStringARB_s(target,format,len,string)
+glPushAttrib(mask)
+glPushClientAttrib(mask)
+glPushMatrix()
+glPushName(name)
+glRasterPos2d(x, y)
+glRasterPos2dv_c(v)
+glRasterPos2dv_p(x, y)
+glRasterPos2dv_s(v)
+glRasterPos2f(x, y)
+glRasterPos2fv_c(v)
+glRasterPos2fv_p(x, y)
+glRasterPos2fv_s(v)
+glRasterPos2i(x, y)
+glRasterPos2iv_c(v)
+glRasterPos2iv_p(x, y)
+glRasterPos2iv_s(v)
+glRasterPos2s(x, y)
+glRasterPos2sv_c(v)
+glRasterPos2sv_p(x, y)
+glRasterPos2sv_s(v)
+glRasterPos3d(x, y, z)
+glRasterPos3dv_c(v)
+glRasterPos3dv_p(x, y, z)
+glRasterPos3dv_s(v)
+glRasterPos3f(x, y, z)
+glRasterPos3fv_c(v)
+glRasterPos3fv_p(x, y, z)
+glRasterPos3fv_s(v)
+glRasterPos3i(x, y, z)
+glRasterPos3iv_c(v)
+glRasterPos3iv_p(x, y, z)
+glRasterPos3iv_s(v)
+glRasterPos3s(x, y, z)
+glRasterPos3sv_c(v)
+glRasterPos3sv_p(x, y, z)
+glRasterPos3sv_s(v)
+glRasterPos4d(x, y, z, w)
+glRasterPos4dv_c(v)
+glRasterPos4dv_p(x, y, z, w)
+glRasterPos4dv_s(v)
+glRasterPos4f(x, y, z, w)
+glRasterPos4fv_c(v)
+glRasterPos4fv_p(x, y, z, w)
+glRasterPos4fv_s(v)
+glRasterPos4i(x, y, z, w)
+glRasterPos4iv_c(v)
+glRasterPos4iv_p(x, y, z, w)
+glRasterPos4iv_s(v)
+glRasterPos4s(x, y, z, w)
+glRasterPos4sv_c(v)
+glRasterPos4sv_p(x, y, z, w)
+glRasterPos4sv_s(v)
+glReadBuffer(mode)
+glReadPixels_c(x, y, width, height, format, type, pixels)
+glReadPixels_p(x, y, width, height, format, type)
+glReadPixels_s(x, y, width, height, format, type, pixels)
+glRectd(x1, y1, x2, y2)
+glRectdv_c(v1, v2)
+glRectdv_s(v1, v2)
+glRectf(x1, y1, x2, y2)
+glRectfv_c(v1, v2)
+glRectfv_s(v1, v2)
+glRecti(x1, y1, x2, y2)
+glRectiv_c(v1, v2)
+glRectiv_s(v1, v2)
+glRects(x1, y1, x2, y2)
+glRectsv_c(v1, v2)
+glRectsv_s(v1, v2)
+glRenderMode(mode)
+glRenderbufferStorageEXT(target,internalformat,width,height)
+glResizeBuffersMESA()
+glRotated(angle, x, y, z)
+glRotatef(angle, x, y, z)
+glSampleCoverageARB(value,invert)
+glScaled(x, y, z)
+glScalef(x, y, z)
+glScissor(x, y, width, height)
+glSelectBuffer_c(size, list)
+glShadeModel(mode)
+glShaderSourceARB_c(shaderObj, count, string, length)
+glShaderSourceARB_p(shaderObj, ...)
+glStencilFunc(func, ref, mask)
+glStencilMask(mask)
+glStencilOp(fail, zfail, zpass)
+glTexCoord1d(s)
+glTexCoord1dv_c(v)
+glTexCoord1dv_p(s)
+glTexCoord1dv_s(v)
+glTexCoord1f(s)
+glTexCoord1fv_c(v)
+glTexCoord1fv_p(s)
+glTexCoord1fv_s(v)
+glTexCoord1i(s)
+glTexCoord1iv_c(v)
+glTexCoord1iv_p(s)
+glTexCoord1iv_s(v)
+glTexCoord1s(s)
+glTexCoord1sv_c(v)
+glTexCoord1sv_p(s)
+glTexCoord1sv_s(v)
+glTexCoord2d(s, t)
+glTexCoord2dv_c(v)
+glTexCoord2dv_p(s, t)
+glTexCoord2dv_s(v)
+glTexCoord2f(s, t)
+glTexCoord2fv_c(v)
+glTexCoord2fv_p(s, t)
+glTexCoord2fv_s(v)
+glTexCoord2i(s, t)
+glTexCoord2iv_c(v)
+glTexCoord2iv_p(s, t)
+glTexCoord2iv_s(v)
+glTexCoord2s(s, t)
+glTexCoord2sv_c(v)
+glTexCoord2sv_p(s, t)
+glTexCoord2sv_s(v)
+glTexCoord3d(s, t, r)
+glTexCoord3dv_c(v)
+glTexCoord3dv_p(s, t, r)
+glTexCoord3dv_s(v)
+glTexCoord3f(s, t, r)
+glTexCoord3fv_c(v)
+glTexCoord3fv_p(s, t, r)
+glTexCoord3fv_s(v)
+glTexCoord3i(s, t, r)
+glTexCoord3iv_c(v)
+glTexCoord3iv_p(s, t, r)
+glTexCoord3iv_s(v)
+glTexCoord3s(s, t, r)
+glTexCoord3sv_c(v)
+glTexCoord3sv_p(s, t, r)
+glTexCoord3sv_s(v)
+glTexCoord4d(s, t, r, q)
+glTexCoord4dv_c(v)
+glTexCoord4dv_p(s, t, r, q)
+glTexCoord4dv_s(v)
+glTexCoord4f(s, t, r, q)
+glTexCoord4fv_c(v)
+glTexCoord4fv_p(s, t, r, q)
+glTexCoord4fv_s(v)
+glTexCoord4i(s, t, r, q)
+glTexCoord4iv_c(v)
+glTexCoord4iv_p(s, t, r, q)
+glTexCoord4iv_s(v)
+glTexCoord4s(s, t, r, q)
+glTexCoord4sv_c(v)
+glTexCoord4sv_p(s, t, r, q)
+glTexCoord4sv_s(v)
+glTexCoordPointerEXT_c(size, type, stride, count, pointer)
+glTexCoordPointerEXT_p(size, oga)
+glTexCoordPointerEXT_s(size, type, stride, count, pointer)
+glTexCoordPointer_c(size, type, stride, pointer)
+glTexCoordPointer_p(size, oga)
+glTexCoordPointer_s(size, type, stride, pointer)
+glTexEnvf(target, pname, param)
+glTexEnvfv_p(target, pname, ...)
+glTexEnvfv_s(target, pname, params)
+glTexEnvi(target, pname, param)
+glTexEnviv_p(target, pname, ...)
+glTexEnviv_s(target, pname, params)
+glTexGend(Coord, pname, param)
+glTexGendv_c(Coord, pname, params)
+glTexGendv_p(Coord, pname, ...)
+glTexGendv_s(Coord, pname, params)
+glTexGenf(Coord, pname, param)
+glTexGenfv_c(Coord, pname, params)
+glTexGenfv_p(Coord, pname, ...)
+glTexGenfv_s(Coord, pname, params)
+glTexGeni(Coord, pname, param)
+glTexGeniv_c(Coord, pname, params)
+glTexGeniv_p(Coord, pname, ...)
+glTexGeniv_s(Coord, pname, params)
+glTexImage1D_c(target, level, internalformat, width, border, format, type, pixels)
+glTexImage1D_p(target, level, internalformat, width, border, format, type, ...)
+glTexImage1D_s(target, level, internalformat, width, border, format, type, pixels)
+glTexImage2D_c(target, level, internalformat, width, height, border, format, type, pixels)
+glTexImage2D_p(target, level, internalformat, width, height, border, format, type, ...)
+glTexImage2D_s(target, level, internalformat, width, height, border, format, type, pixels)
+glTexImage3DEXT_c(target, level, internalformat, width, height, depth, border, format, type, pixels)
+glTexImage3DEXT_p(target, level, internalformat, width, height, depth, border, format, type, ...)
+glTexImage3DEXT_s(target, level, internalformat, width, height, depth, border, format, type, pixels)
+glTexImage3D_c(target, level, internalformat, width, height, depth, border, format, type, pixels)
+glTexImage3D_p(target, level, internalformat, width, height, depth, border, format, type, ...)
+glTexImage3D_s(target, level, internalformat, width, height, depth, border, format, type, pixels)
+glTexParameterf(target, pname, param)
+glTexParameterfv_c(target, pname, params)
+glTexParameterfv_p(target, pname, ...)
+glTexParameterfv_s(target, pname, params)
+glTexParameteri(target, pname, param)
+glTexParameteriv_c(target, pname, params)
+glTexParameteriv_p(target, pname, ...)
+glTexParameteriv_s(target, pname, params)
+glTexSubImage1DEXT_c(target, level, xoffset, width, format, type, pixels)
+glTexSubImage1DEXT_p(target, level, xoffset, width, format, type, ...)
+glTexSubImage1DEXT_s(target, level, xoffset, width, format, type, pixels)
+glTexSubImage1D_c(target, level, xoffset, width, border, format, type, pixels)
+glTexSubImage1D_p(target, level, xoffset, width, format, type, ...)
+glTexSubImage1D_s(target, level, xoffset, width, format, type, pixels)
+glTexSubImage2DEXT_c(target, level, xoffset, yoffset, width, height, format, type, pixels)
+glTexSubImage2DEXT_p(target, level, xoffset, yoffset, width, height, format, type, ...)
+glTexSubImage2DEXT_s(target, level, xoffset, yoffset, width, height, format, type, pixels)
+glTexSubImage2D_c(target, level, xoffset, yoffset, width, height, format, type, pixels)
+glTexSubImage2D_p(target, level, xoffset, yoffset, width, height, format, type, ...)
+glTexSubImage2D_s(target, level, xoffset, yoffset, width, height, format, type, pixels)
+glTexSubImage3DEXT_c(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels)
+glTexSubImage3DEXT_p(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, ...)
+glTexSubImage3DEXT_s(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels)
+glTexSubImage3D_c(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels)
+glTexSubImage3D_p(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, ...)
+glTexSubImage3D_s(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels)
+glTranslated(x, y, z)
+glTranslatef(x, y, z)
+glUniform1fARB(location, v0)
+glUniform1fvARB_c(location, count, value)
+glUniform1fvARB_p(location, ...)
+glUniform1fvARB_s(location, count, value)
+glUniform1iARB(location, v0)
+glUniform1ivARB_c(location, count, value)
+glUniform1ivARB_p(location, ...)
+glUniform1ivARB_s(location, count, value)
+glUniform2fARB(location, v0, v1)
+glUniform2fvARB_c(location, count, value)
+glUniform2fvARB_p(location, ...)
+glUniform2fvARB_s(location, count, value)
+glUniform2iARB(location, v0, v1)
+glUniform2ivARB_c(location, count, value)
+glUniform2ivARB_p(location, ...)
+glUniform2ivARB_s(location, count, value)
+glUniform3fARB(location, v0, v1, v2)
+glUniform3fvARB_c(location, count, value)
+glUniform3fvARB_p(location, ...)
+glUniform3fvARB_s(location, count, value)
+glUniform3iARB(location, v0, v1, v2)
+glUniform3ivARB_c(location, count, value)
+glUniform3ivARB_p(location, ...)
+glUniform3ivARB_s(location, count, value)
+glUniform4fARB(location, v0, v1, v2, v3)
+glUniform4fvARB_c(location, count, value)
+glUniform4fvARB_p(location, ...)
+glUniform4fvARB_s(location, count, value)
+glUniform4iARB(location, v0, v1, v2, v3)
+glUniform4ivARB_c(location, count, value)
+glUniform4ivARB_p(location, ...)
+glUniform4ivARB_s(location, count, value)
+glUniformMatrix2fvARB_c(location, count, transpose, value)
+glUniformMatrix2fvARB_p(location, transpose, ...)
+glUniformMatrix2fvARB_s(location, count, transpose, value)
+glUniformMatrix3fvARB_c(location, count, transpose, value)
+glUniformMatrix3fvARB_p(location, transpose, ...)
+glUniformMatrix3fvARB_s(location, count, transpose, value)
+glUniformMatrix4fvARB_c(location, count, transpose, value)
+glUniformMatrix4fvARB_p(location, transpose, ...)
+glUniformMatrix4fvARB_s(location, count, transpose, value)
+glUnmapBufferARB(target)
+glUseProgramObjectARB(programObj)
+glValidateProgramARB(programObj)
+glVertex2d(x, y)
+glVertex2dv_c(v)
+glVertex2dv_p(x, y)
+glVertex2dv_s(v)
+glVertex2f(x, y)
+glVertex2fv_c(v)
+glVertex2fv_p(x, y)
+glVertex2fv_s(v)
+glVertex2i(x, y)
+glVertex2iv_c(v)
+glVertex2iv_p(x, y)
+glVertex2iv_s(v)
+glVertex2s(x, y)
+glVertex2sv_c(v)
+glVertex2sv_p(x, y)
+glVertex2sv_s(v)
+glVertex3d(x, y, z)
+glVertex3dv_c(v)
+glVertex3dv_p(x, y, z)
+glVertex3dv_s(v)
+glVertex3f(x, y, z)
+glVertex3fv_c(v)
+glVertex3fv_p(x, y, z)
+glVertex3fv_s(v)
+glVertex3i(x, y, z)
+glVertex3iv_c(v)
+glVertex3iv_p(x, y, z)
+glVertex3iv_s(v)
+glVertex3s(x, y, z)
+glVertex3sv_c(v)
+glVertex3sv_p(x, y, z)
+glVertex3sv_s(v)
+glVertex4d(x, y, z, w)
+glVertex4dv_c(v)
+glVertex4dv_p(x, y, z, w)
+glVertex4dv_s(v)
+glVertex4f(x, y, z, w)
+glVertex4fv_c(v)
+glVertex4fv_p(x, y, z, w)
+glVertex4fv_s(v)
+glVertex4i(x, y, z, w)
+glVertex4iv_c(v)
+glVertex4iv_p(x, y, z, w)
+glVertex4iv_s(v)
+glVertex4s(x, y, z, w)
+glVertex4sv_c(v)
+glVertex4sv_p(x, y, z, w)
+glVertex4sv_s(v)
+glVertexAttrib1dARB(index,x)
+glVertexAttrib1dvARB_c(index,v)
+glVertexAttrib1dvARB_p(index,x)
+glVertexAttrib1dvARB_s(index,v)
+glVertexAttrib1fARB(index,x)
+glVertexAttrib1sARB(index,x)
+glVertexAttrib1svARB_c(index,v)
+glVertexAttrib1svARB_p(index,x)
+glVertexAttrib1svARB_s(index,v)
+glVertexAttrib2dARB(index,x,y)
+glVertexAttrib2dvARB_c(index,v)
+glVertexAttrib2dvARB_p(index,x,y)
+glVertexAttrib2dvARB_s(index,v)
+glVertexAttrib2fARB(index,x,y)
+glVertexAttrib2sARB(index,x,y)
+glVertexAttrib2svARB_c(index,v)
+glVertexAttrib2svARB_p(index,x,y)
+glVertexAttrib2svARB_s(index,v)
+glVertexAttrib3dARB(index,x,y,z)
+glVertexAttrib3dvARB_c(index,v)
+glVertexAttrib3dvARB_p(index,x,y,z)
+glVertexAttrib3dvARB_s(index,v)
+glVertexAttrib3fARB(index,x,y,z)
+glVertexAttrib3fvARB_c(index,v)
+glVertexAttrib3fvARB_p(index,x,y,z)
+glVertexAttrib3fvARB_s(index,v)
+glVertexAttrib3sARB(index,x,y,z)
+glVertexAttrib3svARB_c(index,v)
+glVertexAttrib3svARB_p(index,x,y,z)
+glVertexAttrib3svARB_s(index,v)
+glVertexAttrib4NbvARB_c(index,v)
+glVertexAttrib4NbvARB_p(index,x,y,z,w)
+glVertexAttrib4NbvARB_s(index,v)
+glVertexAttrib4NivARB_c(index,v)
+glVertexAttrib4NivARB_p(index,x,y,z,w)
+glVertexAttrib4NivARB_s(index,v)
+glVertexAttrib4NsvARB_c(index,v)
+glVertexAttrib4NsvARB_p(index,x,y,z,w)
+glVertexAttrib4NsvARB_s(index,v)
+glVertexAttrib4NubARB(index,x,y,z,w)
+glVertexAttrib4NubvARB_c(index,v)
+glVertexAttrib4NubvARB_p(index,x,y,z,w)
+glVertexAttrib4NubvARB_s(index,v)
+glVertexAttrib4NuivARB_c(index,v)
+glVertexAttrib4NuivARB_p(index,x,y,z,w)
+glVertexAttrib4NuivARB_s(index,v)
+glVertexAttrib4NusvARB_c(index,v)
+glVertexAttrib4NusvARB_p(index,x,y,z,w)
+glVertexAttrib4NusvARB_s(index,v)
+glVertexAttrib4bvARB_c(index,v)
+glVertexAttrib4bvARB_p(index,x,y,z,w)
+glVertexAttrib4bvARB_s(index,v)
+glVertexAttrib4dARB(index,x,y,z,w)
+glVertexAttrib4dvARB_c(index,v)
+glVertexAttrib4dvARB_p(index,x,y,z,w)
+glVertexAttrib4dvARB_s(index,v)
+glVertexAttrib4fARB(index,x,y,z,w)
+glVertexAttrib4fvARB_c(index,v)
+glVertexAttrib4fvARB_p(index,x,y,z,w)
+glVertexAttrib4fvARB_s(index,v)
+glVertexAttrib4ivARB_c(index,v)
+glVertexAttrib4ivARB_p(index,x,y,z,w)
+glVertexAttrib4ivARB_s(index,v)
+glVertexAttrib4sARB(index,x,y,z,w)
+glVertexAttrib4svARB_c(index,v)
+glVertexAttrib4svARB_p(index,x,y,z,w)
+glVertexAttrib4svARB_s(index,v)
+glVertexAttrib4ubvARB_c(index,v)
+glVertexAttrib4ubvARB_p(index,x,y,z,w)
+glVertexAttrib4ubvARB_s(index,v)
+glVertexAttrib4uivARB_c(index,v)
+glVertexAttrib4uivARB_p(index,x,y,z,w)
+glVertexAttrib4uivARB_s(index,v)
+glVertexAttrib4usvARB_c(index,v)
+glVertexAttrib4usvARB_p(index,x,y,z,w)
+glVertexAttrib4usvARB_s(index,v)
+glVertexAttribPointerARB_c(index,size,type,normalized,stride,pointer)
+glVertexAttribPointerARB_p(index,type,normalized,stride,...)
+glVertexPointerEXT_c(size, type, stride, count, pointer)
+glVertexPointerEXT_p(size, oga)
+glVertexPointerEXT_s(size, type, stride, count, pointer)
+glVertexPointer_c(size, type, stride, pointer)
+glVertexPointer_p(size, oga)
+glVertexPointer_s(size, type, stride, pointer)
+glViewport(x, y, width, height)
+glWindowPos2dMESA(x, y)
+glWindowPos2iMESA(x, y)
+glWindowPos3dMESA(x, y, z)
+glWindowPos3iMESA(x, y, z)
+glWindowPos4dMESA(x, y, z, w)
+glWindowPos4iMESA(x, y, z, w)
+glXSwapBuffers(w=win,d=dpy)
+
+glpDisplay(name)
+glpMoveResizeWindow(x, y, width, height, w=win, d=dpy)
+glpMoveWindow(x, y, w=win, d=dpy)
+glpPrintString(base,str)
+glpReadTex(file)
+glpResizeWindow(width, height, w=win, d=dpy)
+glpSetDebug(flag)
+glpXQueryPointer(w=win,d=dpy)
+glpcOpenWindow(x,y,w,h,pw,event_mask,steal, ...)
+
+gluBeginCurve(nurb)
+gluBeginPolygon(tess)
+gluBeginSurface(nurb)
+gluBeginTrim(nurb)
+gluBuild1DMipmaps_c(target, internalformat, width, format, type, data)
+gluBuild1DMipmaps_s(target, internalformat, width, format, type, data)
+gluBuild2DMipmaps_c(target, internalformat, width, height, format, type, data)
+gluBuild2DMipmaps_s(target, internalformat, width, height, format, type, data)
+gluCylinder(quad, base, top, height, slices, stacks)
+gluDeleteNurbsRenderer(nurb)
+gluDeleteQuadric(quad)
+gluDeleteTess(tess)
+gluDisk(quad, inner, outer, slices, loops)
+gluEndCurve(nurb)
+gluEndPolygon(tess)
+gluEndSurface(nurb)
+gluEndTrim(nurb)
+gluGetNurbsProperty_p(nurb, property)
+gluGetTessProperty_p(tess, property)
+gluLoadSamplingMatrices_p(nurb, m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16, o1,o2,o3,o4,o5,o6,o7,o8,o9,o10,o11,o12,o13,o14,o15,o16, v1,v2,v3,v4)
+gluLookAt(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ)
+gluNewNurbsRenderer()
+gluNewQuadric()
+gluNewTess(...)
+gluNextContour(tess, type)
+gluNurbsCurve_c(nurb, nknots, knot, stride, ctlarray, order, type)
+gluNurbsProperty(nurb, property, value)
+gluNurbsSurface_c(nurb, sknot_count, sknot, tknot_count, tknot, s_stride, t_stride, ctrlarray, sorder, torder, type)
+gluOrtho2D(left, right, bottom, top)
+gluPartialDisk(quad, inner, outer, slices, loops, start, sweep)
+gluPerspective(fovy, aspect, zNear, zFar)
+gluPickMatrix_p(x, y, delX, delY, m1,m2,m3,m4)
+gluProject_p(objx, objy, objz, m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16, o1,o2,o3,o4,o5,o6,o7,o8,o9,o10,o11,o12,o13,o14,o15,o16, v1,v2,v3,v4)
+gluPwlCurve_c(nurb, count, data, stride, type)
+gluQuadricDrawStyle(quad, draw)
+gluQuadricNormals(quad, normal)
+gluQuadricOrientation(quad, orientation)
+gluQuadricTexture(quad, texture)
+gluScaleImage_s(format, wIn, hIn, typeIn, dataIn, wOut, hOut, typeOut, dataOut)
+gluSphere(quad, radius, slices, stacks)
+gluTessBeginContour(tess)
+gluTessBeginPolygon(tess, ...)
+gluTessCallback(tess, which, ...)
+gluTessEndContour(tess)
+gluTessEndPolygon(tess)
+gluTessNormal(tess, valueX, valueY, valueZ)
+gluTessProperty(tess, which, data)
+gluTessVertex_p(tess, x, y, z, ...)
+gluUnProject_p(winx,winy,winz, m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16, o1,o2,o3,o4,o5,o6,o7,o8,o9,o10,o11,o12,o13,o14,o15,o16, v1,v2,v3,v4)
+
+glutAddMenuEntry(name, value)
+glutAddSubMenu(name, menu)
+glutAttachMenu(button)
+glutBitmapCharacter(font, character)
+glutBitmapString(font, string)
+glutButtonBoxFunc(handler=0, ...)
+glutChangeToMenuEntry(entry, name, value)
+glutChangeToSubMenu(entry, name, menu)
+glutCloseFunc(handler=0, ...)
+glutCopyColormap(win)
+glutDestroyMenu(menu)
+glutDestroyWindow(win)
+glutDetachMenu(button)
+glutDialsFunc(handler=0, ...)
+glutDisplayFunc(handler=0, ...)
+glutEntryFunc(handler=0, ...)
+glutEstablishOverlay()
+glutForceJoystickFunc()
+glutFullScreen()
+glutGameModeString(string)
+glutGetColor(cell, component)
+glutHideOverlay()
+glutHideWindow()
+glutIconifyWindow()
+glutIdleFunc(handler=0, ...)
+glutIgnoreKeyRepeat(ignore)
+glutInit()
+glutInitDisplayMode(mode)
+glutInitDisplayString(string)
+glutInitWindowPosition(x, y)
+glutInitWindowSize(width, height)
+glutKeyboardFunc(handler=0, ...)
+glutKeyboardUpFunc(handler=0, ...)
+glutLeaveGameMode()
+glutLeaveMainLoop()
+glutMainLoop()
+glutMainLoopEvent()
+glutMenuDestroyFunc(handler=0, ...)
+glutMenuStateFunc(handler=0, ...)
+glutMenuStatusFunc(handler=0, ...)
+glutMotionFunc(handler=0, ...)
+glutMouseFunc(handler=0, ...)
+glutMouseWheelFunc(handler=0, ...)
+glutOverlayDisplayFunc(handler=0, ...)
+glutPassiveMotionFunc(handler=0, ...)
+glutPopWindow()
+glutPositionWindow(x, y)
+glutPostOverlayRedisplay()
+glutPostRedisplay()
+glutPostWindowOverlayRedisplay(windowID)
+glutPostWindowRedisplay(windowID)
+glutPushWindow()
+glutRemoveMenuItem(entry)
+glutRemoveOverlay()
+glutReportErrors()
+glutReshapeFunc(handler=0, ...)
+glutReshapeWindow(width, height)
+glutSetColor(cell, red, green, blue)
+glutSetCursor(cursor)
+glutSetIconTitle(title)
+glutSetKeyRepeat(repeatMode)
+glutSetMenu(menu)
+glutSetOption(option_flag, value)
+glutSetWindow(win)
+glutSetWindowTitle(title)
+glutShowOverlay()
+glutShowWindow()
+glutSolidCone(base, height, slices, stacks)
+glutSolidCube(size)
+glutSolidCylinder(radius, height, slices, stacks)
+glutSolidDodecahedron()
+glutSolidIcosahedron()
+glutSolidOctahedron()
+glutSolidRhombicDodecahedron()
+glutSolidSphere(radius, slices, stacks)
+glutSolidTeapot(size)
+glutSolidTetrahedron()
+glutSolidTorus(innerRadius, outerRadius, nsides, rings)
+glutSpaceballButtonFunc(handler=0, ...)
+glutSpaceballMotionFunc(handler=0, ...)
+glutSpaceballRotateFunc(handler=0, ...)
+glutSpecialFunc(handler=0, ...)
+glutSpecialUpFunc(handler=0, ...)
+glutStrokeCharacter(font, character)
+glutStrokeHeight(font)
+glutStrokeLength(font, string)
+glutStrokeString(font, string)
+glutSwapBuffers()
+glutTabletButtonFunc(handler=0, ...)
+glutTabletMotionFunc(handler=0, ...)
+glutTimerFunc(msecs, handler=0, ...)
+glutUseLayer(layer)
+glutVisibilityFunc(handler=0, ...)
+glutWarpPointer(x, y)
+glutWindowStatusFunc(handler=0, ...)
+glutWireCone(base, height, slices, stacks)
+glutWireCube(size)
+glutWireCylinder(radius, height, slices, stacks)
+glutWireDodecahedron()
+glutWireIcosahedron()
+glutWireOctahedron()
+glutWireRhombicDodecahedron()
+glutWireSphere(radius, slices, stacks)
+glutWireTeapot(size)
+glutWireTetrahedron()
+glutWireTorus(innerRadius, outerRadius, nsides, rings)
@@ -1921,8 +1921,10 @@ if (!strncmp(name, "GL_", 3)) {
 	i(GL_FRAMEZOOM_SGIX)
 	i(GL_FRAMEZOOM_FACTOR_SGIX)
 	i(GL_MAX_FRAMEZOOM_FACTOR_SGIX)
+#if defined(GL_FfdMaskSGIX)
 	i(GL_TEXTURE_DEFORMATION_BIT_SGIX)
 	i(GL_GEOMETRY_DEFORMATION_BIT_SGIX)
+#endif
 	i(GL_GEOMETRY_DEFORMATION_SGIX)
 	i(GL_TEXTURE_DEFORMATION_SGIX)
 	i(GL_DEFORMATIONS_MASK_SGIX)
@@ -2068,6 +2070,7 @@ if (!strncmp(name, "GL_", 3)) {
 	i(GL_TEXTURE_MATERIAL_PARAMETER_EXT)
 	i(GL_ALPHA_MIN_SGIX)
 	i(GL_ALPHA_MAX_SGIX)
+#if defined(GL_SGIX_impact_pixel_texture)
 	i(GL_PIXEL_TEX_GEN_Q_CEILING_SGIX)
 	i(GL_PIXEL_TEX_GEN_Q_ROUND_SGIX)
 	i(GL_PIXEL_TEX_GEN_Q_FLOOR_SGIX)
@@ -2075,6 +2078,7 @@ if (!strncmp(name, "GL_", 3)) {
 	i(GL_PIXEL_TEX_GEN_ALPHA_NO_REPLACE_SGIX)
 	i(GL_PIXEL_TEX_GEN_ALPHA_LS_SGIX)
 	i(GL_PIXEL_TEX_GEN_ALPHA_MS_SGIX)
+#endif
 	i(GL_BGR_EXT)
 	i(GL_BGRA_EXT)
 	i(GL_ASYNC_MARKER_SGIX)
@@ -2161,8 +2165,10 @@ if (!strncmp(name, "GL_", 3)) {
 	i(GL_OPERAND2_ALPHA_EXT)
 	i(GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE)
 	i(GL_TRANSFORM_HINT_APPLE)
+#if defined(GL_SGIX_fog_scale)
 	i(GL_FOG_SCALE_SGIX)
 	i(GL_FOG_SCALE_VALUE_SGIX)
+#endif
 	i(GL_UNPACK_CONSTANT_DATA_SUNX)
 	i(GL_TEXTURE_CONSTANT_DATA_SUNX)
 	i(GL_GLOBAL_ALPHA_SUN)
@@ -2333,9 +2339,11 @@ if (!strncmp(name, "GL_", 3)) {
 	i(GL_PIXEL_SUBSAMPLE_4242_SGIX)
 	i(GL_YCRCB_SGIX)
 	i(GL_YCRCBA_SGIX)
+#if defined(GL_SGI_depth_pass_instrument)
 	i(GL_DEPTH_PASS_INSTRUMENT_SGIX)
 	i(GL_DEPTH_PASS_INSTRUMENT_COUNTERS_SGIX)
 	i(GL_DEPTH_PASS_INSTRUMENT_MAX_SGIX)
+#endif
 	i(GL_COMPRESSED_RGB_FXT1_3DFX)
 	i(GL_COMPRESSED_RGBA_FXT1_3DFX)
 	i(GL_MULTISAMPLE_3DFX)
@@ -2910,7 +2918,6 @@ if (!strncmp(name, "GL_", 3)) {
 	i(GL_DRAW_BUFFER13_ATI)
 	i(GL_DRAW_BUFFER14_ATI)
 	i(GL_DRAW_BUFFER15_ATI)
-	i(GL_TYPE_RGBA_FLOAT_ATI)
 	i(GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI)
 	i(GL_MODULATE_ADD_ATI)
 	i(GL_MODULATE_SIGNED_ADD_ATI)
@@ -1176,312 +1176,3 @@ GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, int mo
 }
 
 
-#ifdef __PM__
-
-/* A very primitive emulation level for X under PM... */
-
-#  include "os2pm_X.h"
-
-int yScreen;		/* Will update ASAP */
-
-void
-InitSys(void) {
-    yScreen = WinQuerySysValue(HWND_DESKTOP, SV_CYSCREEN);
-    EventAv = newAV();
-}
-
-Bool
-XQueryPointer(display, w, root_return, child_return, root_x_return,
-	root_y_return, win_x_return, win_y_return, mask_return)
-    Display* display;
-    Window w;
-    Window* root_return;
-    Window* child_return;
-    int* root_x_return;
-    int* root_y_return;
-    int* win_x_return;
-    int* win_y_return;
-    unsigned int* mask_return;
-{
-    POINTL pos;
-    unsigned int  state = 0;
-    static SWP clientsize;
-
-#ifdef XDEBUG
-    printf("XQueryPointer\n");
-#endif
-    WinQueryPointerPos(HWND_DESKTOP, &pos);
-    *root_x_return = pos.x;
-    /* Translate from PM to X coordinates */
-    *root_y_return = yScreen - pos.y;
-
-    WinMapWindowPoints (HWND_DESKTOP, w, &pos, 1);
-    *win_x_return = pos.x;
-    /* Translate from PM to X coordinates */
-    WinQueryWindowPos(w,&clientsize);
-    *win_y_return = clientsize.cy - pos.y;
-
-    *root_return = HWND_DESKTOP;
-    *child_return = w;
-
-    if (WinGetKeyState(HWND_DESKTOP, VK_BUTTON1) & 0x8000)
-	state |= Button1MaskOS2;
-    /* Report mouse as with X */
-    if (WinGetKeyState(HWND_DESKTOP, VK_BUTTON2) & 0x8000)
-	state |= Button2MaskOS2;
-    if (WinGetKeyState(HWND_DESKTOP, VK_BUTTON3) & 0x8000)
-	state |= Button3MaskOS2;
-    if (WinGetKeyState(HWND_DESKTOP, VK_CTRL) & 0x8000)
-	state |= ControlMask;
-    if (WinGetKeyState(HWND_DESKTOP, VK_SHIFT) & 0x8000)
-	state |= ShiftMask;
-    if (WinGetKeyState(HWND_DESKTOP, VK_ALT) & 0x8000)
-	state |= Mod4Mask;
-    if (WinGetKeyState(HWND_DESKTOP, VK_CAPSLOCK) & 0x0001)
-	state |= LockMask;
-    if (WinGetKeyState(HWND_DESKTOP, VK_NUMLOCK) & 0x0001)
-	state |= Mod1Mask;
-    if (WinGetKeyState(HWND_DESKTOP, VK_SCRLLOCK) & 0x0001)
-	state |= Mod3Mask;
-    *mask_return = state;
-#ifdef XDEBUG
-    printf("sx = %d, sy = %d, wx = %d, wx = %d, mask = %#x. \n",
-	*root_x_return, *root_y_return, *win_x_return, *win_y_return, *mask_return);
-#endif
-    return True;
-}
-
-void
-XNextEvent(Display *d, XEvent *event)
-{
-  SV* sv = av_shift(EventAv);
-  IV n_a;
-
-  StructCopy((XEvent*)SvPV(sv, n_a),event, XEvent);
-  SvREFCNT_dec(sv);
-}
-
-void
-XLookupString(XKeyEvent *xkey, char *buf, int sizeof_buf, KeySym *ks, int f)
-{
-  if (xkey->keycode < 256)
-    *ks = (KeySym)xkey->keycode;
-  else if (xkey->keycode == 256 + VK_ESC)
-    *ks = (KeySym)27;
-  else if (xkey->keycode == 256 + VK_ENTER)
-    *ks = (KeySym)'\n';
-  else if (xkey->keycode == 256 + VK_SPACE)
-    *ks = (KeySym)' ';
-  else if (xkey->keycode == 256 + VK_TAB)
-    *ks = (KeySym)'\t';
-  else
-    *ks = (KeySym)'\0';
-}
-
-
-static MRESULT EXPENTRY WindowProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM
-mp2)
-{
-  static float t = 0.0;
-  static SWP clientsize;
-  static USHORT mycode;
-  static ULONG key;
-
-  switch(msg) {
-  case WM_SIZE:
-    WinQueryWindowPos(hwnd,&clientsize);
-    if (LastEventMask & StructureNotifyMask) {
-      XEvent x;
-      SV *ev;
-
-      x.type = ConfigureNotify;
-      x.xconfigure.width = clientsize.cx;
-      x.xconfigure.height = clientsize.cy;
-      av_push(EventAv, newSVpv((char*)&x,sizeof(XEvent)));
-    } else {
-      /* Upon a resize, query new window size and set OpenGL viewport */
-      glViewport(0, 0, clientsize.cx, clientsize.cy);
-    }
-    return WinDefWindowProc(hwnd, msg, mp1, mp2);
-  case WM_TIMER:
-    /* Upon getting a timer message, the invalidate rectangle call  */
-    /* will cause a WM_PAINT message to be sent, enabling animation */
-    WinInvalidateRect(hwnd, NULLHANDLE, 0);
-    return WinDefWindowProc(hwnd, msg, mp1, mp2);
-  case WM_PAINT:
-    if (LastEventMask & ExposureMask) {
-      XEvent x;
-      SV *ev;
-
-      x.type = Expose;
-      av_push(EventAv, newSVpv((char*)&x,sizeof(XEvent)));
-    }
-    return WinDefWindowProc(hwnd, msg, mp1, mp2);
-  case WM_CHAR:
-    mycode = (USHORT)SHORT1FROMMP(mp1);
-    if ((mycode & KC_CHAR) && !(mycode & KC_KEYUP))
-      key = CHAR1FROMMP(mp2);
-    else if ((mycode & KC_VIRTUALKEY) && !(mycode & KC_KEYUP))
-      key = CHAR3FROMMP(mp2) + 256;
-    else
-      key = 0;
-    if (key && (LastEventMask & KeyPressMask)) {
-      XEvent x;
-      SV *ev;
-
-      x.type = KeyPress;
-      x.xkey.keycode = key;
-      av_push(EventAv, newSVpv((char*)&x,sizeof(XEvent)));
-    }
-    return WinDefWindowProc(hwnd, msg, mp1, mp2);
-  default:
-    return WinDefWindowProc(hwnd, msg, mp1, mp2);
-  }
-}
-
-struct Tk_Window_t {long type; HWND w;};
-
-Window
-nativeWindowId(Display *d, Window id)
-{
-    if (!WinIsWindow(*d,id))			 /* Tk handle? */
-	return ((struct Tk_Window_t*)id)->w;
-    return id;
-}
-
-
-Window
-MyCreateWindow(Display *d, Window par, int x, int y, int w, int h)
-{
-    HWND hwnd = 0, hwndTop;
-    int err;
-
-/*    fprintf(stderr, "Creating with parent=%#lx.\n", (long)par);	*/
-    if (par != HWND_DESKTOP) {
-      ULONG createflags = 0;
-
-      par = nativeWindowId(d, par);
-/*    fprintf(stderr, "Creating with parent=%#lx.\n", (long)par);	*/
-      if (!WinRegisterClass( Perl_hab,
-                             (PSZ)"PerlGLkid",
-                             WindowProc,
-                             CS_MOVENOTIFY, /* Need at least this! */
-			     /* As documented CS_SIZEREDRAW is needed too... */
-			     /* But this would not improve the visual appearence... */
-                             0))
-          croak("Cannot register class");
-      err = CheckWinError(
-		hwnd = WinCreateWindow(
-                        par,   		/* Parent    */
-                        (PSZ)"PerlGLkid", /* class name              */
-                        NULL,		/* window title            */
-                        WS_VISIBLE,     /* Window style             */
-			x,y,w,h,
-                        par,   		/* Owner    */
-                        HWND_TOP,	/* Position    */
-                        FID_CLIENT,     /* Standard id         */
-                        0,              /* No class data         */
-                        0));            /* No presentation parameters */
-    } else {
-      ULONG createflags = FCF_TITLEBAR |
-                        FCF_SYSMENU    |
-                        FCF_MINMAX     |
-                        FCF_TASKLIST   |
-                        FCF_SIZEBORDER;
-    
-      if (!WinRegisterClass( Perl_hab,
-                             (PSZ)"PerlGLtop",
-                             WindowProc,
-                             CS_SIZEREDRAW | CS_MOVENOTIFY, /* Need at least this! */
-                             0))
-          croak("Cannot register class");
-      err = CheckWinError(
-	      hwndTop = WinCreateStdWindow(
-                        par,   /* Parent    */
-                        WS_VISIBLE,     /* Frame style             */
-                        &createflags,   /* min FCF_MENU|FCF_MINMAX */
-                        (PSZ)"PerlGLtop", /* class name              */
-                        "OpenGL Sample",/* window title            */
-                        WS_VISIBLE,     /* client style            */
-                        0,              /* resource handle         */
-                        1,              /* Resource ID             */
-                        &hwnd));
-    }
-    if (err)
-	croak("Cannot create window, $^E=%#x", WinGetLastError(*d));
-    if (!hwnd)
-	croak("Error creating window");
-        /* you must set window size before you call pglMakeCurrent */
-    if ((par == HWND_DESKTOP) &&
-	!WinSetWindowPos( hwndTop,
-			  HWND_TOP,
-			  x,
-			  y,
-			  w,		/* XXXX Add border! */
-			  h,
-			  SWP_ACTIVATE | SWP_SIZE | SWP_MOVE | SWP_SHOW))
-          croak("Couldn't position window!\n");
-    return hwnd;
-}
-
-void
-glpMoveResizeWindow(int x, int y, unsigned int width, unsigned int height, Window w, Display* display)
-{
-    SWP parPos;
-
-    w = nativeWindowId(display, w);
-    WinQueryWindowPos(WinQueryWindow(w, QW_PARENT), &parPos);
-    /* Translate Y coordinates to PM: relative to parent */
-    WinSetWindowPos(w, HWND_TOP, x, parPos.cy - height - y,
-                    width, height, SWP_MOVE | SWP_SIZE);
-}
-
-void
-glpMoveWindow(int x, int y, Window w, Display* display)
-{
-    SWP parPos;
-    SWP myPos;
-
-    w = nativeWindowId(display, w);
-    WinQueryWindowPos(WinQueryWindow(w, QW_PARENT), &parPos);
-    WinQueryWindowPos(w, &myPos);
-    /* Translate Y coordinates to PM: relative to parent */
-    WinSetWindowPos(w, HWND_TOP, x, parPos.cy - myPos.cy - y,
-                    0, 0, SWP_MOVE);
-}
-
-void
-glpResizeWindow(unsigned int width, unsigned int height, Window w, Display* display)
-{
-    SWP parPos;
-    SWP myPos;
-
-    w = nativeWindowId(display, w);
-    WinQueryWindowPos(WinQueryWindow(w, QW_PARENT), &parPos);
-    WinQueryWindowPos(w, &myPos);
-    /* Translate Y coordinates to PM: relative to parent... */
-    /* Need to move too to leave the upper left corner at the same place... */
-    WinSetWindowPos(w, HWND_TOP, myPos.x, parPos.cy - myPos.cy - myPos.y,
-		    width, height, SWP_MOVE | SWP_SIZE);
-}
-
-void
-morphPM()
-{
-    PPIB pib;
-    PTIB tib;
-
-    DosGetInfoBlocks(&tib, &pib);
-    if (pib->pib_ultype != 3)		/* 2 is VIO */
-	pib->pib_ultype = 3;		/* 3 is PM */
-}
-
-#undef glutCreateWindow
-int
-my_glutCreateWindow(name)
-{
-    morphPM();
-    return glutCreateWindow(name);
-}
-
-#endif
@@ -1,99 +0,0 @@
-#ifdef __PM__
-	if (1) {
-		i(GLX_USE_GL)
-		i(GLX_BUFFER_SIZE)
-		i(GLX_LEVEL)
-		i(GLX_RGBA)
-		i(GLX_DOUBLEBUFFER)
-		i(GLX_STEREO)
-		i(GLX_AUX_BUFFERS)
-		i(GLX_RED_SIZE)
-		i(GLX_GREEN_SIZE)
-		i(GLX_BLUE_SIZE)
-		i(GLX_ALPHA_SIZE)
-		i(GLX_DEPTH_SIZE)
-		i(GLX_STENCIL_SIZE)
-		i(GLX_ACCUM_RED_SIZE)
-		i(GLX_ACCUM_GREEN_SIZE)
-		i(GLX_ACCUM_BLUE_SIZE)
-		i(GLX_ACCUM_ALPHA_SIZE)
-
-		i(NoEventMask)
-		i(KeyPressMask)
-		i(KeyReleaseMask)
-		i(ButtonPressMask)
-		i(ButtonReleaseMask)
-		i(EnterWindowMask)
-		i(LeaveWindowMask)
-		i(PointerMotionMask)
-		i(PointerMotionHintMask)
-		i(Button1MotionMask)
-		i(Button2MotionMask)
-		i(Button3MotionMask)
-		i(Button4MotionMask)
-		i(Button5MotionMask)
-		i(ButtonMotionMask)
-		i(KeymapStateMask)
-		i(ExposureMask)
-		i(VisibilityChangeMask)
-		i(StructureNotifyMask)
-		i(ResizeRedirectMask)
-		i(SubstructureNotifyMask)
-		i(SubstructureRedirectMask)
-		i(FocusChangeMask)
-		i(PropertyChangeMask)
-		i(ColormapChangeMask)
-		i(OwnerGrabButtonMask)
-		i(KeyPress)
-		i(KeyRelease)
-		i(ButtonPress)
-		i(ButtonRelease)
-		i(MotionNotify)
-		i(EnterNotify)
-		i(LeaveNotify)
-		i(FocusIn)
-		i(FocusOut)
-		i(KeymapNotify)
-		i(Expose)
-		i(GraphicsExpose)
-		i(NoExpose)
-		i(VisibilityNotify)
-		i(CreateNotify)
-		i(DestroyNotify)
-		i(UnmapNotify)
-		i(MapNotify)
-		i(MapRequest)
-		i(ReparentNotify)
-		i(ConfigureNotify)
-		i(ConfigureRequest)
-		i(GravityNotify)
-		i(ResizeRequest)
-		i(CirculateNotify)
-		i(CirculateRequest)
-		i(PropertyNotify)
-		i(SelectionClear)
-		i(SelectionRequest)
-		i(SelectionNotify)
-		i(ColormapNotify)
-		i(ClientMessage)
-		i(MappingNotify)
-		i(LASTEvent)
-		i(ShiftMask)
-		i(LockMask)
-		i(ControlMask)
-		i(Mod1Mask)
-		i(Mod2Mask)
-		i(Mod3Mask)
-		i(Mod4Mask)
-		i(Mod5Mask)
-		i(Button1MaskOS2)
-		i(Button2MaskOS2)
-		i(Button3MaskOS2)
-		i(Button4Mask)
-		i(Button5Mask)
-		i(AnyModifier)
-	}
-	if (0) {
-	}
-	else
-#endif /* def HAVE_GLX */
@@ -1,4 +1,9 @@
-#if defined(HAVE_FREEGLUT) && (defined(_WIN32) || defined(HAVE_W32API))
+#if defined(IS_STRAWBERRY)
+
+#undef exit
+#include <GL/freeglut.h>
+
+#elif defined(HAVE_FREEGLUT) && (defined(_WIN32) || defined(HAVE_W32API))
 
 #include "./include/GL/freeglut.h"
 
@@ -14,20 +19,22 @@
 #include <GL/glut.h>
 #endif
 
-#define GLUT_ACTION_EXIT                         0
-#define GLUT_ACTION_GLUTMAINLOOP_RETURNS         1
-#define GLUT_ACTION_CONTINUE_EXECUTION           2
-#define GLUT_CREATE_NEW_CONTEXT                  0
-#define GLUT_USE_CURRENT_CONTEXT                 1
-#define GLUT_FORCE_INDIRECT_CONTEXT              0
-#define GLUT_ALLOW_DIRECT_CONTEXT                1
-#define GLUT_TRY_DIRECT_CONTEXT                  2
-#define GLUT_FORCE_DIRECT_CONTEXT                3
-#define GLUT_ACTION_ON_WINDOW_CLOSE         0x01F9
-#define GLUT_WINDOW_BORDER_WIDTH            0x01FA
-#define GLUT_WINDOW_HEADER_HEIGHT           0x01FB
-#define GLUT_VERSION                        0x01FC
-#define GLUT_RENDERING_CONTEXT              0x01FD
-#define GLUT_DIRECT_RENDERING               0x01FE
+#if 0
+#   define GLUT_ACTION_EXIT                         0
+#   define GLUT_ACTION_GLUTMAINLOOP_RETURNS         1
+#   define GLUT_ACTION_CONTINUE_EXECUTION           2
+#   define GLUT_CREATE_NEW_CONTEXT                  0
+#   define GLUT_USE_CURRENT_CONTEXT                 1
+#   define GLUT_FORCE_INDIRECT_CONTEXT              0
+#   define GLUT_ALLOW_DIRECT_CONTEXT                1
+#   define GLUT_TRY_DIRECT_CONTEXT                  2
+#   define GLUT_FORCE_DIRECT_CONTEXT                3
+#   define GLUT_ACTION_ON_WINDOW_CLOSE         0x01F9
+#   define GLUT_WINDOW_BORDER_WIDTH            0x01FA
+#   define GLUT_WINDOW_HEADER_HEIGHT           0x01FB
+#   define GLUT_VERSION                        0x01FC
+#   define GLUT_RENDERING_CONTEXT              0x01FD
+#   define GLUT_DIRECT_RENDERING               0x01FE
+#endif
 
 #endif
@@ -0,0 +1,1653 @@
+#!/usr/bin/perl -w
+use strict;
+
+my $stat = `perl -v`;
+our $IS_ACTIVEPERL = ($stat =~ m|ActiveState|s);
+our $PERL_VERSION = $^V;
+$PERL_VERSION =~ s|^v||;
+
+use OpenGL qw/ :all /;
+use OpenGL::Config;     # for build information
+
+eval 'use OpenGL::Image 1.03';  # Need to use OpenGL::Image 1.03 or higher!
+my $hasImage = !$@;
+my $hasIM_635 = $hasImage && OpenGL::Image::HasEngine('Magick','6.3.5');
+$hasIM_635 = 0;
+
+eval 'use OpenGL::Shader';
+my $hasShader = !$@;
+
+eval 'use Image::Magick';
+my $hasIM = !$@;
+
+# This does not seem to be needed and it adds an extra, unneeded
+# dependency to the build process.  Leaving this in as a comment
+# just in case it is being used somewhere here
+#
+# use Math::Trig;
+
+eval 'use Time::HiRes qw( gettimeofday )';
+my $hasHires = !$@;
+$|++;
+
+
+# ----------------------
+# Based on a cube demo by
+# Chris Halsall (chalsall@chalsall.com) for the
+# O'Reilly Network on Linux.com (oreilly.linux.com).
+# May 2000.
+#
+# Translated from C to Perl by J-L Morel <jl_morel@bribes.org>
+# ( http://www.bribes.org/perl/wopengl.html )
+#
+# Updated for FBO, VBO, Vertex/Fragment Program extensions
+# and ImageMagick support
+# by Bob "grafman" Free <grafman@graphcomp.com>
+# ( http://graphcomp.com/opengl )
+#
+
+
+# Requires GLUT/FreeGLUT
+if (!glpHasGLUT())
+{
+  print qq
+  {
+    This test requires GLUT:
+    If you have X installed, you can try the scripts in ./examples/
+    Most of them do not use GLUT.
+
+    It is recommended that you install FreeGLUT for improved Makefile.PL
+    configuration, installation and debugging.
+
+  };
+
+  print "Attempting to run examples/texhack instead...\n";
+  `perl examples/texhack`;
+  exit 0;
+}
+
+
+use constant PROGRAM_TITLE => "OpenGL Test App";
+use constant DO_TESTS => 0;
+
+
+# Run in Game Mode
+my $gameMode;
+if (scalar(@ARGV) and lc($ARGV[0]) eq 'gamemode')
+{
+  $gameMode = $ARGV[1] || '';
+}
+
+# Keyboard modifiers
+my $key_mods =
+{
+  eval(GLUT_ACTIVE_SHIFT) => "SHIFT",
+  eval(GLUT_ACTIVE_CTRL) => "CTRL",
+  eval(GLUT_ACTIVE_ALT) => "ALT"
+};
+
+# Some global variables.
+my $useMipMap = 1;
+my $hasFBO = 0;
+my $hasVBO = 0;
+my $hasFragProg = 0;
+my $hasImagePointer = 0;
+my $idleTime = time();
+my $idleSecsMax = 30;
+my $er;
+
+# Window and texture IDs, window width and height.
+my $Window_ID;
+my $Window_Width = 300;
+my $Window_Height = 300;
+my $Inset_Width = 90;
+my $Inset_Height = 90;
+my $Window_State;
+
+# Texture dimanesions
+#my $Tex_File = 'test.jpg';
+my $Tex_File = 'test.tga';
+my $Tex_Width = 128;
+my $Tex_Height = 128;
+my $Tex_Format;
+my $Tex_Type;
+my $Tex_Size;
+my $Tex_Image;
+my $Tex_Pixels;
+
+# Our display mode settings.
+my $Light_On = 0;
+my $Blend_On = 0;
+my $Texture_On = 1;
+my $Alpha_Add = 1;
+my $FBO_On = 0;
+my $Inset_On = 1;
+my $Fullscreen_On = 0;
+
+my $Curr_TexMode = 0;
+my @TexModesStr = qw/ GL_DECAL GL_MODULATE GL_BLEND GL_REPLACE /;
+my @TexModes = ( GL_DECAL, GL_MODULATE, GL_BLEND, GL_REPLACE );
+my($TextureID_image,$TextureID_FBO);
+my $FrameBufferID;
+my $RenderBufferID;
+my $VertexProgID;
+my $FragProgID;
+my $FBO_rendered = 0;
+my $Shader;
+
+# Object and scene global variables.
+my $Teapot_Rot = 0.0;
+
+# Cube position and rotation speed variables.
+my $X_Rot   = 0.9;
+my $Y_Rot   = 0.0;
+my $X_Speed = 0.0;
+my $Y_Speed = 0.5;
+my $Z_Off   =-5.0;
+
+# Settings for our light.  Try playing with these (or add more lights).
+my @Light_Ambient  = ( 0.1, 0.1, 0.1, 1.0 );
+my @Light_Diffuse  = ( 1.2, 1.2, 1.2, 1.0 );
+my @Light_Position = ( 2.0, 2.0, 0.0, 1.0 );
+
+# Model/Projection/Viewport Matrices
+my $mm = OpenGL::Array->new(16,GL_DOUBLE);
+my $pm = OpenGL::Array->new(16,GL_DOUBLE);
+my $vp = OpenGL::Array->new(4,GL_INT);
+
+# Vertex Buffer Object data
+my($VertexObjID,$NormalObjID,$ColorObjID,$TexCoordObjID,$IndexObjID);
+
+my @verts =
+(
+  -1.0, -1.3, -1.0,
+  1.0, -1.3, -1.0,
+  1.0, -1.3,  1.0,
+  -1.0, -1.3,  1.0,
+
+  -1.0,  1.3, -1.0,
+  -1.0,  1.3,  1.0,
+  1.0,  1.3,  1.0,
+  1.0,  1.3, -1.0,
+
+  -1.0, -1.0, -1.3,
+  -1.0,  1.0, -1.3,
+  1.0,  1.0, -1.3,
+  1.0, -1.0, -1.3,
+
+  1.3, -1.0, -1.0,
+  1.3,  1.0, -1.0,
+  1.3,  1.0,  1.0,
+  1.3, -1.0,  1.0,
+
+  -1.0, -1.0,  1.3,
+  1.0, -1.0,  1.3,
+  1.0,  1.0,  1.3,
+  -1.0,  1.0,  1.3,
+
+  -1.3, -1.0, -1.0,
+  -1.3, -1.0,  1.0,
+  -1.3,  1.0,  1.0,
+  -1.3,  1.0, -1.0
+);
+my $verts = OpenGL::Array->new_list(GL_FLOAT,@verts);
+
+# Could calc norms on the fly
+my @norms =
+(
+  0.0, -1.0, 0.0,
+  0.0, 1.0, 0.0,
+  0.0, 0.0,-1.0,
+  1.0, 0.0, 0.0,
+  0.0, 0.0, 1.0,
+  -1.0, 0.0, 0.0
+);
+my $norms = OpenGL::Array->new_list(GL_FLOAT,@norms);
+
+my @colors =
+(
+  0.9,0.2,0.2,.75,
+  0.9,0.2,0.2,.75,
+  0.9,0.2,0.2,.75,
+  0.9,0.2,0.2,.75,
+
+  0.5,0.5,0.5,.5,
+  0.5,0.5,0.5,.5,
+  0.5,0.5,0.5,.5,
+  0.5,0.5,0.5,.5,
+
+  0.2,0.9,0.2,.5,
+  0.2,0.9,0.2,.5,
+  0.2,0.9,0.2,.5,
+  0.2,0.9,0.2,.5,
+
+  0.2,0.2,0.9,.25,
+  0.2,0.2,0.9,.25,
+  0.2,0.2,0.9,.25,
+  0.2,0.2,0.9,.25,
+
+  0.9, 0.2, 0.2, 0.5,
+  0.2, 0.9, 0.2, 0.5,
+  0.2, 0.2, 0.9, 0.5,
+  0.1, 0.1, 0.1, 0.5,
+
+  0.9,0.9,0.2,0.0,
+  0.9,0.9,0.2,0.66,
+  0.9,0.9,0.2,1.0,
+  0.9,0.9,0.2,0.33
+);
+my $colors = OpenGL::Array->new_list(GL_FLOAT,@colors);
+
+my @rainbow =
+(
+  0.9, 0.2, 0.2, 0.5,
+  0.2, 0.9, 0.2, 0.5,
+  0.2, 0.2, 0.9, 0.5,
+  0.1, 0.1, 0.1, 0.5
+);
+
+my $rainbow = OpenGL::Array->new_list(GL_FLOAT,@rainbow);
+my $rainbow_offset = 64;
+my @rainbow_inc;
+
+my @texcoords =
+(
+  0.800, 0.800,
+  0.200, 0.800,
+  0.200, 0.200,
+  0.800, 0.200,
+
+  0.005, 1.995,
+  0.005, 0.005,
+  1.995, 0.005,
+  1.995, 1.995,
+
+  0.995, 0.005,
+  2.995, 2.995,
+  0.005, 0.995,
+  -1.995, -1.995,
+
+  0.995, 0.005,
+  0.995, 0.995,
+  0.005, 0.995,
+  0.005, 0.005,
+
+  -0.5, -0.5,
+  1.5, -0.5,
+  1.5, 1.5,
+  -0.5, 1.5,
+
+  0.005, 0.005,
+  0.995, 0.005,
+  0.995, 0.995,
+  0.005, 0.995
+);
+my $texcoords = OpenGL::Array->new_list(GL_FLOAT,@texcoords);
+
+my @indices = (0..23);
+my $indices = OpenGL::Array->new_list(GL_UNSIGNED_INT,@indices);
+
+my @xform =
+(
+  1.0, 0.0, 0.0, 0.0,
+  0.0, 1.0, 0.0, 0.0,
+  0.0, 0.0, 1.0, 0.0,
+  0.0, 0.0, 0.0, 1.0
+);
+my $xform = OpenGL::Array->new_list(GL_FLOAT,@xform);
+
+
+# ------
+# Frames per second (FPS) statistic variables and routine.
+
+use constant CLOCKS_PER_SEC => $hasHires ? 1000 : 1;
+use constant FRAME_RATE_SAMPLES => 50;
+
+my $FrameCount = 0;
+my $FrameRate = 0;
+my $last=0;
+
+sub ourDoFPS
+{
+  if (++$FrameCount >= FRAME_RATE_SAMPLES)
+  {
+     my $now = $hasHires ? gettimeofday() : time(); # clock();
+     my $delta= ($now - $last);
+     $last = $now;
+
+     $FrameRate = FRAME_RATE_SAMPLES / ($delta || 1);
+     $FrameCount = 0;
+  }
+}
+
+# ------
+# String rendering routine; leverages on GLUT routine.
+
+sub ourPrintString
+{
+  my ($font, $str) = @_;
+  my @c = split '', $str;
+
+  for(@c)
+  {
+    glutBitmapCharacter($font, ord $_);
+  }
+}
+
+
+# ------
+# Does everything needed before losing control to the main
+# OpenGL event loop.
+
+sub ourInit
+{
+  my ($Width, $Height) = @_;
+
+  # Set initial colors for rainbow face
+  for (my $i=0; $i<16; $i++)
+  {
+    $rainbow[$i] = rand(1.0);
+    $rainbow_inc[$i] = 0.01 - rand(0.02);
+  }
+
+  # Initialize VBOs if supported
+  if ($hasVBO)
+  {
+    ($VertexObjID,$NormalObjID,$ColorObjID,$TexCoordObjID,$IndexObjID) =
+      glGenBuffersARB_p(5);
+
+    #glBindBufferARB(GL_ARRAY_BUFFER_ARB, $VertexObjID);
+    $verts->bind($VertexObjID);
+    glBufferDataARB_p(GL_ARRAY_BUFFER_ARB, $verts, GL_STATIC_DRAW_ARB);
+    glVertexPointer_c(3, GL_FLOAT, 0, 0);
+
+    if (DO_TESTS)
+    {
+      print "\nTests:\n";
+
+      my $size = glGetBufferParameterivARB_p(GL_ARRAY_BUFFER_ARB,
+        GL_BUFFER_SIZE_ARB);
+      print "  Vertex Buffer Size (bytes): $size\n";
+      my $count = $verts->elements();
+      print "  Vertex Buffer Size (elements): $count\n";
+
+      my $test = glGetBufferSubDataARB_p(GL_ARRAY_BUFFER_ARB,12,3,GL_FLOAT);
+      my @test = $test->retrieve(0,3);
+      my $ords = join('/',@test);
+      print "  glGetBufferSubDataARB_p: $ords\n";
+    }
+
+    #glBindBufferARB(GL_ARRAY_BUFFER_ARB, $NormalObjID);
+    $norms->bind($NormalObjID);
+    glBufferDataARB_p(GL_ARRAY_BUFFER_ARB, $norms, GL_STATIC_DRAW_ARB);
+    glNormalPointer_c(GL_FLOAT, 0, 0);
+
+    #glBindBufferARB(GL_ARRAY_BUFFER_ARB, $ColorObjID);
+    $colors->bind($ColorObjID);
+    glBufferDataARB_p(GL_ARRAY_BUFFER_ARB, $colors, GL_DYNAMIC_DRAW_ARB);
+    $rainbow->assign(0,@rainbow);
+    glBufferSubDataARB_p(GL_ARRAY_BUFFER_ARB, $rainbow_offset, $rainbow);
+    glColorPointer_c(4, GL_FLOAT, 0, 0);
+
+    #glBindBufferARB(GL_ARRAY_BUFFER_ARB, $TexCoordObjID);
+    $texcoords->bind($TexCoordObjID);
+    glBufferDataARB_p(GL_ARRAY_BUFFER_ARB, $texcoords, GL_STATIC_DRAW_ARB);
+    glTexCoordPointer_c(2, GL_FLOAT, 0, 0);
+
+    #glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, $IndexObjID);
+    $indices->bind($IndexObjID);
+    glBufferDataARB_p(GL_ELEMENT_ARRAY_BUFFER_ARB, $indices, GL_STATIC_DRAW_ARB);
+  }
+  else
+  {
+    glVertexPointer_p(3, $verts);
+    glNormalPointer_p($norms);
+    $colors->assign($rainbow_offset,@rainbow);
+    glColorPointer_p(4, $colors);
+    glTexCoordPointer_p(2, $texcoords);
+  }
+
+  # Build texture.
+  ($TextureID_image,$TextureID_FBO) = glGenTextures_p(2);
+  ourBuildTextures();
+  glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);
+
+  # Initialize shaders.
+  ourInitShaders();
+
+  # Initialize rendering parameters
+  glEnable(GL_TEXTURE_2D);
+  glDisable(GL_LIGHTING);
+  glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+  #glEnable(GL_BLEND);
+
+  # Color to clear color buffer to.
+  glClearColor(0.1, 0.1, 0.1, 0.0);
+
+  # Depth to clear depth buffer to; type of test.
+  glClearDepth(1.0);
+  glDepthFunc(GL_LESS);
+
+  # Enables Smooth Color Shading; try GL_FLAT for (lack of) fun.
+  glShadeModel(GL_SMOOTH);
+
+  # Load up the correct perspective matrix; using a callback directly.
+  cbResizeScene($Width, $Height);
+
+  # Set up a light, turn it on.
+  glLightfv_p(GL_LIGHT1, GL_POSITION, @Light_Position);
+  glLightfv_p(GL_LIGHT1, GL_AMBIENT,  @Light_Ambient);
+  glLightfv_p(GL_LIGHT1, GL_DIFFUSE,  @Light_Diffuse);
+  glEnable(GL_LIGHT1);
+
+  # A handy trick -- have surface material mirror the color.
+  glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE);
+  glEnable(GL_COLOR_MATERIAL);
+}
+
+
+# ------
+# Function to build a simple full-color texture with alpha channel,
+# and then create mipmaps.
+# Also sets up FBO texture and Vertex/Fragment programs.
+
+sub ourBuildTextures
+{
+  my $gluerr;
+  my $tex;
+
+  # Build Image Texture
+  ($TextureID_image,$TextureID_FBO) = glGenTextures_p(2);
+  print "\n";
+
+  # Use OpenGL::Image to load texture
+  if ($hasImage && -e $Tex_File)
+  {
+    my $img = new OpenGL::Image(source=>$Tex_File);
+    my($eng,$ver) = $img->Get('engine','version');
+    print "Using OpenGL::Image - $eng v$ver\n";
+
+    ($Tex_Width,$Tex_Height) = $img->Get('width','height');
+    my $alpha = $img->Get('alpha') ? 'has' : 'no';
+    print "Loading texture: $Tex_File, $Tex_Width x $Tex_Height, $alpha alpha\n";
+
+    ($Tex_Type,$Tex_Format,$Tex_Size) = 
+      $img->Get('gl_internalformat','gl_format','gl_type');
+
+    # Use OGA for testing
+    $Tex_Image = $img;
+    $Tex_Pixels = $img->GetArray();
+    print "Using ImageMagick's gaussian blur on inset\n" if ($hasIM_635);
+  }
+  # Build texture from scratch if OpenGL::Image not available
+  else
+  {
+    my $hole_size = 3300; # ~ == 57.45 ^ 2.
+    # Iterate across the texture array.
+    for(my $y=0; $y<$Tex_Height; $y++)
+    {
+      for(my $x=0; $x<$Tex_Width; $x++)
+      {
+        # A simple repeating squares pattern.
+        # Dark blue on white.
+        if ( ( ($x+4)%32 < 8 ) && ( ($y+4)%32 < 8))
+        {
+          $tex .= pack "C3", 0,0,120;       # Dark blue
+        }
+        else
+        {
+          $tex .= pack "C3", 240, 240, 240; # White
+        }
+
+        # Make a round dot in the texture's alpha-channel.
+        # Calculate distance to center (squared).
+        my $t = ($x-64)*($x-64) + ($y-64)*($y-64);
+
+        if ( $t < $hole_size)
+        {
+          $tex .= pack "C", 255;  # The dot itself is opaque.
+        }
+        elsif ($t < $hole_size + 100)
+        {
+          $tex .= pack "C", 128;  # Give our dot an anti-aliased edge.
+        }
+        else
+        {
+          $tex .= pack "C", 0;    # Outside of the dot, it's transparent.
+        }
+      }
+    }
+
+    $Tex_Pixels = OpenGL::Array->new_scalar(GL_UNSIGNED_BYTE,$tex,length($tex));
+
+    $Tex_Type = GL_RGBA8;
+    $Tex_Format = GL_RGBA;
+    $Tex_Size =  GL_UNSIGNED_BYTE;
+  }
+  glBindTexture(GL_TEXTURE_2D, $TextureID_image);
+
+  # Use MipMap
+  if ($useMipMap)
+  {
+    print "Using Mipmap\n";
+
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
+      GL_NEAREST_MIPMAP_LINEAR);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+      GL_NEAREST_MIPMAP_LINEAR);
+
+    # The GLU library helps us build MipMaps for our texture.
+    if (($gluerr = gluBuild2DMipmaps_c(GL_TEXTURE_2D, $Tex_Type,
+      $Tex_Width, $Tex_Height, $Tex_Format, $Tex_Size,
+      $Tex_Pixels->ptr())))
+    {
+      printf STDERR "GLULib%s\n", gluErrorString($gluerr);
+      exit(-1);
+    }
+  }
+  # Use normal texture - Note: dimensions must be power of 2
+  else
+  {
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+    glTexImage2D_c(GL_TEXTURE_2D, 0, $Tex_Type, $Tex_Width, $Tex_Height,
+      0, $Tex_Format, $Tex_Size, $Tex_Pixels->ptr());
+  }
+
+  # Benchmarks for Image Loading
+  if (DO_TESTS && $hasIM)
+  {
+    my $loops = 1000;
+
+    my $im = new Image::Magick();
+    $im->Read($Tex_File);
+    $im->Set(magick=>'RGBA',depth=>8);
+    $im->Negate(channel=>'alpha');
+
+
+    # Bench ImageToBlob
+    my $start = gettimeofday();
+    for (my $i=0;$i<$loops;$i++)
+    {
+      my($blob) = $im->ImageToBlob();
+
+      glTexImage2D_s(GL_TEXTURE_2D, 0, GL_RGBA8, $Tex_Width, $Tex_Height,
+        0, GL_RGBA, GL_UNSIGNED_BYTE, $blob);
+    }
+    my $now = gettimeofday();
+    my $fps = $loops / ($now - $start);
+    print "ImageToBlob + glTexImage2D_s: $fps\n";
+
+
+    # Bench GetPixels
+    $start = gettimeofday();
+    for (my $i=0;$i<$loops;$i++)
+    {
+      my @pixels = $im->GetPixels(map=>'BGRA',
+        width=>$Tex_Width, height=>$Tex_Height, normalize=>'false');
+
+      glTexImage2D_p(GL_TEXTURE_2D, 0, $Tex_Type, $Tex_Width, $Tex_Height,
+        0, $Tex_Format, $Tex_Size, @pixels);
+    }
+    $now = gettimeofday();
+    $fps = $loops / ($now - $start);
+    print "GetPixels + glTexImage2D_p: $fps\n";
+
+
+    # Bench OpenGL::Image
+    if ($hasIM_635)
+    {
+      my $start = gettimeofday();
+      for (my $i=0;$i<$loops;$i++)
+      {
+        glTexImage2D_c(GL_TEXTURE_2D, 0, $Tex_Type, $Tex_Width, $Tex_Height,
+          0, $Tex_Format, $Tex_Size, $Tex_Pixels->ptr());
+      }
+      my $now = gettimeofday();
+      my $fps = $loops / ($now - $start);
+      print "OpenGL::Image + glTexImage2D_c: $fps\n";
+    }
+  }
+
+  # Build FBO texture
+  if ($hasFBO)
+  {
+    ($FrameBufferID) = glGenFramebuffersEXT_p(1);
+    ($RenderBufferID) = glGenRenderbuffersEXT_p(1);
+
+    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, $FrameBufferID);
+    glBindTexture(GL_TEXTURE_2D, $TextureID_FBO);
+
+    # Initiate texture
+    glTexImage2D_c(GL_TEXTURE_2D, 0, $Tex_Type, $Tex_Width, $Tex_Height,
+      0, $Tex_Format, $Tex_Size, 0);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+    # Bind texture/frame/render buffers
+    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
+      GL_TEXTURE_2D, $TextureID_FBO, 0);
+    glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, $RenderBufferID);
+    glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24,
+      $Tex_Width, $Tex_Height);
+    glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
+      GL_RENDERBUFFER_EXT, $RenderBufferID);
+
+    # Test status
+    if (DO_TESTS)
+    {
+      my $stat = glCheckFramebufferStatusEXT(GL_RENDERBUFFER_EXT);
+      printf("FBO Status: %04X\n",$stat);
+    }
+  }
+
+  # Select active texture
+  ourSelectTexture();
+
+  glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);
+}
+
+sub ourSelectTexture
+{
+    glBindTexture(GL_TEXTURE_2D, $FBO_On ? $TextureID_FBO : $TextureID_image);
+}
+
+sub ourInitShaders
+{
+  # Setup Vertex/Fragment Programs to render FBO texture
+
+  # Use OpenGL::Shader
+  if ($hasShader && ($Shader = new OpenGL::Shader()))
+  {
+    my $type = $Shader->GetType();
+    my $ext = lc($type);
+
+    my $stat = $Shader->LoadFiles("fragment.$ext","vertex.$ext");
+    if (!$stat)
+    {
+      my $ver = $Shader->GetVersion();
+      print "Using OpenGL::Shader('$type') v$ver\n";
+      return;
+    }
+    else
+    {
+      print "$stat\n";
+    }
+  }
+
+  # Fall back to doing it manually
+  if ($hasFragProg)
+  {
+    ($VertexProgID,$FragProgID) = glGenProgramsARB_p(2);
+
+    # NOP Vertex shader
+    my $VertexProg = qq
+    {!!ARBvp1.0
+      PARAM center = program.local[0];
+      PARAM xform[4] = {program.local[1..4]};
+      TEMP vertexClip;
+
+      # ModelView projection
+      DP4 vertexClip.x, state.matrix.mvp.row[0], vertex.position;
+      DP4 vertexClip.y, state.matrix.mvp.row[1], vertex.position;
+      DP4 vertexClip.z, state.matrix.mvp.row[2], vertex.position;
+      DP4 vertexClip.w, state.matrix.mvp.row[3], vertex.position;
+
+      # Additional transform, via matrix variable
+      DP4 vertexClip.x, vertexClip, xform[0];
+      DP4 vertexClip.y, vertexClip, xform[1];
+      DP4 vertexClip.z, vertexClip, xform[2];
+      DP4 vertexClip.w, vertexClip, xform[3];
+
+      #SUB result.position, vertexClip, center;
+      MOV result.position, vertexClip;
+
+      # Pass through color
+      MOV result.color, vertex.color;
+
+      # Pass through texcoords
+      SUB result.texcoord[0], vertex.texcoord, center;
+      END
+    };
+
+    glBindProgramARB(GL_VERTEX_PROGRAM_ARB, $VertexProgID);
+    glProgramStringARB_p(GL_VERTEX_PROGRAM_ARB, $VertexProg);
+
+    if (DO_TESTS)
+    {
+      my $format = glGetProgramivARB_p(GL_VERTEX_PROGRAM_ARB,
+        GL_PROGRAM_FORMAT_ARB);
+      printf("glGetProgramivARB_p format: '#%04X'\n",$format);
+
+      my @params = glGetProgramEnvParameterdvARB_p(GL_VERTEX_PROGRAM_ARB,0);
+      my $params = join(', ',@params);
+      print "glGetProgramEnvParameterdvARB_p: $params\n";
+
+      @params = glGetProgramEnvParameterfvARB_p(GL_VERTEX_PROGRAM_ARB,0);
+      $params = join(', ',@params);
+      print "glGetProgramEnvParameterfvARB_p: $params\n";
+
+      my $vprog = glGetProgramStringARB_p(GL_VERTEX_PROGRAM_ARB);
+      print "Vertex Prog: $vprog\n";
+    }
+
+    # Lazy Metalic Fragment shader
+    my $FragProg = qq
+    {!!ARBfp1.0
+      PARAM surfacecolor = program.local[5];
+      TEMP color;
+      MUL color, fragment.texcoord[0].y, 2.0;
+      ADD color, 1.0, -color;
+      ABS color, color;
+      ADD color, 1.01, -color;  #Some cards have a rounding error
+      MOV color.a, 1.0;
+      MUL color, color, surfacecolor;
+      MOV result.color, color;
+      END
+    };
+
+    glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, $FragProgID);
+    glProgramStringARB_p(GL_FRAGMENT_PROGRAM_ARB, $FragProg);
+
+    if (DO_TESTS)
+    {
+      my $fprog = glGetProgramStringARB_p(GL_FRAGMENT_PROGRAM_ARB);
+      print "Fragment Prog: $fprog\n";
+    }
+  }
+}
+
+
+# ------
+# Routine which actually does the drawing
+
+sub cbRenderScene
+{
+
+  print STDERR "in cbRenderScene\n";
+
+  # Quit if inactive
+  if ($idleSecsMax < (time()-$idleTime))
+  {
+    print "Idle timeout; completing test\n";
+    ourCleanup();
+    exit(0);
+  }
+
+  my $buf; # For our strings.
+
+  # Animated Texture Rendering
+  if ($FBO_On && ($FBO_On == 2 || !$FBO_rendered))
+  {
+    $FBO_rendered = 1;
+    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, $FrameBufferID);
+    glPushMatrix();
+    glTranslatef(-0.35, -0.48, -1.5);
+    glRotatef($Teapot_Rot--, 0.0, 1.0, 0.0);
+    glClearColor(0, 0, 0, 0);
+    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+    glPushAttrib(GL_ENABLE_BIT);
+    glEnable(GL_DEPTH_TEST);
+
+    # Run shader programs for texture.
+    # If installed, use OpenGL::Shader
+    if ($Shader)
+    {
+      $Shader->Enable();
+      $Shader->SetVector('center',0.0,0.0,2.0,0.0);
+      $Shader->SetMatrix('xform',$xform);
+      $Shader->SetVector('surfacecolor',1.0,0.5,0.0,1.0);
+    }
+    # Otherwise, do it manually
+    elsif ($hasFragProg)
+    {
+      glEnable(GL_VERTEX_PROGRAM_ARB);
+      glEnable(GL_FRAGMENT_PROGRAM_ARB);
+
+      glProgramLocalParameter4fARB(GL_VERTEX_PROGRAM_ARB, 0, 0.0,0.0,2.0,0.0);
+
+      glProgramLocalParameter4fvARB_c(GL_VERTEX_PROGRAM_ARB, 1, $xform->offset(0));
+      glProgramLocalParameter4fvARB_c(GL_VERTEX_PROGRAM_ARB, 2, $xform->offset(4));
+      glProgramLocalParameter4fvARB_c(GL_VERTEX_PROGRAM_ARB, 3, $xform->offset(8));
+      glProgramLocalParameter4fvARB_c(GL_VERTEX_PROGRAM_ARB, 4, $xform->offset(12));
+
+      glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 5, 1.0,0.5,0.0,1.0);
+    }
+
+    glColor3f(1.0, 1.0, 1.0);
+    #glutSolidTeapot(0.125);
+    glutWireTeapot(0.125);
+    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+
+    if ($Shader)
+    {
+      $Shader->Disable();
+    }
+    elsif ($hasFragProg)
+    {
+      glDisable(GL_FRAGMENT_PROGRAM_ARB);
+      glDisable(GL_VERTEX_PROGRAM_ARB);
+    }
+
+    glPopAttrib();
+    glPopMatrix();
+  }
+
+  print STDERR "in cbRenderScene: ourSelectTexture\n";
+
+  ourSelectTexture();
+
+  # Enables, disables or otherwise adjusts as
+  # appropriate for our current settings.
+
+  if ($Texture_On)
+  {
+    glEnable(GL_TEXTURE_2D);
+  }
+  else
+  {
+    glDisable(GL_TEXTURE_2D);
+  }
+  if ($Light_On)
+  {
+    glEnable(GL_LIGHTING);
+  }
+  else
+  {
+    glDisable(GL_LIGHTING);
+  }
+  if ($Alpha_Add)
+  {
+    glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+  }
+  else
+  {
+    glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
+  }
+  # If we're blending, we don'$t want z-buffering.
+  if ($Blend_On)
+  {
+    glDisable(GL_DEPTH_TEST);
+  }
+  else
+  {
+    glEnable(GL_DEPTH_TEST);
+  }
+
+  # Need to manipulate the ModelView matrix to move our model around.
+  glMatrixMode(GL_MODELVIEW);
+
+  # Reset to 0,0,0; no rotation, no scaling.
+  glLoadIdentity();
+
+  # Move the object back from the screen.
+  glTranslatef(0.0,0.0,$Z_Off);
+
+  # Rotate the calculated amount.
+  glRotatef($X_Rot,1.0,0.0,0.0);
+  glRotatef($Y_Rot,0.0,1.0,0.0);
+
+  # Clear the color and depth buffers.
+  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+
+
+  print STDERR "in cbRenderScene: before Rainbow Cube Face\n";
+
+  # Update Rainbow Cube Face
+  for (my $i=0; $i<scalar(@rainbow); $i++)
+  {
+    $rainbow[$i] += $rainbow_inc[$i];
+    if ($rainbow[$i] < 0)
+    {
+      $rainbow[$i] = 0.0;
+    }
+    elsif ($rainbow[$i] > 1)
+    {
+      $rainbow[$i] = 1.0;
+    }
+    else
+    {
+      next;
+    }
+    $rainbow_inc[$i] = -$rainbow_inc[$i];
+  }
+
+  if ($hasVBO)
+  {
+    glBindBufferARB(GL_ARRAY_BUFFER_ARB, $ColorObjID);
+    my $color_map = glMapBufferARB_p(GL_ARRAY_BUFFER_ARB,
+      GL_WRITE_ONLY_ARB,GL_FLOAT);
+    my $buffer = glGetBufferPointervARB_p(GL_ARRAY_BUFFER_ARB,
+      GL_BUFFER_MAP_POINTER_ARB,GL_FLOAT);
+    $color_map->assign($rainbow_offset,@rainbow);
+    glUnmapBufferARB(GL_ARRAY_BUFFER_ARB);
+  }
+  else
+  {
+    $colors->assign($rainbow_offset,@rainbow);
+    glColorPointer_p(4, $colors);
+  }
+
+
+  # Render cube
+  glEnableClientState(GL_VERTEX_ARRAY);
+  glEnableClientState(GL_NORMAL_ARRAY);
+  glEnableClientState(GL_COLOR_ARRAY);
+  glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+
+  for (my $i=0; $i<scalar(@indices); $i+=4)
+  {
+    glDrawArrays(GL_QUADS, $i, 4);
+  }
+
+  glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+  glDisableClientState(GL_COLOR_ARRAY);
+  glDisableClientState(GL_NORMAL_ARRAY);
+  glDisableClientState(GL_VERTEX_ARRAY);
+
+
+  print STDERR "in cbRenderScene: after Render cube\n";
+
+  # Move back to the origin (for the text, below).
+  glLoadIdentity();
+
+  # We need to change the projection matrix for the text rendering.
+  glMatrixMode(GL_PROJECTION);
+
+  # But we like our current view too; so we save it here.
+  glPushMatrix();
+
+  # Now we set up a new projection for the text.
+  glLoadIdentity();
+  glOrtho(0,$Window_Width,0,$Window_Height,-1.0,1.0);
+
+  # Lit or textured text looks awful.
+  glDisable(GL_TEXTURE_2D);
+  glDisable(GL_LIGHTING);
+
+  # We don'$t want depth-testing either.
+  glDisable(GL_DEPTH_TEST);
+
+  # But, for fun, let's make the text partially transparent too.
+  glColor4f(0.6,1.0,0.6,.75);
+
+  # Render our various display mode settings.
+  $buf = sprintf "Mode: %s", $TexModesStr[$Curr_TexMode];
+  glRasterPos2i(2,2); ourPrintString(GLUT_BITMAP_HELVETICA_12,$buf);
+
+  $buf = sprintf "Alpha: %d", $Alpha_Add;
+  glRasterPos2i(2,14); ourPrintString(GLUT_BITMAP_HELVETICA_12,$buf);
+
+  $buf = sprintf "Blend: %d", $Blend_On;
+  glRasterPos2i(2,26); ourPrintString(GLUT_BITMAP_HELVETICA_12,$buf);
+
+  $buf = sprintf "Light: %d", $Light_On;
+  glRasterPos2i(2,38); ourPrintString(GLUT_BITMAP_HELVETICA_12,$buf);
+
+  $buf = sprintf "Tex: %d", $Texture_On;
+  glRasterPos2i(2,50); ourPrintString(GLUT_BITMAP_HELVETICA_12,$buf);
+
+  $buf = sprintf "FBO: %d", $FBO_On;
+  glRasterPos2i(2,62); ourPrintString(GLUT_BITMAP_HELVETICA_12,$buf);
+
+  $buf = sprintf "Inset: %d", $Inset_On;
+  glRasterPos2i(2,74); ourPrintString(GLUT_BITMAP_HELVETICA_12,$buf);
+
+  # Now we want to render the calulated FPS at the top.
+  # To ease, simply translate up.  Note we're working in screen
+  # pixels in this projection.
+  glTranslatef(6.0,$Window_Height - 14,0.0);
+
+  # Make sure we can read the FPS section by first placing a
+  # dark, mostly opaque backdrop rectangle.
+  glColor4f(0.2,0.2,0.2,0.75);
+
+  glBegin(GL_QUADS);
+  glVertex3f(  0.0, -2.0, 0.0);
+  glVertex3f(  0.0, 12.0, 0.0);
+  glVertex3f(140.0, 12.0, 0.0);
+  glVertex3f(140.0, -2.0, 0.0);
+  glEnd();
+
+  glColor4f(0.9,0.2,0.2,.75);
+  $buf = sprintf "FPS: %f F: %2d", $FrameRate, $FrameCount;
+  glRasterPos2i(6,0);
+  ourPrintString(GLUT_BITMAP_HELVETICA_12,$buf);
+
+  # Done with this special projection matrix.  Throw it away.
+  glPopMatrix();
+
+
+  print STDERR "in cbRenderScene: before Inset View\n";
+
+  # Do Inset View
+  Capture(Inset=>1) if ($Inset_On);
+
+
+  print STDERR "in cbRenderScene: before glutSwapBuffers\n";
+
+  # All done drawing.  Let's show it.
+  glutSwapBuffers();
+
+
+  print STDERR "in cbRenderScene: after glutSwapBuffers\n";
+
+  # Now let's do the motion calculations.
+  $X_Rot+=$X_Speed;
+  $Y_Rot+=$Y_Speed;
+
+  # And collect our statistics.
+  ourDoFPS();
+}
+
+# Capture window
+sub Capture
+{
+  my(%params) = @_;
+
+  my($w) = glutGet( GLUT_WINDOW_WIDTH );
+  my($h) = glutGet( GLUT_WINDOW_HEIGHT );
+	
+  glPushAttrib( GL_ENABLE_BIT | GL_VIEWPORT_BIT |
+    GL_TRANSFORM_BIT | GL_COLOR_BUFFER_BIT);
+  glDisable( GL_LIGHTING );
+  glDisable( GL_FOG );
+  glDisable( GL_TEXTURE_2D );
+  glDisable( GL_DEPTH_TEST );
+  glDisable( GL_CULL_FACE );
+  glDisable( GL_STENCIL_TEST );
+ 
+  glViewport( 0, 0, $w, $h );
+  glMatrixMode( GL_PROJECTION );
+  glPushMatrix();
+  glLoadIdentity();
+  eval { gluOrtho2D( 0, $w, 0, $h ); 1 } or $er++ or warn "Catched: $@";
+  glMatrixMode( GL_MODELVIEW );
+  glPushMatrix();
+  glLoadIdentity();
+  
+  glPixelZoom( 1, 1 );
+
+
+  print STDERR "in Capture: before Save or Inset\n";
+
+  # Save
+  if ($params{Save})
+  {
+    Save($w,$h,$params{Save});
+  }
+  # Inset
+  elsif ($params{Inset})
+  {
+    Inset($w,$h);
+  }
+
+
+  print STDERR "in Capture: before Save or Inset\n";
+
+  glMatrixMode( GL_PROJECTION );
+  glPopMatrix();
+  glMatrixMode( GL_MODELVIEW );
+  glPopMatrix();
+  glPopAttrib();
+}
+
+# Display inset
+sub Inset
+{
+  my($w,$h) = @_;
+
+  my $Capture_X = int(($w - $Inset_Width) / 2);
+  my $Capture_Y = int(($h - $Inset_Height) / 2);
+  my $Inset_X = $w - ($Inset_Width + 2);
+  my $Inset_Y = $h - ($Inset_Height + 2);
+
+  # Using OpenGL::Image and ImageMagick to read/modify/draw pixels
+  if ($hasIM_635)
+  {
+
+     print STDERR "in Inset: using \$hasIM_635\n";
+
+    my $frame = new OpenGL::Image(engine=>'Magick',
+      width=>$Inset_Width, height=>$Inset_Height);
+    my($fmt,$size) = $frame->Get('gl_format','gl_type');
+
+    glReadPixels_c( $Capture_X, $Capture_Y, $Inset_Width, $Inset_Height,
+      $fmt, $size, $frame->Ptr() );
+
+    # Do this before making native calls
+    $frame->Sync();
+
+    # For grins, use ImageMagick to modify the inset
+    $frame->Native->Blur(radius=>2,sigma=>2);
+
+    # Do this when done making native calls
+    $frame->SyncOGA();
+
+    glRasterPos2f( $Inset_X, $Inset_Y );
+    glDrawPixels_c( $Inset_Width, $Inset_Height, $fmt, $size, $frame->Ptr() );
+  }
+  # Fastest approach
+  else
+  {
+
+     print STDERR "in Inset: using hardwired parameters\n";
+
+    my $len = $Inset_Width * $Inset_Height * 4;
+    my $oga = new OpenGL::Array($len,GL_UNSIGNED_BYTE);
+
+    glReadPixels_c( $Capture_X, $Capture_Y, $Inset_Width, $Inset_Height,
+      GL_RGBA, GL_UNSIGNED_BYTE, $oga->ptr() );
+    glRasterPos2f( $Inset_X, $Inset_Y );
+    glDrawPixels_c( $Inset_Width, $Inset_Height, GL_RGBA, GL_UNSIGNED_BYTE, $oga->ptr() );
+  }
+}
+
+# Capture/save window
+sub Save
+{
+  my($w,$h,$file) = @_;
+
+  if ($hasImage)
+  {
+    my $frame = new OpenGL::Image(width=>$w, height=>$h);
+    my($fmt,$size) = $frame->Get('gl_format','gl_type');
+
+    glReadPixels_c( 0, 0, $w, $h, $fmt, $size, $frame->Ptr() );
+    $frame->Save($file);
+  }
+  else
+  {
+    print "Need OpenGL::Image and ImageMagick 6.3.5 or newer for file capture!\n";
+  }
+}
+
+# Cleanup routine
+sub ourCleanup
+{
+  # Disable app
+  glutHideWindow();
+  glutKeyboardUpFunc();
+  glutKeyboardFunc();
+  glutSpecialUpFunc();
+  glutSpecialFunc();
+  glutIdleFunc();
+  glutReshapeFunc();
+
+  ReleaseResources();
+
+  # Now you can destroy window
+  if (defined($gameMode))
+  {
+    glutLeaveGameMode();
+  }
+  else
+  {
+    glutDestroyWindow($Window_ID);
+  }
+  undef($Window_ID);
+}
+
+sub ReleaseResources
+{
+  return if (!defined($Window_ID));
+
+  if ($hasFBO)
+  {
+    # Release resources
+    glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, 0 );
+    glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 );
+
+    glDeleteRenderbuffersEXT_p( $RenderBufferID ) if ($RenderBufferID);
+    glDeleteFramebuffersEXT_p( $FrameBufferID ) if ($FrameBufferID);
+  }
+
+  if ($Shader)
+  {
+    undef($Shader);
+  }
+  elsif ($hasFragProg)
+  {
+    glBindProgramARB(GL_VERTEX_PROGRAM_ARB, 0);
+    glDeleteProgramsARB_p( $VertexProgID ) if ($VertexProgID);
+
+    glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, 0);
+    glDeleteProgramsARB_p( $FragProgID ) if ($FragProgID);
+  }
+
+  if ($hasVBO)
+  {
+    glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
+    glDeleteBuffersARB_p($VertexObjID) if ($VertexObjID);
+    glDeleteBuffersARB_p($NormalObjID) if ($NormalObjID);
+    glDeleteBuffersARB_p($ColorObjID) if ($ColorObjID);
+    glDeleteBuffersARB_p($TexCoordObjID) if ($TexCoordObjID);
+
+    glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
+    glDeleteBuffersARB_p($IndexObjID) if ($IndexObjID);
+  }
+
+  glDeleteTextures_p($TextureID_image,$TextureID_FBO);
+}
+
+# ------
+# Callback function called when a normal $key is pressed.
+
+sub cbKeyPressed
+{
+  my $key = shift;
+  my $c = uc chr $key;
+  if ($key == 27 or $c eq 'Q')
+  {
+    ourCleanup();
+    exit(0);
+  }
+  elsif ($c eq 'B')
+  {
+    $Blend_On = !$Blend_On;
+    if (!$Blend_On)
+    {
+      glDisable(GL_BLEND);
+    }
+    else {
+      glEnable(GL_BLEND);
+    }
+  }
+  elsif ($c eq 'K')
+  {
+    # ignore keypress if not FreeGLUT
+    glutLeaveMainLoop() if OpenGL::_have_freeglut();
+  }
+  elsif ($c eq 'L')
+  {
+    $Light_On = !$Light_On;
+  }
+  elsif ($c eq 'M')
+  {
+    if ( ++ $Curr_TexMode > 3 )
+    {
+      $Curr_TexMode=0;
+    }
+    glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,$TexModes[$Curr_TexMode]);
+  }
+  elsif ($c eq 'T')
+  {
+    $Texture_On = !$Texture_On;
+  }
+  elsif ($c eq 'A')
+  {
+    $Alpha_Add = !$Alpha_Add;
+  }
+  elsif ($c eq 'F' && $hasFBO)
+  {
+    $FBO_On = ($FBO_On+1) % 3;
+    ourSelectTexture();
+  }
+  elsif ($c eq 'I')
+  {
+    $Inset_On = !$Inset_On;
+  }
+  elsif ($c eq 'S' or $key == 32)
+  {
+    $X_Speed=$Y_Speed=0;
+  }
+  elsif ($c eq 'R')
+  {
+    $X_Speed = -$X_Speed;
+    $Y_Speed = -$Y_Speed;
+  }
+  elsif ($c eq 'G')
+  {
+    $Fullscreen_On = !$Fullscreen_On;
+    if ($Fullscreen_On)
+    {
+      $Window_State = glpFullScreen();
+      $Window_Width = $Window_State->{w};
+      $Window_Height = $Window_State->{h};
+    }
+    else
+    {
+      glpRestoreScreen($Window_State);
+    }
+  }
+  elsif ($c eq 'C' && $hasImage)
+  {
+    Capture(Save=>'capture.tga');
+  }
+  else
+  {
+    printf "KP: No action for %d.\n", $key;
+  }
+
+  $idleTime = time();
+}
+
+# ------
+# Callback Function called when a special $key is pressed.
+
+sub cbSpecialKeyPressed
+{
+  my $key = shift;
+
+  if ($key == GLUT_KEY_PAGE_UP)
+  {
+    $Z_Off -= 0.05;
+  }
+  elsif ($key == GLUT_KEY_PAGE_DOWN)
+  {
+    $Z_Off += 0.05;
+  }
+  elsif ($key == GLUT_KEY_UP)
+  {
+    $X_Speed -= 0.01;
+  }
+  elsif ($key == GLUT_KEY_DOWN)
+  {
+    $X_Speed += 0.01;
+  }
+  elsif ($key == GLUT_KEY_LEFT)
+  {
+    $Y_Speed -= 0.01;
+  }
+  elsif ($key == GLUT_KEY_RIGHT)
+  {
+    $Y_Speed += 0.01;
+  }
+  else
+  {
+    printf "SKP: No action for %d.\n", $key;
+  }
+
+  $idleTime = time();
+}
+
+# ------
+# Callback function called for key-up events.
+
+sub cbKeyUp
+{
+  my($key) = @_;
+  my $mod = GetKeyModifier();
+  print "Key up: $key w/ $mod\n" if ($mod);
+}
+
+# ------
+# Callback function called for special key-up events.
+
+sub cbSpecialKeyUp
+{
+  my($key) = @_;
+  my $mod = GetKeyModifier();
+  print "Special Key up: $key w/ $mod\n" if ($mod);
+}
+
+# ------
+# Callback function called for handling mouse clicks.
+
+sub cbMouseClick
+{
+  my($button,$state,$x,$y) = @_;
+
+  if ($button == GLUT_LEFT_BUTTON)
+  {
+    print "Left";
+  }
+  elsif ($button == GLUT_MIDDLE_BUTTON)
+  {
+    print "Middle";
+  }
+  elsif ($button == GLUT_RIGHT_BUTTON)
+  {
+    print "Right";
+  }
+  else
+  {
+    print "Unknown";
+  }
+  print " mouse button, ";
+
+  if ($state == GLUT_DOWN)
+  {
+    print "DOWN";
+  }
+  elsif ($state == GLUT_UP)
+  {
+    print "UP";
+  }
+  else
+  {
+    print "State UNKNOWN";
+  }
+
+  my $mod = GetKeyModifier();
+  print " w/ $mod" if ($mod);
+  print ": $x, $y\n";
+
+  # Example of using GLU to determine 3D click points
+  if ($state == GLUT_UP)
+  {
+    print "\n";
+
+    glGetDoublev_c(GL_MODELVIEW_MATRIX,$mm->ptr());
+    my @model = $mm->retrieve(0,16);
+
+    glGetDoublev_c(GL_PROJECTION_MATRIX,$pm->ptr());
+    my @projection = $pm->retrieve(0,16);
+
+    glGetIntegerv_c(GL_VIEWPORT,$vp->ptr());
+    my @viewport = $vp->retrieve(0,4);
+
+    print "Model Matrix:      $model[0], $model[1], $model[2], $model[3]\n";
+    print "                   $model[4], $model[5], $model[6], $model[7]\n";
+    print "                   $model[8], $model[9], $model[10], $model[11]\n";
+    print "                   $model[12], $model[13], $model[14], $model[15]\n";
+
+    print "Projection Matrix: $projection[0], $projection[1], $projection[2], $projection[3]\n";
+    print "                   $projection[4], $projection[5], $projection[6], $projection[7]\n";
+    print "                   $projection[8], $projection[9], $projection[10], $projection[11]\n";
+    print "                   $projection[12], $projection[13], $projection[14], $projection[15]\n";
+
+    print "Viewport: $viewport[0], $viewport[1], $viewport[2], $viewport[3]\n";
+    print "\n";
+
+    my @point = gluUnProject_p($x,$y,0,	# Cursor point
+      @model,				# Model Matrix
+      @projection,			# Projection Matrix
+      @viewport);			# Viewport
+    print "Model point: $point[0], $point[1], $point[2]\n";
+
+#    @point = gluProject_p(@point,	# Model point
+#      @model,				# Model Matrix
+#      @projection,			# Projection Matrix
+#      @viewport);			# Viewport
+#    print "Window point: $point[0], $point[1], $point[2]\n";
+    print "\n";
+  }
+
+  $idleTime = time();
+}
+
+sub GetKeyModifier
+{
+  return $key_mods->{glutGetModifiers()};
+}
+
+# ------
+# Callback routine executed whenever our window is resized.  Lets us
+# request the newly appropriate perspective projection matrix for
+# our needs.  Try removing the gluPerspective() call to see what happens.
+
+sub cbResizeScene
+{
+  my($Width, $Height) = @_;
+
+  # Let's not core dump, no matter what.
+  $Height = 1 if ($Height == 0);
+
+  glViewport(0, 0, $Width, $Height);
+
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  gluPerspective(45.0,$Width/$Height,0.1,100.0);
+
+  glMatrixMode(GL_MODELVIEW);
+
+  $Window_Width  = $Width;
+  $Window_Height = $Height;
+
+  $idleTime = time();
+}
+
+sub cbWindowStat
+{
+  my($stat) = @_;
+  print "Window status: $stat\n";
+}
+
+sub cbClose
+{
+  my($wid) = @_;
+  print "User has closed window: \#$wid\n";
+  ReleaseResources();
+}
+
+# ------
+# The main() function.  Inits OpenGL.  Calls our own init function,
+# then passes control onto OpenGL.
+
+# Initialize GLUT/FreeGLUT
+glutInit();
+
+# To see OpenGL drawing, take out the GLUT_DOUBLE request.
+glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH | GLUT_ALPHA);
+
+if ($^O ne 'MSWin32' and $OpenGL::Config->{DEFINE} !~ /-DHAVE_W32API/) { # skip these MODE checks on win32, they don't work
+
+   if (not glutGet(GLUT_DISPLAY_MODE_POSSIBLE))
+   {
+      warn "glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH | GLUT_ALPHA) not possible";
+      warn "...trying without GLUT_ALPHA";
+      # try without GLUT_ALPHA
+      glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
+      if (not glutGet(GLUT_DISPLAY_MODE_POSSIBLE))
+      {
+         warn "glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH) not possible, exiting quietly";
+         exit 0;
+      }
+   }
+
+}
+
+#glutInitDisplayString("rgb alpha>=0 double depth");
+
+# Open Window
+if (defined($gameMode) && glutGameModeString($gameMode))
+{
+  print "Running in Game Mode $gameMode\n";
+  glutGameModeString($gameMode);
+  $Window_ID = glutEnterGameMode();
+  $Window_Width = glutGameModeGet( GLUT_GAME_MODE_WIDTH );
+  $Window_Height = glutGameModeGet( GLUT_GAME_MODE_HEIGHT );
+}
+else
+{
+  glutInitWindowSize($Window_Width, $Window_Height);
+  $Window_ID = glutCreateWindow( PROGRAM_TITLE );
+}
+
+# Get OpenGL Info
+print "\n";
+print PROGRAM_TITLE;
+print ' (using hires timer)' if ($hasHires);
+print "\n\n";
+my $version = glGetString(GL_VERSION);
+my $vendor = glGetString(GL_VENDOR);
+my $renderer = glGetString(GL_RENDERER);
+print "Using POGL v$OpenGL::BUILD_VERSION\n";
+print "OpenGL installation: $version\n$vendor\n$renderer\n\n";
+
+print "Installed extensions (* implemented in the module):\n";
+my $extensions = glGetString(GL_EXTENSIONS);
+my @extensions = split(' ',$extensions);
+foreach my $ext (sort @extensions)
+{
+  my $stat = glpCheckExtension($ext);
+  printf("%s $ext\n",$stat?' ':'*');
+  print("    $stat\n") if ($stat && $stat !~ m|^$ext |);
+}
+
+if (!OpenGL::glpCheckExtension('GL_ARB_vertex_buffer_object'))
+{
+  #$hasVBO = 1;
+  # Perl 5.10 crashes on VBOs!
+  $hasVBO = ($PERL_VERSION !~ m|^5\.10\.|);
+  $hasVBO = 0;   ####
+}
+
+if (!OpenGL::glpCheckExtension('GL_EXT_framebuffer_object'))
+{
+  $hasFBO = 0;
+  $FBO_On = 0;
+
+  if (!OpenGL::glpCheckExtension('GL_ARB_fragment_program'))
+  {
+    $hasFragProg = 0;
+    $FBO_On = 0;
+  }
+}
+
+
+# Register the callback function to do the drawing.
+glutDisplayFunc(\&cbRenderScene);
+
+# If there's nothing to do, draw.
+glutIdleFunc(\&cbRenderScene);
+
+# It's a good idea to know when our window's resized.
+glutReshapeFunc(\&cbResizeScene);
+#glutWindowStatusFunc(\&cbWindowStat);
+
+# And let's get some keyboard input.
+glutKeyboardFunc(\&cbKeyPressed);
+glutSpecialFunc(\&cbSpecialKeyPressed);
+glutKeyboardUpFunc(\&cbKeyUp);
+glutSpecialUpFunc(\&cbSpecialKeyUp);
+
+# Mouse handlers.
+glutMouseFunc(\&cbMouseClick);
+#glutMotionFunc(\&cbMouseDrag);
+#glutPassiveMotionFunc(\&cbMouseTrack);
+
+# Handle window close events.
+glutCloseFunc(\&cbClose) if OpenGL::_have_freeglut();
+
+# OK, OpenGL's ready to go.  Let's call our own init function.
+ourInit($Window_Width, $Window_Height);
+
+
+# Print out a bit of help dialog.
+print qq
+{
+Hold down arrow keys to rotate, 'r' to reverse, 's' to stop.
+Page up/down will move cube away from/towards camera.
+Use first letter of shown display mode settings to alter.
+Press 'g' to toggle fullscreen mode (not supported on all platforms).
+Press 'c' to capture/save a RGBA targa file.
+'q' or [Esc] to quit; OpenGL window must have focus for input.
+
+};
+
+# Pass off control to OpenGL.
+# Above functions are called as appropriate.
+if (OpenGL::_have_freeglut()) {
+   glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE,GLUT_ACTION_GLUTMAINLOOP_RETURNS)
+}
+
+glutMainLoop();
+
+print "FreeGLUT returned from MainLoop\n";
+
+__END__
diff --git a/var/tmp/source/CHM/OpenGL-0.6703/OpenGL-0.6703/include/GL/SGIFreeSWLicB.1.1.pdf b/var/tmp/source/CHM/OpenGL-0.6703/OpenGL-0.6703/include/GL/SGIFreeSWLicB.1.1.pdf
new file mode 100644
index 00000000..ff4f0594
Binary files /dev/null and b/var/tmp/source/CHM/OpenGL-0.6703/OpenGL-0.6703/include/GL/SGIFreeSWLicB.1.1.pdf differ
@@ -0,0 +1,1484 @@
+/*  Last saved: Tue 02 Apr 2013 02:26:51 PM */
+
+/*  Copyright (c) 1998 Kenneth Albanowski. All rights reserved.
+ *  Copyright (c) 2007 Bob Free. All rights reserved.
+ *  Copyright (c) 2009 Chris Marshall. All rights reserved.
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the same terms as Perl itself.
+ */
+
+#include <stdio.h>
+
+#include "pgopogl.h"
+
+
+/* glut_util.h is where you include the appropriate GLUT header
+ * file based on what is available.  It also defines some constants
+ * that may not be defined everywhere.  Replace this by user
+ * specified include information for the include and compile-time
+ * perl constants rather than some special cases
+ */
+#include "glut_util.h"
+
+
+/* TODO: calculate this from the actual GLUT include file */
+#ifndef GLUT_API_VERSION
+#define GLUT_API_VERSION 4
+#endif
+
+static int _done_glutInit = 0;
+
+
+/* Macros for GLUT callback and handler declarations */
+#  define DO_perl_call_sv(handler, flag) perl_call_sv(handler, flag)
+#  define ENSURE_callback_thread
+#  define GLUT_PUSH_NEW_SV(sv)		XPUSHs(sv_2mortal(newSVsv(sv)))
+#  define GLUT_PUSH_NEW_IV(i)		XPUSHs(sv_2mortal(newSViv(i)))
+#  define GLUT_PUSH_NEW_U8(c)		XPUSHs(sv_2mortal(newSViv((int)c)))
+#  define GLUT_EXTEND_STACK(sp,n)
+#  define GLUT_PUSHMARK(sp)		PUSHMARK(sp)
+
+
+/* Set up for all the GLUT callback handlers */
+static AV * glut_handlers = 0;
+
+/* Attach a handler to a window */
+static void set_glut_win_handler(int win, int type, SV * data)
+{
+	SV ** h;
+	AV * a;
+	
+	if (!glut_handlers)
+		glut_handlers = newAV();
+	
+	h = av_fetch(glut_handlers, win, FALSE);
+	
+	if (!h) {
+		a = newAV();
+		av_store(glut_handlers, win, newRV_inc((SV*)a));
+		SvREFCNT_dec(a);
+	} else if (!SvOK(*h) || !SvROK(*h))
+		croak("Unable to establish glut handler");
+	else 
+		a = (AV*)SvRV(*h);
+	
+	av_store(a, type, newRV_inc(data));
+	SvREFCNT_dec(data);
+}
+
+/* Get a window's handler */
+static SV * get_glut_win_handler(int win, int type)
+{
+	SV ** h;
+	
+	if (!glut_handlers)
+		croak("Unable to locate glut handler");
+	
+	h = av_fetch(glut_handlers, win, FALSE);
+
+	if (!h || !SvOK(*h) || !SvROK(*h))
+		croak("Unable to locate glut handler");
+	
+	h = av_fetch((AV*)SvRV(*h), type, FALSE);
+	
+	if (!h || !SvOK(*h) || !SvROK(*h))
+		croak("Unable to locate glut handler");
+
+	return SvRV(*h);
+}
+
+/* Release a window's handlers */
+static void destroy_glut_win_handlers(int win)
+{
+	SV ** h;
+	
+	if (!glut_handlers)
+		return;
+	
+	h = av_fetch(glut_handlers, win, FALSE);
+	
+	if (!h || !SvOK(*h) || !SvROK(*h))
+		return;
+
+	av_store(glut_handlers, win, newSVsv(&PL_sv_undef));
+}
+
+/* Release a handler */
+static void destroy_glut_win_handler(int win, int type)
+{
+	SV ** h;
+	AV * a;
+	
+	if (!glut_handlers)
+		glut_handlers = newAV();
+	
+	h = av_fetch(glut_handlers, win, FALSE);
+	
+	if (!h || !SvOK(*h) || !SvROK(*h))
+		return;
+
+	a = (AV*)SvRV(*h);
+	
+	av_store(a, type, newSVsv(&PL_sv_undef));
+}
+
+/* Begin window callback definition */
+#define begin_decl_gwh(type, params, nparam)				\
+									\
+static void generic_glut_ ## type ## _handler params			\
+{									\
+	int win = glutGetWindow();					\
+	AV * handler_data = (AV*)get_glut_win_handler(win, HANDLE_GLUT_ ## type);\
+	SV * handler;							\
+	int i;								\
+	dSP;								\
+									\
+	handler = *av_fetch(handler_data, 0, 0);			\
+									\
+	GLUT_PUSHMARK(sp);						\
+	GLUT_EXTEND_STACK(sp,av_len(handler_data)+nparam);		\
+	for (i=1;i<=av_len(handler_data);i++)				\
+		GLUT_PUSH_NEW_SV(*av_fetch(handler_data, i, 0));
+
+/* End window callback definition */
+#define end_decl_gwh()							\
+	PUTBACK;							\
+	DO_perl_call_sv(handler, G_DISCARD);				\
+}
+
+/* Activate a window callback handler */
+#define decl_gwh_xs(type)						\
+	{								\
+		int win = glutGetWindow();				\
+									\
+		if (!handler || !SvOK(handler)) {			\
+			destroy_glut_win_handler(win, HANDLE_GLUT_ ## type);\
+			glut ## type ## Func(NULL);			\
+		} else {						\
+			AV * handler_data = newAV();			\
+									\
+			PackCallbackST(handler_data, 0);		\
+									\
+			set_glut_win_handler(win, HANDLE_GLUT_ ## type, (SV*)handler_data);\
+									\
+			glut ## type ## Func(generic_glut_ ## type ## _handler);\
+		}							\
+	ENSURE_callback_thread;}
+
+/* Activate a window callback handler; die on failure */
+#define decl_gwh_xs_nullfail(type, fail)				\
+	{								\
+		int win = glutGetWindow();				\
+									\
+		if (!handler || !SvOK(handler)) {			\
+			croak fail;					\
+		} else {						\
+			AV * handler_data = newAV();			\
+									\
+			PackCallbackST(handler_data, 0);		\
+									\
+			set_glut_win_handler(win, HANDLE_GLUT_ ## type, (SV*)handler_data);\
+									\
+			glut ## type ## Func(generic_glut_ ## type ## _handler);\
+		}							\
+	ENSURE_callback_thread;}
+
+
+/* Activate a global state callback handler */
+#define decl_ggh_xs(type)						\
+	{								\
+		if (glut_ ## type ## _handler_data)			\
+			SvREFCNT_dec(glut_ ## type ## _handler_data);	\
+									\
+		if (!handler || !SvOK(handler)) {			\
+			glut_ ## type ## _handler_data = 0;		\
+			glut ## type ## Func(NULL);			\
+		} else {						\
+			AV * handler_data = newAV();			\
+									\
+			PackCallbackST(handler_data, 0);		\
+									\
+			glut_ ## type ## _handler_data = handler_data;	\
+									\
+			glut ## type ## Func(generic_glut_ ## type ## _handler);\
+		}							\
+	ENSURE_callback_thread;}
+
+
+/* Begin a global state callback definition */
+#define begin_decl_ggh(type, params, nparam)				\
+									\
+static AV * glut_ ## type ## _handler_data = 0;				\
+									\
+static void generic_glut_ ## type ## _handler params			\
+{									\
+	AV * handler_data = glut_ ## type ## _handler_data;		\
+	SV * handler;							\
+	int i;								\
+	dSP;								\
+									\
+	handler = *av_fetch(handler_data, 0, 0);			\
+									\
+	GLUT_PUSHMARK(sp);						\
+	GLUT_EXTEND_STACK(sp,av_len(handler_data)+nparam);		\
+	for (i=1;i<=av_len(handler_data);i++)				\
+		GLUT_PUSH_NEW_SV(*av_fetch(handler_data, i, 0));
+
+/* End a global state callback definition */
+#define end_decl_ggh()							\
+	PUTBACK;							\
+	DO_perl_call_sv(handler, G_DISCARD);				\
+}
+
+/* Define callbacks */
+enum {
+	HANDLE_GLUT_Display,
+	HANDLE_GLUT_OverlayDisplay,
+	HANDLE_GLUT_Reshape,
+	HANDLE_GLUT_Keyboard,
+	HANDLE_GLUT_KeyboardUp,
+	HANDLE_GLUT_Mouse,
+        HANDLE_GLUT_MouseWheel,             /* Open/FreeGLUT -chm */
+	HANDLE_GLUT_Motion,
+	HANDLE_GLUT_PassiveMotion,
+	HANDLE_GLUT_Entry,
+	HANDLE_GLUT_Visibility,
+	HANDLE_GLUT_WindowStatus,
+	HANDLE_GLUT_Special,
+	HANDLE_GLUT_SpecialUp,
+        HANDLE_GLUT_Joystick,               /* Open/FreeGLUT -chm */
+	HANDLE_GLUT_SpaceballMotion,
+	HANDLE_GLUT_SpaceballRotate,
+	HANDLE_GLUT_SpaceballButton,
+	HANDLE_GLUT_ButtonBox,
+	HANDLE_GLUT_Dials,
+	HANDLE_GLUT_TabletMotion,
+	HANDLE_GLUT_TabletButton,
+        HANDLE_GLUT_MenuDestroy,            /* Open/FreeGLUT -chm */
+	HANDLE_GLUT_Close,                  /* Open/FreeGLUT -chm */
+	HANDLE_GLUT_WMClose,                /* AGL GLUT      -chm */
+};
+
+/* Callback for glutDisplayFunc */
+begin_decl_gwh(Display, (void), 0)
+end_decl_gwh()
+
+/* Callback for glutOverlayDisplayFunc */
+begin_decl_gwh(OverlayDisplay, (void), 0)
+end_decl_gwh()
+
+/* Callback for glutReshapeFunc */
+begin_decl_gwh(Reshape, (int width, int height), 2)
+	GLUT_PUSH_NEW_IV(width);
+	GLUT_PUSH_NEW_IV(height);
+end_decl_gwh()
+
+/* Callback for glutKeyboardFunc */
+begin_decl_gwh(Keyboard, (unsigned char key, int width, int height), 3)
+	GLUT_PUSH_NEW_U8(key);
+	GLUT_PUSH_NEW_IV(width);
+	GLUT_PUSH_NEW_IV(height);
+end_decl_gwh()
+
+/* Callback for glutKeyboardUpFunc */
+begin_decl_gwh(KeyboardUp, (unsigned char key, int width, int height), 3)
+	GLUT_PUSH_NEW_U8(key);
+	GLUT_PUSH_NEW_IV(width);
+	GLUT_PUSH_NEW_IV(height);
+end_decl_gwh()
+
+/* Callback for glutMouseFunc */
+begin_decl_gwh(Mouse, (int button, int state, int x, int y), 4)
+	GLUT_PUSH_NEW_IV(button);
+	GLUT_PUSH_NEW_IV(state);
+	GLUT_PUSH_NEW_IV(x);
+	GLUT_PUSH_NEW_IV(y);
+end_decl_gwh()
+
+/* Callback for glutMouseWheelFunc */	/* Open/FreeGLUT -chm */
+begin_decl_gwh(MouseWheel, (int wheel, int direction, int x, int y), 4)
+	GLUT_PUSH_NEW_IV(wheel);
+	GLUT_PUSH_NEW_IV(direction);
+	GLUT_PUSH_NEW_IV(x);
+	GLUT_PUSH_NEW_IV(y);
+end_decl_gwh()
+
+/* Callback for glutPassiveMotionFunc */
+begin_decl_gwh(PassiveMotion, (int x, int y), 2)
+	GLUT_PUSH_NEW_IV(x);
+	GLUT_PUSH_NEW_IV(y);
+end_decl_gwh()
+
+/* Callback for glutMotionFunc */
+begin_decl_gwh(Motion, (int x, int y), 2)
+	GLUT_PUSH_NEW_IV(x);
+	GLUT_PUSH_NEW_IV(y);
+end_decl_gwh()
+
+/* Callback for glutVisibilityFunc */
+begin_decl_gwh(Visibility, (int state), 1)
+	GLUT_PUSH_NEW_IV(state);
+end_decl_gwh()
+
+/* Callback for glutWindowStatusFunc */
+begin_decl_gwh(WindowStatus, (int state), 1)
+	GLUT_PUSH_NEW_IV(state);
+end_decl_gwh()
+
+/* Callback for glutEntryFunc */
+begin_decl_gwh(Entry, (int state), 1)
+	GLUT_PUSH_NEW_IV(state);
+end_decl_gwh()
+
+/* Callback for glutSpecialFunc */
+begin_decl_gwh(Special, (int key, int width, int height), 3)
+	GLUT_PUSH_NEW_IV(key);
+	GLUT_PUSH_NEW_IV(width);
+	GLUT_PUSH_NEW_IV(height);
+end_decl_gwh()
+
+/* Callback for glutSpecialUpFunc */
+begin_decl_gwh(SpecialUp, (int key, int width, int height), 3)
+	GLUT_PUSH_NEW_IV(key);
+	GLUT_PUSH_NEW_IV(width);
+	GLUT_PUSH_NEW_IV(height);
+end_decl_gwh()
+
+/* Callback for glutJoystickFunc */	/* Open/FreeGLUT -chm */
+begin_decl_gwh(Joystick, (unsigned int buttons, int xaxis, int yaxis, int zaxis), 4)
+	GLUT_PUSH_NEW_IV(buttons);
+	GLUT_PUSH_NEW_IV(xaxis);
+	GLUT_PUSH_NEW_IV(yaxis);
+	GLUT_PUSH_NEW_IV(zaxis);
+end_decl_gwh()
+
+
+/* Callback for glutSpaceballMotionFunc */
+begin_decl_gwh(SpaceballMotion, (int x, int y, int z), 3)
+	GLUT_PUSH_NEW_IV(x);
+	GLUT_PUSH_NEW_IV(y);
+	GLUT_PUSH_NEW_IV(z);
+end_decl_gwh()
+
+/* Callback for glutSpaceballRotateFunc */
+begin_decl_gwh(SpaceballRotate, (int x, int y, int z), 3)
+	GLUT_PUSH_NEW_IV(x);
+	GLUT_PUSH_NEW_IV(y);
+	GLUT_PUSH_NEW_IV(z);
+end_decl_gwh()
+
+/* Callback for glutSpaceballButtonFunc */
+begin_decl_gwh(SpaceballButton, (int button, int state), 2)
+	GLUT_PUSH_NEW_IV(button);
+	GLUT_PUSH_NEW_IV(state);
+end_decl_gwh()
+
+/* Callback for glutButtonBoxFunc */
+begin_decl_gwh(ButtonBox, (int button, int state), 2)
+	GLUT_PUSH_NEW_IV(button);
+	GLUT_PUSH_NEW_IV(state);
+end_decl_gwh()
+
+/* Callback for glutDialsFunc */
+begin_decl_gwh(Dials, (int dial, int value), 2)
+	GLUT_PUSH_NEW_IV(dial);
+	GLUT_PUSH_NEW_IV(value);
+end_decl_gwh()
+
+/* Callback for glutTabletMotionFunc */
+begin_decl_gwh(TabletMotion, (int x, int y), 2)
+	GLUT_PUSH_NEW_IV(x);
+	GLUT_PUSH_NEW_IV(y);
+end_decl_gwh()
+
+/* Callback for glutTabletButtonFunc */
+begin_decl_gwh(TabletButton, (int button, int state, int x, int y), 4)
+	GLUT_PUSH_NEW_IV(button);
+	GLUT_PUSH_NEW_IV(state);
+	GLUT_PUSH_NEW_IV(x);
+	GLUT_PUSH_NEW_IV(y);
+end_decl_gwh()
+
+/* Callback for glutIdleFunc */
+begin_decl_ggh(Idle, (void), 0)
+end_decl_ggh()
+
+/* Callback for glutMenuStatusFunc */
+begin_decl_ggh(MenuStatus, (int status, int x, int y), 3)
+	GLUT_PUSH_NEW_IV(status);
+	GLUT_PUSH_NEW_IV(x);
+	GLUT_PUSH_NEW_IV(y);
+end_decl_ggh()
+
+/* Callback for glutMenuStateFunc */
+begin_decl_ggh(MenuState, (int status), 1)
+	GLUT_PUSH_NEW_IV(status);
+end_decl_ggh()
+
+/* Callback for glutMenuDestroyFunc */		/* Open/FreeGLUT -chm */
+begin_decl_gwh(MenuDestroy, (void), 0)
+end_decl_gwh()
+
+/* Callback for glutCloseFunc */
+#ifdef HAVE_AGL_GLUT
+static void generic_glut_WMClose_handler(void)
+#else
+static void generic_glut_Close_handler(void)
+#endif
+{
+	int win = glutGetWindow();
+	AV * handler_data = (AV*)get_glut_win_handler(win, HANDLE_GLUT_Close);
+	SV * handler = *av_fetch(handler_data, 0, 0);
+	dSP;
+
+	GLUT_PUSHMARK(sp);
+	GLUT_EXTEND_STACK(sp,1);
+	GLUT_PUSH_NEW_IV(win);
+
+	PUTBACK;
+	DO_perl_call_sv(handler, G_DISCARD);
+}
+
+/* Callback for glutTimerFunc */
+static void generic_glut_timer_handler(int value)
+{
+	AV * handler_data = (AV*)value;
+	SV * handler;
+	int i;
+	dSP;
+
+	handler = *av_fetch(handler_data, 0, 0);
+
+	GLUT_PUSHMARK(sp);
+	GLUT_EXTEND_STACK(sp,av_len(handler_data));
+	for (i=1;i<=av_len(handler_data);i++)
+		GLUT_PUSH_NEW_SV(*av_fetch(handler_data, i, 0));
+
+	PUTBACK;
+	DO_perl_call_sv(handler, G_DISCARD);
+	
+	SvREFCNT_dec(handler_data);
+}
+
+static AV * glut_menu_handlers = 0;
+
+/* Callback for glutMenuFunc */
+static void generic_glut_menu_handler(int value)
+{
+	AV * handler_data;
+	SV * handler;
+	SV ** h;
+	int i;
+	dSP;
+	
+	h = av_fetch(glut_menu_handlers, glutGetMenu(), FALSE);
+	if (!h || !SvOK(*h) || !SvROK(*h))
+		croak("Unable to locate menu handler");
+	
+	handler_data = (AV*)SvRV(*h);
+
+	handler = *av_fetch(handler_data, 0, 0);
+
+	GLUT_PUSHMARK(sp);
+	GLUT_EXTEND_STACK(sp,av_len(handler_data) + 1);
+	for (i=1;i<=av_len(handler_data);i++)
+		GLUT_PUSH_NEW_SV(*av_fetch(handler_data, i, 0));
+
+	GLUT_PUSH_NEW_IV(value);
+
+	PUTBACK;
+	DO_perl_call_sv(handler, G_DISCARD);
+}
+/* End of set up for GLUT callback stuff */
+
+
+
+MODULE = OpenGL::GLUT		PACKAGE = OpenGL::GLUT
+
+#// Test for done with glutInit
+int
+done_glutInit()
+	CODE:
+	RETVAL = _done_glutInit;
+	OUTPUT:
+	RETVAL
+
+
+# GLUT
+
+#//# glutInit();
+void
+glutInit()
+	CODE:
+	{
+	int argc;
+	char ** argv;
+	AV * ARGV;
+	SV * ARGV0;
+	SV * sv;
+	int i;
+
+			if (_done_glutInit)
+				croak("illegal glutInit() reinitialization attempt");
+
+			argv  = 0;
+			ARGV = perl_get_av("ARGV", FALSE);
+			ARGV0 = perl_get_sv("0", FALSE);
+			
+			argc = av_len(ARGV)+2;
+			if (argc) {
+				argv = malloc(sizeof(char*)*argc);
+				argv[0] = SvPV(ARGV0, PL_na);
+				for(i=0;i<=av_len(ARGV);i++)
+					argv[i+1] = SvPV(*av_fetch(ARGV, i, 0), PL_na);
+			}
+			
+			i = argc;
+			glutInit(&argc, argv);
+
+			_done_glutInit = 1;
+
+			while(argc<i--)
+				sv = av_shift(ARGV);
+			
+			if (argv)
+				free(argv);
+	}
+
+#//# glutInitWindowSize($width, $height);
+void
+glutInitWindowSize(width, height)
+	int	width
+	int	height
+
+#//# glutInitWindowPosition($x, $y);
+void
+glutInitWindowPosition(x, y)
+	int	x
+	int	y
+
+#//# glutInitDisplayMode($mode);
+void
+glutInitDisplayMode(mode)
+	int	mode
+
+#//# glutInitDisplayString($string);
+void
+glutInitDisplayString(string)
+	char *	string
+
+#//# glutMainLoop();
+void
+glutMainLoop()
+
+#//# glutCreateWindow($name);
+int
+glutCreateWindow(name)
+	char *	name
+	CODE:
+	RETVAL = glutCreateWindow(name);
+	destroy_glut_win_handlers(RETVAL);
+	OUTPUT:
+	RETVAL
+
+#//# glutCreateSubWindow($win, $x, $y, $width, $height);
+int
+glutCreateSubWindow(win, x, y, width, height)
+	int	win
+	int	x
+	int	y
+	int	width
+	int	height
+	CODE:
+	RETVAL = glutCreateSubWindow(win, x, y, width, height);
+	destroy_glut_win_handlers(RETVAL);
+	OUTPUT:
+	RETVAL
+
+#//# glutSetWindow($win);
+void
+glutSetWindow(win)
+	int	win
+
+#//# glutGetWindow();
+int
+glutGetWindow()
+
+#//# glutDestroyWindow($win);
+void
+glutDestroyWindow(win)
+	int	win
+	CODE:
+	glutDestroyWindow(win);
+	destroy_glut_win_handlers(win);
+
+#//# glutPostRedisplay();
+void
+glutPostRedisplay()
+
+#//# glutSwapBuffers();
+void
+glutSwapBuffers()
+
+#//# glutPositionWindow($x, $y);
+void
+glutPositionWindow(x, y)
+	int	x
+	int	y
+
+#//# glutReshapeWindow($width, $height);
+void
+glutReshapeWindow(width, height)
+	int	width
+	int	height
+
+#if GLUT_API_VERSION >= 3
+
+#//# glutFullScreen();
+void
+glutFullScreen()
+
+#endif
+
+#//# glutPopWindow();
+void
+glutPopWindow()
+
+#//# glutPushWindow();
+void
+glutPushWindow()
+
+#//# glutShowWindow();
+void
+glutShowWindow()
+
+#//# glutHideWindow();
+void
+glutHideWindow()
+
+#//# glutIconifyWindow();
+void
+glutIconifyWindow()
+
+#//# glutSetWindowTitle($title);
+void
+glutSetWindowTitle(title)
+	char *	title
+
+#//# glutSetIconTitle($title);
+void
+glutSetIconTitle(title)
+	char *	title
+
+#if GLUT_API_VERSION >= 3
+
+#//# glutSetCursor(cursor);
+void
+glutSetCursor(cursor)
+	int	cursor
+
+#endif
+
+# Overlays
+
+
+#if GLUT_API_VERSION >= 3
+
+#//# glutEstablishOverlay(); 
+void
+glutEstablishOverlay()
+
+#//# glutUseLayer(layer);
+void
+glutUseLayer(layer)
+	GLenum	layer
+
+#//# glutRemoveOverlay();
+void
+glutRemoveOverlay()
+
+#//# glutPostOverlayRedisplay();
+void
+glutPostOverlayRedisplay()
+
+#//# glutShowOverlay();
+void
+glutShowOverlay()
+
+#//# glutHideOverlay();
+void
+glutHideOverlay()
+
+#endif
+
+# Menus
+
+#//# $ID = glutCreateMenu(\&callback);
+int
+glutCreateMenu(handler=0, ...)
+	SV *	handler
+	CODE:
+	{
+		if (!handler || !SvOK(handler)) {
+			croak("A handler must be specified");
+		} else {
+			AV * handler_data = newAV();
+		
+			PackCallbackST(handler_data, 0);
+
+			RETVAL = glutCreateMenu(generic_glut_menu_handler);
+			
+			if (!glut_menu_handlers)
+				glut_menu_handlers = newAV();
+			
+			av_store(glut_menu_handlers, RETVAL, newRV_inc((SV*)handler_data));
+			
+			SvREFCNT_dec(handler_data);
+			
+		}
+	}
+	OUTPUT:
+	RETVAL
+
+#//# glutSetMenu($menu);
+void
+glutSetMenu(menu)
+	int	menu
+
+#//# glutGetMenu();
+int
+glutGetMenu()
+
+#//# glutDestroyMenu($menu);
+void
+glutDestroyMenu(menu)
+	int	menu
+	CODE:
+	{
+		glutDestroyMenu(menu);
+		av_store(glut_menu_handlers, menu, newSVsv(&PL_sv_undef));
+	}
+
+#//# glutAddMenuEntry($name, $value);
+void
+glutAddMenuEntry(name, value)
+	char *	name
+	int	value
+
+#//# glutAddSubMenu($name, $menu);
+void
+glutAddSubMenu(name, menu)
+	char *	name
+	int	menu
+
+#//# glutChangeToMenuEntry($entry, $name, $value);
+void
+glutChangeToMenuEntry(entry, name, value)
+	int	entry
+	char *	name
+	int	value
+
+#//# glutChangeToSubMenu($entry, $name, $menu);
+void
+glutChangeToSubMenu(entry, name, menu)
+	int	entry
+	char *	name
+	int	menu
+
+#//# glutRemoveMenuItem($entry);
+void
+glutRemoveMenuItem(entry)
+	int	entry
+
+#//# glutAttachMenu(button);
+void
+glutAttachMenu(button)
+	int	button
+
+#//# glutDetachMenu(button);
+void
+glutDetachMenu(button)
+	int	button
+
+# Callbacks
+
+#//# glutDisplayFunc(\&callback);
+void
+glutDisplayFunc(handler=0, ...)
+	SV *	handler
+	CODE:
+	decl_gwh_xs_nullfail(Display, ("Display function must be specified"))
+
+#if GLUT_API_VERSION >= 3
+
+#//# glutOverlayDisplayFunc(\&callback);
+void
+glutOverlayDisplayFunc(handler=0, ...)
+	SV *	handler
+	CODE:
+	decl_gwh_xs(OverlayDisplay)
+
+#endif
+
+#//# glutReshapeFunc(\&callback);
+void
+glutReshapeFunc(handler=0, ...)
+	SV *	handler
+	CODE:
+	decl_gwh_xs(Reshape)
+
+#//# glutKeyboardFunc(\&callback);
+void
+glutKeyboardFunc(handler=0, ...)
+	SV *	handler
+	CODE:
+	decl_gwh_xs(Keyboard)
+
+#if GLUT_API_VERSION >= 4
+
+#//# glutKeyboardUpFunc(\&callback);
+void
+glutKeyboardUpFunc(handler=0, ...)
+	SV *	handler
+	CODE:
+	decl_gwh_xs(KeyboardUp)
+
+#//# glutWindowStatusFunc(\&callback);
+void
+glutWindowStatusFunc(handler=0, ...)
+	SV *	handler
+	CODE:
+        {
+#if defined HAVE_FREEGLUT
+		decl_gwh_xs(WindowStatus)
+#endif
+	}
+
+#endif
+
+#//# glutMouseFunc(\&callback);
+void
+glutMouseFunc(handler=0, ...)
+	SV *	handler
+	CODE:
+	decl_gwh_xs(Mouse)
+
+#//# glutMouseWheelFunc(\&callback);
+void
+glutMouseWheelFunc(handler=0, ...)
+	SV *	handler
+	CODE:
+        {
+#if defined HAVE_FREEGLUT
+		decl_gwh_xs(MouseWheel)
+#endif
+	}
+
+#//# glutMotionFunc(\&callback);
+void
+glutMotionFunc(handler=0, ...)
+	SV *	handler
+	CODE:
+	decl_gwh_xs(Motion)
+
+#//# glutPassiveMotionFunc(\&callback);
+void
+glutPassiveMotionFunc(handler=0, ...)
+	SV *	handler
+	CODE:
+	{
+#if defined HAVE_FREEGLUT
+		decl_gwh_xs(PassiveMotion)
+#endif
+	}
+
+#//# glutVisibilityFunc(\&callback);
+void
+glutVisibilityFunc(handler=0, ...)
+	SV *	handler
+	CODE:
+	decl_gwh_xs(Visibility)
+
+#//# glutEntryFunc(\&callback);
+void
+glutEntryFunc(handler=0, ...)
+	SV *	handler
+	CODE:
+	decl_gwh_xs(Entry)
+
+#if GLUT_API_VERSION >= 2
+
+#//# glutSpecialFunc(\&callback);
+void
+glutSpecialFunc(handler=0, ...)
+	SV *	handler
+	CODE:
+	decl_gwh_xs(Special)
+
+#//# glutJoystickFunc(\&callback);	/* Open/FreeGLUT -chm */
+# void					/* Not implemented, don't know how */
+# glutJoystickFunc(handler=0, ...)
+# 	SV *	handler
+# 	CODE:
+# 	decl_gwh_xs(Joystick)
+
+#//# glutSpaceballMotionFunc(\&callback);
+void
+glutSpaceballMotionFunc(handler=0, ...)
+	SV *	handler
+	CODE:
+	decl_gwh_xs(SpaceballMotion)
+
+#//# glutSpaceballRotateFunc(\&callback);
+void
+glutSpaceballRotateFunc(handler=0, ...)
+	SV *	handler
+	CODE:
+	decl_gwh_xs(SpaceballRotate)
+
+#//# glutSpaceballButtonFunc(\&callback);
+void
+glutSpaceballButtonFunc(handler=0, ...)
+	SV *	handler
+	CODE:
+	decl_gwh_xs(SpaceballButton)
+
+#//# glutButtonBoxFunc(\&callback);
+void
+glutButtonBoxFunc(handler=0, ...)
+	SV *	handler
+	CODE:
+	decl_gwh_xs(ButtonBox)
+
+#//# glutDialsFunc(\&callback);
+void
+glutDialsFunc(handler=0, ...)
+	SV *	handler
+	CODE:
+	decl_gwh_xs(Dials)
+
+#//# glutTabletMotionFunc(\&callback);
+void
+glutTabletMotionFunc(handler=0, ...)
+	SV *	handler
+	CODE:
+	decl_gwh_xs(TabletMotion)
+
+#//# glutTabletButtonFunc(\&callback);
+void
+glutTabletButtonFunc(handler=0, ...)
+	SV *	handler
+	CODE:
+	decl_gwh_xs(TabletButton)
+
+#endif
+
+#if GLUT_API_VERSION >= 3
+
+#//# glutMenuStatusFunc(\&callback);
+void
+glutMenuStatusFunc(handler=0, ...)
+	SV *	handler
+	CODE:
+	decl_ggh_xs(MenuStatus)
+
+#endif
+
+#//# glutMenuStateFunc(\&callback);
+void
+glutMenuStateFunc(handler=0, ...)
+	SV *	handler
+	CODE:
+	{
+#if defined HAVE_FREEGLUT
+		decl_ggh_xs(MenuState)
+#endif
+	}
+
+#//# glutIdleFunc(\&callback);
+void
+glutIdleFunc(handler=0, ...)
+	SV *	handler
+	CODE:
+	decl_ggh_xs(Idle)
+
+#//# glutTimerFunc($msecs, \&callback);
+void
+glutTimerFunc(msecs, handler=0, ...)
+	unsigned int	msecs
+	SV *	handler
+	CODE:
+	{
+		if (!handler || !SvOK(handler)) {
+			croak("A handler must be specified");
+		} else {
+			AV * handler_data = newAV();
+		
+			PackCallbackST(handler_data, 1);
+			
+			glutTimerFunc(msecs, generic_glut_timer_handler, (int)handler_data);
+		}
+	ENSURE_callback_thread;}
+
+
+# Colors
+
+#//# glutSetColor($cell, $red, $green, $blue)
+void
+glutSetColor(cell, red, green, blue)
+	int	cell
+	GLfloat	red
+	GLfloat	green
+	GLfloat	blue
+
+#//# glutGetColor($cell, $component);
+GLfloat
+glutGetColor(cell, component)
+	int	cell
+	int	component
+
+#//# glutCopyColormap($win);
+void
+glutCopyColormap(win)
+	int	win
+
+# State
+
+#//# glutGet($state);
+int
+glutGet(state)
+	GLenum	state
+
+#if GLUT_API_VERSION >= 3
+
+#//# glutLayerGet(info);
+int
+glutLayerGet(info)
+	GLenum	info
+
+#endif
+
+int
+glutDeviceGet(info)
+	GLenum	info
+
+#if GLUT_API_VERSION >= 3
+
+#//# glutGetModifiers();
+int
+glutGetModifiers()
+
+#endif
+
+#if GLUT_API_VERSION >= 2
+
+#//# glutExtensionSupported($extension);
+int
+glutExtensionSupported(extension)
+	char *	extension
+
+#endif
+
+# Font
+
+#//# glutBitmapCharacter($font, $character);
+void
+glutBitmapCharacter(font, character)
+	void *	font
+	int	character
+
+#//# glutStrokeCharacter($font, $character);
+void
+glutStrokeCharacter(font, character)
+	void *	font
+	int	character
+
+#//# glutBitmapWidth($font, $character);
+int
+glutBitmapWidth(font, character)
+	void *	font
+	int	character
+
+#//# glutStrokeWidth($font, $character);
+int
+glutStrokeWidth(font, character)
+	void *	font
+	int	character
+
+#if GLUT_API_VERSION >= 3
+
+#//# glutIgnoreKeyRepeat($ignore);
+void
+glutIgnoreKeyRepeat(ignore)
+	int	ignore
+
+#//# glutSetKeyRepeat($repeatMode);
+void
+glutSetKeyRepeat(repeatMode)
+	int	repeatMode
+
+#//# glutForceJoystickFunc();
+void
+glutForceJoystickFunc()
+
+#endif
+
+# Solids
+
+#//# glutSolidSphere($radius, $slices, $stacks);
+void
+glutSolidSphere(radius, slices, stacks)
+	GLdouble	radius
+	GLint	slices
+	GLint	stacks
+
+#//# glutWireSphere($radius, $slices, $stacks);
+void
+glutWireSphere(radius, slices, stacks)
+	GLdouble	radius
+	GLint	slices
+	GLint	stacks
+
+#//# glutSolidCube($size);
+void
+glutSolidCube(size)
+	GLdouble	size
+
+#//# glutWireCube($size);
+void
+glutWireCube(size)
+	GLdouble	size
+
+#//# glutSolidCone($base, $height, $slices, $stacks);
+void
+glutSolidCone(base, height, slices, stacks)
+	GLdouble	base
+	GLdouble	height
+	GLint	slices
+	GLint	stacks
+
+#//# glutWireCone($base, $height, $slices, $stacks);
+void
+glutWireCone(base, height, slices, stacks)
+	GLdouble	base
+	GLdouble	height
+	GLint	slices
+	GLint	stacks
+
+#//# glutSolidTorus($innerRadius, $outerRadius, $nsides, $rings);
+void
+glutSolidTorus(innerRadius, outerRadius, nsides, rings)
+	GLdouble	innerRadius
+	GLdouble	outerRadius
+	GLint	nsides
+	GLint	rings
+
+#//# glutWireTorus($innerRadius, $outerRadius, $nsides, $rings);
+void
+glutWireTorus(innerRadius, outerRadius, nsides, rings)
+	GLdouble	innerRadius
+	GLdouble	outerRadius
+	GLint	nsides
+	GLint	rings
+
+#//# glutSolidDodecahedron();
+void
+glutSolidDodecahedron()
+
+#//# glutWireDodecahedron();
+void
+glutWireDodecahedron()
+
+#//# glutSolidOctahedron();
+void
+glutSolidOctahedron()
+
+#//# glutWireOctahedron();
+void
+glutWireOctahedron()
+
+#//# glutSolidTetrahedron();
+void
+glutSolidTetrahedron()
+
+#//# glutWireTetrahedron();
+void
+glutWireTetrahedron()
+
+#//# glutSolidIcosahedron();
+void
+glutSolidIcosahedron()
+
+#//# glutWireIcosahedron();
+void
+glutWireIcosahedron()
+
+#//# glutSolidTeapot(size);
+void
+glutSolidTeapot(size)
+	GLdouble	size
+
+#//# glutWireTeapot($size);
+void
+glutWireTeapot(size)
+	GLdouble	size
+
+#if GLUT_API_VERSION >= 4
+
+#//# glutSpecialUpFunc(\&callback);
+void
+glutSpecialUpFunc(handler=0, ...)
+	SV *	handler
+	CODE:
+	decl_gwh_xs(SpecialUp)
+
+#//# glutGameModeString($string);
+GLboolean
+glutGameModeString(string)
+	char *	string
+	CODE:
+	{
+		char mode[1024];
+		if (!string || !string[0])
+		{
+			int w = glutGet(0x00C8);	// GLUT_SCREEN_WIDTH
+			int h = glutGet(0x00C9);	// GLUT_SCREEN_HEIGHT
+
+			sprintf(mode,"%dx%d:%d@%d",w,h,32,60);
+			string = mode;
+		}
+
+		glutGameModeString(string);
+		RETVAL = glutGameModeGet(0x0001);	// GLUT_GAME_MODE_POSSIBLE
+	}
+	OUTPUT:
+		RETVAL
+
+#//# glutEnterGameMode();
+int
+glutEnterGameMode()
+
+#//# glutLeaveGameMode();
+void
+glutLeaveGameMode()
+
+#//# glutGameModeGet($mode);
+int
+glutGameModeGet(mode)
+	GLenum	mode
+
+#//# FreeGLUT/OpenGLUT feature
+#//# int  glutBitmapHeight (void *font)
+int
+glutBitmapHeight(font)
+	void * font
+	CODE:
+	{
+#if defined HAVE_FREEGLUT
+		RETVAL = glutBitmapHeight(font);
+#endif
+	}
+
+#//# FreeGLUT/OpenGLUT feature
+#//# int  glutBitmapLength (void *font, const unsigned char *string)
+int
+glutBitmapLength(font, string)
+	void * font
+	const unsigned char * string
+	CODE:
+	{
+#if defined HAVE_FREEGLUT
+		RETVAL = glutBitmapLength(font, string);
+#endif
+	}
+
+#//# FreeGLUT/OpenGLUT feature
+#//# void  glutBitmapString (void *font, const unsigned char *string)
+void
+glutBitmapString(font, string)
+	void * font
+	const unsigned char * string
+	CODE:
+{
+#if defined HAVE_FREEGLUT
+	glutBitmapString(font, string);
+#else
+	int len, i;
+	len = (int) strlen(string);
+	for (i = 0; i < len; i++) {
+		glutBitmapCharacter(font, string[i]);
+	}
+#endif
+}
+
+#//# FreeGLUT/OpenGLUT feature
+#//# void *  glutGetProcAddress (const char *procName)
+# void *
+# glutGetProcAddress(procName)
+# 	const char * procName
+
+#//# FreeGLUT/OpenGLUT feature
+#//# void  glutMainLoopEvent (void)
+void
+glutMainLoopEvent()
+	CODE:
+	{
+#if defined HAVE_AGL_GLUT
+		glutCheckLoop();
+#elif defined HAVE_FREEGLUT
+		glutMainLoopEvent();
+#endif
+	}
+
+#//# void  glutPostWindowOverlayRedisplay (int windowID)
+void
+glutPostWindowOverlayRedisplay(windowID)
+	int windowID
+
+#//# void  glutPostWindowRedisplay (int windowID)
+void
+glutPostWindowRedisplay(windowID)
+	int windowID
+
+#//# void  glutReportErrors (void)
+void
+glutReportErrors()
+
+#//# void  glutSolidCylinder (GLdouble radius, GLdouble height, GLint slices, GLint stacks)
+void
+glutSolidCylinder(radius, height, slices, stacks)
+	GLdouble radius
+	GLdouble height
+	GLint slices
+	GLint stacks
+	CODE:
+	{
+#if defined HAVE_FREEGLUT
+		glutSolidCylinder(radius, height, slices, stacks);
+#endif
+	}
+
+#//# void  glutSolidRhombicDodecahedron (void)
+void
+glutSolidRhombicDodecahedron()
+	CODE:
+	{
+#if defined HAVE_FREEGLUT
+		glutSolidRhombicDodecahedron();
+#endif
+	}
+
+#//# float  glutStrokeHeight (void *font)
+GLfloat
+glutStrokeHeight(font)
+	void * font
+	CODE:
+	{
+#if defined HAVE_FREEGLUT
+		RETVAL = glutStrokeHeight(font);
+#endif
+	}
+
+
+#//# float  glutStrokeLength (void *font, const unsigned char *string)
+GLfloat
+glutStrokeLength(font, string)
+	void * font
+	const unsigned char * string
+
+#//# void  glutStrokeString (void *fontID, const unsigned char *string)
+void
+glutStrokeString(font, string)
+	void * font
+	const unsigned char * string
+	CODE:
+	{
+#if defined HAVE_FREEGLUT
+		glutStrokeString(font, string);
+#endif
+	}
+
+#//# void  glutWarpPointer (int x, int y)
+void
+glutWarpPointer(x, y)
+	int x
+	int y
+
+#//# void  glutWireCylinder (GLdouble radius, GLdouble height, GLint slices, GLint stacks)
+void
+glutWireCylinder(radius, height, slices, stacks)
+	GLdouble radius
+	GLdouble height
+	GLint slices
+	GLint stacks
+	CODE:
+	{
+#if defined HAVE_FREEGLUT
+		glutWireCylinder(radius, height, slices, stacks);
+#endif
+	}
+
+
+#//# void  glutWireRhombicDodecahedron (void)
+void
+glutWireRhombicDodecahedron()
+	CODE:
+	{
+#if defined HAVE_FREEGLUT
+		glutWireRhombicDodecahedron();
+#endif
+	}
+
+#endif
+
+# /* FreeGLUT APIs */
+
+#//# glutSetOption($option_flag, $value);
+void
+glutSetOption(option_flag, value)
+	GLenum		option_flag
+	int		value
+	CODE:
+	{
+#if defined HAVE_FREEGLUT
+		glutSetOption(option_flag, value);
+#endif
+	}
+
+#//# glutLeaveMainLoop();
+void
+glutLeaveMainLoop()
+	CODE:
+	{
+#if defined HAVE_FREEGLUT
+		glutLeaveMainLoop();
+#else
+		int win = glutGetWindow();
+		glutDestroyWindow(win);
+		destroy_glut_win_handlers(win);
+#endif
+	}
+
+#//# glutMenuDestroyFunc(\&callback);
+void
+glutMenuDestroyFunc(handler=0, ...)
+	SV *	handler
+	CODE:
+        {
+#if defined HAVE_FREEGLUT
+		decl_gwh_xs(MenuDestroy)
+#endif
+	}
+
+#//# glutCloseFunc(\&callback);
+void
+glutCloseFunc(handler=0, ...)
+	SV *	handler
+	CODE:
+        {
+#if defined HAVE_FREEGLUT
+		decl_gwh_xs(Close)
+#elif defined HAVE_AGL_GLUT
+		decl_gwh_xs(WMClose)
+#endif
+        }
@@ -0,0 +1,1434 @@
+Name
+
+    ARB_pixel_buffer_object
+
+Name Strings
+
+    GL_ARB_pixel_buffer_object
+
+Status
+
+    Complete. Approved by ARB on December 7, 2004.
+
+Contributors
+
+    Ralf Biermann
+    Nick Carter
+    Derek Cornish
+    Matt Craighead
+    Mark Kilgard
+    Dale Kirkland
+    Jon Leech
+    Brian Paul
+    Thomas Roell
+    Ian Romanick
+    Jeremy Sandmel
+
+Contact
+
+    Mark J. Kilgard, NVIDIA Corporation (mjk 'at' nvidia.com)
+    Ralf Biermann, NVIDIA Corporation (rbiermann 'at' nvidia.com)
+    Derek Cornish, NVIDIA Corporation (dcornish 'at' nvidia.com)
+
+IP Status
+
+    None.
+
+Version
+
+    Last Modified Date: December 8, 2004
+    Revision: 1.0
+
+Number
+
+    ARB Extension #42
+
+Dependencies
+
+    Written based on the wording of the OpenGL 2.0 specification.
+
+    Assumes support for (at least) OpenGL 1.5 or the
+    ARB_vertex_buffer_object extension.
+
+    NV_pixel_data_range affects the definition of this extension.
+
+    EXT_pixel_buffer_object interacts with this extension.
+
+Overview
+
+    This extension expands on the interface provided by the
+    ARB_vertex_buffer_object extension (and later integrated into OpenGL
+    1.5) in order to permit buffer objects to be used not only with vertex
+    array data, but also with pixel data.  The intent is to provide more
+    acceleration opportunities for OpenGL pixel commands.
+
+    While a single buffer object can be bound for both vertex arrays and
+    pixel commands, we use the designations vertex buffer object (VBO)
+    and pixel buffer object (PBO) to indicate their particular usage in
+    a given situation.
+
+    Recall that buffer objects conceptually are nothing more than arrays
+    of bytes, just like any chunk of memory.  ARB_vertex_buffer_object
+    allows GL commands to source data from a buffer object by binding the
+    buffer object to a given target and then overloading a certain set of
+    GL commands' pointer arguments to refer to offsets inside the buffer,
+    rather than pointers to user memory.  An offset is encoded in a
+    pointer by adding the offset to a null pointer.
+
+    This extension does not add any new functionality to buffer objects
+    themselves.  It simply adds two new targets to which buffer objects
+    can be bound: GL_PIXEL_PACK_BUFFER and GL_PIXEL_UNPACK_BUFFER.  When a
+    buffer object is bound to the GL_PIXEL_PACK_BUFFER target, commands
+    such as glReadPixels pack (write) their data into a buffer object.
+    When a buffer object is bound to the GL_PIXEL_UNPACK_BUFFER target,
+    commands such as glDrawPixels and glTexImage2D unpack (read) their
+    data from a buffer object.
+
+    There are a several approaches to improve graphics performance
+    with PBOs.  Some of the most interesting approaches are:
+
+    - Streaming texture updates:  If the application uses
+      glMapBuffer/glUnmapBuffer to write its data for glTexSubImage into
+      a buffer object, at least one of the data copies usually required
+      to download a texture can be eliminated, significantly increasing
+      texture download performance.
+
+    - Streaming draw pixels: When glDrawPixels sources client memory,
+      OpenGL says the client memory can be modified immediately after the
+      glDrawPixels command returns without disturbing the drawn image.
+      This typically necessitates unpacking and copying the image prior
+      to glDrawPixels returning.  However, when using glDrawPixels with
+      a pixel pack buffer object, glDrawPixels may return prior to image
+      unpacking because future modification of the buffer data requires
+      explicit commands (glMapBuffer, glBufferData, or glBufferSubData).
+
+    - Asynchronous glReadPixels:  If an application needs to read back a
+      number of images and process them with the CPU, the existing GL
+      interface makes it nearly impossible to pipeline this operation.
+      The driver will typically send the hardware a readback command
+      when glReadPixels is called, and then wait for all of the data to
+      be available before returning control to the application.  Then,
+      the application can either process the data immediately or call
+      glReadPixels again; in neither case will the readback overlap with
+      the processing.  If the application issues several readbacks
+      into several buffer objects, however, and then maps each one to
+      process its data, then the readbacks can proceed in parallel with
+      the data processing.
+
+    - Render to vertex array:  The application can use a fragment
+      program to render some image into one of its buffers, then read
+      this image out into a buffer object via glReadPixels.  Then, it can
+      use this buffer object as a source of vertex data.
+
+Issues
+
+    1)  How does this extension relate to ARB_vertex_buffer_object?
+
+        It builds on the ARB_vertex_buffer_object framework by adding
+        two new targets that buffers can be bound to.
+
+    2)  How does this extension relate to NV_pixel_data_range?
+
+        This extension relates to NV_pixel_data_range in the same way
+        that ARB_vertex_buffer_object relates to NV_vertex_array_range.
+        To paraphrase the ARB_vertex_buffer_object spec, here are the
+        main differences:
+
+        - Applications are no longer responsible for memory management
+          and synchronization.
+
+        - Applications may still access high-performance memory directly,
+          but this is optional, and such access is more restricted.
+
+        - Buffer changes (glBindBuffer) are generally expected to be
+          very lightweight, rather than extremely heavyweight
+          (glPixelDataRangeNV).
+
+        - A platform-specific allocator such as wgl/glXAllocateMemoryNV
+          is no longer required.
+
+    3)  Can a given buffer be used for both vertex and pixel data?
+
+        RESOLVED: YES.  All buffers can be used with all buffer bindings,
+        in whatever combinations the application finds useful.  Consider
+        yourself warned, however, by the following issue.
+
+    4)  May implementations make use of the target as a hint to select
+        an appropriate memory space for the buffer?
+
+        RESOLVED: YES, as long as such behavior is transparent to the
+        application.  Some implementations may choose, for example, that
+        they would rather stream vertex data from AGP memory, element
+        (index) data from video memory, and pixel data from video memory.
+        In fact, one can imagine arbitrarily complicated heuristics for
+        selecting the memory space, based on factors such as the target,
+        the "usage" argument, and the application's observed behavior.
+
+        While it is entirely legal to create a buffer object by binding
+        it to GL_ARRAY_BUFFER and loading it with data, then using it
+        with the GL_PIXEL_UNPACK_BUFFER_ARB or GL_PIXEL_PACK_BUFFER_ARB
+        binding, such behavior is liable to confuse the driver and may
+        hurt performance.  If the driver implemented the hypothetical
+        heuristic described earlier, such a buffer might have already
+        been located in AGP memory, and so the driver would have to choose
+        between two bad options: relocate the buffer into video memory, or
+        accept lower performance caused by streaming pixel data from AGP.
+
+    5)  Should all pixel path commands be supported, or just a subset
+        of them?
+
+        RESOLVED: ALL.  While there is little reason to believe that,
+        say, glConvolutionFilter2D would benefit from this extension,
+        there is no reason _not_ to support it.  The complete list of
+        commands affected by this extension is listed in issues 17 and 18.
+
+    6)  Should glPixelMap and glGetPixelMap be supported?
+
+        RESOLVED: YES.  They're not really pixel path operations, but,
+        again, there is no good reason to omit operations, and they _are_
+        operations that pass around big chunks of pixel-related data.
+        If we support glPolygonStipple, surely we should support this.
+
+    7)  How does the buffer binding state push/pop?
+
+        RESOLVED: As part of the pixel store client state.  This is
+        analogous to how the ARB_vertex_buffer_object bindings
+        pushed/popped as part of the vertex array client state.
+
+    8)  Should NV_pixel_data_range (PDR) be used concurrently with pixel
+        buffer objects ?
+
+        RESOLVED: NO. While it would be possible to allocate a memory
+        range for PDR, using a pointer into this memory range with one
+        of the commands affected by PBOs will not work if a pixel buffer
+        object other than zero is bound to the buffer binding point
+        affecting the command.
+
+        Pixel buffer objects always have higher precedence than PDR.
+
+    9)  Should the INVALID_OPERATION error be generated if a pixel
+        command would access data outside the range of the bound PBO?
+
+        RESOLVED:  YES.  This requires considering the command parameters
+        (such as width/height/depth/format/type/pointer), the current
+        pixel store (pack/unpack) state, and the command operation itself
+        to determine the maximum addressed byte for the pixel command.
+
+        Brian Paul strongly recommends this behavior.
+
+        This behavior should increase the reliability of using PBO and
+        guard against programmer mistakes.
+
+        This is particularly important for glReadPixels where returning
+        data into a region outside the PBO could cause corruption of
+        application memory.
+
+        Such bounds checking is substantially more expensive for VBO
+        accesses because bounds checking on a per-vertex element basis
+        for each of multiple enabled vertex arrays prior to performing
+        the command compromises the performance justification of VBO.
+
+    10) If a pixel command with a bound PBO accesses data outside the
+        range of the PBO, thereby generating a GL_INVALID_OPERATION error,
+        can the pixel command end up being partially processed?
+
+        RESOLVED:  NO.  As for all GL errors excepting GL_OUT_OF_MEMORY
+        situations, "the command generating the error is ignored so that
+        it has no effect on GL state or framebuffer contents."
+
+        This means implementations must determine before the pixel command
+        is performed whether the resulting read or write operations on
+        the bound PBO will exceed the size of the PBO.
+
+        This means an implementation is NOT allowed to detect out of
+        bounds accesses in the middle of performing the command.
+
+    11) How expensive is it to predetermine whether a pixel command
+        accessing a PBO would have an out of bounds access?
+
+        See the "Appendix on Pack/Unpack Range" to see the computations
+        involved in computing the access limit.
+
+        Implementations can further specialize and optimize the check
+        to make this out of bounds checking negligible for any sizable
+        pixel payload.
+
+    12) Should feedback and select buffers output results into a
+        buffer object?
+
+        RESOLVED:  That might be useful for a future extension but is
+        not appropriate for this extension.  New targets (other than
+        PIXEL_PACK_BUFFER_ARB and PIXEL_UNPACK_BUFFER_ARB) make sense.
+
+    13) Should NV_pixel_data_range interactions be documented in
+        this specification?
+
+        RESOLVED:  YES.  Interactions with NV_pixel_data_range are
+        important to document to facilitate developers migrating to
+        the multi-vendor ARB_pixel_buffer_object extension.  Discussion of
+        interactions is limited to the issues and example usage sections.
+
+        Other ARB specifications follow this policy, and Jon Leech agrees
+        with this policy.
+
+    14) Should an INVALID_OPERATION error be generated if the offset
+        within a pixel buffer to a datum comprising of N basic machine
+        units is not a multiple of N?
+
+        RESOLVED:  YES.  This was stated for VBOs but no error was
+        defined if the rule was violated.  Perhaps this needs to be
+        better specified for VBO.
+
+        For PBO, it is reasonable and cheap to enforce the alignment rule.
+        For pixel commands it means making sure the offset is evenly
+        divisible by the component or group size in basic machine units.
+
+        This check is independent of the pixel store state because the
+        pixel store state is specified in terms of pixels (not basic
+        machine units) so pixel store addressing cannot create an
+        unaligned access as long as the base offset is aligned.
+
+        Certain commands (specifically glPolygonStipple,
+        glGetPolygonStipple, glBitmap, glCompressedTexImage1D,
+        glCompressedTexImage2D, glCompressedTexImage3D,
+        glCompressedTexSubImage1D, glCompressedTexSubImage2D,
+        glCompressedTexSubImage3D, and glGetCompressedTexImage) are not
+        affected by this error because the data accessed is addressed
+        at the granularity of basic machine units.
+
+    15) Various commands do not make explicit reference to supporting
+        packing or unpacking from a pixel buffer object but rather specify
+        that parameters are handled in the same manner as glDrawPixels,
+        glReadPixels, or the glCompressedTexImage commands.  So do such
+        commands (example: glCompressedTexSubImage2D) use pixel buffers?
+
+        RESOLVED:  YES.  Commands that have their behavior defined based
+        on commands that read or write from pixel buffers will themselves
+        read or write from pixel buffers.  Relying on this reduces the
+        amount of specification language to be updated.
+
+    16) What is the complete list of commands that can unpack (read)
+        pixels from the current pixel unpack buffer object?
+
+            glBitmap
+            glColorSubTable
+            glColorTable
+            glCompressedTexImage1D
+            glCompressedTexImage2D
+            glCompressedTexImage3D
+            glCompressedTexSubImage1D
+            glCompressedTexSubImage2D
+            glCompressedTexSubImage3D
+            glConvolutionFilter1D
+            glConvolutionFilter2D
+            glDrawPixels
+            glPixelMapfv
+            glPixelMapuiv
+            glPixelMapusv
+            glPolygonStipple
+            glSeparableFilter2D
+            glTexImage1D
+            glTexImage2D
+            glTexImage3D
+            glTexSubImage1D
+            glTexSubImage2D
+            glTexSubImage3D
+
+    17) What is the complete list of commands that can pack (write)
+        pixels into the current pixel pack buffer object?
+
+            glGetCompressedTexImage
+            glGetConvolutionFilter
+            glGetHistogram
+            glGetMinmax
+            glGetPixelMapfv
+            glGetPixelMapuiv
+            glGetPixelMapusv
+            glGetPolygonStipple
+            glGetSeparableFilter,
+            glGetTexImage
+            glReadPixels
+
+    18) How does support for pixel buffer objects affect the GLX protocol?
+
+        UNRESOLVED:  See the "GLX Protocol" section.
+
+    19) Prior to this extension, passing zero for the data argument of
+        glTexImage1D, glTexImage2D, and glTexImage3D defined a texture
+        image level without supplying an image.  How does this behavior
+        change with this extension?
+
+        RESOLVED:  The "unspecified image" behavior of the glTexImage
+        calls only applies when bound to a zero pixel unpack buffer
+        object.
+
+        When bound to a non-zero pixel unpack buffer object, the data
+        argument to these calls is treated as an offset rather than
+        a pointer so zero is a reasonable and even likely value that
+        corresponds to the very beginning of the buffer object's data.
+
+        So to create a texture image level with unspecified image data,
+        you MUST bind to the zero pixel unpack buffer object.
+
+        See the ammended language at the end of section 3.8.1.
+
+    20) How does this extension support video frame grabbers?
+
+        RESOLVED:  This extension extends buffer objects so they can
+        operate with pixel commands, rather than just vertex array
+        commands.
+
+        We anticipate that a future extension may provide a mechanism
+        for transferring video frames from video frame grabber hardware
+        or vertices from motion capture hardware (or any other source
+        of aquired real-time data) directly into a buffer object to
+        eliminate a copy.  Ideally, such transfers would be possible
+        without requiring mapping of the buffer object.  But this
+        extension does not provide such functionality.
+
+        We anticipate such functionality to involve binding a buffer
+        object to a new target type, configuring a source (or sink) for
+        data (video frames, motion capture vertex sets, etc.), and then
+        commands to initiate data transfers to the bound buffer object.
+
+    21) Can this ARB extension share the same enumerants with the EXT
+        version of this functionality?
+
+        RESOLVED:  YES.  The ARB extension is functionally compatible
+        with EXT_pixel_buffer_object except that the ARB version adds
+        additional error checks for alignment and buffer bounds checking.
+
+        The EXT behavior in the case of alignment violations and buffer
+        bounds overflow are technically undefined.  The ARB extension
+        simply defines the EXT extension's undefined behavior to be an
+        OpenGL error.
+
+        Using the same enumerants with firmed up error checking (that
+        would otherwise indicate buggy usage) is preferable to two sets
+        of enumerants where the older EXT set simply allows sloppy usage.
+
+    22) The expected usage parameters (GL_STREAM_DRAW, etc.) for
+        glBufferData are not clearly specified.  How can they be improved?
+
+        RESOLVED:  To improve the clarity, replace the phrase "specified
+        once" with "specified once per repetition of the usage pattern" so
+        that it is clear for the STREAM_* usage modes (and the STATIC_*
+        usage modes too, just much less frequently) that the repeated
+        specification is part of a pattern and it is expected that the
+        buffer can be, and will be for the STREAM_* usage patterns,
+        specified again after being used and this is likely to repeat.
+
+        Additionally, the *_COPY and *_DRAW usage patterns can source
+        the data with "a GL drawing command" but also with image
+        specification commands so change this phrase to "a GL drawing
+        or image specification command."
+
+    23) Is this the "right" way to expose render-to-vertex-array?
+
+        DISCUSSION:  You can use this extension to render an image
+        into a framebuffer, copy the pixels into a buffer object with
+        glReadPixels, and then configure vertex arrays to source the pixel
+        data as vertex attributes.  This necessarily involves a copy
+        from the framebuffer to the buffer object.  Future extensions
+        may provide mechanisms for copy-free render-to-vertex-array
+        capabilities but that is not a design goal of this extension.
+
+New Procedures and Functions
+
+    None.
+
+
+New Tokens
+
+    Accepted by the <target> parameters of BindBuffer, BufferData,
+    BufferSubData, MapBuffer, UnmapBuffer, GetBufferSubData,
+    GetBufferParameteriv, and GetBufferPointerv:
+
+        PIXEL_PACK_BUFFER_ARB                        0x88EB
+        PIXEL_UNPACK_BUFFER_ARB                      0x88EC
+
+    Accepted by the <pname> parameter of GetBooleanv, GetIntegerv,
+    GetFloatv, and GetDoublev:
+
+        PIXEL_PACK_BUFFER_BINDING_ARB                0x88ED
+        PIXEL_UNPACK_BUFFER_BINDING_ARB              0x88EF
+
+
+Additions to Chapter 2 of the GL Specification (OpenGL Operation)
+
+    None
+
+ -- Section 2.9 "Buffer Objects"
+
+    Replace the first two paragraphs with:
+
+    "The vertex data arrays described in section 2.8 are stored in
+    client memory.  It is sometimes desirable to store frequently accessed
+    client data, such as vertex array and pixel data, in high-performance
+    server memory.  GL buffer objects provide a mechanism for clients to
+    use to allocate, initialize, and access such memory."
+
+    The name space for buffer objects is the unsigned integer, with zero
+    reserved for the GL.  A buffer object is created by binding an unused
+    name to a buffer target.  A buffer object is bound by calling
+
+       void BindBuffer(enum target, uint buffer);
+
+    /target/ must be one of ARRAY_BUFFER, ELEMENT_ARRAY_BUFFER,
+    PIXEL_UNPACK_BUFFER_ARB, or PIXEL_PACK_BUFFER_ARB.  The ARRAY_BUFFER
+    target is discussed in section 2.9.1  The ELEMENT_ARRAY_BUFFER target
+    is discussed in section 2.9.2.  The PIXEL_UNPACK_BUFFER_ARB and
+    PIXEL_PACK_BUFFER_ARB targets are discussed later in sections 3.6,
+    4.3.2, and 6.1.  If the buffer object named /buffer/ has not been
+    previously bound or has been deleted since the last binding, the
+    GL creates a new state vector, initialized with a zero-sized memory
+    buffer and comprising the state values listed in table 2.6."
+
+    Replace the 5th paragraph with:
+
+    "Initially, each buffer object target is bound to zero.  There is
+    no buffer object corresponding to the name zero so client attempts
+    to modify or query buffer object state for a target bound to zero
+    generate an INVALID_OPERATION error."
+
+    Replace the phrase listing the valid targets for BufferData in the
+    9th paragraph with:
+
+    "with target set to one of ARRAY_BUFFER, ELEMENT_ARRAY_BUFFER,
+    PIXEL_UNPACK_BUFFER_ARB, or PIXEL_PACK_BUFFER_ARB,"
+
+    In the 10th paragraph describing buffer object usage modes, replace
+    the phrase "specified once" with "specified once per repetition of
+    the usage pattern" for the STREAM_* and STATIC_* usage values.
+
+    Also in the 10th paragraph describing buffer object usage modes,
+    replace the phrases "of a GL drawing command." and "for GL drawing
+    commands." with "for GL drawing and image specification commands." for
+    the *_DRAW and *_COPY usage values.
+
+    Replace the phrase listing the valid targets for BufferSubData in
+    the 15th paragraph with:
+
+    "with target set to one of ARRAY_BUFFER, ELEMENT_ARRAY_BUFFER,
+    PIXEL_UNPACK_BUFFER_ARB, or PIXEL_PACK_BUFFER_ARB."
+
+    Replace the phrase listing the valid targets for MapBuffer in the
+    16th paragraph with:
+
+    "with target set to one of ARRAY_BUFFER, ELEMENT_ARRAY_BUFFER,
+    PIXEL_UNPACK_BUFFER_ARB, or PIXEL_PACK_BUFFER_ARB."
+
+    Replace the phrase listing the valid targets for UnmapBuffer in the
+    21st paragraph with:
+
+    "with target set to one of ARRAY_BUFFER, ELEMENT_ARRAY_BUFFER,
+    PIXEL_UNPACK_BUFFER_ARB, or PIXEL_PACK_BUFFER_ARB."
+
+ -- Section 2.9.2 "Array Indices in Buffer Objects"
+
+    Delete the 3rd paragraph that explains how the ELEMENT_ARRAY_BUFFER
+    target is acceptable for the commands specified in section 2.9.
+    The updated section 2.9 language already says this.
+
+ -- NEW Section 2.9.3 "Buffer Object Required State"
+
+    "The state required to support buffer objects consists of binding
+    names for the array buffer, element buffer, pixel unpack buffer, and
+    pixel pack buffer.  Additionally, each vertex array has an associated
+    binding so there is a buffer object binding for each of the vertex
+    array, normal array, color array, index array, multiple texture
+    coordinate arrays, edge flag array, secondary color array, fog
+    coordinate array, and vertex attribute arrays.  The initial values for
+    all buffer object bindings is zero.
+
+    The state of each buffer object consists of a buffer size in basic
+    machine units, a usage parameter, an access parameter, a mapped
+    boolean, a pointer to the mapped buffer (NULL if unmapped), and the
+    sized array of basic machine units for the buffer data."
+
+
+Additions to Chapter 3 of the 1.2.1 Specification (Rasterization)
+
+ -- Section 3.6 "Pixel Rectangles"
+
+    Replace the 1st sentence in the 2nd paragraph:
+
+    "A number of parameters control the encoding of pixels in buffer
+    object or client memory (for reading and writing) and how pixels
+    are processed before being placed in or after being read from the
+    framebuffer (for reading, writing, and copying)."
+
+ -- RENAME Section 3.6.1 "Pixel Storage Modes and Pixel Buffer Objects"
+
+    Add to the end of the section:
+
+    "In addition to storing pixel data in client memory, pixel data
+    may also be stored in buffer objects (described in section 2.9).
+    The current pixel unpack and pack buffer objects are designated
+    by the PIXEL_UNPACK_BUFFER_ARB and PIXEL_PACK_BUFFER_ARB targets
+    respectively.
+
+    Initially, zero is bound for the PIXEL_UNPACK_BUFFER_ARB, indicating
+    that image specification commands such as DrawPixels source their
+    pixels from client memory pointer parameters.  However, if a non-zero
+    buffer object is bound as the current pixel unpack buffer, then
+    the pointer parameter is treated as an offset into the designated
+    buffer object."
+
+ -- Section 3.6.3 "Pixel Transfer Modes", page 116.
+
+    Replace the last phrase in the 2nd paragraph with:
+
+    "and /values/ refers to an array of size map values."
+
+    [values is no longer necessarily a pointer.]
+
+    Add the following paragraph after the third paragraph:
+
+    "If a pixel unpack buffer is bound (as indicated by a non-zero
+    value of PIXEL_UNPACK_BUFFER_BINDING_ARB), /values/ is an offset
+    into the pixel unpack buffer; otherwise, /values/ is a pointer to a
+    block client memory.  All pixel storage and pixel transfer modes are
+    ignored when specifying a pixel map.  n machine units are read where
+    n is the /size/ of the pixel map times the size of a float, uint,
+    or ushort datum in basic machine units, depending on the respective
+    PixelMap version.  If a pixel unpack buffer object is bound and data+n
+    is greater than the size of the pixel buffer, INVALID_OPERATION
+    results.  If a pixel unpack buffer object is bound and /values/ is
+    not evenly divisible into the number of basic machine units needed
+    to store in memory a float, uint, or ushort datum depending on their
+    respective PixelMap version, INVALID_OPERATION results."
+
+ -- Section 3.6.4 "Rasterization of Pixel Rectangles", page 126.
+
+    Change the 1st sentence of the 1st paragraph to read:
+
+    "The process of drawing pixels encoded in buffer objects or client
+    memory is diagrammed in figure 3.7."
+
+    Change the 4th sentence of the 2nd paragraph to read:
+
+    "/data/ refers to the data to be drawn."
+
+    [data is no longer necessarily a pointer.]
+
+    Change the initial phrase in the 1st sentence of the 1st paragraph
+    after "Unpacking" to read:
+
+    "Data are taken from the currently bound pixel unpack buffer or
+    client memory as a sequence of..."
+
+    Insert this paragraph after the 1st paragraph after "Unpacking":
+
+    "If a pixel unpack buffer is bound (as indicated by a non-zero
+    value of PIXEL_UNPACK_BUFFER_BINDING_ARB), /data/ is an offset
+    into the pixel unpack buffer and the pixels are unpacked from the
+    buffer relative to this offset; otherwise, /data/ is a pointer to
+    a block client memory and the pixels are unpacked from the client
+    memory relative to the pointer.  If a pixel unpack buffer object
+    is bound and unpacking the pixel data according to the process
+    described below would access memory beyond the size of the pixel
+    unpack buffer's memory size, INVALID_OPERATION results.  If a pixel
+    unpack buffer object is bound and /data/ is not evenly divisible
+    into the number of basic machine units needed to store in memory the
+    corresponding GL data type from table 3.5 for the /type/ parameter,
+    INVALID_OPERATION results."
+
+ -- Section 3.8.1 "Texture Image Specification", page 150.
+
+    Replace the last phrase in the 2nd to last sentence in the 1st
+    paragraph with:
+
+    "and a reference to the image data in the currently bound pixel unpack
+    buffer or client memory."
+
+    Replace the 1st sentence in the 13th paragraph with:
+
+    "The image itself (referred to by /data/) is a sequence of groups
+    of values."
+
+    Replace the last paragraph with:
+
+    "If the data argument of TexImage1D, TexImage2D, or TexImage3D
+    is a null pointer (a zero-valued pointer in the C implementation)
+    and the pixel unpack buffer object is zero, a one-, two-, or three-
+    dimensional texture array is created with the specified target, level,
+    internalformat, width, height, and depth border, but with unspecified
+    image contents.  In this case no pixel values are access in client
+    memory, and no pixel processing is performed.  Errors are generated,
+    however, exactly as though the data pointer were valid.  Otherwise if
+    the pixel unpack buffer object is non-zero, the data argument is
+    treatedly normally to refer to the beginning of the pixel unpack
+    buffer object's data."
+
+ -- Section 3.8.3 "Compressed Texture Images", page 163.
+
+    Replace the 3rd sentence of the 2nd paragraph with:
+
+    "/data/ refers to compressed image data stored in the compressed
+    image format corresponding to internalformat.  If a pixel
+    unpack buffer is bound (as indicated by a non-zero value of
+    PIXEL_UNPACK_BUFFER_BINDING_ARB), /data/ is an offset into the
+    pixel unpack buffer and the compressed data is read from the buffer
+    relative to this offset; otherwise, /data/ is a pointer to a block
+    client memory and the compressed data is read from the client memory
+    relative to the pointer."
+
+    Replace the 2nd sentence in the 3rd paragraph with:
+
+    "Compressed texture images are treated as an array of /imageSize/
+    ubytes relative to /data/.  If a pixel unpack buffer object is bound
+    and data+imageSize is greater than the size of the pixel buffer,
+    INVALID_OPERATION results."
+
+Additions to Chapter 4 of the 1.2.1 Specification (Per-Fragment
+Operations and the Frame Buffer)
+
+ -- Section 4.3.2 "Reading Pixels", page 219.
+
+    Replace 1st sentence of the 1st paragraph with:
+
+    "The method for reading pixels from the framebuffer and placing them in
+    pixel pack buffer or client memory is diagrammed in figure 4.2."
+
+    Add this paragraph after the 1st paragraph:
+
+    "Initially, zero is bound for the PIXEL_PACK_BUFFER_ARB, indicating
+    that image read and query commands such as ReadPixels return
+    pixels results into client memory pointer parameters.  However, if
+    a non-zero buffer object is bound as the current pixel pack buffer,
+    then the pointer parameter is treated as an offset into the designated
+    buffer object."
+
+    Rename "Placement in Client Memory" to "Placement in Pixel Pack
+    Buffer or Client Memory".
+
+    Insert this paragraph after the newly renamed "Placement in Pixel
+    Pack Buffer or Client Memory" heading:
+
+    "If a pixel pack buffer is bound (as indicated by a non-zero value
+    of PIXEL_PACK_BUFFER_BINDING_ARB), /data/ is an offset into the
+    pixel pack buffer and the pixels are packed into the
+    buffer relative to this offset; otherwise, /data/ is a pointer to a
+    block client memory and the pixels are packed into the client memory
+    relative to the pointer.  If a pixel pack buffer object is bound and
+    packing the pixel data according to the pixel pack storage state
+    would access memory beyond the size of the pixel pack buffer's
+    memory size, INVALID_OPERATION results.  If a pixel pack buffer object
+    is bound and /data/ is not evenly divisible into the number of basic
+    machine units needed to store in memory the corresponding GL data type
+    from table 3.5 for the /type/ parameter, INVALID_OPERATION results."
+
+
+Additions to Chapter 5 of the 1.2.1 Specification (Special Functions)
+
+    None
+
+
+Additions to Chapter 6 of the 1.2.1 Specification (State and State
+Requests)
+
+ -- Section 6.1.3 "Enumerated Queries".
+
+    After the sentence in the last paragraph describing GetPixelMap, add:
+
+    "The GetPixelMapfv, GetPixelMapuiv, and GetPixelMapusv commands
+    write all the values in the named pixel map to /data/.  If a
+    pixel pack buffer is bound (as indicated by a non-zero value of
+    PIXEL_PACK_BUFFER_BINDING_ARB), /data/ is an offset into the pixel
+    pack buffer; otherwise, /data/ is a pointer to a block client memory.
+    All pixel storage and pixel transfer modes are ignored when returning a
+    pixel map.  n machine units are written where n is the size of the
+    pixel map times the size of FLOAT, UNSIGNED_INT, or UNSIGNED_SHORT
+    respectively in basic machine units.  If a pixel pack buffer object
+    is bound and data+n is greater than the size of the pixel buffer,
+    generate INVALID_OPERATION."
+
+ -- Section 6.1.4 "Texture Queries".
+
+    Remove the mention of img in the last phrase in the last sentence
+    of the 1st paragraph so the sentence reads:
+
+    "lod is a level-of-detail number, format is a pixel format from
+    table 3.6, and type is a pixel type from table 3.5."
+
+    Replace the 3rd sentence of the 2nd paragraph with:
+
+    "These groups are then packed and placed in client or pixel buffer
+    object memory.  If a pixel pack buffer is bound (as indicated by a
+    non-zero value of PIXEL_PACK_BUFFER_BINDING_ARB), /img/ is an offset
+    into the pixel pack buffer; otherwise, /img/ is a pointer to a block
+    client memory."
+
+    Add to the end of the 4th paragraph:
+
+    "If a pixel pack buffer object is bound and packing the texture
+    image into the buffer's memory would exceed the size of the buffer,
+    generate INVALID_OPERATION."
+
+    Replace the 2nd sentence of the 5th paragraph with:
+
+    "When called, GetCompressedTexImage writes n ubytes of compressed
+    image data to the pixel pack buffer or client memory pointed to by
+    ptr, where n is the texture image's TEXTURE_COMPRESSED_IMAGE_SIZE
+    value.
+
+    Add to the end of the 6th paragraph:
+
+    "If a pixel pack buffer object is bound and ptr+n is greater than
+    the size of the buffer, generate INVALID_OPERATION."
+
+ -- Section 6.1.5 "Stipple Query".
+
+    "The pattern is packed into client or pixel pack buffer memory
+    according to the procedures given in section 4.3.2 for ReadPixels;
+    ..."
+
+ -- Section 6.1.7 "Color Table Query".
+
+    "The one-dimensional color table image is returned to client or
+    pixel pack buffer memory starting at table."
+
+ -- Section 6.1.8 "Convolution Query".
+
+    "The one-dimensional or two-dimensional image is returned to client
+    or pixel pack buffer memory starting at image."
+
+    "The row and column images are returned to client or pixel pack
+    buffer memory starting at row and column respectively."
+
+ -- Section 6.1.9 "Histogram Query".
+
+    "The one-dimensional histogram table image is returned to client or
+    pixel pack buffer memory starting at values."
+
+ -- Section 6.1.10 "Minmax Query".
+
+    "A one-dimensional image of width 2 is returned to client or pixel
+    pack buffer memory starting at values."
+
+ -- Section 6.1.13 "Buffer Object Queries".
+
+    Change the 2nd sentence of the 2nd paragraph to read:
+
+    "target is ARRAY_BUFFER, ELEMENT_ARRAY_BUFFER, PIXEL_PACK_BUFFER_ARB,
+    or PIXEL_UNPACK_BUFFER_ARB."
+
+    Change the last phrase in the 1st sentence of the 4th paragraph to:
+
+    "with target set to ARRAY_BUFFER, ELMENT_ARRAY_BUFFER,
+    PIXEL_PACK_BUFFER_ARB, or PIXEL_UNPACK_BUFFER_ARB and pname set
+    to BUFFER_MAP_POINTER."
+
+
+GLX Protocol
+
+    XXX still-in-progress
+
+    (ARB_vertex_buffer_object has similar issues and lacks specified
+    GLX protocol for its functionality.  This discussion just addresses
+    the issues created by pixel buffer objects, not buffer objects
+    in general.)
+
+    Pixel buffers, like texture objects and display lists, are server-side
+    state.
+
+    Prior to pixel buffer objects, pixel storage state for image packing
+    and unpacking was considered client-side state.  However, pixel
+    buffers create the new situation where the server performs packing
+    and unpacking into server-side pixel buffers.
+
+    The GLX protocol is designed so that the amount of unpacking done
+    by the client is parameterized with the request.  In other words,
+    the client can do as much unpacking as it wants, and then tell the
+    server what unpacking remains to be done by sending the appropriate
+    pixel storage parameters along with the image.
+
+    This means the GLX protocol for rendering commands involving pixel
+    data includes pixel store state for unpacking.
+
+    This means, in theory, the existing protocol for rendering commands
+    with pixel data is sufficient for manipulating pixel buffers.
+    A command (for example, glDrawPixels) could build a protocol request
+    containing the current pixel unpack state and specify zero bytes of
+    image payload when operating on a pixel buffer object.
+
+    In practice, while this addresses command requiring unpacking of
+    pixel data, commands that require packing of pixel data (for example,
+    glReadPixels) to return pixel data do not have protocol fields for
+    pixel store pack state.
+
+    Fortunately, the GLX protocol, through foresight or oversight,
+    has GLX protocol and non-rendering command opcodes (109 and 110)
+    assigned for glPixelStoref and glPixelStorei respectively.
+
+    It is better to use the existing protocol to send glPixelStorei and
+    glPixelStoref GLX commands.  This solves the problem of server-side
+    pixel state the same way for both pack and unpack state.  It may also
+    allow implementations to minimize validation overhead for pixel
+    commands because the pixel store modes are stateful rather than
+    being parameters sent with every pixel command.
+
+    To avoid creating useless protocol overhead for applications not using
+    pixel buffer objects, and hence not requiring server-side knowledge
+    of pixel store state, the GLX client library is free to defer pixel
+    store commands until just prior to pixel commands operating on pixel
+    buffer objects that require server-side pixel store state.
+
+    There is no GLX protocol however for glPushClientAttrib and
+    glPopClientAttrib.  New protocol should be specified for these
+    commands.  These commands are also needed for vertex buffer objects
+    because the vertex array state becomes server-side.
+
+    When bound to an pixel unpack buffer object, the pixel payload for a
+    non-reply pixel command (for example, glTexImage2D) can be ignored.
+    In fact, GLX client implementations are expected to send zero bytes
+    of pixel payload in this case.
+
+    When bound to a pixel pack buffer object, the reply for pixel commands
+    that return pixel data (for example, glReadPixels) is not required
+    since the pixel data is actually transferred to the server-side pixel
+    pack buffer object.  Indeed, forcing an unnecessary reply would hinder
+    the performance advantages of using pixel buffer objects
+
+    Therefore, protocol for "no reply" version of the following commands
+    is specified:
+
+        GetCompressedTexImage_noreply
+        GetConvolutionFilter_noreply
+        GetHistogram_noreply
+        GetMinmax_noreply
+        GetPixelMapfv_noreply
+        GetPixelMapuiv_noreply
+        GetPixelMapusv_noreply
+        GetPolygonStipple_noreply
+        GetSeparableFilter,_noreply
+        GetTexImage_noreply
+        ReadPixels_noreply
+
+    If a "no reply" command is sent when the current pixel pack
+    buffer object binding is zero, a GLXBadContextState error should
+    be generated by the server.
+
+
+Errors
+
+    INVALID_ENUM is generated if the <target> parameter of
+    BindBuffer, BufferData, BufferSubData, MapBuffer, UnmapBuffer,
+    GetBufferSubData, GetBufferParameteriv, or GetBufferPointerv is not
+    one of ARRAY_BUFFER, ELEMENT_ARRAY_BUFFER, PIXEL_PACK_BUFFER_ARB,
+    or PIXEL_UNPACK_BUFFER_ARB.
+
+    INVALID_OPERATION is generated if Bitmap, ColorSubTable, ColorTable,
+    CompressedTexImage1D, CompressedTexImage2D, CompressedTexImage3D,
+    CompressedTexSubImage1D, CompressedTexSubImage2D,
+    CompressedTexSubImage3D, ConvolutionFilter1D, ConvolutionFilter2D,
+    DrawPixels, PixelMapfv, PixelMapuiv, PixelMapusv, PolygonStipple,
+    SeparableFilter2D, TexImage1D, TexImage2D, TexImage3D, TexSubImage1D,
+    TexSubImage2D, or TexSubImage3D would unpack (read) data from the
+    currently bound PIXEL_UNPACK_BUFFER_ARB buffer object such that
+    the memory reads required for the command would exceed the memory
+    (data store) size of the buffer object.
+
+    INVALID_OPERATION is generated if GetColorTable,
+    GetCompressedTexImage, GetConvolutionFilter, GetHistogram, GetMinmax,
+    GetPixelMapfv, GetPixelMapuiv, GetPixelMapusv, GetPolygonStipple,
+    GetSeparableFilter, GetTexImage, or ReadPixels would pack (write) data
+    to the currently bound PIXEL_PACK_BUFFER_ARB buffer object such that
+    the memory writes required for the command would exceed the memory
+    (data store) size of the buffer object.
+
+    INVALID_OPERATION is generated by GetColorTable, GetConvolutionFilter,
+    GetHistogram, GetMinmax, GetSeparableFilter, GetTexImage and ReadPixels
+    if the current PIXEL_PACK_BUFFER_BINDING_ARB value is non-zero and the
+    table/image/values/span/img/data parameter is not evenly divisible
+    into the number of basic machine units needed to store in memory a
+    datum indicated by the type parameter.
+
+    INVALID_OPERATION is generated by ColorTable, ColorSubTable,
+    ConvolutionFilter2D, ConvolutionFilter1D, SeparableFilter2D,
+    TexImage1D, TexImage2D, TexImage3D, TexSubImage1D,
+    TexSubImage2D, TexSubImage3D, and DrawPixels if the current
+    PIXEL_UNPACK_BUFFER_BINDING_ARB value is non-zero and the data
+    parameter is not evenly divisible into the number of basic machine
+    units needed to store in memory a datum indicated by the type
+    parameter.
+
+    INVALID_OPERATION is generated by GetPixelMapfv if the current
+    PIXEL_PACK_BUFFER_BINDING_ARB value is non-zero and the data parameter
+    is not evenly divisible into the number of basic machine units needed
+    to store in memory a float datum.
+
+    INVALID_OPERATION is generated by GetPixelMapuiv if the current
+    PIXEL_PACK_BUFFER_BINDING_ARB value is non-zero and the data parameter
+    is not evenly divisible into the number of basic machine units needed
+    to store in memory a uint datum.
+
+    INVALID_OPERATION is generated by GetPixelMapusv if the current
+    PIXEL_PACK_BUFFER_BINDING_ARB value is non-zero and the data parameter
+    is not evenly divisible into the number of basic machine units needed
+    to store in memory a ushort datum.
+
+    INVALID_OPERATION is generated by PixelMapfv if the current
+    PIXEL_UNPACK_BUFFER_BINDING_ARB value is non-zero and the data
+    parameter is not evenly divisible into the number of basic machine
+    units needed to store in memory a float datum.
+
+    INVALID_OPERATION is generated by PixelMapuiv if the current
+    PIXEL_UNPACK_BUFFER_BINDING_ARB value is non-zero and the data
+    parameter is not evenly divisible into the number of basic machine
+    units needed to store in memory a uint datum.
+
+    INVALID_OPERATION is generated by PixelMapusv if the current
+    PIXEL_UNPACK_BUFFER_BINDING_ARB value is non-zero and the data
+    parameter is not evenly divisible into the number of basic machine
+    units needed to store in memory a ushort datum.
+
+
+Dependencies on EXT_pixel_buffer_object
+
+    When this extension is supported, the EXT_pixel_buffer_object
+    functionality adopts the tighter alignment and buffer bounds overflow
+    error generation behavior of ARB_pixel_buffer_object (previously,
+    EXT_pixel_buffer_object was not explicit about what happened in
+    these situations).  This is because the two extensions share the
+    same enumerants.
+
+Dependencies on NV_pixel_data_range
+
+    A non-zero pixel pack buffer binding takes priority over the
+    READ_PIXEL_DATA_RANGE_NV  enable.
+
+    A non-zero pixel unpack buffer binding takes priority over the
+    WRITE_PIXEL_DATA_RANGE_NV enable.
+
+
+New State
+
+(table 6.20, Pixels, p. 235)
+
+                                                         Initial
+    Get Value                        Type   Get Command  Value    Sec     Attribute
+    -------------------------------  ----   -----------  -------  ------  -----------
+    PIXEL_PACK_BUFFER_BINDING_ARB    Z+     GetIntegerv  0        4.3.5   pixel-store
+    PIXEL_UNPACK_BUFFER_BINDING_ARB  Z+     GetIntegerv  0        6.1.13  pixel-store
+
+
+New Implementation Dependent State
+
+    (none)
+
+
+Usage Examples
+
+    Convenient macro definition for specifying buffer offsets:
+
+        #define BUFFER_OFFSET(i) ((char *)NULL + (i))
+
+    Example 1: Render to vertex array:
+
+        const int numberVertices = 100;
+
+        // Create a buffer object for a number of vertices consisting of
+        // 4 float values per vertex
+        glGenBuffers(1, vertexBuffer);
+        glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, vertexBuffer);
+        glBufferData(GL_PIXEL_PACK_BUFFER_ARB, numberVertices*4,
+                     NULL, GL_DYNAMIC_DRAW);
+
+        // Render vertex data into 100x1 strip of framebuffer using a
+        // fragment program
+        glBindProgram(FRAGMENT_PROGRAM_ARB, fragmentProgram);
+        glDrawBuffer(GL_BACK);
+        renderVertexData();
+        glBindProgramARB(FRAGMENT_PROGRAM_ARB, 0);
+
+        // Read the vertex data back from framebuffer
+        glReadBuffer(GL_BACK);
+        glReadPixels(0, 0, numberVertices, 1, GL_BGRA, GL_FLOAT,
+                     BUFFER_OFFSET(0));
+
+        // Change the binding point of the buffer object to
+        // the vertex array binding point
+        glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
+
+        glEnableClientState(VERTEX_ARRAY);
+        glVertexPointer(4, GL_FLOAT, 0, BUFFER_OFFSET(0));
+        glDrawArrays(TRIANGLE_STRIP, 0, numberVertices);
+
+
+    Example 2: Streaming textures
+
+    Streaming textures using NV_pixel_data_range:
+
+        const int texWidth = 256;
+        const int texHeight = 256;
+        const int texsize = texWidth * texHeight * 4;
+        void *pdrMemory, *texData;
+
+        pdrMemory = glAllocateMemoryNV(texsize, 0.0, 1.0, 1.0);
+
+        glPixelDataRangeNV(GL_WRITE_PIXEL_DATA_RANGE_NV, texsize,
+                           pdrMemory);
+
+        glEnableClientState(GL_WRITE_PIXEL_DATA_RANGE_NV);
+
+        // Define texture level (without an image)
+        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, texWidth, texHeight, 0,
+                     GL_BGRA, GL_UNSIGNED_BYTE, NULL);
+        // Setup texture environment
+        ...
+
+        texData = getNextImage();
+
+        while (texData) {
+
+            memcpy(pdrMemory, texData, texsize);
+
+            glFlushPixelDataRangeNV(GL_WRITE_PIXEL_DATA_RANGE_NV);
+
+            glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, texWidth, texHeight,
+                            GL_BGRA, GL_UNSIGNED_BYTE, pdrMemory);
+
+            // Draw textured geometry
+            glBegin(GL_QUADS);
+            ...
+            glEnd();
+
+            texData = getNextImage();
+        }
+
+        glDisableClientState(GL_WRITE_PIXEL_DATA_RANGE_NV);
+
+        glFreeMemoryNV(pdrMemory);
+
+
+    Streaming textures using pixel buffer objects:
+
+        const int texWidth = 256;
+        const int texHeight = 256;
+        const int texsize = texWidth * texHeight * 4;
+        void *pboMemory, *texData;
+
+        // Define texture level zero (without an image); notice the
+        // explicit bind to the zero pixel unpack buffer object so that
+        // pass NULL for the image data leaves the texture image
+        // unspecified.
+        glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
+        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, texWidth, texHeight, 0,
+                     GL_BGRA, GL_UNSIGNED_BYTE, NULL);
+
+        // Create and bind texture image buffer object
+        glGenBuffers(1, &texBuffer);
+        glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, texBuffer);
+
+        // Setup texture environment
+        ...
+
+        texData = getNextImage();
+
+        while (texData) {
+
+            // Reset the contents of the texSize-sized buffer object
+            glBufferData(GL_PIXEL_UNPACK_BUFFER_ARB, texSize, NULL,
+                         GL_STREAM_DRAW);
+
+            // Map the texture image buffer (the contents of which
+            // are undefined due to the previous glBufferData)
+            pboMemory = glMapBuffer(GL_PIXEL_UNPACK_BUFFER_ARB,
+                                    GL_WRITE_ONLY);
+
+            // Modify (sub-)buffer data
+            memcpy(pboMemory, texData, texsize);
+
+            // Unmap the texture image buffer
+            glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER_ARB);
+
+            // Update (sub-)teximage from texture image buffer
+            glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, texWidth, texHeight,
+                            GL_BGRA, GL_UNSIGNED_BYTE, BUFFER_OFFSET(0));
+
+            // Draw textured geometry
+            glBegin(GL_QUADS);
+            ...
+            glEnd();
+
+            texData = getNextImage();
+        }
+
+        glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
+
+
+    Example 3: Asynchronous glReadPixels
+
+    Traditional glReadPixels:
+
+        const int imagewidth = 640;
+        const int imageheight = 480;
+        GLubyte readBuffer[imagewidth*imageheight*4];
+
+        // Render to framebuffer
+        glDrawBuffer(GL_BACK);
+        renderScene()
+
+        // Read image from framebuffer
+        glReadBuffer(GL_BACK);
+        glReadPixels(0, 0, imagewidth, imageheight, GL_BGRA,
+                     GL_UNSIGNED_BYTE, readBuffer);
+
+        // Process image when glReadPixels returns after reading the
+        // whole buffer
+        processImage(readBuffer);
+
+
+    Asynchronous glReadPixels:
+
+        const int imagewidth = 640;
+        const int imageheight = 480;
+        const int imageSize = imagewidth*imageheight*4;
+
+        glGenBuffers(2, imageBuffers);
+
+        glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, imageBuffers[0]);
+        glBufferData(GL_PIXEL_PACK_BUFFER_ARB, imageSize / 2, NULL,
+                     GL_STREAM_READ);
+
+        glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, imageBuffers[1]);
+        glBufferData(GL_PIXEL_PACK_BUFFER_ARB, imageSize / 2, NULL,
+                     GL_STREAM_READ);
+
+        // Render to framebuffer
+        glDrawBuffer(GL_BACK);
+        renderScene();
+
+        // Bind two different buffer objects and start the glReadPixels
+        // asynchronously. Each call will return directly after
+        // starting the DMA transfer.
+        glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, imageBuffers[0]);
+        glReadPixels(0, 0, imagewidth, imageheight/2, GL_BGRA,
+                     GL_UNSIGNED_BYTE, BUFFER_OFFSET(0));
+
+        glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, imageBuffers[1]);
+        glReadPixels(0, imageheight/2, imagewidth, imageheight/2, GL_BGRA,
+                     GL_UNSIGNED_BYTE, BUFFER_OFFSET(0));
+
+        // Process partial images.  Mapping the buffer waits for
+        // outstanding DMA transfers into the buffer to finish.
+        glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, imageBuffers[0]);
+        pboMemory1 = glMapBuffer(GL_PIXEL_PACK_BUFFER_ARB,
+                                 GL_READ_ONLY);
+        processImage(pboMemory1);
+        glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, imageBuffers[1]);
+        pboMemory2 = glMapBuffer(GL_PIXEL_PACK_BUFFER_ARB,
+                                 GL_READ_ONLY);
+        processImage(pboMemory2);
+
+        // Unmap the image buffers
+        glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, imageBuffers[0]);
+        glUnmapBuffer(GL_PIXEL_PACK_BUFFER_ARB);
+        glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, imageBuffers[1]);
+        glUnmapBuffer(GL_PIXEL_PACK_BUFFER_ARB);
+
+
+Appendix on Pack/Unpack Range
+
+    The complexity of OpenGL's pixel pack/unpack state makes it difficult
+    to express succinctly what range of a pixel buffer object will be
+    accessed by a pixel command.
+
+    The following code, following the conventions of the SGI OpenGL
+    Sample Implementation, returns the limit (one byte more than the
+    maximum allowed offset into the buffer object) for the memory a
+    pixel command will read/write.
+
+    /*
+    ** Compute offset limit into user's data considering all pixel
+    ** store modes.  This offset limit is ONE MORE than the largest byte
+    ** offset for the image.
+    */
+    static GLsizeiptr OffsetLimitImage3D(__GLpixelStoreMode *pixelStoreMode,
+                                         GLsizei width, GLsizei height,
+                                         GLsizei depth,
+                                         GLenum format, GLenum type,
+                                         const GLvoid *userdata,
+                                         GLint skip_images)
+    {
+        const GLint line_length = pixelStoreMode->lineLength;
+        const GLint image_height = pixelStoreMode->imageHeight;
+        const GLint alignment = pixelStoreMode->alignment;
+        const GLint skip_pixels = pixelStoreMode->skipPixels;
+        const GLint skip_lines = pixelStoreMode->skipLines;
+
+        GLsizeiptr offsetLimit = (GLsizeiptr) userdata;
+
+        GLint rowsize;
+        GLint padding;
+        GLint imagesize;
+
+        assert(width > 0);
+        assert(height > 0);
+        assert(depth > 0);
+
+        assert(line_length >= 0);
+        assert(image_height >= 0);
+
+        assert(skip_pixels >= 0);
+        assert(skip_lines >= 0);
+        assert(skip_images >= 0);
+
+        assert((alignment == 1) ||
+               (alignment == 2) ||
+               (alignment == 4) ||
+               (alignment == 8));
+
+        /* All formats except GL_BITMAP fall out trivially */
+        if (type == GL_BITMAP) {
+            const GLint groups_per_line = (line_length > 0) ?
+                                          line_length : width;
+            const GLint rows_per_image = (image_height > 0) ?
+                                         image_height : height;
+
+            assert(1 == __glElementsPerGroup(format, type));
+
+            rowsize = (groups_per_line + 7) / 8;
+            padding = rowsize & (alignment-1);
+            if (padding) {
+                rowsize += alignment - padding;
+            }
+            imagesize = rows_per_image * rowsize;
+
+            offsetLimit += imagesize    * (skip_images + depth-1);
+            offsetLimit += rowsize      * (skip_lines  + height-1);
+            offsetLimit += (skip_pixels + width+7)/8;
+        } else {
+            const GLint components = __glElementsPerGroup(format, type);
+            const GLint element_size = __glBytesPerElement(type);
+            const GLint group_size = element_size * components;
+
+            if (0 == (line_length | image_height | skip_pixels |
+                      skip_lines | skip_pixels)) {
+                // Fast path: when above pixel store modes are all zero.
+                rowsize = width * group_size;
+                // Default alignment is 4 so allow arbitrary alignment
+                // on fast path.
+                padding = rowsize & (alignment-1);
+                if (padding) {
+                    rowsize += alignment - padding;
+                }
+                imagesize = depth * height * rowsize;
+                offsetLimit += imagesize;
+            } else {
+                // General path: when one or more non-zero pixel store modes.
+                const GLint groups_per_line = (line_length > 0) ?
+                                              line_length : width;
+                const GLint rows_per_image = (image_height > 0) ?
+                                             image_height : height;
+
+                rowsize = groups_per_line * group_size;
+                padding = rowsize & (alignment-1);
+                if (padding) {
+                    rowsize += alignment - padding;
+                }
+                imagesize = rows_per_image * rowsize;
+
+                offsetLimit += imagesize    * (skip_images  + depth-1);
+                offsetLimit += rowsize      * (skip_lines   + height-1);
+                offsetLimit += group_size   * (skip_pixels  + width);
+            }
+        }
+        return offsetLimit;
+    }
+
+    GLsizeiptr __glOffsetLimitImage3D(__GLpixelStoreMode *pixelStoreMode,
+                                      GLsizei width, GLsizei height,
+                                      GLsizei depth,
+                                      GLenum format, GLenum type,
+                                      const GLvoid *userdata)
+    {
+        return OffsetLimitImage3D(pixelStoreMode,
+                                  width, height, depth, format, type,
+                                  userdata,
+                                  pixelStoreMode->skipImages);
+    }
+
+    GLsizeiptr __glOffsetLimitImage(__GLpixelStoreMode *pixelStoreMode,
+                                    GLsizei width, GLsizei height,
+                                    GLenum format, GLenum type,
+                                    const GLvoid *userdata)
+    {
+        /* NOTE: Non-3D image max offset computations ignore (treat as zero)
+           the unpackModes.skipImages state! */
+        return OffsetLimitImage3D(pixelStoreMode,
+                                  width, height, 1, format, type,
+                                  userdata,
+                                  0);  // Treat skipImages as zero.
+    }
+
+
+Revision History
+
+    revision 0.3: mjk
+
+        Numbered issues.
+
+        Add issues 14 through 18.
+
+        Remove all gl/GL prefix/suffixing in specification sections.  Use
+        gl/GL prefix/suffixing in sections other than the specification
+        sections. Leaving off prefixes in non-specification sections is
+        ambiguous, particularly within example source code.
+
+        Base specification language updates on OpenGL 2.0 specification.
+
+        Add buffer object required state section.
+
+        Added GL_INVALID_OPERATION when an offset accessed (read or
+        written) for a pixel command from/to a pixel buffer object would
+        exceed the size of the buffer object.
+
+        Added GL_INVALID_OPERATION when for misaligned offsets.
+
+        Added "Appendix on Pack/Unpack Range".
+
+        Add GLX protocol discussion.
+
+    revision 0.4: mjk
+
+        Fixed grammar issues from Brian Paul.
+
+        Improved example code and fixed grammar from Nick Carter.
+
+        Explain how a NULL data parameter to glTexImage commands works.
+
+    revision 0.5: mjk
+
+        Clarify that glBufferData usage modes apply to drawing _and_
+        image specification commands.
+
+    revision 0.6: mjk
+
+        Add "streaming draw pixels" to the list of interesting approaches
+        for this extension in the Overview.
+
+        Add issue discussing the relationship of this extension to data
+        aquisition hardware.
+
+    revision 0.7: mjk
+
+        Assign enumerant values to match the EXT_pixel_buffer_object values.
+
+        Add issue explaining why the ARB extension shares enums with
+        EXT_pixel_buffer_object.
+
+        Apply Dale's suggestion to improve the clarity of the usage
+        pattern parameters to glBufferData.
+
+    revision 0.8 mjk
+
+        Typo fixes from Ian Romanick and Nick Carter.
+
+    revision 1.0 mjk
+
+        Add issue 23 for Jeremy about render-to-vertex-array.  Move
+        render-to-vertex-array justification in overview to bottom of
+        the list.
@@ -0,0 +1,973 @@
+POGL provides interfaces to support OpenGL APIs on
+languages that do not support C pointers. This is
+handled via suffixed APIs that support native-language
+references:
+
+    _c APIs provides (CPTR) interfaces for languages
+    (eg: Perl) that provide a means to pass around C
+    pointers.
+
+    _s APIs provides (PACKED) string interfaces for
+    most other languages. 
+
+    _p are portable APIs that do not require passing
+    pointers; instead, blocks of data may be passed
+    around via (OGA) OpenGL::Array object references. 
+
+
+@pixels = glReadPixels_p($x, $y, $width, $height, $format, $type);
+
+glAccum($op, $value);
+glActiveTextureARB($texture);
+glAlphaFunc($func, $ref);
+glAreTexturesResident_c($n, (CPTR)textures, (CPTR)residences);
+(result,@residences) = glAreTexturesResident_p(@textureIDs);
+glAreTexturesResident_s($n, (PACKED)textures, (PACKED)residences);
+glArrayElement($i);
+glArrayElementEXT($i);
+glAttachObjectARB($containerObj, $obj);
+glBegin($mode);
+glBindAttribLocationARB($programObj, $index, $name);
+glBindBufferARB($target,$buffer);
+glBindFramebufferEXT($target,$framebuffer);
+glBindProgramARB($target,$program);
+glBindRenderbufferEXT(target,renderbuffer);
+glBindTexture($target, $texture);
+glBitmap_c($width, $height, $xorig, $yorig, $xmove, $ymove, (CPTR)bitmap);
+glBitmap_p($width, $height, $xorig, $yorig, $xmove, $ymove, @bitmap);
+glBitmap_s($width, $height, $xorig, $yorig, $xmove, $ymove, (PACKED)bitmap);
+glBlendColor($red, $green, $blue, $alpha);
+glBlendColorEXT($red, $green, $blue, $alpha);
+glBlendEquation($mode);
+glBlendEquationEXT($mode);
+glBlendFunc($sfactor, $dfactor);
+glBufferDataARB_c($target,$size,(CPTR)data,$usage);
+glBufferDataARB_p($target,(OGA)data,$usage);
+glBufferDataARB_s($target,$size,(PACKED)data,$usage);
+glBufferSubDataARB_c($target,$offset,$size,(CPTR)data);
+glBufferSubDataARB_p($target,$offset,(OGA)data);
+glBufferSubDataARB_s($target,$offset,$size,(PACKED)data);
+glCallList($list);
+glCallLists_c($n, $type, (CPTR)lists);
+glCallLists_p(@lists);
+glCallLists_s($n, $type, (PACKED)lists);
+glCheckFramebufferStatusEXT($target);
+glClampColorARB($target,$clamp);
+glClear($mask);
+glClearAccum($red, $green, $blue, $alpha);
+glClearColor($red, $green, $blue, $alpha);
+glClearDepth($depth);
+glClearIndex($c);
+glClearStencil($s);
+glClientActiveTextureARB($texture);
+glClipPlane_c($plane, (CPTR)eqn);
+glClipPlane_p($plane, $eqn0, $eqn1, $eqn2, $eqn3);
+glClipPlane_s($plane, (PACKED)eqn);
+glColor3b($red, $green, $blue);
+glColor3bv_c((CPTR)v);
+glColor3bv_p($red, $green, $blue, $alpha);
+glColor3bv_s((PACKED)v);
+glColor3d($red, $green, $blue);
+glColor3dv_c((CPTR)v);
+glColor3dv_p($red, $green, $blue, $alpha);
+glColor3dv_s((PACKED)v);
+glColor3f($red, $green, $blue);
+glColor3fv_c((CPTR)v);
+glColor3fv_p($red, $green, $blue, $alpha);
+glColor3fv_s((PACKED)v);
+glColor3i($red, $green, $blue);
+glColor3iv_c((CPTR)v);
+glColor3iv_p($red, $green, $blue, $alpha);
+glColor3iv_s((PACKED)v);
+glColor3s($red, $green, $blue);
+glColor3sv_c((CPTR)v);
+glColor3sv_p($red, $green, $blue, $alpha);
+glColor3sv_s((PACKED)v);
+glColor3ub($red, $green, $blue);
+glColor3ubv_c((CPTR)v);
+glColor3ubv_p($red, $green, $blue, $alpha);
+glColor3ubv_s((PACKED)v);
+glColor3ui($red, $green, $blue);
+glColor3uiv_c((CPTR)v);
+glColor3uiv_p($red, $green, $blue, $alpha);
+glColor3uiv_s((PACKED)v);
+glColor3us($red, $green, $blue);
+glColor3usv_c((CPTR)v);
+glColor3usv_p($red, $green, $blue, $alpha);
+glColor3usv_s((PACKED)v);
+glColor4b($red, $green, $blue, $alpha);
+glColor4bv_c((CPTR)v);
+glColor4bv_s((PACKED)v);
+glColor4d($red, $green, $blue, $alpha);
+glColor4dv_c((CPTR)v);
+glColor4dv_s((PACKED)v);
+glColor4f($red, $green, $blue, $alpha);
+glColor4fv_c((CPTR)v);
+glColor4fv_s((PACKED)v);
+glColor4i($red, $green, $blue, $alpha);
+glColor4iv_c((CPTR)v);
+glColor4iv_s((PACKED)v);
+glColor4s($red, $green, $blue, $alpha);
+glColor4sv_c((CPTR)v);
+glColor4sv_s((PACKED)v);
+glColor4ub(red, green, blue, alpha);
+glColor4ubv_c((CPTR)v);
+glColor4ubv_s((PACKED)v);
+glColor4ui($red, $green, $blue, $alpha);
+glColor4uiv_c((CPTR)v);
+glColor4uiv_s((PACKED)v);
+glColor4us($red, $green, $blue, $alpha);
+glColor4usv_c((CPTR)v);
+glColor4usv_s((PACKED)v);
+glColorMask($red, $green, $blue, $alpha);
+glColorMaterial($face, $mode);
+glColorPointerEXT_c($size, $type, $stride, $count, (CPTR)pointer);
+glColorPointerEXT_p($size, (OGA)pointer);
+glColorPointerEXT_s($size, $type, $stride, $count, (PACKED)pointer);
+glColorPointer_c($size, $type, $stride, (CPTR)pointer);
+glColorPointer_p($size, $type, $stride, (OGA)pointer);
+glColorPointer_s($size, $type, $stride, (PACKED)pointer);
+glCompileShaderARB($shaderObj);
+glCopyPixels($x, $y, $width, $height, $type);
+glCopyTexImage1D($target, $level, $internalFormat, $x, $y, $width, $border);
+glCopyTexImage2D($target, $level, $internalFormat, $x, $y, $width, $height, $border);
+glCopyTexSubImage1D($target, $level, $xoffset, $x, $y, $width);
+glCopyTexSubImage2D($target, $level, $xoffset, $yoffset, $x, $y, $width, $height);
+glCopyTexSubImage3D($target, $level, $xoffset, $yoffset, $zoffset, $x, $y, $width, $height);
+$obj = glCreateProgramObjectARB();
+glCreateShaderObjectARB($shaderType);
+glCullFace($mode);
+glDeleteBuffersARB_c($n,(CPTR)buffers);
+glDeleteBuffersARB_p(@buffers);
+glDeleteBuffersARB_s($n,(PACKED)buffers);
+glDeleteFramebuffersEXT_c($n,(CPTR)framebuffers);
+glDeleteFramebuffersEXT_p(@framebuffers);
+glDeleteFramebuffersEXT_s($n,(PACKED)framebuffers);
+glDeleteLists($list, $range);
+glDeleteObjectARB($obj);
+glDeleteProgramsARB_c($n,(PACKED)programs);
+glDeleteProgramsARB_p(@programIDs);
+glDeleteRenderbuffersEXT_c($n,(CPTR)renderbuffers);
+glDeleteRenderbuffersEXT_p(@renderbuffers);
+glDeleteRenderbuffersEXT_s($n,(PACKED)renderbuffers);
+glDeleteTextures_c($items, (CPTR)list);
+glDeleteTextures_p(@textureIDs);
+glDeleteTextures_s($items, (PACKED)list);
+glDepthFunc($func);
+glDepthMask($flag);
+glDepthRange($zNear, $zFar);
+glDetachObjectARB($containerObj, $attachedObj);
+glDisable($cap);
+glDisableClientState($cap);
+glDisableVertexAttribArrayARB($index);
+glDrawArrays($mode, $first, $count);
+glDrawArraysEXT($mode, $first, $count);
+glDrawBuffer($mode);
+glDrawBuffersARB_c($n,(CPTR)buffers);
+glDrawBuffersARB_p(@buffers);
+glDrawBuffersARB_s($n,(PACKED)buffers);
+glDrawBuffers_c($n,(CPTR)buffers);
+glDrawBuffers_p(@buffers);
+glDrawBuffers_s($n,(PACKED)buffers);
+glDrawElements_c($mode, $count, $type, (CPTR)indices);
+glDrawElements_p($mode, @indices);
+glDrawElements_s($mode, $count, $type, (PACKED)indices);
+glDrawPixels_c($width, $height, $format, $type, (CPTR)pixels);
+glDrawPixels_p($width, $height, $format, $type, @pixels);
+glDrawPixels_s($width, $height, $format, $type, (PACKED)pixels);
+glDrawRangeElements_c($mode, $start, $end, $count, $type, (CPTR)indices);
+glDrawRangeElements_p($mode, $start, $end, $count, $type, @indices);
+glDrawRangeElements_s($mode, $start, $end, $count, $type, (PACKED)indices);
+glEdgeFlag($flag);
+glEdgeFlagPointerEXT_c($stride, $count, (CPTR)pointer);
+glEdgeFlagPointerEXT_p((OGA)pointer);
+glEdgeFlagPointerEXT_s($stride, $count, (PACKED)pointer);
+glEdgeFlagPointer_c($stride, (CPTR)pointer);
+glEdgeFlagPointer_p($stride, (OGA)pointer);
+glEdgeFlagPointer_s($stride, (PACKED)pointer);
+glEnable($cap);
+glEnableClientState($cap);
+glEnableVertexAttribArrayARB($index);
+glEndList();
+glEvalCoord1d($u);
+glEvalCoord1f($u);
+glEvalCoord2d($u, $v);
+glEvalCoord2f($u, $v);
+glEvalMesh1($mode, $i1, $i2);
+glEvalMesh2($mode, $i1, $i2, $j1, $j2);
+glEvalPoint1($i);
+glEvalPoint2($i, $j);
+glFeedbackBuffer_c($size, $type, (CPTR)buffer);
+glFinish();
+glFlush();
+glFogf($pname, $param);
+glFogfv_c($pname, (CPTR)params);
+glFogfv_p($pname, $param1, $param2=0, $param3=0, $param4=0);
+glFogfv_s($pname, (PACKED)params);
+glFogi($pname, $param);
+glFogiv_c($pname, (CPTR)params);
+glFogiv_p($pname, $param1, $param2=0, $param3=0, $param4=0);
+glFogiv_s($pname, (PACKED)params);
+glFramebufferRenderbufferEXT($target,$attachment,$renderbuffertarget,$renderbuffer);
+glFramebufferTexture1DEXT($target,$attachment,$textarget,$texture,$level);
+glFramebufferTexture2DEXT($target,$attachment,$textarget,$texture,$level);
+glFrontFace($mode);
+glFrustum($left, $right, $bottom, $top, $zNear, $zFar);
+glGenBuffersARB_c($n,(CPTR)buffers);
+@buffers = glGenBuffersARB_p($n);
+glGenBuffersARB_s($n,(PACKED)buffers);
+@framebuffers = glGenFramebuffersEXT_c($n);
+glGenFramebuffersEXT_s($n,(PACKED)framebuffers);
+glGenLists($range);
+@programIDs = glGenProgramsARB_c($n);
+glGenProgramsARB_s($n,(PACKED)programs);
+@renderbuffers = glGenRenderbuffersEXT_c($n);
+glGenRenderbuffersEXT_s($n,(PACKED)renderbuffers);
+glGenTextures_c($n, (CPTR)textures);
+@textureIDs = glGenTextures_p($n);
+glGenTextures_s($n, (PACKED)textures);
+glGenerateMipmapEXT($target);
+glGetActiveAttribARB_c($programObj, $index, $maxLength, (CPTR)length, (CPTR)size, (CPTR)type, (CPTR)name);
+($name,$type,$size) = glGetActiveAttribARB_p($programObj, $index);
+glGetActiveAttribARB_s($programObj, $index, $maxLength, (PACKED)length, (PACKED)size, (PACKED)type, (PACKED)name);
+glGetActiveUniformARB_c($programObj, $index, $maxLength, (CPTR)length, (CPTR)size, (CPTR)type, (CPTR)name);
+($name,$type,$size) = glGetActiveUniformARB_p($programObj, $index);
+glGetActiveUniformARB_s($programObj, $index, $maxLength, (PACKED)length, (PACKED)size, (PACKED)type, (PACKED)name);
+glGetAttachedObjectsARB_c($containerObj, $maxCount, (CPTR)count, (CPTR)obj);
+@objs = glGetAttachedObjectsARB_p($containerObj);
+glGetAttachedObjectsARB_s($containerObj, $maxCount, (PACKED)count, (PACKED)obj);
+glGetAttribLocationARB_c($programObj, (CPTR)name);
+$value = glGetAttribLocationARB_p(programObj, $name);
+glGetAttribLocationARB_s($programObj, (PACKED)name);   ## Missing?
+glGetBooleanv_c($pname, (CPTR)params);
+@data = glGetBooleanv_p($param);
+glGetBooleanv_s($pname, (PACKED)params);
+glGetBufferParameterivARB_c($target,$pname,(CPTR)params);
+@params = glGetBufferParameterivARB_p($target,$pname);
+glGetBufferParameterivARB_s($target,$pname,(PACKED)params);
+glGetBufferPointervARB_c($target,$pname,(CPTR)params);
+$oga = glGetBufferPointervARB_p($target,$pname,@types);
+glGetBufferPointervARB_s($target,$pname,(PACKED)params);
+$oga = glGetBufferSubDataARB_p($target,$offset,$count,@types);
+glGetClipPlane_c($plane, (CPTR)eqn);
+@data = glGetClipPlane_p($plane);
+glGetClipPlane_s($plane, (PACKED)eqn);
+glGetDoublev_c($pname, (CPTR)params);     ## Missing?
+glGetDoublev_s($pname, (PACKED)params);   ## Missing?
+@data = glGetDoublev_p($param);
+glGetError();
+glGetFloatv_c($pname, (CPTR)params);
+@data = glGetFloatv_p($param);
+glGetFloatv_s($pname, (PACKED)params);
+glGetFramebufferAttachmentParameterivEXT_c($target,$attachment,$pname,(CPTR)params);
+glGetFramebufferAttachmentParameterivEXT_s($target,$attachment,$pname,(PACKED)params);
+glGetHandleARB($pname);
+$infoLog = glGetInfoLogARB_c($obj);
+@data = glGetIntegerv_p($param);
+glGetIntegerv_c($pname, (CPTR)params);
+glGetIntegerv_s($pname, (PACKED)params);
+glGetLightfv_c($light, $pname, (CPTR)p);
+@data = glGetLightfv_p($light, $pname);
+glGetLightfv_s($light, $pname, (PACKED)p);
+glGetLightiv_c($light, $pname, (CPTR)p);
+@data = glGetLightiv_p($light, $pname);
+glGetLightiv_s($light, $pname, (PACKED)p);
+glGetMapdv_c($target, $query, (CPTR)v);
+@data = glGetMapdv_p($target, $query);
+glGetMapdv_s($target, $query, (PACKED)v);
+glGetMapfv_c($target, $query, (CPTR)v);
+@data = glGetMapfv_p($target, $query);
+glGetMapfv_s($target, $query, (PACKED)v);
+glGetMapiv_c($target, $query, (CPTR)v);
+@data = glGetMapiv_p($target, $query);
+glGetMapiv_s($target, $query, (PACKED)v);
+glGetMaterialfv_c($face, $query, (CPTR)params);
+@params = glGetMaterialfv_p($face, $query);
+glGetMaterialfv_s($face, $query, (PACKED)params);
+glGetMaterialiv_c($face, $query, (CPTR)params);
+@params = glGetMaterialiv_p($face, $query);
+glGetMaterialiv_s($face, $query, (PACKED)params);
+glGetObjectParameterfvARB_c($obj,$pname,(CPTR)params);
+$param = glGetObjectParameterfvARB_p($obj,$pname);
+glGetObjectParameterfvARB_s($obj,$pname,(PACKED)params);
+glGetObjectParameterivARB_c($obj,$pname,(CPTR)params);  ## Missing?
+$param = glGetObjectParameterivARB_p($obj,$pname);
+glGetObjectParameterivARB_s($obj,$pname,(PACKED)params);
+glGetPixelMapfv_c($map, (CPTR)values);
+@data = glGetPixelMapfv_p($map);
+glGetPixelMapfv_s($map, (PACKED)values);
+glGetPixelMapuiv_c($map, (CPTR)values);
+@data = glGetPixelMapuiv_p($map);
+glGetPixelMapuiv_s($map, (PACKED)values);
+glGetPixelMapusv_c($map, (CPTR)values);
+@data = glGetPixelMapusv_p($map);
+glGetPixelMapusv_s($map, (PACKED)values);
+glGetPointerv_c($pname, (CPTR)params);
+@params = glGetPointerv_p($pname);
+glGetPointerv_s($pname, (PACKED)params);
+glGetPolygonStipple_c((CPTR)mask);
+@mask = glGetPolygonStipple_p();
+glGetPolygonStipple_s((PACKED)mask);
+glGetProgramEnvParameterdvARB_c($target,$index,(CPTR)params);
+@params = glGetProgramEnvParameterdvARB_p($target,$index);
+glGetProgramEnvParameterdvARB_s($target,$index,(PACKED)params);
+glGetProgramEnvParameterfvARB_c($target,$index,(CPTR)params);
+@params = glGetProgramEnvParameterfvARB_p($target,$index);
+glGetProgramEnvParameterfvARB_s($target,$index,(PACKED)params);
+glGetProgramLocalParameterdvARB_c($target,$index,(CPTR)params);
+@params = glGetProgramLocalParameterdvARB_p($target,$index);
+glGetProgramLocalParameterdvARB_s($target,$index,(PACKED)params);
+glGetProgramLocalParameterfvARB_c($target,$index,(CPTR)params);
+@params = glGetProgramLocalParameterfvARB_p($target,$index);
+glGetProgramLocalParameterfvARB_s($target,$index,(PACKED)params);
+glGetProgramStringARB_c(target,pname,(CPTR)string);
+$string = glGetProgramStringARB_p(target[,pname]);
+glGetProgramStringARB_s(target,pname,(PACKED)string);
+glGetProgramivARB_c($target,$pname,(CPTR)params);
+$value = glGetProgramivARB_p($target,$pname);
+glGetProgramivARB_s($target,$pname,(PACKED)params);
+glGetRenderbufferParameterivEXT_c($target,$pname,(CPTR)params);
+glGetRenderbufferParameterivEXT_s($target,$pname,(PACKED)params);
+glGetShaderSourceARB_c($obj, $maxLength, (CPTR)length, (CPTR)source);
+$source = glGetShaderSourceARB_p($obj);
+glGetShaderSourceARB_s($obj, $maxLength, (PACKED)length, (PACKED)source);  ## Missing?
+$string = glGetString($name);
+glGetTexEnvfv_c($target, $pname, (CPTR)params);
+@parames = glGetTexEnvfv_p($target, $pname);
+glGetTexEnvfv_s($target, $pname, (PACKED)params);
+glGetTexEnviv_c($target, $pname, (CPTR)params);
+@parames = glGetTexEnviv_p($target, $pname);
+glGetTexEnviv_s($target, $pname, (PACKED)params);
+glGetTexGendv_c($coord, $pname, (CPTR)params);
+@params = glGetTexGendv_p($coord, $pname);
+glGetTexGendv_s($coord, $pname, (PACKED)params);  ## Missing?
+glGetTexGenfv_c($coord, $pname, (CPTR)params);
+@params = glGetTexGenfv_p($coord, $pname);
+glGetTexGenfv_s($coord, $pname, (PACKED)params);
+glGetTexGeniv_c($coord, $pname, (CPTR)params);
+@params = glGetTexGeniv_p($coord, $pname);
+glGetTexGeniv_s($coord, $pname, (PACKED)params);
+glGetTexImage_c($target, $level, $format, $type, (CPTR)pixels);
+@pixels = glGetTexImage_p($target, $level, $format, $type);
+glGetTexImage_s($target, $level, $format, $type, (PACKED)pixels);
+glGetTexLevelParameterfv_c($target, $level, $pname, (CPTR)params);
+@params = glGetTexLevelParameterfv_p($target, $level, $pname);
+glGetTexLevelParameterfv_s($target, $level, $pname, (PACKED)params);
+glGetTexLevelParameteriv_c($target, $level, $pname, (CPTR)params);
+@params = glGetTexLevelParameteriv_p($target, $level, $pname);
+glGetTexLevelParameteriv_s($target, $level, $pname, (PACKED)params);
+glGetTexParameterfv_c($target, $pname, (CPTR)params);
+@params = glGetTexParameterfv_p($target, $pname);
+glGetTexParameterfv_s($target, $pname, (PACKED)params);
+glGetTexParameteriv_c($target, $pname, (CPTR)params);
+@params = glGetTexParameteriv_p($target, $pname);
+glGetTexParameteriv_s($target, $pname, (PACKED)params);
+glGetUniformLocationARB_c($programObj, (CPTR)name);
+$value = glGetUniformLocationARB_p($programObj, $name);
+glGetUniformLocationARB_s($programObj, (PACKED)name);  ## Missing?
+glGetUniformfvARB_c($programObj, $location, (CPTR)params);
+@params = glGetUniformfvARB_p($programObj, $location[, $count]);
+glGetUniformfvARB_s($programObj, $location, (PACKED)params);  ## Missing?
+glGetUniformivARB_c($programObj, $location, (CPTR)params);
+@params = glGetUniformivARB_p($programObj, $location[, $count]);
+glGetUniformivARB_s($programObj, $location, (PACKED)params);  ## Missing?
+glGetVertexAttribPointervARB_c($index,$pname,(CPTR)pointer);
+$param = glGetVertexAttribPointervARB_p($index,$pname);
+glGetVertexAttribPointervARB_s($index,$pname,(PACKED)pointer);  ## Missing?
+glGetVertexAttribdvARB_c($index,$pname,(CPTR)params);
+$param = glGetVertexAttribdvARB_p($index,$pname);
+glGetVertexAttribdvARB_s($index,$pname,(PACKED)params);
+glGetVertexAttribfvARB_c($index,$pname,(CPTR)params);
+$param = glGetVertexAttribfvARB_p($index,$pname);
+glGetVertexAttribfvARB_s($index,$pname,(PACKED)params);
+glGetVertexAttribivARB_c($index,$pname,(CPTR)params);
+$param = glGetVertexAttribivARB_p($index,$pname);
+glGetVertexAttribivARB_s($index,$pname,(PACKED)params);
+glHint($target, $mode);
+glIndexPointerEXT_c($type, $stride, $count, (CPTR)pointer);
+glIndexPointerEXT_p((OGA)pointer);
+glIndexPointerEXT_s($type, $stride, $count, (PACKED)pointer);
+glIndexPointer_c($type, $stride, (CPTR)pointer);
+glIndexPointer_p($type, $stride, (OGA)pointer);
+glIndexPointer_s($type, $stride, (PACKED)pointer);
+glIndexd($c);
+glIndexi($c);
+glInitNames();
+glInterleavedArrays_c($format, $stride, (CPTR)pointer);
+glIsBufferARB($buffer);
+glIsEnabled($cap);
+glIsFramebufferEXT($framebuffer);
+glIsList(list);
+glIsProgramARB(program);
+glIsRenderbufferEXT(renderbuffer);
+glIsTexture($list);
+glLightModelf($pname, $param);
+glLightModelfv_c($pname, (CPTR)params);
+glLightModelfv_p($pname, @params);
+glLightModelfv_s($pname, (PACKED)params);
+glLightModeli($pname, $param);
+glLightModeliv_c($pname, (CPTR)params);
+glLightModeliv_p($pname, @params);
+glLightModeliv_s($pname, (PACKED)params);
+glLightf($light, $pname, $param);
+glLightfv_c($light, $pname, (CPTR)params);
+glLightfv_p($light, $pname, @params);
+glLightfv_s($light, $pname, (PACKED)params);
+glLighti($light, $pname, $param);
+glLightiv_c($light, $pname, (CPTR)params);
+glLightiv_p($light, $pname, @params);
+glLightiv_s($light, $pname, (PACKED)params);
+glLineStipple($factor, $pattern);
+glLineWidth($width);
+glLinkProgramARB($programObj);
+glListBase($base);
+glLoadIdentity();
+glLoadMatrixd_c((CPTR)m);
+glLoadMatrixd_p(@m);
+glLoadMatrixd_s((PACKED)m);
+glLoadMatrixf_c((CPTR)m);
+glLoadMatrixf_p(@m);
+glLoadMatrixf_s((PACKED)m);
+glLoadName($name);
+glLogicOp($opcode);
+glMap1d_c($target, $u1, $u2, $stride, $order, (CPTR)points);
+glMap1d_p($target, $u1, $u2, @points);
+glMap1d_s($target, $u1, $u2, $stride, $order, (PACKED)points);
+glMap1f_c($target, $u1, $u2, $stride, $order, (CPTR)points);
+glMap1f_p($target, $u1, $u2, @points);
+glMap1f_s($target, $u1, $u2, $stride, $order, (PACKED)points);
+glMap2d_c($target, $u1, $u2, $ustride, $uorder, $v1, $v2, $vstride, $vorder, (CPTR)points);
+glMap2d_p($target, $u1, $u2, $uorder, $v1, $v2, @points);
+glMap2d_s($target, $u1, $u2, $ustride, $uorder, $v1, $v2, $vstride, $vorder, (PACKED)points);
+glMap2f_c($target, $u1, $u2, $ustride, $uorder, $v1, $v2, $vstride, $vorder, (CPTR)points);
+glMap2f_p($target, $u1, $u2, $uorder, $v1, $v2, @points);
+glMap2f_s($target, $u1, $u2, $ustride, $uorder, $v1, $v2, $vstride, $vorder, (PACKED)points);
+(CPTR)buffer = glMapBufferARB_c($target,$access);
+$oga = glMapBufferARB_p($target,$access,@types);
+(PACKED)buffer = glMapBufferARB_c($target,$access);
+glMapGrid1d($un, $u1, $u2);
+glMapGrid1f($un, $u1, $u2);
+glMapGrid2d($un, $u1, $u2, $vn, $v1, $v2);
+glMapGrid2f($un, $u1, $u2, $vn, $v1, $v2);
+glMaterialf($face, $pname, $param);
+glMaterialfv_c($face, $pname, (CPTR)param);
+glMaterialfv_s($face, $pname, @param);
+glMateriali($face, $pname, $param);
+glMaterialiv_c($face, $pname, (CPTR)param);
+glMaterialiv_s($face, $pname, @param);
+glMatrixMode($mode);
+glMultMatrixd_p(@m);
+glMultMatrixf_p(@m);
+glMultiTexCoord1dvARB_c($target,(CPTR)v);
+glMultiTexCoord1dvARB_p($target,$s);
+glMultiTexCoord1dvARB_s($target,(PACKED)v);
+glMultiTexCoord1fARB($target,$s);
+glMultiTexCoord1fvARB_c($target,(CPTR)v);
+glMultiTexCoord1fvARB_p($target,$s);
+glMultiTexCoord1fvARB_s($target,(PACKED)v);
+glMultiTexCoord1iARB($target,$s);
+glMultiTexCoord1ivARB_c($target,(CPTR)v);
+glMultiTexCoord1ivARB_p($target,$s);
+glMultiTexCoord1ivARB_s($target,(PACKED)v);
+glMultiTexCoord1sARB($target,$s);
+glMultiTexCoord1svARB_c($target,(CPTR)v);
+glMultiTexCoord1svARB_p($target,$s);
+glMultiTexCoord1svARB_s($target,(PACKED)v);
+glMultiTexCoord2dARB($target,$s,$t);
+glMultiTexCoord2dvARB_c(target,(CPTR)v);
+glMultiTexCoord2dvARB_p($target,$s,$t);
+glMultiTexCoord2dvARB_s(target,(PACKED)v);
+glMultiTexCoord2fARB($target,$s,$t);
+glMultiTexCoord2fvARB_c($target,(CPTR)v);
+glMultiTexCoord2fvARB_p($target,$s,$t);
+glMultiTexCoord2fvARB_s($target,(PACKED)v);
+glMultiTexCoord2iARB($target,$s,$t);
+glMultiTexCoord2ivARB_c($target,(CPTR)v);
+glMultiTexCoord2ivARB_p($target,$s,$t);
+glMultiTexCoord2ivARB_s($target,(PACKED)v);
+glMultiTexCoord2sARB($target,$s,$t);
+glMultiTexCoord2svARB_c($target,(CPTR)v);
+glMultiTexCoord2svARB_p($target,$s,$t);
+glMultiTexCoord2svARB_s($target,(PACKED)v);
+glMultiTexCoord3dARB($target,$s,$t,$r);
+glMultiTexCoord3dvARB_c(target,(CPTR)v);
+glMultiTexCoord3dvARB_p($target,$s,$t,$r);
+glMultiTexCoord3dvARB_s(target,(PACKED)v);
+glMultiTexCoord3fARB($target,$s,$t,$r);
+glMultiTexCoord3fvARB_c($target,(CPTR)v);
+glMultiTexCoord3fvARB_p($target,$s,$t,$r);
+glMultiTexCoord3fvARB_s($target,(PACKED)v);
+glMultiTexCoord3iARB($target,$s,$t,$r);
+glMultiTexCoord3ivARB_c($target,(CPTR)v);
+glMultiTexCoord3ivARB_p($target,$s,$t,$r);
+glMultiTexCoord3ivARB_s($target,(PACKED)v);
+glMultiTexCoord3sARB($target,$s,$t,$r);
+glMultiTexCoord3svARB_c($target,(CPTR)v);
+glMultiTexCoord3svARB_p($target,$s,$t,$r);
+glMultiTexCoord3svARB_s($target,(PACKED)v);
+glMultiTexCoord4dARB($target,$s,$t,$r,$q);
+glMultiTexCoord4dvARB_c($target,(CPTR)v);
+glMultiTexCoord4dvARB_p($target,$s,$t,$r,$q);
+glMultiTexCoord4dvARB_s($target,(PACKED)v);
+glMultiTexCoord4fARB($target,$s,$t,$r,$q);
+glMultiTexCoord4fvARB_c($target,(CPTR)v);
+glMultiTexCoord4fvARB_p($target,$s,$t,$r,$q);
+glMultiTexCoord4fvARB_s($target,(PACKED)v);
+glMultiTexCoord4ivARB_c($target,(CPTR)v);
+glMultiTexCoord4ivARB_p($target,$s,$t,$r,$q);
+glMultiTexCoord4ivARB_s($target,(PACKED)v);
+glMultiTexCoord4sARB($target,$s,$t,$r,$q);
+glMultiTexCoord4svARB_c($target,(CPTR)v);
+glMultiTexCoord4svARB_p($target,$s,$t,$r,$q);
+glMultiTexCoord4svARB_s($target,(PACKED)v);
+glNewList($list, $mode);
+glNormal3b($nx, $ny, $nz);
+glNormal3bv_c((CPTR)v);
+glNormal3bv_p($nx, $ny, $nz);
+glNormal3bv_s((PACKED)v);
+glNormal3d($nx, $ny, $nz);
+glNormal3dv_c((CPTR)v);
+glNormal3dv_p($nx, $ny, $nz);
+glNormal3dv_s((PACKED)v);
+glNormal3f($nx, $ny, $nz);
+glNormal3fv_c((CPTR)v);
+glNormal3fv_p($nx, $ny, $nz);
+glNormal3fv_s((PACKED)v);
+glNormal3i($nx, $ny, $nz);
+glNormal3iv_c((CPTR)v);
+glNormal3iv_p($nx, $ny, $nz);
+glNormal3iv_s((PACKED)v);
+glNormal3s($nx, $ny, $nz);
+glNormal3sv_c((CPTR)v);
+glNormal3sv_p($nx, $ny, $nz);
+glNormal3sv_s((PACKED)v);
+glNormalPointerEXT_c($type, $stride, $count, (CPTR)pointer);
+glNormalPointerEXT_p((OGA)pointer);
+glNormalPointerEXT_s($type, $stride, $count, (PACKED)pointer);
+glNormalPointer_c($type, $stride, (CPTR)pointer);
+glNormalPointer_s($type, $stride, (OGA)pointer);
+glOrtho($left, $right, $bottom, $top, $zNear, $zFar);
+glPassThrough($token);
+glPixelMapfv_c($map, $mapsize, (CPTR)values);
+glPixelMapfv_p($map, @values);
+glPixelMapfv_s($map, $mapsize, (PACKED)values);
+glPixelMapuiv_c($map, $mapsize, (CPTR)values);
+glPixelMapuiv_p($map, @values);
+glPixelMapuiv_s($map, $mapsize, (PACKED)values);
+glPixelMapusv_c($map, $mapsize, (CPTR)values);
+glPixelMapusv_p($map, @values);
+glPixelMapusv_s($map, $mapsize, (PACKED)values);
+glPixelStoref($pname, $param);
+glPixelStorei($pname, $param);
+glPixelTransferf($pname, $param);
+glPixelTransferi($pname, $param);
+glPixelZoom($xfactor, $yfactor);
+glPointParameterfARB($pname,$param);
+glPointParameterfvARB_c($pname,(CPTR)params);
+glPointParameterfvARB_p($pname,@params);
+glPointParameterfvARB_s($pname,(PACKED)params);
+glPointSize($size);
+glPolygonMode($face, $mode);
+glPolygonOffset($factor, $units);
+glPolygonStipple_c((CPTR)mask);
+glPolygonStipple_p(@mask);
+glPolygonStipple_s((PACKED)mask);
+glPopAttrib();
+glPopClientAttrib();
+glPopMatrix();
+glPopName();
+glPrioritizeTextures_c($n, (CPTR)textures, (CPTR)priorities);
+glPrioritizeTextures_p(@textureIDs, @priorities);
+glPrioritizeTextures_s($n, (PACKED)textures, (PACKED)priorities);
+glProgramEnvParameter4dARB($target,$index,$x,$y,$z,$w);
+glProgramEnvParameter4dvARB_c($target,$index,(CPTR)v);
+glProgramEnvParameter4dvARB_p($target,$index,$x,$y,$z,$w);
+glProgramEnvParameter4dvARB_s($target,$index,(PACKED)v);
+glProgramEnvParameter4fARB($target,$index,$x,$y,$z,$w);
+glProgramEnvParameter4fvARB_c($target,$index,(CPTR)v);
+glProgramEnvParameter4fvARB_p($target,$index,$x,$y,$z,$w);
+glProgramEnvParameter4fvARB_s($target,$index,(PACKED)v);
+glProgramLocalParameter4dARB($target,$index,$x,$y,$z,$w);
+glProgramLocalParameter4dvARB_c($target,$index,(CPTR)v);
+glProgramLocalParameter4dvARB_p($target,$index,$x,$y,$z,$w);
+glProgramLocalParameter4dvARB_s($target,$index,(PACKED)v);
+glProgramLocalParameter4fARB($target,$index,$x,$y,$z,$w);
+glProgramLocalParameter4fvARB_c($target,$index,(CPTR)v);
+glProgramLocalParameter4fvARB_p($target,$index,$x,$y,$z,$w);
+glProgramLocalParameter4fvARB_s($target,$index,(PACKED)v);
+glProgramStringARB_c($target,$format,$len,(CPTR)string);
+glProgramStringARB_p($target,$string);
+glProgramStringARB_s($target,$format,$len,(PACKED)string);
+glPushAttrib($mask);
+glPushClientAttrib($mask);
+glPushMatrix();
+glPushName($name);
+glRasterPos2d(x, y);
+glRasterPos2dv_c((CPTR)v);
+glRasterPos2dv_p($x, $y);
+glRasterPos2dv_s((PACKED)v);
+glRasterPos2f($x, $y);
+glRasterPos2fv_c((CPTR)v);
+glRasterPos2fv_p($x, $y);
+glRasterPos2fv_s((PACKED)v);
+glRasterPos2i($x, $y);
+glRasterPos2iv_c((CPTR)v);
+glRasterPos2iv_p($x, $y);
+glRasterPos2iv_s((PACKED)v);
+glRasterPos2s($x, $y);
+glRasterPos2sv_c((CPTR)v);
+glRasterPos2sv_p($x, $y);
+glRasterPos2sv_s((PACKED)v);
+glRasterPos3d($x, $y, $z);
+glRasterPos3dv_c((CPTR)v);
+glRasterPos3dv_p($x, $y, $z);
+glRasterPos3dv_s((PACKED)v);
+glRasterPos3f($x, $y, $z);
+glRasterPos3fv_c((CPTR)v);
+glRasterPos3fv_p($x, $y, $z);
+glRasterPos3fv_s((PACKED)v);
+glRasterPos3i($x, $y, $z);
+glRasterPos3iv_c((CPTR)v);
+glRasterPos3iv_p($x, $y, $z);
+glRasterPos3iv_s((PACKED)v);
+glRasterPos3s($x, $y, $z);
+glRasterPos3sv_c((CPTR)v);
+glRasterPos3sv_p($x, $y, $z);
+glRasterPos3sv_s((PACKED)v);
+glRasterPos4d($x, $y, $z, $w);
+glRasterPos4dv_c((CPTR)v);
+glRasterPos4dv_p($x, $y, $z, $w);
+glRasterPos4dv_s((PACKED)v);
+glRasterPos4f($x, $y, $z, $w);
+glRasterPos4fv_c((CPTR)v);
+glRasterPos4fv_p($x, $y, $z, $w);
+glRasterPos4fv_s((PACKED)v);
+glRasterPos4i($x, $y, $z, $w);
+glRasterPos4iv_c((CPTR)v);
+glRasterPos4iv_p($x, $y, $z, $w);
+glRasterPos4iv_s((PACKED)v);
+glRasterPos4s($x, $y, $z, $w);
+glRasterPos4sv_c((CPTR)v);
+glRasterPos4sv_p($x, $y, $z, $w);
+glRasterPos4sv_s((PACKED)v);
+glReadBuffer($mode);
+glReadPixels_c($x, $y, $width, $height, $format, $type, (CPTR)pixels);
+glReadPixels_s($x, $y, $width, $height, $format, $type, (PACKED)pixels);
+glRectd($x1, $y1, $x2, $y2);
+glRectdv_c((CPTR)v1, (CPTR)v2);
+glRectdv_s((PACKED)v1, (PACKED)v2);
+glRectf($x1, $y1, $x2, $y2);
+glRectfv_c((CPTR)v1, (CPTR)v2);
+glRectfv_s((PACKED)v1, (PACKED)v2);
+glRecti($x1, $y1, $x2, $y2);
+glRectiv_c((CPTR)v1, (CPTR)v2);
+glRectiv_s((PACKED)v1, (PACKED)v2);
+glRects($x1, $y1, $x2, $y2);
+glRectsv_c((CPTR)v1, (CPTR)v2);
+glRectsv_s((PACKED)v1, (PACKED)v2);
+glRenderMode($mode);
+glRenderbufferStorageEXT($target,$internalformat,$width,$height);
+glRotated($angle, $x, $y, $z);
+glRotatef($angle, $x, $y, $z);
+glSampleCoverageARB($value,$invert);
+glScaled($x, $y, $z);
+glScalef($x, $y, $z);
+glScissor($x, $y, $width, $height);
+glSelectBuffer_c($size, (CPTR)list);
+glShadeModel($mode);
+glShaderSourceARB_c($shaderObj, $count, (CPTR)string, (CPTR)length);
+glShaderSourceARB_p($shaderObj, @string);
+glStencilFunc($func, $ref, $mask);
+glStencilMask($mask);
+glStencilOp($fail, $zfail, $zpass);
+glTexCoord1d($s);
+glTexCoord1dv_c((PACKED)v);
+glTexCoord1dv_p($s);
+glTexCoord1f($s);
+glTexCoord1fv_c((CPTR)v);
+glTexCoord1fv_p($s);
+glTexCoord1fv_s((PACKED)v);
+glTexCoord1i($s);
+glTexCoord1iv_c((CPTR)v);
+glTexCoord1iv_p($s);
+glTexCoord1iv_s((PACKED)v);
+glTexCoord1s($s);
+glTexCoord1sv_p($s);
+glTexCoord2d($s, $t);
+glTexCoord2dv_c((CPTR)v);
+glTexCoord2dv_p($s, $t);
+glTexCoord2dv_s((PACKED)v);
+glTexCoord2f($s, $t);
+glTexCoord2fv_c((CPTR)v);
+glTexCoord2fv_p($s, $t);
+glTexCoord2fv_s((PACKED)v);
+glTexCoord2i($s, $t);
+glTexCoord2iv_c((CPTR)v);
+glTexCoord2iv_p($s, $t);
+glTexCoord2iv_s((PACKED)v);
+glTexCoord2s($s, $t);
+glTexCoord2sv_c((PACKED)v);
+glTexCoord2sv_p($s, $t);
+glTexCoord3d($s, $t, $r);
+glTexCoord3dv_c((CPTR)v);
+glTexCoord3dv_p($s, $t, $r);
+glTexCoord3dv_s((PACKED)v);
+glTexCoord3f($s, $t, $r);
+glTexCoord3fv_c((CPTR)v);
+glTexCoord3fv_p($s, $t, $r);
+glTexCoord3fv_s((PACKED)v);
+glTexCoord3i($s, $t, $r);
+glTexCoord3iv_c((CPTR)v);
+glTexCoord3iv_p($s, $t, $r);
+glTexCoord3iv_s((PACKED)v);
+glTexCoord3s($s, $t, $r);
+glTexCoord3sv_c((CPTR)v);
+glTexCoord3sv_p($s, $t, $r);
+glTexCoord3sv_s((PACKED)v);
+glTexCoord4d($s, $t, $r, $q);
+glTexCoord4dv_c((CPTR)v);
+glTexCoord4dv_p($s, $t, $r, $q);
+glTexCoord4dv_s((PACKED)v);
+glTexCoord4f($s, $t, $r, $q);
+glTexCoord4fv_c((CPTR)v);
+glTexCoord4fv_p($s, $t, $r, $q);
+glTexCoord4fv_s((PACKED)v);
+glTexCoord4i($s, $t, $r, $q);
+glTexCoord4iv_c((CPTR)v);
+glTexCoord4iv_p($s, $t, $r, $q);
+glTexCoord4iv_s((PACKED)v);
+glTexCoord4s($s, $t, $r, $q);
+glTexCoord4sv_c((CPTR)v);
+glTexCoord4sv_p($s, $t, $r, $q);
+glTexCoord4sv_s((PACKED)v);
+glTexCoordPointerEXT_c($size, $type, $stride, $count, (CPTR)pointer);
+glTexCoordPointerEXT_p($size, (OGA)pointer);
+glTexCoordPointerEXT_s($size, $type, $stride, $count, (PACKED)pointer);
+glTexCoordPointer_c($size, $type, $stride, (CPTR)pointer);
+glTexCoordPointer_p($size, (OGA)pointer);
+glTexCoordPointer_s($size, $type, $stride, (PACKED)pointer);
+glTexEnvf($target, $pname, $param);
+glTexEnvfv_p(target, pname, @params);
+glTexEnvfv_s(target, pname, (PACKED)params);
+glTexEnvi($target, $pname, $param);
+glTexEnviv_p(target, pname, @params);
+glTexEnviv_s(target, pname, (PACKED)params);
+glTexGend($Coord, $pname, $param);
+glTexGendv_c($Coord, $pname, (CPTR)params);
+glTexGendv_p($Coord, $pname, @params);
+glTexGendv_s($Coord, $pname, (PACKED)params);
+glTexGenf($Coord, $pname, $param);
+glTexGenfv_c($Coord, $pname, (CPTR)params);
+glTexGenfv_p($Coord, $pname, @params);
+glTexGenfv_s($Coord, $pname, (PACKED)params);
+glTexGeni($Coord, $pname, $param);
+glTexGeniv_c($Coord, $pname, (CPTR)params);
+glTexGeniv_p($Coord, $pname, @params);
+glTexGeniv_s($Coord, $pname, (PACKED)params);
+glTexImage1D_c($target, $level, $internalformat, $width, $border, $format, $type, (CPTR)pixels);
+glTexImage1D_p($target, $level, $internalformat, $width, $border, $format, $type, @pixels);
+glTexImage1D_s($target, $level, $internalformat, $width, $border, $format, $type, (PACKED)pixels);
+glTexImage2D_c($target, $level, $internalformat, $width, $height, $border, $format, $type, (CPTR)pixels);
+glTexImage2D_p($target, $level, $internalformat, $width, $height, $border, $format, $type, @pixels);
+glTexImage2D_s($target, $level, $internalformat, $width, $height, $border, $format, $type, (PACKED)pixels);
+glTexImage3DEXT_c($target, $level, $internalformat, $width, $height, $depth, $border, $format, $type, (CPTR)pixels);
+glTexImage3DEXT_p($target, $level, $internalformat, $width, $height, $depth, $border, $format, $type, @pixels);
+glTexImage3DEXT_s($target, $level, $internalformat, $width, $height, $depth, $border, $format, $type, (PACKED)pixels);
+glTexImage3D_c($target, $level, $internalformat, $width, $height, $depth, $border, $format, $type, (CPTR)pixels);
+glTexImage3D_p($target, $level, $internalformat, $width, $height, $depth, $border, $format, $type, @pixels);
+glTexImage3D_s($target, $level, $internalformat, $width, $height, $depth, $border, $format, $type, (PACKED)pixels);
+glTexParameterf($target, $pname, $param);
+glTexParameterfv_c($target, $pname, (CPTR)params);
+glTexParameterfv_p($target, $pname, @params);
+glTexParameterfv_s($target, $pname, (PACKED)params);
+glTexParameteri($target, $pname, $param);
+glTexParameteriv_c($target, $pname, (CPTR)params);
+glTexParameteriv_p($target, $pname, @params);
+glTexParameteriv_s($target, $pname, (PACKED)params);
+glTexSubImage1D_c($target, $level, $xoffset, $width, $border, $format, $type, (CPTR)pixels);
+glTexSubImage1D_p($target, $level, $xoffset, $width, $border, $format, $type, @pixels);
+glTexSubImage1D_s($target, $level, $xoffset, $width, $border, $format, $type, (PACKED)pixels);
+glTexSubImage2D_c($target, $level, $xoffset, $yoffset, $width, $height, $border, $format, $type, @pixels);
+glTexSubImage2D_s($target, $level, $xoffset, $yoffset, $width, $height, $border, $format, $type, (PACKED)pixels);
+glTexSubImage3DEXT_c($target, $level, $xoffset, $yoffset, $zoffset, $width, $height, $depth, $format, $type, (CPTR)pixels);
+glTexSubImage3DEXT_p($target, $level, $xoffset, $yoffset, $zoffset, $width, $height, $depth, $format, $type, @pixels);
+glTexSubImage3DEXT_s($target, $level, $xoffset, $yoffset, $zoffset, $width, $height, $depth, $format, $type, (PACKED)pixels);
+glTexSubImage3D_c($target, $level, $xoffset, $yoffset, $zoffset, $width, $height, $depth, $border, $format, $type, (CPTR)pixels);
+glTexSubImage3D_p($target, $level, $xoffset, $yoffset, $zoffset, $width, $height, $depth, $border, $format, $type, @pixels);
+glTexSubImage3D_s($target, $level, $xoffset, $yoffset, $zoffset, $width, $height, $depth, $border, $format, $type, (PACKED)pixels);
+glTranslated($x, $y, $z);
+glTranslatef($x, $y, $z);
+glUniform1fARB($location, $v0);
+glUniform1fvARB_c($location, $count, (CPTR)value);
+glUniform1fvARB_p(location, @value);
+glUniform1fvARB_s($location, $count, (PACKED)value);
+glUniform1iARB($location, $v0);
+glUniform1ivARB_c($location, $count, (CPTR)value);
+glUniform1ivARB_p($location, @value);
+glUniform1ivARB_s($location, $count, (PACKED)value);
+glUniform2fARB($location, $v0, $v1);
+glUniform2fvARB_c($location, $count, (CPTR)value);
+glUniform2fvARB_p($location, @value);
+glUniform2fvARB_s($location, $count, (PACKED)value);
+glUniform2iARB($location, $v0, $v1);
+glUniform2ivARB_c($location, $count, (CPTR)value);
+glUniform2ivARB_p($location, @value);
+glUniform2ivARB_s($location, $count, (PACKED)value);
+glUniform3fARB($location, $v0, $v1, $v2);
+glUniform3fvARB_c($location, $count, (CPTR)value);
+glUniform3fvARB_p($location, @value);
+glUniform3fvARB_s($location, $count, (PACKED)value);
+glUniform3iARB($location, $v0, $v1, $v2);
+glUniform3ivARB_c($location, $count, (CPTR)value);
+glUniform3ivARB_p($location, @value);
+glUniform3ivARB_s($location, $count, (PACKED)value);
+glUniform4fARB($location, $v0, $v1, $v2, $v3);
+glUniform4fvARB_c($location, $count, (CPTR)value);
+glUniform4fvARB_p($location, @value);
+glUniform4fvARB_s($location, $count, (PACKED)value);
+glUniform4iARB($location, $v0, $v1, $v2, $v3);
+glUniform4ivARB_c($location, $count, (CPTR)value);
+glUniform4ivARB_p($location, @value);
+glUniform4ivARB_s($location, $count, (PACKED)value);
+glUniformMatrix2fvARB_c($location, $count, $transpose, (CPTR)value);
+glUniformMatrix2fvARB_p($location, $transpose, @matrix);
+glUniformMatrix2fvARB_s($location, $count, $transpose, (PACKED)value);
+glUniformMatrix3fvARB_c($location, $count, $transpose, (CPTR)value);
+glUniformMatrix3fvARB_p($location, $transpose, @matrix);
+glUniformMatrix3fvARB_s($location, $count, $transpose, (PACKED)value);
+glUniformMatrix4fvARB_c($location, $count, $transpose, (CPTR)value);
+glUniformMatrix4fvARB_p($location, $transpose, @matrix);
+glUniformMatrix4fvARB_s($location, $count, $transpose, (PACKED)value);
+glUnmapBufferARB($target);
+glUseProgramObjectARB($programObj);
+glValidateProgramARB($programObj);
+glVertex2d($x, $y);
+glVertex2dv_c((CPTR)v);
+glVertex2dv_p($x, $y);
+glVertex2dv_s((PACKED)v);
+glVertex2f($x, $y);
+glVertex2f_s((CPTR)v);
+glVertex2fv_p($x, $y);
+glVertex2i($x, $y);
+glVertex2iv_c((CPTR)v);
+glVertex2iv_p($x, $y);
+glVertex2iv_s((PACKED)v);
+glVertex2s($x, $y);
+glVertex2sv_c((PACKED)v);
+glVertex2sv_p($x, $y);
+glVertex3d($x, $y, $z);
+glVertex3dv_c((CPTR)v);
+glVertex3dv_p($x, $y, $z);
+glVertex3dv_s((PACKED)v);
+glVertex3f($x, $y, $z);
+glVertex3fv_c((CPTR)v);
+glVertex3fv_p($x, $y, $z);
+glVertex3fv_s((PACKED)v);
+glVertex3i(x, y, z);
+glVertex3iv_c((CPTR)v);
+glVertex3iv_p($x, $y, $z);
+glVertex3iv_s((PACKED)v);
+glVertex3s($x, $y, $z);
+glVertex3sv_c((CPTR)v);
+glVertex3sv_p($x, $y, $z);
+glVertex3sv_s((PACKED)v);
+glVertex4d($x, $y, $z, $w);
+glVertex4dv_c((CPTR)v);
+glVertex4dv_p($x, $y, $z, $w);
+glVertex4dv_s((PACKED)v);
+glVertex4f($x, $y, $z, $w);
+glVertex4fv_c((CPTR)v);
+glVertex4fv_p($x, $y, $z, $w);
+glVertex4fv_s((PACKED)v);
+glVertex4i($x, $y, $z, $w);
+glVertex4iv_c((CPTR)v);
+glVertex4iv_p($x, $y, $z, $w);
+glVertex4iv_s((PACKED)v);
+glVertex4s($x, $y, $z, $w);
+glVertex4sv_c((CPTR)v);
+glVertex4sv_p($x, $y, $z, $w);
+glVertex4sv_s((PACKED)v);
+glVertexAttrib1dARB($index,$x);
+glVertexAttrib1dvARB_c($index,(CPTR)v);
+glVertexAttrib1dvARB_p($index,$x);
+glVertexAttrib1dvARB_s($index,(PACKED)v);
+glVertexAttrib1fARB($index,$x);
+glVertexAttrib1sARB($index,$x);
+glVertexAttrib1svARB_c($index,(CPTR)v);
+glVertexAttrib1svARB_p($index,$x);
+glVertexAttrib1svARB_s($index,(PACKED)v);
+glVertexAttrib2dARB($index,$x,$y);
+glVertexAttrib2dvARB_c($index,(CPTR)v);
+glVertexAttrib2dvARB_p($index,$x,$y);
+glVertexAttrib2dvARB_s($index,(PACKED)v);
+glVertexAttrib2fARB($index,$x,$y);
+glVertexAttrib2sARB($index,$x,$y);
+glVertexAttrib2svARB_c($index,(CPTR)v);
+glVertexAttrib2svARB_p($index,$x,$y);
+glVertexAttrib2svARB_s($index,(PACKED)v);
+glVertexAttrib3dARB($index,$x,$y,$z);
+glVertexAttrib3dvARB_c($index,(CPTR)v);
+glVertexAttrib3dvARB_p($index,$x,$y,$z);
+glVertexAttrib3dvARB_s($index,(PACKED)v);
+glVertexAttrib3fARB($index,$x,$y,$z);
+glVertexAttrib3fvARB_c($index,(CPTR)v);
+glVertexAttrib3fvARB_p($index,$x,$y,$z);
+glVertexAttrib3fvARB_s($index,(PACKED)v);
+glVertexAttrib3sARB($index,$x,$y,$z);
+glVertexAttrib3svARB_c($index,(CPTR)v);
+glVertexAttrib3svARB_p($index,$x,$y,$z);
+glVertexAttrib3svARB_s($index,(PACKED)v);
+glVertexAttrib4NbvARB_c($index,(CPTR)v);
+glVertexAttrib4NbvARB_p($index,$x,$y,$z,$w);
+glVertexAttrib4NbvARB_s($index,(PACKED)v);
+glVertexAttrib4NivARB_c($index,(CPTR)v);
+glVertexAttrib4NivARB_p($index,$x,$y,$z,$w);
+glVertexAttrib4NivARB_s($index,(PACKED)v);
+glVertexAttrib4NsvARB_c($index,(CPTR)v);
+glVertexAttrib4NsvARB_p($index,$x,$y,$z,$w);
+glVertexAttrib4NsvARB_s($index,(PACKED)v);
+glVertexAttrib4NubARB($index,$x,$y,$z,$w);
+glVertexAttrib4NubvARB_c($index,(CPTR)v);
+glVertexAttrib4NubvARB_p($index,$x,$y,$z,$w);
+glVertexAttrib4NubvARB_s($index,(PACKED)v);
+glVertexAttrib4NuivARB_c($index,(CPTR)v);
+glVertexAttrib4NuivARB_p($index,$x,$y,$z,$w);
+glVertexAttrib4NuivARB_s($index,(PACKED)v);
+glVertexAttrib4NusvARB_c($index,(CPTR)v);
+glVertexAttrib4NusvARB_p($index,$x,$y,$z,$w);
+glVertexAttrib4NusvARB_s($index,(PACKED)v);
+glVertexAttrib4bvARB_c($index,(CPTR)v);
+glVertexAttrib4bvARB_p($index,$x,$y,$z,$w);
+glVertexAttrib4bvARB_s($index,(PACKED)v);
+glVertexAttrib4dARB($index,$x,$y,$z,$w);
+glVertexAttrib4dvARB_c($index,(CPTR)v);
+glVertexAttrib4dvARB_p($index,$x,$y,$z,$w);
+glVertexAttrib4dvARB_s($index,(PACKED)v);
+glVertexAttrib4fARB($index,$x,$y,$z,$w);
+glVertexAttrib4fvARB_c($index,(CPTR)v);
+glVertexAttrib4fvARB_p($index,$x,$y,$z,$w);
+glVertexAttrib4fvARB_s($index,(PACKED)v);
+glVertexAttrib4ivARB_c($index,(CPTR)v);
+glVertexAttrib4ivARB_p($index,$x,$y,$z,$w);
+glVertexAttrib4ivARB_s($index,(PACKED)v);
+glVertexAttrib4sARB($index,$x,$y,$z,$w);
+glVertexAttrib4svARB_c($index,(CPTR)v);
+glVertexAttrib4svARB_p($index,$x,$y,$z,$w);
+glVertexAttrib4svARB_s($index,(PACKED)v);
+glVertexAttrib4ubvARB_c($index,(CPTR)v);
+glVertexAttrib4ubvARB_p($index,$x,$y,$z,$w);
+glVertexAttrib4ubvARB_s($index,(PACKED)v);
+glVertexAttrib4uivARB_c($index,(CPTR)v);
+glVertexAttrib4uivARB_p($index,$x,$y,$z,$w);
+glVertexAttrib4uivARB_s($index,(PACKED)v);
+glVertexAttrib4usvARB_c($index,(PACKED)v);
+glVertexAttrib4usvARB_p($index,$x,$y,$z,$w);
+glVertexAttribPointerARB_c($index,$size,$type,$normalized,$stride,(CPTR)pointer);
+glVertexAttribPointerARB_p($index,$type,$normalized,$stride,@attribs);
+glVertexPointerEXT_c($size, $type, $stride, $count, (CPTR)pointer);
+glVertexPointerEXT_p($size, (OGA)pointer);
+glVertexPointerEXT_s($size, $type, $stride, $count, (PACKED)pointer);
+glVertexPointer_c($size, $type, $stride, (CPTR)pointer);
+glVertexPointer_p($size, $type, $stride, (OGA)pointer);
+glVertexPointer_s($size, $type, $stride, (PACKED)pointer);
+glViewport($x, $y, $width, $height);
@@ -1,4 +1,4 @@
-/*  Last saved: Fri 16 Oct 2009 10:25:51 AM */
+/*  Last saved: Tue 20 Sep 2011 09:59:29 AM */
 
 /*  Copyright (c) 1998 Kenneth Albanowski. All rights reserved.
  *  Copyright (c) 2007 Bob Free. All rights reserved.
@@ -51,7 +51,6 @@ neoconstant(char * name, int arg)
 #include "glu_const.h"
 #include "glut_const.h"
 #include "glx_const.h"
-#include "glpm_const.h"
 	;
 	return 0;
 }
@@ -1,4 +1,4 @@
-/*  Last saved: Sun 06 Sep 2009 02:10:02 PM */
+/*  Last saved: Fri 26 Aug 2011 10:48:16 AM */
 
 /*  Copyright (c) 1998 Kenneth Albanowski. All rights reserved.
  *  Copyright (c) 2007 Bob Free. All rights reserved.
@@ -1469,7 +1469,10 @@ glVertexPointer_s(size, type, stride, pointer)
 	CODE:
 	{
 		int width = stride ? stride : (sizeof(type)*size);
-		void * pointer_s = EL(pointer, width);
+		void * pointer_s = NULL;
+		if ( pointer ) {
+			pointer_s = EL(pointer, width);
+		} 
 		glVertexPointer(size, type, stride, pointer_s);
 	}
 
@@ -58,17 +58,6 @@ static Bool WaitForNotify(Display *d, XEvent *e, char *arg) {
 #endif	/* defined HAVE_GLX */ 
 
 
-#ifdef __PM__
-
-#  define HAVE_GLpc			/* Perl interface */
-#  define auxXWindow()	(croak("Not implemented: auxXWindow"),0)
-
-HMQ hmq;
-AV *EventAv;
-unsigned long LastEventMask;	/* !! Common for all the windows */
-Display myDisplay;
-
-#endif	/* defined __PM__ */ 
 
 static int debug = 0;
 
@@ -394,18 +383,11 @@ _have_glp()
 
 # /* The following material is directly copied from Stan Melax's original OpenGL-0.4 */
 
-#ifdef __PM__
-
-#// morphPM();
-void
-morphPM()
-
-#endif
 
 int
 __had_dbuffer_hack()
 
-#ifdef HAVE_GLpc			/* GLX or __PM__ */
+#ifdef HAVE_GLpc			/* GLX */
 
 #// $ID = glpcOpenWindow($x,$y,$w,$h,$pw,$steal,$event_mask,@attribs);
 HV *
@@ -155,6 +155,7 @@ begin_tess_marshaller(vertex, vertex, (void * gl_polygon_data), "Missing tess ca
                       if (t->do_normals) glNormal3f(vd[j], vd[j+1], vd[j+2]);           \
                       glVertex3f(vd[0], vd[1], vd[2]);                                  \
                       )
+{
     GLdouble * vd = (GLdouble*) t->vertex_data;
     for (i = 0; i < 3; i++)
       XPUSHs(sv_2mortal(newSVnv(vd[i])));
@@ -167,6 +168,7 @@ begin_tess_marshaller(vertex, vertex, (void * gl_polygon_data), "Missing tess ca
       for (i = 0; i < 3; i++)
         XPUSHs(sv_2mortal(newSVnv(vd[j++])));
     if (t->polygon_data) XPUSHs((SV*)t->polygon_data);
+}
 end_tess_marshaller()
 
 /* Declare gluTess VERTEX_DATA */
@@ -180,6 +182,7 @@ begin_tess_marshaller(vertex_data, vertex, (void * vertex_data, void * gl_polygo
                       glVertex3f(vd[0], vd[1], vd[2]);                                  \
                      )
     if (! vertex_data) croak("Missing vertex data in tess vertex_data callback");
+{
     GLdouble * vd = (GLdouble*) vertex_data;
     for (i = 0; i < 3; i++)
       XPUSHs(sv_2mortal(newSVnv(vd[i])));
@@ -192,6 +195,7 @@ begin_tess_marshaller(vertex_data, vertex, (void * vertex_data, void * gl_polygo
       for (i = 0; i < 3; i++)
         XPUSHs(sv_2mortal(newSVnv(vd[j++])));
     if (t->polygon_data) XPUSHs((SV*)t->polygon_data);
+}
 end_tess_marshaller()
 
 /* Declare gluTess ERROR */
@@ -228,7 +232,7 @@ void CALLBACK _s_marshal_glu_t_callback_combine (GLdouble coords[3], void * vert
         if (vertex == NULL) croak("Couldn't allocate combination vertex during tesselation");
         vds = t->vertex_datas;
         if (!vds) croak("Missing vertex data storage");
-	av_push(vds, newSViv((int)vertex));
+	av_push(vds, newSViv(PTR2IV(vertex)));
 
 	handler = t->combine_callback;
         if (!handler) croak("Missing tess callback for combine_data");
@@ -246,7 +250,7 @@ void CALLBACK _s_marshal_glu_t_callback_combine (GLdouble coords[3], void * vert
             opaque->do_colors        = t->do_colors;
             opaque->do_normals       = t->do_normals;
             if (! t->tess_datas) t->tess_datas = newAV();
-            av_push(t->tess_datas, newSViv((int)opaque));
+            av_push(t->tess_datas, newSViv(PTR2IV(opaque)));
             *out_data = opaque;
             for (i = 0; i < 4; i++) {
                 PGLUtess* ot = (PGLUtess*)vertex_data[i];
@@ -1051,7 +1055,7 @@ gluTessVertex_p(tess, x, y, z, ...)
 		data[0] = x;
 		data[1] = y;
 		data[2] = z;
-                av_push(vds, newSViv((int)data)); /* store for freeing later */
+                av_push(vds, newSViv(PTR2IV(data))); /* store for freeing later */
                 if (tess->do_colors) {
                     int J = j + 4;
                     if (tess->do_normals) {
@@ -1084,7 +1088,7 @@ gluTessVertex_p(tess, x, y, z, ...)
                     opaque->do_colors        = tess->do_colors;
                     opaque->do_normals       = tess->do_normals;
                     if (! tess->tess_datas) tess->tess_datas = newAV();
-                    av_push(tess->tess_datas, newSViv((int)opaque));
+                    av_push(tess->tess_datas, newSViv(PTR2IV(opaque)));
                     gluTessVertex(tess->triangulator, data, (void*)opaque);
 		} else {
                     gluTessVertex(tess->triangulator, data, data);
@@ -1,4 +1,4 @@
-/*  Last saved: Fri 16 Oct 2009 10:11:21 AM */
+/*  Last saved: Tue 02 Apr 2013 02:45:10 PM */
 
 /*  Copyright (c) 1998 Kenneth Albanowski. All rights reserved.
  *  Copyright (c) 2007 Bob Free. All rights reserved.
@@ -7,58 +7,30 @@
  *  modify it under the same terms as Perl itself.
  */
 
-/* OpenGL *GLUT bindings */
-#define IN_POGL_GLUT_XS
-
 #include <stdio.h>
 
 #include "pgopogl.h"
 
 
-#ifdef HAVE_GL
-#include "gl_util.h"
-#endif
+/* glut_util.h is where you include the appropriate GLUT header
+ * file based on what is available.  It also defines some constants
+ * that may not be defined everywhere.  Replace this by user
+ * specified include information for the include and compile-time
+ * perl constants rather than some special cases
+ */
+#include "glut_util.h"
 
-#ifdef HAVE_GLX
-#include "glx_util.h"
-#endif
 
-#ifdef HAVE_GLU
-#include "glu_util.h"
-#endif
-
-#ifdef IN_POGL_GLUT_XS
-#if defined(HAVE_GLUT) || defined(HAVE_FREEGLUT)
+/* TODO: calculate this from the actual GLUT include file */
 #ifndef GLUT_API_VERSION
 #define GLUT_API_VERSION 4
 #endif
-#include "glut_util.h"
-#endif
 
 static int _done_glutInit = 0;
-#endif /* End IN_POGL_GLUT_XS */
-
-
+static int _done_glutCloseFunc_warn = 0;
 
-/* This does not seem to be used */
-#if 0
-static char *SWIZZLE[4] = {"x","y","z","w"}; */
-#endif 
 
-/* This does not seem to be used */
-#if 0
-static int
-not_here(s)
-char *s;
-{
-    croak("%s not implemented on this architecture", s);
-    return -1;
-}
-#endif
-
-
-#ifdef IN_POGL_GLUT_XS
-#ifndef __PM__
+/* Macros for GLUT callback and handler declarations */
 #  define DO_perl_call_sv(handler, flag) perl_call_sv(handler, flag)
 #  define ENSURE_callback_thread
 #  define GLUT_PUSH_NEW_SV(sv)		XPUSHs(sv_2mortal(newSVsv(sv)))
@@ -66,184 +38,9 @@ char *s;
 #  define GLUT_PUSH_NEW_U8(c)		XPUSHs(sv_2mortal(newSViv((int)c)))
 #  define GLUT_EXTEND_STACK(sp,n)
 #  define GLUT_PUSHMARK(sp)		PUSHMARK(sp)
-#else
-/* GLUT on OS/2 PM runs callbacks from a secondary thread.  This thread
-   is not instrumented to run EMX CRTL functions.  Basically, no Perl
-   function may be run from this thread.
-   We create a ternary thread via CRTL _beginthread() call, and communicate
-   the requests to this thread via inter-thread communication (ITC).  */
-
-#  define GLUT_PUSHMARK(sp)
-
-#  include "sys/builtin.h"
-#  include "sys/fmutex.h"
-
-#  include "os2pm_X.h"
-
-#  define DO_perl_call_sv(handler, flag) 				\
-    STMT_START {   	PUSHs(handler);					\
-			PUTBACK;					\
-			extend_by = 0;					\
-			RUN_perl_call_sv();				\
-    } STMT_END
-
-#  define GLUT_START_PUSHING		7
-#  define GLUT_PUSHING_IVP		17
-#  define GLUT_PUSHING_U8		27
-#  define GLUT_PUSHING_SV		37
-
-#  define GLUT_EXTEND_STACK(p,n)					\
-    STMT_START {   if (PL_stack_max - p < 2*(n)+4) {			\
-		     extend_by = 2*(n)+4;				\
-		     RUN_perl_call_sv();				\
-		   }							\
-		   SPAGAIN;						\
-		   PUSHs((SV*)GLUT_START_PUSHING);			\
-    } STMT_END
-
-#  define GLUT_PUSH_NEW_SV(sv)	(PUSHs(sv), PUSHs((SV*)GLUT_PUSHING_SV))
-#  define GLUT_PUSH_NEW_IV(i)	(PUSHs((SV*)&i), PUSHs((SV*)GLUT_PUSHING_IVP))
-#  define GLUT_PUSH_NEW_U8(c)	(PUSHs((SV*)(int)c), PUSHs((SV*)GLUT_PUSHING_U8))
-
-_fmutex run_mutex, result_mutex;
-static int worker_started;
-static int extend_by;
-
-void
-RUN_perl_call_sv(void)
-{
-    char *s = NULL;
-    
-    if (_fmutex_release(&run_mutex))
-	s = "Error unlocking the callback thread";
-    /* result_mutex is requested on entry!  Block until looper finishes. */
-    else if (_fmutex_request(&result_mutex, _FMR_IGNINT))
-	s = "Error requesting the callback thread";
-    if (s)
-	write(2, s, strlen(s));
-    return;
-}
-
-/* Main event handler for callbacks */
-void
-callback_thread_looper(void *dummy)
-{
-    while (1) {
-	/* It is requested already!  Wait until somebody requests a run */
-	if (_fmutex_request(&run_mutex, _FMR_IGNINT)) {
-	    warn("Error unlocking in the callback thread");
-	    worker_started = 0;
-	    return;
-	}
-	if (extend_by) {  /* Need to extend the stack */
-	    dSP;
-
-	    EXTEND(sp, extend_by);
-	} else {
-	    dSP;
-	    SV* handler = POPs;
-	    STRLEN n_a;
-	    SV **last = sp, **f;
-
-	    /* The rest is put on stack in a "raw" pointer form */
-	    while (1) {
-		switch ((IV)*sp) {
-		case GLUT_START_PUSHING:
-		    goto start_found;
-		    break;
-		case GLUT_PUSHING_IVP:
-		case GLUT_PUSHING_SV:
-		case GLUT_PUSHING_U8:
-		    break;
-		default:
-		    croak("Panic: broken descriptor/down when ITC for Glut: %#lx", (unsigned long)*sp);
-		    break;
-		}
-		sp -= 2;
-	    }
-	  start_found:
-	    f = sp + 1;
-	    sp--;
-	    PUSHMARK(sp);
-	    while (f < last) {
-		switch ((IV)f[1]) {
-		case GLUT_PUSHING_IVP:
-		    PUSHs(sv_2mortal(newSViv(*(IV*)*f)));
-		    break;
-		case GLUT_PUSHING_U8:
-		    PUSHs(sv_2mortal(newSViv((IV)*f)));
-		    break;
-		case GLUT_PUSHING_SV:
-		    PUSHs(sv_2mortal(newSVsv(*f)));
-		    break;
-		default:
-		    croak("Panic: broken descriptor/up when ITC for Glut: %#lx", (unsigned long)f[1]);
-		    break;
-		}
-		f += 2;
-	    }
-	    PUTBACK;
-	    perl_call_sv(handler, G_DISCARD|G_EVAL);
-	    if (SvTRUE(ERRSV))
-		fprintf(stderr, "Error in a GLUT Callback: %s", SvPV(ERRSV, n_a));
-	}
-	if (_fmutex_release(&result_mutex)) {
-	    warn("Error in a callback thread");
-	    worker_started = 0;
-	    return;
-	}	
-    }
-}
-
-#  define ENSURE_callback_thread					\
-	if (!worker_started)						\
-	    start_callback_thread()
-
-/* Spin a thread for a callback */
-void
-start_callback_thread()
-{
-    unsigned long rc;
-
-    if (worker_started)
-	return;
-    if (  CheckOSError(_fmutex_create(&run_mutex, 0))
-	  || CheckOSError(_fmutex_create(&result_mutex, 0))
-	  || CheckOSError(_fmutex_request(&run_mutex, _FMR_IGNINT))
-	  || CheckOSError(_fmutex_request(&result_mutex, _FMR_IGNINT)))
-	croak("Error creating semaphores");
-    worker_started = _beginthread(&callback_thread_looper, NULL,
-				   8*1024*1024, NULL);
-    if (worker_started == -1) {
-	worker_started = 0;
-	croak("Error creating callback thread");
-    }
-}
-#endif	/* __PM__ */
-#endif /* End IN_POGL_GLUT_XS */
-
 
 
-/*
-#define PackCallbackST(av,first)					\
-	if (SvROK(ST(first)) && (SvTYPE(SvRV(ST(first))) == SVt_PVAV)){	\
-		int i;							\
-		AV * x = (AV*)SvRV(ST(first));				\
-		for(i=0;i<=av_len(x);i++) {				\
-			av_push(av, newSVsv(*av_fetch(x, i, 0)));	\
-		}							\
-	} else {							\
-		int i;							\
-		for(i=first;i<items;i++)				\
-			av_push(av, newSVsv(ST(i)));			\
-	}
-
-*/
-
-#ifdef IN_POGL_GLUT_XS
-
-#ifdef GLUT_API_VERSION
-
+/* Set up for all the GLUT callback handlers */
 static AV * glut_handlers = 0;
 
 /* Attach a handler to a window */
@@ -693,97 +490,12 @@ static void generic_glut_menu_handler(int value)
 	PUTBACK;
 	DO_perl_call_sv(handler, G_DISCARD);
 }
-
-
-#endif /* def GLUT_API_VERSION */
-
-#endif /* End IN_POGL_GLUT_XS */
-
-
-#if 0
-typedef void * ptr;
-#endif  /* Does not seem to be used.  Uncomment if breaks. chm 29-May-2009 */
-
-
-#if 0
-/* Get a Perl parameter, cast to C type */
-#define SvItems(type,offset,count,dst)					\
-{									\
-	GLuint i;							\
-	switch (type)							\
-	{								\
-		case GL_UNSIGNED_BYTE:					\
-		case GL_BITMAP:						\
-			for (i=0;i<(count);i++)				\
-			{						\
-			  ((GLubyte*)(dst))[i] = (GLubyte)SvIV(ST(i+(offset)));	\
-			}						\
-			break;						\
-		case GL_BYTE:						\
-			for (i=0;i<(count);i++)				\
-			{						\
-			  ((GLbyte*)(dst))[i] = (GLbyte)SvIV(ST(i+(offset)));	\
-			}						\
-			break;						\
-		case GL_UNSIGNED_SHORT:					\
-			for (i=0;i<(count);i++)				\
-			{						\
-			  ((GLushort*)(dst))[i] = (GLushort)SvIV(ST(i+(offset)));	\
-			}						\
-			break;						\
-		case GL_SHORT:						\
-			for (i=0;i<(count);i++)				\
-			{						\
-			  ((GLshort*)(dst))[i] = (GLshort)SvIV(ST(i+(offset)));	\
-			}						\
-			break;						\
-		case GL_UNSIGNED_INT:					\
-			for (i=0;i<(count);i++)				\
-			{						\
-			  ((GLuint*)(dst))[i] = (GLuint)SvIV(ST(i+(offset)));	\
-			}						\
-			break;						\
-		case GL_INT:						\
-			for (i=0;i<(count);i++)				\
-			{						\
-			  ((GLint*)(dst))[i] = (GLint)SvIV(ST(i+(offset)));	\
-			}						\
-			break;						\
-		case GL_FLOAT:						\
-			for (i=0;i<(count);i++)				\
-			{						\
-			  ((GLfloat*)(dst))[i] = (GLfloat)SvNV(ST(i+(offset)));	\
-			}						\
-			break;						\
-		case GL_DOUBLE:						\
-			for (i=0;i<(count);i++)				\
-			{						\
-			  ((GLdouble*)(dst))[i] = (GLdouble)SvNV(ST(i+(offset)));	\
-			}						\
-			break;						\
-		default:						\
-			croak("unknown type");				\
-	}								\
-}
-#endif /* Moved SvItems to gl_util.h */
-
-
-
-
-
-
-
-
+/* End of set up for GLUT callback stuff */
 
 
 
 MODULE = OpenGL::GLUT		PACKAGE = OpenGL
 
-
-
-
-#ifdef IN_POGL_GLUT_XS
-
 #// Test for done with glutInit
 int
 done_glutInit()
@@ -792,17 +504,6 @@ done_glutInit()
 	OUTPUT:
 	RETVAL
 
-#endif /* End IN_POGL_GLUT_XS */
-
-
-##################### GLU #########################
-
-
-############################## GLUT #########################
-
-#ifdef IN_POGL_GLUT_XS
-
-#ifdef GLUT_API_VERSION
 
 # GLUT
 
@@ -1199,11 +900,6 @@ glutVisibilityFunc(handler=0, ...)
 	CODE:
 	decl_gwh_xs(Visibility)
 
-# OS/2 PM implementation calls itself v2, but does not support these functions
-# It is very hard to test for this, so we check for some other omission...
-
-#if !defined(GL_SRC_ALPHA_SATURATE) || defined(GL_CONSTANT_COLOR)
-
 #//# glutEntryFunc(\&callback);
 void
 glutEntryFunc(handler=0, ...)
@@ -1211,8 +907,6 @@ glutEntryFunc(handler=0, ...)
 	CODE:
 	decl_gwh_xs(Entry)
 
-#endif
-
 #if GLUT_API_VERSION >= 2
 
 #//# glutSpecialFunc(\&callback);
@@ -1222,11 +916,6 @@ glutSpecialFunc(handler=0, ...)
 	CODE:
 	decl_gwh_xs(Special)
 
-# OS/2 PM implementation calls itself v2, but does not support these functions
-# It is very hard to test for this, so we check for some other omission...
-
-#  if !defined(GL_SRC_ALPHA_SATURATE) || defined(GL_CONSTANT_COLOR)
-
 #//# glutJoystickFunc(\&callback);	/* Open/FreeGLUT -chm */
 # void					/* Not implemented, don't know how */
 # glutJoystickFunc(handler=0, ...)
@@ -1283,8 +972,6 @@ glutTabletButtonFunc(handler=0, ...)
 	CODE:
 	decl_gwh_xs(TabletButton)
 
-#  endif
-
 #endif
 
 #if GLUT_API_VERSION >= 3
@@ -1407,11 +1094,6 @@ glutStrokeCharacter(font, character)
 	void *	font
 	int	character
 
-# OS/2 PM implementation calls itself v2, but does not support these functions
-# It is very hard to test for this, so we check for some other omission...
-
-#if GLUT_API_VERSION >= 2 && (!defined(GL_SRC_ALPHA_SATURATE) || defined(GL_CONSTANT_COLOR))
-
 #//# glutBitmapWidth($font, $character);
 int
 glutBitmapWidth(font, character)
@@ -1424,9 +1106,6 @@ glutStrokeWidth(font, character)
 	void *	font
 	int	character
 
-#endif
-
-
 #if GLUT_API_VERSION >= 3
 
 #//# glutIgnoreKeyRepeat($ignore);
@@ -1445,7 +1124,6 @@ glutForceJoystickFunc()
 
 #endif
 
-
 # Solids
 
 #//# glutSolidSphere($radius, $slices, $stacks);
@@ -1799,16 +1477,8 @@ glutCloseFunc(handler=0, ...)
 	SV *	handler
 	CODE:
         {
-#if defined HAVE_FREEGLUT
-		decl_gwh_xs(Close)
-#elif defined HAVE_AGL_GLUT
-		decl_gwh_xs(WMClose)
-#endif
+	    if (_done_glutCloseFunc_warn == 0) {
+	        warn("glutCloseFunc: not implemented\n");
+	        _done_glutCloseFunc_warn++;
+            }
         }
-
-#endif /* def GLUT_API_VERSION */
-
-#endif /* End IN_POGL_GLUT_XS */
-
-# /* This is assigned to GLX for now.  The glp*() functions should be split out */
-
@@ -1,4954 +1,7258 @@
-#if 0
-<<'SKIP';
-#endif
-/*
-----------------------------------------------------------------------
-
-    ppport.h -- Perl/Pollution/Portability Version 3.06_01
-
-    Automatically created by Devel::PPPort running under
-    perl 5.008008 on Sat Oct 18 15:45:45 2008.
-
-    Do NOT edit this file directly! -- Edit PPPort_pm.PL and the
-    includes in parts/inc/ instead.
-
-    Use 'perldoc ppport.h' to view the documentation below.
-
-----------------------------------------------------------------------
-
-SKIP
-
-=pod
-
-=head1 NAME
-
-ppport.h - Perl/Pollution/Portability version 3.06_01
-
-=head1 SYNOPSIS
-
-  perl ppport.h [options] [source files]
-
-  Searches current directory for files if no [source files] are given
-
-  --help                      show short help
-
-  --patch=file                write one patch file with changes
-  --copy=suffix               write changed copies with suffix
-  --diff=program              use diff program and options
-
-  --compat-version=version    provide compatibility with Perl version
-  --cplusplus                 accept C++ comments
-
-  --quiet                     don't output anything except fatal errors
-  --nodiag                    don't show diagnostics
-  --nohints                   don't show hints
-  --nochanges                 don't suggest changes
-  --nofilter                  don't filter input files
-
-  --list-provided             list provided API
-  --list-unsupported          list unsupported API
-  --api-info=name             show Perl API portability information
-
-=head1 COMPATIBILITY
-
-This version of F<ppport.h> is designed to support operation with Perl
-installations back to 5.003, and has been tested up to 5.9.3.
-
-=head1 OPTIONS
-
-=head2 --help
-
-Display a brief usage summary.
-
-=head2 --patch=I<file>
-
-If this option is given, a single patch file will be created if
-any changes are suggested. This requires a working diff program
-to be installed on your system.
-
-=head2 --copy=I<suffix>
-
-If this option is given, a copy of each file will be saved with
-the given suffix that contains the suggested changes. This does
-not require any external programs.
-
-If neither C<--patch> or C<--copy> are given, the default is to
-simply print the diffs for each file. This requires either
-C<Text::Diff> or a C<diff> program to be installed.
-
-=head2 --diff=I<program>
-
-Manually set the diff program and options to use. The default
-is to use C<Text::Diff>, when installed, and output unified
-context diffs.
-
-=head2 --compat-version=I<version>
-
-Tell F<ppport.h> to check for compatibility with the given
-Perl version. The default is to check for compatibility with Perl
-version 5.003. You can use this option to reduce the output
-of F<ppport.h> if you intend to be backward compatible only
-up to a certain Perl version.
-
-=head2 --cplusplus
-
-Usually, F<ppport.h> will detect C++ style comments and
-replace them with C style comments for portability reasons.
-Using this option instructs F<ppport.h> to leave C++
-comments untouched.
-
-=head2 --quiet
-
-Be quiet. Don't print anything except fatal errors.
-
-=head2 --nodiag
-
-Don't output any diagnostic messages. Only portability
-alerts will be printed.
-
-=head2 --nohints
-
-Don't output any hints. Hints often contain useful portability
-notes.
-
-=head2 --nochanges
-
-Don't suggest any changes. Only give diagnostic output and hints
-unless these are also deactivated.
-
-=head2 --nofilter
-
-Don't filter the list of input files. By default, files not looking
-like source code (i.e. not *.xs, *.c, *.cc, *.cpp or *.h) are skipped.
-
-=head2 --list-provided
-
-Lists the API elements for which compatibility is provided by
-F<ppport.h>. Also lists if it must be explicitly requested,
-if it has dependencies, and if there are hints for it.
-
-=head2 --list-unsupported
-
-Lists the API elements that are known not to be supported by
-F<ppport.h> and below which version of Perl they probably
-won't be available or work.
-
-=head2 --api-info=I<name>
-
-Show portability information for API elements matching I<name>.
-If I<name> is surrounded by slashes, it is interpreted as a regular
-expression.
-
-=head1 DESCRIPTION
-
-In order for a Perl extension (XS) module to be as portable as possible
-across differing versions of Perl itself, certain steps need to be taken.
-
-=over 4
-
-=item *
-
-Including this header is the first major one. This alone will give you
-access to a large part of the Perl API that hasn't been available in
-earlier Perl releases. Use
-
-    perl ppport.h --list-provided
-
-to see which API elements are provided by ppport.h.
-
-=item *
-
-You should avoid using deprecated parts of the API. For example, using
-global Perl variables without the C<PL_> prefix is deprecated. Also,
-some API functions used to have a C<perl_> prefix. Using this form is
-also deprecated. You can safely use the supported API, as F<ppport.h>
-will provide wrappers for older Perl versions.
-
-=item *
-
-If you use one of a few functions that were not present in earlier
-versions of Perl, and that can't be provided using a macro, you have
-to explicitly request support for these functions by adding one or
-more C<#define>s in your source code before the inclusion of F<ppport.h>.
-
-These functions will be marked C<explicit> in the list shown by
-C<--list-provided>.
-
-Depending on whether you module has a single or multiple files that
-use such functions, you want either C<static> or global variants.
-
-For a C<static> function, use:
-
-    #define NEED_function
-
-For a global function, use:
-
-    #define NEED_function_GLOBAL
-
-Note that you mustn't have more than one global request for one
-function in your project.
-
-    Function                  Static Request               Global Request
-    -----------------------------------------------------------------------------------------
-    eval_pv()                 NEED_eval_pv                 NEED_eval_pv_GLOBAL
-    grok_bin()                NEED_grok_bin                NEED_grok_bin_GLOBAL
-    grok_hex()                NEED_grok_hex                NEED_grok_hex_GLOBAL
-    grok_number()             NEED_grok_number             NEED_grok_number_GLOBAL
-    grok_numeric_radix()      NEED_grok_numeric_radix      NEED_grok_numeric_radix_GLOBAL
-    grok_oct()                NEED_grok_oct                NEED_grok_oct_GLOBAL
-    newCONSTSUB()             NEED_newCONSTSUB             NEED_newCONSTSUB_GLOBAL
-    newRV_noinc()             NEED_newRV_noinc             NEED_newRV_noinc_GLOBAL
-    sv_2pv_nolen()            NEED_sv_2pv_nolen            NEED_sv_2pv_nolen_GLOBAL
-    sv_2pvbyte()              NEED_sv_2pvbyte              NEED_sv_2pvbyte_GLOBAL
-    sv_catpvf_mg()            NEED_sv_catpvf_mg            NEED_sv_catpvf_mg_GLOBAL
-    sv_catpvf_mg_nocontext()  NEED_sv_catpvf_mg_nocontext  NEED_sv_catpvf_mg_nocontext_GLOBAL
-    sv_setpvf_mg()            NEED_sv_setpvf_mg            NEED_sv_setpvf_mg_GLOBAL
-    sv_setpvf_mg_nocontext()  NEED_sv_setpvf_mg_nocontext  NEED_sv_setpvf_mg_nocontext_GLOBAL
-    vnewSVpvf()               NEED_vnewSVpvf               NEED_vnewSVpvf_GLOBAL
-
-To avoid namespace conflicts, you can change the namespace of the
-explicitly exported functions using the C<DPPP_NAMESPACE> macro.
-Just C<#define> the macro before including C<ppport.h>:
-
-    #define DPPP_NAMESPACE MyOwnNamespace_
-    #include "ppport.h"
-
-The default namespace is C<DPPP_>.
-
-=back
-
-The good thing is that most of the above can be checked by running
-F<ppport.h> on your source code. See the next section for
-details.
-
-=head1 EXAMPLES
-
-To verify whether F<ppport.h> is needed for your module, whether you
-should make any changes to your code, and whether any special defines
-should be used, F<ppport.h> can be run as a Perl script to check your
-source code. Simply say:
-
-    perl ppport.h
-
-The result will usually be a list of patches suggesting changes
-that should at least be acceptable, if not necessarily the most
-efficient solution, or a fix for all possible problems.
-
-If you know that your XS module uses features only available in
-newer Perl releases, if you're aware that it uses C++ comments,
-and if you want all suggestions as a single patch file, you could
-use something like this:
-
-    perl ppport.h --compat-version=5.6.0 --cplusplus --patch=test.diff
-
-If you only want your code to be scanned without any suggestions
-for changes, use:
-
-    perl ppport.h --nochanges
-
-You can specify a different C<diff> program or options, using
-the C<--diff> option:
-
-    perl ppport.h --diff='diff -C 10'
-
-This would output context diffs with 10 lines of context.
-
-To display portability information for the C<newSVpvn> function,
-use:
-
-    perl ppport.h --api-info=newSVpvn
-
-Since the argument to C<--api-info> can be a regular expression,
-you can use
-
-    perl ppport.h --api-info=/_nomg$/
-
-to display portability information for all C<_nomg> functions or
-
-    perl ppport.h --api-info=/./
-
-to display information for all known API elements.
-
-=head1 BUGS
-
-If this version of F<ppport.h> is causing failure during
-the compilation of this module, please check if newer versions
-of either this module or C<Devel::PPPort> are available on CPAN
-before sending a bug report.
-
-If F<ppport.h> was generated using the latest version of
-C<Devel::PPPort> and is causing failure of this module, please
-file a bug report using the CPAN Request Tracker at L<http://rt.cpan.org/>.
-
-Please include the following information:
-
-=over 4
-
-=item 1.
-
-The complete output from running "perl -V"
-
-=item 2.
-
-This file.
-
-=item 3.
-
-The name and version of the module you were trying to build.
-
-=item 4.
-
-A full log of the build that failed.
-
-=item 5.
-
-Any other information that you think could be relevant.
-
-=back
-
-For the latest version of this code, please get the C<Devel::PPPort>
-module from CPAN.
-
-=head1 COPYRIGHT
-
-Version 3.x, Copyright (c) 2004-2005, Marcus Holland-Moritz.
-
-Version 2.x, Copyright (C) 2001, Paul Marquess.
-
-Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
-
-This program is free software; you can redistribute it and/or
-modify it under the same terms as Perl itself.
-
-=head1 SEE ALSO
-
-See L<Devel::PPPort>.
-
-=cut
-
-use strict;
-
-my %opt = (
-  quiet     => 0,
-  diag      => 1,
-  hints     => 1,
-  changes   => 1,
-  cplusplus => 0,
-  filter    => 1,
-);
-
-my($ppport) = $0 =~ /([\w.]+)$/;
-my $LF = '(?:\r\n|[\r\n])';   # line feed
-my $HS = "[ \t]";             # horizontal whitespace
-
-eval {
-  require Getopt::Long;
-  Getopt::Long::GetOptions(\%opt, qw(
-    help quiet diag! filter! hints! changes! cplusplus
-    patch=s copy=s diff=s compat-version=s
-    list-provided list-unsupported api-info=s
-  )) or usage();
-};
-
-if ($@ and grep /^-/, @ARGV) {
-  usage() if "@ARGV" =~ /^--?h(?:elp)?$/;
-  die "Getopt::Long not found. Please don't use any options.\n";
-}
-
-usage() if $opt{help};
-
-if (exists $opt{'compat-version'}) {
-  my($r,$v,$s) = eval { parse_version($opt{'compat-version'}) };
-  if ($@) {
-    die "Invalid version number format: '$opt{'compat-version'}'\n";
-  }
-  die "Only Perl 5 is supported\n" if $r != 5;
-  die "Invalid version number: $opt{'compat-version'}\n" if $v >= 1000 || $s >= 1000;
-  $opt{'compat-version'} = sprintf "%d.%03d%03d", $r, $v, $s;
-}
-else {
-  $opt{'compat-version'} = 5;
-}
-
-# Never use C comments in this file!!!!!
-my $ccs  = '/'.'*';
-my $cce  = '*'.'/';
-my $rccs = quotemeta $ccs;
-my $rcce = quotemeta $cce;
-
-my %API = map { /^(\w+)\|([^|]*)\|([^|]*)\|(\w*)$/
-                ? ( $1 => {
-                      ($2                  ? ( base     => $2 ) : ()),
-                      ($3                  ? ( todo     => $3 ) : ()),
-                      (index($4, 'v') >= 0 ? ( varargs  => 1  ) : ()),
-                      (index($4, 'p') >= 0 ? ( provided => 1  ) : ()),
-                      (index($4, 'n') >= 0 ? ( nothxarg => 1  ) : ()),
-                    } )
-                : die "invalid spec: $_" } qw(
-AvFILLp|5.004050||p
-AvFILL|||
-CLASS|||n
-CX_CURPAD_SAVE|||
-CX_CURPAD_SV|||
-CopFILEAV|5.006000||p
-CopFILEGV_set|5.006000||p
-CopFILEGV|5.006000||p
-CopFILESV|5.006000||p
-CopFILE_set|5.006000||p
-CopFILE|5.006000||p
-CopSTASHPV_set|5.006000||p
-CopSTASHPV|5.006000||p
-CopSTASH_eq|5.006000||p
-CopSTASH_set|5.006000||p
-CopSTASH|5.006000||p
-CopyD|5.009002||p
-Copy|||
-CvPADLIST|||
-CvSTASH|||
-CvWEAKOUTSIDE|||
-DEFSV|5.004050||p
-END_EXTERN_C|5.005000||p
-ENTER|||
-ERRSV|5.004050||p
-EXTEND|||
-EXTERN_C|5.005000||p
-FREETMPS|||
-GIMME_V||5.004000|n
-GIMME|||n
-GROK_NUMERIC_RADIX|5.007002||p
-G_ARRAY|||
-G_DISCARD|||
-G_EVAL|||
-G_NOARGS|||
-G_SCALAR|||
-G_VOID||5.004000|
-GetVars|||
-GvSV|||
-Gv_AMupdate|||
-HEf_SVKEY||5.004000|
-HeHASH||5.004000|
-HeKEY||5.004000|
-HeKLEN||5.004000|
-HePV||5.004000|
-HeSVKEY_force||5.004000|
-HeSVKEY_set||5.004000|
-HeSVKEY||5.004000|
-HeVAL||5.004000|
-HvNAME|||
-INT2PTR|5.006000||p
-IN_LOCALE_COMPILETIME|5.007002||p
-IN_LOCALE_RUNTIME|5.007002||p
-IN_LOCALE|5.007002||p
-IN_PERL_COMPILETIME|5.008001||p
-IS_NUMBER_GREATER_THAN_UV_MAX|5.007002||p
-IS_NUMBER_INFINITY|5.007002||p
-IS_NUMBER_IN_UV|5.007002||p
-IS_NUMBER_NAN|5.007003||p
-IS_NUMBER_NEG|5.007002||p
-IS_NUMBER_NOT_INT|5.007002||p
-IVSIZE|5.006000||p
-IVTYPE|5.006000||p
-IVdf|5.006000||p
-LEAVE|||
-LVRET|||
-MARK|||
-MY_CXT_CLONE|5.009002||p
-MY_CXT_INIT|5.007003||p
-MY_CXT|5.007003||p
-MoveD|5.009002||p
-Move|||
-NEWSV|||
-NOOP|5.005000||p
-NUM2PTR|5.006000||p
-NVTYPE|5.006000||p
-NVef|5.006001||p
-NVff|5.006001||p
-NVgf|5.006001||p
-Newc|||
-Newz|||
-New|||
-Nullav|||
-Nullch|||
-Nullcv|||
-Nullhv|||
-Nullsv|||
-ORIGMARK|||
-PAD_BASE_SV|||
-PAD_CLONE_VARS|||
-PAD_COMPNAME_FLAGS|||
-PAD_COMPNAME_GEN_set|||
-PAD_COMPNAME_GEN|||
-PAD_COMPNAME_OURSTASH|||
-PAD_COMPNAME_PV|||
-PAD_COMPNAME_TYPE|||
-PAD_RESTORE_LOCAL|||
-PAD_SAVE_LOCAL|||
-PAD_SAVE_SETNULLPAD|||
-PAD_SETSV|||
-PAD_SET_CUR_NOSAVE|||
-PAD_SET_CUR|||
-PAD_SVl|||
-PAD_SV|||
-PERL_BCDVERSION|5.009003||p
-PERL_GCC_BRACE_GROUPS_FORBIDDEN|5.008001||p
-PERL_INT_MAX|5.004000||p
-PERL_INT_MIN|5.004000||p
-PERL_LONG_MAX|5.004000||p
-PERL_LONG_MIN|5.004000||p
-PERL_MAGIC_arylen|5.007002||p
-PERL_MAGIC_backref|5.007002||p
-PERL_MAGIC_bm|5.007002||p
-PERL_MAGIC_collxfrm|5.007002||p
-PERL_MAGIC_dbfile|5.007002||p
-PERL_MAGIC_dbline|5.007002||p
-PERL_MAGIC_defelem|5.007002||p
-PERL_MAGIC_envelem|5.007002||p
-PERL_MAGIC_env|5.007002||p
-PERL_MAGIC_ext|5.007002||p
-PERL_MAGIC_fm|5.007002||p
-PERL_MAGIC_glob|5.007002||p
-PERL_MAGIC_isaelem|5.007002||p
-PERL_MAGIC_isa|5.007002||p
-PERL_MAGIC_mutex|5.007002||p
-PERL_MAGIC_nkeys|5.007002||p
-PERL_MAGIC_overload_elem|5.007002||p
-PERL_MAGIC_overload_table|5.007002||p
-PERL_MAGIC_overload|5.007002||p
-PERL_MAGIC_pos|5.007002||p
-PERL_MAGIC_qr|5.007002||p
-PERL_MAGIC_regdata|5.007002||p
-PERL_MAGIC_regdatum|5.007002||p
-PERL_MAGIC_regex_global|5.007002||p
-PERL_MAGIC_shared_scalar|5.007003||p
-PERL_MAGIC_shared|5.007003||p
-PERL_MAGIC_sigelem|5.007002||p
-PERL_MAGIC_sig|5.007002||p
-PERL_MAGIC_substr|5.007002||p
-PERL_MAGIC_sv|5.007002||p
-PERL_MAGIC_taint|5.007002||p
-PERL_MAGIC_tiedelem|5.007002||p
-PERL_MAGIC_tiedscalar|5.007002||p
-PERL_MAGIC_tied|5.007002||p
-PERL_MAGIC_utf8|5.008001||p
-PERL_MAGIC_uvar_elem|5.007003||p
-PERL_MAGIC_uvar|5.007002||p
-PERL_MAGIC_vec|5.007002||p
-PERL_MAGIC_vstring|5.008001||p
-PERL_QUAD_MAX|5.004000||p
-PERL_QUAD_MIN|5.004000||p
-PERL_REVISION|5.006000||p
-PERL_SCAN_ALLOW_UNDERSCORES|5.007003||p
-PERL_SCAN_DISALLOW_PREFIX|5.007003||p
-PERL_SCAN_GREATER_THAN_UV_MAX|5.007003||p
-PERL_SCAN_SILENT_ILLDIGIT|5.008001||p
-PERL_SHORT_MAX|5.004000||p
-PERL_SHORT_MIN|5.004000||p
-PERL_SUBVERSION|5.006000||p
-PERL_UCHAR_MAX|5.004000||p
-PERL_UCHAR_MIN|5.004000||p
-PERL_UINT_MAX|5.004000||p
-PERL_UINT_MIN|5.004000||p
-PERL_ULONG_MAX|5.004000||p
-PERL_ULONG_MIN|5.004000||p
-PERL_UNUSED_DECL|5.007002||p
-PERL_UQUAD_MAX|5.004000||p
-PERL_UQUAD_MIN|5.004000||p
-PERL_USHORT_MAX|5.004000||p
-PERL_USHORT_MIN|5.004000||p
-PERL_VERSION|5.006000||p
-PL_DBsingle|||pn
-PL_DBsub|||pn
-PL_DBtrace|||n
-PL_Sv|5.005000||p
-PL_compiling|5.004050||p
-PL_copline|5.005000||p
-PL_curcop|5.004050||p
-PL_curstash|5.004050||p
-PL_debstash|5.004050||p
-PL_defgv|5.004050||p
-PL_diehook|5.004050||p
-PL_dirty|5.004050||p
-PL_dowarn|||pn
-PL_errgv|5.004050||p
-PL_hexdigit|5.005000||p
-PL_hints|5.005000||p
-PL_last_in_gv|||n
-PL_modglobal||5.005000|n
-PL_na|5.004050||pn
-PL_no_modify|5.006000||p
-PL_ofs_sv|||n
-PL_perl_destruct_level|5.004050||p
-PL_perldb|5.004050||p
-PL_ppaddr|5.006000||p
-PL_rsfp_filters|5.004050||p
-PL_rsfp|5.004050||p
-PL_rs|||n
-PL_stack_base|5.004050||p
-PL_stack_sp|5.004050||p
-PL_stdingv|5.004050||p
-PL_sv_arenaroot|5.004050||p
-PL_sv_no|5.004050||pn
-PL_sv_undef|5.004050||pn
-PL_sv_yes|5.004050||pn
-PL_tainted|5.004050||p
-PL_tainting|5.004050||p
-POPi|||n
-POPl|||n
-POPn|||n
-POPpbytex||5.007001|n
-POPpx||5.005030|n
-POPp|||n
-POPs|||n
-PTR2IV|5.006000||p
-PTR2NV|5.006000||p
-PTR2UV|5.006000||p
-PTR2ul|5.007001||p
-PTRV|5.006000||p
-PUSHMARK|||
-PUSHi|||
-PUSHmortal|5.009002||p
-PUSHn|||
-PUSHp|||
-PUSHs|||
-PUSHu|5.004000||p
-PUTBACK|||
-PerlIO_clearerr||5.007003|
-PerlIO_close||5.007003|
-PerlIO_eof||5.007003|
-PerlIO_error||5.007003|
-PerlIO_fileno||5.007003|
-PerlIO_fill||5.007003|
-PerlIO_flush||5.007003|
-PerlIO_get_base||5.007003|
-PerlIO_get_bufsiz||5.007003|
-PerlIO_get_cnt||5.007003|
-PerlIO_get_ptr||5.007003|
-PerlIO_read||5.007003|
-PerlIO_seek||5.007003|
-PerlIO_set_cnt||5.007003|
-PerlIO_set_ptrcnt||5.007003|
-PerlIO_setlinebuf||5.007003|
-PerlIO_stderr||5.007003|
-PerlIO_stdin||5.007003|
-PerlIO_stdout||5.007003|
-PerlIO_tell||5.007003|
-PerlIO_unread||5.007003|
-PerlIO_write||5.007003|
-Poison|5.008000||p
-RETVAL|||n
-Renewc|||
-Renew|||
-SAVECLEARSV|||
-SAVECOMPPAD|||
-SAVEPADSV|||
-SAVETMPS|||
-SAVE_DEFSV|5.004050||p
-SPAGAIN|||
-SP|||
-START_EXTERN_C|5.005000||p
-START_MY_CXT|5.007003||p
-STMT_END|||p
-STMT_START|||p
-ST|||
-SVt_IV|||
-SVt_NV|||
-SVt_PVAV|||
-SVt_PVCV|||
-SVt_PVHV|||
-SVt_PVMG|||
-SVt_PV|||
-Safefree|||
-Slab_Alloc|||
-Slab_Free|||
-StructCopy|||
-SvCUR_set|||
-SvCUR|||
-SvEND|||
-SvGETMAGIC|5.004050||p
-SvGROW|||
-SvIOK_UV||5.006000|
-SvIOK_notUV||5.006000|
-SvIOK_off|||
-SvIOK_only_UV||5.006000|
-SvIOK_only|||
-SvIOK_on|||
-SvIOKp|||
-SvIOK|||
-SvIVX|||
-SvIV_nomg|5.009001||p
-SvIV_set|||
-SvIVx|||
-SvIV|||
-SvIsCOW_shared_hash||5.008003|
-SvIsCOW||5.008003|
-SvLEN_set|||
-SvLEN|||
-SvLOCK||5.007003|
-SvMAGIC_set||5.009003|
-SvNIOK_off|||
-SvNIOKp|||
-SvNIOK|||
-SvNOK_off|||
-SvNOK_only|||
-SvNOK_on|||
-SvNOKp|||
-SvNOK|||
-SvNVX|||
-SvNV_set|||
-SvNVx|||
-SvNV|||
-SvOK|||
-SvOOK|||
-SvPOK_off|||
-SvPOK_only_UTF8||5.006000|
-SvPOK_only|||
-SvPOK_on|||
-SvPOKp|||
-SvPOK|||
-SvPVX|||
-SvPV_force_nomg|5.007002||p
-SvPV_force|||
-SvPV_nolen|5.006000||p
-SvPV_nomg|5.007002||p
-SvPV_set|||
-SvPVbyte_force||5.009002|
-SvPVbyte_nolen||5.006000|
-SvPVbytex_force||5.006000|
-SvPVbytex||5.006000|
-SvPVbyte|5.006000||p
-SvPVutf8_force||5.006000|
-SvPVutf8_nolen||5.006000|
-SvPVutf8x_force||5.006000|
-SvPVutf8x||5.006000|
-SvPVutf8||5.006000|
-SvPVx|||
-SvPV|||
-SvREFCNT_dec|||
-SvREFCNT_inc|||
-SvREFCNT|||
-SvROK_off|||
-SvROK_on|||
-SvROK|||
-SvRV_set||5.009003|
-SvRV|||
-SvSETMAGIC|||
-SvSHARE||5.007003|
-SvSTASH_set||5.009003|
-SvSTASH|||
-SvSetMagicSV_nosteal||5.004000|
-SvSetMagicSV||5.004000|
-SvSetSV_nosteal||5.004000|
-SvSetSV|||
-SvTAINTED_off||5.004000|
-SvTAINTED_on||5.004000|
-SvTAINTED||5.004000|
-SvTAINT|||
-SvTRUE|||
-SvTYPE|||
-SvUNLOCK||5.007003|
-SvUOK||5.007001|
-SvUPGRADE|||
-SvUTF8_off||5.006000|
-SvUTF8_on||5.006000|
-SvUTF8||5.006000|
-SvUVXx|5.004000||p
-SvUVX|5.004000||p
-SvUV_nomg|5.009001||p
-SvUV_set||5.009003|
-SvUVx|5.004000||p
-SvUV|5.004000||p
-SvVOK||5.008001|
-THIS|||n
-UNDERBAR|5.009002||p
-UVSIZE|5.006000||p
-UVTYPE|5.006000||p
-UVXf|5.007001||p
-UVof|5.006000||p
-UVuf|5.006000||p
-UVxf|5.006000||p
-XCPT_CATCH|5.009002||p
-XCPT_RETHROW|5.009002||p
-XCPT_TRY_END|5.009002||p
-XCPT_TRY_START|5.009002||p
-XPUSHi|||
-XPUSHmortal|5.009002||p
-XPUSHn|||
-XPUSHp|||
-XPUSHs|||
-XPUSHu|5.004000||p
-XSRETURN_EMPTY|||
-XSRETURN_IV|||
-XSRETURN_NO|||
-XSRETURN_NV|||
-XSRETURN_PV|||
-XSRETURN_UNDEF|||
-XSRETURN_UV|5.008001||p
-XSRETURN_YES|||
-XSRETURN|||
-XST_mIV|||
-XST_mNO|||
-XST_mNV|||
-XST_mPV|||
-XST_mUNDEF|||
-XST_mUV|5.008001||p
-XST_mYES|||
-XS_VERSION_BOOTCHECK|||
-XS_VERSION|||
-XS|||
-ZeroD|5.009002||p
-Zero|||
-_aMY_CXT|5.007003||p
-_pMY_CXT|5.007003||p
-aMY_CXT_|5.007003||p
-aMY_CXT|5.007003||p
-aTHX_|5.006000||p
-aTHX|5.006000||p
-add_data|||
-allocmy|||
-amagic_call|||
-any_dup|||
-ao|||
-append_elem|||
-append_list|||
-apply_attrs_my|||
-apply_attrs_string||5.006001|
-apply_attrs|||
-apply|||
-asIV|||
-asUV|||
-atfork_lock||5.007003|n
-atfork_unlock||5.007003|n
-av_arylen_p||5.009003|
-av_clear|||
-av_delete||5.006000|
-av_exists||5.006000|
-av_extend|||
-av_fake|||
-av_fetch|||
-av_fill|||
-av_len|||
-av_make|||
-av_pop|||
-av_push|||
-av_reify|||
-av_shift|||
-av_store|||
-av_undef|||
-av_unshift|||
-ax|||n
-bad_type|||
-bind_match|||
-block_end|||
-block_gimme||5.004000|
-block_start|||
-boolSV|5.004000||p
-boot_core_PerlIO|||
-boot_core_UNIVERSAL|||
-boot_core_xsutils|||
-bytes_from_utf8||5.007001|
-bytes_to_utf8||5.006001|
-cache_re|||
-call_argv|5.006000||p
-call_atexit||5.006000|
-call_body|||
-call_list_body|||
-call_list||5.004000|
-call_method|5.006000||p
-call_pv|5.006000||p
-call_sv|5.006000||p
-calloc||5.007002|n
-cando|||
-cast_i32||5.006000|
-cast_iv||5.006000|
-cast_ulong||5.006000|
-cast_uv||5.006000|
-check_uni|||
-checkcomma|||
-checkposixcc|||
-ck_anoncode|||
-ck_bitop|||
-ck_concat|||
-ck_defined|||
-ck_delete|||
-ck_die|||
-ck_eof|||
-ck_eval|||
-ck_exec|||
-ck_exists|||
-ck_exit|||
-ck_ftst|||
-ck_fun|||
-ck_glob|||
-ck_grep|||
-ck_index|||
-ck_join|||
-ck_lengthconst|||
-ck_lfun|||
-ck_listiob|||
-ck_match|||
-ck_method|||
-ck_null|||
-ck_open|||
-ck_repeat|||
-ck_require|||
-ck_retarget|||
-ck_return|||
-ck_rfun|||
-ck_rvconst|||
-ck_sassign|||
-ck_select|||
-ck_shift|||
-ck_sort|||
-ck_spair|||
-ck_split|||
-ck_subr|||
-ck_substr|||
-ck_svconst|||
-ck_trunc|||
-ck_unpack|||
-cl_and|||
-cl_anything|||
-cl_init_zero|||
-cl_init|||
-cl_is_anything|||
-cl_or|||
-closest_cop|||
-convert|||
-cop_free|||
-cr_textfilter|||
-croak_nocontext|||vn
-croak|||v
-csighandler||5.007001|n
-custom_op_desc||5.007003|
-custom_op_name||5.007003|
-cv_ckproto|||
-cv_clone|||
-cv_const_sv||5.004000|
-cv_dump|||
-cv_undef|||
-cx_dump||5.005000|
-cx_dup|||
-cxinc|||
-dAXMARK||5.009003|
-dAX|5.007002||p
-dITEMS|5.007002||p
-dMARK|||
-dMY_CXT_SV|5.007003||p
-dMY_CXT|5.007003||p
-dNOOP|5.006000||p
-dORIGMARK|||
-dSP|||
-dTHR|5.004050||p
-dTHXa|5.006000||p
-dTHXoa|5.006000||p
-dTHX|5.006000||p
-dUNDERBAR|5.009002||p
-dXCPT|5.009002||p
-dXSARGS|||
-dXSI32|||
-dXSTARG|5.006000||p
-deb_curcv|||
-deb_nocontext|||vn
-deb_stack_all|||
-deb_stack_n|||
-debop||5.005000|
-debprofdump||5.005000|
-debprof|||
-debstackptrs||5.007003|
-debstack||5.007003|
-deb||5.007003|v
-del_he|||
-del_sv|||
-delimcpy||5.004000|
-depcom|||
-deprecate_old|||
-deprecate|||
-despatch_signals||5.007001|
-die_nocontext|||vn
-die_where|||
-die|||v
-dirp_dup|||
-div128|||
-djSP|||
-do_aexec5|||
-do_aexec|||
-do_aspawn|||
-do_binmode||5.004050|
-do_chomp|||
-do_chop|||
-do_close|||
-do_dump_pad|||
-do_eof|||
-do_exec3|||
-do_execfree|||
-do_exec|||
-do_gv_dump||5.006000|
-do_gvgv_dump||5.006000|
-do_hv_dump||5.006000|
-do_ipcctl|||
-do_ipcget|||
-do_join|||
-do_kv|||
-do_magic_dump||5.006000|
-do_msgrcv|||
-do_msgsnd|||
-do_oddball|||
-do_op_dump||5.006000|
-do_open9||5.006000|
-do_openn||5.007001|
-do_open||5.004000|
-do_pipe|||
-do_pmop_dump||5.006000|
-do_print|||
-do_readline|||
-do_seek|||
-do_semop|||
-do_shmio|||
-do_spawn_nowait|||
-do_spawn|||
-do_sprintf|||
-do_sv_dump||5.006000|
-do_sysseek|||
-do_tell|||
-do_trans_complex_utf8|||
-do_trans_complex|||
-do_trans_count_utf8|||
-do_trans_count|||
-do_trans_simple_utf8|||
-do_trans_simple|||
-do_trans|||
-do_vecget|||
-do_vecset|||
-do_vop|||
-docatch_body|||
-docatch|||
-doeval|||
-dofile|||
-dofindlabel|||
-doform|||
-doing_taint||5.008001|n
-dooneliner|||
-doopen_pm|||
-doparseform|||
-dopoptoeval|||
-dopoptolabel|||
-dopoptoloop|||
-dopoptosub_at|||
-dopoptosub|||
-dounwind|||
-dowantarray|||
-dump_all||5.006000|
-dump_eval||5.006000|
-dump_fds|||
-dump_form||5.006000|
-dump_indent||5.006000|v
-dump_mstats|||
-dump_packsubs||5.006000|
-dump_sub||5.006000|
-dump_vindent||5.006000|
-dumpuntil|||
-dup_attrlist|||
-emulate_eaccess|||
-eval_pv|5.006000||p
-eval_sv|5.006000||p
-expect_number|||
-fbm_compile||5.005000|
-fbm_instr||5.005000|
-fd_on_nosuid_fs|||
-filter_add|||
-filter_del|||
-filter_gets|||
-filter_read|||
-find_beginning|||
-find_byclass|||
-find_in_my_stash|||
-find_runcv|||
-find_rundefsvoffset||5.009002|
-find_script|||
-find_uninit_var|||
-fold_constants|||
-forbid_setid|||
-force_ident|||
-force_list|||
-force_next|||
-force_version|||
-force_word|||
-form_nocontext|||vn
-form||5.004000|v
-fp_dup|||
-fprintf_nocontext|||vn
-free_global_struct|||
-free_tied_hv_pool|||
-free_tmps|||
-gen_constant_list|||
-get_av|5.006000||p
-get_context||5.006000|n
-get_cv|5.006000||p
-get_db_sub|||
-get_debug_opts|||
-get_hash_seed|||
-get_hv|5.006000||p
-get_mstats|||
-get_no_modify|||
-get_num|||
-get_op_descs||5.005000|
-get_op_names||5.005000|
-get_opargs|||
-get_ppaddr||5.006000|
-get_sv|5.006000||p
-get_vtbl||5.005030|
-getcwd_sv||5.007002|
-getenv_len|||
-gp_dup|||
-gp_free|||
-gp_ref|||
-grok_bin|5.007003||p
-grok_hex|5.007003||p
-grok_number|5.007002||p
-grok_numeric_radix|5.007002||p
-grok_oct|5.007003||p
-group_end|||
-gv_AVadd|||
-gv_HVadd|||
-gv_IOadd|||
-gv_autoload4||5.004000|
-gv_check|||
-gv_dump||5.006000|
-gv_efullname3||5.004000|
-gv_efullname4||5.006001|
-gv_efullname|||
-gv_ename|||
-gv_fetchfile|||
-gv_fetchmeth_autoload||5.007003|
-gv_fetchmethod_autoload||5.004000|
-gv_fetchmethod|||
-gv_fetchmeth|||
-gv_fetchpvn_flags||5.009002|
-gv_fetchpv|||
-gv_fetchsv||5.009002|
-gv_fullname3||5.004000|
-gv_fullname4||5.006001|
-gv_fullname|||
-gv_handler||5.007001|
-gv_init_sv|||
-gv_init|||
-gv_share|||
-gv_stashpvn|5.006000||p
-gv_stashpv|||
-gv_stashsv|||
-he_dup|||
-hek_dup|||
-hfreeentries|||
-hsplit|||
-hv_assert||5.009001|
-hv_auxinit|||
-hv_clear_placeholders||5.009001|
-hv_clear|||
-hv_delayfree_ent||5.004000|
-hv_delete_common|||
-hv_delete_ent||5.004000|
-hv_delete|||
-hv_eiter_p||5.009003|
-hv_eiter_set||5.009003|
-hv_exists_ent||5.004000|
-hv_exists|||
-hv_fetch_common|||
-hv_fetch_ent||5.004000|
-hv_fetch|||
-hv_free_ent||5.004000|
-hv_iterinit|||
-hv_iterkeysv||5.004000|
-hv_iterkey|||
-hv_iternext_flags||5.008000|
-hv_iternextsv|||
-hv_iternext|||
-hv_iterval|||
-hv_ksplit||5.004000|
-hv_magic_check|||
-hv_magic|||
-hv_name_set||5.009003|
-hv_notallowed|||
-hv_placeholders_get||5.009003|
-hv_placeholders_p||5.009003|
-hv_placeholders_set||5.009003|
-hv_riter_p||5.009003|
-hv_riter_set||5.009003|
-hv_scalar||5.009001|
-hv_store_ent||5.004000|
-hv_store_flags||5.008000|
-hv_store|||
-hv_undef|||
-ibcmp_locale||5.004000|
-ibcmp_utf8||5.007003|
-ibcmp|||
-incl_perldb|||
-incline|||
-incpush|||
-ingroup|||
-init_argv_symbols|||
-init_debugger|||
-init_global_struct|||
-init_i18nl10n||5.006000|
-init_i18nl14n||5.006000|
-init_ids|||
-init_interp|||
-init_lexer|||
-init_main_stash|||
-init_perllib|||
-init_postdump_symbols|||
-init_predump_symbols|||
-init_stacks||5.005000|
-init_tm||5.007002|
-instr|||
-intro_my|||
-intuit_method|||
-intuit_more|||
-invert|||
-io_close|||
-isALNUM|||
-isALPHA|||
-isDIGIT|||
-isLOWER|||
-isSPACE|||
-isUPPER|||
-is_an_int|||
-is_gv_magical_sv|||
-is_gv_magical|||
-is_handle_constructor|||
-is_list_assignment|||
-is_lvalue_sub||5.007001|
-is_uni_alnum_lc||5.006000|
-is_uni_alnumc_lc||5.006000|
-is_uni_alnumc||5.006000|
-is_uni_alnum||5.006000|
-is_uni_alpha_lc||5.006000|
-is_uni_alpha||5.006000|
-is_uni_ascii_lc||5.006000|
-is_uni_ascii||5.006000|
-is_uni_cntrl_lc||5.006000|
-is_uni_cntrl||5.006000|
-is_uni_digit_lc||5.006000|
-is_uni_digit||5.006000|
-is_uni_graph_lc||5.006000|
-is_uni_graph||5.006000|
-is_uni_idfirst_lc||5.006000|
-is_uni_idfirst||5.006000|
-is_uni_lower_lc||5.006000|
-is_uni_lower||5.006000|
-is_uni_print_lc||5.006000|
-is_uni_print||5.006000|
-is_uni_punct_lc||5.006000|
-is_uni_punct||5.006000|
-is_uni_space_lc||5.006000|
-is_uni_space||5.006000|
-is_uni_upper_lc||5.006000|
-is_uni_upper||5.006000|
-is_uni_xdigit_lc||5.006000|
-is_uni_xdigit||5.006000|
-is_utf8_alnumc||5.006000|
-is_utf8_alnum||5.006000|
-is_utf8_alpha||5.006000|
-is_utf8_ascii||5.006000|
-is_utf8_char_slow|||
-is_utf8_char||5.006000|
-is_utf8_cntrl||5.006000|
-is_utf8_digit||5.006000|
-is_utf8_graph||5.006000|
-is_utf8_idcont||5.008000|
-is_utf8_idfirst||5.006000|
-is_utf8_lower||5.006000|
-is_utf8_mark||5.006000|
-is_utf8_print||5.006000|
-is_utf8_punct||5.006000|
-is_utf8_space||5.006000|
-is_utf8_string_loclen||5.009003|
-is_utf8_string_loc||5.008001|
-is_utf8_string||5.006001|
-is_utf8_upper||5.006000|
-is_utf8_xdigit||5.006000|
-isa_lookup|||
-items|||n
-ix|||n
-jmaybe|||
-keyword|||
-leave_scope|||
-lex_end|||
-lex_start|||
-linklist|||
-listkids|||
-list|||
-load_module_nocontext|||vn
-load_module||5.006000|v
-localize|||
-looks_like_number|||
-lop|||
-mPUSHi|5.009002||p
-mPUSHn|5.009002||p
-mPUSHp|5.009002||p
-mPUSHu|5.009002||p
-mXPUSHi|5.009002||p
-mXPUSHn|5.009002||p
-mXPUSHp|5.009002||p
-mXPUSHu|5.009002||p
-magic_clear_all_env|||
-magic_clearenv|||
-magic_clearpack|||
-magic_clearsig|||
-magic_dump||5.006000|
-magic_existspack|||
-magic_freearylen_p|||
-magic_freeovrld|||
-magic_freeregexp|||
-magic_getarylen|||
-magic_getdefelem|||
-magic_getglob|||
-magic_getnkeys|||
-magic_getpack|||
-magic_getpos|||
-magic_getsig|||
-magic_getsubstr|||
-magic_gettaint|||
-magic_getuvar|||
-magic_getvec|||
-magic_get|||
-magic_killbackrefs|||
-magic_len|||
-magic_methcall|||
-magic_methpack|||
-magic_nextpack|||
-magic_regdata_cnt|||
-magic_regdatum_get|||
-magic_regdatum_set|||
-magic_scalarpack|||
-magic_set_all_env|||
-magic_setamagic|||
-magic_setarylen|||
-magic_setbm|||
-magic_setcollxfrm|||
-magic_setdbline|||
-magic_setdefelem|||
-magic_setenv|||
-magic_setfm|||
-magic_setglob|||
-magic_setisa|||
-magic_setmglob|||
-magic_setnkeys|||
-magic_setpack|||
-magic_setpos|||
-magic_setregexp|||
-magic_setsig|||
-magic_setsubstr|||
-magic_settaint|||
-magic_setutf8|||
-magic_setuvar|||
-magic_setvec|||
-magic_set|||
-magic_sizepack|||
-magic_wipepack|||
-magicname|||
-make_trie|||
-malloced_size|||n
-malloc||5.007002|n
-markstack_grow|||
-measure_struct|||
-memEQ|5.004000||p
-memNE|5.004000||p
-mem_collxfrm|||
-mess_alloc|||
-mess_nocontext|||vn
-mess||5.006000|v
-method_common|||
-mfree||5.007002|n
-mg_clear|||
-mg_copy|||
-mg_dup|||
-mg_find|||
-mg_free|||
-mg_get|||
-mg_length||5.005000|
-mg_localize|||
-mg_magical|||
-mg_set|||
-mg_size||5.005000|
-mini_mktime||5.007002|
-missingterm|||
-mode_from_discipline|||
-modkids|||
-mod|||
-moreswitches|||
-mul128|||
-mulexp10|||n
-my_atof2||5.007002|
-my_atof||5.006000|
-my_attrs|||
-my_bcopy|||n
-my_betoh16|||n
-my_betoh32|||n
-my_betoh64|||n
-my_betohi|||n
-my_betohl|||n
-my_betohs|||n
-my_bzero|||n
-my_chsize|||
-my_exit_jump|||
-my_exit|||
-my_failure_exit||5.004000|
-my_fflush_all||5.006000|
-my_fork||5.007003|n
-my_htobe16|||n
-my_htobe32|||n
-my_htobe64|||n
-my_htobei|||n
-my_htobel|||n
-my_htobes|||n
-my_htole16|||n
-my_htole32|||n
-my_htole64|||n
-my_htolei|||n
-my_htolel|||n
-my_htoles|||n
-my_htonl|||
-my_kid|||
-my_letoh16|||n
-my_letoh32|||n
-my_letoh64|||n
-my_letohi|||n
-my_letohl|||n
-my_letohs|||n
-my_lstat|||
-my_memcmp||5.004000|n
-my_memset|||n
-my_ntohl|||
-my_pclose||5.004000|
-my_popen_list||5.007001|
-my_popen||5.004000|
-my_setenv|||
-my_socketpair||5.007003|n
-my_stat|||
-my_strftime||5.007002|
-my_swabn|||n
-my_swap|||
-my_unexec|||
-my|||
-newANONATTRSUB||5.006000|
-newANONHASH|||
-newANONLIST|||
-newANONSUB|||
-newASSIGNOP|||
-newATTRSUB||5.006000|
-newAVREF|||
-newAV|||
-newBINOP|||
-newCONDOP|||
-newCONSTSUB|5.006000||p
-newCVREF|||
-newDEFSVOP|||
-newFORM|||
-newFOROP|||
-newGVOP|||
-newGVREF|||
-newGVgen|||
-newHVREF|||
-newHVhv||5.005000|
-newHV|||
-newIO|||
-newLISTOP|||
-newLOGOP|||
-newLOOPEX|||
-newLOOPOP|||
-newMYSUB||5.006000|
-newNULLLIST|||
-newOP|||
-newPADOP||5.006000|
-newPMOP|||
-newPROG|||
-newPVOP|||
-newRANGE|||
-newRV_inc|5.004000||p
-newRV_noinc|5.006000||p
-newRV|||
-newSLICEOP|||
-newSTATEOP|||
-newSUB|||
-newSVOP|||
-newSVREF|||
-newSVhek||5.009003|
-newSViv|||
-newSVnv|||
-newSVpvf_nocontext|||vn
-newSVpvf||5.004000|v
-newSVpvn_share||5.007001|
-newSVpvn|5.006000||p
-newSVpv|||
-newSVrv|||
-newSVsv|||
-newSVuv|5.006000||p
-newSV|||
-newUNOP|||
-newWHILEOP||5.009003|
-newXSproto||5.006000|
-newXS||5.006000|
-new_collate||5.006000|
-new_constant|||
-new_ctype||5.006000|
-new_he|||
-new_logop|||
-new_numeric||5.006000|
-new_stackinfo||5.005000|
-new_version||5.009000|
-next_symbol|||
-nextargv|||
-nextchar|||
-ninstr|||
-no_bareword_allowed|||
-no_fh_allowed|||
-no_op|||
-not_a_number|||
-nothreadhook||5.008000|
-nuke_stacks|||
-num_overflow|||n
-oopsAV|||
-oopsCV|||
-oopsHV|||
-op_clear|||
-op_const_sv|||
-op_dump||5.006000|
-op_free|||
-op_null||5.007002|
-op_refcnt_lock||5.009002|
-op_refcnt_unlock||5.009002|
-open_script|||
-pMY_CXT_|5.007003||p
-pMY_CXT|5.007003||p
-pTHX_|5.006000||p
-pTHX|5.006000||p
-pack_cat||5.007003|
-pack_rec|||
-package|||
-packlist||5.008001|
-pad_add_anon|||
-pad_add_name|||
-pad_alloc|||
-pad_block_start|||
-pad_check_dup|||
-pad_compname_type|||
-pad_findlex|||
-pad_findmy|||
-pad_fixup_inner_anons|||
-pad_free|||
-pad_leavemy|||
-pad_new|||
-pad_push|||
-pad_reset|||
-pad_setsv|||
-pad_sv|||
-pad_swipe|||
-pad_tidy|||
-pad_undef|||
-parse_body|||
-parse_unicode_opts|||
-path_is_absolute|||
-peep|||
-pending_ident|||
-perl_alloc_using|||n
-perl_alloc|||n
-perl_clone_using|||n
-perl_clone|||n
-perl_construct|||n
-perl_destruct||5.007003|n
-perl_free|||n
-perl_parse||5.006000|n
-perl_run|||n
-pidgone|||
-pmflag|||
-pmop_dump||5.006000|
-pmruntime|||
-pmtrans|||
-pop_scope|||
-pregcomp|||
-pregexec|||
-pregfree|||
-prepend_elem|||
-printf_nocontext|||vn
-ptr_table_clear|||
-ptr_table_fetch|||
-ptr_table_free|||
-ptr_table_new|||
-ptr_table_split|||
-ptr_table_store|||
-push_scope|||
-put_byte|||
-pv_display||5.006000|
-pv_uni_display||5.007003|
-qerror|||
-re_croak2|||
-re_dup|||
-re_intuit_start||5.006000|
-re_intuit_string||5.006000|
-realloc||5.007002|n
-reentrant_free|||
-reentrant_init|||
-reentrant_retry|||vn
-reentrant_size|||
-refkids|||
-refto|||
-ref|||
-reg_node|||
-reganode|||
-regatom|||
-regbranch|||
-regclass_swash||5.007003|
-regclass|||
-regcp_set_to|||
-regcppop|||
-regcppush|||
-regcurly|||
-regdump||5.005000|
-regexec_flags||5.005000|
-reghop3|||
-reghopmaybe3|||
-reghopmaybe|||
-reghop|||
-reginclass|||
-reginitcolors||5.006000|
-reginsert|||
-regmatch|||
-regnext||5.005000|
-regoptail|||
-regpiece|||
-regpposixcc|||
-regprop|||
-regrepeat_hard|||
-regrepeat|||
-regtail|||
-regtry|||
-reguni|||
-regwhite|||
-reg|||
-repeatcpy|||
-report_evil_fh|||
-report_uninit|||
-require_errno|||
-require_pv||5.006000|
-rninstr|||
-rsignal_restore|||
-rsignal_save|||
-rsignal_state||5.004000|
-rsignal||5.004000|
-run_body|||
-runops_debug||5.005000|
-runops_standard||5.005000|
-rvpv_dup|||
-rxres_free|||
-rxres_restore|||
-rxres_save|||
-safesyscalloc||5.006000|n
-safesysfree||5.006000|n
-safesysmalloc||5.006000|n
-safesysrealloc||5.006000|n
-same_dirent|||
-save_I16||5.004000|
-save_I32|||
-save_I8||5.006000|
-save_aelem||5.004050|
-save_alloc||5.006000|
-save_aptr|||
-save_ary|||
-save_bool||5.008001|
-save_clearsv|||
-save_delete|||
-save_destructor_x||5.006000|
-save_destructor||5.006000|
-save_freeop|||
-save_freepv|||
-save_freesv|||
-save_generic_pvref||5.006001|
-save_generic_svref||5.005030|
-save_gp||5.004000|
-save_hash|||
-save_hek_flags|||
-save_helem||5.004050|
-save_hints||5.005000|
-save_hptr|||
-save_int|||
-save_item|||
-save_iv||5.005000|
-save_lines|||
-save_list|||
-save_long|||
-save_magic|||
-save_mortalizesv||5.007001|
-save_nogv|||
-save_op|||
-save_padsv||5.007001|
-save_pptr|||
-save_re_context||5.006000|
-save_scalar_at|||
-save_scalar|||
-save_set_svflags||5.009000|
-save_shared_pvref||5.007003|
-save_sptr|||
-save_svref|||
-save_threadsv||5.005000|
-save_vptr||5.006000|
-savepvn|||
-savepv|||
-savesharedpv||5.007003|
-savestack_grow_cnt||5.008001|
-savestack_grow|||
-savesvpv||5.009002|
-sawparens|||
-scalar_mod_type|||
-scalarboolean|||
-scalarkids|||
-scalarseq|||
-scalarvoid|||
-scalar|||
-scan_bin||5.006000|
-scan_commit|||
-scan_const|||
-scan_formline|||
-scan_heredoc|||
-scan_hex|||
-scan_ident|||
-scan_inputsymbol|||
-scan_num||5.007001|
-scan_oct|||
-scan_pat|||
-scan_str|||
-scan_subst|||
-scan_trans|||
-scan_version||5.009001|
-scan_vstring||5.008001|
-scan_word|||
-scope|||
-screaminstr||5.005000|
-seed|||
-set_context||5.006000|n
-set_csh|||
-set_numeric_local||5.006000|
-set_numeric_radix||5.006000|
-set_numeric_standard||5.006000|
-setdefout|||
-setenv_getix|||
-share_hek_flags|||
-share_hek|||
-si_dup|||
-sighandler|||n
-simplify_sort|||
-skipspace|||
-sortsv||5.007003|
-ss_dup|||
-stack_grow|||
-start_glob|||
-start_subparse||5.004000|
-stashpv_hvname_match||5.009003|
-stdize_locale|||
-strEQ|||
-strGE|||
-strGT|||
-strLE|||
-strLT|||
-strNE|||
-str_to_version||5.006000|
-strnEQ|||
-strnNE|||
-study_chunk|||
-sub_crush_depth|||
-sublex_done|||
-sublex_push|||
-sublex_start|||
-sv_2bool|||
-sv_2cv|||
-sv_2io|||
-sv_2iuv_non_preserve|||
-sv_2iv_flags||5.009001|
-sv_2iv|||
-sv_2mortal|||
-sv_2nv|||
-sv_2pv_flags||5.007002|
-sv_2pv_nolen|5.006000||p
-sv_2pvbyte_nolen|||
-sv_2pvbyte|5.006000||p
-sv_2pvutf8_nolen||5.006000|
-sv_2pvutf8||5.006000|
-sv_2pv|||
-sv_2uv_flags||5.009001|
-sv_2uv|5.004000||p
-sv_add_arena|||
-sv_add_backref|||
-sv_backoff|||
-sv_bless|||
-sv_cat_decode||5.008001|
-sv_catpv_mg|5.006000||p
-sv_catpvf_mg_nocontext|||pvn
-sv_catpvf_mg|5.006000|5.004000|pv
-sv_catpvf_nocontext|||vn
-sv_catpvf||5.004000|v
-sv_catpvn_flags||5.007002|
-sv_catpvn_mg|5.006000||p
-sv_catpvn_nomg|5.007002||p
-sv_catpvn|||
-sv_catpv|||
-sv_catsv_flags||5.007002|
-sv_catsv_mg|5.006000||p
-sv_catsv_nomg|5.007002||p
-sv_catsv|||
-sv_chop|||
-sv_clean_all|||
-sv_clean_objs|||
-sv_clear|||
-sv_cmp_locale||5.004000|
-sv_cmp|||
-sv_collxfrm|||
-sv_compile_2op||5.008001|
-sv_copypv||5.007003|
-sv_dec|||
-sv_del_backref|||
-sv_derived_from||5.004000|
-sv_dump|||
-sv_dup|||
-sv_eq|||
-sv_force_normal_flags||5.007001|
-sv_force_normal||5.006000|
-sv_free2|||
-sv_free_arenas|||
-sv_free|||
-sv_gets||5.004000|
-sv_grow|||
-sv_inc|||
-sv_insert|||
-sv_isa|||
-sv_isobject|||
-sv_iv||5.005000|
-sv_len_utf8||5.006000|
-sv_len|||
-sv_magicext||5.007003|
-sv_magic|||
-sv_mortalcopy|||
-sv_newmortal|||
-sv_newref|||
-sv_nolocking||5.007003|
-sv_nosharing||5.007003|
-sv_nounlocking||5.007003|
-sv_nv||5.005000|
-sv_peek||5.005000|
-sv_pos_b2u||5.006000|
-sv_pos_u2b||5.006000|
-sv_pvbyten_force||5.006000|
-sv_pvbyten||5.006000|
-sv_pvbyte||5.006000|
-sv_pvn_force_flags||5.007002|
-sv_pvn_force|||p
-sv_pvn_nomg|5.007003||p
-sv_pvn|5.006000||p
-sv_pvutf8n_force||5.006000|
-sv_pvutf8n||5.006000|
-sv_pvutf8||5.006000|
-sv_pv||5.006000|
-sv_recode_to_utf8||5.007003|
-sv_reftype|||
-sv_release_COW|||
-sv_release_IVX|||
-sv_replace|||
-sv_report_used|||
-sv_reset|||
-sv_rvweaken||5.006000|
-sv_setiv_mg|5.006000||p
-sv_setiv|||
-sv_setnv_mg|5.006000||p
-sv_setnv|||
-sv_setpv_mg|5.006000||p
-sv_setpvf_mg_nocontext|||pvn
-sv_setpvf_mg|5.006000|5.004000|pv
-sv_setpvf_nocontext|||vn
-sv_setpvf||5.004000|v
-sv_setpviv_mg||5.008001|
-sv_setpviv||5.008001|
-sv_setpvn_mg|5.006000||p
-sv_setpvn|||
-sv_setpv|||
-sv_setref_iv|||
-sv_setref_nv|||
-sv_setref_pvn|||
-sv_setref_pv|||
-sv_setref_uv||5.007001|
-sv_setsv_cow|||
-sv_setsv_flags||5.007002|
-sv_setsv_mg|5.006000||p
-sv_setsv_nomg|5.007002||p
-sv_setsv|||
-sv_setuv_mg|5.006000||p
-sv_setuv|5.006000||p
-sv_tainted||5.004000|
-sv_taint||5.004000|
-sv_true||5.005000|
-sv_unglob|||
-sv_uni_display||5.007003|
-sv_unmagic|||
-sv_unref_flags||5.007001|
-sv_unref|||
-sv_untaint||5.004000|
-sv_upgrade|||
-sv_usepvn_mg|5.006000||p
-sv_usepvn|||
-sv_utf8_decode||5.006000|
-sv_utf8_downgrade||5.006000|
-sv_utf8_encode||5.006000|
-sv_utf8_upgrade_flags||5.007002|
-sv_utf8_upgrade||5.007001|
-sv_uv|5.006000||p
-sv_vcatpvf_mg|5.006000|5.004000|p
-sv_vcatpvfn||5.004000|
-sv_vcatpvf|5.006000|5.004000|p
-sv_vsetpvf_mg|5.006000|5.004000|p
-sv_vsetpvfn||5.004000|
-sv_vsetpvf|5.006000|5.004000|p
-svtype|||
-swallow_bom|||
-swash_fetch||5.007002|
-swash_init||5.006000|
-sys_intern_clear|||
-sys_intern_dup|||
-sys_intern_init|||
-taint_env|||
-taint_proper|||
-tmps_grow||5.006000|
-toLOWER|||
-toUPPER|||
-to_byte_substr|||
-to_uni_fold||5.007003|
-to_uni_lower_lc||5.006000|
-to_uni_lower||5.007003|
-to_uni_title_lc||5.006000|
-to_uni_title||5.007003|
-to_uni_upper_lc||5.006000|
-to_uni_upper||5.007003|
-to_utf8_case||5.007003|
-to_utf8_fold||5.007003|
-to_utf8_lower||5.007003|
-to_utf8_substr|||
-to_utf8_title||5.007003|
-to_utf8_upper||5.007003|
-tokeq|||
-tokereport|||
-too_few_arguments|||
-too_many_arguments|||
-unlnk|||
-unpack_rec|||
-unpack_str||5.007003|
-unpackstring||5.008001|
-unshare_hek_or_pvn|||
-unshare_hek|||
-unsharepvn||5.004000|
-upg_version||5.009000|
-usage|||
-utf16_textfilter|||
-utf16_to_utf8_reversed||5.006001|
-utf16_to_utf8||5.006001|
-utf16rev_textfilter|||
-utf8_distance||5.006000|
-utf8_hop||5.006000|
-utf8_length||5.007001|
-utf8_mg_pos_init|||
-utf8_mg_pos|||
-utf8_to_bytes||5.006001|
-utf8_to_uvchr||5.007001|
-utf8_to_uvuni||5.007001|
-utf8n_to_uvchr||5.007001|
-utf8n_to_uvuni||5.007001|
-utilize|||
-uvchr_to_utf8_flags||5.007003|
-uvchr_to_utf8||5.007001|
-uvuni_to_utf8_flags||5.007003|
-uvuni_to_utf8||5.007001|
-validate_suid|||
-varname|||
-vcmp||5.009000|
-vcroak||5.006000|
-vdeb||5.007003|
-vdie|||
-vform||5.006000|
-visit|||
-vivify_defelem|||
-vivify_ref|||
-vload_module||5.006000|
-vmess||5.006000|
-vnewSVpvf|5.006000|5.004000|p
-vnormal||5.009002|
-vnumify||5.009000|
-vstringify||5.009000|
-vwarner||5.006000|
-vwarn||5.006000|
-wait4pid|||
-warn_nocontext|||vn
-warner_nocontext|||vn
-warner||5.006000|v
-warn|||v
-watch|||
-whichsig|||
-write_to_stderr|||
-yyerror|||
-yylex|||
-yyparse|||
-yywarn|||
-);
-
-if (exists $opt{'list-unsupported'}) {
-  my $f;
-  for $f (sort { lc $a cmp lc $b } keys %API) {
-    next unless $API{$f}{todo};
-    print "$f ", '.'x(40-length($f)), " ", format_version($API{$f}{todo}), "\n";
-  }
-  exit 0;
-}
-
-# Scan for possible replacement candidates
-
-my(%replace, %need, %hints, %depends);
-my $replace = 0;
-my $hint = '';
-
-while (<DATA>) {
-  if ($hint) {
-    if (m{^\s*\*\s(.*?)\s*$}) {
-      $hints{$hint} ||= '';  # suppress warning with older perls
-      $hints{$hint} .= "$1\n";
-    }
-    else {
-      $hint = '';
-    }
-  }
-  $hint = $1 if m{^\s*$rccs\sHint:\s+(\w+)\s*$};
-
-  $replace     = $1 if m{^\s*$rccs\s+Replace:\s+(\d+)\s+$rcce\s*$};
-  $replace{$2} = $1 if $replace and m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+)};
-  $replace{$2} = $1 if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+).*$rccs\s+Replace\s+$rcce};
-  $replace{$1} = $2 if m{^\s*$rccs\s+Replace (\w+) with (\w+)\s+$rcce\s*$};
-
-  if (m{^\s*$rccs\s+(\w+)\s+depends\s+on\s+(\w+(\s*,\s*\w+)*)\s+$rcce\s*$}) {
-    push @{$depends{$1}}, map { s/\s+//g; $_ } split /,/, $2;
-  }
-
-  $need{$1} = 1 if m{^#if\s+defined\(NEED_(\w+)(?:_GLOBAL)?\)};
-}
-
-if (exists $opt{'api-info'}) {
-  my $f;
-  my $count = 0;
-  my $match = $opt{'api-info'} =~ m!^/(.*)/$! ? $1 : "^\Q$opt{'api-info'}\E\$";
-  for $f (sort { lc $a cmp lc $b } keys %API) {
-    next unless $f =~ /$match/;
-    print "\n=== $f ===\n\n";
-    my $info = 0;
-    if ($API{$f}{base} || $API{$f}{todo}) {
-      my $base = format_version($API{$f}{base} || $API{$f}{todo});
-      print "Supported at least starting from perl-$base.\n";
-      $info++;
-    }
-    if ($API{$f}{provided}) {
-      my $todo = $API{$f}{todo} ? format_version($API{$f}{todo}) : "5.003";
-      print "Support by $ppport provided back to perl-$todo.\n";
-      print "Support needs to be explicitly requested by NEED_$f.\n" if exists $need{$f};
-      print "Depends on: ", join(', ', @{$depends{$f}}), ".\n" if exists $depends{$f};
-      print "$hints{$f}" if exists $hints{$f};
-      $info++;
-    }
-    unless ($info) {
-      print "No portability information available.\n";
-    }
-    $count++;
-  }
-  if ($count > 0) {
-    print "\n";
-  }
-  else {
-    print "Found no API matching '$opt{'api-info'}'.\n";
-  }
-  exit 0;
-}
-
-if (exists $opt{'list-provided'}) {
-  my $f;
-  for $f (sort { lc $a cmp lc $b } keys %API) {
-    next unless $API{$f}{provided};
-    my @flags;
-    push @flags, 'explicit' if exists $need{$f};
-    push @flags, 'depend'   if exists $depends{$f};
-    push @flags, 'hint'     if exists $hints{$f};
-    my $flags = @flags ? '  ['.join(', ', @flags).']' : '';
-    print "$f$flags\n";
-  }
-  exit 0;
-}
-
-my @files;
-my @srcext = qw( xs c h cc cpp );
-my $srcext = join '|', @srcext;
-
-if (@ARGV) {
-  my %seen;
-  @files = grep { -f && !exists $seen{$_} } map { glob $_ } @ARGV;
-}
-else {
-  eval {
-    require File::Find;
-    File::Find::find(sub {
-      $File::Find::name =~ /\.($srcext)$/i
-          and push @files, $File::Find::name;
-    }, '.');
-  };
-  if ($@) {
-    @files = map { glob "*.$_" } @srcext;
-  }
-}
-
-if (!@ARGV || $opt{filter}) {
-  my(@in, @out);
-  my %xsc = map { /(.*)\.xs$/ ? ("$1.c" => 1, "$1.cc" => 1) : () } @files;
-  for (@files) {
-    my $out = exists $xsc{$_} || /\b\Q$ppport\E$/i || !/\.($srcext)$/i;
-    push @{ $out ? \@out : \@in }, $_;
-  }
-  if (@ARGV && @out) {
-    warning("Skipping the following files (use --nofilter to avoid this):\n| ", join "\n| ", @out);
-  }
-  @files = @in;
-}
-
-unless (@files) {
-  die "No input files given!\n";
-}
-
-my(%files, %global, %revreplace);
-%revreplace = reverse %replace;
-my $filename;
-my $patch_opened = 0;
-
-for $filename (@files) {
-  unless (open IN, "<$filename") {
-    warn "Unable to read from $filename: $!\n";
-    next;
-  }
-
-  info("Scanning $filename ...");
-
-  my $c = do { local $/; <IN> };
-  close IN;
-
-  my %file = (orig => $c, changes => 0);
-
-  # temporarily remove C comments from the code
-  my @ccom;
-  $c =~ s{
-    (
-        [^"'/]+
-      |
-        (?:"[^"\\]*(?:\\.[^"\\]*)*" [^"'/]*)+
-      |
-        (?:'[^'\\]*(?:\\.[^'\\]*)*' [^"'/]*)+
-    )
-  |
-    (/ (?:
-        \*[^*]*\*+(?:[^$ccs][^*]*\*+)* /
-        |
-        /[^\r\n]*
-      ))
-  }{
-    defined $2 and push @ccom, $2;
-    defined $1 ? $1 : "$ccs$#ccom$cce";
-  }egsx;
-
-  $file{ccom} = \@ccom;
-  $file{code} = $c;
-  $file{has_inc_ppport} = ($c =~ /#.*include.*\Q$ppport\E/);
-
-  my $func;
-
-  for $func (keys %API) {
-    my $match = $func;
-    $match .= "|$revreplace{$func}" if exists $revreplace{$func};
-    if ($c =~ /\b(?:Perl_)?($match)\b/) {
-      $file{uses_replace}{$1}++ if exists $revreplace{$func} && $1 eq $revreplace{$func};
-      $file{uses_Perl}{$func}++ if $c =~ /\bPerl_$func\b/;
-      if (exists $API{$func}{provided}) {
-        if (!exists $API{$func}{base} || $API{$func}{base} > $opt{'compat-version'}) {
-          $file{uses}{$func}++;
-          my @deps = rec_depend($func);
-          if (@deps) {
-            $file{uses_deps}{$func} = \@deps;
-            for (@deps) {
-              $file{uses}{$_} = 0 unless exists $file{uses}{$_};
-            }
-          }
-          for ($func, @deps) {
-            if (exists $need{$_}) {
-              $file{needs}{$_} = 'static';
-            }
-          }
-        }
-      }
-      if (exists $API{$func}{todo} && $API{$func}{todo} > $opt{'compat-version'}) {
-        if ($c =~ /\b$func\b/) {
-          $file{uses_todo}{$func}++;
-        }
-      }
-    }
-  }
-
-  while ($c =~ /^$HS*#$HS*define$HS+(NEED_(\w+?)(_GLOBAL)?)\b/mg) {
-    if (exists $need{$2}) {
-      $file{defined $3 ? 'needed_global' : 'needed_static'}{$2}++;
-    }
-    else {
-      warning("Possibly wrong #define $1 in $filename");
-    }
-  }
-
-  for (qw(uses needs uses_todo needed_global needed_static)) {
-    for $func (keys %{$file{$_}}) {
-      push @{$global{$_}{$func}}, $filename;
-    }
-  }
-
-  $files{$filename} = \%file;
-}
-
-# Globally resolve NEED_'s
-my $need;
-for $need (keys %{$global{needs}}) {
-  if (@{$global{needs}{$need}} > 1) {
-    my @targets = @{$global{needs}{$need}};
-    my @t = grep $files{$_}{needed_global}{$need}, @targets;
-    @targets = @t if @t;
-    @t = grep /\.xs$/i, @targets;
-    @targets = @t if @t;
-    my $target = shift @targets;
-    $files{$target}{needs}{$need} = 'global';
-    for (@{$global{needs}{$need}}) {
-      $files{$_}{needs}{$need} = 'extern' if $_ ne $target;
-    }
-  }
-}
-
-for $filename (@files) {
-  exists $files{$filename} or next;
-
-  info("=== Analyzing $filename ===");
-
-  my %file = %{$files{$filename}};
-  my $func;
-  my $c = $file{code};
-
-  for $func (sort keys %{$file{uses_Perl}}) {
-    if ($API{$func}{varargs}) {
-      my $changes = ($c =~ s{\b(Perl_$func\s*\(\s*)(?!aTHX_?)(\)|[^\s)]*\))}
-                            { $1 . ($2 eq ')' ? 'aTHX' : 'aTHX_ ') . $2 }ge);
-      if ($changes) {
-        warning("Doesn't pass interpreter argument aTHX to Perl_$func");
-        $file{changes} += $changes;
-      }
-    }
-    else {
-      warning("Uses Perl_$func instead of $func");
-      $file{changes} += ($c =~ s{\bPerl_$func(\s*)\((\s*aTHX_?)?\s*}
-                                {$func$1(}g);
-    }
-  }
-
-  for $func (sort keys %{$file{uses_replace}}) {
-    warning("Uses $func instead of $replace{$func}");
-    $file{changes} += ($c =~ s/\b$func\b/$replace{$func}/g);
-  }
-
-  for $func (sort keys %{$file{uses}}) {
-    next unless $file{uses}{$func};   # if it's only a dependency
-    if (exists $file{uses_deps}{$func}) {
-      diag("Uses $func, which depends on ", join(', ', @{$file{uses_deps}{$func}}));
-    }
-    elsif (exists $replace{$func}) {
-      warning("Uses $func instead of $replace{$func}");
-      $file{changes} += ($c =~ s/\b$func\b/$replace{$func}/g);
-    }
-    else {
-      diag("Uses $func");
-    }
-    hint($func);
-  }
-
-  for $func (sort keys %{$file{uses_todo}}) {
-    warning("Uses $func, which may not be portable below perl ",
-            format_version($API{$func}{todo}));
-  }
-
-  for $func (sort keys %{$file{needed_static}}) {
-    my $message = '';
-    if (not exists $file{uses}{$func}) {
-      $message = "No need to define NEED_$func if $func is never used";
-    }
-    elsif (exists $file{needs}{$func} && $file{needs}{$func} ne 'static') {
-      $message = "No need to define NEED_$func when already needed globally";
-    }
-    if ($message) {
-      diag($message);
-      $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_$func\b.*$LF//mg);
-    }
-  }
-
-  for $func (sort keys %{$file{needed_global}}) {
-    my $message = '';
-    if (not exists $global{uses}{$func}) {
-      $message = "No need to define NEED_${func}_GLOBAL if $func is never used";
-    }
-    elsif (exists $file{needs}{$func}) {
-      if ($file{needs}{$func} eq 'extern') {
-        $message = "No need to define NEED_${func}_GLOBAL when already needed globally";
-      }
-      elsif ($file{needs}{$func} eq 'static') {
-        $message = "No need to define NEED_${func}_GLOBAL when only used in this file";
-      }
-    }
-    if ($message) {
-      diag($message);
-      $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_${func}_GLOBAL\b.*$LF//mg);
-    }
-  }
-
-  $file{needs_inc_ppport} = keys %{$file{uses}};
-
-  if ($file{needs_inc_ppport}) {
-    my $pp = '';
-
-    for $func (sort keys %{$file{needs}}) {
-      my $type = $file{needs}{$func};
-      next if $type eq 'extern';
-      my $suffix = $type eq 'global' ? '_GLOBAL' : '';
-      unless (exists $file{"needed_$type"}{$func}) {
-        if ($type eq 'global') {
-          diag("Files [@{$global{needs}{$func}}] need $func, adding global request");
-        }
-        else {
-          diag("File needs $func, adding static request");
-        }
-        $pp .= "#define NEED_$func$suffix\n";
-      }
-    }
-
-    if ($pp && ($c =~ s/^(?=$HS*#$HS*define$HS+NEED_\w+)/$pp/m)) {
-      $pp = '';
-      $file{changes}++;
-    }
-
-    unless ($file{has_inc_ppport}) {
-      diag("Needs to include '$ppport'");
-      $pp .= qq(#include "$ppport"\n)
-    }
-
-    if ($pp) {
-      $file{changes} += ($c =~ s/^($HS*#$HS*define$HS+NEED_\w+.*?)^/$1$pp/ms)
-                     || ($c =~ s/^(?=$HS*#$HS*include.*\Q$ppport\E)/$pp/m)
-                     || ($c =~ s/^($HS*#$HS*include.*XSUB.*\s*?)^/$1$pp/m)
-                     || ($c =~ s/^/$pp/);
-    }
-  }
-  else {
-    if ($file{has_inc_ppport}) {
-      diag("No need to include '$ppport'");
-      $file{changes} += ($c =~ s/^$HS*?#$HS*include.*\Q$ppport\E.*?$LF//m);
-    }
-  }
-
-  # put back in our C comments
-  my $ix;
-  my $cppc = 0;
-  my @ccom = @{$file{ccom}};
-  for $ix (0 .. $#ccom) {
-    if (!$opt{cplusplus} && $ccom[$ix] =~ s!^//!!) {
-      $cppc++;
-      $file{changes} += $c =~ s/$rccs$ix$rcce/$ccs$ccom[$ix] $cce/;
-    }
-    else {
-      $c =~ s/$rccs$ix$rcce/$ccom[$ix]/;
-    }
-  }
-
-  if ($cppc) {
-    my $s = $cppc != 1 ? 's' : '';
-    warning("Uses $cppc C++ style comment$s, which is not portable");
-  }
-
-  if ($file{changes}) {
-    if (exists $opt{copy}) {
-      my $newfile = "$filename$opt{copy}";
-      if (-e $newfile) {
-        error("'$newfile' already exists, refusing to write copy of '$filename'");
-      }
-      else {
-        local *F;
-        if (open F, ">$newfile") {
-          info("Writing copy of '$filename' with changes to '$newfile'");
-          print F $c;
-          close F;
-        }
-        else {
-          error("Cannot open '$newfile' for writing: $!");
-        }
-      }
-    }
-    elsif (exists $opt{patch} || $opt{changes}) {
-      if (exists $opt{patch}) {
-        unless ($patch_opened) {
-          if (open PATCH, ">$opt{patch}") {
-            $patch_opened = 1;
-          }
-          else {
-            error("Cannot open '$opt{patch}' for writing: $!");
-            delete $opt{patch};
-            $opt{changes} = 1;
-            goto fallback;
-          }
-        }
-        mydiff(\*PATCH, $filename, $c);
-      }
-      else {
-fallback:
-        info("Suggested changes:");
-        mydiff(\*STDOUT, $filename, $c);
-      }
-    }
-    else {
-      my $s = $file{changes} == 1 ? '' : 's';
-      info("$file{changes} potentially required change$s detected");
-    }
-  }
-  else {
-    info("Looks good");
-  }
-}
-
-close PATCH if $patch_opened;
-
-exit 0;
-
-
-sub mydiff
-{
-  local *F = shift;
-  my($file, $str) = @_;
-  my $diff;
-
-  if (exists $opt{diff}) {
-    $diff = run_diff($opt{diff}, $file, $str);
-  }
-
-  if (!defined $diff and can_use('Text::Diff')) {
-    $diff = Text::Diff::diff($file, \$str, { STYLE => 'Unified' });
-    $diff = <<HEADER . $diff;
---- $file
-+++ $file.patched
-HEADER
-  }
-
-  if (!defined $diff) {
-    $diff = run_diff('diff -u', $file, $str);
-  }
-
-  if (!defined $diff) {
-    $diff = run_diff('diff', $file, $str);
-  }
-
-  if (!defined $diff) {
-    error("Cannot generate a diff. Please install Text::Diff or use --copy.");
-    return;
-  }
-
-  print F $diff;
-
-}
-
-sub run_diff
-{
-  my($prog, $file, $str) = @_;
-  my $tmp = 'dppptemp';
-  my $suf = 'aaa';
-  my $diff = '';
-  local *F;
-
-  while (-e "$tmp.$suf") { $suf++ }
-  $tmp = "$tmp.$suf";
-
-  if (open F, ">$tmp") {
-    print F $str;
-    close F;
-
-    if (open F, "$prog $file $tmp |") {
-      while (<F>) {
-        s/\Q$tmp\E/$file.patched/;
-        $diff .= $_;
-      }
-      close F;
-      unlink $tmp;
-      return $diff;
-    }
-
-    unlink $tmp;
-  }
-  else {
-    error("Cannot open '$tmp' for writing: $!");
-  }
-
-  return undef;
-}
-
-sub can_use
-{
-  eval "use @_;";
-  return $@ eq '';
-}
-
-sub rec_depend
-{
-  my $func = shift;
-  my %seen;
-  return () unless exists $depends{$func};
-  grep !$seen{$_}++, map { ($_, rec_depend($_)) } @{$depends{$func}};
-}
-
-sub parse_version
-{
-  my $ver = shift;
-
-  if ($ver =~ /^(\d+)\.(\d+)\.(\d+)$/) {
-    return ($1, $2, $3);
-  }
-  elsif ($ver !~ /^\d+\.[\d_]+$/) {
-    die "cannot parse version '$ver'\n";
-  }
-
-  $ver =~ s/_//g;
-  $ver =~ s/$/000000/;
-
-  my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/;
-
-  $v = int $v;
-  $s = int $s;
-
-  if ($r < 5 || ($r == 5 && $v < 6)) {
-    if ($s % 10) {
-      die "cannot parse version '$ver'\n";
-    }
-  }
-
-  return ($r, $v, $s);
-}
-
-sub format_version
-{
-  my $ver = shift;
-
-  $ver =~ s/$/000000/;
-  my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/;
-
-  $v = int $v;
-  $s = int $s;
-
-  if ($r < 5 || ($r == 5 && $v < 6)) {
-    if ($s % 10) {
-      die "invalid version '$ver'\n";
-    }
-    $s /= 10;
-
-    $ver = sprintf "%d.%03d", $r, $v;
-    $s > 0 and $ver .= sprintf "_%02d", $s;
-
-    return $ver;
-  }
-
-  return sprintf "%d.%d.%d", $r, $v, $s;
-}
-
-sub info
-{
-  $opt{quiet} and return;
-  print @_, "\n";
-}
-
-sub diag
-{
-  $opt{quiet} and return;
-  $opt{diag} and print @_, "\n";
-}
-
-sub warning
-{
-  $opt{quiet} and return;
-  print "*** ", @_, "\n";
-}
-
-sub error
-{
-  print "*** ERROR: ", @_, "\n";
-}
-
-my %given_hints;
-sub hint
-{
-  $opt{quiet} and return;
-  $opt{hints} or return;
-  my $func = shift;
-  exists $hints{$func} or return;
-  $given_hints{$func}++ and return;
-  my $hint = $hints{$func};
-  $hint =~ s/^/   /mg;
-  print "   --- hint for $func ---\n", $hint;
-}
-
-sub usage
-{
-  my($usage) = do { local(@ARGV,$/)=($0); <> } =~ /^=head\d$HS+SYNOPSIS\s*^(.*?)\s*^=/ms;
-  my %M = ( 'I' => '*' );
-  $usage =~ s/^\s*perl\s+\S+/$^X $0/;
-  $usage =~ s/([A-Z])<([^>]+)>/$M{$1}$2$M{$1}/g;
-
-  print <<ENDUSAGE;
-
-Usage: $usage
-
-See perldoc $0 for details.
-
-ENDUSAGE
-
-  exit 2;
-}
-
-__DATA__
-*/
-
-#ifndef _P_P_PORTABILITY_H_
-#define _P_P_PORTABILITY_H_
-
-#ifndef DPPP_NAMESPACE
-#  define DPPP_NAMESPACE DPPP_
-#endif
-
-#define DPPP_CAT2(x,y) CAT2(x,y)
-#define DPPP_(name) DPPP_CAT2(DPPP_NAMESPACE, name)
-
-#ifndef PERL_REVISION
-#  if !defined(__PATCHLEVEL_H_INCLUDED__) && !(defined(PATCHLEVEL) && defined(SUBVERSION))
-#    define PERL_PATCHLEVEL_H_IMPLICIT
-#    include <patchlevel.h>
-#  endif
-#  if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL)))
-#    include <could_not_find_Perl_patchlevel.h>
-#  endif
-#  ifndef PERL_REVISION
-#    define PERL_REVISION       (5)
-     /* Replace: 1 */
-#    define PERL_VERSION        PATCHLEVEL
-#    define PERL_SUBVERSION     SUBVERSION
-     /* Replace PERL_PATCHLEVEL with PERL_VERSION */
-     /* Replace: 0 */
-#  endif
-#endif
-
-#define PERL_BCDVERSION ((PERL_REVISION * 0x1000000L) + (PERL_VERSION * 0x1000L) + PERL_SUBVERSION)
-
-/* It is very unlikely that anyone will try to use this with Perl 6
-   (or greater), but who knows.
- */
-#if PERL_REVISION != 5
-#  error ppport.h only works with Perl version 5
-#endif /* PERL_REVISION != 5 */
-
-#ifdef I_LIMITS
-#  include <limits.h>
-#endif
-
-#ifndef PERL_UCHAR_MIN
-#  define PERL_UCHAR_MIN ((unsigned char)0)
-#endif
-
-#ifndef PERL_UCHAR_MAX
-#  ifdef UCHAR_MAX
-#    define PERL_UCHAR_MAX ((unsigned char)UCHAR_MAX)
-#  else
-#    ifdef MAXUCHAR
-#      define PERL_UCHAR_MAX ((unsigned char)MAXUCHAR)
-#    else
-#      define PERL_UCHAR_MAX ((unsigned char)~(unsigned)0)
-#    endif
-#  endif
-#endif
-
-#ifndef PERL_USHORT_MIN
-#  define PERL_USHORT_MIN ((unsigned short)0)
-#endif
-
-#ifndef PERL_USHORT_MAX
-#  ifdef USHORT_MAX
-#    define PERL_USHORT_MAX ((unsigned short)USHORT_MAX)
-#  else
-#    ifdef MAXUSHORT
-#      define PERL_USHORT_MAX ((unsigned short)MAXUSHORT)
-#    else
-#      ifdef USHRT_MAX
-#        define PERL_USHORT_MAX ((unsigned short)USHRT_MAX)
-#      else
-#        define PERL_USHORT_MAX ((unsigned short)~(unsigned)0)
-#      endif
-#    endif
-#  endif
-#endif
-
-#ifndef PERL_SHORT_MAX
-#  ifdef SHORT_MAX
-#    define PERL_SHORT_MAX ((short)SHORT_MAX)
-#  else
-#    ifdef MAXSHORT    /* Often used in <values.h> */
-#      define PERL_SHORT_MAX ((short)MAXSHORT)
-#    else
-#      ifdef SHRT_MAX
-#        define PERL_SHORT_MAX ((short)SHRT_MAX)
-#      else
-#        define PERL_SHORT_MAX ((short) (PERL_USHORT_MAX >> 1))
-#      endif
-#    endif
-#  endif
-#endif
-
-#ifndef PERL_SHORT_MIN
-#  ifdef SHORT_MIN
-#    define PERL_SHORT_MIN ((short)SHORT_MIN)
-#  else
-#    ifdef MINSHORT
-#      define PERL_SHORT_MIN ((short)MINSHORT)
-#    else
-#      ifdef SHRT_MIN
-#        define PERL_SHORT_MIN ((short)SHRT_MIN)
-#      else
-#        define PERL_SHORT_MIN (-PERL_SHORT_MAX - ((3 & -1) == 3))
-#      endif
-#    endif
-#  endif
-#endif
-
-#ifndef PERL_UINT_MAX
-#  ifdef UINT_MAX
-#    define PERL_UINT_MAX ((unsigned int)UINT_MAX)
-#  else
-#    ifdef MAXUINT
-#      define PERL_UINT_MAX ((unsigned int)MAXUINT)
-#    else
-#      define PERL_UINT_MAX (~(unsigned int)0)
-#    endif
-#  endif
-#endif
-
-#ifndef PERL_UINT_MIN
-#  define PERL_UINT_MIN ((unsigned int)0)
-#endif
-
-#ifndef PERL_INT_MAX
-#  ifdef INT_MAX
-#    define PERL_INT_MAX ((int)INT_MAX)
-#  else
-#    ifdef MAXINT    /* Often used in <values.h> */
-#      define PERL_INT_MAX ((int)MAXINT)
-#    else
-#      define PERL_INT_MAX ((int)(PERL_UINT_MAX >> 1))
-#    endif
-#  endif
-#endif
-
-#ifndef PERL_INT_MIN
-#  ifdef INT_MIN
-#    define PERL_INT_MIN ((int)INT_MIN)
-#  else
-#    ifdef MININT
-#      define PERL_INT_MIN ((int)MININT)
-#    else
-#      define PERL_INT_MIN (-PERL_INT_MAX - ((3 & -1) == 3))
-#    endif
-#  endif
-#endif
-
-#ifndef PERL_ULONG_MAX
-#  ifdef ULONG_MAX
-#    define PERL_ULONG_MAX ((unsigned long)ULONG_MAX)
-#  else
-#    ifdef MAXULONG
-#      define PERL_ULONG_MAX ((unsigned long)MAXULONG)
-#    else
-#      define PERL_ULONG_MAX (~(unsigned long)0)
-#    endif
-#  endif
-#endif
-
-#ifndef PERL_ULONG_MIN
-#  define PERL_ULONG_MIN ((unsigned long)0L)
-#endif
-
-#ifndef PERL_LONG_MAX
-#  ifdef LONG_MAX
-#    define PERL_LONG_MAX ((long)LONG_MAX)
-#  else
-#    ifdef MAXLONG
-#      define PERL_LONG_MAX ((long)MAXLONG)
-#    else
-#      define PERL_LONG_MAX ((long) (PERL_ULONG_MAX >> 1))
-#    endif
-#  endif
-#endif
-
-#ifndef PERL_LONG_MIN
-#  ifdef LONG_MIN
-#    define PERL_LONG_MIN ((long)LONG_MIN)
-#  else
-#    ifdef MINLONG
-#      define PERL_LONG_MIN ((long)MINLONG)
-#    else
-#      define PERL_LONG_MIN (-PERL_LONG_MAX - ((3 & -1) == 3))
-#    endif
-#  endif
-#endif
-
-#if defined(HAS_QUAD) && (defined(convex) || defined(uts))
-#  ifndef PERL_UQUAD_MAX
-#    ifdef ULONGLONG_MAX
-#      define PERL_UQUAD_MAX ((unsigned long long)ULONGLONG_MAX)
-#    else
-#      ifdef MAXULONGLONG
-#        define PERL_UQUAD_MAX ((unsigned long long)MAXULONGLONG)
-#      else
-#        define PERL_UQUAD_MAX (~(unsigned long long)0)
-#      endif
-#    endif
-#  endif
-
-#  ifndef PERL_UQUAD_MIN
-#    define PERL_UQUAD_MIN ((unsigned long long)0L)
-#  endif
-
-#  ifndef PERL_QUAD_MAX
-#    ifdef LONGLONG_MAX
-#      define PERL_QUAD_MAX ((long long)LONGLONG_MAX)
-#    else
-#      ifdef MAXLONGLONG
-#        define PERL_QUAD_MAX ((long long)MAXLONGLONG)
-#      else
-#        define PERL_QUAD_MAX ((long long) (PERL_UQUAD_MAX >> 1))
-#      endif
-#    endif
-#  endif
-
-#  ifndef PERL_QUAD_MIN
-#    ifdef LONGLONG_MIN
-#      define PERL_QUAD_MIN ((long long)LONGLONG_MIN)
-#    else
-#      ifdef MINLONGLONG
-#        define PERL_QUAD_MIN ((long long)MINLONGLONG)
-#      else
-#        define PERL_QUAD_MIN (-PERL_QUAD_MAX - ((3 & -1) == 3))
-#      endif
-#    endif
-#  endif
-#endif
-
-/* This is based on code from 5.003 perl.h */
-#ifdef HAS_QUAD
-#  ifdef cray
-#ifndef IVTYPE
-#  define IVTYPE                         int
-#endif
-
-#ifndef IV_MIN
-#  define IV_MIN                         PERL_INT_MIN
-#endif
-
-#ifndef IV_MAX
-#  define IV_MAX                         PERL_INT_MAX
-#endif
-
-#ifndef UV_MIN
-#  define UV_MIN                         PERL_UINT_MIN
-#endif
-
-#ifndef UV_MAX
-#  define UV_MAX                         PERL_UINT_MAX
-#endif
-
-#    ifdef INTSIZE
-#ifndef IVSIZE
-#  define IVSIZE                         INTSIZE
-#endif
-
-#    endif
-#  else
-#    if defined(convex) || defined(uts)
-#ifndef IVTYPE
-#  define IVTYPE                         long long
-#endif
-
-#ifndef IV_MIN
-#  define IV_MIN                         PERL_QUAD_MIN
-#endif
-
-#ifndef IV_MAX
-#  define IV_MAX                         PERL_QUAD_MAX
-#endif
-
-#ifndef UV_MIN
-#  define UV_MIN                         PERL_UQUAD_MIN
-#endif
-
-#ifndef UV_MAX
-#  define UV_MAX                         PERL_UQUAD_MAX
-#endif
-
-#      ifdef LONGLONGSIZE
-#ifndef IVSIZE
-#  define IVSIZE                         LONGLONGSIZE
-#endif
-
-#      endif
-#    else
-#ifndef IVTYPE
-#  define IVTYPE                         long
-#endif
-
-#ifndef IV_MIN
-#  define IV_MIN                         PERL_LONG_MIN
-#endif
-
-#ifndef IV_MAX
-#  define IV_MAX                         PERL_LONG_MAX
-#endif
-
-#ifndef UV_MIN
-#  define UV_MIN                         PERL_ULONG_MIN
-#endif
-
-#ifndef UV_MAX
-#  define UV_MAX                         PERL_ULONG_MAX
-#endif
-
-#      ifdef LONGSIZE
-#ifndef IVSIZE
-#  define IVSIZE                         LONGSIZE
-#endif
-
-#      endif
-#    endif
-#  endif
-#ifndef IVSIZE
-#  define IVSIZE                         8
-#endif
-
-#ifndef PERL_QUAD_MIN
-#  define PERL_QUAD_MIN                  IV_MIN
-#endif
-
-#ifndef PERL_QUAD_MAX
-#  define PERL_QUAD_MAX                  IV_MAX
-#endif
-
-#ifndef PERL_UQUAD_MIN
-#  define PERL_UQUAD_MIN                 UV_MIN
-#endif
-
-#ifndef PERL_UQUAD_MAX
-#  define PERL_UQUAD_MAX                 UV_MAX
-#endif
-
-#else
-#ifndef IVTYPE
-#  define IVTYPE                         long
-#endif
-
-#ifndef IV_MIN
-#  define IV_MIN                         PERL_LONG_MIN
-#endif
-
-#ifndef IV_MAX
-#  define IV_MAX                         PERL_LONG_MAX
-#endif
-
-#ifndef UV_MIN
-#  define UV_MIN                         PERL_ULONG_MIN
-#endif
-
-#ifndef UV_MAX
-#  define UV_MAX                         PERL_ULONG_MAX
-#endif
-
-#endif
-
-#ifndef IVSIZE
-#  ifdef LONGSIZE
-#    define IVSIZE LONGSIZE
-#  else
-#    define IVSIZE 4 /* A bold guess, but the best we can make. */
-#  endif
-#endif
-#ifndef UVTYPE
-#  define UVTYPE                         unsigned IVTYPE
-#endif
-
-#ifndef UVSIZE
-#  define UVSIZE                         IVSIZE
-#endif
-
-#ifndef sv_setuv
-#  define sv_setuv(sv, uv)                  \
-   STMT_START {                             \
-       UV TeMpUv = uv;                      \
-       if (TeMpUv <= IV_MAX)                \
-           sv_setiv(sv, TeMpUv);            \
-       else                                 \
-           sv_setnv(sv, (double)TeMpUv);    \
-   } STMT_END
-#endif
-
-#ifndef newSVuv
-#  define newSVuv(uv) ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv))
-#endif
-#ifndef sv_2uv
-#  define sv_2uv(sv)                     ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv)))
-#endif
-
-#ifndef SvUVX
-#  define SvUVX(sv)                      ((UV)SvIVX(sv))
-#endif
-
-#ifndef SvUVXx
-#  define SvUVXx(sv)                     SvUVX(sv)
-#endif
-
-#ifndef SvUV
-#  define SvUV(sv)                       (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv))
-#endif
-
-#ifndef SvUVx
-#  define SvUVx(sv)                      ((PL_Sv = (sv)), SvUV(PL_Sv))
-#endif
-
-/* Hint: sv_uv
- * Always use the SvUVx() macro instead of sv_uv().
- */
-#ifndef sv_uv
-#  define sv_uv(sv)                      SvUVx(sv)
-#endif
-#ifndef XST_mUV
-#  define XST_mUV(i,v)                   (ST(i) = sv_2mortal(newSVuv(v))  )
-#endif
-
-#ifndef XSRETURN_UV
-#  define XSRETURN_UV(v)                 STMT_START { XST_mUV(0,v);  XSRETURN(1); } STMT_END
-#endif
-#ifndef PUSHu
-#  define PUSHu(u)                       STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG;  } STMT_END
-#endif
-
-#ifndef XPUSHu
-#  define XPUSHu(u)                      STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END
-#endif
-
-#if (PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION <= 5))
-/* Replace: 1 */
-#  define PL_DBsingle               DBsingle
-#  define PL_DBsub                  DBsub
-#  define PL_Sv                     Sv
-#  define PL_compiling              compiling
-#  define PL_copline                copline
-#  define PL_curcop                 curcop
-#  define PL_curstash               curstash
-#  define PL_debstash               debstash
-#  define PL_defgv                  defgv
-#  define PL_diehook                diehook
-#  define PL_dirty                  dirty
-#  define PL_dowarn                 dowarn
-#  define PL_errgv                  errgv
-#  define PL_hexdigit               hexdigit
-#  define PL_hints                  hints
-#  define PL_na	                    na
-#  define PL_no_modify              no_modify
-#  define PL_perl_destruct_level    perl_destruct_level
-#  define PL_perldb                 perldb
-#  define PL_ppaddr                 ppaddr
-#  define PL_rsfp_filters           rsfp_filters
-#  define PL_rsfp                   rsfp
-#  define PL_stack_base             stack_base
-#  define PL_stack_sp               stack_sp
-#  define PL_stdingv                stdingv
-#  define PL_sv_arenaroot           sv_arenaroot
-#  define PL_sv_no                  sv_no
-#  define PL_sv_undef               sv_undef
-#  define PL_sv_yes                 sv_yes
-#  define PL_tainted                tainted
-#  define PL_tainting               tainting
-/* Replace: 0 */
-#endif
-
-#ifndef PERL_UNUSED_DECL
-#  ifdef HASATTRIBUTE
-#    if (defined(__GNUC__) && defined(__cplusplus)) || defined(__INTEL_COMPILER)
-#      define PERL_UNUSED_DECL
-#    else
-#      define PERL_UNUSED_DECL __attribute__((unused))
-#    endif
-#  else
-#    define PERL_UNUSED_DECL
-#  endif
-#endif
-#ifndef NOOP
-#  define NOOP                           (void)0
-#endif
-
-#ifndef dNOOP
-#  define dNOOP                          extern int Perl___notused PERL_UNUSED_DECL
-#endif
-
-#ifndef NVTYPE
-#  if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE)
-#    define NVTYPE long double
-#  else
-#    define NVTYPE double
-#  endif
-typedef NVTYPE NV;
-#endif
-
-#ifndef INT2PTR
-
-#  if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE)
-#    define PTRV                  UV
-#    define INT2PTR(any,d)        (any)(d)
-#  else
-#    if PTRSIZE == LONGSIZE
-#      define PTRV                unsigned long
-#    else
-#      define PTRV                unsigned
-#    endif
-#    define INT2PTR(any,d)        (any)(PTRV)(d)
-#  endif
-
-#  define NUM2PTR(any,d)  (any)(PTRV)(d)
-#  define PTR2IV(p)       INT2PTR(IV,p)
-#  define PTR2UV(p)       INT2PTR(UV,p)
-#  define PTR2NV(p)       NUM2PTR(NV,p)
-
-#  if PTRSIZE == LONGSIZE
-#    define PTR2ul(p)     (unsigned long)(p)
-#  else
-#    define PTR2ul(p)     INT2PTR(unsigned long,p)
-#  endif
-
-#endif /* !INT2PTR */
-
-#undef START_EXTERN_C
-#undef END_EXTERN_C
-#undef EXTERN_C
-#ifdef __cplusplus
-#  define START_EXTERN_C extern "C" {
-#  define END_EXTERN_C }
-#  define EXTERN_C extern "C"
-#else
-#  define START_EXTERN_C
-#  define END_EXTERN_C
-#  define EXTERN_C extern
-#endif
-
-#ifndef PERL_GCC_BRACE_GROUPS_FORBIDDEN
-#  if defined(__STRICT_ANSI__) && defined(PERL_GCC_PEDANTIC)
-#    define PERL_GCC_BRACE_GROUPS_FORBIDDEN
-#  endif
-#endif
-
-#undef STMT_START
-#undef STMT_END
-#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__cplusplus)
-#  define STMT_START	(void)(	/* gcc supports ``({ STATEMENTS; })'' */
-#  define STMT_END	)
-#else
-#  if defined(VOIDFLAGS) && (VOIDFLAGS) && (defined(sun) || defined(__sun__)) && !defined(__GNUC__)
-#    define STMT_START	if (1)
-#    define STMT_END	else (void)0
-#  else
-#    define STMT_START	do
-#    define STMT_END	while (0)
-#  endif
-#endif
-#ifndef boolSV
-#  define boolSV(b)                      ((b) ? &PL_sv_yes : &PL_sv_no)
-#endif
-
-/* DEFSV appears first in 5.004_56 */
-#ifndef DEFSV
-#  define DEFSV                          GvSV(PL_defgv)
-#endif
-
-#ifndef SAVE_DEFSV
-#  define SAVE_DEFSV                     SAVESPTR(GvSV(PL_defgv))
-#endif
-
-/* Older perls (<=5.003) lack AvFILLp */
-#ifndef AvFILLp
-#  define AvFILLp                        AvFILL
-#endif
-#ifndef ERRSV
-#  define ERRSV                          get_sv("@",FALSE)
-#endif
-#ifndef newSVpvn
-#  define newSVpvn(data,len)             ((data)                                              \
-                                    ? ((len) ? newSVpv((data), (len)) : newSVpv("", 0)) \
-                                    : newSV(0))
-#endif
-
-/* Hint: gv_stashpvn
- * This function's backport doesn't support the length parameter, but
- * rather ignores it. Portability can only be ensured if the length
- * parameter is used for speed reasons, but the length can always be
- * correctly computed from the string argument.
- */
-#ifndef gv_stashpvn
-#  define gv_stashpvn(str,len,create)    gv_stashpv(str,create)
-#endif
-
-/* Replace: 1 */
-#ifndef get_cv
-#  define get_cv                         perl_get_cv
-#endif
-
-#ifndef get_sv
-#  define get_sv                         perl_get_sv
-#endif
-
-#ifndef get_av
-#  define get_av                         perl_get_av
-#endif
-
-#ifndef get_hv
-#  define get_hv                         perl_get_hv
-#endif
-
-/* Replace: 0 */
-
-#ifdef HAS_MEMCMP
-#ifndef memNE
-#  define memNE(s1,s2,l)                 (memcmp(s1,s2,l))
-#endif
-
-#ifndef memEQ
-#  define memEQ(s1,s2,l)                 (!memcmp(s1,s2,l))
-#endif
-
-#else
-#ifndef memNE
-#  define memNE(s1,s2,l)                 (bcmp(s1,s2,l))
-#endif
-
-#ifndef memEQ
-#  define memEQ(s1,s2,l)                 (!bcmp(s1,s2,l))
-#endif
-
-#endif
-#ifndef MoveD
-#  define MoveD(s,d,n,t)                 memmove((char*)(d),(char*)(s), (n) * sizeof(t))
-#endif
-
-#ifndef CopyD
-#  define CopyD(s,d,n,t)                 memcpy((char*)(d),(char*)(s), (n) * sizeof(t))
-#endif
-
-#ifdef HAS_MEMSET
-#ifndef ZeroD
-#  define ZeroD(d,n,t)                   memzero((char*)(d), (n) * sizeof(t))
-#endif
-
-#else
-#ifndef ZeroD
-#  define ZeroD(d,n,t)                   ((void)memzero((char*)(d), (n) * sizeof(t)),d)
-#endif
-
-#endif
-#ifndef Poison
-#  define Poison(d,n,t)                  (void)memset((char*)(d), 0xAB, (n) * sizeof(t))
-#endif
-#ifndef dUNDERBAR
-#  define dUNDERBAR                      dNOOP
-#endif
-
-#ifndef UNDERBAR
-#  define UNDERBAR                       DEFSV
-#endif
-#ifndef dAX
-#  define dAX                            I32 ax = MARK - PL_stack_base + 1
-#endif
-
-#ifndef dITEMS
-#  define dITEMS                         I32 items = SP - MARK
-#endif
-#ifndef dXSTARG
-#  define dXSTARG                        SV * targ = sv_newmortal()
-#endif
-#ifndef dTHR
-#  define dTHR                           dNOOP
-#endif
-#ifndef dTHX
-#  define dTHX                           dNOOP
-#endif
-
-#ifndef dTHXa
-#  define dTHXa(x)                       dNOOP
-#endif
-#ifndef pTHX
-#  define pTHX                           void
-#endif
-
-#ifndef pTHX_
-#  define pTHX_
-#endif
-
-#ifndef aTHX
-#  define aTHX
-#endif
-
-#ifndef aTHX_
-#  define aTHX_
-#endif
-#ifndef dTHXoa
-#  define dTHXoa(x)                      dTHXa(x)
-#endif
-#ifndef PUSHmortal
-#  define PUSHmortal                     PUSHs(sv_newmortal())
-#endif
-
-#ifndef mPUSHp
-#  define mPUSHp(p,l)                    sv_setpvn_mg(PUSHmortal, (p), (l))
-#endif
-
-#ifndef mPUSHn
-#  define mPUSHn(n)                      sv_setnv_mg(PUSHmortal, (NV)(n))
-#endif
-
-#ifndef mPUSHi
-#  define mPUSHi(i)                      sv_setiv_mg(PUSHmortal, (IV)(i))
-#endif
-
-#ifndef mPUSHu
-#  define mPUSHu(u)                      sv_setuv_mg(PUSHmortal, (UV)(u))
-#endif
-#ifndef XPUSHmortal
-#  define XPUSHmortal                    XPUSHs(sv_newmortal())
-#endif
-
-#ifndef mXPUSHp
-#  define mXPUSHp(p,l)                   STMT_START { EXTEND(sp,1); sv_setpvn_mg(PUSHmortal, (p), (l)); } STMT_END
-#endif
-
-#ifndef mXPUSHn
-#  define mXPUSHn(n)                     STMT_START { EXTEND(sp,1); sv_setnv_mg(PUSHmortal, (NV)(n)); } STMT_END
-#endif
-
-#ifndef mXPUSHi
-#  define mXPUSHi(i)                     STMT_START { EXTEND(sp,1); sv_setiv_mg(PUSHmortal, (IV)(i)); } STMT_END
-#endif
-
-#ifndef mXPUSHu
-#  define mXPUSHu(u)                     STMT_START { EXTEND(sp,1); sv_setuv_mg(PUSHmortal, (UV)(u)); } STMT_END
-#endif
-
-/* Replace: 1 */
-#ifndef call_sv
-#  define call_sv                        perl_call_sv
-#endif
-
-#ifndef call_pv
-#  define call_pv                        perl_call_pv
-#endif
-
-#ifndef call_argv
-#  define call_argv                      perl_call_argv
-#endif
-
-#ifndef call_method
-#  define call_method                    perl_call_method
-#endif
-#ifndef eval_sv
-#  define eval_sv                        perl_eval_sv
-#endif
-
-/* Replace: 0 */
-
-/* Replace perl_eval_pv with eval_pv */
-/* eval_pv depends on eval_sv */
-
-#ifndef eval_pv
-#if defined(NEED_eval_pv)
-static SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error);
-static
-#else
-extern SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error);
-#endif
-
-#ifdef eval_pv
-#  undef eval_pv
-#endif
-#define eval_pv(a,b) DPPP_(my_eval_pv)(aTHX_ a,b)
-#define Perl_eval_pv DPPP_(my_eval_pv)
-
-#if defined(NEED_eval_pv) || defined(NEED_eval_pv_GLOBAL)
-
-SV*
-DPPP_(my_eval_pv)(char *p, I32 croak_on_error)
-{
-    dSP;
-    SV* sv = newSVpv(p, 0);
-
-    PUSHMARK(sp);
-    eval_sv(sv, G_SCALAR);
-    SvREFCNT_dec(sv);
-
-    SPAGAIN;
-    sv = POPs;
-    PUTBACK;
-
-    if (croak_on_error && SvTRUE(GvSV(errgv)))
-	croak(SvPVx(GvSV(errgv), na));
-
-    return sv;
-}
-
-#endif
-#endif
-#ifndef newRV_inc
-#  define newRV_inc(sv)                  newRV(sv)   /* Replace */
-#endif
-
-#ifndef newRV_noinc
-#if defined(NEED_newRV_noinc)
-static SV * DPPP_(my_newRV_noinc)(SV *sv);
-static
-#else
-extern SV * DPPP_(my_newRV_noinc)(SV *sv);
-#endif
-
-#ifdef newRV_noinc
-#  undef newRV_noinc
-#endif
-#define newRV_noinc(a) DPPP_(my_newRV_noinc)(aTHX_ a)
-#define Perl_newRV_noinc DPPP_(my_newRV_noinc)
-
-#if defined(NEED_newRV_noinc) || defined(NEED_newRV_noinc_GLOBAL)
-SV *
-DPPP_(my_newRV_noinc)(SV *sv)
-{
-  SV *rv = (SV *)newRV(sv);
-  SvREFCNT_dec(sv);
-  return rv;
-}
-#endif
-#endif
-
-/* Hint: newCONSTSUB
- * Returns a CV* as of perl-5.7.1. This return value is not supported
- * by Devel::PPPort.
- */
-
-/* newCONSTSUB from IO.xs is in the core starting with 5.004_63 */
-#if ((PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION < 63))) && ((PERL_VERSION != 4) || (PERL_SUBVERSION != 5))
-#if defined(NEED_newCONSTSUB)
-static void DPPP_(my_newCONSTSUB)(HV *stash, char *name, SV *sv);
-static
-#else
-extern void DPPP_(my_newCONSTSUB)(HV *stash, char *name, SV *sv);
-#endif
-
-#ifdef newCONSTSUB
-#  undef newCONSTSUB
-#endif
-#define newCONSTSUB(a,b,c) DPPP_(my_newCONSTSUB)(aTHX_ a,b,c)
-#define Perl_newCONSTSUB DPPP_(my_newCONSTSUB)
-
-#if defined(NEED_newCONSTSUB) || defined(NEED_newCONSTSUB_GLOBAL)
-
-void
-DPPP_(my_newCONSTSUB)(HV *stash, char *name, SV *sv)
-{
-	U32 oldhints = PL_hints;
-	HV *old_cop_stash = PL_curcop->cop_stash;
-	HV *old_curstash = PL_curstash;
-	line_t oldline = PL_curcop->cop_line;
-	PL_curcop->cop_line = PL_copline;
-
-	PL_hints &= ~HINT_BLOCK_SCOPE;
-	if (stash)
-		PL_curstash = PL_curcop->cop_stash = stash;
-
-	newSUB(
-
-#if   ((PERL_VERSION < 3) || ((PERL_VERSION == 3) && (PERL_SUBVERSION < 22)))
-		start_subparse(),
-#elif ((PERL_VERSION == 3) && (PERL_SUBVERSION == 22))
-     		start_subparse(0),
-#else  /* 5.003_23  onwards */
-     		start_subparse(FALSE, 0),
-#endif
-
-		newSVOP(OP_CONST, 0, newSVpv(name,0)),
-		newSVOP(OP_CONST, 0, &PL_sv_no),   /* SvPV(&PL_sv_no) == "" -- GMB */
-		newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv))
-	);
-
-	PL_hints = oldhints;
-	PL_curcop->cop_stash = old_cop_stash;
-	PL_curstash = old_curstash;
-	PL_curcop->cop_line = oldline;
-}
-#endif
-#endif
-
-/*
- * Boilerplate macros for initializing and accessing interpreter-local
- * data from C.  All statics in extensions should be reworked to use
- * this, if you want to make the extension thread-safe.  See ext/re/re.xs
- * for an example of the use of these macros.
- *
- * Code that uses these macros is responsible for the following:
- * 1. #define MY_CXT_KEY to a unique string, e.g. "DynaLoader_guts"
- * 2. Declare a typedef named my_cxt_t that is a structure that contains
- *    all the data that needs to be interpreter-local.
- * 3. Use the START_MY_CXT macro after the declaration of my_cxt_t.
- * 4. Use the MY_CXT_INIT macro such that it is called exactly once
- *    (typically put in the BOOT: section).
- * 5. Use the members of the my_cxt_t structure everywhere as
- *    MY_CXT.member.
- * 6. Use the dMY_CXT macro (a declaration) in all the functions that
- *    access MY_CXT.
- */
-
-#if defined(MULTIPLICITY) || defined(PERL_OBJECT) || \
-    defined(PERL_CAPI)    || defined(PERL_IMPLICIT_CONTEXT)
-
-#ifndef START_MY_CXT
-
-/* This must appear in all extensions that define a my_cxt_t structure,
- * right after the definition (i.e. at file scope).  The non-threads
- * case below uses it to declare the data as static. */
-#define START_MY_CXT
-
-#if (PERL_VERSION < 4 || (PERL_VERSION == 4 && PERL_SUBVERSION < 68 ))
-/* Fetches the SV that keeps the per-interpreter data. */
-#define dMY_CXT_SV \
-	SV *my_cxt_sv = get_sv(MY_CXT_KEY, FALSE)
-#else /* >= perl5.004_68 */
-#define dMY_CXT_SV \
-	SV *my_cxt_sv = *hv_fetch(PL_modglobal, MY_CXT_KEY,		\
-				  sizeof(MY_CXT_KEY)-1, TRUE)
-#endif /* < perl5.004_68 */
-
-/* This declaration should be used within all functions that use the
- * interpreter-local data. */
-#define dMY_CXT	\
-	dMY_CXT_SV;							\
-	my_cxt_t *my_cxtp = INT2PTR(my_cxt_t*,SvUV(my_cxt_sv))
-
-/* Creates and zeroes the per-interpreter data.
- * (We allocate my_cxtp in a Perl SV so that it will be released when
- * the interpreter goes away.) */
-#define MY_CXT_INIT \
-	dMY_CXT_SV;							\
-	/* newSV() allocates one more than needed */			\
-	my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\
-	Zero(my_cxtp, 1, my_cxt_t);					\
-	sv_setuv(my_cxt_sv, PTR2UV(my_cxtp))
-
-/* This macro must be used to access members of the my_cxt_t structure.
- * e.g. MYCXT.some_data */
-#define MY_CXT		(*my_cxtp)
-
-/* Judicious use of these macros can reduce the number of times dMY_CXT
- * is used.  Use is similar to pTHX, aTHX etc. */
-#define pMY_CXT		my_cxt_t *my_cxtp
-#define pMY_CXT_	pMY_CXT,
-#define _pMY_CXT	,pMY_CXT
-#define aMY_CXT		my_cxtp
-#define aMY_CXT_	aMY_CXT,
-#define _aMY_CXT	,aMY_CXT
-
-#endif /* START_MY_CXT */
-
-#ifndef MY_CXT_CLONE
-/* Clones the per-interpreter data. */
-#define MY_CXT_CLONE \
-	dMY_CXT_SV;							\
-	my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\
-	Copy(INT2PTR(my_cxt_t*, SvUV(my_cxt_sv)), my_cxtp, 1, my_cxt_t);\
-	sv_setuv(my_cxt_sv, PTR2UV(my_cxtp))
-#endif
-
-#else /* single interpreter */
-
-#ifndef START_MY_CXT
-
-#define START_MY_CXT	static my_cxt_t my_cxt;
-#define dMY_CXT_SV	dNOOP
-#define dMY_CXT		dNOOP
-#define MY_CXT_INIT	NOOP
-#define MY_CXT		my_cxt
-
-#define pMY_CXT		void
-#define pMY_CXT_
-#define _pMY_CXT
-#define aMY_CXT
-#define aMY_CXT_
-#define _aMY_CXT
-
-#endif /* START_MY_CXT */
-
-#ifndef MY_CXT_CLONE
-#define MY_CXT_CLONE	NOOP
-#endif
-
-#endif
-
-#ifndef IVdf
-#  if IVSIZE == LONGSIZE
-#    define	IVdf      "ld"
-#    define	UVuf      "lu"
-#    define	UVof      "lo"
-#    define	UVxf      "lx"
-#    define	UVXf      "lX"
-#  else
-#    if IVSIZE == INTSIZE
-#      define	IVdf      "d"
-#      define	UVuf      "u"
-#      define	UVof      "o"
-#      define	UVxf      "x"
-#      define	UVXf      "X"
-#    endif
-#  endif
-#endif
-
-#ifndef NVef
-#  if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) && \
-      defined(PERL_PRIfldbl) /* Not very likely, but let's try anyway. */
-#    define NVef          PERL_PRIeldbl
-#    define NVff          PERL_PRIfldbl
-#    define NVgf          PERL_PRIgldbl
-#  else
-#    define NVef          "e"
-#    define NVff          "f"
-#    define NVgf          "g"
-#  endif
-#endif
-
-#ifndef SvPV_nolen
-
-#if defined(NEED_sv_2pv_nolen)
-static char * DPPP_(my_sv_2pv_nolen)(pTHX_ register SV *sv);
-static
-#else
-extern char * DPPP_(my_sv_2pv_nolen)(pTHX_ register SV *sv);
-#endif
-
-#ifdef sv_2pv_nolen
-#  undef sv_2pv_nolen
-#endif
-#define sv_2pv_nolen(a) DPPP_(my_sv_2pv_nolen)(aTHX_ a)
-#define Perl_sv_2pv_nolen DPPP_(my_sv_2pv_nolen)
-
-#if defined(NEED_sv_2pv_nolen) || defined(NEED_sv_2pv_nolen_GLOBAL)
-
-char *
-DPPP_(my_sv_2pv_nolen)(pTHX_ register SV *sv)
-{
-  STRLEN n_a;
-  return sv_2pv(sv, &n_a);
-}
-
-#endif
-
-/* Hint: sv_2pv_nolen
- * Use the SvPV_nolen() macro instead of sv_2pv_nolen().
- */
-
-/* SvPV_nolen depends on sv_2pv_nolen */
-#define SvPV_nolen(sv) \
-          ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
-           ? SvPVX(sv) : sv_2pv_nolen(sv))
-
-#endif
-
-#ifdef SvPVbyte
-
-/* Hint: SvPVbyte
- * Does not work in perl-5.6.1, ppport.h implements a version
- * borrowed from perl-5.7.3.
- */
-
-#if ((PERL_VERSION < 7) || ((PERL_VERSION == 7) && (PERL_SUBVERSION < 0)))
-
-#if defined(NEED_sv_2pvbyte)
-static char * DPPP_(my_sv_2pvbyte)(pTHX_ register SV *sv, STRLEN *lp);
-static
-#else
-extern char * DPPP_(my_sv_2pvbyte)(pTHX_ register SV *sv, STRLEN *lp);
-#endif
-
-#ifdef sv_2pvbyte
-#  undef sv_2pvbyte
-#endif
-#define sv_2pvbyte(a,b) DPPP_(my_sv_2pvbyte)(aTHX_ a,b)
-#define Perl_sv_2pvbyte DPPP_(my_sv_2pvbyte)
-
-#if defined(NEED_sv_2pvbyte) || defined(NEED_sv_2pvbyte_GLOBAL)
-
-char *
-DPPP_(my_sv_2pvbyte)(pTHX_ register SV *sv, STRLEN *lp)
-{
-  sv_utf8_downgrade(sv,0);
-  return SvPV(sv,*lp);
-}
-
-#endif
-
-/* Hint: sv_2pvbyte
- * Use the SvPVbyte() macro instead of sv_2pvbyte().
- */
-
-#undef SvPVbyte
-
-/* SvPVbyte depends on sv_2pvbyte */
-#define SvPVbyte(sv, lp)                                                \
-        ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK)                \
-         ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte(sv, &lp))
-
-#endif
-
-#else
-
-#  define SvPVbyte          SvPV
-#  define sv_2pvbyte        sv_2pv
-
-#endif
-
-/* sv_2pvbyte_nolen depends on sv_2pv_nolen */
-#ifndef sv_2pvbyte_nolen
-#  define sv_2pvbyte_nolen               sv_2pv_nolen
-#endif
-
-/* Hint: sv_pvn
- * Always use the SvPV() macro instead of sv_pvn().
- */
-#ifndef sv_pvn
-#  define sv_pvn(sv, len)                SvPV(sv, len)
-#endif
-
-/* Hint: sv_pvn_force
- * Always use the SvPV_force() macro instead of sv_pvn_force().
- */
-#ifndef sv_pvn_force
-#  define sv_pvn_force(sv, len)          SvPV_force(sv, len)
-#endif
-
-#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(vnewSVpvf)
-#if defined(NEED_vnewSVpvf)
-static SV * DPPP_(my_vnewSVpvf)(pTHX_ const char * pat, va_list * args);
-static
-#else
-extern SV * DPPP_(my_vnewSVpvf)(pTHX_ const char * pat, va_list * args);
-#endif
-
-#ifdef vnewSVpvf
-#  undef vnewSVpvf
-#endif
-#define vnewSVpvf(a,b) DPPP_(my_vnewSVpvf)(aTHX_ a,b)
-#define Perl_vnewSVpvf DPPP_(my_vnewSVpvf)
-
-#if defined(NEED_vnewSVpvf) || defined(NEED_vnewSVpvf_GLOBAL)
-
-SV *
-DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args)
-{
-  register SV *sv = newSV(0);
-  sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
-  return sv;
-}
-
-#endif
-#endif
-
-/* sv_vcatpvf depends on sv_vcatpvfn */
-#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_vcatpvf)
-#  define sv_vcatpvf(sv, pat, args)  sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*))
-#endif
-
-/* sv_vsetpvf depends on sv_vsetpvfn */
-#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_vsetpvf)
-#  define sv_vsetpvf(sv, pat, args)  sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*))
-#endif
-
-/* sv_catpvf_mg depends on sv_vcatpvfn, sv_catpvf_mg_nocontext */
-#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_catpvf_mg)
-#if defined(NEED_sv_catpvf_mg)
-static void DPPP_(my_sv_catpvf_mg)(pTHX_ SV * sv, const char * pat, ...);
-static
-#else
-extern void DPPP_(my_sv_catpvf_mg)(pTHX_ SV * sv, const char * pat, ...);
-#endif
-
-#define Perl_sv_catpvf_mg DPPP_(my_sv_catpvf_mg)
-
-#if defined(NEED_sv_catpvf_mg) || defined(NEED_sv_catpvf_mg_GLOBAL)
-
-void
-DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...)
-{
-  va_list args;
-  va_start(args, pat);
-  sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
-  SvSETMAGIC(sv);
-  va_end(args);
-}
-
-#endif
-#endif
-
-/* sv_catpvf_mg_nocontext depends on sv_vcatpvfn */
-#ifdef PERL_IMPLICIT_CONTEXT
-#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_catpvf_mg_nocontext)
-#if defined(NEED_sv_catpvf_mg_nocontext)
-static void DPPP_(my_sv_catpvf_mg_nocontext)(SV * sv, const char * pat, ...);
-static
-#else
-extern void DPPP_(my_sv_catpvf_mg_nocontext)(SV * sv, const char * pat, ...);
-#endif
-
-#define sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext)
-#define Perl_sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext)
-
-#if defined(NEED_sv_catpvf_mg_nocontext) || defined(NEED_sv_catpvf_mg_nocontext_GLOBAL)
-
-void
-DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...)
-{
-  dTHX;
-  va_list args;
-  va_start(args, pat);
-  sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
-  SvSETMAGIC(sv);
-  va_end(args);
-}
-
-#endif
-#endif
-#endif
-
-#ifndef sv_catpvf_mg
-#  ifdef PERL_IMPLICIT_CONTEXT
-#    define sv_catpvf_mg   Perl_sv_catpvf_mg_nocontext
-#  else
-#    define sv_catpvf_mg   Perl_sv_catpvf_mg
-#  endif
-#endif
-
-/* sv_vcatpvf_mg depends on sv_vcatpvfn */
-#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_vcatpvf_mg)
-#  define sv_vcatpvf_mg(sv, pat, args)                                     \
-   STMT_START {                                                            \
-     sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));  \
-     SvSETMAGIC(sv);                                                       \
-   } STMT_END
-#endif
-
-/* sv_setpvf_mg depends on sv_vsetpvfn, sv_setpvf_mg_nocontext */
-#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_setpvf_mg)
-#if defined(NEED_sv_setpvf_mg)
-static void DPPP_(my_sv_setpvf_mg)(pTHX_ SV * sv, const char * pat, ...);
-static
-#else
-extern void DPPP_(my_sv_setpvf_mg)(pTHX_ SV * sv, const char * pat, ...);
-#endif
-
-#define Perl_sv_setpvf_mg DPPP_(my_sv_setpvf_mg)
-
-#if defined(NEED_sv_setpvf_mg) || defined(NEED_sv_setpvf_mg_GLOBAL)
-
-void
-DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...)
-{
-  va_list args;
-  va_start(args, pat);
-  sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
-  SvSETMAGIC(sv);
-  va_end(args);
-}
-
-#endif
-#endif
-
-/* sv_setpvf_mg_nocontext depends on sv_vsetpvfn */
-#ifdef PERL_IMPLICIT_CONTEXT
-#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_setpvf_mg_nocontext)
-#if defined(NEED_sv_setpvf_mg_nocontext)
-static void DPPP_(my_sv_setpvf_mg_nocontext)(SV * sv, const char * pat, ...);
-static
-#else
-extern void DPPP_(my_sv_setpvf_mg_nocontext)(SV * sv, const char * pat, ...);
-#endif
-
-#define sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext)
-#define Perl_sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext)
-
-#if defined(NEED_sv_setpvf_mg_nocontext) || defined(NEED_sv_setpvf_mg_nocontext_GLOBAL)
-
-void
-DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...)
-{
-  dTHX;
-  va_list args;
-  va_start(args, pat);
-  sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
-  SvSETMAGIC(sv);
-  va_end(args);
-}
-
-#endif
-#endif
-#endif
-
-#ifndef sv_setpvf_mg
-#  ifdef PERL_IMPLICIT_CONTEXT
-#    define sv_setpvf_mg   Perl_sv_setpvf_mg_nocontext
-#  else
-#    define sv_setpvf_mg   Perl_sv_setpvf_mg
-#  endif
-#endif
-
-/* sv_vsetpvf_mg depends on sv_vsetpvfn */
-#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_vsetpvf_mg)
-#  define sv_vsetpvf_mg(sv, pat, args)                                     \
-   STMT_START {                                                            \
-     sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));  \
-     SvSETMAGIC(sv);                                                       \
-   } STMT_END
-#endif
-#ifndef SvGETMAGIC
-#  define SvGETMAGIC(x)                  STMT_START { if (SvGMAGICAL(x)) mg_get(x); } STMT_END
-#endif
-#ifndef PERL_MAGIC_sv
-#  define PERL_MAGIC_sv                  '\0'
-#endif
-
-#ifndef PERL_MAGIC_overload
-#  define PERL_MAGIC_overload            'A'
-#endif
-
-#ifndef PERL_MAGIC_overload_elem
-#  define PERL_MAGIC_overload_elem       'a'
-#endif
-
-#ifndef PERL_MAGIC_overload_table
-#  define PERL_MAGIC_overload_table      'c'
-#endif
-
-#ifndef PERL_MAGIC_bm
-#  define PERL_MAGIC_bm                  'B'
-#endif
-
-#ifndef PERL_MAGIC_regdata
-#  define PERL_MAGIC_regdata             'D'
-#endif
-
-#ifndef PERL_MAGIC_regdatum
-#  define PERL_MAGIC_regdatum            'd'
-#endif
-
-#ifndef PERL_MAGIC_env
-#  define PERL_MAGIC_env                 'E'
-#endif
-
-#ifndef PERL_MAGIC_envelem
-#  define PERL_MAGIC_envelem             'e'
-#endif
-
-#ifndef PERL_MAGIC_fm
-#  define PERL_MAGIC_fm                  'f'
-#endif
-
-#ifndef PERL_MAGIC_regex_global
-#  define PERL_MAGIC_regex_global        'g'
-#endif
-
-#ifndef PERL_MAGIC_isa
-#  define PERL_MAGIC_isa                 'I'
-#endif
-
-#ifndef PERL_MAGIC_isaelem
-#  define PERL_MAGIC_isaelem             'i'
-#endif
-
-#ifndef PERL_MAGIC_nkeys
-#  define PERL_MAGIC_nkeys               'k'
-#endif
-
-#ifndef PERL_MAGIC_dbfile
-#  define PERL_MAGIC_dbfile              'L'
-#endif
-
-#ifndef PERL_MAGIC_dbline
-#  define PERL_MAGIC_dbline              'l'
-#endif
-
-#ifndef PERL_MAGIC_mutex
-#  define PERL_MAGIC_mutex               'm'
-#endif
-
-#ifndef PERL_MAGIC_shared
-#  define PERL_MAGIC_shared              'N'
-#endif
-
-#ifndef PERL_MAGIC_shared_scalar
-#  define PERL_MAGIC_shared_scalar       'n'
-#endif
-
-#ifndef PERL_MAGIC_collxfrm
-#  define PERL_MAGIC_collxfrm            'o'
-#endif
-
-#ifndef PERL_MAGIC_tied
-#  define PERL_MAGIC_tied                'P'
-#endif
-
-#ifndef PERL_MAGIC_tiedelem
-#  define PERL_MAGIC_tiedelem            'p'
-#endif
-
-#ifndef PERL_MAGIC_tiedscalar
-#  define PERL_MAGIC_tiedscalar          'q'
-#endif
-
-#ifndef PERL_MAGIC_qr
-#  define PERL_MAGIC_qr                  'r'
-#endif
-
-#ifndef PERL_MAGIC_sig
-#  define PERL_MAGIC_sig                 'S'
-#endif
-
-#ifndef PERL_MAGIC_sigelem
-#  define PERL_MAGIC_sigelem             's'
-#endif
-
-#ifndef PERL_MAGIC_taint
-#  define PERL_MAGIC_taint               't'
-#endif
-
-#ifndef PERL_MAGIC_uvar
-#  define PERL_MAGIC_uvar                'U'
-#endif
-
-#ifndef PERL_MAGIC_uvar_elem
-#  define PERL_MAGIC_uvar_elem           'u'
-#endif
-
-#ifndef PERL_MAGIC_vstring
-#  define PERL_MAGIC_vstring             'V'
-#endif
-
-#ifndef PERL_MAGIC_vec
-#  define PERL_MAGIC_vec                 'v'
-#endif
-
-#ifndef PERL_MAGIC_utf8
-#  define PERL_MAGIC_utf8                'w'
-#endif
-
-#ifndef PERL_MAGIC_substr
-#  define PERL_MAGIC_substr              'x'
-#endif
-
-#ifndef PERL_MAGIC_defelem
-#  define PERL_MAGIC_defelem             'y'
-#endif
-
-#ifndef PERL_MAGIC_glob
-#  define PERL_MAGIC_glob                '*'
-#endif
-
-#ifndef PERL_MAGIC_arylen
-#  define PERL_MAGIC_arylen              '#'
-#endif
-
-#ifndef PERL_MAGIC_pos
-#  define PERL_MAGIC_pos                 '.'
-#endif
-
-#ifndef PERL_MAGIC_backref
-#  define PERL_MAGIC_backref             '<'
-#endif
-
-#ifndef PERL_MAGIC_ext
-#  define PERL_MAGIC_ext                 '~'
-#endif
-
-/* That's the best we can do... */
-#ifndef SvPV_force_nomg
-#  define SvPV_force_nomg                SvPV_force
-#endif
-
-#ifndef SvPV_nomg
-#  define SvPV_nomg                      SvPV
-#endif
-
-#ifndef sv_catpvn_nomg
-#  define sv_catpvn_nomg                 sv_catpvn
-#endif
-
-#ifndef sv_catsv_nomg
-#  define sv_catsv_nomg                  sv_catsv
-#endif
-
-#ifndef sv_setsv_nomg
-#  define sv_setsv_nomg                  sv_setsv
-#endif
-
-#ifndef sv_pvn_nomg
-#  define sv_pvn_nomg                    sv_pvn
-#endif
-
-#ifndef SvIV_nomg
-#  define SvIV_nomg                      SvIV
-#endif
-
-#ifndef SvUV_nomg
-#  define SvUV_nomg                      SvUV
-#endif
-
-#ifndef sv_catpv_mg
-#  define sv_catpv_mg(sv, ptr)          \
-   STMT_START {                         \
-     SV *TeMpSv = sv;                   \
-     sv_catpv(TeMpSv,ptr);              \
-     SvSETMAGIC(TeMpSv);                \
-   } STMT_END
-#endif
-
-#ifndef sv_catpvn_mg
-#  define sv_catpvn_mg(sv, ptr, len)    \
-   STMT_START {                         \
-     SV *TeMpSv = sv;                   \
-     sv_catpvn(TeMpSv,ptr,len);         \
-     SvSETMAGIC(TeMpSv);                \
-   } STMT_END
-#endif
-
-#ifndef sv_catsv_mg
-#  define sv_catsv_mg(dsv, ssv)         \
-   STMT_START {                         \
-     SV *TeMpSv = dsv;                  \
-     sv_catsv(TeMpSv,ssv);              \
-     SvSETMAGIC(TeMpSv);                \
-   } STMT_END
-#endif
-
-#ifndef sv_setiv_mg
-#  define sv_setiv_mg(sv, i)            \
-   STMT_START {                         \
-     SV *TeMpSv = sv;                   \
-     sv_setiv(TeMpSv,i);                \
-     SvSETMAGIC(TeMpSv);                \
-   } STMT_END
-#endif
-
-#ifndef sv_setnv_mg
-#  define sv_setnv_mg(sv, num)          \
-   STMT_START {                         \
-     SV *TeMpSv = sv;                   \
-     sv_setnv(TeMpSv,num);              \
-     SvSETMAGIC(TeMpSv);                \
-   } STMT_END
-#endif
-
-#ifndef sv_setpv_mg
-#  define sv_setpv_mg(sv, ptr)          \
-   STMT_START {                         \
-     SV *TeMpSv = sv;                   \
-     sv_setpv(TeMpSv,ptr);              \
-     SvSETMAGIC(TeMpSv);                \
-   } STMT_END
-#endif
-
-#ifndef sv_setpvn_mg
-#  define sv_setpvn_mg(sv, ptr, len)    \
-   STMT_START {                         \
-     SV *TeMpSv = sv;                   \
-     sv_setpvn(TeMpSv,ptr,len);         \
-     SvSETMAGIC(TeMpSv);                \
-   } STMT_END
-#endif
-
-#ifndef sv_setsv_mg
-#  define sv_setsv_mg(dsv, ssv)         \
-   STMT_START {                         \
-     SV *TeMpSv = dsv;                  \
-     sv_setsv(TeMpSv,ssv);              \
-     SvSETMAGIC(TeMpSv);                \
-   } STMT_END
-#endif
-
-#ifndef sv_setuv_mg
-#  define sv_setuv_mg(sv, i)            \
-   STMT_START {                         \
-     SV *TeMpSv = sv;                   \
-     sv_setuv(TeMpSv,i);                \
-     SvSETMAGIC(TeMpSv);                \
-   } STMT_END
-#endif
-
-#ifndef sv_usepvn_mg
-#  define sv_usepvn_mg(sv, ptr, len)    \
-   STMT_START {                         \
-     SV *TeMpSv = sv;                   \
-     sv_usepvn(TeMpSv,ptr,len);         \
-     SvSETMAGIC(TeMpSv);                \
-   } STMT_END
-#endif
-
-#ifdef USE_ITHREADS
-#ifndef CopFILE
-#  define CopFILE(c)                     ((c)->cop_file)
-#endif
-
-#ifndef CopFILEGV
-#  define CopFILEGV(c)                   (CopFILE(c) ? gv_fetchfile(CopFILE(c)) : Nullgv)
-#endif
-
-#ifndef CopFILE_set
-#  define CopFILE_set(c,pv)              ((c)->cop_file = savepv(pv))
-#endif
-
-#ifndef CopFILESV
-#  define CopFILESV(c)                   (CopFILE(c) ? GvSV(gv_fetchfile(CopFILE(c))) : Nullsv)
-#endif
-
-#ifndef CopFILEAV
-#  define CopFILEAV(c)                   (CopFILE(c) ? GvAV(gv_fetchfile(CopFILE(c))) : Nullav)
-#endif
-
-#ifndef CopSTASHPV
-#  define CopSTASHPV(c)                  ((c)->cop_stashpv)
-#endif
-
-#ifndef CopSTASHPV_set
-#  define CopSTASHPV_set(c,pv)           ((c)->cop_stashpv = ((pv) ? savepv(pv) : Nullch))
-#endif
-
-#ifndef CopSTASH
-#  define CopSTASH(c)                    (CopSTASHPV(c) ? gv_stashpv(CopSTASHPV(c),GV_ADD) : Nullhv)
-#endif
-
-#ifndef CopSTASH_set
-#  define CopSTASH_set(c,hv)             CopSTASHPV_set(c, (hv) ? HvNAME(hv) : Nullch)
-#endif
-
-#ifndef CopSTASH_eq
-#  define CopSTASH_eq(c,hv)              ((hv) && (CopSTASHPV(c) == HvNAME(hv) \
-					|| (CopSTASHPV(c) && HvNAME(hv) \
-					&& strEQ(CopSTASHPV(c), HvNAME(hv)))))
-#endif
-
-#else
-#ifndef CopFILEGV
-#  define CopFILEGV(c)                   ((c)->cop_filegv)
-#endif
-
-#ifndef CopFILEGV_set
-#  define CopFILEGV_set(c,gv)            ((c)->cop_filegv = (GV*)SvREFCNT_inc(gv))
-#endif
-
-#ifndef CopFILE_set
-#  define CopFILE_set(c,pv)              CopFILEGV_set((c), gv_fetchfile(pv))
-#endif
-
-#ifndef CopFILESV
-#  define CopFILESV(c)                   (CopFILEGV(c) ? GvSV(CopFILEGV(c)) : Nullsv)
-#endif
-
-#ifndef CopFILEAV
-#  define CopFILEAV(c)                   (CopFILEGV(c) ? GvAV(CopFILEGV(c)) : Nullav)
-#endif
-
-#ifndef CopFILE
-#  define CopFILE(c)                     (CopFILESV(c) ? SvPVX(CopFILESV(c)) : Nullch)
-#endif
-
-#ifndef CopSTASH
-#  define CopSTASH(c)                    ((c)->cop_stash)
-#endif
-
-#ifndef CopSTASH_set
-#  define CopSTASH_set(c,hv)             ((c)->cop_stash = (hv))
-#endif
-
-#ifndef CopSTASHPV
-#  define CopSTASHPV(c)                  (CopSTASH(c) ? HvNAME(CopSTASH(c)) : Nullch)
-#endif
-
-#ifndef CopSTASHPV_set
-#  define CopSTASHPV_set(c,pv)           CopSTASH_set((c), gv_stashpv(pv,GV_ADD))
-#endif
-
-#ifndef CopSTASH_eq
-#  define CopSTASH_eq(c,hv)              (CopSTASH(c) == (hv))
-#endif
-
-#endif /* USE_ITHREADS */
-#ifndef IN_PERL_COMPILETIME
-#  define IN_PERL_COMPILETIME            (PL_curcop == &PL_compiling)
-#endif
-
-#ifndef IN_LOCALE_RUNTIME
-#  define IN_LOCALE_RUNTIME              (PL_curcop->op_private & HINT_LOCALE)
-#endif
-
-#ifndef IN_LOCALE_COMPILETIME
-#  define IN_LOCALE_COMPILETIME          (PL_hints & HINT_LOCALE)
-#endif
-
-#ifndef IN_LOCALE
-#  define IN_LOCALE                      (IN_PERL_COMPILETIME ? IN_LOCALE_COMPILETIME : IN_LOCALE_RUNTIME)
-#endif
-#ifndef IS_NUMBER_IN_UV
-#  define IS_NUMBER_IN_UV                0x01
-#endif
-
-#ifndef IS_NUMBER_GREATER_THAN_UV_MAX
-#  define IS_NUMBER_GREATER_THAN_UV_MAX  0x02
-#endif
-
-#ifndef IS_NUMBER_NOT_INT
-#  define IS_NUMBER_NOT_INT              0x04
-#endif
-
-#ifndef IS_NUMBER_NEG
-#  define IS_NUMBER_NEG                  0x08
-#endif
-
-#ifndef IS_NUMBER_INFINITY
-#  define IS_NUMBER_INFINITY             0x10
-#endif
-
-#ifndef IS_NUMBER_NAN
-#  define IS_NUMBER_NAN                  0x20
-#endif
-
-/* GROK_NUMERIC_RADIX depends on grok_numeric_radix */
-#ifndef GROK_NUMERIC_RADIX
-#  define GROK_NUMERIC_RADIX(sp, send)   grok_numeric_radix(sp, send)
-#endif
-#ifndef PERL_SCAN_GREATER_THAN_UV_MAX
-#  define PERL_SCAN_GREATER_THAN_UV_MAX  0x02
-#endif
-
-#ifndef PERL_SCAN_SILENT_ILLDIGIT
-#  define PERL_SCAN_SILENT_ILLDIGIT      0x04
-#endif
-
-#ifndef PERL_SCAN_ALLOW_UNDERSCORES
-#  define PERL_SCAN_ALLOW_UNDERSCORES    0x01
-#endif
-
-#ifndef PERL_SCAN_DISALLOW_PREFIX
-#  define PERL_SCAN_DISALLOW_PREFIX      0x02
-#endif
-
-#ifndef grok_numeric_radix
-#if defined(NEED_grok_numeric_radix)
-static bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send);
-static
-#else
-extern bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send);
-#endif
-
-#ifdef grok_numeric_radix
-#  undef grok_numeric_radix
-#endif
-#define grok_numeric_radix(a,b) DPPP_(my_grok_numeric_radix)(aTHX_ a,b)
-#define Perl_grok_numeric_radix DPPP_(my_grok_numeric_radix)
-
-#if defined(NEED_grok_numeric_radix) || defined(NEED_grok_numeric_radix_GLOBAL)
-bool
-DPPP_(my_grok_numeric_radix)(pTHX_ const char **sp, const char *send)
-{
-#ifdef USE_LOCALE_NUMERIC
-#ifdef PL_numeric_radix_sv
-    if (PL_numeric_radix_sv && IN_LOCALE) {
-        STRLEN len;
-        char* radix = SvPV(PL_numeric_radix_sv, len);
-        if (*sp + len <= send && memEQ(*sp, radix, len)) {
-            *sp += len;
-            return TRUE;
-        }
-    }
-#else
-    /* older perls don't have PL_numeric_radix_sv so the radix
-     * must manually be requested from locale.h
-     */
-#include <locale.h>
-    dTHR;  /* needed for older threaded perls */
-    struct lconv *lc = localeconv();
-    char *radix = lc->decimal_point;
-    if (radix && IN_LOCALE) {
-        STRLEN len = strlen(radix);
-        if (*sp + len <= send && memEQ(*sp, radix, len)) {
-            *sp += len;
-            return TRUE;
-        }
-    }
-#endif /* PERL_VERSION */
-#endif /* USE_LOCALE_NUMERIC */
-    /* always try "." if numeric radix didn't match because
-     * we may have data from different locales mixed */
-    if (*sp < send && **sp == '.') {
-        ++*sp;
-        return TRUE;
-    }
-    return FALSE;
-}
-#endif
-#endif
-
-/* grok_number depends on grok_numeric_radix */
-
-#ifndef grok_number
-#if defined(NEED_grok_number)
-static int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep);
-static
-#else
-extern int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep);
-#endif
-
-#ifdef grok_number
-#  undef grok_number
-#endif
-#define grok_number(a,b,c) DPPP_(my_grok_number)(aTHX_ a,b,c)
-#define Perl_grok_number DPPP_(my_grok_number)
-
-#if defined(NEED_grok_number) || defined(NEED_grok_number_GLOBAL)
-int
-DPPP_(my_grok_number)(pTHX_ const char *pv, STRLEN len, UV *valuep)
-{
-  const char *s = pv;
-  const char *send = pv + len;
-  const UV max_div_10 = UV_MAX / 10;
-  const char max_mod_10 = UV_MAX % 10;
-  int numtype = 0;
-  int sawinf = 0;
-  int sawnan = 0;
-
-  while (s < send && isSPACE(*s))
-    s++;
-  if (s == send) {
-    return 0;
-  } else if (*s == '-') {
-    s++;
-    numtype = IS_NUMBER_NEG;
-  }
-  else if (*s == '+')
-  s++;
-
-  if (s == send)
-    return 0;
-
-  /* next must be digit or the radix separator or beginning of infinity */
-  if (isDIGIT(*s)) {
-    /* UVs are at least 32 bits, so the first 9 decimal digits cannot
-       overflow.  */
-    UV value = *s - '0';
-    /* This construction seems to be more optimiser friendly.
-       (without it gcc does the isDIGIT test and the *s - '0' separately)
-       With it gcc on arm is managing 6 instructions (6 cycles) per digit.
-       In theory the optimiser could deduce how far to unroll the loop
-       before checking for overflow.  */
-    if (++s < send) {
-      int digit = *s - '0';
-      if (digit >= 0 && digit <= 9) {
-        value = value * 10 + digit;
-        if (++s < send) {
-          digit = *s - '0';
-          if (digit >= 0 && digit <= 9) {
-            value = value * 10 + digit;
-            if (++s < send) {
-              digit = *s - '0';
-              if (digit >= 0 && digit <= 9) {
-                value = value * 10 + digit;
-		if (++s < send) {
-                  digit = *s - '0';
-                  if (digit >= 0 && digit <= 9) {
-                    value = value * 10 + digit;
-                    if (++s < send) {
-                      digit = *s - '0';
-                      if (digit >= 0 && digit <= 9) {
-                        value = value * 10 + digit;
-                        if (++s < send) {
-                          digit = *s - '0';
-                          if (digit >= 0 && digit <= 9) {
-                            value = value * 10 + digit;
-                            if (++s < send) {
-                              digit = *s - '0';
-                              if (digit >= 0 && digit <= 9) {
-                                value = value * 10 + digit;
-                                if (++s < send) {
-                                  digit = *s - '0';
-                                  if (digit >= 0 && digit <= 9) {
-                                    value = value * 10 + digit;
-                                    if (++s < send) {
-                                      /* Now got 9 digits, so need to check
-                                         each time for overflow.  */
-                                      digit = *s - '0';
-                                      while (digit >= 0 && digit <= 9
-                                             && (value < max_div_10
-                                                 || (value == max_div_10
-                                                     && digit <= max_mod_10))) {
-                                        value = value * 10 + digit;
-                                        if (++s < send)
-                                          digit = *s - '0';
-                                        else
-                                          break;
-                                      }
-                                      if (digit >= 0 && digit <= 9
-                                          && (s < send)) {
-                                        /* value overflowed.
-                                           skip the remaining digits, don't
-                                           worry about setting *valuep.  */
-                                        do {
-                                          s++;
-                                        } while (s < send && isDIGIT(*s));
-                                        numtype |=
-                                          IS_NUMBER_GREATER_THAN_UV_MAX;
-                                        goto skip_value;
-                                      }
-                                    }
-                                  }
-				}
-                              }
-                            }
-                          }
-                        }
-                      }
-                    }
-                  }
-                }
-              }
-            }
-          }
-	}
-      }
-    }
-    numtype |= IS_NUMBER_IN_UV;
-    if (valuep)
-      *valuep = value;
-
-  skip_value:
-    if (GROK_NUMERIC_RADIX(&s, send)) {
-      numtype |= IS_NUMBER_NOT_INT;
-      while (s < send && isDIGIT(*s))  /* optional digits after the radix */
-        s++;
-    }
-  }
-  else if (GROK_NUMERIC_RADIX(&s, send)) {
-    numtype |= IS_NUMBER_NOT_INT | IS_NUMBER_IN_UV; /* valuep assigned below */
-    /* no digits before the radix means we need digits after it */
-    if (s < send && isDIGIT(*s)) {
-      do {
-        s++;
-      } while (s < send && isDIGIT(*s));
-      if (valuep) {
-        /* integer approximation is valid - it's 0.  */
-        *valuep = 0;
-      }
-    }
-    else
-      return 0;
-  } else if (*s == 'I' || *s == 'i') {
-    s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
-    s++; if (s == send || (*s != 'F' && *s != 'f')) return 0;
-    s++; if (s < send && (*s == 'I' || *s == 'i')) {
-      s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
-      s++; if (s == send || (*s != 'I' && *s != 'i')) return 0;
-      s++; if (s == send || (*s != 'T' && *s != 't')) return 0;
-      s++; if (s == send || (*s != 'Y' && *s != 'y')) return 0;
-      s++;
-    }
-    sawinf = 1;
-  } else if (*s == 'N' || *s == 'n') {
-    /* XXX TODO: There are signaling NaNs and quiet NaNs. */
-    s++; if (s == send || (*s != 'A' && *s != 'a')) return 0;
-    s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
-    s++;
-    sawnan = 1;
-  } else
-    return 0;
-
-  if (sawinf) {
-    numtype &= IS_NUMBER_NEG; /* Keep track of sign  */
-    numtype |= IS_NUMBER_INFINITY | IS_NUMBER_NOT_INT;
-  } else if (sawnan) {
-    numtype &= IS_NUMBER_NEG; /* Keep track of sign  */
-    numtype |= IS_NUMBER_NAN | IS_NUMBER_NOT_INT;
-  } else if (s < send) {
-    /* we can have an optional exponent part */
-    if (*s == 'e' || *s == 'E') {
-      /* The only flag we keep is sign.  Blow away any "it's UV"  */
-      numtype &= IS_NUMBER_NEG;
-      numtype |= IS_NUMBER_NOT_INT;
-      s++;
-      if (s < send && (*s == '-' || *s == '+'))
-        s++;
-      if (s < send && isDIGIT(*s)) {
-        do {
-          s++;
-        } while (s < send && isDIGIT(*s));
-      }
-      else
-      return 0;
-    }
-  }
-  while (s < send && isSPACE(*s))
-    s++;
-  if (s >= send)
-    return numtype;
-  if (len == 10 && memEQ(pv, "0 but true", 10)) {
-    if (valuep)
-      *valuep = 0;
-    return IS_NUMBER_IN_UV;
-  }
-  return 0;
-}
-#endif
-#endif
-
-/*
- * The grok_* routines have been modified to use warn() instead of
- * Perl_warner(). Also, 'hexdigit' was the former name of PL_hexdigit,
- * which is why the stack variable has been renamed to 'xdigit'.
- */
-
-#ifndef grok_bin
-#if defined(NEED_grok_bin)
-static UV DPPP_(my_grok_bin)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
-static
-#else
-extern UV DPPP_(my_grok_bin)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
-#endif
-
-#ifdef grok_bin
-#  undef grok_bin
-#endif
-#define grok_bin(a,b,c,d) DPPP_(my_grok_bin)(aTHX_ a,b,c,d)
-#define Perl_grok_bin DPPP_(my_grok_bin)
-
-#if defined(NEED_grok_bin) || defined(NEED_grok_bin_GLOBAL)
-UV
-DPPP_(my_grok_bin)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result)
-{
-    const char *s = start;
-    STRLEN len = *len_p;
-    UV value = 0;
-    NV value_nv = 0;
-
-    const UV max_div_2 = UV_MAX / 2;
-    bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
-    bool overflowed = FALSE;
-
-    if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) {
-        /* strip off leading b or 0b.
-           for compatibility silently suffer "b" and "0b" as valid binary
-           numbers. */
-        if (len >= 1) {
-            if (s[0] == 'b') {
-                s++;
-                len--;
-            }
-            else if (len >= 2 && s[0] == '0' && s[1] == 'b') {
-                s+=2;
-                len-=2;
-            }
-        }
-    }
-
-    for (; len-- && *s; s++) {
-        char bit = *s;
-        if (bit == '0' || bit == '1') {
-            /* Write it in this wonky order with a goto to attempt to get the
-               compiler to make the common case integer-only loop pretty tight.
-               With gcc seems to be much straighter code than old scan_bin.  */
-          redo:
-            if (!overflowed) {
-                if (value <= max_div_2) {
-                    value = (value << 1) | (bit - '0');
-                    continue;
-                }
-                /* Bah. We're just overflowed.  */
-                warn("Integer overflow in binary number");
-                overflowed = TRUE;
-                value_nv = (NV) value;
-            }
-            value_nv *= 2.0;
-	    /* If an NV has not enough bits in its mantissa to
-	     * represent a UV this summing of small low-order numbers
-	     * is a waste of time (because the NV cannot preserve
-	     * the low-order bits anyway): we could just remember when
-	     * did we overflow and in the end just multiply value_nv by the
-	     * right amount. */
-            value_nv += (NV)(bit - '0');
-            continue;
-        }
-        if (bit == '_' && len && allow_underscores && (bit = s[1])
-            && (bit == '0' || bit == '1'))
-	    {
-		--len;
-		++s;
-                goto redo;
-	    }
-        if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
-            warn("Illegal binary digit '%c' ignored", *s);
-        break;
-    }
-
-    if (   ( overflowed && value_nv > 4294967295.0)
-#if UVSIZE > 4
-	|| (!overflowed && value > 0xffffffff  )
-#endif
-	) {
-	warn("Binary number > 0b11111111111111111111111111111111 non-portable");
-    }
-    *len_p = s - start;
-    if (!overflowed) {
-        *flags = 0;
-        return value;
-    }
-    *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
-    if (result)
-        *result = value_nv;
-    return UV_MAX;
-}
-#endif
-#endif
-
-#ifndef grok_hex
-#if defined(NEED_grok_hex)
-static UV DPPP_(my_grok_hex)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
-static
-#else
-extern UV DPPP_(my_grok_hex)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
-#endif
-
-#ifdef grok_hex
-#  undef grok_hex
-#endif
-#define grok_hex(a,b,c,d) DPPP_(my_grok_hex)(aTHX_ a,b,c,d)
-#define Perl_grok_hex DPPP_(my_grok_hex)
-
-#if defined(NEED_grok_hex) || defined(NEED_grok_hex_GLOBAL)
-UV
-DPPP_(my_grok_hex)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result)
-{
-    const char *s = start;
-    STRLEN len = *len_p;
-    UV value = 0;
-    NV value_nv = 0;
-
-    const UV max_div_16 = UV_MAX / 16;
-    bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
-    bool overflowed = FALSE;
-    const char *xdigit;
-
-    if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) {
-        /* strip off leading x or 0x.
-           for compatibility silently suffer "x" and "0x" as valid hex numbers.
-        */
-        if (len >= 1) {
-            if (s[0] == 'x') {
-                s++;
-                len--;
-            }
-            else if (len >= 2 && s[0] == '0' && s[1] == 'x') {
-                s+=2;
-                len-=2;
-            }
-        }
-    }
-
-    for (; len-- && *s; s++) {
-	xdigit = strchr((char *) PL_hexdigit, *s);
-        if (xdigit) {
-            /* Write it in this wonky order with a goto to attempt to get the
-               compiler to make the common case integer-only loop pretty tight.
-               With gcc seems to be much straighter code than old scan_hex.  */
-          redo:
-            if (!overflowed) {
-                if (value <= max_div_16) {
-                    value = (value << 4) | ((xdigit - PL_hexdigit) & 15);
-                    continue;
-                }
-                warn("Integer overflow in hexadecimal number");
-                overflowed = TRUE;
-                value_nv = (NV) value;
-            }
-            value_nv *= 16.0;
-	    /* If an NV has not enough bits in its mantissa to
-	     * represent a UV this summing of small low-order numbers
-	     * is a waste of time (because the NV cannot preserve
-	     * the low-order bits anyway): we could just remember when
-	     * did we overflow and in the end just multiply value_nv by the
-	     * right amount of 16-tuples. */
-            value_nv += (NV)((xdigit - PL_hexdigit) & 15);
-            continue;
-        }
-        if (*s == '_' && len && allow_underscores && s[1]
-		&& (xdigit = strchr((char *) PL_hexdigit, s[1])))
-	    {
-		--len;
-		++s;
-                goto redo;
-	    }
-        if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
-            warn("Illegal hexadecimal digit '%c' ignored", *s);
-        break;
-    }
-
-    if (   ( overflowed && value_nv > 4294967295.0)
-#if UVSIZE > 4
-	|| (!overflowed && value > 0xffffffff  )
-#endif
-	) {
-	warn("Hexadecimal number > 0xffffffff non-portable");
-    }
-    *len_p = s - start;
-    if (!overflowed) {
-        *flags = 0;
-        return value;
-    }
-    *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
-    if (result)
-        *result = value_nv;
-    return UV_MAX;
-}
-#endif
-#endif
-
-#ifndef grok_oct
-#if defined(NEED_grok_oct)
-static UV DPPP_(my_grok_oct)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
-static
-#else
-extern UV DPPP_(my_grok_oct)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
-#endif
-
-#ifdef grok_oct
-#  undef grok_oct
-#endif
-#define grok_oct(a,b,c,d) DPPP_(my_grok_oct)(aTHX_ a,b,c,d)
-#define Perl_grok_oct DPPP_(my_grok_oct)
-
-#if defined(NEED_grok_oct) || defined(NEED_grok_oct_GLOBAL)
-UV
-DPPP_(my_grok_oct)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result)
-{
-    const char *s = start;
-    STRLEN len = *len_p;
-    UV value = 0;
-    NV value_nv = 0;
-
-    const UV max_div_8 = UV_MAX / 8;
-    bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
-    bool overflowed = FALSE;
-
-    for (; len-- && *s; s++) {
-         /* gcc 2.95 optimiser not smart enough to figure that this subtraction
-            out front allows slicker code.  */
-        int digit = *s - '0';
-        if (digit >= 0 && digit <= 7) {
-            /* Write it in this wonky order with a goto to attempt to get the
-               compiler to make the common case integer-only loop pretty tight.
-            */
-          redo:
-            if (!overflowed) {
-                if (value <= max_div_8) {
-                    value = (value << 3) | digit;
-                    continue;
-                }
-                /* Bah. We're just overflowed.  */
-                warn("Integer overflow in octal number");
-                overflowed = TRUE;
-                value_nv = (NV) value;
-            }
-            value_nv *= 8.0;
-	    /* If an NV has not enough bits in its mantissa to
-	     * represent a UV this summing of small low-order numbers
-	     * is a waste of time (because the NV cannot preserve
-	     * the low-order bits anyway): we could just remember when
-	     * did we overflow and in the end just multiply value_nv by the
-	     * right amount of 8-tuples. */
-            value_nv += (NV)digit;
-            continue;
-        }
-        if (digit == ('_' - '0') && len && allow_underscores
-            && (digit = s[1] - '0') && (digit >= 0 && digit <= 7))
-	    {
-		--len;
-		++s;
-                goto redo;
-	    }
-        /* Allow \octal to work the DWIM way (that is, stop scanning
-         * as soon as non-octal characters are seen, complain only iff
-         * someone seems to want to use the digits eight and nine). */
-        if (digit == 8 || digit == 9) {
-            if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
-                warn("Illegal octal digit '%c' ignored", *s);
-        }
-        break;
-    }
-
-    if (   ( overflowed && value_nv > 4294967295.0)
-#if UVSIZE > 4
-	|| (!overflowed && value > 0xffffffff  )
-#endif
-	) {
-	warn("Octal number > 037777777777 non-portable");
-    }
-    *len_p = s - start;
-    if (!overflowed) {
-        *flags = 0;
-        return value;
-    }
-    *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
-    if (result)
-        *result = value_nv;
-    return UV_MAX;
-}
-#endif
-#endif
-
-#ifdef NO_XSLOCKS
-#  ifdef dJMPENV
-#    define dXCPT             dJMPENV; int rEtV = 0
-#    define XCPT_TRY_START    JMPENV_PUSH(rEtV); if (rEtV == 0)
-#    define XCPT_TRY_END      JMPENV_POP;
-#    define XCPT_CATCH        if (rEtV != 0)
-#    define XCPT_RETHROW      JMPENV_JUMP(rEtV)
-#  else
-#    define dXCPT             Sigjmp_buf oldTOP; int rEtV = 0
-#    define XCPT_TRY_START    Copy(top_env, oldTOP, 1, Sigjmp_buf); rEtV = Sigsetjmp(top_env, 1); if (rEtV == 0)
-#    define XCPT_TRY_END      Copy(oldTOP, top_env, 1, Sigjmp_buf);
-#    define XCPT_CATCH        if (rEtV != 0)
-#    define XCPT_RETHROW      Siglongjmp(top_env, rEtV)
-#  endif
-#endif
-
-#endif /* _P_P_PORTABILITY_H_ */
-
-/* End of File ppport.h */
+#if 0
+<<'SKIP';
+#endif
+/*
+----------------------------------------------------------------------
+
+    newppp.h -- Perl/Pollution/Portability Version 3.20
+
+    Automatically created by Devel::PPPort running under perl 5.016003.
+
+    Do NOT edit this file directly! -- Edit PPPort_pm.PL and the
+    includes in parts/inc/ instead.
+
+    Use 'perldoc newppp.h' to view the documentation below.
+
+----------------------------------------------------------------------
+
+SKIP
+
+=pod
+
+=head1 NAME
+
+newppp.h - Perl/Pollution/Portability version 3.20
+
+=head1 SYNOPSIS
+
+  perl newppp.h [options] [source files]
+
+  Searches current directory for files if no [source files] are given
+
+  --help                      show short help
+
+  --version                   show version
+
+  --patch=file                write one patch file with changes
+  --copy=suffix               write changed copies with suffix
+  --diff=program              use diff program and options
+
+  --compat-version=version    provide compatibility with Perl version
+  --cplusplus                 accept C++ comments
+
+  --quiet                     don't output anything except fatal errors
+  --nodiag                    don't show diagnostics
+  --nohints                   don't show hints
+  --nochanges                 don't suggest changes
+  --nofilter                  don't filter input files
+
+  --strip                     strip all script and doc functionality from
+                              newppp.h
+
+  --list-provided             list provided API
+  --list-unsupported          list unsupported API
+  --api-info=name             show Perl API portability information
+
+=head1 COMPATIBILITY
+
+This version of F<newppp.h> is designed to support operation with Perl
+installations back to 5.003, and has been tested up to 5.11.5.
+
+=head1 OPTIONS
+
+=head2 --help
+
+Display a brief usage summary.
+
+=head2 --version
+
+Display the version of F<newppp.h>.
+
+=head2 --patch=I<file>
+
+If this option is given, a single patch file will be created if
+any changes are suggested. This requires a working diff program
+to be installed on your system.
+
+=head2 --copy=I<suffix>
+
+If this option is given, a copy of each file will be saved with
+the given suffix that contains the suggested changes. This does
+not require any external programs. Note that this does not
+automagially add a dot between the original filename and the
+suffix. If you want the dot, you have to include it in the option
+argument.
+
+If neither C<--patch> or C<--copy> are given, the default is to
+simply print the diffs for each file. This requires either
+C<Text::Diff> or a C<diff> program to be installed.
+
+=head2 --diff=I<program>
+
+Manually set the diff program and options to use. The default
+is to use C<Text::Diff>, when installed, and output unified
+context diffs.
+
+=head2 --compat-version=I<version>
+
+Tell F<newppp.h> to check for compatibility with the given
+Perl version. The default is to check for compatibility with Perl
+version 5.003. You can use this option to reduce the output
+of F<newppp.h> if you intend to be backward compatible only
+down to a certain Perl version.
+
+=head2 --cplusplus
+
+Usually, F<newppp.h> will detect C++ style comments and
+replace them with C style comments for portability reasons.
+Using this option instructs F<newppp.h> to leave C++
+comments untouched.
+
+=head2 --quiet
+
+Be quiet. Don't print anything except fatal errors.
+
+=head2 --nodiag
+
+Don't output any diagnostic messages. Only portability
+alerts will be printed.
+
+=head2 --nohints
+
+Don't output any hints. Hints often contain useful portability
+notes. Warnings will still be displayed.
+
+=head2 --nochanges
+
+Don't suggest any changes. Only give diagnostic output and hints
+unless these are also deactivated.
+
+=head2 --nofilter
+
+Don't filter the list of input files. By default, files not looking
+like source code (i.e. not *.xs, *.c, *.cc, *.cpp or *.h) are skipped.
+
+=head2 --strip
+
+Strip all script and documentation functionality from F<newppp.h>.
+This reduces the size of F<newppp.h> dramatically and may be useful
+if you want to include F<newppp.h> in smaller modules without
+increasing their distribution size too much.
+
+The stripped F<newppp.h> will have a C<--unstrip> option that allows
+you to undo the stripping, but only if an appropriate C<Devel::PPPort>
+module is installed.
+
+=head2 --list-provided
+
+Lists the API elements for which compatibility is provided by
+F<newppp.h>. Also lists if it must be explicitly requested,
+if it has dependencies, and if there are hints or warnings for it.
+
+=head2 --list-unsupported
+
+Lists the API elements that are known not to be supported by
+F<newppp.h> and below which version of Perl they probably
+won't be available or work.
+
+=head2 --api-info=I<name>
+
+Show portability information for API elements matching I<name>.
+If I<name> is surrounded by slashes, it is interpreted as a regular
+expression.
+
+=head1 DESCRIPTION
+
+In order for a Perl extension (XS) module to be as portable as possible
+across differing versions of Perl itself, certain steps need to be taken.
+
+=over 4
+
+=item *
+
+Including this header is the first major one. This alone will give you
+access to a large part of the Perl API that hasn't been available in
+earlier Perl releases. Use
+
+    perl newppp.h --list-provided
+
+to see which API elements are provided by newppp.h.
+
+=item *
+
+You should avoid using deprecated parts of the API. For example, using
+global Perl variables without the C<PL_> prefix is deprecated. Also,
+some API functions used to have a C<perl_> prefix. Using this form is
+also deprecated. You can safely use the supported API, as F<newppp.h>
+will provide wrappers for older Perl versions.
+
+=item *
+
+If you use one of a few functions or variables that were not present in
+earlier versions of Perl, and that can't be provided using a macro, you
+have to explicitly request support for these functions by adding one or
+more C<#define>s in your source code before the inclusion of F<newppp.h>.
+
+These functions or variables will be marked C<explicit> in the list shown
+by C<--list-provided>.
+
+Depending on whether you module has a single or multiple files that
+use such functions or variables, you want either C<static> or global
+variants.
+
+For a C<static> function or variable (used only in a single source
+file), use:
+
+    #define NEED_function
+    #define NEED_variable
+
+For a global function or variable (used in multiple source files),
+use:
+
+    #define NEED_function_GLOBAL
+    #define NEED_variable_GLOBAL
+
+Note that you mustn't have more than one global request for the
+same function or variable in your project.
+
+    Function / Variable       Static Request               Global Request
+    -----------------------------------------------------------------------------------------
+    PL_parser                 NEED_PL_parser               NEED_PL_parser_GLOBAL
+    PL_signals                NEED_PL_signals              NEED_PL_signals_GLOBAL
+    eval_pv()                 NEED_eval_pv                 NEED_eval_pv_GLOBAL
+    grok_bin()                NEED_grok_bin                NEED_grok_bin_GLOBAL
+    grok_hex()                NEED_grok_hex                NEED_grok_hex_GLOBAL
+    grok_number()             NEED_grok_number             NEED_grok_number_GLOBAL
+    grok_numeric_radix()      NEED_grok_numeric_radix      NEED_grok_numeric_radix_GLOBAL
+    grok_oct()                NEED_grok_oct                NEED_grok_oct_GLOBAL
+    load_module()             NEED_load_module             NEED_load_module_GLOBAL
+    my_snprintf()             NEED_my_snprintf             NEED_my_snprintf_GLOBAL
+    my_sprintf()              NEED_my_sprintf              NEED_my_sprintf_GLOBAL
+    my_strlcat()              NEED_my_strlcat              NEED_my_strlcat_GLOBAL
+    my_strlcpy()              NEED_my_strlcpy              NEED_my_strlcpy_GLOBAL
+    newCONSTSUB()             NEED_newCONSTSUB             NEED_newCONSTSUB_GLOBAL
+    newRV_noinc()             NEED_newRV_noinc             NEED_newRV_noinc_GLOBAL
+    newSV_type()              NEED_newSV_type              NEED_newSV_type_GLOBAL
+    newSVpvn_flags()          NEED_newSVpvn_flags          NEED_newSVpvn_flags_GLOBAL
+    newSVpvn_share()          NEED_newSVpvn_share          NEED_newSVpvn_share_GLOBAL
+    pv_display()              NEED_pv_display              NEED_pv_display_GLOBAL
+    pv_escape()               NEED_pv_escape               NEED_pv_escape_GLOBAL
+    pv_pretty()               NEED_pv_pretty               NEED_pv_pretty_GLOBAL
+    sv_2pv_flags()            NEED_sv_2pv_flags            NEED_sv_2pv_flags_GLOBAL
+    sv_2pvbyte()              NEED_sv_2pvbyte              NEED_sv_2pvbyte_GLOBAL
+    sv_catpvf_mg()            NEED_sv_catpvf_mg            NEED_sv_catpvf_mg_GLOBAL
+    sv_catpvf_mg_nocontext()  NEED_sv_catpvf_mg_nocontext  NEED_sv_catpvf_mg_nocontext_GLOBAL
+    sv_pvn_force_flags()      NEED_sv_pvn_force_flags      NEED_sv_pvn_force_flags_GLOBAL
+    sv_setpvf_mg()            NEED_sv_setpvf_mg            NEED_sv_setpvf_mg_GLOBAL
+    sv_setpvf_mg_nocontext()  NEED_sv_setpvf_mg_nocontext  NEED_sv_setpvf_mg_nocontext_GLOBAL
+    vload_module()            NEED_vload_module            NEED_vload_module_GLOBAL
+    vnewSVpvf()               NEED_vnewSVpvf               NEED_vnewSVpvf_GLOBAL
+    warner()                  NEED_warner                  NEED_warner_GLOBAL
+
+To avoid namespace conflicts, you can change the namespace of the
+explicitly exported functions / variables using the C<DPPP_NAMESPACE>
+macro. Just C<#define> the macro before including C<newppp.h>:
+
+    #define DPPP_NAMESPACE MyOwnNamespace_
+    #include "newppp.h"
+
+The default namespace is C<DPPP_>.
+
+=back
+
+The good thing is that most of the above can be checked by running
+F<newppp.h> on your source code. See the next section for
+details.
+
+=head1 EXAMPLES
+
+To verify whether F<newppp.h> is needed for your module, whether you
+should make any changes to your code, and whether any special defines
+should be used, F<newppp.h> can be run as a Perl script to check your
+source code. Simply say:
+
+    perl newppp.h
+
+The result will usually be a list of patches suggesting changes
+that should at least be acceptable, if not necessarily the most
+efficient solution, or a fix for all possible problems.
+
+If you know that your XS module uses features only available in
+newer Perl releases, if you're aware that it uses C++ comments,
+and if you want all suggestions as a single patch file, you could
+use something like this:
+
+    perl newppp.h --compat-version=5.6.0 --cplusplus --patch=test.diff
+
+If you only want your code to be scanned without any suggestions
+for changes, use:
+
+    perl newppp.h --nochanges
+
+You can specify a different C<diff> program or options, using
+the C<--diff> option:
+
+    perl newppp.h --diff='diff -C 10'
+
+This would output context diffs with 10 lines of context.
+
+If you want to create patched copies of your files instead, use:
+
+    perl newppp.h --copy=.new
+
+To display portability information for the C<newSVpvn> function,
+use:
+
+    perl newppp.h --api-info=newSVpvn
+
+Since the argument to C<--api-info> can be a regular expression,
+you can use
+
+    perl newppp.h --api-info=/_nomg$/
+
+to display portability information for all C<_nomg> functions or
+
+    perl newppp.h --api-info=/./
+
+to display information for all known API elements.
+
+=head1 BUGS
+
+If this version of F<newppp.h> is causing failure during
+the compilation of this module, please check if newer versions
+of either this module or C<Devel::PPPort> are available on CPAN
+before sending a bug report.
+
+If F<newppp.h> was generated using the latest version of
+C<Devel::PPPort> and is causing failure of this module, please
+file a bug report using the CPAN Request Tracker at L<http://rt.cpan.org/>.
+
+Please include the following information:
+
+=over 4
+
+=item 1.
+
+The complete output from running "perl -V"
+
+=item 2.
+
+This file.
+
+=item 3.
+
+The name and version of the module you were trying to build.
+
+=item 4.
+
+A full log of the build that failed.
+
+=item 5.
+
+Any other information that you think could be relevant.
+
+=back
+
+For the latest version of this code, please get the C<Devel::PPPort>
+module from CPAN.
+
+=head1 COPYRIGHT
+
+Version 3.x, Copyright (c) 2004-2010, Marcus Holland-Moritz.
+
+Version 2.x, Copyright (C) 2001, Paul Marquess.
+
+Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+See L<Devel::PPPort>.
+
+=cut
+
+use strict;
+
+# Disable broken TRIE-optimization
+BEGIN { eval '${^RE_TRIE_MAXBUF} = -1' if $] >= 5.009004 && $] <= 5.009005 }
+
+my $VERSION = 3.20;
+
+my %opt = (
+  quiet     => 0,
+  diag      => 1,
+  hints     => 1,
+  changes   => 1,
+  cplusplus => 0,
+  filter    => 1,
+  strip     => 0,
+  version   => 0,
+);
+
+my($ppport) = $0 =~ /([\w.]+)$/;
+my $LF = '(?:\r\n|[\r\n])';   # line feed
+my $HS = "[ \t]";             # horizontal whitespace
+
+# Never use C comments in this file!
+my $ccs  = '/'.'*';
+my $cce  = '*'.'/';
+my $rccs = quotemeta $ccs;
+my $rcce = quotemeta $cce;
+
+eval {
+  require Getopt::Long;
+  Getopt::Long::GetOptions(\%opt, qw(
+    help quiet diag! filter! hints! changes! cplusplus strip version
+    patch=s copy=s diff=s compat-version=s
+    list-provided list-unsupported api-info=s
+  )) or usage();
+};
+
+if ($@ and grep /^-/, @ARGV) {
+  usage() if "@ARGV" =~ /^--?h(?:elp)?$/;
+  die "Getopt::Long not found. Please don't use any options.\n";
+}
+
+if ($opt{version}) {
+  print "This is $0 $VERSION.\n";
+  exit 0;
+}
+
+usage() if $opt{help};
+strip() if $opt{strip};
+
+if (exists $opt{'compat-version'}) {
+  my($r,$v,$s) = eval { parse_version($opt{'compat-version'}) };
+  if ($@) {
+    die "Invalid version number format: '$opt{'compat-version'}'\n";
+  }
+  die "Only Perl 5 is supported\n" if $r != 5;
+  die "Invalid version number: $opt{'compat-version'}\n" if $v >= 1000 || $s >= 1000;
+  $opt{'compat-version'} = sprintf "%d.%03d%03d", $r, $v, $s;
+}
+else {
+  $opt{'compat-version'} = 5;
+}
+
+my %API = map { /^(\w+)\|([^|]*)\|([^|]*)\|(\w*)$/
+                ? ( $1 => {
+                      ($2                  ? ( base     => $2 ) : ()),
+                      ($3                  ? ( todo     => $3 ) : ()),
+                      (index($4, 'v') >= 0 ? ( varargs  => 1  ) : ()),
+                      (index($4, 'p') >= 0 ? ( provided => 1  ) : ()),
+                      (index($4, 'n') >= 0 ? ( nothxarg => 1  ) : ()),
+                    } )
+                : die "invalid spec: $_" } qw(
+AvFILLp|5.004050||p
+AvFILL|||
+BhkDISABLE||5.014000|
+BhkENABLE||5.014000|
+BhkENTRY_set||5.014000|
+BhkENTRY|||
+BhkFLAGS|||
+CALL_BLOCK_HOOKS|||
+CLASS|||n
+CPERLscope|5.005000||p
+CX_CURPAD_SAVE|||
+CX_CURPAD_SV|||
+CopFILEAV|5.006000||p
+CopFILEGV_set|5.006000||p
+CopFILEGV|5.006000||p
+CopFILESV|5.006000||p
+CopFILE_set|5.006000||p
+CopFILE|5.006000||p
+CopSTASHPV_set|5.006000||p
+CopSTASHPV|5.006000||p
+CopSTASH_eq|5.006000||p
+CopSTASH_set|5.006000||p
+CopSTASH|5.006000||p
+CopyD|5.009002||p
+Copy|||
+CvPADLIST|||
+CvSTASH|||
+CvWEAKOUTSIDE|||
+DEFSV_set|5.010001||p
+DEFSV|5.004050||p
+END_EXTERN_C|5.005000||p
+ENTER|||
+ERRSV|5.004050||p
+EXTEND|||
+EXTERN_C|5.005000||p
+F0convert|||n
+FREETMPS|||
+GIMME_V||5.004000|n
+GIMME|||n
+GROK_NUMERIC_RADIX|5.007002||p
+G_ARRAY|||
+G_DISCARD|||
+G_EVAL|||
+G_METHOD|5.006001||p
+G_NOARGS|||
+G_SCALAR|||
+G_VOID||5.004000|
+GetVars|||
+GvSVn|5.009003||p
+GvSV|||
+Gv_AMupdate||5.011000|
+HEf_SVKEY||5.004000|
+HeHASH||5.004000|
+HeKEY||5.004000|
+HeKLEN||5.004000|
+HePV||5.004000|
+HeSVKEY_force||5.004000|
+HeSVKEY_set||5.004000|
+HeSVKEY||5.004000|
+HeUTF8||5.010001|
+HeVAL||5.004000|
+HvENAME||5.013007|
+HvNAMELEN_get|5.009003||p
+HvNAME_get|5.009003||p
+HvNAME|||
+INT2PTR|5.006000||p
+IN_LOCALE_COMPILETIME|5.007002||p
+IN_LOCALE_RUNTIME|5.007002||p
+IN_LOCALE|5.007002||p
+IN_PERL_COMPILETIME|5.008001||p
+IS_NUMBER_GREATER_THAN_UV_MAX|5.007002||p
+IS_NUMBER_INFINITY|5.007002||p
+IS_NUMBER_IN_UV|5.007002||p
+IS_NUMBER_NAN|5.007003||p
+IS_NUMBER_NEG|5.007002||p
+IS_NUMBER_NOT_INT|5.007002||p
+IVSIZE|5.006000||p
+IVTYPE|5.006000||p
+IVdf|5.006000||p
+LEAVE|||
+LINKLIST||5.013006|
+LVRET|||
+MARK|||
+MULTICALL||5.014000|
+MY_CXT_CLONE|5.009002||p
+MY_CXT_INIT|5.007003||p
+MY_CXT|5.007003||p
+MoveD|5.009002||p
+Move|||
+NOOP|5.005000||p
+NUM2PTR|5.006000||p
+NVTYPE|5.006000||p
+NVef|5.006001||p
+NVff|5.006001||p
+NVgf|5.006001||p
+Newxc|5.009003||p
+Newxz|5.009003||p
+Newx|5.009003||p
+Nullav|||
+Nullch|||
+Nullcv|||
+Nullhv|||
+Nullsv|||
+OP_CLASS||5.013007|
+OP_DESC||5.007003|
+OP_NAME||5.007003|
+ORIGMARK|||
+PAD_BASE_SV|||
+PAD_CLONE_VARS|||
+PAD_COMPNAME_FLAGS|||
+PAD_COMPNAME_GEN_set|||
+PAD_COMPNAME_GEN|||
+PAD_COMPNAME_OURSTASH|||
+PAD_COMPNAME_PV|||
+PAD_COMPNAME_TYPE|||
+PAD_DUP|||
+PAD_RESTORE_LOCAL|||
+PAD_SAVE_LOCAL|||
+PAD_SAVE_SETNULLPAD|||
+PAD_SETSV|||
+PAD_SET_CUR_NOSAVE|||
+PAD_SET_CUR|||
+PAD_SVl|||
+PAD_SV|||
+PERLIO_FUNCS_CAST|5.009003||p
+PERLIO_FUNCS_DECL|5.009003||p
+PERL_ABS|5.008001||p
+PERL_BCDVERSION|5.014000||p
+PERL_GCC_BRACE_GROUPS_FORBIDDEN|5.008001||p
+PERL_HASH|5.004000||p
+PERL_INT_MAX|5.004000||p
+PERL_INT_MIN|5.004000||p
+PERL_LONG_MAX|5.004000||p
+PERL_LONG_MIN|5.004000||p
+PERL_MAGIC_arylen|5.007002||p
+PERL_MAGIC_backref|5.007002||p
+PERL_MAGIC_bm|5.007002||p
+PERL_MAGIC_collxfrm|5.007002||p
+PERL_MAGIC_dbfile|5.007002||p
+PERL_MAGIC_dbline|5.007002||p
+PERL_MAGIC_defelem|5.007002||p
+PERL_MAGIC_envelem|5.007002||p
+PERL_MAGIC_env|5.007002||p
+PERL_MAGIC_ext|5.007002||p
+PERL_MAGIC_fm|5.007002||p
+PERL_MAGIC_glob|5.014000||p
+PERL_MAGIC_isaelem|5.007002||p
+PERL_MAGIC_isa|5.007002||p
+PERL_MAGIC_mutex|5.014000||p
+PERL_MAGIC_nkeys|5.007002||p
+PERL_MAGIC_overload_elem|5.007002||p
+PERL_MAGIC_overload_table|5.007002||p
+PERL_MAGIC_overload|5.007002||p
+PERL_MAGIC_pos|5.007002||p
+PERL_MAGIC_qr|5.007002||p
+PERL_MAGIC_regdata|5.007002||p
+PERL_MAGIC_regdatum|5.007002||p
+PERL_MAGIC_regex_global|5.007002||p
+PERL_MAGIC_shared_scalar|5.007003||p
+PERL_MAGIC_shared|5.007003||p
+PERL_MAGIC_sigelem|5.007002||p
+PERL_MAGIC_sig|5.007002||p
+PERL_MAGIC_substr|5.007002||p
+PERL_MAGIC_sv|5.007002||p
+PERL_MAGIC_taint|5.007002||p
+PERL_MAGIC_tiedelem|5.007002||p
+PERL_MAGIC_tiedscalar|5.007002||p
+PERL_MAGIC_tied|5.007002||p
+PERL_MAGIC_utf8|5.008001||p
+PERL_MAGIC_uvar_elem|5.007003||p
+PERL_MAGIC_uvar|5.007002||p
+PERL_MAGIC_vec|5.007002||p
+PERL_MAGIC_vstring|5.008001||p
+PERL_PV_ESCAPE_ALL|5.009004||p
+PERL_PV_ESCAPE_FIRSTCHAR|5.009004||p
+PERL_PV_ESCAPE_NOBACKSLASH|5.009004||p
+PERL_PV_ESCAPE_NOCLEAR|5.009004||p
+PERL_PV_ESCAPE_QUOTE|5.009004||p
+PERL_PV_ESCAPE_RE|5.009005||p
+PERL_PV_ESCAPE_UNI_DETECT|5.009004||p
+PERL_PV_ESCAPE_UNI|5.009004||p
+PERL_PV_PRETTY_DUMP|5.009004||p
+PERL_PV_PRETTY_ELLIPSES|5.010000||p
+PERL_PV_PRETTY_LTGT|5.009004||p
+PERL_PV_PRETTY_NOCLEAR|5.010000||p
+PERL_PV_PRETTY_QUOTE|5.009004||p
+PERL_PV_PRETTY_REGPROP|5.009004||p
+PERL_QUAD_MAX|5.004000||p
+PERL_QUAD_MIN|5.004000||p
+PERL_REVISION|5.006000||p
+PERL_SCAN_ALLOW_UNDERSCORES|5.007003||p
+PERL_SCAN_DISALLOW_PREFIX|5.007003||p
+PERL_SCAN_GREATER_THAN_UV_MAX|5.007003||p
+PERL_SCAN_SILENT_ILLDIGIT|5.008001||p
+PERL_SHORT_MAX|5.004000||p
+PERL_SHORT_MIN|5.004000||p
+PERL_SIGNALS_UNSAFE_FLAG|5.008001||p
+PERL_SUBVERSION|5.006000||p
+PERL_SYS_INIT3||5.006000|
+PERL_SYS_INIT|||
+PERL_SYS_TERM||5.014000|
+PERL_UCHAR_MAX|5.004000||p
+PERL_UCHAR_MIN|5.004000||p
+PERL_UINT_MAX|5.004000||p
+PERL_UINT_MIN|5.004000||p
+PERL_ULONG_MAX|5.004000||p
+PERL_ULONG_MIN|5.004000||p
+PERL_UNUSED_ARG|5.009003||p
+PERL_UNUSED_CONTEXT|5.009004||p
+PERL_UNUSED_DECL|5.007002||p
+PERL_UNUSED_VAR|5.007002||p
+PERL_UQUAD_MAX|5.004000||p
+PERL_UQUAD_MIN|5.004000||p
+PERL_USE_GCC_BRACE_GROUPS|5.009004||p
+PERL_USHORT_MAX|5.004000||p
+PERL_USHORT_MIN|5.004000||p
+PERL_VERSION|5.006000||p
+PL_DBsignal|5.005000||p
+PL_DBsingle|||pn
+PL_DBsub|||pn
+PL_DBtrace|||pn
+PL_Sv|5.005000||p
+PL_bufend|5.014000||p
+PL_bufptr|5.014000||p
+PL_compiling|5.004050||p
+PL_copline|5.014000||p
+PL_curcop|5.004050||p
+PL_curstash|5.004050||p
+PL_debstash|5.004050||p
+PL_defgv|5.004050||p
+PL_diehook|5.004050||p
+PL_dirty|5.004050||p
+PL_dowarn|||pn
+PL_errgv|5.004050||p
+PL_error_count|5.014000||p
+PL_expect|5.014000||p
+PL_hexdigit|5.005000||p
+PL_hints|5.005000||p
+PL_in_my_stash|5.014000||p
+PL_in_my|5.014000||p
+PL_keyword_plugin||5.011002|
+PL_last_in_gv|||n
+PL_laststatval|5.005000||p
+PL_lex_state|5.014000||p
+PL_lex_stuff|5.014000||p
+PL_linestr|5.014000||p
+PL_modglobal||5.005000|n
+PL_na|5.004050||pn
+PL_no_modify|5.006000||p
+PL_ofsgv|||n
+PL_opfreehook||5.011000|n
+PL_parser|5.009005|5.009005|p
+PL_peepp||5.007003|n
+PL_perl_destruct_level|5.004050||p
+PL_perldb|5.004050||p
+PL_ppaddr|5.006000||p
+PL_rpeepp||5.013005|n
+PL_rsfp_filters|5.014000||p
+PL_rsfp|5.014000||p
+PL_rs|||n
+PL_signals|5.008001||p
+PL_stack_base|5.004050||p
+PL_stack_sp|5.004050||p
+PL_statcache|5.005000||p
+PL_stdingv|5.004050||p
+PL_sv_arenaroot|5.004050||p
+PL_sv_no|5.004050||pn
+PL_sv_undef|5.004050||pn
+PL_sv_yes|5.004050||pn
+PL_tainted|5.004050||p
+PL_tainting|5.004050||p
+PL_tokenbuf|5.014000||p
+POP_MULTICALL||5.014000|
+POPi|||n
+POPl|||n
+POPn|||n
+POPpbytex||5.007001|n
+POPpx||5.005030|n
+POPp|||n
+POPs|||n
+PTR2IV|5.006000||p
+PTR2NV|5.006000||p
+PTR2UV|5.006000||p
+PTR2nat|5.009003||p
+PTR2ul|5.007001||p
+PTRV|5.006000||p
+PUSHMARK|||
+PUSH_MULTICALL||5.014000|
+PUSHi|||
+PUSHmortal|5.009002||p
+PUSHn|||
+PUSHp|||
+PUSHs|||
+PUSHu|5.004000||p
+PUTBACK|||
+PerlIO_clearerr||5.007003|
+PerlIO_close||5.007003|
+PerlIO_context_layers||5.009004|
+PerlIO_eof||5.007003|
+PerlIO_error||5.007003|
+PerlIO_fileno||5.007003|
+PerlIO_fill||5.007003|
+PerlIO_flush||5.007003|
+PerlIO_get_base||5.007003|
+PerlIO_get_bufsiz||5.007003|
+PerlIO_get_cnt||5.007003|
+PerlIO_get_ptr||5.007003|
+PerlIO_read||5.007003|
+PerlIO_seek||5.007003|
+PerlIO_set_cnt||5.007003|
+PerlIO_set_ptrcnt||5.007003|
+PerlIO_setlinebuf||5.007003|
+PerlIO_stderr||5.007003|
+PerlIO_stdin||5.007003|
+PerlIO_stdout||5.007003|
+PerlIO_tell||5.007003|
+PerlIO_unread||5.007003|
+PerlIO_write||5.007003|
+Perl_signbit||5.009005|n
+PoisonFree|5.009004||p
+PoisonNew|5.009004||p
+PoisonWith|5.009004||p
+Poison|5.008000||p
+RETVAL|||n
+Renewc|||
+Renew|||
+SAVECLEARSV|||
+SAVECOMPPAD|||
+SAVEPADSV|||
+SAVETMPS|||
+SAVE_DEFSV|5.004050||p
+SPAGAIN|||
+SP|||
+START_EXTERN_C|5.005000||p
+START_MY_CXT|5.007003||p
+STMT_END|||p
+STMT_START|||p
+STR_WITH_LEN|5.009003||p
+ST|||
+SV_CONST_RETURN|5.009003||p
+SV_COW_DROP_PV|5.008001||p
+SV_COW_SHARED_HASH_KEYS|5.009005||p
+SV_GMAGIC|5.007002||p
+SV_HAS_TRAILING_NUL|5.009004||p
+SV_IMMEDIATE_UNREF|5.007001||p
+SV_MUTABLE_RETURN|5.009003||p
+SV_NOSTEAL|5.009002||p
+SV_SMAGIC|5.009003||p
+SV_UTF8_NO_ENCODING|5.008001||p
+SVfARG|5.009005||p
+SVf_UTF8|5.006000||p
+SVf|5.006000||p
+SVt_IV|||
+SVt_NV|||
+SVt_PVAV|||
+SVt_PVCV|||
+SVt_PVHV|||
+SVt_PVMG|||
+SVt_PV|||
+Safefree|||
+Slab_Alloc|||
+Slab_Free|||
+Slab_to_rw|||
+StructCopy|||
+SvCUR_set|||
+SvCUR|||
+SvEND|||
+SvGAMAGIC||5.006001|
+SvGETMAGIC|5.004050||p
+SvGROW|||
+SvIOK_UV||5.006000|
+SvIOK_notUV||5.006000|
+SvIOK_off|||
+SvIOK_only_UV||5.006000|
+SvIOK_only|||
+SvIOK_on|||
+SvIOKp|||
+SvIOK|||
+SvIVX|||
+SvIV_nomg|5.009001||p
+SvIV_set|||
+SvIVx|||
+SvIV|||
+SvIsCOW_shared_hash||5.008003|
+SvIsCOW||5.008003|
+SvLEN_set|||
+SvLEN|||
+SvLOCK||5.007003|
+SvMAGIC_set|5.009003||p
+SvNIOK_off|||
+SvNIOKp|||
+SvNIOK|||
+SvNOK_off|||
+SvNOK_only|||
+SvNOK_on|||
+SvNOKp|||
+SvNOK|||
+SvNVX|||
+SvNV_nomg||5.013002|
+SvNV_set|||
+SvNVx|||
+SvNV|||
+SvOK|||
+SvOOK_offset||5.011000|
+SvOOK|||
+SvPOK_off|||
+SvPOK_only_UTF8||5.006000|
+SvPOK_only|||
+SvPOK_on|||
+SvPOKp|||
+SvPOK|||
+SvPVX_const|5.009003||p
+SvPVX_mutable|5.009003||p
+SvPVX|||
+SvPV_const|5.009003||p
+SvPV_flags_const_nolen|5.009003||p
+SvPV_flags_const|5.009003||p
+SvPV_flags_mutable|5.009003||p
+SvPV_flags|5.007002||p
+SvPV_force_flags_mutable|5.009003||p
+SvPV_force_flags_nolen|5.009003||p
+SvPV_force_flags|5.007002||p
+SvPV_force_mutable|5.009003||p
+SvPV_force_nolen|5.009003||p
+SvPV_force_nomg_nolen|5.009003||p
+SvPV_force_nomg|5.007002||p
+SvPV_force|||p
+SvPV_mutable|5.009003||p
+SvPV_nolen_const|5.009003||p
+SvPV_nolen|5.006000||p
+SvPV_nomg_const_nolen|5.009003||p
+SvPV_nomg_const|5.009003||p
+SvPV_nomg_nolen||5.013007|
+SvPV_nomg|5.007002||p
+SvPV_renew|5.009003||p
+SvPV_set|||
+SvPVbyte_force||5.009002|
+SvPVbyte_nolen||5.006000|
+SvPVbytex_force||5.006000|
+SvPVbytex||5.006000|
+SvPVbyte|5.006000||p
+SvPVutf8_force||5.006000|
+SvPVutf8_nolen||5.006000|
+SvPVutf8x_force||5.006000|
+SvPVutf8x||5.006000|
+SvPVutf8||5.006000|
+SvPVx|||
+SvPV|||
+SvREFCNT_dec|||
+SvREFCNT_inc_NN|5.009004||p
+SvREFCNT_inc_simple_NN|5.009004||p
+SvREFCNT_inc_simple_void_NN|5.009004||p
+SvREFCNT_inc_simple_void|5.009004||p
+SvREFCNT_inc_simple|5.009004||p
+SvREFCNT_inc_void_NN|5.009004||p
+SvREFCNT_inc_void|5.009004||p
+SvREFCNT_inc|||p
+SvREFCNT|||
+SvROK_off|||
+SvROK_on|||
+SvROK|||
+SvRV_set|5.009003||p
+SvRV|||
+SvRXOK||5.009005|
+SvRX||5.009005|
+SvSETMAGIC|||
+SvSHARED_HASH|5.009003||p
+SvSHARE||5.007003|
+SvSTASH_set|5.009003||p
+SvSTASH|||
+SvSetMagicSV_nosteal||5.004000|
+SvSetMagicSV||5.004000|
+SvSetSV_nosteal||5.004000|
+SvSetSV|||
+SvTAINTED_off||5.004000|
+SvTAINTED_on||5.004000|
+SvTAINTED||5.004000|
+SvTAINT|||
+SvTRUE_nomg||5.013006|
+SvTRUE|||
+SvTYPE|||
+SvUNLOCK||5.007003|
+SvUOK|5.007001|5.006000|p
+SvUPGRADE|||
+SvUTF8_off||5.006000|
+SvUTF8_on||5.006000|
+SvUTF8||5.006000|
+SvUVXx|5.004000||p
+SvUVX|5.004000||p
+SvUV_nomg|5.009001||p
+SvUV_set|5.009003||p
+SvUVx|5.004000||p
+SvUV|5.004000||p
+SvVOK||5.008001|
+SvVSTRING_mg|5.009004||p
+THIS|||n
+UNDERBAR|5.009002||p
+UTF8_MAXBYTES|5.009002||p
+UVSIZE|5.006000||p
+UVTYPE|5.006000||p
+UVXf|5.007001||p
+UVof|5.006000||p
+UVuf|5.006000||p
+UVxf|5.006000||p
+WARN_ALL|5.006000||p
+WARN_AMBIGUOUS|5.006000||p
+WARN_ASSERTIONS|5.014000||p
+WARN_BAREWORD|5.006000||p
+WARN_CLOSED|5.006000||p
+WARN_CLOSURE|5.006000||p
+WARN_DEBUGGING|5.006000||p
+WARN_DEPRECATED|5.006000||p
+WARN_DIGIT|5.006000||p
+WARN_EXEC|5.006000||p
+WARN_EXITING|5.006000||p
+WARN_GLOB|5.006000||p
+WARN_INPLACE|5.006000||p
+WARN_INTERNAL|5.006000||p
+WARN_IO|5.006000||p
+WARN_LAYER|5.008000||p
+WARN_MALLOC|5.006000||p
+WARN_MISC|5.006000||p
+WARN_NEWLINE|5.006000||p
+WARN_NUMERIC|5.006000||p
+WARN_ONCE|5.006000||p
+WARN_OVERFLOW|5.006000||p
+WARN_PACK|5.006000||p
+WARN_PARENTHESIS|5.006000||p
+WARN_PIPE|5.006000||p
+WARN_PORTABLE|5.006000||p
+WARN_PRECEDENCE|5.006000||p
+WARN_PRINTF|5.006000||p
+WARN_PROTOTYPE|5.006000||p
+WARN_QW|5.006000||p
+WARN_RECURSION|5.006000||p
+WARN_REDEFINE|5.006000||p
+WARN_REGEXP|5.006000||p
+WARN_RESERVED|5.006000||p
+WARN_SEMICOLON|5.006000||p
+WARN_SEVERE|5.006000||p
+WARN_SIGNAL|5.006000||p
+WARN_SUBSTR|5.006000||p
+WARN_SYNTAX|5.006000||p
+WARN_TAINT|5.006000||p
+WARN_THREADS|5.008000||p
+WARN_UNINITIALIZED|5.006000||p
+WARN_UNOPENED|5.006000||p
+WARN_UNPACK|5.006000||p
+WARN_UNTIE|5.006000||p
+WARN_UTF8|5.006000||p
+WARN_VOID|5.006000||p
+XCPT_CATCH|5.009002||p
+XCPT_RETHROW|5.009002||p
+XCPT_TRY_END|5.009002||p
+XCPT_TRY_START|5.009002||p
+XPUSHi|||
+XPUSHmortal|5.009002||p
+XPUSHn|||
+XPUSHp|||
+XPUSHs|||
+XPUSHu|5.004000||p
+XSPROTO|5.010000||p
+XSRETURN_EMPTY|||
+XSRETURN_IV|||
+XSRETURN_NO|||
+XSRETURN_NV|||
+XSRETURN_PV|||
+XSRETURN_UNDEF|||
+XSRETURN_UV|5.008001||p
+XSRETURN_YES|||
+XSRETURN|||p
+XST_mIV|||
+XST_mNO|||
+XST_mNV|||
+XST_mPV|||
+XST_mUNDEF|||
+XST_mUV|5.008001||p
+XST_mYES|||
+XS_APIVERSION_BOOTCHECK||5.013004|
+XS_VERSION_BOOTCHECK|||
+XS_VERSION|||
+XSprePUSH|5.006000||p
+XS|||
+XopDISABLE||5.014000|
+XopENABLE||5.014000|
+XopENTRY_set||5.014000|
+XopENTRY||5.014000|
+XopFLAGS||5.013007|
+ZeroD|5.009002||p
+Zero|||
+_aMY_CXT|5.007003||p
+_append_range_to_invlist|||
+_new_invlist|||
+_pMY_CXT|5.007003||p
+_swash_inversion_hash|||
+_swash_to_invlist|||
+aMY_CXT_|5.007003||p
+aMY_CXT|5.007003||p
+aTHXR_|5.014000||p
+aTHXR|5.014000||p
+aTHX_|5.006000||p
+aTHX|5.006000||p
+add_alternate|||
+add_cp_to_invlist|||
+add_data|||n
+add_range_to_invlist|||
+add_utf16_textfilter|||
+addmad|||
+allocmy|||
+amagic_call|||
+amagic_cmp_locale|||
+amagic_cmp|||
+amagic_deref_call||5.013007|
+amagic_i_ncmp|||
+amagic_ncmp|||
+anonymise_cv_maybe|||
+any_dup|||
+ao|||
+append_madprops|||
+apply_attrs_my|||
+apply_attrs_string||5.006001|
+apply_attrs|||
+apply|||
+assert_uft8_cache_coherent|||
+atfork_lock||5.007003|n
+atfork_unlock||5.007003|n
+av_arylen_p||5.009003|
+av_clear|||
+av_create_and_push||5.009005|
+av_create_and_unshift_one||5.009005|
+av_delete||5.006000|
+av_exists||5.006000|
+av_extend|||
+av_fetch|||
+av_fill|||
+av_iter_p||5.011000|
+av_len|||
+av_make|||
+av_pop|||
+av_push|||
+av_reify|||
+av_shift|||
+av_store|||
+av_undef|||
+av_unshift|||
+ax|||n
+bad_type|||
+bind_match|||
+block_end|||
+block_gimme||5.004000|
+block_start|||
+blockhook_register||5.013003|
+boolSV|5.004000||p
+boot_core_PerlIO|||
+boot_core_UNIVERSAL|||
+boot_core_mro|||
+bytes_cmp_utf8||5.013007|
+bytes_from_utf8||5.007001|
+bytes_to_uni|||n
+bytes_to_utf8||5.006001|
+call_argv|5.006000||p
+call_atexit||5.006000|
+call_list||5.004000|
+call_method|5.006000||p
+call_pv|5.006000||p
+call_sv|5.006000||p
+caller_cx||5.013005|
+calloc||5.007002|n
+cando|||
+cast_i32||5.006000|
+cast_iv||5.006000|
+cast_ulong||5.006000|
+cast_uv||5.006000|
+check_type_and_open|||
+check_uni|||
+check_utf8_print|||
+checkcomma|||
+checkposixcc|||
+ckWARN|5.006000||p
+ck_entersub_args_list||5.013006|
+ck_entersub_args_proto_or_list||5.013006|
+ck_entersub_args_proto||5.013006|
+ck_warner_d||5.011001|v
+ck_warner||5.011001|v
+ckwarn_common|||
+ckwarn_d||5.009003|
+ckwarn||5.009003|
+cl_and|||n
+cl_anything|||n
+cl_init|||n
+cl_is_anything|||n
+cl_or|||n
+clear_placeholders|||
+clone_params_del|||n
+clone_params_new|||n
+closest_cop|||
+convert|||
+cop_free|||
+cop_hints_2hv||5.013007|
+cop_hints_fetch_pvn||5.013007|
+cop_hints_fetch_pvs||5.013007|
+cop_hints_fetch_pv||5.013007|
+cop_hints_fetch_sv||5.013007|
+cophh_2hv||5.013007|
+cophh_copy||5.013007|
+cophh_delete_pvn||5.013007|
+cophh_delete_pvs||5.013007|
+cophh_delete_pv||5.013007|
+cophh_delete_sv||5.013007|
+cophh_fetch_pvn||5.013007|
+cophh_fetch_pvs||5.013007|
+cophh_fetch_pv||5.013007|
+cophh_fetch_sv||5.013007|
+cophh_free||5.013007|
+cophh_new_empty||5.014000|
+cophh_store_pvn||5.013007|
+cophh_store_pvs||5.013007|
+cophh_store_pv||5.013007|
+cophh_store_sv||5.013007|
+cr_textfilter|||
+create_eval_scope|||
+croak_no_modify||5.013003|
+croak_nocontext|||vn
+croak_sv||5.013001|
+croak_xs_usage||5.010001|
+croak|||v
+csighandler||5.009003|n
+curmad|||
+curse|||
+custom_op_desc||5.007003|
+custom_op_name||5.007003|
+custom_op_register||5.013007|
+custom_op_xop||5.013007|
+cv_ckproto_len|||
+cv_clone|||
+cv_const_sv||5.004000|
+cv_dump|||
+cv_get_call_checker||5.013006|
+cv_set_call_checker||5.013006|
+cv_undef|||
+cvgv_set|||
+cvstash_set|||
+cx_dump||5.005000|
+cx_dup|||
+cxinc|||
+dAXMARK|5.009003||p
+dAX|5.007002||p
+dITEMS|5.007002||p
+dMARK|||
+dMULTICALL||5.009003|
+dMY_CXT_SV|5.007003||p
+dMY_CXT|5.007003||p
+dNOOP|5.006000||p
+dORIGMARK|||
+dSP|||
+dTHR|5.004050||p
+dTHXR|5.014000||p
+dTHXa|5.006000||p
+dTHXoa|5.006000||p
+dTHX|5.006000||p
+dUNDERBAR|5.009002||p
+dVAR|5.009003||p
+dXCPT|5.009002||p
+dXSARGS|||
+dXSI32|||
+dXSTARG|5.006000||p
+deb_curcv|||
+deb_nocontext|||vn
+deb_stack_all|||
+deb_stack_n|||
+debop||5.005000|
+debprofdump||5.005000|
+debprof|||
+debstackptrs||5.007003|
+debstack||5.007003|
+debug_start_match|||
+deb||5.007003|v
+del_sv|||
+delete_eval_scope|||
+delimcpy||5.004000|n
+deprecate_commaless_var_list|||
+despatch_signals||5.007001|
+destroy_matcher|||
+die_nocontext|||vn
+die_sv||5.013001|
+die_unwind|||
+die|||v
+dirp_dup|||
+div128|||
+djSP|||
+do_aexec5|||
+do_aexec|||
+do_aspawn|||
+do_binmode||5.004050|
+do_chomp|||
+do_close|||
+do_delete_local|||
+do_dump_pad|||
+do_eof|||
+do_exec3|||
+do_execfree|||
+do_exec|||
+do_gv_dump||5.006000|
+do_gvgv_dump||5.006000|
+do_hv_dump||5.006000|
+do_ipcctl|||
+do_ipcget|||
+do_join|||
+do_magic_dump||5.006000|
+do_msgrcv|||
+do_msgsnd|||
+do_oddball|||
+do_op_dump||5.006000|
+do_op_xmldump|||
+do_open9||5.006000|
+do_openn||5.007001|
+do_open||5.004000|
+do_pmop_dump||5.006000|
+do_pmop_xmldump|||
+do_print|||
+do_readline|||
+do_seek|||
+do_semop|||
+do_shmio|||
+do_smartmatch|||
+do_spawn_nowait|||
+do_spawn|||
+do_sprintf|||
+do_sv_dump||5.006000|
+do_sysseek|||
+do_tell|||
+do_trans_complex_utf8|||
+do_trans_complex|||
+do_trans_count_utf8|||
+do_trans_count|||
+do_trans_simple_utf8|||
+do_trans_simple|||
+do_trans|||
+do_vecget|||
+do_vecset|||
+do_vop|||
+docatch|||
+doeval|||
+dofile|||
+dofindlabel|||
+doform|||
+doing_taint||5.008001|n
+dooneliner|||
+doopen_pm|||
+doparseform|||
+dopoptoeval|||
+dopoptogiven|||
+dopoptolabel|||
+dopoptoloop|||
+dopoptosub_at|||
+dopoptowhen|||
+doref||5.009003|
+dounwind|||
+dowantarray|||
+dump_all_perl|||
+dump_all||5.006000|
+dump_eval||5.006000|
+dump_exec_pos|||
+dump_fds|||
+dump_form||5.006000|
+dump_indent||5.006000|v
+dump_mstats|||
+dump_packsubs_perl|||
+dump_packsubs||5.006000|
+dump_sub_perl|||
+dump_sub||5.006000|
+dump_sv_child|||
+dump_trie_interim_list|||
+dump_trie_interim_table|||
+dump_trie|||
+dump_vindent||5.006000|
+dumpuntil|||
+dup_attrlist|||
+emulate_cop_io|||
+eval_pv|5.006000||p
+eval_sv|5.006000||p
+exec_failed|||
+expect_number|||
+fbm_compile||5.005000|
+fbm_instr||5.005000|
+feature_is_enabled|||
+fetch_cop_label||5.011000|
+filter_add|||
+filter_del|||
+filter_gets|||
+filter_read|||
+find_and_forget_pmops|||
+find_array_subscript|||
+find_beginning|||
+find_byclass|||
+find_hash_subscript|||
+find_in_my_stash|||
+find_runcv||5.008001|
+find_rundefsvoffset||5.009002|
+find_rundefsv||5.013002|
+find_script|||
+find_uninit_var|||
+first_symbol|||n
+foldEQ_latin1||5.013008|n
+foldEQ_locale||5.013002|n
+foldEQ_utf8_flags||5.013010|
+foldEQ_utf8||5.013002|
+foldEQ||5.013002|n
+fold_constants|||
+forbid_setid|||
+force_ident|||
+force_list|||
+force_next|||
+force_strict_version|||
+force_version|||
+force_word|||
+forget_pmop|||
+form_nocontext|||vn
+form||5.004000|v
+fp_dup|||
+fprintf_nocontext|||vn
+free_global_struct|||
+free_tied_hv_pool|||
+free_tmps|||
+gen_constant_list|||
+get_aux_mg|||
+get_av|5.006000||p
+get_context||5.006000|n
+get_cvn_flags|5.009005||p
+get_cvs|5.011000||p
+get_cv|5.006000||p
+get_db_sub|||
+get_debug_opts|||
+get_hash_seed|||
+get_hv|5.006000||p
+get_mstats|||
+get_no_modify|||
+get_num|||
+get_op_descs||5.005000|
+get_op_names||5.005000|
+get_opargs|||
+get_ppaddr||5.006000|
+get_re_arg|||
+get_sv|5.006000||p
+get_vtbl||5.005030|
+getcwd_sv||5.007002|
+getenv_len|||
+glob_2number|||
+glob_assign_glob|||
+glob_assign_ref|||
+gp_dup|||
+gp_free|||
+gp_ref|||
+grok_bin|5.007003||p
+grok_bslash_c|||
+grok_bslash_o|||
+grok_hex|5.007003||p
+grok_number|5.007002||p
+grok_numeric_radix|5.007002||p
+grok_oct|5.007003||p
+group_end|||
+gv_AVadd|||
+gv_HVadd|||
+gv_IOadd|||
+gv_SVadd|||
+gv_add_by_type||5.011000|
+gv_autoload4||5.004000|
+gv_check|||
+gv_const_sv||5.009003|
+gv_dump||5.006000|
+gv_efullname3||5.004000|
+gv_efullname4||5.006001|
+gv_efullname|||
+gv_ename|||
+gv_fetchfile_flags||5.009005|
+gv_fetchfile|||
+gv_fetchmeth_autoload||5.007003|
+gv_fetchmethod_autoload||5.004000|
+gv_fetchmethod_flags||5.011000|
+gv_fetchmethod|||
+gv_fetchmeth|||
+gv_fetchpvn_flags|5.009002||p
+gv_fetchpvs|5.009004||p
+gv_fetchpv|||
+gv_fetchsv|5.009002||p
+gv_fullname3||5.004000|
+gv_fullname4||5.006001|
+gv_fullname|||
+gv_get_super_pkg|||
+gv_handler||5.007001|
+gv_init_sv|||
+gv_init|||
+gv_magicalize_isa|||
+gv_magicalize_overload|||
+gv_name_set||5.009004|
+gv_stashpvn|5.004000||p
+gv_stashpvs|5.009003||p
+gv_stashpv|||
+gv_stashsv|||
+gv_try_downgrade|||
+he_dup|||
+hek_dup|||
+hfreeentries|||
+hsplit|||
+hv_assert|||
+hv_auxinit|||n
+hv_backreferences_p|||
+hv_clear_placeholders||5.009001|
+hv_clear|||
+hv_common_key_len||5.010000|
+hv_common||5.010000|
+hv_copy_hints_hv||5.009004|
+hv_delayfree_ent||5.004000|
+hv_delete_common|||
+hv_delete_ent||5.004000|
+hv_delete|||
+hv_eiter_p||5.009003|
+hv_eiter_set||5.009003|
+hv_ename_add|||
+hv_ename_delete|||
+hv_exists_ent||5.004000|
+hv_exists|||
+hv_fetch_ent||5.004000|
+hv_fetchs|5.009003||p
+hv_fetch|||
+hv_fill||5.013002|
+hv_free_ent||5.004000|
+hv_iterinit|||
+hv_iterkeysv||5.004000|
+hv_iterkey|||
+hv_iternext_flags||5.008000|
+hv_iternextsv|||
+hv_iternext|||
+hv_iterval|||
+hv_kill_backrefs|||
+hv_ksplit||5.004000|
+hv_magic_check|||n
+hv_magic|||
+hv_name_set||5.009003|
+hv_notallowed|||
+hv_placeholders_get||5.009003|
+hv_placeholders_p||5.009003|
+hv_placeholders_set||5.009003|
+hv_riter_p||5.009003|
+hv_riter_set||5.009003|
+hv_scalar||5.009001|
+hv_store_ent||5.004000|
+hv_store_flags||5.008000|
+hv_stores|5.009004||p
+hv_store|||
+hv_undef_flags|||
+hv_undef|||
+ibcmp_locale||5.004000|
+ibcmp_utf8||5.007003|
+ibcmp|||
+incline|||
+incpush_if_exists|||
+incpush_use_sep|||
+incpush|||
+ingroup|||
+init_argv_symbols|||
+init_dbargs|||
+init_debugger|||
+init_global_struct|||
+init_i18nl10n||5.006000|
+init_i18nl14n||5.006000|
+init_ids|||
+init_interp|||
+init_main_stash|||
+init_perllib|||
+init_postdump_symbols|||
+init_predump_symbols|||
+init_stacks||5.005000|
+init_tm||5.007002|
+instr|||n
+intro_my|||
+intuit_method|||
+intuit_more|||
+invert|||
+invlist_array|||
+invlist_destroy|||
+invlist_extend|||
+invlist_intersection|||
+invlist_len|||
+invlist_max|||
+invlist_set_array|||
+invlist_set_len|||
+invlist_set_max|||
+invlist_trim|||
+invlist_union|||
+invoke_exception_hook|||
+io_close|||
+isALNUMC|5.006000||p
+isALPHA|||
+isASCII|5.006000||p
+isBLANK|5.006001||p
+isCNTRL|5.006000||p
+isDIGIT|||
+isGRAPH|5.006000||p
+isGV_with_GP|5.009004||p
+isLOWER|||
+isOCTAL||5.013005|
+isPRINT|5.004000||p
+isPSXSPC|5.006001||p
+isPUNCT|5.006000||p
+isSPACE|||
+isUPPER|||
+isWORDCHAR||5.013006|
+isXDIGIT|5.006000||p
+is_an_int|||
+is_ascii_string||5.011000|n
+is_gv_magical_sv|||
+is_handle_constructor|||n
+is_inplace_av|||
+is_list_assignment|||
+is_lvalue_sub||5.007001|
+is_uni_alnum_lc||5.006000|
+is_uni_alnum||5.006000|
+is_uni_alpha_lc||5.006000|
+is_uni_alpha||5.006000|
+is_uni_ascii_lc||5.006000|
+is_uni_ascii||5.006000|
+is_uni_cntrl_lc||5.006000|
+is_uni_cntrl||5.006000|
+is_uni_digit_lc||5.006000|
+is_uni_digit||5.006000|
+is_uni_graph_lc||5.006000|
+is_uni_graph||5.006000|
+is_uni_idfirst_lc||5.006000|
+is_uni_idfirst||5.006000|
+is_uni_lower_lc||5.006000|
+is_uni_lower||5.006000|
+is_uni_print_lc||5.006000|
+is_uni_print||5.006000|
+is_uni_punct_lc||5.006000|
+is_uni_punct||5.006000|
+is_uni_space_lc||5.006000|
+is_uni_space||5.006000|
+is_uni_upper_lc||5.006000|
+is_uni_upper||5.006000|
+is_uni_xdigit_lc||5.006000|
+is_uni_xdigit||5.006000|
+is_utf8_X_LVT|||
+is_utf8_X_LV_LVT_V|||
+is_utf8_X_LV|||
+is_utf8_X_L|||
+is_utf8_X_T|||
+is_utf8_X_V|||
+is_utf8_X_begin|||
+is_utf8_X_extend|||
+is_utf8_X_non_hangul|||
+is_utf8_X_prepend|||
+is_utf8_alnum||5.006000|
+is_utf8_alpha||5.006000|
+is_utf8_ascii||5.006000|
+is_utf8_char_slow|||n
+is_utf8_char||5.006000|n
+is_utf8_cntrl||5.006000|
+is_utf8_common|||
+is_utf8_digit||5.006000|
+is_utf8_graph||5.006000|
+is_utf8_idcont||5.008000|
+is_utf8_idfirst||5.006000|
+is_utf8_lower||5.006000|
+is_utf8_mark||5.006000|
+is_utf8_perl_space||5.011001|
+is_utf8_perl_word||5.011001|
+is_utf8_posix_digit||5.011001|
+is_utf8_print||5.006000|
+is_utf8_punct||5.006000|
+is_utf8_space||5.006000|
+is_utf8_string_loclen||5.009003|n
+is_utf8_string_loc||5.008001|n
+is_utf8_string||5.006001|n
+is_utf8_upper||5.006000|
+is_utf8_xdigit||5.006000|
+is_utf8_xidcont||5.013010|
+is_utf8_xidfirst||5.013010|
+isa_lookup|||
+items|||n
+ix|||n
+jmaybe|||
+join_exact|||
+keyword_plugin_standard|||
+keyword|||
+leave_scope|||
+lex_bufutf8||5.011002|
+lex_discard_to||5.011002|
+lex_grow_linestr||5.011002|
+lex_next_chunk||5.011002|
+lex_peek_unichar||5.011002|
+lex_read_space||5.011002|
+lex_read_to||5.011002|
+lex_read_unichar||5.011002|
+lex_start||5.009005|
+lex_stuff_pvn||5.011002|
+lex_stuff_pvs||5.013005|
+lex_stuff_pv||5.013006|
+lex_stuff_sv||5.011002|
+lex_unstuff||5.011002|
+listkids|||
+list|||
+load_module_nocontext|||vn
+load_module|5.006000||pv
+localize|||
+looks_like_bool|||
+looks_like_number|||
+lop|||
+mPUSHi|5.009002||p
+mPUSHn|5.009002||p
+mPUSHp|5.009002||p
+mPUSHs|5.010001||p
+mPUSHu|5.009002||p
+mXPUSHi|5.009002||p
+mXPUSHn|5.009002||p
+mXPUSHp|5.009002||p
+mXPUSHs|5.010001||p
+mXPUSHu|5.009002||p
+mad_free|||
+madlex|||
+madparse|||
+magic_clear_all_env|||
+magic_clearenv|||
+magic_clearhints|||
+magic_clearhint|||
+magic_clearisa|||
+magic_clearpack|||
+magic_clearsig|||
+magic_dump||5.006000|
+magic_existspack|||
+magic_freearylen_p|||
+magic_freeovrld|||
+magic_getarylen|||
+magic_getdefelem|||
+magic_getnkeys|||
+magic_getpack|||
+magic_getpos|||
+magic_getsig|||
+magic_getsubstr|||
+magic_gettaint|||
+magic_getuvar|||
+magic_getvec|||
+magic_get|||
+magic_killbackrefs|||
+magic_len|||
+magic_methcall1|||
+magic_methcall|||v
+magic_methpack|||
+magic_nextpack|||
+magic_regdata_cnt|||
+magic_regdatum_get|||
+magic_regdatum_set|||
+magic_scalarpack|||
+magic_set_all_env|||
+magic_setamagic|||
+magic_setarylen|||
+magic_setcollxfrm|||
+magic_setdbline|||
+magic_setdefelem|||
+magic_setenv|||
+magic_sethint|||
+magic_setisa|||
+magic_setmglob|||
+magic_setnkeys|||
+magic_setpack|||
+magic_setpos|||
+magic_setregexp|||
+magic_setsig|||
+magic_setsubstr|||
+magic_settaint|||
+magic_setutf8|||
+magic_setuvar|||
+magic_setvec|||
+magic_set|||
+magic_sizepack|||
+magic_wipepack|||
+make_matcher|||
+make_trie_failtable|||
+make_trie|||
+malloc_good_size|||n
+malloced_size|||n
+malloc||5.007002|n
+markstack_grow|||
+matcher_matches_sv|||
+measure_struct|||
+memEQs|5.009005||p
+memEQ|5.004000||p
+memNEs|5.009005||p
+memNE|5.004000||p
+mem_collxfrm|||
+mem_log_common|||n
+mess_alloc|||
+mess_nocontext|||vn
+mess_sv||5.013001|
+mess||5.006000|v
+method_common|||
+mfree||5.007002|n
+mg_clear|||
+mg_copy|||
+mg_dup|||
+mg_findext||5.013008|
+mg_find|||
+mg_free_type||5.013006|
+mg_free|||
+mg_get|||
+mg_length||5.005000|
+mg_localize|||
+mg_magical|||
+mg_set|||
+mg_size||5.005000|
+mini_mktime||5.007002|
+missingterm|||
+mode_from_discipline|||
+modkids|||
+mod|||
+more_bodies|||
+more_sv|||
+moreswitches|||
+mro_clean_isarev|||
+mro_gather_and_rename|||
+mro_get_from_name||5.010001|
+mro_get_linear_isa_dfs|||
+mro_get_linear_isa||5.009005|
+mro_get_private_data||5.010001|
+mro_isa_changed_in|||
+mro_meta_dup|||
+mro_meta_init|||
+mro_method_changed_in||5.009005|
+mro_package_moved|||
+mro_register||5.010001|
+mro_set_mro||5.010001|
+mro_set_private_data||5.010001|
+mul128|||
+mulexp10|||n
+munge_qwlist_to_paren_list|||
+my_atof2||5.007002|
+my_atof||5.006000|
+my_attrs|||
+my_bcopy|||n
+my_betoh16|||n
+my_betoh32|||n
+my_betoh64|||n
+my_betohi|||n
+my_betohl|||n
+my_betohs|||n
+my_bzero|||n
+my_chsize|||
+my_clearenv|||
+my_cxt_index|||
+my_cxt_init|||
+my_dirfd||5.009005|
+my_exit_jump|||
+my_exit|||
+my_failure_exit||5.004000|
+my_fflush_all||5.006000|
+my_fork||5.007003|n
+my_htobe16|||n
+my_htobe32|||n
+my_htobe64|||n
+my_htobei|||n
+my_htobel|||n
+my_htobes|||n
+my_htole16|||n
+my_htole32|||n
+my_htole64|||n
+my_htolei|||n
+my_htolel|||n
+my_htoles|||n
+my_htonl|||
+my_kid|||
+my_letoh16|||n
+my_letoh32|||n
+my_letoh64|||n
+my_letohi|||n
+my_letohl|||n
+my_letohs|||n
+my_lstat_flags|||
+my_lstat||5.014000|
+my_memcmp||5.004000|n
+my_memset|||n
+my_ntohl|||
+my_pclose||5.004000|
+my_popen_list||5.007001|
+my_popen||5.004000|
+my_setenv|||
+my_snprintf|5.009004||pvn
+my_socketpair||5.007003|n
+my_sprintf|5.009003||pvn
+my_stat_flags|||
+my_stat||5.014000|
+my_strftime||5.007002|
+my_strlcat|5.009004||pn
+my_strlcpy|5.009004||pn
+my_swabn|||n
+my_swap|||
+my_unexec|||
+my_vsnprintf||5.009004|n
+need_utf8|||n
+newANONATTRSUB||5.006000|
+newANONHASH|||
+newANONLIST|||
+newANONSUB|||
+newASSIGNOP|||
+newATTRSUB||5.006000|
+newAVREF|||
+newAV|||
+newBINOP|||
+newCONDOP|||
+newCONSTSUB|5.004050||p
+newCVREF|||
+newDEFSVOP|||
+newFORM|||
+newFOROP||5.013007|
+newGIVENOP||5.009003|
+newGIVWHENOP|||
+newGP|||
+newGVOP|||
+newGVREF|||
+newGVgen|||
+newHVREF|||
+newHVhv||5.005000|
+newHV|||
+newIO|||
+newLISTOP|||
+newLOGOP|||
+newLOOPEX|||
+newLOOPOP|||
+newMADPROP|||
+newMADsv|||
+newMYSUB|||
+newNULLLIST|||
+newOP|||
+newPADOP|||
+newPMOP|||
+newPROG|||
+newPVOP|||
+newRANGE|||
+newRV_inc|5.004000||p
+newRV_noinc|5.004000||p
+newRV|||
+newSLICEOP|||
+newSTATEOP|||
+newSUB|||
+newSVOP|||
+newSVREF|||
+newSV_type|5.009005||p
+newSVhek||5.009003|
+newSViv|||
+newSVnv|||
+newSVpv_share||5.013006|
+newSVpvf_nocontext|||vn
+newSVpvf||5.004000|v
+newSVpvn_flags|5.010001||p
+newSVpvn_share|5.007001||p
+newSVpvn_utf8|5.010001||p
+newSVpvn|5.004050||p
+newSVpvs_flags|5.010001||p
+newSVpvs_share|5.009003||p
+newSVpvs|5.009003||p
+newSVpv|||
+newSVrv|||
+newSVsv|||
+newSVuv|5.006000||p
+newSV|||
+newTOKEN|||
+newUNOP|||
+newWHENOP||5.009003|
+newWHILEOP||5.013007|
+newXS_flags||5.009004|
+newXSproto||5.006000|
+newXS||5.006000|
+new_collate||5.006000|
+new_constant|||
+new_ctype||5.006000|
+new_he|||
+new_logop|||
+new_numeric||5.006000|
+new_stackinfo||5.005000|
+new_version||5.009000|
+new_warnings_bitfield|||
+next_symbol|||
+nextargv|||
+nextchar|||
+ninstr|||n
+no_bareword_allowed|||
+no_fh_allowed|||
+no_op|||
+not_a_number|||
+nothreadhook||5.008000|
+nuke_stacks|||
+num_overflow|||n
+oopsAV|||
+oopsHV|||
+op_append_elem||5.013006|
+op_append_list||5.013006|
+op_clear|||
+op_const_sv|||
+op_contextualize||5.013006|
+op_dump||5.006000|
+op_free|||
+op_getmad_weak|||
+op_getmad|||
+op_linklist||5.013006|
+op_lvalue||5.013007|
+op_null||5.007002|
+op_prepend_elem||5.013006|
+op_refcnt_dec|||
+op_refcnt_inc|||
+op_refcnt_lock||5.009002|
+op_refcnt_unlock||5.009002|
+op_scope||5.013007|
+op_xmldump|||
+open_script|||
+opt_scalarhv|||
+pMY_CXT_|5.007003||p
+pMY_CXT|5.007003||p
+pTHX_|5.006000||p
+pTHX|5.006000||p
+packWARN|5.007003||p
+pack_cat||5.007003|
+pack_rec|||
+package_version|||
+package|||
+packlist||5.008001|
+pad_add_anon|||
+pad_add_name_sv|||
+pad_add_name|||
+pad_alloc|||
+pad_block_start|||
+pad_check_dup|||
+pad_compname_type|||
+pad_findlex|||
+pad_findmy||5.011002|
+pad_fixup_inner_anons|||
+pad_free|||
+pad_leavemy|||
+pad_new|||
+pad_peg|||n
+pad_push|||
+pad_reset|||
+pad_setsv|||
+pad_sv|||
+pad_swipe|||
+pad_tidy|||
+padlist_dup|||
+parse_arithexpr||5.013008|
+parse_barestmt||5.013007|
+parse_block||5.013007|
+parse_body|||
+parse_fullexpr||5.013008|
+parse_fullstmt||5.013005|
+parse_label||5.013007|
+parse_listexpr||5.013008|
+parse_stmtseq||5.013006|
+parse_termexpr||5.013008|
+parse_unicode_opts|||
+parser_dup|||
+parser_free|||
+path_is_absolute|||n
+peep|||
+pending_Slabs_to_ro|||
+perl_alloc_using|||n
+perl_alloc|||n
+perl_clone_using|||n
+perl_clone|||n
+perl_construct|||n
+perl_destruct||5.007003|n
+perl_free|||n
+perl_parse||5.006000|n
+perl_run|||n
+pidgone|||
+pm_description|||
+pmop_dump||5.006000|
+pmop_xmldump|||
+pmruntime|||
+pmtrans|||
+pop_scope|||
+populate_isa|||v
+pregcomp||5.009005|
+pregexec|||
+pregfree2||5.011000|
+pregfree|||
+prepend_madprops|||
+prescan_version||5.011004|
+printbuf|||
+printf_nocontext|||vn
+process_special_blocks|||
+ptr_table_clear||5.009005|
+ptr_table_fetch||5.009005|
+ptr_table_find|||n
+ptr_table_free||5.009005|
+ptr_table_new||5.009005|
+ptr_table_split||5.009005|
+ptr_table_store||5.009005|
+push_scope|||
+put_byte|||
+pv_display|5.006000||p
+pv_escape|5.009004||p
+pv_pretty|5.009004||p
+pv_uni_display||5.007003|
+qerror|||
+qsortsvu|||
+re_compile||5.009005|
+re_croak2|||
+re_dup_guts|||
+re_intuit_start||5.009005|
+re_intuit_string||5.006000|
+readpipe_override|||
+realloc||5.007002|n
+reentrant_free|||
+reentrant_init|||
+reentrant_retry|||vn
+reentrant_size|||
+ref_array_or_hash|||
+refcounted_he_chain_2hv|||
+refcounted_he_fetch_pvn|||
+refcounted_he_fetch_pvs|||
+refcounted_he_fetch_pv|||
+refcounted_he_fetch_sv|||
+refcounted_he_free|||
+refcounted_he_inc|||
+refcounted_he_new_pvn|||
+refcounted_he_new_pvs|||
+refcounted_he_new_pv|||
+refcounted_he_new_sv|||
+refcounted_he_value|||
+refkids|||
+refto|||
+ref||5.014000|
+reg_check_named_buff_matched|||
+reg_named_buff_all||5.009005|
+reg_named_buff_exists||5.009005|
+reg_named_buff_fetch||5.009005|
+reg_named_buff_firstkey||5.009005|
+reg_named_buff_iter|||
+reg_named_buff_nextkey||5.009005|
+reg_named_buff_scalar||5.009005|
+reg_named_buff|||
+reg_namedseq|||
+reg_node|||
+reg_numbered_buff_fetch|||
+reg_numbered_buff_length|||
+reg_numbered_buff_store|||
+reg_qr_package|||
+reg_recode|||
+reg_scan_name|||
+reg_skipcomment|||
+reg_temp_copy|||
+reganode|||
+regatom|||
+regbranch|||
+regclass_swash||5.009004|
+regclass|||
+regcppop|||
+regcppush|||
+regcurly|||
+regdump_extflags|||
+regdump||5.005000|
+regdupe_internal|||
+regexec_flags||5.005000|
+regfree_internal||5.009005|
+reghop3|||n
+reghop4|||n
+reghopmaybe3|||n
+reginclass|||
+reginitcolors||5.006000|
+reginsert|||
+regmatch|||
+regnext||5.005000|
+regpiece|||
+regpposixcc|||
+regprop|||
+regrepeat|||
+regtail_study|||
+regtail|||
+regtry|||
+reguni|||
+regwhite|||n
+reg|||
+repeatcpy|||n
+report_evil_fh|||
+report_uninit|||
+report_wrongway_fh|||
+require_pv||5.006000|
+require_tie_mod|||
+restore_magic|||
+rninstr|||n
+rpeep|||
+rsignal_restore|||
+rsignal_save|||
+rsignal_state||5.004000|
+rsignal||5.004000|
+run_body|||
+run_user_filter|||
+runops_debug||5.005000|
+runops_standard||5.005000|
+rv2cv_op_cv||5.013006|
+rvpv_dup|||
+rxres_free|||
+rxres_restore|||
+rxres_save|||
+safesyscalloc||5.006000|n
+safesysfree||5.006000|n
+safesysmalloc||5.006000|n
+safesysrealloc||5.006000|n
+same_dirent|||
+save_I16||5.004000|
+save_I32|||
+save_I8||5.006000|
+save_adelete||5.011000|
+save_aelem_flags||5.011000|
+save_aelem||5.004050|
+save_alloc||5.006000|
+save_aptr|||
+save_ary|||
+save_bool||5.008001|
+save_clearsv|||
+save_delete|||
+save_destructor_x||5.006000|
+save_destructor||5.006000|
+save_freeop|||
+save_freepv|||
+save_freesv|||
+save_generic_pvref||5.006001|
+save_generic_svref||5.005030|
+save_gp||5.004000|
+save_hash|||
+save_hdelete||5.011000|
+save_hek_flags|||n
+save_helem_flags||5.011000|
+save_helem||5.004050|
+save_hints||5.010001|
+save_hptr|||
+save_int|||
+save_item|||
+save_iv||5.005000|
+save_lines|||
+save_list|||
+save_long|||
+save_magic|||
+save_mortalizesv||5.007001|
+save_nogv|||
+save_op||5.005000|
+save_padsv_and_mortalize||5.010001|
+save_pptr|||
+save_pushi32ptr||5.010001|
+save_pushptri32ptr|||
+save_pushptrptr||5.010001|
+save_pushptr||5.010001|
+save_re_context||5.006000|
+save_scalar_at|||
+save_scalar|||
+save_set_svflags||5.009000|
+save_shared_pvref||5.007003|
+save_sptr|||
+save_svref|||
+save_vptr||5.006000|
+savepvn|||
+savepvs||5.009003|
+savepv|||
+savesharedpvn||5.009005|
+savesharedpvs||5.013006|
+savesharedpv||5.007003|
+savesharedsvpv||5.013006|
+savestack_grow_cnt||5.008001|
+savestack_grow|||
+savesvpv||5.009002|
+sawparens|||
+scalar_mod_type|||n
+scalarboolean|||
+scalarkids|||
+scalarseq|||
+scalarvoid|||
+scalar|||
+scan_bin||5.006000|
+scan_commit|||
+scan_const|||
+scan_formline|||
+scan_heredoc|||
+scan_hex|||
+scan_ident|||
+scan_inputsymbol|||
+scan_num||5.007001|
+scan_oct|||
+scan_pat|||
+scan_str|||
+scan_subst|||
+scan_trans|||
+scan_version||5.009001|
+scan_vstring||5.009005|
+scan_word|||
+screaminstr||5.005000|
+search_const|||
+seed||5.008001|
+sequence_num|||
+sequence_tail|||
+sequence|||
+set_context||5.006000|n
+set_numeric_local||5.006000|
+set_numeric_radix||5.006000|
+set_numeric_standard||5.006000|
+set_regclass_bit_fold|||
+set_regclass_bit|||
+setdefout|||
+share_hek_flags|||
+share_hek||5.004000|
+si_dup|||
+sighandler|||n
+simplify_sort|||
+skipspace0|||
+skipspace1|||
+skipspace2|||
+skipspace|||
+softref2xv|||
+sortcv_stacked|||
+sortcv_xsub|||
+sortcv|||
+sortsv_flags||5.009003|
+sortsv||5.007003|
+space_join_names_mortal|||
+ss_dup|||
+stack_grow|||
+start_force|||
+start_glob|||
+start_subparse||5.004000|
+stashpv_hvname_match||5.014000|
+stdize_locale|||
+store_cop_label|||
+strEQ|||
+strGE|||
+strGT|||
+strLE|||
+strLT|||
+strNE|||
+str_to_version||5.006000|
+strip_return|||
+strnEQ|||
+strnNE|||
+study_chunk|||
+sub_crush_depth|||
+sublex_done|||
+sublex_push|||
+sublex_start|||
+sv_2bool_flags||5.013006|
+sv_2bool|||
+sv_2cv|||
+sv_2io|||
+sv_2iuv_common|||
+sv_2iuv_non_preserve|||
+sv_2iv_flags||5.009001|
+sv_2iv|||
+sv_2mortal|||
+sv_2num|||
+sv_2nv_flags||5.013001|
+sv_2pv_flags|5.007002||p
+sv_2pv_nolen|5.006000||p
+sv_2pvbyte_nolen|5.006000||p
+sv_2pvbyte|5.006000||p
+sv_2pvutf8_nolen||5.006000|
+sv_2pvutf8||5.006000|
+sv_2pv|||
+sv_2uv_flags||5.009001|
+sv_2uv|5.004000||p
+sv_add_arena|||
+sv_add_backref|||
+sv_backoff|||
+sv_bless|||
+sv_cat_decode||5.008001|
+sv_catpv_flags||5.013006|
+sv_catpv_mg|5.004050||p
+sv_catpv_nomg||5.013006|
+sv_catpvf_mg_nocontext|||pvn
+sv_catpvf_mg|5.006000|5.004000|pv
+sv_catpvf_nocontext|||vn
+sv_catpvf||5.004000|v
+sv_catpvn_flags||5.007002|
+sv_catpvn_mg|5.004050||p
+sv_catpvn_nomg|5.007002||p
+sv_catpvn|||
+sv_catpvs_flags||5.013006|
+sv_catpvs_mg||5.013006|
+sv_catpvs_nomg||5.013006|
+sv_catpvs|5.009003||p
+sv_catpv|||
+sv_catsv_flags||5.007002|
+sv_catsv_mg|5.004050||p
+sv_catsv_nomg|5.007002||p
+sv_catsv|||
+sv_catxmlpvn|||
+sv_catxmlpv|||
+sv_catxmlsv|||
+sv_chop|||
+sv_clean_all|||
+sv_clean_objs|||
+sv_clear|||
+sv_cmp_flags||5.013006|
+sv_cmp_locale_flags||5.013006|
+sv_cmp_locale||5.004000|
+sv_cmp|||
+sv_collxfrm_flags||5.013006|
+sv_collxfrm|||
+sv_compile_2op_is_broken|||
+sv_compile_2op||5.008001|
+sv_copypv||5.007003|
+sv_dec_nomg||5.013002|
+sv_dec|||
+sv_del_backref|||
+sv_derived_from||5.004000|
+sv_destroyable||5.010000|
+sv_does||5.009004|
+sv_dump|||
+sv_dup_common|||
+sv_dup_inc_multiple|||
+sv_dup_inc|||
+sv_dup|||
+sv_eq_flags||5.013006|
+sv_eq|||
+sv_exp_grow|||
+sv_force_normal_flags||5.007001|
+sv_force_normal||5.006000|
+sv_free2|||
+sv_free_arenas|||
+sv_free|||
+sv_gets||5.004000|
+sv_grow|||
+sv_i_ncmp|||
+sv_inc_nomg||5.013002|
+sv_inc|||
+sv_insert_flags||5.010001|
+sv_insert|||
+sv_isa|||
+sv_isobject|||
+sv_iv||5.005000|
+sv_kill_backrefs|||
+sv_len_utf8||5.006000|
+sv_len|||
+sv_magic_portable|5.014000|5.004000|p
+sv_magicext||5.007003|
+sv_magic|||
+sv_mortalcopy|||
+sv_ncmp|||
+sv_newmortal|||
+sv_newref|||
+sv_nolocking||5.007003|
+sv_nosharing||5.007003|
+sv_nounlocking|||
+sv_nv||5.005000|
+sv_peek||5.005000|
+sv_pos_b2u_midway|||
+sv_pos_b2u||5.006000|
+sv_pos_u2b_cached|||
+sv_pos_u2b_flags||5.011005|
+sv_pos_u2b_forwards|||n
+sv_pos_u2b_midway|||n
+sv_pos_u2b||5.006000|
+sv_pvbyten_force||5.006000|
+sv_pvbyten||5.006000|
+sv_pvbyte||5.006000|
+sv_pvn_force_flags|5.007002||p
+sv_pvn_force|||
+sv_pvn_nomg|5.007003|5.005000|p
+sv_pvn||5.005000|
+sv_pvutf8n_force||5.006000|
+sv_pvutf8n||5.006000|
+sv_pvutf8||5.006000|
+sv_pv||5.006000|
+sv_recode_to_utf8||5.007003|
+sv_reftype|||
+sv_release_COW|||
+sv_replace|||
+sv_report_used|||
+sv_reset|||
+sv_rvweaken||5.006000|
+sv_setiv_mg|5.004050||p
+sv_setiv|||
+sv_setnv_mg|5.006000||p
+sv_setnv|||
+sv_setpv_mg|5.004050||p
+sv_setpvf_mg_nocontext|||pvn
+sv_setpvf_mg|5.006000|5.004000|pv
+sv_setpvf_nocontext|||vn
+sv_setpvf||5.004000|v
+sv_setpviv_mg||5.008001|
+sv_setpviv||5.008001|
+sv_setpvn_mg|5.004050||p
+sv_setpvn|||
+sv_setpvs_mg||5.013006|
+sv_setpvs|5.009004||p
+sv_setpv|||
+sv_setref_iv|||
+sv_setref_nv|||
+sv_setref_pvn|||
+sv_setref_pvs||5.013006|
+sv_setref_pv|||
+sv_setref_uv||5.007001|
+sv_setsv_cow|||
+sv_setsv_flags||5.007002|
+sv_setsv_mg|5.004050||p
+sv_setsv_nomg|5.007002||p
+sv_setsv|||
+sv_setuv_mg|5.004050||p
+sv_setuv|5.004000||p
+sv_tainted||5.004000|
+sv_taint||5.004000|
+sv_true||5.005000|
+sv_unglob|||
+sv_uni_display||5.007003|
+sv_unmagicext||5.013008|
+sv_unmagic|||
+sv_unref_flags||5.007001|
+sv_unref|||
+sv_untaint||5.004000|
+sv_upgrade|||
+sv_usepvn_flags||5.009004|
+sv_usepvn_mg|5.004050||p
+sv_usepvn|||
+sv_utf8_decode||5.006000|
+sv_utf8_downgrade||5.006000|
+sv_utf8_encode||5.006000|
+sv_utf8_upgrade_flags_grow||5.011000|
+sv_utf8_upgrade_flags||5.007002|
+sv_utf8_upgrade_nomg||5.007002|
+sv_utf8_upgrade||5.007001|
+sv_uv|5.005000||p
+sv_vcatpvf_mg|5.006000|5.004000|p
+sv_vcatpvfn||5.004000|
+sv_vcatpvf|5.006000|5.004000|p
+sv_vsetpvf_mg|5.006000|5.004000|p
+sv_vsetpvfn||5.004000|
+sv_vsetpvf|5.006000|5.004000|p
+sv_xmlpeek|||
+svtype|||
+swallow_bom|||
+swash_fetch||5.007002|
+swash_get|||
+swash_init||5.006000|
+sys_init3||5.010000|n
+sys_init||5.010000|n
+sys_intern_clear|||
+sys_intern_dup|||
+sys_intern_init|||
+sys_term||5.010000|n
+taint_env|||
+taint_proper|||
+tied_method|||v
+tmps_grow||5.006000|
+toLOWER|||
+toUPPER|||
+to_byte_substr|||
+to_uni_fold||5.007003|
+to_uni_lower_lc||5.006000|
+to_uni_lower||5.007003|
+to_uni_title_lc||5.006000|
+to_uni_title||5.007003|
+to_uni_upper_lc||5.006000|
+to_uni_upper||5.007003|
+to_utf8_case||5.007003|
+to_utf8_fold||5.007003|
+to_utf8_lower||5.007003|
+to_utf8_substr|||
+to_utf8_title||5.007003|
+to_utf8_upper||5.007003|
+token_free|||
+token_getmad|||
+tokenize_use|||
+tokeq|||
+tokereport|||
+too_few_arguments|||
+too_many_arguments|||
+try_amagic_bin|||
+try_amagic_un|||
+uiv_2buf|||n
+unlnk|||
+unpack_rec|||
+unpack_str||5.007003|
+unpackstring||5.008001|
+unreferenced_to_tmp_stack|||
+unshare_hek_or_pvn|||
+unshare_hek|||
+unsharepvn||5.004000|
+unwind_handler_stack|||
+update_debugger_info|||
+upg_version||5.009005|
+usage|||
+utf16_textfilter|||
+utf16_to_utf8_reversed||5.006001|
+utf16_to_utf8||5.006001|
+utf8_distance||5.006000|
+utf8_hop||5.006000|
+utf8_length||5.007001|
+utf8_mg_len_cache_update|||
+utf8_mg_pos_cache_update|||
+utf8_to_bytes||5.006001|
+utf8_to_uvchr||5.007001|
+utf8_to_uvuni||5.007001|
+utf8n_to_uvchr|||
+utf8n_to_uvuni||5.007001|
+utilize|||
+uvchr_to_utf8_flags||5.007003|
+uvchr_to_utf8|||
+uvuni_to_utf8_flags||5.007003|
+uvuni_to_utf8||5.007001|
+validate_suid|||
+varname|||
+vcmp||5.009000|
+vcroak||5.006000|
+vdeb||5.007003|
+vform||5.006000|
+visit|||
+vivify_defelem|||
+vivify_ref|||
+vload_module|5.006000||p
+vmess||5.006000|
+vnewSVpvf|5.006000|5.004000|p
+vnormal||5.009002|
+vnumify||5.009000|
+vstringify||5.009000|
+vverify||5.009003|
+vwarner||5.006000|
+vwarn||5.006000|
+wait4pid|||
+warn_nocontext|||vn
+warn_sv||5.013001|
+warner_nocontext|||vn
+warner|5.006000|5.004000|pv
+warn|||v
+watch|||
+whichsig|||
+with_queued_errors|||
+write_no_mem|||
+write_to_stderr|||
+xmldump_all_perl|||
+xmldump_all|||
+xmldump_attr|||
+xmldump_eval|||
+xmldump_form|||
+xmldump_indent|||v
+xmldump_packsubs_perl|||
+xmldump_packsubs|||
+xmldump_sub_perl|||
+xmldump_sub|||
+xmldump_vindent|||
+xs_apiversion_bootcheck|||
+xs_version_bootcheck|||
+yyerror|||
+yylex|||
+yyparse|||
+yyunlex|||
+yywarn|||
+);
+
+if (exists $opt{'list-unsupported'}) {
+  my $f;
+  for $f (sort { lc $a cmp lc $b } keys %API) {
+    next unless $API{$f}{todo};
+    print "$f ", '.'x(40-length($f)), " ", format_version($API{$f}{todo}), "\n";
+  }
+  exit 0;
+}
+
+# Scan for possible replacement candidates
+
+my(%replace, %need, %hints, %warnings, %depends);
+my $replace = 0;
+my($hint, $define, $function);
+
+sub find_api
+{
+  my $code = shift;
+  $code =~ s{
+    / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]*)
+  | "[^"\\]*(?:\\.[^"\\]*)*"
+  | '[^'\\]*(?:\\.[^'\\]*)*' }{}egsx;
+  grep { exists $API{$_} } $code =~ /(\w+)/mg;
+}
+
+while (<DATA>) {
+  if ($hint) {
+    my $h = $hint->[0] eq 'Hint' ? \%hints : \%warnings;
+    if (m{^\s*\*\s(.*?)\s*$}) {
+      for (@{$hint->[1]}) {
+        $h->{$_} ||= '';  # suppress warning with older perls
+        $h->{$_} .= "$1\n";
+      }
+    }
+    else { undef $hint }
+  }
+
+  $hint = [$1, [split /,?\s+/, $2]]
+      if m{^\s*$rccs\s+(Hint|Warning):\s+(\w+(?:,?\s+\w+)*)\s*$};
+
+  if ($define) {
+    if ($define->[1] =~ /\\$/) {
+      $define->[1] .= $_;
+    }
+    else {
+      if (exists $API{$define->[0]} && $define->[1] !~ /^DPPP_\(/) {
+        my @n = find_api($define->[1]);
+        push @{$depends{$define->[0]}}, @n if @n
+      }
+      undef $define;
+    }
+  }
+
+  $define = [$1, $2] if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(.*)};
+
+  if ($function) {
+    if (/^}/) {
+      if (exists $API{$function->[0]}) {
+        my @n = find_api($function->[1]);
+        push @{$depends{$function->[0]}}, @n if @n
+      }
+      undef $function;
+    }
+    else {
+      $function->[1] .= $_;
+    }
+  }
+
+  $function = [$1, ''] if m{^DPPP_\(my_(\w+)\)};
+
+  $replace     = $1 if m{^\s*$rccs\s+Replace:\s+(\d+)\s+$rcce\s*$};
+  $replace{$2} = $1 if $replace and m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+)};
+  $replace{$2} = $1 if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+).*$rccs\s+Replace\s+$rcce};
+  $replace{$1} = $2 if m{^\s*$rccs\s+Replace (\w+) with (\w+)\s+$rcce\s*$};
+
+  if (m{^\s*$rccs\s+(\w+(\s*,\s*\w+)*)\s+depends\s+on\s+(\w+(\s*,\s*\w+)*)\s+$rcce\s*$}) {
+    my @deps = map { s/\s+//g; $_ } split /,/, $3;
+    my $d;
+    for $d (map { s/\s+//g; $_ } split /,/, $1) {
+      push @{$depends{$d}}, @deps;
+    }
+  }
+
+  $need{$1} = 1 if m{^#if\s+defined\(NEED_(\w+)(?:_GLOBAL)?\)};
+}
+
+for (values %depends) {
+  my %s;
+  $_ = [sort grep !$s{$_}++, @$_];
+}
+
+if (exists $opt{'api-info'}) {
+  my $f;
+  my $count = 0;
+  my $match = $opt{'api-info'} =~ m!^/(.*)/$! ? $1 : "^\Q$opt{'api-info'}\E\$";
+  for $f (sort { lc $a cmp lc $b } keys %API) {
+    next unless $f =~ /$match/;
+    print "\n=== $f ===\n\n";
+    my $info = 0;
+    if ($API{$f}{base} || $API{$f}{todo}) {
+      my $base = format_version($API{$f}{base} || $API{$f}{todo});
+      print "Supported at least starting from perl-$base.\n";
+      $info++;
+    }
+    if ($API{$f}{provided}) {
+      my $todo = $API{$f}{todo} ? format_version($API{$f}{todo}) : "5.003";
+      print "Support by $ppport provided back to perl-$todo.\n";
+      print "Support needs to be explicitly requested by NEED_$f.\n" if exists $need{$f};
+      print "Depends on: ", join(', ', @{$depends{$f}}), ".\n" if exists $depends{$f};
+      print "\n$hints{$f}" if exists $hints{$f};
+      print "\nWARNING:\n$warnings{$f}" if exists $warnings{$f};
+      $info++;
+    }
+    print "No portability information available.\n" unless $info;
+    $count++;
+  }
+  $count or print "Found no API matching '$opt{'api-info'}'.";
+  print "\n";
+  exit 0;
+}
+
+if (exists $opt{'list-provided'}) {
+  my $f;
+  for $f (sort { lc $a cmp lc $b } keys %API) {
+    next unless $API{$f}{provided};
+    my @flags;
+    push @flags, 'explicit' if exists $need{$f};
+    push @flags, 'depend'   if exists $depends{$f};
+    push @flags, 'hint'     if exists $hints{$f};
+    push @flags, 'warning'  if exists $warnings{$f};
+    my $flags = @flags ? '  ['.join(', ', @flags).']' : '';
+    print "$f$flags\n";
+  }
+  exit 0;
+}
+
+my @files;
+my @srcext = qw( .xs .c .h .cc .cpp -c.inc -xs.inc );
+my $srcext = join '|', map { quotemeta $_ } @srcext;
+
+if (@ARGV) {
+  my %seen;
+  for (@ARGV) {
+    if (-e) {
+      if (-f) {
+        push @files, $_ unless $seen{$_}++;
+      }
+      else { warn "'$_' is not a file.\n" }
+    }
+    else {
+      my @new = grep { -f } glob $_
+          or warn "'$_' does not exist.\n";
+      push @files, grep { !$seen{$_}++ } @new;
+    }
+  }
+}
+else {
+  eval {
+    require File::Find;
+    File::Find::find(sub {
+      $File::Find::name =~ /($srcext)$/i
+          and push @files, $File::Find::name;
+    }, '.');
+  };
+  if ($@) {
+    @files = map { glob "*$_" } @srcext;
+  }
+}
+
+if (!@ARGV || $opt{filter}) {
+  my(@in, @out);
+  my %xsc = map { /(.*)\.xs$/ ? ("$1.c" => 1, "$1.cc" => 1) : () } @files;
+  for (@files) {
+    my $out = exists $xsc{$_} || /\b\Q$ppport\E$/i || !/($srcext)$/i;
+    push @{ $out ? \@out : \@in }, $_;
+  }
+  if (@ARGV && @out) {
+    warning("Skipping the following files (use --nofilter to avoid this):\n| ", join "\n| ", @out);
+  }
+  @files = @in;
+}
+
+die "No input files given!\n" unless @files;
+
+my(%files, %global, %revreplace);
+%revreplace = reverse %replace;
+my $filename;
+my $patch_opened = 0;
+
+for $filename (@files) {
+  unless (open IN, "<$filename") {
+    warn "Unable to read from $filename: $!\n";
+    next;
+  }
+
+  info("Scanning $filename ...");
+
+  my $c = do { local $/; <IN> };
+  close IN;
+
+  my %file = (orig => $c, changes => 0);
+
+  # Temporarily remove C/XS comments and strings from the code
+  my @ccom;
+
+  $c =~ s{
+    ( ^$HS*\#$HS*include\b[^\r\n]+\b(?:\Q$ppport\E|XSUB\.h)\b[^\r\n]*
+    | ^$HS*\#$HS*(?:define|elif|if(?:def)?)\b[^\r\n]* )
+  | ( ^$HS*\#[^\r\n]*
+    | "[^"\\]*(?:\\.[^"\\]*)*"
+    | '[^'\\]*(?:\\.[^'\\]*)*'
+    | / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]* ) )
+  }{ defined $2 and push @ccom, $2;
+     defined $1 ? $1 : "$ccs$#ccom$cce" }mgsex;
+
+  $file{ccom} = \@ccom;
+  $file{code} = $c;
+  $file{has_inc_ppport} = $c =~ /^$HS*#$HS*include[^\r\n]+\b\Q$ppport\E\b/m;
+
+  my $func;
+
+  for $func (keys %API) {
+    my $match = $func;
+    $match .= "|$revreplace{$func}" if exists $revreplace{$func};
+    if ($c =~ /\b(?:Perl_)?($match)\b/) {
+      $file{uses_replace}{$1}++ if exists $revreplace{$func} && $1 eq $revreplace{$func};
+      $file{uses_Perl}{$func}++ if $c =~ /\bPerl_$func\b/;
+      if (exists $API{$func}{provided}) {
+        $file{uses_provided}{$func}++;
+        if (!exists $API{$func}{base} || $API{$func}{base} > $opt{'compat-version'}) {
+          $file{uses}{$func}++;
+          my @deps = rec_depend($func);
+          if (@deps) {
+            $file{uses_deps}{$func} = \@deps;
+            for (@deps) {
+              $file{uses}{$_} = 0 unless exists $file{uses}{$_};
+            }
+          }
+          for ($func, @deps) {
+            $file{needs}{$_} = 'static' if exists $need{$_};
+          }
+        }
+      }
+      if (exists $API{$func}{todo} && $API{$func}{todo} > $opt{'compat-version'}) {
+        if ($c =~ /\b$func\b/) {
+          $file{uses_todo}{$func}++;
+        }
+      }
+    }
+  }
+
+  while ($c =~ /^$HS*#$HS*define$HS+(NEED_(\w+?)(_GLOBAL)?)\b/mg) {
+    if (exists $need{$2}) {
+      $file{defined $3 ? 'needed_global' : 'needed_static'}{$2}++;
+    }
+    else { warning("Possibly wrong #define $1 in $filename") }
+  }
+
+  for (qw(uses needs uses_todo needed_global needed_static)) {
+    for $func (keys %{$file{$_}}) {
+      push @{$global{$_}{$func}}, $filename;
+    }
+  }
+
+  $files{$filename} = \%file;
+}
+
+# Globally resolve NEED_'s
+my $need;
+for $need (keys %{$global{needs}}) {
+  if (@{$global{needs}{$need}} > 1) {
+    my @targets = @{$global{needs}{$need}};
+    my @t = grep $files{$_}{needed_global}{$need}, @targets;
+    @targets = @t if @t;
+    @t = grep /\.xs$/i, @targets;
+    @targets = @t if @t;
+    my $target = shift @targets;
+    $files{$target}{needs}{$need} = 'global';
+    for (@{$global{needs}{$need}}) {
+      $files{$_}{needs}{$need} = 'extern' if $_ ne $target;
+    }
+  }
+}
+
+for $filename (@files) {
+  exists $files{$filename} or next;
+
+  info("=== Analyzing $filename ===");
+
+  my %file = %{$files{$filename}};
+  my $func;
+  my $c = $file{code};
+  my $warnings = 0;
+
+  for $func (sort keys %{$file{uses_Perl}}) {
+    if ($API{$func}{varargs}) {
+      unless ($API{$func}{nothxarg}) {
+        my $changes = ($c =~ s{\b(Perl_$func\s*\(\s*)(?!aTHX_?)(\)|[^\s)]*\))}
+                              { $1 . ($2 eq ')' ? 'aTHX' : 'aTHX_ ') . $2 }ge);
+        if ($changes) {
+          warning("Doesn't pass interpreter argument aTHX to Perl_$func");
+          $file{changes} += $changes;
+        }
+      }
+    }
+    else {
+      warning("Uses Perl_$func instead of $func");
+      $file{changes} += ($c =~ s{\bPerl_$func(\s*)\((\s*aTHX_?)?\s*}
+                                {$func$1(}g);
+    }
+  }
+
+  for $func (sort keys %{$file{uses_replace}}) {
+    warning("Uses $func instead of $replace{$func}");
+    $file{changes} += ($c =~ s/\b$func\b/$replace{$func}/g);
+  }
+
+  for $func (sort keys %{$file{uses_provided}}) {
+    if ($file{uses}{$func}) {
+      if (exists $file{uses_deps}{$func}) {
+        diag("Uses $func, which depends on ", join(', ', @{$file{uses_deps}{$func}}));
+      }
+      else {
+        diag("Uses $func");
+      }
+    }
+    $warnings += hint($func);
+  }
+
+  unless ($opt{quiet}) {
+    for $func (sort keys %{$file{uses_todo}}) {
+      print "*** WARNING: Uses $func, which may not be portable below perl ",
+            format_version($API{$func}{todo}), ", even with '$ppport'\n";
+      $warnings++;
+    }
+  }
+
+  for $func (sort keys %{$file{needed_static}}) {
+    my $message = '';
+    if (not exists $file{uses}{$func}) {
+      $message = "No need to define NEED_$func if $func is never used";
+    }
+    elsif (exists $file{needs}{$func} && $file{needs}{$func} ne 'static') {
+      $message = "No need to define NEED_$func when already needed globally";
+    }
+    if ($message) {
+      diag($message);
+      $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_$func\b.*$LF//mg);
+    }
+  }
+
+  for $func (sort keys %{$file{needed_global}}) {
+    my $message = '';
+    if (not exists $global{uses}{$func}) {
+      $message = "No need to define NEED_${func}_GLOBAL if $func is never used";
+    }
+    elsif (exists $file{needs}{$func}) {
+      if ($file{needs}{$func} eq 'extern') {
+        $message = "No need to define NEED_${func}_GLOBAL when already needed globally";
+      }
+      elsif ($file{needs}{$func} eq 'static') {
+        $message = "No need to define NEED_${func}_GLOBAL when only used in this file";
+      }
+    }
+    if ($message) {
+      diag($message);
+      $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_${func}_GLOBAL\b.*$LF//mg);
+    }
+  }
+
+  $file{needs_inc_ppport} = keys %{$file{uses}};
+
+  if ($file{needs_inc_ppport}) {
+    my $pp = '';
+
+    for $func (sort keys %{$file{needs}}) {
+      my $type = $file{needs}{$func};
+      next if $type eq 'extern';
+      my $suffix = $type eq 'global' ? '_GLOBAL' : '';
+      unless (exists $file{"needed_$type"}{$func}) {
+        if ($type eq 'global') {
+          diag("Files [@{$global{needs}{$func}}] need $func, adding global request");
+        }
+        else {
+          diag("File needs $func, adding static request");
+        }
+        $pp .= "#define NEED_$func$suffix\n";
+      }
+    }
+
+    if ($pp && ($c =~ s/^(?=$HS*#$HS*define$HS+NEED_\w+)/$pp/m)) {
+      $pp = '';
+      $file{changes}++;
+    }
+
+    unless ($file{has_inc_ppport}) {
+      diag("Needs to include '$ppport'");
+      $pp .= qq(#include "$ppport"\n)
+    }
+
+    if ($pp) {
+      $file{changes} += ($c =~ s/^($HS*#$HS*define$HS+NEED_\w+.*?)^/$1$pp/ms)
+                     || ($c =~ s/^(?=$HS*#$HS*include.*\Q$ppport\E)/$pp/m)
+                     || ($c =~ s/^($HS*#$HS*include.*XSUB.*\s*?)^/$1$pp/m)
+                     || ($c =~ s/^/$pp/);
+    }
+  }
+  else {
+    if ($file{has_inc_ppport}) {
+      diag("No need to include '$ppport'");
+      $file{changes} += ($c =~ s/^$HS*?#$HS*include.*\Q$ppport\E.*?$LF//m);
+    }
+  }
+
+  # put back in our C comments
+  my $ix;
+  my $cppc = 0;
+  my @ccom = @{$file{ccom}};
+  for $ix (0 .. $#ccom) {
+    if (!$opt{cplusplus} && $ccom[$ix] =~ s!^//!!) {
+      $cppc++;
+      $file{changes} += $c =~ s/$rccs$ix$rcce/$ccs$ccom[$ix] $cce/;
+    }
+    else {
+      $c =~ s/$rccs$ix$rcce/$ccom[$ix]/;
+    }
+  }
+
+  if ($cppc) {
+    my $s = $cppc != 1 ? 's' : '';
+    warning("Uses $cppc C++ style comment$s, which is not portable");
+  }
+
+  my $s = $warnings != 1 ? 's' : '';
+  my $warn = $warnings ? " ($warnings warning$s)" : '';
+  info("Analysis completed$warn");
+
+  if ($file{changes}) {
+    if (exists $opt{copy}) {
+      my $newfile = "$filename$opt{copy}";
+      if (-e $newfile) {
+        error("'$newfile' already exists, refusing to write copy of '$filename'");
+      }
+      else {
+        local *F;
+        if (open F, ">$newfile") {
+          info("Writing copy of '$filename' with changes to '$newfile'");
+          print F $c;
+          close F;
+        }
+        else {
+          error("Cannot open '$newfile' for writing: $!");
+        }
+      }
+    }
+    elsif (exists $opt{patch} || $opt{changes}) {
+      if (exists $opt{patch}) {
+        unless ($patch_opened) {
+          if (open PATCH, ">$opt{patch}") {
+            $patch_opened = 1;
+          }
+          else {
+            error("Cannot open '$opt{patch}' for writing: $!");
+            delete $opt{patch};
+            $opt{changes} = 1;
+            goto fallback;
+          }
+        }
+        mydiff(\*PATCH, $filename, $c);
+      }
+      else {
+fallback:
+        info("Suggested changes:");
+        mydiff(\*STDOUT, $filename, $c);
+      }
+    }
+    else {
+      my $s = $file{changes} == 1 ? '' : 's';
+      info("$file{changes} potentially required change$s detected");
+    }
+  }
+  else {
+    info("Looks good");
+  }
+}
+
+close PATCH if $patch_opened;
+
+exit 0;
+
+
+sub try_use { eval "use @_;"; return $@ eq '' }
+
+sub mydiff
+{
+  local *F = shift;
+  my($file, $str) = @_;
+  my $diff;
+
+  if (exists $opt{diff}) {
+    $diff = run_diff($opt{diff}, $file, $str);
+  }
+
+  if (!defined $diff and try_use('Text::Diff')) {
+    $diff = Text::Diff::diff($file, \$str, { STYLE => 'Unified' });
+    $diff = <<HEADER . $diff;
+--- $file
++++ $file.patched
+HEADER
+  }
+
+  if (!defined $diff) {
+    $diff = run_diff('diff -u', $file, $str);
+  }
+
+  if (!defined $diff) {
+    $diff = run_diff('diff', $file, $str);
+  }
+
+  if (!defined $diff) {
+    error("Cannot generate a diff. Please install Text::Diff or use --copy.");
+    return;
+  }
+
+  print F $diff;
+}
+
+sub run_diff
+{
+  my($prog, $file, $str) = @_;
+  my $tmp = 'dppptemp';
+  my $suf = 'aaa';
+  my $diff = '';
+  local *F;
+
+  while (-e "$tmp.$suf") { $suf++ }
+  $tmp = "$tmp.$suf";
+
+  if (open F, ">$tmp") {
+    print F $str;
+    close F;
+
+    if (open F, "$prog $file $tmp |") {
+      while (<F>) {
+        s/\Q$tmp\E/$file.patched/;
+        $diff .= $_;
+      }
+      close F;
+      unlink $tmp;
+      return $diff;
+    }
+
+    unlink $tmp;
+  }
+  else {
+    error("Cannot open '$tmp' for writing: $!");
+  }
+
+  return undef;
+}
+
+sub rec_depend
+{
+  my($func, $seen) = @_;
+  return () unless exists $depends{$func};
+  $seen = {%{$seen||{}}};
+  return () if $seen->{$func}++;
+  my %s;
+  grep !$s{$_}++, map { ($_, rec_depend($_, $seen)) } @{$depends{$func}};
+}
+
+sub parse_version
+{
+  my $ver = shift;
+
+  if ($ver =~ /^(\d+)\.(\d+)\.(\d+)$/) {
+    return ($1, $2, $3);
+  }
+  elsif ($ver !~ /^\d+\.[\d_]+$/) {
+    die "cannot parse version '$ver'\n";
+  }
+
+  $ver =~ s/_//g;
+  $ver =~ s/$/000000/;
+
+  my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/;
+
+  $v = int $v;
+  $s = int $s;
+
+  if ($r < 5 || ($r == 5 && $v < 6)) {
+    if ($s % 10) {
+      die "cannot parse version '$ver'\n";
+    }
+  }
+
+  return ($r, $v, $s);
+}
+
+sub format_version
+{
+  my $ver = shift;
+
+  $ver =~ s/$/000000/;
+  my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/;
+
+  $v = int $v;
+  $s = int $s;
+
+  if ($r < 5 || ($r == 5 && $v < 6)) {
+    if ($s % 10) {
+      die "invalid version '$ver'\n";
+    }
+    $s /= 10;
+
+    $ver = sprintf "%d.%03d", $r, $v;
+    $s > 0 and $ver .= sprintf "_%02d", $s;
+
+    return $ver;
+  }
+
+  return sprintf "%d.%d.%d", $r, $v, $s;
+}
+
+sub info
+{
+  $opt{quiet} and return;
+  print @_, "\n";
+}
+
+sub diag
+{
+  $opt{quiet} and return;
+  $opt{diag} and print @_, "\n";
+}
+
+sub warning
+{
+  $opt{quiet} and return;
+  print "*** ", @_, "\n";
+}
+
+sub error
+{
+  print "*** ERROR: ", @_, "\n";
+}
+
+my %given_hints;
+my %given_warnings;
+sub hint
+{
+  $opt{quiet} and return;
+  my $func = shift;
+  my $rv = 0;
+  if (exists $warnings{$func} && !$given_warnings{$func}++) {
+    my $warn = $warnings{$func};
+    $warn =~ s!^!*** !mg;
+    print "*** WARNING: $func\n", $warn;
+    $rv++;
+  }
+  if ($opt{hints} && exists $hints{$func} && !$given_hints{$func}++) {
+    my $hint = $hints{$func};
+    $hint =~ s/^/   /mg;
+    print "   --- hint for $func ---\n", $hint;
+  }
+  $rv;
+}
+
+sub usage
+{
+  my($usage) = do { local(@ARGV,$/)=($0); <> } =~ /^=head\d$HS+SYNOPSIS\s*^(.*?)\s*^=/ms;
+  my %M = ( 'I' => '*' );
+  $usage =~ s/^\s*perl\s+\S+/$^X $0/;
+  $usage =~ s/([A-Z])<([^>]+)>/$M{$1}$2$M{$1}/g;
+
+  print <<ENDUSAGE;
+
+Usage: $usage
+
+See perldoc $0 for details.
+
+ENDUSAGE
+
+  exit 2;
+}
+
+sub strip
+{
+  my $self = do { local(@ARGV,$/)=($0); <> };
+  my($copy) = $self =~ /^=head\d\s+COPYRIGHT\s*^(.*?)^=\w+/ms;
+  $copy =~ s/^(?=\S+)/    /gms;
+  $self =~ s/^$HS+Do NOT edit.*?(?=^-)/$copy/ms;
+  $self =~ s/^SKIP.*(?=^__DATA__)/SKIP
+if (\@ARGV && \$ARGV[0] eq '--unstrip') {
+  eval { require Devel::PPPort };
+  \$@ and die "Cannot require Devel::PPPort, please install.\\n";
+  if (eval \$Devel::PPPort::VERSION < $VERSION) {
+    die "$0 was originally generated with Devel::PPPort $VERSION.\\n"
+      . "Your Devel::PPPort is only version \$Devel::PPPort::VERSION.\\n"
+      . "Please install a newer version, or --unstrip will not work.\\n";
+  }
+  Devel::PPPort::WriteFile(\$0);
+  exit 0;
+}
+print <<END;
+
+Sorry, but this is a stripped version of \$0.
+
+To be able to use its original script and doc functionality,
+please try to regenerate this file using:
+
+  \$^X \$0 --unstrip
+
+END
+/ms;
+  my($pl, $c) = $self =~ /(.*^__DATA__)(.*)/ms;
+  $c =~ s{
+    / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]*)
+  | ( "[^"\\]*(?:\\.[^"\\]*)*"
+    | '[^'\\]*(?:\\.[^'\\]*)*' )
+  | ($HS+) }{ defined $2 ? ' ' : ($1 || '') }gsex;
+  $c =~ s!\s+$!!mg;
+  $c =~ s!^$LF!!mg;
+  $c =~ s!^\s*#\s*!#!mg;
+  $c =~ s!^\s+!!mg;
+
+  open OUT, ">$0" or die "cannot strip $0: $!\n";
+  print OUT "$pl$c\n";
+
+  exit 0;
+}
+
+__DATA__
+*/
+
+#ifndef _P_P_PORTABILITY_H_
+#define _P_P_PORTABILITY_H_
+
+#ifndef DPPP_NAMESPACE
+#  define DPPP_NAMESPACE DPPP_
+#endif
+
+#define DPPP_CAT2(x,y) CAT2(x,y)
+#define DPPP_(name) DPPP_CAT2(DPPP_NAMESPACE, name)
+
+#ifndef PERL_REVISION
+#  if !defined(__PATCHLEVEL_H_INCLUDED__) && !(defined(PATCHLEVEL) && defined(SUBVERSION))
+#    define PERL_PATCHLEVEL_H_IMPLICIT
+#    include <patchlevel.h>
+#  endif
+#  if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL)))
+#    include <could_not_find_Perl_patchlevel.h>
+#  endif
+#  ifndef PERL_REVISION
+#    define PERL_REVISION       (5)
+     /* Replace: 1 */
+#    define PERL_VERSION        PATCHLEVEL
+#    define PERL_SUBVERSION     SUBVERSION
+     /* Replace PERL_PATCHLEVEL with PERL_VERSION */
+     /* Replace: 0 */
+#  endif
+#endif
+
+#define _dpppDEC2BCD(dec) ((((dec)/100)<<8)|((((dec)%100)/10)<<4)|((dec)%10))
+#define PERL_BCDVERSION ((_dpppDEC2BCD(PERL_REVISION)<<24)|(_dpppDEC2BCD(PERL_VERSION)<<12)|_dpppDEC2BCD(PERL_SUBVERSION))
+
+/* It is very unlikely that anyone will try to use this with Perl 6
+   (or greater), but who knows.
+ */
+#if PERL_REVISION != 5
+#  error newppp.h only works with Perl version 5
+#endif /* PERL_REVISION != 5 */
+#ifndef dTHR
+#  define dTHR                           dNOOP
+#endif
+#ifndef dTHX
+#  define dTHX                           dNOOP
+#endif
+
+#ifndef dTHXa
+#  define dTHXa(x)                       dNOOP
+#endif
+#ifndef pTHX
+#  define pTHX                           void
+#endif
+
+#ifndef pTHX_
+#  define pTHX_
+#endif
+
+#ifndef aTHX
+#  define aTHX
+#endif
+
+#ifndef aTHX_
+#  define aTHX_
+#endif
+
+#if (PERL_BCDVERSION < 0x5006000)
+#  ifdef USE_THREADS
+#    define aTHXR  thr
+#    define aTHXR_ thr,
+#  else
+#    define aTHXR
+#    define aTHXR_
+#  endif
+#  define dTHXR  dTHR
+#else
+#  define aTHXR  aTHX
+#  define aTHXR_ aTHX_
+#  define dTHXR  dTHX
+#endif
+#ifndef dTHXoa
+#  define dTHXoa(x)                      dTHXa(x)
+#endif
+
+#ifdef I_LIMITS
+#  include <limits.h>
+#endif
+
+#ifndef PERL_UCHAR_MIN
+#  define PERL_UCHAR_MIN ((unsigned char)0)
+#endif
+
+#ifndef PERL_UCHAR_MAX
+#  ifdef UCHAR_MAX
+#    define PERL_UCHAR_MAX ((unsigned char)UCHAR_MAX)
+#  else
+#    ifdef MAXUCHAR
+#      define PERL_UCHAR_MAX ((unsigned char)MAXUCHAR)
+#    else
+#      define PERL_UCHAR_MAX ((unsigned char)~(unsigned)0)
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_USHORT_MIN
+#  define PERL_USHORT_MIN ((unsigned short)0)
+#endif
+
+#ifndef PERL_USHORT_MAX
+#  ifdef USHORT_MAX
+#    define PERL_USHORT_MAX ((unsigned short)USHORT_MAX)
+#  else
+#    ifdef MAXUSHORT
+#      define PERL_USHORT_MAX ((unsigned short)MAXUSHORT)
+#    else
+#      ifdef USHRT_MAX
+#        define PERL_USHORT_MAX ((unsigned short)USHRT_MAX)
+#      else
+#        define PERL_USHORT_MAX ((unsigned short)~(unsigned)0)
+#      endif
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_SHORT_MAX
+#  ifdef SHORT_MAX
+#    define PERL_SHORT_MAX ((short)SHORT_MAX)
+#  else
+#    ifdef MAXSHORT    /* Often used in <values.h> */
+#      define PERL_SHORT_MAX ((short)MAXSHORT)
+#    else
+#      ifdef SHRT_MAX
+#        define PERL_SHORT_MAX ((short)SHRT_MAX)
+#      else
+#        define PERL_SHORT_MAX ((short) (PERL_USHORT_MAX >> 1))
+#      endif
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_SHORT_MIN
+#  ifdef SHORT_MIN
+#    define PERL_SHORT_MIN ((short)SHORT_MIN)
+#  else
+#    ifdef MINSHORT
+#      define PERL_SHORT_MIN ((short)MINSHORT)
+#    else
+#      ifdef SHRT_MIN
+#        define PERL_SHORT_MIN ((short)SHRT_MIN)
+#      else
+#        define PERL_SHORT_MIN (-PERL_SHORT_MAX - ((3 & -1) == 3))
+#      endif
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_UINT_MAX
+#  ifdef UINT_MAX
+#    define PERL_UINT_MAX ((unsigned int)UINT_MAX)
+#  else
+#    ifdef MAXUINT
+#      define PERL_UINT_MAX ((unsigned int)MAXUINT)
+#    else
+#      define PERL_UINT_MAX (~(unsigned int)0)
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_UINT_MIN
+#  define PERL_UINT_MIN ((unsigned int)0)
+#endif
+
+#ifndef PERL_INT_MAX
+#  ifdef INT_MAX
+#    define PERL_INT_MAX ((int)INT_MAX)
+#  else
+#    ifdef MAXINT    /* Often used in <values.h> */
+#      define PERL_INT_MAX ((int)MAXINT)
+#    else
+#      define PERL_INT_MAX ((int)(PERL_UINT_MAX >> 1))
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_INT_MIN
+#  ifdef INT_MIN
+#    define PERL_INT_MIN ((int)INT_MIN)
+#  else
+#    ifdef MININT
+#      define PERL_INT_MIN ((int)MININT)
+#    else
+#      define PERL_INT_MIN (-PERL_INT_MAX - ((3 & -1) == 3))
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_ULONG_MAX
+#  ifdef ULONG_MAX
+#    define PERL_ULONG_MAX ((unsigned long)ULONG_MAX)
+#  else
+#    ifdef MAXULONG
+#      define PERL_ULONG_MAX ((unsigned long)MAXULONG)
+#    else
+#      define PERL_ULONG_MAX (~(unsigned long)0)
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_ULONG_MIN
+#  define PERL_ULONG_MIN ((unsigned long)0L)
+#endif
+
+#ifndef PERL_LONG_MAX
+#  ifdef LONG_MAX
+#    define PERL_LONG_MAX ((long)LONG_MAX)
+#  else
+#    ifdef MAXLONG
+#      define PERL_LONG_MAX ((long)MAXLONG)
+#    else
+#      define PERL_LONG_MAX ((long) (PERL_ULONG_MAX >> 1))
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_LONG_MIN
+#  ifdef LONG_MIN
+#    define PERL_LONG_MIN ((long)LONG_MIN)
+#  else
+#    ifdef MINLONG
+#      define PERL_LONG_MIN ((long)MINLONG)
+#    else
+#      define PERL_LONG_MIN (-PERL_LONG_MAX - ((3 & -1) == 3))
+#    endif
+#  endif
+#endif
+
+#if defined(HAS_QUAD) && (defined(convex) || defined(uts))
+#  ifndef PERL_UQUAD_MAX
+#    ifdef ULONGLONG_MAX
+#      define PERL_UQUAD_MAX ((unsigned long long)ULONGLONG_MAX)
+#    else
+#      ifdef MAXULONGLONG
+#        define PERL_UQUAD_MAX ((unsigned long long)MAXULONGLONG)
+#      else
+#        define PERL_UQUAD_MAX (~(unsigned long long)0)
+#      endif
+#    endif
+#  endif
+
+#  ifndef PERL_UQUAD_MIN
+#    define PERL_UQUAD_MIN ((unsigned long long)0L)
+#  endif
+
+#  ifndef PERL_QUAD_MAX
+#    ifdef LONGLONG_MAX
+#      define PERL_QUAD_MAX ((long long)LONGLONG_MAX)
+#    else
+#      ifdef MAXLONGLONG
+#        define PERL_QUAD_MAX ((long long)MAXLONGLONG)
+#      else
+#        define PERL_QUAD_MAX ((long long) (PERL_UQUAD_MAX >> 1))
+#      endif
+#    endif
+#  endif
+
+#  ifndef PERL_QUAD_MIN
+#    ifdef LONGLONG_MIN
+#      define PERL_QUAD_MIN ((long long)LONGLONG_MIN)
+#    else
+#      ifdef MINLONGLONG
+#        define PERL_QUAD_MIN ((long long)MINLONGLONG)
+#      else
+#        define PERL_QUAD_MIN (-PERL_QUAD_MAX - ((3 & -1) == 3))
+#      endif
+#    endif
+#  endif
+#endif
+
+/* This is based on code from 5.003 perl.h */
+#ifdef HAS_QUAD
+#  ifdef cray
+#ifndef IVTYPE
+#  define IVTYPE                         int
+#endif
+
+#ifndef IV_MIN
+#  define IV_MIN                         PERL_INT_MIN
+#endif
+
+#ifndef IV_MAX
+#  define IV_MAX                         PERL_INT_MAX
+#endif
+
+#ifndef UV_MIN
+#  define UV_MIN                         PERL_UINT_MIN
+#endif
+
+#ifndef UV_MAX
+#  define UV_MAX                         PERL_UINT_MAX
+#endif
+
+#    ifdef INTSIZE
+#ifndef IVSIZE
+#  define IVSIZE                         INTSIZE
+#endif
+
+#    endif
+#  else
+#    if defined(convex) || defined(uts)
+#ifndef IVTYPE
+#  define IVTYPE                         long long
+#endif
+
+#ifndef IV_MIN
+#  define IV_MIN                         PERL_QUAD_MIN
+#endif
+
+#ifndef IV_MAX
+#  define IV_MAX                         PERL_QUAD_MAX
+#endif
+
+#ifndef UV_MIN
+#  define UV_MIN                         PERL_UQUAD_MIN
+#endif
+
+#ifndef UV_MAX
+#  define UV_MAX                         PERL_UQUAD_MAX
+#endif
+
+#      ifdef LONGLONGSIZE
+#ifndef IVSIZE
+#  define IVSIZE                         LONGLONGSIZE
+#endif
+
+#      endif
+#    else
+#ifndef IVTYPE
+#  define IVTYPE                         long
+#endif
+
+#ifndef IV_MIN
+#  define IV_MIN                         PERL_LONG_MIN
+#endif
+
+#ifndef IV_MAX
+#  define IV_MAX                         PERL_LONG_MAX
+#endif
+
+#ifndef UV_MIN
+#  define UV_MIN                         PERL_ULONG_MIN
+#endif
+
+#ifndef UV_MAX
+#  define UV_MAX                         PERL_ULONG_MAX
+#endif
+
+#      ifdef LONGSIZE
+#ifndef IVSIZE
+#  define IVSIZE                         LONGSIZE
+#endif
+
+#      endif
+#    endif
+#  endif
+#ifndef IVSIZE
+#  define IVSIZE                         8
+#endif
+
+#ifndef PERL_QUAD_MIN
+#  define PERL_QUAD_MIN                  IV_MIN
+#endif
+
+#ifndef PERL_QUAD_MAX
+#  define PERL_QUAD_MAX                  IV_MAX
+#endif
+
+#ifndef PERL_UQUAD_MIN
+#  define PERL_UQUAD_MIN                 UV_MIN
+#endif
+
+#ifndef PERL_UQUAD_MAX
+#  define PERL_UQUAD_MAX                 UV_MAX
+#endif
+
+#else
+#ifndef IVTYPE
+#  define IVTYPE                         long
+#endif
+
+#ifndef IV_MIN
+#  define IV_MIN                         PERL_LONG_MIN
+#endif
+
+#ifndef IV_MAX
+#  define IV_MAX                         PERL_LONG_MAX
+#endif
+
+#ifndef UV_MIN
+#  define UV_MIN                         PERL_ULONG_MIN
+#endif
+
+#ifndef UV_MAX
+#  define UV_MAX                         PERL_ULONG_MAX
+#endif
+
+#endif
+
+#ifndef IVSIZE
+#  ifdef LONGSIZE
+#    define IVSIZE LONGSIZE
+#  else
+#    define IVSIZE 4 /* A bold guess, but the best we can make. */
+#  endif
+#endif
+#ifndef UVTYPE
+#  define UVTYPE                         unsigned IVTYPE
+#endif
+
+#ifndef UVSIZE
+#  define UVSIZE                         IVSIZE
+#endif
+#ifndef sv_setuv
+#  define sv_setuv(sv, uv)               \
+               STMT_START {                         \
+                 UV TeMpUv = uv;                    \
+                 if (TeMpUv <= IV_MAX)              \
+                   sv_setiv(sv, TeMpUv);            \
+                 else                               \
+                   sv_setnv(sv, (double)TeMpUv);    \
+               } STMT_END
+#endif
+#ifndef newSVuv
+#  define newSVuv(uv)                    ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv))
+#endif
+#ifndef sv_2uv
+#  define sv_2uv(sv)                     ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv)))
+#endif
+
+#ifndef SvUVX
+#  define SvUVX(sv)                      ((UV)SvIVX(sv))
+#endif
+
+#ifndef SvUVXx
+#  define SvUVXx(sv)                     SvUVX(sv)
+#endif
+
+#ifndef SvUV
+#  define SvUV(sv)                       (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv))
+#endif
+
+#ifndef SvUVx
+#  define SvUVx(sv)                      ((PL_Sv = (sv)), SvUV(PL_Sv))
+#endif
+
+/* Hint: sv_uv
+ * Always use the SvUVx() macro instead of sv_uv().
+ */
+#ifndef sv_uv
+#  define sv_uv(sv)                      SvUVx(sv)
+#endif
+
+#if !defined(SvUOK) && defined(SvIOK_UV)
+#  define SvUOK(sv) SvIOK_UV(sv)
+#endif
+#ifndef XST_mUV
+#  define XST_mUV(i,v)                   (ST(i) = sv_2mortal(newSVuv(v))  )
+#endif
+
+#ifndef XSRETURN_UV
+#  define XSRETURN_UV(v)                 STMT_START { XST_mUV(0,v);  XSRETURN(1); } STMT_END
+#endif
+#ifndef PUSHu
+#  define PUSHu(u)                       STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG;  } STMT_END
+#endif
+
+#ifndef XPUSHu
+#  define XPUSHu(u)                      STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END
+#endif
+
+#ifdef HAS_MEMCMP
+#ifndef memNE
+#  define memNE(s1,s2,l)                 (memcmp(s1,s2,l))
+#endif
+
+#ifndef memEQ
+#  define memEQ(s1,s2,l)                 (!memcmp(s1,s2,l))
+#endif
+
+#else
+#ifndef memNE
+#  define memNE(s1,s2,l)                 (bcmp(s1,s2,l))
+#endif
+
+#ifndef memEQ
+#  define memEQ(s1,s2,l)                 (!bcmp(s1,s2,l))
+#endif
+
+#endif
+#ifndef memEQs
+#  define memEQs(s1, l, s2)              \
+                   (sizeof(s2)-1 == l && memEQ(s1, (s2 ""), (sizeof(s2)-1)))
+#endif
+
+#ifndef memNEs
+#  define memNEs(s1, l, s2)              !memEQs(s1, l, s2)
+#endif
+#ifndef MoveD
+#  define MoveD(s,d,n,t)                 memmove((char*)(d),(char*)(s), (n) * sizeof(t))
+#endif
+
+#ifndef CopyD
+#  define CopyD(s,d,n,t)                 memcpy((char*)(d),(char*)(s), (n) * sizeof(t))
+#endif
+
+#ifdef HAS_MEMSET
+#ifndef ZeroD
+#  define ZeroD(d,n,t)                   memzero((char*)(d), (n) * sizeof(t))
+#endif
+
+#else
+#ifndef ZeroD
+#  define ZeroD(d,n,t)                   ((void)memzero((char*)(d), (n) * sizeof(t)), d)
+#endif
+
+#endif
+#ifndef PoisonWith
+#  define PoisonWith(d,n,t,b)            (void)memset((char*)(d), (U8)(b), (n) * sizeof(t))
+#endif
+
+#ifndef PoisonNew
+#  define PoisonNew(d,n,t)               PoisonWith(d,n,t,0xAB)
+#endif
+
+#ifndef PoisonFree
+#  define PoisonFree(d,n,t)              PoisonWith(d,n,t,0xEF)
+#endif
+
+#ifndef Poison
+#  define Poison(d,n,t)                  PoisonFree(d,n,t)
+#endif
+#ifndef Newx
+#  define Newx(v,n,t)                    New(0,v,n,t)
+#endif
+
+#ifndef Newxc
+#  define Newxc(v,n,t,c)                 Newc(0,v,n,t,c)
+#endif
+
+#ifndef Newxz
+#  define Newxz(v,n,t)                   Newz(0,v,n,t)
+#endif
+
+#ifndef PERL_UNUSED_DECL
+#  ifdef HASATTRIBUTE
+#    if (defined(__GNUC__) && defined(__cplusplus)) || defined(__INTEL_COMPILER)
+#      define PERL_UNUSED_DECL
+#    else
+#      define PERL_UNUSED_DECL __attribute__((unused))
+#    endif
+#  else
+#    define PERL_UNUSED_DECL
+#  endif
+#endif
+
+#ifndef PERL_UNUSED_ARG
+#  if defined(lint) && defined(S_SPLINT_S) /* www.splint.org */
+#    include <note.h>
+#    define PERL_UNUSED_ARG(x) NOTE(ARGUNUSED(x))
+#  else
+#    define PERL_UNUSED_ARG(x) ((void)x)
+#  endif
+#endif
+
+#ifndef PERL_UNUSED_VAR
+#  define PERL_UNUSED_VAR(x) ((void)x)
+#endif
+
+#ifndef PERL_UNUSED_CONTEXT
+#  ifdef USE_ITHREADS
+#    define PERL_UNUSED_CONTEXT PERL_UNUSED_ARG(my_perl)
+#  else
+#    define PERL_UNUSED_CONTEXT
+#  endif
+#endif
+#ifndef NOOP
+#  define NOOP                           /*EMPTY*/(void)0
+#endif
+
+#ifndef dNOOP
+#  define dNOOP                          extern int /*@unused@*/ Perl___notused PERL_UNUSED_DECL
+#endif
+
+#ifndef NVTYPE
+#  if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE)
+#    define NVTYPE long double
+#  else
+#    define NVTYPE double
+#  endif
+typedef NVTYPE NV;
+#endif
+
+#ifndef INT2PTR
+#  if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE)
+#    define PTRV                  UV
+#    define INT2PTR(any,d)        (any)(d)
+#  else
+#    if PTRSIZE == LONGSIZE
+#      define PTRV                unsigned long
+#    else
+#      define PTRV                unsigned
+#    endif
+#    define INT2PTR(any,d)        (any)(PTRV)(d)
+#  endif
+#endif
+
+#ifndef PTR2ul
+#  if PTRSIZE == LONGSIZE
+#    define PTR2ul(p)     (unsigned long)(p)
+#  else
+#    define PTR2ul(p)     INT2PTR(unsigned long,p)
+#  endif
+#endif
+#ifndef PTR2nat
+#  define PTR2nat(p)                     (PTRV)(p)
+#endif
+
+#ifndef NUM2PTR
+#  define NUM2PTR(any,d)                 (any)PTR2nat(d)
+#endif
+
+#ifndef PTR2IV
+#  define PTR2IV(p)                      INT2PTR(IV,p)
+#endif
+
+#ifndef PTR2UV
+#  define PTR2UV(p)                      INT2PTR(UV,p)
+#endif
+
+#ifndef PTR2NV
+#  define PTR2NV(p)                      NUM2PTR(NV,p)
+#endif
+
+#undef START_EXTERN_C
+#undef END_EXTERN_C
+#undef EXTERN_C
+#ifdef __cplusplus
+#  define START_EXTERN_C extern "C" {
+#  define END_EXTERN_C }
+#  define EXTERN_C extern "C"
+#else
+#  define START_EXTERN_C
+#  define END_EXTERN_C
+#  define EXTERN_C extern
+#endif
+
+#if defined(PERL_GCC_PEDANTIC)
+#  ifndef PERL_GCC_BRACE_GROUPS_FORBIDDEN
+#    define PERL_GCC_BRACE_GROUPS_FORBIDDEN
+#  endif
+#endif
+
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__cplusplus)
+#  ifndef PERL_USE_GCC_BRACE_GROUPS
+#    define PERL_USE_GCC_BRACE_GROUPS
+#  endif
+#endif
+
+#undef STMT_START
+#undef STMT_END
+#ifdef PERL_USE_GCC_BRACE_GROUPS
+#  define STMT_START	(void)(	/* gcc supports ``({ STATEMENTS; })'' */
+#  define STMT_END	)
+#else
+#  if defined(VOIDFLAGS) && (VOIDFLAGS) && (defined(sun) || defined(__sun__)) && !defined(__GNUC__)
+#    define STMT_START	if (1)
+#    define STMT_END	else (void)0
+#  else
+#    define STMT_START	do
+#    define STMT_END	while (0)
+#  endif
+#endif
+#ifndef boolSV
+#  define boolSV(b)                      ((b) ? &PL_sv_yes : &PL_sv_no)
+#endif
+
+/* DEFSV appears first in 5.004_56 */
+#ifndef DEFSV
+#  define DEFSV                          GvSV(PL_defgv)
+#endif
+
+#ifndef SAVE_DEFSV
+#  define SAVE_DEFSV                     SAVESPTR(GvSV(PL_defgv))
+#endif
+
+#ifndef DEFSV_set
+#  define DEFSV_set(sv)                  (DEFSV = (sv))
+#endif
+
+/* Older perls (<=5.003) lack AvFILLp */
+#ifndef AvFILLp
+#  define AvFILLp                        AvFILL
+#endif
+#ifndef ERRSV
+#  define ERRSV                          get_sv("@",FALSE)
+#endif
+
+/* Hint: gv_stashpvn
+ * This function's backport doesn't support the length parameter, but
+ * rather ignores it. Portability can only be ensured if the length
+ * parameter is used for speed reasons, but the length can always be
+ * correctly computed from the string argument.
+ */
+#ifndef gv_stashpvn
+#  define gv_stashpvn(str,len,create)    gv_stashpv(str,create)
+#endif
+
+/* Replace: 1 */
+#ifndef get_cv
+#  define get_cv                         perl_get_cv
+#endif
+
+#ifndef get_sv
+#  define get_sv                         perl_get_sv
+#endif
+
+#ifndef get_av
+#  define get_av                         perl_get_av
+#endif
+
+#ifndef get_hv
+#  define get_hv                         perl_get_hv
+#endif
+
+/* Replace: 0 */
+#ifndef dUNDERBAR
+#  define dUNDERBAR                      dNOOP
+#endif
+
+#ifndef UNDERBAR
+#  define UNDERBAR                       DEFSV
+#endif
+#ifndef dAX
+#  define dAX                            I32 ax = MARK - PL_stack_base + 1
+#endif
+
+#ifndef dITEMS
+#  define dITEMS                         I32 items = SP - MARK
+#endif
+#ifndef dXSTARG
+#  define dXSTARG                        SV * targ = sv_newmortal()
+#endif
+#ifndef dAXMARK
+#  define dAXMARK                        I32 ax = POPMARK; \
+                               register SV ** const mark = PL_stack_base + ax++
+#endif
+#ifndef XSprePUSH
+#  define XSprePUSH                      (sp = PL_stack_base + ax - 1)
+#endif
+
+#if (PERL_BCDVERSION < 0x5005000)
+#  undef XSRETURN
+#  define XSRETURN(off)                                   \
+      STMT_START {                                        \
+          PL_stack_sp = PL_stack_base + ax + ((off) - 1); \
+          return;                                         \
+      } STMT_END
+#endif
+#ifndef XSPROTO
+#  define XSPROTO(name)                  void name(pTHX_ CV* cv)
+#endif
+
+#ifndef SVfARG
+#  define SVfARG(p)                      ((void*)(p))
+#endif
+#ifndef PERL_ABS
+#  define PERL_ABS(x)                    ((x) < 0 ? -(x) : (x))
+#endif
+#ifndef dVAR
+#  define dVAR                           dNOOP
+#endif
+#ifndef SVf
+#  define SVf                            "_"
+#endif
+#ifndef UTF8_MAXBYTES
+#  define UTF8_MAXBYTES                  UTF8_MAXLEN
+#endif
+#ifndef CPERLscope
+#  define CPERLscope(x)                  x
+#endif
+#ifndef PERL_HASH
+#  define PERL_HASH(hash,str,len)        \
+     STMT_START	{ \
+	const char *s_PeRlHaSh = str; \
+	I32 i_PeRlHaSh = len; \
+	U32 hash_PeRlHaSh = 0; \
+	while (i_PeRlHaSh--) \
+	    hash_PeRlHaSh = hash_PeRlHaSh * 33 + *s_PeRlHaSh++; \
+	(hash) = hash_PeRlHaSh; \
+    } STMT_END
+#endif
+
+#ifndef PERLIO_FUNCS_DECL
+# ifdef PERLIO_FUNCS_CONST
+#  define PERLIO_FUNCS_DECL(funcs) const PerlIO_funcs funcs
+#  define PERLIO_FUNCS_CAST(funcs) (PerlIO_funcs*)(funcs)
+# else
+#  define PERLIO_FUNCS_DECL(funcs) PerlIO_funcs funcs
+#  define PERLIO_FUNCS_CAST(funcs) (funcs)
+# endif
+#endif
+
+/* provide these typedefs for older perls */
+#if (PERL_BCDVERSION < 0x5009003)
+
+# ifdef ARGSproto
+typedef OP* (CPERLscope(*Perl_ppaddr_t))(ARGSproto);
+# else
+typedef OP* (CPERLscope(*Perl_ppaddr_t))(pTHX);
+# endif
+
+typedef OP* (CPERLscope(*Perl_check_t)) (pTHX_ OP*);
+
+#endif
+#ifndef isPSXSPC
+#  define isPSXSPC(c)                    (isSPACE(c) || (c) == '\v')
+#endif
+
+#ifndef isBLANK
+#  define isBLANK(c)                     ((c) == ' ' || (c) == '\t')
+#endif
+
+#ifdef EBCDIC
+#ifndef isALNUMC
+#  define isALNUMC(c)                    isalnum(c)
+#endif
+
+#ifndef isASCII
+#  define isASCII(c)                     isascii(c)
+#endif
+
+#ifndef isCNTRL
+#  define isCNTRL(c)                     iscntrl(c)
+#endif
+
+#ifndef isGRAPH
+#  define isGRAPH(c)                     isgraph(c)
+#endif
+
+#ifndef isPRINT
+#  define isPRINT(c)                     isprint(c)
+#endif
+
+#ifndef isPUNCT
+#  define isPUNCT(c)                     ispunct(c)
+#endif
+
+#ifndef isXDIGIT
+#  define isXDIGIT(c)                    isxdigit(c)
+#endif
+
+#else
+# if (PERL_BCDVERSION < 0x5010000)
+/* Hint: isPRINT
+ * The implementation in older perl versions includes all of the
+ * isSPACE() characters, which is wrong. The version provided by
+ * Devel::PPPort always overrides a present buggy version.
+ */
+#  undef isPRINT
+# endif
+#ifndef isALNUMC
+#  define isALNUMC(c)                    (isALPHA(c) || isDIGIT(c))
+#endif
+
+#ifndef isASCII
+#  define isASCII(c)                     ((U8) (c) <= 127)
+#endif
+
+#ifndef isCNTRL
+#  define isCNTRL(c)                     ((U8) (c) < ' ' || (c) == 127)
+#endif
+
+#ifndef isGRAPH
+#  define isGRAPH(c)                     (isALNUM(c) || isPUNCT(c))
+#endif
+
+#ifndef isPRINT
+#  define isPRINT(c)                     (((c) >= 32 && (c) < 127))
+#endif
+
+#ifndef isPUNCT
+#  define isPUNCT(c)                     (((c) >= 33 && (c) <= 47) || ((c) >= 58 && (c) <= 64)  || ((c) >= 91 && (c) <= 96) || ((c) >= 123 && (c) <= 126))
+#endif
+
+#ifndef isXDIGIT
+#  define isXDIGIT(c)                    (isDIGIT(c) || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F'))
+#endif
+
+#endif
+
+#ifndef PERL_SIGNALS_UNSAFE_FLAG
+
+#define PERL_SIGNALS_UNSAFE_FLAG 0x0001
+
+#if (PERL_BCDVERSION < 0x5008000)
+#  define D_PPP_PERL_SIGNALS_INIT   PERL_SIGNALS_UNSAFE_FLAG
+#else
+#  define D_PPP_PERL_SIGNALS_INIT   0
+#endif
+
+#if defined(NEED_PL_signals)
+static U32 DPPP_(my_PL_signals) = D_PPP_PERL_SIGNALS_INIT;
+#elif defined(NEED_PL_signals_GLOBAL)
+U32 DPPP_(my_PL_signals) = D_PPP_PERL_SIGNALS_INIT;
+#else
+extern U32 DPPP_(my_PL_signals);
+#endif
+#define PL_signals DPPP_(my_PL_signals)
+
+#endif
+
+/* Hint: PL_ppaddr
+ * Calling an op via PL_ppaddr requires passing a context argument
+ * for threaded builds. Since the context argument is different for
+ * 5.005 perls, you can use aTHXR (supplied by newppp.h), which will
+ * automatically be defined as the correct argument.
+ */
+
+#if (PERL_BCDVERSION <= 0x5005005)
+/* Replace: 1 */
+#  define PL_ppaddr                 ppaddr
+#  define PL_no_modify              no_modify
+/* Replace: 0 */
+#endif
+
+#if (PERL_BCDVERSION <= 0x5004005)
+/* Replace: 1 */
+#  define PL_DBsignal               DBsignal
+#  define PL_DBsingle               DBsingle
+#  define PL_DBsub                  DBsub
+#  define PL_DBtrace                DBtrace
+#  define PL_Sv                     Sv
+#  define PL_bufend                 bufend
+#  define PL_bufptr                 bufptr
+#  define PL_compiling              compiling
+#  define PL_copline                copline
+#  define PL_curcop                 curcop
+#  define PL_curstash               curstash
+#  define PL_debstash               debstash
+#  define PL_defgv                  defgv
+#  define PL_diehook                diehook
+#  define PL_dirty                  dirty
+#  define PL_dowarn                 dowarn
+#  define PL_errgv                  errgv
+#  define PL_error_count            error_count
+#  define PL_expect                 expect
+#  define PL_hexdigit               hexdigit
+#  define PL_hints                  hints
+#  define PL_in_my                  in_my
+#  define PL_laststatval            laststatval
+#  define PL_lex_state              lex_state
+#  define PL_lex_stuff              lex_stuff
+#  define PL_linestr                linestr
+#  define PL_na                     na
+#  define PL_perl_destruct_level    perl_destruct_level
+#  define PL_perldb                 perldb
+#  define PL_rsfp_filters           rsfp_filters
+#  define PL_rsfp                   rsfp
+#  define PL_stack_base             stack_base
+#  define PL_stack_sp               stack_sp
+#  define PL_statcache              statcache
+#  define PL_stdingv                stdingv
+#  define PL_sv_arenaroot           sv_arenaroot
+#  define PL_sv_no                  sv_no
+#  define PL_sv_undef               sv_undef
+#  define PL_sv_yes                 sv_yes
+#  define PL_tainted                tainted
+#  define PL_tainting               tainting
+#  define PL_tokenbuf               tokenbuf
+/* Replace: 0 */
+#endif
+
+/* Warning: PL_parser
+ * For perl versions earlier than 5.9.5, this is an always
+ * non-NULL dummy. Also, it cannot be dereferenced. Don't
+ * use it if you can avoid is and unless you absolutely know
+ * what you're doing.
+ * If you always check that PL_parser is non-NULL, you can
+ * define DPPP_PL_parser_NO_DUMMY to avoid the creation of
+ * a dummy parser structure.
+ */
+
+#if (PERL_BCDVERSION >= 0x5009005)
+# ifdef DPPP_PL_parser_NO_DUMMY
+#  define D_PPP_my_PL_parser_var(var) ((PL_parser ? PL_parser : \
+                (croak("panic: PL_parser == NULL in %s:%d", \
+                       __FILE__, __LINE__), (yy_parser *) NULL))->var)
+# else
+#  ifdef DPPP_PL_parser_NO_DUMMY_WARNING
+#   define D_PPP_parser_dummy_warning(var)
+#  else
+#   define D_PPP_parser_dummy_warning(var) \
+             warn("warning: dummy PL_" #var " used in %s:%d", __FILE__, __LINE__),
+#  endif
+#  define D_PPP_my_PL_parser_var(var) ((PL_parser ? PL_parser : \
+                (D_PPP_parser_dummy_warning(var) &DPPP_(dummy_PL_parser)))->var)
+#if defined(NEED_PL_parser)
+static yy_parser DPPP_(dummy_PL_parser);
+#elif defined(NEED_PL_parser_GLOBAL)
+yy_parser DPPP_(dummy_PL_parser);
+#else
+extern yy_parser DPPP_(dummy_PL_parser);
+#endif
+
+# endif
+
+/* PL_expect, PL_copline, PL_rsfp, PL_rsfp_filters, PL_linestr, PL_bufptr, PL_bufend, PL_lex_state, PL_lex_stuff, PL_tokenbuf depends on PL_parser */
+/* Warning: PL_expect, PL_copline, PL_rsfp, PL_rsfp_filters, PL_linestr, PL_bufptr, PL_bufend, PL_lex_state, PL_lex_stuff, PL_tokenbuf
+ * Do not use this variable unless you know exactly what you're
+ * doint. It is internal to the perl parser and may change or even
+ * be removed in the future. As of perl 5.9.5, you have to check
+ * for (PL_parser != NULL) for this variable to have any effect.
+ * An always non-NULL PL_parser dummy is provided for earlier
+ * perl versions.
+ * If PL_parser is NULL when you try to access this variable, a
+ * dummy is being accessed instead and a warning is issued unless
+ * you define DPPP_PL_parser_NO_DUMMY_WARNING.
+ * If DPPP_PL_parser_NO_DUMMY is defined, the code trying to access
+ * this variable will croak with a panic message.
+ */
+
+# define PL_expect         D_PPP_my_PL_parser_var(expect)
+# define PL_copline        D_PPP_my_PL_parser_var(copline)
+# define PL_rsfp           D_PPP_my_PL_parser_var(rsfp)
+# define PL_rsfp_filters   D_PPP_my_PL_parser_var(rsfp_filters)
+# define PL_linestr        D_PPP_my_PL_parser_var(linestr)
+# define PL_bufptr         D_PPP_my_PL_parser_var(bufptr)
+# define PL_bufend         D_PPP_my_PL_parser_var(bufend)
+# define PL_lex_state      D_PPP_my_PL_parser_var(lex_state)
+# define PL_lex_stuff      D_PPP_my_PL_parser_var(lex_stuff)
+# define PL_tokenbuf       D_PPP_my_PL_parser_var(tokenbuf)
+# define PL_in_my          D_PPP_my_PL_parser_var(in_my)
+# define PL_in_my_stash    D_PPP_my_PL_parser_var(in_my_stash)
+# define PL_error_count    D_PPP_my_PL_parser_var(error_count)
+
+
+#else
+
+/* ensure that PL_parser != NULL and cannot be dereferenced */
+# define PL_parser         ((void *) 1)
+
+#endif
+#ifndef mPUSHs
+#  define mPUSHs(s)                      PUSHs(sv_2mortal(s))
+#endif
+
+#ifndef PUSHmortal
+#  define PUSHmortal                     PUSHs(sv_newmortal())
+#endif
+
+#ifndef mPUSHp
+#  define mPUSHp(p,l)                    sv_setpvn(PUSHmortal, (p), (l))
+#endif
+
+#ifndef mPUSHn
+#  define mPUSHn(n)                      sv_setnv(PUSHmortal, (NV)(n))
+#endif
+
+#ifndef mPUSHi
+#  define mPUSHi(i)                      sv_setiv(PUSHmortal, (IV)(i))
+#endif
+
+#ifndef mPUSHu
+#  define mPUSHu(u)                      sv_setuv(PUSHmortal, (UV)(u))
+#endif
+#ifndef mXPUSHs
+#  define mXPUSHs(s)                     XPUSHs(sv_2mortal(s))
+#endif
+
+#ifndef XPUSHmortal
+#  define XPUSHmortal                    XPUSHs(sv_newmortal())
+#endif
+
+#ifndef mXPUSHp
+#  define mXPUSHp(p,l)                   STMT_START { EXTEND(sp,1); sv_setpvn(PUSHmortal, (p), (l)); } STMT_END
+#endif
+
+#ifndef mXPUSHn
+#  define mXPUSHn(n)                     STMT_START { EXTEND(sp,1); sv_setnv(PUSHmortal, (NV)(n)); } STMT_END
+#endif
+
+#ifndef mXPUSHi
+#  define mXPUSHi(i)                     STMT_START { EXTEND(sp,1); sv_setiv(PUSHmortal, (IV)(i)); } STMT_END
+#endif
+
+#ifndef mXPUSHu
+#  define mXPUSHu(u)                     STMT_START { EXTEND(sp,1); sv_setuv(PUSHmortal, (UV)(u)); } STMT_END
+#endif
+
+/* Replace: 1 */
+#ifndef call_sv
+#  define call_sv                        perl_call_sv
+#endif
+
+#ifndef call_pv
+#  define call_pv                        perl_call_pv
+#endif
+
+#ifndef call_argv
+#  define call_argv                      perl_call_argv
+#endif
+
+#ifndef call_method
+#  define call_method                    perl_call_method
+#endif
+#ifndef eval_sv
+#  define eval_sv                        perl_eval_sv
+#endif
+
+/* Replace: 0 */
+#ifndef PERL_LOADMOD_DENY
+#  define PERL_LOADMOD_DENY              0x1
+#endif
+
+#ifndef PERL_LOADMOD_NOIMPORT
+#  define PERL_LOADMOD_NOIMPORT          0x2
+#endif
+
+#ifndef PERL_LOADMOD_IMPORT_OPS
+#  define PERL_LOADMOD_IMPORT_OPS        0x4
+#endif
+
+#ifndef G_METHOD
+# define G_METHOD		64
+# ifdef call_sv
+#  undef call_sv
+# endif
+# if (PERL_BCDVERSION < 0x5006000)
+#  define call_sv(sv, flags)  ((flags) & G_METHOD ? perl_call_method((char *) SvPV_nolen_const(sv), \
+				(flags) & ~G_METHOD) : perl_call_sv(sv, flags))
+# else
+#  define call_sv(sv, flags)  ((flags) & G_METHOD ? Perl_call_method(aTHX_ (char *) SvPV_nolen_const(sv), \
+				(flags) & ~G_METHOD) : Perl_call_sv(aTHX_ sv, flags))
+# endif
+#endif
+
+/* Replace perl_eval_pv with eval_pv */
+
+#ifndef eval_pv
+#if defined(NEED_eval_pv)
+static SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error);
+static
+#else
+extern SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error);
+#endif
+
+#ifdef eval_pv
+#  undef eval_pv
+#endif
+#define eval_pv(a,b) DPPP_(my_eval_pv)(aTHX_ a,b)
+#define Perl_eval_pv DPPP_(my_eval_pv)
+
+#if defined(NEED_eval_pv) || defined(NEED_eval_pv_GLOBAL)
+
+SV*
+DPPP_(my_eval_pv)(char *p, I32 croak_on_error)
+{
+    dSP;
+    SV* sv = newSVpv(p, 0);
+
+    PUSHMARK(sp);
+    eval_sv(sv, G_SCALAR);
+    SvREFCNT_dec(sv);
+
+    SPAGAIN;
+    sv = POPs;
+    PUTBACK;
+
+    if (croak_on_error && SvTRUE(GvSV(errgv)))
+	croak(SvPVx(GvSV(errgv), na));
+
+    return sv;
+}
+
+#endif
+#endif
+
+#ifndef vload_module
+#if defined(NEED_vload_module)
+static void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args);
+static
+#else
+extern void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args);
+#endif
+
+#ifdef vload_module
+#  undef vload_module
+#endif
+#define vload_module(a,b,c,d) DPPP_(my_vload_module)(aTHX_ a,b,c,d)
+#define Perl_vload_module DPPP_(my_vload_module)
+
+#if defined(NEED_vload_module) || defined(NEED_vload_module_GLOBAL)
+
+void
+DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args)
+{
+    dTHR;
+    dVAR;
+    OP *veop, *imop;
+
+    OP * const modname = newSVOP(OP_CONST, 0, name);
+    /* 5.005 has a somewhat hacky force_normal that doesn't croak on
+       SvREADONLY() if PL_compling is true. Current perls take care in
+       ck_require() to correctly turn off SvREADONLY before calling
+       force_normal_flags(). This seems a better fix than fudging PL_compling
+     */
+    SvREADONLY_off(((SVOP*)modname)->op_sv);
+    modname->op_private |= OPpCONST_BARE;
+    if (ver) {
+	veop = newSVOP(OP_CONST, 0, ver);
+    }
+    else
+	veop = NULL;
+    if (flags & PERL_LOADMOD_NOIMPORT) {
+	imop = sawparens(newNULLLIST());
+    }
+    else if (flags & PERL_LOADMOD_IMPORT_OPS) {
+	imop = va_arg(*args, OP*);
+    }
+    else {
+	SV *sv;
+	imop = NULL;
+	sv = va_arg(*args, SV*);
+	while (sv) {
+	    imop = append_elem(OP_LIST, imop, newSVOP(OP_CONST, 0, sv));
+	    sv = va_arg(*args, SV*);
+	}
+    }
+    {
+	const line_t ocopline = PL_copline;
+	COP * const ocurcop = PL_curcop;
+	const int oexpect = PL_expect;
+
+#if (PERL_BCDVERSION >= 0x5004000)
+	utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(FALSE, 0),
+		veop, modname, imop);
+#else
+	utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(),
+		modname, imop);
+#endif
+	PL_expect = oexpect;
+	PL_copline = ocopline;
+	PL_curcop = ocurcop;
+    }
+}
+
+#endif
+#endif
+
+#ifndef load_module
+#if defined(NEED_load_module)
+static void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...);
+static
+#else
+extern void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...);
+#endif
+
+#ifdef load_module
+#  undef load_module
+#endif
+#define load_module DPPP_(my_load_module)
+#define Perl_load_module DPPP_(my_load_module)
+
+#if defined(NEED_load_module) || defined(NEED_load_module_GLOBAL)
+
+void
+DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...)
+{
+    va_list args;
+    va_start(args, ver);
+    vload_module(flags, name, ver, &args);
+    va_end(args);
+}
+
+#endif
+#endif
+#ifndef newRV_inc
+#  define newRV_inc(sv)                  newRV(sv)   /* Replace */
+#endif
+
+#ifndef newRV_noinc
+#if defined(NEED_newRV_noinc)
+static SV * DPPP_(my_newRV_noinc)(SV *sv);
+static
+#else
+extern SV * DPPP_(my_newRV_noinc)(SV *sv);
+#endif
+
+#ifdef newRV_noinc
+#  undef newRV_noinc
+#endif
+#define newRV_noinc(a) DPPP_(my_newRV_noinc)(aTHX_ a)
+#define Perl_newRV_noinc DPPP_(my_newRV_noinc)
+
+#if defined(NEED_newRV_noinc) || defined(NEED_newRV_noinc_GLOBAL)
+SV *
+DPPP_(my_newRV_noinc)(SV *sv)
+{
+  SV *rv = (SV *)newRV(sv);
+  SvREFCNT_dec(sv);
+  return rv;
+}
+#endif
+#endif
+
+/* Hint: newCONSTSUB
+ * Returns a CV* as of perl-5.7.1. This return value is not supported
+ * by Devel::PPPort.
+ */
+
+/* newCONSTSUB from IO.xs is in the core starting with 5.004_63 */
+#if (PERL_BCDVERSION < 0x5004063) && (PERL_BCDVERSION != 0x5004005)
+#if defined(NEED_newCONSTSUB)
+static void DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv);
+static
+#else
+extern void DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv);
+#endif
+
+#ifdef newCONSTSUB
+#  undef newCONSTSUB
+#endif
+#define newCONSTSUB(a,b,c) DPPP_(my_newCONSTSUB)(aTHX_ a,b,c)
+#define Perl_newCONSTSUB DPPP_(my_newCONSTSUB)
+
+#if defined(NEED_newCONSTSUB) || defined(NEED_newCONSTSUB_GLOBAL)
+
+/* This is just a trick to avoid a dependency of newCONSTSUB on PL_parser */
+/* (There's no PL_parser in perl < 5.005, so this is completely safe)     */
+#define D_PPP_PL_copline PL_copline
+
+void
+DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv)
+{
+	U32 oldhints = PL_hints;
+	HV *old_cop_stash = PL_curcop->cop_stash;
+	HV *old_curstash = PL_curstash;
+	line_t oldline = PL_curcop->cop_line;
+	PL_curcop->cop_line = D_PPP_PL_copline;
+
+	PL_hints &= ~HINT_BLOCK_SCOPE;
+	if (stash)
+		PL_curstash = PL_curcop->cop_stash = stash;
+
+	newSUB(
+
+#if   (PERL_BCDVERSION < 0x5003022)
+		start_subparse(),
+#elif (PERL_BCDVERSION == 0x5003022)
+     		start_subparse(0),
+#else  /* 5.003_23  onwards */
+     		start_subparse(FALSE, 0),
+#endif
+
+		newSVOP(OP_CONST, 0, newSVpv((char *) name, 0)),
+		newSVOP(OP_CONST, 0, &PL_sv_no),   /* SvPV(&PL_sv_no) == "" -- GMB */
+		newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv))
+	);
+
+	PL_hints = oldhints;
+	PL_curcop->cop_stash = old_cop_stash;
+	PL_curstash = old_curstash;
+	PL_curcop->cop_line = oldline;
+}
+#endif
+#endif
+
+/*
+ * Boilerplate macros for initializing and accessing interpreter-local
+ * data from C.  All statics in extensions should be reworked to use
+ * this, if you want to make the extension thread-safe.  See ext/re/re.xs
+ * for an example of the use of these macros.
+ *
+ * Code that uses these macros is responsible for the following:
+ * 1. #define MY_CXT_KEY to a unique string, e.g. "DynaLoader_guts"
+ * 2. Declare a typedef named my_cxt_t that is a structure that contains
+ *    all the data that needs to be interpreter-local.
+ * 3. Use the START_MY_CXT macro after the declaration of my_cxt_t.
+ * 4. Use the MY_CXT_INIT macro such that it is called exactly once
+ *    (typically put in the BOOT: section).
+ * 5. Use the members of the my_cxt_t structure everywhere as
+ *    MY_CXT.member.
+ * 6. Use the dMY_CXT macro (a declaration) in all the functions that
+ *    access MY_CXT.
+ */
+
+#if defined(MULTIPLICITY) || defined(PERL_OBJECT) || \
+    defined(PERL_CAPI)    || defined(PERL_IMPLICIT_CONTEXT)
+
+#ifndef START_MY_CXT
+
+/* This must appear in all extensions that define a my_cxt_t structure,
+ * right after the definition (i.e. at file scope).  The non-threads
+ * case below uses it to declare the data as static. */
+#define START_MY_CXT
+
+#if (PERL_BCDVERSION < 0x5004068)
+/* Fetches the SV that keeps the per-interpreter data. */
+#define dMY_CXT_SV \
+	SV *my_cxt_sv = get_sv(MY_CXT_KEY, FALSE)
+#else /* >= perl5.004_68 */
+#define dMY_CXT_SV \
+	SV *my_cxt_sv = *hv_fetch(PL_modglobal, MY_CXT_KEY,		\
+				  sizeof(MY_CXT_KEY)-1, TRUE)
+#endif /* < perl5.004_68 */
+
+/* This declaration should be used within all functions that use the
+ * interpreter-local data. */
+#define dMY_CXT	\
+	dMY_CXT_SV;							\
+	my_cxt_t *my_cxtp = INT2PTR(my_cxt_t*,SvUV(my_cxt_sv))
+
+/* Creates and zeroes the per-interpreter data.
+ * (We allocate my_cxtp in a Perl SV so that it will be released when
+ * the interpreter goes away.) */
+#define MY_CXT_INIT \
+	dMY_CXT_SV;							\
+	/* newSV() allocates one more than needed */			\
+	my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\
+	Zero(my_cxtp, 1, my_cxt_t);					\
+	sv_setuv(my_cxt_sv, PTR2UV(my_cxtp))
+
+/* This macro must be used to access members of the my_cxt_t structure.
+ * e.g. MYCXT.some_data */
+#define MY_CXT		(*my_cxtp)
+
+/* Judicious use of these macros can reduce the number of times dMY_CXT
+ * is used.  Use is similar to pTHX, aTHX etc. */
+#define pMY_CXT		my_cxt_t *my_cxtp
+#define pMY_CXT_	pMY_CXT,
+#define _pMY_CXT	,pMY_CXT
+#define aMY_CXT		my_cxtp
+#define aMY_CXT_	aMY_CXT,
+#define _aMY_CXT	,aMY_CXT
+
+#endif /* START_MY_CXT */
+
+#ifndef MY_CXT_CLONE
+/* Clones the per-interpreter data. */
+#define MY_CXT_CLONE \
+	dMY_CXT_SV;							\
+	my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\
+	Copy(INT2PTR(my_cxt_t*, SvUV(my_cxt_sv)), my_cxtp, 1, my_cxt_t);\
+	sv_setuv(my_cxt_sv, PTR2UV(my_cxtp))
+#endif
+
+#else /* single interpreter */
+
+#ifndef START_MY_CXT
+
+#define START_MY_CXT	static my_cxt_t my_cxt;
+#define dMY_CXT_SV	dNOOP
+#define dMY_CXT		dNOOP
+#define MY_CXT_INIT	NOOP
+#define MY_CXT		my_cxt
+
+#define pMY_CXT		void
+#define pMY_CXT_
+#define _pMY_CXT
+#define aMY_CXT
+#define aMY_CXT_
+#define _aMY_CXT
+
+#endif /* START_MY_CXT */
+
+#ifndef MY_CXT_CLONE
+#define MY_CXT_CLONE	NOOP
+#endif
+
+#endif
+
+#ifndef IVdf
+#  if IVSIZE == LONGSIZE
+#    define	IVdf      "ld"
+#    define	UVuf      "lu"
+#    define	UVof      "lo"
+#    define	UVxf      "lx"
+#    define	UVXf      "lX"
+#  else
+#    if IVSIZE == INTSIZE
+#      define	IVdf      "d"
+#      define	UVuf      "u"
+#      define	UVof      "o"
+#      define	UVxf      "x"
+#      define	UVXf      "X"
+#    endif
+#  endif
+#endif
+
+#ifndef NVef
+#  if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) && \
+      defined(PERL_PRIfldbl) && (PERL_BCDVERSION != 0x5006000)
+            /* Not very likely, but let's try anyway. */
+#    define NVef          PERL_PRIeldbl
+#    define NVff          PERL_PRIfldbl
+#    define NVgf          PERL_PRIgldbl
+#  else
+#    define NVef          "e"
+#    define NVff          "f"
+#    define NVgf          "g"
+#  endif
+#endif
+
+#ifndef SvREFCNT_inc
+#  ifdef PERL_USE_GCC_BRACE_GROUPS
+#    define SvREFCNT_inc(sv)		\
+      ({				\
+          SV * const _sv = (SV*)(sv);	\
+          if (_sv)			\
+               (SvREFCNT(_sv))++;	\
+          _sv;				\
+      })
+#  else
+#    define SvREFCNT_inc(sv)	\
+          ((PL_Sv=(SV*)(sv)) ? (++(SvREFCNT(PL_Sv)),PL_Sv) : NULL)
+#  endif
+#endif
+
+#ifndef SvREFCNT_inc_simple
+#  ifdef PERL_USE_GCC_BRACE_GROUPS
+#    define SvREFCNT_inc_simple(sv)	\
+      ({					\
+          if (sv)				\
+               (SvREFCNT(sv))++;		\
+          (SV *)(sv);				\
+      })
+#  else
+#    define SvREFCNT_inc_simple(sv) \
+          ((sv) ? (SvREFCNT(sv)++,(SV*)(sv)) : NULL)
+#  endif
+#endif
+
+#ifndef SvREFCNT_inc_NN
+#  ifdef PERL_USE_GCC_BRACE_GROUPS
+#    define SvREFCNT_inc_NN(sv)		\
+      ({					\
+          SV * const _sv = (SV*)(sv);	\
+          SvREFCNT(_sv)++;		\
+          _sv;				\
+      })
+#  else
+#    define SvREFCNT_inc_NN(sv) \
+          (PL_Sv=(SV*)(sv),++(SvREFCNT(PL_Sv)),PL_Sv)
+#  endif
+#endif
+
+#ifndef SvREFCNT_inc_void
+#  ifdef PERL_USE_GCC_BRACE_GROUPS
+#    define SvREFCNT_inc_void(sv)		\
+      ({					\
+          SV * const _sv = (SV*)(sv);	\
+          if (_sv)			\
+              (void)(SvREFCNT(_sv)++);	\
+      })
+#  else
+#    define SvREFCNT_inc_void(sv) \
+          (void)((PL_Sv=(SV*)(sv)) ? ++(SvREFCNT(PL_Sv)) : 0)
+#  endif
+#endif
+#ifndef SvREFCNT_inc_simple_void
+#  define SvREFCNT_inc_simple_void(sv)   STMT_START { if (sv) SvREFCNT(sv)++; } STMT_END
+#endif
+
+#ifndef SvREFCNT_inc_simple_NN
+#  define SvREFCNT_inc_simple_NN(sv)     (++SvREFCNT(sv), (SV*)(sv))
+#endif
+
+#ifndef SvREFCNT_inc_void_NN
+#  define SvREFCNT_inc_void_NN(sv)       (void)(++SvREFCNT((SV*)(sv)))
+#endif
+
+#ifndef SvREFCNT_inc_simple_void_NN
+#  define SvREFCNT_inc_simple_void_NN(sv) (void)(++SvREFCNT((SV*)(sv)))
+#endif
+
+#ifndef newSV_type
+
+#if defined(NEED_newSV_type)
+static SV* DPPP_(my_newSV_type)(pTHX_ svtype const t);
+static
+#else
+extern SV* DPPP_(my_newSV_type)(pTHX_ svtype const t);
+#endif
+
+#ifdef newSV_type
+#  undef newSV_type
+#endif
+#define newSV_type(a) DPPP_(my_newSV_type)(aTHX_ a)
+#define Perl_newSV_type DPPP_(my_newSV_type)
+
+#if defined(NEED_newSV_type) || defined(NEED_newSV_type_GLOBAL)
+
+SV*
+DPPP_(my_newSV_type)(pTHX_ svtype const t)
+{
+  SV* const sv = newSV(0);
+  sv_upgrade(sv, t);
+  return sv;
+}
+
+#endif
+
+#endif
+
+#if (PERL_BCDVERSION < 0x5006000)
+# define D_PPP_CONSTPV_ARG(x)  ((char *) (x))
+#else
+# define D_PPP_CONSTPV_ARG(x)  (x)
+#endif
+#ifndef newSVpvn
+#  define newSVpvn(data,len)             ((data)                                              \
+                                    ? ((len) ? newSVpv((data), (len)) : newSVpv("", 0)) \
+                                    : newSV(0))
+#endif
+#ifndef newSVpvn_utf8
+#  define newSVpvn_utf8(s, len, u)       newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0)
+#endif
+#ifndef SVf_UTF8
+#  define SVf_UTF8                       0
+#endif
+
+#ifndef newSVpvn_flags
+
+#if defined(NEED_newSVpvn_flags)
+static SV * DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags);
+static
+#else
+extern SV * DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags);
+#endif
+
+#ifdef newSVpvn_flags
+#  undef newSVpvn_flags
+#endif
+#define newSVpvn_flags(a,b,c) DPPP_(my_newSVpvn_flags)(aTHX_ a,b,c)
+#define Perl_newSVpvn_flags DPPP_(my_newSVpvn_flags)
+
+#if defined(NEED_newSVpvn_flags) || defined(NEED_newSVpvn_flags_GLOBAL)
+
+SV *
+DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags)
+{
+  SV *sv = newSVpvn(D_PPP_CONSTPV_ARG(s), len);
+  SvFLAGS(sv) |= (flags & SVf_UTF8);
+  return (flags & SVs_TEMP) ? sv_2mortal(sv) : sv;
+}
+
+#endif
+
+#endif
+
+/* Backwards compatibility stuff... :-( */
+#if !defined(NEED_sv_2pv_flags) && defined(NEED_sv_2pv_nolen)
+#  define NEED_sv_2pv_flags
+#endif
+#if !defined(NEED_sv_2pv_flags_GLOBAL) && defined(NEED_sv_2pv_nolen_GLOBAL)
+#  define NEED_sv_2pv_flags_GLOBAL
+#endif
+
+/* Hint: sv_2pv_nolen
+ * Use the SvPV_nolen() or SvPV_nolen_const() macros instead of sv_2pv_nolen().
+ */
+#ifndef sv_2pv_nolen
+#  define sv_2pv_nolen(sv)               SvPV_nolen(sv)
+#endif
+
+#ifdef SvPVbyte
+
+/* Hint: SvPVbyte
+ * Does not work in perl-5.6.1, newppp.h implements a version
+ * borrowed from perl-5.7.3.
+ */
+
+#if (PERL_BCDVERSION < 0x5007000)
+
+#if defined(NEED_sv_2pvbyte)
+static char * DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp);
+static
+#else
+extern char * DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp);
+#endif
+
+#ifdef sv_2pvbyte
+#  undef sv_2pvbyte
+#endif
+#define sv_2pvbyte(a,b) DPPP_(my_sv_2pvbyte)(aTHX_ a,b)
+#define Perl_sv_2pvbyte DPPP_(my_sv_2pvbyte)
+
+#if defined(NEED_sv_2pvbyte) || defined(NEED_sv_2pvbyte_GLOBAL)
+
+char *
+DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp)
+{
+  sv_utf8_downgrade(sv,0);
+  return SvPV(sv,*lp);
+}
+
+#endif
+
+/* Hint: sv_2pvbyte
+ * Use the SvPVbyte() macro instead of sv_2pvbyte().
+ */
+
+#undef SvPVbyte
+
+#define SvPVbyte(sv, lp)                                                \
+        ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK)                \
+         ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte(sv, &lp))
+
+#endif
+
+#else
+
+#  define SvPVbyte          SvPV
+#  define sv_2pvbyte        sv_2pv
+
+#endif
+#ifndef sv_2pvbyte_nolen
+#  define sv_2pvbyte_nolen(sv)           sv_2pv_nolen(sv)
+#endif
+
+/* Hint: sv_pvn
+ * Always use the SvPV() macro instead of sv_pvn().
+ */
+
+/* Hint: sv_pvn_force
+ * Always use the SvPV_force() macro instead of sv_pvn_force().
+ */
+
+/* If these are undefined, they're not handled by the core anyway */
+#ifndef SV_IMMEDIATE_UNREF
+#  define SV_IMMEDIATE_UNREF             0
+#endif
+
+#ifndef SV_GMAGIC
+#  define SV_GMAGIC                      0
+#endif
+
+#ifndef SV_COW_DROP_PV
+#  define SV_COW_DROP_PV                 0
+#endif
+
+#ifndef SV_UTF8_NO_ENCODING
+#  define SV_UTF8_NO_ENCODING            0
+#endif
+
+#ifndef SV_NOSTEAL
+#  define SV_NOSTEAL                     0
+#endif
+
+#ifndef SV_CONST_RETURN
+#  define SV_CONST_RETURN                0
+#endif
+
+#ifndef SV_MUTABLE_RETURN
+#  define SV_MUTABLE_RETURN              0
+#endif
+
+#ifndef SV_SMAGIC
+#  define SV_SMAGIC                      0
+#endif
+
+#ifndef SV_HAS_TRAILING_NUL
+#  define SV_HAS_TRAILING_NUL            0
+#endif
+
+#ifndef SV_COW_SHARED_HASH_KEYS
+#  define SV_COW_SHARED_HASH_KEYS        0
+#endif
+
+#if (PERL_BCDVERSION < 0x5007002)
+
+#if defined(NEED_sv_2pv_flags)
+static char * DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags);
+static
+#else
+extern char * DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags);
+#endif
+
+#ifdef sv_2pv_flags
+#  undef sv_2pv_flags
+#endif
+#define sv_2pv_flags(a,b,c) DPPP_(my_sv_2pv_flags)(aTHX_ a,b,c)
+#define Perl_sv_2pv_flags DPPP_(my_sv_2pv_flags)
+
+#if defined(NEED_sv_2pv_flags) || defined(NEED_sv_2pv_flags_GLOBAL)
+
+char *
+DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags)
+{
+  STRLEN n_a = (STRLEN) flags;
+  return sv_2pv(sv, lp ? lp : &n_a);
+}
+
+#endif
+
+#if defined(NEED_sv_pvn_force_flags)
+static char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags);
+static
+#else
+extern char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags);
+#endif
+
+#ifdef sv_pvn_force_flags
+#  undef sv_pvn_force_flags
+#endif
+#define sv_pvn_force_flags(a,b,c) DPPP_(my_sv_pvn_force_flags)(aTHX_ a,b,c)
+#define Perl_sv_pvn_force_flags DPPP_(my_sv_pvn_force_flags)
+
+#if defined(NEED_sv_pvn_force_flags) || defined(NEED_sv_pvn_force_flags_GLOBAL)
+
+char *
+DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags)
+{
+  STRLEN n_a = (STRLEN) flags;
+  return sv_pvn_force(sv, lp ? lp : &n_a);
+}
+
+#endif
+
+#endif
+
+#if (PERL_BCDVERSION < 0x5008008) || ( (PERL_BCDVERSION >= 0x5009000) && (PERL_BCDVERSION < 0x5009003) )
+# define DPPP_SVPV_NOLEN_LP_ARG &PL_na
+#else
+# define DPPP_SVPV_NOLEN_LP_ARG 0
+#endif
+#ifndef SvPV_const
+#  define SvPV_const(sv, lp)             SvPV_flags_const(sv, lp, SV_GMAGIC)
+#endif
+
+#ifndef SvPV_mutable
+#  define SvPV_mutable(sv, lp)           SvPV_flags_mutable(sv, lp, SV_GMAGIC)
+#endif
+#ifndef SvPV_flags
+#  define SvPV_flags(sv, lp, flags)      \
+                 ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+                  ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pv_flags(sv, &lp, flags))
+#endif
+#ifndef SvPV_flags_const
+#  define SvPV_flags_const(sv, lp, flags) \
+                 ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+                  ? ((lp = SvCUR(sv)), SvPVX_const(sv)) : \
+                  (const char*) sv_2pv_flags(sv, &lp, flags|SV_CONST_RETURN))
+#endif
+#ifndef SvPV_flags_const_nolen
+#  define SvPV_flags_const_nolen(sv, flags) \
+                 ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+                  ? SvPVX_const(sv) : \
+                  (const char*) sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, flags|SV_CONST_RETURN))
+#endif
+#ifndef SvPV_flags_mutable
+#  define SvPV_flags_mutable(sv, lp, flags) \
+                 ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+                  ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) : \
+                  sv_2pv_flags(sv, &lp, flags|SV_MUTABLE_RETURN))
+#endif
+#ifndef SvPV_force
+#  define SvPV_force(sv, lp)             SvPV_force_flags(sv, lp, SV_GMAGIC)
+#endif
+
+#ifndef SvPV_force_nolen
+#  define SvPV_force_nolen(sv)           SvPV_force_flags_nolen(sv, SV_GMAGIC)
+#endif
+
+#ifndef SvPV_force_mutable
+#  define SvPV_force_mutable(sv, lp)     SvPV_force_flags_mutable(sv, lp, SV_GMAGIC)
+#endif
+
+#ifndef SvPV_force_nomg
+#  define SvPV_force_nomg(sv, lp)        SvPV_force_flags(sv, lp, 0)
+#endif
+
+#ifndef SvPV_force_nomg_nolen
+#  define SvPV_force_nomg_nolen(sv)      SvPV_force_flags_nolen(sv, 0)
+#endif
+#ifndef SvPV_force_flags
+#  define SvPV_force_flags(sv, lp, flags) \
+                 ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \
+                 ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_pvn_force_flags(sv, &lp, flags))
+#endif
+#ifndef SvPV_force_flags_nolen
+#  define SvPV_force_flags_nolen(sv, flags) \
+                 ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \
+                 ? SvPVX(sv) : sv_pvn_force_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, flags))
+#endif
+#ifndef SvPV_force_flags_mutable
+#  define SvPV_force_flags_mutable(sv, lp, flags) \
+                 ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \
+                 ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) \
+                  : sv_pvn_force_flags(sv, &lp, flags|SV_MUTABLE_RETURN))
+#endif
+#ifndef SvPV_nolen
+#  define SvPV_nolen(sv)                 \
+                 ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+                  ? SvPVX(sv) : sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC))
+#endif
+#ifndef SvPV_nolen_const
+#  define SvPV_nolen_const(sv)           \
+                 ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+                  ? SvPVX_const(sv) : sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC|SV_CONST_RETURN))
+#endif
+#ifndef SvPV_nomg
+#  define SvPV_nomg(sv, lp)              SvPV_flags(sv, lp, 0)
+#endif
+
+#ifndef SvPV_nomg_const
+#  define SvPV_nomg_const(sv, lp)        SvPV_flags_const(sv, lp, 0)
+#endif
+
+#ifndef SvPV_nomg_const_nolen
+#  define SvPV_nomg_const_nolen(sv)      SvPV_flags_const_nolen(sv, 0)
+#endif
+#ifndef SvPV_renew
+#  define SvPV_renew(sv,n)               STMT_START { SvLEN_set(sv, n); \
+                 SvPV_set((sv), (char *) saferealloc(          \
+                       (Malloc_t)SvPVX(sv), (MEM_SIZE)((n)))); \
+               } STMT_END
+#endif
+#ifndef SvMAGIC_set
+#  define SvMAGIC_set(sv, val)           \
+                STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
+                (((XPVMG*) SvANY(sv))->xmg_magic = (val)); } STMT_END
+#endif
+
+#if (PERL_BCDVERSION < 0x5009003)
+#ifndef SvPVX_const
+#  define SvPVX_const(sv)                ((const char*) (0 + SvPVX(sv)))
+#endif
+
+#ifndef SvPVX_mutable
+#  define SvPVX_mutable(sv)              (0 + SvPVX(sv))
+#endif
+#ifndef SvRV_set
+#  define SvRV_set(sv, val)              \
+                STMT_START { assert(SvTYPE(sv) >=  SVt_RV); \
+                (((XRV*) SvANY(sv))->xrv_rv = (val)); } STMT_END
+#endif
+
+#else
+#ifndef SvPVX_const
+#  define SvPVX_const(sv)                ((const char*)((sv)->sv_u.svu_pv))
+#endif
+
+#ifndef SvPVX_mutable
+#  define SvPVX_mutable(sv)              ((sv)->sv_u.svu_pv)
+#endif
+#ifndef SvRV_set
+#  define SvRV_set(sv, val)              \
+                STMT_START { assert(SvTYPE(sv) >=  SVt_RV); \
+                ((sv)->sv_u.svu_rv = (val)); } STMT_END
+#endif
+
+#endif
+#ifndef SvSTASH_set
+#  define SvSTASH_set(sv, val)           \
+                STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
+                (((XPVMG*) SvANY(sv))->xmg_stash = (val)); } STMT_END
+#endif
+
+#if (PERL_BCDVERSION < 0x5004000)
+#ifndef SvUV_set
+#  define SvUV_set(sv, val)              \
+                STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \
+                (((XPVIV*) SvANY(sv))->xiv_iv = (IV) (val)); } STMT_END
+#endif
+
+#else
+#ifndef SvUV_set
+#  define SvUV_set(sv, val)              \
+                STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \
+                (((XPVUV*) SvANY(sv))->xuv_uv = (val)); } STMT_END
+#endif
+
+#endif
+
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(vnewSVpvf)
+#if defined(NEED_vnewSVpvf)
+static SV * DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args);
+static
+#else
+extern SV * DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args);
+#endif
+
+#ifdef vnewSVpvf
+#  undef vnewSVpvf
+#endif
+#define vnewSVpvf(a,b) DPPP_(my_vnewSVpvf)(aTHX_ a,b)
+#define Perl_vnewSVpvf DPPP_(my_vnewSVpvf)
+
+#if defined(NEED_vnewSVpvf) || defined(NEED_vnewSVpvf_GLOBAL)
+
+SV *
+DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args)
+{
+  register SV *sv = newSV(0);
+  sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
+  return sv;
+}
+
+#endif
+#endif
+
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vcatpvf)
+#  define sv_vcatpvf(sv, pat, args)  sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*))
+#endif
+
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vsetpvf)
+#  define sv_vsetpvf(sv, pat, args)  sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*))
+#endif
+
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_catpvf_mg)
+#if defined(NEED_sv_catpvf_mg)
+static void DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...);
+static
+#else
+extern void DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...);
+#endif
+
+#define Perl_sv_catpvf_mg DPPP_(my_sv_catpvf_mg)
+
+#if defined(NEED_sv_catpvf_mg) || defined(NEED_sv_catpvf_mg_GLOBAL)
+
+void
+DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...)
+{
+  va_list args;
+  va_start(args, pat);
+  sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+  SvSETMAGIC(sv);
+  va_end(args);
+}
+
+#endif
+#endif
+
+#ifdef PERL_IMPLICIT_CONTEXT
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_catpvf_mg_nocontext)
+#if defined(NEED_sv_catpvf_mg_nocontext)
+static void DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...);
+static
+#else
+extern void DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...);
+#endif
+
+#define sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext)
+#define Perl_sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext)
+
+#if defined(NEED_sv_catpvf_mg_nocontext) || defined(NEED_sv_catpvf_mg_nocontext_GLOBAL)
+
+void
+DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...)
+{
+  dTHX;
+  va_list args;
+  va_start(args, pat);
+  sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+  SvSETMAGIC(sv);
+  va_end(args);
+}
+
+#endif
+#endif
+#endif
+
+/* sv_catpvf_mg depends on sv_catpvf_mg_nocontext */
+#ifndef sv_catpvf_mg
+#  ifdef PERL_IMPLICIT_CONTEXT
+#    define sv_catpvf_mg   Perl_sv_catpvf_mg_nocontext
+#  else
+#    define sv_catpvf_mg   Perl_sv_catpvf_mg
+#  endif
+#endif
+
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vcatpvf_mg)
+#  define sv_vcatpvf_mg(sv, pat, args)                                     \
+   STMT_START {                                                            \
+     sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));  \
+     SvSETMAGIC(sv);                                                       \
+   } STMT_END
+#endif
+
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_setpvf_mg)
+#if defined(NEED_sv_setpvf_mg)
+static void DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...);
+static
+#else
+extern void DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...);
+#endif
+
+#define Perl_sv_setpvf_mg DPPP_(my_sv_setpvf_mg)
+
+#if defined(NEED_sv_setpvf_mg) || defined(NEED_sv_setpvf_mg_GLOBAL)
+
+void
+DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...)
+{
+  va_list args;
+  va_start(args, pat);
+  sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+  SvSETMAGIC(sv);
+  va_end(args);
+}
+
+#endif
+#endif
+
+#ifdef PERL_IMPLICIT_CONTEXT
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_setpvf_mg_nocontext)
+#if defined(NEED_sv_setpvf_mg_nocontext)
+static void DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...);
+static
+#else
+extern void DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...);
+#endif
+
+#define sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext)
+#define Perl_sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext)
+
+#if defined(NEED_sv_setpvf_mg_nocontext) || defined(NEED_sv_setpvf_mg_nocontext_GLOBAL)
+
+void
+DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...)
+{
+  dTHX;
+  va_list args;
+  va_start(args, pat);
+  sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+  SvSETMAGIC(sv);
+  va_end(args);
+}
+
+#endif
+#endif
+#endif
+
+/* sv_setpvf_mg depends on sv_setpvf_mg_nocontext */
+#ifndef sv_setpvf_mg
+#  ifdef PERL_IMPLICIT_CONTEXT
+#    define sv_setpvf_mg   Perl_sv_setpvf_mg_nocontext
+#  else
+#    define sv_setpvf_mg   Perl_sv_setpvf_mg
+#  endif
+#endif
+
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vsetpvf_mg)
+#  define sv_vsetpvf_mg(sv, pat, args)                                     \
+   STMT_START {                                                            \
+     sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));  \
+     SvSETMAGIC(sv);                                                       \
+   } STMT_END
+#endif
+
+/* Hint: newSVpvn_share
+ * The SVs created by this function only mimic the behaviour of
+ * shared PVs without really being shared. Only use if you know
+ * what you're doing.
+ */
+
+#ifndef newSVpvn_share
+
+#if defined(NEED_newSVpvn_share)
+static SV * DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash);
+static
+#else
+extern SV * DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash);
+#endif
+
+#ifdef newSVpvn_share
+#  undef newSVpvn_share
+#endif
+#define newSVpvn_share(a,b,c) DPPP_(my_newSVpvn_share)(aTHX_ a,b,c)
+#define Perl_newSVpvn_share DPPP_(my_newSVpvn_share)
+
+#if defined(NEED_newSVpvn_share) || defined(NEED_newSVpvn_share_GLOBAL)
+
+SV *
+DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash)
+{
+  SV *sv;
+  if (len < 0)
+    len = -len;
+  if (!hash)
+    PERL_HASH(hash, (char*) src, len);
+  sv = newSVpvn((char *) src, len);
+  sv_upgrade(sv, SVt_PVIV);
+  SvIVX(sv) = hash;
+  SvREADONLY_on(sv);
+  SvPOK_on(sv);
+  return sv;
+}
+
+#endif
+
+#endif
+#ifndef SvSHARED_HASH
+#  define SvSHARED_HASH(sv)              (0 + SvUVX(sv))
+#endif
+#ifndef HvNAME_get
+#  define HvNAME_get(hv)                 HvNAME(hv)
+#endif
+#ifndef HvNAMELEN_get
+#  define HvNAMELEN_get(hv)              (HvNAME_get(hv) ? (I32)strlen(HvNAME_get(hv)) : 0)
+#endif
+#ifndef GvSVn
+#  define GvSVn(gv)                      GvSV(gv)
+#endif
+
+#ifndef isGV_with_GP
+#  define isGV_with_GP(gv)               isGV(gv)
+#endif
+
+#ifndef gv_fetchpvn_flags
+#  define gv_fetchpvn_flags(name, len, flags, svt) gv_fetchpv(name, flags, svt)
+#endif
+
+#ifndef gv_fetchsv
+#  define gv_fetchsv(name, flags, svt)   gv_fetchpv(SvPV_nolen_const(name), flags, svt)
+#endif
+#ifndef get_cvn_flags
+#  define get_cvn_flags(name, namelen, flags) get_cv(name, flags)
+#endif
+#ifndef WARN_ALL
+#  define WARN_ALL                       0
+#endif
+
+#ifndef WARN_CLOSURE
+#  define WARN_CLOSURE                   1
+#endif
+
+#ifndef WARN_DEPRECATED
+#  define WARN_DEPRECATED                2
+#endif
+
+#ifndef WARN_EXITING
+#  define WARN_EXITING                   3
+#endif
+
+#ifndef WARN_GLOB
+#  define WARN_GLOB                      4
+#endif
+
+#ifndef WARN_IO
+#  define WARN_IO                        5
+#endif
+
+#ifndef WARN_CLOSED
+#  define WARN_CLOSED                    6
+#endif
+
+#ifndef WARN_EXEC
+#  define WARN_EXEC                      7
+#endif
+
+#ifndef WARN_LAYER
+#  define WARN_LAYER                     8
+#endif
+
+#ifndef WARN_NEWLINE
+#  define WARN_NEWLINE                   9
+#endif
+
+#ifndef WARN_PIPE
+#  define WARN_PIPE                      10
+#endif
+
+#ifndef WARN_UNOPENED
+#  define WARN_UNOPENED                  11
+#endif
+
+#ifndef WARN_MISC
+#  define WARN_MISC                      12
+#endif
+
+#ifndef WARN_NUMERIC
+#  define WARN_NUMERIC                   13
+#endif
+
+#ifndef WARN_ONCE
+#  define WARN_ONCE                      14
+#endif
+
+#ifndef WARN_OVERFLOW
+#  define WARN_OVERFLOW                  15
+#endif
+
+#ifndef WARN_PACK
+#  define WARN_PACK                      16
+#endif
+
+#ifndef WARN_PORTABLE
+#  define WARN_PORTABLE                  17
+#endif
+
+#ifndef WARN_RECURSION
+#  define WARN_RECURSION                 18
+#endif
+
+#ifndef WARN_REDEFINE
+#  define WARN_REDEFINE                  19
+#endif
+
+#ifndef WARN_REGEXP
+#  define WARN_REGEXP                    20
+#endif
+
+#ifndef WARN_SEVERE
+#  define WARN_SEVERE                    21
+#endif
+
+#ifndef WARN_DEBUGGING
+#  define WARN_DEBUGGING                 22
+#endif
+
+#ifndef WARN_INPLACE
+#  define WARN_INPLACE                   23
+#endif
+
+#ifndef WARN_INTERNAL
+#  define WARN_INTERNAL                  24
+#endif
+
+#ifndef WARN_MALLOC
+#  define WARN_MALLOC                    25
+#endif
+
+#ifndef WARN_SIGNAL
+#  define WARN_SIGNAL                    26
+#endif
+
+#ifndef WARN_SUBSTR
+#  define WARN_SUBSTR                    27
+#endif
+
+#ifndef WARN_SYNTAX
+#  define WARN_SYNTAX                    28
+#endif
+
+#ifndef WARN_AMBIGUOUS
+#  define WARN_AMBIGUOUS                 29
+#endif
+
+#ifndef WARN_BAREWORD
+#  define WARN_BAREWORD                  30
+#endif
+
+#ifndef WARN_DIGIT
+#  define WARN_DIGIT                     31
+#endif
+
+#ifndef WARN_PARENTHESIS
+#  define WARN_PARENTHESIS               32
+#endif
+
+#ifndef WARN_PRECEDENCE
+#  define WARN_PRECEDENCE                33
+#endif
+
+#ifndef WARN_PRINTF
+#  define WARN_PRINTF                    34
+#endif
+
+#ifndef WARN_PROTOTYPE
+#  define WARN_PROTOTYPE                 35
+#endif
+
+#ifndef WARN_QW
+#  define WARN_QW                        36
+#endif
+
+#ifndef WARN_RESERVED
+#  define WARN_RESERVED                  37
+#endif
+
+#ifndef WARN_SEMICOLON
+#  define WARN_SEMICOLON                 38
+#endif
+
+#ifndef WARN_TAINT
+#  define WARN_TAINT                     39
+#endif
+
+#ifndef WARN_THREADS
+#  define WARN_THREADS                   40
+#endif
+
+#ifndef WARN_UNINITIALIZED
+#  define WARN_UNINITIALIZED             41
+#endif
+
+#ifndef WARN_UNPACK
+#  define WARN_UNPACK                    42
+#endif
+
+#ifndef WARN_UNTIE
+#  define WARN_UNTIE                     43
+#endif
+
+#ifndef WARN_UTF8
+#  define WARN_UTF8                      44
+#endif
+
+#ifndef WARN_VOID
+#  define WARN_VOID                      45
+#endif
+
+#ifndef WARN_ASSERTIONS
+#  define WARN_ASSERTIONS                46
+#endif
+#ifndef packWARN
+#  define packWARN(a)                    (a)
+#endif
+
+#ifndef ckWARN
+#  ifdef G_WARN_ON
+#    define  ckWARN(a)                  (PL_dowarn & G_WARN_ON)
+#  else
+#    define  ckWARN(a)                  PL_dowarn
+#  endif
+#endif
+
+#if (PERL_BCDVERSION >= 0x5004000) && !defined(warner)
+#if defined(NEED_warner)
+static void DPPP_(my_warner)(U32 err, const char *pat, ...);
+static
+#else
+extern void DPPP_(my_warner)(U32 err, const char *pat, ...);
+#endif
+
+#define Perl_warner DPPP_(my_warner)
+
+#if defined(NEED_warner) || defined(NEED_warner_GLOBAL)
+
+void
+DPPP_(my_warner)(U32 err, const char *pat, ...)
+{
+  SV *sv;
+  va_list args;
+
+  PERL_UNUSED_ARG(err);
+
+  va_start(args, pat);
+  sv = vnewSVpvf(pat, &args);
+  va_end(args);
+  sv_2mortal(sv);
+  warn("%s", SvPV_nolen(sv));
+}
+
+#define warner  Perl_warner
+
+#define Perl_warner_nocontext  Perl_warner
+
+#endif
+#endif
+
+/* concatenating with "" ensures that only literal strings are accepted as argument
+ * note that STR_WITH_LEN() can't be used as argument to macros or functions that
+ * under some configurations might be macros
+ */
+#ifndef STR_WITH_LEN
+#  define STR_WITH_LEN(s)                (s ""), (sizeof(s)-1)
+#endif
+#ifndef newSVpvs
+#  define newSVpvs(str)                  newSVpvn(str "", sizeof(str) - 1)
+#endif
+
+#ifndef newSVpvs_flags
+#  define newSVpvs_flags(str, flags)     newSVpvn_flags(str "", sizeof(str) - 1, flags)
+#endif
+
+#ifndef newSVpvs_share
+#  define newSVpvs_share(str)            newSVpvn_share(str "", sizeof(str) - 1, 0)
+#endif
+
+#ifndef sv_catpvs
+#  define sv_catpvs(sv, str)             sv_catpvn(sv, str "", sizeof(str) - 1)
+#endif
+
+#ifndef sv_setpvs
+#  define sv_setpvs(sv, str)             sv_setpvn(sv, str "", sizeof(str) - 1)
+#endif
+
+#ifndef hv_fetchs
+#  define hv_fetchs(hv, key, lval)       hv_fetch(hv, key "", sizeof(key) - 1, lval)
+#endif
+
+#ifndef hv_stores
+#  define hv_stores(hv, key, val)        hv_store(hv, key "", sizeof(key) - 1, val, 0)
+#endif
+#ifndef gv_fetchpvs
+#  define gv_fetchpvs(name, flags, svt)  gv_fetchpvn_flags(name "", sizeof(name) - 1, flags, svt)
+#endif
+
+#ifndef gv_stashpvs
+#  define gv_stashpvs(name, flags)       gv_stashpvn(name "", sizeof(name) - 1, flags)
+#endif
+#ifndef get_cvs
+#  define get_cvs(name, flags)           get_cvn_flags(name "", sizeof(name)-1, flags)
+#endif
+#ifndef SvGETMAGIC
+#  define SvGETMAGIC(x)                  STMT_START { if (SvGMAGICAL(x)) mg_get(x); } STMT_END
+#endif
+#ifndef PERL_MAGIC_sv
+#  define PERL_MAGIC_sv                  '\0'
+#endif
+
+#ifndef PERL_MAGIC_overload
+#  define PERL_MAGIC_overload            'A'
+#endif
+
+#ifndef PERL_MAGIC_overload_elem
+#  define PERL_MAGIC_overload_elem       'a'
+#endif
+
+#ifndef PERL_MAGIC_overload_table
+#  define PERL_MAGIC_overload_table      'c'
+#endif
+
+#ifndef PERL_MAGIC_bm
+#  define PERL_MAGIC_bm                  'B'
+#endif
+
+#ifndef PERL_MAGIC_regdata
+#  define PERL_MAGIC_regdata             'D'
+#endif
+
+#ifndef PERL_MAGIC_regdatum
+#  define PERL_MAGIC_regdatum            'd'
+#endif
+
+#ifndef PERL_MAGIC_env
+#  define PERL_MAGIC_env                 'E'
+#endif
+
+#ifndef PERL_MAGIC_envelem
+#  define PERL_MAGIC_envelem             'e'
+#endif
+
+#ifndef PERL_MAGIC_fm
+#  define PERL_MAGIC_fm                  'f'
+#endif
+
+#ifndef PERL_MAGIC_regex_global
+#  define PERL_MAGIC_regex_global        'g'
+#endif
+
+#ifndef PERL_MAGIC_isa
+#  define PERL_MAGIC_isa                 'I'
+#endif
+
+#ifndef PERL_MAGIC_isaelem
+#  define PERL_MAGIC_isaelem             'i'
+#endif
+
+#ifndef PERL_MAGIC_nkeys
+#  define PERL_MAGIC_nkeys               'k'
+#endif
+
+#ifndef PERL_MAGIC_dbfile
+#  define PERL_MAGIC_dbfile              'L'
+#endif
+
+#ifndef PERL_MAGIC_dbline
+#  define PERL_MAGIC_dbline              'l'
+#endif
+
+#ifndef PERL_MAGIC_mutex
+#  define PERL_MAGIC_mutex               'm'
+#endif
+
+#ifndef PERL_MAGIC_shared
+#  define PERL_MAGIC_shared              'N'
+#endif
+
+#ifndef PERL_MAGIC_shared_scalar
+#  define PERL_MAGIC_shared_scalar       'n'
+#endif
+
+#ifndef PERL_MAGIC_collxfrm
+#  define PERL_MAGIC_collxfrm            'o'
+#endif
+
+#ifndef PERL_MAGIC_tied
+#  define PERL_MAGIC_tied                'P'
+#endif
+
+#ifndef PERL_MAGIC_tiedelem
+#  define PERL_MAGIC_tiedelem            'p'
+#endif
+
+#ifndef PERL_MAGIC_tiedscalar
+#  define PERL_MAGIC_tiedscalar          'q'
+#endif
+
+#ifndef PERL_MAGIC_qr
+#  define PERL_MAGIC_qr                  'r'
+#endif
+
+#ifndef PERL_MAGIC_sig
+#  define PERL_MAGIC_sig                 'S'
+#endif
+
+#ifndef PERL_MAGIC_sigelem
+#  define PERL_MAGIC_sigelem             's'
+#endif
+
+#ifndef PERL_MAGIC_taint
+#  define PERL_MAGIC_taint               't'
+#endif
+
+#ifndef PERL_MAGIC_uvar
+#  define PERL_MAGIC_uvar                'U'
+#endif
+
+#ifndef PERL_MAGIC_uvar_elem
+#  define PERL_MAGIC_uvar_elem           'u'
+#endif
+
+#ifndef PERL_MAGIC_vstring
+#  define PERL_MAGIC_vstring             'V'
+#endif
+
+#ifndef PERL_MAGIC_vec
+#  define PERL_MAGIC_vec                 'v'
+#endif
+
+#ifndef PERL_MAGIC_utf8
+#  define PERL_MAGIC_utf8                'w'
+#endif
+
+#ifndef PERL_MAGIC_substr
+#  define PERL_MAGIC_substr              'x'
+#endif
+
+#ifndef PERL_MAGIC_defelem
+#  define PERL_MAGIC_defelem             'y'
+#endif
+
+#ifndef PERL_MAGIC_glob
+#  define PERL_MAGIC_glob                '*'
+#endif
+
+#ifndef PERL_MAGIC_arylen
+#  define PERL_MAGIC_arylen              '#'
+#endif
+
+#ifndef PERL_MAGIC_pos
+#  define PERL_MAGIC_pos                 '.'
+#endif
+
+#ifndef PERL_MAGIC_backref
+#  define PERL_MAGIC_backref             '<'
+#endif
+
+#ifndef PERL_MAGIC_ext
+#  define PERL_MAGIC_ext                 '~'
+#endif
+
+/* That's the best we can do... */
+#ifndef sv_catpvn_nomg
+#  define sv_catpvn_nomg                 sv_catpvn
+#endif
+
+#ifndef sv_catsv_nomg
+#  define sv_catsv_nomg                  sv_catsv
+#endif
+
+#ifndef sv_setsv_nomg
+#  define sv_setsv_nomg                  sv_setsv
+#endif
+
+#ifndef sv_pvn_nomg
+#  define sv_pvn_nomg                    sv_pvn
+#endif
+
+#ifndef SvIV_nomg
+#  define SvIV_nomg                      SvIV
+#endif
+
+#ifndef SvUV_nomg
+#  define SvUV_nomg                      SvUV
+#endif
+
+#ifndef sv_catpv_mg
+#  define sv_catpv_mg(sv, ptr)          \
+   STMT_START {                         \
+     SV *TeMpSv = sv;                   \
+     sv_catpv(TeMpSv,ptr);              \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_catpvn_mg
+#  define sv_catpvn_mg(sv, ptr, len)    \
+   STMT_START {                         \
+     SV *TeMpSv = sv;                   \
+     sv_catpvn(TeMpSv,ptr,len);         \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_catsv_mg
+#  define sv_catsv_mg(dsv, ssv)         \
+   STMT_START {                         \
+     SV *TeMpSv = dsv;                  \
+     sv_catsv(TeMpSv,ssv);              \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_setiv_mg
+#  define sv_setiv_mg(sv, i)            \
+   STMT_START {                         \
+     SV *TeMpSv = sv;                   \
+     sv_setiv(TeMpSv,i);                \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_setnv_mg
+#  define sv_setnv_mg(sv, num)          \
+   STMT_START {                         \
+     SV *TeMpSv = sv;                   \
+     sv_setnv(TeMpSv,num);              \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_setpv_mg
+#  define sv_setpv_mg(sv, ptr)          \
+   STMT_START {                         \
+     SV *TeMpSv = sv;                   \
+     sv_setpv(TeMpSv,ptr);              \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_setpvn_mg
+#  define sv_setpvn_mg(sv, ptr, len)    \
+   STMT_START {                         \
+     SV *TeMpSv = sv;                   \
+     sv_setpvn(TeMpSv,ptr,len);         \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_setsv_mg
+#  define sv_setsv_mg(dsv, ssv)         \
+   STMT_START {                         \
+     SV *TeMpSv = dsv;                  \
+     sv_setsv(TeMpSv,ssv);              \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_setuv_mg
+#  define sv_setuv_mg(sv, i)            \
+   STMT_START {                         \
+     SV *TeMpSv = sv;                   \
+     sv_setuv(TeMpSv,i);                \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_usepvn_mg
+#  define sv_usepvn_mg(sv, ptr, len)    \
+   STMT_START {                         \
+     SV *TeMpSv = sv;                   \
+     sv_usepvn(TeMpSv,ptr,len);         \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+#ifndef SvVSTRING_mg
+#  define SvVSTRING_mg(sv)               (SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_vstring) : NULL)
+#endif
+
+/* Hint: sv_magic_portable
+ * This is a compatibility function that is only available with
+ * Devel::PPPort. It is NOT in the perl core.
+ * Its purpose is to mimic the 5.8.0 behaviour of sv_magic() when
+ * it is being passed a name pointer with namlen == 0. In that
+ * case, perl 5.8.0 and later store the pointer, not a copy of it.
+ * The compatibility can be provided back to perl 5.004. With
+ * earlier versions, the code will not compile.
+ */
+
+#if (PERL_BCDVERSION < 0x5004000)
+
+  /* code that uses sv_magic_portable will not compile */
+
+#elif (PERL_BCDVERSION < 0x5008000)
+
+#  define sv_magic_portable(sv, obj, how, name, namlen)     \
+   STMT_START {                                             \
+     SV *SvMp_sv = (sv);                                    \
+     char *SvMp_name = (char *) (name);                     \
+     I32 SvMp_namlen = (namlen);                            \
+     if (SvMp_name && SvMp_namlen == 0)                     \
+     {                                                      \
+       MAGIC *mg;                                           \
+       sv_magic(SvMp_sv, obj, how, 0, 0);                   \
+       mg = SvMAGIC(SvMp_sv);                               \
+       mg->mg_len = -42; /* XXX: this is the tricky part */ \
+       mg->mg_ptr = SvMp_name;                              \
+     }                                                      \
+     else                                                   \
+     {                                                      \
+       sv_magic(SvMp_sv, obj, how, SvMp_name, SvMp_namlen); \
+     }                                                      \
+   } STMT_END
+
+#else
+
+#  define sv_magic_portable(a, b, c, d, e)  sv_magic(a, b, c, d, e)
+
+#endif
+
+#ifdef USE_ITHREADS
+#ifndef CopFILE
+#  define CopFILE(c)                     ((c)->cop_file)
+#endif
+
+#ifndef CopFILEGV
+#  define CopFILEGV(c)                   (CopFILE(c) ? gv_fetchfile(CopFILE(c)) : Nullgv)
+#endif
+
+#ifndef CopFILE_set
+#  define CopFILE_set(c,pv)              ((c)->cop_file = savepv(pv))
+#endif
+
+#ifndef CopFILESV
+#  define CopFILESV(c)                   (CopFILE(c) ? GvSV(gv_fetchfile(CopFILE(c))) : Nullsv)
+#endif
+
+#ifndef CopFILEAV
+#  define CopFILEAV(c)                   (CopFILE(c) ? GvAV(gv_fetchfile(CopFILE(c))) : Nullav)
+#endif
+
+#ifndef CopSTASHPV
+#  define CopSTASHPV(c)                  ((c)->cop_stashpv)
+#endif
+
+#ifndef CopSTASHPV_set
+#  define CopSTASHPV_set(c,pv)           ((c)->cop_stashpv = ((pv) ? savepv(pv) : Nullch))
+#endif
+
+#ifndef CopSTASH
+#  define CopSTASH(c)                    (CopSTASHPV(c) ? gv_stashpv(CopSTASHPV(c),GV_ADD) : Nullhv)
+#endif
+
+#ifndef CopSTASH_set
+#  define CopSTASH_set(c,hv)             CopSTASHPV_set(c, (hv) ? HvNAME(hv) : Nullch)
+#endif
+
+#ifndef CopSTASH_eq
+#  define CopSTASH_eq(c,hv)              ((hv) && (CopSTASHPV(c) == HvNAME(hv) \
+					|| (CopSTASHPV(c) && HvNAME(hv) \
+					&& strEQ(CopSTASHPV(c), HvNAME(hv)))))
+#endif
+
+#else
+#ifndef CopFILEGV
+#  define CopFILEGV(c)                   ((c)->cop_filegv)
+#endif
+
+#ifndef CopFILEGV_set
+#  define CopFILEGV_set(c,gv)            ((c)->cop_filegv = (GV*)SvREFCNT_inc(gv))
+#endif
+
+#ifndef CopFILE_set
+#  define CopFILE_set(c,pv)              CopFILEGV_set((c), gv_fetchfile(pv))
+#endif
+
+#ifndef CopFILESV
+#  define CopFILESV(c)                   (CopFILEGV(c) ? GvSV(CopFILEGV(c)) : Nullsv)
+#endif
+
+#ifndef CopFILEAV
+#  define CopFILEAV(c)                   (CopFILEGV(c) ? GvAV(CopFILEGV(c)) : Nullav)
+#endif
+
+#ifndef CopFILE
+#  define CopFILE(c)                     (CopFILESV(c) ? SvPVX(CopFILESV(c)) : Nullch)
+#endif
+
+#ifndef CopSTASH
+#  define CopSTASH(c)                    ((c)->cop_stash)
+#endif
+
+#ifndef CopSTASH_set
+#  define CopSTASH_set(c,hv)             ((c)->cop_stash = (hv))
+#endif
+
+#ifndef CopSTASHPV
+#  define CopSTASHPV(c)                  (CopSTASH(c) ? HvNAME(CopSTASH(c)) : Nullch)
+#endif
+
+#ifndef CopSTASHPV_set
+#  define CopSTASHPV_set(c,pv)           CopSTASH_set((c), gv_stashpv(pv,GV_ADD))
+#endif
+
+#ifndef CopSTASH_eq
+#  define CopSTASH_eq(c,hv)              (CopSTASH(c) == (hv))
+#endif
+
+#endif /* USE_ITHREADS */
+#ifndef IN_PERL_COMPILETIME
+#  define IN_PERL_COMPILETIME            (PL_curcop == &PL_compiling)
+#endif
+
+#ifndef IN_LOCALE_RUNTIME
+#  define IN_LOCALE_RUNTIME              (PL_curcop->op_private & HINT_LOCALE)
+#endif
+
+#ifndef IN_LOCALE_COMPILETIME
+#  define IN_LOCALE_COMPILETIME          (PL_hints & HINT_LOCALE)
+#endif
+
+#ifndef IN_LOCALE
+#  define IN_LOCALE                      (IN_PERL_COMPILETIME ? IN_LOCALE_COMPILETIME : IN_LOCALE_RUNTIME)
+#endif
+#ifndef IS_NUMBER_IN_UV
+#  define IS_NUMBER_IN_UV                0x01
+#endif
+
+#ifndef IS_NUMBER_GREATER_THAN_UV_MAX
+#  define IS_NUMBER_GREATER_THAN_UV_MAX  0x02
+#endif
+
+#ifndef IS_NUMBER_NOT_INT
+#  define IS_NUMBER_NOT_INT              0x04
+#endif
+
+#ifndef IS_NUMBER_NEG
+#  define IS_NUMBER_NEG                  0x08
+#endif
+
+#ifndef IS_NUMBER_INFINITY
+#  define IS_NUMBER_INFINITY             0x10
+#endif
+
+#ifndef IS_NUMBER_NAN
+#  define IS_NUMBER_NAN                  0x20
+#endif
+#ifndef GROK_NUMERIC_RADIX
+#  define GROK_NUMERIC_RADIX(sp, send)   grok_numeric_radix(sp, send)
+#endif
+#ifndef PERL_SCAN_GREATER_THAN_UV_MAX
+#  define PERL_SCAN_GREATER_THAN_UV_MAX  0x02
+#endif
+
+#ifndef PERL_SCAN_SILENT_ILLDIGIT
+#  define PERL_SCAN_SILENT_ILLDIGIT      0x04
+#endif
+
+#ifndef PERL_SCAN_ALLOW_UNDERSCORES
+#  define PERL_SCAN_ALLOW_UNDERSCORES    0x01
+#endif
+
+#ifndef PERL_SCAN_DISALLOW_PREFIX
+#  define PERL_SCAN_DISALLOW_PREFIX      0x02
+#endif
+
+#ifndef grok_numeric_radix
+#if defined(NEED_grok_numeric_radix)
+static bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send);
+static
+#else
+extern bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send);
+#endif
+
+#ifdef grok_numeric_radix
+#  undef grok_numeric_radix
+#endif
+#define grok_numeric_radix(a,b) DPPP_(my_grok_numeric_radix)(aTHX_ a,b)
+#define Perl_grok_numeric_radix DPPP_(my_grok_numeric_radix)
+
+#if defined(NEED_grok_numeric_radix) || defined(NEED_grok_numeric_radix_GLOBAL)
+bool
+DPPP_(my_grok_numeric_radix)(pTHX_ const char **sp, const char *send)
+{
+#ifdef USE_LOCALE_NUMERIC
+#ifdef PL_numeric_radix_sv
+    if (PL_numeric_radix_sv && IN_LOCALE) {
+        STRLEN len;
+        char* radix = SvPV(PL_numeric_radix_sv, len);
+        if (*sp + len <= send && memEQ(*sp, radix, len)) {
+            *sp += len;
+            return TRUE;
+        }
+    }
+#else
+    /* older perls don't have PL_numeric_radix_sv so the radix
+     * must manually be requested from locale.h
+     */
+#include <locale.h>
+    dTHR;  /* needed for older threaded perls */
+    struct lconv *lc = localeconv();
+    char *radix = lc->decimal_point;
+    if (radix && IN_LOCALE) {
+        STRLEN len = strlen(radix);
+        if (*sp + len <= send && memEQ(*sp, radix, len)) {
+            *sp += len;
+            return TRUE;
+        }
+    }
+#endif
+#endif /* USE_LOCALE_NUMERIC */
+    /* always try "." if numeric radix didn't match because
+     * we may have data from different locales mixed */
+    if (*sp < send && **sp == '.') {
+        ++*sp;
+        return TRUE;
+    }
+    return FALSE;
+}
+#endif
+#endif
+
+#ifndef grok_number
+#if defined(NEED_grok_number)
+static int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep);
+static
+#else
+extern int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep);
+#endif
+
+#ifdef grok_number
+#  undef grok_number
+#endif
+#define grok_number(a,b,c) DPPP_(my_grok_number)(aTHX_ a,b,c)
+#define Perl_grok_number DPPP_(my_grok_number)
+
+#if defined(NEED_grok_number) || defined(NEED_grok_number_GLOBAL)
+int
+DPPP_(my_grok_number)(pTHX_ const char *pv, STRLEN len, UV *valuep)
+{
+  const char *s = pv;
+  const char *send = pv + len;
+  const UV max_div_10 = UV_MAX / 10;
+  const char max_mod_10 = UV_MAX % 10;
+  int numtype = 0;
+  int sawinf = 0;
+  int sawnan = 0;
+
+  while (s < send && isSPACE(*s))
+    s++;
+  if (s == send) {
+    return 0;
+  } else if (*s == '-') {
+    s++;
+    numtype = IS_NUMBER_NEG;
+  }
+  else if (*s == '+')
+  s++;
+
+  if (s == send)
+    return 0;
+
+  /* next must be digit or the radix separator or beginning of infinity */
+  if (isDIGIT(*s)) {
+    /* UVs are at least 32 bits, so the first 9 decimal digits cannot
+       overflow.  */
+    UV value = *s - '0';
+    /* This construction seems to be more optimiser friendly.
+       (without it gcc does the isDIGIT test and the *s - '0' separately)
+       With it gcc on arm is managing 6 instructions (6 cycles) per digit.
+       In theory the optimiser could deduce how far to unroll the loop
+       before checking for overflow.  */
+    if (++s < send) {
+      int digit = *s - '0';
+      if (digit >= 0 && digit <= 9) {
+        value = value * 10 + digit;
+        if (++s < send) {
+          digit = *s - '0';
+          if (digit >= 0 && digit <= 9) {
+            value = value * 10 + digit;
+            if (++s < send) {
+              digit = *s - '0';
+              if (digit >= 0 && digit <= 9) {
+                value = value * 10 + digit;
+		if (++s < send) {
+                  digit = *s - '0';
+                  if (digit >= 0 && digit <= 9) {
+                    value = value * 10 + digit;
+                    if (++s < send) {
+                      digit = *s - '0';
+                      if (digit >= 0 && digit <= 9) {
+                        value = value * 10 + digit;
+                        if (++s < send) {
+                          digit = *s - '0';
+                          if (digit >= 0 && digit <= 9) {
+                            value = value * 10 + digit;
+                            if (++s < send) {
+                              digit = *s - '0';
+                              if (digit >= 0 && digit <= 9) {
+                                value = value * 10 + digit;
+                                if (++s < send) {
+                                  digit = *s - '0';
+                                  if (digit >= 0 && digit <= 9) {
+                                    value = value * 10 + digit;
+                                    if (++s < send) {
+                                      /* Now got 9 digits, so need to check
+                                         each time for overflow.  */
+                                      digit = *s - '0';
+                                      while (digit >= 0 && digit <= 9
+                                             && (value < max_div_10
+                                                 || (value == max_div_10
+                                                     && digit <= max_mod_10))) {
+                                        value = value * 10 + digit;
+                                        if (++s < send)
+                                          digit = *s - '0';
+                                        else
+                                          break;
+                                      }
+                                      if (digit >= 0 && digit <= 9
+                                          && (s < send)) {
+                                        /* value overflowed.
+                                           skip the remaining digits, don't
+                                           worry about setting *valuep.  */
+                                        do {
+                                          s++;
+                                        } while (s < send && isDIGIT(*s));
+                                        numtype |=
+                                          IS_NUMBER_GREATER_THAN_UV_MAX;
+                                        goto skip_value;
+                                      }
+                                    }
+                                  }
+				}
+                              }
+                            }
+                          }
+                        }
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+	}
+      }
+    }
+    numtype |= IS_NUMBER_IN_UV;
+    if (valuep)
+      *valuep = value;
+
+  skip_value:
+    if (GROK_NUMERIC_RADIX(&s, send)) {
+      numtype |= IS_NUMBER_NOT_INT;
+      while (s < send && isDIGIT(*s))  /* optional digits after the radix */
+        s++;
+    }
+  }
+  else if (GROK_NUMERIC_RADIX(&s, send)) {
+    numtype |= IS_NUMBER_NOT_INT | IS_NUMBER_IN_UV; /* valuep assigned below */
+    /* no digits before the radix means we need digits after it */
+    if (s < send && isDIGIT(*s)) {
+      do {
+        s++;
+      } while (s < send && isDIGIT(*s));
+      if (valuep) {
+        /* integer approximation is valid - it's 0.  */
+        *valuep = 0;
+      }
+    }
+    else
+      return 0;
+  } else if (*s == 'I' || *s == 'i') {
+    s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
+    s++; if (s == send || (*s != 'F' && *s != 'f')) return 0;
+    s++; if (s < send && (*s == 'I' || *s == 'i')) {
+      s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
+      s++; if (s == send || (*s != 'I' && *s != 'i')) return 0;
+      s++; if (s == send || (*s != 'T' && *s != 't')) return 0;
+      s++; if (s == send || (*s != 'Y' && *s != 'y')) return 0;
+      s++;
+    }
+    sawinf = 1;
+  } else if (*s == 'N' || *s == 'n') {
+    /* XXX TODO: There are signaling NaNs and quiet NaNs. */
+    s++; if (s == send || (*s != 'A' && *s != 'a')) return 0;
+    s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
+    s++;
+    sawnan = 1;
+  } else
+    return 0;
+
+  if (sawinf) {
+    numtype &= IS_NUMBER_NEG; /* Keep track of sign  */
+    numtype |= IS_NUMBER_INFINITY | IS_NUMBER_NOT_INT;
+  } else if (sawnan) {
+    numtype &= IS_NUMBER_NEG; /* Keep track of sign  */
+    numtype |= IS_NUMBER_NAN | IS_NUMBER_NOT_INT;
+  } else if (s < send) {
+    /* we can have an optional exponent part */
+    if (*s == 'e' || *s == 'E') {
+      /* The only flag we keep is sign.  Blow away any "it's UV"  */
+      numtype &= IS_NUMBER_NEG;
+      numtype |= IS_NUMBER_NOT_INT;
+      s++;
+      if (s < send && (*s == '-' || *s == '+'))
+        s++;
+      if (s < send && isDIGIT(*s)) {
+        do {
+          s++;
+        } while (s < send && isDIGIT(*s));
+      }
+      else
+      return 0;
+    }
+  }
+  while (s < send && isSPACE(*s))
+    s++;
+  if (s >= send)
+    return numtype;
+  if (len == 10 && memEQ(pv, "0 but true", 10)) {
+    if (valuep)
+      *valuep = 0;
+    return IS_NUMBER_IN_UV;
+  }
+  return 0;
+}
+#endif
+#endif
+
+/*
+ * The grok_* routines have been modified to use warn() instead of
+ * Perl_warner(). Also, 'hexdigit' was the former name of PL_hexdigit,
+ * which is why the stack variable has been renamed to 'xdigit'.
+ */
+
+#ifndef grok_bin
+#if defined(NEED_grok_bin)
+static UV DPPP_(my_grok_bin)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
+static
+#else
+extern UV DPPP_(my_grok_bin)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
+#endif
+
+#ifdef grok_bin
+#  undef grok_bin
+#endif
+#define grok_bin(a,b,c,d) DPPP_(my_grok_bin)(aTHX_ a,b,c,d)
+#define Perl_grok_bin DPPP_(my_grok_bin)
+
+#if defined(NEED_grok_bin) || defined(NEED_grok_bin_GLOBAL)
+UV
+DPPP_(my_grok_bin)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result)
+{
+    const char *s = start;
+    STRLEN len = *len_p;
+    UV value = 0;
+    NV value_nv = 0;
+
+    const UV max_div_2 = UV_MAX / 2;
+    bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
+    bool overflowed = FALSE;
+
+    if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) {
+        /* strip off leading b or 0b.
+           for compatibility silently suffer "b" and "0b" as valid binary
+           numbers. */
+        if (len >= 1) {
+            if (s[0] == 'b') {
+                s++;
+                len--;
+            }
+            else if (len >= 2 && s[0] == '0' && s[1] == 'b') {
+                s+=2;
+                len-=2;
+            }
+        }
+    }
+
+    for (; len-- && *s; s++) {
+        char bit = *s;
+        if (bit == '0' || bit == '1') {
+            /* Write it in this wonky order with a goto to attempt to get the
+               compiler to make the common case integer-only loop pretty tight.
+               With gcc seems to be much straighter code than old scan_bin.  */
+          redo:
+            if (!overflowed) {
+                if (value <= max_div_2) {
+                    value = (value << 1) | (bit - '0');
+                    continue;
+                }
+                /* Bah. We're just overflowed.  */
+                warn("Integer overflow in binary number");
+                overflowed = TRUE;
+                value_nv = (NV) value;
+            }
+            value_nv *= 2.0;
+	    /* If an NV has not enough bits in its mantissa to
+	     * represent a UV this summing of small low-order numbers
+	     * is a waste of time (because the NV cannot preserve
+	     * the low-order bits anyway): we could just remember when
+	     * did we overflow and in the end just multiply value_nv by the
+	     * right amount. */
+            value_nv += (NV)(bit - '0');
+            continue;
+        }
+        if (bit == '_' && len && allow_underscores && (bit = s[1])
+            && (bit == '0' || bit == '1'))
+	    {
+		--len;
+		++s;
+                goto redo;
+	    }
+        if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
+            warn("Illegal binary digit '%c' ignored", *s);
+        break;
+    }
+
+    if (   ( overflowed && value_nv > 4294967295.0)
+#if UVSIZE > 4
+	|| (!overflowed && value > 0xffffffff  )
+#endif
+	) {
+	warn("Binary number > 0b11111111111111111111111111111111 non-portable");
+    }
+    *len_p = s - start;
+    if (!overflowed) {
+        *flags = 0;
+        return value;
+    }
+    *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
+    if (result)
+        *result = value_nv;
+    return UV_MAX;
+}
+#endif
+#endif
+
+#ifndef grok_hex
+#if defined(NEED_grok_hex)
+static UV DPPP_(my_grok_hex)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
+static
+#else
+extern UV DPPP_(my_grok_hex)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
+#endif
+
+#ifdef grok_hex
+#  undef grok_hex
+#endif
+#define grok_hex(a,b,c,d) DPPP_(my_grok_hex)(aTHX_ a,b,c,d)
+#define Perl_grok_hex DPPP_(my_grok_hex)
+
+#if defined(NEED_grok_hex) || defined(NEED_grok_hex_GLOBAL)
+UV
+DPPP_(my_grok_hex)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result)
+{
+    const char *s = start;
+    STRLEN len = *len_p;
+    UV value = 0;
+    NV value_nv = 0;
+
+    const UV max_div_16 = UV_MAX / 16;
+    bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
+    bool overflowed = FALSE;
+    const char *xdigit;
+
+    if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) {
+        /* strip off leading x or 0x.
+           for compatibility silently suffer "x" and "0x" as valid hex numbers.
+        */
+        if (len >= 1) {
+            if (s[0] == 'x') {
+                s++;
+                len--;
+            }
+            else if (len >= 2 && s[0] == '0' && s[1] == 'x') {
+                s+=2;
+                len-=2;
+            }
+        }
+    }
+
+    for (; len-- && *s; s++) {
+	xdigit = strchr((char *) PL_hexdigit, *s);
+        if (xdigit) {
+            /* Write it in this wonky order with a goto to attempt to get the
+               compiler to make the common case integer-only loop pretty tight.
+               With gcc seems to be much straighter code than old scan_hex.  */
+          redo:
+            if (!overflowed) {
+                if (value <= max_div_16) {
+                    value = (value << 4) | ((xdigit - PL_hexdigit) & 15);
+                    continue;
+                }
+                warn("Integer overflow in hexadecimal number");
+                overflowed = TRUE;
+                value_nv = (NV) value;
+            }
+            value_nv *= 16.0;
+	    /* If an NV has not enough bits in its mantissa to
+	     * represent a UV this summing of small low-order numbers
+	     * is a waste of time (because the NV cannot preserve
+	     * the low-order bits anyway): we could just remember when
+	     * did we overflow and in the end just multiply value_nv by the
+	     * right amount of 16-tuples. */
+            value_nv += (NV)((xdigit - PL_hexdigit) & 15);
+            continue;
+        }
+        if (*s == '_' && len && allow_underscores && s[1]
+		&& (xdigit = strchr((char *) PL_hexdigit, s[1])))
+	    {
+		--len;
+		++s;
+                goto redo;
+	    }
+        if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
+            warn("Illegal hexadecimal digit '%c' ignored", *s);
+        break;
+    }
+
+    if (   ( overflowed && value_nv > 4294967295.0)
+#if UVSIZE > 4
+	|| (!overflowed && value > 0xffffffff  )
+#endif
+	) {
+	warn("Hexadecimal number > 0xffffffff non-portable");
+    }
+    *len_p = s - start;
+    if (!overflowed) {
+        *flags = 0;
+        return value;
+    }
+    *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
+    if (result)
+        *result = value_nv;
+    return UV_MAX;
+}
+#endif
+#endif
+
+#ifndef grok_oct
+#if defined(NEED_grok_oct)
+static UV DPPP_(my_grok_oct)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
+static
+#else
+extern UV DPPP_(my_grok_oct)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
+#endif
+
+#ifdef grok_oct
+#  undef grok_oct
+#endif
+#define grok_oct(a,b,c,d) DPPP_(my_grok_oct)(aTHX_ a,b,c,d)
+#define Perl_grok_oct DPPP_(my_grok_oct)
+
+#if defined(NEED_grok_oct) || defined(NEED_grok_oct_GLOBAL)
+UV
+DPPP_(my_grok_oct)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result)
+{
+    const char *s = start;
+    STRLEN len = *len_p;
+    UV value = 0;
+    NV value_nv = 0;
+
+    const UV max_div_8 = UV_MAX / 8;
+    bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
+    bool overflowed = FALSE;
+
+    for (; len-- && *s; s++) {
+         /* gcc 2.95 optimiser not smart enough to figure that this subtraction
+            out front allows slicker code.  */
+        int digit = *s - '0';
+        if (digit >= 0 && digit <= 7) {
+            /* Write it in this wonky order with a goto to attempt to get the
+               compiler to make the common case integer-only loop pretty tight.
+            */
+          redo:
+            if (!overflowed) {
+                if (value <= max_div_8) {
+                    value = (value << 3) | digit;
+                    continue;
+                }
+                /* Bah. We're just overflowed.  */
+                warn("Integer overflow in octal number");
+                overflowed = TRUE;
+                value_nv = (NV) value;
+            }
+            value_nv *= 8.0;
+	    /* If an NV has not enough bits in its mantissa to
+	     * represent a UV this summing of small low-order numbers
+	     * is a waste of time (because the NV cannot preserve
+	     * the low-order bits anyway): we could just remember when
+	     * did we overflow and in the end just multiply value_nv by the
+	     * right amount of 8-tuples. */
+            value_nv += (NV)digit;
+            continue;
+        }
+        if (digit == ('_' - '0') && len && allow_underscores
+            && (digit = s[1] - '0') && (digit >= 0 && digit <= 7))
+	    {
+		--len;
+		++s;
+                goto redo;
+	    }
+        /* Allow \octal to work the DWIM way (that is, stop scanning
+         * as soon as non-octal characters are seen, complain only iff
+         * someone seems to want to use the digits eight and nine). */
+        if (digit == 8 || digit == 9) {
+            if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
+                warn("Illegal octal digit '%c' ignored", *s);
+        }
+        break;
+    }
+
+    if (   ( overflowed && value_nv > 4294967295.0)
+#if UVSIZE > 4
+	|| (!overflowed && value > 0xffffffff  )
+#endif
+	) {
+	warn("Octal number > 037777777777 non-portable");
+    }
+    *len_p = s - start;
+    if (!overflowed) {
+        *flags = 0;
+        return value;
+    }
+    *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
+    if (result)
+        *result = value_nv;
+    return UV_MAX;
+}
+#endif
+#endif
+
+#if !defined(my_snprintf)
+#if defined(NEED_my_snprintf)
+static int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...);
+static
+#else
+extern int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...);
+#endif
+
+#define my_snprintf DPPP_(my_my_snprintf)
+#define Perl_my_snprintf DPPP_(my_my_snprintf)
+
+#if defined(NEED_my_snprintf) || defined(NEED_my_snprintf_GLOBAL)
+
+int
+DPPP_(my_my_snprintf)(char *buffer, const Size_t len, const char *format, ...)
+{
+    dTHX;
+    int retval;
+    va_list ap;
+    va_start(ap, format);
+#ifdef HAS_VSNPRINTF
+    retval = vsnprintf(buffer, len, format, ap);
+#else
+    retval = vsprintf(buffer, format, ap);
+#endif
+    va_end(ap);
+    if (retval < 0 || (len > 0 && (Size_t)retval >= len))
+	Perl_croak(aTHX_ "panic: my_snprintf buffer overflow");
+    return retval;
+}
+
+#endif
+#endif
+
+#if !defined(my_sprintf)
+#if defined(NEED_my_sprintf)
+static int DPPP_(my_my_sprintf)(char * buffer, const char * pat, ...);
+static
+#else
+extern int DPPP_(my_my_sprintf)(char * buffer, const char * pat, ...);
+#endif
+
+#define my_sprintf DPPP_(my_my_sprintf)
+#define Perl_my_sprintf DPPP_(my_my_sprintf)
+
+#if defined(NEED_my_sprintf) || defined(NEED_my_sprintf_GLOBAL)
+
+int
+DPPP_(my_my_sprintf)(char *buffer, const char* pat, ...)
+{
+    va_list args;
+    va_start(args, pat);
+    vsprintf(buffer, pat, args);
+    va_end(args);
+    return strlen(buffer);
+}
+
+#endif
+#endif
+
+#ifdef NO_XSLOCKS
+#  ifdef dJMPENV
+#    define dXCPT             dJMPENV; int rEtV = 0
+#    define XCPT_TRY_START    JMPENV_PUSH(rEtV); if (rEtV == 0)
+#    define XCPT_TRY_END      JMPENV_POP;
+#    define XCPT_CATCH        if (rEtV != 0)
+#    define XCPT_RETHROW      JMPENV_JUMP(rEtV)
+#  else
+#    define dXCPT             Sigjmp_buf oldTOP; int rEtV = 0
+#    define XCPT_TRY_START    Copy(top_env, oldTOP, 1, Sigjmp_buf); rEtV = Sigsetjmp(top_env, 1); if (rEtV == 0)
+#    define XCPT_TRY_END      Copy(oldTOP, top_env, 1, Sigjmp_buf);
+#    define XCPT_CATCH        if (rEtV != 0)
+#    define XCPT_RETHROW      Siglongjmp(top_env, rEtV)
+#  endif
+#endif
+
+#if !defined(my_strlcat)
+#if defined(NEED_my_strlcat)
+static Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size);
+static
+#else
+extern Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size);
+#endif
+
+#define my_strlcat DPPP_(my_my_strlcat)
+#define Perl_my_strlcat DPPP_(my_my_strlcat)
+
+#if defined(NEED_my_strlcat) || defined(NEED_my_strlcat_GLOBAL)
+
+Size_t
+DPPP_(my_my_strlcat)(char *dst, const char *src, Size_t size)
+{
+    Size_t used, length, copy;
+
+    used = strlen(dst);
+    length = strlen(src);
+    if (size > 0 && used < size - 1) {
+        copy = (length >= size - used) ? size - used - 1 : length;
+        memcpy(dst + used, src, copy);
+        dst[used + copy] = '\0';
+    }
+    return used + length;
+}
+#endif
+#endif
+
+#if !defined(my_strlcpy)
+#if defined(NEED_my_strlcpy)
+static Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size);
+static
+#else
+extern Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size);
+#endif
+
+#define my_strlcpy DPPP_(my_my_strlcpy)
+#define Perl_my_strlcpy DPPP_(my_my_strlcpy)
+
+#if defined(NEED_my_strlcpy) || defined(NEED_my_strlcpy_GLOBAL)
+
+Size_t
+DPPP_(my_my_strlcpy)(char *dst, const char *src, Size_t size)
+{
+    Size_t length, copy;
+
+    length = strlen(src);
+    if (size > 0) {
+        copy = (length >= size) ? size - 1 : length;
+        memcpy(dst, src, copy);
+        dst[copy] = '\0';
+    }
+    return length;
+}
+
+#endif
+#endif
+#ifndef PERL_PV_ESCAPE_QUOTE
+#  define PERL_PV_ESCAPE_QUOTE           0x0001
+#endif
+
+#ifndef PERL_PV_PRETTY_QUOTE
+#  define PERL_PV_PRETTY_QUOTE           PERL_PV_ESCAPE_QUOTE
+#endif
+
+#ifndef PERL_PV_PRETTY_ELLIPSES
+#  define PERL_PV_PRETTY_ELLIPSES        0x0002
+#endif
+
+#ifndef PERL_PV_PRETTY_LTGT
+#  define PERL_PV_PRETTY_LTGT            0x0004
+#endif
+
+#ifndef PERL_PV_ESCAPE_FIRSTCHAR
+#  define PERL_PV_ESCAPE_FIRSTCHAR       0x0008
+#endif
+
+#ifndef PERL_PV_ESCAPE_UNI
+#  define PERL_PV_ESCAPE_UNI             0x0100
+#endif
+
+#ifndef PERL_PV_ESCAPE_UNI_DETECT
+#  define PERL_PV_ESCAPE_UNI_DETECT      0x0200
+#endif
+
+#ifndef PERL_PV_ESCAPE_ALL
+#  define PERL_PV_ESCAPE_ALL             0x1000
+#endif
+
+#ifndef PERL_PV_ESCAPE_NOBACKSLASH
+#  define PERL_PV_ESCAPE_NOBACKSLASH     0x2000
+#endif
+
+#ifndef PERL_PV_ESCAPE_NOCLEAR
+#  define PERL_PV_ESCAPE_NOCLEAR         0x4000
+#endif
+
+#ifndef PERL_PV_ESCAPE_RE
+#  define PERL_PV_ESCAPE_RE              0x8000
+#endif
+
+#ifndef PERL_PV_PRETTY_NOCLEAR
+#  define PERL_PV_PRETTY_NOCLEAR         PERL_PV_ESCAPE_NOCLEAR
+#endif
+#ifndef PERL_PV_PRETTY_DUMP
+#  define PERL_PV_PRETTY_DUMP            PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_QUOTE
+#endif
+
+#ifndef PERL_PV_PRETTY_REGPROP
+#  define PERL_PV_PRETTY_REGPROP         PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_LTGT|PERL_PV_ESCAPE_RE
+#endif
+
+/* Hint: pv_escape
+ * Note that unicode functionality is only backported to
+ * those perl versions that support it. For older perl
+ * versions, the implementation will fall back to bytes.
+ */
+
+#ifndef pv_escape
+#if defined(NEED_pv_escape)
+static char * DPPP_(my_pv_escape)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags);
+static
+#else
+extern char * DPPP_(my_pv_escape)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags);
+#endif
+
+#ifdef pv_escape
+#  undef pv_escape
+#endif
+#define pv_escape(a,b,c,d,e,f) DPPP_(my_pv_escape)(aTHX_ a,b,c,d,e,f)
+#define Perl_pv_escape DPPP_(my_pv_escape)
+
+#if defined(NEED_pv_escape) || defined(NEED_pv_escape_GLOBAL)
+
+char *
+DPPP_(my_pv_escape)(pTHX_ SV *dsv, char const * const str,
+  const STRLEN count, const STRLEN max,
+  STRLEN * const escaped, const U32 flags)
+{
+    const char esc = flags & PERL_PV_ESCAPE_RE ? '%' : '\\';
+    const char dq = flags & PERL_PV_ESCAPE_QUOTE ? '"' : esc;
+    char octbuf[32] = "%123456789ABCDF";
+    STRLEN wrote = 0;
+    STRLEN chsize = 0;
+    STRLEN readsize = 1;
+#if defined(is_utf8_string) && defined(utf8_to_uvchr)
+    bool isuni = flags & PERL_PV_ESCAPE_UNI ? 1 : 0;
+#endif
+    const char *pv  = str;
+    const char * const end = pv + count;
+    octbuf[0] = esc;
+
+    if (!(flags & PERL_PV_ESCAPE_NOCLEAR))
+	sv_setpvs(dsv, "");
+
+#if defined(is_utf8_string) && defined(utf8_to_uvchr)
+    if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count))
+        isuni = 1;
+#endif
+
+    for (; pv < end && (!max || wrote < max) ; pv += readsize) {
+        const UV u =
+#if defined(is_utf8_string) && defined(utf8_to_uvchr)
+		     isuni ? utf8_to_uvchr((U8*)pv, &readsize) :
+#endif
+			     (U8)*pv;
+        const U8 c = (U8)u & 0xFF;
+
+        if (u > 255 || (flags & PERL_PV_ESCAPE_ALL)) {
+            if (flags & PERL_PV_ESCAPE_FIRSTCHAR)
+                chsize = my_snprintf(octbuf, sizeof octbuf,
+                                      "%"UVxf, u);
+            else
+                chsize = my_snprintf(octbuf, sizeof octbuf,
+                                      "%cx{%"UVxf"}", esc, u);
+        } else if (flags & PERL_PV_ESCAPE_NOBACKSLASH) {
+            chsize = 1;
+        } else {
+            if (c == dq || c == esc || !isPRINT(c)) {
+	        chsize = 2;
+                switch (c) {
+		case '\\' : /* fallthrough */
+		case '%'  : if (c == esc)
+		                octbuf[1] = esc;
+		            else
+		                chsize = 1;
+		            break;
+		case '\v' : octbuf[1] = 'v'; break;
+		case '\t' : octbuf[1] = 't'; break;
+		case '\r' : octbuf[1] = 'r'; break;
+		case '\n' : octbuf[1] = 'n'; break;
+		case '\f' : octbuf[1] = 'f'; break;
+                case '"'  : if (dq == '"')
+				octbuf[1] = '"';
+			    else
+				chsize = 1;
+			    break;
+		default:    chsize = my_snprintf(octbuf, sizeof octbuf,
+				pv < end && isDIGIT((U8)*(pv+readsize))
+				? "%c%03o" : "%c%o", esc, c);
+                }
+            } else {
+                chsize = 1;
+            }
+	}
+	if (max && wrote + chsize > max) {
+	    break;
+        } else if (chsize > 1) {
+            sv_catpvn(dsv, octbuf, chsize);
+            wrote += chsize;
+	} else {
+	    char tmp[2];
+	    my_snprintf(tmp, sizeof tmp, "%c", c);
+            sv_catpvn(dsv, tmp, 1);
+	    wrote++;
+	}
+        if (flags & PERL_PV_ESCAPE_FIRSTCHAR)
+            break;
+    }
+    if (escaped != NULL)
+        *escaped= pv - str;
+    return SvPVX(dsv);
+}
+
+#endif
+#endif
+
+#ifndef pv_pretty
+#if defined(NEED_pv_pretty)
+static char * DPPP_(my_pv_pretty)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags);
+static
+#else
+extern char * DPPP_(my_pv_pretty)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags);
+#endif
+
+#ifdef pv_pretty
+#  undef pv_pretty
+#endif
+#define pv_pretty(a,b,c,d,e,f,g) DPPP_(my_pv_pretty)(aTHX_ a,b,c,d,e,f,g)
+#define Perl_pv_pretty DPPP_(my_pv_pretty)
+
+#if defined(NEED_pv_pretty) || defined(NEED_pv_pretty_GLOBAL)
+
+char *
+DPPP_(my_pv_pretty)(pTHX_ SV *dsv, char const * const str, const STRLEN count,
+  const STRLEN max, char const * const start_color, char const * const end_color,
+  const U32 flags)
+{
+    const U8 dq = (flags & PERL_PV_PRETTY_QUOTE) ? '"' : '%';
+    STRLEN escaped;
+
+    if (!(flags & PERL_PV_PRETTY_NOCLEAR))
+	sv_setpvs(dsv, "");
+
+    if (dq == '"')
+        sv_catpvs(dsv, "\"");
+    else if (flags & PERL_PV_PRETTY_LTGT)
+        sv_catpvs(dsv, "<");
+
+    if (start_color != NULL)
+        sv_catpv(dsv, D_PPP_CONSTPV_ARG(start_color));
+
+    pv_escape(dsv, str, count, max, &escaped, flags | PERL_PV_ESCAPE_NOCLEAR);
+
+    if (end_color != NULL)
+        sv_catpv(dsv, D_PPP_CONSTPV_ARG(end_color));
+
+    if (dq == '"')
+	sv_catpvs(dsv, "\"");
+    else if (flags & PERL_PV_PRETTY_LTGT)
+        sv_catpvs(dsv, ">");
+
+    if ((flags & PERL_PV_PRETTY_ELLIPSES) && escaped < count)
+	sv_catpvs(dsv, "...");
+
+    return SvPVX(dsv);
+}
+
+#endif
+#endif
+
+#ifndef pv_display
+#if defined(NEED_pv_display)
+static char * DPPP_(my_pv_display)(pTHX_ SV * dsv, const char * pv, STRLEN cur, STRLEN len, STRLEN pvlim);
+static
+#else
+extern char * DPPP_(my_pv_display)(pTHX_ SV * dsv, const char * pv, STRLEN cur, STRLEN len, STRLEN pvlim);
+#endif
+
+#ifdef pv_display
+#  undef pv_display
+#endif
+#define pv_display(a,b,c,d,e) DPPP_(my_pv_display)(aTHX_ a,b,c,d,e)
+#define Perl_pv_display DPPP_(my_pv_display)
+
+#if defined(NEED_pv_display) || defined(NEED_pv_display_GLOBAL)
+
+char *
+DPPP_(my_pv_display)(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim)
+{
+    pv_pretty(dsv, pv, cur, pvlim, NULL, NULL, PERL_PV_PRETTY_DUMP);
+    if (len > cur && pv[cur] == '\0')
+	sv_catpvs(dsv, "\\0");
+    return SvPVX(dsv);
+}
+
+#endif
+#endif
+
+#endif /* _P_P_PORTABILITY_H_ */
+
+/* End of File newppp.h */
@@ -1,6 +1,7 @@
 use strict;
 use OpenGL qw(GL_FLOAT GL_INT GL_UNSIGNED_BYTE);
-use Test::More tests => 141;
+## use Test::More tests => 141;
+use Test::More tests => 67;  # skip failing tests completely
 
 TODO: {
 
@@ -91,7 +92,7 @@ TODO: {
    ###----------------------------------------------------------------###
    SKIP: {
 
-      skip "KNOWN_PROBLEM with OpenGL::RPN calc tests", 111;
+      # skip "KNOWN_PROBLEM with OpenGL::RPN calc tests", 111 ;
 
       # affine
       my $left   = -800;
@@ -244,346 +245,347 @@ TODO: {
 
       ###----------------------------------------------------------------###
 
-      $o1 = init();
-      $o2 = init();
-      $o2->calc("<");
-      is(fmt($o2), fmt(0,0,0,0,0,0,0,0,0), '$o2->calc("<")');
-      $o1->calc("3,<");
-      is(fmt($o1), fmt(0,0,0,1,1,1,1,1,1), '$o1->calc("3,<") # S0 < S1');
-
-      ###----------------------------------------------------------------###
-
-      $o1 = init();
-      $o2 = init();
-      $o2->calc('7,swap');
-      is(fmt($o1), fmt(1,2,3,4,5,6,7,8,9), '$o1->calc("7,swap")');
-      $o2->calc('7,swap,swap');
-      is(fmt($o2), fmt(7,7,7,7,7,7,7,7,7), '$o2->calc("7,swap,swap")');
-
-      ###----------------------------------------------------------------###
-
-      $o1 = init();
-      $o2 = init();
-      $o2->calc('7,swap,pop');
-      is(fmt($o2), fmt(7,7,7,7,7,7,7,7,7), '$o2->calc("7,swap,pop")');
-      $o2->calc('7,swap,swap,pop');
-      is(fmt($o1), fmt(1,2,3,4,5,6,7,8,9), '$o1->calc("7,swap,swap,pop")');
-
-      ###----------------------------------------------------------------###
-
-      $o1 = init();
-      $o2 = init();
-      $o2->calc("dup");
-      is(fmt($o2), fmt(1,2,3,4,5,6,7,8,9), '$o2->calc("dup")');
-      $o1->calc("dup,+");
-      is(fmt($o1), fmt(2,4,6,8,10,12,14,16,18), '$o1->calc("dup,+")');
-
-      ###----------------------------------------------------------------###
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc("<");
+      ### is(fmt($o2), fmt(0,0,0,0,0,0,0,0,0), '$o2->calc("<")');
+      ### $o1->calc("3,<");
+      ### is(fmt($o1), fmt(0,0,0,1,1,1,1,1,1), '$o1->calc("3,<") # S0 < S1');
 
-      $o1 = init();
-      $o2 = init();
-      $o2->calc("dec");
-      is(fmt($o2), fmt(0,1,2,3,4,5,6,7,8), '$o2->calc("dec")');
-
-      $o2->calc("inc");
-      is(fmt($o2), fmt(1,2,3,4,5,6,7,8,9), '$o2->calc("inc")');
-
-      ###----------------------------------------------------------------###
+      ### ###----------------------------------------------------------------###
+
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc('7,swap');
+      ### is(fmt($o1), fmt(1,2,3,4,5,6,7,8,9), '$o1->calc("7,swap")');
+      ### $o2->calc('7,swap,swap');
+      ### is(fmt($o2), fmt(7,7,7,7,7,7,7,7,7), '$o2->calc("7,swap,swap")');
+
+      ### ###----------------------------------------------------------------###
+
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc('7,swap,pop');
+      ### is(fmt($o2), fmt(7,7,7,7,7,7,7,7,7), '$o2->calc("7,swap,pop")');
+      ### $o2->calc('7,swap,swap,pop');
+      ### is(fmt($o1), fmt(1,2,3,4,5,6,7,8,9), '$o1->calc("7,swap,swap,pop")');
+
+      ### ###----------------------------------------------------------------###
+
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc("dup");
+      ### is(fmt($o2), fmt(1,2,3,4,5,6,7,8,9), '$o2->calc("dup")');
+      ### $o1->calc("dup,+");
+      ### is(fmt($o1), fmt(2,4,6,8,10,12,14,16,18), '$o1->calc("dup,+")');
+
+      ### ###----------------------------------------------------------------###
+
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc("dec");
+      ### is(fmt($o2), fmt(0,1,2,3,4,5,6,7,8), '$o2->calc("dec")');
+
+      ### $o2->calc("inc");
+      ### is(fmt($o2), fmt(1,2,3,4,5,6,7,8,9), '$o2->calc("inc")');
+
+      ###----------------------------------------------------------------###
+
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc("dec,4,swap,3,swap,2,swap,?"); # dec will introduce a zero
+      ### is(fmt($o2), fmt(2,3,3,3,3,3,3,3,3), '$o1->calc("dec,4,swap,3,swap,2,swap,?")');
+      ### $o1->calc("inc,4,swap,3,swap,2,swap,?");
+      ### is(fmt($o1), fmt(3,3,3,3,3,3,3,3,3), '$o1->calc("inc,4,swap,3,swap,2,swap,?")');
+
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc("dec,4,swap,3,swap,2,swap,if"); # dec will introduce a zero
+      ### is(fmt($o2), fmt(2,3,3,3,3,3,3,3,3), '$o1->calc("dec,4,swap,3,swap,2,swap,if")');
+      ### $o1->calc("inc,4,swap,3,swap,2,swap,if");
+      ### is(fmt($o1), fmt(3,3,3,3,3,3,3,3,3), '$o1->calc("inc,4,swap,3,swap,2,swap,if")');
+
+      ### ###----------------------------------------------------------------###
+
+      ### $o1->calc('10,rand,*');
+      ### like(fmt($o1), lfmt(), '$o1->calc("10,rand,*")');
+
+      
+      ### ###----------------------------------------------------------------###
+
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc('get,+,set');
+      ### is(fmt($o2), fmt(1,3,6,10,15,21,28,36,45), '$o2->calc("get,+,set")');
+      ### $o1->calc('get,+,set', '', '');
+      ### is(fmt($o1), fmt(1,2,3,5,5,6,12,8,9), '$o1->calc("get,+,set","","")');
+
+      ### ###----------------------------------------------------------------###
+
+      ### $o1 = init();
+      ### $o1->calc("2,colget", "", "");
+      ### is(fmt($o1), fmt(3,2,3,6,5,6,9,8,9), '$o1->calc("2,colget", "", "")');
+
+      ### $o1 = init();
+      ### $o1->calc('2,colset', '', '');
+      ### is(fmt($o1), fmt(1,2,1,4,5,4,7,8,7), '$o1->calc("2,colset", "", "")');
+
+      ### $o1 = init();
+      ### $o1->calc("1,2,rowget", "2,1,rowget", "");
+      ### is(fmt($o1), fmt(6,8,3,6,8,6,6,8,9), '$o1->calc("1,2,rowget", "2,1,rowget", ""');
+
+      ### $o1 = init();
+      ### $o1->calc("1,2,rowset", "2,1,rowset", "0,0,rowset");
+      ### is(fmt($o1), fmt(9,2,3,4,5,7,7,5,9), '$o1->calc("1,2,rowset", "2,1,rowset", "0,0,rowset")');
+
+      ### ###----------------------------------------------------------------###
+
+      ### $o1 = init();
+      ### $o2 = init();
+      ### my $o3 = init();
+      ### my $o4 = init();
+      ### $o2->calc('-10,+');
+      ### $o3->calc('10,+');
+      ### $o4->calc('27');
+      ### $o1->calc("0,store,get","get","get");
+      ### is(fmt($o1), fmt(1,2,3,4,5,6,7,8,9), '$o1->calc("0,store,get","get","get")');
+      ### $o1->calc($o2,$o3,$o4,"0,store,get","get","get");
+      ### is(fmt($o1), fmt(1,2,3,4,5,6,7,8,9), '$o1->calc($o2,$o3,$o4,"0,store,get","get","get")');
+      ### $o1->calc($o2,$o3,$o4,"1,store",'','');
+      ### is(fmt($o1), fmt(1,2,3,4,5,6,7,8,9), '$o1->calc($o2,$o3,$o4,"1,store","","")');
+      ### $o1->calc($o2,$o3,$o4,"1,store,get",'','get');
+      ### is(fmt($o1), fmt(-9,2,-7,-6,5,-4,-3,8,-1), '$o1->calc($o2,$o3,$o4,"1,store,get","","get")');
+      ### $o1->calc($o2,$o3,$o4,"2,store,get");
+      ### is(fmt($o1), fmt(11,12,13,14,15,16,17,18,19), '$o1->calc($o2,$o3,$o4,"2,store,get")');
+      ### $o1->calc($o2,$o3,$o4,"3,store,get");
+      ### is(fmt($o1), fmt(27,27,27,27,27,27,27,27,27), '$o1->calc($o2,$o3,$o4,"3,store,get")');
+
+      ### $o1 = init();
+      ### $o2->assign(0, 7, 8 ,9,  10, 11, 12,  13, 14, 15);
+      ### $o1->calc($o2, "1,store,get","","get");
+      ### is(fmt($o1), fmt(7, 2, 9,  10, 5, 12,  13, 8, 15), '$o1->calc($o2, "1,store,get","","get")');
+
+      ### $o2 = init();
+      ### $o2->calc('-10,+');
+      ### is(fmt($o2), fmt(-9,-8,-7,-6,-5,-4,-3,-2,-1), '$o1->calc("-10,+")');
+      ### $o1 = init();
+      ### $o1->calc($o2,$o3,$o4,"","","0,store,1,load");
+      ### is(fmt($o1), fmt(1,2,3,4,5,6,7,8,9), '$o1->calc("","","0,store,1,load")');
+      ### is(fmt($o2), fmt(1,2,3,4,5,6,7,8,9), '$o1->calc("","","0,store,1,load")');
+      ### $o1->calc($o2,$o3,$o4,"","","2,store,3,load");
+      ### is(fmt($o1), fmt(1,2,3,4,5,6,7,8,9), '$o1->calc($o2,$o3,$o4,"","","2,store,3,load")');
+      ### is(fmt($o2), fmt(1,2,3,4,5,6,7,8,9), '$o1->calc($o2,$o3,$o4,"","","2,store,3,load")');
+      ### is(fmt($o3), fmt(11,12,13,14,15,16,17,18,19), '$o1->calc($o2,$o3,$o4,"","","2,store,3,load")');
+      ### is(fmt($o4), fmt(11,12,13,14,15,16,17,18,19), '$o1->calc($o2,$o3,$o4,"","","2,store,3,load")');
+
+      ### $o1 = init();
+      ### $o2->assign(0, 7, 8 ,9,  10, 11, 12,  13, 14, 15);
+      ### $o1->calc($o2, "set","", "set,1,load");
+      ### is(fmt($o2), fmt(1, 0, 3,  4, 0, 6,  7, 0, 9), '$o1->calc($o2, "set","", "set,1,store")');
+
+      ### ###----------------------------------------------------------------###
+
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc(3,"5,end,8",'');
+      ### is(fmt($o2), fmt(3,2,3,3,5,6,3,8,9), '$o2->calc(3,"5,end,8","")');
+
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc(3,"5,end,8",9);
+      ### is(fmt($o2), fmt(3,2,9,3,5,9,3,8,9), '$o2->calc(3,"5,end,8",9)');
+
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc(3,"5,return,8",'');
+      ### is(fmt($o2), fmt(3,5,3,3,5,6,3,5,9), '$o2->calc(3,"5,return,8","")');
+
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc(3,"5,return,8",9);
+      ### is(fmt($o2), fmt(3,5,9,3,5,9,3,5,9), '$o2->calc(3,"5,return,8",9)');
+
+      ### ###----------------------------------------------------------------###
+
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc(3,"5,1,endif,8",'');
+      ### is(fmt($o2), fmt(3,2,3,3,5,6,3,8,9), '$o2->calc(3,"5,1,endif,8","")');
+
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc(3,"5,0,endif,8",'');
+      ### is(fmt($o2), fmt(3,8,3,3,8,6,3,8,9), '$o2->calc(3,"5,0,endif,8","")');
+
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc(3,"5,1,returnif,8",'');
+      ### is(fmt($o2), fmt(3,5,3,3,5,6,3,5,9), '$o2->calc(3,"5,1,returnif,8","")');
+
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc(3,"5,0,returnif,8",'');
+      ### is(fmt($o2), fmt(3,8,3,3,8,6,3,8,9), '$o2->calc(3,"5,0,returnif,8","")');
+
+      ### ###----------------------------------------------------------------###
+
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc(3,"5,endrow,8",9);
+      ### is(fmt($o2), fmt(3,2,3,3,5,6,3,8,9), '$o2->calc(3,"5,endrow,8",9)');
+
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc(3,"5,returnrow,8",9);
+      ### is(fmt($o2), fmt(3,5,3,3,5,6,3,5,9), '$o2->calc(3,"5,returnrow,8",9)');
+
+      ### ###----------------------------------------------------------------###
+
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc(3,"5,1,endrowif,8",9);
+      ### is(fmt($o2), fmt(3,2,3,3,5,6,3,8,9), '$o2->calc(3,"5,1,endrowif,8",9)');
+
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc(3,"5,0,endrowif,8",9);
+      ### is(fmt($o2), fmt(3,8,9,3,8,9,3,8,9), '$o2->calc(3,"5,0,endrowif,8",9)');
+
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc(3,"5,1,returnrowif,8",9);
+      ### is(fmt($o2), fmt(3,5,3,3,5,6,3,5,9), '$o2->calc(3,"5,1,returnrowif,8",9)');
+
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc(3,"5,0,returnrowif,8",9);
+      ### is(fmt($o2), fmt(3,8,9,3,8,9,3,8,9), '$o2->calc(3,"5,0,returnrowif,8",9)');
+
+      ### ###----------------------------------------------------------------###
+
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc("sum");
+      ### is(fmt($o2), fmt(1,2,3,4,5,6,7,8,9), '$o2->calc("sum")');
+      ### $o2->calc("1,2,sum");
+      ### is(fmt($o2), fmt(4,5,6,7,8,9,10,11,12), '$o2->calc("1,2,sum")');
+
+      ### ###----------------------------------------------------------------###
+
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc("avg");
+      ### is(fmt($o2), fmt(1,2,3,4,5,6,7,8,9), '$o2->calc("avg")');
+      ### $o2->calc("5,avg");
+      ### is(fmt($o2), fmt(3,3,4,4,5,5,6,6,7), '$o2->calc("5,avg")');
+
+      ### ###----------------------------------------------------------------###
 
-      $o1 = init();
-      $o2 = init();
-      $o2->calc("dec,4,swap,3,swap,2,swap,?"); # dec will introduce a zero
-      is(fmt($o2), fmt(2,3,3,3,3,3,3,3,3), '$o1->calc("dec,4,swap,3,swap,2,swap,?")');
-      $o1->calc("inc,4,swap,3,swap,2,swap,?");
-      is(fmt($o1), fmt(3,3,3,3,3,3,3,3,3), '$o1->calc("inc,4,swap,3,swap,2,swap,?")');
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc("-,abs");
+      ### is(fmt($o2), fmt(1,2,3,4,5,6,7,8,9), '$o2->calc("-,abs")');
+      ### $o2->calc(-3);
+      ### $o2->calc('abs');
+      ### is(fmt($o2), fmt(3,3,3,3,3,3,3,3,3), '$o2->calc("abs")');
 
-      $o1 = init();
-      $o2 = init();
-      $o2->calc("dec,4,swap,3,swap,2,swap,if"); # dec will introduce a zero
-      is(fmt($o2), fmt(2,3,3,3,3,3,3,3,3), '$o1->calc("dec,4,swap,3,swap,2,swap,if")');
-      $o1->calc("inc,4,swap,3,swap,2,swap,if");
-      is(fmt($o1), fmt(3,3,3,3,3,3,3,3,3), '$o1->calc("inc,4,swap,3,swap,2,swap,if")');
+      ### ###----------------------------------------------------------------###
 
-      ###----------------------------------------------------------------###
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc("power");
+      ### is(fmt($o2), fmt(1,2,3,4,5,6,7,8,9), '$o2->calc("power")');
 
-      $o1->calc('10,rand,*');
-      like(fmt($o1), lfmt(), '$o1->calc("10,rand,*")');
-
-      ###----------------------------------------------------------------###
-
-      $o1 = init();
-      $o2 = init();
-      $o2->calc('get,+,set');
-      is(fmt($o2), fmt(1,3,6,10,15,21,28,36,45), '$o2->calc("get,+,set")');
-      $o1->calc('get,+,set', '', '');
-      is(fmt($o1), fmt(1,2,3,5,5,6,12,8,9), '$o1->calc("get,+,set","","")');
-
-      ###----------------------------------------------------------------###
-
-      $o1 = init();
-      $o1->calc("2,colget", "", "");
-      is(fmt($o1), fmt(3,2,3,6,5,6,9,8,9), '$o1->calc("2,colget", "", "")');
+      ### $o1->calc("2,power");
+      ### is(fmt($o1), fmt(1,4,9,16,25,36,49,64,81), '$o1->calc("2,power")');
 
-      $o1 = init();
-      $o1->calc('2,colset', '', '');
-      is(fmt($o1), fmt(1,2,1,4,5,4,7,8,7), '$o1->calc("2,colset", "", "")');
+      ### ###----------------------------------------------------------------###
 
-      $o1 = init();
-      $o1->calc("1,2,rowget", "2,1,rowget", "");
-      is(fmt($o1), fmt(6,8,3,6,8,6,6,8,9), '$o1->calc("1,2,rowget", "2,1,rowget", ""');
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc("min");
+      ### is(fmt($o2), fmt(1,2,3,4,5,6,7,8,9), '$o2->calc("min")');
 
-      $o1 = init();
-      $o1->calc("1,2,rowset", "2,1,rowset", "0,0,rowset");
-      is(fmt($o1), fmt(9,2,3,4,5,7,7,5,9), '$o1->calc("1,2,rowset", "2,1,rowset", "0,0,rowset")');
+      ### $o1->calc("5,min");
+      ### is(fmt($o1), fmt(1,2,3,4,5,5,5,5,5), '$o2->calc("5,min")');
 
-      ###----------------------------------------------------------------###
+      ### ###----------------------------------------------------------------###
 
-      $o1 = init();
-      $o2 = init();
-      my $o3 = init();
-      my $o4 = init();
-      $o2->calc('-10,+');
-      $o3->calc('10,+');
-      $o4->calc('27');
-      $o1->calc("0,store,get","get","get");
-      is(fmt($o1), fmt(1,2,3,4,5,6,7,8,9), '$o1->calc("0,store,get","get","get")');
-      $o1->calc($o2,$o3,$o4,"0,store,get","get","get");
-      is(fmt($o1), fmt(1,2,3,4,5,6,7,8,9), '$o1->calc($o2,$o3,$o4,"0,store,get","get","get")');
-      $o1->calc($o2,$o3,$o4,"1,store",'','');
-      is(fmt($o1), fmt(1,2,3,4,5,6,7,8,9), '$o1->calc($o2,$o3,$o4,"1,store","","")');
-      $o1->calc($o2,$o3,$o4,"1,store,get",'','get');
-      is(fmt($o1), fmt(-9,2,-7,-6,5,-4,-3,8,-1), '$o1->calc($o2,$o3,$o4,"1,store,get","","get")');
-      $o1->calc($o2,$o3,$o4,"2,store,get");
-      is(fmt($o1), fmt(11,12,13,14,15,16,17,18,19), '$o1->calc($o2,$o3,$o4,"2,store,get")');
-      $o1->calc($o2,$o3,$o4,"3,store,get");
-      is(fmt($o1), fmt(27,27,27,27,27,27,27,27,27), '$o1->calc($o2,$o3,$o4,"3,store,get")');
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc("max");
+      ### is(fmt($o2), fmt(1,2,3,4,5,6,7,8,9), '$o2->calc("max")');
 
-      $o1 = init();
-      $o2->assign(0, 7, 8 ,9,  10, 11, 12,  13, 14, 15);
-      $o1->calc($o2, "1,store,get","","get");
-      is(fmt($o1), fmt(7, 2, 9,  10, 5, 12,  13, 8, 15), '$o1->calc($o2, "1,store,get","","get")');
+      ### $o1->calc("5,max");
+      ### is(fmt($o1), fmt(5,5,5,5,5,6,7,8,9), '$o2->calc("5,max")');
 
-      $o2 = init();
-      $o2->calc('-10,+');
-      is(fmt($o2), fmt(-9,-8,-7,-6,-5,-4,-3,-2,-1), '$o1->calc("-10,+")');
-      $o1 = init();
-      $o1->calc($o2,$o3,$o4,"","","0,store,1,load");
-      is(fmt($o1), fmt(1,2,3,4,5,6,7,8,9), '$o1->calc("","","0,store,1,load")');
-      is(fmt($o2), fmt(1,2,3,4,5,6,7,8,9), '$o1->calc("","","0,store,1,load")');
-      $o1->calc($o2,$o3,$o4,"","","2,store,3,load");
-      is(fmt($o1), fmt(1,2,3,4,5,6,7,8,9), '$o1->calc($o2,$o3,$o4,"","","2,store,3,load")');
-      is(fmt($o2), fmt(1,2,3,4,5,6,7,8,9), '$o1->calc($o2,$o3,$o4,"","","2,store,3,load")');
-      is(fmt($o3), fmt(11,12,13,14,15,16,17,18,19), '$o1->calc($o2,$o3,$o4,"","","2,store,3,load")');
-      is(fmt($o4), fmt(11,12,13,14,15,16,17,18,19), '$o1->calc($o2,$o3,$o4,"","","2,store,3,load")');
+      ### ###----------------------------------------------------------------###
 
-      $o1 = init();
-      $o2->assign(0, 7, 8 ,9,  10, 11, 12,  13, 14, 15);
-      $o1->calc($o2, "set","", "set,1,load");
-      is(fmt($o2), fmt(1, 0, 3,  4, 0, 6,  7, 0, 9), '$o1->calc($o2, "set","", "set,1,store")');
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc("pi");
+      ### ok((9 == grep {$_ =~ /^3\.14159\d+$/} $o2->retrieve(0,9)), '$o2->calc("pi")');
 
-      ###----------------------------------------------------------------###
+      ### # this test may fail if the system floats have less that 6 digits of precision
+      ### $o1->calc("dec,6,min,10,swap,power,pi,*,10,%");
+      ### # decrement
+      ### # take a digit
+      ### # make sure it is less than 6
+      ### # raise 10 to that digit
+      ### # multiply by pi
+      ### # mod 10 to get that digit of pi
+      ### is(fmt($o1), fmt(3,1,4,1,5,9,2,2,2), '$o2->calc("dec,6,min,10,swap,power,pi,*,10,%")');
 
-      $o1 = init();
-      $o2 = init();
-      $o2->calc(3,"5,end,8",'');
-      is(fmt($o2), fmt(3,2,3,3,5,6,3,8,9), '$o2->calc(3,"5,end,8","")');
+      ### ###----------------------------------------------------------------###
 
-      $o1 = init();
-      $o2 = init();
-      $o2->calc(3,"5,end,8",9);
-      is(fmt($o2), fmt(3,2,9,3,5,9,3,8,9), '$o2->calc(3,"5,end,8",9)');
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc("10,/,pi,*,sin,10,*"); # sin in 10 degree increments
+      ### is(fmt($o2), fmt(3,5,8,9,10,9,8,5,3), '$o2->calc("10,/,pi,*,sin,10,*")');
 
-      $o1 = init();
-      $o2 = init();
-      $o2->calc(3,"5,return,8",'');
-      is(fmt($o2), fmt(3,5,3,3,5,6,3,5,9), '$o2->calc(3,"5,return,8","")');
+      ### ###----------------------------------------------------------------###
 
-      $o1 = init();
-      $o2 = init();
-      $o2->calc(3,"5,return,8",9);
-      is(fmt($o2), fmt(3,5,9,3,5,9,3,5,9), '$o2->calc(3,"5,return,8",9)');
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc("10,/,pi,*,cos,10,*"); # cos in 10 degree increments
+      ### is(fmt($o2), fmt(9,8,5,3,0,-3,-5,-8,-9), '$o2->calc("10,/,pi,*,cos,10,*")');
 
-      ###----------------------------------------------------------------###
+      ### ###----------------------------------------------------------------###
 
-      $o1 = init();
-      $o2 = init();
-      $o2->calc(3,"5,1,endif,8",'');
-      is(fmt($o2), fmt(3,2,3,3,5,6,3,8,9), '$o2->calc(3,"5,1,endif,8","")');
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc("10,/,pi,*,tan,10,*,abs,100,min"); # tan in 10 degree increments
+      ### is(fmt($o2), fmt(3,7,13,30,100,30,13,7,3), '$o2->calc("10,/,pi,*,tan,10,*,abs,100,min")');
 
-      $o1 = init();
-      $o2 = init();
-      $o2->calc(3,"5,0,endif,8",'');
-      is(fmt($o2), fmt(3,8,3,3,8,6,3,8,9), '$o2->calc(3,"5,0,endif,8","")');
+      ### ###----------------------------------------------------------------###
 
-      $o1 = init();
-      $o2 = init();
-      $o2->calc(3,"5,1,returnif,8",'');
-      is(fmt($o2), fmt(3,5,3,3,5,6,3,5,9), '$o2->calc(3,"5,1,returnif,8","")');
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc("1,swap,atan2,400,*,dup,0,swap,300,<,?"); # 3 digits of pie
+      ### is(fmt($o2), fmt(314,0,0,0,0,0,0,0,0), '$o2->calc("1,swap,atan2,400,*,dup,0,swap,300,<,?")');
 
-      $o1 = init();
-      $o2 = init();
-      $o2->calc(3,"5,0,returnif,8",'');
-      is(fmt($o2), fmt(3,8,3,3,8,6,3,8,9), '$o2->calc(3,"5,0,returnif,8","")');
+      ### ###----------------------------------------------------------------###
 
-      ###----------------------------------------------------------------###
+      ### $o1 = init();
+      ### $o2 = init();
+      ### $o2->calc("count","count","count");
+      ### is(fmt($o2), fmt(9,9,9,9,9,9,9,9,9), '$o2->calc("count","count","count")');
 
-      $o1 = init();
-      $o2 = init();
-      $o2->calc(3,"5,endrow,8",9);
-      is(fmt($o2), fmt(3,2,3,3,5,6,3,8,9), '$o2->calc(3,"5,endrow,8",9)');
+      ### $o2->calc("index","index","index");
+      ### is(fmt($o2), fmt(0,1,2,3,4,5,6,7,8), '$o2->calc("index","index","index")');
 
-      $o1 = init();
-      $o2 = init();
-      $o2->calc(3,"5,returnrow,8",9);
-      is(fmt($o2), fmt(3,5,3,3,5,6,3,5,9), '$o2->calc(3,"5,returnrow,8",9)');
+      ### $o2->calc("columns","columns","columns");
+      ### is(fmt($o2), fmt(3,3,3,3,3,3,3,3,3), '$o2->calc("columns","columns","columns")');
 
-      ###----------------------------------------------------------------###
+      ### $o2->calc("column","column","column");
+      ### is(fmt($o2), fmt(0,1,2,0,1,2,0,1,2), '$o2->calc("column","column","column")');
 
-      $o1 = init();
-      $o2 = init();
-      $o2->calc(3,"5,1,endrowif,8",9);
-      is(fmt($o2), fmt(3,2,3,3,5,6,3,8,9), '$o2->calc(3,"5,1,endrowif,8",9)');
+      ### $o2->calc("rows","rows","rows");
+      ### is(fmt($o2), fmt(3,3,3,3,3,3,3,3,3), '$o2->calc("rows","rows","rows")');
 
-      $o1 = init();
-      $o2 = init();
-      $o2->calc(3,"5,0,endrowif,8",9);
-      is(fmt($o2), fmt(3,8,9,3,8,9,3,8,9), '$o2->calc(3,"5,0,endrowif,8",9)');
+      ### $o2->calc("row","row","row");
+      ### is(fmt($o2), fmt(0,0,0,1,1,1,2,2,2), '$o2->calc("row","row","row")');
 
-      $o1 = init();
-      $o2 = init();
-      $o2->calc(3,"5,1,returnrowif,8",9);
-      is(fmt($o2), fmt(3,5,3,3,5,6,3,5,9), '$o2->calc(3,"5,1,returnrowif,8",9)');
-
-      $o1 = init();
-      $o2 = init();
-      $o2->calc(3,"5,0,returnrowif,8",9);
-      is(fmt($o2), fmt(3,8,9,3,8,9,3,8,9), '$o2->calc(3,"5,0,returnrowif,8",9)');
-
-      ###----------------------------------------------------------------###
-
-      $o1 = init();
-      $o2 = init();
-      $o2->calc("sum");
-      is(fmt($o2), fmt(1,2,3,4,5,6,7,8,9), '$o2->calc("sum")');
-      $o2->calc("1,2,sum");
-      is(fmt($o2), fmt(4,5,6,7,8,9,10,11,12), '$o2->calc("1,2,sum")');
-
-      ###----------------------------------------------------------------###
-
-      $o1 = init();
-      $o2 = init();
-      $o2->calc("avg");
-      is(fmt($o2), fmt(1,2,3,4,5,6,7,8,9), '$o2->calc("avg")');
-      $o2->calc("5,avg");
-      is(fmt($o2), fmt(3,3,4,4,5,5,6,6,7), '$o2->calc("5,avg")');
-
-      ###----------------------------------------------------------------###
-
-      $o1 = init();
-      $o2 = init();
-      $o2->calc("-,abs");
-      is(fmt($o2), fmt(1,2,3,4,5,6,7,8,9), '$o2->calc("-,abs")');
-      $o2->calc(-3);
-      $o2->calc('abs');
-      is(fmt($o2), fmt(3,3,3,3,3,3,3,3,3), '$o2->calc("abs")');
-
-      ###----------------------------------------------------------------###
-
-      $o1 = init();
-      $o2 = init();
-      $o2->calc("power");
-      is(fmt($o2), fmt(1,2,3,4,5,6,7,8,9), '$o2->calc("power")');
-
-      $o1->calc("2,power");
-      is(fmt($o1), fmt(1,4,9,16,25,36,49,64,81), '$o1->calc("2,power")');
-
-      ###----------------------------------------------------------------###
-
-      $o1 = init();
-      $o2 = init();
-      $o2->calc("min");
-      is(fmt($o2), fmt(1,2,3,4,5,6,7,8,9), '$o2->calc("min")');
-
-      $o1->calc("5,min");
-      is(fmt($o1), fmt(1,2,3,4,5,5,5,5,5), '$o2->calc("5,min")');
-
-      ###----------------------------------------------------------------###
-
-      $o1 = init();
-      $o2 = init();
-      $o2->calc("max");
-      is(fmt($o2), fmt(1,2,3,4,5,6,7,8,9), '$o2->calc("max")');
-
-      $o1->calc("5,max");
-      is(fmt($o1), fmt(5,5,5,5,5,6,7,8,9), '$o2->calc("5,max")');
-
-      ###----------------------------------------------------------------###
-
-      $o1 = init();
-      $o2 = init();
-      $o2->calc("pi");
-      ok((9 == grep {$_ =~ /^3\.14159\d+$/} $o2->retrieve(0,9)), '$o2->calc("pi")');
-
-      # this test may fail if the system floats have less that 6 digits of precision
-      $o1->calc("dec,6,min,10,swap,power,pi,*,10,%");
-      # decrement
-      # take a digit
-      # make sure it is less than 6
-      # raise 10 to that digit
-      # multiply by pi
-      # mod 10 to get that digit of pi
-      is(fmt($o1), fmt(3,1,4,1,5,9,2,2,2), '$o2->calc("dec,6,min,10,swap,power,pi,*,10,%")');
-
-      ###----------------------------------------------------------------###
-
-      $o1 = init();
-      $o2 = init();
-      $o2->calc("10,/,pi,*,sin,10,*"); # sin in 10 degree increments
-      is(fmt($o2), fmt(3,5,8,9,10,9,8,5,3), '$o2->calc("10,/,pi,*,sin,10,*")');
-
-      ###----------------------------------------------------------------###
-
-      $o1 = init();
-      $o2 = init();
-      $o2->calc("10,/,pi,*,cos,10,*"); # cos in 10 degree increments
-      is(fmt($o2), fmt(9,8,5,3,0,-3,-5,-8,-9), '$o2->calc("10,/,pi,*,cos,10,*")');
-
-      ###----------------------------------------------------------------###
-
-      $o1 = init();
-      $o2 = init();
-      $o2->calc("10,/,pi,*,tan,10,*,abs,100,min"); # tan in 10 degree increments
-      is(fmt($o2), fmt(3,7,13,30,100,30,13,7,3), '$o2->calc("10,/,pi,*,tan,10,*,abs,100,min")');
-
-      ###----------------------------------------------------------------###
-
-      $o1 = init();
-      $o2 = init();
-      $o2->calc("1,swap,atan2,400,*,dup,0,swap,300,<,?"); # 3 digits of pie
-      is(fmt($o2), fmt(314,0,0,0,0,0,0,0,0), '$o2->calc("1,swap,atan2,400,*,dup,0,swap,300,<,?")');
-
-      ###----------------------------------------------------------------###
-
-      $o1 = init();
-      $o2 = init();
-      $o2->calc("count","count","count");
-      is(fmt($o2), fmt(9,9,9,9,9,9,9,9,9), '$o2->calc("count","count","count")');
-
-      $o2->calc("index","index","index");
-      is(fmt($o2), fmt(0,1,2,3,4,5,6,7,8), '$o2->calc("index","index","index")');
-
-      $o2->calc("columns","columns","columns");
-      is(fmt($o2), fmt(3,3,3,3,3,3,3,3,3), '$o2->calc("columns","columns","columns")');
-
-      $o2->calc("column","column","column");
-      is(fmt($o2), fmt(0,1,2,0,1,2,0,1,2), '$o2->calc("column","column","column")');
-
-      $o2->calc("rows","rows","rows");
-      is(fmt($o2), fmt(3,3,3,3,3,3,3,3,3), '$o2->calc("rows","rows","rows")');
-
-      $o2->calc("row","row","row");
-      is(fmt($o2), fmt(0,0,0,1,1,1,2,2,2), '$o2->calc("row","row","row")');
-
-      ###----------------------------------------------------------------###
+      ### ###----------------------------------------------------------------###
    }
 }
@@ -92,7 +92,7 @@ my $hasVBO = 0;
 my $hasFragProg = 0;
 my $hasImagePointer = 0;
 my $idleTime = time();
-my $idleSecsMax = 30;
+my $idleSecsMax = 5;
 my $er;
 
 # Window and texture IDs, window width and height.
@@ -0,0 +1,30 @@
+@echo off
+if not "%1"=="clean" goto BUILD
+if exist glversion.txt del glversion.txt&echo deleted glversion.txt
+if exist glversion.exe del glversion.exe&echo deleted glversion.exe
+if exist glversion.o del glversion.o&echo deleted glversion.o
+goto END
+
+
+:BUILD
+echo.
+echo compiling glversion.c
+gcc -DHAVE_FREEGLUT -DIS_STRAWBERRY -c glversion.c
+if errorlevel 1 goto ERROR
+
+echo linking glversion.o
+gcc -o glversion.exe glversion.o -lopengl32 -L%drive%/c/lib -lglut 
+if errorlevel 1 goto ERROR
+
+echo generating glversion.txt
+glversion > glversion.txt
+if errorlevel 1 goto ERROR
+goto END
+
+
+:ERROR
+echo build error!
+echo.
+
+
+:END