This is an automated email from the git hooks/post-receive script.

sebastic pushed a commit to branch master
in repository gmt.

commit 1d7c24c24e7397759d44f2e0c41d8260c2ebeafd
Author: Bas Couwenberg <sebas...@xs4all.nl>
Date:   Thu Mar 23 22:46:29 2017 +0100

    Imported Upstream version 5.3.3+dfsg
---
 cmake/ConfigDefault.cmake   |   6 +-
 doc/rst/source/GMT_Docs.rst |   2 +-
 doc/rst/source/grdimage.rst |   4 +-
 doc/rst/source/pslegend.rst |   1 +
 doc/rst/source/pswiggle.rst |   2 +-
 doc/rst/source/xyz2grd.rst  |  13 +++-
 doc/scripts/GMT_legend.ps   |  79 +++++++++++-----------
 src/gmt.c                   |   8 ++-
 src/gmt_agc_io.c            |  14 ++--
 src/gmt_api.c               |   4 +-
 src/gmt_customio.c          |  17 ++---
 src/gmt_init.c              |   4 +-
 src/gmt_internals.h         |   4 +-
 src/gmt_io.c                |  36 ++++++----
 src/gmt_memory.c            |   4 +-
 src/gmt_nc.c                | 160 ++++++++++++++++++++++++--------------------
 src/gmt_plot.c              |  39 ++++++++---
 src/gmt_plot.h              |   3 +-
 src/gmt_prototypes.h        |   6 +-
 src/gmt_support.c           |  23 ++++---
 src/gmt_vector.c            |  15 ++---
 src/gmtlogo.c               |   6 +-
 src/grdimage.c              |   6 +-
 src/grdmask.c               |   4 +-
 src/grdview.c               |   4 +-
 src/postscriptlight.c       |  51 +++++++++++++-
 src/potential/talwani3d.c   |  80 +++++++++++-----------
 src/psclip.c                |   4 +-
 src/pscoast.c               |   5 +-
 src/psimage.c               |   6 +-
 src/pslegend.c              |  15 +++--
 src/psrose.c                |   4 +-
 src/psscale.c               |   4 +-
 src/pssolar.c               |   3 +-
 src/psxy.c                  |  18 +++--
 src/psxyz.c                 |   6 +-
 src/sphdistance.c           |   4 +-
 src/spotter/backtracker.c   |  12 +++-
 38 files changed, 406 insertions(+), 270 deletions(-)

diff --git a/cmake/ConfigDefault.cmake b/cmake/ConfigDefault.cmake
index d438732..32b9c84 100644
--- a/cmake/ConfigDefault.cmake
+++ b/cmake/ConfigDefault.cmake
@@ -1,5 +1,5 @@
 #
-# $Id: ConfigDefault.cmake 17595 2017-02-24 00:53:29Z jluis $
+# $Id: ConfigDefault.cmake 17744 2017-03-22 18:50:05Z jluis $
 #
 # Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. Luis 
and F. Wobbe
 # See LICENSE.TXT file for copying and redistribution conditions.
@@ -42,13 +42,13 @@ set (GMT_VERSION_YEAR "2017")
 # The GMT package version.
 set (GMT_PACKAGE_VERSION_MAJOR 5)
 set (GMT_PACKAGE_VERSION_MINOR 3)
-set (GMT_PACKAGE_VERSION_PATCH 2)
+set (GMT_PACKAGE_VERSION_PATCH 3)
 
 # The subversion revision of the GMT source code.
 # This is manually set when making GMT *public* releases.
 # However, when making internal releases or just an ordinary developer build, 
leave it
 # empty; if it is empty, the revision number is automatically populated for 
you on build.
-set (GMT_SOURCE_CODE_CONTROL_VERSION_STRING "17593")
+set (GMT_SOURCE_CODE_CONTROL_VERSION_STRING "17743")
 
 # The GMT package version.
 set (GMT_PACKAGE_VERSION 
"${GMT_PACKAGE_VERSION_MAJOR}.${GMT_PACKAGE_VERSION_MINOR}.${GMT_PACKAGE_VERSION_PATCH}")
diff --git a/doc/rst/source/GMT_Docs.rst b/doc/rst/source/GMT_Docs.rst
index 2fc0bfe..a14a7f2 100644
--- a/doc/rst/source/GMT_Docs.rst
+++ b/doc/rst/source/GMT_Docs.rst
@@ -5467,7 +5467,7 @@ that is stored in the HDF "format". We need to run the 
GDAL program
 **gdalinfo** on the file because we first
 must extract the necessary metadata from the file:
 
-   ::
+.. code-block:: none
 
     gdalinfo A20030012003365.L3m_YR_NSST_9
     Driver: HDF4/Hierarchical Data Format Release 4
diff --git a/doc/rst/source/grdimage.rst b/doc/rst/source/grdimage.rst
index e66a769..8ac21b1 100644
--- a/doc/rst/source/grdimage.rst
+++ b/doc/rst/source/grdimage.rst
@@ -14,7 +14,9 @@ Synopsis
 .. include:: common_SYN_OPTs.rst_
 
 **grdimage** *grd_z* \| *grd_r grd_g grd_b*
-[ |-A|\ *out_img*\ [**=**\ *driver*] ] [ |-C|\ *cpt* ]
+[ |-A|\ *out_img*\ [**=**\ *driver*] ]
+[ |SYN_OPT-B| ]
+[ |-C|\ *cpt* ]
 [ |-D|\ [**r**\ ] ] [ |-E|\ [\ **i**\ \|\ *dpi*] ] |-J|\ *parameters*
 [ |-G|\ [**f**\ \|\ **b**]\ *color* ]
 [ |-I|\ [*intensfile*\ \|\ *intensity*] ]
diff --git a/doc/rst/source/pslegend.rst b/doc/rst/source/pslegend.rst
index 13c1fd9..0da1fcb 100644
--- a/doc/rst/source/pslegend.rst
+++ b/doc/rst/source/pslegend.rst
@@ -15,6 +15,7 @@ Synopsis
 
 **pslegend** [ *specfile* ]
 |-D|\ *refpoint* ]
