home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / gettext-0.10.24-src.tgz / tar.out / fsf / gettext / src / str-list.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  3KB  |  147 lines

  1. /* GNU gettext - internationalization aids
  2.    Copyright (C) 1995 Free Software Foundation, Inc.
  3.  
  4.    This file was written by Peter Miller <pmiller@agso.gov.au>
  5.  
  6. This program is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 2, or (at your option)
  9. any later version.
  10.  
  11. This program is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU General Public License for more details.
  15.  
  16. You should have received a copy of the GNU General Public License
  17. along with this program; if not, write to the Free Software
  18. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
  19.  
  20. #ifdef HAVE_CONFIG_H
  21. # include "config.h"
  22. #endif
  23.  
  24. #include <stdio.h>
  25.  
  26. #include "system.h"
  27. #include "str-list.h"
  28.  
  29.  
  30. string_list_ty *
  31. string_list_alloc ()
  32. {
  33.   string_list_ty *slp;
  34.  
  35.   slp = (string_list_ty *) xmalloc (sizeof (*slp));
  36.   slp->item = NULL;
  37.   slp->nitems = 0;
  38.   slp->nitems_max = 0;
  39.  
  40.   return slp;
  41. }
  42.  
  43.  
  44. void
  45. string_list_append (slp, s)
  46.      string_list_ty *slp;
  47.      const char *s;
  48. {
  49.   /* Grow the list.  */
  50.   if (slp->nitems >= slp->nitems_max)
  51.     {
  52.       size_t nbytes;
  53.  
  54.       slp->nitems_max = slp->nitems_max * 2 + 4;
  55.       nbytes = slp->nitems_max * sizeof (slp->item[0]);
  56.       slp->item = (const char **) xrealloc (slp->item, nbytes);
  57.     }
  58.  
  59.   /* Add a copy of the string to the end of the list.  */
  60.   slp->item[slp->nitems++] = xstrdup (s);
  61. }
  62.  
  63.  
  64. void
  65. string_list_append_unique (slp, s)
  66.      string_list_ty *slp;
  67.      const char *s;
  68. {
  69.   size_t j;
  70.  
  71.   /* Do not if the string is already in the list.  */
  72.   for (j = 0; j < slp->nitems; ++j)
  73.     if (strcmp (slp->item[j], s) == 0)
  74.       return;
  75.  
  76.   /* Grow the list.  */
  77.   if (slp->nitems >= slp->nitems_max)
  78.     {
  79.       slp->nitems_max = slp->nitems_max * 2 + 4;
  80.       slp->item = (const char **) xrealloc (slp->item,
  81.                         slp->nitems_max
  82.                         * sizeof (slp->item[0]));
  83.     }
  84.  
  85.   /* Add a copy of the string to the end of the list.  */
  86.   slp->item[slp->nitems++] = xstrdup (s);
  87. }
  88.  
  89.  
  90. void
  91. string_list_free (slp)
  92.      string_list_ty *slp;
  93. {
  94.   size_t j;
  95.  
  96.   for (j = 0; j < slp->nitems; ++j)
  97.     free ((char *) slp->item[j]);
  98.   if (slp->item != NULL)
  99.     free (slp->item);
  100.   free (slp);
  101. }
  102.  
  103.  
  104. char *
  105. string_list_join (slp)
  106.      const string_list_ty *slp;
  107. {
  108.   size_t len;
  109.   size_t j;
  110.   char *result;
  111.   size_t pos;
  112.  
  113.   len = 1;
  114.   for (j = 0; j < slp->nitems; ++j)
  115.     {
  116.       if (j)
  117.     ++len;
  118.       len += strlen (slp->item[j]);
  119.     }
  120.   result = xmalloc (len);
  121.   pos = 0;
  122.   for (j = 0; j < slp->nitems; ++j)
  123.     {
  124.       if (j)
  125.     result[pos++] = ' ';
  126.       len = strlen (slp->item[j]);
  127.       memcpy (result + pos, slp->item[j], len);
  128.       pos += len;
  129.     }
  130.   result[pos] = 0;
  131.   return result;
  132. }
  133.  
  134.  
  135. int
  136. string_list_member (slp, s)
  137.      const string_list_ty *slp;
  138.      const char *s;
  139. {
  140.  size_t j;
  141.  
  142.   for (j = 0; j < slp->nitems; ++j)
  143.     if (strcmp (slp->item[j], s) == 0)
  144.       return 1;
  145.   return 0;
  146. }
  147.