From 687fe9abaacab16317f5c1e6f9fd181ce55dbae2 Mon Sep 17 00:00:00 2001
From: Phil Rosenberg <p.d.rosenberg@gmail.com>
Date: Sun, 16 Jul 2017 11:27:01 +0100
Subject: [PATCH 4/4] Add some test code for exception handling

Added PLTRY, PLCATCH, and PLENDTRY blocks to all the api calls in
plvpor and put a PLTHROW call in plerr rather than calling exit. This is
just really to check everything builds as it should and to create
something that can be passed round the other devs to show how things
work. At this point in the development this code is not safe as a call
to plerr could result in memory leaks or undefined behaviour because a
full implimentation hasn't been put in place (PLTRYs in every API call,
use of plmalloc, dealing with longjmp over C++ code).

This commit should  probably not find its way onto the plplot repo.
---
 src/plctrl.c |  17 +-
 src/plvpor.c | 743 ++++++++++++++++++++++++++++++++---------------------------
 2 files changed, 412 insertions(+), 348 deletions(-)

diff --git a/src/plctrl.c b/src/plctrl.c
index e2f8321..572accb 100644
--- a/src/plctrl.c
+++ b/src/plctrl.c
@@ -1952,16 +1952,23 @@ plexit( PLCHAR_VECTOR errormsg )
     if ( exit_handler != NULL )
         status = ( *exit_handler )( errormsg );
 
-    plsc->nopause = 1;
     if ( *errormsg != '\0' )
     {
-        fprintf( stderr, "\n*** PLPLOT ERROR, IMMEDIATE EXIT ***\n" );
+        fprintf( stderr, "\n*** PLPLOT ERROR, ABOUT TO THROW ***\n" );
         fprintf( stderr, "%s\n", errormsg );
     }
-    plend();
+    PLTHROW( plsc );
 
-    fprintf( stderr, "Program aborted\n" );
-    exit( status );
+    //plsc->nopause = 1;
+//    if ( *errormsg != '\0' )
+//    {
+//        fprintf( stderr, "\n*** PLPLOT ERROR, IMMEDIATE EXIT ***\n" );
+//        fprintf( stderr, "%s\n", errormsg );
+//    }
+//    plend();
+//
+//    fprintf( stderr, "Program aborted\n" );
+//    exit( status );
 }
 
 //--------------------------------------------------------------------------
diff --git a/src/plvpor.c b/src/plvpor.c
index fbf45ce..213a127 100644
--- a/src/plvpor.c
+++ b/src/plvpor.c
@@ -89,7 +89,14 @@ void
 c_plenv( PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax,
          PLINT just, PLINT axis )
 {
-    c_plenvi( xmin, xmax, ymin, ymax, just, axis, 1 );
+    PLTRY( plsc )
+    {
+        c_plenvi( xmin, xmax, ymin, ymax, just, axis, 1 );
+    }
+    PLCATCH
+    {
+    }
+    PLENDTRY( plsc )
 }
 
 //--------------------------------------------------------------------------
@@ -103,7 +110,14 @@ void
 c_plenv0( PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax,
           PLINT just, PLINT axis )
 {
-    c_plenvi( xmin, xmax, ymin, ymax, just, axis, 0 );
+    PLTRY( plsc )
+    {
+        c_plenvi( xmin, xmax, ymin, ymax, just, axis, 0 );
+    }
+    PLCATCH
+    {
+    }
+    PLENDTRY( plsc )
 }
 
 
