gitee.com/curryzheng/dm@v0.0.1/util/zzu.go (about)

     1  /*
     2   * Copyright (c) 2000-2018, 达梦数据库有限公司.
     3   * All rights reserved.
     4   */
     5  
     6  package util
     7  
     8  import (
     9  	"bytes"
    10  	"runtime"
    11  	"strings"
    12  	"time"
    13  	"unicode"
    14  )
    15  
    16  type stringutil struct{}
    17  
    18  var StringUtil = &stringutil{}
    19  
    20  /*----------------------------------------------------*/
    21  func (StringUtil *stringutil) LineSeparator() string {
    22  	var lineSeparator string
    23  	if strings.Contains(runtime.GOOS, "windos") {
    24  		lineSeparator = "\r\n"
    25  	} else if strings.Contains(runtime.GOOS, "mac") {
    26  		lineSeparator = "\r"
    27  	} else {
    28  		lineSeparator = "\n"
    29  	}
    30  
    31  	return lineSeparator
    32  }
    33  
    34  func (StringUtil *stringutil) Equals(str1 string, str2 string) bool {
    35  	return str1 == str2
    36  }
    37  
    38  func (StringUtil *stringutil) EqualsIgnoreCase(str1 string, str2 string) bool {
    39  	return strings.ToUpper(str1) == strings.ToUpper(str2)
    40  }
    41  
    42  func (StringUtil *stringutil) StartsWith(s string, subStr string) bool {
    43  	return strings.Index(s, subStr) == 0
    44  }
    45  
    46  func (StringUtil *stringutil) StartWithIgnoreCase(s string, subStr string) bool {
    47  	return strings.HasPrefix(strings.ToLower(s), strings.ToLower(subStr))
    48  }
    49  
    50  func (StringUtil *stringutil) EndsWith(s string, subStr string) bool {
    51  	return strings.LastIndex(s, subStr) == len(s)-1
    52  }
    53  
    54  func (StringUtil *stringutil) IsDigit(str string) bool {
    55  	if str == "" {
    56  		return false
    57  	}
    58  	sz := len(str)
    59  	for i := 0; i < sz; i++ {
    60  		if unicode.IsDigit(rune(str[i])) {
    61  			continue
    62  		} else {
    63  			return false
    64  		}
    65  	}
    66  	return true
    67  }
    68  
    69  func (StringUtil *stringutil) FormatDir(dir string) string {
    70  	dir = strings.TrimSpace(dir)
    71  	if dir != "" {
    72  		if !StringUtil.EndsWith(dir, PathSeparator) {
    73  			dir += PathSeparator
    74  		}
    75  	}
    76  	return dir
    77  }
    78  
    79  func (StringUtil *stringutil) HexStringToBytes(s string) []byte {
    80  	str := s
    81  
    82  	bs := make([]byte, 0)
    83  	flag := false
    84  
    85  	str = strings.TrimSpace(str)
    86  	if strings.Index(str, "0x") == 0 || strings.Index(str, "0X") == 0 {
    87  		str = str[2:]
    88  	}
    89  
    90  	if len(str) == 0 {
    91  		return bs
    92  	}
    93  
    94  	var bsChr []byte
    95  	l := len(str)
    96  
    97  	if l%2 == 0 {
    98  		bsChr = []byte(str)
    99  	} else {
   100  		l += 1
   101  		bsChr = make([]byte, l)
   102  		bsChr[0] = '0'
   103  		for i := 0; i < l-1; i++ {
   104  			bsChr[i+1] = str[i]
   105  		}
   106  	}
   107  
   108  	bs = make([]byte, l/2)
   109  
   110  	pos := 0
   111  	for i := 0; i < len(bsChr); i += 2 {
   112  		bt := convertHex(bsChr[i])
   113  		bt2 := convertHex(bsChr[i+1])
   114  		if int(bt) == 0xff || int(bt2) == 0xff {
   115  			flag = true
   116  			break
   117  		}
   118  
   119  		bs[pos] = byte(bt*16 + bt2)
   120  		pos++
   121  	}
   122  
   123  	if flag {
   124  		bs = ([]byte)(str)
   125  	}
   126  
   127  	return bs
   128  }
   129  
   130  func convertHex(chr byte) byte {
   131  	if chr >= '0' && chr <= '9' {
   132  		return chr - '0'
   133  	} else if chr >= 'a' && chr <= 'f' {
   134  		return chr - 'a' + 10
   135  	} else if chr >= 'A' && chr <= 'F' {
   136  		return chr - 'A' + 10
   137  	} else {
   138  		return 0xff
   139  	}
   140  }
   141  
   142  func (StringUtil *stringutil) BytesToHexString(bs []byte, pre bool) string {
   143  	if bs == nil {
   144  		return ""
   145  	}
   146  	if len(bs) == 0 {
   147  		return ""
   148  	}
   149  
   150  	hexDigits := "0123456789ABCDEF"
   151  	ret := new(strings.Builder)
   152  	for _, b := range bs {
   153  		ret.WriteByte(hexDigits[0x0F&(b>>4)])
   154  		ret.WriteByte(hexDigits[0x0F&b])
   155  	}
   156  	if pre {
   157  		return "0x" + ret.String()
   158  	}
   159  	return ret.String()
   160  }
   161  
   162  func (StringUtil *stringutil) ProcessSingleQuoteOfName(name string) string {
   163  	return StringUtil.processQuoteOfName(name, "'")
   164  }
   165  
   166  func (StringUtil *stringutil) ProcessDoubleQuoteOfName(name string) string {
   167  	return StringUtil.processQuoteOfName(name, "\"")
   168  }
   169  
   170  func (StringUtil *stringutil) processQuoteOfName(name string, quote string) string {
   171  	if quote == "" || name == "" {
   172  		return name
   173  	}
   174  
   175  	temp := name
   176  	result := bytes.NewBufferString("")
   177  	index := -1
   178  	quetoLength := len(quote)
   179  	index = strings.Index(temp, quote)
   180  	for index != -1 {
   181  		result.WriteString(temp[:index+quetoLength])
   182  		result.WriteString(quote)
   183  		temp = temp[index+quetoLength:]
   184  		index = strings.Index(temp, quote)
   185  	}
   186  	result.WriteString(temp)
   187  	return result.String()
   188  }
   189  
   190  func (StringUtil *stringutil) FormatTime() string {
   191  	return time.Now().Format("2006-01-02 15:04:05")
   192  }
   193  
   194  func (StringUtil *stringutil) SubstringBetween(str string, open string, close string) string {
   195  	if str == "" {
   196  		return ""
   197  	}
   198  
   199  	iopen := -1
   200  	if open != "" {
   201  		iopen = strings.Index(str, open)
   202  	}
   203  
   204  	iclose := -1
   205  	if close != "" {
   206  		iclose = strings.LastIndex(str, close)
   207  	}
   208  
   209  	if iopen == -1 && iclose == -1 {
   210  		return ""
   211  	} else if iopen == -1 {
   212  		return str[0:iclose]
   213  	} else if iclose == -1 {
   214  		return str[iopen:]
   215  	} else {
   216  		return str[iopen:iclose]
   217  	}
   218  }