Chapter 23. API compatibility definition

Table of Contents
What is in the API?
Regression test for backwards compatibility

This chapter presents the formal definition of what is considered to be in the PLplot library API. It is assumed that major new releases of PLplot will have substantial backwards incompatible changes in the API, but the PLplot developers commit to introducing as few as possible of such incompatibilities between minor releases such that stability across those minor releases is practically guaranteed. In all cases where backwards incompatible changes have been introduced, then the library soname will be changed (for operating systems such as Linux that support versioned shared libraries).

The information in this chapter regards version 5.9.6 of PLplot, released on 2010-06-05.

What is in the API?

The formal definition of the PLplot C API is everything that is defined in the include file plplot.h. This includes all the function prototypes, the defined structures and the semantics of the constants. The list of symbols currently exported by the shared library libplplot.h that are declared in plplot.h is the following:

plAlloc2dGrid           plgDevs                 plscmap0n
plClearOpts             plgFileDevs             plscmap1
plFindCommand           plgchr                  plscmap1a
plFindName              plgcol0                 plscmap1l
plFree2dGrid            plgcol0a                plscmap1la
plGetCursor             plgcolbg                plscmap1n
plGetFlt                plgcolbga               plscol0
plGetInt                plgcompression          plscol0a
plGetName               plgdev                  plscolbg
plHLS_RGB               plgdidev                plscolbga
plMergeOpts             plgdiori                plscolor
plMinMax2dGrid          plgdiplt                plscompression
plOptUsage              plgesc                  plsdev
plParseOpts             plget                   plsdidev
plRGB_HLS               plgfam                  plsdimap
plResetOpts             plgfci                  plsdiori
plSetOpt                plgfile                 plsdiplt
plSetUsage              plgfnam                 plsdiplz
plTranslateCursor       plgfont                 plseed
pl_cmd                  plglevel                plseopH
pl_setcontlabelformat   plgpage                 plsesc
pl_setcontlabelparam    plgra                   plset
pladv                   plgradient              plsetopt
plarc                   plgriddata              plsexit
plarrows                plgspa                  plsfam
plaxes                  plgstrm                 plsfci
plbin                   plgver                  plsfile
plbop                   plgvpd                  plsfnam
plbox                   plgvpw                  plsfont
plbox3                  plgxax                  plshade
plbtime                 plgyax                  plshade1
plcalc_world            plgzax                  plshades
plclear                 plhist                  plslabelfunc
plcol0                  plhls                   plsmaj
plcol1                  plhlsrgb                plsmem
plconfigtime            plimage                 plsmin
plcont                  plimagefr               plsori
plcpstrm                plinit                  plspage
plctime                 pljoin                  plspal0
pldid2pc                pllab                   plspal1
pldip2dc                pllightsource           plspause
plend                   plline                  plsstrm
plend1                  plline3                 plssub
plenv                   pllsty                  plssym
plenv0                  plmap                   plstar
pleop                   plmeridians             plstart
plerrx                  plmesh                  plstr
plerry                  plmeshc                 plstransform
plf2eval                plmkstrm                plstripa
plf2eval1               plmtex                  plstripc
plf2eval2               plmtex3                 plstripd
plf2evalr               plot3d                  plstyl
plf2ops_c               plot3dc                 plsurf3d
plf2ops_grid_c          plot3dcl                plsurf3dl
plf2ops_grid_col_major  plparseopts             plsvect
plf2ops_grid_row_major  plpat                   plsvpa
plfamadv                plpath                  plsxax
plfcont                 plpoin                  plsxwin
plfgriddata             plpoin3                 plsyax
plfill                  plpoly3                 plsym
plfill3                 plprec                  plszax
plfimage                plpsty                  pltext
plfimagefr              plptex                  pltimefmt
plflush                 plptex3                 pltr0
plfmesh                 plrandd                 pltr1
plfmeshc                plreplot                pltr2
plfont                  plrgb                   pltr2f
plfontld                plrgb1                  pltr2p
plfplot3d               plrgbhls                plvasp
plfplot3dc              plsButtonEH             plvect
plfplot3dcl             plsError                plvpas
plfshade                plsKeyEH                plvpor
plfshade1               plsabort                plvsta
plfshades               plsbopH                 plw3d
plfsurf3d               plschr                  plwid
plfsurf3dl              plscmap0                plwind
plfvect                 plscmap0a               plxormod

