X-Git-Url: https://git.openssl.org/?p=openssl.git;a=blobdiff_plain;f=crypto%2Fpqueue%2Fpqueue.c;h=1378abc58a4b74a2fcefd1cffff30477a0246803;hp=e3eb836d45246f50da67373ed4535ad9b038740a;hb=16f8d4ebf0fd4847fa83d9c61f4150273cb4f533;hpb=d1acb9b44f01844499aab7c87bae78364c579b49 diff --git a/crypto/pqueue/pqueue.c b/crypto/pqueue/pqueue.c index e3eb836d45..1378abc58a 100644 --- a/crypto/pqueue/pqueue.c +++ b/crypto/pqueue/pqueue.c @@ -1,7 +1,7 @@ /* crypto/pqueue/pqueue.c */ -/* +/* * DTLS implementation written by Nagendra Modadugu - * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. + * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. */ /* ==================================================================== * Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved. @@ -11,7 +11,7 @@ * are met: * * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. + * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in @@ -59,178 +59,164 @@ #include "cryptlib.h" #include -#include "pqueue.h" - -typedef struct _pqueue - { - pitem *items; - int count; - } pqueue_s; - -pitem * -pitem_new(PQ_64BIT priority, void *data) - { - pitem *item = (pitem *) OPENSSL_malloc(sizeof(pitem)); - if (item == NULL) return NULL; - - pq_64bit_init(&(item->priority)); - pq_64bit_assign(&item->priority, &priority); - - item->data = data; - item->next = NULL; - - return item; - } - -void -pitem_free(pitem *item) - { - if (item == NULL) return; - - pq_64bit_free(&(item->priority)); - OPENSSL_free(item); - } - -pqueue_s * -pqueue_new() - { - pqueue_s *pq = (pqueue_s *) OPENSSL_malloc(sizeof(pqueue_s)); - if (pq == NULL) return NULL; - - memset(pq, 0x00, sizeof(pqueue_s)); - return pq; - } - -void -pqueue_free(pqueue_s *pq) - { - if (pq == NULL) return; - - OPENSSL_free(pq); - } - -pitem * -pqueue_insert(pqueue_s *pq, pitem *item) - { - pitem *curr, *next; - - if (pq->items == NULL) - { - pq->items = item; - return item; - } - - for(curr = NULL, next = pq->items; - next != NULL; - curr = next, next = next->next) - { - if (pq_64bit_gt(&(next->priority), &(item->priority))) - { - item->next = next; - - if (curr == NULL) - pq->items = item; - else - curr->next = item; - - return item; - } - /* duplicates not allowed */ - if (pq_64bit_eq(&(item->priority), &(next->priority))) - return NULL; - } - - item->next = NULL; - curr->next = item; - - return item; - } - -pitem * -pqueue_peek(pqueue_s *pq) - { - return pq->items; - } - -pitem * -pqueue_pop(pqueue_s *pq) - { - pitem *item = pq->items; - - if (pq->items != NULL) - pq->items = pq->items->next; - - return item; - } - -pitem * -pqueue_find(pqueue_s *pq, PQ_64BIT priority) - { - pitem *next, *prev = NULL; - pitem *found = NULL; - - if ( pq->items == NULL) - return NULL; - - for ( next = pq->items; next->next != NULL; - prev = next, next = next->next) - { - if ( pq_64bit_eq(&(next->priority), &priority)) - { - found = next; - break; - } - } - - /* check the one last node */ - if ( pq_64bit_eq(&(next->priority), &priority)) - found = next; - - if ( ! found) - return NULL; - -#if 0 /* find works in peek mode */ - if ( prev == NULL) - pq->items = next->next; - else - prev->next = next->next; -#endif - - return found; - } - -#if PQ_64BIT_IS_INTEGER -void -pqueue_print(pqueue_s *pq) - { - pitem *item = pq->items; - - while(item != NULL) - { - printf("item\t%lld\n", item->priority); - item = item->next; - } - } -#endif - -pitem * -pqueue_iterator(pqueue_s *pq) - { - return pqueue_peek(pq); - } - -pitem * -pqueue_next(pitem **item) - { - pitem *ret; - - if ( item == NULL || *item == NULL) - return NULL; - - - /* *item != NULL */ - ret = *item; - *item = (*item)->next; - - return ret; - } +#include + +typedef struct _pqueue { + pitem *items; + int count; +} pqueue_s; + +pitem *pitem_new(unsigned char *prio64be, void *data) +{ + pitem *item = OPENSSL_malloc(sizeof(*item)); + if (item == NULL) + return NULL; + + memcpy(item->priority, prio64be, sizeof(item->priority)); + + item->data = data; + item->next = NULL; + + return item; +} + +void pitem_free(pitem *item) +{ + OPENSSL_free(item); +} + +pqueue_s *pqueue_new() +{ + pqueue_s *pq = OPENSSL_malloc(sizeof(*pq)); + if (pq == NULL) + return NULL; + + memset(pq, 0, sizeof(*pq)); + return pq; +} + +void pqueue_free(pqueue_s *pq) +{ + OPENSSL_free(pq); +} + +pitem *pqueue_insert(pqueue_s *pq, pitem *item) +{ + pitem *curr, *next; + + if (pq->items == NULL) { + pq->items = item; + return item; + } + + for (curr = NULL, next = pq->items; + next != NULL; curr = next, next = next->next) { + /* + * we can compare 64-bit value in big-endian encoding with memcmp:-) + */ + int cmp = memcmp(next->priority, item->priority, 8); + if (cmp > 0) { /* next > item */ + item->next = next; + + if (curr == NULL) + pq->items = item; + else + curr->next = item; + + return item; + } + + else if (cmp == 0) /* duplicates not allowed */ + return NULL; + } + + item->next = NULL; + curr->next = item; + + return item; +} + +pitem *pqueue_peek(pqueue_s *pq) +{ + return pq->items; +} + +pitem *pqueue_pop(pqueue_s *pq) +{ + pitem *item = pq->items; + + if (pq->items != NULL) + pq->items = pq->items->next; + + return item; +} + +pitem *pqueue_find(pqueue_s *pq, unsigned char *prio64be) +{ + pitem *next; + pitem *found = NULL; + + if (pq->items == NULL) + return NULL; + + for (next = pq->items; next->next != NULL; next = next->next) { + if (memcmp(next->priority, prio64be, 8) == 0) { + found = next; + break; + } + } + + /* check the one last node */ + if (memcmp(next->priority, prio64be, 8) == 0) + found = next; + + if (!found) + return NULL; + + return found; +} + +void pqueue_print(pqueue_s *pq) +{ + pitem *item = pq->items; + + while (item != NULL) { + printf("item\t%02x%02x%02x%02x%02x%02x%02x%02x\n", + item->priority[0], item->priority[1], + item->priority[2], item->priority[3], + item->priority[4], item->priority[5], + item->priority[6], item->priority[7]); + item = item->next; + } +} + +pitem *pqueue_iterator(pqueue_s *pq) +{ + return pqueue_peek(pq); +} + +pitem *pqueue_next(pitem **item) +{ + pitem *ret; + + if (item == NULL || *item == NULL) + return NULL; + + /* *item != NULL */ + ret = *item; + *item = (*item)->next; + + return ret; +} + +int pqueue_size(pqueue_s *pq) +{ + pitem *item = pq->items; + int count = 0; + + while (item != NULL) { + count++; + item = item->next; + } + return count; +}