@@ -111,189 +125,197 @@ static void
 c_plenvi( PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax,
           PLINT just, PLINT axis, PLINT old )
 {
-    PLFLT lb, rb, tb, bb, dx, dy;
-    PLFLT xsize, ysize, size, xscale, yscale, scale;
-    PLFLT spxmin, spxmax, spymin, spymax;
-    PLFLT vpxmin, vpxmax, vpymin, vpymax;
-
-    if ( plsc->level < 1 )
-    {
-        plabort( "plenv: Please call plinit first" );
-        return;
-    }
-    if ( xmin == xmax )
-    {
-        plabort( "plenv: Invalid xmin and xmax arguments" );
-        return;
-    }
-    if ( ymin == ymax )
-    {
-        plabort( "plenv: Invalid ymin and ymax arguments" );
-        return;
-    }
-    if ( just < -1 || just > 2 )
-    {
-        plabort( "plenv: Invalid just option" );
-        return;
-    }
-
-    if ( plsc->nsubx * plsc->nsuby == 1 ) // not multiplot mode
-        old = 1;
-
-    if ( old == 1 )
-        pladv( 0 );
-    else
-        plclear();
-
-    if ( just == 0 )
-        plvsta();
-    else if ( just == 1 )
-    {
-        lb = 8.0 * plsc->chrht;
-        rb = 5.0 * plsc->chrht;
-        tb = 5.0 * plsc->chrht;
-        bb = 5.0 * plsc->chrht;
-        dx = ABS( xmax - xmin );
-        dy = ABS( ymax - ymin );
-        plgspa( &spxmin, &spxmax, &spymin, &spymax );
-        xsize  = spxmax - spxmin;
-        ysize  = spymax - spymin;
-        xscale = dx / ( xsize - lb - rb );
-        yscale = dy / ( ysize - tb - bb );
-        scale  = MAX( xscale, yscale );
-        vpxmin = MAX( lb, 0.5 * ( xsize - dx / scale ) );
-        vpxmax = vpxmin + ( dx / scale );
-        vpymin = MAX( bb, 0.5 * ( ysize - dy / scale ) );
-        vpymax = vpymin + ( dy / scale );
-        plsvpa( vpxmin, vpxmax, vpymin, vpymax );
-    }
-    else if ( just == 2 )
+    PLTRY( plsc )
     {
-        lb = 8.0 * plsc->chrht;
-        rb = 5.0 * plsc->chrht;
-        tb = 5.0 * plsc->chrht;
-        bb = 5.0 * plsc->chrht;
-        plgspa( &spxmin, &spxmax, &spymin, &spymax );
-        xsize  = spxmax - spxmin;
-        ysize  = spymax - spymin;
-        size   = MIN( xsize - lb - rb, ysize - tb - bb );
-        dx     = ( xsize - size - lb - rb ) / 2;
-        vpxmin = lb + dx;
-        vpxmax = vpxmin + size;
-        dy     = ( ysize - size - bb - tb ) / 2;
-        vpymin = bb + dy;
-        vpymax = vpymin + size;
-        plsvpa( vpxmin, vpxmax, vpymin, vpymax );
+        PLFLT lb, rb, tb, bb, dx, dy;
+        PLFLT xsize, ysize, size, xscale, yscale, scale;
+        PLFLT spxmin, spxmax, spymin, spymax;
+        PLFLT vpxmin, vpxmax, vpymin, vpymax;
+
+        if ( plsc->level < 1 )
+        {
+            plabort( "plenv: Please call plinit first" );
+            return;
+        }
+        if ( xmin == xmax )
+        {
+            plabort( "plenv: Invalid xmin and xmax arguments" );
+            return;
+        }
+        if ( ymin == ymax )
+        {
+            plabort( "plenv: Invalid ymin and ymax arguments" );
+            return;
+        }
+        if ( just < -1 || just > 2 )
+        {
+            plabort( "plenv: Invalid just option" );
+            return;
+        }
+
+        if ( plsc->nsubx * plsc->nsuby == 1 )       // not multiplot mode
+            old = 1;
+
+        if ( old == 1 )
+            pladv( 0 );
+        else
+            plclear();
+
+        if ( just == 0 )
+            plvsta();
+        else if ( just == 1 )
+        {
+            lb = 8.0 * plsc->chrht;
+            rb = 5.0 * plsc->chrht;
+            tb = 5.0 * plsc->chrht;
+            bb = 5.0 * plsc->chrht;
+            dx = ABS( xmax - xmin );
+            dy = ABS( ymax - ymin );
+            plgspa( &spxmin, &spxmax, &spymin, &spymax );
+            xsize  = spxmax - spxmin;
+            ysize  = spymax - spymin;
+            xscale = dx / ( xsize - lb - rb );
+            yscale = dy / ( ysize - tb - bb );
+            scale  = MAX( xscale, yscale );
+            vpxmin = MAX( lb, 0.5 * ( xsize - dx / scale ) );
+            vpxmax = vpxmin + ( dx / scale );
+            vpymin = MAX( bb, 0.5 * ( ysize - dy / scale ) );
+            vpymax = vpymin + ( dy / scale );
+            plsvpa( vpxmin, vpxmax, vpymin, vpymax );
+        }
+        else if ( just == 2 )
+        {
+            lb = 8.0 * plsc->chrht;
+            rb = 5.0 * plsc->chrht;
+            tb = 5.0 * plsc->chrht;
+            bb = 5.0 * plsc->chrht;
+            plgspa( &spxmin, &spxmax, &spymin, &spymax );
+            xsize  = spxmax - spxmin;
+            ysize  = spymax - spymin;
+            size   = MIN( xsize - lb - rb, ysize - tb - bb );
+            dx     = ( xsize - size - lb - rb ) / 2;
+            vpxmin = lb + dx;
+            vpxmax = vpxmin + size;
+            dy     = ( ysize - size - bb - tb ) / 2;
+            vpymin = bb + dy;
+            vpymax = vpymin + size;
+            plsvpa( vpxmin, vpxmax, vpymin, vpymax );
+        }
+
+        plwind( xmin, xmax, ymin, ymax );
+
+        switch ( axis )
+        {
+        case -2:
+            break;
+        case -1:
+            plbox( "bc", (PLFLT) 0.0, 0, "bc", (PLFLT) 0.0, 0 );
+            break;
+        case 0:
+            plbox( "bcnst", (PLFLT) 0.0, 0, "bcnstv", (PLFLT) 0.0, 0 );
+            break;
+        case 1:
+            plbox( "abcnst", (PLFLT) 0.0, 0, "abcnstv", (PLFLT) 0.0, 0 );
+            break;
+        case 2:
+            plbox( "abcgnst", (PLFLT) 0.0, 0, "abcgnstv", (PLFLT) 0.0, 0 );
+            break;
+        case 3:
+            plbox( "abcgnsth", (PLFLT) 0.0, 0, "abcgnstvh", (PLFLT) 0.0, 0 );
+            break;
+        case 10:
+            plbox( "bclnst", (PLFLT) 0.0, 0, "bcnstv", (PLFLT) 0.0, 0 );
+            break;
+        case 11:
+            plbox( "abclnst", (PLFLT) 0.0, 0, "abcnstv", (PLFLT) 0.0, 0 );
+            break;
+        case 12:
+            plbox( "abcglnst", (PLFLT) 0.0, 0, "abcgnstv", (PLFLT) 0.0, 0 );
+            break;
+        case 13:
+            plbox( "abcglnsth", (PLFLT) 0.0, 0, "abcgnstvh", (PLFLT) 0.0, 0 );
+            break;
+        case 20:
+            plbox( "bcnst", (PLFLT) 0.0, 0, "bclnstv", (PLFLT) 0.0, 0 );
+            break;
+        case 21:
+            plbox( "abcnst", (PLFLT) 0.0, 0, "abclnstv", (PLFLT) 0.0, 0 );
+            break;
+        case 22:
+            plbox( "abcgnst", (PLFLT) 0.0, 0, "abcglnstv", (PLFLT) 0.0, 0 );
+            break;
+        case 23:
+            plbox( "abcgnsth", (PLFLT) 0.0, 0, "abcglnstvh", (PLFLT) 0.0, 0 );
+            break;
+        case 30:
+            plbox( "bclnst", (PLFLT) 0.0, 0, "bclnstv", (PLFLT) 0.0, 0 );
+            break;
+        case 31:
+            plbox( "abclnst", (PLFLT) 0.0, 0, "abclnstv", (PLFLT) 0.0, 0 );
+            break;
+        case 32:
+            plbox( "abcglnst", (PLFLT) 0.0, 0, "abcglnstv", (PLFLT) 0.0, 0 );
+            break;
+        case 33:
+            plbox( "abcglnsth", (PLFLT) 0.0, 0, "abcglnstvh", (PLFLT) 0.0, 0 );
+            break;
+        case 40:
+            plbox( "bcdnst", (PLFLT) 0.0, 0, "bcnstv", (PLFLT) 0.0, 0 );
+            break;
+        case 41:
+            plbox( "abcdnst", (PLFLT) 0.0, 0, "abcnstv", (PLFLT) 0.0, 0 );
+            break;
+        case 42:
+            plbox( "abcgdnst", (PLFLT) 0.0, 0, "abcgnstv", (PLFLT) 0.0, 0 );
+            break;
+        case 43:
+            plbox( "abcgdnsth", (PLFLT) 0.0, 0, "abcgnstvh", (PLFLT) 0.0, 0 );
+            break;
+        case 50:
+            plbox( "bcnst", (PLFLT) 0.0, 0, "bcdnstv", (PLFLT) 0.0, 0 );
+            break;
+        case 51:
+            plbox( "abcnst", (PLFLT) 0.0, 0, "abcdnstv", (PLFLT) 0.0, 0 );
+            break;
+        case 52:
+            plbox( "abcgnst", (PLFLT) 0.0, 0, "abcgdnstv", (PLFLT) 0.0, 0 );
+            break;
+        case 53:
+            plbox( "abcgnsth", (PLFLT) 0.0, 0, "abcgdnstvh", (PLFLT) 0.0, 0 );
+            break;
+        case 60:
+            plbox( "bcdnst", (PLFLT) 0.0, 0, "bcdnstv", (PLFLT) 0.0, 0 );
+            break;
+        case 61:
+            plbox( "abcdnst", (PLFLT) 0.0, 0, "abcdnstv", (PLFLT) 0.0, 0 );
+            break;
+        case 62:
+            plbox( "abcgdnst", (PLFLT) 0.0, 0, "abcgdnstv", (PLFLT) 0.0, 0 );
+            break;
+        case 63:
+            plbox( "abcgdnsth", (PLFLT) 0.0, 0, "abcgdnstvh", (PLFLT) 0.0, 0 );
+            break;
+        case 70:
+            plbox( "bcnost", (PLFLT) 0.0, 0, "bcnostv", (PLFLT) 0.0, 0 );
+            break;
+        case 71:
+            plbox( "abcnost", (PLFLT) 0.0, 0, "abcnostv", (PLFLT) 0.0, 0 );
+            break;
+        case 72:
+            plbox( "abcgnost", (PLFLT) 0.0, 0, "abcgnostv", (PLFLT) 0.0, 0 );
+            break;
+        case 73:
+            plbox( "abcgnosth", (PLFLT) 0.0, 0, "abcgnostvh", (PLFLT) 0.0, 0 );
+            break;
+        default:
+            plwarn( "plenv: Invalid axis argument" );
+        }
     }
-
-    plwind( xmin, xmax, ymin, ymax );
-
-    switch ( axis )
+    PLCATCH
     {
-    case -2:
-        break;
-    case -1:
-        plbox( "bc", (PLFLT) 0.0, 0, "bc", (PLFLT) 0.0, 0 );
-        break;
-    case 0:
-        plbox( "bcnst", (PLFLT) 0.0, 0, "bcnstv", (PLFLT) 0.0, 0 );
-        break;
-    case 1:
-        plbox( "abcnst", (PLFLT) 0.0, 0, "abcnstv", (PLFLT) 0.0, 0 );
-        break;
-    case 2:
-        plbox( "abcgnst", (PLFLT) 0.0, 0, "abcgnstv", (PLFLT) 0.0, 0 );
-        break;
-    case 3:
-        plbox( "abcgnsth", (PLFLT) 0.0, 0, "abcgnstvh", (PLFLT) 0.0, 0 );
-        break;
-    case 10:
-        plbox( "bclnst", (PLFLT) 0.0, 0, "bcnstv", (PLFLT) 0.0, 0 );
-        break;
-    case 11:
-        plbox( "abclnst", (PLFLT) 0.0, 0, "abcnstv", (PLFLT) 0.0, 0 );
-        break;
-    case 12:
-        plbox( "abcglnst", (PLFLT) 0.0, 0, "abcgnstv", (PLFLT) 0.0, 0 );
-        break;
-    case 13:
-        plbox( "abcglnsth", (PLFLT) 0.0, 0, "abcgnstvh", (PLFLT) 0.0, 0 );
-        break;
-    case 20:
-        plbox( "bcnst", (PLFLT) 0.0, 0, "bclnstv", (PLFLT) 0.0, 0 );
-        break;
-    case 21:
-        plbox( "abcnst", (PLFLT) 0.0, 0, "abclnstv", (PLFLT) 0.0, 0 );
-        break;
-    case 22:
-        plbox( "abcgnst", (PLFLT) 0.0, 0, "abcglnstv", (PLFLT) 0.0, 0 );
-        break;
-    case 23:
-        plbox( "abcgnsth", (PLFLT) 0.0, 0, "abcglnstvh", (PLFLT) 0.0, 0 );
-        break;
-    case 30:
-        plbox( "bclnst", (PLFLT) 0.0, 0, "bclnstv", (PLFLT) 0.0, 0 );
-        break;
-    case 31:
-        plbox( "abclnst", (PLFLT) 0.0, 0, "abclnstv", (PLFLT) 0.0, 0 );
-        break;
-    case 32:
-        plbox( "abcglnst", (PLFLT) 0.0, 0, "abcglnstv", (PLFLT) 0.0, 0 );
-        break;
-    case 33:
-        plbox( "abcglnsth", (PLFLT) 0.0, 0, "abcglnstvh", (PLFLT) 0.0, 0 );
-        break;
-    case 40:
-        plbox( "bcdnst", (PLFLT) 0.0, 0, "bcnstv", (PLFLT) 0.0, 0 );
-        break;
-    case 41:
-        plbox( "abcdnst", (PLFLT) 0.0, 0, "abcnstv", (PLFLT) 0.0, 0 );
-        break;
-    case 42:
-        plbox( "abcgdnst", (PLFLT) 0.0, 0, "abcgnstv", (PLFLT) 0.0, 0 );
-        break;
-    case 43:
-        plbox( "abcgdnsth", (PLFLT) 0.0, 0, "abcgnstvh", (PLFLT) 0.0, 0 );
-        break;
-    case 50:
-        plbox( "bcnst", (PLFLT) 0.0, 0, "bcdnstv", (PLFLT) 0.0, 0 );
-        break;
-    case 51:
-        plbox( "abcnst", (PLFLT) 0.0, 0, "abcdnstv", (PLFLT) 0.0, 0 );
-        break;
-    case 52:
-        plbox( "abcgnst", (PLFLT) 0.0, 0, "abcgdnstv", (PLFLT) 0.0, 0 );
-        break;
-    case 53:
-        plbox( "abcgnsth", (PLFLT) 0.0, 0, "abcgdnstvh", (PLFLT) 0.0, 0 );
-        break;
-    case 60:
-        plbox( "bcdnst", (PLFLT) 0.0, 0, "bcdnstv", (PLFLT) 0.0, 0 );
-        break;
-    case 61:
-        plbox( "abcdnst", (PLFLT) 0.0, 0, "abcdnstv", (PLFLT) 0.0, 0 );
-        break;
-    case 62:
-        plbox( "abcgdnst", (PLFLT) 0.0, 0, "abcgdnstv", (PLFLT) 0.0, 0 );
-        break;
-    case 63:
-        plbox( "abcgdnsth", (PLFLT) 0.0, 0, "abcgdnstvh", (PLFLT) 0.0, 0 );
-        break;
-    case 70:
-        plbox( "bcnost", (PLFLT) 0.0, 0, "bcnostv", (PLFLT) 0.0, 0 );
-        break;
-    case 71:
-        plbox( "abcnost", (PLFLT) 0.0, 0, "abcnostv", (PLFLT) 0.0, 0 );
-        break;
-    case 72:
-        plbox( "abcgnost", (PLFLT) 0.0, 0, "abcgnostv", (PLFLT) 0.0, 0 );
-        break;
-    case 73:
-        plbox( "abcgnosth", (PLFLT) 0.0, 0, "abcgnostvh", (PLFLT) 0.0, 0 );
-        break;
-    default:
-        plwarn( "plenv: Invalid axis argument" );
+        //report the error somehow
     }
+    PLENDTRY( plsc )
 }
 
 //--------------------------------------------------------------------------
