Re: [Rd] Parsing code with newlines

2019-04-11 Thread peter dalgaard
”\r" is CR not LF. On systems that use CRLF as newline, the combination should 
be "\n" at the C (or R) level. 

However, I suppose there is no particular reason not to treat CR as whitespace, 
as does happen with FF and HT.

-pd

> On 11 Apr 2019, at 01:59 , Mikhail Titov  wrote:
> 
> The barely modified test code I had in my previous post, does not parse
> what would seem a legit sample string "\r\n ls()". However, it does
> parse alright "\n ls()". Nowhere in the docs the intolerance to line
> feeds is mentioned. It is reproducible from R console as well.
> 
> ,[ R console session ]
> | > parse(text="\r\n ls()")
> | Error in parse(text = "\r\n ls()") : :1:1: unexpected input
> | 1:
> | ^
> | >
> `
> 

-- 
Peter Dalgaard, Professor,
Center for Statistics, Copenhagen Business School
Solbjerg Plads 3, 2000 Frederiksberg, Denmark
Phone: (+45)38153501
Office: A 4.23
Email: pd@cbs.dk  Priv: pda...@gmail.com

__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


Re: [Rd] Parsing code with newlines

2019-04-10 Thread Mikhail Titov
On Wed, Apr 10, 2019 at  5:06 AM, Tomas Kalibera  
wrote:
>> This is my first post here. I came across the very same problem.
>> It can be reproduced within modified tests/Embedding/RParseEval.c
>
> Please check https://www.r-project.org/posting-guide.html and update
> your post if you still need to get help here - from your current post
> I am not sure what you did, what was the error you got and from which
> tool, why you think the error was a result of something not working
> correctly/as documented, etc. The original post with the same subject
> you are probably referring to had the same problem.

The original post is linked via e-mail headers however it goes back a
decade. It shows up linked as a thread alright in Gnus. Hence I thought
it would be alright to jump straight to the matter.

Here is the link to original discussion
https://stat.ethz.ch/pipermail/r-devel/2008-August/050332.html

At this point, I would like to report two bugs in "Writing R Extensions"
documentation. From that document it is not clear why line feeds (0x0A)
have to be removed from the input string to be parsed. Also nowhere in
that document it mentions R_TopLevelExec if parsing needs to be done in
the outer context. That is not when our C function is called from R, but
when we are trying to parse R code in C directly outside of main loop.
These are big show stoppers for newcomers.

The barely modified test code I had in my previous post, does not parse
what would seem a legit sample string "\r\n ls()". However, it does
parse alright "\n ls()". Nowhere in the docs the intolerance to line
feeds is mentioned. It is reproducible from R console as well.

,[ R console session ]
| > parse(text="\r\n ls()")
| Error in parse(text = "\r\n ls()") : :1:1: unexpected input
| 1:
| ^
| >
`

Another problem with the aforementioned documentation is parsing
erroneous expressions like "deadbeef<-function(,bad){}" in top level
context. Instead of returning an error from parsing, it crashes
(with R_suicide) unless the call is wrapped in R_TopLevelExec.

> Please also note that "tests" (tests/Embedding/RParseEval.c) are not
> examples - if they do not catch R errors in some cases that is
> perfectly ok, they also may use internal API that is indeed not
> documented e.g. in Writing R Extensions.

Where would be a good example on top level context parsing then? I have
no problems skipping error checks and/or with the use of undocumented
functions. However I would rather prefer to avoid major unexpected
crashes. That example does NOT use any of the undocumented API and therefore is
misleading. I believe it SHOULD include R_TopLevelExec and that function
SHOULD be in the docs.

> Note Writing R Extensions has a section on embedding R and on cleanup
> handlers.

I have no problems with the rest of the document on embedding and clean
up in general.

>> Actually this example has another issue, namely it doesn't wrap
>> everything in R_ToplevelExec . This is a major show stopper for
>> newcomers as that function is barely mentioned anywhere and longjmp into
>> terminated setuploop function followed by R_suicide look like a mystery.
>>
>> Error: bad value
>> Fatal error: unable to initialize the JIT
>>
>>
>> That aside, here is the code with newlines that fails to parse. I hope
>> it will paste alright here.
>>
>>
>> #include "embeddedRCall.h"
>> #include 
>>
>> int
>> main(int argc, char *argv[])
>> {
>>  SEXP e, tmp;
>>  int hadError;
>>  ParseStatus status;
>>
>>  init_R(argc, argv);
>>
>>  PROTECT(tmp = mkString("\n\r ls()"));
>>  PROTECT(e = R_ParseVector(tmp, 1, &status, R_NilValue));
>>  if (status != PARSE_OK)
>>  {
>>  printf("boo boo\n");
>>  }
>>  else
>>  {
>>  PrintValue(e);
>>  R_tryEval(VECTOR_ELT(e,0), R_GlobalEnv, &hadError);
>>  }
>>  UNPROTECT(2);
>>
>>  end_R();
>>  return(0);
>> }

