1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
|
/*
* Copyright 1993, University Corporation for Atmospheric Research
* See netcdf/COPYRIGHT file for copying and redistribution conditions.
*/
/* $Id: error.c,v 1.14 90/02/23 16:08:55 davis Exp */
/*LINTLIBRARY*/
#include "ncconfig.h"
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include "netcdf.h"
#ifndef NO_STRERROR
#include <string.h> /* contains prototype for ansi libc function strerror() */
#else
/* provide a strerror function for older unix systems */
static char *
strerror(int errnum)
{
extern int sys_nerr;
extern char *sys_errlist[];
if(errnum < 0 || errnum >= sys_nerr) return NULL;
/* else */
return sys_errlist[errnum];
}
#endif /* NO_STRERROR */
#ifdef vms
/* UNTESTED */
/*
* On the vms system, when a system error occurs which is not
* mapped into the unix styled errno values, errno is set EVMSERR
* and a VMS error code is set in vaxc$errno.
* This routine prints the systems message associated with status return
* from a system services call.
*/
#include <errno.h>
#include <descrip.h>
#include <ssdef.h>
static const char *
vms_strerror( int status )
{
short msglen;
static char msgbuf[256];
$DESCRIPTOR(message, msgbuf);
register ret;
msgbuf[0] = 0;
ret = SYS$GETMSG(status, &msglen, &message, 15, 0);
if(ret != SS$_BUFFEROVF && ret != SS$_NORMAL) {
(void) strcpy(msgbuf, "EVMSERR");
}
return(msgbuf);
}
#endif /* vms */
static char unknown[] = "Unknown Error";
const char *
nc_strerror(int err)
{
#ifdef vms
if(err == EVMSERR)
{
return vms_strerror(err);
}
/* else */
#endif /* vms */
if(NC_ISSYSERR(err))
{
const char *cp = (const char *) strerror(err);
if(cp == NULL)
return unknown;
/* else */
return cp;
}
/* else */
switch (err) {
case NC_NOERR:
return "No error";
case NC_EBADID:
return "Not a netCDF id";
case NC_ENFILE:
return "Too many netCDF files open";
case NC_EEXIST:
return "netCDF file exists && NC_NOCLOBBER";
case NC_EINVAL:
return "Invalid argument";
case NC_EPERM:
return "Write to read only";
case NC_ENOTINDEFINE:
return "Operation not allowed in data mode";
case NC_EINDEFINE:
return "Operation not allowed in define mode";
case NC_EINVALCOORDS:
return "Index exceeds dimension bound";
case NC_EMAXDIMS:
return "NC_MAX_DIMS exceeded";
case NC_ENAMEINUSE:
return "String match to name in use";
case NC_ENOTATT:
return "Attribute not found";
case NC_EMAXATTS:
return "NC_MAX_ATTRS exceeded";
case NC_EBADTYPE:
return "Not a netCDF data type or _FillValue type mismatch";
case NC_EBADDIM:
return "Invalid dimension id or name";
case NC_EUNLIMPOS:
return "NC_UNLIMITED in the wrong index";
case NC_EMAXVARS:
return "NC_MAX_VARS exceeded";
case NC_ENOTVAR:
return "Variable not found";
case NC_EGLOBAL:
return "Action prohibited on NC_GLOBAL varid";
case NC_ENOTNC:
return "Not a netCDF file";
case NC_ESTS:
return "In Fortran, string too short";
case NC_EMAXNAME:
return "NC_MAX_NAME exceeded";
case NC_EUNLIMIT:
return "NC_UNLIMITED size already in use";
case NC_ENORECVARS:
return "nc_rec op when there are no record vars";
case NC_ECHAR:
return "Attempt to convert between text & numbers";
case NC_EEDGE:
return "Edge+start exceeds dimension bound";
case NC_ESTRIDE:
return "Illegal stride";
case NC_EBADNAME:
return "Attribute or variable name contains illegal characters";
case NC_ERANGE:
return "Numeric conversion not representable";
case NC_ENOMEM:
return "Memory allocation (malloc) failure";
}
/* default */
return unknown;
}
|