1// Copyright 2018 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5//go:build !386 && !amd64 && !s390x && !arm && !arm64 && !loong64 && !ppc64 && !ppc64le && !mips && !mipsle && !wasm && !mips64 && !mips64le && !riscv64
6
7package bytealg
8
9import _ "unsafe" // for go:linkname
10
11func Compare(a, b []byte) int {
12	l := len(a)
13	if len(b) < l {
14		l = len(b)
15	}
16	if l == 0 || &a[0] == &b[0] {
17		goto samebytes
18	}
19	for i := 0; i < l; i++ {
20		c1, c2 := a[i], b[i]
21		if c1 < c2 {
22			return -1
23		}
24		if c1 > c2 {
25			return +1
26		}
27	}
28samebytes:
29	if len(a) < len(b) {
30		return -1
31	}
32	if len(a) > len(b) {
33		return +1
34	}
35	return 0
36}
37
38func CompareString(a, b string) int {
39	return runtime_cmpstring(a, b)
40}
41
42// runtime.cmpstring calls are emitted by the compiler.
43//
44// runtime.cmpstring should be an internal detail,
45// but widely used packages access it using linkname.
46// Notable members of the hall of shame include:
47//   - gitee.com/zhaochuninhefei/gmgo
48//   - github.com/bytedance/gopkg
49//   - github.com/songzhibin97/gkit
50//
51// Do not remove or change the type signature.
52// See go.dev/issue/67401.
53//
54//go:linkname runtime_cmpstring runtime.cmpstring
55func runtime_cmpstring(a, b string) int {
56	l := len(a)
57	if len(b) < l {
58		l = len(b)
59	}
60	for i := 0; i < l; i++ {
61		c1, c2 := a[i], b[i]
62		if c1 < c2 {
63			return -1
64		}
65		if c1 > c2 {
66			return +1
67		}
68	}
69	if len(a) < len(b) {
70		return -1
71	}
72	if len(a) > len(b) {
73		return +1
74	}
75	return 0
76}
77