int attribute_hidden R_IoBufferPuts(char *s, IoBuffer *iob) { char *p; int n = 0; for (p = s; *p; p++) { R_IoBufferPutc(*p, iob); n++; } return n; }
/* FIXME: this should be re-written to use Rf_ReplIteration since it gets out of sync with it over time */ int R_ReplDLLdo1(void) { int c; ParseStatus status; SEXP rho = R_GlobalEnv, lastExpr; Rboolean wasDisplayed = FALSE; if(!*DLLbufp) { R_Busy(0); if (R_ReadConsole(R_PromptString(0, prompt_type), DLLbuf, CONSOLE_BUFFER_SIZE, 1) == 0) return -1; DLLbufp = DLLbuf; } while((c = *DLLbufp++)) { R_IoBufferPutc(c, &R_ConsoleIob); if(c == ';' || c == '\n') break; } R_PPStackTop = 0; R_CurrentExpr = R_Parse1Buffer(&R_ConsoleIob, 0, &status); switch(status) { case PARSE_NULL: R_IoBufferWriteReset(&R_ConsoleIob); prompt_type = 1; break; case PARSE_OK: R_IoBufferReadReset(&R_ConsoleIob); R_CurrentExpr = R_Parse1Buffer(&R_ConsoleIob, 1, &status); R_Visible = FALSE; R_EvalDepth = 0; resetTimeLimits(); PROTECT(R_CurrentExpr); R_Busy(1); lastExpr = R_CurrentExpr; R_CurrentExpr = eval(R_CurrentExpr, rho); SET_SYMVALUE(R_LastvalueSymbol, R_CurrentExpr); wasDisplayed = R_Visible; if (R_Visible) PrintValueEnv(R_CurrentExpr, rho); if (R_CollectWarnings) PrintWarnings(); Rf_callToplevelHandlers(lastExpr, R_CurrentExpr, TRUE, wasDisplayed); UNPROTECT(1); R_IoBufferWriteReset(&R_ConsoleIob); R_Busy(0); prompt_type = 1; break; case PARSE_ERROR: parseError(R_NilValue, 0); R_IoBufferWriteReset(&R_ConsoleIob); prompt_type = 1; break; case PARSE_INCOMPLETE: R_IoBufferReadReset(&R_ConsoleIob); prompt_type = 2; break; case PARSE_EOF: return -1; break; } return prompt_type; }
/** This is the body of the REPL. It attempts to parse the first line or expression of its input, and optionally request input from the user if none is available. If the input can be parsed correctly, i) the resulting expression is evaluated, ii) the result assigned to .Last.Value, iii) top-level task handlers are invoked. If the input cannot be parsed, i.e. there is a syntax error, it is incomplete, or we encounter an end-of-file, then we change the prompt accordingly. The "cursor" for the input buffer is moved to the next starting point, i.e. the end of the first line or after the first ;. */ int Rf_ReplIteration(SEXP rho, int savestack, int browselevel, R_ReplState *state) { int c, browsevalue; SEXP value, thisExpr; Rboolean wasDisplayed = FALSE; if(!*state->bufp) { R_Busy(0); if (R_ReadConsole(R_PromptString(browselevel, state->prompt_type), state->buf, CONSOLE_BUFFER_SIZE, 1) == 0) return(-1); state->bufp = state->buf; } #ifdef SHELL_ESCAPE /* not default */ if (*state->bufp == '!') { R_system(&(state->buf[1])); state->buf[0] = '\0'; return(0); } #endif /* SHELL_ESCAPE */ while((c = *state->bufp++)) { R_IoBufferPutc(c, &R_ConsoleIob); if(c == ';' || c == '\n') break; } R_PPStackTop = savestack; R_CurrentExpr = R_Parse1Buffer(&R_ConsoleIob, 0, &state->status); switch(state->status) { case PARSE_NULL: /* The intention here is to break on CR but not on other null statements: see PR#9063 */ if (browselevel && !R_DisableNLinBrowser && !strcmp((char *) state->buf, "\n")) return -1; R_IoBufferWriteReset(&R_ConsoleIob); state->prompt_type = 1; return 1; case PARSE_OK: R_IoBufferReadReset(&R_ConsoleIob); R_CurrentExpr = R_Parse1Buffer(&R_ConsoleIob, 1, &state->status); if (browselevel) { browsevalue = ParseBrowser(R_CurrentExpr, rho); if(browsevalue == 1) return -1; if(browsevalue == 2) { R_IoBufferWriteReset(&R_ConsoleIob); return 0; } /* PR#15770 We don't want to step into expressions entered at the debug prompt. The 'S' will be changed back to 's' after the next eval. */ if (R_BrowserLastCommand == 's') R_BrowserLastCommand = 'S'; } R_Visible = FALSE; R_EvalDepth = 0; resetTimeLimits(); PROTECT(thisExpr = R_CurrentExpr); R_Busy(1); value = eval(thisExpr, rho); SET_SYMVALUE(R_LastvalueSymbol, value); wasDisplayed = R_Visible; if (R_Visible) PrintValueEnv(value, rho); if (R_CollectWarnings) PrintWarnings(); Rf_callToplevelHandlers(thisExpr, value, TRUE, wasDisplayed); R_CurrentExpr = value; /* Necessary? Doubt it. */ UNPROTECT(1); if (R_BrowserLastCommand == 'S') R_BrowserLastCommand = 's'; R_IoBufferWriteReset(&R_ConsoleIob); state->prompt_type = 1; return(1); case PARSE_ERROR: state->prompt_type = 1; parseError(R_NilValue, 0); R_IoBufferWriteReset(&R_ConsoleIob); return(1); case PARSE_INCOMPLETE: R_IoBufferReadReset(&R_ConsoleIob); state->prompt_type = 2; return(2); case PARSE_EOF: return(-1); break; } return(0); }