| // Copyright 2010 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. |
| |
| package mime |
| |
| // isTSpecial reports whether c is in 'tspecials' as defined by RFC |
| // 1521 and RFC 2045. |
| func isTSpecial(c byte) bool { |
| // tspecials := "(" / ")" / "<" / ">" / "@" / |
| // "," / ";" / ":" / "\" / <"> |
| // "/" / "[" / "]" / "?" / "=" |
| // |
| // mask is a 128-bit bitmap with 1s for allowed bytes, |
| // so that the byte c can be tested with a shift and an and. |
| // If c >= 128, then 1<<c and 1<<(c-64) will both be zero, |
| // and this function will return false. |
| const mask = 0 | |
| 1<<'(' | |
| 1<<')' | |
| 1<<'<' | |
| 1<<'>' | |
| 1<<'@' | |
| 1<<',' | |
| 1<<';' | |
| 1<<':' | |
| 1<<'\\' | |
| 1<<'"' | |
| 1<<'/' | |
| 1<<'[' | |
| 1<<']' | |
| 1<<'?' | |
| 1<<'=' |
| return ((uint64(1)<<c)&(mask&(1<<64-1)) | |
| (uint64(1)<<(c-64))&(mask>>64)) != 0 |
| } |
| |
| // isTokenChar reports whether c is in 'token' as defined by RFC |
| // 1521 and RFC 2045. |
| func isTokenChar(c byte) bool { |
| // token := 1*<any (US-ASCII) CHAR except SPACE, CTLs, |
| // or tspecials> |
| // |
| // mask is a 128-bit bitmap with 1s for allowed bytes, |
| // so that the byte c can be tested with a shift and an and. |
| // If c >= 128, then 1<<c and 1<<(c-64) will both be zero, |
| // and this function will return false. |
| const mask = 0 | |
| (1<<(10)-1)<<'0' | |
| (1<<(26)-1)<<'a' | |
| (1<<(26)-1)<<'A' | |
| 1<<'!' | |
| 1<<'#' | |
| 1<<'$' | |
| 1<<'%' | |
| 1<<'&' | |
| 1<<'\'' | |
| 1<<'*' | |
| 1<<'+' | |
| 1<<'-' | |
| 1<<'.' | |
| 1<<'^' | |
| 1<<'_' | |
| 1<<'`' | |
| 1<<'|' | |
| 1<<'~' |
| return ((uint64(1)<<c)&(mask&(1<<64-1)) | |
| (uint64(1)<<(c-64))&(mask>>64)) != 0 |
| } |
| |
| // isToken reports whether s is a 'token' as defined by RFC 1521 |
| // and RFC 2045. |
| func isToken(s string) bool { |
| if s == "" { |
| return false |
| } |
| for _, c := range []byte(s) { |
| if !isTokenChar(c) { |
| return false |
| } |
| } |
| return true |
| } |