Another important aspect of compatibility regard the Application Binary Interface (ABI). Backwards compatibility can be broken by changes in the C structures made public through plplot.h. Currently, they are:

typedef struct
{
    const char *opt;
    int ( *handler )( const char *, const char *, void * );
    void       *client_data;
    void       *var;
    long       mode;
    const char *syntax;
    const char *desc;
} PLOptionTable;

typedef struct
{
    int          type;              /* of event (CURRENTLY UNUSED) */
    unsigned int state;             /* key or button mask */
    unsigned int keysym;            /* key selected */
    unsigned int button;            /* mouse button selected */
    PLINT        subwindow;         /* subwindow (alias subpage, alias subplot) number */
    char         string[PL_MAXKEY]; /* translated string */
    int          pX, pY;            /* absolute device coordinates of pointer */
    PLFLT        dX, dY;            /* relative device coordinates of pointer */
    PLFLT        wX, wY;            /* world coordinates of pointer */
} PLGraphicsIn;

typedef struct
{
    PLFLT dxmi, dxma, dymi, dyma;       /* min, max window rel dev coords */
    PLFLT wxmi, wxma, wymi, wyma;       /* min, max window world coords */
} PLWindow;

typedef struct
{
    unsigned int x, y;                  /* upper left hand corner */
    unsigned int width, height;         /* window dimensions */
} PLDisplay;

typedef struct
{
    PLFLT *f;
    PLINT nx, ny, nz;
} PLfGrid;

typedef struct
{
    PLFLT **f;
    PLINT nx, ny;
} PLfGrid2;

typedef struct
{
    PLFLT *xg, *yg, *zg;
    PLINT nx, ny, nz;
} PLcGrid;

typedef struct
{
    PLFLT **xg, **yg, **zg;
    PLINT nx, ny;
} PLcGrid2;

typedef struct
{
    unsigned char r;            /* red */
    unsigned char g;            /* green */
    unsigned char b;            /* blue */
    PLFLT         a;            /* alpha (or transparency) */
    const char    *name;
} PLColor;

typedef struct
{
    PLFLT h;                    /* hue */
    PLFLT l;                    /* lightness */
    PLFLT s;                    /* saturation */
    PLFLT p;                    /* position */
    PLFLT a;                    /* alpha (or transparency) */
    int   rev;                  /* if set, interpolate through h=0 */
} PLControlPt;

typedef struct
{
    PLINT cmd;
    PLINT result;
} PLBufferingCB;

typedef struct
{
    PLFLT exp_label_disp;
    PLFLT exp_label_pos;
    PLFLT exp_label_just;
} PLLabelDefaults;

typedef struct
{
    PLINT   attributeType;
    PLINT   intValue;
    PLINT   *intValues;
    PLFLT   fltValue;
    PLFLT   *fltValues;
    PLColor colorValue;
    PLColor *colorValues;
    PLINT   nValues;
} PLAttribute;

typedef struct
{
    PLFLT ( *get )( PLPointer p, PLINT ix, PLINT iy );
    PLFLT ( *set )( PLPointer p, PLINT ix, PLINT iy, PLFLT z );
    PLFLT ( *add )( PLPointer p, PLINT ix, PLINT iy, PLFLT z );
    PLFLT ( *sub )( PLPointer p, PLINT ix, PLINT iy, PLFLT z );
    PLFLT ( *mul )( PLPointer p, PLINT ix, PLINT iy, PLFLT z );
    PLFLT ( *div )( PLPointer p, PLINT ix, PLINT iy, PLFLT z );
    PLINT ( *is_nan )( PLPointer p, PLINT ix, PLINT iy );
    void ( *minmax )( PLPointer p, PLINT nx, PLINT ny, PLFLT *zmim, PLFLT *zmax );
    /*
     * f2eval is backwards compatible signature for "f2eval" functions that
     * existed before plf2ops "operator function families" were used.
     */
    PLFLT ( *f2eval )( PLINT ix, PLINT iy, PLPointer p );
} plf2ops_t;