mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-22 07:32:48 +00:00
1d4f28c6bc
Having two ways to do this doesn't seem terribly helpful and consistently using the insert version (which we already has) seems like it'll make the code easier to understand to anyone working with standard data structures. (I also updated many references to the Entry's key and value to use first() and second instead of getKey{Data,Length,} and get/setValue - for similar consistency) Also removes the GetOrCreateValue functions so there's less surface area to StringMap to fix/improve/change/accommodate move semantics, etc. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@222319 91177308-0d34-0410-b5e6-96231b3b80d8
84 lines
2.4 KiB
C++
84 lines
2.4 KiB
C++
//===- StringToOffsetTable.h - Emit a big concatenated string ---*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_TABLEGEN_STRINGTOOFFSETTABLE_H
|
|
#define LLVM_TABLEGEN_STRINGTOOFFSETTABLE_H
|
|
|
|
#include "llvm/ADT/SmallString.h"
|
|
#include "llvm/ADT/StringExtras.h"
|
|
#include "llvm/ADT/StringMap.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
#include <cctype>
|
|
|
|
namespace llvm {
|
|
|
|
/// StringToOffsetTable - This class uniques a bunch of nul-terminated strings
|
|
/// and keeps track of their offset in a massive contiguous string allocation.
|
|
/// It can then output this string blob and use indexes into the string to
|
|
/// reference each piece.
|
|
class StringToOffsetTable {
|
|
StringMap<unsigned> StringOffset;
|
|
std::string AggregateString;
|
|
|
|
public:
|
|
unsigned GetOrAddStringOffset(StringRef Str, bool appendZero = true) {
|
|
auto IterBool =
|
|
StringOffset.insert(std::make_pair(Str, AggregateString.size()));
|
|
if (IterBool.second) {
|
|
// Add the string to the aggregate if this is the first time found.
|
|
AggregateString.append(Str.begin(), Str.end());
|
|
if (appendZero)
|
|
AggregateString += '\0';
|
|
}
|
|
|
|
return IterBool.first->second;
|
|
}
|
|
|
|
void EmitString(raw_ostream &O) {
|
|
// Escape the string.
|
|
SmallString<256> Str;
|
|
raw_svector_ostream(Str).write_escaped(AggregateString);
|
|
AggregateString = Str.str();
|
|
|
|
O << " \"";
|
|
unsigned CharsPrinted = 0;
|
|
for (unsigned i = 0, e = AggregateString.size(); i != e; ++i) {
|
|
if (CharsPrinted > 70) {
|
|
O << "\"\n \"";
|
|
CharsPrinted = 0;
|
|
}
|
|
O << AggregateString[i];
|
|
++CharsPrinted;
|
|
|
|
// Print escape sequences all together.
|
|
if (AggregateString[i] != '\\')
|
|
continue;
|
|
|
|
assert(i+1 < AggregateString.size() && "Incomplete escape sequence!");
|
|
if (isdigit(AggregateString[i+1])) {
|
|
assert(isdigit(AggregateString[i+2]) &&
|
|
isdigit(AggregateString[i+3]) &&
|
|
"Expected 3 digit octal escape!");
|
|
O << AggregateString[++i];
|
|
O << AggregateString[++i];
|
|
O << AggregateString[++i];
|
|
CharsPrinted += 3;
|
|
} else {
|
|
O << AggregateString[++i];
|
|
++CharsPrinted;
|
|
}
|
|
}
|
|
O << "\"";
|
|
}
|
|
};
|
|
|
|
} // end namespace llvm
|
|
|
|
#endif
|