128#include "RConfigure.h"
153#define IfDebug(x) if(gDebug==TTabCom::kDebug) x
178 fPrevInterpMarker(0),
179 fpDirectives(nullptr),
184 fpSysIncFiles(nullptr),
437 while (
const auto key = next()) {
439 const char* className = key->GetName();
440 if (!
strncmp(className,
"Library.", 8))
443 if (!
strstr(className,
".h"))
466 if (
strstr(className,
"(anonymous)") ||
strstr(className,
"(unnamed)"))
531 if (!
fout)
return nullptr;
552 Error(
"TTabCom::GetListOfEnvVars",
"could not open file \"%s\"",
565 file1.ignore(32000,
'\n');
589 return gROOT->GetListOfGlobalFunctions(
true);
646 passwd.open(
"/etc/passwd");
650 passwd.ignore(32000,
'\n');
702 if ((
pObj = next())) {
725 if ((
pObj = next())) {
733 while (((
int)
strlen(s) >= i && s[i] ==
ch0) ||
771 if (fileName ==
"." || fileName ==
"..")
814 IfDebug(std::cerr <<
"DetermineClass(\"" <<
varName <<
"\");" << std::endl);
819 if (!
fout)
return "";
827 cmd =
"gROOT->ProcessLine(\"";
835 gROOT->ProcessLineSync(
".>");
843 Error(
"TTabCom::DetermineClass",
"could not open file \"%s\"",
849 if (!
file1 ||
c <= 0 ||
c !=
'(') {
850 Error(
"TTabCom::DetermineClass",
"variable \"%s\" not defined?",
854 IfDebug(std::cerr << (
char)
c << std::flush);
860 if (
type ==
"const" ||
type ==
"class") {
864 IfDebug(std::cerr << (
char)
c << std::flush);
873 if (
type.EndsWith(
" *const"))
876 if (
type.BeginsWith(
"const "))
878 if (
type.BeginsWith(
"volatile "))
913 while (!ending.
IsNull()) {
976 if (!
fout)
return "";
983 Error(
"TTabCom::GetSysIncludePath",
"could not open file \"%s\"",
995 if (!token.IsNull()) {
998 path.
Append(token.Data() + 2);
1018 path.
Append(
":/usr/include");
1061 std::istringstream path((
char *)
path1);
1063 std::istrstream path((
char *)
path1);
1073 IfDebug(std::cerr <<
"NewListOfFilesInPath(): dirName = " <<
dirName <<
1095 char c1 = (fileName.
Length() > 0) ? fileName[0] : 0;
1134 std::cerr <<
"NoMsg(): ERROR 1. old_level==" <<
old_level << std::endl;
1143 std::cerr <<
"NoMsg(): ERROR 2. old_level==" <<
old_level << std::endl;
1182 IfDebug(std::cerr <<
"TTabCom::Complete() ..." << std::endl);
1203 int start =
s2.Index(re);
1205 IfDebug(std::cerr <<
" s1: " <<
s1 << std::endl);
1206 IfDebug(std::cerr <<
" s2: " <<
s2 << std::endl);
1207 IfDebug(std::cerr <<
" s3: " <<
s3 << std::endl);
1208 IfDebug(std::cerr <<
"start: " << start << std::endl);
1209 IfDebug(std::cerr << std::endl);
1229 const char *
s4 =
pObj->GetName();
1246 IfDebug(std::cerr <<
"adding " <<
s5 <<
'\t' <<
s4 << std::endl);
1249 if (
ts5.BeginsWith(
s3, cmp))
1254 IfDebug(std::cerr <<
"adding " <<
s5 <<
'\t' <<
s4 << std::endl);
1286 IfDebug(std::cerr << std::endl <<
"class: " <<
pObj->ClassName() << std::endl);
1289 else if (className ==
"TMethod" || className ==
"TFunction") {
1291 if (0 ==
pFunc->GetNargs())
1295 }
else if (className ==
"TDataMember") {
1309 IfDebug(std::cerr <<
" i=" << i <<
" ch=" << ch << std::endl);
1329 IfDebug(std::cerr <<
"more than 1 GoodString" << std::endl);
1340 IfDebug(std::cerr <<
"printing ambiguous matches" << std::endl);
1343 s =
pObj->GetName();
1349 out << s <<
"/" << std::endl;
1351 out << s << std::endl;
1378 Error(
"TTabCom::Complete",
"buffer overflow");
1385 IfDebug(std::cerr <<
"loc=" <<
loc << std::endl);
1440 const char *key =
"filename";
1443 IfDebug(std::cerr <<
"CopyMatch()." << std::endl);
1480 for (
int context = 0; context <
kNUM_PAT; ++context) {
1483 IfDebug(std::cerr << std::endl
1484 <<
"context=" << context <<
" "
1485 <<
"RegExp=" <<
fRegExp[context]
1504 if (end>0 && path[end]!=
'/' && path[end]!=
'\\') {
1512 if (fileName[end] !=
'/' && fileName[end] !=
'\\') {
1522 IfDebug(std::cerr << std::endl);
1523 IfDebug(std::cerr <<
" fileName: " << fileName << std::endl);
1528 IfDebug(std::cerr <<
" defaultPath: " << std::endl);
1531 IfDebug(std::cerr << std::endl);
1545 std::stringstream str;
1588 const char dummy[] =
".";
1596 std::cerr << std::endl <<
"tab completion not implemented for this context" <<
1620 const TString fileName =
s3(
"[^ ><]*$");
1700 const TString fileName =
s3(
"[^ \"]*$");
1716 IfDebug(std::cerr << std::endl);
1717 IfDebug(std::cerr <<
"name: " <<
'"' <<
name <<
'"' << std::endl);
1733 TString sym = str(
"[_a-zA-Z][_a-zA-Z0-9]*::$");
1737 prefix = sym + prefix;
1743 TString sym = prefix(
"[_a-zA-Z][_a-zA-Z0-9]*::$");
1746 IfDebug(std::cerr <<
"prefix: " <<
'"' << prefix <<
'"' << std::endl);
1747 IfDebug(std::cerr <<
"preprefix: " <<
'"' <<
preprefix <<
'"' << std::endl);
1750 if (
namesp.Length() >= 2)
1752 IfDebug(std::cerr <<
"namesp: " <<
'"' <<
namesp <<
'"' << std::endl);
1764 for (i = 0; i < tmp->GetSize(); i++) {
1784 pList->AddAll(
pClass->GetListOfAllPublicMethods(
true));
1785 pList->AddAll(
pClass->GetListOfAllPublicDataMembers(
true));
1812 IfDebug(std::cerr << std::endl);
1813 IfDebug(std::cerr <<
"name: " <<
'"' <<
name <<
'"' << std::endl);
1823 Fatal(
"TTabCom::Hook",
"Conext case %d not handled",context);
1833 pList->AddAll(
pClass->GetListOfAllPublicMethods());
1834 pList->AddAll(
pClass->GetListOfAllPublicDataMembers());
1853 Fatal(
"TTabCom::Hook",
"Conext case %d not handled",context);
1873 IfDebug(std::cerr << std::endl);
1874 IfDebug(std::cerr <<
"name: " <<
'"' <<
name <<
'"' << std::endl);
1890 TString sym = str(
"[_a-zA-Z][_a-zA-Z0-9]*::$");
1894 prefix = sym + prefix;
1900 TString sym = prefix(
"[_a-zA-Z][_a-zA-Z0-9]*::$");
1903 IfDebug(std::cerr <<
"prefix: " <<
'"' << prefix <<
'"' << std::endl);
1904 IfDebug(std::cerr <<
"preprefix: " <<
'"' <<
preprefix <<
'"' << std::endl);
1915 methodName =
s3(
"[^:>\\.(]*($");
1919 IfDebug(std::cerr << methodName << std::endl);
1923 pList->AddAll(
pClass->GetListOfAllPublicMethods());
1930 if (methodName ==
pMethod->GetName()) {
1932 out <<
pMethod->GetReturnTypeName()
1935 const char *comment =
pMethod->GetCommentString();
1936 if (comment && comment[0] !=
'\0') {
1937 out <<
" \t// " << comment;
1970 name =
s3(
"[_a-zA-Z][_a-zA-Z0-9:]* *($", 3);
1975 name =
s3(
"^[_a-zA-Z][_a-zA-Z0-9:]*");
1978 IfDebug(std::cerr << std::endl);
1979 IfDebug(std::cerr <<
"name: " <<
'"' <<
name <<
'"' << std::endl);
2001 Fatal(
"TTabCom::Hook",
"Conext case %d not handled",context);
2012 methodName =
name(
"[_a-zA-Z][_a-zA-Z0-9]*$");
2015 methodName =
s3(
"[^:>\\.(]*($");
2019 IfDebug(std::cerr << methodName << std::endl);
2023 pList->AddAll(
pClass->GetListOfAllPublicMethods());
2030 if (methodName ==
pMethod->GetName()) {
2032 out <<
pMethod->GetReturnTypeName()
2035 const char *comment =
pMethod->GetCommentString();
2036 if (comment && comment[0] !=
'\0') {
2037 out <<
" \t// " << comment;
2062 int l2 =
s2.Length(),
l3 =
s3.Length();
2066 std::cerr << std::endl <<
2067 "tab completion not implemented for this context" << std::endl;
2071 if (
l2 >
l3 + 1 &&
s2(
l2 -
l3 - 2, 2) ==
"->") {
2072 std::cerr << std::endl <<
2073 "tab completion not implemented for this context" << std::endl;
2134 Fatal(
"TTabCom::Hook",
"Conext case %d not handled",context);
2183 "[_a-zA-Z][_a-zA-Z0-9:]* +[_a-zA-Z][_a-zA-Z0-9]* *($");
2185 "[_a-zA-Z][_a-zA-Z0-9]* *:: *[_a-zA-Z0-9]* *($");
2187 "[_a-zA-Z][_a-zA-Z0-9()]* *\\. *[_a-zA-Z0-9]* *($");
2189 "[_a-zA-Z][_a-zA-Z0-9()]* *-> *[_a-zA-Z0-9]* *($");
2192 "[_a-zA-Z][_a-zA-Z0-9]* *:: *[_a-zA-Z0-9]*$");
2194 "[_a-zA-Z][_a-zA-Z0-9()]* *\\. *[_a-zA-Z0-9()]*$");
2197 "[_a-zA-Z][_a-zA-Z0-9()]* *-> *[_a-zA-Z0-9()]*$");
2220 Error(
"TTabCom::MakeClassFromClassName",
"Unknown class \"%s\"", className);
2226 if (
pClass->GetListOfAllPublicMethods()->GetSize() == 0 &&
2227 pClass->GetListOfAllPublicDataMembers()->GetSize() == 0) {
2230 Error(
"TTabCom::MakeClassFromClassName",
"class \"%s\" is not defined.", className);
2284 if (0)
printf(
"varName is [%s] with iteration [%i]\n",
varName, iter);
2305 for(
Int_t i = cut-1; i>=0; --i) {
2334 if (0)
printf(
"I got [%s] from MakeClassFromVarName()\n",
pclass->GetName());
2341 if (iter == 0)
return pclass;
2343 if (0)
printf(
"Trying data member [%s] of class [%s] ...\n",
2348 TIter next(
pclass->GetListOfAllPublicDataMembers());
2354 if (0)
printf(
"It's a member!\n");
2371 if (0)
printf(
"Trying method [%s] of class [%s] ...\n",
2385 if (0)
printf(
"It's a method called [%s] with return type [%s]\n",
2412 std::cerr << std::endl <<
"variable " <<
dblquote(
varName) <<
" not defined."
2428 if (className.
IsNull() || className ==
"*") {
2432 std::cerr << std::endl <<
"problem determining class of " <<
dblquote(
varName)
2442 className[className.
Length()-1] = 0;
2471 Fatal(
"TTabCom::MakeClassFromVarName",
"Conext case %d not handled",context);
2477 for (i = *
fpLoc;
fBuf[i] !=
'.'; i -= 1) {
2489 " is of pointer type. Use this operator: ->" << std::endl;
2498 if (className[className.
Length() - 1] ==
'*') {
2499 std::cerr << std::endl <<
"can't handle pointers to pointers." << std::endl;
2518 Fatal(
"TTabCom::MakeClassFromVarName",
"Conext case %d not handled",context);
2524 for (i = *
fpLoc;
fBuf[i - 1] !=
'-' &&
fBuf[i] !=
'>'; i -= 1) {
2528 for (; i <
len; i += 1) {
2535 " is not of pointer type. Use this operator: ." << std::endl;
2552 std::cerr << std::endl
2554 << (
int) handle <<
" >= kNUM_PAT=" << (
int)
kNUM_PAT << std::endl;
2575 for (
int i = start; i > 0; i--)
2577 if (
var_str[i] ==
'.')
return i;
2578 if (
var_str[i] ==
'>' && i > 0 &&
var_str[i-1] ==
'-')
return i-1;
int Makepat(const char *, Pattern_t *, int)
Make a pattern template from the string pointed to by exp.
const char * Matchs(const char *, size_t len, const Pattern_t *, const char **)
Match a string with a pattern.
char Char_t
Character 1 byte (char)
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
void Error(const char *location, const char *msgfmt,...)
Use this function in case an error occurred.
Int_t gErrorIgnoreLevel
errors with level below this value will be ignored. Default is kUnset.
void Fatal(const char *location, const char *msgfmt,...)
Use this function in case of a fatal error. It will abort the program.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t dest
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t UChar_t len
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
R__EXTERN TInterpreter * gCling
Bool_t R_ISDIR(Int_t mode)
R__EXTERN TSystem * gSystem
static char * Next()
Returns next class from sorted class table.
TClass instances represent classes, structs and namespaces in the ROOT type system.
static TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE)
Static method returning pointer to TClass of the specified class name.
Collection abstract base class.
TObject * FindObject(const char *name) const override
Find an object in this collection using its name.
void Delete(Option_t *option="") override=0
Delete this object.
All ROOT classes may have RTTI (run time type identification) support added.
virtual Int_t GetValue(const char *name, Int_t dflt) const
Returns the integer value for a resource.
Global functions class (global functions are obtained from CINT).
THashList implements a hybrid collection class consisting of a hash table and a list to store TObject...
virtual int DisplayIncludePath(FILE *) const
Each ROOT class (see TClass) has a linked list of methods.
Collectable string class.
Mother of all ROOT objects.
static const char * GetMacroPath()
Get macro search path. Static utility function.
Regular expression class.
Sequenceable collection abstract base class.
void Add(TObject *obj) override
std::istream & ReadToDelim(std::istream &str, char delim='\n')
Read up to an EOF, or a delimiting character, whichever comes first.
Bool_t EndsWith(const char *pat, ECaseCompare cmp=kExact) const
Return true if string ends with the specified string.
TSubString Strip(EStripType s=kTrailing, char c=' ') const
Return a substring of self stripped at beginning and/or end.
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
TString & Prepend(const char *cs)
TString & Remove(Ssiz_t pos)
TString & Append(const char *cs)
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
virtual FILE * TempFileName(TString &base, const char *dir=nullptr, const char *suffix=nullptr)
Create a secure temporary file by appending a unique 6 letter string to base.
void Beep(Int_t freq=-1, Int_t duration=-1, Bool_t setDefault=kFALSE)
Beep for duration milliseconds with a tone of frequency freq.
virtual Bool_t ExpandPathName(TString &path)
Expand a pathname getting rid of special shell characters like ~.
virtual void FreeDirectory(void *dirp)
Free a directory.
virtual void * OpenDirectory(const char *name)
Open a directory.
virtual const char * Getenv(const char *env)
Get environment variable.
virtual Int_t Exec(const char *shellcmd)
Execute a command.
int GetPathInfo(const char *path, Long_t *id, Long_t *size, Long_t *flags, Long_t *modtime)
Get info about a file: id, size, flags, modification time.
virtual const char * GetDirEntry(void *dirp)
Get a directory entry. Returns 0 if no more entries.
virtual const char * GetDynamicPath()
Return the dynamic path (used to find shared libraries).
virtual char * Which(const char *search, const char *file, EAccessMode mode=kFileExists)
Find location of file in a search path.
virtual TString GetDirName(const char *pathname)
Return the directory name in pathname.
virtual int Unlink(const char *name)
Unlink, i.e.
static void NoMsg(Int_t errorLevel)
[static utility function]/////////////////////////////
const TSeqCollection * GetListOfCppDirectives()
Return the list of CPP directives.
Int_t Hook(char *buf, int *pLoc, std::ostream &out)
[private]
ULong64_t fPrevInterpMarker
void ClearFiles()
Close all files.
static TString DetermineClass(const char varName[])
[static utility function]/////////////////////////////
static Bool_t ExcludedByFignore(TString s)
[static utility function]/////////////////////////////
void InitPatterns()
[private]
void CopyMatch(char *dest, int dest_len, const char *localName, const char *appendage=nullptr, const char *fullName=nullptr) const
[private]
void RehashEnvVars()
Environemnt variables rehashing.
const TSeqCollection * GetListOfSysIncFiles()
Return the list of system include files.
void ClearAll()
clears all lists except for user names and system include files.
TSeqCollection * fpDirectives
const TSeqCollection * GetListOfFilesInPath(const char path[])
"path" should be initialized with a colon separated list of system directories
TSeqCollection * fpClasses
TSeqCollection * fpEnvVars
void ClearSysIncFiles()
Close system files.
const TSeqCollection * GetListOfEnvVars()
Uses "env" (Unix) or "set" (Windows) to get list of environment variables.
TString DeterminePath(const TString &fileName, const char defaultPath[]) const
[private]
const TSeqCollection * GetListOfPragmas()
Return the list of pragmas.
static TSeqCollection * NewListOfFilesInPath(const char path[])
[static utility function]/////////////////////////////
TClass * MakeClassFromVarName(const char varName[], EContext_t &context, int iter=0)
[private] (does some specific error handling that makes the function unsuitable for general use....
const TSeqCollection * GetListOfGlobals()
Return the list of globals.
void SetPattern(EContext_t handle, const char regexp[])
[private]
TSeqCollection * fpSysIncFiles
void RehashGlobals()
Reload globals.
TClass * MakeClassFromClassName(const char className[]) const
[private] (does some specific error handling that makes the function unsuitable for general use....
void RehashGlobalFunctions()
Reload global functions.
void ClearGlobalFunctions()
Forget all global functions seen so far.
void ClearPragmas()
Forget all pragmas seen so far.
static Bool_t PathIsSpecifiedInFileName(const TString &fileName)
[static utility function]/////////////////////////////
TString ExtendPath(const char originalPath[], TString newBase) const
[private]
TTabCom()
Default constructor.
void RehashPragmas()
Reload pragmas.
const TSeqCollection * GetListOfClasses()
Return the list of classes.
void RehashCppDirectives()
Cpp rehashing.
void RehashUsers()
Reload users.
const TSeqCollection * GetListOfUsers()
reads from "/etc/passwd"
static void AppendListOfFilesInDirectory(const char dirName[], TSeqCollection *pList)
[static utility function]/////////////////////////////
void ClearClasses()
Clear classes and namespace collections.
TSeqCollection * fpPragmas
Int_t Complete(const TRegexp &re, const TSeqCollection *pListOfCandidates, const char appendage[], std::ostream &out, TString::ECaseCompare cmp=TString::kExact)
[private]
const char * fRegExp[kNUM_PAT]
int ParseReverse(const char *var_str, int start)
Returns the place in the string where to put the \0, starting the search from "start".
TCollection * GetListOfGlobalFunctions()
Return the list of global functions.
void RehashSysIncFiles()
Reload system include files.
static Bool_t IsDirectory(const char fileName[])
[static utility function]/////////////////////////////
EContext_t DetermineContext() const
[private]
static TString GetSysIncludePath()
[static utility function]/////////////////////////////
void ClearEnvVars()
Forget all environment variables seen so far.
void ClearCppDirectives()
Forget all Cpp directives seen so far.
void ClearGlobals()
Forget all global variables seen so far.
void ClearUsers()
Forget all user seen so far.
void RehashAll()
clears and then rebuilds all lists except for user names and system include files.
void RehashFiles()
Close files.
TClass * TryMakeClassFromClassName(const char className[]) const
Same as above but does not print the error message.
Pattern_t fPat[kNUM_PAT][1024]
void RehashClasses()
Do the class rehash.
static Char_t AllAgreeOnChar(int i, const TSeqCollection *pList, Int_t &nGoodStrings)
[static utility function]///////////////////////////////////////////