pqueue.c revision 296465
1/* crypto/pqueue/pqueue.c */ 2/* 3 * DTLS implementation written by Nagendra Modadugu 4 * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. 5 */ 6/* ==================================================================== 7 * Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in 18 * the documentation and/or other materials provided with the 19 * distribution. 20 * 21 * 3. All advertising materials mentioning features or use of this 22 * software must display the following acknowledgment: 23 * "This product includes software developed by the OpenSSL Project 24 * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 25 * 26 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 27 * endorse or promote products derived from this software without 28 * prior written permission. For written permission, please contact 29 * openssl-core@OpenSSL.org. 30 * 31 * 5. Products derived from this software may not be called "OpenSSL" 32 * nor may "OpenSSL" appear in their names without prior written 33 * permission of the OpenSSL Project. 34 * 35 * 6. Redistributions of any form whatsoever must retain the following 36 * acknowledgment: 37 * "This product includes software developed by the OpenSSL Project 38 * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 39 * 40 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 41 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 42 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 43 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 44 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 45 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 46 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 47 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 49 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 50 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 51 * OF THE POSSIBILITY OF SUCH DAMAGE. 52 * ==================================================================== 53 * 54 * This product includes cryptographic software written by Eric Young 55 * (eay@cryptsoft.com). This product includes software written by Tim 56 * Hudson (tjh@cryptsoft.com). 57 * 58 */ 59 60#include "cryptlib.h" 61#include <openssl/bn.h> 62#include "pqueue.h" 63 64typedef struct _pqueue { 65 pitem *items; 66 int count; 67} pqueue_s; 68 69pitem *pitem_new(PQ_64BIT priority, void *data) 70{ 71 pitem *item = (pitem *)OPENSSL_malloc(sizeof(pitem)); 72 if (item == NULL) 73 return NULL; 74 75 pq_64bit_init(&(item->priority)); 76 pq_64bit_assign(&item->priority, &priority); 77 78 item->data = data; 79 item->next = NULL; 80 81 return item; 82} 83 84void pitem_free(pitem *item) 85{ 86 if (item == NULL) 87 return; 88 89 pq_64bit_free(&(item->priority)); 90 OPENSSL_free(item); 91} 92 93pqueue_s *pqueue_new() 94{ 95 pqueue_s *pq = (pqueue_s *)OPENSSL_malloc(sizeof(pqueue_s)); 96 if (pq == NULL) 97 return NULL; 98 99 memset(pq, 0x00, sizeof(pqueue_s)); 100 return pq; 101} 102 103void pqueue_free(pqueue_s *pq) 104{ 105 if (pq == NULL) 106 return; 107 108 OPENSSL_free(pq); 109} 110 111pitem *pqueue_insert(pqueue_s *pq, pitem *item) 112{ 113 pitem *curr, *next; 114 115 if (pq->items == NULL) { 116 pq->items = item; 117 return item; 118 } 119 120 for (curr = NULL, next = pq->items; 121 next != NULL; curr = next, next = next->next) { 122 if (pq_64bit_gt(&(next->priority), &(item->priority))) { 123 item->next = next; 124 125 if (curr == NULL) 126 pq->items = item; 127 else 128 curr->next = item; 129 130 return item; 131 } 132 /* duplicates not allowed */ 133 if (pq_64bit_eq(&(item->priority), &(next->priority))) 134 return NULL; 135 } 136 137 item->next = NULL; 138 curr->next = item; 139 140 return item; 141} 142 143pitem *pqueue_peek(pqueue_s *pq) 144{ 145 return pq->items; 146} 147 148pitem *pqueue_pop(pqueue_s *pq) 149{ 150 pitem *item = pq->items; 151 152 if (pq->items != NULL) 153 pq->items = pq->items->next; 154 155 return item; 156} 157 158pitem *pqueue_find(pqueue_s *pq, PQ_64BIT priority) 159{ 160 pitem *next; 161 pitem *found = NULL; 162 163 if (pq->items == NULL) 164 return NULL; 165 166 for (next = pq->items; next->next != NULL; next = next->next) { 167 if (pq_64bit_eq(&(next->priority), &priority)) { 168 found = next; 169 break; 170 } 171 } 172 173 /* check the one last node */ 174 if (pq_64bit_eq(&(next->priority), &priority)) 175 found = next; 176 177 if (!found) 178 return NULL; 179 180 return found; 181} 182 183#if PQ_64BIT_IS_INTEGER 184void pqueue_print(pqueue_s *pq) 185{ 186 pitem *item = pq->items; 187 188 while (item != NULL) { 189 printf("item\t" PQ_64BIT_PRINT "\n", item->priority); 190 item = item->next; 191 } 192} 193#endif 194 195pitem *pqueue_iterator(pqueue_s *pq) 196{ 197 return pqueue_peek(pq); 198} 199 200pitem *pqueue_next(pitem **item) 201{ 202 pitem *ret; 203 204 if (item == NULL || *item == NULL) 205 return NULL; 206 207 /* *item != NULL */ 208 ret = *item; 209 *item = (*item)->next; 210 211 return ret; 212} 213 214int pqueue_size(pqueue_s *pq) 215{ 216 pitem *item = pq->items; 217 int count = 0; 218 219 while (item != NULL) { 220 count++; 221 item = item->next; 222 } 223 return count; 224} 225