github.com/DQNEO/babygo@v0.0.3/lib/fmt/fmt.go (about) 1 package fmt 2 3 import ( 4 "github.com/DQNEO/babygo/lib/strconv" 5 "os" 6 "reflect" 7 ) 8 import "syscall" 9 10 func Sprintf(format string, a ...interface{}) string { 11 var r []uint8 12 var inPercent bool 13 var argIndex int 14 15 //syscall.Write(1, []uint8("# @@@ Sprintf start. format=" + format + "\n")) 16 17 for _, c := range []uint8(format) { 18 //syscall.Write(1, []uint8{c}) 19 if inPercent { 20 //syscall.Write(1, []uint8("@inPercent@")) 21 if c == '%' { // "%%" 22 r = append(r, '%') 23 } else { 24 arg := a[argIndex] 25 var sign uint8 = c 26 var str string 27 switch sign { 28 case 's': // %s 29 switch _arg := arg.(type) { 30 case string: // ("%s", "xyz") 31 str = _arg 32 case int: // ("%s", 123) 33 strNumber := strconv.Itoa(_arg) 34 str = "%!s(int=" + strNumber + ")" // %!s(int=123) 35 default: 36 str = "unknown type" 37 } 38 for _, _c := range []uint8(str) { 39 r = append(r, _c) 40 } 41 case 'd': // %d 42 switch _arg := arg.(type) { 43 case string: // ("%d", "xyz") 44 str = "%!d(string=" + _arg + ")" // %!d(string=xyz) 45 case int: // ("%d", 123) 46 str = strconv.Itoa(_arg) 47 default: 48 str = "unknown type" 49 } 50 for _, _c := range []uint8(str) { 51 r = append(r, _c) 52 } 53 case 'T': 54 t := reflect.TypeOf(arg) 55 if t == nil { 56 // ? 57 } else { 58 str = t.String() 59 } 60 for _, _c := range []uint8(str) { 61 r = append(r, _c) 62 } 63 default: 64 panic("Sprintf: Unknown format:" + strconv.Itoa(int(sign))) 65 } 66 argIndex++ 67 } 68 inPercent = false 69 } else { 70 if c == '%' { 71 inPercent = true 72 } else { 73 r = append(r, c) 74 } 75 } 76 } 77 78 return string(r) 79 } 80 81 func Printf(format string, a ...interface{}) { 82 var s = Sprintf(format, a...) 83 syscall.Write(1, []uint8(s)) 84 } 85 86 func Fprintf(w *os.File, format string, a ...interface{}) { 87 var s = Sprintf(format, a...) 88 w.Write([]uint8(s)) 89 }