Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
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 
12  SEXP RComp_assignBufferSym,
13  RComp_assignStartSym,
14  RComp_assignEndSym,
15  RComp_assignTokenSym,
16  RComp_completeTokenSym,
17  RComp_getFileCompSym,
18  RComp_retrieveCompsSym;
19 
20  SEXP rcompgen_rho;
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 ' '
80  rl_completion_append_character = '\0';
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 }