@@ -306,30 +328,37 @@ c_plenvi( PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax,
 void
 c_plvsta( void )
 {
-    PLFLT xmin, xmax, ymin, ymax;
-    PLFLT lb, rb, tb, bb;
-
-    if ( plsc->level < 1 )
+    PLTRY( plsc )
     {
-        plabort( "plvsta: Please call plinit first" );
-        return;
-    }
+        PLFLT xmin, xmax, ymin, ymax;
+        PLFLT lb, rb, tb, bb;
 
-//  Find out position of subpage boundaries in millimetres, reduce by
-//  the desired border, and convert back into normalized subpage
-//  coordinates
+        if ( plsc->level < 1 )
+        {
+            plabort( "plvsta: Please call plinit first" );
+            return;
+        }
 
-    lb = 8.0 * plsc->chrht;
-    rb = 5.0 * plsc->chrht;
-    tb = 5.0 * plsc->chrht;
-    bb = 5.0 * plsc->chrht;
+        //  Find out position of subpage boundaries in millimetres, reduce by
+        //  the desired border, and convert back into normalized subpage
+        //  coordinates
 
-    xmin = plP_dcscx( plP_mmdcx( (PLFLT) ( plP_dcmmx( plsc->spdxmi ) + lb ) ) );
-    xmax = plP_dcscx( plP_mmdcx( (PLFLT) ( plP_dcmmx( plsc->spdxma ) - rb ) ) );
-    ymin = plP_dcscy( plP_mmdcy( (PLFLT) ( plP_dcmmy( plsc->spdymi ) + tb ) ) );
-    ymax = plP_dcscy( plP_mmdcy( (PLFLT) ( plP_dcmmy( plsc->spdyma ) - bb ) ) );
+        lb = 8.0 * plsc->chrht;
+        rb = 5.0 * plsc->chrht;
+        tb = 5.0 * plsc->chrht;
+        bb = 5.0 * plsc->chrht;
+
+        xmin = plP_dcscx( plP_mmdcx( (PLFLT) ( plP_dcmmx( plsc->spdxmi ) + lb ) ) );
+        xmax = plP_dcscx( plP_mmdcx( (PLFLT) ( plP_dcmmx( plsc->spdxma ) - rb ) ) );
+        ymin = plP_dcscy( plP_mmdcy( (PLFLT) ( plP_dcmmy( plsc->spdymi ) + tb ) ) );
+        ymax = plP_dcscy( plP_mmdcy( (PLFLT) ( plP_dcmmy( plsc->spdyma ) - bb ) ) );
 
-    plvpor( xmin, xmax, ymin, ymax );
+        plvpor( xmin, xmax, ymin, ymax );
+    }
+    PLCATCH
+    {
+    }
+    PLENDTRY( plsc )
 }
 
 //--------------------------------------------------------------------------
