From: phfr24 Date: Sun, 8 Mar 2026 20:11:52 +0000 (-0300) Subject: move queue.c to ppos/lib/ and symlink it on queue/ X-Git-Url: https://git.wirehaze.ovh/ppos.git/commitdiff_plain/f086a7520d1c4b12a1110adf1b1306ee23af0072?ds=sidebyside move queue.c to ppos/lib/ and symlink it on queue/ --- diff --git a/ppos/lib/queue.c b/ppos/lib/queue.c index 26bfa05..6a08e90 100644 --- a/ppos/lib/queue.c +++ b/ppos/lib/queue.c @@ -1 +1,260 @@ // PingPongOS - PingPong Operating System +// Prof. Carlos A. Maziero, DINF UFPR +// Versão 2.0 -- Junho de 2025 + +// Implementação do TAD fila genérica + +/* PEDRO HENRIQUE FRIEDRICH RAMOS : GRR20243133 */ + +#include "queue.h" +#include +#include + +/* ------------------------------------------------------------------------- */ +/* Data types ------------------------------------------------------------- */ + +/* Queue element. */ +struct node_t +{ + void *item; /* User provided opaque pointer. */ + struct node_t *next; /* Pointer to the next node in the queue. */ +}; + +/* ------------------------------------------------------------------------- */ + +/* Queue. */ +struct queue_t +{ + struct node_t *head; /* Pointer to the first node in the queue. */ + struct node_t *tail; /* Pointer to the last node in the queue. */ + struct node_t *iterator; /* Pointer to the current node. */ + int size; /* Number of nodes in the queue. */ +}; + +/* ------------------------------------------------------------------------- */ +/* Internal functions ----------------------------------------------------- */ + +static inline struct node_t * +node_create (void) +{ + return calloc (1, sizeof (struct node_t)); +} + +/* ------------------------------------------------------------------------- */ + +static inline void +node_destroy (struct node_t *node) +{ + free (node); +} + +/* ------------------------------------------------------------------------- */ +/* Exported functions ----------------------------------------------------- */ + +struct queue_t * +queue_create (void) +{ + return calloc (1, sizeof (struct queue_t)); +} + +/* ------------------------------------------------------------------------- */ + +int +queue_destroy (struct queue_t *queue) +{ + struct node_t *n, *next; + + if (!queue) + return ERROR; + + n = queue->head; + + while (n) + { + /* Save the next node pointer before destroying the current node. */ + next = n->next; + node_destroy (n); + n = next; + } + + free (queue); + return NOERROR; +} + +/* ------------------------------------------------------------------------- */ + +int +queue_add (struct queue_t *queue, void *item) +{ + struct node_t *n; + + if (!queue || !item) + return ERROR; + + if (!(n = node_create ())) + return ERROR; + + n->item = item; + ++queue->size; + + /* Empty queue, this is the first element. */ + if (!queue->head) + { + queue->head = queue->tail = queue->iterator = n; + return NOERROR; + } + + /* Append to queue. */ + queue->tail = queue->tail->next = n; + return NOERROR; +} + +/* ------------------------------------------------------------------------- */ + +int +queue_del (struct queue_t *queue, void *item) +{ + struct node_t *n, *prev; + + if (!queue || !item) + return ERROR; + + if (!(n = queue->head)) /* Queue is empty. */ + return ERROR; + + prev = NULL; + + while (n && n->item != item) + { + prev = n; + n = n->next; + } + + if (!n) /* Not found. */ + return ERROR; + + if (prev) + prev->next = n->next; + + /* Update boundaries accordingly. */ + if (queue->head == n) + queue->head = n->next; + + if (queue->tail == n) + queue->tail = prev; + + /* Advance the iterator if it points to the removed node. */ + if (queue->iterator == n) + queue->iterator = n->next; + + --queue->size; + node_destroy (n); + return NOERROR; +} + +/* ------------------------------------------------------------------------- */ + +bool +queue_has (struct queue_t *queue, void *item) +{ + struct node_t *n; + + if (!queue || !item) + return false; + + if (!(n = queue->head)) + return false; + + /* Traverse until the item is found or the end is reached. */ + while (n->item != item && (n = n->next)) + ; + + return n != NULL; +} + +/* ------------------------------------------------------------------------- */ + +int +queue_size (struct queue_t *queue) +{ + if (!queue) + return ERROR; + + return queue->size; +} + +/* ------------------------------------------------------------------------- */ + +void * +queue_head (struct queue_t *queue) +{ + if (!queue || !queue->head) + return NULL; + + queue->iterator = queue->head; + + return queue->head->item; +} + +/* ------------------------------------------------------------------------- */ + +void * +queue_next (struct queue_t *queue) +{ + if (!queue || !queue->iterator) + return NULL; + + queue->iterator = queue->iterator->next; + + if (!queue->iterator) + return NULL; + + return queue->iterator->item; +} + +/* ------------------------------------------------------------------------- */ + +void * +queue_item (struct queue_t *queue) +{ + if (!queue || !queue->iterator) + return NULL; + + return queue->iterator->item; +} + +/* ------------------------------------------------------------------------- */ + +void +queue_print (char *name, struct queue_t *queue, void (func) (void *)) +{ + struct node_t *n; + + if (!name) + return; + + printf ("%s: ", name); + + if (!queue) + { + puts ("undef"); + return; + } + + fputs ("[ ", stdout); + + for (n = queue->head; n; n = n->next) + { + if (func) + func (n->item); + + else + fputs ("undef", stdout); + + putchar (' '); + } + + printf ("] (%d items)\n", queue->size); +} + +/* ------------------------------------------------------------------------- */ diff --git a/queue/queue.c b/queue/queue.c deleted file mode 100644 index 6a08e90..0000000 --- a/queue/queue.c +++ /dev/null @@ -1,260 +0,0 @@ -// PingPongOS - PingPong Operating System -// Prof. Carlos A. Maziero, DINF UFPR -// Versão 2.0 -- Junho de 2025 - -// Implementação do TAD fila genérica - -/* PEDRO HENRIQUE FRIEDRICH RAMOS : GRR20243133 */ - -#include "queue.h" -#include -#include - -/* ------------------------------------------------------------------------- */ -/* Data types ------------------------------------------------------------- */ - -/* Queue element. */ -struct node_t -{ - void *item; /* User provided opaque pointer. */ - struct node_t *next; /* Pointer to the next node in the queue. */ -}; - -/* ------------------------------------------------------------------------- */ - -/* Queue. */ -struct queue_t -{ - struct node_t *head; /* Pointer to the first node in the queue. */ - struct node_t *tail; /* Pointer to the last node in the queue. */ - struct node_t *iterator; /* Pointer to the current node. */ - int size; /* Number of nodes in the queue. */ -}; - -/* ------------------------------------------------------------------------- */ -/* Internal functions ----------------------------------------------------- */ - -static inline struct node_t * -node_create (void) -{ - return calloc (1, sizeof (struct node_t)); -} - -/* ------------------------------------------------------------------------- */ - -static inline void -node_destroy (struct node_t *node) -{ - free (node); -} - -/* ------------------------------------------------------------------------- */ -/* Exported functions ----------------------------------------------------- */ - -struct queue_t * -queue_create (void) -{ - return calloc (1, sizeof (struct queue_t)); -} - -/* ------------------------------------------------------------------------- */ - -int -queue_destroy (struct queue_t *queue) -{ - struct node_t *n, *next; - - if (!queue) - return ERROR; - - n = queue->head; - - while (n) - { - /* Save the next node pointer before destroying the current node. */ - next = n->next; - node_destroy (n); - n = next; - } - - free (queue); - return NOERROR; -} - -/* ------------------------------------------------------------------------- */ - -int -queue_add (struct queue_t *queue, void *item) -{ - struct node_t *n; - - if (!queue || !item) - return ERROR; - - if (!(n = node_create ())) - return ERROR; - - n->item = item; - ++queue->size; - - /* Empty queue, this is the first element. */ - if (!queue->head) - { - queue->head = queue->tail = queue->iterator = n; - return NOERROR; - } - - /* Append to queue. */ - queue->tail = queue->tail->next = n; - return NOERROR; -} - -/* ------------------------------------------------------------------------- */ - -int -queue_del (struct queue_t *queue, void *item) -{ - struct node_t *n, *prev; - - if (!queue || !item) - return ERROR; - - if (!(n = queue->head)) /* Queue is empty. */ - return ERROR; - - prev = NULL; - - while (n && n->item != item) - { - prev = n; - n = n->next; - } - - if (!n) /* Not found. */ - return ERROR; - - if (prev) - prev->next = n->next; - - /* Update boundaries accordingly. */ - if (queue->head == n) - queue->head = n->next; - - if (queue->tail == n) - queue->tail = prev; - - /* Advance the iterator if it points to the removed node. */ - if (queue->iterator == n) - queue->iterator = n->next; - - --queue->size; - node_destroy (n); - return NOERROR; -} - -/* ------------------------------------------------------------------------- */ - -bool -queue_has (struct queue_t *queue, void *item) -{ - struct node_t *n; - - if (!queue || !item) - return false; - - if (!(n = queue->head)) - return false; - - /* Traverse until the item is found or the end is reached. */ - while (n->item != item && (n = n->next)) - ; - - return n != NULL; -} - -/* ------------------------------------------------------------------------- */ - -int -queue_size (struct queue_t *queue) -{ - if (!queue) - return ERROR; - - return queue->size; -} - -/* ------------------------------------------------------------------------- */ - -void * -queue_head (struct queue_t *queue) -{ - if (!queue || !queue->head) - return NULL; - - queue->iterator = queue->head; - - return queue->head->item; -} - -/* ------------------------------------------------------------------------- */ - -void * -queue_next (struct queue_t *queue) -{ - if (!queue || !queue->iterator) - return NULL; - - queue->iterator = queue->iterator->next; - - if (!queue->iterator) - return NULL; - - return queue->iterator->item; -} - -/* ------------------------------------------------------------------------- */ - -void * -queue_item (struct queue_t *queue) -{ - if (!queue || !queue->iterator) - return NULL; - - return queue->iterator->item; -} - -/* ------------------------------------------------------------------------- */ - -void -queue_print (char *name, struct queue_t *queue, void (func) (void *)) -{ - struct node_t *n; - - if (!name) - return; - - printf ("%s: ", name); - - if (!queue) - { - puts ("undef"); - return; - } - - fputs ("[ ", stdout); - - for (n = queue->head; n; n = n->next) - { - if (func) - func (n->item); - - else - fputs ("undef", stdout); - - putchar (' '); - } - - printf ("] (%d items)\n", queue->size); -} - -/* ------------------------------------------------------------------------- */ diff --git a/queue/queue.c b/queue/queue.c new file mode 120000 index 0000000..2dd39ef --- /dev/null +++ b/queue/queue.c @@ -0,0 +1 @@ +../ppos/lib/queue.c \ No newline at end of file