################################################################################
##
##  Version 3.x, Copyright (C) 2004-2013, 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.
##
################################################################################

=provides

__UNDEFINED__

=dontwarn

## We don't want people to be using these symbols so even though we provide
## them, we don't publicly mention them

PERL_REVISION
PERL_VERSION
PERL_SUBVERSION
PERL_PATCHLEVEL_H_IMPLICIT
PERL_BCDVERSION

=implementation

#define D_PPP_RELEASE_DATE 1643673600 /* 2022-02-01 */

#if ! defined(PERL_REVISION) && ! defined(PERL_VERSION_MAJOR)
#  if   !   defined(__PATCHLEVEL_H_INCLUDED__)                                  \
     && ! ( defined(PATCHLEVEL) && defined(SUBVERSION))
#    define PERL_PATCHLEVEL_H_IMPLICIT
#    include <patchlevel.h>
#  endif
#  if     ! defined(PERL_VERSION)                                               \
     &&   ! defined(PERL_VERSION_MAJOR)                                         \
     && ( ! defined(SUBVERSION) || ! defined(PATCHLEVEL) )
#    include <could_not_find_Perl_patchlevel.h>
#  endif
#endif

#ifdef PERL_VERSION_MAJOR
#  define D_PPP_MAJOR  PERL_VERSION_MAJOR
#elif defined(PERL_REVISION)
#  define D_PPP_MAJOR  PERL_REVISION
#else
#  define D_PPP_MAJOR  5
#endif

#ifdef PERL_VERSION_MINOR
#  define D_PPP_MINOR  PERL_VERSION_MINOR
#elif defined(PERL_VERSION)
#  define D_PPP_MINOR  PERL_VERSION
#elif defined(PATCHLEVEL)
#  define D_PPP_MINOR  PATCHLEVEL
#  define PERL_VERSION         PATCHLEVEL   /* back-compat */
#else
#  error Could not find a source for PERL_VERSION_MINOR
#endif

#ifdef PERL_VERSION_PATCH
#  define D_PPP_PATCH  PERL_VERSION_PATCH
#elif defined(PERL_SUBVERSION)
#  define D_PPP_PATCH  PERL_SUBVERSION
#elif defined(SUBVERSION)
#  define D_PPP_PATCH  SUBVERSION
#  define PERL_SUBVERSION      SUBVERSION   /* back-compat */
#else
#  error Could not find a source for PERL_VERSION_PATCH
#endif

#if D_PPP_MAJOR < 5 || D_PPP_MAJOR == 6
#  error Devel::PPPort works only on Perl 5, Perl 7, ...
#elif D_PPP_MAJOR != 5
    /* Perl 7 and above: the old forms are deprecated, set up so that they
     * assume Perl 5, and will make this look like 5.201.201.
     *
     * 201 is used so will be well above anything that would come from a 5
     * series if we unexpectedly have to continue it, but still gives plenty of
     * room, up to 255, of numbers that will fit into a byte in case there is
     * something else unforeseen */
#  undef  PERL_REVISION
#  undef  PERL_VERSION
#  undef  PERL_SUBVERSION
#  define D_PPP_REVISION      5
#  define D_PPP_VERSION     201
#  define D_PPP_SUBVERSION  201
#  if   (defined(__clang__)     /* _Pragma here doesn't work with gcc */  \
     && (   (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L)    \
         || defined(_STDC_C99)                                            \
         || defined(__c99)))
#    define D_PPP_STRINGIFY(x) #x
#    define D_PPP_deprecate(xyz) _Pragma(D_PPP_STRINGIFY(GCC warning(D_PPP_STRINGIFY(xyz) " is deprecated")))
#    define PERL_REVISION     (D_PPP_REVISION D_PPP_deprecate(PERL_REVISION))
#    define PERL_VERSION      (D_PPP_REVISION D_PPP_deprecate(PERL_VERSION))
#    define PERL_SUBVERSION   (D_PPP_SUBVERSION D_PPP_deprecate(PERL_SUBVERSION))
#  else
#    define PERL_REVISION     D_PPP_REVISION
#    define PERL_VERSION      D_PPP_REVISION
#    define PERL_SUBVERSION   D_PPP_SUBVERSION
#  endif
#endif

