[Rd] Minor inconsistencies in tools:::funAPI()
Toby Hocking
tdhock5 @end|ng |rom gm@||@com
Mon Jul 29 22:29:42 CEST 2024
Hi Ivan
Can you please clarify what input files should be used with your
proposed function? I tried a few files in r-svn/src/include and one of
them gave me an error.
> getdecl("~/R/r-svn/src/include/R.h")
[1] "R_FlushConsole" "R_ProcessEvents" "R_WaitEvent"
> getdecl("~/R/r-svn/src/include/Rdefines.h")
Error in regmatches(lines, gregexec(rx, lines, perl = TRUE))[[1]][3, ] :
incorrect number of dimensions
On Mon, Jul 15, 2024 at 10:32 AM Ivan Krylov via R-devel
<r-devel using r-project.org> wrote:
>
> Hi all,
>
> I've noticed some peculiarities in the tools:::funAPI output that
> complicate its programmatic use a bit.
>
> - Is it for remapped symbol names (with Rf_ or the Fortran
> underscore), or for unmapped names (without Rf_ or the underscore)?
>
> I see that the functions marked in WRE are almost all (except
> Rf_installChar and Rf_installTrChar) unmapped. This makes a lot of
> sense because some of those interfaces (e.g. CONS(), CHAR(),
> NOT_SHARED()) are C preprocessor macros, not functions. I also see that
> installTrChar is not explicitly marked.
>
> Are we allowed to call tools:::unmap(tools:::funAPI()$name) and
> consider the return value to be the list of all unmapped APIs, despite,
> e.g., installTrChar not being explicitly marked?
>
> - Should R_PV be an @apifun if it's currently caught by checks in
> sotools.R?
>
> - Should R_FindSymbol be commented /* Not API */ if it's marked as
> @apifun in WRE and not caught by sotools.R? It is currently used by 8
> CRAN packages.
>
> - The names 'select', 'delztg' from R_ext/Lapack.h are function
> pointer arguments, not functions or type declarations. They are
> being found because funcRegexp is written to match incomplete
> function declarations (e.g. when they end up being split over
> multiple lines, like in R_ext/Lapack.h), and function pointer
> argument declarations look sufficiently similar.
>
> A relatively compact (but still brittle) way to match function
> declarations in C header files is shown at the end of this message. I
> have confirmed that compared to tools:::getFunsHdr, the only extraneous
> symbols that it finds in preprocessed headers are "R_SetWin32",
> "user_unif_rand", "user_unif_init", "user_unif_nseed",
> "user_unif_seedloc" "user_norm_rand", which are special-cased in
> tools:::getFunsHdr, and the only symbols it doesn't find are "select"
> and "delztg" in R_ext/Lapack.h, which we should not be finding.
>
> # "Bird's eye" view, gives unmapped names on non-preprocessed headers
> getdecl <- function(file, lines = readLines(file)) {
> # have to combine to perform multi-line matches
> lines <- paste(c(lines, ''), collapse = '\n')
> # first eat the C comments, dotall but non-greedy match
> lines <- gsub('(?s)/\\*.*?\\*/', '', lines, perl = TRUE)
> # C++-style comments too, multiline not dotall
> lines <- gsub('(?m)//.*$', '', lines, perl = TRUE)
> # drop all preprocessor directives
> lines <- gsub('(?m)^\\s*#.*$', '', lines, perl = TRUE)
>
> rx <- r"{(?xs)
> (?!typedef)(?<!\w) # please no typedefs
> # return type with attributes
> (
> # words followed by whitespace or stars
> (?: \w+ (?:\s+ | \*)+)+
> )
> # function name, assumes no extra whitespace
> (
> \w+\(\w+\) # macro call
> | \(\w+\) # in parentheses
> | \w+ # a plain name
> )
> # arguments: non-greedy match inside parentheses
> \s* \( (.*?) \) \s* # using dotall here
> # will include R_PRINTF_FORMAT(1,2 but we don't care
> # finally terminated by semicolon
> ;
> }"
>
> regmatches(lines, gregexec(rx, lines, perl = TRUE))[[1]][3,]
> }
>
> # Preprocess then extract remapped function names like getFunsHdr
> getdecl2 <- function(file)
> file |>
> readLines() |>
> grep('^\\s*#\\s*error', x = _, value = TRUE, invert = TRUE) |>
> tools:::ccE() |>
> getdecl(lines = _)
>
> --
> Best regards,
> Ivan
>
> ______________________________________________
> R-devel using r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
More information about the R-devel
mailing list