summaryrefslogtreecommitdiff
path: root/src/libaudtag/id3/id3-common.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/libaudtag/id3/id3-common.cc')
-rw-r--r--src/libaudtag/id3/id3-common.cc12
1 files changed, 6 insertions, 6 deletions
diff --git a/src/libaudtag/id3/id3-common.cc b/src/libaudtag/id3/id3-common.cc
index 78e3d06..5d6f80a 100644
--- a/src/libaudtag/id3/id3-common.cc
+++ b/src/libaudtag/id3/id3-common.cc
@@ -34,12 +34,12 @@
#define ID3_ENCODING_UTF16_BE 2
#define ID3_ENCODING_UTF8 3
-static void * memchr16 (const void * mem, int16_t chr, int len)
+static const void * find_nul_utf16 (const void * mem, int len)
{
while (len >= 2)
{
- if (* (int16_t *) mem == chr)
- return (void *) mem;
+ if (! ((const char *) mem)[0] && ! ((const char *) mem)[1])
+ return mem;
mem = (char *) mem + 2;
len -= 2;
@@ -52,7 +52,7 @@ static void id3_strnlen (const char * data, int size, int encoding,
int * bytes_without_nul, int * bytes_with_nul)
{
bool is16 = (encoding == ID3_ENCODING_UTF16 || encoding == ID3_ENCODING_UTF16_BE);
- char * nul = is16 ? (char *) memchr16 (data, 0, size) : (char *) memchr (data, 0, size);
+ auto nul = (const char *) (is16 ? find_nul_utf16 (data, size) : memchr (data, 0, size));
if (nul)
{
@@ -181,8 +181,8 @@ static bool decode_rva_block (const char * * _data, int * _size,
return false;
* channel = (unsigned char) data[0];
- * adjustment = (char) data[1]; /* first byte is signed */
- * adjustment = (* adjustment << 8) | (unsigned char) data[2];
+ /* first byte is signed, but C/C++ allows shifting only unsigned values */
+ * adjustment = (int16_t) ((unsigned char) data[1] << 8) | (unsigned char) data[2];
* adjustment_unit = 512;
peak_bits = (unsigned char) data[3];