+[ |SYN_OPT-B| ]
 [ |-C|\ *dx*/*dy* ]
 [ |-F|\ *box* ]
 [ |-J|\ *parameters* ]
diff --git a/doc/rst/source/pswiggle.rst b/doc/rst/source/pswiggle.rst
index d37e16a..0d34719 100644
--- a/doc/rst/source/pswiggle.rst
+++ b/doc/rst/source/pswiggle.rst
@@ -14,7 +14,7 @@ Synopsis
 .. include:: common_SYN_OPTs.rst_
 
 **pswiggle** [ *table* ] |-J|\ *parameters* |SYN_OPT-Rz| |-Z|\ *scale*\ 
[*units]
-[ |-A|\ [*azimuth*] ]
+[ |-A|\ [\ *azimuth*\ ] ]
 [ |SYN_OPT-B| ]
 [ |-C|\ *center* ]
 [ |-G|\ [**+**\ \|\ **-**\ \|\ **=**]\ *fill* ]
diff --git a/doc/rst/source/xyz2grd.rst b/doc/rst/source/xyz2grd.rst
index 3e42c47..c593449 100644
--- a/doc/rst/source/xyz2grd.rst
+++ b/doc/rst/source/xyz2grd.rst
@@ -40,7 +40,9 @@ with data. Such unconstrained nodes are set to a value 
specified by the
 user [Default is NaN]. Nodes with more than one value will be set to the
 mean value. As an option (using **-Z**), a 1-column z-table may be read
 assuming all nodes are present (z-tables can be in organized in a number
-of formats, see **-Z** below.) 
+of formats, see **-Z** below.)  Note: **xyz2grd** does not grid the data,
+it simply reformats existing data to a grid structure.  For gridding,
+see **surface**, **greenspline**, **nearneighbor**, or **triangulate**.
 
 Required Arguments
 ------------------
@@ -220,4 +222,11 @@ See Also
 :doc:`gmt`,
 :doc:`grd2xyz`,
 :doc:`grdedit`,
-:doc:`grdconvert`
+:doc:`grdconvert`,
+:doc:`greenspline`,
+:doc:`nearneighbor`,
+:doc:`surface`,
+:doc:`triangulate`
+
+
+
diff --git a/doc/scripts/GMT_legend.ps b/doc/scripts/GMT_legend.ps
index 2c84467..920e56d 100644
--- a/doc/scripts/GMT_legend.ps
+++ b/doc/scripts/GMT_legend.ps
@@ -1,11 +1,11 @@
 %!PS-Adobe-3.0
 %%BoundingBox: 0 0 612 792
-%%HiResBoundingBox: 0 0 612 792
-%%Title: GMT v5.2.0_r14414 [64-bit] Document from pslegend
+%%HiResBoundingBox: 0 0 612 792             
+%%Title: GMT v5.3.3_r17717 [64-bit] Document from pslegend
 %%Creator: GMT5
 %%For: pwessel
 %%DocumentNeededResources: font Helvetica
-%%CreationDate: Sat Jun 27 22:36:24 2015
+%%CreationDate: Sat Mar 18 14:37:45 2017
 %%LanguageLevel: 2
 %%DocumentData: Clean7Bit
 %%Orientation: Portrait
@@ -272,7 +272,6 @@ end
     PSL_heights psl_k PSL_height put
   } for
 } def
-%%%%%%%%%%%%%%%%%%% CURVED BASELINE TEXT PLACEMENT FUNCTIONS
 /PSL_curved_path_labels
 { /psl_bits exch def
   /PSL_placetext psl_bits 2 and 2 eq def
@@ -523,7 +522,6 @@ end
 {PSL_xp 0 get PSL_yp 0 get M
   1 1 j { /ii exch def PSL_xp ii get PSL_yp ii get L} for
 } def
-%%%%%%%%%%%%%%%%%%% DRAW BASELINE TEXT SEGMENT LINES
 /PSL_draw_path_lines
 {
   /PSL_n_paths1 PSL_n_paths 1 sub def
@@ -549,7 +547,6 @@ end
   } for
   U
 } def
-%%%%%%%%%%%%%%%%%%% STRAIGHT BASELINE TEXT PLACEMENT FUNCTIONS
 /PSL_straight_path_labels
 {
   /psl_bits exch def
@@ -666,12 +663,35 @@ O0
 1200 1200 TM
 
 % PostScript produced by:
-%%GMT: pslegend -Dx0/0/5.6i/BL -C0.05i -L1.2 -F+p+gsnow1 -B0 table.txt -P 
--FONT_ANNOT_PRIMARY=12p --FONT_LABEL=12p
-%%PROJ: xy 0.00000000 5.60000000 0.00000000 3.60000000 0.000 5.600 0.000 3.600 
+xy +a=6378137.000 +b=6356752.314245 +ellps=WGS84
+%@GMT: pslegend -Dx0/0 -C0.05i -L1.2 -F+p+gsnow1 -B0 table.txt -P 
--FONT_ANNOT_PRIMARY=12p --FONT_LABEL=12p
+%@PROJ: xy 0.00000000 5.60000000 0.00000000 3.60000000 0.000 5.600 0.000 3.600 
+xy
 %%BeginObject PSL_Layer_1
 0 setlinecap
 0 setlinejoin
 3.32551 setmiterlimit
+25 W
+2 setlinecap
+N 0 4320 M 0 -4320 D S
+/PSL_A0_y 0 def
+/PSL_A1_y 0 def
+/PSL_LH 0 def /PSL_L_y PSL_A0_y PSL_A1_y mx def
+6720 0 T
+N 0 4320 M 0 -4320 D S
+/PSL_A0_y 0 def
+/PSL_A1_y 0 def
+/PSL_LH 0 def /PSL_L_y PSL_A0_y PSL_A1_y mx def
+-6720 0 T
+N 0 0 M 6720 0 D S
+/PSL_A0_y 0 def
+/PSL_A1_y 0 def
+/PSL_LH 0 def /PSL_L_y PSL_A0_y PSL_A1_y mx def
+0 4320 T
+N 0 0 M 6720 0 D S
+/PSL_A0_y 0 def
+/PSL_A1_y 0 def
+/PSL_LH 0 def /PSL_L_y PSL_A0_y PSL_A1_y mx def
+0 -4320 T
+0 setlinecap
 {1 0.98 0.98 C} FS
 4320 6720 3360 2160 Sr
 17 W
@@ -733,8 +753,8 @@ O0
 0 0 TM
 
 % PostScript produced by:
-%%GMT: psxy -R0/5.6/0/3.6 -Jx1i -O -K -N -S @GMTAPI@-000002
-%%PROJ: xy 0.00000000 5.60000000 0.00000000 3.60000000 0.000 5.600 0.000 3.600 
+xy +a=6378137.000 +b=6356752.314245 +ellps=WGS84
+%@GMT: psxy -R0/5.6/0/3.6 -Jx1i -O -K -N -S @GMTAPI@-000002
+%@PROJ: xy 0.00000000 5.60000000 0.00000000 3.60000000 0.000 5.600 0.000 3.600 
+xy
 %%BeginObject PSL_Layer_2
 0 setlinecap
 0 setlinejoin
@@ -768,17 +788,17 @@ O0
 0 0 TM
 
 % PostScript produced by:
-%%GMT: pstext -R0/5.6/0/3.6 -Jx1i -O -K -N -F+f+j @GMTAPI@-000001
-%%PROJ: xy 0.00000000 5.60000000 0.00000000 3.60000000 0.000 5.600 0.000 3.600 
+xy +a=6378137.000 +b=6356752.314245 +ellps=WGS84
+%@GMT: pstext -R0/5.6/0/3.6 -Jx1i -O -K -N -F+f+j @GMTAPI@-000001
+%@PROJ: xy 0.00000000 5.60000000 0.00000000 3.60000000 0.000 5.600 0.000 3.600 
+xy
 %%BeginObject PSL_Layer_3
 0 setlinecap
 0 setlinejoin
 3.32551 setmiterlimit
-3360 3885 M PSL_font_encode 4 get 0 eq {ISOLatin1+_Encoding /Times-Roman 
/Times-Roman PSL_reencode PSL_font_encode 4 1 put} if
-400 F4
+PSL_font_encode 4 get 0 eq {ISOLatin1+_Encoding /Times-Roman /Times-Roman 
PSL_reencode PSL_font_encode 4 1 put} if
+3360 3885 M 400 F4
 (Eight Largest Cities in North America) bc Z
-1142 3470 M PSL_font_encode 0 get 0 eq {ISOLatin1+_Encoding /Helvetica 
/Helvetica PSL_reencode PSL_font_encode 0 1 put} if
-200 F0
+PSL_font_encode 0 get 0 eq {ISOLatin1+_Encoding /Helvetica /Helvetica 
PSL_reencode PSL_font_encode 0 1 put} if
+1142 3470 M 200 F0
 (City Name) bc Z
 2419 3470 M (Country) bc Z
 3629 3470 M (Population) bc Z
@@ -842,8 +862,8 @@ O0
 0 0 TM
 
 % PostScript produced by:
-%%GMT: pstext -R0/5.6/0/3.6 -Jx1i -O -K -N -M -F+f+a+j @GMTAPI@-000003
-%%PROJ: xy 0.00000000 5.60000000 0.00000000 3.60000000 0.000 5.600 0.000 3.600 
+xy +a=6378137.000 +b=6356752.314245 +ellps=WGS84
+%@GMT: pstext -R0/5.6/0/3.6 -Jx1i -O -K -N -M -F+f+a+j @GMTAPI@-000003
+%@PROJ: xy 0.00000000 5.60000000 0.00000000 3.60000000 0.000 5.600 0.000 3.600 
+xy
 %%BeginObject PSL_Layer_4
 0 setlinecap
 0 setlinejoin
@@ -1144,29 +1164,6 @@ PSL_x0 PSL_y0 T
 0 0 M
 1 PSL_textjustifier U
 %%EndObject
-25 W
-2 setlinecap
-N 0 4320 M 0 -4320 D S
-/PSL_A0_y 0 def
-/PSL_A1_y 0 def
-/PSL_LH 0 def /PSL_L_y PSL_A0_y PSL_A1_y mx def
-6720 0 T
-N 0 4320 M 0 -4320 D S
-/PSL_A0_y 0 def
-/PSL_A1_y 0 def
-/PSL_LH 0 def /PSL_L_y PSL_A0_y PSL_A1_y mx def
--6720 0 T
-N 0 0 M 6720 0 D S
-/PSL_A0_y 0 def
-/PSL_A1_y 0 def
-/PSL_LH 0 def /PSL_L_y PSL_A0_y PSL_A1_y mx def
-0 4320 T
-N 0 0 M 6720 0 D S
-/PSL_A0_y 0 def
-/PSL_A1_y 0 def
-/PSL_LH 0 def /PSL_L_y PSL_A0_y PSL_A1_y mx def
-0 -4320 T
-0 setlinecap
 %%EndObject
 %%PageTrailer
 U
diff --git a/src/gmt.c b/src/gmt.c
index ae88c6c..808df6c 100644
--- a/src/gmt.c
+++ b/src/gmt.c
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------
- *     $Id: gmt.c 17449 2017-01-16 21:27:04Z pwessel $
+ *     $Id: gmt.c 17644 2017-03-12 02:09:29Z pwessel $
  *
  *     Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. 
Luis and F. Wobbe
  *     See LICENSE.TXT file for copying and redistribution conditions.
@@ -30,6 +30,12 @@
 #include "gmt_dev.h"
 
 #if !(defined(WIN32) || defined(NO_SIGHANDLER))
+#if    __APPLE__
+       /* Apple Xcode expects _Nullable to be defined but it is not if gcc */
+#ifndef _Nullable
+#      define _Nullable
+#      endif
+#      endif
 #      include <signal.h>
 #      include "common_sighandler.h"
 #endif
diff --git a/src/gmt_agc_io.c b/src/gmt_agc_io.c
index b0e01e2..4c470ee 100644
--- a/src/gmt_agc_io.c
+++ b/src/gmt_agc_io.c
@@ -1,4 +1,4 @@
-/*      $Id: gmt_agc_io.c 17449 2017-01-16 21:27:04Z pwessel $
+/*      $Id: gmt_agc_io.c 17647 2017-03-12 04:14:13Z pwessel $
  *
  *     Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. 
Luis and F. Wobbe
  *     See LICENSE.TXT file for copying and redistribution conditions.
@@ -253,13 +253,13 @@ int gmt_agc_read_grd (struct GMT_CTRL *GMT, struct 
GMT_GRID_HEADER *header, floa
        int first_col, last_col, j, col;                /* First and last 
column to deal with */
        int first_row, last_row, j_gmt, colend;         /* First and last row 
to deal with */
        unsigned int width_in;                  /* Number of items in one row 
of the subregion */
-       unsigned int width_out;                 /* Width of row as return (may 
include padding) */
+       /* width_out is width of row as return (may include padding) */
        unsigned int height_in;                 /* Number of columns in 
subregion */
        unsigned int i;                         /* Misc. counters */
        unsigned int *k = NULL;                 /* Array with indices */
        unsigned int block, n_blocks, n_blocks_x, n_blocks_y;   /* Misc. 
counters */
        unsigned int datablockcol, datablockrow, rowstart, rowend, colstart, 
row;
-       uint64_t ij, imag_offset;
+       uint64_t ij, imag_offset, width_out;
        float z[ZBLOCKWIDTH][ZBLOCKHEIGHT];
        FILE *fp = NULL;                        /* File pointer to data or pipe 
*/
        
@@ -307,7 +307,7 @@ int gmt_agc_read_grd (struct GMT_CTRL *GMT, struct 
GMT_GRID_HEADER *header, floa
                        colend = MIN (colstart + ZBLOCKWIDTH, 
header->n_columns);
                        for (j = 0, col = colstart; col < colend; j++, col++) {
                                if (col < first_col || col > last_col) continue;
-                               ij = imag_offset + (((j_gmt - first_row) + 
pad[YHI]) * width_out + col - first_col) + pad[XLO];
+                               ij = imag_offset + ((uint64_t)(((j_gmt - 
first_row) + pad[YHI])) * width_out + col - first_col) + pad[XLO];
                                grid[ij] = (z[j][i] == 0.0) ? 
GMT->session.f_NaN : z[j][i];     /* AGC uses exact zero as NaN flag */
                                if (gmt_M_is_fnan (grid[ij])) {
                                        header->has_NaNs = GMT_GRID_HAS_NANS;
@@ -345,14 +345,14 @@ int gmt_agc_write_grd (struct GMT_CTRL *GMT, struct 
GMT_GRID_HEADER *header, flo
 
        int first_col, last_col, col, colend = 0;               /* First and 
last column to deal with */
        int j_gmt, i, j, first_row, last_row;           /* First and last row 
to deal with */
-       unsigned int width_in;                  /* Number of items in one row 
of the subregion */
+       /* width_in is number of items in one row of the subregion */
        unsigned int width_out;                 /* Width of row as return (may 
include padding) */
        unsigned int height_out;                        /* Number of columns in 
subregion */
        unsigned int i2, j2;                    /* Misc. counters */
        unsigned int *k = NULL;                 /* Array with indices */
        unsigned int block, n_blocks, n_blocks_x, n_blocks_y;   /* Misc. 
counters */
        unsigned int row, rowstart, rowend, colstart, datablockcol, 
datablockrow;
-       uint64_t kk, ij, imag_offset;
+       uint64_t kk, ij, imag_offset, width_in;
        float prez[PREHEADSIZE], postz[POSTHEADSIZE];
        float outz[ZBLOCKWIDTH][ZBLOCKHEIGHT];
        FILE *fp = NULL;                        /* File pointer to data or pipe 
*/
@@ -416,7 +416,7 @@ int gmt_agc_write_grd (struct GMT_CTRL *GMT, struct 
GMT_GRID_HEADER *header, flo
                        colend = MIN (colstart + ZBLOCKWIDTH, 
header->n_columns);
                        for (j = 0, col = colstart; col < colend; j++, col++) {
                                if (col < first_col || col > last_col) continue;
-                               ij = imag_offset + ((j_gmt - first_row) + 
pad[YHI]) * width_in + (col - first_col) + pad[XLO];
+                               ij = imag_offset + ((uint64_t)((j_gmt - 
first_row) + pad[YHI])) * width_in + (col - first_col) + pad[XLO];
                                outz[j][i] = grid[ij];
                        }
                }
diff --git a/src/gmt_api.c b/src/gmt_api.c
index 29d5a38..596d407 100644
--- a/src/gmt_api.c
+++ b/src/gmt_api.c
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------
- *     $Id: gmt_api.c 17580 2017-02-23 06:35:24Z pwessel $
+ *     $Id: gmt_api.c 17680 2017-03-14 19:09:34Z jluis $
  *
  *     Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. 
Luis and F. Wobbe
  *     See LICENSE.TXT file for copying and redistribution conditions.
@@ -6626,7 +6626,7 @@ void *GMT_Read_Data (void *V_API, unsigned int family, 
unsigned int method, unsi
                                return_null (API, API->error);
                        }
                        if ((item = gmtapi_validate_id (API, family, in_ID, 
GMT_IN, GMTAPI_MODULE_INPUT)) == GMT_NOTSET)
-                               return_null (API, GMT_NOTSET);  /* Some 
internal error... */
+                               return_null (API, API->error);  /* Some 
internal error... */
                        API->object[item]->selected = true;
                }
                gmtlib_free_list (API->GMT, filelist, n_files); /* Free the 
file list */
diff --git a/src/gmt_customio.c b/src/gmt_customio.c
index 4548ecf..96f7dab 100644
--- a/src/gmt_customio.c
+++ b/src/gmt_customio.c
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------
- *     $Id: gmt_customio.c 17543 2017-02-09 14:14:29Z jluis $
+ *     $Id: gmt_customio.c 17670 2017-03-14 15:58:06Z pwessel $
  *
  *     Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. 
Luis and F. Wobbe
  *     See LICENSE.TXT file for copying and redistribution conditions.
@@ -1965,7 +1965,7 @@ int gmt_gdal_read_grd (struct GMT_CTRL *GMT, struct 
GMT_GRID_HEADER *header, flo
 }
 
 int gmt_gdal_write_grd (struct GMT_CTRL *GMT, struct GMT_GRID_HEADER *header, 
float *grid, double wesn[], unsigned int *pad, unsigned int complex_mode) {
-       uint64_t node = 0, ij, imag_offset;
+       uint64_t node = 0, ij, imag_offset, imsize;
        int first_col, last_col;        /* First and last column to deal with */
        int first_row, last_row;        /* First and last row to deal with */
        unsigned int width_out; /* Width of row as return (may include padding) 
*/
@@ -2015,11 +2015,12 @@ int gmt_gdal_write_grd (struct GMT_CTRL *GMT, struct 
GMT_GRID_HEADER *header, fl
 
        /* Lazy implementation of nodata value update as it doesn't check and 
apply on a eventual sub-region on output only */
        if (!isnan (header->nan_value)) {
-               for (ij = 0; ij < (uint64_t)header->mx * header->my; ij++)
+               for (ij = 0; ij < header->size; ij++)
                        if (isnan (grid[ij]))
                                grid[ij] = header->nan_value;
        }
 
+       imsize = gmt_M_get_nm (GMT, width_out, height_out);
        if (!type[0] || gmt_strlcmp(type, "float32")) {
                /* We have to shift the grid pointer in order to use the 
GDALRasterIO ability to extract a subregion. */
                /* See: 
osgeo-org.1560.n6.nabble.com/gdal-dev-writing-a-subregion-with-GDALRasterIO-td4960500.html
 */
@@ -2033,7 +2034,7 @@ int gmt_gdal_write_grd (struct GMT_CTRL *GMT, struct 
GMT_GRID_HEADER *header, fl
                return (GMT_NOERROR);
        }
        else if (gmt_strlcmp(type,"u8") || gmt_strlcmp(type,"u08")) {
-               zu8 = gmt_M_memory(GMT, NULL, width_out * height_out, unsigned 
char);
+               zu8 = gmt_M_memory(GMT, NULL, imsize, unsigned char);
                for (row = first_row; row < height_out; row++)
                        for (col = first_col, ij = gmt_M_ijp (header, row, 
0)+imag_offset; col < width_out; col++, ij++)
                                zu8[node++] = (unsigned char)grid[ij];
@@ -2042,7 +2043,7 @@ int gmt_gdal_write_grd (struct GMT_CTRL *GMT, struct 
GMT_GRID_HEADER *header, fl
                to_GDALW->type = strdup("uint8");
        }
        else if (gmt_strlcmp(type,"i16")) {
-               zi16 = gmt_M_memory(GMT, NULL, width_out * height_out, short 
int);
+               zi16 = gmt_M_memory(GMT, NULL, imsize, short int);
                for (row = first_row; row < height_out; row++)
                        for (col = first_col, ij = gmt_M_ijp (header, row, 
0)+imag_offset; col < width_out; col++, ij++)
                                zi16[node++] = (short int)grid[ij];
@@ -2051,7 +2052,7 @@ int gmt_gdal_write_grd (struct GMT_CTRL *GMT, struct 
GMT_GRID_HEADER *header, fl
                to_GDALW->type = strdup("int16");
        }
        else if (gmt_strlcmp(type,"u16")) {
-               zu16 = gmt_M_memory(GMT, NULL, width_out * height_out, unsigned 
short int);
+               zu16 = gmt_M_memory(GMT, NULL, imsize, unsigned short int);
                for (row = first_row; row < height_out; row++)
                        for (col = first_col, ij = gmt_M_ijp (header, row, 
0)+imag_offset; col < width_out; col++, ij++)
                                zu16[node++] = (unsigned short int)grid[ij];
@@ -2060,7 +2061,7 @@ int gmt_gdal_write_grd (struct GMT_CTRL *GMT, struct 
GMT_GRID_HEADER *header, fl
                to_GDALW->type = strdup("uint16");
        }
        else if (gmt_strlcmp(type,"i32")) {
-               zi32 = gmt_M_memory(GMT, NULL, width_out * height_out, int);
+               zi32 = gmt_M_memory(GMT, NULL, imsize, int);
                for (row = first_row; row < height_out; row++)
                        for (col = first_col, ij = gmt_M_ijp (header, row, 
0)+imag_offset; col < width_out; col++, ij++)
                                zi32[node++] = (int)grid[ij];
@@ -2069,7 +2070,7 @@ int gmt_gdal_write_grd (struct GMT_CTRL *GMT, struct 
GMT_GRID_HEADER *header, fl
                to_GDALW->type = strdup("int32");
        }
        else if (gmt_strlcmp(type,"u32")) {
-               zu32 = gmt_M_memory(GMT, NULL, width_out * height_out, unsigned 
int);
+               zu32 = gmt_M_memory(GMT, NULL, imsize, unsigned int);
                for (row = first_row; row < height_out; row++)
                        for (col = first_col, ij = gmt_M_ijp (header, row, 
0)+imag_offset; col < width_out; col++, ij++)
                                zu32[node++] = (unsigned int)grid[ij];
diff --git a/src/gmt_init.c b/src/gmt_init.c
index 4ca12aa..26600f0 100644
--- a/src/gmt_init.c
+++ b/src/gmt_init.c
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------
- *     $Id: gmt_init.c 17543 2017-02-09 14:14:29Z jluis $
+ *     $Id: gmt_init.c 17731 2017-03-20 19:48:52Z jluis $
  *
  *     Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. 
Luis and F. Wobbe
  *     See LICENSE.TXT file for copying and redistribution conditions.
@@ -6071,7 +6071,7 @@ void gmt_mapscale_syntax (struct GMT_CTRL *GMT, char 
option, char *string) {
        gmt_message (GMT, "\t-%c %s\n", option, string);
        gmt_refpoint_syntax (GMT, "L", NULL, GMT_ANCHOR_MAPSCALE, 3);
        gmt_message (GMT, "\t   Use +c<slat> (with central longitude) or 
+c<slon>/<slat> to specify scale origin.\n");
-       gmt_message (GMT, "\t   Set scale length with +w<length> and append a 
unit from %s [km].  Use -%cf to draw a \"fancy\" scale [Default is plain].\n", 
GMT_LEN_UNITS2_DISPLAY, option);
+       gmt_message (GMT, "\t   Set scale length with +w<length> and append a 
unit from %s [km].\n", GMT_LEN_UNITS2_DISPLAY);
        gmt_message (GMT, "\t   Several modifiers are optional:\n");
        gmt_message (GMT, "\t   Add +f to draw a \"fancy\" scale [Default is 
plain].\n");
        gmt_message (GMT, "\t   By default, the scale label equals the distance 
unit name and is placed on top [+at].  Use the +l<label>\n");
diff --git a/src/gmt_internals.h b/src/gmt_internals.h
index 078f7fd..2be5170 100644
--- a/src/gmt_internals.h
+++ b/src/gmt_internals.h
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------
- *     $Id: gmt_internals.h 17449 2017-01-16 21:27:04Z pwessel $
+ *     $Id: gmt_internals.h 17736 2017-03-20 22:54:42Z pwessel $
  *
  *     Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. 
Luis and F. Wobbe
  *     See LICENSE.TXT file for copying and redistribution conditions.
@@ -251,7 +251,7 @@ int gmtlib_read_image_info (struct GMT_CTRL *GMT, char 
*file, struct GMT_IMAGE *
 #define gmt_M_axis_is_geo(C,axis) (C->current.io.col_type[GMT_IN][axis] & 
GMT_IS_GEO)
 
 #define gmt_M_is_perspective(C) (C->current.proj.projection == GMT_ORTHO || 
C->current.proj.projection == GMT_GENPER)
-#define gmt_M_pole_is_point(C) ((C->current.proj.projection == 
GMT_OBLIQUE_MERC || C->current.proj.projection == GMT_OBLIQUE_MERC_POLE) || 
(C->current.proj.projection >= GMT_LAMBERT && C->current.proj.projection <= 
GMT_VANGRINTEN))
+#define gmt_M_pole_is_point(C) ((C->current.proj.projection == 
GMT_OBLIQUE_MERC || C->current.proj.projection == GMT_OBLIQUE_MERC_POLE) || 
(C->current.proj.projection >= GMT_LAMBERT && C->current.proj.projection <= 
GMT_VANGRINTEN && C->current.proj.projection != GMT_POLAR))
 #define gmt_M_is_grdmapproject(C) (!strncmp (C->init.module_name, 
"grdproject", 10U) || !strncmp (C->init.module_name, "mapproject", 10U))
 
 #endif /* _GMT_INTERNALS_H */
diff --git a/src/gmt_io.c b/src/gmt_io.c
index 686fe5c..4582b0d 100644
--- a/src/gmt_io.c
+++ b/src/gmt_io.c
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------
- *     $Id: gmt_io.c 17588 2017-02-23 23:35:14Z pwessel $
+ *     $Id: gmt_io.c 17742 2017-03-22 02:45:40Z pwessel $
  *
  *     Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. 
Luis and F. Wobbe
  *     See LICENSE.TXT file for copying and redistribution conditions.
@@ -2629,7 +2629,7 @@ GMT_LOCAL int gmtio_prep_ogr_output (struct GMT_CTRL 
*GMT, struct GMT_DATASET *D
                        }
                        gmtio_alloc_ogr_seg (GMT, T->segment[seg], 
T->ogr->n_aspatial); /* Copy over any feature-specific values */
                        T->segment[seg]->ogr->pol_mode = GMT_IS_PERIMETER;
-                       gmt_set_seg_minmax (GMT, T->ogr->geometry, 
T->segment[seg]);    /* Make sure min/max are set per polygon */
+                       gmt_set_seg_minmax (GMT, T->ogr->geometry, 0, 
T->segment[seg]); /* Make sure min/max are set per polygon */
 
                }
                /* OK, they are all polygons.  Determine any polygon holes: if 
a point is fully inside another polygon (not on the edge) */
@@ -3111,16 +3111,21 @@ GMT_LOCAL void *gmtio_ascii_input (struct GMT_CTRL 
*GMT, FILE *fp, uint64_t *n,
                                /* If OGR input the also read next 1-2 records 
to pick up metadata */
                                if (GMT->current.io.ogr == GMT_OGR_TRUE) {
                                        int c;
-                                       p = gmt_fgets (GMT, line, GMT_BUFSIZ, 
fp);
-                                       gmtio_ogr_parser (GMT, line);   /* 
Parsed a GMT/OGR record */
-                                       gmtio_build_text_from_ogr (GMT, NULL, 
GMT->current.io.segment_header);  /* Fill in the buffer for -D, -G, Z etc */
-                                       if (strstr (line, "@H")) strcat 
(GMT->current.io.segment_header, " -Ph");       /* Sometimes a @P or @H record 
instead */
-                                       /* May also have a second comment 
record with just @P or @ H so check for this case */
                                        if ((c = fgetc (fp)) == '#') {  /* 
Possibly, this record starts with a comment character # */
                                                line[0] = c;    /* Since we ate 
the # already we place it here manually */
                                                p = gmt_fgets (GMT, &line[1], 
GMT_BUFSIZ-1, fp);        /* Start at position 1 since # placed already and 
required for gmtio_ogr_parser to work */
-                                               gmtio_ogr_parser (GMT, line);   
/* Parse a possible GMT/OGR record (just returns if no OGR data there) */
-                                               if (strstr (line, "@H")) strcat 
(GMT->current.io.segment_header, " -Ph");       /* Add the hole designation to 
the polygon option */
+                                               gmtio_ogr_parser (GMT, line);   
/* Parsed a GMT/OGR record */
+                                               gmtio_build_text_from_ogr (GMT, 
NULL, GMT->current.io.segment_header);  /* Fill in the buffer for -D, -G, Z etc 
*/
+                                               if (strstr (line, "@H")) strcat 
(GMT->current.io.segment_header, " -Ph");       /* Sometimes a @P or @H record 
instead */
+                                               /* May also have a second 
comment record with just @P or @ H so check for this case */
+                                               if ((c = fgetc (fp)) == '#') {  
/* Possibly, this record starts with a comment character # */
+                                                       line[0] = c;    /* 
Since we ate the # already we place it here manually */
+                                                       p = gmt_fgets (GMT, 
&line[1], GMT_BUFSIZ-1, fp);        /* Start at position 1 since # placed 
already and required for gmtio_ogr_parser to work */
+                                                       gmtio_ogr_parser (GMT, 
line);   /* Parse a possible GMT/OGR record (just returns if no OGR data there) 
*/
+                                                       if (strstr (line, 
"@H")) strcat (GMT->current.io.segment_header, " -Ph");       /* Add the hole 
designation to the polygon option */
+                                               }
+                                               else    /* Not a comment 
record; put that character back on the stream and move on */
+                                                       ungetc (c, fp);
                                        }
                                        else    /* Not a comment record; put 
that character back on the stream and move on */
                                                ungetc (c, fp);
@@ -4577,6 +4582,7 @@ void * gmtio_ascii_textinput (struct GMT_CTRL *GMT, FILE 
*fp, uint64_t *n, int *
                        *status = 0;
                        return (NULL);
                }
+               /* Here we are done with any header records implied by -h */
                if (!p) {       /* Ran out of records */
                        GMT->current.io.status = GMT_IO_EOF;
                        *n = 0ULL;
@@ -6186,15 +6192,17 @@ struct GMT_TEXTTABLE * gmtlib_read_texttable (struct 
GMT_CTRL *GMT, void *source
 }
 
 /*! . */
-void gmt_set_seg_minmax (struct GMT_CTRL *GMT, unsigned int geometry, struct 
GMT_DATASEGMENT *S) {
-       /* Determine the min/max values for each column in the segment */
+void gmt_set_seg_minmax (struct GMT_CTRL *GMT, unsigned int geometry, unsigned 
int n_cols, struct GMT_DATASEGMENT *S) {
+       /* Determine the min/max values for each column in the segment.
+        * If n_cols > 0 then we only update the first n_cols */
        uint64_t row, col;
 
        /* In case the creation of the segment did not allocate min/max do it 
now */
        if (!S->min) S->min = gmt_M_memory (GMT, NULL, S->n_columns, double);
        if (!S->max) S->max = gmt_M_memory (GMT, NULL, S->n_columns, double);
        if (S->n_rows == 0) return;     /* Nothing more we can do */
-       for (col = 0; col < S->n_columns; col++) {
+       if (n_cols == 0) n_cols = S->n_columns; /* Set number of columns to 
work on */
+       for (col = 0; col < n_cols; col++) {
                if (GMT->current.io.col_type[GMT_IN][col] == GMT_IS_LON) /* 
Requires separate quandrant assessment */
                        gmtlib_get_lon_minmax (GMT, S->data[col], S->n_rows, 
&(S->min[col]), &(S->max[col]));
                else {  /* Simple Cartesian-like arrangement */
@@ -6226,7 +6234,7 @@ void gmt_set_tbl_minmax (struct GMT_CTRL *GMT, unsigned 
int geometry, struct GMT
        T->n_records = 0;
        for (seg = 0; seg < T->n_segments; seg++) {
                S = T->segment[seg];
-               gmt_set_seg_minmax (GMT, geometry, S);
+               gmt_set_seg_minmax (GMT, geometry, 0, S);
                if (S->n_rows == 0) continue;
                for (col = 0; col < T->n_columns; col++) {
                        if (S->min[col] < T->min[col]) T->min[col] = 
S->min[col];
@@ -7118,7 +7126,7 @@ struct GMT_DATATABLE * gmtlib_read_table (struct GMT_CTRL 
*GMT, void *source, un
                }
                else {  /* OK to populate segment and increment counters */
                        gmtlib_assign_segment (GMT, T->segment[seg], row, 
T->segment[seg]->n_columns);  /* Allocate and place arrays into segment */
-                       gmt_set_seg_minmax (GMT, *geometry, T->segment[seg]);   
/* Set min/max */
+                       gmt_set_seg_minmax (GMT, *geometry, 0, 
T->segment[seg]);        /* Set min/max */
                        T->n_records += row;            /* Total number of 
records so far */
                        T->segment[seg]->id = seg;      /* Internal segment 
number */
                }
diff --git a/src/gmt_memory.c b/src/gmt_memory.c
index 4eced8e..3a64124 100644
--- a/src/gmt_memory.c
+++ b/src/gmt_memory.c
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------
- *     $Id: gmt_memory.c 17449 2017-01-16 21:27:04Z pwessel $
+ *     $Id: gmt_memory.c 17620 2017-03-05 23:41:05Z pwessel $
  *
  *     Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. 
Luis and F. Wobbe
  *     See LICENSE.TXT file for copying and redistribution conditions.
@@ -463,7 +463,7 @@ void gmt_prep_tmp_arrays (struct GMT_CTRL *GMT, size_t row, 
size_t n_cols) {
 
        /* Here we must allocate more rows, this is expected to happen rarely 
given the large initial allocation */
 
-       while (row >= GMT->hidden.mem_rows) GMT->hidden.mem_rows <<= 1; /* 
Double up until enough */
+       while (row >= GMT->hidden.mem_rows) GMT->hidden.mem_rows = 
(size_t)lrint (1.5 * GMT->hidden.mem_rows);  /* Increase by 50% */
        for (col = 0; col < GMT->hidden.mem_cols; col++)        /* Add more 
memory via realloc */
                GMT->hidden.mem_coord[col] = gmt_M_memory (GMT, 
GMT->hidden.mem_coord[col], GMT->hidden.mem_rows, double);
 
diff --git a/src/gmt_nc.c b/src/gmt_nc.c
index 2325cc3..31ee580 100644
--- a/src/gmt_nc.c
+++ b/src/gmt_nc.c
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------
- *     $Id: gmt_nc.c 17449 2017-01-16 21:27:04Z pwessel $
+ *     $Id: gmt_nc.c 17653 2017-03-13 04:21:20Z pwessel $
  *
  *     Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. 
Luis and F. Wobbe
  *     See LICENSE.TXT file for copying and redistribution conditions.
@@ -123,8 +123,9 @@ static inline int io_nc_varm_float (int ncid, int varid, 
const size_t *startp,
 
 /* Get number of chunked rows that fit into cache (32MiB) */
 GMT_LOCAL int gmtnc_n_chunked_rows_in_cache (struct GMT_CTRL *GMT, struct 
GMT_GRID_HEADER *header, unsigned width, unsigned height, size_t 
*n_contiguous_chunk_rows, size_t *chunksize) {
-       nc_type z_type;      /* type of z variable */
-       size_t z_size;       /* size of z variable */
+       nc_type z_type;         /* type of z variable */
+       size_t z_size;          /* size of z variable */
+       size_t z_bytes;         /* Number of bytes */
        unsigned yx_dim[2] = {header->xy_dim[1], header->xy_dim[0]}; /* because 
xy_dim not row major */
        int err, storage_in;
 
@@ -137,7 +138,8 @@ GMT_LOCAL int gmtnc_n_chunked_rows_in_cache (struct 
GMT_CTRL *GMT, struct GMT_GR
                chunksize[yx_dim[1]] = width; /* all columns */
        }
 
-       if (height * width * z_size > NC_CACHE_SIZE) {
+       z_bytes = ((size_t)height) * ((size_t)width) * ((size_t)z_size);
+       if (z_bytes > NC_CACHE_SIZE) {
                /* memory needed for subset exceeds the cache size */
                unsigned int level;
                size_t chunks_per_row = (size_t) ceil ((double)width / 
chunksize[yx_dim[1]]);
@@ -196,7 +198,7 @@ GMT_LOCAL int gmtnc_io_nc_grid (struct GMT_CTRL *GMT, 
struct GMT_GRID_HEADER *he
 
        if (n_contiguous_chunk_rows) {
                /* read/write grid in chunks to keep memory footprint low */
-               unsigned remainder;
+               size_t remainder;
 #ifdef NC4_DEBUG
                unsigned row_num = 0;
                        GMT_Report (GMT->parent, GMT_MSG_NORMAL, "stride: %u 
width: %u\n",
@@ -205,11 +207,11 @@ GMT_LOCAL int gmtnc_io_nc_grid (struct GMT_CTRL *GMT, 
struct GMT_GRID_HEADER *he
 
                /* adjust row count, so that it ends on the bottom of a chunk */
                count[yx_dim[0]] = chunksize[yx_dim[0]] * 
n_contiguous_chunk_rows;
-               remainder = (unsigned int)(start[yx_dim[0]] % 
chunksize[yx_dim[0]]);
+               remainder = start[yx_dim[0]] % chunksize[yx_dim[0]];
                count[yx_dim[0]] -= remainder;
 
                count[yx_dim[1]] = width;
-               while ( start[yx_dim[0]] + count[yx_dim[0]] <= height && status 
== NC_NOERR) {
+               while ( (start[yx_dim[0]] + count[yx_dim[0]]) <= height && 
status == NC_NOERR) {
 #ifdef NC4_DEBUG
                        GMT_Report (GMT->parent, GMT_MSG_NORMAL, "chunked row 
#%u start-y:%" PRIuS " height:%" PRIuS "\n",
                                        ++row_num, start[yx_dim[0]], 
count[yx_dim[0]]);
@@ -221,7 +223,7 @@ GMT_LOCAL int gmtnc_io_nc_grid (struct GMT_CTRL *GMT, 
struct GMT_GRID_HEADER *he
                                status = io_nc_vara_float (header->ncid, 
header->z_id, start, count, grid, io_mode);
 
                        /* advance grid location and set new origin */
-                       grid += count[yx_dim[0]] * (stride == 0 ? width : 
stride);
+                       grid += count[yx_dim[0]] * ((size_t)(stride == 0 ? 
width : stride));
                        start[yx_dim[0]] += count[yx_dim[0]];
                        if (remainder) {
                                /* reset count to full chunk height */
@@ -339,7 +341,7 @@ GMT_LOCAL void gmtnc_set_optimal_chunksize (struct GMT_CTRL 
*GMT, struct GMT_GRI
        /* here, chunk size is either k_netcdf_io_chunked_auto or the chunk 
size is
         * larger than grid size */
 
-       if ( (header->n_rows * header->n_columns) < min_chunk_pixels ) {
+       if ( header->nm < min_chunk_pixels ) {
                /* the grid dimension is too small for chunking to make sense. 
switch to
                 * classic model */
                GMT->current.setting.io_nc4_chunksize[0] = k_netcdf_io_classic;
@@ -531,14 +533,14 @@ GMT_LOCAL int gmtnc_grd_info (struct GMT_CTRL *GMT, 
struct GMT_GRID_HEADER *head
                        char *pch;
                        gmt_M_err_trap (nc_inq_attlen (ncid, gm_id, 
"spatial_ref", &len));      /* Get attrib length */
                        gmt_M_str_free (header->ProjRefWKT);   /* Make sure we 
didn't have a previously allocated one */
-                       pch = gmt_M_memory(GMT, NULL, len+1, char);           
/* and allocate the needed space */
+                       pch = gmt_M_memory (GMT, NULL, len+1, char);           
/* and allocate the needed space */
                        gmt_M_err_trap (nc_get_att_text (ncid, gm_id, 
"spatial_ref", pch));
-                       header->ProjRefWKT = strdup(pch);       /* Turn it into 
a strdup allocation to be compatible with other instances elsewhere */
+                       header->ProjRefWKT = strdup (pch);      /* Turn it into 
a strdup allocation to be compatible with other instances elsewhere */
                        gmt_M_free (GMT, pch);
                }
 
                /* Create enough memory to store the x- and y-coordinate values 
*/
-               xy = gmt_M_memory (GMT, NULL, 
MAX(header->n_columns,header->n_rows), double);
+               xy = gmt_M_memory (GMT, NULL, MAX (header->n_columns, 
header->n_rows), double);
 
                /* Get information about x variable */
                gmtnc_get_units (GMT, ncid, ids[header->xy_dim[0]], 
header->x_units);
@@ -793,34 +795,36 @@ L100:
 /* Shift columns in a grid to the right (n_shift < 0) or to the left (n_shift 
< 0) */
 GMT_LOCAL void gmtnc_right_shift_grid (void *gridp, const unsigned n_cols, 
const unsigned n_rows, int n_shift, size_t cell_size) {
        char *tmp, *grid = (char*)gridp;
-       unsigned row, n_shift_abs = abs(n_shift);
+       size_t row, n_shift_abs = abs (n_shift), nm;
 
        assert (n_shift_abs != 0 && n_cols > n_shift_abs && n_cols > 0 && 
n_rows > 0);
 
        tmp = malloc (n_shift_abs * cell_size);
 
        if (n_shift > 0) { /* right shift */
-               for (row = 0; row < n_rows; ++row) {
+               for (row = 0; row < (size_t)n_rows; ++row) {
+                       nm = row * ((size_t)n_cols);
                        /* copy last n_shift_abs cols into tmp buffer */
-                       memcpy (tmp, grid + (row * n_cols + n_cols - 
n_shift_abs) * cell_size, n_shift_abs * cell_size);
+                       memcpy (tmp, grid + (nm + n_cols - n_shift_abs) * 
cell_size, n_shift_abs * cell_size);
                        /* right shift row */
-                       memmove (grid + (row * n_cols + n_shift_abs) * 
cell_size,
-                                                        grid + row * n_cols * 
cell_size,
+                       memmove (grid + (nm + n_shift_abs) * cell_size,
+                                                        grid + nm * cell_size,
                                                         (n_cols - n_shift_abs) 
* cell_size);
                        /* prepend tmp buffer */
-                       memcpy (grid + row * n_cols * cell_size, tmp, 
n_shift_abs * cell_size);
+                       memcpy (grid + nm * cell_size, tmp, n_shift_abs * 
cell_size);
                }
        }
        else { /* n_shift_abs < 0 */
                for (row = 0; row < n_rows; ++row) {
+                       nm = row * ((size_t)n_cols);
                        /* copy first n_shift_abs cols into tmp buffer */
-                       memcpy (tmp, grid + row * n_cols * cell_size, 
n_shift_abs * cell_size);
+                       memcpy (tmp, grid + nm * cell_size, n_shift_abs * 
cell_size);
                        /* left shift row */
-                       memmove (grid + row * n_cols * cell_size,
-                                                        grid + (row * n_cols + 
n_shift_abs) * cell_size,
+                       memmove (grid + nm * cell_size,
+                                                        grid + (nm + 
n_shift_abs) * cell_size,
                                                         (n_cols - n_shift_abs) 
* cell_size);
                        /* append tmp buffer */
-                       memcpy (grid + (row * n_cols + n_cols - n_shift_abs) * 
cell_size, tmp, n_shift_abs * cell_size);
+                       memcpy (grid + (nm + n_cols - n_shift_abs) * cell_size, 
tmp, n_shift_abs * cell_size);
                }
        }
        gmt_M_str_free (tmp);
@@ -831,62 +835,67 @@ GMT_LOCAL void gmtnc_right_shift_grid (void *gridp, const 
unsigned n_cols, const
 GMT_LOCAL void gmtnc_padding_copy (void *gridp, const unsigned n_cols, const 
unsigned n_rows, const unsigned *n_pad, size_t cell_size, bool periodic_cols) {
        /* n_cols and n_rows are dimensions of the padded grid */
        char *grid = (char*)gridp;
-       unsigned row, cell;
+       size_t row, cell, nm, nm2;
 
        assert (n_cols > n_pad[XLO] + n_pad[XHI] && n_rows > n_pad[YLO] + 
n_pad[YHI] &&
                n_pad[XLO] + n_pad[XHI] + n_pad[YLO] + n_pad[YHI] > 0 && 
cell_size > 0);
 
        if (periodic_cols) {
                /* A periodic grid wraps around */
-               for (row = n_pad[YHI]; row + n_pad[YLO] < n_rows; ++row) {
+               for (row = (size_t)n_pad[YHI]; (row + n_pad[YLO]) < 
(size_t)n_rows; ++row) {
+                       nm = row * ((size_t)n_cols);
                        /* Iterate over rows that contain data */
-                       for (cell = 0; cell < n_pad[XLO]; ++cell) {
+                       for (cell = 0; cell < (size_t)n_pad[XLO]; ++cell) {
                                /* Copy end of this row into first n_pad[XLO] 
columns:
                                 * X X 0 1 2 3 4 5 X X -> 4 5 0 1 2 3 4 5 X X */
-                               memcpy (grid + (row * n_cols + cell) * 
cell_size,
-                                                               grid + (row * 
n_cols + n_cols + cell - n_pad[XLO] - n_pad[XHI]) * cell_size,
+                               memcpy (grid + (nm + cell) * cell_size,
+                                                               grid + (nm + 
(size_t)n_cols + cell - (size_t)n_pad[XLO] - (size_t)n_pad[XHI]) * cell_size,
                                                                cell_size);
                        }
-                       for (cell = 0; cell < n_pad[XHI]; ++cell) {
+                       for (cell = 0; cell < (size_t)n_pad[XHI]; ++cell) {
                                /* Copy start of this row into last n_pad[XHI] 
columns:
                                 * 4 5 0 1 2 3 4 5 X X -> 4 5 0 1 2 3 4 5 0 1 */
-                               memcpy (grid + (row * n_cols + n_cols - cell - 
1) * cell_size,
-                                                               grid + (row * 
n_cols + n_pad[XLO] + n_pad[XHI] - cell - 1) * cell_size,
+                               memcpy (grid + (nm + (size_t)n_cols - cell - 1) 
* cell_size,
+                                                               grid + (nm + 
(size_t)n_pad[XLO] + (size_t)n_pad[XHI] - cell - 1) * cell_size,
                                                                cell_size);
                        }
                }
        }
        else { /* !periodic_cols */
-               for (row = n_pad[YHI]; row + n_pad[YLO] < n_rows; ++row) {
+               for (row = (size_t)n_pad[YHI]; (row + n_pad[YLO]) < 
(size_t)n_rows; ++row) {
+                       nm = row * ((size_t)n_cols);
                        /* Iterate over rows that contain data */
-                       for (cell = 0; cell < n_pad[XLO]; ++cell) {
+                       for (cell = 0; cell < (size_t)n_pad[XLO]; ++cell) {
                                /* Duplicate first n_pad[XLO] columns in this 
row:
                                 * 4 5 0 1 2 3 4 5 X X -> 0 0 0 1 2 3 4 5 X X */
-                               memcpy (grid + (row * n_cols + cell) * 
cell_size,
-                                                               grid + (row * 
n_cols + n_pad[XLO]) * cell_size,
+                               memcpy (grid + (nm + cell) * cell_size,
+                                                               grid + (nm + 
(size_t)n_pad[XLO]) * cell_size,
                                                                cell_size);
                        }
-                       for (cell = 0; cell < n_pad[XHI]; ++cell) {
+                       for (cell = 0; cell < (size_t)n_pad[XHI]; ++cell) {
                                /* Duplicate last n_pad[XHI] columns in this 
row:
                                 * 0 0 0 1 2 3 4 5 X X -> 0 0 0 1 2 3 4 5 5 5 */
-                               memcpy (grid + (row * n_cols + n_cols - cell - 
1) * cell_size,
-                                                               grid + (row * 
n_cols + n_cols - n_pad[XHI] - 1) * cell_size,
+                               memcpy (grid + (nm + (size_t)n_cols - cell - 1) 
* cell_size,
+                                                               grid + (nm + 
(size_t)n_cols - (size_t)n_pad[XHI] - 1) * cell_size,
                                                                cell_size);
                        }
                }
        }
 
-       for (cell = 0; cell < n_pad[YHI]; ++cell) {
+       for (cell = 0; cell < (size_t)n_pad[YHI]; ++cell) {
+               nm = cell * ((size_t)n_cols);
                /* Duplicate n_pad[YHI] rows in the beginning */
-               memcpy(grid + cell * n_cols * cell_size,
-                                        grid + n_pad[YHI] * n_cols * cell_size,
-                                        n_cols * cell_size);
+               memcpy(grid + nm * cell_size,
+                                        grid + ((size_t)n_pad[YHI]) * 
((size_t)n_cols) * cell_size,
+                                        ((size_t)n_cols) * cell_size);
        }
-       for (cell = 0; cell < n_pad[YLO]; ++cell) {
+       nm2 = ((size_t)(n_rows - n_pad[YLO] - 1)) * ((size_t)n_cols);
+       for (cell = 0; cell < (size_t)n_pad[YLO]; ++cell) {
+               nm = ((size_t)(n_rows - cell - 1)) * ((size_t)n_cols);
                /* Duplicate last n_pad[YLO] rows */
-               memcpy(grid + (n_rows - cell - 1) * n_cols * cell_size,
-                                        grid + (n_rows - n_pad[YLO] - 1) * 
n_cols * cell_size,
-                                        n_cols * cell_size);
+               memcpy(grid + nm * cell_size,
+                                        grid + nm2 * cell_size,
+                                        ((size_t)n_cols) * cell_size);
        }
 }
 
@@ -894,22 +903,23 @@ GMT_LOCAL void gmtnc_padding_copy (void *gridp, const 
unsigned n_cols, const uns
 GMT_LOCAL void gmtnc_padding_zero (void *gridp, const unsigned n_cols, const 
unsigned n_rows, const unsigned *n_pad, size_t cell_size) {
        /* n_cols and n_rows are dimensions of the padded grid */
        char *grid = (char*)gridp;
-       unsigned row;
+       size_t row, nm;
 
        assert (n_cols > n_pad[XLO] + n_pad[XHI] && n_rows > n_pad[YLO] + 
n_pad[YHI] &&
                n_pad[XLO] + n_pad[XHI] + n_pad[YLO] + n_pad[YHI] > 0 && 
cell_size > 0);
 
        /* Iterate over rows that contain data */
-       for (row = n_pad[YHI]; row + n_pad[YLO] < n_rows; ++row) {
+       for (row = (size_t)n_pad[YHI]; (row + n_pad[YLO]) < (size_t)n_rows; 
++row) {
+               nm = row * ((size_t)n_cols);
                /* Zero n cells at beginning of row */
-               memset (grid + row * n_cols * cell_size, 0, n_pad[XLO] * 
cell_size);
+               memset (grid + nm * cell_size, 0, ((size_t)n_pad[XLO]) * 
cell_size);
                /* Zero n cells at end of row */
-               memset (grid + (row * n_cols + n_cols - n_pad[XHI]) * 
cell_size, 0, n_pad[XHI] * cell_size);
+               memset (grid + (nm + (size_t)n_cols - (size_t)n_pad[XHI]) * 
cell_size, 0, ((size_t)n_pad[XHI]) * cell_size);
        }
        /* Zero n_pad[YHI] rows in the beginning */
-       memset(grid, 0, n_pad[YHI] * n_cols * cell_size);
+       memset (grid, 0, ((size_t)n_pad[YHI]) * ((size_t)n_cols) * cell_size);
        /* Zero last n_pad[YLO] rows */
-       memset(grid + (n_rows-n_pad[YLO]) * n_cols * cell_size, 0, n_pad[YLO] * 
n_cols * cell_size);
+       memset(grid + ((size_t)(n_rows-n_pad[YLO])) * ((size_t)n_cols) * 
cell_size, 0, ((size_t)n_pad[YLO]) * ((size_t)n_cols) * cell_size);
 }
 
 /* Fill mode for grid padding */
@@ -928,10 +938,10 @@ GMT_LOCAL void gmtnc_pad_grid (void *gridp, const 
unsigned n_cols, const unsigne
         *
         * Note: when grid is complex, we pass 2x n_rows */
        char *grid = (char*)gridp;
-       unsigned new_row;
-       unsigned old_row = n_rows-1;
-       unsigned n_new_cols = n_cols + n_pad[XLO] + n_pad[XHI];
-       unsigned n_new_rows = n_rows + n_pad[YLO] + n_pad[YHI];
+       size_t new_row;
+       size_t old_row = n_rows-1;
+       size_t n_new_cols = n_cols + n_pad[XLO] + n_pad[XHI];
+       size_t n_new_rows = n_rows + n_pad[YLO] + n_pad[YHI];
 
 #ifdef NC4_DEBUG
        fprintf (stderr, "pad grid w:%u e:%u s:%u n:%u\n",
@@ -947,12 +957,12 @@ GMT_LOCAL void gmtnc_pad_grid (void *gridp, const 
unsigned n_cols, const unsigne
                /* When padding W, E, and N (not necessary when padding S 
only). */
                for (new_row = n_new_rows - n_pad[YLO] - 1; new_row + 1 > 
n_pad[YHI]; --new_row, --old_row) {
                        /* Copy original row to new row, bottom upwards */
-                       void *from = grid + old_row * n_cols * cell_size;
-                       void *to   = grid + (new_row * n_new_cols + n_pad[XLO]) 
* cell_size;
+                       void *from = grid + old_row * ((size_t)n_cols) * 
cell_size;
+                       void *to   = grid + (new_row * n_new_cols + 
((size_t)n_pad[XLO])) * cell_size;
                        if (n_pad[YHI] == 0) /* rows overlap! */
-                               memmove (to, from, n_cols * cell_size);
+                               memmove (to, from, ((size_t)n_cols) * 
cell_size);
                        else /* no overlap, memcpy is safe */
-                               memcpy  (to, from, n_cols * cell_size);
+                               memcpy  (to, from, ((size_t)n_cols) * 
cell_size);
                }
        }
 
@@ -978,8 +988,8 @@ GMT_LOCAL void gmtnc_unpad_grid (void *gridp, const 
unsigned n_cols, const unsig
         *
         * Note: when grid is complex, we pass 2x n_rows */
        char *grid = (char*)gridp;
-       unsigned n_old_cols = n_cols + n_pad[XLO] + n_pad[XHI];
-       unsigned row;
+       size_t n_old_cols = n_cols + n_pad[XLO] + n_pad[XHI];
+       size_t row;
 
 #ifdef NC4_DEBUG
        fprintf (stderr, "unpad grid w:%u e:%u s:%u n:%u\n",
@@ -991,15 +1001,15 @@ GMT_LOCAL void gmtnc_unpad_grid (void *gridp, const 
unsigned n_cols, const unsig
        assert (n_cols > 0 && n_rows > 0 && cell_size > 0);
 
        /* Reshape matrix */
-       for (row = 0; row < n_rows; ++row) {
-               unsigned old_row = row + n_pad[YHI];
-               void *from = grid + (old_row * n_old_cols + n_pad[XLO]) * 
cell_size;
-               void *to   = grid + row * n_cols * cell_size;
+       for (row = 0; row < (size_t)n_rows; ++row) {
+               size_t old_row = row + n_pad[YHI];
+               void *from = grid + (old_row * n_old_cols + 
((size_t)n_pad[XLO])) * cell_size;
+               void *to   = grid + row * ((size_t)n_cols) * cell_size;
                /* Copy original row to new row */
                if (n_pad[YHI] == 0) /* rows overlap! */
-                       memmove (to, from, n_cols * cell_size);
+                       memmove (to, from, ((size_t)n_cols) * cell_size);
                else /* no overlap, memcpy is safe */
-                       memcpy  (to, from, n_cols * cell_size);
+                       memcpy  (to, from, ((size_t)n_cols) * cell_size);
        }
 }
 
@@ -1008,11 +1018,12 @@ GMT_LOCAL void gmtnc_unpad_grid (void *gridp, const 
unsigned n_cols, const unsig
 GMT_LOCAL void gmtnc_grid_fix_repeat_col (struct GMT_CTRL *GMT, void *gridp, 
const unsigned n_cols, const unsigned n_rows, size_t cell_size) {
        /* Note: when grid is complex, pass 2x n_rows */
        char *grid = (char*)gridp;
-       unsigned row, n_conflicts = 0;
+       unsigned n_conflicts = 0;
+       size_t row;
 
-       for (row = 0; row < n_rows; ++row) {
-               char *first = grid + row * n_cols * cell_size;                
/* first element in row */
-               char *last =  grid + (row * n_cols + n_cols - 1) * cell_size; 
/* last element in row */
+       for (row = 0; row < (size_t)n_rows; ++row) {
+               char *first = grid + row * ((size_t)n_cols) * cell_size;        
        /* first element in row */
+               char *last =  grid + (row * (size_t)(n_cols) + ((size_t)n_cols) 
- 1) * cell_size; /* last element in row */
                if ( memcmp(last, first, cell_size) ) {
                        /* elements differ: replace value of last element in 
row with value of first */
                        memcpy (last, first, cell_size);
@@ -1309,7 +1320,7 @@ int gmt_nc_read_grd (struct GMT_CTRL *GMT, struct 
GMT_GRID_HEADER *header, float
        adj_nan_value = !isnan (header->nan_value);
        header->has_NaNs = GMT_GRID_NO_NANS;    /* We are about to check for 
NaNs and if none are found we retain 1, else 2 */
        for (row = 0; row < height; ++row) {
-               float *p_data = pgrid + row * (header->stride ? header->stride 
: width);
+               float *p_data = pgrid + ((size_t)row) * 
((size_t)(header->stride ? header->stride : width));
                unsigned col;
                for (col = 0; col < width; col ++) {
                        if (adj_nan_value && p_data[col] == header->nan_value) {
@@ -1388,10 +1399,11 @@ int gmt_nc_write_grd (struct GMT_CTRL *GMT, struct 
GMT_GRID_HEADER *header, floa
        int status = NC_NOERR;
        bool adj_nan_value;   /* if we need to change the fill value */
        bool do_round = true; /* if we need to round to integral */
-       unsigned n, width, height, *actual_col = NULL;
+       unsigned width, height, *actual_col = NULL;
        unsigned dim[2], origin[2]; /* dimension and origin {y,x} of subset to 
write to netcdf */
        int first_col, last_col, first_row, last_row;
        uint64_t imag_offset;
+       size_t n;
        double limit[2];      /* minmax of z variable */
        float *pgrid = NULL;
 
@@ -1454,7 +1466,7 @@ int gmt_nc_write_grd (struct GMT_CTRL *GMT, struct 
GMT_GRID_HEADER *header, floa
        header->z_max = -DBL_MAX;
        adj_nan_value = !isnan (header->nan_value);
        n = 0;
-       while (n < width * height) {
+       while (n < (((size_t)width) * ((size_t)height))) {
                if (adj_nan_value && isnan (pgrid[n]))
                        pgrid[n] = header->nan_value;
                else if (!isnan (pgrid[n])) {
diff --git a/src/gmt_plot.c b/src/gmt_plot.c
index a933c70..c1f1a70 100644
--- a/src/gmt_plot.c
+++ b/src/gmt_plot.c
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------
- *     $Id: gmt_plot.c 17592 2017-02-24 00:40:55Z pwessel $
+ *     $Id: gmt_plot.c 17670 2017-03-14 15:58:06Z pwessel $
  *
  *     Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. 
Luis and F. Wobbe
  *     See LICENSE.TXT file for copying and redistribution conditions.
@@ -558,9 +558,13 @@ GMT_LOCAL void plot_x_grid (struct GMT_CTRL *GMT, struct 
PSL_CTRL *PSL, double s
        double x1, y1, x2, y2;
 
        for (i = 0; i < nx; i++) {
-               gmt_geo_to_xy (GMT, x[i], s, &x1, &y1);
-               gmt_geo_to_xy (GMT, x[i], n, &x2, &y2);
-               PSL_plotsegment (PSL, x1, y1, x2, y2);
+               if (gmt_M_is_geographic (GMT, GMT_IN))
+                       plot_map_lonline (GMT, PSL, x[i], s, n);
+               else {
+                       gmt_geo_to_xy (GMT, x[i], s, &x1, &y1);
+                       gmt_geo_to_xy (GMT, x[i], n, &x2, &y2);
+                       PSL_plotsegment (PSL, x1, y1, x2, y2);
+               }
        }
 }
 
@@ -617,9 +621,13 @@ GMT_LOCAL void plot_y_grid (struct GMT_CTRL *GMT, struct 
PSL_CTRL *PSL, double w
        double x1, y1, x2, y2;
 
        for (i = 0; i < ny; i++) {
-               gmt_geo_to_xy (GMT, w, y[i], &x1, &y1);
-               gmt_geo_to_xy (GMT, e, y[i], &x2, &y2);
-               PSL_plotsegment (PSL, x1, y1, x2, y2);
+               if (gmt_M_is_geographic (GMT, GMT_IN))
+                       plot_map_latline (GMT, PSL, y[i], w, e);
+               else {
+                       gmt_geo_to_xy (GMT, w, y[i], &x1, &y1);
+                       gmt_geo_to_xy (GMT, e, y[i], &x2, &y2);
+                       PSL_plotsegment (PSL, x1, y1, x2, y2);
+               }
        }
 }
 
@@ -5892,7 +5900,7 @@ void gmt_geo_wedge (struct GMT_CTRL *GMT, double xlon, 
double xlat, double radiu
                return;
        }
        S->n_rows = n_new;
-       gmt_set_seg_minmax (GMT, (mode == 3) ? GMT_IS_POLY : GMT_IS_LINE, S);   
/* Update min/max */
+       gmt_set_seg_minmax (GMT, (mode == 3) ? GMT_IS_POLY : GMT_IS_LINE, 2, 
S);        /* Update min/max of x/y only */
 
        gmt_geo_polygons (GMT, S);
 
@@ -6295,6 +6303,21 @@ void gmt_plane_perspective (struct GMT_CTRL *GMT, int 
plane, double level) {
        GMT->current.proj.z_project.plane = plane;
 }
 
+#if 0
+void gmt_vector_v4 (struct PSL_CTRL *PSL, double x0, double y0, double x1, 
double y1, double tailwidth, double headlength, double headwidth, double shape, 
struct GMT_FILL *fill, int outline)
+{
+       /* Plots the GMT4 vector symbol */
+
+       if (fill && fill->use_pattern) {        /* Setup pattern first */
+               int rgb[3] = {-3, -3, -3};
+               rgb[1] = (int)ps_pattern (fill->pattern_no, fill->pattern, 
fill->inverse, fill->dpi, outline, fill->f_rgb, fill->b_rgb);
+               psl_vector_v4 (PSL, x0, y0, param, rgb, outline);
+       }
+       else    /* Just draw as we please */
+               psl_vector_v4 (PSL, x0, y0, param, fill->rgb, outline);
+}
+#endif
+
 /* All functions involved in reading, writing, duplicating GMT_POSTSCRIPT 
structs and their PostScript content */
 
 /*! . */
diff --git a/src/gmt_plot.h b/src/gmt_plot.h
index 357a3c5..3e70b1e 100644
--- a/src/gmt_plot.h
+++ b/src/gmt_plot.h
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------
- *     $Id: gmt_plot.h 17449 2017-01-16 21:27:04Z pwessel $
+ *     $Id: gmt_plot.h 17670 2017-03-14 15:58:06Z pwessel $
  *
  *     Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. 
Luis and F. Wobbe
  *     See LICENSE.TXT file for copying and redistribution conditions.
@@ -55,6 +55,7 @@
 #define GMT_SYMBOL_TRIANGLE    ((int)'t')
 #define GMT_SYMBOL_CUBE                ((int)'u')
 #define GMT_SYMBOL_VECTOR      ((int)'v')
+#define GMT_SYMBOL_VECTOR_V4   999
 #define GMT_SYMBOL_WEDGE       ((int)'w')
 #define GMT_SYMBOL_CROSS       ((int)'x')
 #define GMT_SYMBOL_YDASH       ((int)'y')
diff --git a/src/gmt_prototypes.h b/src/gmt_prototypes.h
index 3a90aed..c669dfb 100644
--- a/src/gmt_prototypes.h
+++ b/src/gmt_prototypes.h
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------
- *     $Id: gmt_prototypes.h 17449 2017-01-16 21:27:04Z pwessel $
+ *     $Id: gmt_prototypes.h 17733 2017-03-20 20:03:03Z pwessel $
  *
  *     Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. 
Luis and F. Wobbe
  *     See LICENSE.TXT file for copying and redistribution conditions.
@@ -233,7 +233,7 @@ EXTERN_MSC struct GMT_VECTOR * gmt_create_vector (struct 
GMT_CTRL *GMT, uint64_t
 EXTERN_MSC void gmt_free_vector (struct GMT_CTRL *GMT, struct GMT_VECTOR **V, 
bool free_vector);
 EXTERN_MSC int gmt_load_aspatial_string (struct GMT_CTRL *GMT, struct GMT_OGR 
*G, uint64_t col, char out[GMT_BUFSIZ]);
 EXTERN_MSC double gmt_get_aspatial_value (struct GMT_CTRL *GMT, int col, 
struct GMT_DATASEGMENT *S);
-EXTERN_MSC void gmt_set_seg_minmax (struct GMT_CTRL *GMT, unsigned int 
geometry, struct GMT_DATASEGMENT *S);
+EXTERN_MSC void gmt_set_seg_minmax (struct GMT_CTRL *GMT, unsigned int 
geometry, unsigned int n_cols, struct GMT_DATASEGMENT *S);
 EXTERN_MSC void gmt_set_seg_polar (struct GMT_CTRL *GMT, struct 
GMT_DATASEGMENT *S);
 EXTERN_MSC void gmt_skip_xy_duplicates (struct GMT_CTRL *GMT, bool mode);
 EXTERN_MSC void gmt_duplicate_ogr_seg (struct GMT_CTRL *GMT, struct 
GMT_DATASEGMENT *S_to, struct GMT_DATASEGMENT *S_from);
@@ -264,7 +264,7 @@ EXTERN_MSC void gmt_init_fill (struct GMT_CTRL *GMT, struct 
GMT_FILL *fill, doub
 EXTERN_MSC int gmt_intpol (struct GMT_CTRL *GMT, double *x, double *y, 
uint64_t n, uint64_t m, double *u, double *v, int mode);
 EXTERN_MSC unsigned int gmt_inonout (struct GMT_CTRL *GMT, double x, double y, 
const struct GMT_DATASEGMENT *S);
 EXTERN_MSC void gmt_just_to_lonlat (struct GMT_CTRL *GMT, int justify, bool 
geo, double *x, double *y);
-EXTERN_MSC struct GMT_REFPOINT * gmt_get_refpoint (struct GMT_CTRL *GMT, char 
*arg);
+EXTERN_MSC struct GMT_REFPOINT * gmt_get_refpoint (struct GMT_CTRL *GMT, char 
*arg, char option);
 EXTERN_MSC void gmt_set_refpoint (struct GMT_CTRL *GMT, struct GMT_REFPOINT 
*A);
 EXTERN_MSC void gmt_free_refpoint (struct GMT_CTRL *GMT, struct GMT_REFPOINT 
**Ap);
 EXTERN_MSC void gmt_flip_azim_d (struct GMT_CTRL *GMT, double *azim);
diff --git a/src/gmt_support.c b/src/gmt_support.c
index 0e89b0a..214f85d 100644
--- a/src/gmt_support.c
+++ b/src/gmt_support.c
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------
- *     $Id: gmt_support.c 17571 2017-02-22 17:37:42Z pwessel $
+ *     $Id: gmt_support.c 17733 2017-03-20 20:03:03Z pwessel $
  *
  *     Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. 
Luis and F. Wobbe
  *     See LICENSE.TXT file for copying and redistribution conditions.
@@ -3309,11 +3309,11 @@ GMT_LOCAL int support_getscale_old (struct GMT_CTRL 
*GMT, char option, char *tex
        }
        ms->length = atof (txt_len);
 
-       if (gave_xy)    /* Set up ancher in plot units */
+       if (gave_xy)    /* Set up anchor in plot units */
                snprintf (string, GMT_LEN256, "x%s/%s", txt_a, txt_b);
        else    /* Set up ancher in geographical coordinates */
                snprintf (string, GMT_LEN256, "g%s/%s", txt_a, txt_b);
-       if ((ms->refpoint = gmt_get_refpoint (GMT, text)) == NULL) {
+       if ((ms->refpoint = gmt_get_refpoint (GMT, string, option)) == NULL) {
                GMT_Report (GMT->parent, GMT_MSG_NORMAL, "Syntax error:  Scale 
reference point was not accepted\n");
                gmt_refpoint_syntax (GMT, "L", NULL, GMT_ANCHOR_MAPSCALE, 3);
                return (1);     /* Failed basic parsing */
@@ -3522,7 +3522,7 @@ GMT_LOCAL int support_getrose_old (struct GMT_CTRL *GMT, 
char option, char *text
                snprintf (string, GMT_LEN256, "x%s/%s", txt_a, txt_b);
        else    /* Set up ancher in geographical coordinates */
                snprintf (string, GMT_LEN256, "g%s/%s", txt_a, txt_b);
-       if ((ms->refpoint = gmt_get_refpoint (GMT, text)) == NULL) {
+       if ((ms->refpoint = gmt_get_refpoint (GMT, string, option)) == NULL) {
                GMT_Report (GMT->parent, GMT_MSG_NORMAL, "Syntax error:  Map 
rose reference point was not accepted\n");
                gmt_refpoint_syntax (GMT, "Td|m", NULL, GMT_ANCHOR_MAPROSE, 3);
                return (1);     /* Failed basic parsing */
@@ -10600,7 +10600,7 @@ int gmt_getinsert (struct GMT_CTRL *GMT, char option, 
char *in_text, struct GMT_
                unsigned int last;
                char *q[2] = {NULL, NULL};
                size_t len;
-               if ((B->refpoint = gmt_get_refpoint (GMT, text)) == NULL) {
+               if ((B->refpoint = gmt_get_refpoint (GMT, text, option)) == 
NULL) {
                        GMT_Report (GMT->parent, GMT_MSG_NORMAL, "Syntax error: 
 Map insert reference point was not accepted\n");
                        gmt_refpoint_syntax (GMT, "D", NULL, GMT_ANCHOR_INSERT, 
1);
                        return (1);     /* Failed basic parsing */
@@ -10732,7 +10732,7 @@ int gmt_getscale (struct GMT_CTRL *GMT, char option, 
char *text, struct GMT_MAP_
        ms->measure = 'k';      /* Default distance unit is km */
        ms->alignment = 't';    /* Default label placement is on top */
 
-       if ((ms->refpoint = gmt_get_refpoint (GMT, text)) == NULL) {
+       if ((ms->refpoint = gmt_get_refpoint (GMT, text, option)) == NULL) {
                GMT_Report (GMT->parent, GMT_MSG_NORMAL, "Syntax error:  Scale 
reference point was not accepted\n");
                gmt_refpoint_syntax (GMT, "L", NULL, GMT_ANCHOR_MAPSCALE, 3);
                return (1);     /* Failed basic parsing */
@@ -10876,7 +10876,7 @@ int gmt_getrose (struct GMT_CTRL *GMT, char option, 
char *text, struct GMT_MAP_R
                        return (-1);
                        break;
        }
-       if ((ms->refpoint = gmt_get_refpoint (GMT, &text[1])) == NULL) {
+       if ((ms->refpoint = gmt_get_refpoint (GMT, &text[1], option)) == NULL) {
                GMT_Report (GMT->parent, GMT_MSG_NORMAL, "Syntax error:  Map 
rose reference point was not accepted\n");
                gmt_refpoint_syntax (GMT, "Td|m", NULL, GMT_ANCHOR_MAPROSE, 3);
                return (1);     /* Failed basic parsing */
@@ -13450,7 +13450,7 @@ void gmt_free_refpoint (struct GMT_CTRL *GMT, struct 
GMT_REFPOINT **Ap) {
 }
 
 /*! . */
-struct GMT_REFPOINT * gmt_get_refpoint (struct GMT_CTRL *GMT, char *arg) {
+struct GMT_REFPOINT * gmt_get_refpoint (struct GMT_CTRL *GMT, char *arg, char 
option) {
        /* Used to decipher option -D in psscale, pslegend, and psimage:
         * -D[g|j|n|x]<refpoint>[/<remainder]
         * where g means map coordinates, n means normalized coordinates, and x 
means plot coordinates.
@@ -13458,6 +13458,7 @@ struct GMT_REFPOINT * gmt_get_refpoint (struct GMT_CTRL 
*GMT, char *arg) {
         * plot box coordinates; the <refpoint> point is the coordinate pair 
<x0>/<y0>.
         * All -D flavors except -Dx require -R -J.
         * Remaining arguments are returned as well via the string A->args.
+        * also used to parse refpoint in scales -L and -T hence the option 
argument.
         */
        unsigned int n_errors = 0, k = 1;       /* Assume 1st character tells 
us the mode */
        int n, justify = 0;
@@ -13513,13 +13514,13 @@ struct GMT_REFPOINT * gmt_get_refpoint (struct 
GMT_CTRL *GMT, char *arg) {
                        mode = GMT_REFPOINT_JUST;
                else {  /* Must assume the user gave map coordinates */
                        mode = GMT_REFPOINT_MAP;
-                       GMT_Report (GMT->parent, GMT_MSG_VERBOSE, "Warning: 
Your -D option was interpreted to mean -D%c\n", kind[mode]);
+                       GMT_Report (GMT->parent, GMT_MSG_VERBOSE, "Warning: 
Your -%c option was interpreted to mean -D%c\n", option, kind[mode]);
                }
        }
        /* Here we know or have assumed the mode and can process coordinates 
accordingly */
 
        if (mode != GMT_REFPOINT_PLOT && GMT->common.J.active == false && 
GMT->common.R.active == false) {
-               GMT_Report (GMT->parent, GMT_MSG_NORMAL, "Error: Your -D%c 
reference point coordinates require both -R -J to be specified\n", kind[mode]);
+               GMT_Report (GMT->parent, GMT_MSG_NORMAL, "Error: Your -%c%c 
reference point coordinates require both -R -J to be specified\n", option, 
kind[mode]);
                return NULL;
        }
 
@@ -13545,7 +13546,7 @@ struct GMT_REFPOINT * gmt_get_refpoint (struct GMT_CTRL 
*GMT, char *arg) {
                        n_errors += gmt_verify_expectations (GMT, 
GMT->current.io.col_type[GMT_IN][GMT_X], gmt_scanf (GMT, txt_x, 
GMT->current.io.col_type[GMT_IN][GMT_X], &A->x), txt_x);
                        n_errors += gmt_verify_expectations (GMT, 
GMT->current.io.col_type[GMT_IN][GMT_Y], gmt_scanf (GMT, txt_y, 
GMT->current.io.col_type[GMT_IN][GMT_Y], &A->y), txt_y);
                        if (n_errors)
-                               GMT_Report (GMT->parent, GMT_MSG_NORMAL, 
"Error: Could not parse geographic coordinates %s and/or %s\n", txt_x, txt_y);
+                               GMT_Report (GMT->parent, GMT_MSG_NORMAL, "Error 
-%c: Could not parse geographic coordinates %s and/or %s\n", option, txt_x, 
txt_y);
                        else
                                GMT_Report (GMT->parent, GMT_MSG_DEBUG, "Anchor 
point specified via map coordinates: %g, %g\n", A->x, A->y);
                        break;
diff --git a/src/gmt_vector.c b/src/gmt_vector.c
index 68a8e38..5cde1a9 100644
--- a/src/gmt_vector.c
+++ b/src/gmt_vector.c
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------
- *     $Id: gmt_vector.c 17528 2017-02-05 08:02:49Z pwessel $
+ *     $Id: gmt_vector.c 17621 2017-03-06 00:01:29Z pwessel $
  *
  *     Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. 
Luis and F. Wobbe
  *     See LICENSE.TXT file for copying and redistribution conditions.
@@ -1368,7 +1368,7 @@ uint64_t gmt_fix_up_path (struct GMT_CTRL *GMT, double 
**a_lon, double **a_lat,
         */
 
        unsigned int k = 1;
-       bool meridian;
+       bool meridian, boostable;
        uint64_t i, j, n_new, n_step = 0;
        double a[3], b[3], x[3], *lon = NULL, *lat = NULL;
        double c, d, fraction, theta, minlon, maxlon;
@@ -1399,22 +1399,21 @@ uint64_t gmt_fix_up_path (struct GMT_CTRL *GMT, double 
**a_lon, double **a_lat,
         * and hence the number of steps n_step will be small.  This can lead 
to large jumps in
         * longitude that can later confuse us as to when we cross a periodic 
boundary.
         * We try to mitigate that by scaling up the number of steps by a boost 
factor that is 1
-        * away from poles and from |lat| = 75 increases to 100 very close to 
the pole. */
-
+        * away from poles and from |lat| = 75 increases to 150 very close to 
the pole. */
+       boostable = !(gmt_M_is_linear (GMT) || gmt_M_pole_is_point (GMT));      
/* Only boost for projections where poles are lines */
        f_lat_a = fabs (lat[0]);
        for (i = 1; i < n; i++) {
                f_lat_b = fabs (lat[i]);
 
                gmt_geo_to_cart (GMT, lat[i], lon[i], b, true); /* End point of 
current arc */
-               boost = (MIN(f_lat_a, f_lat_b) > 75.0) ? 100.0 : 1.0;   /* 
Enforce closer sampling close to poles */
-               if (MIN(f_lat_a, f_lat_b) > 75.0)       /* Enforce closer 
sampling close to poles */
-                       boost = 1.0 + 10.0 * (MAX(f_lat_a, f_lat_b) - 75.0);    
/* Crude way to get a boost from 1 at 80 to ~101 at the pole */
+               if (boostable && MIN(f_lat_a, f_lat_b) > 75.0)  /* Enforce 
closer sampling close to poles */
+                       boost = 1.0 + 10.0 * (MAX(f_lat_a, f_lat_b) - 75.0);    
/* Crude way to get a boost from 1 at 75 to ~151 at the pole */
                else
                        boost = 1.0;
 
                if (mode == GMT_STAIRS_Y) {     /* First follow meridian, then 
parallel */
                        dlon = lon[i]-lon[i-1]; /* Beware of jumps due to sign 
differences */
-                       if (fabs (dlon) > 180.0) dlon += copysign (360.0, 
-dlon);       /* Never more than  180 to next point */
+                       if (fabs (dlon) > 180.0) dlon += copysign (360.0, 
-dlon);       /* Never more than 180 to next point */
                        lon_i = lon[i-1] + dlon;        /* Use lon_i instead of 
lon[i] in the marching since this avoids any jumping */
                        theta = fabs (dlon) * cosd (lat[i-1]);
                        n_step = lrint (theta / step);
diff --git a/src/gmtlogo.c b/src/gmtlogo.c
index bb49bb9..85a9175 100644
--- a/src/gmtlogo.c
+++ b/src/gmtlogo.c
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------
- *     $Id: gmtlogo.c 17449 2017-01-16 21:27:04Z pwessel $
+ *     $Id: gmtlogo.c 17733 2017-03-20 20:03:03Z pwessel $
  *
  *     Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. 
Luis and F. Wobbe
  *     See LICENSE.TXT file for copying and redistribution conditions.
@@ -116,7 +116,7 @@ GMT_LOCAL int parse (struct GMT_CTRL *GMT, struct 
GMTLOGO_CTRL *Ctrl, struct GMT
 
                        case 'D':
                                Ctrl->D.active = true;
-                               if ((Ctrl->D.refpoint = gmt_get_refpoint (GMT, 
opt->arg)) == NULL) n_errors++;  /* Failed basic parsing */
+                               if ((Ctrl->D.refpoint = gmt_get_refpoint (GMT, 
opt->arg, 'D')) == NULL) n_errors++;     /* Failed basic parsing */
                                else {  /* args are 
[+j<justify>][+o<dx>[/<dy>]] */
                                        if (gmt_get_modifier 
(Ctrl->D.refpoint->args, 'j', string))
                                                Ctrl->D.justify = 
gmt_just_decode (GMT, string, PSL_NO_DEF);
@@ -147,7 +147,7 @@ GMT_LOCAL int parse (struct GMT_CTRL *GMT, struct 
GMTLOGO_CTRL *Ctrl, struct GMT
                }
        }
        if (!Ctrl->D.active) {
-               Ctrl->D.refpoint = gmt_get_refpoint (GMT, "x0/0");      /* 
Default if no -D given */
+               Ctrl->D.refpoint = gmt_get_refpoint (GMT, "x0/0", 'D'); /* 
Default if no -D given */
                Ctrl->D.active = true;
        }
        n_errors += gmt_M_check_condition (GMT, Ctrl->D.width < 0.0, "Syntax 
error -D option, +w modifier: Width cannot be zero or negative!\n");
diff --git a/src/grdimage.c b/src/grdimage.c
index f2addd4..82c442b 100644
--- a/src/grdimage.c
+++ b/src/grdimage.c
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------
- *     $Id: grdimage.c 17485 2017-01-23 13:20:10Z jluis $
+ *     $Id: grdimage.c 17670 2017-03-14 15:58:06Z pwessel $
  *
  *     Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. 
Luis and F. Wobbe
  *     See LICENSE.TXT file for copying and redistribution conditions.
@@ -1027,8 +1027,8 @@ int GMT_grdimage (void *V_API, int mode, void *args) {
                        if (!(bitimage_8[kk] == 0 || bitimage_8[kk] == 255)) 
P->is_bw = false;
 
        if (P && P->is_bw && !Ctrl->A.active) { /* Can get away with a 1-bit 
image, but we must pack the original byte to 8 image bits */
-               int nx8, shift, b_or_w, nx_pixels, k8;
-               uint64_t imsize;
+               int nx8, shift, b_or_w, nx_pixels;
+               uint64_t imsize, k8;
                unsigned char *bit = NULL;
 
                GMT_Report (API, GMT_MSG_VERBOSE, "Creating 1-bit B/W image\n");
diff --git a/src/grdmask.c b/src/grdmask.c
index 134bad7..ce50f4b 100644
--- a/src/grdmask.c
+++ b/src/grdmask.c
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------
- *     $Id: grdmask.c 17449 2017-01-16 21:27:04Z pwessel $
+ *     $Id: grdmask.c 17618 2017-03-05 22:58:12Z pwessel $
  *
  *     Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. 
Luis and F. Wobbe
  *     See LICENSE.TXT file for copying and redistribution conditions.
@@ -361,7 +361,7 @@ int GMT_grdmask (void *V_API, int mode, void *args) {
                                        Return (GMT_RUNTIME_ERROR);
                                }
                                S->n_rows = n_new;
-                               gmt_set_seg_minmax (GMT, D->geometry, S);       
/* Update min/max */
+                               gmt_set_seg_minmax (GMT, D->geometry, 2, S);    
/* Update min/max or x/y only */
                        }
                }
        }
diff --git a/src/grdview.c b/src/grdview.c
index 985ac82..bb70acc 100644
--- a/src/grdview.c
+++ b/src/grdview.c
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------
- *     $Id: grdview.c 17449 2017-01-16 21:27:04Z pwessel $
+ *     $Id: grdview.c 17625 2017-03-06 04:01:24Z pwessel $
  *
  *     Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. 
Luis and F. Wobbe
  *     See LICENSE.TXT file for copying and redistribution conditions.
@@ -563,7 +563,7 @@ GMT_LOCAL int parse (struct GMT_CTRL *GMT, struct 
GRDVIEW_CTRL *Ctrl, struct GMT
                        case 'S':       /* Smoothing of contours */
                                Ctrl->S.active = true;
                                sval = atoi (opt->arg);
-                               n_errors += gmt_M_check_condition (GMT, sval, 
"Syntax error -S option: smooth value must be positive\n");
+                               n_errors += gmt_M_check_condition (GMT, sval <= 
0, "Syntax error -S option: smooth value must be positive\n");
                                Ctrl->S.value = sval;
                                break;
                        case 'T':       /* Tile plot */
diff --git a/src/postscriptlight.c b/src/postscriptlight.c
index cf771a4..4023282 100644
--- a/src/postscriptlight.c
+++ b/src/postscriptlight.c
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------
- *     $Id: postscriptlight.c 17507 2017-01-31 23:21:54Z pwessel $
+ *     $Id: postscriptlight.c 17670 2017-03-14 15:58:06Z pwessel $
  *
  *     Copyright (c) 2009-2017 by P. Wessel and R. Scharroo
  *
@@ -2070,6 +2070,54 @@ static int psl_pattern_init (struct PSL_CTRL *PSL, int 
image_no, char *imagefile
        return (image_no);
 }
 
+#if 0
+void psl_vector_v4 (struct PSL_CTRL *PSL, double x, double y, double param[], 
double rgb[], int outline)
+{
+       /* Old GMT4 vector symbol:
+        * param[0] = xtip;
+        * param[1] = ytip;
+        * param[2] = tailwidth;
+        * param[3] = headlength;
+        * param[4] = headwidth;
+        * param[5] = headshape;
+       /* Will make sure that arrow has a finite width in PS coordinates */
+
+       double angle, xtail, ytail, tailwidth, headlength, headwidth, headshape;
+       int w2, length, hw, hl, hl2, hw2, l2;
+
+       xtail = x;      ytail = y;      xtip = param[0];        ytip = param[1];
+       length = psl_iz (PSL, hypot (xtail-xtip, ytail-ytip));                  
                /* Vector length in PS units */
+       if (length == 0) return;                                        /* NULL 
vector */
+
+       tailwidth  = param[2];
+       headlength = param[3];
+       headwidth  = param[4];
+       headshape  = param[5];
+       if (outline & 8)
+               ps_setfill (rgb, outline - 8);
+       else
+               ps_setfill (rgb, outline);
+       angle = atan2 ((ytip-ytail),(xtip-xtail)) * R2D;                        
                /* Angle vector makes with horizontal, in radians */
+       fprintf (PSL->internal.fp, "V %ld %ld T ", (PSL_LONG)irint (xtail * 
PSL->internal.scale), (PSL_LONG)irint (ytail * PSL->internal.scale));       /* 
Temporarily set tail point the local origin (0, 0) */
+       if (angle != 0.0) fprintf (PSL->internal.fp, "%g R ", angle);           
                        /* Rotate so vector is horizontal in local coordinate 
system */
+       w2 = (PSL_LONG)irint (0.5 * tailwidth * PSL->internal.scale);   if (w2 
== 0) w2 = 1;                    /* Half-width of vector tail */
+       hw = (PSL_LONG)irint (headwidth * PSL->internal.scale); if (hw == 0) hw 
= 1;                            /* Width of vector head */
+       hl = (PSL_LONG)irint (headlength * PSL->internal.scale);                
                                        /* Length of vector head */
+       hl2 = (PSL_LONG)irint (0.5 * headshape * headlength * 
PSL->internal.scale);                                     /* Cut-in distance 
due to slanted back-side of arrow head */
+       hw2 = hw - w2;                                                          
                /* Distance from tail side to head side (vertically) */
+       if (outline & 8) {      /* Double-headed vector */
+               l2 = length - 2 * hl + 2 * hl2;                                 
                /* Inside length between start of heads */
+               fprintf (PSL->internal.fp, "%ld %ld %ld %ld %ld %ld %ld %ld %ld 
%ld %ld %ld %ld %ld %ld %ld Sv U\n",
+                               hl2, hw2, -l2, hl2, -hw2, -hl, hw, hl, hw, 
-hl2, -hw2, l2, -hl2, hw2, hl, -hw);
+       }
+       else {                  /* Single-headed vector */
+               l2 = length - hl + hl2;                                         
                /* Length from tail to start of slanted head */
+               fprintf (PSL->internal.fp, "%ld %ld %ld %ld %ld %ld %ld %ld %ld 
%ld %ld SV U\n",
+                       -l2, hl2, -hw2, -hl, hw, hl, hw, -hl2, -hw2, l2, -w2);
+       }
+}
+#endif
+
 #define FIN_SLANT_COS  0.707106781187  /* I.e., 45 degrees slant */
 #define FIN_LENGTH_SCALE       0.66666667      /* 2/3 the length of the vector 
*/
 #define FIN_HEIGHT_SCALE       0.5     /* 1/2 the width of the vector */
@@ -5419,6 +5467,7 @@ int PSL_command (struct PSL_CTRL *C, const char *format, 
...) {
                char tmp_buffer[PSL_BUFSIZ] = {""};
                size_t len = vsnprintf (tmp_buffer, PSL_BUFSIZ, format, args);
                psl_prepare_buffer (C, len);
+               C->internal.buffer[C->internal.n] = '\0';       /* Play safe 
before the strcat of next line. Otherwise trash in the middle may occur */
                strncat (&(C->internal.buffer[C->internal.n]), tmp_buffer, len);
                C->internal.n += len;
        }
diff --git a/src/potential/talwani3d.c b/src/potential/talwani3d.c
index 5beeba6..fea0e9f 100644
--- a/src/potential/talwani3d.c
+++ b/src/potential/talwani3d.c
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------
- *     $Id: talwani3d.c 17580 2017-02-23 06:35:24Z pwessel $
+ *     $Id: talwani3d.c 17603 2017-03-04 01:03:56Z pwessel $
  *
  *     Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. 
Luis and F. Wobbe
  *     See LICENSE.TXT file for copying and redistribution conditions.
@@ -51,8 +51,8 @@
 
 #define GMT_PROG_OPTIONS "-VRfhior" GMT_ADD_x_OPT
 
-#define TOL            1.0e-7
-#define DEG_TO_KM      111.319490793   /* For flat-Earth scaling of degrees to 
km */
+#define TOL            1.0e-7  /* Gotta leave a bit slack for these 
calculations */
+#define DEG_TO_KM      111.319490793   /* For flat-Earth scaling of degrees to 
km on WGS-84 Equator */
 #define GAMMA          6.673           /* Gravitational constant for distances 
in km and mass in kg/m^3 */
 #define G0             9.81            /* Normal gravity */
 
@@ -238,7 +238,7 @@ GMT_LOCAL int usage (struct GMTAPI_CTRL *API, int level) {
        if (level == GMT_MODULE_PURPOSE) return (GMT_NOERROR);
        GMT_Message (API, GMT_TIME_NONE, "usage: talwani3d <modelfile> [-A] 
[-D<rho>] [-Ff|n|v] [-G<outfile>] [%s]\n", GMT_I_OPT);
        GMT_Message (API, GMT_TIME_NONE, "\t[-M[hz]] [-N<trktable>] [%s] 
[-Z<level>] [%s] \n", GMT_Rgeo_OPT, GMT_V_OPT, GMT_f_OPT);
-       GMT_Message (API, GMT_TIME_NONE,"\t[%s]\n\t[%s] [%s] [%s]%s\n\n", 
GMT_h_OPT, GMT_i_OPT, GMT_o_OPT, GMT_r_OPT, GMT_x_OPT);
+       GMT_Message (API, GMT_TIME_NONE, "\t[-fg] [%s]\n\t[%s] [%s] 
[%s]%s\n\n", GMT_h_OPT, GMT_i_OPT, GMT_o_OPT, GMT_r_OPT, GMT_x_OPT);
 
        if (level == GMT_SYNOPSIS) return (GMT_MODULE_SYNOPSIS);
 
@@ -749,15 +749,44 @@ int GMT_talwani3d (void *V_API, int mode, void *args) {
                Return (API->error);
        }
 
-       /* Set up cake slice array and pointers */
+       if (Ctrl->Z.mode == 1) {        /* Got grid with observation levels 
which also sets output locations; it could also set -fg so do this first */
+               if ((G = GMT_Read_Data (API, GMT_IS_GRID, GMT_IS_FILE, 
GMT_IS_SURFACE, GMT_GRID_ALL, NULL, Ctrl->Z.file, NULL)) == NULL)
+                       Return (API->error);
+       }
+       else if (GMT->common.R.active) {        /* Gave -R -I [-r] and possibly 
-fg indirectly via geographic coordinates in -R */
+               if ((G = GMT_Create_Data (API, GMT_IS_GRID, GMT_IS_SURFACE, 
GMT_GRID_ALL, NULL, NULL, Ctrl->I.inc,
+                       GMT_GRID_DEFAULT_REG, GMT_NOTSET, NULL)) == NULL)
+                       Return (API->error);
+       }
+       else {  /* Got a dataset with output locations via -N */
+               gmt_disable_i_opt (GMT);        /* Do not want any -i to affect 
the reading from the -N file */
+               if ((D = GMT_Read_Data (API, GMT_IS_DATASET, GMT_IS_FILE, 
GMT_IS_POINT, GMT_READ_NORMAL, NULL, Ctrl->N.file, NULL)) == NULL)
+                       Return (API->error);
+               if (D->n_columns < 2) {
+                       GMT_Report (API, GMT_MSG_NORMAL, "Input file %s has %d 
column(s) but at least 2 are needed\n", Ctrl->N.file, (int)D->n_columns);
+                       Return (GMT_DIM_TOO_SMALL);
+               }
+               gmt_reenable_i_opt (GMT);       /* Recover settings provided by 
user (if -i was used at all) */
+       }
        
-       n_alloc1 = GMT_CHUNK;
-       cake = gmt_M_memory (GMT, NULL, n_alloc1, struct CAKE);
+       flat_earth = gmt_M_is_geographic (GMT, GMT_IN);         /* If true then 
input is in degrees and we must convert to km later on */
+       
+       if (flat_earth && Ctrl->M.active[TALWANI3D_HOR]) {
+               GMT_Report (API, GMT_MSG_NORMAL, "Error -M: Cannot specify both 
geographic coordinates (degrees) AND -Mh\n");
+               Return (GMT_RUNTIME_ERROR);
+       }
+       
+       if (Ctrl->A.active) Ctrl->Z.level = -Ctrl->Z.level;
        
        /* Read polygon information from multiple segment file */
        GMT_Report (API, GMT_MSG_VERBOSE, "All x/y-values are assumed to be 
given in %s\n", uname[Ctrl->M.active[TALWANI3D_HOR]]);
        GMT_Report (API, GMT_MSG_VERBOSE, "All z-values are assumed to be given 
in %s\n",   uname[Ctrl->M.active[TALWANI3D_VER]]);
        
+       /* Set up cake slice array and pointers */
+       
+       n_alloc1 = GMT_CHUNK;
+       cake = gmt_M_memory (GMT, NULL, n_alloc1, struct CAKE);
+
        /* Read the sliced model */
        do {    /* Keep returning records until we reach EOF */
                if ((in = GMT_Get_Record (API, GMT_READ_DATA, NULL)) == NULL) { 
/* Read next record, get NULL if special case */
@@ -865,6 +894,7 @@ int GMT_talwani3d (void *V_API, int mode, void *args) {
                gmt_M_free (GMT, cake);
                Return (GMT_RUNTIME_ERROR);
        }
+
        /* Finish allocation and sort on layers */
        
        cake = gmt_M_memory (GMT, cake, ndepths, struct CAKE);
@@ -872,40 +902,10 @@ int GMT_talwani3d (void *V_API, int mode, void *args) {
 
        if (n_duplicate) GMT_Report (API, GMT_MSG_VERBOSE, "Ignored %u 
duplicate vertices\n", n_duplicate);
 
-       if (Ctrl->Z.mode == 1) {        /* Got grid with observation levels 
which also sets output locations */
-               if ((G = GMT_Read_Data (API, GMT_IS_GRID, GMT_IS_FILE, 
GMT_IS_SURFACE, GMT_GRID_ALL, NULL, Ctrl->Z.file, NULL)) == NULL) {
-                       gmt_M_free (GMT, cake);
-                       Return (API->error);
-               }
-       }
-       else if (GMT->common.R.active) {        /* Gave -R -I [-r] */
-               if ((G = GMT_Create_Data (API, GMT_IS_GRID, GMT_IS_SURFACE, 
GMT_GRID_ALL, NULL, NULL, Ctrl->I.inc,
-                       GMT_GRID_DEFAULT_REG, GMT_NOTSET, NULL)) == NULL) {
-                       gmt_M_free (GMT, cake);
-                       Return (API->error);
-               }
-       }
-       else {  /* Got a dataset with output locations via -N */
-               gmt_disable_i_opt (GMT);        /* Do not want any -i to affect 
the reading from -C,-F,-L files */
-               if ((D = GMT_Read_Data (API, GMT_IS_DATASET, GMT_IS_FILE, 
GMT_IS_POINT, GMT_READ_NORMAL, NULL, Ctrl->N.file, NULL)) == NULL) {
-                       gmt_M_free (GMT, cake);
-                       Return (API->error);
-               }
-               if (D->n_columns < 2) {
-                       GMT_Report (API, GMT_MSG_NORMAL, "Input file %s has %d 
column(s) but at least 2 are needed\n", Ctrl->N.file, (int)D->n_columns);
-                       Return (GMT_DIM_TOO_SMALL);
-               }
-               gmt_reenable_i_opt (GMT);       /* Recover settings provided by 
user (if -i was used at all) */
-       }
-       
-       flat_earth = gmt_M_is_geographic (GMT, GMT_IN);
-       
-       if (Ctrl->A.active) Ctrl->Z.level = -Ctrl->Z.level;
-       
        /* Now we can write (if -V) to the screen the user's polygon model 
characteristics. */
        
        GMT_Report (API, GMT_MSG_VERBOSE, "# of depths: %d\n", ndepths);
-       if (gmt_M_is_verbose (GMT, GMT_MSG_LONG_VERBOSE)) {
+       if (gmt_M_is_verbose (GMT, GMT_MSG_LONG_VERBOSE)) {     /* Give a 
listing of layers found */
                for (k = 0; k < ndepths; k++) {
                        for (sl = cake[k].first_slice; sl; sl = sl->next)
                                GMT_Report (API, GMT_MSG_LONG_VERBOSE, "Depth: 
%lg Rho: %lg N-vertx: %4d\n",
@@ -919,7 +919,7 @@ int GMT_talwani3d (void *V_API, int mode, void *args) {
        for (k = 0; k < ndepths; k++) depths[k] = cake[k].depth;        /* Used 
by the parabolic integrator */
        if (Ctrl->N.active) {   /* Single loop over specified output locations 
*/
                unsigned int wmode = GMT_ADD_DEFAULT;
-               double scl = (!(flat_earth || Ctrl->M.active[TALWANI3D_HOR])) ? 
METERS_IN_A_MILE : 1.0; /* Perhaps convert to km */
+               double scl = (!(flat_earth || Ctrl->M.active[TALWANI3D_HOR])) ? 
(1.0 / METERS_IN_A_KM) : 1.0;   /* Perhaps convert to km */
                double out[4];
                /* Must register Ctrl->G.file first since we are going to 
writing rec-by-rec */
                if (Ctrl->G.active) {
@@ -959,7 +959,7 @@ int GMT_talwani3d (void *V_API, int mode, void *args) {
                                 * with OpenMP due to race condiations that 
would mess up the output order */
                                for (row = 0; row < (int64_t)S->n_rows; row++) 
{        /* Calculate attraction at all output locations for this segment */
                                        z_level = (S->n_columns == 3 && 
!Ctrl->Z.active) ? S->data[GMT_Z][row] : Ctrl->Z.level; /* Default observation 
z level unless provided in input file */
-                                       GMT->hidden.mem_coord[GMT_X][row] = 
get_one_output3D (S->data[GMT_X][row]/ scl, S->data[GMT_Y][row]/ scl, z_level, 
cake, depths, ndepths, Ctrl->F.mode, flat_earth);
+                                       GMT->hidden.mem_coord[GMT_X][row] = 
get_one_output3D (S->data[GMT_X][row] * scl, S->data[GMT_Y][row] * scl, 
z_level, cake, depths, ndepths, Ctrl->F.mode, flat_earth);
                                }
                                /* This loop is not under OpenMP */
                                out[GMT_Z] = Ctrl->Z.level;     /* Default 
observation z level unless provided in input file */
diff --git a/src/psclip.c b/src/psclip.c
index 3e93465..e856a49 100644
--- a/src/psclip.c
+++ b/src/psclip.c
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------
- *     $Id: psclip.c 17449 2017-01-16 21:27:04Z pwessel $
+ *     $Id: psclip.c 17618 2017-03-05 22:58:12Z pwessel $
  *
  *     Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. 
Luis and F. Wobbe
  *     See LICENSE.TXT file for copying and redistribution conditions.
@@ -283,7 +283,7 @@ int GMT_psclip (void *V_API, int mode, void *args) {
                                                        Return 
(GMT_RUNTIME_ERROR);
                                                }
                                                S->n_rows = n_new;
-                                               gmt_set_seg_minmax (GMT, 
D->geometry, S);       /* Update min/max */
+                                               gmt_set_seg_minmax (GMT, 
D->geometry, 2, S);    /* Update min/max of x/y only */
                                                GMT_Report (API, GMT_MSG_DEBUG, 
"Resample polygon, now has %d points\n", S->n_rows);
                                        }
 
diff --git a/src/pscoast.c b/src/pscoast.c
index 5aa4432..e2fe2eb 100644
--- a/src/pscoast.c
+++ b/src/pscoast.c
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------
- *     $Id: pscoast.c 17560 2017-02-17 22:05:42Z pwessel $
+ *     $Id: pscoast.c 17630 2017-03-07 20:45:58Z pwessel $
  *
  *     Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. 
Luis and F. Wobbe
  *     See LICENSE.TXT file for copying and redistribution conditions.
@@ -497,6 +497,9 @@ GMT_LOCAL int parse (struct GMT_CTRL *GMT, struct 
PSCOAST_CTRL *Ctrl, struct GMT
                }
        }
 
+       /* If no -E modes were selected then we default to dump provided -M was 
given */
+       if (Ctrl->E.info.mode == 0 && Ctrl->M.active) Ctrl->E.info.mode = 
GMT_DCW_DUMP;
+       
        if (gmt_DCW_list (GMT, Ctrl->E.info.mode)) return 1;
 
        if (Ctrl->C.active && !(Ctrl->G.active || Ctrl->S.active || 
Ctrl->W.active)) {  /* Just lakes, fix -A */
diff --git a/src/psimage.c b/src/psimage.c
index 4f02bf9..6de810e 100644
--- a/src/psimage.c
+++ b/src/psimage.c
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------
- *     $Id: psimage.c 17460 2017-01-22 22:55:48Z pwessel $
+ *     $Id: psimage.c 17733 2017-03-20 20:03:03Z pwessel $
  *
  *     Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. 
Luis and F. Wobbe
  *     See LICENSE.TXT file for copying and redistribution conditions.
@@ -163,7 +163,7 @@ GMT_LOCAL int parse (struct GMT_CTRL *GMT, struct 
PSIMAGE_CTRL *Ctrl, struct GMT
                        case 'D':
                                Ctrl->D.active = true;
                                p = (string[0]) ? string : opt->arg;    /* If 
-C was used the string is set */
-                               if ((Ctrl->D.refpoint = gmt_get_refpoint (GMT, 
p)) == NULL) {   /* Failed basic parsing */
+                               if ((Ctrl->D.refpoint = gmt_get_refpoint (GMT, 
p, 'D')) == NULL) {      /* Failed basic parsing */
                                        GMT_Report (GMT->parent, 
GMT_MSG_NORMAL, "Syntax error -D: Basic parsing of reference point in %s 
failed\n", opt->arg);
                                        p_fail = true;
                                        n_errors++;
@@ -283,7 +283,7 @@ GMT_LOCAL int parse (struct GMT_CTRL *GMT, struct 
PSIMAGE_CTRL *Ctrl, struct GMT
        if (Ctrl->G.b_rgb[0] == -2) { Ctrl->G.b_rgb[0] = Ctrl->G.b_rgb[1] = 
Ctrl->G.b_rgb[2] = 1.0; }
 
        if (!Ctrl->D.active) {  /* Old syntax without reference point implies 
-Dx0/0 */
-               Ctrl->D.refpoint = gmt_get_refpoint (GMT, "x0/0");      /* 
Default if no -D given */
+               Ctrl->D.refpoint = gmt_get_refpoint (GMT, "x0/0", 'D'); /* 
Default if no -D given */
                Ctrl->D.active = true;
        }
        /* Check that the options selected are mutually consistent */
diff --git a/src/pslegend.c b/src/pslegend.c
index 98f9585..4f91a80 100644
--- a/src/pslegend.c
+++ b/src/pslegend.c
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------
- *     $Id: pslegend.c 17449 2017-01-16 21:27:04Z pwessel $
+ *     $Id: pslegend.c 17733 2017-03-20 20:03:03Z pwessel $
  *
  *     Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. 
Luis and F. Wobbe
  *     See LICENSE.TXT file for copying and redistribution conditions.
@@ -135,7 +135,7 @@ GMT_LOCAL int parse (struct GMT_CTRL *GMT, struct 
PSLEGEND_CTRL *Ctrl, struct GM
                        case 'D':       /* Sets position and size of legend */
                                Ctrl->D.active = true;
                                if (strstr (opt->arg, "+w")) {  /* New syntax:  
*/
-                                       if ((Ctrl->D.refpoint = 
gmt_get_refpoint (GMT, opt->arg)) == NULL) {
+                                       if ((Ctrl->D.refpoint = 
gmt_get_refpoint (GMT, opt->arg, 'D')) == NULL) {
                                                n_errors++;     /* Failed basic 
parsing */
                                                break;
                                        }
@@ -323,7 +323,8 @@ int GMT_pslegend (void *V_API, int mode, void *args) {
        /* High-level function that implements the pslegend task */
        unsigned int tbl, pos;
        int i, justify = 0, n = 0, n_columns = 1, n_col, col, error = 0, 
column_number = 0, id, n_scan, status = 0;
-       bool flush_paragraph = false, v_line_draw_now = false, gave_label, 
gave_mapscale_options, did_old = false, drawn = false;
+       bool flush_paragraph = false, v_line_draw_now = false, gave_label, 
gave_mapscale_options, did_old = false;
+       bool drawn = false, b_cpt = false;
        uint64_t seg, row, n_fronts = 0, n_quoted_lines = 0;
        size_t n_char = 0;
        char txt_a[GMT_LEN256] = {""}, txt_b[GMT_LEN256] = {""}, 
txt_c[GMT_LEN256] = {""}, txt_d[GMT_LEN256] = {""};
@@ -435,6 +436,7 @@ int GMT_pslegend (void *V_API, int mode, void *args) {
                                                if ((c = strchr (bar_height, 
'+')) != NULL) c[0] = 0;   /* Chop off any modifiers so we can compute the 
height */
                                                height += gmt_M_to_inch (GMT, 
bar_height) + GMT->current.setting.map_tick_length[0] + 
GMT->current.setting.map_annot_offset[0] + FONT_HEIGHT_PRIMARY * 
GMT->current.setting.font_annot[GMT_PRIMARY].size / PSL_POINTS_PER_INCH;
                                                column_number = 0;
+                                               if (strstr (&line[2], "-B")) 
b_cpt = true;      /* Passed -B options with the bar presecription */
                                                break;
 
                                        case 'A':       /* Color change, no 
height implication */
@@ -608,6 +610,12 @@ int GMT_pslegend (void *V_API, int mode, void *args) {
        if ((PSL = gmt_plotinit (GMT, options)) == NULL) Return 
(GMT_RUNTIME_ERROR);
        gmt_plane_perspective (GMT, GMT->current.proj.z_project.view_plane, 
GMT->current.proj.z_level);
 
+       gmt_plotcanvas (GMT);   /* Fill canvas if requested */
+       gmt_map_basemap (GMT);  /* Plot basemap if requested */
+
+       if (GMT->current.map.frame.draw && b_cpt)       /* Two conflicting -B 
settings, reset main -B since we just finished the frame */
+               gmt_M_memset (&(GMT->current.map.frame), 1, struct 
GMT_PLOT_FRAME);
+
        /* Must reset any -X -Y to 0 so they are not used further in the 
GMT_modules we call below */
        gmt_M_memset (GMT->current.setting.map_origin, 2, double);
 
@@ -1407,7 +1415,6 @@ int GMT_pslegend (void *V_API, int mode, void *args) {
        PSL_setorigin (PSL, -x_orig, -y_orig, 0.0, PSL_INV);    /* Reset */
        Ctrl->D.refpoint->x = x_orig;   Ctrl->D.refpoint->y = y_orig;
 
-       gmt_map_basemap (GMT);
        gmt_plotend (GMT);
 
        for (id = 0; id < N_DAT; id++) {
diff --git a/src/psrose.c b/src/psrose.c
index 88cc3d9..2afacc2 100644
--- a/src/psrose.c
+++ b/src/psrose.c
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------
- *     $Id: psrose.c 17560 2017-02-17 22:05:42Z pwessel $
+ *     $Id: psrose.c 17716 2017-03-18 22:13:17Z pwessel $
  *
  *     Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. 
Luis and F. Wobbe
  *     See LICENSE.TXT file for copying and redistribution conditions.
@@ -652,6 +652,8 @@ int GMT_psrose (void *V_API, int mode, void *args) {
        diameter = 2.0 * Ctrl->S.scale;
        PSL_setorigin (PSL, x_origin, y_origin, 0.0, PSL_FWD);
        gmt_plane_perspective (GMT, GMT->current.proj.z_project.view_plane, 
GMT->current.proj.z_level);
+       gmt_plotcanvas (GMT);   /* Fill canvas if requested */
+
        if (!Ctrl->S.normalize) Ctrl->S.scale /= max_radius;
 
        if (do_fill) {  /* Until psrose uses a polar projection we must bypass 
the basemap fill and do it ourself here */
diff --git a/src/psscale.c b/src/psscale.c
index 8215c9a..1f9b7db 100644
--- a/src/psscale.c
+++ b/src/psscale.c
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------
- *     $Id: psscale.c 17582 2017-02-23 21:04:54Z pwessel $
+ *     $Id: psscale.c 17733 2017-03-20 20:03:03Z pwessel $
  *
  *     Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. 
Luis and F. Wobbe
  *     See LICENSE.TXT file for copying and redistribution conditions.
@@ -252,7 +252,7 @@ GMT_LOCAL int parse (struct GMT_CTRL *GMT, struct 
PSSCALE_CTRL *Ctrl, struct GMT
                                break;
                        case 'D':
                                Ctrl->D.active = true;
-                               if ((Ctrl->D.refpoint = gmt_get_refpoint (GMT, 
opt->arg)) == NULL)
+                               if ((Ctrl->D.refpoint = gmt_get_refpoint (GMT, 
opt->arg, 'D')) == NULL)
                                        n_errors++;     /* Failed basic parsing 
*/
                                else if (strstr (Ctrl->D.refpoint->args, "+w")) 
{       /* New syntax: */
                                        /* Args are 
+w<length>/<width>[+e[b|f][<length>]][+h][+j<justify>][+ma|c|l|u][+n[<txt>]][+o<dx>[/<dy>]]
 */
diff --git a/src/pssolar.c b/src/pssolar.c
index d303e60..9de2217 100644
--- a/src/pssolar.c
+++ b/src/pssolar.c
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------
- *     $Id: pssolar.c 17560 2017-02-17 22:05:42Z pwessel $
+ *     $Id: pssolar.c 17716 2017-03-18 22:13:17Z pwessel $
  *
  *     Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. 
Luis and F. Wobbe
  *     See LICENSE.TXT file for copying and redistribution conditions.
@@ -541,6 +541,7 @@ int GMT_pssolar (void *V_API, int mode, void *args) {
                }
                if ((PSL = gmt_plotinit (GMT, options)) == NULL) Return 
(GMT_RUNTIME_ERROR);
                gmt_plane_perspective (GMT, 
GMT->current.proj.z_project.view_plane, GMT->current.proj.z_level);
+               gmt_plotcanvas (GMT);   /* Fill canvas if requested */
                if (Ctrl->N.active) gmt_map_clip_on (GMT, GMT->session.no_rgb, 
1);      /* Must clip map */
 
                for (n = 0; n < 4; n++) {       /* Loop over the number of 
requested terminators */
diff --git a/src/psxy.c b/src/psxy.c
index 3374c48..7cddc25 100644
--- a/src/psxy.c
+++ b/src/psxy.c
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------
- *     $Id: psxy.c 17560 2017-02-17 22:05:42Z pwessel $
+ *     $Id: psxy.c 17739 2017-03-21 06:25:59Z pwessel $
  *
  *     Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. 
Luis and F. Wobbe
  *     See LICENSE.TXT file for copying and redistribution conditions.
@@ -726,7 +726,8 @@ GMT_LOCAL int parse (struct GMT_CTRL *GMT, struct PSXY_CTRL 
*Ctrl, struct GMT_OP
 
        n_errors += gmt_M_check_condition (GMT, Ctrl->S.active && 
gmt_parse_symbol_option (GMT, Ctrl->S.arg, S, 0, true), "Syntax error -S 
option\n");
        n_errors += gmt_M_check_condition (GMT, Ctrl->E.active && (S->symbol == 
GMT_SYMBOL_VECTOR || S->symbol == GMT_SYMBOL_GEOVECTOR || S->symbol == 
GMT_SYMBOL_MARC \
-               || S->symbol == GMT_SYMBOL_ELLIPSE || S->symbol == 
GMT_SYMBOL_FRONT || S->symbol == GMT_SYMBOL_QUOTED_LINE || S->symbol == 
GMT_SYMBOL_DECORATED_LINE || S->symbol == GMT_SYMBOL_ROTRECT), "Syntax error -E 
option: Incompatible with -Se, -Sf, -Sj, -Sm|M, -Sq, -Sv|V, -S=\n");
+               || S->symbol == GMT_SYMBOL_ELLIPSE || S->symbol == 
GMT_SYMBOL_FRONT || S->symbol == GMT_SYMBOL_QUOTED_LINE || S->symbol == 
GMT_SYMBOL_DECORATED_LINE \
+               || S->symbol == GMT_SYMBOL_ROTRECT), "Syntax error -E option: 
Incompatible with -Se, -Sf, -Sj, -Sm|M, -Sq, -Sv|V, -S=\n");
        n_errors += gmt_M_check_condition (GMT, !GMT->common.R.active, "Syntax 
error: Must specify -R option\n");
        n_errors += gmt_M_check_condition (GMT, !GMT->common.J.active, "Syntax 
error: Must specify a map projection with the -J option\n");
        n_errors += gmt_M_check_condition (GMT, GMT->common.b.active[GMT_IN] && 
S->symbol == GMT_SYMBOL_NOT_SET, "Syntax error: Binary input data cannot have 
symbol information\n");
@@ -929,7 +930,7 @@ int GMT_psxy (void *V_API, int mode, void *args) {
                GMT->current.io.col_type[GMT_IN][pos2y] = GMT_IS_FLOAT; /* Just 
the users dy component, not length */
        if (S.symbol == GMT_SYMBOL_VECTOR || S.symbol == GMT_SYMBOL_GEOVECTOR 
|| S.symbol == GMT_SYMBOL_MARC ) {        /* One of the vector symbols */
                geovector = (S.symbol == GMT_SYMBOL_GEOVECTOR);
-               if ((S.v.status & GMT_VEC_FILL) == 0) Ctrl->G.active = false;   
/* Want no fill so override -G*/
+               if ((S.v.status & GMT_VEC_FILL) == 0) Ctrl->G.active = false;   
/* Want no fill so override -G */
                if (S.v.status & GMT_VEC_FILL) S.v.fill = current_fill;         
/* Override -G<fill> (if set) with specified head fill */
        }
        bcol = (S.read_size) ? ex2 : ex1;
@@ -1034,7 +1035,9 @@ int GMT_psxy (void *V_API, int mode, void *args) {
 
                                /* First establish the symbol type given at the 
end of the record */
                                gmt_chop (text_rec);    /* Get rid of \n \r */
-                               i = (unsigned int)strlen (text_rec) - 1;
+                               i = (unsigned int)strlen (text_rec);
+                               if (i == 0) continue;   /* A blank line snuck 
through */
+                               i--;
                                while (text_rec[i] && !strchr (" \t", 
(int)text_rec[i])) i--;
                                if (S.read_symbol_cmd == 1) 
gmt_parse_symbol_option (GMT, &text_rec[i+1], &S, 0, false);
                                for (j = n_cols_start; j < 6; j++) 
GMT->current.io.col_type[GMT_IN][j] = GMT_IS_DIMENSION;              /* Since 
these may have units appended */
@@ -1352,7 +1355,8 @@ int GMT_psxy (void *V_API, int mode, void *args) {
                                                        x_2 -= dx;              
y_2 -= dy;
                                                }
                                        }
-                                       if (S.v.parsed_v4 && gmt_M_compat_check 
(GMT, 4)) {     /* Got v_width directly from V4 syntax so no messing with it 
here if under compatibility */
+                                       if (S.v.parsed_v4) {    /* Got v_width 
directly from V4 syntax so no messing with it here if under compatibility */
+                                               /* Now plot the old GMT V4 
vector instead */
                                                /* But have to improvise as far 
as outline|fill goes... */
                                                if (outline_active) S.v.status 
|= PSL_VEC_OUTLINE;      /* Choosing to draw head outline */
                                                if (fill_active) S.v.status |= 
PSL_VEC_FILL;            /* Choosing to fill head */
@@ -1521,7 +1525,7 @@ int GMT_psxy (void *V_API, int mode, void *args) {
                                                        Return 
(GMT_RUNTIME_ERROR);
                                                }
                                                L->n_rows = n_new;
-                                               gmt_set_seg_minmax (GMT, 
D->geometry, L);       /* Update min/max */
+                                               gmt_set_seg_minmax (GMT, 
D->geometry, 2, L);    /* Update min/max of x/y only */
                                                resampled = true;       /* To 
avoid doing it twice */
                                        }
                                        if (gmt_trim_line (GMT, 
&L->data[GMT_X], &L->data[GMT_Y], &L->n_rows, &current_pen)) continue;  /* 
Trimmed away completely */
@@ -1602,7 +1606,7 @@ int GMT_psxy (void *V_API, int mode, void *args) {
                                                Return (GMT_RUNTIME_ERROR);
                                        }
                                        L->n_rows = n_new;
-                                       gmt_set_seg_minmax (GMT, D->geometry, 
L);       /* Update min/max */
+                                       gmt_set_seg_minmax (GMT, D->geometry, 
2, L);    /* Update min/max of x/y only */
                                }
 
                                if (polygon) {  /* Want a closed polygon (with 
or without fill and with or without outline) */
diff --git a/src/psxyz.c b/src/psxyz.c
index fe49ea4..8d27251 100644
--- a/src/psxyz.c
+++ b/src/psxyz.c
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------
- *     $Id: psxyz.c 17560 2017-02-17 22:05:42Z pwessel $
+ *     $Id: psxyz.c 17739 2017-03-21 06:25:59Z pwessel $
  *
  *     Copyright (c) 1991-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. 
Luis and F. Wobbe
  *     See LICENSE.TXT file for copying and redistribution conditions.
@@ -767,7 +767,9 @@ int GMT_psxyz (void *V_API, int mode, void *args) {
                                text_rec = (char *)record;
                                /* First establish the symbol type given at the 
end of the record */
                                gmt_chop (text_rec);    /* Get rid of \n \r */
-                               i = strlen (text_rec) - 1;
+                               i = (unsigned int)strlen (text_rec);
+                               if (i == 0) continue;   /* A blank line snuck 
through */
+                               i--;
                                while (text_rec[i] && !strchr (" \t", 
(int)text_rec[i])) i--;
                                gmt_parse_symbol_option (GMT, &text_rec[i+1], 
&S, 1, false);
                                for (j = n_cols_start; j < 7; j++) 
GMT->current.io.col_type[GMT_IN][j] = GMT_IS_DIMENSION;              /* Since 
these may have units appended */
diff --git a/src/sphdistance.c b/src/sphdistance.c
index 8486c15..9c7094e 100644
--- a/src/sphdistance.c
+++ b/src/sphdistance.c
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------
- *     $Id: sphdistance.c 17560 2017-02-17 22:05:42Z pwessel $
+ *     $Id: sphdistance.c 17618 2017-03-05 22:58:12Z pwessel $
  *
  *     Copyright (c) 2008-2017 by P. Wessel, W. H. F. Smith, R. Scharroo, J. 
Luis and F. Wobbe
  *     See LICENSE.TXT file for copying and redistribution conditions.
@@ -92,7 +92,7 @@ GMT_LOCAL void prepare_polygon (struct GMT_CTRL *GMT, struct 
GMT_DATASEGMENT *P)
        uint64_t row;
        double lon_sum = 0.0, lat_sum = 0.0, dlon;
 
-       gmt_set_seg_minmax (GMT, GMT_IS_POLY, P);       /* Set the domain of 
the segment */
+       gmt_set_seg_minmax (GMT, GMT_IS_POLY, 0, P);    /* Set the domain of 
the segment */
 
        /* Then loop over points to accumulate sums */
 
diff --git a/src/spotter/backtracker.c b/src/spotter/backtracker.c
index a19bfc7..8f9fb08 100644
--- a/src/spotter/backtracker.c
+++ b/src/spotter/backtracker.c
@@ -1,5 +1,5 @@
 /*--------------------------------------------------------------------
- *     $Id: backtracker.c 17560 2017-02-17 22:05:42Z pwessel $
+ *     $Id: backtracker.c 17641 2017-03-12 01:32:05Z pwessel $
  *
  *   Copyright (c) 1999-2017 by P. Wessel
  *
@@ -376,6 +376,7 @@ int GMT_backtracker (void *V_API, int mode, void *args) {
        int n_fields, error;            /* Misc. signed counters */
        int spotter_way = 0;            /* Either SPOTTER_FWD or SPOTTER_BACK */
        bool make_path = false;         /* true means create continuous path, 
false works on discrete points */
+       bool E_first = true;
 
 
        double *c = NULL;               /* Array of track chunks returned by 
libeuler routines */
@@ -454,6 +455,7 @@ int GMT_backtracker (void *V_API, int mode, void *args) {
        n_out = (Ctrl->S.active) ? 4 : 3;       /* Append smt id number as 4th 
column when individual files are requested */
        if (Ctrl->W.active) n_out = 5 + !(Ctrl->W.mode == 0);
        geometry = (make_path) ? GMT_IS_LINE : GMT_IS_POINT;
+       gmt_M_memset (out, 10, double);
 
        /* Specify input and output expected columns */
        if ((error = gmt_set_cols (GMT, GMT_IN, n_expected_fields)) != 
GMT_NOERROR) {
@@ -503,12 +505,18 @@ int GMT_backtracker (void *V_API, int mode, void *args) {
                /* Data record to process */
 
                if (Ctrl->E.rot.single) {       /* Simple reconstruction, then 
exit */
+                       if (E_first) {
+                               if ((error = gmt_set_cols (GMT, GMT_OUT, 
n_fields)) != GMT_NOERROR) {
+                                       Return (error);
+                               }
+                               E_first = false;
+                       }
                        in[GMT_Y] = gmt_lat_swap (GMT, in[GMT_Y], 
GMT_LATSWAP_G2O);     /* Convert to geocentric */
                        gmt_geo_to_cart (GMT, in[GMT_Y], in[GMT_X], x, true);   
        /* Get x-vector */
                        gmt_matrix_vect_mult (GMT, 3U, R, x, y);                
        /* Rotate the x-vector */
                        gmt_cart_to_geo (GMT, &out[GMT_Y], &out[GMT_X], y, 
true);       /* Recover lon lat representation; true to get degrees */
                        out[GMT_Y] = gmt_lat_swap (GMT, out[GMT_Y], 
GMT_LATSWAP_O2G);   /* Convert back to geodetic */
-                       gmt_M_memcpy (&out[GMT_Z], &in[GMT_Z], n_fields - 2, 
double);
+                       if (n_fields > 2) gmt_M_memcpy (&out[GMT_Z], 
&in[GMT_Z], n_fields - 2, double);
                        GMT_Put_Record (API, GMT_WRITE_DATA, out);
                        continue;
                }

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/pkg-grass/gmt.git

_______________________________________________
Pkg-grass-devel mailing list
Pkg-grass-devel@lists.alioth.debian.org
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel

Reply via email to