Skip to content

Instantly share code, notes, and snippets.

@MCJack123
Created October 22, 2018 15:52
Show Gist options
  • Save MCJack123/739e90aff861bc42eb575bced48ddce6 to your computer and use it in GitHub Desktop.
Save MCJack123/739e90aff861bc42eb575bced48ddce6 to your computer and use it in GitHub Desktop.
FILE-like buffer system for memory
//
// buffer.c
//
// Created by Homework User on 10/20/18.
// Copyright © 2018 JackMacWindows. All rights reserved.
//
#include "buffer.h"
#include <stdlib.h>
#include <string.h>
uint64_t buf_tell(buffer_t * buffer) {
return buffer->offset;
}
int buf_seek(buffer_t * buffer, uint64_t pos, int mode) {
if (mode == 0) {
if (pos > buffer->size) return -1;
buffer->size = pos;
return 0;
} else if (mode == 1) {
if (buffer->offset + pos > buffer->size) return -1;
buffer->offset += pos;
return 0;
} else if (mode == 2) {
if (buffer->size - pos < 0) return -1;
buffer->offset = buffer->size - pos;
return 0;
} else return 1;
}
uint64_t buf_read_u64(buffer_t * buffer) {
buffer->offset += 8;
return ((uint64_t*)(&buffer->data[buffer->offset-8]))[0];
}
uint32_t buf_read_u32(buffer_t * buffer) {
buffer->offset += 4;
return ((uint32_t*)(&buffer->data[buffer->offset-4]))[0];
}
uint16_t buf_read_u16(buffer_t * buffer) {
buffer->offset += 2;
return ((uint16_t*)(&buffer->data[buffer->offset-2]))[0];
}
uint8_t buf_read_u8(buffer_t * buffer) {
buffer->offset += 1;
return ((uint8_t*)(&buffer->data[buffer->offset-1]))[0];
}
long buf_read_long(buffer_t * buffer) {
buffer->offset += sizeof(long);
return ((long*)(&buffer->data[buffer->offset-sizeof(long)]))[0];
}
const char * buf_read_str(buffer_t * buffer) {
return (const char *)buf_read_buf(buffer, strlen((const char *)&buffer->data[buffer->offset])+1);
}
uint8_t * buf_read_buf(buffer_t * buffer, uint64_t size) {
uint8_t * buf = (uint8_t*)malloc(size);
memcpy(buf, &buffer->data[buffer->offset], size);
buffer->offset += size;
return buf;
}
void buf_write_u64(buffer_t * buffer, uint64_t num) {
((uint64_t*)(&buffer->data[buffer->offset]))[0] = num;
buffer->offset += 8;
}
void buf_write_u32(buffer_t * buffer, uint32_t num) {
((uint32_t*)(&buffer->data[buffer->offset]))[0] = num;
buffer->offset += 4;
}
void buf_write_u16(buffer_t * buffer, uint16_t num) {
((uint16_t*)(&buffer->data[buffer->offset]))[0] = num;
buffer->offset += 2;
}
void buf_write_u8(buffer_t * buffer, uint8_t num) {
buffer->data[buffer->offset] = num;
buffer->offset++;
}
void buf_write_long(buffer_t * buffer, long num) {
((long*)(&buffer->data[buffer->offset]))[0] = num;
buffer->offset += sizeof(long);
}
void buf_write_buf(buffer_t * buffer, uint8_t * buf, uint64_t size) {
memcpy(&buffer->data[buffer->offset], buf, size);
buffer->offset += size;
}
void buf_write_str(buffer_t * buffer, const char * str) {
buf_write_buf(buffer, (uint8_t*)str, strlen(str)+1);
}
//
// buffer.h
//
// Created by Homework User on 10/20/18.
// Copyright © 2018 JackMacWindows. All rights reserved.
//
#ifndef buffer_h
#define buffer_h
#include <stdint.h>
#ifndef SEEK_SET
#define SEEK_SET 0 /* set file offset to offset */
#endif
#ifndef SEEK_CUR
#define SEEK_CUR 1 /* set file offset to current plus offset */
#endif
#ifndef SEEK_END
#define SEEK_END 2 /* set file offset to EOF plus offset */
#endif
typedef struct {
uint64_t offset;
uint64_t size;
uint8_t * data;
} buffer_t;
extern uint64_t buf_tell(buffer_t * buffer);
extern int buf_seek(buffer_t * buffer, uint64_t pos, int mode);
extern uint64_t buf_read_u64(buffer_t * buffer);
extern uint32_t buf_read_u32(buffer_t * buffer);
extern uint16_t buf_read_u16(buffer_t * buffer);
extern uint8_t buf_read_u8(buffer_t * buffer);
extern long buf_read_long(buffer_t * buffer);
extern const char * buf_read_str(buffer_t * buffer);
extern uint8_t * buf_read_buf(buffer_t * buffer, uint64_t size);
extern void buf_write_u64(buffer_t * buffer, uint64_t num);
extern void buf_write_u32(buffer_t * buffer, uint32_t num);
extern void buf_write_u16(buffer_t * buffer, uint16_t num);
extern void buf_write_u8(buffer_t * buffer, uint8_t num);
extern void buf_write_long(buffer_t * buffer, long num);
extern void buf_write_str(buffer_t * buffer, const char * str);
extern void buf_write_buf(buffer_t * buffer, uint8_t * buf, uint64_t size);
#endif /* buffer_h */
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment