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  }