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

Subversion Repositories or1k

[/] [or1k/] [tags/] [start/] [gdb-5.0/] [libiberty/] [concat.c] - Diff between revs 579 and 1765

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

Rev 579 Rev 1765
/* Concatenate variable number of strings.
/* Concatenate variable number of strings.
   Copyright (C) 1991, 1994 Free Software Foundation, Inc.
   Copyright (C) 1991, 1994 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., 59 Temple Place - Suite 330,
not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.  */
Boston, MA 02111-1307, USA.  */
 
 
 
 
/*
/*
 
 
NAME
NAME
 
 
        concat -- concatenate a variable number of strings
        concat -- concatenate a variable number of strings
 
 
SYNOPSIS
SYNOPSIS
 
 
        #include <varargs.h>
        #include <varargs.h>
 
 
        char *concat (s1, s2, s3, ..., NULL)
        char *concat (s1, s2, s3, ..., NULL)
 
 
DESCRIPTION
DESCRIPTION
 
 
        Concatenate a variable number of strings and return the result
        Concatenate a variable number of strings and return the result
        in freshly malloc'd memory.
        in freshly malloc'd memory.
 
 
        Returns NULL if insufficient memory is available.  The argument
        Returns NULL if insufficient memory is available.  The argument
        list is terminated by the first NULL pointer encountered.  Pointers
        list is terminated by the first NULL pointer encountered.  Pointers
        to empty strings are ignored.
        to empty strings are ignored.
 
 
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.
*/
*/
 
 
 
 
#include "ansidecl.h"
#include "ansidecl.h"
#include "libiberty.h"
#include "libiberty.h"
 
 
#ifdef ANSI_PROTOTYPES
#ifdef ANSI_PROTOTYPES
#include <stdarg.h>
#include <stdarg.h>
#else
#else
#include <varargs.h>
#include <varargs.h>
#endif
#endif
 
 
#ifdef __STDC__
#ifdef __STDC__
#include <stddef.h>
#include <stddef.h>
extern size_t strlen (const char *s);
extern size_t strlen (const char *s);
#else
#else
extern int strlen ();
extern int strlen ();
#endif
#endif
 
 
#define NULLP (char *)0
#define NULLP (char *)0
 
 
/* VARARGS */
/* VARARGS */
#ifdef ANSI_PROTOTYPES
#ifdef ANSI_PROTOTYPES
char *
char *
concat (const char *first, ...)
concat (const char *first, ...)
#else
#else
char *
char *
concat (va_alist)
concat (va_alist)
     va_dcl
     va_dcl
#endif
#endif
{
{
  register int length;
  register int length;
  register char *newstr;
  register char *newstr;
  register char *end;
  register char *end;
  register const char *arg;
  register const char *arg;
  va_list args;
  va_list args;
#ifndef ANSI_PROTOTYPES
#ifndef ANSI_PROTOTYPES
  const char *first;
  const char *first;
#endif
#endif
 
 
  /* First compute the size of the result and get sufficient memory. */
  /* First compute the size of the result and get sufficient memory. */
 
 
#ifdef ANSI_PROTOTYPES
#ifdef ANSI_PROTOTYPES
  va_start (args, first);
  va_start (args, first);
#else
#else
  va_start (args);
  va_start (args);
  first = va_arg (args, const char *);
  first = va_arg (args, const char *);
#endif
#endif
 
 
  if (first == NULLP)
  if (first == NULLP)
    length = 0;
    length = 0;
  else
  else
    {
    {
      length = strlen (first);
      length = strlen (first);
      while ((arg = va_arg (args, const char *)) != NULLP)
      while ((arg = va_arg (args, const char *)) != NULLP)
        {
        {
          length += strlen (arg);
          length += strlen (arg);
        }
        }
    }
    }
  newstr = (char *) xmalloc (length + 1);
  newstr = (char *) xmalloc (length + 1);
  va_end (args);
  va_end (args);
 
 
  /* Now copy the individual pieces to the result string. */
  /* Now copy the individual pieces to the result string. */
 
 
  if (newstr != NULLP)
  if (newstr != NULLP)
    {
    {
#ifdef ANSI_PROTOTYPES
#ifdef ANSI_PROTOTYPES
      va_start (args, first);
      va_start (args, first);
#else
#else
      va_start (args);
      va_start (args);
      first = va_arg (args, const char *);
      first = va_arg (args, const char *);
#endif
#endif
      end = newstr;
      end = newstr;
      if (first != NULLP)
      if (first != NULLP)
        {
        {
          arg = first;
          arg = first;
          while (*arg)
          while (*arg)
            {
            {
              *end++ = *arg++;
              *end++ = *arg++;
            }
            }
          while ((arg = va_arg (args, const char *)) != NULLP)
          while ((arg = va_arg (args, const char *)) != NULLP)
            {
            {
              while (*arg)
              while (*arg)
                {
                {
                  *end++ = *arg++;
                  *end++ = *arg++;
                }
                }
            }
            }
        }
        }
      *end = '\000';
      *end = '\000';
      va_end (args);
      va_end (args);
    }
    }
 
 
  return (newstr);
  return (newstr);
}
}
 
 
#ifdef MAIN
#ifdef MAIN
 
 
/* Simple little test driver. */
/* Simple little test driver. */
 
 
#include <stdio.h>
#include <stdio.h>
 
 
int
int
main ()
main ()
{
{
  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.