int GetNumberToken( char cCharacter, char *pcToken) /* DEC_NUMBER_TOKEN :== [digit] */ /* HEX_NUMBER_TOKEN :== '0' 'x' [hexdigit] */ /* BIN_NUMBER_TOKEN :== '0' 'b' [bindigit] */ /* FLOAT_TOKEN :== <digit> '.' [digit] */ { char *pDigitClass; int iResult = DEC_NUMBER_TOKEN; *(pcToken++) = cCharacter; cCharacter = GetChar(); if (cCharacter == 'x') { *(pcToken++) = cCharacter; pDigitClass = pHexDigits; cCharacter = GetChar(); iResult = HEX_NUMBER_TOKEN; } else if (cCharacter == 'b') { *(pcToken++) = cCharacter; pDigitClass = pBinDigits; cCharacter = GetChar(); iResult = BIN_NUMBER_TOKEN; } else pDigitClass = pDecDigits; while (chrpos(cCharacter, pDigitClass) != NULL) { *(pcToken++) = cCharacter; cCharacter = GetChar(); } if ((iResult == DEC_NUMBER_TOKEN) && (cCharacter == '.')) { *(pcToken++) = cCharacter; cCharacter = GetChar(); iResult = FLOAT_TOKEN; while (chrpos(cCharacter, pDigitClass) != NULL) { *(pcToken++) = cCharacter; cCharacter = GetChar(); } UngetChar(); } *pcToken = 0; UngetChar(); return iResult; }
int GetOperatorToken( char cCharacter, char *pcToken) /* OPERATOR_TOKEN :== '=' */ /* :== '=' '=' */ /* :== '<' */ /* :== '>' */ /* :== '<' '=' */ /* :== '>' '=' */ /* :== '<' '>' */ /* :== '+' */ /* :== '-' */ /* :== '*' */ /* :== '/' */ /* :== '<' '<' */ /* :== '>' '>' */ /* :== '&' */ /* :== '|' */ /* :== '[' ']' */ /* The following two tokens are read as OPERATOR_TOKEN, but are translated */ /* to LEFT_ARROW_TOKEN or RIGHT_ARROW_TOKEN before leaving the scanner. */ /* :== '-' '>' */ /* :== '<' '-' */ { char *pcCompleteToken; pcCompleteToken = pcToken; /* store pointer to first token char */ *(pcToken++) = cCharacter; /* assign first character to token */ if (chrpos(cCharacter, "-=<>[/.") != NULL) /* if second character possible */ { cCharacter = GetChar(); /* read second character */ if (chrpos(cCharacter, "-=<>]/.") != NULL) /* if valid second character */ { *pcToken = cCharacter; /* add character */ pcToken[1] = 0; /* and make it zero terminated */ /* now a 2 byte operator is read. Check if this is a valid two byte */ /* operator. If not, put back the second character in the input stream. */ if (strpos(pcCompleteToken, "== <= >= <> << >> [] -> <- // ..") == NULL) { UngetChar(); } else { pcToken++; } } else { UngetChar(); /* else put second character back */ } } *pcToken = 0; /* terminate token */ return OPERATOR_TOKEN; }
static int scanint(int c) { int val, radix, k, i = 0; val = 0; radix = 10; if ('0' == c) { Text[i++] = '0'; if ((c = next()) == 'x') { radix = 16; Text[i++] = c; c = next(); } else { radix = 8; } } while ((k = chrpos("0123456789abcdef", tolower(c))) >= 0) { Text[i++] = c; if (k >= radix) cerror("invalid digit in integer literal: %s", c); val = val * radix + k; c = next(); } putback(c); Text[i] = 0; return val; }
static int hexchar(void) { int c, h, n = 0, f = 0; while (isxdigit(c = next())) { h = chrpos("0123456789abcdef", tolower(c)); n = n * 16 + h; f = 1; } putback(c); if (!f) error("missing digits after '\\x'", NULL); if (n > 255) error("value out of range after '\\x'", NULL); return n; }
void test_find_index_of_char(void) { int ret; struct _rpg_hash *h; int i; char *s = " A B C D E F G"; i=0; ret = chrpos( s, strlen( s ), 'A', &i );RPG_CU_FNC_CHECK CU_ASSERT_EQUAL( 2, i ); i=3; ret = chrpos( s, strlen( s ), 'B', &i );RPG_CU_FNC_CHECK CU_ASSERT_TRUE( i == 5 ); i=0; ret = chrpos( s, strlen( s ), 'B', &i );RPG_CU_FNC_CHECK CU_ASSERT_TRUE( i == -1 ); i=0; ret = chrpos( s, strlen( s ), 'H', &i );RPG_CU_FNC_CHECK CU_ASSERT_TRUE( i == -1 ); }
int find_start_of( char *buffer, int len, char c, int *out_i ) { int ret = chrpos( buffer, len, c, out_i ); ENSURE_SUCCEEDED INC_ON_SU; return SUCCESS; }
int GetNewToken( char *pcToken) /******************************************************************************/ /* get a new token from the input file. Don't check for a put back token */ /* characters are classified as: */ /* cr :== carriage return character */ /* lf :== line feed character */ /* tab :== the tab character */ /* dquote :== the " character */ /* digit :== 0123456789 */ /* bindigit :== 01 */ /* hexdigit :== 0123456789ABCDEF */ /* alpha :== _abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ */ /* any :== all prtble chars except cr, lf and dqoute */ /* tab :== the tab character */ /* alphanum :== alpha | digit */ /* */ /* <x> :== zero or more x */ /* [x] :== one or more x */ /* x :== exactly one x */ /* */ /* recognized tokens are : */ /* */ /* FLOAT_TOKEN :== <digit> '.' [digit] */ /* DEC_NUMBER_TOKEN :== [digit] */ /* HEX_NUMBER_TOKEN :== '0' 'x' [hexdigit] */ /* BIN_NUMBER_TOKEN :== '0' 'b' [bindigit] */ /* IDENTIFIER_TOKEN :== alpha <alphanum> */ /* STRING_TOKEN :== dquote <any> dquote */ /* OPERATOR_TOKEN :== '=' */ /* :== '=' '=' */ /* :== '<' */ /* :== '>' */ /* :== '<' '=' */ /* :== '>' '=' */ /* :== '<' '>' */ /* :== '+' */ /* :== '-' */ /* :== '*' */ /* :== '/' */ /* :== '<' '<' */ /* :== '>' '>' */ /* :== '&' */ /* :== '|' */ /* :== '[' ']' */ /* :== '[' */ /* :== ']' */ /* DOT_TOKEN :== '.' */ /* DOTDOT_TOKEN :== '.' '.' */ /* COMMA_TOKEN :== ',' */ /* SEMICOLON_TOKEN :== ';' */ /* COLON_TOKEN :== ':' */ /* LEFT_ARROW_TOKEN :== '<' '-' */ /* RIGHT_ARROW_TOKEN :== '-' '>' */ /* OPEN_PARENTHESE_TOKEN :== '(' */ /* CLOSE_PARENTHESE_TOKEN :== ')' */ /* PRECOMPILER_TOKEN :== '#' [alpha] */ /* DELIMITER_TOKEN :== ' ' */ /* :== tab */ /* :== cr */ /* :== lf */ /******************************************************************************/ { char cCharacter; int iResult; int iCurrentLine; boolean bEoLn; char *pcTokenWalker; pcTokenWalker = pcToken; cCharacter = GetChar(); /* first skip all delimiter chars */ while (chrpos((char) cCharacter, DELIMITER_CHARS) != NULL) { cCharacter = GetChar(); } if (isDigit(cCharacter)) { /* read a DEC_NUMBER_TOKEN */ /* or read a HEX_NUMBER_TOKEN */ /* or read a BIN_NUMBER_TOKEN */ iResult = GetNumberToken(cCharacter, pcToken); } else if (isAlpha(cCharacter)) { /* read an IDENTIFIER_TOKEN */ iResult = GetIdentifierToken(cCharacter, pcToken); } else if (cCharacter == '"') { /* read a STRING_TOKEN */ iResult = GetStringToken(cCharacter, pcToken); } else if (chrpos(cCharacter, "=<>+-*/&|[].") != NULL) { /* read an OPERATOR_TOKEN */ iResult = GetOperatorToken(cCharacter, pcToken); if (strcmp((char *) pcToken, "->") == 0) iResult = RIGHT_ARROW_TOKEN; else if (strcmp((char *) pcToken, "<-") == 0) iResult = LEFT_ARROW_TOKEN; else if (strcmp((char *) pcToken, "..") == 0) iResult = DOTDOT_TOKEN; else if (strcmp((char *) pcToken, "//") == 0) { iCurrentLine = CurrentLine(); /* bEoLn (EndOfLine) will be set to true if end of line is reached */ /* undetected because of end of file. (This will also happen in the */ /* unlikely situation that an inputfile contains something like: */ /* #define COMMENT //this is comment */ /* because while parsing a preprocessor macro, the scanner refuses to */ /* go to the next line. */ bEoLn = FALSE; while ((iCurrentLine == CurrentLine()) && (!bEoLn)) { cCharacter = GetChar(); if ((cCharacter != ILLEGAL_CHAR) && (cCharacter != '\0')) { *(pcToken++) = cCharacter; } else { bEoLn = TRUE; } } iResult = COMMENT_TOKEN; if (!bEoLn) { /* End of comment detected by reading a Cr/Lf character. This */ /* read character is added to pcToken. */ /* Put cr/lf back, only to adjust the line counter... */ /* (only needed if not in the middle of a macro.) */ UngetChar(); /* Delete cr or lf character from pcToken by overwriting it with */ /* the zero character (for terminating pcToken) */ *(--pcToken) = 0; } else { /* Terminate pcToken by adding a zero character */ *(pcToken) = 0; } } } else if (cCharacter == '#') { /* read a PRECOMPILER_TOKEN */ iResult = GetPrecompilerToken(cCharacter, pcToken); } else if (cCharacter == '{') { iResult = OPEN_BRACKETS_TOKEN; (*pcTokenWalker++) = cCharacter; *pcTokenWalker = 0; } else if (cCharacter == '}') { iResult = CLOSE_BRACKETS_TOKEN; (*pcTokenWalker++) = cCharacter; *pcTokenWalker = 0; } else if (cCharacter == '(') { iResult = OPEN_PARENTHESES_TOKEN; (*pcTokenWalker++) = cCharacter; *pcTokenWalker = 0; } else if (cCharacter == ')') { iResult = CLOSE_PARENTHESES_TOKEN; (*pcTokenWalker++) = cCharacter; *pcTokenWalker = 0; } else if (cCharacter == '.') { iResult = DOT_TOKEN; (*pcTokenWalker++) = cCharacter; cCharacter = GetChar(); while (isDigit(cCharacter)) { iResult = FLOAT_TOKEN; (*pcTokenWalker++) = cCharacter; cCharacter = GetChar(); } UngetChar(); *pcTokenWalker = 0; } else if (cCharacter == ',') { iResult = COMMA_TOKEN; (*pcTokenWalker++) = cCharacter; *pcTokenWalker = 0; } else if (cCharacter == ';') { iResult = SEMICOLON_TOKEN; (*pcTokenWalker++) = cCharacter; *pcTokenWalker = 0; } else if (cCharacter == ':') { iResult = COLON_TOKEN; (*pcTokenWalker++) = cCharacter; *pcTokenWalker = 0; } else if (cCharacter == '~') { iResult = TILDE_TOKEN; (*pcTokenWalker++) = cCharacter; *pcTokenWalker = 0; } else if (cCharacter == '\\') { iResult = BACKSLASH_TOKEN; (*pcTokenWalker++) = cCharacter; *pcTokenWalker = 0; } else if (cCharacter == 0) { /* End of file reached. */ iResult = END_OF_FILE; (*pcTokenWalker++) = cCharacter; } else { /* unexpected character read */ iResult = UNEXPECTED_CHAR_READ; (*pcTokenWalker++) = cCharacter; *pcTokenWalker = 0; } return iResult; }