--
Mikhail

__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


Re: [Rd] Parsing code with newlines

2019-04-10 Thread Tomas Kalibera

On 4/5/19 8:14 AM, Mikhail Titov wrote:

Hello!

This is my first post here. I came across the very same problem.
It can be reproduced within modified tests/Embedding/RParseEval.c


Please check https://www.r-project.org/posting-guide.html and update 
your post if you still need to get help here - from your current post I 
am not sure what you did, what was the error you got and from which 
tool, why you think the error was a result of something not working 
correctly/as documented, etc. The original post with the same subject 
you are probably referring to had the same problem.


Please also note that "tests" (tests/Embedding/RParseEval.c) are not 
examples - if they do not catch R errors in some cases that is perfectly 
ok, they also may use internal API that is indeed not documented e.g. in 
Writing R Extensions. Note Writing R Extensions has a section on 
embedding R and on cleanup handlers.


Best
Tomas



Actually this example has another issue, namely it doesn't wrap
everything in R_ToplevelExec . This is a major show stopper for
newcomers as that function is barely mentioned anywhere and longjmp into
terminated setuploop function followed by R_suicide look like a mystery.

Error: bad value
Fatal error: unable to initialize the JIT


That aside, here is the code with newlines that fails to parse. I hope
it will paste alright here.


#include "embeddedRCall.h"
#include 

int
main(int argc, char *argv[])
{
 SEXP e, tmp;
 int hadError;
 ParseStatus status;

 init_R(argc, argv);

 PROTECT(tmp = mkString("\n\r ls()"));
 PROTECT(e = R_ParseVector(tmp, 1, &status, R_NilValue));
 if (status != PARSE_OK)
 {
 printf("boo boo\n");
 }
 else
 {
 PrintValue(e);
 R_tryEval(VECTOR_ELT(e,0), R_GlobalEnv, &hadError);
 }
 UNPROTECT(2);

 end_R();
 return(0);
}


--
Mikhail

__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


Re: [Rd] Parsing code with newlines

2019-04-05 Thread Mikhail Titov
Hello!

This is my first post here. I came across the very same problem.
It can be reproduced within modified tests/Embedding/RParseEval.c

Actually this example has another issue, namely it doesn't wrap
everything in R_ToplevelExec . This is a major show stopper for
newcomers as that function is barely mentioned anywhere and longjmp into
terminated setuploop function followed by R_suicide look like a mystery.

Error: bad value
Fatal error: unable to initialize the JIT


That aside, here is the code with newlines that fails to parse. I hope
it will paste alright here.


#include "embeddedRCall.h"
#include 

int
main(int argc, char *argv[])
{
SEXP e, tmp;
int hadError;
ParseStatus status;

init_R(argc, argv);

PROTECT(tmp = mkString("\n\r ls()"));
PROTECT(e = R_ParseVector(tmp, 1, &status, R_NilValue));
if (status != PARSE_OK)
{
printf("boo boo\n");
}
else
{
PrintValue(e);
R_tryEval(VECTOR_ELT(e,0), R_GlobalEnv, &hadError);
}
UNPROTECT(2);

end_R();
return(0);
}


--
Mikhail

__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


Re: [Rd] Parsing code with newlines

2008-08-04 Thread Jeffrey Horner

Duncan Murdoch wrote on 08/04/2008 08:11 AM:

On 04/08/2008 8:50 AM, Peter Jaeger wrote:

Dear List,

When I try to parse code containing newline characters with 
R_ParseVector, I
get a compilation error. How can I compile code that includes comments 
and

newlines?

I am using the following:

void* my_compile(char *code)
{
SEXP cmdSexp, cmdExpr = R_NilValue;
ParseStatus status;

PROTECT (cmdSexp = allocVector (STRSXP, 1));
SET_STRING_ELT (cmdSexp, 0, mkChar (code));
PROTECT (cmdExpr = R_ParseVector (cmdSexp,-1,&status,
R_NilValue));
UNPROTECT_PTR (cmdSexp);

if (status != PARSE_OK) {
return (void*)0;
} else {
return (void*)cmdExpr;
}
}


You need to put together a reproducible example if you want help. 
parse() uses R_ParseVector, and it handles newlines fine.


As a follow up, it'd be good to know the exact value of your status 
variable. You've only tested for PARSE_OK, but there's also 
PARSE_INCOMPLETE, PARSE_NULL, PARSE_ERROR, and PARSE_EOF.


Here's a function that I use in rapache that not only parses but 
executes the code as well. While it doesn't really help you with your 
parsing problem, I suspect that you'll want to do something with the 
returned expressions after you've parsed the code, and the point is that 
R_ParseVector() can return more than one expression. Thus you'll need to 
loop through each expression and eval() it separately. The function 
returns 1 when the code was parsed and executed, and 0 on failure.


