Sha256: e4e04a05cd611e5da8c77a99f92ba0f04313f743d3757fe794056ac929b552ad

Contents?: true

Size: 1.4 KB

Versions: 16

Compression:

Stored size: 1.4 KB

Contents

// Package percent escapes strings using percent-encoding
package percent

import (
	"strings"
)

const upperhex = "0123456789ABCDEF"

func unhex(c byte) byte {
	switch {
	case '0' <= c && c <= '9':
		return c - '0'
	case 'a' <= c && c <= 'f':
		return c - 'a' + 10
	case 'A' <= c && c <= 'F':
		return c - 'A' + 10
	}
	return 0
}

func ishex(c byte) bool {
	switch {
	case '0' <= c && c <= '9':
		return true
	case 'a' <= c && c <= 'f':
		return true
	case 'A' <= c && c <= 'F':
		return true
	}
	return false
}

// Encode escapes the string using percent-encoding, converting the runes found in charsToEncode with hex-encoded %AB sequences
func Encode(s string, charsToEncode string) string {
	var t strings.Builder
	for _, c := range s {
		if strings.IndexRune(charsToEncode, c) != -1 || c == '%' {
			for _, b := range []byte(string(c)) {
				t.WriteByte('%')
				t.WriteByte(upperhex[b>>4])
				t.WriteByte(upperhex[b&15])
			}
		} else {
			t.WriteRune(c)
		}
	}
	return t.String()
}

// Decode does the inverse transformation of Encode, converting each 3-byte encoded substring of the form "%AB" into the hex-decoded byte 0xAB
func Decode(s string) string {
	var t []byte
	for i := 0; i < len(s); i++ {
		// check next 2 chars are valid
		if s[i] == '%' && i+2 < len(s) && ishex(s[i+1]) && ishex(s[i+2]) {
			t = append(t, (unhex(s[i+1])<<4 | unhex(s[i+2])))
			i += 2
		} else {
			t = append(t, s[i])
		}
	}
	return string(t)
}

Version data entries

16 entries across 16 versions & 1 rubygems

Version Path
ruby_snowflake_client-1.3.7 ext/vendor/github.com/mtibben/percent/percent.go
ruby_snowflake_client-1.3.6 ext/vendor/github.com/mtibben/percent/percent.go
ruby_snowflake_client-1.3.5 ext/vendor/github.com/mtibben/percent/percent.go
ruby_snowflake_client-1.3.4 ext/vendor/github.com/mtibben/percent/percent.go
ruby_snowflake_client-1.3.4.pre.debug ext/vendor/github.com/mtibben/percent/percent.go
ruby_snowflake_client-1.3.3.pre.debug ext/vendor/github.com/mtibben/percent/percent.go
ruby_snowflake_client-1.3.2 ext/vendor/github.com/mtibben/percent/percent.go
ruby_snowflake_client-1.3.1 ext/vendor/github.com/mtibben/percent/percent.go
ruby_snowflake_client-1.3.0 ext/vendor/github.com/mtibben/percent/percent.go
ruby_snowflake_client-1.2.1 ext/vendor/github.com/mtibben/percent/percent.go
ruby_snowflake_client-1.2.0 ext/vendor/github.com/mtibben/percent/percent.go
ruby_snowflake_client-1.1.1 ext/vendor/github.com/mtibben/percent/percent.go
ruby_snowflake_client-1.1.0 ext/vendor/github.com/mtibben/percent/percent.go
ruby_snowflake_client-1.0.2 ext/vendor/github.com/mtibben/percent/percent.go
ruby_snowflake_client-1.0.1 ext/vendor/github.com/mtibben/percent/percent.go
ruby_snowflake_client-1.0.0 ext/vendor/github.com/mtibben/percent/percent.go