summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--xs.h89
-rw-r--r--xs_version.h2
2 files changed, 85 insertions, 6 deletions
diff --git a/xs.h b/xs.h
index 5aed922..da853f5 100644
--- a/xs.h
+++ b/xs.h
@@ -66,6 +66,11 @@ d_char *xs_list_append_m(d_char *list, const char *mem, int dsz);
66int xs_list_iter(char **list, char **value); 66int xs_list_iter(char **list, char **value);
67int xs_list_len(char *list); 67int xs_list_len(char *list);
68char *xs_list_get(char *list, int num); 68char *xs_list_get(char *list, int num);
69d_char *xs_list_del(d_char *list, int num);
70d_char *xs_list_insert(d_char *list, int num, const char *data);
71d_char *xs_list_insert_sorted(d_char *list, const char *str);
72d_char *xs_list_set(d_char *list, int num, const char *data);
73d_char *xs_list_pop(d_char *list, char **data);
69int xs_list_in(char *list, const char *val); 74int xs_list_in(char *list, const char *val);
70d_char *xs_join(char *list, const char *sep); 75d_char *xs_join(char *list, const char *sep);
71d_char *xs_split_n(const char *str, const char *sep, int times); 76d_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
467d_char *xs_list_append_m(d_char *list, const char *mem, int dsz) 472d_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
484d_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
480int xs_list_iter(char **list, char **value) 491int 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
560d_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
572d_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
587d_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
606d_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
616d_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
549int xs_list_in(char *list, const char *val) 628int 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 */