@@ -341,38 +370,45 @@ c_plvsta( void )
 void
 c_plvpor( PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax )
 {
-    if ( plsc->level < 1 )
-    {
-        plabort( "plvpor: Please call plinit first" );
-        return;
-    }
-    if ( ( xmin >= xmax ) || ( ymin >= ymax ) )
+    PLTRY( plsc )
     {
-        plabort( "plvpor: Invalid limits" );
-        return;
+        if ( plsc->level < 1 )
+        {
+            plabort( "plvpor: Please call plinit first" );
+            return;
+        }
+        if ( ( xmin >= xmax ) || ( ymin >= ymax ) )
+        {
+            plabort( "plvpor: Invalid limits" );
+            return;
+        }
+        if ( ( plsc->cursub <= 0 ) || ( plsc->cursub > ( plsc->nsubx * plsc->nsuby ) ) )
+        {
+            plabort( "plvpor: Please call pladv or plenv to go to a subpage" );
+            return;
+        }
+
+        plsc->vpdxmi = plsc->spdxmi + ( plsc->spdxma - plsc->spdxmi ) * xmin;
+        plsc->vpdxma = plsc->spdxmi + ( plsc->spdxma - plsc->spdxmi ) * xmax;
+        plsc->vpdymi = plsc->spdymi + ( plsc->spdyma - plsc->spdymi ) * ymin;
+        plsc->vpdyma = plsc->spdymi + ( plsc->spdyma - plsc->spdymi ) * ymax;
+
+        plsc->vppxmi = plP_dcpcx( plsc->vpdxmi );
+        plsc->vppxma = plP_dcpcx( plsc->vpdxma );
+        plsc->vppymi = plP_dcpcy( plsc->vpdymi );
+        plsc->vppyma = plP_dcpcy( plsc->vpdyma );
+
+        plsc->clpxmi = MAX( plsc->vppxmi, plsc->phyxmi );
+        plsc->clpxma = MIN( plsc->vppxma, plsc->phyxma );
+        plsc->clpymi = MAX( plsc->vppymi, plsc->phyymi );
+        plsc->clpyma = MIN( plsc->vppyma, plsc->phyyma );
+
+        plsc->level = 2;
     }
-    if ( ( plsc->cursub <= 0 ) || ( plsc->cursub > ( plsc->nsubx * plsc->nsuby ) ) )
+    PLCATCH
     {
-        plabort( "plvpor: Please call pladv or plenv to go to a subpage" );
-        return;
     }
-
-    plsc->vpdxmi = plsc->spdxmi + ( plsc->spdxma - plsc->spdxmi ) * xmin;
-    plsc->vpdxma = plsc->spdxmi + ( plsc->spdxma - plsc->spdxmi ) * xmax;
-    plsc->vpdymi = plsc->spdymi + ( plsc->spdyma - plsc->spdymi ) * ymin;
-    plsc->vpdyma = plsc->spdymi + ( plsc->spdyma - plsc->spdymi ) * ymax;
-
-    plsc->vppxmi = plP_dcpcx( plsc->vpdxmi );
-    plsc->vppxma = plP_dcpcx( plsc->vpdxma );
-    plsc->vppymi = plP_dcpcy( plsc->vpdymi );
-    plsc->vppyma = plP_dcpcy( plsc->vpdyma );
-
-    plsc->clpxmi = MAX( plsc->vppxmi, plsc->phyxmi );
-    plsc->clpxma = MIN( plsc->vppxma, plsc->phyxma );
-    plsc->clpymi = MAX( plsc->vppymi, plsc->phyymi );
-    plsc->clpyma = MIN( plsc->vppyma, plsc->phyyma );
-
-    plsc->level = 2;
+    PLENDTRY( plsc )
 }
 
 //--------------------------------------------------------------------------
