#include #include #include #include "request_queue.h" struct _rqueue { int size; int max; request *items; }; rqueue *rqueue_create(int max) { rqueue *q = malloc(sizeof(rqueue)); if (q != NULL) { // initialize size and max q->size = 0; q->max = max; // create an array big enough for max-sized queue q->items = malloc(sizeof(request) * max); if (q->items == NULL) { free(q); return NULL; } } return q; } void rqueue_destroy(rqueue *q) { if (q != NULL) { // free the array and all the copies of the data it has // pointers to for (int i = 0; i < q->size; i++) { free(q->items[i].user); free(q->items[i].position); } free(q->items); // zero out the queue to make it more obviously incorrect if // someone tries to use a destroyed queue q->items = NULL; q->size = 0; // free the queue free(q); } } int rqueue_size(const rqueue *q) { if (q != NULL) { return q->size; } else { return 0; } } bool rqueue_add(rqueue *q, const request *r) { if (q == NULL || q->size == q->max || r == NULL || r->user == NULL || r->position == NULL) { return false; } else { // copy the data q->items[q->size].user = malloc(sizeof(char) * (strlen(r->user) + 1)); q->items[q->size].position = malloc(sizeof(char) * (strlen(r->position) + 1)); if (q->items[q->size].user == NULL || q->items[q->size].position == NULL) { free(q->items[q->size].user); free(q->items[q->size].position); return false; } strcpy(q->items[q->size].user, r->user); strcpy(q->items[q->size].position, r->position); // update size q->size++; return true; } } void rqueue_remove(rqueue *q, request *r) { if (q != NULL && q->size > 0) { // save the data in the reference parameter if (r != NULL) { *r = q->items[0]; } // update size q->size--; // move everything back one space so next to remove is // always at index 0 for (int i = 0; i < q->size; i++) { q->items[i] = q->items[i + 1]; } } }