github.com/robotn/xgb@v0.0.0-20190912153532-2cb92d044934/xgbgen/misc.go (about) 1 package main 2 3 import ( 4 "regexp" 5 "strings" 6 ) 7 8 // AllCaps is a regex to test if a string identifier is made of 9 // all upper case letters. 10 var allCaps = regexp.MustCompile("^[A-Z0-9]+$") 11 12 // popCount counts number of bits 'set' in mask. 13 func popCount(mask uint) uint { 14 m := uint32(mask) 15 n := uint(0) 16 for i := uint32(0); i < 32; i++ { 17 if m&(1<<i) != 0 { 18 n++ 19 } 20 } 21 return n 22 } 23 24 // pad makes sure 'n' aligns on 4 bytes. 25 func pad(n int) int { 26 return (n + 3) & ^3 27 } 28 29 // splitAndTitle takes a string, splits it by underscores, capitalizes the 30 // first letter of each chunk, and smushes'em back together. 31 func splitAndTitle(s string) string { 32 // If the string is all caps, lower it and capitalize first letter. 33 if allCaps.MatchString(s) { 34 return strings.Title(strings.ToLower(s)) 35 } 36 37 // If the string has no underscores, capitalize it and leave it be. 38 if i := strings.Index(s, "_"); i == -1 { 39 return strings.Title(s) 40 } 41 42 // Now split the name at underscores, capitalize the first 43 // letter of each chunk, and smush'em back together. 44 chunks := strings.Split(s, "_") 45 for i, chunk := range chunks { 46 chunks[i] = strings.Title(strings.ToLower(chunk)) 47 } 48 return strings.Join(chunks, "") 49 }