diff options
author | Chris Lattner <sabre@nondot.org> | 2001-10-29 13:28:00 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2001-10-29 13:28:00 +0000 |
commit | 7c41223c6bf690e0ddee236af028944cd0a70225 (patch) | |
tree | d695dd5b9787c9130dbab6e0dee5df8ee9663dfb /support/lib | |
parent | b97d98ec7ce05847e7123867404f602d5d71c559 (diff) | |
download | external_llvm-7c41223c6bf690e0ddee236af028944cd0a70225.zip external_llvm-7c41223c6bf690e0ddee236af028944cd0a70225.tar.gz external_llvm-7c41223c6bf690e0ddee236af028944cd0a70225.tar.bz2 |
Checkin of C string stuff. Fix several bugs, including most escape codes being
printed as '\\n' instead of their correct code. Also print things in octal instead of hex.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1022 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'support/lib')
-rw-r--r-- | support/lib/Support/StringExtras.cpp | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/support/lib/Support/StringExtras.cpp b/support/lib/Support/StringExtras.cpp new file mode 100644 index 0000000..2229df0 --- /dev/null +++ b/support/lib/Support/StringExtras.cpp @@ -0,0 +1,66 @@ + + +#include "llvm/Support/StringExtras.h" +#include "llvm/ConstPoolVals.h" +#include "llvm/DerivedTypes.h" + +// Can we treat the specified array as a string? Only if it is an array of +// ubytes or non-negative sbytes. +// +bool isStringCompatible(ConstPoolArray *CPA) { + const Type *ETy = cast<ArrayType>(CPA->getType())->getElementType(); + if (ETy == Type::UByteTy) return true; + if (ETy != Type::SByteTy) return false; + + for (unsigned i = 0; i < CPA->getNumOperands(); ++i) + if (cast<ConstPoolSInt>(CPA->getOperand(i))->getValue() < 0) + return false; + + return true; +} + +// toOctal - Convert the low order bits of X into an octal letter +static inline char toOctal(int X) { + return (X&7)+'0'; +} + +// getAsCString - Return the specified array as a C compatible string, only if +// the predicate isStringCompatible is true. +// +string getAsCString(ConstPoolArray *CPA) { + if (isStringCompatible(CPA)) { + string Result; + const Type *ETy = cast<ArrayType>(CPA->getType())->getElementType(); + Result = "\""; + for (unsigned i = 0; i < CPA->getNumOperands(); ++i) { + unsigned char C = (ETy == Type::SByteTy) ? + (unsigned char)cast<ConstPoolSInt>(CPA->getOperand(i))->getValue() : + (unsigned char)cast<ConstPoolUInt>(CPA->getOperand(i))->getValue(); + + if (isprint(C)) { + Result += C; + } else { + switch(C) { + case '\a': Result += "\\a"; break; + case '\b': Result += "\\b"; break; + case '\f': Result += "\\f"; break; + case '\n': Result += "\\n"; break; + case '\r': Result += "\\r"; break; + case '\t': Result += "\\t"; break; + case '\v': Result += "\\v"; break; + default: + Result += '\\'; + Result += toOctal(C >> 6); + Result += toOctal(C >> 3); + Result += toOctal(C >> 0); + break; + } + } + } + Result += "\""; + + return Result; + } else { + return CPA->getStrValue(); + } +} |