aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/PrintfFormatString.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2010-01-28 02:46:17 +0000
committerTed Kremenek <kremenek@apple.com>2010-01-28 02:46:17 +0000
commita8d8fec7876666d90bb2a144d3b832b2d89a088a (patch)
treee744829211dcd20f9af0c0d61a8b624919a6c45d /lib/Analysis/PrintfFormatString.cpp
parentd2dcece5882215e92a80bff8a7b7fd2fd81d7086 (diff)
Add position of conversion specifier character to 'ConversionSpecifier'.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@94739 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/PrintfFormatString.cpp')
-rw-r--r--lib/Analysis/PrintfFormatString.cpp57
1 files changed, 31 insertions, 26 deletions
diff --git a/lib/Analysis/PrintfFormatString.cpp b/lib/Analysis/PrintfFormatString.cpp
index 81752e9c4c..544956ac41 100644
--- a/lib/Analysis/PrintfFormatString.cpp
+++ b/lib/Analysis/PrintfFormatString.cpp
@@ -189,39 +189,42 @@ static FormatSpecifierResult ParseFormatSpecifier(FormatStringHandler &H,
}
// Finally, look for the conversion specifier.
- ConversionSpecifier::Kind cs;
- switch (*I) {
+ const char *conversionPosition = I++;
+ ConversionSpecifier::Kind k;
+ switch (*conversionPosition) {
default:
- H.HandleInvalidConversionSpecifier(I);
+ H.HandleInvalidConversionSpecifier(conversionPosition);
return true;
// C99: 7.19.6.1 (section 8).
- case 'd': cs = ConversionSpecifier::dArg; break;
- case 'i': cs = ConversionSpecifier::iArg; break;
- case 'o': cs = ConversionSpecifier::oArg; break;
- case 'u': cs = ConversionSpecifier::uArg; break;
- case 'x': cs = ConversionSpecifier::xArg; break;
- case 'X': cs = ConversionSpecifier::XArg; break;
- case 'f': cs = ConversionSpecifier::fArg; break;
- case 'F': cs = ConversionSpecifier::FArg; break;
- case 'e': cs = ConversionSpecifier::eArg; break;
- case 'E': cs = ConversionSpecifier::EArg; break;
- case 'g': cs = ConversionSpecifier::gArg; break;
- case 'G': cs = ConversionSpecifier::GArg; break;
- case 'a': cs = ConversionSpecifier::aArg; break;
- case 'A': cs = ConversionSpecifier::AArg; break;
- case 'c': cs = ConversionSpecifier::IntAsCharArg; break;
- case 's': cs = ConversionSpecifier::CStrArg; break;
- case 'p': cs = ConversionSpecifier::VoidPtrArg; break;
- case 'n': cs = ConversionSpecifier::OutIntPtrArg; break;
- case '%': cs = ConversionSpecifier::PercentArg; break;
+ case 'd': k = ConversionSpecifier::dArg; break;
+ case 'i': k = ConversionSpecifier::iArg; break;
+ case 'o': k = ConversionSpecifier::oArg; break;
+ case 'u': k = ConversionSpecifier::uArg; break;
+ case 'x': k = ConversionSpecifier::xArg; break;
+ case 'X': k = ConversionSpecifier::XArg; break;
+ case 'f': k = ConversionSpecifier::fArg; break;
+ case 'F': k = ConversionSpecifier::FArg; break;
+ case 'e': k = ConversionSpecifier::eArg; break;
+ case 'E': k = ConversionSpecifier::EArg; break;
+ case 'g': k = ConversionSpecifier::gArg; break;
+ case 'G': k = ConversionSpecifier::GArg; break;
+ case 'a': k = ConversionSpecifier::aArg; break;
+ case 'A': k = ConversionSpecifier::AArg; break;
+ case 'c': k = ConversionSpecifier::IntAsCharArg; break;
+ case 's': k = ConversionSpecifier::CStrArg; break;
+ case 'p': k = ConversionSpecifier::VoidPtrArg; break;
+ case 'n': k = ConversionSpecifier::OutIntPtrArg; break;
+ case '%': k = ConversionSpecifier::PercentArg; break;
// Objective-C.
- case '@': cs = ConversionSpecifier::ObjCObjArg; break;
+ case '@': k = ConversionSpecifier::ObjCObjArg; break;
}
- FS.setConversionSpecifier(cs);
+ FS.setConversionSpecifier(ConversionSpecifier(conversionPosition, k));
return FormatSpecifierResult(Start, FS);
}
-bool ParseFormatSring(FormatStringHandler &H, const char *I, const char *E) {
+namespace clang { namespace analyze_printf {
+bool ParseFormatString(FormatStringHandler &H,
+ const char *I, const char *E) {
// Keep looking for a format specifier until we have exhausted the string.
while (I != E) {
const FormatSpecifierResult &FSR = ParseFormatSpecifier(H, I, E);
@@ -233,11 +236,13 @@ bool ParseFormatSring(FormatStringHandler &H, const char *I, const char *E) {
if (!FSR.hasValue())
break;
// We have a format specifier. Pass it to the callback.
- if (!H.HandleFormatSpecifier(FSR.getValue(), FSR.getStart(), I))
+ if (!H.HandleFormatSpecifier(FSR.getValue(), FSR.getStart(),
+ I - FSR.getStart()))
return false;
}
assert(I == E && "Format string not exhausted");
return false;
}
+}}
FormatStringHandler::~FormatStringHandler() {}