FreeCalypso > hg > fc-selenite
comparison src/nucleus/csc.c @ 7:0f80e1e4dce4
src/nucleus: library C code import from FreeNucleus package
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Sun, 15 Jul 2018 20:57:33 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 6:8b2a9a374324 | 7:0f80e1e4dce4 |
|---|---|
| 1 /*************************************************************************/ | |
| 2 /* */ | |
| 3 /* Copyright Mentor Graphics Corporation 2002 */ | |
| 4 /* All Rights Reserved. */ | |
| 5 /* */ | |
| 6 /* THIS WORK CONTAINS TRADE SECRET AND PROPRIETARY INFORMATION WHICH IS */ | |
| 7 /* THE PROPERTY OF MENTOR GRAPHICS CORPORATION OR ITS LICENSORS AND IS */ | |
| 8 /* SUBJECT TO LICENSE TERMS. */ | |
| 9 /* */ | |
| 10 /*************************************************************************/ | |
| 11 | |
| 12 /*************************************************************************/ | |
| 13 /* */ | |
| 14 /* FILE NAME VERSION */ | |
| 15 /* */ | |
| 16 /* csc.c Nucleus PLUS 1.14 */ | |
| 17 /* */ | |
| 18 /* COMPONENT */ | |
| 19 /* */ | |
| 20 /* CS - Common Services */ | |
| 21 /* */ | |
| 22 /* DESCRIPTION */ | |
| 23 /* */ | |
| 24 /* This file contains linked list manipulation facilities used */ | |
| 25 /* throughout the Nucleus PLUS system. These facilities operate */ | |
| 26 /* on doubly-linked circular lists. */ | |
| 27 /* */ | |
| 28 /* DATA STRUCTURES */ | |
| 29 /* */ | |
| 30 /* None */ | |
| 31 /* */ | |
| 32 /* FUNCTIONS */ | |
| 33 /* */ | |
| 34 /* CSC_Place_On_List Place node at the end of a */ | |
| 35 /* list */ | |
| 36 /* CSC_Priority_Place_On_List Place node in priority order */ | |
| 37 /* on a list */ | |
| 38 /* CSC_Remove_From_List Remove a node from a list */ | |
| 39 /* */ | |
| 40 /* DEPENDENCIES */ | |
| 41 /* */ | |
| 42 /* nucleus.h Nucleus PLUS constants */ | |
| 43 /* cs_defs.h Common service definitions */ | |
| 44 /* */ | |
| 45 /* HISTORY */ | |
| 46 /* */ | |
| 47 /* DATE REMARKS */ | |
| 48 /* */ | |
| 49 /* 03-01-1993 Created initial version 1.0 */ | |
| 50 /* 04-19-1993 Verified version 1.0 */ | |
| 51 /* 03-01-1994 Changed void to VOID, removed */ | |
| 52 /* clearing link pointers during */ | |
| 53 /* removal of a node from a list, */ | |
| 54 /* resulting in version 1.1 */ | |
| 55 /* */ | |
| 56 /* 03-18-1994 Verified version 1.1 */ | |
| 57 /* 04-17-1996 updated to version 1.2 */ | |
| 58 /* 03-24-1998 Released version 1.3. */ | |
| 59 /* 03-26-1999 Released 1.11m (new release */ | |
| 60 /* numbering scheme) */ | |
| 61 /* 04-17-2002 Released version 1.13m */ | |
| 62 /* 11-07-2002 Released version 1.14 */ | |
| 63 /*************************************************************************/ | |
| 64 #define NU_SOURCE_FILE | |
| 65 | |
| 66 | |
| 67 #include "cs_defs.h" /* Include CS definitions */ | |
| 68 #include "cs_extr.h" /* Common service functions */ | |
| 69 | |
| 70 | |
| 71 /*************************************************************************/ | |
| 72 /* */ | |
| 73 /* FUNCTION */ | |
| 74 /* */ | |
| 75 /* CSC_Place_On_List */ | |
| 76 /* */ | |
| 77 /* DESCRIPTION */ | |
| 78 /* */ | |
| 79 /* This function places the specified node at the end of specified */ | |
| 80 /* linked list. */ | |
| 81 /* */ | |
| 82 /* CALLED BY */ | |
| 83 /* */ | |
| 84 /* various components */ | |
| 85 /* */ | |
| 86 /* CALLS */ | |
| 87 /* */ | |
| 88 /* None */ | |
| 89 /* */ | |
| 90 /* INPUTS */ | |
| 91 /* */ | |
| 92 /* head Pointer to head pointer */ | |
| 93 /* node Pointer to node to add */ | |
| 94 /* */ | |
| 95 /* OUTPUTS */ | |
| 96 /* */ | |
| 97 /* modified list */ | |
| 98 /* */ | |
| 99 /* HISTORY */ | |
| 100 /* */ | |
| 101 /* NAME DATE REMARKS */ | |
| 102 /* */ | |
| 103 /* W. Lamie 03-01-1993 Created initial version 1.0 */ | |
| 104 /* D. Lamie 04-19-1993 Verified version 1.0 */ | |
| 105 /* */ | |
| 106 /*************************************************************************/ | |
| 107 | |
| 108 #ifndef NU_INLINE | |
| 109 | |
| 110 VOID CSC_Place_On_List(CS_NODE **head, CS_NODE *new_node) | |
| 111 { | |
| 112 NU_SUPERV_USER_VARIABLES | |
| 113 | |
| 114 /* Switch to supervisor mode */ | |
| 115 NU_SUPERVISOR_MODE(); | |
| 116 | |
| 117 /* Determine if the list in non-empty. */ | |
| 118 if (*head) | |
| 119 { | |
| 120 | |
| 121 /* The list is not empty. Add the new node to the end of | |
| 122 the list. */ | |
| 123 new_node -> cs_previous = (*head) -> cs_previous; | |
| 124 (new_node -> cs_previous) -> cs_next = new_node; | |
| 125 new_node -> cs_next = (*head); | |
| 126 (new_node -> cs_next) -> cs_previous = new_node; | |
| 127 } | |
| 128 else | |
| 129 { | |
| 130 | |
| 131 /* The list is empty, setup the head and the new node. */ | |
| 132 (*head) = new_node; | |
| 133 new_node -> cs_previous = new_node; | |
| 134 new_node -> cs_next = new_node; | |
| 135 } | |
| 136 | |
| 137 /* Return to user mode */ | |
| 138 NU_USER_MODE(); | |
| 139 } | |
| 140 | |
| 141 #endif | |
| 142 | |
| 143 /*************************************************************************/ | |
| 144 /* */ | |
| 145 /* FUNCTION */ | |
| 146 /* */ | |
| 147 /* CSC_Priority_Place_On_List */ | |
| 148 /* */ | |
| 149 /* DESCRIPTION */ | |
| 150 /* */ | |
| 151 /* This function places the specified node after all other nodes on */ | |
| 152 /* the list of equal or greater priority. Note that lower */ | |
| 153 /* numerical values indicate greater priority. */ | |
| 154 /* */ | |
| 155 /* CALLED BY */ | |
| 156 /* */ | |
| 157 /* various components */ | |
| 158 /* */ | |
| 159 /* CALLS */ | |
| 160 /* */ | |
| 161 /* None */ | |
| 162 /* */ | |
| 163 /* INPUTS */ | |
| 164 /* */ | |
| 165 /* head Pointer to head pointer */ | |
| 166 /* node Pointer to node to add */ | |
| 167 /* */ | |
| 168 /* OUTPUTS */ | |
| 169 /* */ | |
| 170 /* modified list */ | |
| 171 /* */ | |
| 172 /* HISTORY */ | |
| 173 /* */ | |
| 174 /* NAME DATE REMARKS */ | |
| 175 /* */ | |
| 176 /* W. Lamie 03-01-1993 Created initial version 1.0 */ | |
| 177 /* D. Lamie 04-19-1993 Verified version 1.0 */ | |
| 178 /* */ | |
| 179 /*************************************************************************/ | |
| 180 | |
| 181 VOID CSC_Priority_Place_On_List(CS_NODE **head, CS_NODE *new_node) | |
| 182 { | |
| 183 | |
| 184 CS_NODE *search_ptr; /* List search pointer */ | |
| 185 NU_SUPERV_USER_VARIABLES | |
| 186 | |
| 187 /* Switch to supervisor mode */ | |
| 188 NU_SUPERVISOR_MODE(); | |
| 189 | |
| 190 /* Determine if the list in non-empty. */ | |
| 191 if (*head) | |
| 192 { | |
| 193 | |
| 194 /* Search the list to find the proper place for the new node. */ | |
| 195 search_ptr = (*head); | |
| 196 | |
| 197 /* Check for insertion before the first node on the list. */ | |
| 198 if (search_ptr -> cs_priority > new_node -> cs_priority) | |
| 199 { | |
| 200 | |
| 201 /* Update the head pointer to point at the new node. */ | |
| 202 (*head) = new_node; | |
| 203 } | |
| 204 else | |
| 205 { | |
| 206 | |
| 207 /* We know that the new node is not the highest priority and | |
| 208 must be placed somewhere after the head pointer. */ | |
| 209 | |
| 210 /* Move search pointer up to the next node since we are trying | |
| 211 to find the proper node to insert in front of. */ | |
| 212 search_ptr = search_ptr -> cs_next; | |
| 213 while ((search_ptr -> cs_priority <= new_node -> cs_priority) && | |
| 214 (search_ptr != (*head))) | |
| 215 { | |
| 216 | |
| 217 /* Move along to the next node. */ | |
| 218 search_ptr = search_ptr -> cs_next; | |
| 219 } | |
| 220 } | |
| 221 | |
| 222 /* Insert before search pointer. */ | |
| 223 new_node -> cs_previous = search_ptr -> cs_previous; | |
| 224 (new_node -> cs_previous) -> cs_next = new_node; | |
| 225 new_node -> cs_next = search_ptr; | |
| 226 (new_node -> cs_next) -> cs_previous = new_node; | |
| 227 } | |
| 228 else | |
| 229 { | |
| 230 | |
| 231 /* The list is empty, setup the head and the new node. */ | |
| 232 (*head) = new_node; | |
| 233 new_node -> cs_previous = new_node; | |
| 234 new_node -> cs_next = new_node; | |
| 235 } | |
| 236 | |
| 237 /* Return to user mode */ | |
| 238 NU_USER_MODE(); | |
| 239 } | |
| 240 | |
| 241 /*************************************************************************/ | |
| 242 /* */ | |
| 243 /* FUNCTION */ | |
| 244 /* */ | |
| 245 /* CSC_Remove_From_List */ | |
| 246 /* */ | |
| 247 /* DESCRIPTION */ | |
| 248 /* */ | |
| 249 /* This function removes the specified node from the specified */ | |
| 250 /* linked list. */ | |
| 251 /* */ | |
| 252 /* CALLED BY */ | |
| 253 /* */ | |
| 254 /* various components */ | |
| 255 /* */ | |
| 256 /* CALLS */ | |
| 257 /* */ | |
| 258 /* None */ | |
| 259 /* */ | |
| 260 /* INPUTS */ | |
| 261 /* */ | |
| 262 /* head Pointer to head pointer */ | |
| 263 /* node Pointer to node to add */ | |
| 264 /* */ | |
| 265 /* OUTPUTS */ | |
| 266 /* */ | |
| 267 /* modified list */ | |
| 268 /* */ | |
| 269 /* HISTORY */ | |
| 270 /* */ | |
| 271 /* NAME DATE REMARKS */ | |
| 272 /* */ | |
| 273 /* W. Lamie 03-01-1993 Created initial version 1.0 */ | |
| 274 /* D. Lamie 04-19-1993 Verified version 1.0 */ | |
| 275 /* W. Lamie 03-01-1994 Removed clearing link pointers */ | |
| 276 /* during removal of a node from */ | |
| 277 /* list, resulting in version 1.1 */ | |
| 278 /* R. Pfaff - */ | |
| 279 /* D. Lamie 03-18-1994 Verified version 1.1 */ | |
| 280 /* */ | |
| 281 /*************************************************************************/ | |
| 282 | |
| 283 #ifndef NU_INLINE | |
| 284 | |
| 285 VOID CSC_Remove_From_List(CS_NODE **head, CS_NODE *node) | |
| 286 { | |
| 287 NU_SUPERV_USER_VARIABLES | |
| 288 | |
| 289 /* Switch to supervisor mode */ | |
| 290 NU_SUPERVISOR_MODE(); | |
| 291 | |
| 292 /* Determine if this is the only node in the system. */ | |
| 293 if (node -> cs_previous == node) | |
| 294 { | |
| 295 | |
| 296 /* Yes, this is the only node in the system. Clear the node's | |
| 297 pointers and the head pointer. */ | |
| 298 (*head) = NU_NULL; | |
| 299 } | |
| 300 else | |
| 301 { | |
| 302 | |
| 303 /* Unlink the node from a multiple node list. */ | |
| 304 (node -> cs_previous) -> cs_next = node -> cs_next; | |
| 305 (node -> cs_next) -> cs_previous = node -> cs_previous; | |
| 306 | |
| 307 /* Check to see if the node to delete is at the head of the | |
| 308 list. */ | |
| 309 if (node == *head) | |
| 310 | |
| 311 /* Move the head pointer to the node after. */ | |
| 312 *head = node -> cs_next; | |
| 313 } | |
| 314 | |
| 315 /* Return to user mode */ | |
| 316 NU_USER_MODE(); | |
| 317 } | |
| 318 | |
| 319 #endif | |
| 320 | |
| 321 | |
| 322 | |
| 323 | |
| 324 |
