"hist" <-
function (x, breaks, freq = NULL, col = NULL, border = par("fg"),
	main = paste("Histogram of" , deparse(substitute(x))),
	xlim = range(breaks), ylim = range(y, 0),
	xlab = deparse(substitute(x)), ylab,
	axes=TRUE, plot = TRUE, ...)
{
	if (!is.numeric(x))
		stop("hist: x must be numeric")
	eval(main)
	eval(xlab)
	n <- length(x <- x[!is.na(x)])
	use.br <- !missing(breaks) && length(breaks) > 1
	breaks <-
	  if(use.br) sort(breaks)
	  else {
		rx <- range(x)
		pretty (rx + c(0, diff(rx)/1000),
			n = if(missing(breaks)) 1 + log2(n)
			else { # breaks = `nclass'
				if (is.na(breaks) | breaks < 2)
				  stop("invalid number of breaks")
				breaks
			})
	  }
	nB <- length(breaks)
	counts <- .C("bincount",
		as.double(x),
		n,
		as.double(breaks),
		nB,
		counts = integer(nB - 1),
		NAOK = FALSE) $counts
	if (any(counts < 0))
          stop("negative `counts'. Internal Error in C-code for \"bincount\"")
	if (is.null(freq))
	  freq <- if(use.br) {
		##-- Do frequencies if breaks are evenly spaced
		h <- diff(breaks)
		diff(range(h)) < 1e-10 * mean(h)
	  } else TRUE
        rel.freqs <- counts/(sum(x) * diff(breaks))
        if (missing(ylab))
        	ylab <- paste(if(!freq)"Relative ","Frequency", sep="")
	if(plot) {
                y <- if(freq) counts else rel.freqs #-> ylim's default
		plot.new()
		plot.window(xlim, ylim, "")
		title(main = main, xlab = xlab, ylab = ylab, ...)
		if(axes) {
			axis(1, ...)
			axis(2, ...)
		}
		rect(breaks[-nB], 0, breaks[-1], y,
		     col = col, border = border)
	}
	invisible(list(breaks = breaks, counts = counts, rel.freqs= rel.freqs,
                       mids = .5*(breaks[-1]+breaks[-nB])))
}
