Blame string/argz.h

Packit Service 82fcde
/* Routines for dealing with '\0' separated arg vectors.
Packit Service 82fcde
   Copyright (C) 1995-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   This file is part of the GNU C Library.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
   modify it under the terms of the GNU Lesser General Public
Packit Service 82fcde
   License as published by the Free Software Foundation; either
Packit Service 82fcde
   version 2.1 of the License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
   Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
   License along with the GNU C Library; if not, see
Packit Service 82fcde
   <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
#ifndef _ARGZ_H
Packit Service 82fcde
#define _ARGZ_H	1
Packit Service 82fcde
Packit Service 82fcde
#include <features.h>
Packit Service 82fcde
#include <errno.h>
Packit Service 82fcde
#include <string.h>		/* Need size_t, and strchr is called below.  */
Packit Service 82fcde
Packit Service 82fcde
__BEGIN_DECLS
Packit Service 82fcde
Packit Service 82fcde
/* error_t may or may not be available from errno.h, depending on the
Packit Service 82fcde
   operating system.  */
Packit Service 82fcde
#ifndef __error_t_defined
Packit Service 82fcde
# define __error_t_defined 1
Packit Service 82fcde
typedef int error_t;
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/* Make a '\0' separated arg vector from a unix argv vector, returning it in
Packit Service 82fcde
   ARGZ, and the total length in LEN.  If a memory allocation error occurs,
Packit Service 82fcde
   ENOMEM is returned, otherwise 0.  The result can be destroyed using free. */
Packit Service 82fcde
extern error_t __argz_create (char *const __argv[], char **__restrict __argz,
Packit Service 82fcde
			      size_t *__restrict __len) __THROW;
Packit Service 82fcde
extern error_t argz_create (char *const __argv[], char **__restrict __argz,
Packit Service 82fcde
			    size_t *__restrict __len) __THROW;
Packit Service 82fcde
Packit Service 82fcde
/* Make a '\0' separated arg vector from a SEP separated list in
Packit Service 82fcde
   STRING, returning it in ARGZ, and the total length in LEN.  If a
Packit Service 82fcde
   memory allocation error occurs, ENOMEM is returned, otherwise 0.
Packit Service 82fcde
   The result can be destroyed using free.  */
Packit Service 82fcde
extern error_t argz_create_sep (const char *__restrict __string,
Packit Service 82fcde
				int __sep, char **__restrict __argz,
Packit Service 82fcde
				size_t *__restrict __len) __THROW;
Packit Service 82fcde
Packit Service 82fcde
/* Returns the number of strings in ARGZ.  */
Packit Service 82fcde
extern size_t __argz_count (const char *__argz, size_t __len)
Packit Service 82fcde
     __THROW __attribute_pure__;
Packit Service 82fcde
extern size_t argz_count (const char *__argz, size_t __len)
Packit Service 82fcde
     __THROW __attribute_pure__;
Packit Service 82fcde
Packit Service 82fcde
/* Puts pointers to each string in ARGZ into ARGV, which must be large enough
Packit Service 82fcde
   to hold them all.  */
Packit Service 82fcde
extern void __argz_extract (const char *__restrict __argz, size_t __len,
Packit Service 82fcde
			    char **__restrict __argv) __THROW;
Packit Service 82fcde
extern void argz_extract (const char *__restrict __argz, size_t __len,
Packit Service 82fcde
			  char **__restrict __argv) __THROW;
Packit Service 82fcde
Packit Service 82fcde
/* Make '\0' separated arg vector ARGZ printable by converting all the '\0's
Packit Service 82fcde
   except the last into the character SEP.  */
Packit Service 82fcde
extern void __argz_stringify (char *__argz, size_t __len, int __sep) __THROW;
Packit Service 82fcde
extern void argz_stringify (char *__argz, size_t __len, int __sep) __THROW;
Packit Service 82fcde
Packit Service 82fcde
/* Append BUF, of length BUF_LEN to the argz vector in ARGZ & ARGZ_LEN.  */
Packit Service 82fcde
extern error_t argz_append (char **__restrict __argz,
Packit Service 82fcde
			    size_t *__restrict __argz_len,
Packit Service 82fcde
			    const char *__restrict __buf, size_t __buf_len)
Packit Service 82fcde
     __THROW;
Packit Service 82fcde
Packit Service 82fcde
/* Append STR to the argz vector in ARGZ & ARGZ_LEN.  */
Packit Service 82fcde
extern error_t argz_add (char **__restrict __argz,
Packit Service 82fcde
			 size_t *__restrict __argz_len,
Packit Service 82fcde
			 const char *__restrict __str) __THROW;
Packit Service 82fcde
Packit Service 82fcde
/* Append SEP separated list in STRING to the argz vector in ARGZ &
Packit Service 82fcde
   ARGZ_LEN.  */
Packit Service 82fcde
extern error_t argz_add_sep (char **__restrict __argz,
Packit Service 82fcde
			     size_t *__restrict __argz_len,
Packit Service 82fcde
			     const char *__restrict __string, int __delim)
