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

Subversion Repositories openrisc

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

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,2008,2009,2010
/* Copyright (C) 1991,92,93,94,96,97,98,2000,2004,2007,2008,2009,2010
Free Software Foundation, Inc.
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 3, or (at your option)
   the Free Software Foundation; either version 3, 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.  */
 
 
/* This particular implementation was written by Eric Blake, 2008.  */
/* This particular implementation was written by Eric Blake, 2008.  */
 
 
#ifndef _LIBC
#ifndef _LIBC
# include <config.h>
# include <config.h>
#endif
#endif
 
 
/* Specification of memmem.  */
/* Specification of memmem.  */
#include <string.h>
#include <string.h>
 
 
#ifndef _LIBC
#ifndef _LIBC
# define __builtin_expect(expr, val)   (expr)
# define __builtin_expect(expr, val)   (expr)
#endif
#endif
 
 
#define RETURN_TYPE void *
#define RETURN_TYPE void *
#define AVAILABLE(h, h_l, j, n_l) ((j) <= (h_l) - (n_l))
#define AVAILABLE(h, h_l, j, n_l) ((j) <= (h_l) - (n_l))
#include "str-two-way.h"
#include "str-two-way.h"
 
 
/* Return the first occurrence of NEEDLE in HAYSTACK.  Return HAYSTACK
/* Return the first occurrence of NEEDLE in HAYSTACK.  Return HAYSTACK
   if NEEDLE_LEN is 0, otherwise NULL if NEEDLE is not found in
   if NEEDLE_LEN is 0, otherwise NULL if NEEDLE is not found in
   HAYSTACK.  */
   HAYSTACK.  */
void *
void *
memmem (const void *haystack_start, size_t haystack_len,
memmem (const void *haystack_start, size_t haystack_len,
        const void *needle_start, size_t needle_len)
        const void *needle_start, size_t needle_len)
{
{
  /* Abstract memory is considered to be an array of 'unsigned char' values,
  /* Abstract memory is considered to be an array of 'unsigned char' values,
     not an array of 'char' values.  See ISO C 99 section 6.2.6.1.  */
     not an array of 'char' values.  See ISO C 99 section 6.2.6.1.  */
  const unsigned char *haystack = (const unsigned char *) haystack_start;
  const unsigned char *haystack = (const unsigned char *) haystack_start;
  const unsigned char *needle = (const unsigned char *) needle_start;
  const unsigned char *needle = (const unsigned char *) needle_start;
 
 
  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;
 
 
  /* Use optimizations in memchr when possible, to reduce the search
  /* Use optimizations in memchr when possible, to reduce the search
     size of haystack using a linear algorithm with a smaller
     size of haystack using a linear algorithm with a smaller
     coefficient.  However, avoid memchr for long needles, since we
     coefficient.  However, avoid memchr for long needles, since we
     can often achieve sublinear performance.  */
     can often achieve sublinear performance.  */
  if (needle_len < LONG_NEEDLE_THRESHOLD)
  if (needle_len < LONG_NEEDLE_THRESHOLD)
    {
    {
      haystack = memchr (haystack, *needle, haystack_len);
      haystack = memchr (haystack, *needle, haystack_len);
      if (!haystack || __builtin_expect (needle_len == 1, 0))
      if (!haystack || __builtin_expect (needle_len == 1, 0))
        return (void *) haystack;
        return (void *) haystack;
      haystack_len -= haystack - (const unsigned char *) haystack_start;
      haystack_len -= haystack - (const unsigned char *) haystack_start;
      if (haystack_len < needle_len)
      if (haystack_len < needle_len)
        return NULL;
        return NULL;
      return two_way_short_needle (haystack, haystack_len, needle, needle_len);
      return two_way_short_needle (haystack, haystack_len, needle, needle_len);
    }
    }
  else
  else
    return two_way_long_needle (haystack, haystack_len, needle, needle_len);
    return two_way_long_needle (haystack, haystack_len, needle, needle_len);
}
}
 
 
#undef LONG_NEEDLE_THRESHOLD
#undef LONG_NEEDLE_THRESHOLD
 
 

powered by: WebSVN 2.1.0

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