Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Changeset 5178 in orxonox.OLD for trunk/src/lib/shell/shell_completion.cc


Ignore:
Timestamp:
Sep 13, 2005, 12:12:11 AM (19 years ago)
Author:
bensch
Message:

orxonox/trunk: added class ShellInput for the InputLine, also worked a bit on ShellCompletion

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/lib/shell/shell_completion.cc

    r5170 r5178  
    1818#include "shell_completion.h"
    1919
     20#include "base_object.h"
     21#include "class_list.h"
     22#include "list.h"
     23#include "debug.h"
     24
     25#include "stdlibincl.h"
     26
    2027using namespace std;
    21 
    2228
    2329/**
     
    4955  // delete what has to be deleted here
    5056}
     57
     58
     59
     60/**
     61 * autocompletes the Shell's inputLine
     62 * @returns true, if a result was found, false otherwise
     63 *
     64 * @todo implement it!!
     65 */
     66bool ShellCompletion::autoComplete(const char* inputLine)
     67{
     68  //PRINTF(3)("AutoCompletion not implemented yet\n");
     69
     70  char* completionLine = new char[strlen(inputLine)+1];
     71  strcpy(completionLine, inputLine);
     72
     73  char* commandBegin = strrchr(completionLine, ' ');
     74  if (commandBegin == NULL)
     75    commandBegin = completionLine;
     76  else
     77  {
     78    if(commandBegin >= completionLine + strlen(completionLine))
     79      commandBegin = completionLine + strlen(completionLine);
     80    else
     81      commandBegin++;
     82  }
     83
     84  char* objectStart;
     85  if (objectStart = strstr(commandBegin, "::"))
     86  {
     87    char* classIdentity = new char[objectStart - commandBegin +1];
     88    strncpy(classIdentity, commandBegin, objectStart - commandBegin);
     89    classIdentity[objectStart - commandBegin] = '\0';
     90    this->objectComplete(objectStart+2, ClassList::StringToID(classIdentity));
     91    delete[] classIdentity;
     92  }
     93  else
     94    this->classComplete(commandBegin);
     95
     96  delete[] completionLine;
     97}
     98
     99/**
     100 * autocompletes a className
     101 * @param classBegin the Beginning of a String to autoComplete
     102 * @return true on success, false otherwise
     103 */
     104bool ShellCompletion::classComplete(const char* classBegin)
     105{
     106  if (unlikely(classBegin == NULL))
     107    return false;
     108  const tList<const char>* clList = ClassList::getClassList();
     109  if (clList != NULL)
     110  {
     111    const tList<const char>* classList = this->createCompleteList(clList, classBegin);
     112    if (classList != NULL)
     113      this->generalComplete(classList, classBegin, "%s::", "::");
     114    else
     115      return false;
     116  }
     117  else
     118    return false;
     119  return true;
     120}
     121
     122/**
     123 * autocompletes an ObjectName
     124 * @param objectBegin the beginning string of a Object
     125 * @param classID the ID of the Class to search for.
     126 * @return true on success, false otherwise
     127 */
     128bool ShellCompletion::objectComplete(const char* objectBegin, long classID)
     129{
     130  printf("%s\n", objectBegin);
     131
     132  if (unlikely(objectBegin == NULL))
     133    return false;
     134  tList<BaseObject>* boList = ClassList::getList(classID);
     135  if (boList != NULL)
     136  {
     137    printf("\n", boList->firstElement()->getName());
     138    const tList<const char>* objectList = this->createCompleteList(boList, objectBegin);
     139    if (objectList != NULL)
     140      this->generalComplete(objectList, objectBegin, "%s");
     141    else
     142      return false;
     143  }
     144  else
     145    return false;
     146  return true;
     147}
     148
     149/**
     150 * completes a Function
     151 * @param functionBegin the beginning of the function String
     152 */
     153bool ShellCompletion::functionComplete(const char* functionBegin)
     154{
     155}
     156
     157/**
     158 * completes the inputline on grounds of an inputList
     159 * @param stringList the List to parse through
     160 * @param begin the String to search in the inputList, and to extend with it.
     161 * @param displayAs how to display the found value to the user, printf-style, !!with only one %s!! ex.: "::%s::"
     162 * @param addBack what should be added at the end of the completion
     163 * @param addFront what should be added to the front of one finished completion
     164 * @return true if ok, false otherwise
     165 */
     166bool ShellCompletion::generalComplete(const tList<const char>* stringList, const char* begin, const char* displayAs, const char* addBack, const char* addFront)
     167{
     168  if (stringList->getSize() == 0)
     169    return false;
     170
     171  const char* addString = stringList->firstElement();
     172  unsigned int addLength = 0;
     173  unsigned int inputLenght = strlen(begin);
     174
     175  if (addString != NULL)
     176    addLength = strlen(addString);
     177  tIterator<const char>* charIterator = stringList->getIterator();
     178  const char* charElem = charIterator->firstElement();
     179  while (charElem != NULL)
     180  {
     181    PRINTF(0)(displayAs, charElem);
     182    for (unsigned int i = inputLenght; i < addLength; i++)
     183      if (addString[i] != charElem[i])
     184    {
     185      addLength = i;
     186      break;
     187    }
     188    charElem = charIterator->nextElement();
     189  }
     190  delete charIterator;
     191
     192  if (addLength >= inputLenght)
     193  {
     194    char* adder = new char[addLength+1];
     195    strncpy(adder, addString, addLength);
     196    adder[addLength] = '\0';
     197
     198
     199/*    this->removeCharacters(inputLenght);
     200    this->addCharacters(adder);
     201    if (addBack != NULL && stringList->getSize() == 1)
     202      this->addCharacters("::");
     203    delete[] adder;*/
     204  }
     205  return true;
     206}
     207
     208/**
     209 * searches for classes, which beginn with classNameBegin
     210 * @param inputList the List to parse through
     211 * @param classNameBegin the beginning string
     212 * @return a NEW char-array with ClassNames. The LIST should be deleted afterwards,
     213 * !! The strings MUST NOT be deleted !!
     214 */
     215const tList<const char>* ShellCompletion::createCompleteList(const tList<const char>* inputList, const char* classNameBegin)
     216{
     217  if (inputList == NULL || classNameBegin == NULL)
     218    return NULL;
     219  unsigned int searchLength = strlen(classNameBegin);
     220  if (this->completionList != NULL)
     221    delete this->completionList;
     222  this->completionList = new tList<const char>;
     223
     224//  tList<const char>* classList = ClassList::getClassList();
     225
     226  tIterator<const char>* iterator = inputList->getIterator();
     227  const char* enumString = iterator->firstElement();
     228  while (enumString != NULL)
     229  {
     230    if (strlen(enumString)>searchLength+1 &&
     231        !strncasecmp(enumString, classNameBegin, searchLength))
     232    {
     233      this->completionList->add(enumString);
     234    }
     235    enumString = iterator->nextElement();
     236  }
     237  delete iterator;
     238
     239  return this->completionList;
     240}
     241
     242/**
     243 * searches for classes, which beginn with classNameBegin
     244 * @param inputList the List to parse through
     245 * @param classNameBegin the beginning string
     246 * @return a NEW char-array with ClassNames. The LIST should be deleted afterwards,
     247 * !! The strings MUST NOT be deleted !!
     248 */
     249const tList<const char>* ShellCompletion::createCompleteList(const tList<BaseObject>* inputList, const char* classNameBegin)
     250{
     251  if (inputList == NULL || classNameBegin == NULL)
     252    return NULL;
     253  unsigned int searchLength = strlen(classNameBegin);
     254  if (this->completionList != NULL)
     255    delete this->completionList;
     256  this->completionList = new tList<const char>;
     257
     258  tIterator<BaseObject>* iterator = inputList->getIterator();
     259  BaseObject* enumBO = iterator->firstElement();
     260  while (enumBO != NULL)
     261  {
     262    if (enumBO->getName() != NULL &&
     263        strlen(enumBO->getName())>searchLength+1 &&
     264        !strncasecmp(enumBO->getName(), classNameBegin, searchLength))
     265    {
     266      this->completionList->add(enumBO->getName());
     267    }
     268    enumBO = iterator->nextElement();
     269  }
     270  delete iterator;
     271
     272  return this->completionList;
     273}
Note: See TracChangeset for help on using the changeset viewer.