⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stringlist.c

📁 android-w.song.android.widget
💻 C
字号:
/* stringlist.c - functions to handle a generic `list of strings' structure *//* Copyright (C) 2000-2002 Free Software Foundation, Inc.   This file is part of GNU Bash, the Bourne Again SHell.   Bash is free software: you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation, either version 3 of the License, or   (at your option) any later version.   Bash is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   You should have received a copy of the GNU General Public License   along with Bash.  If not, see <http://www.gnu.org/licenses/>.*/#include <config.h>#if defined (HAVE_UNISTD_H)#  include <unistd.h>#endif#include <stdio.h>#include <bashansi.h>#include "shell.h"#ifdef STRDUP#  undef STRDUP#endif#define STRDUP(x)	((x) ? savestring (x) : (char *)NULL)/* Allocate a new STRINGLIST, with room for N strings. */STRINGLIST *strlist_create (n)     int n;{  STRINGLIST *ret;  register int i;  ret = (STRINGLIST *)xmalloc (sizeof (STRINGLIST));  if (n)    {      ret->list = strvec_create (n+1);      ret->list_size = n;      for (i = 0; i < n; i++)	ret->list[i] = (char *)NULL;    }  else    {      ret->list = (char **)NULL;      ret->list_size = 0;    }  ret->list_len = 0;  return ret;}STRINGLIST *strlist_resize (sl, n)     STRINGLIST *sl;     int n;{  register int i;  if (sl == 0)    return (sl = strlist_create (n));  if (n > sl->list_size)    {      sl->list = strvec_resize (sl->list, n + 1);      for (i = sl->list_size; i <= n; i++)	sl->list[i] = (char *)NULL;      sl->list_size = n;    }  return sl;}voidstrlist_flush (sl)     STRINGLIST *sl;{  if (sl == 0 || sl->list == 0)    return;  strvec_flush (sl->list);  sl->list_len = 0;}  voidstrlist_dispose (sl)     STRINGLIST *sl;{  if (sl == 0)    return;  if (sl->list)    strvec_dispose (sl->list);  free (sl);}intstrlist_remove (sl, s)     STRINGLIST *sl;     char *s;{  int r;  if (sl == 0 || sl->list == 0 || sl->list_len == 0)    return 0;  r = strvec_remove (sl->list, s);  if (r)    sl->list_len--;  return r;}STRINGLIST *strlist_copy (sl)     STRINGLIST *sl;{  STRINGLIST *new;  register int i;  if (sl == 0)    return ((STRINGLIST *)0);  new = strlist_create (sl->list_size);  /* I'd like to use strvec_copy, but that doesn't copy everything. */  if (sl->list)    {      for (i = 0; i < sl->list_size; i++)	new->list[i] = STRDUP (sl->list[i]);    }  new->list_size = sl->list_size;  new->list_len = sl->list_len;  /* just being careful */  if (new->list)    new->list[new->list_len] = (char *)NULL;  return new;}/* Return a new STRINGLIST with everything from M1 and M2. */STRINGLIST *strlist_merge (m1, m2)     STRINGLIST *m1, *m2;{  STRINGLIST *sl;  int i, n, l1, l2;  l1 = m1 ? m1->list_len : 0;  l2 = m2 ? m2->list_len : 0;  sl = strlist_create (l1 + l2 + 1);  for (i = n = 0; i < l1; i++, n++)    sl->list[n] = STRDUP (m1->list[i]);  for (i = 0; i < l2; i++, n++)    sl->list[n] = STRDUP (m2->list[i]);  sl->list_len = n;  sl->list[n] = (char *)NULL;  return (sl);}/* Make STRINGLIST M1 contain everything in M1 and M2. */STRINGLIST *strlist_append (m1, m2)     STRINGLIST *m1, *m2;{  register int i, n, len1, len2;  if (m1 == 0)    return (m2 ? strlist_copy (m2) : (STRINGLIST *)0);  len1 = m1->list_len;  len2 = m2 ? m2->list_len : 0;  if (len2)    {      m1 = strlist_resize (m1, len1 + len2 + 1);      for (i = 0, n = len1; i < len2; i++, n++)	m1->list[n] = STRDUP (m2->list[i]);      m1->list[n] = (char *)NULL;      m1->list_len = n;    }  return m1;}STRINGLIST *strlist_prefix_suffix (sl, prefix, suffix)     STRINGLIST *sl;     char *prefix, *suffix;{  int plen, slen, tlen, llen, i;  char *t;  if (sl == 0 || sl->list == 0 || sl->list_len == 0)    return sl;  plen = STRLEN (prefix);  slen = STRLEN (suffix);  if (plen == 0 && slen == 0)    return (sl);  for (i = 0; i < sl->list_len; i++)    {      llen = STRLEN (sl->list[i]);      tlen = plen + llen + slen + 1;      t = (char *)xmalloc (tlen + 1);      if (plen)	strcpy (t, prefix);      strcpy (t + plen, sl->list[i]);      if (slen)	strcpy (t + plen + llen, suffix);      free (sl->list[i]);      sl->list[i] = t;    }  return (sl);	 }   voidstrlist_print (sl, prefix)     STRINGLIST *sl;     char *prefix;{  register int i;  if (sl == 0)    return;  for (i = 0; i < sl->list_len; i++)    printf ("%s%s\n", prefix ? prefix : "", sl->list[i]);}voidstrlist_walk (sl, func)     STRINGLIST *sl;     sh_strlist_map_func_t *func;{  register int i;  if (sl == 0)    return;  for (i = 0; i < sl->list_len; i++)    if ((*func)(sl->list[i]) < 0)      break;}      voidstrlist_sort (sl)     STRINGLIST *sl;{  if (sl == 0 || sl->list_len == 0 || sl->list == 0)    return;  strvec_sort (sl->list);}STRINGLIST *strlist_from_word_list (list, alloc, starting_index, ip)     WORD_LIST *list;     int alloc, starting_index, *ip;{  STRINGLIST *ret;  int slen, len;  if (list == 0)    {      if (ip)        *ip = 0;      return ((STRINGLIST *)0);    }  slen = list_length (list);  ret = (STRINGLIST *)xmalloc (sizeof (STRINGLIST));  ret->list = strvec_from_word_list (list, alloc, starting_index, &len);  ret->list_size = slen + starting_index;  ret->list_len = len;  if (ip)    *ip = len;  return ret;}WORD_LIST *strlist_to_word_list (sl, alloc, starting_index)     STRINGLIST *sl;     int alloc, starting_index;{  WORD_LIST *list;  if (sl == 0 || sl->list == 0)    return ((WORD_LIST *)NULL);  list = strvec_to_word_list (sl->list, alloc, starting_index);  return list;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -