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  }