(it's been awhile since I've had to touch this, and although I do keep 
up with R development, my skills at remembering which macros and 
functions to use are lacking. Anyone spot something I shouldn't be 
doing? like mkChar() or some such? )


static int ExecRCode(const char *code, SEXP env, int *error){
ParseStatus status;
SEXP cmd, expr, fun;
int i, errorOccurred=1, retval = 1;

PROTECT(cmd = allocVector(STRSXP, 1));
SET_STRING_ELT(cmd, 0, mkChar(code));

/* fprintf(stderr,"ExecRCode(%s)\n",code); */
PROTECT(expr = R_ParseVector(cmd, -1, &status,R_NilValue));

switch (status){
case PARSE_OK:
for(i = 0; i < length(expr); i++){
R_tryEval(VECTOR_ELT(expr, 
i),env,&errorOccurred);
if (error) *error = errorOccurred;
if (errorOccurred){
retval=0;
break;
}
}
break;
case PARSE_INCOMPLETE:
case PARSE_NULL:
case PARSE_ERROR:
case PARSE_EOF:
default:
retval=0;
break;
}
UNPROTECT(2);

return retval;
}





Duncan Murdoch

__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel



--
http://biostat.mc.vanderbilt.edu/JeffreyHorner

__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


Re: [Rd] Parsing code with newlines

2008-08-04 Thread Prof Brian Ripley
This adds nothing to your previous post: please don't be annoying and post 
almost identical messages.


I strongly suspect you mean 'parse error' and 'how can I parse R code', 
but we don't know what the example was and what the error message was. 
Nor do we know what you are doing with this fragement of C code (and 
returnng an unprotected SEXP via a (void *) cast is a recipe for tears).


parse(text=) uses R_ParseVector, and that works for 'code that includes 
comments and newlines', so please check out the internal code used (in 
src/main/gram.c).


If you study the posting guide you should be able to formulate a posting 
that people can actually help you with.


On Mon, 4 Aug 2008, Peter Jaeger wrote:


Dear List,

When I try to parse code containing newline characters with R_ParseVector, I
get a compilation error. How can I compile code that includes comments and
newlines?

I am using the following:

void* my_compile(char *code)
{
   SEXP cmdSexp, cmdExpr = R_NilValue;
   ParseStatus status;

   PROTECT (cmdSexp = allocVector (STRSXP, 1));
   SET_STRING_ELT (cmdSexp, 0, mkChar (code));
   PROTECT (cmdExpr = R_ParseVector (cmdSexp,-1,&status,
   R_NilValue));
   UNPROTECT_PTR (cmdSexp);

   if (status != PARSE_OK) {
   return (void*)0;
   } else {
   return (void*)cmdExpr;
   }
}

Regards,
Peter

[[alternative HTML version deleted]]

__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel



--
Brian D. Ripley,  [EMAIL PROTECTED]
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford, Tel:  +44 1865 272861 (self)
1 South Parks Road, +44 1865 272866 (PA)
Oxford OX1 3TG, UKFax:  +44 1865 272595

__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


Re: [Rd] Parsing code with newlines

2008-08-04 Thread Duncan Murdoch

On 04/08/2008 8:50 AM, Peter Jaeger wrote:

Dear List,

When I try to parse code containing newline characters with R_ParseVector, I
get a compilation error. How can I compile code that includes comments and
newlines?

I am using the following:

void* my_compile(char *code)
{
SEXP cmdSexp, cmdExpr = R_NilValue;
ParseStatus status;

PROTECT (cmdSexp = allocVector (STRSXP, 1));
SET_STRING_ELT (cmdSexp, 0, mkChar (code));
PROTECT (cmdExpr = R_ParseVector (cmdSexp,-1,&status,
R_NilValue));
UNPROTECT_PTR (cmdSexp);

if (status != PARSE_OK) {
return (void*)0;
} else {
return (void*)cmdExpr;
}
}


You need to put together a reproducible example if you want help. 
parse() uses R_ParseVector, and it handles newlines fine.


Duncan Murdoch

__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


[Rd] Parsing code with newlines

2008-08-04 Thread Peter Jaeger
Dear List,

When I try to parse code containing newline characters with R_ParseVector, I
get a compilation error. How can I compile code that includes comments and
newlines?

I am using the following:

void* my_compile(char *code)
{
SEXP cmdSexp, cmdExpr = R_NilValue;
ParseStatus status;

PROTECT (cmdSexp = allocVector (STRSXP, 1));
SET_STRING_ELT (cmdSexp, 0, mkChar (code));
PROTECT (cmdExpr = R_ParseVector (cmdSexp,-1,&status,
R_NilValue));
UNPROTECT_PTR (cmdSexp);

if (status != PARSE_OK) {
return (void*)0;
} else {
return (void*)cmdExpr;
}
}

Regards,
Peter

[[alternative HTML version deleted]]

__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel