Created
October 22, 2018 15:52
-
-
Save MCJack123/739e90aff861bc42eb575bced48ddce6 to your computer and use it in GitHub Desktop.
FILE-like buffer system for memory
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// 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); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// 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