Skip to content

Instantly share code, notes, and snippets.

@jooyunghan
Last active January 19, 2016 02:44
Show Gist options
  • Save jooyunghan/f6e4fafb3d5ce21e78e6 to your computer and use it in GitHub Desktop.
Save jooyunghan/f6e4fafb3d5ce21e78e6 to your computer and use it in GitHub Desktop.
Using zer-length array for shared implementation for byte buffer
/*
============================================================================
Name : Buffer.c
Author : Jooyung Han
Version :
Copyright :
Description : Hello World in C, Ansi-style
============================================================================
*/
#include <_mingw.h>
#include <memory.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct tagBuffer {
uint16_t size;
uint8_t data[];
} Buffer;
enum {
PACKET_A_MAX = 256, PACKET_B_MAX = 128,
};
typedef struct tagPacketA {
uint8_t header1; // 1
uint8_t header2; // 1
// 8 (padded 6)
Buffer buf; // 8
uint8_t data[PACKET_A_MAX]; // 256
} PacketA;
typedef struct tagPacketB {
uint8_t header1; // 1
uint8_t header2; // 1
// 8 (padded 6)
Buffer buf; // 8
uint8_t data[PACKET_B_MAX]; // 128
} PacketB;
void Buffer_Append(Buffer* buf, uint8_t b) {
buf->data[buf->size++] = b;
}
typedef struct tagReader {
Buffer* buf;
size_t ptr;
} Reader;
Reader Buffer_reader(Buffer* buf) {
Reader r = { buf, 0 };
return r;
}
uint8_t Reader_get(Reader* r) {
return r->buf->data[r->ptr++];
}
size_t Reader_ptr(Reader* r) {
return r->ptr;
}
int main(void) {
PacketA pa;
memset(&pa, 0, sizeof(PacketA));
printf("sizeof(Buffer) = %d\n", (int) sizeof(Buffer));
printf("sizeof(PacketA) = %d\n", (int) sizeof(PacketA));
printf("sizeof(PacketB) = %d\n", (int) sizeof(PacketB));
Buffer_Append(&pa.buf, 'a');
Buffer_Append(&pa.buf, 'b');
printf("pa.buf.size = %d\n", pa.buf.size);
printf("pa.data[0] = %c\n", pa.data[0]);
printf("pa.data[1] = %c\n", pa.data[1]);
printf("pa.buf.data[0] = %c\n", pa.buf.data[0]);
printf("pa.buf.data[1] = %c\n", pa.buf.data[1]);
Reader r = Buffer_reader(&pa.buf);
printf("Reader_get(r) = %c\n", Reader_get(&r));
printf("Reader_get(r) = %c\n", Reader_get(&r));
printf("Reader_ptr(r) = %d\n", (int) Reader_ptr(&r));
return EXIT_SUCCESS;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment