/* * Scan one tag line. * * "*pData" should be pointing to the first digit in the tag number. On * successful return, it will be pointing to the last character in the * tag line (i.e. the character before the start of the next line). * * Returns 0 on success, nonzero on failure. */ static int scanTagLine(char** pData, EventTag* tag, int lineNum) { char* cp = *pData; char* startp; char* endp; unsigned long val; startp = cp; while (isCharDigit(*++cp)) ; *cp = '\0'; val = strtoul(startp, &endp, 10); assert(endp == cp); if (endp != cp) fprintf(stderr, "ARRRRGH\n"); tag->tagIndex = val; while (*++cp != '\n' && isCharWhitespace(*cp)) ; if (*cp == '\n') { fprintf(stderr, "%s: missing tag string on line %d\n", OUT_TAG, lineNum); return -1; } tag->tagStr = cp; while (isCharValidTag(*++cp)) ; if (*cp == '\n') { /* null terminate and return */ *cp = '\0'; } else if (isCharWhitespace(*cp)) { /* CRLF or trailin spaces; zap this char, then scan for the '\n' */ *cp = '\0'; /* just ignore the rest of the line till \n TODO: read the tag description that follows the tag name */ while (*++cp != '\n') { } } else { fprintf(stderr, "%s: invalid tag chars on line %d\n", OUT_TAG, lineNum); return -1; } *pData = cp; //printf("+++ Line %d: got %d '%s'\n", lineNum, tag->tagIndex, tag->tagStr); return 0; }
/* * Scan one tag line. * * "*pData" should be pointing to the first digit in the tag number. On * successful return, it will be pointing to the last character in the * tag line (i.e. the character before the start of the next line). * * Returns 0 on success, nonzero on failure. */ static int scanTagLine(char** pData, EventTag* tag, int lineNum) { char* cp = *pData; char* startp; char* endp; unsigned long val; startp = cp; while (isCharDigit(*++cp)) ; *cp = '\0'; val = strtoul(startp, &endp, 10); assert(endp == cp); tag->tagIndex = val; while (*++cp != '\n' && isCharWhitespace(*cp)) ; if (*cp == '\n') { return -1; } tag->tagStr = cp; while (isCharValidTag(*++cp)) ; if (*cp == '\n') { /* null terminate and return */ *cp = '\0'; } else if (isCharWhitespace(*cp)) { /* CRLF or trailin spaces; zap this char, then scan for the '\n' */ *cp = '\0'; /* just ignore the rest of the line till \n TODO: read the tag description that follows the tag name */ while (*++cp != '\n') { } } else { return -1; } *pData = cp; return 0; }
/* * Run through all lines in the file, determining whether they're blank, * comments, or possibly have a tag entry. * * This is a very "loose" scan. We don't try to detect syntax errors here. * The later pass is more careful, but the number of tags found there must * match the number of tags found here. * * Returns the number of potential tag entries found. */ static int countMapLines(const EventTagMap* map) { int numTags, unknown; const char* cp; const char* endp; cp = (const char*) map->mapAddr; endp = cp + map->mapLen; numTags = 0; unknown = 1; while (cp < endp) { if (*cp == '\n') { unknown = 1; } else if (unknown) { if (isCharDigit(*cp)) { /* looks like a tag to me */ numTags++; unknown = 0; } else if (isCharWhitespace(*cp)) { /* might be leading whitespace before tag num, keep going */ } else { /* assume comment; second pass can complain in detail */ unknown = 0; } } else { /* we've made up our mind; just scan to end of line */ } cp++; } return numTags; }
/* * Parse the tags out of the file. */ static int parseMapLines(EventTagMap* map) { int tagNum, lineStart, lineNum; char* cp; char* endp; cp = (char*) map->mapAddr; endp = cp + map->mapLen; /* insist on EOL at EOF; simplifies parsing and null-termination */ if (*(endp-1) != '\n') { return -1; } tagNum = 0; lineStart = 1; lineNum = 1; while (cp < endp) { //printf("{%02x}", *cp); fflush(stdout); if (*cp == '\n') { lineStart = 1; lineNum++; } else if (lineStart) { if (*cp == '#') { /* comment; just scan to end */ lineStart = 0; } else if (isCharDigit(*cp)) { /* looks like a tag; scan it out */ if (tagNum >= map->numTags) { return -1; } if (scanTagLine(&cp, &map->tagArray[tagNum], lineNum) != 0) return -1; tagNum++; lineNum++; // we eat the '\n' /* leave lineStart==1 */ } else if (isCharWhitespace(*cp)) { /* looks like leading whitespace; keep scanning */ } else { return -1; } } else { /* this is a blank or comment line */ } cp++; } if (tagNum != map->numTags) { return -1; } return 0; }
bool isStringWhitespace(std::string s) { if(!IS_STRING_VALID(s)) { return 0; } int stringLength = s.length(); for(int i = 0; i < stringLength; ++i) { if(!isCharWhitespace(s[i])) { return 0; } } return 1; }
bool isCharDelimiter(char c) { if(c == ';' || c == ':' || c == ',' || c == '"' || c == '[' || c == ']' || c == '{' || c == '}' || c == '(' || c == ')' || isCharWhitespace(c)) return 1; return 0; }