예제 #1
0
파일: ruby.c 프로젝트: jsvisa/ctags
/*
* Copies the characters forming an identifier from *cp into
* name, leaving *cp pointing to the character after the identifier.
*/
static rubyKind parseIdentifier (
        const unsigned char** cp, vString* name, rubyKind kind)
{
    /* Method names are slightly different to class and variable names.
     * A method name may optionally end with a question mark, exclamation
     * point or equals sign. These are all part of the name.
     * A method name may also contain a period if it's a singleton method.
     */
    const char* also_ok = (kind == K_METHOD) ? "_.?!=" : "_";

    skipWhitespace (cp);

    /* Check for an anonymous (singleton) class such as "class << HTTP". */
    if (kind == K_CLASS && **cp == '<' && *(*cp + 1) == '<')
    {
        return K_UNDEFINED;
    }

    /* Check for operators such as "def []=(key, val)". */
    if (kind == K_METHOD || kind == K_SINGLETON)
    {
        if (parseRubyOperator (name, cp))
        {
            return kind;
        }
    }

    /* Copy the identifier into 'name'. */
    while (**cp != 0 && (isalnum (**cp) || charIsIn (**cp, also_ok)))
    {
        char last_char = **cp;

        vStringPut (name, last_char);
        ++*cp;

        if (kind == K_METHOD)
        {
            /* Recognize singleton methods. */
            if (last_char == '.')
            {
                vStringTerminate (name);
                vStringClear (name);
                return parseIdentifier (cp, name, K_SINGLETON);
            }

            /* Recognize characters which mark the end of a method name. */
            if (charIsIn (last_char, "?!="))
            {
                break;
            }
        }
    }
    return kind;
}
예제 #2
0
    int skipWord(const char *&c){
      while(!charIsIn(*c, whitespace) && (*c != '\0')){
        const int delimeterChars = isAWordDelimeter(c);

        if(delimeterChars == 0)
          ++c;
        else
          return delimeterChars;
      }

      return 0;
    }
예제 #3
0
    std::string strip(const char *c, const size_t chars){
      if(chars == 0)
        return "";

      const char *cLeft  = c;
      const char *cRight = c + (chars - 1);

      while(charIsIn(*cLeft , whitespace) && (cLeft <= cRight)) ++cLeft;
      while(charIsIn(*cRight, whitespace) && (cRight > cLeft)) --cRight;

      if(cLeft > cRight)
        return "";

      std::string ret = "";

      const char *cMid = cLeft;

      while(cMid < cRight){
        if((cMid[0] == '\\') && isWhitespace(cMid[1])){
          ret += strip(cLeft, cMid - cLeft);
          ret += ' ';

          ++cMid;

          cLeft = (cMid + 1);
        }

        ++cMid;

        if((cMid >= cRight) && ret.size())
          ret += strip(cLeft, (cMid - cLeft + 1));
      }

      if(ret.size() == 0)
        return compressWhitespace( std::string(cLeft, (cRight - cLeft + 1)) );

      return compressWhitespace(ret);
    }
예제 #4
0
    char isAWordDelimeter(const char *c){
      if( charIsIn(c[0], wordDelimeter) ){
        if(charIsIn2(c, wordDelimeter2)){
          if(charIsIn3(c, wordDelimeter3))
            return 3;

          return 2;
        }

        return 1;
      }

      return 0;
    }
예제 #5
0
 void skipToWhitespace(const char *&c){
   while(!charIsIn(*c, whitespace) && (*c != '\0'))
     ++c;
 }
예제 #6
0
 bool isWhitespace(const char c){
   return charIsIn(c, whitespace);
 }