OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gdb-7.1/] [libiberty/] [concat.c] - Diff between revs 834 and 842

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 834 Rev 842
/* Concatenate variable number of strings.
/* Concatenate variable number of strings.
   Copyright (C) 1991, 1994, 2001 Free Software Foundation, Inc.
   Copyright (C) 1991, 1994, 2001 Free Software Foundation, Inc.
   Written by Fred Fish @ Cygnus Support
   Written by Fred Fish @ Cygnus Support
 
 
This file is part of the libiberty library.
This file is part of the libiberty library.
Libiberty is free software; you can redistribute it and/or
Libiberty is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
version 2 of the License, or (at your option) any later version.
 
 
Libiberty is distributed in the hope that it will be useful,
Libiberty is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Library General Public License for more details.
Library General Public License for more details.
 
 
You should have received a copy of the GNU Library General Public
You should have received a copy of the GNU Library General Public
License along with libiberty; see the file COPYING.LIB.  If
License along with libiberty; see the file COPYING.LIB.  If
not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
Boston, MA 02110-1301, USA.  */
Boston, MA 02110-1301, USA.  */
 
 
 
 
/*
/*
 
 
@deftypefn Extension char* concat (const char *@var{s1}, const char *@var{s2}, @dots{}, @code{NULL})
@deftypefn Extension char* concat (const char *@var{s1}, const char *@var{s2}, @dots{}, @code{NULL})
 
 
Concatenate zero or more of strings and return the result in freshly
Concatenate zero or more of strings and return the result in freshly
@code{xmalloc}ed memory.  Returns @code{NULL} if insufficient memory is
@code{xmalloc}ed memory.  Returns @code{NULL} if insufficient memory is
available.  The argument list is terminated by the first @code{NULL}
available.  The argument list is terminated by the first @code{NULL}
pointer encountered.  Pointers to empty strings are ignored.
pointer encountered.  Pointers to empty strings are ignored.
 
 
@end deftypefn
@end deftypefn
 
 
NOTES
NOTES
 
 
        This function uses xmalloc() which is expected to be a front end
        This function uses xmalloc() which is expected to be a front end
        function to malloc() that deals with low memory situations.  In
        function to malloc() that deals with low memory situations.  In
        typical use, if malloc() returns NULL then xmalloc() diverts to an
        typical use, if malloc() returns NULL then xmalloc() diverts to an
        error handler routine which never returns, and thus xmalloc will
        error handler routine which never returns, and thus xmalloc will
        never return a NULL pointer.  If the client application wishes to
        never return a NULL pointer.  If the client application wishes to
        deal with low memory situations itself, it should supply an xmalloc
        deal with low memory situations itself, it should supply an xmalloc
        that just directly invokes malloc and blindly returns whatever
        that just directly invokes malloc and blindly returns whatever
        malloc returns.
        malloc returns.
 
 
*/
*/
 
 
 
 
#ifdef HAVE_CONFIG_H
#ifdef HAVE_CONFIG_H
#include "config.h"
#include "config.h"
#endif
#endif
#include "ansidecl.h"
#include "ansidecl.h"
#include "libiberty.h"
#include "libiberty.h"
#include <sys/types.h>          /* size_t */
#include <sys/types.h>          /* size_t */
 
 
#include <stdarg.h>
#include <stdarg.h>
 
 
# if HAVE_STRING_H
# if HAVE_STRING_H
#  include <string.h>
#  include <string.h>
# else
# else
#  if HAVE_STRINGS_H
#  if HAVE_STRINGS_H
#   include <strings.h>
#   include <strings.h>
#  endif
#  endif
# endif
# endif
 
 
#if HAVE_STDLIB_H
#if HAVE_STDLIB_H
#include <stdlib.h>
#include <stdlib.h>
#endif
#endif
 
 
static inline unsigned long vconcat_length (const char *, va_list);
static inline unsigned long vconcat_length (const char *, va_list);
static inline unsigned long
static inline unsigned long
vconcat_length (const char *first, va_list args)
vconcat_length (const char *first, va_list args)
{
{
  unsigned long length = 0;
  unsigned long length = 0;
  const char *arg;
  const char *arg;
 
 
  for (arg = first; arg ; arg = va_arg (args, const char *))
  for (arg = first; arg ; arg = va_arg (args, const char *))
    length += strlen (arg);
    length += strlen (arg);
 
 
  return length;
  return length;
}
}
 
 
static inline char *
static inline char *
vconcat_copy (char *dst, const char *first, va_list args)
vconcat_copy (char *dst, const char *first, va_list args)
{
{
  char *end = dst;
  char *end = dst;
  const char *arg;
  const char *arg;
 
 
  for (arg = first; arg ; arg = va_arg (args, const char *))
  for (arg = first; arg ; arg = va_arg (args, const char *))
    {
    {
      unsigned long length = strlen (arg);
      unsigned long length = strlen (arg);
      memcpy (end, arg, length);
      memcpy (end, arg, length);
      end += length;
      end += length;
    }
    }
  *end = '\000';
  *end = '\000';
 
 
  return dst;
  return dst;
}
}
 
 
/* @undocumented concat_length */
/* @undocumented concat_length */
 
 
unsigned long
unsigned long
concat_length (const char *first, ...)
concat_length (const char *first, ...)
{
{
  unsigned long length;
  unsigned long length;
 
 
  VA_OPEN (args, first);
  VA_OPEN (args, first);
  VA_FIXEDARG (args, const char *, first);
  VA_FIXEDARG (args, const char *, first);
  length = vconcat_length (first, args);
  length = vconcat_length (first, args);
  VA_CLOSE (args);
  VA_CLOSE (args);
 
 
  return length;
  return length;
}
}
 
 
/* @undocumented concat_copy */
/* @undocumented concat_copy */
 
 
char *
char *
concat_copy (char *dst, const char *first, ...)
concat_copy (char *dst, const char *first, ...)
{
{
  char *save_dst;
  char *save_dst;
 
 
  VA_OPEN (args, first);
  VA_OPEN (args, first);
  VA_FIXEDARG (args, char *, dst);
  VA_FIXEDARG (args, char *, dst);
  VA_FIXEDARG (args, const char *, first);
  VA_FIXEDARG (args, const char *, first);
  vconcat_copy (dst, first, args);
  vconcat_copy (dst, first, args);
  save_dst = dst; /* With K&R C, dst goes out of scope here.  */
  save_dst = dst; /* With K&R C, dst goes out of scope here.  */
  VA_CLOSE (args);
  VA_CLOSE (args);
 
 
  return save_dst;
  return save_dst;
}
}
 
 
#ifdef __cplusplus
#ifdef __cplusplus
extern "C" {
extern "C" {
#endif /* __cplusplus */
#endif /* __cplusplus */
char *libiberty_concat_ptr;
char *libiberty_concat_ptr;
#ifdef __cplusplus
#ifdef __cplusplus
}
}
#endif /* __cplusplus */
#endif /* __cplusplus */
 
 
/* @undocumented concat_copy2 */
/* @undocumented concat_copy2 */
 
 
char *
char *
concat_copy2 (const char *first, ...)
concat_copy2 (const char *first, ...)
{
{
  VA_OPEN (args, first);
  VA_OPEN (args, first);
  VA_FIXEDARG (args, const char *, first);
  VA_FIXEDARG (args, const char *, first);
  vconcat_copy (libiberty_concat_ptr, first, args);
  vconcat_copy (libiberty_concat_ptr, first, args);
  VA_CLOSE (args);
  VA_CLOSE (args);
 
 
  return libiberty_concat_ptr;
  return libiberty_concat_ptr;
}
}
 
 
char *
char *
concat (const char *first, ...)
concat (const char *first, ...)
{
{
  char *newstr;
  char *newstr;
 
 
  /* First compute the size of the result and get sufficient memory.  */
  /* First compute the size of the result and get sufficient memory.  */
  VA_OPEN (args, first);
  VA_OPEN (args, first);
  VA_FIXEDARG (args, const char *, first);
  VA_FIXEDARG (args, const char *, first);
  newstr = XNEWVEC (char, vconcat_length (first, args) + 1);
  newstr = XNEWVEC (char, vconcat_length (first, args) + 1);
  VA_CLOSE (args);
  VA_CLOSE (args);
 
 
  /* Now copy the individual pieces to the result string. */
  /* Now copy the individual pieces to the result string. */
  VA_OPEN (args, first);
  VA_OPEN (args, first);
  VA_FIXEDARG (args, const char *, first);
  VA_FIXEDARG (args, const char *, first);
  vconcat_copy (newstr, first, args);
  vconcat_copy (newstr, first, args);
  VA_CLOSE (args);
  VA_CLOSE (args);
 
 
  return newstr;
  return newstr;
}
}
 
 
/*
/*
 
 
@deftypefn Extension char* reconcat (char *@var{optr}, const char *@var{s1}, @dots{}, @code{NULL})
@deftypefn Extension char* reconcat (char *@var{optr}, const char *@var{s1}, @dots{}, @code{NULL})
 
 
Same as @code{concat}, except that if @var{optr} is not @code{NULL} it
Same as @code{concat}, except that if @var{optr} is not @code{NULL} it
is freed after the string is created.  This is intended to be useful
is freed after the string is created.  This is intended to be useful
when you're extending an existing string or building up a string in a
when you're extending an existing string or building up a string in a
loop:
loop:
 
 
@example
@example
  str = reconcat (str, "pre-", str, NULL);
  str = reconcat (str, "pre-", str, NULL);
@end example
@end example
 
 
@end deftypefn
@end deftypefn
 
 
*/
*/
 
 
char *
char *
reconcat (char *optr, const char *first, ...)
reconcat (char *optr, const char *first, ...)
{
{
  char *newstr;
  char *newstr;
 
 
  /* First compute the size of the result and get sufficient memory.  */
  /* First compute the size of the result and get sufficient memory.  */
  VA_OPEN (args, first);
  VA_OPEN (args, first);
  VA_FIXEDARG (args, char *, optr);
  VA_FIXEDARG (args, char *, optr);
  VA_FIXEDARG (args, const char *, first);
  VA_FIXEDARG (args, const char *, first);
  newstr = XNEWVEC (char, vconcat_length (first, args) + 1);
  newstr = XNEWVEC (char, vconcat_length (first, args) + 1);
  VA_CLOSE (args);
  VA_CLOSE (args);
 
 
  /* Now copy the individual pieces to the result string. */
  /* Now copy the individual pieces to the result string. */
  VA_OPEN (args, first);
  VA_OPEN (args, first);
  VA_FIXEDARG (args, char *, optr);
  VA_FIXEDARG (args, char *, optr);
  VA_FIXEDARG (args, const char *, first);
  VA_FIXEDARG (args, const char *, first);
  vconcat_copy (newstr, first, args);
  vconcat_copy (newstr, first, args);
  if (optr) /* Done before VA_CLOSE so optr stays in scope for K&R C.  */
  if (optr) /* Done before VA_CLOSE so optr stays in scope for K&R C.  */
    free (optr);
    free (optr);
  VA_CLOSE (args);
  VA_CLOSE (args);
 
 
  return newstr;
  return newstr;
}
}
 
 
#ifdef MAIN
#ifdef MAIN
#define NULLP (char *)0
#define NULLP (char *)0
 
 
/* Simple little test driver. */
/* Simple little test driver. */
 
 
#include <stdio.h>
#include <stdio.h>
 
 
int
int
main (void)
main (void)
{
{
  printf ("\"\" = \"%s\"\n", concat (NULLP));
  printf ("\"\" = \"%s\"\n", concat (NULLP));
  printf ("\"a\" = \"%s\"\n", concat ("a", NULLP));
  printf ("\"a\" = \"%s\"\n", concat ("a", NULLP));
  printf ("\"ab\" = \"%s\"\n", concat ("a", "b", NULLP));
  printf ("\"ab\" = \"%s\"\n", concat ("a", "b", NULLP));
  printf ("\"abc\" = \"%s\"\n", concat ("a", "b", "c", NULLP));
  printf ("\"abc\" = \"%s\"\n", concat ("a", "b", "c", NULLP));
  printf ("\"abcd\" = \"%s\"\n", concat ("ab", "cd", NULLP));
  printf ("\"abcd\" = \"%s\"\n", concat ("ab", "cd", NULLP));
  printf ("\"abcde\" = \"%s\"\n", concat ("ab", "c", "de", NULLP));
  printf ("\"abcde\" = \"%s\"\n", concat ("ab", "c", "de", NULLP));
  printf ("\"abcdef\" = \"%s\"\n", concat ("", "a", "", "bcd", "ef", NULLP));
  printf ("\"abcdef\" = \"%s\"\n", concat ("", "a", "", "bcd", "ef", NULLP));
  return 0;
  return 0;
}
}
 
 
#endif
#endif
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.