Beispiel #1
0
const char *NodeName::validate(const char *name)
{
  // sanity check
  if(name==NULL)
    throw ExceptionNullParameter(SYSTEM_SAVE_LOCATION, "name");

  // check for lower case, numbers and '.' - nothing more is allowed
  const int len=strlen(name);
  for(int i=0; i<len; ++i)
    if( !isCharValid(name[i]) )
      throw ExceptionInvalidNodeName(SYSTEM_SAVE_LOCATION, name);

  return name;
}
Beispiel #2
0
std::string NodeName::removeInvalidChars(const std::string &name)
{
  stringstream ss;

  // allow only basic chars - skip the rest
  for(string::const_iterator it=name.begin(); it!=name.end(); ++it)
  {
    char c=*it;
    // lower-case by default
    if( isupper(c) )
      c=tolower(c);
    // check validity
    if( isCharValid(c) )
      ss<<c;
  }

  // return response
  const string &str=ss.str();
  if( str.size()==0 )
    return "unnamed";
  return str;
}
Beispiel #3
0
command_stream_t
make_command_stream(int (*get_next_byte) (void *),
                    void *get_next_byte_argument)
{

    //building the stream string
    int lineNum = 1;

    ////printf("Step 1: Building the buffer string.\n");
    char currChar;
    char* buffer = (char*) checked_malloc(sizeof(char));
    int bufferSize = 0;
    while((currChar = get_next_byte(get_next_byte_argument)) != EOF)
    {
        if(currChar == '\n')
        {
            lineNum++;
        }
        if(!isCharValid(currChar))
        {
            error(1,0,"%d: Syntax error (Illegal character %c found.) \n", lineNum, currChar);
        }
        else if (currChar == '#')
        {
            //while(currChar != '\n' && currChar != EOF)
            while((currChar = get_next_byte(get_next_byte_argument)) != EOF && currChar != '\n')
            {
            }
            if(feof(get_next_byte_argument))
            {
                error(1,0,"%d: Syntax error (Comments need to be terminated with new line)\n", lineNum);
            }
            else
            {
                lineNum++;
            }
        }
        buffer[bufferSize] = currChar;
        bufferSize++;
        buffer = (char*)checked_realloc(buffer, bufferSize+1);
    }
    buffer[bufferSize] = '\0';
    ////printf("Step 1: Buffer Built \n%s\n Strlen(buffer) = %d, bufferSize = %d\n", buffer, strlen(buffer), bufferSize);


    ////printf("Step 2: Clean up iteration started.\n");
    lineNum = 1;
    int prev = -1;
    int n; //next nonwhite space index
    int curr = nextIndex(buffer, bufferSize, -1);
    int next = nextIndex(buffer, bufferSize, curr);
    while (curr < bufferSize)
    {
        ////printf("Step 2: prev = %d, curr = %d, next = %d.\n", prev, curr, next);
        switch (buffer[curr])
        {
        case ';':
            n = nextNonwhitespace(buffer, bufferSize, curr);
            if ((prev==-1) || (n == bufferSize)
                    || !(isWordChar(buffer[prev])||buffer[prev] == ')')  //(;) );(
                    || !(isWordChar(buffer[n])||buffer[n] == '('))
            {
                error(1,0,"%d: Syntax error (Incomplete operators %c found)\n", lineNum, buffer[curr]);
            }
            break;
        case '>':
        case '<':
            //if ((prev==-1) || (nextNonwhitespace(buffer, bufferSize, curr) == bufferSize)
            //  ||(isOperator(buffer[prev])) || (isOperator(buffer[next])))
            if ((prev==-1) || (nextNonwhitespace(buffer, bufferSize, curr) == bufferSize)
                    || !isWordChar(buffer[prev]) || !isWordChar(buffer[next]))
            {
                error(1,0,"%d: Syntax error (Incomplete operators %c found)\n", lineNum, buffer[curr]);
            }
            break;
        case '&':
            if (buffer[next] == '&' && next-curr == 1)
            {
                buffer[curr] = '*';
                buffer[next] = ' ';
                next = nextIndex(buffer, bufferSize, curr);
                n = nextNonwhitespace(buffer, bufferSize, curr);
                if ((prev==-1) || (n==bufferSize)
                        || !(isWordChar(buffer[prev])||buffer[prev] == ')')  //(;) );(
                        || !(isWordChar(buffer[n])||buffer[n] == '('))
                {
                    error(1,0,"%d: Syntax error (Incomplete operators %c found)\n", lineNum, buffer[curr]);
                }
            }
            else
            {
                error(1,0,"%d: Syntax error (Incomplete operators %c found)\n", lineNum, buffer[curr]);
            }
            break;
        case '|':
            if (buffer[next] == '|' && next-curr == 1)
            {
                buffer[curr] = '$';
                buffer[next] = ' ';
                next = nextIndex(buffer, bufferSize, curr);
            }
            n = nextNonwhitespace(buffer, bufferSize, curr);
            if ((prev==-1) || (n==bufferSize)
                    || !(isWordChar(buffer[prev])||buffer[prev] == ')')  //(;) );(
                    || !(isWordChar(buffer[n])||buffer[n] == '('))
            {
                error(1,0,"%d: Syntax error (Incomplete operators %c found)\n", lineNum, buffer[curr]);
            }
            break;
        case '\n':
            if ((prev!=-1) && (buffer[prev] == '<' || buffer[prev] == '>'))
            {
                error(1,0,"%d: Syntax error (New line character can only follow tokens other than < >.)\n", lineNum);
            }

            if (buffer[next] == '\n')
            {
                if(buffer[prev] != '$' && buffer[prev] != '*' && buffer[prev] != '|')
                {
                    buffer[curr] = '@';
                }
                else
                {
                    buffer[curr] = ' ';
                }
                buffer[next] = ' ';
                lineNum++;
                next = nextIndex(buffer, bufferSize, next);
                while (buffer[next] == '\n')
                {
                    buffer[next] = ' ';
                    next = nextIndex(buffer, bufferSize, next);
                    lineNum++;
                }
            }
            else if ((prev!=-1) && (next!=bufferSize) && ((isOperator(buffer[prev])) || (buffer[prev]=='(')))
            {
                buffer[curr] = ' ';
            }
            else if ((prev!=-1) && (next!=bufferSize) && ((isWordChar(buffer[prev])) || (buffer[prev]==')')))
            {
                buffer[curr] = ';';
            }

            if ((next!=bufferSize)
                    && (!(buffer[next] == '(' || buffer[next]==')' || isWordChar(buffer[next]))))
            {
                error(1,0,"%d, Syntax error (New line character can only be followed by (, ), or Words.)\n", lineNum);
            }

            lineNum++;
            break;
        }
        prev = curr;
        curr = next;
        next = nextIndex(buffer, bufferSize, curr);
    }
    ////printf("Step 2: Buffer cleaned \n%s\n Strlen(buffer) = %d, bufferSize = %d\n", buffer, strlen(buffer), bufferSize);

    ////printf("Step 3: Parenthesis check start.\n");
    int stackSize = 0;
    int i;
    for (i = 0; i < bufferSize; i++)
    {
        if (buffer[i] == '(')
        {
            stackSize++;
        }
        else if (buffer[i] == ')')
        {
            if(stackSize > 0)
            {
                stackSize--;
            }
            else
            {
                error(1,0,"Syntax error (Unbalanced parenthesis found)\n");
            }
        }
    }
    if (stackSize > 0)
    {
        error(1,0,"Syntax error (Unbalanced parenthesis found)");
    }
    ////printf("Step 3: Parenthesis check complete.\n");

    ////printf("Step 4: Outputting\n");
    command_stream_t cstream = (command_stream_t) checked_malloc(sizeof(struct command_stream));
    cstream->stream = buffer;
    cstream->index = 0;
    if (debug) printf("Buffer: \"%s\"\n", buffer);

    return cstream;
}