diff options
Diffstat (limited to 'Build/source/texk/xdvik/string_list.c')
-rw-r--r-- | Build/source/texk/xdvik/string_list.c | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/Build/source/texk/xdvik/string_list.c b/Build/source/texk/xdvik/string_list.c new file mode 100644 index 00000000000..7138c2a7b2f --- /dev/null +++ b/Build/source/texk/xdvik/string_list.c @@ -0,0 +1,166 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "xdvi-config.h" +#include "xdvi.h" +#include "util.h" +#include "string_list.h" + + +/* + * Helper functions for string lists + */ +char * +string_list_to_str(char **list, const char *sep) +{ + char *result = xstrdup(""); + int i; + + for (i = 0; list[i] != NULL; i++) { + result = xstrcat(result, list[i]); + result = xstrcat(result, sep); + } + return result; +} + + +void +string_list_print(char **list) +{ + int i; + + for (i = 0; list != NULL && list[i] != NULL; i++) { + fprintf(stderr, "List %d: |%s|\n", i, list[i]); + } +} + +/* + * Reorder the list so that str (which is supposed to occur in the list somewhere) + * is the first element. + */ +char ** +string_list_reorder(char **list, char *str) +{ + size_t i; + char *tmp; + Boolean found = False; + + for (i = 0; list[i] != NULL; i++) { + if (strcmp(list[i], str) == 0) { + found = True; + break; + } + } + + if (!found) { + XDVI_ERROR((stderr, "Item `%s' not found in list!\n", str)); + return list; + } + + tmp = list[0]; + list[0] = str; + list[i] = tmp; + return list; +} + +/* + * Move the item at position idx to the start of the list, + * by iteratively swapping it with its predecessor. + */ +char ** +string_list_move_to_start(char **list, size_t idx) +{ + size_t i; + +#if 0 + for (i = 0; list[i] != NULL; i++) { + fprintf(stderr, "list before: %d: |%s|\n", i, list[i]); + } +#endif + + for (i = idx; i > 0; i--) { + char *tmp = list[i]; + list[i] = list[i - 1]; + list[i - 1] = tmp; + } + +#if 0 + for (i = 0; list[i] != NULL; i++) { + fprintf(stderr, "list after: %d: |%s|\n", i, list[i]); + } +#endif + + return list; +} + +/* + * Rotate the list so that the first element is shifted to the end, + * and all next elements are moved down by 1; e.g.: + * before rotate: a b c d e f + * after rotate: b c d e f a + */ +char ** +string_list_rotate_down(char **list) +{ + size_t i; + char *tmp; + + tmp = list[0]; + if (tmp == NULL) { + return list; + } + for (i = 1; list[i] != NULL; i++) { + list[i - 1] = list[i]; + } + list[i - 1] = tmp; + + return list; +} + +/* + * Rotate the list so that the last element is shifted to the beginning, + * and all next elements are moved up by 1; e.g.: + * before rotate: a b c d e f + * after rotate: f a b c d e + */ +char ** +string_list_rotate_up(char **list) +{ + size_t i; + char *tmp = NULL; + + if (list[0] == NULL) { + return list; + } + /* go to end */ + for (i = 0; list[i] != NULL; i++) { ; } + i--; /* get last index */ + + tmp = list[i]; + for (; i > 0; i--) { + list[i] = list[i - 1]; + } + list[0] = tmp; + + return list; +} + +char ** +string_list_prepend(char **list, const char *str) +{ + int i, k; + /* reallocate with larger capacity */ + for (i = 0; list[i] != NULL; i++) { ; } + i++; + list = xrealloc(list, (i + 1) * sizeof *list); + + /* shift old contents down */ + for (k = i; k > 0; k--) { + list[k] = list[k - 1]; + } + /* add new element at beginning */ + list[0] = xstrdup(str); + + return list; +} |