static int prvParseFragmentAckLength()

in src/source/restful/kvs/restapi_kvs.c [324:381]


static int prvParseFragmentAckLength(char *pcSrc, size_t uLen, size_t *puMsgLen, size_t *puBytesRead)
{
    int xRes = KVS_ERRNO_NONE;
    size_t uMsgLen = 0;
    size_t uBytesRead = 0;
    size_t i = 0;
    char c = 0;

    if (pcSrc == NULL || uLen == 0 || puMsgLen == NULL || puBytesRead == NULL)
    {
        xRes = KVS_ERRNO_FAIL;
    }
    else
    {
        for (i = 0; i < uLen - 1; i++)
        {
            c = toupper(pcSrc[i]);
            if (isxdigit(c))
            {
                if (c >= '0' && c <= '9')
                {
                    uMsgLen = uMsgLen * 16 + (c - '0');
                }
                else
                {
                    uMsgLen = uMsgLen * 16 + (c - 'A') + 10;
                }
            }
            else if (c == '\r')
            {
                if (pcSrc[i + 1] == '\n')
                {
                    uBytesRead = i + 2;
                    break;
                }
            }
            else
            {
                xRes = KVS_ERRNO_FAIL;
            }
        }
    }

    if (xRes == KVS_ERRNO_NONE)
    {
        if (uBytesRead < 3 || (uBytesRead + uMsgLen + 2) > uLen || pcSrc[uBytesRead + uMsgLen] != '\r' || pcSrc[uBytesRead + uMsgLen + 1] != '\n')
        {
            xRes = KVS_ERRNO_FAIL;
        }
        else
        {
            *puMsgLen = uMsgLen;
            *puBytesRead = uBytesRead;
        }
    }

    return xRes;
}