summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2019-06-24 14:11:53 +0200
committerRobin Gareus <robin@gareus.org>2019-06-24 14:11:53 +0200
commit336d12274536eee5863f507f305da5e661948118 (patch)
treef51592d46a39cd5bcb925e8bff3e4eb3626c39d2
parentd98bba43f173aa5e06c39f32c167ec207be41879 (diff)
Directly allocate a std::string -- remove strndup()/free()
strndup() is a GNU-extension, not available to MSVC and default macOS/X builds. g_strndup() would have been an alternative. Directly constructing std::string() is however more efficient.
-rw-r--r--ptformat.cc49
-rw-r--r--ptformat/ptformat.h2
2 files changed, 14 insertions, 37 deletions
diff --git a/ptformat.cc b/ptformat.cc
index 0a29210..977d1bc 100644
--- a/ptformat.cc
+++ b/ptformat.cc
@@ -702,11 +702,11 @@ PTFFormat::parseheader(void) {
return found;
}
-char *
-PTFFormat::parsestring(uint32_t pos) {
+std::string
+PTFFormat::parsestring (uint32_t pos) {
uint32_t length = u_endian_read4(&_ptfunxored[pos], is_bigendian);
pos += 4;
- return strndup((const char *)&_ptfunxored[pos], length);
+ return std::string((const char *)&_ptfunxored[pos], length);
}
bool
@@ -714,7 +714,6 @@ PTFFormat::parseaudio(void) {
bool found = false;
uint32_t nwavs, i, n;
uint32_t pos = 0;
- char *str;
std::string wavtype;
std::string wavname;
@@ -733,13 +732,9 @@ PTFFormat::parseaudio(void) {
pos = c->offset + 11;
// Found wav list
for (i = n = 0; (pos < c->offset + c->block_size) && (n < nwavs); i++) {
- str = parsestring(pos);
- wavname = std::string(str);
- free(str);
+ wavname = parsestring(pos);
pos += wavname.size() + 4;
- str = strndup((const char *)&_ptfunxored[pos], 4);
- wavtype = std::string(str);
- free(str);
+ wavtype = std::string((const char*)&_ptfunxored[pos], 4);
pos += 9;
if (foundin(wavname, std::string(".grp")))
continue;
@@ -920,7 +915,6 @@ PTFFormat::parserest(void) {
uint32_t nch;
uint16_t ch_map[MAX_CHANNELS_PER_TRACK];
bool found = false;
- char *reg;
std::string regionname, trackname, midiregionname;
rindex = 0;
@@ -937,9 +931,7 @@ PTFFormat::parserest(void) {
found = true;
j = c->offset + 11;
- reg = parsestring(j);
- regionname = std::string(reg);
- free(reg);
+ regionname = parsestring(j);
j += regionname.size() + 4;
r.name = regionname;
@@ -963,8 +955,7 @@ PTFFormat::parserest(void) {
c != b->child.end(); ++c) {
if (c->content_type == 0x1014) {
j = c->offset + 2;
- reg = parsestring(j);
- trackname = std::string(reg);
+ trackname = parsestring(j);
j += trackname.size() + 5;
nch = u_endian_read4(&_ptfunxored[j], is_bigendian);
j += 4;
@@ -983,7 +974,6 @@ PTFFormat::parserest(void) {
//verbose_printf("%s : %d(%d)\n", reg, nch, ch_map[0]);
j += 2;
}
- free(reg);
}
}
}
@@ -1000,9 +990,7 @@ PTFFormat::parserest(void) {
c != b->child.end(); ++c) {
if (c->content_type == 0x251a) {
j = c->offset + 4;
- reg = parsestring(j);
- trackname = std::string(reg);
- free(reg);
+ trackname = parsestring(j);
j += trackname.size() + 4 + 18;
//tindex = u_endian_read4(&_ptfunxored[j], is_bigendian);
@@ -1034,9 +1022,7 @@ PTFFormat::parserest(void) {
for (vector<PTFFormat::block_t>::iterator c = b->child.begin();
c != b->child.end(); ++c) {
if (c->content_type == 0x1011) {
- reg = parsestring(c->offset + 2);
- regionname = std::string(reg);
- free(reg);
+ regionname = parsestring(c->offset + 2);
for (vector<PTFFormat::block_t>::iterator d = c->child.begin();
d != c->child.end(); ++d) {
if (d->content_type == 0x100f) {
@@ -1068,9 +1054,7 @@ PTFFormat::parserest(void) {
for (vector<PTFFormat::block_t>::iterator c = b->child.begin();
c != b->child.end(); ++c) {
if (c->content_type == 0x1052) {
- reg = parsestring(c->offset + 2);
- regionname = std::string(reg);
- free(reg);
+ regionname = parsestring(c->offset + 2);
for (vector<PTFFormat::block_t>::iterator d = c->child.begin();
d != c->child.end(); ++d) {
if (d->content_type == 0x1050) {
@@ -1140,7 +1124,6 @@ PTFFormat::parsemidi(void) {
std::vector<mchunk> midichunks;
midi_ev_t m;
- char *str;
std::string regionname, trackname;
rindex = 0;
@@ -1193,8 +1176,7 @@ PTFFormat::parsemidi(void) {
d != c->child.end(); ++d) {
if ((d->content_type == 0x1007) || (d->content_type == 0x2628)) {
j = d->offset + 2;
- str = parsestring(j);
- midiregionname = std::string(str);
+ midiregionname = parsestring(j);
j += 4 + midiregionname.size();
parse_three_point(j, region_pos, zero_ticks, midi_len);
j = d->offset + d->block_size;
@@ -1211,7 +1193,6 @@ PTFFormat::parsemidi(void) {
_midiregions.push_back(r);
//verbose_printf("MIDI %s : r(%d) (%llu, %llu, %llu)\n", str, rindex, zero_ticks, region_pos, midi_len);
//dump_block(*d, 1);
- free(str);
}
}
}
@@ -1232,8 +1213,7 @@ PTFFormat::parsemidi(void) {
if (d->content_type == 0x2628) {
count = 0;
j = d->offset + 2;
- str = parsestring(j);
- regionname = std::string(str);
+ regionname = parsestring(j);
j += 4 + regionname.size();
parse_three_point(j, start, offset, length);
j = d->offset + d->block_size + 2;
@@ -1280,7 +1260,6 @@ PTFFormat::parsemidi(void) {
verbose_printf("%s : MIDI region mr(%d) ?(%d) (%llu %llu %llu)\n", str, mindex, n, start, offset, length);
mindex++;
}
- free(str);
}
}
}
@@ -1297,9 +1276,7 @@ PTFFormat::parsemidi(void) {
for (vector<PTFFormat::block_t>::iterator c = b->child.begin();
c != b->child.end(); ++c) {
if (c->content_type == 0x1057) {
- str = parsestring(c->offset + 2);
- regionname = std::string(str);
- free(str);
+ regionname = parsestring(c->offset + 2);
for (vector<PTFFormat::block_t>::iterator d = c->child.begin();
d != c->child.end(); ++d) {
if (d->content_type == 0x1056) {
diff --git a/ptformat/ptformat.h b/ptformat/ptformat.h
index 6fb6ceb..3426d7e 100644
--- a/ptformat/ptformat.h
+++ b/ptformat/ptformat.h
@@ -253,7 +253,7 @@ private:
bool foundin(std::string const& haystack, std::string const& needle);
int64_t foundat(unsigned char *haystack, uint64_t n, const char *needle);
- char *parsestring(uint32_t pos);
+ std::string parsestring(uint32_t pos);
const std::string get_content_description(uint16_t ctype);
int parse(void);
void parseblocks(void);