github.com/DQNEO/babygo@v0.0.3/lib/mylib/mylib.go (about) 1 package mylib 2 3 import "unsafe" 4 import "syscall" 5 import "github.com/DQNEO/babygo/lib/mylib2" 6 7 type Type struct { 8 Field int 9 } 10 11 func (mt *Type) Method() int { 12 return mt.Field 13 } 14 15 func InArray(x string, list []string) bool { 16 for _, v := range list { 17 if v == x { 18 return true 19 } 20 } 21 return false 22 } 23 24 func Sum(a int, b int) int { 25 return a + b 26 } 27 28 func Sum2(a int, b int) int { 29 return mylib2.Sum2(a, b) 30 } 31 32 func Cstring2string(b *byte) string { 33 var bs []byte 34 for { 35 if b == nil || *b == 0 { 36 break 37 } 38 bs = append(bs, *b) 39 p := uintptr(unsafe.Pointer(b)) + 1 40 b = (*byte)(unsafe.Pointer(p)) 41 } 42 return string(bs) 43 } 44 45 var _buf [1024]byte 46 47 // Translation of http://man7.org/linux/man-pages/man2/getdents64.2.html#top_of_page 48 49 //struct linux_dirent64 { 50 // ino64_t d_ino; // 8 bytes: 64-bit inode number 51 // off64_t d_off; // 8 bytes: 64-bit offset to next structure 52 // unsigned short d_reclen; // 2 bytes: Size of this dirent 53 // unsigned char d_type; // 1 byte: File type 54 // char d_name[]; // Filename (null-terminated) 55 //}; 56 57 type linux_dirent struct { 58 d_ino int 59 d_off int 60 d_reclen1 uint16 61 d_type byte 62 d_name byte 63 } 64 65 func print_dirp(dirp *linux_dirent) { 66 //var reclen int = int(dirp.d_reclen1) 67 68 //fmt.Printf("%p ", uintptr(dirp)) 69 //fmt.Printf("%d\t", dirp.d_ino) 70 //fmt.Printf("%d\t", dirp.d_off) 71 //fmt.Printf("%d\t", dirp.d_type) 72 //fmt.Printf("%d\t", reclen) 73 //reclen := int(dirp.d_reclen1) 74 //fmt.Printf("%d ", dirp.d_type) 75 //p := unsafe.Pointer(&dirp.d_name) 76 //var bp *byte = (*byte)(p) 77 //var s string = Cstring2string(bp) 78 //return 79 //fmt.Printf("%s", s) 80 //fmt.Printf("\n") 81 } 82 83 const O_READONLY_ int = 0 84 85 func GetDirents(dir string) []string { 86 var entries []string 87 var fd int 88 fd, _ = syscall.Open(dir, O_READONLY_, 0) 89 if fd < 0 { 90 panic("cannot open " + dir) 91 } 92 var buf []byte = _buf[:] 93 var counter int 94 for { 95 nread, _ := syscall.Getdents(int(fd), buf) 96 if nread == -1 { 97 panic("getdents failed") 98 } 99 if nread == 0 { 100 break 101 } 102 103 //fmt.Printf("--------------- nread=%d ---------------\n", nread) 104 //fmt.Printf("inode d_off d_type d_reclen d_name\n") 105 var bpos int 106 for bpos < nread { 107 var dirp *linux_dirent 108 p := uintptr(unsafe.Pointer(&buf[0])) + uintptr(bpos) 109 dirp = (*linux_dirent)(unsafe.Pointer(p)) 110 //print_dirp(dirp) 111 pp := unsafe.Pointer(&dirp.d_name) 112 var bp *byte = (*byte)(pp) 113 var s string = Cstring2string(bp) 114 entries = append(entries, s) 115 bpos = bpos + int(dirp.d_reclen1) // 24 is wrong 116 counter++ 117 } 118 } 119 syscall.Close(fd) 120 return entries 121 } 122 123 func needSwap(a string, b string) bool { 124 //fmt.Printf("# comparing %s <-> %s\n", a, b) 125 if len(a) == 0 { 126 return false 127 } 128 var i int 129 for i = 0; i < len(a); i++ { 130 if i == len(b) { 131 //fmt.Printf("# loose. right is shorter.\n") 132 return true 133 } 134 var aa int = int(a[i]) 135 var bb int = int(b[i]) 136 //fmt.Printf("# comparing byte at i=%d %s <-> %s\n", i, aa, bb) 137 if aa < bb { 138 return false 139 } else if aa > bb { 140 //fmt.Printf("# loose at i=%d %s > %s\n", i, aa, bb) 141 return true 142 } 143 } 144 return false 145 } 146 147 func SortStrings(ss []string) { 148 var i int 149 var j int 150 for i = 0; i < len(ss); i++ { 151 for j = 0; j < len(ss)-1; j++ { 152 a := ss[j] 153 b := ss[j+1] 154 if needSwap(a, b) { 155 //fmt.Printf("# loose\n") 156 ss[j] = b 157 ss[j+1] = a 158 } else { 159 //fmt.Printf("# won\n") 160 } 161 } 162 } 163 }