diff options
| -rw-r--r-- | xs.h | 89 | ||||
| -rw-r--r-- | xs_version.h | 2 |
2 files changed, 85 insertions, 6 deletions
| @@ -66,6 +66,11 @@ d_char *xs_list_append_m(d_char *list, const char *mem, int dsz); | |||
| 66 | int xs_list_iter(char **list, char **value); | 66 | int xs_list_iter(char **list, char **value); |
| 67 | int xs_list_len(char *list); | 67 | int xs_list_len(char *list); |
| 68 | char *xs_list_get(char *list, int num); | 68 | char *xs_list_get(char *list, int num); |
| 69 | d_char *xs_list_del(d_char *list, int num); | ||
| 70 | d_char *xs_list_insert(d_char *list, int num, const char *data); | ||
| 71 | d_char *xs_list_insert_sorted(d_char *list, const char *str); | ||
| 72 | d_char *xs_list_set(d_char *list, int num, const char *data); | ||
| 73 | d_char *xs_list_pop(d_char *list, char **data); | ||
| 69 | int xs_list_in(char *list, const char *val); | 74 | int xs_list_in(char *list, const char *val); |
| 70 | d_char *xs_join(char *list, const char *sep); | 75 | d_char *xs_join(char *list, const char *sep); |
| 71 | d_char *xs_split_n(const char *str, const char *sep, int times); | 76 | d_char *xs_split_n(const char *str, const char *sep, int times); |
| @@ -464,19 +469,25 @@ d_char *xs_list_new(void) | |||
| 464 | } | 469 | } |
| 465 | 470 | ||
| 466 | 471 | ||
| 467 | d_char *xs_list_append_m(d_char *list, const char *mem, int dsz) | 472 | d_char *_xs_list_write_litem(d_char *list, int offset, const char *mem, int dsz) |
| 468 | /* adds a memory block to the list */ | 473 | /* writes a list item */ |
| 469 | { | 474 | { |
| 470 | char c = XSTYPE_LITEM; | 475 | char c = XSTYPE_LITEM; |
| 471 | int lsz = xs_size(list); | ||
| 472 | 476 | ||
| 473 | list = xs_insert_m(list, lsz - 1, &c, 1); | 477 | list = xs_insert_m(list, offset, &c, 1); |
| 474 | list = xs_insert_m(list, lsz, mem, dsz); | 478 | list = xs_insert_m(list, offset + 1, mem, dsz); |
| 475 | 479 | ||
| 476 | return list; | 480 | return list; |
| 477 | } | 481 | } |
| 478 | 482 | ||
| 479 | 483 | ||
| 484 | d_char *xs_list_append_m(d_char *list, const char *mem, int dsz) | ||
| 485 | /* adds a memory block to the list */ | ||
| 486 | { | ||
| 487 | return _xs_list_write_litem(list, xs_size(list) - 1, mem, dsz); | ||
| 488 | } | ||
| 489 | |||
| 490 | |||
| 480 | int xs_list_iter(char **list, char **value) | 491 | int xs_list_iter(char **list, char **value) |
| 481 | /* iterates a list value */ | 492 | /* iterates a list value */ |
| 482 | { | 493 | { |
| @@ -546,6 +557,74 @@ char *xs_list_get(char *list, int num) | |||
| 546 | } | 557 | } |
| 547 | 558 | ||
| 548 | 559 | ||
| 560 | d_char *xs_list_del(d_char *list, int num) | ||
| 561 | /* deletes element #num */ | ||
| 562 | { | ||
| 563 | char *v; | ||
| 564 | |||
| 565 | if ((v = xs_list_get(list, num)) != NULL) | ||
| 566 | list = xs_collapse(list, v - 1 - list, xs_size(v - 1)); | ||
| 567 | |||
| 568 | return list; | ||
| 569 | } | ||
| 570 | |||
| 571 | |||
| 572 | d_char *xs_list_insert(d_char *list, int num, const char *data) | ||
| 573 | /* inserts an element at #num position */ | ||
| 574 | { | ||
| 575 | char *v; | ||
| 576 | int offset; | ||
| 577 | |||
| 578 | if ((v = xs_list_get(list, num)) != NULL) | ||
| 579 | offset = v - list; | ||
| 580 | else | ||
| 581 | offset = xs_size(list); | ||
| 582 | |||
| 583 | return _xs_list_write_litem(list, offset - 1, data, xs_size(data)); | ||
| 584 | } | ||
| 585 | |||
| 586 | |||
| 587 | d_char *xs_list_insert_sorted(d_char *list, const char *str) | ||
| 588 | /* inserts a string in the list in its ordered position */ | ||
| 589 | { | ||
| 590 | char *p, *v; | ||
| 591 | int offset = xs_size(list); | ||
| 592 | |||
| 593 | p = list; | ||
| 594 | while (xs_list_iter(&p, &v)) { | ||
| 595 | /* if this element is greater or equal, insert here */ | ||
| 596 | if (strcmp(v, str) >= 0) { | ||
| 597 | offset = v - list; | ||
| 598 | break; | ||
| 599 | } | ||
| 600 | } | ||
| 601 | |||
| 602 | return _xs_list_write_litem(list, offset - 1, str, xs_size(str)); | ||
| 603 | } | ||
| 604 | |||
| 605 | |||
| 606 | d_char *xs_list_set(d_char *list, int num, const char *data) | ||
| 607 | /* sets the element at #num position */ | ||
| 608 | { | ||
| 609 | list = xs_list_del(list, num); | ||
| 610 | list = xs_list_insert(list, num, data); | ||
| 611 | |||
| 612 | return list; | ||
| 613 | } | ||
| 614 | |||
| 615 | |||
| 616 | d_char *xs_list_pop(d_char *list, char **data) | ||
| 617 | /* pops the last element from the list */ | ||
| 618 | { | ||
| 619 | if ((*data = xs_list_get(list, -1)) != NULL) { | ||
| 620 | *data = xs_dup(*data); | ||
| 621 | list = xs_list_del(list, -1); | ||
| 622 | } | ||
| 623 | |||
| 624 | return list; | ||
| 625 | } | ||
| 626 | |||
| 627 | |||
| 549 | int xs_list_in(char *list, const char *val) | 628 | int xs_list_in(char *list, const char *val) |
| 550 | /* returns the position of val in list or -1 */ | 629 | /* returns the position of val in list or -1 */ |
| 551 | { | 630 | { |
diff --git a/xs_version.h b/xs_version.h index c3398c3..a4b8489 100644 --- a/xs_version.h +++ b/xs_version.h | |||
| @@ -1 +1 @@ | |||
| /* 8450903c195f5a3bf4b96de961131d6e419321a4 */ | /* 1cde797082a259158b181f9c1e4bda4c5204109d */ | ||