]> granicus.if.org Git - clang/commitdiff
add a new Lexer::SkipEscapedNewLines method.
authorChris Lattner <sabre@nondot.org>
Sat, 18 Apr 2009 22:27:02 +0000 (22:27 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 18 Apr 2009 22:27:02 +0000 (22:27 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69483 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Lex/Lexer.h
lib/Lex/Lexer.cpp

index 8d0576e4f9edc9715fbca5f856cee07fbd127549..3a73147152afc2e2b0dc700732175670599cc4dc 100644 (file)
@@ -342,6 +342,10 @@ public:
   /// to this function.
   static unsigned getEscapedNewLineSize(const char *P);
   
+  /// SkipEscapedNewLines - If P points to an escaped newline (or a series of
+  /// them), skip over them and return the first non-escaped-newline found,
+  /// otherwise return P.
+  static const char *SkipEscapedNewLines(const char *P);
 private:
   
   /// getCharAndSizeSlowNoWarn - Same as getCharAndSizeSlow, but never emits a
index b9aa0178c641a8da19ca470195996f41c0bebb2a..4d6450b9149b8a21b7f320adb51f89ab21a5520b 100644 (file)
@@ -422,6 +422,29 @@ unsigned Lexer::getEscapedNewLineSize(const char *Ptr) {
   return 0;
 }
 
+/// SkipEscapedNewLines - If P points to an escaped newline (or a series of
+/// them), skip over them and return the first non-escaped-newline found,
+/// otherwise return P.
+const char *Lexer::SkipEscapedNewLines(const char *P) {
+  while (1) {
+    const char *AfterEscape;
+    if (*P == '\\') {
+      AfterEscape = P+1;
+    } else if (*P == '?') {
+      // If not a trigraph for escape, bail out.
+      if (P[1] != '?' || P[2] != '/')
+        return P;
+      AfterEscape = P+3;
+    } else {
+      return P;
+    }
+    
+    unsigned NewLineSize = Lexer::getEscapedNewLineSize(AfterEscape);
+    if (NewLineSize == 0) return P;
+    P = AfterEscape+NewLineSize;
+  }
+}
+
 
 /// getCharAndSizeSlow - Peek a single 'character' from the specified buffer,
 /// get its size, and return it.  This is tricky in several cases: