# $Id: CDFput,v 1.2 1993/09/27 22:36:45 mintha Exp $
#
# Create a new newCDF file with data given
#
# $Log: CDFput,v $
# Revision 1.2  1993/09/27  22:36:45  mintha
# Check in
#
# Revision 1.1  1993/09/10  22:56:53  mintha
# Initial revision
#
"CDFput" <-
function(fname, var, data, clobber=F, unlim=F)
{
#
# Some checks first
#
	dnames <- attr(data, "dnames")
	if(is.null(dnames))
		stop("Data does not have a 'dnames' attribute\n")
	if(length(dnames) != length(dim(data)))
		stop("Number of 'dnames' does not equal number of dimensions\n")

	create <- .C("cdf_create",
		as.character(fname),
		ncid = integer(1),
		as.integer(clobber))

	if(create$ncid == -1)
		return(NULL)
#
# global attributes
#
	text <- "Created in Splus by CDFput"
	newattr <- .C("cdf_add_attr",
		as.integer(create$ncid),
		as.integer(-1),
		as.character("comment"),
		as.integer(2),
		as.integer(nchar(text)),
		as.character(text))
	text <- paste(c("Created: ", unix("date", output=T)),collapse="")
	newattr <- .C("cdf_add_attr",
		as.integer(create$ncid),
		as.integer(-1),
		as.character("history"),
		as.integer(2),
		as.integer(nchar(text)),
		as.character(text))
#
# Now create the dimensions and add the dim labels
#
	dims <- attr(data, "dims")
	if(is.null(dims)) dims <- dim(data)
	dimids <- numeric(length(dims))

	for(ctr in seq(to = length(dims))){
		newdim <- .C("cdf_add_dim",
			as.integer(create$ncid),
			id = integer(1),
			as.character(dnames[ctr]),
			as.integer(dims[ctr]),
			as.integer(unlim && ctr==length(dims)))
		dimids[ctr] <- newdim$id

		label <- attr(data, "labels")[ctr]
		if(is.null(label)){
			label <- paste(dimnames(data)[[ctr]],collapse=" ")
			if(label == "") label <- "NULL"
		}
		newattr <- .C("cdf_add_attr",
			as.integer(create$ncid),
			as.integer(-1),
			as.character(paste(c(dnames[ctr],".lab"),collapse="")),
			as.integer(2),
			as.integer(nchar(label)),
			as.character(label))
	}
#
# Now create the variable itself.
#
	if (is.integer(data)) storage.mode(data) <- "single"
	if (is.character(data)) type <- 2
	if (is.single(data)) type <- 5
	if (is.double(data)) type <- 6
	newvar <- .C("cdf_add_var",
		as.integer(create$ncid),
		id = integer(1),
		as.character(var),
		as.integer(type),
		as.integer(length(dims)),
		as.integer(rev(dimids)))
#
# Write out any additional attributes for the variable
#
	for(aname in names(attributes(data))){
		if(is.na(match(aname, c("dim","dnames","dims","labels","dimnames")))){
			aval <- attr(data, aname)
			len <- length(aval)
			if (is.character(aval)) atype <- 2
			if (is.single(aval)) atype <- 5
			if (is.double(aval)) atype <- 6
			if (is.character(aval)) len <- nchar(aval)
			newattr <- .C("cdf_add_attr",
				as.integer(create$ncid),
				as.integer(newvar$id),
				as.character(aname),
				as.integer(atype),
				as.integer(len),
				aval)
		}
	}

#
# leave define mode, and write out the data
#
	
	temp <- .C("cdf_data_mode",
		as.integer(create$ncid))

	start <- rep(1, length(dims))
	count <- dim(data)
	wrote <- .C("cdf_write_data",
		as.integer(create$ncid),
		as.integer(newvar$id),
		as.integer(type),
		as.integer(rev(start-1)),
		as.integer(rev(count)),
		data)
	
	temp <- .C("cdf_close",
		as.integer(create$ncid))
	cat("Wrote CDF\n")
}




