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

sebastic pushed a commit to branch master
in repository ncview.

commit c2bc40ba54a1aa90ed54fe790696308397fff49f
Author: Bas Couwenberg <sebas...@xs4all.nl>
Date:   Sat Apr 18 01:40:32 2015 +0200

    Imported Upstream version 2.1.1
---
 src/SciPlot.c                   |  65 +++---
 src/SciPlot.h                   |   2 +-
 src/SciPlotP.h                  |   2 +-
 src/do_print.orig.c             | 447 ----------------------------------------
 src/epic_time.c                 |   5 +-
 src/file_netcdf.c               |  77 ++++---
 src/handle_rc_file.c            |  29 ++-
 src/interface/cbar.c            |   6 +-
 src/interface/colormap_funcs.c  |   8 +-
 src/interface/display_info.c    |   2 +-
 src/interface/filesel.c         |   6 +-
 src/interface/plot_range.c      |   4 +-
 src/interface/plot_xy.c         |   8 +-
 src/interface/printer_options.c |  10 +-
 src/interface/range.c           |  14 +-
 src/interface/set_options.c     |  52 +++--
 src/interface/x_interface.c     |  52 ++---
 src/ncview.c                    |  51 +++--
 src/ncview.defines.h            |   8 +-
 src/ncview.protos.h             |  10 +-
 src/overlay.c                   |   8 +-
 src/overlay.orig.c              | 441 ---------------------------------------
 src/udu.c                       |  16 +-
 src/utCalendar2_cal.c           |   9 +-
 src/util.c                      |  26 +--
 src/view.c                      |  27 ++-
 26 files changed, 298 insertions(+), 1087 deletions(-)

diff --git a/src/SciPlot.c b/src/SciPlot.c
index 3b0f4b4..719ef83 100644
--- a/src/SciPlot.c
+++ b/src/SciPlot.c
@@ -188,10 +188,10 @@ SciPlotClassRec sciplotClassRec = {
 WidgetClass sciplotWidgetClass = (WidgetClass)&sciplotClassRec;
 
 void
-get_number_format( char *numberformat, int precision, real val )
+get_number_format( char *numberformat, size_t nflen, int precision, real val )
 {
        /*sprintf(numberformat,"%%.%df",precision);*/
-       sprintf(numberformat,"%%%dg",precision);
+       snprintf(numberformat,nflen,"%%%dg",precision);
 }
 
 int
@@ -536,29 +536,30 @@ SciPlotFontDesc *pfd;
                                temp );
                        exit(-1);
                        }
-               sprintf(str,"/%s findfont %d scalefont",
+               snprintf(str, str_len, "/%s findfont %d scalefont",
                        temp,
                        (flag&XtFONT_SIZE_MASK));
        }
-       else sprintf(str,"/Courier findfond 10 scalefont");
+       else snprintf(str,str_len,"/Courier findfond 10 scalefont");
 }
 
 static void
-FontX11String(flag,str)
+FontX11String(flag,str,slen)
 int flag;
 char *str;
