Back to index

glibc  2.9
argz-ctsep.c
Go to the documentation of this file.
00001 /* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
00002    This file is part of the GNU C Library.
00003    Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
00004 
00005    The GNU C Library is free software; you can redistribute it and/or
00006    modify it under the terms of the GNU Lesser General Public
00007    License as published by the Free Software Foundation; either
00008    version 2.1 of the License, or (at your option) any later version.
00009 
00010    The GNU C Library is distributed in the hope that it will be useful,
00011    but WITHOUT ANY WARRANTY; without even the implied warranty of
00012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013    Lesser General Public License for more details.
00014 
00015    You should have received a copy of the GNU Lesser General Public
00016    License along with the GNU C Library; if not, write to the Free
00017    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
00018    02111-1307 USA.  */
00019 
00020 #include <argz.h>
00021 #include <errno.h>
00022 #include <stdlib.h>
00023 #include <string.h>
00024 
00025 
00026 error_t
00027 __argz_create_sep (const char *string, int delim, char **argz, size_t *len)
00028 {
00029   size_t nlen = strlen (string) + 1;
00030 
00031   if (nlen > 1)
00032     {
00033       const char *rp;
00034       char *wp;
00035 
00036       *argz = (char *) malloc (nlen);
00037       if (*argz == NULL)
00038        return ENOMEM;
00039 
00040       rp = string;
00041       wp = *argz;
00042       do
00043        if (*rp == delim)
00044          {
00045            if (wp > *argz && wp[-1] != '\0')
00046              *wp++ = '\0';
00047            else
00048              --nlen;
00049          }
00050        else
00051          *wp++ = *rp;
00052       while (*rp++ != '\0');
00053 
00054       if (nlen == 0)
00055        {
00056          free (*argz);
00057          *argz = NULL;
00058          *len = 0;
00059        }
00060 
00061       *len = nlen;
00062     }
00063   else
00064     {
00065       *argz = NULL;
00066       *len = 0;
00067     }
00068 
00069   return 0;
00070 }
00071 weak_alias (__argz_create_sep, argz_create_sep)