blob: 969732dfebc0284dab83623691f88ce9aaa49ec8 [file] [log] [blame]
/* bytealg.c -- gccgo implementations of bytealg functions
Copyright 2018 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 <string.h>
#include "runtime.h"
#include "array.h"
#ifndef HAVE_MEMMEM
#define memmem goMemmem
static const void *goMemmem(const void *in, size_t inl, const void *s, size_t sl) {
const char *p;
char first;
const char *stop;
if (sl == 0) {
return in;
}
if (inl < sl) {
return nil;
}
first = *(const char *)(s);
stop = (const char *)(in) + (inl - sl);
for (p = (const char *)(in); p <= stop; p++) {
if (*p == first && __builtin_memcmp(p + 1, (const char *)(s) + 1, sl - 1) == 0) {
return (const void *)(p);
}
}
return nil;
}
#endif
intgo Compare(struct __go_open_array, struct __go_open_array)
__asm__(GOSYM_PREFIX "internal..z2fbytealg.Compare")
__attribute__((no_split_stack));
intgo Compare(struct __go_open_array a, struct __go_open_array b)
{
intgo l;
l = a.__count;
if (b.__count < l) {
l = b.__count;
}
if (l > 0 && a.__values != b.__values) {
int i;
i = __builtin_memcmp(a.__values, b.__values, (size_t)(l));
if (i < 0) {
return -1;
} else if (i > 0) {
return 1;
}
}
if (a.__count < b.__count) {
return -1;
}
if (a.__count > b.__count) {
return +1;
}
return 0;
}
intgo IndexByte(struct __go_open_array, byte)
__asm__(GOSYM_PREFIX "internal..z2fbytealg.IndexByte")
__attribute__((no_split_stack));
intgo IndexByte(struct __go_open_array b, byte c)
{
const byte *p;
p = __builtin_memchr(b.__values, c, (size_t)(b.__count));
if (p == nil) {
return -1;
}
return p - (byte *)(b.__values);
}
intgo IndexByteString(String, byte)
__asm__(GOSYM_PREFIX "internal..z2fbytealg.IndexByteString")
__attribute__((no_split_stack));
intgo IndexByteString(String s, byte c)
{
const byte *p;
p = __builtin_memchr(s.str, c, (size_t)(s.len));
if (p == nil) {
return -1;
}
return p - s.str;
}
intgo Index(struct __go_open_array, struct __go_open_array)
__asm__(GOSYM_PREFIX "internal..z2fbytealg.Index")
__attribute__((no_split_stack));
intgo Index(struct __go_open_array a, struct __go_open_array b)
{
const byte* p;
p = memmem(a.__values, a.__count, b.__values, b.__count);
if (p == nil) {
return -1;
}
return p - (const byte*)(a.__values);
}
intgo IndexString(String, String)
__asm__(GOSYM_PREFIX "internal..z2fbytealg.IndexString")
__attribute__((no_split_stack));
intgo IndexString(String a, String b)
{
const byte* p;
p = memmem(a.str, a.len, b.str, b.len);
if (p == nil) {
return -1;
}
return p - a.str;
}