@@ -385,64 +421,71 @@ c_plvpor( PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax )
 void
 c_plvpas( PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax, PLFLT aspect )
 {
-    PLFLT spxmin, spxmax, spymin, spymax;
-    PLFLT vpxmin, vpxmax, vpymin, vpymax;
-    PLFLT xsize, ysize, nxsize, nysize;
-    PLFLT xoffset, yoffset;
-
-    if ( plsc->level < 1 )
+    PLTRY( plsc )
     {
-        plabort( "plvpas: Please call plinit first" );
-        return;
-    }
-    if ( ( xmin >= xmax ) || ( ymin >= ymax ) )
-    {
-        plabort( "plvpas: Invalid limits" );
-        return;
-    }
+        PLFLT spxmin, spxmax, spymin, spymax;
+        PLFLT vpxmin, vpxmax, vpymin, vpymax;
+        PLFLT xsize, ysize, nxsize, nysize;
+        PLFLT xoffset, yoffset;
+
+        if ( plsc->level < 1 )
+        {
+            plabort( "plvpas: Please call plinit first" );
+            return;
+        }
+        if ( ( xmin >= xmax ) || ( ymin >= ymax ) )
+        {
+            plabort( "plvpas: Invalid limits" );
+            return;
+        }
+
+        if ( aspect <= 0.0 )
+        {
+            c_plvpor( xmin, xmax, ymin, ymax );
+            return;
+        }
 
-    if ( aspect <= 0.0 )
-    {
-        c_plvpor( xmin, xmax, ymin, ymax );
-        return;
-    }
+        plgspa( &spxmin, &spxmax, &spymin, &spymax );
 
-    plgspa( &spxmin, &spxmax, &spymin, &spymax );
+        xsize = spxmax - spxmin;
+        ysize = spymax - spymin;
 
-    xsize = spxmax - spxmin;
-    ysize = spymax - spymin;
+        xoffset = xsize * xmin;
+        yoffset = ysize * ymin;
 
-    xoffset = xsize * xmin;
-    yoffset = ysize * ymin;
+        spxmax = spxmin + xsize * xmax;
+        spxmin = spxmin + xsize * xmin;
+        spymax = spymin + ysize * ymax;
+        spymin = spymin + ysize * ymin;
 
-    spxmax = spxmin + xsize * xmax;
-    spxmin = spxmin + xsize * xmin;
-    spymax = spymin + ysize * ymax;
-    spymin = spymin + ysize * ymin;
+        // Adjust size for the requested edging
+        xsize = spxmax - spxmin;
+        ysize = spymax - spymin;
 
-    // Adjust size for the requested edging
-    xsize = spxmax - spxmin;
-    ysize = spymax - spymin;
+        if ( aspect * xsize > ysize )
+        {
+            nxsize = ysize / aspect;
+            nysize = ysize;
+        }
+        else
+        {
+            nxsize = xsize;
+            nysize = xsize * aspect;
+        }
 
-    if ( aspect * xsize > ysize )
-    {
-        nxsize = ysize / aspect;
-        nysize = ysize;
+        // center plot within page
+
+        vpxmin = 0.5 * ( xsize - nxsize ) + xoffset;
+        vpxmax = vpxmin + nxsize;
+        vpymin = 0.5 * ( ysize - nysize ) + yoffset;
+        vpymax = vpymin + nysize;
+
+        plsvpa( vpxmin, vpxmax, vpymin, vpymax );
     }
-    else
+    PLCATCH
     {
-        nxsize = xsize;
-        nysize = xsize * aspect;
     }
-
-// center plot within page
-
-    vpxmin = 0.5 * ( xsize - nxsize ) + xoffset;
-    vpxmax = vpxmin + nxsize;
-    vpymin = 0.5 * ( ysize - nysize ) + yoffset;
-    vpymax = vpymin + nysize;
-
-    plsvpa( vpxmin, vpxmax, vpymin, vpymax );
+    PLENDTRY( plsc )
 }
 
 //--------------------------------------------------------------------------
