diff options
Diffstat (limited to 'dwarfgen/strtabdata.h')
-rwxr-xr-x | dwarfgen/strtabdata.h | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/dwarfgen/strtabdata.h b/dwarfgen/strtabdata.h new file mode 100755 index 0000000..d005055 --- /dev/null +++ b/dwarfgen/strtabdata.h @@ -0,0 +1,65 @@ +#ifndef STRTABDATA_H +#define STRTABDATA_H +/* + Copyright (C) 2010-2011 David Anderson. + + This program is free software; you can redistribute it and/or modify it + under the terms of version 2 of the GNU General Public License as + published by the Free Software Foundation. + + This program is distributed in the hope that it would be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + You should have received a copy of the GNU General Public License along + with this program; if not, write the Free Software Foundation, Inc., 51 + Franklin Street - Fifth Floor, Boston MA 02110-1301, USA. + +*/ + + +// strtabdata.h +// Creates a string table in a way consistent with +// elf string tables. The zero index is a null byte always. + +class strtabdata { +public: + strtabdata(): data_(new char[1000]), + datalen_(1000), nexttouse_(0) { data_[0] = 0; nexttouse_ = 1;}; + ~strtabdata() { delete[]data_; }; + unsigned addString(const std::string & newstr) { + // The 1 is for the terminating null byte. + unsigned nsz = newstr.size() +1; + unsigned needed = nexttouse_ + nsz; + if (needed >= datalen_) { + unsigned baseincr = nsz; + unsigned altincr = datalen_*2; + if(altincr> baseincr) { + baseincr = altincr; + } + unsigned newsize = datalen_ + baseincr; + char *newdata = new char [newsize]; + memcpy(newdata, data_, nexttouse_); + delete [] data_; + data_ = newdata; + datalen_ = newsize; + } + memcpy(data_ + nexttouse_, newstr.c_str(),nsz); + unsigned newstrindex = nexttouse_; + nexttouse_ += nsz; + return newstrindex; + }; + void *exposedata() {return (void *)data_;}; + unsigned exposelen() const {return nexttouse_;}; +private: + char * data_; + + // datalen_ is the size in bytes pointed to by data_ . + unsigned datalen_; + + // nexttouse_ is the index of the next (unused) byte in + // data_ , so it is also the amount of space in data_ that + // is in use. + unsigned nexttouse_; +}; +#endif /* STRTABDATA_H */ |