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; }
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; }
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; }