| OLD | NEW |
| 1 /* | 1 /* |
| 2 * list.c: lists handling implementation | 2 * list.c: lists handling implementation |
| 3 * | 3 * |
| 4 * Copyright (C) 2000 Gary Pennington and Daniel Veillard. | 4 * Copyright (C) 2000 Gary Pennington and Daniel Veillard. |
| 5 * | 5 * |
| 6 * Permission to use, copy, modify, and distribute this software for any | 6 * Permission to use, copy, modify, and distribute this software for any |
| 7 * purpose with or without fee is hereby granted, provided that the above | 7 * purpose with or without fee is hereby granted, provided that the above |
| 8 * copyright notice and this permission notice appear in all copies. | 8 * copyright notice and this permission notice appear in all copies. |
| 9 * | 9 * |
| 10 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED | 10 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 | 87 |
| 88 /** | 88 /** |
| 89 * xmlListLowerSearch: | 89 * xmlListLowerSearch: |
| 90 * @l: a list | 90 * @l: a list |
| 91 * @data: a data | 91 * @data: a data |
| 92 * | 92 * |
| 93 * Search data in the ordered list walking from the beginning | 93 * Search data in the ordered list walking from the beginning |
| 94 * | 94 * |
| 95 * Returns the link containing the data or NULL | 95 * Returns the link containing the data or NULL |
| 96 */ | 96 */ |
| 97 static xmlLinkPtr | 97 static xmlLinkPtr |
| 98 xmlListLowerSearch(xmlListPtr l, void *data) | 98 xmlListLowerSearch(xmlListPtr l, void *data) |
| 99 { | 99 { |
| 100 xmlLinkPtr lk; | 100 xmlLinkPtr lk; |
| 101 | 101 |
| 102 if (l == NULL) | 102 if (l == NULL) |
| 103 return(NULL); | 103 return(NULL); |
| 104 for(lk = l->sentinel->next;lk != l->sentinel && l->linkCompare(lk->data, dat
a) <0 ;lk = lk->next); | 104 for(lk = l->sentinel->next;lk != l->sentinel && l->linkCompare(lk->data, dat
a) <0 ;lk = lk->next); |
| 105 return lk; | 105 return lk; |
| 106 } | 106 } |
| 107 | 107 |
| 108 /** | 108 /** |
| 109 * xmlListHigherSearch: | 109 * xmlListHigherSearch: |
| 110 * @l: a list | 110 * @l: a list |
| 111 * @data: a data | 111 * @data: a data |
| 112 * | 112 * |
| 113 * Search data in the ordered list walking backward from the end | 113 * Search data in the ordered list walking backward from the end |
| 114 * | 114 * |
| 115 * Returns the link containing the data or NULL | 115 * Returns the link containing the data or NULL |
| 116 */ | 116 */ |
| 117 static xmlLinkPtr | 117 static xmlLinkPtr |
| 118 xmlListHigherSearch(xmlListPtr l, void *data) | 118 xmlListHigherSearch(xmlListPtr l, void *data) |
| 119 { | 119 { |
| 120 xmlLinkPtr lk; | 120 xmlLinkPtr lk; |
| 121 | 121 |
| 122 if (l == NULL) | 122 if (l == NULL) |
| 123 return(NULL); | 123 return(NULL); |
| 124 for(lk = l->sentinel->prev;lk != l->sentinel && l->linkCompare(lk->data, dat
a) >0 ;lk = lk->prev); | 124 for(lk = l->sentinel->prev;lk != l->sentinel && l->linkCompare(lk->data, dat
a) >0 ;lk = lk->prev); |
| 125 return lk; | 125 return lk; |
| 126 } | 126 } |
| 127 | 127 |
| 128 /** | 128 /** |
| 129 * xmlListSearch: | 129 * xmlListSearch: |
| 130 * @l: a list | 130 * @l: a list |
| 131 * @data: a data | 131 * @data: a data |
| 132 * | 132 * |
| 133 * Search data in the list | 133 * Search data in the list |
| 134 * | 134 * |
| 135 * Returns the link containing the data or NULL | 135 * Returns the link containing the data or NULL |
| 136 */ | 136 */ |
| 137 static xmlLinkPtr | 137 static xmlLinkPtr |
| 138 xmlListLinkSearch(xmlListPtr l, void *data) | 138 xmlListLinkSearch(xmlListPtr l, void *data) |
| 139 { | 139 { |
| 140 xmlLinkPtr lk; | 140 xmlLinkPtr lk; |
| 141 if (l == NULL) | 141 if (l == NULL) |
| 142 return(NULL); | 142 return(NULL); |
| 143 lk = xmlListLowerSearch(l, data); | 143 lk = xmlListLowerSearch(l, data); |
| 144 if (lk == l->sentinel) | 144 if (lk == l->sentinel) |
| 145 return NULL; | 145 return NULL; |
| 146 else { | 146 else { |
| 147 if (l->linkCompare(lk->data, data) ==0) | 147 if (l->linkCompare(lk->data, data) ==0) |
| 148 return lk; | 148 return lk; |
| 149 return NULL; | 149 return NULL; |
| 150 } | 150 } |
| 151 } | 151 } |
| 152 | 152 |
| 153 /** | 153 /** |
| 154 * xmlListLinkReverseSearch: | 154 * xmlListLinkReverseSearch: |
| 155 * @l: a list | 155 * @l: a list |
| 156 * @data: a data | 156 * @data: a data |
| 157 * | 157 * |
| 158 * Search data in the list processing backward | 158 * Search data in the list processing backward |
| 159 * | 159 * |
| 160 * Returns the link containing the data or NULL | 160 * Returns the link containing the data or NULL |
| 161 */ | 161 */ |
| 162 static xmlLinkPtr | 162 static xmlLinkPtr |
| 163 xmlListLinkReverseSearch(xmlListPtr l, void *data) | 163 xmlListLinkReverseSearch(xmlListPtr l, void *data) |
| 164 { | 164 { |
| 165 xmlLinkPtr lk; | 165 xmlLinkPtr lk; |
| 166 if (l == NULL) | 166 if (l == NULL) |
| 167 return(NULL); | 167 return(NULL); |
| 168 lk = xmlListHigherSearch(l, data); | 168 lk = xmlListHigherSearch(l, data); |
| 169 if (lk == l->sentinel) | 169 if (lk == l->sentinel) |
| 170 return NULL; | 170 return NULL; |
| 171 else { | 171 else { |
| 172 if (l->linkCompare(lk->data, data) ==0) | 172 if (l->linkCompare(lk->data, data) ==0) |
| 173 return lk; | 173 return lk; |
| 174 return NULL; | 174 return NULL; |
| 175 } | 175 } |
| 176 } | 176 } |
| 177 | 177 |
| 178 /** | 178 /** |
| 179 * xmlListCreate: | 179 * xmlListCreate: |
| 180 * @deallocator: an optional deallocator function | 180 * @deallocator: an optional deallocator function |
| 181 * @compare: an optional comparison function | 181 * @compare: an optional comparison function |
| 182 * | 182 * |
| 183 * Create a new list | 183 * Create a new list |
| 184 * | 184 * |
| 185 * Returns the new list or NULL in case of error | 185 * Returns the new list or NULL in case of error |
| 186 */ | 186 */ |
| 187 xmlListPtr | 187 xmlListPtr |
| 188 xmlListCreate(xmlListDeallocator deallocator, xmlListDataCompare compare) | 188 xmlListCreate(xmlListDeallocator deallocator, xmlListDataCompare compare) |
| 189 { | 189 { |
| 190 xmlListPtr l; | 190 xmlListPtr l; |
| 191 if (NULL == (l = (xmlListPtr )xmlMalloc( sizeof(xmlList)))) { | 191 if (NULL == (l = (xmlListPtr )xmlMalloc( sizeof(xmlList)))) { |
| 192 xmlGenericError(xmlGenericErrorContext, | 192 xmlGenericError(xmlGenericErrorContext, |
| 193 "Cannot initialize memory for list"); | 193 "Cannot initialize memory for list"); |
| 194 return (NULL); | 194 return (NULL); |
| 195 } | 195 } |
| 196 /* Initialize the list to NULL */ | 196 /* Initialize the list to NULL */ |
| 197 memset(l, 0, sizeof(xmlList)); | 197 memset(l, 0, sizeof(xmlList)); |
| 198 | 198 |
| 199 /* Add the sentinel */ | 199 /* Add the sentinel */ |
| 200 if (NULL ==(l->sentinel = (xmlLinkPtr )xmlMalloc(sizeof(xmlLink)))) { | 200 if (NULL ==(l->sentinel = (xmlLinkPtr )xmlMalloc(sizeof(xmlLink)))) { |
| 201 xmlGenericError(xmlGenericErrorContext, | 201 xmlGenericError(xmlGenericErrorContext, |
| 202 "Cannot initialize memory for sentinel"); | 202 "Cannot initialize memory for sentinel"); |
| 203 xmlFree(l); | 203 xmlFree(l); |
| 204 return (NULL); | 204 return (NULL); |
| 205 } | 205 } |
| 206 l->sentinel->next = l->sentinel; | 206 l->sentinel->next = l->sentinel; |
| 207 l->sentinel->prev = l->sentinel; | 207 l->sentinel->prev = l->sentinel; |
| 208 l->sentinel->data = NULL; | 208 l->sentinel->data = NULL; |
| 209 | 209 |
| 210 /* If there is a link deallocator, use it */ | 210 /* If there is a link deallocator, use it */ |
| 211 if (deallocator != NULL) | 211 if (deallocator != NULL) |
| 212 l->linkDeallocator = deallocator; | 212 l->linkDeallocator = deallocator; |
| 213 /* If there is a link comparator, use it */ | 213 /* If there is a link comparator, use it */ |
| 214 if (compare != NULL) | 214 if (compare != NULL) |
| 215 l->linkCompare = compare; | 215 l->linkCompare = compare; |
| 216 else /* Use our own */ | 216 else /* Use our own */ |
| 217 l->linkCompare = xmlLinkCompare; | 217 l->linkCompare = xmlLinkCompare; |
| 218 return l; | 218 return l; |
| 219 } | 219 } |
| 220 | 220 |
| 221 /** | 221 /** |
| 222 * xmlListSearch: | 222 * xmlListSearch: |
| 223 * @l: a list | 223 * @l: a list |
| 224 * @data: a search value | 224 * @data: a search value |
| 225 * | 225 * |
| 226 * Search the list for an existing value of @data | 226 * Search the list for an existing value of @data |
| 227 * | 227 * |
| 228 * Returns the value associated to @data or NULL in case of error | 228 * Returns the value associated to @data or NULL in case of error |
| 229 */ | 229 */ |
| 230 void * | 230 void * |
| 231 xmlListSearch(xmlListPtr l, void *data) | 231 xmlListSearch(xmlListPtr l, void *data) |
| 232 { | 232 { |
| 233 xmlLinkPtr lk; | 233 xmlLinkPtr lk; |
| 234 if (l == NULL) | 234 if (l == NULL) |
| 235 return(NULL); | 235 return(NULL); |
| 236 lk = xmlListLinkSearch(l, data); | 236 lk = xmlListLinkSearch(l, data); |
| 237 if (lk) | 237 if (lk) |
| 238 return (lk->data); | 238 return (lk->data); |
| 239 return NULL; | 239 return NULL; |
| 240 } | 240 } |
| 241 | 241 |
| 242 /** | 242 /** |
| 243 * xmlListReverseSearch: | 243 * xmlListReverseSearch: |
| 244 * @l: a list | 244 * @l: a list |
| 245 * @data: a search value | 245 * @data: a search value |
| 246 * | 246 * |
| 247 * Search the list in reverse order for an existing value of @data | 247 * Search the list in reverse order for an existing value of @data |
| 248 * | 248 * |
| 249 * Returns the value associated to @data or NULL in case of error | 249 * Returns the value associated to @data or NULL in case of error |
| 250 */ | 250 */ |
| 251 void * | 251 void * |
| 252 xmlListReverseSearch(xmlListPtr l, void *data) | 252 xmlListReverseSearch(xmlListPtr l, void *data) |
| 253 { | 253 { |
| 254 xmlLinkPtr lk; | 254 xmlLinkPtr lk; |
| 255 if (l == NULL) | 255 if (l == NULL) |
| 256 return(NULL); | 256 return(NULL); |
| 257 lk = xmlListLinkReverseSearch(l, data); | 257 lk = xmlListLinkReverseSearch(l, data); |
| 258 if (lk) | 258 if (lk) |
| 259 return (lk->data); | 259 return (lk->data); |
| 260 return NULL; | 260 return NULL; |
| 261 } | 261 } |
| 262 | 262 |
| 263 /** | 263 /** |
| 264 * xmlListInsert: | 264 * xmlListInsert: |
| 265 * @l: a list | 265 * @l: a list |
| 266 * @data: the data | 266 * @data: the data |
| 267 * | 267 * |
| 268 * Insert data in the ordered list at the beginning for this value | 268 * Insert data in the ordered list at the beginning for this value |
| 269 * | 269 * |
| 270 * Returns 0 in case of success, 1 in case of failure | 270 * Returns 0 in case of success, 1 in case of failure |
| 271 */ | 271 */ |
| 272 int | 272 int |
| 273 xmlListInsert(xmlListPtr l, void *data) | 273 xmlListInsert(xmlListPtr l, void *data) |
| 274 { | 274 { |
| 275 xmlLinkPtr lkPlace, lkNew; | 275 xmlLinkPtr lkPlace, lkNew; |
| 276 | 276 |
| 277 if (l == NULL) | 277 if (l == NULL) |
| 278 return(1); | 278 return(1); |
| 279 lkPlace = xmlListLowerSearch(l, data); | 279 lkPlace = xmlListLowerSearch(l, data); |
| 280 /* Add the new link */ | 280 /* Add the new link */ |
| 281 lkNew = (xmlLinkPtr) xmlMalloc(sizeof(xmlLink)); | 281 lkNew = (xmlLinkPtr) xmlMalloc(sizeof(xmlLink)); |
| 282 if (lkNew == NULL) { | 282 if (lkNew == NULL) { |
| 283 xmlGenericError(xmlGenericErrorContext, | 283 xmlGenericError(xmlGenericErrorContext, |
| 284 "Cannot initialize memory for new link"); | 284 "Cannot initialize memory for new link"); |
| 285 return (1); | 285 return (1); |
| 286 } | 286 } |
| 287 lkNew->data = data; | 287 lkNew->data = data; |
| 288 lkPlace = lkPlace->prev; | 288 lkPlace = lkPlace->prev; |
| 289 lkNew->next = lkPlace->next; | 289 lkNew->next = lkPlace->next; |
| 290 (lkPlace->next)->prev = lkNew; | 290 (lkPlace->next)->prev = lkNew; |
| 291 lkPlace->next = lkNew; | 291 lkPlace->next = lkNew; |
| 292 lkNew->prev = lkPlace; | 292 lkNew->prev = lkPlace; |
| 293 return 0; | 293 return 0; |
| 294 } | 294 } |
| 295 | 295 |
| 296 /** | 296 /** |
| 297 * xmlListAppend: | 297 * xmlListAppend: |
| 298 * @l: a list | 298 * @l: a list |
| 299 * @data: the data | 299 * @data: the data |
| 300 * | 300 * |
| 301 * Insert data in the ordered list at the end for this value | 301 * Insert data in the ordered list at the end for this value |
| 302 * | 302 * |
| 303 * Returns 0 in case of success, 1 in case of failure | 303 * Returns 0 in case of success, 1 in case of failure |
| 304 */ | 304 */ |
| 305 int xmlListAppend(xmlListPtr l, void *data) | 305 int xmlListAppend(xmlListPtr l, void *data) |
| 306 { | 306 { |
| 307 xmlLinkPtr lkPlace, lkNew; | 307 xmlLinkPtr lkPlace, lkNew; |
| 308 | 308 |
| 309 if (l == NULL) | 309 if (l == NULL) |
| 310 return(1); | 310 return(1); |
| 311 lkPlace = xmlListHigherSearch(l, data); | 311 lkPlace = xmlListHigherSearch(l, data); |
| 312 /* Add the new link */ | 312 /* Add the new link */ |
| 313 lkNew = (xmlLinkPtr) xmlMalloc(sizeof(xmlLink)); | 313 lkNew = (xmlLinkPtr) xmlMalloc(sizeof(xmlLink)); |
| 314 if (lkNew == NULL) { | 314 if (lkNew == NULL) { |
| 315 xmlGenericError(xmlGenericErrorContext, | 315 xmlGenericError(xmlGenericErrorContext, |
| 316 "Cannot initialize memory for new link"); | 316 "Cannot initialize memory for new link"); |
| 317 return (1); | 317 return (1); |
| 318 } | 318 } |
| 319 lkNew->data = data; | 319 lkNew->data = data; |
| 320 lkNew->next = lkPlace->next; | 320 lkNew->next = lkPlace->next; |
| 321 (lkPlace->next)->prev = lkNew; | 321 (lkPlace->next)->prev = lkNew; |
| 322 lkPlace->next = lkNew; | 322 lkPlace->next = lkNew; |
| 323 lkNew->prev = lkPlace; | 323 lkNew->prev = lkPlace; |
| 324 return 0; | 324 return 0; |
| 325 } | 325 } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 346 * @data: list data | 346 * @data: list data |
| 347 * | 347 * |
| 348 * Remove the first instance associated to data in the list | 348 * Remove the first instance associated to data in the list |
| 349 * | 349 * |
| 350 * Returns 1 if a deallocation occured, or 0 if not found | 350 * Returns 1 if a deallocation occured, or 0 if not found |
| 351 */ | 351 */ |
| 352 int | 352 int |
| 353 xmlListRemoveFirst(xmlListPtr l, void *data) | 353 xmlListRemoveFirst(xmlListPtr l, void *data) |
| 354 { | 354 { |
| 355 xmlLinkPtr lk; | 355 xmlLinkPtr lk; |
| 356 | 356 |
| 357 if (l == NULL) | 357 if (l == NULL) |
| 358 return(0); | 358 return(0); |
| 359 /*Find the first instance of this data */ | 359 /*Find the first instance of this data */ |
| 360 lk = xmlListLinkSearch(l, data); | 360 lk = xmlListLinkSearch(l, data); |
| 361 if (lk != NULL) { | 361 if (lk != NULL) { |
| 362 xmlLinkDeallocator(l, lk); | 362 xmlLinkDeallocator(l, lk); |
| 363 return 1; | 363 return 1; |
| 364 } | 364 } |
| 365 return 0; | 365 return 0; |
| 366 } | 366 } |
| 367 | 367 |
| 368 /** | 368 /** |
| 369 * xmlListRemoveLast: | 369 * xmlListRemoveLast: |
| 370 * @l: a list | 370 * @l: a list |
| 371 * @data: list data | 371 * @data: list data |
| 372 * | 372 * |
| 373 * Remove the last instance associated to data in the list | 373 * Remove the last instance associated to data in the list |
| 374 * | 374 * |
| 375 * Returns 1 if a deallocation occured, or 0 if not found | 375 * Returns 1 if a deallocation occured, or 0 if not found |
| 376 */ | 376 */ |
| 377 int | 377 int |
| 378 xmlListRemoveLast(xmlListPtr l, void *data) | 378 xmlListRemoveLast(xmlListPtr l, void *data) |
| 379 { | 379 { |
| 380 xmlLinkPtr lk; | 380 xmlLinkPtr lk; |
| 381 | 381 |
| 382 if (l == NULL) | 382 if (l == NULL) |
| 383 return(0); | 383 return(0); |
| 384 /*Find the last instance of this data */ | 384 /*Find the last instance of this data */ |
| 385 lk = xmlListLinkReverseSearch(l, data); | 385 lk = xmlListLinkReverseSearch(l, data); |
| 386 if (lk != NULL) { | 386 if (lk != NULL) { |
| 387 xmlLinkDeallocator(l, lk); | 387 xmlLinkDeallocator(l, lk); |
| 388 return 1; | 388 return 1; |
| 389 } | 389 } |
| 390 return 0; | 390 return 0; |
| 391 } | 391 } |
| 392 | 392 |
| 393 /** | 393 /** |
| 394 * xmlListRemoveAll: | 394 * xmlListRemoveAll: |
| 395 * @l: a list | 395 * @l: a list |
| 396 * @data: list data | 396 * @data: list data |
| 397 * | 397 * |
| 398 * Remove the all instance associated to data in the list | 398 * Remove the all instance associated to data in the list |
| 399 * | 399 * |
| 400 * Returns the number of deallocation, or 0 if not found | 400 * Returns the number of deallocation, or 0 if not found |
| 401 */ | 401 */ |
| 402 int | 402 int |
| 403 xmlListRemoveAll(xmlListPtr l, void *data) | 403 xmlListRemoveAll(xmlListPtr l, void *data) |
| 404 { | 404 { |
| 405 int count=0; | 405 int count=0; |
| 406 | 406 |
| 407 if (l == NULL) | 407 if (l == NULL) |
| 408 return(0); | 408 return(0); |
| 409 | 409 |
| 410 while(xmlListRemoveFirst(l, data)) | 410 while(xmlListRemoveFirst(l, data)) |
| 411 count++; | 411 count++; |
| 412 return count; | 412 return count; |
| 413 } | 413 } |
| 414 | 414 |
| 415 /** | 415 /** |
| 416 * xmlListClear: | 416 * xmlListClear: |
| 417 * @l: a list | 417 * @l: a list |
| 418 * | 418 * |
| 419 * Remove the all data in the list | 419 * Remove the all data in the list |
| 420 */ | 420 */ |
| 421 void | 421 void |
| 422 xmlListClear(xmlListPtr l) | 422 xmlListClear(xmlListPtr l) |
| 423 { | 423 { |
| 424 xmlLinkPtr lk; | 424 xmlLinkPtr lk; |
| 425 | 425 |
| 426 if (l == NULL) | 426 if (l == NULL) |
| 427 return; | 427 return; |
| 428 lk = l->sentinel->next; | 428 lk = l->sentinel->next; |
| 429 while(lk != l->sentinel) { | 429 while(lk != l->sentinel) { |
| 430 xmlLinkPtr next = lk->next; | 430 xmlLinkPtr next = lk->next; |
| 431 | 431 |
| 432 xmlLinkDeallocator(l, lk); | 432 xmlLinkDeallocator(l, lk); |
| 433 lk = next; | 433 lk = next; |
| 434 } | 434 } |
| 435 } | 435 } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 451 } | 451 } |
| 452 | 452 |
| 453 /** | 453 /** |
| 454 * xmlListFront: | 454 * xmlListFront: |
| 455 * @l: a list | 455 * @l: a list |
| 456 * | 456 * |
| 457 * Get the first element in the list | 457 * Get the first element in the list |
| 458 * | 458 * |
| 459 * Returns the first element in the list, or NULL | 459 * Returns the first element in the list, or NULL |
| 460 */ | 460 */ |
| 461 xmlLinkPtr | 461 xmlLinkPtr |
| 462 xmlListFront(xmlListPtr l) | 462 xmlListFront(xmlListPtr l) |
| 463 { | 463 { |
| 464 if (l == NULL) | 464 if (l == NULL) |
| 465 return(NULL); | 465 return(NULL); |
| 466 return (l->sentinel->next); | 466 return (l->sentinel->next); |
| 467 } | 467 } |
| 468 | 468 |
| 469 /** | 469 /** |
| 470 * xmlListEnd: | 470 * xmlListEnd: |
| 471 * @l: a list | 471 * @l: a list |
| 472 * | 472 * |
| 473 * Get the last element in the list | 473 * Get the last element in the list |
| 474 * | 474 * |
| 475 * Returns the last element in the list, or NULL | 475 * Returns the last element in the list, or NULL |
| 476 */ | 476 */ |
| 477 xmlLinkPtr | 477 xmlLinkPtr |
| 478 xmlListEnd(xmlListPtr l) | 478 xmlListEnd(xmlListPtr l) |
| 479 { | 479 { |
| 480 if (l == NULL) | 480 if (l == NULL) |
| 481 return(NULL); | 481 return(NULL); |
| 482 return (l->sentinel->prev); | 482 return (l->sentinel->prev); |
| 483 } | 483 } |
| 484 | 484 |
| 485 /** | 485 /** |
| 486 * xmlListSize: | 486 * xmlListSize: |
| 487 * @l: a list | 487 * @l: a list |
| 488 * | 488 * |
| 489 * Get the number of elements in the list | 489 * Get the number of elements in the list |
| 490 * | 490 * |
| 491 * Returns the number of elements in the list or -1 in case of error | 491 * Returns the number of elements in the list or -1 in case of error |
| 492 */ | 492 */ |
| 493 int | 493 int |
| 494 xmlListSize(xmlListPtr l) | 494 xmlListSize(xmlListPtr l) |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 532 /** | 532 /** |
| 533 * xmlListPushFront: | 533 * xmlListPushFront: |
| 534 * @l: a list | 534 * @l: a list |
| 535 * @data: new data | 535 * @data: new data |
| 536 * | 536 * |
| 537 * add the new data at the beginning of the list | 537 * add the new data at the beginning of the list |
| 538 * | 538 * |
| 539 * Returns 1 if successful, 0 otherwise | 539 * Returns 1 if successful, 0 otherwise |
| 540 */ | 540 */ |
| 541 int | 541 int |
| 542 xmlListPushFront(xmlListPtr l, void *data) | 542 xmlListPushFront(xmlListPtr l, void *data) |
| 543 { | 543 { |
| 544 xmlLinkPtr lkPlace, lkNew; | 544 xmlLinkPtr lkPlace, lkNew; |
| 545 | 545 |
| 546 if (l == NULL) | 546 if (l == NULL) |
| 547 return(0); | 547 return(0); |
| 548 lkPlace = l->sentinel; | 548 lkPlace = l->sentinel; |
| 549 /* Add the new link */ | 549 /* Add the new link */ |
| 550 lkNew = (xmlLinkPtr) xmlMalloc(sizeof(xmlLink)); | 550 lkNew = (xmlLinkPtr) xmlMalloc(sizeof(xmlLink)); |
| 551 if (lkNew == NULL) { | 551 if (lkNew == NULL) { |
| 552 xmlGenericError(xmlGenericErrorContext, | 552 xmlGenericError(xmlGenericErrorContext, |
| 553 "Cannot initialize memory for new link"); | 553 "Cannot initialize memory for new link"); |
| 554 return (0); | 554 return (0); |
| 555 } | 555 } |
| 556 lkNew->data = data; | 556 lkNew->data = data; |
| 557 lkNew->next = lkPlace->next; | 557 lkNew->next = lkPlace->next; |
| 558 (lkPlace->next)->prev = lkNew; | 558 (lkPlace->next)->prev = lkNew; |
| 559 lkPlace->next = lkNew; | 559 lkPlace->next = lkNew; |
| 560 lkNew->prev = lkPlace; | 560 lkNew->prev = lkPlace; |
| 561 return 1; | 561 return 1; |
| 562 } | 562 } |
| 563 | 563 |
| 564 /** | 564 /** |
| 565 * xmlListPushBack: | 565 * xmlListPushBack: |
| 566 * @l: a list | 566 * @l: a list |
| 567 * @data: new data | 567 * @data: new data |
| 568 * | 568 * |
| 569 * add the new data at the end of the list | 569 * add the new data at the end of the list |
| 570 * | 570 * |
| 571 * Returns 1 if successful, 0 otherwise | 571 * Returns 1 if successful, 0 otherwise |
| 572 */ | 572 */ |
| 573 int | 573 int |
| 574 xmlListPushBack(xmlListPtr l, void *data) | 574 xmlListPushBack(xmlListPtr l, void *data) |
| 575 { | 575 { |
| 576 xmlLinkPtr lkPlace, lkNew; | 576 xmlLinkPtr lkPlace, lkNew; |
| 577 | 577 |
| 578 if (l == NULL) | 578 if (l == NULL) |
| 579 return(0); | 579 return(0); |
| 580 lkPlace = l->sentinel->prev; | 580 lkPlace = l->sentinel->prev; |
| 581 /* Add the new link */ | 581 /* Add the new link */ |
| 582 if (NULL ==(lkNew = (xmlLinkPtr )xmlMalloc(sizeof(xmlLink)))) { | 582 if (NULL ==(lkNew = (xmlLinkPtr )xmlMalloc(sizeof(xmlLink)))) { |
| 583 xmlGenericError(xmlGenericErrorContext, | 583 xmlGenericError(xmlGenericErrorContext, |
| 584 "Cannot initialize memory for new link"); | 584 "Cannot initialize memory for new link"); |
| 585 return (0); | 585 return (0); |
| 586 } | 586 } |
| 587 lkNew->data = data; | 587 lkNew->data = data; |
| 588 lkNew->next = lkPlace->next; | 588 lkNew->next = lkPlace->next; |
| 589 (lkPlace->next)->prev = lkNew; | 589 (lkPlace->next)->prev = lkNew; |
| 590 lkPlace->next = lkNew; | 590 lkPlace->next = lkNew; |
| 591 lkNew->prev = lkPlace; | 591 lkNew->prev = lkPlace; |
| 592 return 1; | 592 return 1; |
| 593 } | 593 } |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 636 /** | 636 /** |
| 637 * xmlListSort: | 637 * xmlListSort: |
| 638 * @l: a list | 638 * @l: a list |
| 639 * | 639 * |
| 640 * Sort all the elements in the list | 640 * Sort all the elements in the list |
| 641 */ | 641 */ |
| 642 void | 642 void |
| 643 xmlListSort(xmlListPtr l) | 643 xmlListSort(xmlListPtr l) |
| 644 { | 644 { |
| 645 xmlListPtr lTemp; | 645 xmlListPtr lTemp; |
| 646 | 646 |
| 647 if (l == NULL) | 647 if (l == NULL) |
| 648 return; | 648 return; |
| 649 if(xmlListEmpty(l)) | 649 if(xmlListEmpty(l)) |
| 650 return; | 650 return; |
| 651 | 651 |
| 652 /* I think that the real answer is to implement quicksort, the | 652 /* I think that the real answer is to implement quicksort, the |
| 653 * alternative is to implement some list copying procedure which | 653 * alternative is to implement some list copying procedure which |
| 654 * would be based on a list copy followed by a clear followed by | 654 * would be based on a list copy followed by a clear followed by |
| 655 * an insert. This is slow... | 655 * an insert. This is slow... |
| 656 */ | 656 */ |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 718 { | 718 { |
| 719 xmlListCopy(l1, l2); | 719 xmlListCopy(l1, l2); |
| 720 xmlListClear(l2); | 720 xmlListClear(l2); |
| 721 } | 721 } |
| 722 | 722 |
| 723 /** | 723 /** |
| 724 * xmlListDup: | 724 * xmlListDup: |
| 725 * @old: the list | 725 * @old: the list |
| 726 * | 726 * |
| 727 * Duplicate the list | 727 * Duplicate the list |
| 728 * | 728 * |
| 729 * Returns a new copy of the list or NULL in case of error | 729 * Returns a new copy of the list or NULL in case of error |
| 730 */ | 730 */ |
| 731 xmlListPtr | 731 xmlListPtr |
| 732 xmlListDup(const xmlListPtr old) | 732 xmlListDup(const xmlListPtr old) |
| 733 { | 733 { |
| 734 xmlListPtr cur; | 734 xmlListPtr cur; |
| 735 | 735 |
| 736 if (old == NULL) | 736 if (old == NULL) |
| 737 return(NULL); | 737 return(NULL); |
| 738 /* Hmmm, how to best deal with allocation issues when copying | 738 /* Hmmm, how to best deal with allocation issues when copying |
| 739 * lists. If there is a de-allocator, should responsibility lie with | 739 * lists. If there is a de-allocator, should responsibility lie with |
| 740 * the new list or the old list. Surely not both. I'll arbitrarily | 740 * the new list or the old list. Surely not both. I'll arbitrarily |
| 741 * set it to be the old list for the time being whilst I work out | 741 * set it to be the old list for the time being whilst I work out |
| 742 * the answer | 742 * the answer |
| 743 */ | 743 */ |
| 744 if (NULL ==(cur = xmlListCreate(NULL, old->linkCompare))) | 744 if (NULL ==(cur = xmlListCreate(NULL, old->linkCompare))) |
| 745 return (NULL); | 745 return (NULL); |
| 746 if (0 != xmlListCopy(cur, old)) | 746 if (0 != xmlListCopy(cur, old)) |
| 747 return NULL; | 747 return NULL; |
| 748 return cur; | 748 return cur; |
| 749 } | 749 } |
| 750 | 750 |
| 751 /** | 751 /** |
| 752 * xmlListCopy: | 752 * xmlListCopy: |
| 753 * @cur: the new list | 753 * @cur: the new list |
| 754 * @old: the old list | 754 * @old: the old list |
| 755 * | 755 * |
| 756 * Move all the element from the old list in the new list | 756 * Move all the element from the old list in the new list |
| 757 * | 757 * |
| 758 * Returns 0 in case of success 1 in case of error | 758 * Returns 0 in case of success 1 in case of error |
| 759 */ | 759 */ |
| 760 int | 760 int |
| 761 xmlListCopy(xmlListPtr cur, const xmlListPtr old) | 761 xmlListCopy(xmlListPtr cur, const xmlListPtr old) |
| 762 { | 762 { |
| 763 /* Walk the old tree and insert the data into the new one */ | 763 /* Walk the old tree and insert the data into the new one */ |
| 764 xmlLinkPtr lk; | 764 xmlLinkPtr lk; |
| 765 | 765 |
| 766 if ((old == NULL) || (cur == NULL)) | 766 if ((old == NULL) || (cur == NULL)) |
| 767 return(1); | 767 return(1); |
| 768 for(lk = old->sentinel->next; lk != old->sentinel; lk = lk->next) { | 768 for(lk = old->sentinel->next; lk != old->sentinel; lk = lk->next) { |
| 769 if (0 !=xmlListInsert(cur, lk->data)) { | 769 if (0 !=xmlListInsert(cur, lk->data)) { |
| 770 xmlListDelete(cur); | 770 xmlListDelete(cur); |
| 771 return (1); | 771 return (1); |
| 772 } | 772 } |
| 773 } | 773 } |
| 774 return (0); | 774 return (0); |
| 775 } | 775 } |
| 776 /* xmlListUnique() */ | 776 /* xmlListUnique() */ |
| 777 /* xmlListSwap */ | 777 /* xmlListSwap */ |
| 778 #define bottom_list | 778 #define bottom_list |
| 779 #include "elfgcchack.h" | 779 #include "elfgcchack.h" |
| OLD | NEW |