From 1d79aec4e50e178322b8241ef06364b6b0389063 Mon Sep 17 00:00:00 2001 From: ARIADNA BATALLA FERRES Date: Thu, 2 Jan 2025 17:49:53 +0100 Subject: [PATCH 1/8] Add R/CONTRIBUTING.md --- R/CONTRIBUTING.md | 66 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 R/CONTRIBUTING.md diff --git a/R/CONTRIBUTING.md b/R/CONTRIBUTING.md new file mode 100644 index 0000000..81f87bb --- /dev/null +++ b/R/CONTRIBUTING.md @@ -0,0 +1,66 @@ +### Questions and bug reports + +If you have questions about the usage of a function or would like to report a bug, please follow these steps: + +1. Use the search function in GitLab to see if a similar problem has already been reported and/or solved. + +2. Rather than including a long script, try to run your code in small blocks to narrow down where the problem is coming from as much as possible. + +3. Open an issue tagging the maintainers (@abatalla) (@vagudets) (@tkariyat), and include a descriptive title and a piece of code to reproduce your problem (if applicable). + +### How to contribute + +If you would like to add a bugfix, an enhancement or a new functions, follow these steps: + +1. Open an issue to ask for help or describe a feature to be integrated + +2. Agree with the maintainers (@vagudets) on the requirements + +3. Create a new branch from master with a meaningful name + +4. Once the development is finished, open a merge request to merge the branch on master + +*Note: Remember to work with multidimensional arrays with named dimensions when possible and use multiApply (https://earth.bsc.es/gitlab/ces/multiApply)* + +### Adding a function + +To add a new function in this R package, follow these considerations: + +* Each function exposed to the users should be in its own separate file in the R folder +* The name of the function should match the name of the file (e.g.: `Function()` included in file **Function.R** +* The documentation should be in roxygen2 format as a header of the function +* Once the function and the documentation are finished, run the command `devtools::document()` in your R terminal to automatically generate the **Function.Rd** file +* When doing the development, please use an R version between R/4.1.2 and R/4.3.x + +### Style guide + +* Use `<-` for variable assignment +* Include spaces between operators (e.g. `+`, `-`, `&`), before `{`, and after `for`, `if`, `while`, `,` and `)`. +* When possible, maximum line length should be 100 characters (soft limit of 80 characters). +* Number of indentation spaces is 2, using tabs for indentation is forbidden. +* Double quotes are recommended for strings. When writing quotes within quoted text, use double quotes outside and single quotes inside. E.g.: `“Parameter 'na.rm' is missing.”` +* Self-explanatory names are preferred for variables. Try to be consistent with the variable naming style. Generally: avoid special characters (except underscores) and reserved words (ex: if, for, else, …) +* Remember to include short comments to make the code easier to understand. Comments should be in their own line and they should start with `#` followed by a space. Comments that start with `##` and a space are for details not needed to understand the general procedure but useful to make note of more technical aspects of the code. + +#### Examples: + +```r +# Proper spacing, indentation spaces and text quotes: +NewFunction <- function(text = "default", uppercase = TRUE) { + # Check uppercase parameter + if (!is.logical(uppercase)) { + stop("Parameter 'uppercase' should be TRUE or FALSE.") + } + # Only transform text if needed + if (uppercase && is.character(text)) { + text <- toupper(text) + } + return(text) +} + +# How to format line breaks to avoid long lines: +my_strings <- list(one = "one", + two = "two", + three = "three", + four = "four") +``` -- GitLab From a4f19f4a01cc8f6cc795f4a4c65acaa99c7bf99b Mon Sep 17 00:00:00 2001 From: ARIADNA BATALLA FERRES Date: Thu, 2 Jan 2025 17:54:50 +0100 Subject: [PATCH 2/8] Add link to CONTRIBUTING.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 2cd0ce0..3831630 100644 --- a/README.md +++ b/README.md @@ -25,3 +25,7 @@ The main functionalities are presented in four different vignettes with step by - [Diurnal temperature variation indicator](https://earth.bsc.es/gitlab/es/ClimProjDiags/blob/master/vignettes/diurnaltemp.Rmd): compares the future projection of diurnal temperature variations with a reference period. +### How to contribute? + +Information on questions, contributions and bug reports can be found in [**CONTRIBUTING.md**](CONTRIBUTING.md). + -- GitLab From 510f87ba5249689beeac414d258c4f59ed936584 Mon Sep 17 00:00:00 2001 From: ARIADNA BATALLA FERRES Date: Thu, 2 Jan 2025 17:55:50 +0100 Subject: [PATCH 3/8] R/CONTRIBUTING.md -> CONTRIBUTING.md --- R/CONTRIBUTING.md => CONTRIBUTING.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename R/CONTRIBUTING.md => CONTRIBUTING.md (100%) diff --git a/R/CONTRIBUTING.md b/CONTRIBUTING.md similarity index 100% rename from R/CONTRIBUTING.md rename to CONTRIBUTING.md -- GitLab From 0e20346645aeef2be74d46921624a0f240d07948 Mon Sep 17 00:00:00 2001 From: ARIADNA BATALLA FERRES Date: Thu, 2 Jan 2025 17:57:31 +0100 Subject: [PATCH 4/8] Update maintainers --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 81f87bb..e2e1b30 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,7 +6,7 @@ If you have questions about the usage of a function or would like to report a bu 2. Rather than including a long script, try to run your code in small blocks to narrow down where the problem is coming from as much as possible. -3. Open an issue tagging the maintainers (@abatalla) (@vagudets) (@tkariyat), and include a descriptive title and a piece of code to reproduce your problem (if applicable). +3. Open an issue tagging the maintainers (@vagudets) (@abatalla) (@tkariyat), and include a descriptive title and a piece of code to reproduce your problem (if applicable). ### How to contribute @@ -14,7 +14,7 @@ If you would like to add a bugfix, an enhancement or a new functions, follow the 1. Open an issue to ask for help or describe a feature to be integrated -2. Agree with the maintainers (@vagudets) on the requirements +2. Agree with the maintainers (@vagudets) (@abatalla) (@tkariyat) on the requirements 3. Create a new branch from master with a meaningful name -- GitLab From 47314bf08e8410c71a90b8dcd1a6e5d7e7510c96 Mon Sep 17 00:00:00 2001 From: vagudets Date: Mon, 4 Aug 2025 11:57:56 +0200 Subject: [PATCH 5/8] Remove PCICt dependency (WIP) --- .Rbuildignore | 2 +- DESCRIPTION | 7 +- NAMESPACE | 6 +- R/Climdex.R | 1 - R/DailyAno.R | 2 +- R/Extremes.R | 1 - R/PCICtFunctions.R | 850 ++++++++++++++++++++++++++++ R/SeasonSelect.R | 1 - R/Threshold.R | 1 - R/WaveDuration.R | 1 - man/as.PCICt.Rd | 25 + src/ClimProjDiags.so | Bin 0 -> 74656 bytes src/PCICt_init.c | 24 + src/PCICt_init.o | Bin 0 -> 5936 bytes src/datetime_360.c | 963 ++++++++++++++++++++++++++++++++ src/datetime_360.o | Bin 0 -> 66584 bytes src/strptime_360.h | 1249 ++++++++++++++++++++++++++++++++++++++++++ 17 files changed, 3122 insertions(+), 11 deletions(-) create mode 100644 R/PCICtFunctions.R create mode 100644 man/as.PCICt.Rd create mode 100755 src/ClimProjDiags.so create mode 100644 src/PCICt_init.c create mode 100644 src/PCICt_init.o create mode 100644 src/datetime_360.c create mode 100644 src/datetime_360.o create mode 100644 src/strptime_360.h diff --git a/.Rbuildignore b/.Rbuildignore index fd5f708..8a6f5c1 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -7,4 +7,4 @@ .*\.gitlab-ci.yml$ # Ignore tests when submitting to CRAN ^tests$ - +^CONTRIBUTING\.md$ diff --git a/DESCRIPTION b/DESCRIPTION index d0cf868..8787634 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,11 +1,11 @@ Package: ClimProjDiags Title: Set of Tools to Compute Various Climate Indices -Version: 0.3.3 +Version: 0.3.4 Authors@R: c( person("BSC-CNS", role = c("aut", "cph")), - person("Victòria", "Agudetse", , "victoria.agudetse@bsc.es", role = c("cre")), person("Nuria", "Perez-Zanon", , "nuria.perez@bsc.es", role = c("aut"), comment = c(ORCID = "0000-0001-8568-3071")), person("An-Chi", "Ho", , "an.ho@bsc.es", role = c("ctb")), + person("Victòria", "Agudetse", , "victoria.agudetse@bsc.es", role = c("cre")), person("Nicolau", "Manubens", , "nicolau.manubens@bsc.es", role = "ctb"), person("Alasdair", "Hunter", , "alasdair.hunter@bsc.es", role = "aut"), person("Louis-Philippe", "Caron", , "louis-philippe.caron@bsc.es", role = "ctb"), @@ -20,8 +20,9 @@ Description: Set of tools to compute metrics and indices for climate analysis. Depends: R (>= 3.2.0) Imports: + graphics, + methods, multiApply (>= 2.0.0), - PCICt, stats Suggests: knitr, diff --git a/NAMESPACE b/NAMESPACE index dd96fe5..12613e3 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -17,6 +17,10 @@ export(Threshold) export(WaveDuration) export(WeightedCells) export(WeightedMean) -import(PCICt) +export(as.PCICt) +import(methods) import(multiApply) +importFrom(graphics,axis) +importFrom(graphics,par) importFrom(stats,quantile) +useDynLib(ClimProjDiags) diff --git a/R/Climdex.R b/R/Climdex.R index a3e6ea7..3722c32 100644 --- a/R/Climdex.R +++ b/R/Climdex.R @@ -30,7 +30,6 @@ #'} #' #'@import multiApply -#'@import PCICt #'@examples #'##Example synthetic data: #'data <- 1:(2 * 3 * 372 * 1) diff --git a/R/DailyAno.R b/R/DailyAno.R index f0717d0..96d67fa 100644 --- a/R/DailyAno.R +++ b/R/DailyAno.R @@ -88,4 +88,4 @@ DailyAno <- function(data, jdays = NULL, dates = NULL, calendar = NULL, na.rm = anomalies[i] <- data[i] - climatology[index] } return(anomalies) -} \ No newline at end of file +} diff --git a/R/Extremes.R b/R/Extremes.R index eab6793..41b5199 100644 --- a/R/Extremes.R +++ b/R/Extremes.R @@ -37,7 +37,6 @@ #'the data is reached. The default for fclimdex is FALSE. #' #'@import multiApply -#'@import PCICt #'@examples #'##Example synthetic data: #'data <- 1:(2 * 3 * 310 * 1) diff --git a/R/PCICtFunctions.R b/R/PCICtFunctions.R new file mode 100644 index 0000000..7001e7c --- /dev/null +++ b/R/PCICtFunctions.R @@ -0,0 +1,850 @@ +#----------------------------------------------------------- +# Auxiliary functions from package PCICt +# (2025-05-03) The package was removed from CRAN. To maintain ClimProjDiags, +# we copy the necessary functions here. +# We will recover the dependency when PCICt is on CRAN again. +#----------------------------------------------------------- +# Package: PCICt +# Version: 0.5-4.4 +# Date: 2023-02-13 +# Title: Implementation of POSIXct Work-Alike for 365 and 360 Day +# Calendars +# Author: David Bronaugh for the Pacific Climate +# Impacts Consortium (PCIC); portions based on code written by +# the R-Core team and Ulrich Drepper. +# Maintainer: James Hiebert +# Depends: R (>= 2.12.0), methods, graphics +# Suggests: RUnit +# Description: Provides a work-alike to R's POSIXct class which implements +# 360- and 365-day calendars in addition to the gregorian calendar. +# License: GPL-2 +# URL: https://www.r-project.org +# NeedsCompilation: yes +# SystemRequirements: C++11 +# Repository: CRAN +#----------------------------------------------------------- + +## Helper functions: + +origin.year <- 1970 +origin.year.POSIXlt <- 1900 +class.list <- c("PCICt") + +setOldClass("PCICt") + +## TODO: +## - S4 class to avoid stripping of attributes? + +PCICt.get.months <- function(cal) { + m.365 <- c(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) + m.360 <- c(30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30) + switch(cal, "365"=m.365, "360"=m.360) +} + +dpy.for.cal <- function(cal) { + switch(cal, "365"=365, "360"=360) +} + +clean.cal <- function(cal) { + cal.list <- c("365_day", "365", "noleap", "360_day", "360", "gregorian", "standard", "proleptic_gregorian") + cal.map <- c( "365", "365", "365", "360", "360", "gregorian", "gregorian", "proleptic_gregorian") + if(!cal %in% cal.list) stop(paste("Calendar type not one of", paste(cal.list, sep=", "))) + return(cal.map[cal.list %in% cal]) +} + +.PCICt <- function(x, cal) { + if(missing(cal)) stop("Can't create a PCICt with no calendar type") + cal.cleaned <- clean.cal(cal) + structure(x, cal=cal.cleaned, months=PCICt.get.months(cal.cleaned), class=class.list, dpy=dpy.for.cal(cal.cleaned), tzone="GMT", units="secs") +} + +#'@import methods +#'@noRd +range.PCICt <- function(..., na.rm=FALSE) { + args <- list(...) + stopifnot(length(unique(lapply(args, function(x) { attr(x, "cal") }))) == 1) + args.flat <- unlist(args) + ret <- c(min(args.flat, na.rm=na.rm), max(args.flat, na.rm=na.rm)) + ret <- copy.atts.PCICt(args[[1]], ret) + class(ret) <- class.list + return(ret) +} + +#'@noRd +c.PCICt <- function(..., recursive=FALSE) { + ##stopifnot(length(unique(lapply(..., function(x) { attr(x, "cal") }))) == 1) + cal <- attr(..1, "cal") + .PCICt(c(unlist(lapply(list(...), unclass))), cal) +} + +## Use this to drop the 'units' attribute and unclass the object... +coerceTimeUnit <- function(x) { + as.vector(switch(attr(x,"units"), + secs = x, mins = 60*x, hours = 60*60*x, + days = 60*60*24*x, weeks = 60*60*24*7*x)) +} + +#'@noRd +`+.PCICt` <- function(e1, e2) { + if (nargs() == 1) return(e1) + ## only valid if one of e1 and e2 is a scalar/difftime + if(inherits(e1, "PCICt") && inherits(e2, "PCICt")) + stop("binary '+' is not defined for \"PCICt\" objects") + if (inherits(e1, "difftime")) e1 <- coerceTimeUnit(e1) + if (inherits(e2, "difftime")) e2 <- coerceTimeUnit(e2) + .PCICt(unclass(e1) + unclass(e2), cal=attr(e1, "cal")) +} + +#'@noRd +`-.PCICt` <- function(e1, e2) { + ## need to drop "units" attribute here + if(!inherits(e1, "PCICt")) + stop("Can only subtract from PCICt objects") + if (nargs() == 1) stop("unary '-' is not defined for \"PCICt\" objects") + if(inherits(e2, "PCICt")) { + stopifnot(attr(e1, "cal") == attr(e2, "cal")) + return(as.difftime(unclass(e1) - unclass(e2), units="secs")) + } + if (inherits(e2, "difftime")) e2 <- coerceTimeUnit(e2) + if(!is.null(attr(e2, "class"))) + stop("can only subtract numbers from PCICt objects") + .PCICt(unclass(e1) - e2, cal=attr(e1, "cal")) +} + +#'@noRd +Ops.PCICt <- function(e1, e2) { + if (nargs() == 1) + stop(gettextf("unary '%s' not defined for \"PCICt\" objects", + .Generic), domain = NA) + + PCICt.object <- NULL + if(inherits(e1, "PCICt")) + PCICt.object <- e1 + else if(inherits(e2, "PCICt")) + PCICt.object <- e2 + else + stop("Can't use PCICt operators on non-PCICt objects") + + + boolean <- switch(.Generic, "<" = , ">" = , "==" = , + "!=" = , "<=" = , ">=" = TRUE, FALSE) + if (!boolean) + stop(gettextf("'%s' not defined for \"PCICt\" objects", .Generic), + domain = NA) + if(inherits(e1, "POSIXlt") || is.character(e1)) e1 <- as.PCICt(e1, cal=attr(PCICt.object, "cal")) + if(inherits(e2, "POSIXlt") || is.character(e1)) e2 <- as.PCICt(e2, cal=attr(PCICt.object, "cal")) + stopifnot(attr(e1, "cal") == attr(e2, "cal")) + NextMethod(.Generic) +} + +#'@noRd +rep.PCICt <- function(x, ...) { + y <- rep(unclass(x), ...) + .PCICt(y, cal=attr(x, "cal")) +} + +#'@noRd +mean.PCICt <- function(x, ...) { + .PCICt(mean(unclass(x), ...), attr(x, "cal")) +} + +#'@noRd +min.PCICt <- function(x, ...) { + res <- min(unclass(x), ...) + return(copy.atts.PCICt(x, res)) +} + +#'@noRd +max.PCICt <- function(x, ...) { + res <- max(unclass(x), ...) + return(copy.atts.PCICt(x, res)) +} + +#'@noRd +seq.PCICt <- function(from, to, by, length.out = NULL, along.with = NULL, ...) { + if (missing(from)) + stop("'from' must be specified") + if (!inherits(from, "PCICt")) + stop("'from' must be a PCICt object") + if (length(from) != 1L) + stop("'from' must be of length 1") + if (!missing(to)) { + stopifnot(attr(from, "cal") == attr(to, "cal")) + if (!inherits(to, "PCICt")) + stop("'to' must be a PCICt object") + if (length(to) != 1) + stop("'to' must be of length 1") + if(to < from) + stop("'to' must be less than 'from'") + } + if (!missing(along.with)) { + length.out <- length(along.with) + } + else if (!is.null(length.out)) { + if (length(length.out) != 1L) + stop("'length.out' must be of length 1") + length.out <- ceiling(length.out) + } + status <- c(!missing(to), !missing(by), !is.null(length.out)) + if (sum(status) != 2L) + stop("exactly two of 'to', 'by' and 'length.out' / 'along.with' must be specified") + if (missing(by)) { + from <- unclass(from) + to <- unclass(to) + res <- seq.int(from, to, length.out = length.out) + return(.PCICt(res, attr(from, "cal"))) + } + if (length(by) != 1L) + stop("'by' must be of length 1") + valid <- 0L + if (inherits(by, "difftime")) { + by <- switch(attr(by, "units"), secs = 1, mins = 60, + hours = 3600, days = 86400, weeks = 7 * 86400) * + unclass(by) + } else if (is.character(by)) { + by2 <- strsplit(by, " ", fixed = TRUE)[[1L]] + if (length(by2) > 2L || length(by2) < 1L) + stop("invalid 'by' string") + valid <- pmatch(by2[length(by2)], c("secs", "mins", "hours", + "days", "weeks", "months", "years", "DSTdays")) + if (is.na(valid)) + stop("invalid string for 'by'") + if (valid <= 5L) { + by <- c(1, 60, 3600, 86400, 7 * 86400)[valid] + if (length(by2) == 2L) + by <- by * as.integer(by2[1L]) + } + else by <- if (length(by2) == 2L) + as.integer(by2[1L]) + else 1 + } + else if (!is.numeric(by)) + stop("invalid mode for 'by'") + if (is.na(by)) + stop("'by' is NA") + if (valid <= 5L) { + from <- unclass(from) + if (!is.null(length.out)) + res <- seq.int(from, by = by, length.out = length.out) + else { + to0 <- unclass(to) + res <- seq.int(0, to0 - from, by) + from + } + return(.PCICt(res, attr(from, "cal"))) + } else { + r1 <- as.POSIXlt(from) + if (valid == 7L) { + if (missing(to)) { + yr <- seq.int(r1$year, by = by, length.out = length.out) + } else { + to0 <- as.POSIXlt(to) + yr <- seq.int(r1$year, to0$year, by) + } + r1$year <- yr + } else if (valid == 6L) { + if (missing(to)) { + mon <- seq.int(r1$mon, by = by, length.out = length.out) + } else { + to0 <- as.POSIXlt(to) + mon <- seq.int(r1$mon, 12 * (to0$year - r1$year) + + to0$mon, by) + } + r1$mon <- mon + } else if (valid == 8L) { + if (!missing(to)) { + length.out <- 2L + floor((unclass(to) - + unclass(from))/86400) + } + r1$mday <- seq.int(r1$mday, by = by, length.out = length.out) + } + r1$isdst <- -1L + res <- as.PCICt(r1, attr(from, "cal")) + if (!missing(to)) { + res <- if (by > 0) + res[res <= to] + else res[res >= to] + } + res + } +} + +#'@noRd +trunc.PCICt <- function(x, units = c("secs", "mins", "hours", "days"), ...) { + units <- match.arg(units) + val <- unclass(x) + round.to <- switch(units, secs = 1, mins = 60, hours = 3600, days = 86400) + val <- floor(val / round.to) * round.to + class(val) <- class(x) + return(copy.atts.PCICt(x, val)) +} + +#'@noRd +round.PCICt <- function (x, digits = c("secs", "mins", "hours", "days")) { + if (is.numeric(digits) && digits == 0) + digits <- "secs" + digits <- match.arg(digits) + x <- x + switch(digits, secs = 0.5, mins = 30, hours = 1800, + days = 43200) + trunc(x, units = digits) +} + +#'@noRd +copy.atts.PCICt <- function(from, to) { + return(structure(to, cal=attr(from, "cal"), months=attr(from, "months"), class=class(from), dpy=attr(from, "dpy"), tzone=attr(from, "tzone"), units=attr(from, "units"))) +} + +#'@noRd +`[.PCICt` <- function(x, ...) { + val <- NextMethod("[") + val <- copy.atts.PCICt(x, val) + class(val) <- class(x) + val +} + +#'@noRd +`[<-.PCICt` <- function (x, ..., value) { + if (!as.logical(length(value))) + return(x) + stopifnot(class(value) == class(x) & attr(x, "cal") == attr(value, "cal")) + cl <- oldClass(x) + x <- NextMethod("[<-") + x <- copy.atts.PCICt(value, x) + class(x) <- cl + x +} + +#'PCICt +#' +#'Functions from the PCICt package. These functions convert between PCICt +#'objects and other types of data. +#'@name as.PCICt +#'@aliases as.PCICt as.PCICt.default as.PCICt.POSIXlt as.PCICt.POSIXct +#' as.PCICt.numeric .PCICt as.POSIXct.PCICt as.POSIXlt.PCICt as.character.PCICt +#'@return For as.PCICt and .PCICt, a PCICt object with the given calendar type. +#' For as.POSIXct.PCICt and as.POSIXlt.PCICt, a POSIXct or POSIXlt +#' object, respectively. +#'@export +#'@useDynLib ClimProjDiags +as.PCICt <- function(x, cal, ...) { + if(missing(cal)) stop("Can't create a PCICt with no calendar type") + UseMethod("as.PCICt") +} + +#'@noRd +as.character.PCICt <- function(x, ...) { + format.PCICt(x, ...) +} + +#'@noRd +unique.PCICt <- function(x, incomparables = FALSE, fromLast = FALSE, ...) { + if (!inherits(x, "PCICt")) + stop("wrong class") + z <- unique(unclass(x), incomparables, fromLast, ...) + return(copy.atts.PCICt(x, z)) +} + +#'@noRd +summary.PCICt <- function (object, digits = 15, ...) { + x <- summary.default(unclass(object), digits = digits, ...) + if (m <- match("NA's", names(x), 0)) { + NAs <- as.integer(x[m]) + x <- x[-m] + attr(x, "NAs") <- NAs + } + x <- copy.atts.PCICt(object, x) + class(x) <- c("summaryDefault", "table", oldClass(object)) + x +} + +#'@noRd +format.PCICt <- function(x, format="", tz="", usetz=FALSE, ...) { + if (!inherits(x, "PCICt")) + stop("wrong class") + + if(!is.null(attr(x, "dpy")) && attr(x, "dpy") == 360) { + structure(format.POSIXlt.360(as.POSIXlt(x, tz), format, + ...), names = names(x)) + } else { + structure(format.POSIXlt(as.POSIXlt(x, tz), format, usetz, + ...), names = names(x)) + } +} + +#'@noRd +print.PCICt <- function (x, ...) { + max.print <- getOption("max.print", 9999L) + if (max.print < length(x)) { + print(as.character(x[1:max.print]), ...) + cat(" [ reached getOption(\"max.print\") -- omitted", + length(x) - max.print, "entries ]\n") + } + else print(as.character(x), ...) + invisible(x) +} + +#'@noRd +strptime.360 <- function(x, format) { + .Call("do_strptime_360", x, format, + PACKAGE = "ClimProjDiags") +} + +#'@noRd +format.POSIXlt.360 <- function(x, format="", ...) { + if (!inherits(x, "POSIXlt")) + stop("wrong class") + if (format == "") { + times <- unlist(unclass(x)[1L:3L]) + secs <- x$sec + secs <- secs[!is.na(secs)] + np <- getOption("digits.secs") + if (is.null(np)) + np <- 0L + else np <- min(6L, np) + if (np >= 1L) + for (i in seq_len(np) - 1L) + if (all(abs(secs - round(secs, i)) < 1e-06)) { + np <- i + break + } + format <- if (all(times[!is.na(times)] == 0)) + "%Y-%m-%d" + else if (np == 0L) + "%Y-%m-%d %H:%M:%S" + else paste("%Y-%m-%d %H:%M:%OS", np, sep="") + } + y <- .Call("do_formatPOSIXlt_360", x, format, + PACKAGE = "ClimProjDiags") + names(y) <- names(x$year) + format(y, ...) +} + +#'@noRd +as.POSIXct.POSIXlt.360 <- function(x) { + .Call("do_asPOSIXct_360", x, PACKAGE = "ClimProjDiags") +} + +#'@noRd +as.POSIXlt.POSIXct.360 <- function(x) { + .Call("do_asPOSIXlt_360", x, PACKAGE = "ClimProjDiags") +} + +#'@noRd +as.PCICt.default <- function(x, cal, format, ...) { + tz <- "GMT" + cal.cleaned <- clean.cal(cal) + if (inherits(x, "PCICt")) + return(x) + if (is.character(x) || is.factor(x)) { + x <- as.character(x) + if(cal.cleaned == "360") { + if (!missing(format)) { + res <- strptime.360(x, format) + return(as.PCICt(res, cal, ...)) + } + x <- unclass(x) + xx <- x[!is.na(x)] + if (!length(xx)) + res <- strptime.360(x, "%Y/%m/%d") + else if (all(!is.na(strptime.360(xx, f <- "%Y-%m-%d %H:%M:%OS"))) || + all(!is.na(strptime.360(xx, f <- "%Y/%m/%d %H:%M:%OS"))) || + all(!is.na(strptime.360(xx, f <- "%Y-%m-%d %H:%M"))) || + all(!is.na(strptime.360(xx, f <- "%Y/%m/%d %H:%M"))) || + all(!is.na(strptime.360(xx, f <- "%Y-%m-%d"))) || + all(!is.na(strptime.360(xx, f <- "%Y/%m/%d")))) + res <- strptime.360(x, f) + if(missing(res)) stop("character string is not in a standard unambiguous format") + return(as.PCICt(res, cal, ...)) + } else { + return(as.PCICt(as.POSIXlt(x, tz, format, ...), cal, ...)) + } + } + if (is.logical(x) && all(is.na(x))) + return(.PCICt(as.numeric(x), cal)) + stop(gettextf("do not know how to convert '%s' to class \"PCICt\"", deparse(substitute(x)))) +} + +#'@noRd +as.PCICt.numeric <- function(x, cal, origin, ...) { + if (missing(origin)) + stop("'origin' must be supplied") + + if(inherits(origin, "PCICt") && attr(origin, "cal") == cal) + return(origin + x) + else + return(as.PCICt(origin, cal) + x) +} + +#'@noRd +as.PCICt.POSIXlt <- function(x, cal, ...) { + proleptic.correction <- 0 + seconds.per.day <- 86400 + tz <- "GMT" + cal.cleaned <- clean.cal(cal) + year.length <- dpy.for.cal(cal.cleaned) + + if(is.null(year.length)) { + d <- as.POSIXct(x, tz="GMT") + class(d) <- NULL + return(.PCICt(d, "proleptic_gregorian")) + } else { + months <- PCICt.get.months(cal.cleaned) + months.off <- cumsum(c(0, months[1:(length(months) - 1)])) + seconds.per.hour <- 3600 + return(.PCICt((x$year + origin.year.POSIXlt - origin.year + floor(x$mon / 12)) * year.length * seconds.per.day + + months.off[(x$mon %% 12) + 1] * seconds.per.day + (x$mday - 1) * seconds.per.day + x$hour * seconds.per.hour + x$min * 60 + x$sec, cal=cal)) + } +} + +#'@noRd +as.PCICt.POSIXct <- function(x, cal, ...) { + cal.cleaned <- clean.cal(cal) + if(cal.cleaned == "360") { + as.PCICt.POSIXlt(as.POSIXlt.POSIXct.360(x), cal, ...) + } else { + as.PCICt.POSIXlt(as.POSIXlt(x), cal, ...) + } +} + +## FIXME: Better NA handling +#'@noRd +as.POSIXlt.PCICt <- function(x, tz="", ...) { + seconds.per.day <- 86400 + seconds.per.hour <- 3600 + + tzone <- attr(x, "tzone") + if (length(tz) == 0 && !is.null(tzone)) + tz <- tzone[1L] + + if(is.null(attr(x, "months"))) { + class(x) <- c("POSIXct", "POSIXt") + return(as.POSIXlt(x)) + } else { + months <- attr(x, "months") + months.off <- cumsum(c(0, months[1:(length(months) - 1)])) + months.idx <- unlist(lapply(1:12, function(x) { rep(x, months[x]) } )) + + days.per.year <- attr(x, "dpy") + remainder <- as.numeric(x) %% (days.per.year * seconds.per.day) + remainder[remainder < 0] <- days.per.year * seconds.per.day - remainder[remainder < 0] + + year <- floor(as.numeric(x) / (days.per.year * seconds.per.day)) + origin.year + yday <- floor(remainder / seconds.per.day) + 1 + month <- months.idx[yday] + day <- yday - months.off[month] + + ## Need to compute wday + wday <- (as.numeric(x) / 86400) %% 7 + hms.remainder <- remainder %% seconds.per.day + hour <- floor(hms.remainder / seconds.per.hour) + minute <- floor((hms.remainder %% seconds.per.hour) / 60) + second <- hms.remainder %% 60 + return(.POSIXlt(list(sec=second, min=minute, hour=hour, mday=day, mon=month - 1, year=year - origin.year.POSIXlt, wday=wday, yday=yday - 1, isdst=0), tz)) + } +} + +#'@noRd +as.POSIXct.PCICt <- function(x, tz="", ...) { + + if(attr(x, "cal") == "360") { + warning("360-day PCICt objects can't be properly represented by a POSIXct object") + } + return(as.POSIXct(as.POSIXlt(x, tz))) +} + +#'@noRd +cut.PCICt <- function (x, breaks, labels = NULL, start.on.monday = TRUE, right = FALSE, ...) { + if(!inherits(x, "PCICt")) stop("'x' must be a PCICt object") + cal <- attr(x, "cal") + + if (inherits(breaks, "PCICt") || (is.numeric(breaks) && length(breaks) == 1L)) { + ## Dates are already PCICt or specified number of breaks; don't need to do anything + } else if(is.character(breaks) && length(breaks) == 1L) { + ## Breaks are characters; need to do something. + by2 <- strsplit(breaks, " ", fixed=TRUE)[[1L]] + if(length(by2) > 2L || length(by2) < 1L) + stop("invalid specification of 'breaks'") + valid <- pmatch(by2[length(by2)], + c("secs", "mins", "hours", "days", "weeks", + "months", "years", "DSTdays", "quarters")) + if(is.na(valid)) stop("invalid specification of 'breaks'") + start <- as.POSIXlt(min(x, na.rm=TRUE)) + incr <- 1 + if(valid > 1L) { start$sec <- 0L; incr <- 60 } + if(valid > 2L) { start$min <- 0L; incr <- 3600 } + ## start of day need not be on the same DST, PR#14208 + if(valid > 3L) { start$hour <- 0L; start$isdst <- -1L; incr <- 86400 } + if(valid == 5L) { # weeks + start$mday <- start$mday - start$wday + if(start.on.monday) + start$mday <- start$mday + ifelse(start$wday > 0L, 1L, -6L) + incr <- 7*86400 + } + if(valid == 8L) incr <- 25*3600 # DSTdays + if(valid == 6L) { # months + start$mday <- 1L + maxx <- max(x, na.rm = TRUE) + step <- ifelse(length(by2) == 2L, as.integer(by2[1L]), 1L) + end <- as.POSIXlt(maxx + (ifelse(cal == "360", 30, 31) * step * 86400)) + end$mday <- 1L + end$isdst <- -1L + breaks <- seq(as.PCICt(start, cal), as.PCICt(end, cal), breaks) + } else if(valid == 7L) { # years + start$mon <- 0L + start$mday <- 1L + maxx <- max(x, na.rm = TRUE) + step <- ifelse(length(by2) == 2L, as.integer(by2[1L]), 1L) + end <- as.POSIXlt(maxx + (ceiling(get.avg.dpy(x)) * step* 86400)) + end$mon <- 0L + end$mday <- 1L + end$isdst <- -1L + breaks <- seq(as.PCICt(start, cal), as.PCICt(end, cal), breaks) + } else if(valid == 9L) { # quarters + qtr <- rep(c(0L, 3L, 6L, 9L), each = 3L) + start$mon <- qtr[start$mon + 1L] + start$mday <- 1L + maxx <- max(x, na.rm = TRUE) + step <- ifelse(length(by2) == 2L, as.integer(by2[1L]), 1L) + end <- as.POSIXlt(maxx + (floor(get.avg.dpy(x) / 4) * step * 86400)) + end$mon <- qtr[end$mon + 1L] + end$mday <- 1L + end$isdst <- -1L + breaks <- seq(as.PCICt(start, cal), as.PCICt(end, cal), paste(step * 3, "months")) + ## 90-93 days ahead could give an empty level, so + lb <- length(breaks) + if(maxx < breaks[lb-1]) breaks <- breaks[-lb] + } else { # weeks or shorter + if (length(by2) == 2L) incr <- incr * as.integer(by2[1L]) + maxx <- max(x, na.rm = TRUE) + breaks <- seq(as.PCICt(start, cal), maxx + incr, breaks) + breaks <- breaks[seq_len(1+max(which(breaks <= maxx)))] + } + } else stop("invalid specification of 'breaks'") + res <- cut(unclass(x), unclass(breaks), labels = labels, + right = right, ...) + if(is.null(labels)) { + levels(res) <- + as.character(if (is.numeric(breaks)) x[!duplicated(res)] + else breaks[-length(breaks)]) + } + res +} + +#'@noRd +diff.PCICt <- function (x, lag = 1L, differences = 1L, ...) { + class(x) <- c("POSIXct", "POSIXt") + diff(x, lag, differences, ...) +} + +#'@noRd +is.numeric.PCICt <- function(x) FALSE + +#'@noRd +julian.PCICt <- function (x, origin=NULL, ...) { + if(is.null(origin)) + origin <- "1970-01-01" + else + stopifnot(attr(x, "cal") == attr(origin, "cal")) + + origin <- as.PCICt(origin, cal=attr(x, "cal")) + class(x) <- class(origin) <- c("POSIXct", "POSIXt") + if (length(origin) != 1L) + stop("'origin' must be of length one") + + res <- difftime(x, origin, units = "days") + structure(res, origin = origin) +} + +get.sec.incr <- function(x, secs, incr=1, mul=1.1) { + if(length(secs) == 0 || mul * (incr * secs[1]) > x) + incr + else + get.sec.incr(x, secs[-1], incr * secs[1], mul) +} + +#'@importFrom graphics axis +#'@noRd +Axis.PCICt <- function(x = NULL, at = NULL, ..., side, labels = TRUE) { + axis.PCICt(side = side, x = x, at = at, labels = labels, ...) +} + +get.avg.dpy <- function(x) { + ifelse(is.null(attr(x, "dpy")), 365.25, attr(x, "dpy")) +} + +#'@importFrom graphics axis par +#'@noRd +axis.PCICt <- function(side, x, at, format, labels = TRUE, ...) { + mat <- missing(at) || is.null(at) + mft <- missing(format) || is.null(format) + if (!mat) + x <- at + + range <- par("usr")[if (side%%2) 1L:2L else 3L:4L] + + d <- range[2L] - range[1L] + z <- c(as.PCICt(range, cal=attr(x, "cal"), origin="1970-01-01"), x[is.finite(x)]) + + sc <- get.sec.incr(d, c(60, 60, 24, 7)) + if(mft && !is.na(sc)) + format <- switch(as.character(sc), "1"="%S", "60"="%M:%S", "3600"="%H:%M", "86400"="%a %H:%M", "604800"="%a") + + if (d < 60 * 60 * 24 * 50) { + zz <- pretty(unclass(z)/sc) + z <- .PCICt(zz * sc, cal=attr(x, "cal")) + if (!is.na(sc) && sc == 60 * 60 * 24) + z <- round(z, "days") + if (mft) + format <- "%b %d" + } else if (d < 1.1 * 60 * 60 * 24 * get.avg.dpy(x)) { + zz <- as.POSIXlt(z) + zz$mday <- zz$wday <- zz$yday <- 1 + zz$isdst <- -1 + zz$hour <- zz$min <- zz$sec <- 0 + zz$mon <- pretty(zz$mon) + m <- length(zz$mon) + M <- 2 * m + m <- rep.int(zz$year[1L], m) + zz$year <- c(m, m + 1) + zz <- lapply(zz, function(x) rep(x, length.out = M)) + z <- as.PCICt(zz, attr(x, "cal")) + if (mft) + format <- "%b" + } else { + zz <- as.POSIXlt(z) + zz$mday <- zz$wday <- zz$yday <- 1 + zz$isdst <- -1 + zz$mon <- zz$hour <- zz$min <- zz$sec <- 0 + zz$year <- pretty(zz$year) + M <- length(zz$year) + zz <- lapply(zz, function(x) rep(x, length.out = M)) + z <- as.PCICt(.POSIXlt(zz), attr(x, "cal")) + if (mft) + format <- "%Y" + } + if (!mat) + z <- x[is.finite(x)] + + keep <- z >= range[1L] & z <= range[2L] + z <- z[keep] + if (!is.logical(labels)) + labels <- labels[keep] + else if (identical(labels, TRUE)) + labels <- format(z, format = format) + else if (identical(labels, FALSE)) + labels <- rep("", length(z)) + + axis(side, at = unclass(z), labels = labels, ...) +} + +#'@noRd +pretty.PCICt <- function(x, n = 5, min.n = n %/% 2, sep = " ", ...) { + zz <- range(x, na.rm = TRUE) + xspan <- as.numeric(diff(zz), units = "secs") + if (diff(as.numeric(zz)) == 0) # one value only + zz <- zz + c(0,60) + ## specify the set of pretty timesteps + MIN <- 60 + HOUR <- MIN * 60 + DAY <- HOUR * 24 + YEAR <- DAY * get.avg.dpy(x) + MONTH <- YEAR / 12 + steps <- + list("1 sec" = list(1, format = "%S", start = "mins"), + "2 secs" = list(2), + "5 secs" = list(5), + "10 secs" = list(10), + "15 secs" = list(15), + "30 secs" = list(30, format = "%H:%M:%S"), + "1 min" = list(1*MIN, format = "%H:%M"), + "2 mins" = list(2*MIN, start = "hours"), + "5 mins" = list(5*MIN), + "10 mins" = list(10*MIN), + "15 mins" = list(15*MIN), + "30 mins" = list(30*MIN), + ## "1 hour" = list(1*HOUR), + "1 hour" = list(1*HOUR, format = if (xspan <= DAY) "%H:%M" else paste("%b %d", "%H:%M", sep = sep)), + "3 hours" = list(3*HOUR, start = "days"), + "6 hours" = list(6*HOUR, format = paste("%b %d", "%H:%M", sep = sep)), + "12 hours" = list(12*HOUR), + "1 DSTday" = list(1*DAY, format = paste("%b", "%d", sep = sep)), + "2 DSTdays" = list(2*DAY), + "1 week" = list(7*DAY, start = "weeks"), + "halfmonth" = list(MONTH/2, start = "months"), + ## "1 month" = list(1*MONTH, format = "%b"), + "1 month" = list(1*MONTH, format = if (xspan < YEAR) "%b" else paste("%b", "%Y", sep = sep)), + "3 months" = list(3*MONTH, start = "years"), + "6 months" = list(6*MONTH, format = "%Y-%m"), + "1 year" = list(1*YEAR, format = "%Y"), + "2 years" = list(2*YEAR, start = "decades"), + "5 years" = list(5*YEAR), + "10 years" = list(10*YEAR), + "20 years" = list(20*YEAR, start = "centuries"), + "50 years" = list(50*YEAR), + "100 years" = list(100*YEAR), + "200 years" = list(200*YEAR), + "500 years" = list(500*YEAR), + "1000 years" = list(1000*YEAR)) + ## carry forward 'format' and 'start' to following steps + for (i in seq_along(steps)) { + if (is.null(steps[[i]]$format)) + steps[[i]]$format <- steps[[i-1]]$format + if (is.null(steps[[i]]$start)) + steps[[i]]$start <- steps[[i-1]]$start + steps[[i]]$spec <- names(steps)[i] + } + ## crudely work out number of steps in the given interval + nsteps <- sapply(steps, function(s) { + xspan / s[[1]] + }) + init.i <- which.min(abs(nsteps - n)) + ## calculate actual number of ticks in the given interval + calcSteps <- function(s) { + startTime <- trunc(min(zz), units = s$start) + if (identical(s$spec, "halfmonth")) { + at <- seq(startTime, max(zz), by = "months") + at2 <- as.POSIXlt(at) + at2$mday <- 15L + at3 <- sort(c(at, as.PCICt(at2))) + at <- copy.atts.PCICt(at, at3) + } else { + at <- seq(startTime, max(zz), by = s$spec) + } + at <- at[(min(zz) <= at) & (at <= max(zz))] + at + } + init.at <- calcSteps(steps[[init.i]]) + init.n <- length(init.at) - 1L + ## bump it up if below acceptable threshold + while (init.n < min.n) { + init.i <- init.i - 1L + if (init.i == 0) stop("range too small for min.n") + init.at <- calcSteps(steps[[init.i]]) + init.n <- length(init.at) - 1L + } + makeOutput <- function(at, s) { + flabels <- format(at, s$format) + ans <- as.PCICt(at, cal=attr(x, "cal")) + attr(ans, "labels") <- flabels + ans + } + if (init.n == n) ## perfect + return(makeOutput(init.at, steps[[init.i]])) + if (init.n > n) { + ## too many ticks + new.i <- init.i + 1L + new.i <- min(new.i, length(steps)) + } else { + ## too few ticks + new.i <- init.i - 1L + new.i <- max(new.i, 1L) + } + new.at <- calcSteps(steps[[new.i]]) + new.n <- length(new.at) - 1L + ## work out whether new.at or init.at is better + if (new.n < min.n) + new.n <- -Inf + if (abs(new.n - n) < abs(init.n - n)) + makeOutput(new.at, steps[[new.i]]) + else + makeOutput(init.at, steps[[init.i]]) +} diff --git a/R/SeasonSelect.R b/R/SeasonSelect.R index 6ee8fbb..6eb5192 100644 --- a/R/SeasonSelect.R +++ b/R/SeasonSelect.R @@ -25,7 +25,6 @@ #' corresponding to the selected season.} #'} #' -#'@import PCICt #'@examples #'## Example with synthetic data: #'data <- 1:(2 * 3 * (366 + 365) * 2) diff --git a/R/Threshold.R b/R/Threshold.R index 7444e1f..c686d5c 100644 --- a/R/Threshold.R +++ b/R/Threshold.R @@ -18,7 +18,6 @@ #''time' dimension, and a new 'jdays' dimension. #' #'@import multiApply -#'@import PCICt #'@importFrom stats quantile #'@examples #'##Example synthetic data: diff --git a/R/WaveDuration.R b/R/WaveDuration.R index 5206c32..a6d6a09 100644 --- a/R/WaveDuration.R +++ b/R/WaveDuration.R @@ -34,7 +34,6 @@ #'} #' #'@import multiApply -#'@import PCICt #'@examples #'##Example synthetic data: #'data <- 1:(2 * 3 * 31 * 5) diff --git a/man/as.PCICt.Rd b/man/as.PCICt.Rd new file mode 100644 index 0000000..a920107 --- /dev/null +++ b/man/as.PCICt.Rd @@ -0,0 +1,25 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/PCICtFunctions.R +\name{as.PCICt} +\alias{as.PCICt} +\alias{as.PCICt.default} +\alias{as.PCICt.POSIXlt} +\alias{as.PCICt.POSIXct} +\alias{as.PCICt.numeric} +\alias{.PCICt} +\alias{as.POSIXct.PCICt} +\alias{as.POSIXlt.PCICt} +\alias{as.character.PCICt} +\title{PCICt} +\usage{ +as.PCICt(x, cal, ...) +} +\value{ +For as.PCICt and .PCICt, a PCICt object with the given calendar type. + For as.POSIXct.PCICt and as.POSIXlt.PCICt, a POSIXct or POSIXlt + object, respectively. +} +\description{ +Functions from the PCICt package. These functions convert between PCICt +objects and other types of data. +} diff --git a/src/ClimProjDiags.so b/src/ClimProjDiags.so new file mode 100755 index 0000000000000000000000000000000000000000..fb4b91250b3da24ec9f23f5b95c253711bfcb958 GIT binary patch literal 74656 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%0DtnWW(RE3#;gN&#s}MK7Y9YhF;xZHfeg@icN+J*E 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 wz7-xR-PQe3uV1uW>%J>F +#include +#include // for NULL +#include + +/* .Call calls */ +extern SEXP do_asPOSIXct_360(SEXP); +extern SEXP do_asPOSIXlt_360(SEXP); +extern SEXP do_formatPOSIXlt_360(SEXP, SEXP); +extern SEXP do_strptime_360(SEXP, SEXP); + +static const R_CallMethodDef CallEntries[] = { + {"do_asPOSIXct_360", (DL_FUNC) &do_asPOSIXct_360, 1}, + {"do_asPOSIXlt_360", (DL_FUNC) &do_asPOSIXlt_360, 1}, + {"do_formatPOSIXlt_360", (DL_FUNC) &do_formatPOSIXlt_360, 2}, + {"do_strptime_360", (DL_FUNC) &do_strptime_360, 2}, + {NULL, NULL, 0} +}; + +void R_init_PCICt(DllInfo *dll) +{ + R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); + R_useDynamicSymbols(dll, FALSE); +} diff --git a/src/PCICt_init.o b/src/PCICt_init.o new file mode 100644 index 0000000000000000000000000000000000000000..60e1784268c46d5f0d66cc7722b21aaa8338d5f4 GIT binary patch literal 5936 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. This may also be + used to find time since some unspecified starting point + (e.g. machine reboot), but is not currently so used in R. It + returns in second and nanoseconds, although not necessarily to + more than clock-tick accuracy. + + C11 adds 'struct timespec' to . And timespec_get() can get + the current time or interval after a base time. + + The previous POSIX recommendation was gettimeofday(), defined in + . This returns in seconds and microseconds (with + unspecified granularity). + + Many systems (including AIX, FreeBSD, Linux, Solaris) have + clock_gettime(). Mac OS X and Cygwin have gettimeofday(). + + Function time() is C99 and defined in . C99 does not + mandate the units, but POSIX does (as the number of seconds since + the epoch: although not mandated, time_t seems always to be an + integer type). + + Function clock() is C99 and defined in . It measures CPU + time at CLOCKS_PER_SEC: there is a small danger of integer + overflow. + + Function times() is POSIX and defined in . It + returns the elapsed time in clock ticks, plus CPU times in a + struct tms* argument (also in clock ticks). + + More precise information on CPU times may be available from the + POSIX function getrusage() defined in . This + returns the same time structure as gettimeofday() and on some + systems offers millisecond resolution. + It is available on Cygwin, FreeBSD, Mac OS X, Linux and Solaris. + + currentTime() (in this file) uses + clock_gettime(): AIX, FreeBSD, Linux, Solaris + gettimeofday(): Mac OS X, Windows, Cygwin + time() (as ultimate fallback, AFAIK unused). + + proc.time() uses currentTime() for elapsed time, + and getrusage, then times for CPU times on a Unix-alike, + GetProcessTimes on Windows. + + devPS.c uses time() and localtime() for timestamps. + + do_date (platform.c) uses ctime. + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +/* needed on Windows to avoid redefinition of tzname as _tzname */ +#define _NO_OLDNAMES +#include +#undef _NO_OLDNAMES + +#include + +#ifdef Win32 +#define gmtime R_gmtime +#define localtime R_localtime +#define mktime R_mktime +extern struct tm* gmtime (const time_t*); +extern struct tm* localtime (const time_t*); +extern time_t mktime (struct tm*); +#endif + +#include /* for setenv or putenv */ +#include +#include +#include + +/* The glibc in RH8.0 was broken and assumed that dates before + 1970-01-01 do not exist. So does Windows, but its code was replaced + in R 2.7.0. As from 1.6.2, test the actual mktime code and cache + the result on glibc >= 2.2. (It seems this started between 2.2.5 + and 2.3, and RH8.0 had an unreleased version in that gap.) + + Sometime in late 2004 this was reverted in glibc. +*/ + +static Rboolean have_broken_mktime(void) +{ +#if defined(_AIX) + return TRUE; +#elif defined(__GLIBC__) && defined(__GLIBC_MINOR__) && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 2 + static int test_result = -1; + + if (test_result == -1) { + struct tm t; + time_t res; + t.tm_sec = t.tm_min = t.tm_hour = 0; + t.tm_mday = t.tm_mon = 1; + t.tm_year = 68; + t.tm_isdst = -1; + res = mktime(&t); + test_result = (res == (time_t)-1); + } + return test_result > 0; +#else + return FALSE; +#endif + + +} + +/* Substitute based on glibc code. */ +#include "strptime_360.h" + +static const int days_in_month[12] = +{30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}; + +#define days_in_year 360 + +#ifndef HAVE_POSIX_LEAPSECONDS +/* There have been 24 leapseconds, the last being on 2008-12-31. + */ +static int n_leapseconds = 24; +static const time_t leapseconds[] = +{ 78796800, 94694400,126230400,157766400,189302400,220924800,252460800, + 283996800,315532800,362793600,394329600,425865600,489024000,567993600, + 631152000,662688000,709948800,741484800,773020800,820454400,867715200, + 915148800,1136073600,1230768000}; +#endif + +/* + Adjust a struct tm to be a valid date-time. + Return 0 if valid, -1 if invalid and uncorrectable, or a positive + integer approximating the number of corrections needed. + */ +static int validate_tm (struct tm *tm) +{ + int tmp, res = 0; + + if (tm->tm_sec < 0 || tm->tm_sec > 60) { /* 61 POSIX, 60 draft ISO C */ + res++; + tmp = tm->tm_sec/60; + tm->tm_sec -= 60 * tmp; tm->tm_min += tmp; + if(tm->tm_sec < 0) {tm->tm_sec += 60; tm->tm_min--;} + } + + if (tm->tm_min < 0 || tm->tm_min > 59) { + res++; + tmp = tm->tm_min/60; + tm->tm_min -= 60 * tmp; tm->tm_hour += tmp; + if(tm->tm_min < 0) {tm->tm_min += 60; tm->tm_hour--;} + } + + if(tm->tm_hour == 24 && tm->tm_min == 0 && tm->tm_sec == 0) { + tm->tm_hour = 0; tm->tm_mday++; + if(tm->tm_mon >= 0 && tm->tm_mon <= 11) { + if(tm->tm_mday > days_in_month[tm->tm_mon]) { + tm->tm_mon++; tm->tm_mday = 1; + if(tm->tm_mon == 12) { + tm->tm_year++; tm->tm_mon = 0; + } + } + } + } + if (tm->tm_hour < 0 || tm->tm_hour > 23) { + res++; + tmp = tm->tm_hour/24; + tm->tm_hour -= 24 * tmp; tm->tm_mday += tmp; + if(tm->tm_hour < 0) {tm->tm_hour += 24; tm->tm_mday--;} + } + + /* defer fixing mday until we know the year */ + if (tm->tm_mon < 0 || tm->tm_mon > 11) { + res++; + tmp = tm->tm_mon/12; + tm->tm_mon -= 12 * tmp; tm->tm_year += tmp; + if(tm->tm_mon < 0) {tm->tm_mon += 12; tm->tm_year--;} + } + + /* A limit on the loops of about 3000x round */ + if(tm->tm_mday < -1000000 || tm->tm_mday > 1000000) return -1; + + if(abs(tm->tm_mday) > 366) { + res++; + /* first spin back until January */ + while(tm->tm_mon > 0) { + --tm->tm_mon; + tm->tm_mday += days_in_month[tm->tm_mon]; + } + /* then spin on/back by years */ + while(tm->tm_mday < 1) { + --tm->tm_year; + tm->tm_mday += days_in_year; + } + while(tm->tm_mday > days_in_year) { + tm->tm_mday -= days_in_year; tm->tm_year++; + } + } + + while(tm->tm_mday < 1) { + res++; + if(--tm->tm_mon < 0) {tm->tm_mon += 12; tm->tm_year--;} + tm->tm_mday += days_in_month[tm->tm_mon]; + } + + while(tm->tm_mday > (tmp = days_in_month[tm->tm_mon])) { + res++; + if(++tm->tm_mon > 11) {tm->tm_mon -= 12; tm->tm_year++;} + tm->tm_mday -= tmp; + } + return res; +} + + +/* Substitute for mktime -- no checking, always in GMT */ +static double mktime00 (struct tm *tm) +{ + int day = 0; + int i, year, year0; + double excess = 0.0; + + day = tm->tm_mday - 1; + year0 = 1900 + tm->tm_year; + /* safety check for unbounded loops */ + if (year0 > 3000) { + excess = (int)(year0/2000) - 1; + year0 -= (int)(excess * 2000); + } else if (year0 < 0) { + excess = -1 - (int)(-year0/2000); + year0 -= (int)(excess * 2000); + } + + for(i = 0; i < tm->tm_mon; i++) day += days_in_month[i]; + tm->tm_yday = day; + + if (year0 > 1970) { + for (year = 1970; year < year0; year++) + day += days_in_year; + } else if (year0 < 1970) { + for (year = 1969; year >= year0; year--) + day -= days_in_year; + } + + /* weekday: Epoch day was a Thursday */ + if ((tm->tm_wday = (day + 4) % 7) < 0) tm->tm_wday += 7; + + return tm->tm_sec + (tm->tm_min * 60) + (tm->tm_hour * 3600) + + (day + excess * 730485) * 86400.0; +} + +static double guess_offset (struct tm *tm) +{ + double offset, offset1, offset2; + int i, wday, year, oldmonth, oldisdst, oldmday; + struct tm oldtm; + /* + Adjust as best we can for timezones: if isdst is unknown, use + the smaller offset at same day in Jan or July of a valid year. + We don't know the timezone rules, but if we choose a year with + July 1 on the same day of the week we will likely get guess + right (since they are usually on Sunday mornings not in Jan/Feb). + + Update for 2.7.0: no one had DST before 1916, so just use the offset + in 1902, if available. + */ + + memcpy(&oldtm, tm, sizeof(struct tm)); + if(!have_broken_mktime() && tm->tm_year < 2) { /* no DST */ + tm->tm_year = 2; + mktime(tm); + offset1 = (double) mktime(tm) - mktime00(tm); + memcpy(tm, &oldtm, sizeof(struct tm)); + tm->tm_isdst = 0; + return offset1; + } + oldmonth = tm->tm_mon; + oldmday = tm->tm_mday; + /* We know there was no DST prior to 1916 */ + oldisdst = (tm->tm_year < 16) ? 0 : tm->tm_isdst; + + /* so now look for a suitable year */ + tm->tm_mon = 6; + tm->tm_mday = 1; + tm->tm_isdst = -1; + mktime00(tm); /* to get wday valid */ + wday = tm->tm_wday; + if (oldtm.tm_year > 137) { /* in the unknown future */ + for(i = 130; i < 137; i++) { /* These cover all the possibilities */ + tm->tm_year = i; + mktime(tm); + if(tm->tm_wday == wday) break; + } + } else { /* a benighted OS with date before 1970 */ + /* We could not use 1970 because of the Windows bug with + 1970-01-01 east of GMT. */ + for(i = 71; i < 82; i++) { /* These cover all the possibilities */ + tm->tm_year = i; + mktime(tm); + if(tm->tm_wday == wday) break; + } + } + year = i; + + /* Now look up offset in January */ + tm->tm_mday = oldmday; + tm->tm_mon = 0; + tm->tm_year = year; + tm->tm_isdst = -1; + offset1 = (double) mktime(tm) - mktime00(tm); + /* and in July */ + tm->tm_year = year; + tm->tm_mon = 6; + tm->tm_isdst = -1; + offset2 = (double) mktime(tm) - mktime00(tm); + if(oldisdst > 0) { + offset = (offset1 > offset2) ? offset2 : offset1; + } else { + offset = (offset1 > offset2) ? offset1 : offset2; + } + /* now try to guess dst if unknown */ + tm->tm_mon = oldmonth; + tm->tm_isdst = -1; + if(oldisdst < 0) { + offset1 = (double) mktime(tm) - mktime00(tm); + oldisdst = (offset1 < offset) ? 1:0; + if(oldisdst) offset = offset1; + } + /* restore all as mktime might alter it */ + memcpy(tm, &oldtm, sizeof(struct tm)); + /* and then set isdst */ + tm->tm_isdst = oldisdst; + return offset; +} + +/* Interface to mktime or mktime00 */ +static double mktime0 (struct tm *tm, const int local) +{ + double res; + Rboolean OK; +#ifndef HAVE_POSIX_LEAPSECONDS + int i; +#endif + + if(validate_tm(tm) < 0) { +#ifdef EOVERFLOW + errno = EOVERFLOW; +#else + errno = 79; +#endif + return (double)(-1); + } + if(!local) return mktime00(tm); + + OK = tm->tm_year < 138 && tm->tm_year >= (have_broken_mktime() ? 70 : 02); + if(OK) { + res = (double) mktime(tm); + if (res == (double)-1) return res; +#ifndef HAVE_POSIX_LEAPSECONDS + for(i = 0; i < n_leapseconds; i++) + if(res > leapseconds[i]) res -= 1.0; +#endif + return res; +/* watch the side effect here: both calls alter their arg */ + } else return guess_offset(tm) + mktime00(tm); +} + +/* Interface for localtime or gmtime or internal substitute */ +static struct tm * localtime0(const double *tp, const int local, struct tm *ltm) +{ + double d = *tp; + int day; + int y, tmp, mon, left, diff, diff2; + struct tm *res= ltm; + time_t t; + + if(d < 2147483647.0 && d > (have_broken_mktime() ? 0. : -2147483647.0)) { + t = (time_t) d; + /* if d is negative and non-integer then t will be off by one day + since we really need floor(). But floor() is slow, so we just + fix t instead as needed. */ + if (d < 0.0 && (double) t != d) t--; +#ifndef HAVE_POSIX_LEAPSECONDS + for(y = 0; y < n_leapseconds; y++) if(t > leapseconds[y] + y - 1) t++; +#endif + return local ? localtime(&t) : gmtime(&t); + } + + day = (int) floor(d/86400.0); + left = (int) (d - day * 86400.0 + 0.5); + + /* hour, min, and sec */ + res->tm_hour = left / 3600; + left %= 3600; + res->tm_min = left / 60; + res->tm_sec = left % 60; + + /* weekday: 1970-01-01 was a Thursday */ + if ((res->tm_wday = ((4 + day) % 7)) < 0) res->tm_wday += 7; + + /* year & day within year */ + y = 1970; + if (day >= 0) + for ( ; day >= (tmp = days_in_year); day -= tmp, y++); + else + for ( ; day < 0; --y, day += days_in_year ); + + y = res->tm_year = y - 1900; + res->tm_yday = day; + + /* month within year */ + for (mon = 0; + day >= (tmp = days_in_month[mon]); + day -= tmp, mon++); + res->tm_mon = mon; + res->tm_mday = day + 1; + + if(local) { + int shift; + /* daylight saving time is unknown */ + res->tm_isdst = -1; + + /* Try to fix up timezone differences */ + diff = (int)(guess_offset(res)/60); + shift = res->tm_min + 60*res->tm_hour; + res->tm_min -= diff; + validate_tm(res); + res->tm_isdst = -1; + /* now this might be a different day */ + if(shift - diff < 0) res->tm_yday--; + if(shift - diff > 24) res->tm_yday++; + diff2 = (int)(guess_offset(res)/60); + if(diff2 != diff) { + res->tm_min += (diff - diff2); + validate_tm(res); + } + return res; + } else { + res->tm_isdst = 0; /* no dst in GMT */ + return res; + } +} + + +/* clock_gettime, timespec_get time are in , already included */ +#ifdef HAVE_SYS_TIME_H +/* gettimeoday, including on Windows */ +# include +#endif + +#ifdef HAVE_UNISTD_H +#include /* for getpid */ +#endif + +#ifdef Win32 +extern void tzset(void); +/* tzname is in the headers as an import on MinGW-w64 */ +#define tzname Rtzname +extern char *Rtzname[2]; +#elif defined(__CYGWIN__) +extern __declspec(dllimport) char *tzname[2]; +#else +extern char *tzname[2]; +#endif + +static const char ltnames [][6] = +{ "sec", "min", "hour", "mday", "mon", "year", "wday", "yday", "isdst" }; + + +static void makelt(struct tm *tm, SEXP ans, int i, int valid, double frac_secs) +{ + int j; + + if(valid) { + REAL(VECTOR_ELT(ans, 0))[i] = tm->tm_sec + frac_secs; + INTEGER(VECTOR_ELT(ans, 1))[i] = tm->tm_min; + INTEGER(VECTOR_ELT(ans, 2))[i] = tm->tm_hour; + INTEGER(VECTOR_ELT(ans, 3))[i] = tm->tm_mday; + INTEGER(VECTOR_ELT(ans, 4))[i] = tm->tm_mon; + INTEGER(VECTOR_ELT(ans, 5))[i] = tm->tm_year; + INTEGER(VECTOR_ELT(ans, 6))[i] = tm->tm_wday; + INTEGER(VECTOR_ELT(ans, 7))[i] = tm->tm_yday; + INTEGER(VECTOR_ELT(ans, 8))[i] = tm->tm_isdst; + } else { + REAL(VECTOR_ELT(ans, 0))[i] = NA_REAL; + for(j = 1; j < 8; j++) + INTEGER(VECTOR_ELT(ans, j))[i] = NA_INTEGER; + INTEGER(VECTOR_ELT(ans, 8))[i] = -1; + } +} + + +SEXP do_asPOSIXlt_360(SEXP data) +{ + SEXP x, ans, ansnames, klass, GMT; + int i, n, valid; + + PROTECT(x = coerceVector(data, REALSXP)); + + n = LENGTH(x); + PROTECT(ans = allocVector(VECSXP, 9)); + for(i = 0; i < 9; i++) + SET_VECTOR_ELT(ans, i, allocVector(i > 0 ? INTSXP : REALSXP, n)); + + PROTECT(ansnames = allocVector(STRSXP, 9)); + for(i = 0; i < 9; i++) + SET_STRING_ELT(ansnames, i, mkChar(ltnames[i])); + + for(i = 0; i < n; i++) { + struct tm dummy, *ptm = &dummy; + double d = REAL(x)[i]; + if(R_FINITE(d)) { + ptm = localtime0(&d, 0, &dummy); + /* in theory localtime/gmtime always return a valid + struct tm pointer, but Windows uses NULL for error + conditions (like negative times). */ + valid = (ptm != NULL); + } else valid = 0; + makelt(ptm, ans, i, valid, d - floor(d)); + } + setAttrib(ans, R_NamesSymbol, ansnames); + PROTECT(klass = allocVector(STRSXP, 2)); + SET_STRING_ELT(klass, 0, mkChar("POSIXlt")); + SET_STRING_ELT(klass, 1, mkChar("POSIXt")); + classgets(ans, klass); + GMT = PROTECT(mkString("GMT")); + setAttrib(ans, install("tzone"), GMT); + UNPROTECT(5); + + return ans; +} + +SEXP do_asPOSIXct_360(SEXP data) +{ + SEXP x, ans; + int i, n = 0, nlen[9]; + struct tm tm; + double tmp; + + PROTECT(x = duplicate(data)); /* coerced below */ + if(!isVectorList(x) || LENGTH(x) != 9) + error(_("invalid '%s' argument"), "x"); + + for(i = 0; i < 6; i++) + if((nlen[i] = LENGTH(VECTOR_ELT(x, i))) > n) n = nlen[i]; + if((nlen[8] = LENGTH(VECTOR_ELT(x, 8))) > n) n = nlen[8]; + if(n > 0) { + for(i = 0; i < 6; i++) + if(nlen[i] == 0) + error(_("zero length component in non-empty POSIXlt structure")); + if(nlen[8] == 0) + error(_("zero length component in non-empty POSIXlt structure")); + } + /* coerce fields to integer or real */ + SET_VECTOR_ELT(x, 0, coerceVector(VECTOR_ELT(x, 0), REALSXP)); + for(i = 0; i < 6; i++) + SET_VECTOR_ELT(x, i, coerceVector(VECTOR_ELT(x, i), + i > 0 ? INTSXP: REALSXP)); + SET_VECTOR_ELT(x, 8, coerceVector(VECTOR_ELT(x, 8), INTSXP)); + + PROTECT(ans = allocVector(REALSXP, n)); + for(i = 0; i < n; i++) { + double secs = REAL(VECTOR_ELT(x, 0))[i%nlen[0]], fsecs = floor(secs); + tm.tm_sec = (int) fsecs; + tm.tm_min = INTEGER(VECTOR_ELT(x, 1))[i%nlen[1]]; + tm.tm_hour = INTEGER(VECTOR_ELT(x, 2))[i%nlen[2]]; + tm.tm_mday = INTEGER(VECTOR_ELT(x, 3))[i%nlen[3]]; + tm.tm_mon = INTEGER(VECTOR_ELT(x, 4))[i%nlen[4]]; + tm.tm_year = INTEGER(VECTOR_ELT(x, 5))[i%nlen[5]]; + /* mktime ignores tm.tm_wday and tm.tm_yday */ + tm.tm_isdst = 0; + if(!R_FINITE(secs) || tm.tm_min == NA_INTEGER || + tm.tm_hour == NA_INTEGER || tm.tm_mday == NA_INTEGER || + tm.tm_mon == NA_INTEGER || tm.tm_year == NA_INTEGER) + REAL(ans)[i] = NA_REAL; + else { + errno = 0; + tmp = mktime0(&tm, 0); +#ifdef MKTIME_SETS_ERRNO + REAL(ans)[i] = errno ? NA_REAL : tmp + (secs - fsecs); +#else + REAL(ans)[i] = (tmp == (double)(-1)) ? + NA_REAL : tmp + (secs - fsecs); +#endif + } + } + + UNPROTECT(2); + return ans; +} + +SEXP do_formatPOSIXlt_360(SEXP data, SEXP format) +{ + SEXP x, sformat, ans; + int i, n = 0, m, N, nlen[9]; + char buff[300]; + struct tm tm; + + PROTECT(x = duplicate(data)); /* coerced below */ + if(!isVectorList(x) || LENGTH(x) != 9) + error(_("invalid '%s' argument"), "x"); + if(!isString((sformat = format)) || LENGTH(sformat) == 0) + error(_("invalid '%s' argument"), "format"); + m = LENGTH(sformat); + + /* workaround for glibc/FreeBSD/MacOS X bugs in strftime: they have + non-POSIX/C99 time zone components + */ + memset(&tm, 0, sizeof(tm)); + + /* coerce fields to integer or real, find length of longest one */ + for(i = 0; i < 9; i++) { + nlen[i] = LENGTH(VECTOR_ELT(x, i)); + if(nlen[i] > n) n = nlen[i]; + SET_VECTOR_ELT(x, i, coerceVector(VECTOR_ELT(x, i), + i > 0 ? INTSXP : REALSXP)); + } + if(n > 0) { + for(i = 0; i < 9; i++) + if(nlen[i] == 0) + error(_("zero length component in non-empty POSIXlt structure")); + } + if(n > 0) N = (m > n) ? m:n; else N = 0; + PROTECT(ans = allocVector(STRSXP, N)); + for(i = 0; i < N; i++) { + double secs = REAL(VECTOR_ELT(x, 0))[i%nlen[0]], fsecs = floor(secs); + tm.tm_sec = (int) fsecs; + tm.tm_min = INTEGER(VECTOR_ELT(x, 1))[i%nlen[1]]; + tm.tm_hour = INTEGER(VECTOR_ELT(x, 2))[i%nlen[2]]; + tm.tm_mday = INTEGER(VECTOR_ELT(x, 3))[i%nlen[3]]; + tm.tm_mon = INTEGER(VECTOR_ELT(x, 4))[i%nlen[4]]; + tm.tm_year = INTEGER(VECTOR_ELT(x, 5))[i%nlen[5]]; + tm.tm_wday = INTEGER(VECTOR_ELT(x, 6))[i%nlen[6]]; + tm.tm_yday = INTEGER(VECTOR_ELT(x, 7))[i%nlen[7]]; + tm.tm_isdst = INTEGER(VECTOR_ELT(x, 8))[i%nlen[8]]; + if(!R_FINITE(secs) || tm.tm_min == NA_INTEGER || + tm.tm_hour == NA_INTEGER || tm.tm_mday == NA_INTEGER || + tm.tm_mon == NA_INTEGER || tm.tm_year == NA_INTEGER) { + SET_STRING_ELT(ans, i, NA_STRING); + } else { + if(validate_tm(&tm) < 0) SET_STRING_ELT(ans, i, NA_STRING); + else { + const char *q = CHAR(STRING_ELT(sformat, i%m)); + int n = (int) strlen(q) + 50; + char buf2[n]; +#ifdef Win32 + /* We want to override Windows' TZ names */ + p = strstr(q, "%Z"); + if (p) { + memset(buf2, 0, n); + strncpy(buf2, q, p - q); + strcat(buf2, tzname[0]); + strcat(buf2, p+2); + } else +#endif + strcpy(buf2, q); + + /* Handle R-specific format %OSn, which for output + gives the seconds truncated to 0 <= n <= 6 decimal + places + */ + char* p = strstr(q, "%OS"); + if(p) { + /* FIXME some of this should be outside the loop */ + int ns, nused = 4; + char *p2 = strstr(buf2, "%OS"); + *p2 = '\0'; + ns = *(p+3) - '0'; + if(ns < 0 || ns > 9) { /* not a digit */ + ns = asInteger(GetOption1(install("digits.secs"))); + if(ns == NA_INTEGER) ns = 0; + nused = 3; + } + if(ns > 6) ns = 6; + if(ns > 0) { + /* truncate to avoid nuisances such as PR#14579 */ + double s = secs, t = pow(10.0, (double) ns); + s = ((int) (s*t))/t; + snprintf(p2, ns+3+1, "%0*.*f", ns+3, ns, s); + strcat(buf2, p+nused); + } else { + strcat(p2, "%S"); + strcat(buf2, p+nused); + } + } + strftime(buff, 256, buf2, &tm); + SET_STRING_ELT(ans, i, mkChar(buff)); + } + } + } + UNPROTECT(2); + return ans; +} + +static void glibc_fix(struct tm *tm, int *invalid) +{ + /* set mon and mday which glibc does not always set. + Use current year/... if none has been specified. + + Specifying mon but not mday nor yday is invalid. + */ + time_t t = time(NULL); + struct tm *tm0; + int tmp; +#ifndef HAVE_POSIX_LEAPSECONDS + t -= n_leapseconds; +#endif + tm0 = localtime(&t); + if(tm->tm_year == NA_INTEGER) tm->tm_year = tm0->tm_year; + if(tm->tm_mon != NA_INTEGER && tm->tm_mday != NA_INTEGER) return; + /* at least one of the month and the day of the month is missing */ + if(tm->tm_yday != NA_INTEGER) { + /* since we have yday, let that take precedence over mon/mday */ + int yday = tm->tm_yday, mon = 0; + while(yday >= (tmp = days_in_month[mon])) { + yday -= tmp; + mon++; + } + tm->tm_mon = mon; + tm->tm_mday = yday + 1; + } else { + if(tm->tm_mday == NA_INTEGER) { + if(tm->tm_mon != NA_INTEGER) { + *invalid = 1; + return; + } else tm->tm_mday = tm0->tm_mday; + } + if(tm->tm_mon == NA_INTEGER) tm->tm_mon = tm0->tm_mon; + } +} + + +SEXP do_strptime_360(SEXP data, SEXP format) +{ + SEXP x, sformat, ans, ansnames, klass, GMT; + int i, n, m, N, invalid, offset; + struct tm tm, tm2, *ptm = &tm; + double psecs = 0.0; + + if(!isString((x = data))) + error(_("invalid '%s' argument"), "x"); + if(!isString((sformat = format)) || LENGTH(sformat) == 0) + error(_("invalid '%s' argument"), "x"); + + n = LENGTH(x); m = LENGTH(sformat); + if(n > 0) N = (m > n)?m:n; else N = 0; + + PROTECT(ans = allocVector(VECSXP, 9)); + for(i = 0; i < 9; i++) + SET_VECTOR_ELT(ans, i, allocVector(i > 0 ? INTSXP : REALSXP, N)); + + PROTECT(ansnames = allocVector(STRSXP, 9)); + for(i = 0; i < 9; i++) + SET_STRING_ELT(ansnames, i, mkChar(ltnames[i])); + + + for(i = 0; i < N; i++) { + /* for glibc's sake. That only sets some unspecified fields, + sometimes. */ + tm.tm_sec = tm.tm_min = tm.tm_hour = 0; + tm.tm_year = tm.tm_mon = tm.tm_mday = tm.tm_yday = + tm.tm_wday = NA_INTEGER; + tm.tm_isdst = -1; + offset = NA_INTEGER; + invalid = STRING_ELT(x, i%n) == NA_STRING || + !strptime_360(CHAR(STRING_ELT(x, i%n)), + CHAR(STRING_ELT(sformat, i%m)), &tm, &psecs, &offset); + if(!invalid) { + /* Solaris sets missing fields to 0 */ + if(tm.tm_mday == 0) tm.tm_mday = NA_INTEGER; + if(tm.tm_mon == NA_INTEGER || tm.tm_mday == NA_INTEGER + || tm.tm_year == NA_INTEGER) + glibc_fix(&tm, &invalid); + tm.tm_isdst = -1; + if (offset != NA_INTEGER) { + /* we know the offset, but not the timezone + so all we can do is to convert to time_t, + adjust and convert back */ + double t0; + memcpy(&tm2, &tm, sizeof(struct tm)); + t0 = mktime0(&tm2, 0); + if (t0 != -1) { + t0 -= offset; /* offset = -0800 is Seattle */ + ptm = localtime0(&t0, 0, &tm2); + } else invalid = 1; + } else { + /* we do want to set wday, yday, isdst, but not to + adjust structure at DST boundaries */ + memcpy(&tm2, &tm, sizeof(struct tm)); + mktime0(&tm2, 0); /* set wday, yday, isdst */ + tm.tm_wday = tm2.tm_wday; + tm.tm_yday = tm2.tm_yday; + tm.tm_isdst = 0; + } + invalid = validate_tm(&tm) != 0; + } + makelt(ptm, ans, i, !invalid, psecs - floor(psecs)); + } + + setAttrib(ans, R_NamesSymbol, ansnames); + PROTECT(klass = allocVector(STRSXP, 2)); + SET_STRING_ELT(klass, 0, mkChar("POSIXlt")); + SET_STRING_ELT(klass, 1, mkChar("POSIXt")); + classgets(ans, klass); + GMT = PROTECT(mkString("GMT")); + setAttrib(ans, install("tzone"), GMT); + + UNPROTECT(4); + return ans; +} + +SEXP do_D2POSIXlt_360(SEXP data) +{ + SEXP x, ans, ansnames, klass, UTC; + int n, i, valid; + int day; + int y, tmp, mon; + struct tm tm; + + PROTECT(x = coerceVector(data, REALSXP)); + n = LENGTH(x); + PROTECT(ans = allocVector(VECSXP, 9)); + for(i = 0; i < 9; i++) + SET_VECTOR_ELT(ans, i, allocVector(i > 0 ? INTSXP : REALSXP, n)); + + PROTECT(ansnames = allocVector(STRSXP, 9)); + for(i = 0; i < 9; i++) + SET_STRING_ELT(ansnames, i, mkChar(ltnames[i])); + + for(i = 0; i < n; i++) { + if(R_FINITE(REAL(x)[i])) { + day = (int) floor(REAL(x)[i]); + tm.tm_hour = tm.tm_min = tm.tm_sec = 0; + /* weekday: 1970-01-01 was a Thursday */ + if ((tm.tm_wday = ((4 + day) % 7)) < 0) tm.tm_wday += 7; + + /* year & day within year */ + y = 1970; + if (day >= 0) + for ( ; day >= (tmp = days_in_year); day -= tmp, y++); + else + for ( ; day < 0; --y, day += days_in_year ); + + y = tm.tm_year = y - 1900; + tm.tm_yday = day; + + /* month within year */ + for (mon = 0; + day >= (tmp = (days_in_month[mon])); + day -= tmp, mon++); + tm.tm_mon = mon; + tm.tm_mday = day + 1; + tm.tm_isdst = 0; /* no dst in GMT */ + + valid = 1; + } else valid = 0; + makelt(&tm, ans, i, valid, 0.0); + } + setAttrib(ans, R_NamesSymbol, ansnames); + PROTECT(klass = allocVector(STRSXP, 2)); + SET_STRING_ELT(klass, 0, mkChar("POSIXlt")); + SET_STRING_ELT(klass, 1, mkChar("POSIXt")); + classgets(ans, klass); + UTC = PROTECT(mkString("UTC")); + setAttrib(ans, install("tzone"), UTC); + UNPROTECT(5); + + return ans; +} + +SEXP do_POSIXlt2D_360(SEXP data) +{ + SEXP x, ans, klass; + int i, n = 0, nlen[9]; + struct tm tm; + + PROTECT(x = duplicate(data)); + if(!isVectorList(x) || LENGTH(x) != 9) + error(_("invalid '%s' argument"), "x"); + + for(i = 3; i < 6; i++) + if((nlen[i] = LENGTH(VECTOR_ELT(x, i))) > n) n = nlen[i]; + if((nlen[8] = LENGTH(VECTOR_ELT(x, 8))) > n) n = nlen[8]; + if(n > 0) { + for(i = 3; i < 6; i++) + if(nlen[i] == 0) + error(_("zero length component in non-empty POSIXlt structure")); + if(nlen[8] == 0) + error(_("zero length component in non-empty POSIXlt structure")); + } + /* coerce relevant fields to integer */ + for(i = 3; i < 6; i++) + SET_VECTOR_ELT(x, i, coerceVector(VECTOR_ELT(x, i), INTSXP)); + + PROTECT(ans = allocVector(REALSXP, n)); + for(i = 0; i < n; i++) { + tm.tm_sec = tm.tm_min = tm.tm_hour = 0; + tm.tm_mday = INTEGER(VECTOR_ELT(x, 3))[i%nlen[3]]; + tm.tm_mon = INTEGER(VECTOR_ELT(x, 4))[i%nlen[4]]; + tm.tm_year = INTEGER(VECTOR_ELT(x, 5))[i%nlen[5]]; + /* mktime ignores tm.tm_wday and tm.tm_yday */ + tm.tm_isdst = 0; + if(tm.tm_mday == NA_INTEGER || tm.tm_mon == NA_INTEGER || + tm.tm_year == NA_INTEGER || validate_tm(&tm) < 0) + REAL(ans)[i] = NA_REAL; + else { + /* -1 must be error as seconds were zeroed */ + double tmp = mktime00(&tm); + REAL(ans)[i] = (tmp == -1) ? NA_REAL : tmp/86400; + } + } + + PROTECT(klass = mkString("Date")); + classgets(ans, klass); + UNPROTECT(3); + return ans; +} + +void R_unload_mylib(DllInfo* info) { +} diff --git a/src/datetime_360.o b/src/datetime_360.o new file mode 100644 index 0000000000000000000000000000000000000000..177e4c6232eae77a99110809575e26bfc086826d GIT binary patch literal 66584 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, 1996. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + a copy is available at http://www.r-project.org/licenses/ +*/ +/* XXX This version of the implementation is not really complete. + Some of the fields cannot add information alone. But if seeing + some of them in the same format (such as year, week and weekday) + this is enough information for determining the date. */ + +/* #include +#include +#include */ + +#ifdef ENABLE_NLS +#include +#ifdef Win32 +#define _(String) libintl_gettext (String) +#undef gettext /* needed for graphapp */ +#else +#define _(String) gettext (String) +#endif +#define gettext_noop(String) String +#define N_(String) gettext_noop (String) +#else /* not NLS */ +#define _(String) (String) +#define N_(String) String +#define ngettext(String, StringP, N) (N > 1 ? StringP: String) +#endif + +/* This is C90 */ +#ifndef HAVE_LOCALE_H +# define HAVE_LOCALE_H 1 +#endif +#ifdef HAVE_STRINGS_H +#include /* for strncasecmp */ +#endif + +#include /* for isspace */ + +#define match_char(ch1, ch2) if (ch1 != ch2) return NULL + +/* we guarantee to have strncasecmp in R */ +#if defined __GNUC__ && __GNUC__ >= 2 +# define match_string(cs1, s2) \ + (__extension__ ({ size_t len = strlen (cs1); \ + int result = strncasecmp ((cs1), (s2), len) == 0; \ + if (result) (s2) += len; \ + result; })) +#else +/* Oh come on. Get a reasonable compiler. */ +# define match_string(cs1, s2) \ + (strncasecmp ((cs1), (s2), strlen (cs1)) ? 0 : ((s2) += strlen (cs1), 1)) +#endif + +/* We intentionally do not use isdigit() for testing because this will + lead to problems with the wide character version. */ +#define get_number(from, to, n) \ + do { \ + int __n = n; \ + val = 0; \ + while (*rp == ' ') \ + ++rp; \ + if (*rp < '0' || *rp > '9') \ + return NULL; \ + do { \ + val *= 10; \ + val += *rp++ - '0'; \ +/* } while (--__n > 0 && val * 10 <= to && *rp >= '0' && *rp <= '9');*/ \ + } while (--__n > 0 && *rp >= '0' && *rp <= '9'); \ + if (val < from || val > to) \ + return NULL; \ + } while (0) +# define get_alt_number(from, to, n) \ + /* We don't have the alternate representation. */ \ + get_number(from, to, n) +#define recursive(new_fmt) \ + (*(new_fmt) != '\0' \ + && (rp = strptime_internal (rp, (new_fmt), tm, decided, psecs, poffset)) != NULL) + +/* This version: may overwrite these with versions for the locale, + * hence the extra length of the fields + */ +static char weekday_name[][20] = +{ + "Sunday", "Monday", "Tuesday", "Wednesday", + "Thursday", "Friday", "Saturday" +}; +static char ab_weekday_name[][10] = +{ + "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" +}; +static char month_name[][20] = +{ + "January", "February", "March", "April", "May", "June", + "July", "August", "September", "October", "November", "December" +}; +static char ab_month_name[][10] = +{ + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" +}; + +static char am_pm[][4] = {"AM", "PM"}; + + +# define HERE_D_T_FMT "%a %b %e %H:%M:%S %Y" +# define HERE_D_FMT "%y/%m/%d" +# define HERE_T_FMT_AMPM "%I:%M:%S %p" +# define HERE_T_FMT "%H:%M:%S" + +static const unsigned short int __mon_yday[13] = +{ 0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330, 360 }; + + +/* Status of lookup: do we use the locale data or the raw data? */ +enum locale_status { Not, loc, raw }; + +/* Compute the day of the week. */ +static void +day_of_the_week (struct tm *tm) +{ + /* We know that January 1st 1970 was a Thursday (= 4). Compute the + the difference between this data in the one on TM and so determine + the weekday. */ + int corr_year, wday; + + /* R bug fix: day_of_the_week needs year, month, mday set */ + if(tm->tm_year == NA_INTEGER || + tm->tm_mon == NA_INTEGER || + tm->tm_mday == NA_INTEGER) return; + + corr_year = 1900 + tm->tm_year - (tm->tm_mon < 2); + wday = (-473 + + (365 * (tm->tm_year - 70)) + + (corr_year / 4) + - ((corr_year / 4) / 25) + ((corr_year / 4) % 25 < 0) + + (((corr_year / 4) / 25) / 4) + + __mon_yday[tm->tm_mon] + + tm->tm_mday - 1); + tm->tm_wday = ((wday % 7) + 7) % 7; +} + +/* Compute the day of the year. */ +static void +day_of_the_year (struct tm *tm) +{ + /* R bug fix: day_of_the_year needs year, month, mday set */ + if(tm->tm_year == NA_INTEGER || + tm->tm_mon == NA_INTEGER || + tm->tm_mday == NA_INTEGER) return; + + tm->tm_yday = (__mon_yday[tm->tm_mon] + + (tm->tm_mday - 1)); +} + +#include +#include + +static wchar_t w_weekday_name[][20] = +{ + L"Sunday", L"Monday", L"Tuesday", L"Wednesday", + L"Thursday", L"Friday", L"Saturday" +}; +static wchar_t w_ab_weekday_name[][10] = +{ + L"Sun", L"Mon", L"Tue", L"Wed", L"Thu", L"Fri", L"Sat" +}; +static wchar_t w_month_name[][20] = +{ + L"January", L"February", L"March", L"April", L"May", L"June", + L"July", L"August", L"September", L"October", L"November", L"December" +}; +static wchar_t w_ab_month_name[][10] = +{ + L"Jan", L"Feb", L"Mar", L"Apr", L"May", L"Jun", + L"Jul", L"Aug", L"Sep", L"Oct", L"Nov", L"Dec" +}; + +static wchar_t w_am_pm[][4] = {L"AM", L"PM"}; + +/* Need case-insensitive version */ +static int Rwcsncasecmp(const wchar_t *cs1, const wchar_t *s2) +{ + size_t i, n = wcslen(cs1); + const wchar_t *a = cs1, *b = s2; + for(i = 0; i < n; i++, a++, b++) { + if(*b == L'\0' || towlower(*a) != towlower(*b)) return 1; + } + return 0; +} + +#define w_match_string(cs1, s2) \ + (Rwcsncasecmp ((cs1), (s2)) ? 0 : ((s2) += wcslen (cs1), 1)) + +#define w_recursive(new_fmt) \ + (*(new_fmt) != '\0' \ + && (rp = w_strptime_internal (rp, (new_fmt), tm, decided, psecs, poffset)) != NULL) + +static inline wchar_t * +w_strptime_internal (wchar_t *rp, const wchar_t *fmt, struct tm *tm, + enum locale_status *decided, double *psecs, + int *poffset) +{ + int cnt; + int val; + int have_I, is_pm; + int century, want_century; + int have_wday, want_xday; + int have_yday; + int have_mon, have_mday; + int have_uweek, have_wweek; + int week_no = 0; /* -Wall */ + + have_I = is_pm = 0; + century = -1; + want_century = 0; + have_wday = want_xday = have_yday = have_mon = have_mday = 0; + have_uweek = have_wweek = 0; + + while (*fmt != L'\0') + { + /* A white space in the format string matches 0 more or white + space in the input string. */ + if (iswspace (*fmt)) + { + while (iswspace (*rp)) + ++rp; + ++fmt; + continue; + } + + /* Any character but `%' must be matched by the same character + in the input string. */ + if (*fmt != L'%') + { + match_char (*fmt++, *rp++); + continue; + } + + ++fmt; + + /* We need this for handling the `E' modifier. */ + start_over: + + switch (*fmt++) + { + case L'%': + /* Match the `%' character itself. */ + match_char (L'%', *rp++); + break; + case L'a': + case L'A': + /* Match day of week. */ + for (cnt = 0; cnt < 7; ++cnt) + { + if (*decided != loc + && (w_match_string (w_weekday_name[cnt], rp) + || w_match_string (w_ab_weekday_name[cnt], rp))) + { + *decided = raw; + break; + } + } + if (cnt == 7) + /* Does not match a weekday name. */ + return NULL; + tm->tm_wday = cnt; + have_wday = 1; + break; + case L'b': + case L'B': + case L'h': + /* Match month name. */ + for (cnt = 0; cnt < 12; ++cnt) + { + if (w_match_string (w_month_name[cnt], rp) + || w_match_string (w_ab_month_name[cnt], rp)) + { + *decided = raw; + break; + } + } + if (cnt == 12) + /* Does not match a month name. */ + return NULL; + tm->tm_mon = cnt; + want_xday = 1; + break; + case L'c': + /* Match locale's date and time format. */ + if (!w_recursive (L"%a %b %e %H:%M:%S %Y")) /* HERE_D_T_FMT */ + return NULL; + break; + case L'C': + /* Match century number. */ + get_number (0, 99, 2); + century = val; + want_xday = 1; + break; + case L'd': + case L'e': + /* Match day of month. */ + get_number (1, 31, 2); + tm->tm_mday = val; + have_mday = 1; + want_xday = 1; + break; + case L'F': + if (!w_recursive (L"%Y-%m-%d")) + return NULL; + want_xday = 1; + break; + case L'x': + /* Fall through. */ + case L'D': + /* Match standard day format. */ + if (!w_recursive (L"%y/%m/%d")) /* HERE_D_FMT */ + return NULL; + want_xday = 1; + break; + case L'k': + case L'H': + /* Match hour in 24-hour clock. */ + get_number (0, 24, 2); /* allow 24:00:00 */ + tm->tm_hour = val; + have_I = 0; + break; + case L'l': + /* Match hour in 12-hour clock. GNU extension. */ + case L'I': + /* Match hour in 12-hour clock. */ + get_number (1, 12, 2); + tm->tm_hour = val % 12; + have_I = 1; + break; + case L'j': + /* Match day number of year. */ + get_number (1, 366, 3); + tm->tm_yday = val - 1; + have_yday = 1; + break; + case L'm': + /* Match number of month. */ + get_number (1, 12, 2); + tm->tm_mon = val - 1; + have_mon = 1; + want_xday = 1; + break; + case L'M': + /* Match minute. */ + get_number (0, 59, 2); + tm->tm_min = val; + break; + case L'n': + case L't': + /* Match any white space. */ + while (iswspace (*rp)) + ++rp; + break; + case L'p': + /* Match locale's equivalent of AM/PM. */ + if (!w_match_string (w_am_pm[0], rp)) { + if (w_match_string (w_am_pm[1], rp)) + is_pm = 1; + else + return NULL; + } + break; + case L'r': + if (!w_recursive (L"%I:%M:%S %p")) /* HERE_T_FMT_AMPM */ + return NULL; + break; + case L'R': + if (!w_recursive (L"%H:%M")) + return NULL; + break; + case L's': + { + /* The number of seconds may be very high so we cannot use + the `get_number' macro. Instead read the number + character for character and construct the result while + doing this. */ + time_t secs = 0; + if (*rp < L'0' || *rp > L'9') + /* We need at least one digit. */ + return NULL; + + do + { + secs *= 10; + secs += *rp++ - L'0'; + } + while (*rp >= L'0' && *rp <= L'9'); + + if ((tm = localtime (&secs)) == NULL) + /* Error in function. */ + return NULL; + } + break; + case L'S': + get_number (0, 61, 2); + tm->tm_sec = val; + break; + case L'X': + /* Fall through. */ + case L'T': + if (!w_recursive (L"%H:%M:%S")) /* HERE_T_FMT */ + return NULL; + break; + case L'u': + get_number (1, 7, 1); + tm->tm_wday = val % 7; + have_wday = 1; + break; + case L'g': + get_number (0, 99, 2); + /* XXX This cannot determine any field in TM. */ + break; + case L'G': + if (*rp < L'0' || *rp > L'9') + return NULL; + /* XXX Ignore the number since we would need some more + information to compute a real date. */ + do + ++rp; + while (*rp >= L'0' && *rp <= L'9'); + break; + case L'U': + get_number (0, 53, 2); + week_no = val; + have_uweek = 1; + break; + case L'W': + get_number (0, 53, 2); + week_no = val; + have_wweek = 1; + break; + case L'V': + get_number (0, 53, 2); + /* XXX This cannot determine any field in TM without some + information. */ + break; + case L'w': + /* Match number of weekday. */ + get_number (0, 6, 1); + tm->tm_wday = val; + have_wday = 1; + break; + case L'y': + /* Match year within century. */ + get_number (0, 99, 2); + /* The "Year 2000: The Millennium Rollover" paper suggests that + values in the range 69-99 refer to the twentieth century. */ + int ival = val; + tm->tm_year = ival >= 69 ? ival : ival + 100; + /* Indicate that we want to use the century, if specified. */ + want_century = 1; + want_xday = 1; + break; + case L'Y': + /* Match year including century number. */ + get_number (0, 9999, 4); + tm->tm_year = val - 1900; + want_century = 0; + want_xday = 1; + break; + case L'z': + { + int n = 0, neg, off = 0; + val = 0; + while (*rp == L' ') ++rp; + if (*rp != L'+' && *rp != L'-') return NULL; + neg = *rp++ == L'-'; + while (n < 4 && *rp >= L'0' && *rp <= L'9') { + val = val * 10 + *rp++ - L'0'; + ++n; + } + if (n != 4) return NULL; + else { + /* We have to convert the minutes into decimal. */ + if (val % 100 >= 60) return NULL; + val = (val / 100) * 100 + ((val % 100) * 50) / 30; + } + if (val > 1200) return NULL; + off = ((val * 3600) / 100); + if (neg) off = -off; + *poffset = off; + } + break; + case L'Z': + error(_("use of %s for input is not supported"), "%Z"); + return NULL; + break; + case L'E': + /* We have no information about the era format. Just use + the normal format. */ + if (*fmt != L'c' && *fmt != L'C' && *fmt != L'y' && *fmt != L'Y' + && *fmt != L'x' && *fmt != L'X') + /* This is an illegal format. */ + return NULL; + + goto start_over; + case L'O': + switch (*fmt++) + { + case L'd': + case L'e': + /* Match day of month using alternate numeric symbols. */ + get_alt_number (1, 31, 2); + tm->tm_mday = val; + have_mday = 1; + want_xday = 1; + break; + case L'H': + /* Match hour in 24-hour clock using alternate numeric + symbols. */ + get_alt_number (0, 23, 2); + tm->tm_hour = val; + have_I = 0; + break; + case L'I': + /* Match hour in 12-hour clock using alternate numeric + symbols. */ + get_alt_number (1, 12, 2); + tm->tm_hour = val % 12; + have_I = 1; + break; + case L'm': + /* Match month using alternate numeric symbols. */ + get_alt_number (1, 12, 2); + tm->tm_mon = val - 1; + have_mon = 1; + want_xday = 1; + break; + case L'M': + /* Match minutes using alternate numeric symbols. */ + get_alt_number (0, 59, 2); + tm->tm_min = val; + break; + case L'S': + /* Match seconds using alternate numeric symbols. + get_alt_number (0, 61, 2); */ + { + double sval; + wchar_t *end; + sval = wcstod(rp, &end); + if( sval >= 0.0 && sval <= 61.0) { + tm->tm_sec = (int) sval; + *psecs = sval; + } + rp = end; + } + break; + case L'U': + get_alt_number (0, 53, 2); + week_no = val; + have_uweek = 1; + break; + case L'W': + get_alt_number (0, 53, 2); + week_no = val; + have_wweek = 1; + break; + case L'V': + get_alt_number (0, 53, 2); + /* XXX This cannot determine any field in TM without + further information. */ + break; + case L'w': + /* Match number of weekday using alternate numeric symbols. */ + get_alt_number (0, 6, 1); + tm->tm_wday = val; + have_wday = 1; + break; + case L'y': + /* Match year within century using alternate numeric symbols. */ + get_alt_number (0, 99, 2); + int ival = val; + tm->tm_year = ival >= 69 ? ival : ival + 100; + want_xday = 1; + break; + default: + return NULL; + } + break; + default: + return NULL; + } + } + + if (have_I && is_pm) + tm->tm_hour += 12; + + if (century != -1) + { + if (want_century) + tm->tm_year = tm->tm_year % 100 + (century - 19) * 100; + else + /* Only the century, but not the year. Strange, but so be it. */ + tm->tm_year = (century - 19) * 100; + } + + if (want_xday && !have_wday) { + if ( !(have_mon && have_mday) && have_yday) { + /* We don't have tm_mon and/or tm_mday, compute them. */ + int t_mon = 0; + while (__mon_yday[t_mon] <= tm->tm_yday) + t_mon++; + if (!have_mon) + tm->tm_mon = t_mon - 1; + if (!have_mday) + tm->tm_mday = (tm->tm_yday - __mon_yday[t_mon - 1] + 1); + } + day_of_the_week (tm); + } + + if (want_xday && !have_yday) + day_of_the_year (tm); + + if ((have_uweek || have_wweek) && have_wday) { + int save_wday = tm->tm_wday; + int save_mday = tm->tm_mday; + int save_mon = tm->tm_mon; + int w_offset = have_uweek ? 0 : 1; + + tm->tm_mday = 1; + tm->tm_mon = 0; + day_of_the_week (tm); + if (have_mday) + tm->tm_mday = save_mday; + if (have_mon) + tm->tm_mon = save_mon; + + if (!have_yday) + tm->tm_yday = ((7 - (tm->tm_wday - w_offset)) % 7 + + (week_no - 1) *7 + + save_wday - w_offset); + + if (!have_mday || !have_mon) + { + int t_mon = 0; + while (__mon_yday[t_mon] + <= tm->tm_yday) + t_mon++; + if (!have_mon) + tm->tm_mon = t_mon - 1; + if (!have_mday) + tm->tm_mday = + (tm->tm_yday + - __mon_yday[t_mon - 1] + 1); + } + + tm->tm_wday = save_wday; + } + + return rp; +} + + +static char * +strptime_internal (const char *rp, const char *fmt, struct tm *tm, + enum locale_status *decided, double *psecs, + int *poffset) +{ + int cnt; + int val; + int have_I, is_pm; + int century, want_century; + int have_wday, want_xday; + int have_yday; + int have_mon, have_mday; + int have_uweek, have_wweek; + int week_no = 0; /* -Wall */ + + have_I = is_pm = 0; + century = -1; + want_century = 0; + have_wday = want_xday = have_yday = have_mon = have_mday = 0; + have_uweek = have_wweek = 0; + + while (*fmt != '\0') + { + /* A white space in the format string matches 0 more or white + space in the input string. */ + if (isspace ((int)*fmt)) + { + while (isspace ((int)*rp)) + ++rp; + ++fmt; + continue; + } + + /* Any character but `%' must be matched by the same character + in the input string. */ + if (*fmt != '%') + { + match_char (*fmt++, *rp++); + continue; + } + + ++fmt; + + /* We need this for handling the `E' modifier. */ + start_over: + + switch (*fmt++) + { + case '%': + /* Match the `%' character itself. */ + match_char ('%', *rp++); + break; + case 'a': + case 'A': + /* Match day of week. */ + for (cnt = 0; cnt < 7; ++cnt) + { + if (*decided != loc + && (match_string (weekday_name[cnt], rp) + || match_string (ab_weekday_name[cnt], rp))) + { + *decided = raw; + break; + } + } + if (cnt == 7) + /* Does not match a weekday name. */ + return NULL; + tm->tm_wday = cnt; + have_wday = 1; + break; + case 'b': + case 'B': + case 'h': + /* Match month name. */ + for (cnt = 0; cnt < 12; ++cnt) + { + if (match_string (month_name[cnt], rp) + || match_string (ab_month_name[cnt], rp)) + { + *decided = raw; + break; + } + } + if (cnt == 12) + /* Does not match a month name. */ + return NULL; + tm->tm_mon = cnt; + want_xday = 1; + break; + case 'c': + /* Match locale's date and time format. */ + if (!recursive (HERE_D_T_FMT)) + return NULL; + break; + case 'C': + /* Match century number. */ + get_number (0, 99, 2); + century = val; + want_xday = 1; + break; + case 'd': + case 'e': + /* Match day of month. */ + get_number (1, 31, 2); + tm->tm_mday = val; + have_mday = 1; + want_xday = 1; + break; + case 'F': + if (!recursive ("%Y-%m-%d")) + return NULL; + want_xday = 1; + break; + case 'x': + /* Fall through. */ + case 'D': + /* Match standard day format. */ + if (!recursive (HERE_D_FMT)) + return NULL; + want_xday = 1; + break; + case 'k': + case 'H': + /* Match hour in 24-hour clock. */ + get_number (0, 24, 2); /* allow 24:00:00 */ + tm->tm_hour = val; + have_I = 0; + break; + case 'l': + /* Match hour in 12-hour clock. GNU extension. */ + case 'I': + /* Match hour in 12-hour clock. */ + get_number (1, 12, 2); + tm->tm_hour = val % 12; + have_I = 1; + break; + case 'j': + /* Match day number of year. */ + get_number (1, 366, 3); + tm->tm_yday = val - 1; + have_yday = 1; + break; + case 'm': + /* Match number of month. */ + get_number (1, 12, 2); + tm->tm_mon = val - 1; + have_mon = 1; + want_xday = 1; + break; + case 'M': + /* Match minute. */ + get_number (0, 59, 2); + tm->tm_min = val; + break; + case 'n': + case 't': + /* Match any white space. */ + while (isspace ((int)*rp)) + ++rp; + break; + case 'p': + /* Match locale's equivalent of AM/PM. */ + if (!match_string (am_pm[0], rp)) { + if (match_string (am_pm[1], rp)) + is_pm = 1; + else + return NULL; + } + break; + case 'r': + if (!recursive (HERE_T_FMT_AMPM)) + return NULL; + break; + case 'R': + if (!recursive ("%H:%M")) + return NULL; + break; + case 's': + { + /* The number of seconds may be very high so we cannot use + the `get_number' macro. Instead read the number + character for character and construct the result while + doing this. */ + time_t secs = 0; + if (*rp < '0' || *rp > '9') + /* We need at least one digit. */ + return NULL; + + do + { + secs *= 10; + secs += *rp++ - '0'; + } + while (*rp >= '0' && *rp <= '9'); + + if ((tm = localtime (&secs)) == NULL) + /* Error in function. */ + return NULL; + } + break; + case 'S': + get_number (0, 61, 2); + tm->tm_sec = val; + break; + case 'X': + /* Fall through. */ + case 'T': + if (!recursive (HERE_T_FMT)) + return NULL; + break; + case 'u': + get_number (1, 7, 1); + tm->tm_wday = val % 7; + have_wday = 1; + break; + case 'g': + get_number (0, 99, 2); + /* XXX This cannot determine any field in TM. */ + break; + case 'G': + if (*rp < '0' || *rp > '9') + return NULL; + /* XXX Ignore the number since we would need some more + information to compute a real date. */ + do + ++rp; + while (*rp >= '0' && *rp <= '9'); + break; + case 'U': + get_number (0, 53, 2); + week_no = val; + have_uweek = 1; + break; + case 'W': + get_number (0, 53, 2); + week_no = val; + have_wweek = 1; + break; + case 'V': + get_number (0, 53, 2); + /* XXX This cannot determine any field in TM without some + information. */ + break; + case 'w': + /* Match number of weekday. */ + get_number (0, 6, 1); + tm->tm_wday = val; + have_wday = 1; + break; + case 'y': + /* Match year within century. */ + get_number (0, 99, 2); + /* The "Year 2000: The Millennium Rollover" paper suggests that + values in the range 69-99 refer to the twentieth century. + And this is mandated by the POSIX 2001 standard, with a + caveat that it might change in future. + */ + int ival = val; + tm->tm_year = ival >= 69 ? ival : ival + 100; + /* Indicate that we want to use the century, if specified. */ + want_century = 1; + want_xday = 1; + break; + case 'Y': + /* Match year including century number. */ + get_number (0, 9999, 4); + tm->tm_year = val - 1900; + want_century = 0; + want_xday = 1; + break; + case 'z': + /* Only recognize RFC 822 form */ + { + int n = 0, neg, off = 0; + val = 0; + while (*rp == ' ') ++rp; + if (*rp != '+' && *rp != '-') return NULL; + neg = *rp++ == '-'; + while (n < 4 && *rp >= '0' && *rp <= '9') { + val = val * 10 + *rp++ - '0'; + ++n; + } + if (n != 4) return NULL; + else { + /* We have to convert the minutes into decimal. */ + if (val % 100 >= 60) return NULL; + val = (val / 100) * 100 + ((val % 100) * 50) / 30; + } + if (val > 1200) return NULL; + off = (val * 3600) / 100; + if (neg) off = -off; + *poffset = off; + } + break; + case 'Z': + error(_("use of %s for input is not supported"), "%Z"); + return NULL; + break; + case 'E': + /* We have no information about the era format. Just use + the normal format. */ + if (*fmt != 'c' && *fmt != 'C' && *fmt != 'y' && *fmt != 'Y' + && *fmt != 'x' && *fmt != 'X') + /* This is an illegal format. */ + return NULL; + + goto start_over; + case 'O': + switch (*fmt++) + { + case 'd': + case 'e': + /* Match day of month using alternate numeric symbols. */ + get_alt_number (1, 31, 2); + tm->tm_mday = val; + have_mday = 1; + want_xday = 1; + break; + case 'H': + /* Match hour in 24-hour clock using alternate numeric + symbols. */ + get_alt_number (0, 23, 2); + tm->tm_hour = val; + have_I = 0; + break; + case 'I': + /* Match hour in 12-hour clock using alternate numeric + symbols. */ + get_alt_number (1, 12, 2); + tm->tm_hour = val % 12; + have_I = 1; + break; + case 'm': + /* Match month using alternate numeric symbols. */ + get_alt_number (1, 12, 2); + tm->tm_mon = val - 1; + have_mon = 1; + want_xday = 1; + break; + case 'M': + /* Match minutes using alternate numeric symbols. */ + get_alt_number (0, 59, 2); + tm->tm_min = val; + break; + case 'S': + /* Match seconds using alternate numeric symbols. + get_alt_number (0, 61, 2); */ + { + double sval; + char *end; + sval = strtod(rp, &end); + if( sval >= 0.0 && sval <= 61.0) { + tm->tm_sec = (int) sval; + *psecs = sval; + } + rp = end; + } + break; + case 'U': + get_alt_number (0, 53, 2); + week_no = val; + have_uweek = 1; + break; + case 'W': + get_alt_number (0, 53, 2); + week_no = val; + have_wweek = 1; + break; + case 'V': + get_alt_number (0, 53, 2); + /* XXX This cannot determine any field in TM without + further information. */ + break; + case 'w': + /* Match number of weekday using alternate numeric symbols. */ + get_alt_number (0, 6, 1); + tm->tm_wday = val; + have_wday = 1; + break; + case 'y': + /* Match year within century using alternate numeric symbols. */ + get_alt_number (0, 99, 2); + int ival = val; + tm->tm_year = ival >= 69 ? ival : ival + 100; + want_xday = 1; + break; + default: + return NULL; + } + break; + default: + return NULL; + } + } + + if (have_I && is_pm) + tm->tm_hour += 12; + + if (century != -1) + { + if (want_century) + tm->tm_year = tm->tm_year % 100 + (century - 19) * 100; + else + /* Only the century, but not the year. Strange, but so be it. */ + tm->tm_year = (century - 19) * 100; + } + + if (want_xday && !have_wday) { + if ( !(have_mon && have_mday) && have_yday) { + /* We don't have tm_mon and/or tm_mday, compute them. */ + int t_mon = 0; + while (__mon_yday[t_mon] <= tm->tm_yday) + t_mon++; + if (!have_mon) + tm->tm_mon = t_mon - 1; + if (!have_mday) + tm->tm_mday = (tm->tm_yday - __mon_yday[t_mon - 1] + 1); + } + day_of_the_week (tm); + } + + if (want_xday && !have_yday) + day_of_the_year (tm); + + if ((have_uweek || have_wweek) && have_wday) { + int save_wday = tm->tm_wday; + int save_mday = tm->tm_mday; + int save_mon = tm->tm_mon; + int w_offset = have_uweek ? 0 : 1; + + tm->tm_mday = 1; + tm->tm_mon = 0; + day_of_the_week (tm); + if (have_mday) + tm->tm_mday = save_mday; + if (have_mon) + tm->tm_mon = save_mon; + + if (!have_yday) + tm->tm_yday = ((7 - (tm->tm_wday - w_offset)) % 7 + + (week_no - 1) *7 + + save_wday - w_offset); + + if (!have_mday || !have_mon) + { + int t_mon = 0; + while (__mon_yday[t_mon] + <= tm->tm_yday) + t_mon++; + if (!have_mon) + tm->tm_mon = t_mon - 1; + if (!have_mday) + tm->tm_mday = + (tm->tm_yday + - __mon_yday[t_mon - 1] + 1); + } + + tm->tm_wday = save_wday; + } + + return (char *) rp; +} + + +#ifdef HAVE_LOCALE_H +# include + +/* We check for a changed locale here, as setting the locale strings is + on some systems slow compared to the conversions. */ + +static void get_locale_strings(void) +{ + int i; + struct tm tm; + char buff[4]; + + tm.tm_sec = tm.tm_min = tm.tm_hour = tm.tm_mday = tm.tm_mon + = tm.tm_isdst = 0; + tm.tm_year = 30; + for(i = 0; i < 12; i++) { + tm.tm_mon = i; + strftime(ab_month_name[i], 10, "%b", &tm); + strftime(month_name[i], 20, "%B", &tm); + } + tm.tm_mon = 0; + for(i = 0; i < 7; i++) { + tm.tm_mday = tm.tm_yday = i+1; /* 2000-1-2 was a Sunday */ + tm.tm_wday = i; + strftime(ab_weekday_name[i], 10, "%a", &tm); + strftime(weekday_name[i], 20, "%A", &tm); + } + tm.tm_hour = 1; + /* in locales where these are unused, they may be empty: better + not to reset them then */ + strftime(buff, 4, "%p", &tm); + if(strlen(buff)) strcpy(am_pm[0], buff); + tm.tm_hour = 13; + strftime(buff, 4, "%p", &tm); + if(strlen(buff)) strcpy(am_pm[1], buff); +} + +#if defined(HAVE_WCSTOD) && defined(HAVE_WCSFTIME) +static void get_locale_w_strings(void) +{ + int i; + struct tm tm; + wchar_t buff[4]; + + tm.tm_sec = tm.tm_min = tm.tm_hour = tm.tm_mday = tm.tm_mon + = tm.tm_isdst = 0; + tm.tm_year = 30; + for(i = 0; i < 12; i++) { + tm.tm_mon = i; + wcsftime(w_ab_month_name[i], 10, L"%b", &tm); + wcsftime(w_month_name[i], 20, L"%B", &tm); + } + tm.tm_mon = 0; + for(i = 0; i < 7; i++) { + tm.tm_mday = tm.tm_yday = i+1; /* 2000-1-2 was a Sunday */ + tm.tm_wday = i; + wcsftime(w_ab_weekday_name[i], 10, L"%a", &tm); + wcsftime(w_weekday_name[i], 20, L"%A", &tm); + } + tm.tm_hour = 1; + /* in locales where these are unused, they may be empty: better + not to reset them then */ + wcsftime(buff, 4, L"%p", &tm); + if(wcslen(buff)) wcscpy(w_am_pm[0], buff); + tm.tm_hour = 13; + wcsftime(buff, 4, L"%p", &tm); + if(wcslen(buff)) wcscpy(w_am_pm[1], buff); +} +#endif +#endif /* HAVE_LOCALE_H */ + + +/* We only care if the result is null or not */ +static char * +strptime_360(const char *buf, const char *format, struct tm *tm, + double *psecs, int *poffset) +{ + enum locale_status decided; + decided = raw; +#if defined(HAVE_WCSTOD) + if(mbcslocale) { + wchar_t wbuf[1001], wfmt[1001]; size_t n; +#if defined(HAVE_LOCALE_H) && defined(HAVE_WCSFTIME) + get_locale_w_strings(); +#endif + n = mbstowcs(NULL, buf, 1000); + if(n > 1000) error(_("input string is too long")); + n = mbstowcs(wbuf, buf, 1000); + if(n == -1) error(_("invalid multibyte input string")); + + n = mbstowcs(NULL, format, 1000); + if(n > 1000) error(_("format string is too long")); + n = mbstowcs(wfmt, format, 1000); + if(n == -1) error(_("invalid multibyte format string")); + return (char *) w_strptime_internal (wbuf, wfmt, tm, &decided, psecs, poffset); + } else +#endif + { +#ifdef HAVE_LOCALE_H + get_locale_strings(); +#endif + return strptime_internal (buf, format, tm, &decided, psecs, poffset); + } +} -- GitLab From 40dc4f818291b7b3a519bf5a7bf05b797648c605 Mon Sep 17 00:00:00 2001 From: vagudets Date: Mon, 4 Aug 2025 12:22:11 +0200 Subject: [PATCH 6/8] Add Makevars file --- src/Makevars | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/Makevars diff --git a/src/Makevars b/src/Makevars new file mode 100644 index 0000000..cab6191 --- /dev/null +++ b/src/Makevars @@ -0,0 +1,11 @@ +# Settings from /etc/R/Makeconf with "non-portable flag(s):" +# ‘-Wdate-time’ ‘-Werror=format-security’ ‘-Wformat’ replaced by -Wall -pedantic +# and without -fdebug-prefix-map=... +# See https://stackoverflow.com/questions/50658198/cran-submission-r-cmd-check-warning-compilation-flags-used +# +# Note: -Wformat-overflow=3 is a non-portable flag, which seems to be used by CRAN check though +CC=gcc-7 -std=gnu99 ## -Wformat-overflow=3 +CFLAGS = -g -O3 -Wall -pedantic -mtune=native -D_FORTIFY_SOURCE=2 $(LTO) +CXXFLAGS = -g -O3 -Wall -pedantic -mtune=native -frtti -Wno-ignored-attributes -Wno-deprecated-declarations -D_FORTIFY_SOURCE=2 $(LTO) +FFLAGS= -g -O2 -mtune=native -Wall -pedantic +FCFLAGS=$FFLAGS -- GitLab From cb152c51790e42bb952bac5321878c281fa57f20 Mon Sep 17 00:00:00 2001 From: vagudets Date: Fri, 8 Aug 2025 15:20:26 +0200 Subject: [PATCH 7/8] Improving package build (WIP) --- DESCRIPTION | 8 +++++--- NAMESPACE | 32 ++++++++++++++++++++++++++++++++ R/PCICtFunctions.R | 11 +++++++++++ man/as.PCICt.Rd | 13 +++++++++++++ src/ClimProjDiags.so | Bin 74656 -> 73168 bytes src/Makevars | 11 ----------- src/PCICt_init.o | Bin 5936 -> 6648 bytes src/datetime_360.o | Bin 66584 -> 80920 bytes 8 files changed, 61 insertions(+), 14 deletions(-) delete mode 100644 src/Makevars diff --git a/DESCRIPTION b/DESCRIPTION index 8787634..2ee56f8 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -30,9 +30,11 @@ Suggests: markdown, rmarkdown License: GPL-3 -URL: https://earth.bsc.es/gitlab/es/ClimProjDiags -BugReports: https://earth.bsc.es/gitlab/es/ClimProjDiags/-/issues +# URL: https://earth.bsc.es/gitlab/es/ClimProjDiags +# BugReports: https://earth.bsc.es/gitlab/es/ClimProjDiags/-/issues Encoding: UTF-8 -RoxygenNote: 7.3.1 +RoxygenNote: 7.3.2 VignetteBuilder: knitr Config/testthat/edition: 3 +NeedsCompilation: yes +SystemRequirements: C++11 diff --git a/NAMESPACE b/NAMESPACE index 12613e3..9e1923a 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -24,3 +24,35 @@ importFrom(graphics,axis) importFrom(graphics,par) importFrom(stats,quantile) useDynLib(ClimProjDiags) +S3method(c, PCICt) +S3method(rep, PCICt) +S3method(seq, PCICt) +S3method(trunc, PCICt) +S3method(mean, PCICt) +S3method(range, PCICt) +S3method(julian, PCICt) +S3method(diff, PCICt) +S3method(cut, PCICt) +S3method(is.numeric, PCICt) +S3method(min, PCICt) +S3method(max, PCICt) +S3method(print, PCICt) +S3method(format, PCICt) +S3method(summary, PCICt) +S3method(unique, PCICt) +# S3method(axis, PCICt) +S3method(pretty, PCICt) +export(.PCICt, round.PCICt, as.PCICt, as.PCICt.default, as.character.PCICt, as.PCICt.numeric, as.PCICt.POSIXlt, as.PCICt.POSIXct, as.POSIXlt.PCICt, as.POSIXct.PCICt, "+.PCICt", "-.PCICt", Ops.PCICt, "[.PCICt", "[<-.PCICt", as.POSIXct.POSIXlt.360, as.POSIXlt.POSIXct.360) +S3method("+", PCICt) +S3method("-", PCICt) +S3method("[", PCICt) +S3method("[<-", PCICt) +S3method(Ops, PCICt) +S3method(as.PCICt, POSIXct) +S3method(as.PCICt, POSIXlt) +S3method(as.PCICt, default) +S3method(as.PCICt, numeric) +S3method(as.POSIXct, PCICt) +S3method(as.POSIXlt, PCICt) +S3method(as.character, PCICt) +S3method(round, PCICt) diff --git a/R/PCICtFunctions.R b/R/PCICtFunctions.R index 7001e7c..d2a8d3a 100644 --- a/R/PCICtFunctions.R +++ b/R/PCICtFunctions.R @@ -318,13 +318,24 @@ copy.atts.PCICt <- function(from, to) { #'Functions from the PCICt package. These functions convert between PCICt #'objects and other types of data. #'@name as.PCICt +#'@param x The input data. +#' +#'@param cal The calendar type. +#' +#'@param ... Any additional arguments passed on. +#' #'@aliases as.PCICt as.PCICt.default as.PCICt.POSIXlt as.PCICt.POSIXct #' as.PCICt.numeric .PCICt as.POSIXct.PCICt as.POSIXlt.PCICt as.character.PCICt +#' +.PCICt -.PCICt Ops.PCICt [.PCICt [<-.PCICt round.PCICt +#' #'@return For as.PCICt and .PCICt, a PCICt object with the given calendar type. #' For as.POSIXct.PCICt and as.POSIXlt.PCICt, a POSIXct or POSIXlt #' object, respectively. +#' #'@export +#' #'@useDynLib ClimProjDiags + as.PCICt <- function(x, cal, ...) { if(missing(cal)) stop("Can't create a PCICt with no calendar type") UseMethod("as.PCICt") diff --git a/man/as.PCICt.Rd b/man/as.PCICt.Rd index a920107..49343ce 100644 --- a/man/as.PCICt.Rd +++ b/man/as.PCICt.Rd @@ -10,10 +10,23 @@ \alias{as.POSIXct.PCICt} \alias{as.POSIXlt.PCICt} \alias{as.character.PCICt} +\alias{+.PCICt} +\alias{-.PCICt} +\alias{Ops.PCICt} +\alias{[.PCICt} +\alias{[<-.PCICt} +\alias{round.PCICt} \title{PCICt} \usage{ as.PCICt(x, cal, ...) } +\arguments{ +\item{x}{The input data.} + +\item{cal}{The calendar type.} + +\item{...}{Any additional arguments passed on.} +} \value{ For as.PCICt and .PCICt, a PCICt object with the given calendar type. For as.POSIXct.PCICt and as.POSIXlt.PCICt, a POSIXct or POSIXlt diff --git a/src/ClimProjDiags.so b/src/ClimProjDiags.so index fb4b91250b3da24ec9f23f5b95c253711bfcb958..9f149cc1236f85ad2ba3eb01616543f5f0ddc66a 100755 GIT binary patch literal 73168 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%0DtnWW(RE3#;gN&#s}MK7Y9YhF;xZHfeg@icN+J*E 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 SNc@b+_(4#$GZXsM{Qm|?14~K( literal 66584 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 Date: Mon, 1 Sep 2025 11:19:30 +0200 Subject: [PATCH 8/8] Necessary changes for CRAN submission --- DESCRIPTION | 13 +++++++++---- NAMESPACE | 2 +- R/ArrayToList.R | 5 +++-- R/PCICtFunctions.R | 8 ++++---- README.md | 2 +- man/ArrayToList.Rd | 6 ++---- 6 files changed, 20 insertions(+), 16 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 2ee56f8..fbd0cdf 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -9,14 +9,19 @@ Authors@R: c( person("Nicolau", "Manubens", , "nicolau.manubens@bsc.es", role = "ctb"), person("Alasdair", "Hunter", , "alasdair.hunter@bsc.es", role = "aut"), person("Louis-Philippe", "Caron", , "louis-philippe.caron@bsc.es", role = "ctb"), - person("Eva", "Rifà", , "eva.rifarovira@bsc.es", role = "ctb")) + person("Eva", "Rifà", , "eva.rifarovira@bsc.es", role = "ctb"), + person("Ulrich", "Drepper", , , role = "ctb"), + person("David", "Bronaugh", , , role = "ctb"), + person("James", "Hiebert", , , role = "ctb")) Description: Set of tools to compute metrics and indices for climate analysis. The package provides functions to compute extreme indices, evaluate the agreement between models and combine theses models into an ensemble. Multi-model time series of climate indices can be computed either after averaging the 2-D fields from different models provided they share a common grid or by combining time series computed on the model native grid. Indices can be assigned weights - and/or combined to construct new indices. + and/or combined to construct new indices. The package makes use of some of the + methods described in: + N. Manubens et al. (2018) . Depends: R (>= 3.2.0) Imports: @@ -30,8 +35,8 @@ Suggests: markdown, rmarkdown License: GPL-3 -# URL: https://earth.bsc.es/gitlab/es/ClimProjDiags -# BugReports: https://earth.bsc.es/gitlab/es/ClimProjDiags/-/issues +URL: https://earth.bsc.es/gitlab/es/ClimProjDiags +BugReports: https://earth.bsc.es/gitlab/es/ClimProjDiags/-/issues Encoding: UTF-8 RoxygenNote: 7.3.2 VignetteBuilder: knitr diff --git a/NAMESPACE b/NAMESPACE index 9e1923a..92d5c9e 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -42,7 +42,7 @@ S3method(summary, PCICt) S3method(unique, PCICt) # S3method(axis, PCICt) S3method(pretty, PCICt) -export(.PCICt, round.PCICt, as.PCICt, as.PCICt.default, as.character.PCICt, as.PCICt.numeric, as.PCICt.POSIXlt, as.PCICt.POSIXct, as.POSIXlt.PCICt, as.POSIXct.PCICt, "+.PCICt", "-.PCICt", Ops.PCICt, "[.PCICt", "[<-.PCICt", as.POSIXct.POSIXlt.360, as.POSIXlt.POSIXct.360) +export(.PCICt, round.PCICt, as.PCICt, as.PCICt.default, as.character.PCICt, as.PCICt.numeric, as.PCICt.POSIXlt, as.PCICt.POSIXct, as.POSIXlt.PCICt, as.POSIXct.PCICt, "+.PCICt", "-.PCICt", Ops.PCICt, "[.PCICt", "[<-.PCICt") S3method("+", PCICt) S3method("-", PCICt) S3method("[", PCICt) diff --git a/R/ArrayToList.R b/R/ArrayToList.R index a36de39..5a394a6 100644 --- a/R/ArrayToList.R +++ b/R/ArrayToList.R @@ -1,7 +1,8 @@ #' Split an array into list by a given array dimension #' #'@description This function splits an array into a list as required by -#'PlotLayout function from package "s2dv" when parameter 'special_args' is used. +#'PlotLayout function from package "s2dv" when parameter 'special_args' is used. +#'See: N. Manubens et al. (2018) <. #'The function ArrayToList allows to add names to the elements of the list in #'two different levels, the 'list' or the 'sublist'. #' @@ -29,8 +30,8 @@ #'class(datalist[[1]]) #'class(datalist[[1]][[1]]) #'str(datalist) -#'@seealso \link[s2dv]{PlotLayout} #'@export + ArrayToList <- function(data, dim, level = 'list', names = NULL) { if (is.null(dim(data))) { stop("Parameter 'data' must be an array or matrix.") diff --git a/R/PCICtFunctions.R b/R/PCICtFunctions.R index d2a8d3a..eda30bc 100644 --- a/R/PCICtFunctions.R +++ b/R/PCICtFunctions.R @@ -430,13 +430,13 @@ format.POSIXlt.360 <- function(x, format="", ...) { } #'@noRd -as.POSIXct.POSIXlt.360 <- function(x) { - .Call("do_asPOSIXct_360", x, PACKAGE = "ClimProjDiags") +as.POSIXct.POSIXlt.360 <- function(x, ...) { + .Call("do_asPOSIXct_360", x) } #'@noRd -as.POSIXlt.POSIXct.360 <- function(x) { - .Call("do_asPOSIXlt_360", x, PACKAGE = "ClimProjDiags") +as.POSIXlt.POSIXct.360 <- function(x, ...) { + .Call("do_asPOSIXlt_360", x) } #'@noRd diff --git a/README.md b/README.md index 3831630..82a48f0 100644 --- a/README.md +++ b/README.md @@ -27,5 +27,5 @@ The main functionalities are presented in four different vignettes with step by ### How to contribute? -Information on questions, contributions and bug reports can be found in [**CONTRIBUTING.md**](CONTRIBUTING.md). +Information on questions, contributions and bug reports can be found in [**CONTRIBUTING.md**](https://earth.bsc.es/gitlab/es/ClimProjDiags/blob/master/CONTRIBUTING.md). diff --git a/man/ArrayToList.Rd b/man/ArrayToList.Rd index 43d3278..878550b 100644 --- a/man/ArrayToList.Rd +++ b/man/ArrayToList.Rd @@ -24,7 +24,8 @@ A list of arrays of the length of the dimension set in parameter 'dim'. } \description{ This function splits an array into a list as required by -PlotLayout function from package "s2dv" when parameter 'special_args' is used. +PlotLayout function from package "s2dv" when parameter 'special_args' is used. +See: N. Manubens et al. (2018) <. The function ArrayToList allows to add names to the elements of the list in two different levels, the 'list' or the 'sublist'. } @@ -42,6 +43,3 @@ class(datalist[[1]]) class(datalist[[1]][[1]]) str(datalist) } -\seealso{ -\link[s2dv]{PlotLayout} -} -- GitLab