Logo ROOT   6.19/01
Reference Guide
TRCompletion.cxx
Go to the documentation of this file.
1 /*************************************************************************
2  * Copyright (C) 2013-2014, Omar Andres Zapata Mesa *
3  * All rights reserved. *
4  * *
5  * For the licensing terms see $ROOTSYS/LICENSE. *
6  * For the list of contributors see $ROOTSYS/README/CREDITS. *
7  *************************************************************************/
8 #include"TRCompletion.h"
9 namespace ROOT {
10  namespace R {
11 
19 
21  }
22 }
23 
24 char *ROOT::R::R_completion_generator(const char *text, int state)
25 {
26  // If this is a new word to complete, initialize now. This
27  // involves saving 'text' to somewhere R can get it, calling
28  // completeToken(), and retrieving the completions.
29  //NOTE: R based code and ajusted to Rcpp
30  static int list_index, ncomp;
31  static char **compstrings;
32 
33 
34  if (!state) {
35  int i;
36  SEXP completions,
37  assignCall = PROTECT(Rf_lang2(ROOT::R::RComp_assignTokenSym, Rf_mkString(text))),
38  completionCall = PROTECT(Rf_lang1(ROOT::R::RComp_completeTokenSym)),
39  retrieveCall = PROTECT(Rf_lang1(ROOT::R::RComp_retrieveCompsSym));
40  const void *vmax = vmaxget();
41 
42  Rf_eval(assignCall, ROOT::R::rcompgen_rho);
43  Rf_eval(completionCall, ROOT::R::rcompgen_rho);
44  PROTECT(completions = Rf_eval(retrieveCall, ROOT::R::rcompgen_rho));
45  list_index = 0;
46  ncomp = Rf_length(completions);
47  if (ncomp > 0) {
48  compstrings = (char **) malloc(ncomp * sizeof(char *));
49  if (!compstrings) return (char *)NULL;
50  for (i = 0; i < ncomp; i++)
51  compstrings[i] = strdup(Rf_translateChar(STRING_ELT(completions, i)));
52  }
53  UNPROTECT(4);
54  vmaxset(vmax);
55  }
56 
57  if (list_index < ncomp)
58  return compstrings[list_index++];
59  else {
60  /* nothing matched or remaining, returns NULL. */
61  if (ncomp > 0) free(compstrings);
62  }
63  return (char *)NULL;
64 }
65 
66 
67 char **ROOT::R::R_custom_completion(const char *text, int start, int end)
68 {
69  //NOTE: R based code and ajusted to Rcpp
70  char **matches = (char **)NULL;
71  SEXP infile,
72  linebufferCall = PROTECT(Rf_lang2(ROOT::R::RComp_assignBufferSym,
73  Rf_mkString(rl_line_buffer))),
74  startCall = PROTECT(Rf_lang2(ROOT::R::RComp_assignStartSym, Rf_ScalarInteger(start))),
75  endCall = PROTECT(Rf_lang2(ROOT::R::RComp_assignEndSym, Rf_ScalarInteger(end)));
76  SEXP filecompCall;
77 
78  // We don't want spaces appended at the end. It's nedded everytime
79  // since readline>=6 resets it to ' '
81 
82  Rf_eval(linebufferCall, ROOT::R::rcompgen_rho);
83  Rf_eval(startCall, ROOT::R::rcompgen_rho);
84  Rf_eval(endCall, ROOT::R::rcompgen_rho);
85  UNPROTECT(3);
86  matches = rl_completion_matches(text, ROOT::R::R_completion_generator);
87  filecompCall = PROTECT(Rf_lang1(ROOT::R::RComp_getFileCompSym));
88  infile = PROTECT(Rf_eval(filecompCall, ROOT::R::rcompgen_rho));
89  if (!Rf_asLogical(infile)) rl_attempted_completion_over = 1;
90  UNPROTECT(2);
91  return matches;
92 }
SEXP RComp_assignTokenSym
SEXP RComp_getFileCompSym
SEXP RComp_assignBufferSym
VSD Structures.
Definition: StringConv.hxx:21
char * R_completion_generator(const char *text, int state)
SEXP RComp_completeTokenSym
int rl_completion_append_character
SEXP RComp_assignStartSym
#define malloc
Definition: civetweb.c:1536
#define R(a, b, c, d, e, f, g, h, i)
Definition: RSha256.hxx:110
char * rl_line_buffer
SEXP RComp_retrieveCompsSym
char ** R_custom_completion(const char *text, int start, int end)
SEXP rcompgen_rho
TText * text
#define free
Definition: civetweb.c:1539
SEXP RComp_assignEndSym
int rl_attempted_completion_over