build: separate compiler and libs
This commit is contained in:
277
compiler/cl/_testdata/print/in.go
Normal file
277
compiler/cl/_testdata/print/in.go
Normal file
@@ -0,0 +1,277 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"unsafe"
|
||||
|
||||
"github.com/goplus/llgo/c"
|
||||
)
|
||||
|
||||
func gwrite(b []byte) {
|
||||
if len(b) == 0 {
|
||||
return
|
||||
}
|
||||
for _, v := range b {
|
||||
c.Printf(c.Str("%c"), v)
|
||||
}
|
||||
}
|
||||
|
||||
func printbool(v bool) {
|
||||
if v {
|
||||
printstring("true")
|
||||
} else {
|
||||
printstring("false")
|
||||
}
|
||||
}
|
||||
|
||||
func printfloat(v float64) {
|
||||
switch {
|
||||
case v != v:
|
||||
printstring("NaN")
|
||||
return
|
||||
case v+v == v && v > 0:
|
||||
printstring("+Inf")
|
||||
return
|
||||
case v+v == v && v < 0:
|
||||
printstring("-Inf")
|
||||
return
|
||||
}
|
||||
|
||||
const n = 7 // digits printed
|
||||
var buf [n + 7]byte
|
||||
buf[0] = '+'
|
||||
e := 0 // exp
|
||||
if v == 0 {
|
||||
if 1/v < 0 {
|
||||
buf[0] = '-'
|
||||
}
|
||||
} else {
|
||||
if v < 0 {
|
||||
v = -v
|
||||
buf[0] = '-'
|
||||
}
|
||||
|
||||
// normalize
|
||||
for v >= 10 {
|
||||
e++
|
||||
v /= 10
|
||||
}
|
||||
for v < 1 {
|
||||
e--
|
||||
v *= 10
|
||||
}
|
||||
|
||||
// round
|
||||
h := 5.0
|
||||
for i := 0; i < n; i++ {
|
||||
h /= 10
|
||||
}
|
||||
v += h
|
||||
if v >= 10 {
|
||||
e++
|
||||
v /= 10
|
||||
}
|
||||
}
|
||||
|
||||
// format +d.dddd+edd
|
||||
for i := 0; i < n; i++ {
|
||||
s := int(v)
|
||||
buf[i+2] = byte(s + '0')
|
||||
v -= float64(s)
|
||||
v *= 10
|
||||
}
|
||||
buf[1] = buf[2]
|
||||
buf[2] = '.'
|
||||
|
||||
buf[n+2] = 'e'
|
||||
buf[n+3] = '+'
|
||||
if e < 0 {
|
||||
e = -e
|
||||
buf[n+3] = '-'
|
||||
}
|
||||
|
||||
buf[n+4] = byte(e/100) + '0'
|
||||
buf[n+5] = byte(e/10)%10 + '0'
|
||||
buf[n+6] = byte(e%10) + '0'
|
||||
gwrite(buf[:])
|
||||
}
|
||||
|
||||
func printuint(v uint64) {
|
||||
var buf [100]byte
|
||||
i := len(buf)
|
||||
for i--; i > 0; i-- {
|
||||
buf[i] = byte(v%10 + '0')
|
||||
if v < 10 {
|
||||
break
|
||||
}
|
||||
v /= 10
|
||||
}
|
||||
gwrite(buf[i:])
|
||||
}
|
||||
|
||||
func printint(v int64) {
|
||||
if v < 0 {
|
||||
printstring("-")
|
||||
v = -v
|
||||
}
|
||||
printuint(uint64(v))
|
||||
}
|
||||
|
||||
var minhexdigits = 0
|
||||
|
||||
func printhex(v uint64) {
|
||||
const dig = "0123456789abcdef"
|
||||
var buf [100]byte
|
||||
i := len(buf)
|
||||
for i--; i > 0; i-- {
|
||||
buf[i] = dig[v%16]
|
||||
if v < 16 && len(buf)-i >= minhexdigits {
|
||||
break
|
||||
}
|
||||
v /= 16
|
||||
}
|
||||
i--
|
||||
buf[i] = 'x'
|
||||
i--
|
||||
buf[i] = '0'
|
||||
gwrite(buf[i:])
|
||||
}
|
||||
|
||||
func printsp() {
|
||||
printstring(" ")
|
||||
}
|
||||
|
||||
func printnl() {
|
||||
printstring("\n")
|
||||
}
|
||||
|
||||
func printstring(s string) {
|
||||
gwrite(bytes(s))
|
||||
}
|
||||
|
||||
type slice struct {
|
||||
array unsafe.Pointer
|
||||
len int
|
||||
cap int
|
||||
}
|
||||
|
||||
type stringStruct struct {
|
||||
str unsafe.Pointer
|
||||
len int
|
||||
}
|
||||
|
||||
func stringStructOf(sp *string) *stringStruct {
|
||||
return (*stringStruct)(unsafe.Pointer(sp))
|
||||
}
|
||||
|
||||
func bytes(s string) (ret []byte) {
|
||||
rp := (*slice)(unsafe.Pointer(&ret))
|
||||
sp := stringStructOf(&s)
|
||||
rp.array = sp.str
|
||||
rp.len = sp.len
|
||||
rp.cap = sp.len
|
||||
return
|
||||
}
|
||||
|
||||
func main() {
|
||||
printstring("llgo")
|
||||
printnl()
|
||||
printuint(1024)
|
||||
printnl()
|
||||
printhex(0x1234abcf)
|
||||
printnl()
|
||||
prinxor(1)
|
||||
printnl()
|
||||
prinsub(100)
|
||||
printnl()
|
||||
prinusub(1<<64 - 1)
|
||||
printnl()
|
||||
prinfsub(100.1)
|
||||
printnl()
|
||||
printany(float32(1e9))
|
||||
printnl()
|
||||
printany(float64(2e9))
|
||||
printnl()
|
||||
var b bool = true
|
||||
if b == true && b != false {
|
||||
println("check bool", b)
|
||||
}
|
||||
n1 := 0b1001
|
||||
n2 := 0b0011
|
||||
println("check &^", n1&^n2 == 0b1000, n2&^n1 == 0b0010)
|
||||
println(true, false, 'a', 'A', rune('中'),
|
||||
int8(1), int16(2), int32(3), int64(4), 5,
|
||||
uint8(1), uint16(2), uint32(3), uint64(4), uintptr(5),
|
||||
"llgo")
|
||||
println(1 + 2i)
|
||||
}
|
||||
|
||||
func println(args ...any) {
|
||||
for i, v := range args {
|
||||
if i != 0 {
|
||||
printstring(" ")
|
||||
}
|
||||
printany(v)
|
||||
}
|
||||
printnl()
|
||||
}
|
||||
|
||||
func printany(v any) {
|
||||
switch v := v.(type) {
|
||||
case bool:
|
||||
printbool(v)
|
||||
case int:
|
||||
printint(int64(v))
|
||||
case int8:
|
||||
printint(int64(v))
|
||||
case int16:
|
||||
printint(int64(v))
|
||||
case int32:
|
||||
printint(int64(v))
|
||||
case int64:
|
||||
printint(int64(v))
|
||||
case uint:
|
||||
printuint(uint64(v))
|
||||
case uint8:
|
||||
printuint(uint64(v))
|
||||
case uint16:
|
||||
printuint(uint64(v))
|
||||
case uint32:
|
||||
printuint(uint64(v))
|
||||
case uint64:
|
||||
printuint(uint64(v))
|
||||
case uintptr:
|
||||
printuint(uint64(v))
|
||||
case float32:
|
||||
printfloat(float64(v))
|
||||
case float64:
|
||||
printfloat(float64(v))
|
||||
case complex64:
|
||||
printstring("(")
|
||||
printfloat(float64(real(v)))
|
||||
printfloat(float64(imag(v)))
|
||||
printstring("i)")
|
||||
case complex128:
|
||||
printstring("(")
|
||||
printfloat(real(v))
|
||||
printfloat(imag(v))
|
||||
printstring("i)")
|
||||
case string:
|
||||
printstring(v)
|
||||
}
|
||||
}
|
||||
|
||||
func prinxor(n int64) {
|
||||
printint(^n)
|
||||
}
|
||||
|
||||
func prinsub(n int64) {
|
||||
printint(-n)
|
||||
}
|
||||
|
||||
func prinusub(n uint64) {
|
||||
printuint(-n)
|
||||
}
|
||||
|
||||
func prinfsub(n float64) {
|
||||
printfloat(-n)
|
||||
}
|
||||
Reference in New Issue
Block a user