⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wbxml_buffers.c

📁 WAP Binary XML 简单地说
💻 C
📖 第 1 页 / 共 2 页
字号:
        if (buff1 == NULL)            return -1;        else            return 1;    }    if (buff1->len < buff2->len)        len = buff1->len;    else        len = buff2->len;    if (len == 0)     {        if (buff1->len == 0 && buff2->len > 0)            return -1;        if (buff1->len > 0 && buff2->len == 0)            return 1;        return 0;    }    if ((ret = memcmp(buff1->data, buff2->data, len)) == 0)     {        if (buff1->len < buff2->len)            ret = -1;        else {            if (buff1->len > buff2->len)                ret = 1;        }    }    return ret;}WBXML_DECLARE(WB_LONG) wbxml_buffer_compare_cstr(WBXMLBuffer *buff, const WB_TINY *str){    WB_LONG ret = 0, len = 0;    if ((buff == NULL) || (str == NULL)) {        if ((buff == NULL) && (str == NULL))            return 0;        if (buff == NULL)            return -1;        else            return 1;    }    if (buff->len < WBXML_STRLEN(str))        len = buff->len;    else        len = WBXML_STRLEN(str);    if (len == 0)     {        if (buff->len == 0 && WBXML_STRLEN(str) > 0)            return -1;        if (buff->len > 0 && WBXML_STRLEN(str) == 0)            return 1;        return 0;    }    if ((ret = memcmp(buff->data, str, len)) == 0)     {        if (buff->len < WBXML_STRLEN(str))            ret = -1;        else {            if (buff->len > WBXML_STRLEN(str))                ret = 1;        }    }    return ret;}WBXML_DECLARE(WBXMLList *) wbxml_buffer_split_words_real(WBXMLBuffer *buff){    WB_UTINY *p = NULL;    WBXMLList *list = NULL;    WBXMLBuffer *word = NULL;    WB_ULONG i = 0, start = 0, end = 0;    if ((list = wbxml_list_create()) == NULL)        return NULL;    p = buff->data;    i = 0;    while (TRUE)    {        while (i < buff->len && isspace(*p)) {            ++p;            ++i;        }        start = i;        while (i < buff->len && !isspace(*p)) {            ++p;            ++i;        }        end = i;        if (start == end)            break;        if((word = wbxml_buffer_create(buff->data + start, end - start, WBXML_BUFFER_SPLIT_BLOCK)) == NULL) {            wbxml_list_destroy(list, wbxml_buffer_destroy_item);            return NULL;        }        wbxml_list_append(list, word);    }    return list;}WBXML_DECLARE(WB_BOOL) wbxml_buffer_search_char(WBXMLBuffer *to, WB_UTINY ch, WB_ULONG pos, WB_ULONG *result){    WB_UTINY *p = NULL;    if (to == NULL)        return FALSE;    if (pos >= to->len)        return FALSE;    if ((p = (WB_UTINY *) memchr(to->data + pos, ch, to->len - pos)) == NULL)        return FALSE;    if (result != NULL)        *result = p - to->data;    return TRUE;}WBXML_DECLARE(WB_BOOL) wbxml_buffer_search(WBXMLBuffer *to, WBXMLBuffer *search, WB_ULONG pos, WB_ULONG *result){    WB_UTINY first = 0;    if ((to == NULL) || (search == NULL))        return FALSE;    if (result != NULL)        *result = 0;    /* Always "find" an empty string */    if (search->len == 0)        return TRUE;    /* Check if 'search' is greater than 'to' */    if (search->len > to->len)        return FALSE;    /* We are searching for one char */    if (search->len == 1)        return wbxml_buffer_search_char(to, search->data[0], pos, result);    /* For each occurrence of search's first character in to, then check if the rest of needle follows.     * Stop if there are no more occurrences, or if the rest of 'search' can't possibly fit in 'to'. */    first = search->data[0];    while ((wbxml_buffer_search_char(to, first, pos, &pos)) &&            (to->len - pos >= search->len))     {        if (memcmp(to->data + pos, search->data, search->len) == 0) {            if (result != NULL)                *result = pos;            return TRUE;        }        pos++;    }    return FALSE;    }WBXML_DECLARE(WB_BOOL) wbxml_buffer_search_cstr(WBXMLBuffer *to, WB_UTINY *search, WB_ULONG pos, WB_ULONG *result){    WB_UTINY first = 0;    if ((to == NULL) || (search == NULL))        return FALSE;    if (result != NULL)        *result = 0;    /* Always "find" an empty string */    if (WBXML_STRLEN(search) == 0)        return TRUE;    /* Check if 'search' is greater than 'to' */    if (WBXML_STRLEN(search) > to->len)        return FALSE;    /* We are searching for one char */    if (WBXML_STRLEN(search) == 1)        return wbxml_buffer_search_char(to, search[0], pos, result);    /* For each occurrence of search's first character in to, then check if the rest of needle follows.     * Stop if there are no more occurrences, or if the rest of 'search' can't possibly fit in 'to'. */    first = search[0];    while ((wbxml_buffer_search_char(to, first, pos, &pos)) &&            (to->len - pos >= WBXML_STRLEN(search)))     {        if (memcmp(to->data + pos, search, WBXML_STRLEN(search)) == 0) {            if (result != NULL)                *result = pos;            return TRUE;        }        pos++;    }    return FALSE;}WBXML_DECLARE(WB_BOOL) wbxml_buffer_contains_only_whitespaces(WBXMLBuffer *buffer){    WB_ULONG i = 0;    if (buffer == NULL)        return FALSE;    for (i=0; i<buffer->len; i++) {        if (!isspace(*(buffer->data + i)))            return FALSE;    }    return TRUE;}WBXML_DECLARE(void) wbxml_buffer_hex_to_binary(WBXMLBuffer *buffer){    WB_UTINY *p = NULL;    WB_ULONG i = 0, len = 0;    if ((buffer == NULL) || buffer->is_static)        return;    p = buffer->data;    len = wbxml_buffer_len(buffer);    /* Convert ascii data to binary values */    for (i = 0; i < len; i++, p++) {        if (*p >= '0' && *p <= '9')            *p -= '0';        else if (*p >= 'a' && *p <= 'f')            *p = (WB_UTINY) (*p - 'a' + 10);        else if (*p >= 'A' && *p <= 'F')            *p = (WB_UTINY) (*p - 'A' + 10);        else {            /* Bad Bad ! There should be only digits in the buffer ! */            *p = 0;        }    }    /* De-hexing will compress data by factor of 2 */    len = buffer->len / 2;    for (i = 0; i < len; i++)        buffer->data[i] = (WB_UTINY) (buffer->data[i * 2] * 16 | buffer->data[i * 2 + 1]);    buffer->len = len;    buffer->data[len] = '\0';}WBXML_DECLARE(WB_BOOL) wbxml_buffer_binary_to_hex(WBXMLBuffer *buffer, WB_BOOL uppercase){    WB_UTINY *hexits = NULL;    WB_LONG i = 0;    if ((buffer == NULL) || buffer->is_static)        return FALSE;    if (wbxml_buffer_len(buffer) == 0)        return TRUE;    hexits = (WB_UTINY *)(uppercase ? "0123456789ABCDEF" : "0123456789abcdef");    /* Grows the Buffer size by 2 */    grow_buff(buffer, buffer->len * 2);    /* In-place modification must be done back-to-front to avoid     * overwriting the data while we read it.  Even the order of     * the two assignments is important, to get i == 0 right.      */    for (i = buffer->len - 1; i >= 0; i--) {        buffer->data[i * 2 + 1] = hexits[buffer->data[i] % 16];        buffer->data[i * 2] = hexits[(buffer->data[i] / 16) & 0xf];    }    buffer->len = buffer->len * 2;    buffer->data[buffer->len] = '\0';    return TRUE;}WBXML_DECLARE(void) wbxml_buffer_remove_trailing_zeros(WBXMLBuffer **buffer){    WB_UTINY ch = 0;    if ((buffer == NULL) || (*buffer == NULL))        return;    while ((*buffer)->len > 0) {        if (wbxml_buffer_get_char(*buffer, wbxml_buffer_len(*buffer) - 1, &ch) && (ch == '\0'))            wbxml_buffer_delete(*buffer, wbxml_buffer_len(*buffer) - 1, 1);        else            return;    }}/********************************** *    Private functions *//** * @brief Add space for at least 'size' octets * @param buffer The buffer * @param size The size to add * @return TRUE is space successfully reserved, FALSE is size was negative, buffer was NULL or if not enough memory */static WB_BOOL grow_buff(WBXMLBuffer *buffer, WB_ULONG size){    if ((buffer == NULL) || buffer->is_static || (size < 0))        return FALSE;            /* Make room for the invisible terminating NUL */    size++;     if ((buffer->len + size) > buffer->malloced) {        if ((buffer->malloced + buffer->malloc_block) < (buffer->len + size))            buffer->malloced = buffer->len + size + buffer->malloc_block;        else            buffer->malloced = buffer->malloced + buffer->malloc_block;                    buffer->data = wbxml_realloc(buffer->data, buffer->malloced);        if (buffer->data == NULL)            return FALSE;    }    return TRUE;}/** * @brief Insert data into a Generic Buffer * @param buffer The Generic Buffer * @param pos Position in Generic Buffer where to insert data * @param data Data to insert * @param len Data length * @return TRUE is data inserted, FALSE if not */static WB_BOOL insert_data(WBXMLBuffer *buffer, WB_ULONG pos, const WB_UTINY *data, WB_ULONG len){    if ((buffer == NULL) || buffer->is_static || (len == 0) || (pos > buffer->len))        return FALSE;    if (!grow_buff(buffer, len))        return FALSE;    if (buffer->len > pos) {            /* Only if neccessary */        memmove(buffer->data + pos + len, buffer->data + pos, buffer->len - pos);    }    memcpy(buffer->data + pos, data, len);    buffer->len += len;    buffer->data[buffer->len] = '\0';    return TRUE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -