15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- LiteralSupport.h ---------------------------------------*- C++ -*-===//
25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//                     The LLVM Compiler Infrastructure
45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details.
75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// This file defines the NumericLiteralParser, CharLiteralParser, and
115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// StringLiteralParser interfaces.
125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#ifndef CLANG_LITERALSUPPORT_H
165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define CLANG_LITERALSUPPORT_H
175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
183f6f51e28231f65de9c2dd150a2d757b2162cfa3Jordan Rose#include "clang/Basic/CharInfo.h"
19686775deca8b8685eb90801495880e3abdd844c2Chris Lattner#include "clang/Basic/LLVM.h"
2030a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "clang/Basic/TokenKinds.h"
2194c939dc1d4958b62ea5a89294dd8b2905f3191fJohn McCall#include "llvm/ADT/APFloat.h"
225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/ADT/SmallString.h"
23fc97ea29b1afd9e87341bce2b0cbb0c7172b7dd8Dmitri Gribenko#include "llvm/ADT/StringRef.h"
2403013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/DataTypes.h"
255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace clang {
275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
28d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikieclass DiagnosticsEngine;
295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass Preprocessor;
30d217773f106856a11879ec79dc468efefaf2ee75Chris Lattnerclass Token;
315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass SourceLocation;
325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass TargetInfo;
33ca1475ea0e76da6b852796610139ed9b49c8d4a6Chris Lattnerclass SourceManager;
34ca1475ea0e76da6b852796610139ed9b49c8d4a6Chris Lattnerclass LangOptions;
351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// NumericLiteralParser - This performs strict semantic analysis of the content
375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// of a ppnumber, classifying it as either integer, floating, or erroneous,
385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// determines the radix of the value and can convert it to a useful value.
395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass NumericLiteralParser {
405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Preprocessor &PP; // needed for diagnostics
411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const char *const ThisTokBegin;
435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const char *const ThisTokEnd;
445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const char *DigitsBegin, *SuffixBegin; // markers
455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const char *s; // cursor
461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  unsigned radix;
481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
49b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smith  bool saw_exponent, saw_period, saw_ud_suffix;
501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
52fc97ea29b1afd9e87341bce2b0cbb0c7172b7dd8Dmitri Gribenko  NumericLiteralParser(StringRef TokSpelling,
53fc97ea29b1afd9e87341bce2b0cbb0c7172b7dd8Dmitri Gribenko                       SourceLocation TokLoc,
54fc97ea29b1afd9e87341bce2b0cbb0c7172b7dd8Dmitri Gribenko                       Preprocessor &PP);
555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool hadError;
565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool isUnsigned;
57506b8dec4ed3db3c60bf9e0dd37901f0cf3d6749Chris Lattner  bool isLong;        // This is *not* set for long long.
585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool isLongLong;
596e400c286b485e28d04a742ea87860ddfefa672eChris Lattner  bool isFloat;       // 1.0f
60506b8dec4ed3db3c60bf9e0dd37901f0cf3d6749Chris Lattner  bool isImaginary;   // 1.0i
61b79fe2d28777652a4df4f49dc876cbec060ca90eMike Stump  bool isMicrosoftInteger;  // Microsoft suffix extension i8, i16, i32, or i64.
621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  bool isIntegerLiteral() const {
64506b8dec4ed3db3c60bf9e0dd37901f0cf3d6749Chris Lattner    return !saw_period && !saw_exponent;
655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool isFloatingLiteral() const {
67506b8dec4ed3db3c60bf9e0dd37901f0cf3d6749Chris Lattner    return saw_period || saw_exponent;
685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
69b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smith
70b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smith  bool hasUDSuffix() const {
71b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smith    return saw_ud_suffix;
72b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smith  }
73b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smith  StringRef getUDSuffix() const {
74b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smith    assert(saw_ud_suffix);
75b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smith    return StringRef(SuffixBegin, ThisTokEnd - SuffixBegin);
76b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smith  }
77b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smith  unsigned getUDSuffixOffset() const {
78b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smith    assert(saw_ud_suffix);
79b453ad3214d00acc51c9aa702c76c58354d84b84Richard Smith    return SuffixBegin - ThisTokBegin;
805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
824ac537b0f07f2efb9fcf081f60d54e6cfb1cf2d5Richard Smith  static bool isValidUDSuffix(const LangOptions &LangOpts, StringRef Suffix);
834ac537b0f07f2efb9fcf081f60d54e6cfb1cf2d5Richard Smith
845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  unsigned getRadix() const { return radix; }
851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// GetIntegerValue - Convert this numeric literal value to an APInt that
875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// matches Val's input width.  If there is an overflow (i.e., if the unsigned
885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// value read is larger than the APInt's bits will hold), set Val to the low
895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// bits of the result and return true.  Otherwise, return false.
905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool GetIntegerValue(llvm::APInt &Val);
911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
92525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner  /// GetFloatValue - Convert this numeric literal to a floating value, using
93525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner  /// the specified APFloat fltSemantics (specifying float, double, etc).
94427d5af5b601985093b6b4b33ba1e30fc24d86dcTed Kremenek  /// The optional bool isExact (passed-by-reference) has its value
95427d5af5b601985093b6b4b33ba1e30fc24d86dcTed Kremenek  /// set to true if the returned APFloat can represent the number in the
96427d5af5b601985093b6b4b33ba1e30fc24d86dcTed Kremenek  /// literal exactly, and false otherwise.
9794c939dc1d4958b62ea5a89294dd8b2905f3191fJohn McCall  llvm::APFloat::opStatus GetFloatValue(llvm::APFloat &Result);
985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpprivate:
1001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
101368328c88bd46f471bbf85f05438b4f2eb95df5bChris Lattner  void ParseNumberStartingWithZero(SourceLocation TokLoc);
1021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// SkipHexDigits - Read and skip over any hex digits, up to End.
1045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// Return a pointer to the first non-hex digit or End.
1055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const char *SkipHexDigits(const char *ptr) {
1063f6f51e28231f65de9c2dd150a2d757b2162cfa3Jordan Rose    while (ptr != ThisTokEnd && isHexDigit(*ptr))
1075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      ptr++;
1085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return ptr;
1095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// SkipOctalDigits - Read and skip over any octal digits, up to End.
1125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// Return a pointer to the first non-hex digit or End.
1135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const char *SkipOctalDigits(const char *ptr) {
1145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    while (ptr != ThisTokEnd && ((*ptr >= '0') && (*ptr <= '7')))
1155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      ptr++;
1165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return ptr;
1175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// SkipDigits - Read and skip over any digits, up to End.
1205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// Return a pointer to the first non-hex digit or End.
1215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const char *SkipDigits(const char *ptr) {
1223f6f51e28231f65de9c2dd150a2d757b2162cfa3Jordan Rose    while (ptr != ThisTokEnd && isDigit(*ptr))
1235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      ptr++;
1245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return ptr;
1255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// SkipBinaryDigits - Read and skip over any binary digits, up to End.
1285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// Return a pointer to the first non-binary digit or End.
1295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const char *SkipBinaryDigits(const char *ptr) {
1305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    while (ptr != ThisTokEnd && (*ptr == '0' || *ptr == '1'))
1315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      ptr++;
1325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return ptr;
1335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
1365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// CharLiteralParser - Perform interpretation and semantic analysis of a
1385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// character literal.
1395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass CharLiteralParser {
1404bc11af9bed1d4a247e3db1fcb754d410ad99099Sanjiv Gupta  uint64_t Value;
1415cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor  tok::TokenKind Kind;
1422a1c363f38e59a5044fc349aa7e538a50954c244Eli Friedman  bool IsMultiChar;
1435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool HadError;
1445cc2c6eb67b6e5361bbe96f79b519fd62ec666d6Richard Smith  SmallString<32> UDSuffixBuf;
145dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith  unsigned UDSuffixOffset;
1465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
1475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  CharLiteralParser(const char *begin, const char *end,
1485cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor                    SourceLocation Loc, Preprocessor &PP,
1495cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor                    tok::TokenKind kind);
1505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool hadError() const { return HadError; }
1525cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor  bool isAscii() const { return Kind == tok::char_constant; }
1535cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor  bool isWide() const { return Kind == tok::wide_char_constant; }
1545cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor  bool isUTF16() const { return Kind == tok::utf16_char_constant; }
1555cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor  bool isUTF32() const { return Kind == tok::utf32_char_constant; }
1562a1c363f38e59a5044fc349aa7e538a50954c244Eli Friedman  bool isMultiChar() const { return IsMultiChar; }
1574bc11af9bed1d4a247e3db1fcb754d410ad99099Sanjiv Gupta  uint64_t getValue() const { return Value; }
1585cc2c6eb67b6e5361bbe96f79b519fd62ec666d6Richard Smith  StringRef getUDSuffix() const { return UDSuffixBuf; }
159dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith  unsigned getUDSuffixOffset() const {
160dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith    assert(!UDSuffixBuf.empty() && "no ud-suffix");
161dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith    return UDSuffixOffset;
162dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith  }
1635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
1645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// StringLiteralParser - This decodes string escape characters and performs
1665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// wide string analysis and Translation Phase #6 (concatenation of string
1675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// literals) (C99 5.1.1.2p1).
1685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass StringLiteralParser {
1696c66f07854c1334a1ce9eae1428d61d54182a6e1Chris Lattner  const SourceManager &SM;
1706c66f07854c1334a1ce9eae1428d61d54182a6e1Chris Lattner  const LangOptions &Features;
1716c66f07854c1334a1ce9eae1428d61d54182a6e1Chris Lattner  const TargetInfo &Target;
172d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie  DiagnosticsEngine *Diags;
1736c66f07854c1334a1ce9eae1428d61d54182a6e1Chris Lattner
1745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  unsigned MaxTokenLength;
1755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  unsigned SizeBound;
1765cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor  unsigned CharByteWidth;
1775cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor  tok::TokenKind Kind;
178f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith  SmallString<512> ResultBuf;
1795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  char *ResultPtr; // cursor
1805cc2c6eb67b6e5361bbe96f79b519fd62ec666d6Richard Smith  SmallString<32> UDSuffixBuf;
181dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith  unsigned UDSuffixToken;
182dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith  unsigned UDSuffixOffset;
1835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
184d217773f106856a11879ec79dc468efefaf2ee75Chris Lattner  StringLiteralParser(const Token *StringToks, unsigned NumStringToks,
185b90f4b3fb94056609da9cca5eef7358d95a363b2Douglas Gregor                      Preprocessor &PP, bool Complain = true);
1860833dd0675c25cbb35671c7a2006d511d5c77ce3Chris Lattner  StringLiteralParser(const Token *StringToks, unsigned NumStringToks,
1870833dd0675c25cbb35671c7a2006d511d5c77ce3Chris Lattner                      const SourceManager &sm, const LangOptions &features,
188d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie                      const TargetInfo &target, DiagnosticsEngine *diags = 0)
189403de3f932b5d1d3e4e58f69960000911d04dd2aArgyrios Kyrtzidis    : SM(sm), Features(features), Target(target), Diags(diags),
1905cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor      MaxTokenLength(0), SizeBound(0), CharByteWidth(0), Kind(tok::unknown),
1915cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor      ResultPtr(ResultBuf.data()), hadError(false), Pascal(false) {
1920833dd0675c25cbb35671c7a2006d511d5c77ce3Chris Lattner    init(StringToks, NumStringToks);
1930833dd0675c25cbb35671c7a2006d511d5c77ce3Chris Lattner  }
1940833dd0675c25cbb35671c7a2006d511d5c77ce3Chris Lattner
1950833dd0675c25cbb35671c7a2006d511d5c77ce3Chris Lattner
1965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool hadError;
197ee98ac5a1330db432b188dd2d38b6631aac47bf1Anders Carlsson  bool Pascal;
1981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
199686775deca8b8685eb90801495880e3abdd844c2Chris Lattner  StringRef GetString() const {
200686775deca8b8685eb90801495880e3abdd844c2Chris Lattner    return StringRef(ResultBuf.data(), GetStringLength());
20165aa6885818d4b4eea2e5a9d12085b2398148662Jay Foad  }
202403de3f932b5d1d3e4e58f69960000911d04dd2aArgyrios Kyrtzidis  unsigned GetStringLength() const { return ResultPtr-ResultBuf.data(); }
203dbb1ecc32ca122b07b7c98fd0a8f6f53985adaccChris Lattner
204dbb1ecc32ca122b07b7c98fd0a8f6f53985adaccChris Lattner  unsigned GetNumStringChars() const {
2055cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor    return GetStringLength() / CharByteWidth;
2061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
207719e61573f27c11057ecfe0dd8f141621602c571Chris Lattner  /// getOffsetOfStringByte - This function returns the offset of the
208719e61573f27c11057ecfe0dd8f141621602c571Chris Lattner  /// specified byte of the string data represented by Token.  This handles
209719e61573f27c11057ecfe0dd8f141621602c571Chris Lattner  /// advancing over escape sequences in the string.
21091f54ce93bec136fb9e18740b895cf1c1339524bChris Lattner  ///
21191f54ce93bec136fb9e18740b895cf1c1339524bChris Lattner  /// If the Diagnostics pointer is non-null, then this will do semantic
21291f54ce93bec136fb9e18740b895cf1c1339524bChris Lattner  /// checking of the string literal and emit errors and warnings.
2136c66f07854c1334a1ce9eae1428d61d54182a6e1Chris Lattner  unsigned getOffsetOfStringByte(const Token &TheTok, unsigned ByteNo) const;
2145cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor
21564f45a24b19eb89ff88f7c3ff0df9be8e861ac97Eli Friedman  bool isAscii() const { return Kind == tok::string_literal; }
21664f45a24b19eb89ff88f7c3ff0df9be8e861ac97Eli Friedman  bool isWide() const { return Kind == tok::wide_string_literal; }
21764f45a24b19eb89ff88f7c3ff0df9be8e861ac97Eli Friedman  bool isUTF8() const { return Kind == tok::utf8_string_literal; }
21864f45a24b19eb89ff88f7c3ff0df9be8e861ac97Eli Friedman  bool isUTF16() const { return Kind == tok::utf16_string_literal; }
21964f45a24b19eb89ff88f7c3ff0df9be8e861ac97Eli Friedman  bool isUTF32() const { return Kind == tok::utf32_string_literal; }
22064f45a24b19eb89ff88f7c3ff0df9be8e861ac97Eli Friedman  bool isPascal() const { return Pascal; }
2215cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor
2225cc2c6eb67b6e5361bbe96f79b519fd62ec666d6Richard Smith  StringRef getUDSuffix() const { return UDSuffixBuf; }
2235cc2c6eb67b6e5361bbe96f79b519fd62ec666d6Richard Smith
224dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith  /// Get the index of a token containing a ud-suffix.
225dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith  unsigned getUDSuffixToken() const {
226dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith    assert(!UDSuffixBuf.empty() && "no ud-suffix");
227dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith    return UDSuffixToken;
228dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith  }
229dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith  /// Get the spelling offset of the first byte of the ud-suffix.
230dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith  unsigned getUDSuffixOffset() const {
231dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith    assert(!UDSuffixBuf.empty() && "no ud-suffix");
232dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith    return UDSuffixOffset;
233dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith  }
234dd66be718f23c8149d74ae8b011b002e11e8d5baRichard Smith
2350833dd0675c25cbb35671c7a2006d511d5c77ce3Chris Lattnerprivate:
2360833dd0675c25cbb35671c7a2006d511d5c77ce3Chris Lattner  void init(const Token *StringToks, unsigned NumStringToks);
237e5f0588840b20897631cc8110344fd2745ef4caaRichard Smith  bool CopyStringFragment(const Token &Tok, const char *TokBegin,
238e5f0588840b20897631cc8110344fd2745ef4caaRichard Smith                          StringRef Fragment);
2393144749f8bf9bbf7c027f2161a930bff80ad6f72Argyrios Kyrtzidis  void DiagnoseLexingError(SourceLocation Loc);
2405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
2411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}  // end namespace clang
2435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2446fa5f0943a84233b2e1ec9716eae55643225bfd4Chris Lattner#endif
245