Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 11 additions & 7 deletions examples/array/simple.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,25 +10,29 @@

#define TEST_LOOP 100
#define TEST_SIZE 64
BFDEV_DEFINE_ARRAY(test_array, NULL, TEST_SIZE);

int
main(int argc, const char *argv[])
{
BFDEV_DEFINE_ARRAY(array, NULL, TEST_SIZE);
unsigned int count;
void *array;

bfdev_array_append(&array, 0, 0);

for (count = 0; count < TEST_LOOP; ++count) {
unsigned int num;
void *buff;

num = rand() % TEST_SIZE;
array = bfdev_array_push(&test_array, num);
memset(array, 0, TEST_SIZE * num);
buff = bfdev_array_push(&array, num);
if (!buff)
return 1;

printf("array bfdev_array_push test: %02u: %u\n",
count, num);
memset(buff, 0, TEST_SIZE * num);
printf("array bfdev_array_push test: %02u: %u\n", count, num);
}

bfdev_array_release(&test_array);
bfdev_array_release(&array);

return 0;
}
15 changes: 13 additions & 2 deletions include/bfdev/array.h
Original file line number Diff line number Diff line change
Expand Up @@ -152,16 +152,27 @@ extern void *
bfdev_array_peek(const bfdev_array_t *array, unsigned long num);

/**
* bfdev_array_append() - append memory into the array.
* bfdev_array_append() - append elements into the array.
* @array: the array object.
* @data: the data to append.
* @data: the elements to append.
* @num: the number of element to append.
*
* Return 0 on success or a negative error code on failure.
*/
extern int
bfdev_array_append(bfdev_array_t *array, const void *data, unsigned long num);

/**
* bfdev_array_remove() - remove elements from the array.
* @array: the array object.
* @index: the index of the first elements to remove.
* @num: the number of element to remove.
*
* Return 0 on success or a negative error code on failure.
*/
extern int
bfdev_array_remove(bfdev_array_t *array, unsigned long index, unsigned long num);

/**
* bfdev_array_resize() - directly set the number of elements in array.
* @array: the array object.
Expand Down
3 changes: 3 additions & 0 deletions include/bfdev/port/string.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ BFDEV_BEGIN_DECLS
extern void *
bfdev_memcpy(void *dest, const void *src, bfdev_size_t n);

extern void *
bfdev_memmove(void *dest, const void *src, bfdev_size_t n);

extern void *
bfdev_memset(void *s, int c, bfdev_size_t n);

Expand Down
3 changes: 3 additions & 0 deletions include/port/string.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ BFDEV_BEGIN_DECLS
extern void *
bfport_memcpy(void *dest, const void *src, bfdev_size_t n);

extern void *
bfport_memmove(void *dest, const void *src, bfdev_size_t n);

extern void *
bfport_memset(void *s, int c, bfdev_size_t n);

Expand Down
33 changes: 30 additions & 3 deletions port/generic/string.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,33 @@ bfport_memcpy(void *dest, const void *src, bfdev_size_t n)
return dest;
}

__bfdev_weak void *
bfport_memmove(void *dest, const void *src, bfdev_size_t n)
{
char *tmp;
const char *s;

if (dest <= src) {
tmp = dest;
s = src;

while (n--)
*tmp++ = *s++;

return dest;
}

tmp = dest;
tmp += n;
s = src;
s += n;

while (n--)
*--tmp = *--s;

return dest;
}

__bfdev_weak void *
bfport_memset(void *s, int c, bfdev_size_t n)
{
Expand All @@ -41,7 +68,8 @@ bfport_memcmp(const void *s1, const void *s2, bfdev_size_t n)

res = 0;
for (su1 = s1, su2 = s2; 0 < n; ++su1, ++su2, n--) {
if ((res = *su1 - *su2) != 0)
res = *su1 - *su2;
if (res != 0)
break;
}

Expand Down Expand Up @@ -117,8 +145,7 @@ bfport_strcpy(char *dest, const char *src)
unsigned char *tmp;

tmp = dest;
while ((*tmp++ = *src++) != '\0')
;
while ((*tmp++ = *src++) != '\0');

return dest;
}
Expand Down
6 changes: 6 additions & 0 deletions port/posix/string.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,12 @@ bfport_memcpy(void *dest, const void *src, bfdev_size_t n)
return memcpy(dest, src, n);
}

void *
bfport_memmove(void *dest, const void *src, bfdev_size_t n)
{
return memmove(dest, src, n);
}

void *
bfport_memset(void *s, int c, bfdev_size_t n)
{
Expand Down
28 changes: 28 additions & 0 deletions src/array.c
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,34 @@ bfdev_array_append(bfdev_array_t *array, const void *data, unsigned long num)
return -BFDEV_ENOERR;
}

export int
bfdev_array_remove(bfdev_array_t *array, unsigned long index, unsigned long num)
{
unsigned long cut;
void *start, *end;
bfdev_size_t behind;
bfdev_bool overflow;

if (bfdev_unlikely(index >= array->index))
return -BFDEV_EFBIG;

overflow = bfdev_overflow_check_add(index, num, &cut);
if (bfdev_unlikely(overflow))
return -BFDEV_EOVERFLOW;

if (bfdev_unlikely(cut > array->index))
return -BFDEV_EFBIG;

start = array->data + bfdev_array_offset(array, index);
end = array->data + bfdev_array_offset(array, cut);
behind = bfdev_array_offset(array, array->index - cut);

bfdev_memmove(start, end, behind);
array->index -= num;

return -BFDEV_ENOERR;
}

export int
bfdev_array_resize(bfdev_array_t *array, unsigned long num)
{
Expand Down
6 changes: 6 additions & 0 deletions src/port/string.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,12 @@ bfdev_memcpy(void *dest, const void *src, bfdev_size_t n)
return bfport_memcpy(dest, src, n);
}

export void *
bfdev_memmove(void *dest, const void *src, bfdev_size_t n)
{
return bfport_memmove(dest, src, n);
}

export void *
bfdev_memset(void *s, int c, bfdev_size_t n)
{
Expand Down
Loading