📄 wbxml_buffers.c
字号:
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 + -