buffer document

This commit is contained in:
tezc 2020-12-27 15:19:23 +03:00
parent 522c92146f
commit 9467f5e272
4 changed files with 139 additions and 34 deletions

View File

@ -75,6 +75,39 @@ static void test1(void)
sc_array_destroy(arr);
}
void bounds_test()
{
int *arr, total = 0;
int val;
sc_array_create(arr, 2);
sc_array_add(arr, 3);
sc_array_add(arr, 4);
sc_array_foreach (arr, val) {
total += val;
}
assert(total == 7);
sc_array_destroy(arr);
total = 0;
sc_array_create(arr, 0);
sc_array_foreach (arr, val) {
total += val;
}
sc_array_foreach (arr, val) {
total += val;
}
assert(total == 0);
sc_array_destroy(arr);
}
#ifdef SC_HAVE_WRAP
bool fail_realloc = false;
@ -175,39 +208,6 @@ void fail_test()
sc_array_destroy(arr);
}
void bounds_test()
{
int *arr, total = 0;
int val;
sc_array_create(arr, 2);
sc_array_add(arr, 3);
sc_array_add(arr, 4);
sc_array_foreach (arr, val) {
total += val;
}
assert(total == 7);
sc_array_destroy(arr);
total = 0;
sc_array_create(arr, 0);
sc_array_foreach (arr, val) {
total += val;
}
sc_array_foreach (arr, val) {
total += val;
}
assert(total == 0);
sc_array_destroy(arr);
}
#else
void fail_test(void)
{

64
buffer/README.md Normal file
View File

@ -0,0 +1,64 @@
# Generic array
#### Overview
- Buffer implementation for serializing data/protocol implementation.
- Provides put/get for binary data, 8/16/32/64 bit integers, double and strings.
- Strings are kept length prefixed and null ended. So, no need to copy string
when you are reading, you just get the pointer. This is useful to avoid memory
allocation overhead.
- Integer operations are compiled into bounds check + a single MOV instruction
on x86. Buffer keeps data in Little Endian format, so on big endian systems,
integer put/get is bswap(byte swap) + MOV.
- Just copy <b>sc_buf.h</b> and <b>sc_buf.c</b> to your project.
##### Usage
```c
#include "sc_buf.h"
#include <stdio.h>
void basic()
{
struct sc_buf buf;
sc_buf_init(&buf, 1024);
sc_buf_put_32(&buf, 16);
sc_buf_put_str(&buf, "test");
sc_buf_put_fmt(&buf, "value is %d", 3);
printf("%d \n", sc_buf_get_32(&buf));
printf("%s \n", sc_buf_get_str(&buf));
printf("%s \n", sc_buf_get_str(&buf));
sc_buf_term(&buf);
}
void error_check()
{
uint32_t val, val2;
struct sc_buf buf;
sc_buf_init(&buf, 1024);
sc_buf_put_32(&buf, 16);
val = sc_buf_get_32(&buf);
val2 = sc_buf_get_32(&buf); // This will set error flag in buffer;
if (sc_buf_valid(&buf) == false) {
printf("buffer is corrupt");
exit(EXIT_FAILURE);
}
sc_buf_term(&buf);
}
int main()
{
basic();
error_check();
return 0;
}
```

View File

@ -1,4 +1,45 @@
#include "sc_buf.h"
#include <stdio.h>
void basic()
{
struct sc_buf buf;
sc_buf_init(&buf, 1024);
sc_buf_put_32(&buf, 16);
sc_buf_put_str(&buf, "test");
sc_buf_put_fmt(&buf, "value is %d", 3);
printf("%d \n", sc_buf_get_32(&buf));
printf("%s \n", sc_buf_get_str(&buf));
printf("%s \n", sc_buf_get_str(&buf));
sc_buf_term(&buf);
}
void error_check()
{
uint32_t val, val2;
struct sc_buf buf;
sc_buf_init(&buf, 1024);
sc_buf_put_32(&buf, 16);
val = sc_buf_get_32(&buf);
val2 = sc_buf_get_32(&buf); // This will set error flag in buffer;
if (sc_buf_valid(&buf) == false) {
printf("buffer is corrupt");
exit(EXIT_FAILURE);
}
sc_buf_term(&buf);
}
int main()
{
basic();
error_check();
return 0;
}

View File

@ -40,8 +40,8 @@ struct sc_buf
uint32_t limit;
uint32_t rpos;
uint32_t wpos;
unsigned int error;
unsigned int error;
bool ref;
};