blob: e22f8e5c3f65057f96a89322d43987d464e8245b [file] [log] [blame]
// Copyright 2017 The Wuffs Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ----------------
// Package base38 converts a 4-byte string, each byte in [ 0-9?a-z], to a base
// 38 number.
package base38
const (
// Max is the inclusive upper bound for the value returned by Encode. Its
// value equals (38*38*38*38 - 1).
Max = 2085135
// MaxBits is the number of bits required to represent Max. It satisfies
// (1<<(MaxBits-1) <= Max) && (Max < 1<<MaxBits).
MaxBits = 21
)
// Encode encodes a 4-byte string as a uint32 in the range [0, Max].
//
// Each byte must be ' ', be in the range '0'-'9', be '?' or be in the range
// 'a'-'z'.
//
// The string " " is mapped to zero.
func Encode(s string) (u uint32, ok bool) {
if len(s) == 4 {
for i := 0; i < 4; i++ {
x := uint32(table[s[i]])
if x == 0 {
break
}
u += x - 1
if i == 3 {
return u, true
}
u *= 38
}
}
return 0, false
}
var table = [256]uint8{
' ': 1,
'0': 2,
'1': 3,
'2': 4,
'3': 5,
'4': 6,
'5': 7,
'6': 8,
'7': 9,
'8': 10,
'9': 11,
'?': 12,
'a': 13,
'b': 14,
'c': 15,
'd': 16,
'e': 17,
'f': 18,
'g': 19,
'h': 20,
'i': 21,
'j': 22,
'k': 23,
'l': 24,
'm': 25,
'n': 26,
'o': 27,
'p': 28,
'q': 29,
'r': 30,
's': 31,
't': 32,
'u': 33,
'v': 34,
'w': 35,
'x': 36,
'y': 37,
'z': 38,
}