This package includes the SharkSSL lite library and header files.
Dependents: WebSocket-Client-Example SharkMQ-LED-Demo
SharkSSL-Lite
Description: SharkSSL is an SSL v3.0 TLS v1.0/1.1/1.2 implementation of the TLS and SSL protocol standard. With its array of compile-time options and Raycrypto proprietary cryptographic algorithms, SharkSSL can be fine-tuned to a footprint that occupies less than 20 kB, while maintaining full x.509 authentication. The SharkSSL-Lite download includes a subset of SharkSSL and header files made for use in non-commercial and for evaluation purposes.
Features
- SSL|TLS v1.2
- Size: 21kB
- Encryption: Elliptic Curve Cryptography (ECC) | ChaCha20/Poly1305
- SharkSSL Online Documentation
- SMQ (Simple Message Queues) Client and SMQ Documentation
- Secure WebSocket Client
- Secure MQTT Client
Examples
- SharkMQ LED Demo: Secure control of LEDs on your mbed board using a browser.
- WebSocket Client: Connect to ELIZA the Psychotherapist
Limitations
SharkSSL-Lite includes a limited set of ciphers. To use SharkSSL-Lite, the peer side must support Elliptic Curve Cryptography (ECC) and you must use ECC certificates. The peer side must also support the new ChaCha20/Poly1305 cipher combination.
ChaCha20 and Poly1305 for TLS is published RFC 7905. The development of this new cipher was a response to many attacks discovered against other widely used TLS cipher suites. ChaCha20 is the cipher and Poly1305 is an authenticated encryption mode.
SharkSSL-Lite occupies less than 20kB, while maintaining full x.509 authentication. The ChaCha20/Poly1305 cipher software implementation is equally as fast as many hardware accelerated AES engines.
Creating ECC Certificates for SharkSSL-Lite
The following video shows how to create an Elliptic Curve Cryptography (ECC) certificate for a server, how to install the certificate in the server, and how to make the mbed clients connecting to the server trust this certificate. The server in this video is installed on a private/personal computer on a private network for test purposes. The video was produced for the embedded.com article How to run your own secure IoT cloud server.
inc/SingleList.h@1:d5e0e1dcf0d6, 2016-05-23 (annotated)
- Committer:
- wini
- Date:
- Mon May 23 13:56:30 2016 +0000
- Revision:
- 1:d5e0e1dcf0d6
- Parent:
- 0:e0adec41ad6b
Type conflict fix (U8-U32) for latest mbed release.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
wini | 0:e0adec41ad6b | 1 | /* |
wini | 0:e0adec41ad6b | 2 | * ____ _________ __ _ |
wini | 0:e0adec41ad6b | 3 | * / __ \___ ____ _/ /_ __(_)___ ___ ___ / / ____ ____ _(_)____ |
wini | 0:e0adec41ad6b | 4 | * / /_/ / _ \/ __ `/ / / / / / __ `__ \/ _ \/ / / __ \/ __ `/ / ___/ |
wini | 0:e0adec41ad6b | 5 | * / _, _/ __/ /_/ / / / / / / / / / / / __/ /___/ /_/ / /_/ / / /__ |
wini | 0:e0adec41ad6b | 6 | * /_/ |_|\___/\__,_/_/ /_/ /_/_/ /_/ /_/\___/_____/\____/\__, /_/\___/ |
wini | 0:e0adec41ad6b | 7 | * /____/ |
wini | 0:e0adec41ad6b | 8 | **************************************************************************** |
wini | 0:e0adec41ad6b | 9 | * HEADER |
wini | 0:e0adec41ad6b | 10 | * |
wini | 0:e0adec41ad6b | 11 | * $Id: SingleList.h 3215 2013-11-29 14:43:17Z wini $ |
wini | 0:e0adec41ad6b | 12 | * |
wini | 0:e0adec41ad6b | 13 | * COPYRIGHT: Real Time Logic, 2002 |
wini | 0:e0adec41ad6b | 14 | * |
wini | 0:e0adec41ad6b | 15 | * This software is copyrighted by and is the sole property of Real |
wini | 0:e0adec41ad6b | 16 | * Time Logic LLC. All rights, title, ownership, or other interests in |
wini | 0:e0adec41ad6b | 17 | * the software remain the property of Real Time Logic LLC. This |
wini | 0:e0adec41ad6b | 18 | * software may only be used in accordance with the terms and |
wini | 0:e0adec41ad6b | 19 | * conditions stipulated in the corresponding license agreement under |
wini | 0:e0adec41ad6b | 20 | * which the software has been supplied. Any unauthorized use, |
wini | 0:e0adec41ad6b | 21 | * duplication, transmission, distribution, or disclosure of this |
wini | 0:e0adec41ad6b | 22 | * software is expressly forbidden. |
wini | 0:e0adec41ad6b | 23 | * |
wini | 0:e0adec41ad6b | 24 | * This Copyright notice may not be removed or modified without prior |
wini | 0:e0adec41ad6b | 25 | * written consent of Real Time Logic LLC. |
wini | 0:e0adec41ad6b | 26 | * |
wini | 0:e0adec41ad6b | 27 | * Real Time Logic LLC. reserves the right to modify this software |
wini | 0:e0adec41ad6b | 28 | * without notice. |
wini | 0:e0adec41ad6b | 29 | * |
wini | 0:e0adec41ad6b | 30 | * http://www.realtimelogic.com |
wini | 0:e0adec41ad6b | 31 | **************************************************************************** |
wini | 0:e0adec41ad6b | 32 | |
wini | 0:e0adec41ad6b | 33 | CONTENTS |
wini | 0:e0adec41ad6b | 34 | -------- |
wini | 0:e0adec41ad6b | 35 | |
wini | 0:e0adec41ad6b | 36 | 1 Description |
wini | 0:e0adec41ad6b | 37 | 2 History of developmentDoubleLink |
wini | 0:e0adec41ad6b | 38 | 3 Macros |
wini | 0:e0adec41ad6b | 39 | 4 Include files |
wini | 0:e0adec41ad6b | 40 | 5 types Constants Variables |
wini | 0:e0adec41ad6b | 41 | 6 Function prototypes |
wini | 0:e0adec41ad6b | 42 | |
wini | 0:e0adec41ad6b | 43 | **************************************************************************** |
wini | 0:e0adec41ad6b | 44 | */ |
wini | 0:e0adec41ad6b | 45 | #ifndef _SingleList_h |
wini | 0:e0adec41ad6b | 46 | #define _SingleList_h |
wini | 0:e0adec41ad6b | 47 | |
wini | 0:e0adec41ad6b | 48 | /* |
wini | 0:e0adec41ad6b | 49 | **************************************************************************** |
wini | 0:e0adec41ad6b | 50 | * 1 DESCRIPTION. |
wini | 0:e0adec41ad6b | 51 | **************************************************************************** |
wini | 0:e0adec41ad6b | 52 | * |
wini | 0:e0adec41ad6b | 53 | */ |
wini | 0:e0adec41ad6b | 54 | |
wini | 0:e0adec41ad6b | 55 | /* |
wini | 0:e0adec41ad6b | 56 | **************************************************************************** |
wini | 0:e0adec41ad6b | 57 | * |
wini | 0:e0adec41ad6b | 58 | */ |
wini | 0:e0adec41ad6b | 59 | |
wini | 0:e0adec41ad6b | 60 | /* |
wini | 0:e0adec41ad6b | 61 | **************************************************************************** |
wini | 0:e0adec41ad6b | 62 | * 3 MACROS. |
wini | 0:e0adec41ad6b | 63 | **************************************************************************** |
wini | 0:e0adec41ad6b | 64 | */ |
wini | 0:e0adec41ad6b | 65 | |
wini | 0:e0adec41ad6b | 66 | /* |
wini | 0:e0adec41ad6b | 67 | **************************************************************************** |
wini | 0:e0adec41ad6b | 68 | * 4 INCLUDE FILES. |
wini | 0:e0adec41ad6b | 69 | **************************************************************************** |
wini | 0:e0adec41ad6b | 70 | */ |
wini | 0:e0adec41ad6b | 71 | #include <TargConfig.h> |
wini | 0:e0adec41ad6b | 72 | |
wini | 0:e0adec41ad6b | 73 | |
wini | 0:e0adec41ad6b | 74 | /* |
wini | 0:e0adec41ad6b | 75 | **************************************************************************** |
wini | 0:e0adec41ad6b | 76 | * 5 TYPES CONSTANTS VARIABLES |
wini | 0:e0adec41ad6b | 77 | **************************************************************************** |
wini | 0:e0adec41ad6b | 78 | */ |
wini | 0:e0adec41ad6b | 79 | |
wini | 0:e0adec41ad6b | 80 | /*Forward declarations*/ |
wini | 0:e0adec41ad6b | 81 | struct SingleList; |
wini | 0:e0adec41ad6b | 82 | struct SingleListEnumerator; |
wini | 0:e0adec41ad6b | 83 | |
wini | 0:e0adec41ad6b | 84 | /*=========================================================================== |
wini | 0:e0adec41ad6b | 85 | * |
wini | 0:e0adec41ad6b | 86 | * Class: SingleLink |
wini | 0:e0adec41ad6b | 87 | *--------------------------------------------------------------------------- |
wini | 0:e0adec41ad6b | 88 | * Description: |
wini | 0:e0adec41ad6b | 89 | * Contains the link chain for the next element in the SingleList. Subclass |
wini | 0:e0adec41ad6b | 90 | * o link for data stored in the SingleList. |
wini | 0:e0adec41ad6b | 91 | * Note, o class contains no virtual destructor and the subclassed node |
wini | 0:e0adec41ad6b | 92 | * will not be informed when the node is deleted. |
wini | 0:e0adec41ad6b | 93 | */ |
wini | 0:e0adec41ad6b | 94 | typedef struct SingleLink |
wini | 0:e0adec41ad6b | 95 | { |
wini | 0:e0adec41ad6b | 96 | #ifdef __cplusplus |
wini | 0:e0adec41ad6b | 97 | SingleLink(); |
wini | 0:e0adec41ad6b | 98 | SingleLink* getNext(); |
wini | 0:e0adec41ad6b | 99 | private: |
wini | 0:e0adec41ad6b | 100 | friend struct SingleList; |
wini | 0:e0adec41ad6b | 101 | friend struct SingleListEnumerator; |
wini | 0:e0adec41ad6b | 102 | #endif |
wini | 0:e0adec41ad6b | 103 | struct SingleLink* next; |
wini | 0:e0adec41ad6b | 104 | } SingleLink; |
wini | 0:e0adec41ad6b | 105 | #define SingleLink_constructor(o) ((SingleLink*)(o))->next = 0 |
wini | 0:e0adec41ad6b | 106 | #define SingleLink_getNext(o) ((SingleLink*)(o))->next |
wini | 0:e0adec41ad6b | 107 | #define SingleLink_isLinked(o) \ |
wini | 0:e0adec41ad6b | 108 | (((SingleLink*)o)->next ? TRUE : FALSE) |
wini | 0:e0adec41ad6b | 109 | |
wini | 0:e0adec41ad6b | 110 | #ifdef __cplusplus |
wini | 0:e0adec41ad6b | 111 | inline SingleLink::SingleLink() {SingleLink_constructor(this);} |
wini | 0:e0adec41ad6b | 112 | inline SingleLink* SingleLink::getNext() {return SingleLink_getNext(this);} |
wini | 0:e0adec41ad6b | 113 | #endif |
wini | 0:e0adec41ad6b | 114 | |
wini | 0:e0adec41ad6b | 115 | /*=========================================================================== |
wini | 0:e0adec41ad6b | 116 | * |
wini | 0:e0adec41ad6b | 117 | * Class: SingleList |
wini | 0:e0adec41ad6b | 118 | *--------------------------------------------------------------------------- |
wini | 0:e0adec41ad6b | 119 | * Description: |
wini | 0:e0adec41ad6b | 120 | * Contains nodes of type SingleLink. |
wini | 0:e0adec41ad6b | 121 | */ |
wini | 0:e0adec41ad6b | 122 | typedef struct SingleList |
wini | 0:e0adec41ad6b | 123 | { |
wini | 0:e0adec41ad6b | 124 | #ifdef __cplusplus |
wini | 0:e0adec41ad6b | 125 | SingleList(); |
wini | 0:e0adec41ad6b | 126 | void insertLast(SingleLink* link); |
wini | 0:e0adec41ad6b | 127 | SingleLink* removeFirst(); |
wini | 0:e0adec41ad6b | 128 | SingleLink* peekFirst(); |
wini | 0:e0adec41ad6b | 129 | bool isEmpty(); |
wini | 0:e0adec41ad6b | 130 | bool isLast(SingleLink* link); |
wini | 0:e0adec41ad6b | 131 | private: |
wini | 0:e0adec41ad6b | 132 | friend struct SingleListEnumerator; |
wini | 0:e0adec41ad6b | 133 | #endif |
wini | 0:e0adec41ad6b | 134 | SingleLink link; |
wini | 0:e0adec41ad6b | 135 | SingleLink* last; |
wini | 0:e0adec41ad6b | 136 | } SingleList; |
wini | 0:e0adec41ad6b | 137 | |
wini | 0:e0adec41ad6b | 138 | #define SingleList_insertLast(o, linkMA) do \ |
wini | 0:e0adec41ad6b | 139 | { \ |
wini | 0:e0adec41ad6b | 140 | baAssert((SingleLink*)(linkMA) != (SingleLink*)(o)); \ |
wini | 0:e0adec41ad6b | 141 | baAssert(((SingleLink*)(linkMA))->next == 0); \ |
wini | 0:e0adec41ad6b | 142 | (o)->last->next = (SingleLink*)(linkMA); \ |
wini | 0:e0adec41ad6b | 143 | (o)->last = (SingleLink*)(linkMA); \ |
wini | 0:e0adec41ad6b | 144 | ((SingleLink*)(linkMA))->next = (SingleLink*)(o); \ |
wini | 0:e0adec41ad6b | 145 | } while(0) |
wini | 0:e0adec41ad6b | 146 | |
wini | 0:e0adec41ad6b | 147 | #define SingleList_peekFirst(o) ((o)->link.next == (SingleLink*)(o) ? 0 : (o)->link.next) |
wini | 0:e0adec41ad6b | 148 | |
wini | 0:e0adec41ad6b | 149 | #define SingleList_isEmpty(o) ((o)->link.next == (SingleLink*)(o)) |
wini | 0:e0adec41ad6b | 150 | #define SingleList_isLast(o, n) ((n)->next == (SingleLink*)(o)) |
wini | 0:e0adec41ad6b | 151 | |
wini | 0:e0adec41ad6b | 152 | #ifdef __cplusplus |
wini | 0:e0adec41ad6b | 153 | extern "C" { |
wini | 0:e0adec41ad6b | 154 | #endif |
wini | 0:e0adec41ad6b | 155 | BA_API void SingleList_constructor(SingleList* o); |
wini | 0:e0adec41ad6b | 156 | BA_API SingleLink* SingleList_removeFirst(SingleList* o); |
wini | 0:e0adec41ad6b | 157 | #ifdef __cplusplus |
wini | 0:e0adec41ad6b | 158 | } |
wini | 0:e0adec41ad6b | 159 | inline |
wini | 0:e0adec41ad6b | 160 | SingleList::SingleList() { SingleList_constructor(this); } |
wini | 0:e0adec41ad6b | 161 | inline void |
wini | 0:e0adec41ad6b | 162 | SingleList::insertLast(SingleLink* link) { SingleList_insertLast(this, link); } |
wini | 0:e0adec41ad6b | 163 | inline SingleLink* |
wini | 0:e0adec41ad6b | 164 | SingleList::peekFirst() { return SingleList_peekFirst(this); } |
wini | 0:e0adec41ad6b | 165 | inline bool |
wini | 0:e0adec41ad6b | 166 | SingleList::isEmpty() { return SingleList_isEmpty(this); } |
wini | 0:e0adec41ad6b | 167 | inline bool |
wini | 0:e0adec41ad6b | 168 | SingleList::isLast(SingleLink* link) { return SingleList_isLast(this,link); } |
wini | 0:e0adec41ad6b | 169 | inline SingleLink* |
wini | 0:e0adec41ad6b | 170 | SingleList::removeFirst() { return SingleList_removeFirst(this); } |
wini | 0:e0adec41ad6b | 171 | #endif |
wini | 0:e0adec41ad6b | 172 | |
wini | 0:e0adec41ad6b | 173 | /*=========================================================================== |
wini | 0:e0adec41ad6b | 174 | * |
wini | 0:e0adec41ad6b | 175 | * Class: SingleListEnumerator |
wini | 0:e0adec41ad6b | 176 | *--------------------------------------------------------------------------- |
wini | 0:e0adec41ad6b | 177 | * Description: |
wini | 0:e0adec41ad6b | 178 | * Usage: |
wini | 0:e0adec41ad6b | 179 | * SingleListEnumerator e(list); |
wini | 0:e0adec41ad6b | 180 | * for(Slink* link = e.getElement() ; link ; link = e.nextElement()) |
wini | 0:e0adec41ad6b | 181 | * or |
wini | 0:e0adec41ad6b | 182 | * SingleListEnumerator e(list); |
wini | 0:e0adec41ad6b | 183 | * Slink* link = e.getElement(); |
wini | 0:e0adec41ad6b | 184 | * while(link) |
wini | 0:e0adec41ad6b | 185 | * { |
wini | 0:e0adec41ad6b | 186 | * if(link bla bla) |
wini | 0:e0adec41ad6b | 187 | * //Deletes current element and returns next element |
wini | 0:e0adec41ad6b | 188 | * link = e.deleteElement(); |
wini | 0:e0adec41ad6b | 189 | * else |
wini | 0:e0adec41ad6b | 190 | * link = e.nextElement(); |
wini | 0:e0adec41ad6b | 191 | * } |
wini | 0:e0adec41ad6b | 192 | */ |
wini | 0:e0adec41ad6b | 193 | typedef struct SingleListEnumerator |
wini | 0:e0adec41ad6b | 194 | { |
wini | 0:e0adec41ad6b | 195 | #ifdef __cplusplus |
wini | 0:e0adec41ad6b | 196 | SingleListEnumerator(){} |
wini | 0:e0adec41ad6b | 197 | SingleListEnumerator(SingleList* list); |
wini | 0:e0adec41ad6b | 198 | SingleLink* getElement(); |
wini | 0:e0adec41ad6b | 199 | SingleLink* nextElement(); |
wini | 0:e0adec41ad6b | 200 | SingleLink* removeElement(); |
wini | 0:e0adec41ad6b | 201 | int insertBefore(SingleLink* l); |
wini | 0:e0adec41ad6b | 202 | private: |
wini | 0:e0adec41ad6b | 203 | #endif |
wini | 0:e0adec41ad6b | 204 | SingleList* list; |
wini | 0:e0adec41ad6b | 205 | SingleLink* prevElement; |
wini | 0:e0adec41ad6b | 206 | SingleLink* curElement; |
wini | 0:e0adec41ad6b | 207 | } SingleListEnumerator; |
wini | 0:e0adec41ad6b | 208 | |
wini | 0:e0adec41ad6b | 209 | #define SingleListEnumerator_constructor(o, listMA) do \ |
wini | 0:e0adec41ad6b | 210 | { \ |
wini | 0:e0adec41ad6b | 211 | (o)->list = listMA; \ |
wini | 0:e0adec41ad6b | 212 | (o)->prevElement = (SingleLink*)listMA; \ |
wini | 0:e0adec41ad6b | 213 | (o)->curElement = SingleList_isEmpty(listMA) ? 0 : (o)->list->link.next; \ |
wini | 0:e0adec41ad6b | 214 | } while(0) |
wini | 0:e0adec41ad6b | 215 | |
wini | 0:e0adec41ad6b | 216 | #define SingleListEnumerator_getElement(o) (o)->curElement |
wini | 0:e0adec41ad6b | 217 | |
wini | 0:e0adec41ad6b | 218 | #define SingleListEnumerator_nextElement(o) \ |
wini | 0:e0adec41ad6b | 219 | ((o)->curElement ? ( \ |
wini | 0:e0adec41ad6b | 220 | (o)->prevElement = (o)->prevElement->next, \ |
wini | 0:e0adec41ad6b | 221 | (o)->curElement = (o)->curElement == (o)->list->last ? 0 : (o)->curElement->next, \ |
wini | 0:e0adec41ad6b | 222 | (o)->curElement \ |
wini | 0:e0adec41ad6b | 223 | ) : 0) |
wini | 0:e0adec41ad6b | 224 | |
wini | 0:e0adec41ad6b | 225 | #ifdef __cplusplus |
wini | 0:e0adec41ad6b | 226 | extern "C" { |
wini | 0:e0adec41ad6b | 227 | #endif |
wini | 0:e0adec41ad6b | 228 | BA_API int SingleListEnumerator_insertBefore( |
wini | 0:e0adec41ad6b | 229 | SingleListEnumerator*, SingleLink*); |
wini | 0:e0adec41ad6b | 230 | BA_API SingleLink* SingleListEnumerator_removeElement(SingleListEnumerator* o); |
wini | 0:e0adec41ad6b | 231 | #ifdef __cplusplus |
wini | 0:e0adec41ad6b | 232 | } |
wini | 0:e0adec41ad6b | 233 | inline SingleListEnumerator::SingleListEnumerator(SingleList* list) { |
wini | 0:e0adec41ad6b | 234 | SingleListEnumerator_constructor(this, list); } |
wini | 0:e0adec41ad6b | 235 | inline SingleLink* |
wini | 0:e0adec41ad6b | 236 | SingleListEnumerator::removeElement() { |
wini | 0:e0adec41ad6b | 237 | return SingleListEnumerator_removeElement(this); } |
wini | 0:e0adec41ad6b | 238 | inline SingleLink* |
wini | 0:e0adec41ad6b | 239 | SingleListEnumerator::getElement() {return SingleListEnumerator_getElement(this);} |
wini | 0:e0adec41ad6b | 240 | inline SingleLink* |
wini | 0:e0adec41ad6b | 241 | SingleListEnumerator::nextElement() {return SingleListEnumerator_nextElement(this); } |
wini | 0:e0adec41ad6b | 242 | inline int SingleListEnumerator::insertBefore(SingleLink* l) { |
wini | 0:e0adec41ad6b | 243 | return SingleListEnumerator_insertBefore(this, l); } |
wini | 0:e0adec41ad6b | 244 | #endif |
wini | 0:e0adec41ad6b | 245 | |
wini | 0:e0adec41ad6b | 246 | |
wini | 0:e0adec41ad6b | 247 | #endif /*_SingleList_h*/ |
wini | 0:e0adec41ad6b | 248 | |
wini | 0:e0adec41ad6b | 249 | |
wini | 0:e0adec41ad6b | 250 | #if defined(SingleListCode) && ! defined(SingleListCodeIncluded) |
wini | 0:e0adec41ad6b | 251 | #define SingleListCodeIncluded |
wini | 0:e0adec41ad6b | 252 | |
wini | 0:e0adec41ad6b | 253 | BA_API void |
wini | 0:e0adec41ad6b | 254 | SingleList_constructor(SingleList* o) |
wini | 0:e0adec41ad6b | 255 | { |
wini | 0:e0adec41ad6b | 256 | SingleLink_constructor((SingleLink*)o); |
wini | 0:e0adec41ad6b | 257 | o->last = ((SingleLink*)o); |
wini | 0:e0adec41ad6b | 258 | o->last->next = ((SingleLink*)o); |
wini | 0:e0adec41ad6b | 259 | o->link.next = ((SingleLink*)o); |
wini | 0:e0adec41ad6b | 260 | } |
wini | 0:e0adec41ad6b | 261 | |
wini | 0:e0adec41ad6b | 262 | |
wini | 0:e0adec41ad6b | 263 | BA_API int |
wini | 0:e0adec41ad6b | 264 | SingleListEnumerator_insertBefore(SingleListEnumerator* o, SingleLink* l) |
wini | 0:e0adec41ad6b | 265 | { |
wini | 0:e0adec41ad6b | 266 | if(l->next) |
wini | 0:e0adec41ad6b | 267 | return -1; |
wini | 0:e0adec41ad6b | 268 | |
wini | 0:e0adec41ad6b | 269 | if(SingleList_isEmpty(o->list)) |
wini | 0:e0adec41ad6b | 270 | SingleList_insertLast(o->list, l); |
wini | 0:e0adec41ad6b | 271 | else |
wini | 0:e0adec41ad6b | 272 | { |
wini | 0:e0adec41ad6b | 273 | l->next = o->prevElement->next; |
wini | 0:e0adec41ad6b | 274 | o->prevElement->next = l; |
wini | 0:e0adec41ad6b | 275 | } |
wini | 0:e0adec41ad6b | 276 | o->prevElement = l; |
wini | 0:e0adec41ad6b | 277 | return 0; |
wini | 0:e0adec41ad6b | 278 | } |
wini | 0:e0adec41ad6b | 279 | |
wini | 0:e0adec41ad6b | 280 | |
wini | 0:e0adec41ad6b | 281 | BA_API SingleLink* |
wini | 0:e0adec41ad6b | 282 | SingleListEnumerator_removeElement(SingleListEnumerator* o) |
wini | 0:e0adec41ad6b | 283 | { |
wini | 0:e0adec41ad6b | 284 | if(o->curElement) |
wini | 0:e0adec41ad6b | 285 | { |
wini | 0:e0adec41ad6b | 286 | /*Store current position and iterate iterator*/ |
wini | 0:e0adec41ad6b | 287 | SingleLink* cur = o->curElement; |
wini | 0:e0adec41ad6b | 288 | /*If element to remove is last element in list*/ |
wini | 0:e0adec41ad6b | 289 | if(cur == o->list->last) |
wini | 0:e0adec41ad6b | 290 | { |
wini | 0:e0adec41ad6b | 291 | o->curElement = 0; |
wini | 0:e0adec41ad6b | 292 | o->list->last = o->prevElement; |
wini | 0:e0adec41ad6b | 293 | o->prevElement->next = (SingleLink*)o->list; |
wini | 0:e0adec41ad6b | 294 | } |
wini | 0:e0adec41ad6b | 295 | else |
wini | 0:e0adec41ad6b | 296 | { |
wini | 0:e0adec41ad6b | 297 | o->curElement = o->curElement->next; |
wini | 0:e0adec41ad6b | 298 | o->prevElement->next = o->curElement; |
wini | 0:e0adec41ad6b | 299 | } |
wini | 0:e0adec41ad6b | 300 | cur->next = 0; |
wini | 0:e0adec41ad6b | 301 | } |
wini | 0:e0adec41ad6b | 302 | return o->curElement; |
wini | 0:e0adec41ad6b | 303 | } |
wini | 0:e0adec41ad6b | 304 | |
wini | 0:e0adec41ad6b | 305 | |
wini | 0:e0adec41ad6b | 306 | BA_API SingleLink* |
wini | 0:e0adec41ad6b | 307 | SingleList_removeFirst(SingleList* o) |
wini | 0:e0adec41ad6b | 308 | { |
wini | 0:e0adec41ad6b | 309 | SingleLink* link2Remove; |
wini | 0:e0adec41ad6b | 310 | link2Remove = o->link.next; |
wini | 0:e0adec41ad6b | 311 | if(o->link.next == o->last) |
wini | 0:e0adec41ad6b | 312 | { |
wini | 0:e0adec41ad6b | 313 | if(o->link.next == (SingleLink*)o) |
wini | 0:e0adec41ad6b | 314 | return 0; |
wini | 0:e0adec41ad6b | 315 | o->link.next = o->last = (SingleLink*)o; |
wini | 0:e0adec41ad6b | 316 | } |
wini | 0:e0adec41ad6b | 317 | else |
wini | 0:e0adec41ad6b | 318 | o->link.next = o->link.next->next; |
wini | 0:e0adec41ad6b | 319 | link2Remove->next = 0; |
wini | 0:e0adec41ad6b | 320 | return link2Remove; |
wini | 0:e0adec41ad6b | 321 | } |
wini | 0:e0adec41ad6b | 322 | |
wini | 0:e0adec41ad6b | 323 | #endif /* SingleListCode */ |