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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gdb-7.1/] [libiberty/] [memmem.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
/* Copyright (C) 1991,92,93,94,96,97,98,2000,2004,2007 Free Software Foundation, Inc.
/* Copyright (C) 1991,92,93,94,96,97,98,2000,2004,2007 Free Software Foundation, Inc.
   This file is part of the GNU C Library.
   This file is part of the GNU C Library.
 
 
   This program is free software; you can redistribute it and/or modify
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2, or (at your option)
   the Free Software Foundation; either version 2, or (at your option)
   any later version.
   any later version.
 
 
   This program is distributed in the hope that it will be useful,
   This program 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
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   GNU General Public License for more details.
 
 
   You should have received a copy of the GNU General Public License along
   You should have received a copy of the GNU General Public License along
   with this program; if not, write to the Free Software Foundation,
   with this program; if not, write to the Free Software Foundation,
   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
 
 
/*
/*
 
 
@deftypefn Supplemental void* memmem (const void *@var{haystack}, size_t @var{haystack_len} const void *@var{needle}, size_t @var{needle_len})
@deftypefn Supplemental void* memmem (const void *@var{haystack}, size_t @var{haystack_len} const void *@var{needle}, size_t @var{needle_len})
 
 
Returns a pointer to the first occurrence of @var{needle} (length
Returns a pointer to the first occurrence of @var{needle} (length
@var{needle_len}) in @var{haystack} (length @var{haystack_len}).
@var{needle_len}) in @var{haystack} (length @var{haystack_len}).
Returns @code{NULL} if not found.
Returns @code{NULL} if not found.
 
 
@end deftypefn
@end deftypefn
 
 
*/
*/
 
 
#ifndef _LIBC
#ifndef _LIBC
# include <config.h>
# include <config.h>
#endif
#endif
 
 
#include <stddef.h>
#include <stddef.h>
#include <string.h>
#include <string.h>
 
 
#ifndef _LIBC
#ifndef _LIBC
# define __builtin_expect(expr, val)   (expr)
# define __builtin_expect(expr, val)   (expr)
#endif
#endif
 
 
#undef memmem
#undef memmem
 
 
/* Return the first occurrence of NEEDLE in HAYSTACK.  */
/* Return the first occurrence of NEEDLE in HAYSTACK.  */
void *
void *
memmem (const void *haystack, size_t haystack_len, const void *needle,
memmem (const void *haystack, size_t haystack_len, const void *needle,
        size_t needle_len)
        size_t needle_len)
{
{
  const char *begin;
  const char *begin;
  const char *const last_possible
  const char *const last_possible
    = (const char *) haystack + haystack_len - needle_len;
    = (const char *) haystack + haystack_len - needle_len;
 
 
  if (needle_len == 0)
  if (needle_len == 0)
    /* The first occurrence of the empty string is deemed to occur at
    /* The first occurrence of the empty string is deemed to occur at
       the beginning of the string.  */
       the beginning of the string.  */
    return (void *) haystack;
    return (void *) haystack;
 
 
  /* Sanity check, otherwise the loop might search through the whole
  /* Sanity check, otherwise the loop might search through the whole
     memory.  */
     memory.  */
  if (__builtin_expect (haystack_len < needle_len, 0))
  if (__builtin_expect (haystack_len < needle_len, 0))
    return NULL;
    return NULL;
 
 
  for (begin = (const char *) haystack; begin <= last_possible; ++begin)
  for (begin = (const char *) haystack; begin <= last_possible; ++begin)
    if (begin[0] == ((const char *) needle)[0] &&
    if (begin[0] == ((const char *) needle)[0] &&
        !memcmp ((const void *) &begin[1],
        !memcmp ((const void *) &begin[1],
                 (const void *) ((const char *) needle + 1),
                 (const void *) ((const char *) needle + 1),
                 needle_len - 1))
                 needle_len - 1))
      return (void *) begin;
      return (void *) begin;
 
 
  return NULL;
  return NULL;
}
}
 
 

powered by: WebSVN 2.1.0

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