+int slen;
 {
 SciPlotFontDesc *pfd;
 
        pfd=FontDescLookup(flag);
        if (pfd) {
-               sprintf(str,"-*-%s-%s-%s-*-*-%d-*-*-*-*-*-*-*",
+               snprintf(str,slen,"-*-%s-%s-%s-*-*-%d-*-*-*-*-*-*-*",
                        pfd->X11,
                        (flag&XtFONT_BOLD?"bold":"medium"),
                        (flag&XtFONT_ITALIC?(pfd->PSUsesOblique?"o":"i"):"r"),
                        (flag&XtFONT_SIZE_MASK));
        }
-       else sprintf(str,"fixed");
+       else snprintf(str,slen,"fixed");
 #ifdef DEBUG_SCIPLOT
        printf("font string=%s\n",str);
 #endif
@@ -572,7 +573,7 @@ SciPlotFont *pf;
 char str[256],**list;
 int num;
 
-       FontX11String(pf->id,str);
+       FontX11String(pf->id,str,256);
        list=XListFonts(XtDisplay(w),str,100,&num);
 #ifdef DEBUG_SCIPLOT
        if (1) {
@@ -587,7 +588,7 @@ int num;
        if (num<=0) {
                pf->id&=~XtFONT_ATTRIBUTE_MASK;
                pf->id|=XtFONT_ATTRIBUTE_DEFAULT;
-               FontX11String(pf->id,str);
+               FontX11String(pf->id,str,256);
                list=XListFonts(XtDisplay(w),str,100,&num);
 #ifdef DEBUG_SCIPLOT
        if (1) {
@@ -603,7 +604,7 @@ int num;
        if (num<=0) {
                pf->id&=~XtFONT_NAME_MASK;
                pf->id|=XtFONT_NAME_DEFAULT;
-               FontX11String(pf->id,str);
+               FontX11String(pf->id,str,256);
                list=XListFonts(XtDisplay(w),str,100,&num);
 #ifdef DEBUG_SCIPLOT
        if (1) {
@@ -619,7 +620,7 @@ int num;
        if (num<=0) {
                pf->id&=~XtFONT_SIZE_MASK;
                pf->id|=XtFONT_SIZE_DEFAULT;
-               FontX11String(pf->id,str);
+               FontX11String(pf->id,str,256);
                list=XListFonts(XtDisplay(w),str,100,&num);
 #ifdef DEBUG_SCIPLOT
        if (1) {
@@ -2330,8 +2331,8 @@ int precision;
                                w->plot.x.MajorInc)*w->plot.x.MajorInc;
                x=PlotX(w,val);
                val /= w->plot.x.Scalefact;
-               get_number_format( numberformat, precision, val );
-               sprintf(label,numberformat,val);
+               get_number_format( numberformat, 160, precision, val );
+               snprintf(label,160,numberformat,val);
                x+=FontnumTextWidth(w,w->plot.axisFont,label);
                if ((int)x>w->core.width) {
                        xextra=ceil(x-w->core.width+w->plot.Margin);
@@ -2349,8 +2350,8 @@ int precision;
                                w->plot.y.MajorInc*1.0001)*w->plot.y.MajorInc;
                y=PlotY(w,val);
                val /= w->plot.y.Scalefact;
-               get_number_format( numberformat, precision, val );
-               sprintf(label,numberformat,val);
+               get_number_format( numberformat, 160, precision, val );
+               snprintf(label,160,numberformat,val);
 #ifdef DEBUG_SCIPLOT
                printf("ylabel=%s\n",label);
 #endif
@@ -2363,8 +2364,8 @@ int precision;
        else {
                val=w->plot.PolarScale;
                PlotRTDegrees(w,val,0.0,&x,&y);
-               get_number_format( numberformat, w->plot.x.Precision, val );
-               sprintf(label,numberformat,val);
+               get_number_format( numberformat, 160, w->plot.x.Precision, val 
);
+               snprintf(label,160,numberformat,val);
                x+=FontnumTextWidth(w,w->plot.axisFont,label);
                if ((int)x>w->core.width) {
                        xextra=x-w->core.width+w->plot.Margin;
@@ -2708,11 +2709,11 @@ char numberformat[16],label[512],tlabel[512];
        if (w->plot.DrawMajorTics)
                LineSet(w,x,y1+5,x,y1-5,w->plot.ForegroundColor,XtLINE_SOLID);
 
-       get_number_format( numberformat, precision, val*w->plot.x.Scalefact );
+       get_number_format( numberformat, 16, precision, val*w->plot.x.Scalefact 
);
        if( w->plot.XFmtCallback != NULL )
-               (*(w->plot.XFmtCallback))((Widget)w,val,label);
+               (*(w->plot.XFmtCallback))((Widget)w,val,label,512);
        else
-               sprintf(label,numberformat,val*w->plot.x.Scalefact);
+               snprintf(label,512,numberformat,val*w->plot.x.Scalefact);
        TextSet(w,x,w->plot.y.AxisPos,label,w->plot.ForegroundColor,
                w->plot.axisFont);
        
@@ -2766,11 +2767,11 @@ char numberformat[16],label[512],tlabel[512];
                if (w->plot.DrawMajorTics)
                        LineSet(w,x,y1+5,x,y1-5,w->plot.ForegroundColor,
                                XtLINE_SOLID);
-               get_number_format( numberformat, precision, 
val*w->plot.x.Scalefact );
+               get_number_format( numberformat, 16, precision, 
val*w->plot.x.Scalefact );
                if( w->plot.XFmtCallback != NULL )
-                       (*(w->plot.XFmtCallback))((Widget)w,val,label);
+                       (*(w->plot.XFmtCallback))((Widget)w,val,label,512);
                else
-                       sprintf(label,numberformat,val*w->plot.x.Scalefact);
+                       
snprintf(label,512,numberformat,val*w->plot.x.Scalefact);
                TextSet(w,x,w->plot.y.AxisPos,label,w->plot.ForegroundColor,
                        w->plot.axisFont);
                majorval=val;
@@ -2788,8 +2789,8 @@ char numberformat[16],label[512],tlabel[512];
        if (w->plot.DrawMajorTics)
                LineSet(w,x1+5,y,x1-5,y,w->plot.ForegroundColor,XtLINE_SOLID);
 
-       get_number_format( numberformat, precision, val*w->plot.y.Scalefact );
-       sprintf(label,numberformat,val*w->plot.y.Scalefact);
+       get_number_format( numberformat, 16, precision, val*w->plot.y.Scalefact 
);
+       snprintf(label,512,numberformat,val*w->plot.y.Scalefact);
        VTextSet(w,w->plot.x.AxisPos,y,label,w->plot.ForegroundColor,
                w->plot.axisFont);
        
@@ -2846,8 +2847,8 @@ char numberformat[16],label[512],tlabel[512];
                if (w->plot.DrawMajorTics)
                        LineSet(w,x1-5,y,x1+5,y,w->plot.ForegroundColor,
                                XtLINE_SOLID);
-               get_number_format( numberformat, precision, 
val*w->plot.y.Scalefact );
-               sprintf(label,numberformat,val*w->plot.y.Scalefact);
+               get_number_format( numberformat, 16, precision, 
val*w->plot.y.Scalefact );
+               snprintf(label,512,numberformat,val*w->plot.y.Scalefact);
                VTextSet(w,w->plot.x.AxisPos,y,label,w->plot.ForegroundColor,
                        w->plot.axisFont);
                majorval=val;
@@ -2862,9 +2863,9 @@ char numberformat[16],label[512],tlabel[512];
                        w->plot.ForegroundColor,w->plot.labelFont);
        if (w->plot.ShowYLabel) {
                if( w->plot.y.Scale_expon == 0. ) 
-                       sprintf( tlabel, "%s", w->plot.ylabel );
+                       snprintf( tlabel, 512, "%s", w->plot.ylabel );
                else
-                       sprintf( tlabel, "%s/10**%d", w->plot.ylabel, 
-(w->plot.y.Scale_expon) );
+                       snprintf( tlabel, 512, "%s/10**%d", w->plot.ylabel, 
-(w->plot.y.Scale_expon) );
                VTextCenter(w,w->plot.x.LabelPos,
                        w->plot.y.Origin+(w->plot.y.Size/2.0),
                        tlabel,w->plot.ForegroundColor,
@@ -2978,8 +2979,8 @@ char numberformat[160],label[16];
                        
CircleSet(w,x1,y1,x2-x1,w->plot.ForegroundColor,XtLINE_DOTTED);
                if (w->plot.DrawMajorTics)
                        
LineSet(w,x2,y2-5.0,x2,y2+5.0,w->plot.ForegroundColor,XtLINE_SOLID);
-               get_number_format( numberformat, w->plot.x.Precision, tic );
-               sprintf(label,numberformat,tic);
+               get_number_format( numberformat, 160, w->plot.x.Precision, tic 
);
+               snprintf(label,16,numberformat,tic);
                
TextSet(w,x2,y2+height,label,w->plot.ForegroundColor,w->plot.axisFont);
        }
        if (w->plot.ShowTitle)
@@ -3446,7 +3447,7 @@ SciPlotWidget w;
 void
 SciPlotAddXAxisCallback(wi,cb)
 Widget wi;
-void (*cb)(Widget wi, float val, char *s);
+void (*cb)(Widget wi, float val, char *s, size_t slen);
 {
 SciPlotWidget w;
        if (!XtIsSciPlot(wi)) return;
diff --git a/src/SciPlot.h b/src/SciPlot.h
index 5fe5f05..fb023c8 100644
--- a/src/SciPlot.h
+++ b/src/SciPlot.h
@@ -159,7 +159,7 @@ void SciPlotQueryXAxisValues( Widget w, int *nvals, float 
**values);
 void SciPlotSetXAxisLabels(Widget wi,int nlabels, char **labels);
 float SciPlotScreenToDataX(Widget wi,int xscreen);
 float SciPlotScreenToDataY(Widget wi,int yscreen);
-void  SciPlotAddXAxisCallback(Widget wi, void (*cb)(Widget,float,char*) );
+void  SciPlotAddXAxisCallback(Widget wi, void (*cb)(Widget,float,char*,size_t) 
);
 
 #undef P_
 
diff --git a/src/SciPlotP.h b/src/SciPlotP.h
index 2d122e2..3f875f7 100644
--- a/src/SciPlotP.h
+++ b/src/SciPlotP.h
@@ -220,7 +220,7 @@ typedef struct {
        int             titleFont;
        int             labelFont;
        int             axisFont;
-       void            (*XFmtCallback)(Widget w, float f, char *s);
+       void            (*XFmtCallback)(Widget w, float f, char *s, size_t 
slen);
 
        GC              defaultGC;
        GC              dashGC;
diff --git a/src/do_print.orig.c b/src/do_print.orig.c
deleted file mode 100644
index 41eada3..0000000
--- a/src/do_print.orig.c
+++ /dev/null
@@ -1,447 +0,0 @@
-/*
- * Ncview by David W. Pierce.  A visual netCDF file viewer.
- * Copyright (C) 1993 through 2010 David W. Pierce
- *
- * This program  is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3 as 
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License, version 3, for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * David W. Pierce
- * 6259 Caminito Carrean
- * San Diego, CA   92122
- * pie...@cirrus.ucsd.edu
- */
-
-/*     define DEBUG */
-
-#include "ncview.includes.h"
-#include "ncview.defines.h"
-#include "ncview.protos.h"
-
-#define PAGE_WIDTH_INCHES      8.5
-#define PAGE_HEIGHT_INCHES     11.5
-#define PAGE_X_MARGIN          1.5     /* Inches */
-#define PAGE_UPPER_Y_MARGIN    2.0     /* Inches */
-#define PAGE_LOWER_Y_MARGIN    4.0     /* Inches */
-
-#define FONT_SIZE              11
-#define HEADER_FONT_SIZE       16
-#define FONT_NAME              "Helvetica"
-#define LEADING                        3
-
-#define DEFAULT_DEVICE         DEVICE_PRINTER
-#define        INCLUDE_OUTLINE         TRUE
-#define        INCLUDE_TITLE           TRUE
-#define        INCLUDE_AXIS_LABELS     TRUE
-#define        INCLUDE_EXTRA_INFO      TRUE
-#define        INCLUDE_ID              TRUE
-#define TEST_ONLY              FALSE
-
-#define        ID_FONT_SIZE_SCALE      0.7     /* How much smaller ID font 
size is than regular */
-
-extern View    *view;
-extern Options         options;
-
-static PrintOptions printopts;
-
-static void print_header( FILE *out_file, float scale, size_t x, size_t y, 
size_t top_of_image );
-static void calc_scale( float *scale, size_t x, size_t y );
-static void set_font( FILE *outf, char *name, int size );
-static void do_outline( FILE *f, size_t x, size_t y );
-static void print_other_info( FILE *out_file, float output_scale, size_t 
x_size, size_t y_size, 
-                       size_t center_x, size_t center_y, size_t top_of_image, 
size_t bot_of_image );
-
-/********************************************************************/
-
-       void
-print_init()
-{
-       printopts.page_width            = PAGE_WIDTH_INCHES; 
-       printopts.page_height           = PAGE_HEIGHT_INCHES;
-       printopts.page_x_margin         = PAGE_X_MARGIN;
-       printopts.page_upper_y_margin   = PAGE_UPPER_Y_MARGIN;
-       printopts.page_lower_y_margin   = PAGE_LOWER_Y_MARGIN;
-       printopts.ppi                   = 72.0;
-
-       printopts.leading               = LEADING;
-       printopts.font_size             = FONT_SIZE;
-       printopts.header_font_size      = HEADER_FONT_SIZE;
-
-       printopts.output_device         = DEFAULT_DEVICE;
-       printopts.include_outline       = INCLUDE_OUTLINE;
-       printopts.include_id            = INCLUDE_ID;
-       printopts.include_title         = INCLUDE_TITLE;
-       printopts.include_axis_labels   = INCLUDE_AXIS_LABELS;
-       printopts.include_extra_info    = INCLUDE_EXTRA_INFO;
-
-       printopts.test_only             = TEST_ONLY;
-
-       strcpy( printopts.font_name, FONT_NAME );
-
-       printer_options_init(); /* this initializes the X-windows interface
-                                  part of the pinter options panel */
-}
-
-/*************************************************************************/
-
-       void
-do_print()
-{
-       long    i, j;
-       size_t  x_size, y_size, scaled_x_size, scaled_y_size, top_of_image, 
bot_of_image, 
-               center_x, center_y, left_of_image, right_of_image;
-       char    outfname[1024], tstr[1500];
-       FILE    *outf;
-       float   output_scale;
-       int     r, g, b, n_print;
-       ncv_pixel pix;
-
-#ifdef DEBUG
-       fprintf( stderr, "entering do_print()\n" );
-#endif
-       x_size = *(view->variable->size + view->x_axis_id);
-       y_size = *(view->variable->size + view->y_axis_id);
-       view_get_scaled_size( options.blowup, x_size, y_size, &scaled_x_size, 
&scaled_y_size );
-
-       sprintf( printopts.out_file_name, "ncview.%s.ps", view->variable->name 
); 
-       if( printer_options( &printopts ) == MESSAGE_CANCEL )
-               return;
-       
-       if( printopts.output_device == DEVICE_PRINTER )
-               strcpy( printopts.out_file_name, tmpnam(NULL) );
-
-       if( warn_if_file_exits( printopts.out_file_name ) == MESSAGE_CANCEL )
-               return;
-
-       if( (outf = fopen(printopts.out_file_name, "w" )) == NULL ) {
-               sprintf( tstr, "Error opening file %s for output!\n",
-                       outfname );
-               in_error( tstr );
-               return;
-               }
-               
-       in_set_cursor_busy();
-       calc_scale( &output_scale, scaled_x_size, scaled_y_size );
-
-       /* These are all in absolute points in the default coordinate system */
-       top_of_image   = (size_t)(printopts.page_height*printopts.ppi -
-                               printopts.page_upper_y_margin*printopts.ppi);
-       bot_of_image   = top_of_image - 
(long)((float)scaled_y_size*output_scale);
-       left_of_image  = (size_t)(printopts.page_x_margin*printopts.ppi);
-       right_of_image = left_of_image + 
(long)((float)scaled_x_size*output_scale);
-       center_y       = (top_of_image + bot_of_image)/2;
-       center_x       = (size_t)(((float)left_of_image + 
(float)right_of_image)/2.0);
-
-       print_header( outf, output_scale, scaled_x_size, scaled_y_size, 
top_of_image );
-
-       /***** dump out the color image *****/
-       if( ! printopts.test_only ) {
-               view_draw( FALSE ); /* Don't allow saveframes -- force reload 
of image data */
-               n_print = 0;
-               for( j=0; j<scaled_y_size; j++ ) {
-                       for( i=0; i<scaled_x_size; i++ ) {
-                               pix = *(view->pixels + j*scaled_x_size + i);
-                               pix_to_rgb( pix, &r, &g, &b );
-                               fprintf( outf, "%02x%02x%02x", (r>>8), (g>>8), 
(b>>8)); 
-                               n_print += 6;
-                               if( n_print > 70 ) {
-                                       fprintf( outf, "\n" );
-                                       n_print = 0;
-                                       }
-                               }
-                       }
-               fprintf( outf, "\n\n" );
-               }
-       
-       /* Outline the color contour with lines */
-       if( printopts.include_outline ) 
-               do_outline( outf, scaled_x_size, scaled_y_size );
-
-       fprintf( outf, "\n\ngrestore\n" );
-
-       print_other_info( outf, output_scale, scaled_x_size, scaled_y_size, 
center_x, center_y, 
-                       top_of_image, bot_of_image );
-
-#ifdef DEBUG
-       fprintf( stderr, "exiting do_print()\n" );
-#endif
-}
-
-/*************************************************************************/
-
-       static void
-print_other_info( FILE *outf, float output_scale, size_t x_size, size_t 
y_size, 
-                       size_t center_x, size_t center_y, 
-                       size_t top_of_image, size_t bot_of_image )
-{
-       char    *units, *x_dim_name, *x_dim_longname,
-               *y_dim_name, *y_dim_longname, *x_units, *y_units,
-               tstr[1500], tstr2[1000], *main_long_name, *main_units,
-               *dim_name, *dim_longname;
-       FDBlist *fdb;
-       NCDim   *d;
-       int     i, type, has_bounds;
-       size_t  *actual_place;
-       time_t  sec_since_1970;
-       double  temp_double, bound_min, bound_max;
-
-#ifdef DEBUG
-       fprintf( stderr, "print_other_info: entering\n" );
-#endif
-       x_dim_name     = (*(view->variable->dim + view->x_axis_id))->name;
-       x_dim_longname = fi_dim_longname( view->variable->first_file->id, 
x_dim_name );
-       x_units        = fi_dim_units( view->variable->first_file->id, 
x_dim_name );
-
-       y_dim_name     = (*(view->variable->dim + view->y_axis_id))->name;
-       y_dim_longname = fi_dim_longname( view->variable->first_file->id, 
y_dim_name );
-       y_units        = fi_dim_units( view->variable->first_file->id, 
y_dim_name );
-
-       main_long_name = fi_long_var_name( view->variable->first_file->id, 
-                       view->variable->name );
-       if( main_long_name == NULL )
-               main_long_name = view->variable->name;
-       main_units     = fi_var_units( view->variable->first_file->id, 
view->variable->name );
-
-       /***** Main variable name and units ******/
-       if( printopts.include_title ) {
-               sprintf( tstr, "%s", main_long_name );
-               if( main_units != NULL ) {
-                       strcat( tstr, " (" );
-                       strcat( tstr, main_units );
-                       strcat( tstr, ")" );
-                       }
-
-               /* move to the center, then half the string's width */
-               set_font( outf, printopts.font_name, printopts.header_font_size 
);
-               fprintf( outf, "%ld %ld moveto\n", 
-                               center_x,
-                               top_of_image+printopts.font_size );
-               fprintf( outf, "(%s) stringwidth pop -0.5 mul 0 rmoveto\n", 
tstr );
-               fprintf( outf, "(%s) show\n", tstr );
-               }
-
-       /***** X axis title *****/
-       if( printopts.include_axis_labels ) {
-               set_font( outf, printopts.font_name, printopts.font_size );
-               strcpy( tstr, x_dim_longname );
-               if( x_units != NULL ) {
-                       strcat( tstr, " (" );
-                       strcat( tstr, x_units );
-                       strcat( tstr, ")" );
-                       }
-               fprintf( outf, "%ld %ld moveto\n", 
-                       center_x, 
bot_of_image-(long)(1.5*(float)printopts.font_size) );
-               fprintf( outf, "(%s) stringwidth pop -0.5 mul 0 rmoveto\n", 
tstr );
-               fprintf( outf, "(%s) show\n", tstr );
-
-               /***** Y axis title *****/
-               set_font( outf, printopts.font_name, printopts.font_size );
-               strcpy( tstr, y_dim_longname );
-               if( y_units != NULL ) {
-                       strcat( tstr, " (" );
-                       strcat( tstr, y_units );
-                       strcat( tstr, ")" );
-                       }
-               fprintf( outf, "%ld %ld moveto\n", 
-                       center_x - (long)((float)x_size*output_scale/2.0),
-                       center_y );
-               fprintf( outf, "gsave 90 rotate 0 %d rmoveto\n", 
-                               (int)((float)printopts.font_size*output_scale) 
);
-               fprintf( outf, "(%s) stringwidth pop -0.5 mul 0 rmoveto\n", 
tstr );
-               fprintf( outf, "(%s) show grestore\n", tstr );
-               }
-
-       /***************** Other information *******************/
-       if( printopts.include_extra_info ) {
-               set_font( outf, printopts.font_name, printopts.font_size );
-               fprintf( outf, "%ld %ld moveto\n", 
(long)(printopts.page_x_margin*printopts.ppi),
-                       bot_of_image - 4*printopts.font_size );
-
-               /**** File title ***/
-               if( fi_title( view->variable->first_file->id ) != NULL ) {
-                       fprintf( outf, "gsave (%s) show grestore\n", 
-                               fi_title( view->variable->first_file->id ) );
-                       fprintf( outf, "0 %d rmoveto\n", 
-                               -(printopts.leading+printopts.font_size) );
-                       }
-
-               /*** Range of data ***/
-               sprintf( tstr, "Range of %s: %g to %g %s", main_long_name, 
-                       view->variable->user_min, view->variable->user_max, 
main_units );
-               fprintf( outf, "gsave (%s) show grestore\n", tstr );
-               fprintf( outf, "0 %d rmoveto\n", 
-(printopts.leading+printopts.font_size) );
-
-               /*** Range of X axis ***/
-               d = *(view->variable->dim + view->x_axis_id);
-               if( x_units == NULL )
-                       sprintf( tstr, "Range of %s: %g to %g", 
-                               x_dim_longname, d->min, d->max);
-               else
-                       sprintf( tstr, "Range of %s: %g to %g %s", 
-                               x_dim_longname, d->min, d->max, x_units );
-               fprintf( outf, "gsave (%s) show grestore\n", tstr );
-               fprintf( outf, "0 %d rmoveto\n", 
-(printopts.leading+printopts.font_size) );
-
-               /*** Range of Y axis ***/
-               d = *(view->variable->dim + view->y_axis_id);
-               if( options.invert_physical ) 
-                       sprintf( tstr, "Range of %s: %g to %g", 
-                               y_dim_longname, d->max, d->min );
-               else
-                       sprintf( tstr, "Range of %s: %g to %g", 
-                               y_dim_longname, d->min, d->max );
-               if( y_units != NULL ) {
-                       strcat( tstr, " " );
-                       strcat( tstr, y_units );
-                       }
-               fprintf( outf, "gsave (%s) show grestore\n", tstr );
-               fprintf( outf, "0 %d rmoveto\n", 
-(printopts.leading+printopts.font_size) );
-
-               /*** Values of other dimensions ***/
-               for(i=0; i<view->variable->n_dims; i++)
-                       if( (i != view->x_axis_id) && 
-                           (i != view->y_axis_id) &&
-                           (*(view->variable->dim+i) != NULL)) {
-                               dim_name     = (*(view->variable->dim + 
i))->name;
-                               dim_longname = fi_dim_longname( 
view->variable->first_file->id, dim_name );
-                               units        = fi_dim_units( 
view->variable->first_file->id, dim_name );
-                               type         = fi_dim_value( view->variable, i, 
*(view->var_place+i),
-                                                       &temp_double, tstr2, 
&has_bounds, &bound_min, &bound_max );
-                               if( type == NC_DOUBLE )
-                                       sprintf( tstr, "Current %s: %lg", 
dim_longname, temp_double );
-                               else
-                                       sprintf( tstr, "Current %s: %s", 
dim_longname,
-                                               tstr2 );
-                               if( units != NULL ) {
-                                       strcat( tstr, " " );
-                                       strcat( tstr, units );
-                                       }
-                               fprintf( outf, "gsave (%s) show grestore\n", 
tstr );
-                               fprintf( outf, "0 %d rmoveto\n", 
-(printopts.leading+printopts.font_size) );
-                               }
-                       
-               /*** Name of file ***/
-               tstr[0] = '\0';
-               actual_place = (size_t *)malloc( sizeof(size_t)*20 );
-               virt_to_actual_place( view->variable, view->var_place, 
actual_place, &fdb );
-               if( (fi_recdim_id( view->variable->first_file->id ) != 
view->x_axis_id ) &&
-                   (fi_recdim_id( view->variable->first_file->id ) != 
view->y_axis_id)) 
-                       sprintf( tstr, "Frame %ld in ", 
-                               *(actual_place + view->scan_axis_id)+1 );
-               strcat( tstr, "File " );
-               strcat( tstr, fdb->filename );
-               fprintf( outf, "gsave (%s) show grestore\n", tstr );
-               fprintf( outf, "0 %ld rmoveto\n", 
-(printopts.leading+printopts.font_size) );
-               }
-
-       if( printopts.include_id ) {
-               sec_since_1970 = time(NULL);
-               sprintf( tstr, "%s %s", getlogin(), ctime(&sec_since_1970) );
-               /* Make the id font a bit smaller */
-               set_font( outf, printopts.font_name, 
-                               
(int)((float)printopts.font_size*ID_FONT_SIZE_SCALE) );
-               fprintf( outf, "gsave %ld %ld translate 0 0 moveto\n", 
-                       center_x + (long)((float)x_size*output_scale/2.0) 
-                                               + printopts.font_size + 
printopts.leading,
-                       bot_of_image );
-               fprintf( outf, "90 rotate (%s) show grestore\n", tstr );
-               }
-
-       /****** All done! *****/
-       fprintf( outf, "\n\nshowpage\n" );
-       fclose( outf );
-       if( printopts.output_device == DEVICE_PRINTER ) {
-               sprintf( tstr, "lpr %s\n", printopts.out_file_name );
-               system( tstr );
-               unlink( printopts.out_file_name );
-               }
-
-       fprintf( stdout, "" );
-       fflush( stdout );
-       in_set_cursor_normal();
-#ifdef DEBUG
-       fprintf( stderr, "print_other_info: exiting\n" );
-#endif
-}
-
-       static void
-set_font( FILE *outf, char *name, int size )
-{
-       fprintf( outf, "/%s findfont\n", name );
-       fprintf( outf, "%d scalefont setfont\n", size );
-}
-
-       static void
-calc_scale( float *scale, size_t x, size_t y )
-{
-       size_t  page_width, page_height;
-       float   scale_x, scale_y;
-
-       page_width = 
(printopts.page_width-2.0*printopts.page_x_margin)*printopts.ppi;
-       page_height =   (printopts.page_height -
-                          (printopts.page_upper_y_margin + 
printopts.page_lower_y_margin)
-                       )*printopts.ppi;
-
-       scale_x = page_width / (float)x;
-       scale_y = page_height / (float)y;
-
-       *scale = (scale_x < scale_y) ? scale_x : scale_y;
-}
-
-       static void
-do_outline( FILE *f, size_t x, size_t y )
-{
-       fprintf( f, "newpath\n" );
-       fprintf( f, "0 0 moveto\n" );
-       fprintf( f, "0 %d lineto\n", -y );
-       fprintf( f, "%d %d lineto\n", x, -y );
-       fprintf( f, "%d 0 lineto\n", x );
-       fprintf( f, "0 0 lineto\n" );
-       fprintf( f, "closepath stroke\n" );
-}
-
-       static void
-print_header( FILE *f, float scale, size_t x, size_t y, size_t top_of_image )
-{
-       fprintf( f, "%%!\n" );
-       fprintf( f, "/picstr %ld string def\n", x*3 );
-       fprintf( f, "gsave\n" );
-
-       /* This sets the position of the output image on the page */
-       fprintf( f, "%ld %ld translate\n", 
-                       (long)(printopts.page_x_margin*printopts.ppi), 
top_of_image );
-
-       /* This sets the size of the image */
-       fprintf( f, "%f %f scale\n", scale, scale );
-
-       if( printopts.test_only ) {
-               fprintf( f, "newpath\n" );
-               fprintf( f, "0 0 moveto\n" );
-               fprintf( f, "0 %d lineto\n", -y );
-               fprintf( f, "%d %d lineto\n", x, -y );
-               fprintf( f, "%d 0 lineto\n", x );
-               fprintf( f, "0 0 lineto\n" );
-               fprintf( f, "%d %d lineto\n", x, -y );
-               fprintf( f, "0 %d moveto\n", -y );
-               fprintf( f, "%d 0 lineto\n", x );
-               fprintf( f, "closepath stroke\n" );
-               }
-       else
-               {
-               fprintf( f, "%ld %ld 8\n", x, y );
-               fprintf( f, "[1 0 0 -1 0 1]\n" );
-               fprintf( f, "{currentfile picstr readhexstring pop}\n" );
-               fprintf( f, "false 3\n" );
-               fprintf( f, "colorimage\n\n" );
-               }
-}
-
diff --git a/src/epic_time.c b/src/epic_time.c
index 8aadb49..348fcec 100644
--- a/src/epic_time.c
+++ b/src/epic_time.c
@@ -82,7 +82,7 @@ epic_calc_tgran( int fileid, NCDim *d )
 
 /*************************************************************************/
        void
-epic_fmt_time( char *temp_string, double new_dimval, NCDim *dim )
+epic_fmt_time( char *temp_string, size_t temp_string_len, double new_dimval, 
NCDim *dim )
 {
        long    epic_time[2];
        int     mon, day, yr, hour, min;
@@ -95,7 +95,8 @@ epic_fmt_time( char *temp_string, double new_dimval, NCDim 
*dim )
        epic_time[1] = 0L;
        ep_time_to_mdyhms(epic_time, &mon, &day, &yr, &hour, &min, &sec);
 
-       sprintf( temp_string, "%1d-%s-%04d %02d:%02d", day, months[mon-1],
+       snprintf( temp_string, temp_string_len, "%1d-%s-%04d %02d:%02d", day, 
months[mon-1],
                yr, hour, min );
+       temp_string[ temp_string_len-1 ] = '\0';
 }
 
diff --git a/src/file_netcdf.c b/src/file_netcdf.c
index bf0b8d2..7b20ada 100644
--- a/src/file_netcdf.c
+++ b/src/file_netcdf.c
@@ -44,6 +44,22 @@ int netcdf_get_att_util( int id, int varid, char *var_name, 
char *att_name, int
 char *nc_type_to_string( nc_type type );
 
 
/*******************************************************************************************/
+void safe_strcat( char *dest, size_t dest_len, char *src )
+{
+       size_t  nfree;
+
+       if( strlen(dest) >= (dest_len-1) ) {
+               dest[ dest_len-1 ] = '\0';
+               return;
+               }
+
+       nfree = (dest_len-1) - strlen(dest);    /* Must be >= 1 */
+       strncat( dest, src, nfree );
+
+       dest[ dest_len-1 ] = '\0';
+}
+
+/*******************************************************************************************/
 int netcdf_fi_confirm( char *name )
 {
        int     ierr, fd;
@@ -837,7 +853,7 @@ nc_type netcdf_dim_value( int fileid, char *dim_name, 
size_t place,
                        char_place[0] = place;
                        do      {
                                char_place[1] = i;
-                               err = nc_get_var1_schar( fileid, dimvar_id, 
char_place, (ret_val_char+i));
+                               err = nc_get_var1_uchar( fileid, dimvar_id, 
char_place, (((unsigned char *)(ret_val_char))+i));
                                i++;
                                }
                        while
@@ -1378,10 +1394,11 @@ char *netcdf_att_string( int fileid, char *var_name )
        nc_type datatype, type;
        char    att_name[MAX_NC_NAME], dummy_var_name[MAX_NC_NAME];
        char    *data, *ret_string, line[2000];
-       size_t  len;
+       size_t  len, retval_len=10000;
 
-       ret_string    = (char *)malloc(10000);
-       sprintf( ret_string, "Attributes for variable 
%s:\n------------------------------\n", var_name );
+       ret_string    = (char *)malloc(retval_len);
+       snprintf( ret_string, retval_len, "Attributes for variable 
%s:\n------------------------------\n", var_name );
+       ret_string[retval_len-1] = '\0';
 
        err = nc_inq_varid( fileid, var_name, &varid );
        if( err != NC_NOERR ) {
@@ -1426,25 +1443,25 @@ char *netcdf_att_string( int fileid, char *var_name )
                        
                ncattget( fileid, varid, att_name, data );
 
-               strcat( ret_string, att_name );
-               strcat( ret_string, ": "      );
+               safe_strcat( ret_string, retval_len, att_name );
+               safe_strcat( ret_string, retval_len, ": "     );
 
                for(i=0; i<len; i++) {
                        switch( datatype ) {
-                               case NC_BYTE:   sprintf( line, "%d ",  *((char  
 *)data+i) ); break;
-                               case NC_CHAR:   sprintf( line, "%c",   *((char  
 *)data+i) ); break;
-                               case NC_SHORT:  sprintf( line, "%d ",  *((short 
 *)data+i) ); break;
-                               case NC_LONG:   sprintf( line, "%ld ", 
(long)(*((nclong *)data+i)) ); break;
-                               case NC_FLOAT:  sprintf( line, "%f ",  *((float 
 *)data+i) ); break;
-                               case NC_DOUBLE: sprintf( line, "%lf ", 
*((double *)data+i) ); break;
-                               case NC_NAT:    sprintf( line, "(NC_NAT) ");    
              break;
+                               case NC_BYTE:   snprintf( line, 1999, "%d ",  
*((char   *)data+i) ); break;
+                               case NC_CHAR:   snprintf( line, 1999, "%c",   
*((char   *)data+i) ); break;
+                               case NC_SHORT:  snprintf( line, 1999, "%d ",  
*((short  *)data+i) ); break;
+                               case NC_LONG:   snprintf( line, 1999, "%ld ", 
(long)(*((nclong *)data+i)) ); break;
+                               case NC_FLOAT:  snprintf( line, 1999, "%f ",  
*((float  *)data+i) ); break;
+                               case NC_DOUBLE: snprintf( line, 1999, "%lf ", 
*((double *)data+i) ); break;
+                               case NC_NAT:    snprintf( line, 1999, "(NC_NAT) 
");                  break;
                                }
-                       strcat( ret_string, line );
+                       safe_strcat( ret_string, retval_len, line );
                        }
-               strcat( ret_string, "\n" );
+               safe_strcat( ret_string, retval_len, "\n" );
                }
 
-       strcat( ret_string, netcdf_global_att_string( fileid ));
+       safe_strcat( ret_string, retval_len, netcdf_global_att_string( fileid 
));
        return( ret_string );
 }
 
@@ -1455,6 +1472,7 @@ char *netcdf_global_att_string( int fileid )
        nc_type datatype;
        char    att_name[MAX_NC_NAME];
        char    *data, *ret_string, line[2000];
+       size_t  retval_len=10000;
 
        err = nc_inq_natts( fileid, &n_atts );
        if( err == -1 ) {
@@ -1468,8 +1486,9 @@ char *netcdf_global_att_string( int fileid )
                return( ret_string );
                }
 
-       ret_string    = (char *)malloc(10000);
-       sprintf( ret_string, "\nGlobal 
attributes:\n--------------------------\n" );
+       ret_string    = (char *)malloc(sizeof(char) * retval_len);
+       snprintf( ret_string, retval_len-1, "\nGlobal 
attributes:\n--------------------------\n" );
+       ret_string[retval_len-1] = '\0';
 
        for( iatt=0; iatt<n_atts; iatt++ ) {
 
@@ -1493,22 +1512,22 @@ char *netcdf_global_att_string( int fileid )
                        
                ncattget( fileid, NC_GLOBAL, att_name, data );
 
-               strcat( ret_string, att_name );
-               strcat( ret_string, ": "      );
+               safe_strcat( ret_string, retval_len, att_name);
+               safe_strcat( ret_string, retval_len, ": "    );
 
                for(i=0; i<len; i++) {
                        switch( datatype ) {
-                               case NC_BYTE:   sprintf( line, "%d ",  *((char  
 *)data+i) ); break;
-                               case NC_CHAR:   sprintf( line, "%c",   *((char  
 *)data+i) ); break;
-                               case NC_SHORT:  sprintf( line, "%d ",  *((short 
 *)data+i) ); break;
-                               case NC_LONG:   sprintf( line, "%ld ", 
(long)(*((nclong *)data+i)) ); break;
-                               case NC_FLOAT:  sprintf( line, "%f ",  *((float 
 *)data+i) ); break;
-                               case NC_DOUBLE: sprintf( line, "%lf ", 
*((double *)data+i) ); break;
-                               case NC_NAT:    sprintf( line, "(NC_NAT) "); 
break;
+                               case NC_BYTE:   snprintf( line, 1999, "%d ",  
*((char   *)data+i) ); break;
+                               case NC_CHAR:   snprintf( line, 1999, "%c",   
*((char   *)data+i) ); break;
+                               case NC_SHORT:  snprintf( line, 1999, "%d ",  
*((short  *)data+i) ); break;
+                               case NC_LONG:   snprintf( line, 1999, "%ld ", 
(long)(*((nclong *)data+i)) ); break;
+                               case NC_FLOAT:  snprintf( line, 1999, "%f ",  
*((float  *)data+i) ); break;
+                               case NC_DOUBLE: snprintf( line, 1999, "%lf ", 
*((double *)data+i) ); break;
+                               case NC_NAT:    snprintf( line, 1999, "(NC_NAT) 
"); break;
                                }
-                       strcat( ret_string, line );
+                       safe_strcat( ret_string, retval_len, line );
                        }
-               strcat( ret_string, "\n" );
+               safe_strcat( ret_string, retval_len, "\n" );
                }
 
        return( ret_string );
diff --git a/src/handle_rc_file.c b/src/handle_rc_file.c
index f81728a..46a5b9a 100644
--- a/src/handle_rc_file.c
+++ b/src/handle_rc_file.c
@@ -3,6 +3,10 @@
 #include <unistd.h>
 #include <string.h>
 
+#include "ncview.includes.h"
+#include "ncview.defines.h"
+#include "ncview.protos.h"
+
 #include "stringlist.h"
 
 #define NCVIEW_STATE_FILE_VERSION      1
@@ -26,6 +30,22 @@ Scripps Insititution of Oceanography
 */
 
 
/*================================================================================
+ * Get the persistent state that we want to save to a file
+ * This generates and allocates space for a new stringlist, so when the 
calling routine
+ * is done with the stringlist (by saving it to a file, or example), then the 
calling
+ * routine must delete the stringlist as so:
+ *
+ *      state_to_save = get_persistent_state();
+ *      stringlist_delete_entire_list( state_to_save );
+ */
+       Stringlist *
+get_persistent_state()
+{
+       /* Only one module saves state info at the moment */
+       return( get_persistent_X_state() );
+}
+
+/*================================================================================
  * Write the state to a disk file. Returns 0 on success, != 0 on error.
  */
        int
@@ -66,8 +86,10 @@ write_state_to_file( Stringlist *state_to_save )
                fprintf( stderr, "Error, temporary directory name is too long: 
%s\n", homedir );
                return( -1 );
                }
-       sprintf( final_fname, "%s/.ncviewrc",        homedir );
-       sprintf( tmp_fname,   "%s/.ncviewrc.XXXXXX", homedir );
+       snprintf( final_fname, 2000, "%s/.ncviewrc",        homedir );
+       final_fname[1999] = '\0';
+       snprintf( tmp_fname,   2000, "%s/.ncviewrc.XXXXXX", homedir );
+       tmp_fname[1999] = '\0';
 
        /* Make temporary file safely */
        outfid = mkstemp( tmp_fname );
@@ -146,7 +168,8 @@ read_state_from_file( Stringlist **state )
                fprintf( stderr, "Error, environmental variable $HOME is too 
long (has too many characters)\n" );
                return( -81 );
                }
-       sprintf( final_fname, "%s/.ncviewrc", homedir );
+       snprintf( final_fname, 2000, "%s/.ncviewrc", homedir );
+       final_fname[1999] = '\0';
 
        /* Open the file for reading */
        if( (fin = fopen(final_fname, "r")) == NULL ) {
diff --git a/src/interface/cbar.c b/src/interface/cbar.c
index bca9ce5..3810a0a 100644
--- a/src/interface/cbar.c
+++ b/src/interface/cbar.c
@@ -181,7 +181,7 @@ void cbar_make( int width, int height, int n_extra_colors, 
float user_min, float
        for( i=0; i<nlev; i++ ) {
                if( options.debug ) fprintf( stderr, "cbar_make: drawing label 
%d of %d\n", i, nlev );
                val = start + step*i;
-               sprintf( tstr, "%g", val );
+               snprintf( tstr, 1020, "%g", val );
                sw = string_width( tstr, cbar_raster->font );
                xfrac = (val-user_min)/drange;
                if( (xfrac>=0.) && (xfrac<=1.)) {
@@ -501,7 +501,7 @@ static my_Font *open_font( char *font_name )
        char    filename[132], *font_dir, *getenv(), *DEFAULT_FONT_DIR=".";
        my_Font *ret_val;
 
-       sprintf( filename, "%s/%s.bdf", DEFAULT_FONT_DIR, font_name );
+       snprintf( filename, 130, "%s/%s.bdf", DEFAULT_FONT_DIR, font_name );
        if( (font_file = fopen( filename, "r" )) == NULL )
                {
                font_dir = getenv( "TITLE_FONT_DIR" );
@@ -513,7 +513,7 @@ static my_Font *open_font( char *font_name )
                        }
                else
                        {
-                       sprintf( filename, "%s/%s.bdf",
+                       snprintf( filename, 130, "%s/%s.bdf",
                                        font_dir, font_name );
                        font_file = fopen( filename, "r" );
                        if( font_file == NULL )
diff --git a/src/interface/colormap_funcs.c b/src/interface/colormap_funcs.c
index f399475..c30ef34 100644
--- a/src/interface/colormap_funcs.c
+++ b/src/interface/colormap_funcs.c
@@ -300,7 +300,7 @@ void x_check_legal_colormap_loaded()
                        fprintf( stderr, "Error, colormap name is too long: 
%s\n", cm->name );
                        exit(-1);
                        }
-               sprintf( cm_name, "CMAP_%s", cm->name );
+               snprintf( cm_name, 999, "CMAP_%s", cm->name );
                sl = stringlist_match_string_exact( read_in_state, cm_name );
                if( sl == NULL ) 
                        list_to_use[ n_list_to_use++ ] = cm;
@@ -398,10 +398,12 @@ void x_create_colormap( char *name, unsigned char r[256], 
unsigned char g[256],
                fprintf( stderr, "Error, colormap name is too long: %s\n", name 
);
                exit(-1);
                }
-       sprintf( sl_cmap_name, "CMAP_%s", name );
+       snprintf( sl_cmap_name, 1018, "CMAP_%s", name );
        sl = stringlist_match_string_exact( read_in_state, sl_cmap_name );
        if( sl == NULL ) {
+               /* People seem to find this message confusing
                printf( "did not find color map %s in state file: enabling by 
default\n", sl_cmap_name );
+               */
                cmaplist->enabled = 1;
                }
        else
@@ -745,7 +747,7 @@ colormap_options_to_stringlist( Stringlist **sl )
                        fprintf( stderr, "Error, colormap name too long -- max 
is 1000 chars (routine colormap_options_to_stringlist)\n" );
                        exit(-1);
                        }
-               sprintf( cmap_name_ext, "CMAP_%s", cursor->name );
+               snprintf( cmap_name_ext, 1022, "CMAP_%s", cursor->name );
                enabled = cursor->enabled;
                if( (err = stringlist_add_string( sl, cmap_name_ext, &enabled, 
SLTYPE_INT )) != 0 ) {
                        fprintf( stderr, "colormap_options_to_stringlist: Error 
creating save state stringlist\n" );
diff --git a/src/interface/display_info.c b/src/interface/display_info.c
index 8cb6d60..38fde2e 100644
--- a/src/interface/display_info.c
+++ b/src/interface/display_info.c
@@ -56,7 +56,7 @@ x_display_stuff( char *s, char *var_name )
        int     index;
        char    window_title[132];
 
-       sprintf( window_title, "Attributes of \"%s\"", var_name );
+       snprintf( window_title, 130, "Attributes of \"%s\"", var_name );
 
        index = get_free_display_popup_index();
        if( index < 0 ) 
diff --git a/src/interface/filesel.c b/src/interface/filesel.c
index 98626f9..2236591 100644
--- a/src/interface/filesel.c
+++ b/src/interface/filesel.c
@@ -340,14 +340,16 @@ fs_list_dir( Stringlist **files, Stringlist **dirs )
        DIR     *cwd;
        struct dirent   *dir_entry;
        char    *tchar;
+       size_t  slen;
 
        cwd = opendir( "." );
        while( (dir_entry = readdir( cwd )) != NULL ) {
                if( (strcmp( dir_entry->d_name, ".") != 0) &&
                    (strcmp( dir_entry->d_name, "..") != 0)) {
                        if( fs_is_a_directory( dir_entry->d_name )) {
-                               tchar = (char *)malloc( sizeof(char) * 
(strlen(dir_entry->d_name) + 5));        /* add space for NULL and trailing 
slash */
-                               sprintf( tchar, "%s/", dir_entry->d_name );
+                               slen = strlen(dir_entry->d_name) + 6;   /* add 
space for NULL and trailing slash */
+                               tchar = (char *)malloc( sizeof(char) * slen );
+                               snprintf( tchar, slen-1, "%s/", 
dir_entry->d_name );
                                stringlist_add_string_ordered( dirs, tchar, 
NULL, SLTYPE_NULL );
                                free( tchar );
                                }
diff --git a/src/interface/plot_range.c b/src/interface/plot_range.c
index ddce8ef..4a1252a 100644
--- a/src/interface/plot_range.c
+++ b/src/interface/plot_range.c
@@ -66,8 +66,8 @@ x_plot_range( float old_min, float old_max,
        char    plot_range_min_string[128], plot_range_max_string[128], 
                *tstr;
 
-       sprintf( plot_range_min_string, "%g", old_min );
-       sprintf( plot_range_max_string, "%g", old_max );
+       snprintf( plot_range_min_string, 127, "%g", old_min );
+       snprintf( plot_range_max_string, 127, "%g", old_max );
 
        *new_min = old_min;
        *new_max = old_max;
diff --git a/src/interface/plot_xy.c b/src/interface/plot_xy.c
index 2436535..292d0dc 100644
--- a/src/interface/plot_xy.c
+++ b/src/interface/plot_xy.c
@@ -86,7 +86,7 @@ static void   xaxis_range_callback(Widget w, XtPointer 
client_data, XtPointer cal
 static void    yaxis_range_callback(Widget w, XtPointer client_data, XtPointer 
call_data);
 static void    plot_XY_xaxis_log_callback(Widget w, XtPointer client_data, 
XtPointer call_data);
 static void    plot_XY_yaxis_log_callback(Widget w, XtPointer client_data, 
XtPointer call_data);
-void           plot_XY_format_x_axis( Widget w, float val, char *s );
+void           plot_XY_format_x_axis( Widget w, float val, char *s, size_t 
slen );
 static void    xy_track_pointer( Widget w, XtPointer client_data, XEvent 
*event, 
                Boolean *continue_to_dispatch );
 static int     locked_plot( void );
@@ -469,7 +469,7 @@ plot_XY_dump_callback(Widget widget, XtPointer client_data, 
XtPointer call_data)
                exit( -1 );
                }
 
-       sprintf( filename, "ncview.dump" );
+       snprintf( filename, 1022, "ncview.dump" );
        message = x_dialog( "File to dump to:", filename, TRUE );
        if( message != MESSAGE_OK )
                return;
@@ -693,7 +693,7 @@ plot_XY_yaxis_log_callback(Widget w, XtPointer client_data, 
XtPointer call_data)
 }
 
        void    
-plot_XY_format_x_axis( Widget w, float val, char *s )
+plot_XY_format_x_axis( Widget w, float val, char *s, size_t slen )
 {
        int i = 0;
        while( (plot_XY_widget[i] != w) && (i < MAX_PLOT_XY) )
@@ -703,7 +703,7 @@ plot_XY_format_x_axis( Widget w, float val, char *s )
                exit( -1 );
                }
 
-       view_plot_XY_fmt_x_val( val, pXY_dimindex[i], s );
+       view_plot_XY_fmt_x_val( val, pXY_dimindex[i], s, slen );
 }
 
        void
diff --git a/src/interface/printer_options.c b/src/interface/printer_options.c
index 8f11813..b14a5c4 100644
--- a/src/interface/printer_options.c
+++ b/src/interface/printer_options.c
@@ -106,22 +106,22 @@ printer_options( PrintOptions *po )
        XtVaSetValues( po_outf_text_widget, XtNstring, po->out_file_name, NULL 
);
 
        /*** Margins ***/
-       sprintf( tstr, "%g", po->page_x_margin );
+       snprintf( tstr, 1022, "%g", po->page_x_margin );
        XtVaSetValues( po_xmar_text_widget, XtNstring, tstr, NULL );
 
-       sprintf( tstr, "%g", po->page_upper_y_margin );
+       snprintf( tstr, 1022, "%g", po->page_upper_y_margin );
        XtVaSetValues( po_ymar_top_text_widget, XtNstring, tstr, NULL );
 
-       sprintf( tstr, "%g", po->page_lower_y_margin );
+       snprintf( tstr, 1022, "%g", po->page_lower_y_margin );
        XtVaSetValues( po_ymar_bot_text_widget, XtNstring, tstr, NULL );
 
        /*** Fonts ***/
        XtVaSetValues( po_font_name_text_widget, XtNstring, po->font_name, NULL 
);
 
-       sprintf( tstr, "%d", po->header_font_size );
+       snprintf( tstr, 1022, "%d", po->header_font_size );
        XtVaSetValues( po_font_headsize_text_widget, XtNstring, tstr, NULL );
 
-       sprintf( tstr, "%d", po->font_size );
+       snprintf( tstr, 1022, "%d", po->font_size );
        XtVaSetValues( po_font_size_text_widget, XtNstring, tstr, NULL );
 
        /*** Includes ***/
diff --git a/src/interface/range.c b/src/interface/range.c
index 2ea744d..d7f33a0 100644
--- a/src/interface/range.c
+++ b/src/interface/range.c
@@ -92,8 +92,8 @@ x_range( float old_min, float old_max,
        char    range_min_string[128], range_max_string[128], 
                global_values_string[128], *tstr;
 
-       sprintf( range_min_string, "%g", old_min );
-       sprintf( range_max_string, "%g", old_max );
+       snprintf( range_min_string, 127, "%g", old_min );
+       snprintf( range_max_string, 127, "%g", old_max );
 
        *new_min = old_min;
        *new_max = old_max;
@@ -101,7 +101,7 @@ x_range( float old_min, float old_max,
        XtVaSetValues( range_min_text_widget, XtNstring, range_min_string, NULL 
);
        XtVaSetValues( range_max_text_widget, XtNstring, range_max_string, NULL 
);
 
-       sprintf( global_values_string, "%g to %g", global_min, global_max );
+       snprintf( global_values_string, 127, "%g to %g", global_min, global_max 
);
        global_min_max.min = global_min;
        global_min_max.max = global_max;
        XtVaSetValues( range_global_values_widget, 
@@ -411,10 +411,10 @@ range_symmetric_callback( Widget w, XtPointer 
client_data, XtPointer call_data)
        new_max = biggest;
 
 
-       sprintf( tstr, "%g", new_min );
+       snprintf( tstr, 130, "%g", new_min );
        XtVaSetValues( range_min_text_widget, XtNstring, tstr, NULL );
 
-       sprintf( tstr, "%g", new_max );
+       snprintf( tstr, 130, "%g", new_max );
        XtVaSetValues( range_max_text_widget, XtNstring, tstr, NULL );
 }
 
@@ -427,9 +427,9 @@ reset_global_callback( Widget w, XtPointer client_data, 
XtPointer call_data)
        global_min = global_min_max.min;
        global_max = global_min_max.max;
 
-       sprintf( tstr, "%g", global_min );
+       snprintf( tstr, 99, "%g", global_min );
        XtVaSetValues( range_min_text_widget, XtNstring, tstr, NULL );
-       sprintf( tstr, "%g", global_max );
+       snprintf( tstr, 99, "%g", global_max );
        XtVaSetValues( range_max_text_widget, XtNstring, tstr, NULL );
 }
 
diff --git a/src/interface/set_options.c b/src/interface/set_options.c
index 89449cd..ea7acf3 100644
--- a/src/interface/set_options.c
+++ b/src/interface/set_options.c
@@ -199,13 +199,9 @@ set_options( void )
                handle_colormap_list_change();
 
                /* Save persistent options in our state file */
-               state_to_save = NULL;   /* signal we want to create new 
stringlist */
-               if( (err = colormap_options_to_stringlist( &state_to_save )) != 
0 ) {
-                       sprintf( error_message, "Error %d while trying to save 
colormap options. Look in launching window to see more information.\n", err );
-                       in_error( error_message );
-                       }
+               state_to_save = get_persistent_state(); /* NOTE! NOT just the X 
state, entire state */
                if( (err = write_state_to_file( state_to_save )) != 0 ) {
-                       sprintf( error_message, "Error %d while trying to save 
options file. Look in launching window to see more information.\n", err );
+                       snprintf( error_message, 2000, "Error %d while trying 
to save options file. Look in launching window to see more information.\n", err 
);
                        in_error( error_message );
                        }
                stringlist_delete_entire_list( state_to_save );
@@ -461,7 +457,7 @@ set_options_init()
 
                for( ll=0; ll<n_colormaps; ll++ ) {
 
-                       sprintf( cmap_widget_name, 
"opt_cbsel_cmap_entry_widget_%04ld", ll );
+                       snprintf( cmap_widget_name, 1000, 
"opt_cbsel_cmap_entry_widget_%04ld", ll );
                        opt_cbsel_cmap_entry_widget[ll] = 
XtVaCreateManagedWidget(
                                cmap_widget_name,
                                boxWidgetClass, 
@@ -472,7 +468,7 @@ set_options_init()
                                NULL );
                        prev_widget = opt_cbsel_cmap_entry_widget[ll];
 
-                               sprintf( cmap_widget_name, 
"opt_cbsel_cmap_name_widget_%04ld", ll );
+                               snprintf( cmap_widget_name, 1000, 
"opt_cbsel_cmap_name_widget_%04ld", ll );
                                opt_cbsel_name_widget[ll] = 
XtVaCreateManagedWidget(
                                        cmap_widget_name,
                                        labelWidgetClass,       
@@ -482,7 +478,7 @@ set_options_init()
                                        XtNwidth, CMAP_NAME_WIDTH,
                                        NULL );
 
-                               sprintf( cmap_widget_name, 
"opt_cbsel_cmap_enable_widget_%04ld", ll );
+                               snprintf( cmap_widget_name, 1000, 
"opt_cbsel_cmap_enable_widget_%04ld", ll );
                                opt_cbsel_enable_widget[ll] = 
XtVaCreateManagedWidget(
                                        cmap_widget_name,
                                        toggleWidgetClass,      
@@ -494,7 +490,7 @@ set_options_init()
                                        NULL );
                                XtAddCallback( opt_cbsel_enable_widget[ll], 
XtNcallback, cbsel_enable_callback, (XtPointer)ll );
 
-                               sprintf( cmap_widget_name, 
"opt_cbsel_cmap_top_widget_%04ld", ll );
+                               snprintf( cmap_widget_name, 1000, 
"opt_cbsel_cmap_top_widget_%04ld", ll );
                                opt_cbsel_top_widget[ll] = 
XtVaCreateManagedWidget(
                                        cmap_widget_name,
                                        commandWidgetClass,     
@@ -505,7 +501,7 @@ set_options_init()
                                        NULL );
                                XtAddCallback( opt_cbsel_top_widget[ll], 
XtNcallback, cbsel_top_callback, (XtPointer)ll );
 
-                               sprintf( cmap_widget_name, 
"opt_cbsel_cmap_up_widget_%04ld", ll );
+                               snprintf( cmap_widget_name, 1000, 
"opt_cbsel_cmap_up_widget_%04ld", ll );
                                opt_cbsel_up_widget[ll] = 
XtVaCreateManagedWidget(
                                        cmap_widget_name,
                                        commandWidgetClass,     
@@ -516,7 +512,7 @@ set_options_init()
                                        NULL );
                                XtAddCallback( opt_cbsel_up_widget[ll], 
XtNcallback, cbsel_up_callback, (XtPointer)ll );
 
-                               sprintf( cmap_widget_name, 
"opt_cbsel_cmap_down_widget_%04ld", ll );
+                               snprintf( cmap_widget_name, 1000, 
"opt_cbsel_cmap_down_widget_%04ld", ll );
                                opt_cbsel_down_widget[ll] = 
XtVaCreateManagedWidget(
                                        cmap_widget_name,
                                        commandWidgetClass,     
@@ -527,7 +523,7 @@ set_options_init()
                                        NULL );
                                XtAddCallback( opt_cbsel_down_widget[ll], 
XtNcallback, cbsel_down_callback, (XtPointer)ll );
 
-                               sprintf( cmap_widget_name, 
"opt_cbsel_cmap_bottom_widget_%04ld", ll );
+                               snprintf( cmap_widget_name, 1000, 
"opt_cbsel_cmap_bottom_widget_%04ld", ll );
                                opt_cbsel_bottom_widget[ll] = 
XtVaCreateManagedWidget(
                                        cmap_widget_name,
                                        commandWidgetClass,     
@@ -538,7 +534,7 @@ set_options_init()
                                        NULL );
                                XtAddCallback( opt_cbsel_bottom_widget[ll], 
XtNcallback, cbsel_bottom_callback, (XtPointer)ll );
 
-                               sprintf( cmap_widget_name, 
"opt_cbsel_cmap_cbar_widget_%04ld", ll );
+                               snprintf( cmap_widget_name, 1000, 
"opt_cbsel_cmap_cbar_widget_%04ld", ll );
                                opt_cbsel_cbar_widget[ll] = 
XtVaCreateManagedWidget(
                                        cmap_widget_name,
                                        simpleWidgetClass,
@@ -1008,3 +1004,31 @@ static void cmaps_set_current( Cmaplist *cmlist )
                        NULL );
                }
 }
+
+/******************************************************************************************************
+ * We save persistent options in a stringlist, which gets written out to our 
.rc file. This
+ * routine generates the stringlist to save from the point of view of the X 
interface
+ * routines. I.e., it generates a stringlist with all the options that the X 
interface routines
+ * would like to save.
+ * 
+ * This generates and allocates space for a new stringlist, so when the 
calling routine
+ * is done with the stringlist (by saving it to a file, or example), then the 
calling 
+ * routine must delete the stringlist as so:
+ *
+ *     state_to_save = get_persistent_X_state();
+ *     stringlist_delete_entire_list( state_to_save );
+ */
+       Stringlist *
+get_persistent_X_state()
+{
+       Stringlist      *state_to_save = NULL;  /* signal we want to create new 
stringlist */
+       int             err;
+       char    error_message[ 2040 ];
+
+       if( (err = colormap_options_to_stringlist( &state_to_save )) != 0 ) {
+               snprintf( error_message, 2000, "Error %d while trying to save 
colormap options. Look in launching window to see more information.\n", err );
+               in_error( error_message );
+               }
+
+       return( state_to_save );
+}
diff --git a/src/interface/x_interface.c b/src/interface/x_interface.c
index c3b0972..5dcb0b2 100644
--- a/src/interface/x_interface.c
+++ b/src/interface/x_interface.c
@@ -469,7 +469,7 @@ void x_parse_args( int *p_argc, char **argv )
                fallback_resources,     /* for missing app-defaults file */
                NULL );                 /* terminate varargs list        */
        
-       sprintf( program_title, "Ncview %.2f\n", PROGRAM_VERSION );
+       snprintf( program_title, 130, "Ncview %s\n", PROGRAM_VERSION_STRING );
        XtVaSetValues( topLevel, XtNtitle, program_title, NULL );
 
        debug = 0;
@@ -1258,8 +1258,8 @@ void x_init_widgets_varsel_menu_inner( Widget parent, 
long *varlist, int nv, cha
        NCVar   *cursor;
        int     i_cursor, i;
 
-       sprintf( temp,          "(%d) %s vars", nv, tag );
-       sprintf( var_menu_name, "var_menu_%s",  tag     );
+       snprintf( temp,          1020, "(%d) %s vars", nv, tag );
+       snprintf( var_menu_name, 1020, "var_menu_%s",  tag     );
 
        varsel_menu_widget = XtVaCreateManagedWidget(
                "varsel_menu",
@@ -1282,7 +1282,7 @@ void x_init_widgets_varsel_menu_inner( Widget parent, 
long *varlist, int nv, cha
                        cursor = cursor->next;
                        i_cursor++;
                        }
-               sprintf( widget_name, "%s", cursor->name );
+               snprintf( widget_name, 1020, "%s", cursor->name );
                list_of_sel_widgets[i] = XtVaCreateManagedWidget(
                        widget_name,
                        smeBSBObjectClass,
@@ -1383,7 +1383,7 @@ void x_init_widgets_varsel_list( Widget parent )
                        }
                if( i == 0 ) {
                        /* The very first button box! */
-                       sprintf( widget_name, "varselbox_%1d", which_box+1 );
+                       snprintf( widget_name, 127, "varselbox_%1d", 
which_box+1 );
                        *(var_selection_widget+which_box) = 
XtVaCreateManagedWidget(
                                widget_name,
                                boxWidgetClass,
@@ -1391,7 +1391,7 @@ void x_init_widgets_varsel_list( Widget parent )
                                XtNorientation, XtorientHorizontal,
                                XtNborderWidth, 0,
                                NULL);
-                       sprintf( widget_name, "varlist_label_%1d", which_box+1 
);
+                       snprintf( widget_name, 127, "varlist_label_%1d", 
which_box+1 );
                        varlist_label_widget = XtVaCreateManagedWidget(
                                widget_name,
                                labelWidgetClass,
@@ -1404,7 +1404,7 @@ void x_init_widgets_varsel_list( Widget parent )
                        }
                else if( (i % app_data.n_vars_per_row) == 0 ) {
                        /* A new button box! */
-                       sprintf( widget_name, "box_%1d", which_box+1 );
+                       snprintf( widget_name, 127, "box_%1d", which_box+1 );
                        *(var_selection_widget+which_box) = 
XtVaCreateManagedWidget(
                                widget_name,
                                boxWidgetClass,
@@ -1413,7 +1413,7 @@ void x_init_widgets_varsel_list( Widget parent )
                                XtNborderWidth, 0,
                                XtNfromVert, *(var_selection_widget + which_box 
- 1),
                                NULL);
-                       sprintf( widget_name, "varlist_label_%1d", which_box+1 
);
+                       snprintf( widget_name, 127, "varlist_label_%1d", 
which_box+1 );
                        varlist_label_widget = XtVaCreateManagedWidget(
                                widget_name,
                                labelWidgetClass,
@@ -1425,7 +1425,7 @@ void x_init_widgets_varsel_list( Widget parent )
                        which_box++;
                        }
 
-               sprintf( widget_name, "varsel_%s", var->name );
+               snprintf( widget_name, 127, "varsel_%s", var->name );
                state = False;
                if( i == 0 )  /* first variable button */
                        *(varlist_widget+i) = XtVaCreateManagedWidget(
@@ -2433,13 +2433,13 @@ void x_indicate_active_dim( int dimension, char 
*dim_name )
        char    new_label[ 132 ];
 
        if( dimension == DIMENSION_X )
-               sprintf( new_label, "X:" );
+               snprintf( new_label, 130, "X:" );
        else if( dimension == DIMENSION_Y )
-               sprintf( new_label, "Y:" );
+               snprintf( new_label, 130, "Y:" );
        else if( dimension == DIMENSION_SCAN )
-               sprintf( new_label, "Scan:" );
+               snprintf( new_label, 130, "Scan:" );
        else if( dimension == DIMENSION_NONE )
-               sprintf( new_label, " " );
+               snprintf( new_label, 130, " " );
        else
                {
                fprintf( stderr, "ncview: x_indicate_active_dim: unknown " );
@@ -2740,7 +2740,7 @@ void x_make_dim_button_util( int dimension, Stringlist 
*dim_list, char *prefix,
        i = 0;
        while( s != NULL )
                {
-               sprintf( widget_name, "%s%s", prefix, s->string );
+               snprintf( widget_name, 62, "%s%s", prefix, s->string );
                if( i == 0 )
                        *(*dimlist_widget + i) = XtVaCreateManagedWidget(
                                widget_name,
@@ -2965,18 +2965,18 @@ void x_fill_dim_info( NCDim *d, int please_flip )
                if( strcmp( widget_name, d->name ) == 0 ) {
 
                        if( please_flip )
-                               sprintf( temp_label, "%g", d->max );
+                               snprintf( temp_label, 130, "%g", d->max );
                        else
-                               sprintf( temp_label, "%g", d->min );
+                               snprintf( temp_label, 130, "%g", d->min );
                        XtVaSetValues( *(diminfo_min_widget+i),
                                XtNlabel, temp_label,
                                XtNwidth, app_data.dimlabel_width,
                                NULL );
 
                        if( please_flip )
-                               sprintf( temp_label, "%g", d->min );
+                               snprintf( temp_label, 130, "%g", d->min );
                        else
-                               sprintf( temp_label, "%g", d->max );
+                               snprintf( temp_label, 130, "%g", d->max );
                        XtVaSetValues( *(diminfo_max_widget+i),
                                XtNlabel, temp_label,
                                XtNwidth, app_data.dimlabel_width,
@@ -3098,7 +3098,7 @@ void x_init_dim_info( Stringlist *dims )
 
        for( ll=0; ll<n_dims; ll++ )
                {
-                sprintf( widget_name, "diminfo_row_%1ld", ll );
+                snprintf( widget_name, 127, "diminfo_row_%1ld", ll );
                 if( ll == 0 )
                        *(diminfo_row_widget+ll) = XtVaCreateManagedWidget(
                                widget_name,
@@ -3120,7 +3120,7 @@ void x_init_dim_info( Stringlist *dims )
                                XtNwidth,  bb_width,
                                NULL);
 
-               sprintf( widget_name, "diminfo_dim_%1ld", ll );
+               snprintf( widget_name, 127, "diminfo_dim_%1ld", ll );
                *(diminfo_dim_widget+ll) = XtVaCreateManagedWidget(
                        widget_name,
                        labelWidgetClass,
@@ -3131,7 +3131,7 @@ void x_init_dim_info( Stringlist *dims )
                        XtNborderWidth, 0,
                        NULL);
 
-               sprintf( widget_name, "diminfo_name_%1ld", ll );
+               snprintf( widget_name, 127, "diminfo_name_%1ld", ll );
                *(diminfo_name_widget+ll) = XtVaCreateManagedWidget(
                        widget_name,
                        labelWidgetClass,
@@ -3141,7 +3141,7 @@ void x_init_dim_info( Stringlist *dims )
                        XtNborderWidth, 0,
                        NULL);
 
-               sprintf( widget_name, "diminfo_min_%1ld", ll );
+               snprintf( widget_name, 127, "diminfo_min_%1ld", ll );
                *(diminfo_min_widget+ll) = XtVaCreateManagedWidget(
                        widget_name,
                        labelWidgetClass,
@@ -3151,7 +3151,7 @@ void x_init_dim_info( Stringlist *dims )
                        XtNborderWidth, 0,
                        NULL);
 
-               sprintf( widget_name, "diminfo_cur_%1ld", ll );
+               snprintf( widget_name, 127, "diminfo_cur_%1ld", ll );
                *(diminfo_cur_widget+ll) = XtVaCreateManagedWidget(
                        widget_name,
                        commandWidgetClass,
@@ -3175,7 +3175,7 @@ void x_init_dim_info( Stringlist *dims )
                        XtParseTranslationTable( 
                                "Ctrl<Btn3Down>,<Btn3Up>: diminfo_cur_mod4()" 
));
 
-               sprintf( widget_name, "diminfo_max_%1ld", ll );
+               snprintf( widget_name, 127, "diminfo_max_%1ld", ll );
                *(diminfo_max_widget+ll) = XtVaCreateManagedWidget(
                        widget_name,
                        labelWidgetClass,
@@ -3185,7 +3185,7 @@ void x_init_dim_info( Stringlist *dims )
                        XtNborderWidth, 0,
                        NULL);
 
-               sprintf( widget_name, "diminfo_units_%1ld", ll );
+               snprintf( widget_name, 127, "diminfo_units_%1ld", ll );
                *(diminfo_units_widget+ll) = XtVaCreateManagedWidget(
                        widget_name,
                        labelWidgetClass,
@@ -3529,7 +3529,7 @@ void dump_to_png( unsigned char *data, size_t width, 
size_t height, size_t frame
 
        if( error_state == 1 ) return;
 
-       sprintf( filename, "frame.%05ld.png", frameno );
+       snprintf( filename, 2047, "frame.%05ld.png", frameno );
        frameno++;
 
        /* Open binary output file */
diff --git a/src/ncview.c b/src/ncview.c
index 5cc4bd4..1f3be77 100644
--- a/src/ncview.c
+++ b/src/ncview.c
@@ -80,13 +80,21 @@ static int get_cmaps_from_dir( char *dir_name );
        int
 main( int argc, char **argv )
 {
-       Stringlist *input_files;
+       Stringlist *input_files, *state_to_save;
+       int        err, found_state_file;
 
-       /* Initialize misc constants, AND read in the previous
-        * run's saved state file
-        */
+       /* Initialize misc constants */
        initialize_misc();
 
+       /* Read in our state file from a previous run of ncview 
+        */
+       read_in_state = NULL;   /* Note: a global var. Set to null to flag 
following routine to make a new stringlist */
+       err = read_state_from_file( &read_in_state );
+       if( err == 0 )  
+               found_state_file = TRUE;
+       else
+               found_state_file = FALSE;
+
        in_parse_args               ( &argc, argv );
        input_files = parse_options ( argc,  argv );
        determine_file_type         ( input_files );
@@ -113,6 +121,17 @@ main( int argc, char **argv )
                in_indicate_active_var( variables->name );
                }
 
+       /* If we didn't find a state file (".ncviewrc") when we started up, then
+        * write a new one out now that we are all initialized
+        */
+       if( found_state_file == FALSE ) {
+               state_to_save = get_persistent_state();
+               if( (err = write_state_to_file( state_to_save )) != 0 ) {
+                       fprintf( stderr, "Error %d while trying to save options 
file \"$HOME/.ncviewrc\".\n", err );
+                       }
+               stringlist_delete_entire_list( state_to_save );
+               }
+
        process_user_input();
 
        return(0);
@@ -309,8 +328,6 @@ parse_options( int argc, char *argv[] )
        void
 initialize_misc()
 {
-       int     err;
-
        print_disclaimer();
 
        udu_utinit( NULL );
@@ -349,12 +366,6 @@ initialize_misc()
        framestore.frame = NULL;
        framestore.valid = FALSE;
 
-       /* Read in our state file from a previous run of ncview 
-        */
-       read_in_state = NULL;   /* flag to make a new stringlist */
-       err = read_state_from_file( &read_in_state );
-       if( err < 0 )   
-               printf( "Note: trying to read in the ncview initialization file 
$HOME/.ncviewrc resulted in error %d\n", err );
 }
 
 
/***********************************************************************************************/
@@ -433,6 +444,11 @@ get_cmaps_from_dir( char *dir_name )
        void
 init_cmaps_from_data()
 {
+/* the following are original colormaps from ncview */
+
+       init_cmap_from_data( "3gauss",  cmap_3gauss  );
+       init_cmap_from_data( "detail",  cmap_detail  );
+       init_cmap_from_data( "ssec",    cmap_ssec    );
 
 /* A. Shchepetkin: new colormaps are added here */
 
@@ -447,18 +463,15 @@ init_cmaps_from_data()
         init_cmap_from_data( "jet",     cmap_jet     );
         init_cmap_from_data( "wheel",   cmap_wheel   );
 
-/* the following are original colormaps from ncview */
+/* the following are the rest of the original colormaps from ncview */
 
-       init_cmap_from_data( "3gauss",  cmap_3gauss  );
        init_cmap_from_data( "3saw",    cmap_3saw    );
        init_cmap_from_data( "bw",      cmap_bw      );
        init_cmap_from_data( "default", cmap_default );
-       init_cmap_from_data( "detail",  cmap_detail  );
        init_cmap_from_data( "extrema", cmap_extrema );
        init_cmap_from_data( "helix",   cmap_helix   );
        init_cmap_from_data( "helix2",  cmap_helix2  );
        init_cmap_from_data( "hotres",  cmap_hotres  );
-       init_cmap_from_data( "ssec",    cmap_ssec    );
 }
 
 
/***********************************************************************************************/
@@ -489,6 +502,7 @@ init_cmap_from_file( char *dir_name, char *file_name )
        int     i, nentries, r_entry, g_entry, b_entry;
        char    line[ 128 ], *long_file_name;
        unsigned char r[256], g[256], b[256];
+       size_t  slen;
 
        if( options.debug ) 
                fprintf( stderr, "    ... initting cmap >%s<\n", file_name );
@@ -507,8 +521,9 @@ init_cmap_from_file( char *dir_name, char *file_name )
                }
 
        /* Read in the r, g, b values */
-       long_file_name = (char *)malloc( sizeof(char)*( strlen(dir_name) + 
strlen(file_name) + 5 ));  /* add space for intermediate slash and trailing 
NULL */
-       sprintf( long_file_name, "%s/%s", dir_name, file_name );
+       slen = strlen(file_name) + strlen(dir_name) + 5;  /* add space for 
intermediate slash and trailing NULL */
+       long_file_name = (char *)malloc( sizeof(char)*slen);  /* add space for 
intermediate slash and trailing NULL */
+       snprintf( long_file_name, slen, "%s/%s", dir_name, file_name );
        if( (cmap_file = fopen( long_file_name, "r" )) == NULL ) {
                fprintf( stderr, "ncview.c: init_cmap_from_file: error " );
                fprintf( stderr, "opening file %s\n", long_file_name );
diff --git a/src/ncview.defines.h b/src/ncview.defines.h
index a21dc9b..d117c55 100644
--- a/src/ncview.defines.h
+++ b/src/ncview.defines.h
@@ -1,6 +1,6 @@
 /*
  * Ncview by David W. Pierce.  A visual netCDF file viewer.
- * Copyright (C) 1993 through 2010 by David W. Pierce
+ * Copyright (C) 1993 through 2011 by David W. Pierce
  *
  * This program  is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 3 as 
@@ -31,9 +31,9 @@
 #include <udunits2.h>
 #endif
 
-#define PROGRAM_ID     "Ncview 2.1 David W. Pierce  19 July 2011"
-#define PROGRAM_VERSION 2.1
-#define APP_RES_VERSION 1.93
+#define PROGRAM_ID             "Ncview 2.1.1 David W. Pierce  1 Aug 2011"
+#define PROGRAM_VERSION_STRING "2.1.1"
+#define APP_RES_VERSION        1.93
 
 #ifndef TRUE
 #define TRUE           1
diff --git a/src/ncview.protos.h b/src/ncview.protos.h
index a839c30..6fab2e0 100644
--- a/src/ncview.protos.h
+++ b/src/ncview.protos.h
@@ -127,7 +127,7 @@ void        expand_data        ( float *big_data, View *v, 
size_t array_size );
 void   check_ranges       ( NCVar *var );
 char   *limit_string      ( char *s );
 int    *gen_overlay       ( View *v, char *overlay_fname );
-void   fmt_time           ( char *temp_string, double new_dimval, NCDim *dim, 
int include_granularity );
+void   fmt_time           ( char *temp_string, size_t temp_string_len, double 
new_dimval, NCDim *dim, int include_granularity );
 int    n_vars_in_list     ( NCVar *v );
 void   set_blowup_type    ( int new_type );
 int    n_strings_in_list  ( Stringlist *s );
@@ -294,7 +294,7 @@ void        set_max_from_curdata ( void );
 void   beep                 ( void );
 void    invalidate_all_saveframes( void );
 void   view_set_XY_plot_axis( String );
-void   view_plot_XY_fmt_x_val( float val, int dimindex, char *s );
+void   view_plot_XY_fmt_x_val( float val, int dimindex, char *s, size_t slen );
 void   view_change_dat      ( size_t index, float new_val );
 void   view_get_scaled_size ( int blowup, size_t old_nx, size_t old_ny, size_t 
*new_nx, size_t *new_ny );
 void   view_change_transform( int delta );
@@ -321,6 +321,7 @@ int         overlay_custom_n        ( void );
 void   options_set_overlay_filename( char *fn );
 void   set_options_init();
 void   set_options( void );
+Stringlist *get_persistent_X_state();
 
 /******************************************************************************
  * in filesel.c
@@ -351,12 +352,12 @@ int       x_plot_range( float old_min, float old_max, 
float *new_min, float *new_max,
 void   udu_utinit( char *path );
 int    udu_utistime( char *dimname, char *units );
 int    udu_calc_tgran( int fileid, NCVar *v, int dimid );
-void   udu_fmt_time( char *temp_string, double new_dimval, NCDim *dim, int 
include_granularity );
+void   udu_fmt_time( char *temp_string, size_t temp_string_len, double 
new_dimval, NCDim *dim, int include_granularity );
 
 /******************************************************************************
  * in epic_time.c
  */
-void epic_fmt_time( char *temp_string, double new_dimval, NCDim *dim );
+void epic_fmt_time( char *temp_string, size_t temp_string_len, double 
new_dimval, NCDim *dim );
 int  epic_istime0( int fileid, NCVar *v, NCDim *d );
 int  epic_calc_tgran( int fileid, NCDim *d );
 
@@ -415,6 +416,7 @@ int         colormap_options_to_stringlist( Stringlist **sl 
);
  */
 int    write_state_to_file( Stringlist *state_to_save );
 int    read_state_from_file( Stringlist **state );
+Stringlist *get_persistent_state();
 
 /******************************************************************************
  * in file interface/util.c
diff --git a/src/overlay.c b/src/overlay.c
index 5af6c89..fc57509 100644
--- a/src/overlay.c
+++ b/src/overlay.c
@@ -321,7 +321,7 @@ gen_overlay( View *v, char *overlay_fname )
 
        /* Open the overlay file */
        if( (f = fopen(overlay_fname, "r")) == NULL ) {
-               sprintf( err_mess, "Error: can't open overlay file named 
\"%s\"\n", 
+               snprintf( err_mess, 1024, "Error: can't open overlay file named 
\"%s\"\n", 
                        overlay_fname );
                in_error( err_mess );
                return( NULL );
@@ -330,21 +330,21 @@ gen_overlay( View *v, char *overlay_fname )
        /* Make sure it is a valid overlay file
         */
        if( fgets(line, 80, f) == NULL ) {
-               sprintf( err_mess, "Error trying to read overlay file named 
\"%s\"\n",
+               snprintf( err_mess, 1024, "Error trying to read overlay file 
named \"%s\"\n",
                        overlay_fname );
                in_error( err_mess );
                return( NULL );
                }
        for( i=0; i<strlen(id_string); i++ )
                if( line[i] != id_string[i] ) {
-                       sprintf( err_mess, "Error trying to read overlay file 
named \"%s\"\nFile does not start with \"%s version-num\"\n", 
+                       snprintf( err_mess, 1024, "Error trying to read overlay 
file named \"%s\"\nFile does not start with \"%s version-num\"\n", 
                                overlay_fname, id_string );
                        in_error( err_mess );
                        return( NULL );
                        }
        sscanf( line, "%*s %f", &version );
        if( (version < 0.95) || (version > 1.05)) {
-               sprintf( err_mess, "Error, overlay file has unknown version 
number: %f\nI am set up for version 1.0\n", version );
+               snprintf( err_mess, 1024, "Error, overlay file has unknown 
version number: %f\nI am set up for version 1.0\n", version );
                in_error( err_mess );
                return( NULL );
                }
diff --git a/src/overlay.orig.c b/src/overlay.orig.c
deleted file mode 100644
index 7ae8168..0000000
--- a/src/overlay.orig.c
+++ /dev/null
@@ -1,441 +0,0 @@
-/*
- * Ncview by David W. Pierce.  A visual netCDF file viewer.
- * Copyright (C) 1993 through 2010 David W. Pierce
- *
- * This program  is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3 as 
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License, version 3, for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * David W. Pierce
- * 6259 Caminito Carrean
- * San Diego, CA   92122
- * pie...@cirrus.ucsd.edu
- */
-
-
-#include "ncview.includes.h"
-#include "ncview.defines.h"
-#include "ncview.protos.h"
-
-/* These are the arrays of coastline and outline data build into ncview
- * (i.e, they are NOT required to be loaded from an external directory)
- */
-#include "overlay_coasts_p08deg.h"
-#include "overlay_coasts_p8deg.h"
-#include "overlay_usa.h"
-
-/* Number and order of these must match the defines given in ncview.defines.h!
- * They are used as the labels for the radio buttons
- */
-char *my_overlay_names[] = { "None",  
-                        "0.8 degree coastlines",
-                       "0.08 degree coastlines",
-                       "USA states",
-                       "custom" };
-
-extern View    *view;
-extern Options  options;
-
-static int     my_current_overlay;
-
-static int     gen_xform( float value, int n, float *dimvals );
-static int     *gen_overlay_internal( View *v, float *data, long n );
-static void    do_overlay_inner( View *v, float *data, long nvals, int 
suppress_screen_changes );
-
-/*====================================================================================
- * This routine is only called when the state of the overlay is being changed
- */
-       void
-do_overlay( int n, char *custom_filename, int suppress_screen_changes )
-{
-       if( view == NULL ) {
-               x_error( "You must select a variable before turning on 
overlays" );
-               return;
-               }
-
-       /* Free space for previous overlay */
-       if( options.overlay->doit && (options.overlay->overlay != NULL ))
-               free( options.overlay->overlay );
-
-       switch(n) {
-               
-               case OVERLAY_NONE:
-                       options.overlay->doit = FALSE;
-                       if( ! suppress_screen_changes ) {
-                               view->data_status = VDS_INVALID;
-                               invalidate_all_saveframes();
-                               change_view( 0, FRAMES );
-                               }
-                       break;
-
-               case OVERLAY_P8DEG:
-                       do_overlay_inner( view, overlay_coasts_p8deg, 
n_overlay_coasts_p8deg,
-                                       suppress_screen_changes );
-                       break;
-
-               case OVERLAY_P08DEG:
-                       do_overlay_inner( view, overlay_coasts_p08deg, 
n_overlay_coasts_p08deg,
-                                       suppress_screen_changes );
-                       break;
-
-               case OVERLAY_USA:
-                       do_overlay_inner( view, overlay_usa, n_overlay_usa,
-                                       suppress_screen_changes );
-                       break;
-
-               case OVERLAY_CUSTOM:
-                       if( (custom_filename == NULL) || 
(strlen(custom_filename) == 0)) {
-                               in_error( "Specified custom overlay filename is 
not a valid filename!\n" );
-                               return;
-                               }
-                       options.overlay->overlay = gen_overlay( view, 
custom_filename ); 
-                       if( options.overlay->overlay != NULL ) {
-                               options.overlay->doit = TRUE;
-                               if( ! suppress_screen_changes ) {
-                                       invalidate_all_saveframes();
-                                       change_view( 0, FRAMES );
-                                       }
-                               }
-                       break;
-
-               default:
-                       fprintf( stderr, "Error, do_overlay called with an 
unknown index = %d\n", n );
-                       exit(-1);
-               }
-
-       my_current_overlay = n;
-}
-
-/*=========================================================================================
- */
-       void
-do_overlay_inner( View *v, float *data, long nvals, int 
suppress_screen_changes )
-{
-       options.overlay->overlay = gen_overlay_internal( v, data, nvals );
-       if( options.overlay->overlay != NULL ) {
-               options.overlay->doit = TRUE;
-               if( ! suppress_screen_changes ) {
-                       invalidate_all_saveframes();
-                       change_view( 0, FRAMES );
-                       }
-               }
-}
-
-/*=========================================================================================
- * This is called just once, when ncview starts up.  In particular,
- * it is NOT called every time we start a new overlay.
- */
-       void
-overlay_init()
-{
-       my_current_overlay       = OVERLAY_NONE;
-       options.overlay->overlay = NULL;
-       options.overlay->doit    = FALSE;
-}
-
-/*======================================================================================
- * NOTE: overlay_base_dir must already be allocated to length 'n'
- */
-       void
-determine_overlay_base_dir( char *overlay_base_dir, int n )
-{
-       char    *dir;
-
-       dir = (char *)getenv( "NCVIEWBASE" );
-       if( dir == NULL ) {
-#ifdef NCVIEW_LIB_DIR
-               if( strlen(NCVIEW_LIB_DIR) >= n ) {
-                       fprintf( stderr, "Error, routine 
determine_overlay_base_dir, string NCVIEW_LIB_DIR too long! Max=%d\n", n );
-                       exit(-1);
-                       }
-               strcpy( overlay_base_dir, NCVIEW_LIB_DIR );
-#else
-               strcpy( overlay_base_dir, "." );
-#endif
-               }
-       else
-               {
-               if( strlen(dir) >= n ) {
-                       fprintf( stderr, "Error, routine 
determine_overlay_base_dir, length of dir is too long! Max=%d\n", n );
-                       exit(-1);
-                       }
-               strcpy( overlay_base_dir, dir );
-               }
-}
-
-/******************************************************************************
- * Generate an overlay from data in an overlay file.  There are 'nvals'
- * PAIRS of coordinates (for a shoreline, for example).  data[0] is the
- * first X coordinate, data[1] is the first Y coordinate, data[2] is the
- * second X coordinate, etc.
- */
-       int *
-gen_overlay_internal( View *v, float *data, long nvals )
-{
-       NCDim   *dim_x, *dim_y;
-       size_t  x_size, y_size, ii, jj, min_ii, min_jj, 
cursor_place[MAX_NC_DIMS];
-       int     *overlay, has_bnds, x_is_mapped, y_is_mapped;
-       float   x, y, *dimval_x_2d, *dimval_y_2d;
-       long    i, j, kk;
-       nc_type dimval_type;
-       double  tval, bnds_min, bnds_max, dx, dy, dist, mindist;
-       char    cval[1024];
-
-       dim_x = *(v->variable->dim + v->x_axis_id);
-       dim_y = *(v->variable->dim + v->y_axis_id);
-
-       x_size = *(v->variable->size + v->x_axis_id);
-       y_size = *(v->variable->size + v->y_axis_id);
-
-       overlay = (int *)malloc( x_size*y_size*sizeof(int) );
-       if( overlay == NULL ) {
-               in_error( "Malloc of overlay field failed\n" );
-               return( NULL );
-               }
-       for( ii=0; ii<x_size*y_size; ii++ )
-               *(overlay+ii) = 0;
-
-       x_is_mapped = (v->variable->dim_map_info[ v->x_axis_id ] != NULL);
-       y_is_mapped = (v->variable->dim_map_info[ v->y_axis_id ] != NULL);
-       if( x_is_mapped || y_is_mapped ) {
-printf( "OVERLAY: is mapped %ld %ld %d\n", x_size, y_size, v->variable->n_dims 
);
-               dimval_x_2d = (float *)malloc( x_size*y_size*sizeof(float) );
-               dimval_y_2d = (float *)malloc( x_size*y_size*sizeof(float) );
-               if( (dimval_x_2d==NULL) || (dimval_y_2d==NULL) ) {
-                       in_error( "Malloc of overlay (distance) field failed\n" 
);
-                       return( NULL );
-                       }
-               for( ii=0; ii<v->variable->n_dims; ii++ )
-                       cursor_place[ii] = v->var_place[ii];
-
-               /* Step 1. Get temporary arrays that hold full 2-D X and Y 
values */
-printf( "OVERLAY: step 1\n" );
-               for( jj=0; jj<y_size; jj++ )
-               for( ii=0; ii<x_size; ii++ ) {
-                       cursor_place[ v->x_axis_id ] = ii;
-                       cursor_place[ v->y_axis_id ] = jj;
-
-                       /* Get X value */
-                       dimval_type = fi_dim_value( v->variable, v->x_axis_id, 
ii, &tval, cval,
-                               &has_bnds, &bnds_min, &bnds_max, cursor_place );
-                       if( dimval_type == NC_DOUBLE )
-                               dimval_x_2d[ii + jj*x_size] = tval;
-                       else
-                               dimval_x_2d[ii + jj*x_size] = dim_x->values[ii];
-
-                       /* Get Y value */
-                       dimval_type = fi_dim_value( v->variable, v->y_axis_id, 
ii, &tval, cval,
-                               &has_bnds, &bnds_min, &bnds_max, cursor_place );
-                       if( dimval_type == NC_DOUBLE )
-                               dimval_y_2d[ii + jj*x_size] = tval;
-                       else
-                               dimval_y_2d[ii + jj*x_size] = dim_y->values[jj];
-                       }
-
-               /* Step 2. For each point specified in the overlay file, get 
the CLOSEST
-                * point in the 2-D X and Y arrays.
-                */
-printf( "OVERLAY: step 2\n" );
-               for( kk=0; kk<nvals; kk+=2 ) {
-                       x = data[kk];
-                       y = data[kk+1];
-
-                       mindist = 1.e99;
-                       for( jj=0; jj<y_size; jj++ )
-                       for( ii=0; ii<x_size; ii++ ) {
-                               dx = x - dimval_x_2d[ii+jj*x_size];
-                               dy = y - dimval_y_2d[ii+jj*x_size];
-                               dist = dx*dx + dy*dy;
-                               if( dist < mindist ) {
-                                       mindist = dist;
-                                       min_ii = ii;    /* here, 'min' means 
MINIMUM DISTANCE, not min value of ii */
-                                       min_jj = jj;
-                                       }
-                               }
-
-                       /* Disallow points on the edges */
-                       if( (min_ii != 0) && (min_ii != x_size) && (min_jj != 
0) && (min_jj != y_size))
-                               *(overlay + min_jj*x_size + min_ii) = 1;
-                       }
-               free(dimval_x_2d);
-               free(dimval_y_2d);
-               }
-       else
-               {
-               for( ii=0; ii<nvals; ii+=2 ) {
-                       x = data[ii];
-                       y = data[ii+1];
-
-                       i = gen_xform( x, x_size, dim_x->values );
-                       if( i == -2 ) 
-                               return( NULL );
-                       j = gen_xform( y, y_size, dim_y->values );
-                       if( j == -2 ) 
-                               return( NULL );
-                       if( (i > 0) && (j > 0)) 
-                               *(overlay + j*x_size + i) = 1;
-                       }
-               }
-
-       return( overlay );
-}
-
-/******************************************************************************
- * Generate an overlay from data in an overlay file.
- */
-       int *
-gen_overlay( View *v, char *overlay_fname )
-{
-       FILE    *f;
-       char    err_mess[1024], line[80], *id_string="NCVIEW-OVERLAY";
-       float   x, y, version;
-       long    i, j;
-       size_t  x_size, y_size;
-       int     *overlay;
-       NCDim   *dim_x, *dim_y;
-
-       /* Open the overlay file */
-       if( (f = fopen(overlay_fname, "r")) == NULL ) {
-               sprintf( err_mess, "Error: can't open overlay file named 
\"%s\"\n", 
-                       overlay_fname );
-               in_error( err_mess );
-               return( NULL );
-               }
-
-       /* Make sure it is a valid overlay file
-        */
-       if( fgets(line, 80, f) == NULL ) {
-               sprintf( err_mess, "Error trying to read overlay file named 
\"%s\"\n",
-                       overlay_fname );
-               in_error( err_mess );
-               return( NULL );
-               }
-       for( i=0; i<strlen(id_string); i++ )
-               if( line[i] != id_string[i] ) {
-                       sprintf( err_mess, "Error trying to read overlay file 
named \"%s\"\nFile does not start with \"%s version-num\"\n", 
-                               overlay_fname, id_string );
-                       in_error( err_mess );
-                       return( NULL );
-                       }
-       sscanf( line, "%*s %f", &version );
-       if( (version < 0.95) || (version > 1.05)) {
-               sprintf( err_mess, "Error, overlay file has unknown version 
number: %f\nI am set up for version 1.0\n", version );
-               in_error( err_mess );
-               return( NULL );
-               }
-
-       dim_x = *(v->variable->dim + v->x_axis_id);
-       dim_y = *(v->variable->dim + v->y_axis_id);
-
-       x_size = *(v->variable->size + v->x_axis_id);
-       y_size = *(v->variable->size + v->y_axis_id);
-
-       overlay = (int *)malloc( x_size*y_size*sizeof(int) );
-       if( overlay == NULL ) {
-               in_error( "Malloc of overlay field failed\n" );
-               return( NULL );
-               }
-       for( i=0; i<x_size*y_size; i++ )
-               *(overlay+i) = 0;
-
-       /* Read in the overlay file -- skip lines with first char of #, 
-        * they are comments.
-        */
-       while( fgets(line, 80, f) != NULL ) 
-               if( line[0] != '#' ) {
-                       sscanf( line, "%f %f", &x, &y );
-                       i = gen_xform( x, x_size, dim_x->values );
-                       if( i == -2 ) 
-                               return( NULL );
-                       j = gen_xform( y, y_size, dim_y->values );
-                       if( j == -2 ) 
-                               return( NULL );
-                       if( (i > 0) && (j > 0)) 
-                               *(overlay + j*x_size + i) = 1;
-                       }
-
-       return( overlay );
-}
-
-/******************************************************************************
- * Given the (dimensional) value from the overlay file, convert it to 
- * the nearest index along the proper dimension that the point corresponds to.
- * 'n' is the length of array dimvals.
- *
- * For example, 'value' might be 160.0, and dimvals might go from 0.0 to 359.0
- * by 1.0, in which case n=360.  Then, the returned value is the location in
- * array dimvals that is closest to 160.0, in this case, it will be 160.
- */
-       int
-gen_xform( float value, int n, float *dimvals )
-{
-       float   min_dist, dist;
-       int     i, min_place;
-
-       min_dist  = 1.0e35;
-       min_place = 0;
-
-       /* See if off ends of dimvalues ... remember that it can be reversed */
-       if( *dimvals > *(dimvals+n-1) ) {
-               /* reversed */
-               if( value > *dimvals )
-                       return( -1 );
-               if( value < *(dimvals+n-1) )
-                       return( -1 );
-               }
-       else
-               {
-               if( value < *dimvals )
-                       return( -1 );
-               if( value > *(dimvals+n-1) )
-                       return( -1 );
-               }
-       
-       for( i=0; i<n; i++ ) {
-               dist = fabs(*(dimvals+i) - value);
-               if( dist < min_dist ) {
-                       min_dist  = dist;
-                       min_place = i;
-                       }
-               }
-
-       return( min_place );
-}
-
-/****************************************************************************************/
-       char **
-overlay_names( void )
-{
-       return( my_overlay_names );
-}
-
-/****************************************************************************************/
-       int
-overlay_current( void )
-{
-       return( my_current_overlay );
-}
-
-/****************************************************************************************/
-       int
-overlay_n_overlays( void )
-{
-       return( OVERLAY_N_OVERLAYS );
-}
-
-/****************************************************************************************/
-       int
-overlay_custom_n( void )
-{
-       return( OVERLAY_CUSTOM );
-}
-
diff --git a/src/udu.c b/src/udu.c
index 38950f5..c9aef38 100644
--- a/src/udu.c
+++ b/src/udu.c
@@ -204,7 +204,7 @@ int udu_calc_tgran( int fileid, NCVar *v, int dimid )
 }
 
 
/******************************************************************************/
-void udu_fmt_time( char *temp_string, double new_dimval, NCDim *dim, int 
include_granularity )
+void udu_fmt_time( char *temp_string, size_t temp_string_len, double 
new_dimval, NCDim *dim, int include_granularity )
 {
        static  ut_unit *dataunits=NULL;
        int     year, month, day, hour, minute, debug;
@@ -219,7 +219,7 @@ void udu_fmt_time( char *temp_string, double new_dimval, 
NCDim *dim, int include
                dim->name, dim->units, new_dimval );
 
        if( ! valid_udunits_pkg ) {
-               sprintf( temp_string, "%lg", new_dimval );
+               snprintf( temp_string, temp_string_len-1, "%lg", new_dimval );
                return;
                }
 
@@ -248,23 +248,23 @@ void udu_fmt_time( char *temp_string, double new_dimval, 
NCDim *dim, int include
                        case TGRAN_YEAR:
                        case TGRAN_MONTH:
                        case TGRAN_DAY:
-                               sprintf( temp_string, "%1d-%s-%04d", day, 
months[month-1], year );
+                               snprintf( temp_string, temp_string_len-1, 
"%1d-%s-%04d", day, months[month-1], year );
                                break;
 
                        case TGRAN_HOUR:
                        case TGRAN_MIN:
-                               sprintf( temp_string, "%1d-%s-%04d %02d:%02d", 
day, 
+                               snprintf( temp_string, temp_string_len-1, 
"%1d-%s-%04d %02d:%02d", day, 
                                                months[month-1], year, hour, 
minute );
                                break;
 
                        default:
-                               sprintf( temp_string, "%1d-%s-%04d 
%02d:%02d:%02.0f",
+                               snprintf( temp_string, temp_string_len-1, 
"%1d-%s-%04d %02d:%02d:%02.0f",
                                        day, months[month-1], year, hour, 
minute, second );
                        }
                }
        else
                {
-               sprintf( temp_string, "%1d-%s-%04d %02d:%02d:%02.0f",
+               snprintf( temp_string, temp_string_len-1, "%1d-%s-%04d 
%02d:%02d:%02.0f",
                                day, months[month-1], year, hour, minute, 
second );
                }
 }
@@ -318,9 +318,9 @@ int udu_calc_tgran( int fileid, NCVar *v, int dimid )
        return( 0 );
 }
 
-void udu_fmt_time( char *temp_string, double new_dimval, NCDim *dim, int 
include_granularity )
+void udu_fmt_time( char *temp_string, size_t temp_string_len, double 
new_dimval, NCDim *dim, int include_granularity )
 {
-       sprintf( temp_string, "%g", new_dimval );
+       snprintf( temp_string, temp_string_len-1, "%g", new_dimval );
 }
 
 #endif
diff --git a/src/utCalendar2_cal.c b/src/utCalendar2_cal.c
index 0c9db9a..93c4ee8 100644
--- a/src/utCalendar2_cal.c
+++ b/src/utCalendar2_cal.c
@@ -429,8 +429,9 @@ static cv_converter *get_user_to_day_converter( ut_unit 
*uu, int y0, int mon0, i
        ut_unit         *udu_days;
        cv_converter    *conv_user_units_to_days;
 
-       sprintf( daystr, "days since %04d-%02d-%02d %02d:%02d:%f",
+       snprintf( daystr, 1024, "days since %04d-%02d-%02d %02d:%02d:%f",
                y0, mon0, d0, h0, min0, s0 );
+       daystr[1023] = '\0';
                
        udu_days = ut_parse( ut_get_system(uu), daystr, UT_ASCII );
        if( udu_days == NULL ) {
@@ -458,8 +459,9 @@ static cv_converter *get_day_to_user_converter( ut_unit 
*uu, int y0, int mon0, i
        ut_unit         *udu_days;
        cv_converter    *conv_days_to_user_units;
 
-       sprintf( daystr, "days since %04d-%02d-%02d %02d:%02d:%f",
+       snprintf( daystr, 1024, "days since %04d-%02d-%02d %02d:%02d:%f",
                y0, mon0, d0, h0, min0, s0 );
+       daystr[1023] = '\0';
                
        udu_days = ut_parse( ut_get_system(uu), daystr, UT_ASCII );
        if( udu_days == NULL ) {
@@ -532,8 +534,9 @@ static void initialize( ut_system *units_system )
         */
        tval = 0.0;
        ut_decode_time( tval, &y0lib, &mon0lib, &d0lib, &h0lib, &min0lib, 
&s0lib, &rez );
-       sprintf( ustr, "seconds since %04d-%02d-%02d %02d:%02d:%f",
+       snprintf( ustr, 1024, "seconds since %04d-%02d-%02d %02d:%02d:%f",
                y0lib, mon0lib, d0lib, h0lib, min0lib, s0lib );
+       ustr[1023] = '\0';
        udu_ref_date = ut_parse( units_system, ustr, UT_ASCII );
        if( udu_ref_date == NULL ) {    
                fprintf( stderr, "internal error in routine 
utCalendar2/initialize: could not parse origin string \"%s\"\n",
diff --git a/src/util.c b/src/util.c
index 708023d..5dc5488 100644
--- a/src/util.c
+++ b/src/util.c
@@ -265,7 +265,7 @@ data_to_pixels( View *v )
                in_set_cursor_normal();
                in_button_pressed( BUTTON_PAUSE, MOD_1 );
                if( options.min_max_method == MIN_MAX_METHOD_EXHAUST ) {
-                       sprintf( error_message, "min and max both 0 for 
variable %s (checked all data)\nSetting range to (-1,1)", 
+                       snprintf( error_message, 1022, "min and max both 0 for 
variable %s (checked all data)\nSetting range to (-1,1)", 
                                                                
v->variable->name );
                        in_error( error_message );
                        v->variable->user_max = 1;
@@ -273,7 +273,7 @@ data_to_pixels( View *v )
                        v->variable->auto_set_no_range = 1;
                        return( data_to_pixels(v) );
                        }
-               sprintf( error_message, "min and max both 0 for variable %s.\nI 
can check ALL the data instead of subsampling if that's OK,\nor just cancel 
viewing this variable.",
+               snprintf( error_message, 1022, "min and max both 0 for variable 
%s.\nI can check ALL the data instead of subsampling if that's OK,\nor just 
cancel viewing this variable.",
                                        v->variable->name );
                result = in_dialog( error_message, NULL, TRUE );
                if( result == MESSAGE_OK ) {
@@ -283,7 +283,7 @@ data_to_pixels( View *v )
                        options.min_max_method = orig_minmax_method;
                        if( (v->variable->user_max == 0) &&
                            (v->variable->user_min == 0) ) {
-                               sprintf( error_message, "min and max both 0 for 
variable %s (checked all data)\nSetting range to (-1,1)", 
+                               snprintf( error_message, 1022, "min and max 
both 0 for variable %s (checked all data)\nSetting range to (-1,1)", 
                                                                
v->variable->name );
                                in_error( error_message );
                                v->variable->user_max = 1;
@@ -304,7 +304,7 @@ data_to_pixels( View *v )
 
        if( (v->variable->user_max == v->variable->user_min) && (! 
options.autoscale) ) {
                in_set_cursor_normal();
-               sprintf( error_message, "min and max both %g for variable %s",
+               snprintf( error_message, 1022, "min and max both %g for 
variable %s",
                        v->variable->user_min, v->variable->name );
                x_error( error_message );
                if( ! data_has_mv( v->data, x_size*y_size, fill_value ) ) {
@@ -756,13 +756,13 @@ check_ranges( NCVar *var )
 
        if( netcdf_min_max_option_set( var, &min, &max ) ) {
                if( var->global_min < min ) {
-                       sprintf( temp_string, "Calculated minimum (%g) is less 
than\nvalid_range minimum (%g).  Reset\nminimum to valid_range minimum?", 
var->global_min, min );
+                       snprintf( temp_string, 1022, "Calculated minimum (%g) 
is less than\nvalid_range minimum (%g).  Reset\nminimum to valid_range 
minimum?", var->global_min, min );
                        message = in_dialog( temp_string, NULL, TRUE );
                        if( message == MESSAGE_OK )
                                var->global_min = min;
                        }
                if( var->global_max > max ) {
-                       sprintf( temp_string, "Calculated maximum (%g) is 
greater\nthan valid_range maximum (%g). Reset\nmaximum to valid_range 
maximum?", var->global_max, max );
+                       snprintf( temp_string, 1022, "Calculated maximum (%g) 
is greater\nthan valid_range maximum (%g). Reset\nmaximum to valid_range 
maximum?", var->global_max, max );
                        message = in_dialog( temp_string, NULL, TRUE );
                        if( message == MESSAGE_OK )
                                var->global_max = max;
@@ -771,7 +771,7 @@ check_ranges( NCVar *var )
 
        if( netcdf_min_option_set( var, &min ) ) {
                if( var->global_min < min ) {
-                       sprintf( temp_string, "Calculated minimum (%g) is less 
than\nvalid_min minimum (%g).  Reset\nminimum to valid_min value?", 
var->global_min, min );
+                       snprintf( temp_string, 1022, "Calculated minimum (%g) 
is less than\nvalid_min minimum (%g).  Reset\nminimum to valid_min value?", 
var->global_min, min );
                        message = in_dialog( temp_string, NULL, TRUE );
                        if( message == MESSAGE_OK )
                                var->global_min = min;
@@ -780,7 +780,7 @@ check_ranges( NCVar *var )
 
        if( netcdf_max_option_set( var, &max ) ) {
                if( var->global_max > max ) {
-                       sprintf( temp_string, "Calculated maximum (%g) is 
greater than\nvalid_max maximum (%g).  Reset\nmaximum to valid_max value?", 
var->global_max, max );
+                       snprintf( temp_string, 1022, "Calculated maximum (%g) 
is greater than\nvalid_max maximum (%g).  Reset\nmaximum to valid_max value?", 
var->global_max, max );
                        message = in_dialog( temp_string, NULL, TRUE );
                        if( message == MESSAGE_OK )
                                var->global_max = max;
@@ -2071,7 +2071,7 @@ warn_if_file_exits( char *fname )
                return( MESSAGE_OK );
        fclose(f);
 
-       sprintf( message, "OK to overwrite existing file %s?\n", fname );
+       snprintf( message, 1022, "OK to overwrite existing file %s?\n", fname );
        retval = in_dialog( message, NULL, TRUE );
        return( retval );
 }
@@ -2152,7 +2152,7 @@ months_calc_tgran( int fileid, NCDim *d )
 }
 
 
/******************************************************************************/
-void fmt_time( char *temp_string, double new_dimval, NCDim *dim, int 
include_granularity )
+void fmt_time( char *temp_string, size_t temp_string_len, double new_dimval, 
NCDim *dim, int include_granularity )
 {
        int     year, month, day;
 
@@ -2163,10 +2163,10 @@ void fmt_time( char *temp_string, double new_dimval, 
NCDim *dim, int include_gra
                }
 
        if( dim->time_std == TSTD_UDUNITS ) 
-               udu_fmt_time( temp_string, new_dimval, dim, include_granularity 
);
+               udu_fmt_time( temp_string, temp_string_len, new_dimval, dim, 
include_granularity );
 
        else if( dim->time_std == TSTD_EPIC_0 ) 
-               epic_fmt_time( temp_string, new_dimval, dim );
+               epic_fmt_time( temp_string, temp_string_len, new_dimval, dim );
 
        else if( dim->time_std == TSTD_MONTHS ) {
                /* Format for months standard */
@@ -2176,7 +2176,7 @@ void fmt_time( char *temp_string, double new_dimval, 
NCDim *dim, int include_gra
                month = (month > 11) ? 11 : month;
                day   =
                   (int)( ((new_dimval-1.0) - year*12 - month) * 30.0) + 1;
-               sprintf( temp_string, "%s %2d %4d", month_name[month],
+               snprintf( temp_string, temp_string_len-1, "%s %2d %4d", 
month_name[month],
                                day, year+1 );
                }
 
diff --git a/src/view.c b/src/view.c
index 1ff72a1..7ef0f2c 100644
--- a/src/view.c
+++ b/src/view.c
@@ -491,18 +491,18 @@ set_scan_view( size_t scan_place )
                        temp_string, &has_bounds, &bound_min, &bound_max, 
view->var_place );
        if( type == NC_DOUBLE ) {
                if( dim->timelike && options.t_conv ) {
-                       fmt_time( temp_string, new_dimval, dim, 1 );
+                       fmt_time( temp_string, 1024, new_dimval, dim, 1 );
                        strcat( view_place, temp_string );
                        if( has_bounds ) {
                                snprintf( temp_string, 1023, " (%d bnds:", 
has_bounds );
                                strcat( view_place, temp_string );
 
-                               fmt_time( temp_string, bound_min, dim, 0 );
+                               fmt_time( temp_string, 1024, bound_min, dim, 0 
);
                                strcat( view_place, temp_string );
 
                                strcat( view_place, " -> " );
 
-                               fmt_time( temp_string, bound_max, dim, 0 );
+                               fmt_time( temp_string, 1024, bound_max, dim, 0 
);
                                strcat( view_place, temp_string );
 
                                strcat( view_place, ")" );
@@ -1209,7 +1209,7 @@ view_change_cur_dim( char *dim_name, int modifier )
                &has_bounds, &bound_min, &bound_max, view->var_place );
        if( type == NC_DOUBLE ) {
                if( dim->timelike && options.t_conv ) {
-                       fmt_time( temp_string, new_dimval, dim, 1 );
+                       fmt_time( temp_string, 1024, new_dimval, dim, 1 );
                        }
                else
                        snprintf( temp_string, 1023, "%lg", new_dimval );
@@ -2105,7 +2105,7 @@ view_report_position( int x, int y, unsigned int 
button_mask )
                        temp_string, &has_bounds, &bound_min, &bound_max, 
virt_cursor_pos );
        if( type == NC_DOUBLE ) {
                if( (xdim != NULL) && xdim->timelike && options.t_conv )
-                       fmt_time( xdim_str, new_dimval, xdim, 1 );
+                       fmt_time( xdim_str, 79, new_dimval, xdim, 1 );
                else
                        snprintf( xdim_str, 79, "%.7lg", new_dimval );
                }
@@ -2116,7 +2116,7 @@ view_report_position( int x, int y, unsigned int 
button_mask )
                        temp_string, &has_bounds, &bound_min, &bound_max, 
virt_cursor_pos );
        if( type == NC_DOUBLE ) {
                if( (ydim != NULL) && ydim->timelike && options.t_conv )
-                       fmt_time( ydim_str, new_dimval, ydim, 1 );
+                       fmt_time( ydim_str, 79, new_dimval, ydim, 1 );
                else
                        snprintf( ydim_str, 79, "%.7lg", new_dimval );
                }
@@ -2219,7 +2219,7 @@ view_report_position_vals( float xval, float yval, int 
plot_index )
 
        /* If the X dimension is timelike, consider formatting that value */
        if( (dim != NULL) && dim->timelike && options.t_conv ) {
-               fmt_time( temp, xval, dim, 1 );
+               fmt_time( temp, 79, xval, dim, 1 );
                snprintf( current_value_label, 79, "Current: x=%s, y=%g",
                                temp, yval );
                }
@@ -2899,15 +2899,15 @@ plot_XY_sc( size_t *start, size_t *count )
 
 
/**************************************************************************************/
        void
-view_plot_XY_fmt_x_val( float val, int dimindex, char *s )
+view_plot_XY_fmt_x_val( float val, int dimindex, char *s, size_t s_len )
 {
        NCDim   *dim;
 
        dim = *(view->variable->dim + dimindex);
        if( dim->timelike && options.t_conv )
-               fmt_time( s, val, dim, 1 );
+               fmt_time( s, s_len-1, val, dim, 1 );
        else
-               sprintf( s, "%g", val );
+               snprintf( s, s_len-1, "%g", val );
 }
 
 
/**************************************************************************************/
@@ -3031,6 +3031,13 @@ view_change_transform( int delta )
 /***************************************************************************/
 void view_recompute_colorbar( void )
 {
+       /* The user might ask to rearrange colormaps before any
+        * variable is selected. In that event, return 
+        * immediately
+        */
+       if( (view == NULL) || (view->variable == NULL))
+               return;
+
        if( options.debug ) {
                fprintf( stderr, "view_recompute_colorbar: entering\n" );
                fprintf( stderr, "view_recompute_colorbar: about to call 
x_create_colorbar with user_min=%f user_max=%f transform=%d\n",

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/pkg-grass/ncview.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