You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

79 lines
1.7 KiB

// Charset implementation using four int64 bitmasks
//
// Each charset mask is 32 bytes, which fits into a 64 byte cache line.
package sip
var tokencMask [4]uint64
var qdtextcMask [4]uint64
func init() {
charsetAddRange(&tokencMask, 'a', 'z')
charsetAddRange(&tokencMask, 'A', 'Z')
charsetAddRange(&tokencMask, '0', '9')
charsetAdd(&tokencMask, '-')
charsetAdd(&tokencMask, '.')
charsetAdd(&tokencMask, '!')
charsetAdd(&tokencMask, '%')
charsetAdd(&tokencMask, '*')
charsetAdd(&tokencMask, '_')
charsetAdd(&tokencMask, '+')
charsetAdd(&tokencMask, '`')
charsetAdd(&tokencMask, '\'')
charsetAdd(&tokencMask, '~')
charsetAdd(&qdtextcMask, '\r')
charsetAdd(&qdtextcMask, '\n')
charsetAdd(&qdtextcMask, '\t')
charsetAdd(&qdtextcMask, ' ')
charsetAdd(&qdtextcMask, '!')
charsetAddRange(&qdtextcMask, 0x23, 0x5B)
charsetAddRange(&qdtextcMask, 0x5D, 0x7E)
}
func tokenc(c byte) bool {
return charsetContains(&tokencMask, c)
}
func qdtextc(c byte) bool {
return charsetContains(&qdtextcMask, c)
}
func qdtextesc(c byte) bool {
return 0x00 <= c && c <= 0x09 ||
0x0B <= c && c <= 0x0C ||
0x0E <= c && c <= 0x7F
}
func whitespacec(c byte) bool {
return c == ' ' || c == '\t' || c == '\r' || c == '\n'
}
func charsetContains(mask *[4]uint64, i byte) bool {
return mask[i/64]&(1<<(i%64)) != 0
}
func charsetAdd(mask *[4]uint64, i byte) {
mask[i/64] |= 1 << (i % 64)
}
func charsetAddRange(mask *[4]uint64, a, b byte) {
for i := a; i <= b; i++ {
charsetAdd(mask, i)
}
// var m uint64
// i := a
// j := i / 64
// for i <= b {
// m &= 1 << (i % 64)
// i++
// if i%64 == 0 {
// mask[j] &= m
// j = i / 64
// m = 0
// }
// }
// if m != 0 {
// mask[j] |= m
// }
}