This commit is contained in:
2023-08-13 19:39:49 +02:00
commit 4e69c748f1
31 changed files with 2148 additions and 0 deletions
+141
View File
@@ -0,0 +1,141 @@
/*
*
* Copyright 2023 Oleg Borodin <borodin@unix7.org>
*
*/
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <fcntl.h>
#include <bstream.h>
#define STREAM_INITCAPA 512
bstream_t* bstream_init(bstream_t* stream) {
stream->data = malloc(STREAM_INITCAPA);
if (stream->data == NULL) {
return NULL;
}
stream->wpos = 0;
stream->rpos = 0;
stream->capa = STREAM_INITCAPA;
return stream;
}
size_t bstream_dump(bstream_t * stream) {
for (size_t i = 0; i < stream->wpos; i++) {
printf("%c", stream->data[i]);
}
return stream->wpos;
}
ssize_t bstream_write(bstream_t * stream, void* buffer, size_t size) {
if ((stream->wpos + size) > stream->capa) {
size_t newcapa = stream->capa * 2;
uint8_t* newdata = realloc(stream->data, (size_t)newcapa);
if (newdata == NULL) {
return (ssize_t)-1;
}
stream->data = newdata;
stream->capa = newcapa;
}
if (buffer != NULL) {
memcpy(&(stream->data[stream->wpos]), buffer, (size_t)size);
}
stream->wpos += size;
return (ssize_t) size;
}
ssize_t bstream_read(bstream_t* stream, void* buffer, size_t size) {
size_t unread = stream->wpos - stream->rpos;
if (size > unread) {
size = unread;
}
if (buffer != NULL) {
memcpy(buffer, &(stream->data[stream->rpos]), size);
}
stream->rpos += size;
return (ssize_t) size;
}
#define BUFFER_SIZE 1024
ssize_t bstream_fread(bstream_t * stream, char* filename) {
int fd = open(filename, O_RDONLY);
if (fd < 0) {
return (ssize_t)-1;
}
char buffer[BUFFER_SIZE];
size_t rsize = 0;
size_t tsize = 0;
while ((rsize = (size_t)read(fd, buffer, BUFFER_SIZE)) > 0) {
if ((stream->wpos + rsize) > stream->capa) {
size_t newcapa = stream->capa * 2 + rsize;
stream->data = realloc(stream->data, (size_t)newcapa);
stream->capa = newcapa;
}
if (buffer != NULL) {
memcpy(&(stream->data[stream->wpos]), buffer, (size_t)rsize);
}
stream->wpos += rsize;
tsize += rsize;
}
close(fd);
return (ssize_t)tsize;
}
char bstream_getc(bstream_t* stream) {
size_t unread = stream->wpos - stream->rpos;
if (unread == 0) {
return EOF;
}
return (char)stream->data[stream->rpos++];
}
char bstream_getnc(bstream_t* stream, int fd) {
size_t unread = stream->wpos - stream->rpos;
if (unread == 0) {
char* buffer[BUFFER_SIZE];
size_t rsize = read(fd, buffer, sizeof(buffer));
if (rsize == 0) {
return EOF;
}
if ((stream->wpos + rsize) > stream->capa) {
size_t newcapa = stream->capa * 2 + rsize;
uint8_t* newdata = realloc(stream->data, (size_t)newcapa);
if (newdata == NULL) {
return (ssize_t)-1;
}
stream->data = newdata;
stream->capa = newcapa;
}
memcpy(&(stream->data[stream->wpos]), buffer, (size_t)rsize);
stream->wpos += rsize;
}
return (char)stream->data[stream->rpos++];
}
size_t bstream_wpos(bstream_t* stream) {
return stream->wpos;
}
size_t bstream_rpos(bstream_t* stream) {
return stream->rpos;
}
void bstream_destroy(bstream_t* stream) {
if (stream != NULL) {
free(stream->data);
}
}
+36
View File
@@ -0,0 +1,36 @@
/*
*
* Copyright 2023 Oleg Borodin <borodin@unix7.org>
*
*/
#ifndef BSTREAM_H_QWERTY
#define BSTREAM_H_QWERTY
#include <stdint.h>
#include <unistd.h>
typedef struct {
size_t rpos;
size_t wpos;
size_t capa;
uint8_t* data;
} bstream_t;
bstream_t* bstream_init(bstream_t* stream);
size_t bstream_dump(bstream_t* stream);
ssize_t bstream_write(bstream_t* stream, void* buf, size_t size);
ssize_t bstream_read(bstream_t* stream, void* buf, size_t size);
ssize_t bstream_fread(bstream_t* stream, char* filename);
char bstream_getc(bstream_t* stream);
char bstream_getnc(bstream_t* stream, int fd);
size_t bstream_wpos(bstream_t* stream);
size_t bstream_rpos(bstream_t* stream);
void bstream_destroy(bstream_t* stream);
#endif
+69
View File
@@ -0,0 +1,69 @@
/*
* Copyright 2022 Oleg Borodin <borodin@unix7.org>
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <bstream.h>
#include <massert.h>
void test_rwrite(void) {
bstream_t stream;
bstream_init(&stream);
char* data = "_123456789";
size_t dsize = strlen(data);
ssize_t wsize = 0;
size_t count = 3;
for (size_t i = 0; i < count; i++) {
wsize += bstream_write(&stream, data, dsize);
}
printf("wsize = %ld, data = [%s]\n", wsize, stream.data);
MASSERT(stream.wpos == dsize * count);
MASSERT(wsize == (ssize_t) (dsize * count));
size_t bsize = bstream_wpos(&stream);
char* buf = malloc((size_t)bsize + (size_t)1);
memset(buf, 0, (size_t)bsize + (size_t)1);
ssize_t rsize = bstream_read(&stream, buf, bsize);
printf("rsize = %lu, buf = [%s]\n", rsize, buf);
MASSERT(wsize == (ssize_t) (dsize * count));
MASSERT(rsize == wsize);
bstream_destroy(&stream);
}
void test_getnc(void) {
bstream_t stream;
bstream_init(&stream);
int fd = open("test.json", O_RDONLY);
MASSERT(fd > 0);
char c = bstream_getnc(&stream, fd);
printf("%c\n", c);
printf("%s", (char*)stream.data);
bstream_destroy(&stream);
}
int main(int argc, char** argv) {
(void)argc;
(void)argv;
//test_rwrite();
test_getnc();
return 0;
}