[cfe-commits] r69482 - in /cfe/trunk: include/clang/Lex/Lexer.h lib/Lex/Lexer.cpp
Chris Lattner
sabre at nondot.org
Sat Apr 18 15:05:41 PDT 2009
Author: lattner
Date: Sat Apr 18 17:05:41 2009
New Revision: 69482
URL: http://llvm.org/viewvc/llvm-project?rev=69482&view=rev
Log:
factor escape newline measuring out into its own helper function.
Modified:
cfe/trunk/include/clang/Lex/Lexer.h
cfe/trunk/lib/Lex/Lexer.cpp
Modified: cfe/trunk/include/clang/Lex/Lexer.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/Lexer.h?rev=69482&r1=69481&r2=69482&view=diff
==============================================================================
--- cfe/trunk/include/clang/Lex/Lexer.h (original)
+++ cfe/trunk/include/clang/Lex/Lexer.h Sat Apr 18 17:05:41 2009
@@ -336,6 +336,12 @@
Size = 0;
return getCharAndSizeSlowNoWarn(Ptr, Size, Features);
}
+
+ /// getEscapedNewLineSize - Return the size of the specified escaped newline,
+ /// or 0 if it is not an escaped newline. P[-1] is known to be a "\" on entry
+ /// to this function.
+ static unsigned getEscapedNewLineSize(const char *P);
+
private:
/// getCharAndSizeSlowNoWarn - Same as getCharAndSizeSlow, but never emits a
Modified: cfe/trunk/lib/Lex/Lexer.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/Lexer.cpp?rev=69482&r1=69481&r2=69482&view=diff
==============================================================================
--- cfe/trunk/lib/Lex/Lexer.cpp (original)
+++ cfe/trunk/lib/Lex/Lexer.cpp Sat Apr 18 17:05:41 2009
@@ -399,6 +399,30 @@
return Res;
}
+/// getEscapedNewLineSize - Return the size of the specified escaped newline,
+/// or 0 if it is not an escaped newline. P[-1] is known to be a "\" or a
+/// trigraph equivalent on entry to this function.
+unsigned Lexer::getEscapedNewLineSize(const char *Ptr) {
+ unsigned Size = 0;
+ while (isWhitespace(Ptr[Size])) {
+ ++Size;
+
+ if (Ptr[Size-1] != '\n' && Ptr[Size-1] != '\r')
+ continue;
+
+ // If this is a \r\n or \n\r, skip the other half.
+ if ((Ptr[Size] == '\r' || Ptr[Size] == '\n') &&
+ Ptr[Size-1] != Ptr[Size])
+ ++Size;
+
+ return Size;
+ }
+
+ // Not an escaped newline, must be a \t or something else.
+ return 0;
+}
+
+
/// getCharAndSizeSlow - Peek a single 'character' from the specified buffer,
/// get its size, and return it. This is tricky in several cases:
/// 1. If currently at the start of a trigraph, we warn about the trigraph,
@@ -427,29 +451,20 @@
if (!isWhitespace(Ptr[0])) return '\\';
// See if we have optional whitespace characters followed by a newline.
- unsigned SizeTmp = 0;
- do {
- ++SizeTmp;
- if (Ptr[SizeTmp-1] == '\n' || Ptr[SizeTmp-1] == '\r') {
- // Remember that this token needs to be cleaned.
- if (Tok) Tok->setFlag(Token::NeedsCleaning);
-
- // Warn if there was whitespace between the backslash and newline.
- if (SizeTmp != 1 && Tok && !isLexingRawMode())
- Diag(Ptr, diag::backslash_newline_space);
-
- // If this is a \r\n or \n\r, skip the newlines.
- if ((Ptr[SizeTmp] == '\r' || Ptr[SizeTmp] == '\n') &&
- Ptr[SizeTmp-1] != Ptr[SizeTmp])
- ++SizeTmp;
+ if (unsigned EscapedNewLineSize = getEscapedNewLineSize(Ptr)) {
+ // Remember that this token needs to be cleaned.
+ if (Tok) Tok->setFlag(Token::NeedsCleaning);
+
+ // Warn if there was whitespace between the backslash and newline.
+ if (EscapedNewLineSize != 1 && Tok && !isLexingRawMode())
+ Diag(Ptr, diag::backslash_newline_space);
- // Found backslash<whitespace><newline>. Parse the char after it.
- Size += SizeTmp;
- Ptr += SizeTmp;
- // Use slow version to accumulate a correct size field.
- return getCharAndSizeSlow(Ptr, Size, Tok);
- }
- } while (isWhitespace(Ptr[SizeTmp]));
+ // Found backslash<whitespace><newline>. Parse the char after it.
+ Size += EscapedNewLineSize;
+ Ptr += EscapedNewLineSize;
+ // Use slow version to accumulate a correct size field.
+ return getCharAndSizeSlow(Ptr, Size, Tok);
+ }
// Otherwise, this is not an escaped newline, just return the slash.
return '\\';
@@ -493,24 +508,14 @@
if (!isWhitespace(Ptr[0])) return '\\';
// See if we have optional whitespace characters followed by a newline.
- unsigned SizeTmp = 0;
- do {
- ++SizeTmp;
- if (Ptr[SizeTmp-1] == '\n' || Ptr[SizeTmp-1] == '\r') {
-
- // If this is a \r\n or \n\r, skip the newlines.
- if ((Ptr[SizeTmp] == '\r' || Ptr[SizeTmp] == '\n') &&
- Ptr[SizeTmp-1] != Ptr[SizeTmp])
- ++SizeTmp;
-
- // Found backslash<whitespace><newline>. Parse the char after it.
- Size += SizeTmp;
- Ptr += SizeTmp;
-
- // Use slow version to accumulate a correct size field.
- return getCharAndSizeSlowNoWarn(Ptr, Size, Features);
- }
- } while (isWhitespace(Ptr[SizeTmp]));
+ if (unsigned EscapedNewLineSize = getEscapedNewLineSize(Ptr)) {
+ // Found backslash<whitespace><newline>. Parse the char after it.
+ Size += EscapedNewLineSize;
+ Ptr += EscapedNewLineSize;
+
+ // Use slow version to accumulate a correct size field.
+ return getCharAndSizeSlowNoWarn(Ptr, Size, Features);
+ }
// Otherwise, this is not an escaped newline, just return the slash.
return '\\';
More information about the cfe-commits
mailing list