Files

127 lines
2.8 KiB
C++
Raw Permalink Normal View History

2026-03-28 16:54:11 +11:00
/***************************************************************************************
*
* IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
*
* By downloading, copying, installing or using the software you agree to this license.
* If you do not agree to this license, do not download, install,
* copy or use the software.
*
* Copyright (C) 2014-2024, Happytimesoft Corporation, all rights reserved.
*
* Redistribution and use in binary forms, with or without modification, are permitted.
*
* Unless required by applicable law or agreed to in writing, software distributed
* under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, either express or implied. See the License for the specific
* language governing permissions and limitations under the License.
*
****************************************************************************************/
#include "sys_inc.h"
#include "mpeg4.h"
static BOOL mpeg4_get_nibble(char const*& configStr, uint8& resultNibble)
{
char c = configStr[0];
if (c == '\0')
{
return FALSE; // we've reached the end
}
if (c >= '0' && c <= '9')
{
resultNibble = c - '0';
}
else if (c >= 'A' && c <= 'F')
{
resultNibble = 10 + c - 'A';
}
else if (c >= 'a' && c <= 'f')
{
resultNibble = 10 + c - 'a';
}
else
{
return FALSE;
}
++configStr; // move to the next nibble
return TRUE;
}
static BOOL mpeg4_get_byte(char const*& configStr, uint8& resultByte)
{
resultByte = 0; // by default, in case parsing fails
uint8 firstNibble;
if (!mpeg4_get_nibble(configStr, firstNibble))
{
return FALSE;
}
resultByte = firstNibble << 4;
uint8 secondNibble = 0;
if (!mpeg4_get_nibble(configStr, secondNibble) && configStr[0] != '\0')
{
// There's a second nibble, but it's malformed
return FALSE;
}
resultByte |= secondNibble;
return TRUE;
}
uint8 * mpeg4_parse_config(char const* configStr, uint32& configSize)
{
uint8 * config = NULL;
do
{
if (configStr == NULL)
{
break;
}
configSize = ((int)strlen(configStr)+1)/2;
config = (uint8 *) malloc(configSize);
if (config == NULL)
{
break;
}
uint32 i;
for (i = 0; i < configSize; ++i)
{
if (!mpeg4_get_byte(configStr, config[i]))
{
break;
}
}
if (i != configSize)
{
break; // part of the string was bad
}
return config;
} while (0);
configSize = 0;
if (config)
{
free(config);
}
return NULL;
}