function [varargout] = mexcdf(varargin)

% mexcdf -- Driver for Matlab-5/NetCDF C-Language interface.
%  mexcdf('action', ...) performs the specified NetCDF action.
%   When writing or reading a NetCDF variable, the dimensional
%   sequence of the targetted Matlab array must be reversed,
%   either BEFORE using 'varput' or 'varputg', or AFTER using
%   'varget' or 'vargetg'.  This preserves the left-to-right
%   dimensional arrangement that is defined by 'vardef' and
%   retrieved by 'varinq'.  Data output from a variable are
%   returned as a Matlab matrix (two-dimensional), in keeping
%   with the behavior of mexcdf under Matlab-4.  The base-index
%   for slabs is zero (0), and -1 can be used to specify the
%   remaining count along any variable direction from the
%   starting point.  NOTE: a vector (an array with no more
%   than one non-unity dimension) is always returned as
%   a column, by mexcdf convention.
%
%   To process multi-dimensional arrays under Matlab-5,
%   use "ncmex", rather than "mexcdf".
%
% mexcdf('USAGE')
% [cdfid, rcode] = mexcdf('CREATE', 'path', cmode)
% cdfid = mexcdf('OPEN', 'path', mode)
% status = mexcdf('REDEF', cdfid)
% status = mexcdf('ENDEF', cdfid)
% [ndims, nvars, natts, recdim, status] = mexcdf('INQUIRE', cdfid)
% status = mexcdf('SYNC', cdfid)
% status = mexcdf('ABORT', cdfid)
% status = mexcdf('CLOSE', cdfid)
%
% status = mexcdf('DIMDEF', cdfid, 'name', length)
% [dimid, rcode] = mexcdf('DIMID', cdfid, 'name')
% ['name', length, status] = mexcdf('DIMINQ', cdfid, dimid)
% status = mexcdf('DIMRENAME', cdfid, 'name')
%
% status = mexcdf('VARDEF', cdfid, 'name', datatype, ndims, [dim])
% [varid, rcode] = mexcdf('VARID', cdfid, 'name')
% ['name', datatype, ndims, [dim], natts, status] = mexcdf('VARINQ', cdfid, varid)
% status = mexcdf('VARPUT1', cdfid, varid, coords, value, autoscale)
% [value, status] = mexcdf('VARGET1', cdfid, varid, coords, autoscale)
% status = mexcdf('VARPUT', cdfid, varid, start, count, value, autoscale)
% [value, status] = mexcdf('VARGET', cdfid, varid, start, count, autoscale)
% status = mexcdf('VARPUTG', cdfid, varid, start, count, stride, [], value, autoscale)
% [value, status] = mexcdf('VARGETG', cdfid, varid, start, count, stride, [], autoscale)
% status = mexcdf('VARRENAME', cdfid, varid, 'name')
%
% status = mexcdf('ATTPUT', cdfid, varid, 'name', datatype, len, value) 
% [datatype, len, status] = mexcdf('ATTINQ', cdfid, varid, 'name')
% [value, status] = mexcdf('ATTGET', cdfid, varid, 'name')
% status = mexcdf('ATTCOPY', incdf, invar, 'name', outcdf, outvar)
% ['name', status] = mexcdf('ATTNAME', cdfid, varid, attnum)
% status = mexcdf('ATTRENAME', cdfid, varid, 'name', 'newname')
% status = mexcdf('ATTDEL', cdfid, varid, 'name')
%
% status = mexcdf('RECPUT', cdfid, recnum, [data], autoscale, recdim)
% [[data], status] = mexcdf('RECGET', cdfid, recnum, autoscale, recdim)
% [[recvarids], [recsizes], status] = mexcdf('RECINQ', cdfid, recdim)
%
% len = mexcdf('TYPELEN', datatype)
% old_fillmode = mexcdf('SETFILL', cdfid, fillmode)
%
% old_ncopts = mexcdf('SETOPTS', ncopts)
% ncerr = mexcdf('ERR')
% code = mexcdf('PARAMETER', 'NC_...')
%
% Notes:
%  1. The rcode is always zero.
%  2. The dimid can be number or name.
%  3. The varid can be number or name.
%  4. The attname can be name or number.
%  5. The operation and parameter names are not case-sensitive.
%  6. The cmode defaults to 'NC_NOCLOBBER'.
%  7. The mode defaults to 'NC_NOWRITE'.
%  8. The value -1 determines length automatically.
%  9. The operation names can prepend 'nc'.
% 10. The parameter names can drop 'NC_' prefix.
% 11. Dimensions: Matlab (i, j, ...) <==> [..., j, i] NetCDF.
% 12. Indices and identifiers are zero-based.
% 13. One-dimensional slabs are returned as column-vectors.
% 14. Attributes are returned as row-vectors.
% 15. Scaling can be automated via 'scale_factor' and 'add_offset'.
 
% Copyright (C) 1992-1997 Dr. Charles R. Denham, ZYDECO.
% All Rights Reserved.

% Version of 16-May-96 at 10:17:47.75.
% Version of 06-Jan-97 at 14:04:00.
% Version of 20-Mar-97 at 14:46:00.
% Version of 15-Jul-1997 07:52:23.
% Updated    07-Dec-2000 14:50:39.

if nargin < 1, help(mfilename), return, end

% Mex-file gateway.

v = version;
matversion=version('-release');
myversion=str2num(matversion(1:2));
if eval(v(1)) > 4 || myversion >= 20
	fcn = 'mexcdf53';   % Matlab-5 or 6.
elseif eval(v(1)) == 4
	fcn = 'mexcdf4';    % Matlab-4 only.
else
	error(' ## Unrecognized Matlab version.')
end

% The "record" routines are emulated.

op = lower(varargin{1});
if any(findstr(op, 'rec'))
	fcn = op;
	if ~strcmp(fcn(1:2), 'nc')
		fcn = ['nc' fcn];
	end
	varargin{1} = [];
end

% Matlab-5 comma-list syntax.

if nargout > 0
	varargout = cell(1, nargout);
	[varargout{:}] = feval(fcn, varargin{:});
else
	feval(fcn, varargin{:});
end

% Collapse to two-dimensions.

if nargout > 0
	switch op
	case {'varget', 'vargetg', 'ncvarget', 'ncvargetg'}
		theSize = size(varargout{1});
		f = find(theSize > 1);
		if ~any(f), f = 1; end
		if length(theSize) > 1   % Always true in Matlab.
			m = theSize(f(1));
			n = prod(theSize) ./ m;
			if m == 1, m = n; n = 1; end
			varargout{1} = reshape(varargout{1}, [m n]);
		end
	otherwise
	end
end