@@ -455,46 +498,53 @@ c_plvpas( PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax, PLFLT aspect )
 void
 c_plvasp( PLFLT aspect )
 {
-    PLFLT spxmin, spxmax, spymin, spymax;
-    PLFLT vpxmin, vpxmax, vpymin, vpymax;
-    PLFLT xsize, ysize, nxsize, nysize;
-    PLFLT lb, rb, tb, bb;
-
-    if ( plsc->level < 1 )
+    PLTRY( plsc )
     {
-        plabort( "plvasp: Please call plinit first" );
-        return;
-    }
+        PLFLT spxmin, spxmax, spymin, spymax;
+        PLFLT vpxmin, vpxmax, vpymin, vpymax;
+        PLFLT xsize, ysize, nxsize, nysize;
+        PLFLT lb, rb, tb, bb;
 
-    lb = 8.0 * plsc->chrht;
-    rb = 5.0 * plsc->chrht;
-    tb = 5.0 * plsc->chrht;
-    bb = 5.0 * plsc->chrht;
-
-    plgspa( &spxmin, &spxmax, &spymin, &spymax );
-    xsize  = spxmax - spxmin;
-    ysize  = spymax - spymin;
-    xsize -= lb + rb;           // adjust for labels
-    ysize -= bb + tb;
-    if ( aspect * xsize > ysize )
-    {
-        nxsize = ysize / aspect;
-        nysize = ysize;
-    }
-    else
-    {
-        nxsize = xsize;
-        nysize = xsize * aspect;
-    }
+        if ( plsc->level < 1 )
+        {
+            plabort( "plvasp: Please call plinit first" );
+            return;
+        }
 
-// center plot within page
+        lb = 8.0 * plsc->chrht;
+        rb = 5.0 * plsc->chrht;
+        tb = 5.0 * plsc->chrht;
+        bb = 5.0 * plsc->chrht;
 
-    vpxmin = .5 * ( xsize - nxsize ) + lb;
-    vpxmax = vpxmin + nxsize;
-    vpymin = .5 * ( ysize - nysize ) + bb;
-    vpymax = vpymin + nysize;
+        plgspa( &spxmin, &spxmax, &spymin, &spymax );
+        xsize  = spxmax - spxmin;
+        ysize  = spymax - spymin;
+        xsize -= lb + rb;                   // adjust for labels
+        ysize -= bb + tb;
+        if ( aspect * xsize > ysize )
+        {
+            nxsize = ysize / aspect;
+            nysize = ysize;
+        }
+        else
+        {
+            nxsize = xsize;
+            nysize = xsize * aspect;
+        }
+
+        // center plot within page
+
+        vpxmin = .5 * ( xsize - nxsize ) + lb;
+        vpxmax = vpxmin + nxsize;
+        vpymin = .5 * ( ysize - nysize ) + bb;
+        vpymax = vpymin + nysize;
 
-    plsvpa( vpxmin, vpxmax, vpymin, vpymax );
+        plsvpa( vpxmin, vpxmax, vpymin, vpymax );
+    }
+    PLCATCH
+    {
+    }
+    PLENDTRY( plsc )
 }
 
 //--------------------------------------------------------------------------
