summaryrefslogtreecommitdiff
path: root/stringlib.c
diff options
context:
space:
mode:
authorJari Aalto <jari.aalto@cante.net>2002-07-17 14:10:11 +0000
committerJari Aalto <jari.aalto@cante.net>2009-09-12 16:46:55 +0000
commit7117c2d221b2aed4ede8600f6a36b7c1454b4f55 (patch)
treeb792f26ecca68813c51ed5ba2e381790758ef31b /stringlib.c
parentf73dda092b33638d2d5e9c35375f687a607b5403 (diff)
downloadbash-7117c2d221b2aed4ede8600f6a36b7c1454b4f55.tar.gz
Imported from ../bash-2.05b.tar.gz.devel-base-dist
Diffstat (limited to 'stringlib.c')
-rw-r--r--stringlib.c110
1 files changed, 55 insertions, 55 deletions
diff --git a/stringlib.c b/stringlib.c
index db8f15b3..97280cf5 100644
--- a/stringlib.c
+++ b/stringlib.c
@@ -1,7 +1,6 @@
/* stringlib.c - Miscellaneous string functions. */
-/* Copyright (C) 1996
- Free Software Foundation, Inc.
+/* Copyright (C) 1996-2002 Free Software Foundation, Inc.
This file is part of GNU Bash, the Bourne Again SHell.
@@ -46,70 +45,53 @@
/* */
/* **************************************************************** */
-/* Cons up a new array of words. The words are taken from LIST,
- which is a WORD_LIST *. If COPY is true, everything is malloc'ed,
- so you should free everything in this array when you are done.
- The array is NULL terminated. If IP is non-null, it gets the
- number of words in the returned array. STARTING_INDEX says where
- to start filling in the returned array; it can be used to reserve
- space at the beginning of the array. */
-char **
-word_list_to_argv (list, copy, starting_index, ip)
- WORD_LIST *list;
- int copy, starting_index, *ip;
+/* Find STRING in ALIST, a list of string key/int value pairs. If FLAGS
+ is 1, STRING is treated as a pattern and matched using strmatch. */
+int
+find_string_in_alist (string, alist, flags)
+ char *string;
+ STRING_INT_ALIST *alist;
+ int flags;
{
- int count;
- char **array;
-
- count = list_length (list);
- array = (char **)xmalloc ((1 + count + starting_index) * sizeof (char *));
+ register int i;
+ int r;
- for (count = 0; count < starting_index; count++)
- array[count] = (char *)NULL;
- for (count = starting_index; list; count++, list = list->next)
- array[count] = copy ? savestring (list->word->word) : list->word->word;
- array[count] = (char *)NULL;
+ for (i = r = 0; alist[i].word; i++)
+ {
+#if defined (EXTENDED_GLOB)
+ if (flags)
+ r = strmatch (alist[i].word, string, FNM_EXTMATCH) != FNM_NOMATCH;
+ else
+#endif
+ r = STREQ (string, alist[i].word);
- if (ip)
- *ip = count;
- return (array);
+ if (r)
+ return (alist[i].token);
+ }
+ return -1;
}
-/* Convert an array of strings into the form used internally by the shell.
- COPY means to copy the values in ARRAY into the returned list rather
- than allocate new storage. STARTING_INDEX says where in ARRAY to begin. */
-WORD_LIST *
-argv_to_word_list (array, copy, starting_index)
- char **array;
- int copy, starting_index;
+/* Find TOKEN in ALIST, a list of string/int value pairs. Return the
+ corresponding string. Allocates memory for the returned
+ string. FLAGS is currently ignored, but reserved. */
+char *
+find_token_in_alist (token, alist, flags)
+ int token;
+ STRING_INT_ALIST *alist;
+ int flags;
{
- WORD_LIST *list;
- WORD_DESC *w;
- int i, count;
-
- if (array == 0 || array[0] == 0)
- return (WORD_LIST *)NULL;
-
- for (count = 0; array[count]; count++)
- ;
+ register int i;
- for (i = starting_index, list = (WORD_LIST *)NULL; i < count; i++)
+ for (i = 0; alist[i].word; i++)
{
- w = make_bare_word (copy ? "" : array[i]);
- if (copy)
- {
- free (w->word);
- w->word = array[i];
- }
- list = make_word_list (w, list);
+ if (alist[i].token == token)
+ return (savestring (alist[i].word));
}
- return (REVERSE_LIST(list, WORD_LIST *));
+ return ((char *)NULL);
}
-/* Find STRING in ALIST, a list of string key/int value pairs. If FLAGS
- is 1, STRING is treated as a pattern and matched using strmatch. */
int
-find_string_in_alist (string, alist, flags)
+find_index_in_alist (string, alist, flags)
char *string;
STRING_INT_ALIST *alist;
int flags;
@@ -127,8 +109,9 @@ find_string_in_alist (string, alist, flags)
r = STREQ (string, alist[i].word);
if (r)
- return (alist[i].token);
+ return (i);
}
+
return -1;
}
@@ -138,6 +121,23 @@ find_string_in_alist (string, alist, flags)
/* */
/* **************************************************************** */
+/* Cons a new string from STRING starting at START and ending at END,
+ not including END. */
+char *
+substring (string, start, end)
+ char *string;
+ int start, end;
+{
+ register int len;
+ register char *result;
+
+ len = end - start;
+ result = (char *)xmalloc (len + 1);
+ strncpy (result, string + start, len);
+ result[len] = '\0';
+ return (result);
+}
+
/* Replace occurrences of PAT with REP in STRING. If GLOBAL is non-zero,
replace all occurrences, otherwise replace only the first.
This returns a new string; the caller should free it. */