/* Warning: PERL_PATCHLEVEL PATCHLEVEL SUBVERSION PERL_REVISION PERL_VERSION
 *          PERL_SUBVERSION PERL_BCDVERSION
 *
 * You should be using PERL_VERSION_xy(maj,min,ptch) instead of this, where xy
 * is one of EQ, NE, LE, GT, LT, GE
 */

/* Replace PERL_PATCHLEVEL with PERL_VERSION_xy(5,a,b) (where xy is EQ,LT,GT...) */
/* Replace PATCHLEVEL with PERL_VERSION_xy(5,a,b) (where xy is EQ,LT,GT...) */
/* Replace SUBVERSION with PERL_VERSION_xy(5,a,b) (where xy is EQ,LT,GT...) */
/* Replace PERL_REVISION with PERL_VERSION_xy(a,b,c) (where xy is EQ,LT,GT...) */
/* Replace PERL_VERSION with PERL_VERSION_xy(5,a,b) (where xy is EQ,LT,GT...) */
/* Replace PERL_SUBVERSION with PERL_VERSION_xy(5,a,b) (where xy is EQ,LT,GT...) */
/* Replace PERL_BCDVERSION with PERL_VERSION_xy(5,a,b) (where xy is EQ,LT,GT...) */

#define D_PPP_DEC2BCD(dec) ((((dec)/100)<<8)|((((dec)%100)/10)<<4)|((dec)%10))
#define D_PPP_JNP_TO_BCD(j,n,p) ((D_PPP_DEC2BCD(j)<<24)|(D_PPP_DEC2BCD(n)<<12)|D_PPP_DEC2BCD(p))
#define PERL_BCDVERSION D_PPP_JNP_TO_BCD(D_PPP_MAJOR,           \
                                          D_PPP_MINOR,          \
                                          D_PPP_PATCH)

/* These differ from the versions outside D:P in using PERL_BCDVERSION instead
 * of PERL_DECIMAL_VERSION.  The formats printing in this module assume BCD, so
 * always use it */
#undef PERL_VERSION_EQ
#undef PERL_VERSION_NE
#undef PERL_VERSION_LT
#undef PERL_VERSION_GE
#undef PERL_VERSION_LE
#undef PERL_VERSION_GT

/* N.B. These don't work if the patch number is 42 or 92, as those are what '*'
 * is in ASCII and EBCDIC respectively */
__UNDEFINED__ PERL_VERSION_EQ(j,n,p)                                        \
              (((p) == '*') ? (   (j) == D_PPP_VERSION_MAJOR                \
                               && (n) == D_PPP_VERSION_MINOR)               \
                            : (PERL_BCDVERSION == D_PPP_JNP_TO_BCD(j,n,p)))
__UNDEFINED__ PERL_VERSION_NE(j,n,p) (! PERL_VERSION_EQ(j,n,p))

__UNDEFINED__ PERL_VERSION_LT(j,n,p)      /* p=='*' means _LT(j,n,0) */     \
    (PERL_BCDVERSION < D_PPP_JNP_TO_BCD(                    (j),            \
                                                             (n),           \
                                         (((p) == '*') ? 0 : (p))))
__UNDEFINED__ PERL_VERSION_GE(j,n,p) (! PERL_VERSION_LT(j,n,p))

__UNDEFINED__ PERL_VERSION_LE(j,n,p)      /* p=='*' means _LT(j,n+1,0) */   \
    (PERL_BCDVERSION < D_PPP_JNP_TO_BCD(                          (j),      \
                                         (((p) == '*') ? ((n)+1) : (n)),    \
                                         (((p) == '*') ?   0     : (p))))
__UNDEFINED__ PERL_VERSION_GT(j,n,p) (! PERL_VERSION_LE(j,n,p))