@@ -507,41 +557,48 @@ c_plvasp( PLFLT aspect )
 void
 c_plsvpa( PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax )
 {
-    PLFLT sxmin, symin;
-
-    if ( plsc->level < 1 )
-    {
-        plabort( "plsvpa: Please call plinit first" );
-        return;
-    }
-    if ( ( xmin >= xmax ) || ( ymin >= ymax ) )
+    PLTRY( plsc )
     {
-        plabort( "plsvpa: Invalid limits" );
-        return;
+        PLFLT sxmin, symin;
+
+        if ( plsc->level < 1 )
+        {
+            plabort( "plsvpa: Please call plinit first" );
+            return;
+        }
+        if ( ( xmin >= xmax ) || ( ymin >= ymax ) )
+        {
+            plabort( "plsvpa: Invalid limits" );
+            return;
+        }
+        if ( ( plsc->cursub <= 0 ) || ( plsc->cursub > ( plsc->nsubx * plsc->nsuby ) ) )
+        {
+            plabort( "plsvpa: Please call pladv or plenv to go to a subpage" );
+            return;
+        }
+
+        sxmin = plP_dcmmx( plsc->spdxmi );
+        symin = plP_dcmmy( plsc->spdymi );
+
+        plsc->vpdxmi = plP_mmdcx( (PLFLT) ( sxmin + xmin ) );
+        plsc->vpdxma = plP_mmdcx( (PLFLT) ( sxmin + xmax ) );
+        plsc->vpdymi = plP_mmdcy( (PLFLT) ( symin + ymin ) );
+        plsc->vpdyma = plP_mmdcy( (PLFLT) ( symin + ymax ) );
+
+        plsc->vppxmi = plP_dcpcx( plsc->vpdxmi );
+        plsc->vppxma = plP_dcpcx( plsc->vpdxma );
+        plsc->vppymi = plP_dcpcy( plsc->vpdymi );
+        plsc->vppyma = plP_dcpcy( plsc->vpdyma );
+
+        plsc->clpxmi = plP_dcpcx( plsc->vpdxmi );
+        plsc->clpxma = plP_dcpcx( plsc->vpdxma );
+        plsc->clpymi = plP_dcpcy( plsc->vpdymi );
+        plsc->clpyma = plP_dcpcy( plsc->vpdyma );
+
+        plsc->level = 2;
     }
-    if ( ( plsc->cursub <= 0 ) || ( plsc->cursub > ( plsc->nsubx * plsc->nsuby ) ) )
+    PLCATCH
     {
-        plabort( "plsvpa: Please call pladv or plenv to go to a subpage" );
-        return;
     }
-
-    sxmin = plP_dcmmx( plsc->spdxmi );
-    symin = plP_dcmmy( plsc->spdymi );
-
-    plsc->vpdxmi = plP_mmdcx( (PLFLT) ( sxmin + xmin ) );
-    plsc->vpdxma = plP_mmdcx( (PLFLT) ( sxmin + xmax ) );
-    plsc->vpdymi = plP_mmdcy( (PLFLT) ( symin + ymin ) );
-    plsc->vpdyma = plP_mmdcy( (PLFLT) ( symin + ymax ) );
-
-    plsc->vppxmi = plP_dcpcx( plsc->vpdxmi );
-    plsc->vppxma = plP_dcpcx( plsc->vpdxma );
-    plsc->vppymi = plP_dcpcy( plsc->vpdymi );
-    plsc->vppyma = plP_dcpcy( plsc->vpdyma );
-
-    plsc->clpxmi = plP_dcpcx( plsc->vpdxmi );
-    plsc->clpxma = plP_dcpcx( plsc->vpdxma );
-    plsc->clpymi = plP_dcpcy( plsc->vpdymi );
-    plsc->clpyma = plP_dcpcy( plsc->vpdyma );
-
-    plsc->level = 2;
+    PLENDTRY( plsc )
 }
-- 
2.8.3

