本文整理汇总了C++中tok_ctx::restore方法的典型用法代码示例。如果您正苦于以下问题:C++ tok_ctx::restore方法的具体用法?C++ tok_ctx::restore怎么用?C++ tok_ctx::restore使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类tok_ctx
的用法示例。
在下文中一共展示了tok_ctx::restore方法的11个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: parse_cr_string
/**
* Parses a C++0x 'R' string. R"( xxx )" R"tag( )tag" u8R"(x)" uR"(x)"
* Newlines may be in the string.
*/
static bool parse_cr_string(tok_ctx& ctx, chunk_t& pc, int q_idx)
{
int cnt;
int tag_idx = ctx.c.idx + q_idx + 1;
int tag_len = 0;
ctx.save();
/* Copy the prefix + " to the string */
pc.str.clear();
cnt = q_idx + 1;
while (cnt--)
{
pc.str.append(ctx.get());
}
/* Add the tag and get the length of the tag */
while (ctx.more() && (ctx.peek() != '('))
{
tag_len++;
pc.str.append(ctx.get());
}
if (ctx.peek() != '(')
{
ctx.restore();
return(false);
}
pc.type = CT_STRING;
while (ctx.more())
{
if ((ctx.peek() == ')') &&
(ctx.peek(tag_len + 1) == '"') &&
tag_compare(ctx.data, tag_idx, ctx.c.idx + 1, tag_len))
{
cnt = tag_len + 2; /* for the )" */
while (cnt--)
{
pc.str.append(ctx.get());
}
parse_suffix(ctx, pc);
return(true);
}
if (ctx.peek() == '\n')
{
pc.str.append(ctx.get());
pc.nl_count++;
pc.type = CT_STRING_MULTI;
}
else
{
pc.str.append(ctx.get());
}
}
ctx.restore();
return(false);
} // parse_cr_string
示例2: parse_suffix
/**
* Parse any attached suffix, which may be a user-defined literal suffix.
* If for a string, explicitly exclude common format and scan specifiers, ie,
* PRIx32 and SCNx64.
*/
static void parse_suffix(tok_ctx& ctx, chunk_t& pc, bool forstring = false)
{
if (CharTable::IsKw1(ctx.peek()))
{
int slen = 0;
int oldsize = pc.str.size();
tok_info ss;
/* don't add the suffix if we see L" or L' or S" */
int p1 = ctx.peek();
int p2 = ctx.peek(1);
if (forstring &&
(((p1 == 'L') && ((p2 == '"') || (p2 == '\''))) ||
((p1 == 'S') && (p2 == '"'))))
{
return;
}
ctx.save(ss);
while (ctx.more() && CharTable::IsKw2(ctx.peek()))
{
slen++;
pc.str.append(ctx.get());
}
if (forstring && (slen >= 4) &&
(pc.str.startswith("PRI", oldsize) ||
pc.str.startswith("SCN", oldsize)))
{
ctx.restore(ss);
pc.str.resize(oldsize);
}
}
}
示例3: parse_code_placeholder
/**
* Figure of the length of the code placeholder at text, if present.
* This is only for Xcode which sometimes inserts temporary code placeholder chunks, which in plaintext <#look like this#>.
*
* @param pc The structure to update, str is an input.
* @return Whether a placeholder was parsed.
*/
static bool parse_code_placeholder(tok_ctx& ctx, chunk_t& pc)
{
int last2 = 0, last1 = 0;
if ((ctx.peek() != '<') || (ctx.peek(1) != '#'))
{
return(false);
}
ctx.save();
/* account for opening two chars '<#' */
pc.str = ctx.get();
pc.str.append(ctx.get());
/* grab everything until '#>', fail if not found. */
while (ctx.more())
{
last2 = last1;
last1 = ctx.get();
pc.str.append(last1);
if ((last2 == '#') && (last1 == '>'))
{
pc.type = CT_WORD;
return(true);
}
}
ctx.restore();
return(false);
}
示例4: parse_bs_newline
/**
* Called when we hit a backslash.
* If there is nothing but whitespace until the newline, then this is a
* backslash newline
*/
static bool parse_bs_newline(tok_ctx& ctx, chunk_t& pc)
{
ctx.save();
ctx.get(); /* skip the '\' */
int ch;
while (ctx.more() && unc_isspace(ch = ctx.peek()))
{
ctx.get();
if ((ch == '\r') || (ch == '\n'))
{
if (ch == '\r')
{
ctx.expect('\n');
}
pc.str = "\\";
pc.type = CT_NL_CONT;
pc.nl_count = 1;
return(true);
}
}
ctx.restore();
return(false);
}
示例5: parse_newline
/**
* Parses any number of tab or space chars followed by a newline.
* Does not change pc.len if a newline isn't found.
* This is not the same as parse_whitespace() because it only consumes until
* a single newline is encountered.
*/
static bool parse_newline(tok_ctx& ctx)
{
ctx.save();
/* Eat whitespace */
while ((ctx.peek() == ' ') || (ctx.peek() == '\t'))
{
ctx.get();
}
if ((ctx.peek() == '\r') || (ctx.peek() == '\n'))
{
if (ctx.peek() == '\n')
{
ctx.get();
}
else /* it is '\r' */
{
ctx.get();
if (ctx.peek() == '\n')
{
ctx.get();
}
}
return(true);
}
ctx.restore();
return(false);
}
示例6: parse_newline
/**
* Parses any number of tab or space chars followed by a newline.
* Does not change pc.len if a newline isn't found.
* This is not the same as parse_whitespace() because it only consumes until
* a single newline is encountered.
*/
static bool parse_newline(tok_ctx& ctx)
{
ctx.save();
/* Eat whitespace */
while ((ctx.peek() == ' ') || (ctx.peek() == '\t'))
{
ctx.get();
}
if ((ctx.peek() == '\r') || (ctx.peek() == '\n'))
{
if (!ctx.expect('\n'))
{
ctx.get();
ctx.expect('\n');
}
return(true);
}
ctx.restore();
return(false);
}
示例7: parse_comment
/**
* Figure of the length of the comment at text.
* The next bit of text starts with a '/', so it might be a comment.
* There are three types of comments:
* - C comments that start with '/ *' and end with '* /'
* - C++ comments that start with //
* - D nestable comments '/+' '+/'
*
* @param pc The structure to update, str is an input.
* @return Whether a comment was parsed
*/
static bool parse_comment(tok_ctx& ctx, chunk_t& pc)
{
int ch;
bool is_d = (cpd.lang_flags & LANG_D) != 0; // forcing value to bool
bool is_cs = (cpd.lang_flags & LANG_CS) != 0; // forcing value to bool
int d_level = 0;
int bs_cnt;
/* does this start with '/ /' or '/ *' or '/ +' (d) */
if ((ctx.peek() != '/') ||
((ctx.peek(1) != '*') && (ctx.peek(1) != '/') &&
((ctx.peek(1) != '+') || !is_d)))
{
return(false);
}
ctx.save();
/* account for opening two chars */
pc.str = ctx.get(); /* opening '/' */
ch = ctx.get();
pc.str.append(ch); /* second char */
if (ch == '/')
{
pc.type = CT_COMMENT_CPP;
while (true)
{
bs_cnt = 0;
while (ctx.more())
{
ch = ctx.peek();
if ((ch == '\r') || (ch == '\n'))
{
break;
}
if ((ch == '\\') && !is_cs) /* backslashes aren't special in comments in C# */
{
bs_cnt++;
}
else
{
bs_cnt = 0;
}
pc.str.append(ctx.get());
}
/* If we hit an odd number of backslashes right before the newline,
* then we keep going.
*/
if (((bs_cnt & 1) == 0) || !ctx.more())
{
break;
}
if (ctx.peek() == '\r')
{
pc.str.append(ctx.get());
}
if (ctx.peek() == '\n')
{
pc.str.append(ctx.get());
}
pc.nl_count++;
cpd.did_newline = true;
}
}
else if (!ctx.more())
{
/* unexpected end of file */
ctx.restore();
return(false);
}
else if (ch == '+')
{
pc.type = CT_COMMENT;
d_level++;
while ((d_level > 0) && ctx.more())
{
if ((ctx.peek() == '+') && (ctx.peek(1) == '/'))
{
pc.str.append(ctx.get()); /* store the '+' */
pc.str.append(ctx.get()); /* store the '/' */
d_level--;
continue;
}
if ((ctx.peek() == '/') && (ctx.peek(1) == '+'))
{
pc.str.append(ctx.get()); /* store the '/' */
//.........这里部分代码省略.........
示例8: d_parse_string
//.........这里部分代码省略.........
{
int ch = ctx.peek();
if ((ch == '"') || (ch == '\'') || (ch == '`'))
{
return(parse_string(ctx, pc, 0, true));
}
else if (ch == '\\')
{
ctx.save();
int cnt;
pc.str.clear();
while (ctx.peek() == '\\')
{
pc.str.append(ctx.get());
/* Check for end of file */
switch (ctx.peek())
{
case 'x':
/* \x HexDigit HexDigit */
cnt = 3;
while (cnt--)
{
pc.str.append(ctx.get());
}
break;
case 'u':
/* \u HexDigit HexDigit HexDigit HexDigit */
cnt = 5;
while (cnt--)
{
pc.str.append(ctx.get());
}
break;
case 'U':
/* \U HexDigit (x8) */
cnt = 9;
while (cnt--)
{
pc.str.append(ctx.get());
}
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
/* handle up to 3 octal digits */
pc.str.append(ctx.get());
ch = ctx.peek();
if ((ch >= '0') && (ch <= '7'))
{
pc.str.append(ctx.get());
ch = ctx.peek();
if ((ch >= '0') && (ch <= '7'))
{
pc.str.append(ctx.get());
}
}
break;
case '&':
/* \& NamedCharacterEntity ; */
pc.str.append(ctx.get());
while (unc_isalpha(ctx.peek()))
{
pc.str.append(ctx.get());
}
if (ctx.peek() == ';')
{
pc.str.append(ctx.get());
}
break;
default:
/* Everything else is a single character */
pc.str.append(ctx.get());
break;
} // switch
}
if (pc.str.size() > 1)
{
pc.type = CT_STRING;
return(true);
}
ctx.restore();
}
else if (((ch == 'r') || (ch == 'x')) && (ctx.peek(1) == '"'))
{
return(parse_string(ctx, pc, 1, false));
}
return(false);
} // d_parse_string
示例9: parse_next
/**
* Skips the next bit of whatever and returns the type of block.
*
* pc.str is the input text.
* pc.len in the output length.
* pc.type is the output type
* pc.column is output column
*
* @param pc The structure to update, str is an input.
* @return true/false - whether anything was parsed
*/
static bool parse_next(tok_ctx& ctx, chunk_t& pc)
{
const chunk_tag_t *punc;
int ch, ch1;
if (!ctx.more())
{
//fprintf(stderr, "All done!\n");
return(false);
}
/* Save off the current column */
pc.orig_line = ctx.c.row;
pc.column = ctx.c.col;
pc.orig_col = ctx.c.col;
pc.type = CT_NONE;
pc.nl_count = 0;
pc.flags = 0;
/* If it is turned off, we put everything except newlines into CT_UNKNOWN */
if (cpd.unc_off)
{
if (parse_ignored(ctx, pc))
{
return(true);
}
}
/**
* Parse whitespace
*/
if (parse_whitespace(ctx, pc))
{
return(true);
}
/**
* Handle unknown/unhandled preprocessors
*/
if ((cpd.in_preproc > CT_PP_BODYCHUNK) &&
(cpd.in_preproc <= CT_PP_OTHER))
{
pc.str.clear();
tok_info ss;
ctx.save(ss);
/* Chunk to a newline or comment */
pc.type = CT_PREPROC_BODY;
int last = 0;
while (ctx.more())
{
int ch = ctx.peek();
if ((ch == '\n') || (ch == '\r'))
{
/* Back off if this is an escaped newline */
if (last == '\\')
{
ctx.restore(ss);
pc.str.pop_back();
}
break;
}
/* Quit on a C++ comment start */
if ((ch == '/') && (ctx.peek(1) == '/'))
{
break;
}
last = ch;
ctx.save(ss);
pc.str.append(ctx.get());
}
if (pc.str.size() > 0)
{
return(true);
}
}
/**
* Detect backslash-newline
*/
if ((ctx.peek() == '\\') && parse_bs_newline(ctx, pc))
{
return(true);
}
/**
* Parse comments
//.........这里部分代码省略.........
示例10: parse_ignored
static bool parse_ignored(tok_ctx& ctx, chunk_t& pc)
{
int nl_count = 0;
/* Parse off newlines/blank lines */
while (parse_newline(ctx))
{
nl_count++;
}
if (nl_count > 0)
{
pc.nl_count = nl_count;
pc.type = CT_NEWLINE;
return(true);
}
/* See if the UO_enable_processing_cmt text is on this line */
ctx.save();
pc.str.clear();
while (ctx.more() &&
(ctx.peek() != '\r') &&
(ctx.peek() != '\n'))
{
pc.str.append(ctx.get());
}
if (pc.str.size() == 0)
{
/* end of file? */
return(false);
}
/* Note that we aren't actually making sure this is in a comment, yet */
const char *ontext = cpd.settings[UO_enable_processing_cmt].str;
if (ontext == NULL)
{
ontext = UNCRUSTIFY_ON_TEXT;
}
if (pc.str.find(ontext) < 0)
{
pc.type = CT_IGNORED;
return(true);
}
ctx.restore();
/* parse off whitespace leading to the comment */
if (parse_whitespace(ctx, pc))
{
pc.type = CT_IGNORED;
return(true);
}
/* Look for the ending comment and let it pass */
if (parse_comment(ctx, pc) && !cpd.unc_off)
{
return(true);
}
/* Reset the chunk & scan to until a newline */
pc.str.clear();
while (ctx.more() &&
(ctx.peek() != '\r') &&
(ctx.peek() != '\n'))
{
pc.str.append(ctx.get());
}
if (pc.str.size() > 0)
{
pc.type = CT_IGNORED;
return(true);
}
return(false);
} // parse_ignored
示例11: parse_number
/**
* Count the number of characters in the number.
* The next bit of text starts with a number (0-9 or '.'), so it is a number.
* Count the number of characters in the number.
*
* This should cover all number formats for all languages.
* Note that this is not a strict parser. It will happily parse numbers in
* an invalid format.
*
* For example, only D allows underscores in the numbers, but they are
* allowed in all formats.
*
* @param pc The structure to update, str is an input.
* @return Whether a number was parsed
*/
static bool parse_number(tok_ctx &ctx, chunk_t &pc)
{
int tmp;
bool is_float;
bool did_hex = false;
/* A number must start with a digit or a dot, followed by a digit */
if (!is_dec(ctx.peek()) &&
((ctx.peek() != '.') || !is_dec(ctx.peek(1))))
{
return(false);
}
is_float = (ctx.peek() == '.');
if (is_float && (ctx.peek(1) == '.'))
{
return(false);
}
/* Check for Hex, Octal, or Binary
* Note that only D and Pawn support binary, but who cares?
*/
if (ctx.peek() == '0')
{
pc.str.append(ctx.get()); /* store the '0' */
int ch;
chunk_t pc_temp;
size_t pc_length;
pc_temp.str.append('0');
// MS constant might have an "h" at the end. Look for it
ctx.save();
while (ctx.more() && CharTable::IsKw2(ctx.peek()))
{
ch = ctx.get();
pc_temp.str.append(ch);
}
pc_length = pc_temp.len();
ch = pc_temp.str[pc_length - 1];
ctx.restore();
LOG_FMT(LGUY, "%s(%d): pc_temp:%s\n", __func__, __LINE__, pc_temp.text());
if (ch == 'h')
{
// we have an MS hexadecimal number with "h" at the end
LOG_FMT(LGUY, "%s(%d): MS hexadecimal number\n", __func__, __LINE__);
did_hex = true;
do
{
pc.str.append(ctx.get()); /* store the rest */
} while (is_hex_(ctx.peek()));
pc.str.append(ctx.get()); /* store the h */
LOG_FMT(LGUY, "%s(%d): pc:%s\n", __func__, __LINE__, pc.text());
}
else
{
switch (unc_toupper(ctx.peek()))
{
case 'X': /* hex */
did_hex = true;
do
{
pc.str.append(ctx.get()); /* store the 'x' and then the rest */
} while (is_hex_(ctx.peek()));
break;
case 'B': /* binary */
do
{
pc.str.append(ctx.get()); /* store the 'b' and then the rest */
} while (is_bin_(ctx.peek()));
break;
case '0': /* octal or decimal */
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
do
{
pc.str.append(ctx.get());
//.........这里部分代码省略.........