mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			74 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
/* indexbyte.c -- implement bytes.IndexByte for Go.
 | 
						|
 | 
						|
   Copyright 2009 The Go Authors. All rights reserved.
 | 
						|
   Use of this source code is governed by a BSD-style
 | 
						|
   license that can be found in the LICENSE file.  */
 | 
						|
 | 
						|
#include <stddef.h>
 | 
						|
 | 
						|
#include "runtime.h"
 | 
						|
#include "array.h"
 | 
						|
 | 
						|
/* This is in C so that the compiler can optimize it appropriately.
 | 
						|
   We deliberately don't split the stack in case it does call the
 | 
						|
   library function, which shouldn't need much stack space.  */
 | 
						|
 | 
						|
intgo IndexByte (struct __go_open_array, char)
 | 
						|
  __asm__ (GOSYM_PREFIX "bytes.IndexByte")
 | 
						|
  __attribute__ ((no_split_stack));
 | 
						|
 | 
						|
intgo
 | 
						|
IndexByte (struct __go_open_array s, char b)
 | 
						|
{
 | 
						|
  char *p;
 | 
						|
 | 
						|
  p = __builtin_memchr (s.__values, b, s.__count);
 | 
						|
  if (p == NULL)
 | 
						|
    return -1;
 | 
						|
  return p - (char *) s.__values;
 | 
						|
}
 | 
						|
 | 
						|
/* Comparison.  */
 | 
						|
 | 
						|
_Bool Equal (struct __go_open_array a, struct __go_open_array b)
 | 
						|
  __asm__ (GOSYM_PREFIX "bytes.Equal")
 | 
						|
  __attribute__ ((no_split_stack));
 | 
						|
 | 
						|
_Bool
 | 
						|
Equal (struct __go_open_array a, struct __go_open_array b)
 | 
						|
{
 | 
						|
  if (a.__count != b.__count)
 | 
						|
    return 0;
 | 
						|
  return __builtin_memcmp (a.__values, b.__values, a.__count) == 0;
 | 
						|
}
 | 
						|
 | 
						|
intgo Compare (struct __go_open_array a, struct __go_open_array b)
 | 
						|
  __asm__ (GOSYM_PREFIX "bytes.Compare")
 | 
						|
  __attribute__ ((no_split_stack));
 | 
						|
 | 
						|
intgo
 | 
						|
Compare (struct __go_open_array a, struct __go_open_array b)
 | 
						|
{
 | 
						|
  intgo len;
 | 
						|
 | 
						|
  len = a.__count;
 | 
						|
  if (len > b.__count)
 | 
						|
    len = b.__count;
 | 
						|
  if (len > 0)
 | 
						|
    {
 | 
						|
      intgo ret;
 | 
						|
 | 
						|
      ret = __builtin_memcmp (a.__values, b.__values, len);
 | 
						|
      if (ret < 0)
 | 
						|
	return -1;
 | 
						|
      else if (ret > 0)
 | 
						|
	return 1;
 | 
						|
    }
 | 
						|
  if (a.__count < b.__count)
 | 
						|
    return -1;
 | 
						|
  else if (a.__count > b.__count)
 | 
						|
    return 1;
 | 
						|
  else
 | 
						|
    return 0;
 | 
						|
}
 |