44 lines
961 B
C
44 lines
961 B
C
#include "ref.h"
|
|
#include "sym.h"
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
void ref_queue_construct(RefQueue* queue)
|
|
{
|
|
const size_t start_capacity = 128;
|
|
*queue = (RefQueue) {
|
|
.data = malloc(sizeof(Ref) * start_capacity),
|
|
.capacity = start_capacity,
|
|
.back = 0,
|
|
.front = 0,
|
|
};
|
|
}
|
|
|
|
void ref_queue_destroy(RefQueue* queue)
|
|
{
|
|
free(queue->data);
|
|
}
|
|
|
|
void ref_queue_push(RefQueue* queue, const Sym* sym, uint16_t offset)
|
|
{
|
|
if (queue->front + 1 > queue->capacity) {
|
|
queue->capacity *= 2;
|
|
queue->data = realloc(queue->data, sizeof(Ref) * queue->capacity);
|
|
}
|
|
queue->data[queue->front++] = (Ref) { sym, offset };
|
|
}
|
|
|
|
Ref ref_queue_pop(RefQueue* queue)
|
|
{
|
|
if (queue->back == queue->front) {
|
|
fprintf(stderr, "panic: queue underflow\n");
|
|
exit(1);
|
|
}
|
|
return queue->data[queue->back++];
|
|
}
|
|
|
|
size_t ref_queue_size(const RefQueue* queue)
|
|
{
|
|
return queue->front - queue->back;
|
|
}
|