Packit Service 82fcde
     __THROW;
Packit Service 82fcde
Packit Service 82fcde
/* Delete ENTRY from ARGZ & ARGZ_LEN, if it appears there.  */
Packit Service 82fcde
extern void argz_delete (char **__restrict __argz,
Packit Service 82fcde
			 size_t *__restrict __argz_len,
Packit Service 82fcde
			 char *__restrict __entry) __THROW;
Packit Service 82fcde
Packit Service 82fcde
/* Insert ENTRY into ARGZ & ARGZ_LEN before BEFORE, which should be an
Packit Service 82fcde
   existing entry in ARGZ; if BEFORE is NULL, ENTRY is appended to the end.
Packit Service 82fcde
   Since ARGZ's first entry is the same as ARGZ, argz_insert (ARGZ, ARGZ_LEN,
Packit Service 82fcde
   ARGZ, ENTRY) will insert ENTRY at the beginning of ARGZ.  If BEFORE is not
Packit Service 82fcde
   in ARGZ, EINVAL is returned, else if memory can't be allocated for the new
Packit Service 82fcde
   ARGZ, ENOMEM is returned, else 0.  */
Packit Service 82fcde
extern error_t argz_insert (char **__restrict __argz,
Packit Service 82fcde
			    size_t *__restrict __argz_len,
Packit Service 82fcde
			    char *__restrict __before,
Packit Service 82fcde
			    const char *__restrict __entry) __THROW;
Packit Service 82fcde
Packit Service 82fcde
/* Replace any occurrences of the string STR in ARGZ with WITH, reallocating
Packit Service 82fcde
   ARGZ as necessary.  If REPLACE_COUNT is non-zero, *REPLACE_COUNT will be
Packit Service 82fcde
   incremented by number of replacements performed.  */
Packit Service 82fcde
extern error_t argz_replace (char **__restrict __argz,
Packit Service 82fcde
			     size_t *__restrict __argz_len,
Packit Service 82fcde
			     const char *__restrict __str,
Packit Service 82fcde
			     const char *__restrict __with,
Packit Service 82fcde
			     unsigned int *__restrict __replace_count);
Packit Service 82fcde

Packit Service 82fcde
/* Returns the next entry in ARGZ & ARGZ_LEN after ENTRY, or NULL if there
Packit Service 82fcde
   are no more.  If entry is NULL, then the first entry is returned.  This
Packit Service 82fcde
   behavior allows two convenient iteration styles:
Packit Service 82fcde
Packit Service 82fcde
    char *entry = 0;
Packit Service 82fcde
    while ((entry = argz_next (argz, argz_len, entry)))
Packit Service 82fcde
      ...;
Packit Service 82fcde
Packit Service 82fcde
   or
Packit Service 82fcde
Packit Service 82fcde
    char *entry;
Packit Service 82fcde
    for (entry = argz; entry; entry = argz_next (argz, argz_len, entry))
Packit Service 82fcde
      ...;
Packit Service 82fcde
*/
Packit Service 82fcde
extern char *__argz_next (const char *__restrict __argz, size_t __argz_len,
Packit Service 82fcde
			  const char *__restrict __entry) __THROW;
Packit Service 82fcde
extern char *argz_next (const char *__restrict __argz, size_t __argz_len,
Packit Service 82fcde
			const char *__restrict __entry) __THROW;
Packit Service 82fcde
Packit Service 82fcde
#ifdef __USE_EXTERN_INLINES
Packit Service 82fcde
__extern_inline char *
Packit Service 82fcde
__NTH (__argz_next (const char *__argz, size_t __argz_len,
Packit Service 82fcde
		    const char *__entry))
Packit Service 82fcde
{
Packit Service 82fcde
  if (__entry)
Packit Service 82fcde
    {
Packit Service 82fcde
      if (__entry < __argz + __argz_len)
Packit Service 82fcde
	__entry = strchr (__entry, '\0') + 1;
Packit Service 82fcde
Packit Service 82fcde
      return __entry >= __argz + __argz_len ? (char *) NULL : (char *) __entry;
Packit Service 82fcde
    }
Packit Service 82fcde
  else
Packit Service 82fcde
    return __argz_len > 0 ? (char *) __argz : 0;
Packit Service 82fcde
}
Packit Service 82fcde
__extern_inline char *
Packit Service 82fcde
__NTH (argz_next (const char *__argz, size_t __argz_len,
Packit Service 82fcde
		  const char *__entry))
Packit Service 82fcde
{
Packit Service 82fcde
  return __argz_next (__argz, __argz_len, __entry);
Packit Service 82fcde
}
Packit Service 82fcde
#endif /* Use extern inlines.  */
Packit Service 82fcde
Packit Service 82fcde
__END_DECLS
Packit Service 82fcde
Packit Service 82fcde
#endif /* argz.h */