⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 string.zc

📁 实现树形结构
💻 ZC
字号:
//[of]:imports
//[c]
import "base/types"
import "base/memory"
import "base/memory-allocator"
//[cf]
//[c]
//[of]:globals
//[c]
//[c]The global empty string
//[c]
public def empty string := ""
//[cf]
//[of]:instance creation
//[of]:new string (string)
//[c]Constructs a string from a raw buffer
//[c]
public func new string (s: string)

	def len = size (s) + 1
	def buf = allocate memory (len): string
	copy (buf:mem, s:mem, len)
	return buf

end
//[cf]
//[of]:new string (string, size)
//[c]Constructs a string from a raw buffer
//[c]
public func new string (s: string, len: size)

	def buf = allocate memory (len+1): string
	copy (buf:mem, s:mem, len)
	buf[len] = \0
	return buf

end
//[cf]
//[of]:new string (string, limit)
//[c]Constructs a string from a raw buffer
//[c]
public func new string (s: string, limit: string)

	return new string (s, limit - s)

end
//[cf]
//[of]:new string (size)
//[c]Reserves space for a string
//[c]
public func new string (len: size)

	return allocate memory (len+1) : string

end
//[cf]
//[c]
//[of]:delete (s)
//[c]Delete a string
//[c]Delete a null pointer does nothing but is valid
//[c]Delete the GLOBAL empty string has no effect.
//[c]
public func delete (s: string)

	// compare reference, not content
	if s:mem == empty string:mem
		return
	end

	free memory (s)

end
//[cf]
//[cf]
//[c]
//[of]:numerical conversion
//[of]:number to dword (s, [] string)
//[c]Converts a decimal string to an integer
//[c]
public func number to dword (p: string, endptr: [] string)

	def base: int
	def value = 0:dword

	if p[0]==$0 && (p[1]==$x || p[1]==$X)
		p += 2
		base = 16
	else
		base = 10
	end

	repeat
		def c = p++[]
		if c==nul char
			break
		end
		
		if c>=$a
			c -= $a - 10:char
		elsif c>=$A
			c -= $A - 10:char
		elsif c<=$9
			c -= $0
		else
			c = 0xff:char
		end
	
		if c:byte > base:byte
			break
		end
		
		value *= base
		value += c:byte:dword
	end
		
	endptr[] = p-1
	return value

end
//[cf]
//[of]:hexa to dword (s)
//[c]Converts an hexadecimal string to an integer
//[c]
public func hexa to dword (s: string)

	def value = 0:dword
	def q = s
	def c = q++[]
	while not nul (c)
		value <<= 4
		if $0 <= c && c < $9 + 1:char
			value += (c - $0):dword
		elsif $a <= c && c < $f + 1:char
			value += (c - $a + 10:char):dword
		elsif $A <= c && c < $F + 1:char
			value += (c - $A + 10:char):dword
		else
			break
		end
		c = q++[]
	end
	
	return value

end
//[cf]
//[of]:decimal to integer (s)
//[c]Converts the string to an integer
//[c]
public func decimal to integer (s: string)

	def c = s++[]
	def neg = false
	if c == $-
		neg = true
		c = s++[]
	elsif c == $+
		c = s++[]
	end
	
	def value = 0
	repeat
		def digit = (c - $0):byte
		if digit > 10:byte
			break
		end
		
		value = value * 10 + digit:int
		c = s++[]
	end
	
	if neg
		value -!
	end
	
	return value

end
//[cf]
//[cf]
//[of]:case conversion
//[of]:to lower (s)
public func to lower (s: string)

	def p = s
	repeat
		def c = p[]
		if is nul (c)
			break
		elsif is upper (c)
			p [] = c + ($a - $A)
		end
		++p
	end

end
//[cf]
//[of]:to upper (s)
public func to upper (s: string)

	def p = s
	repeat
		def c = p[]
		if is nul (c)
			break
		elsif is lower (c)
			p [] = c + ($A - $a)
		end
		++p
	end

end
//[cf]
//[cf]
//[of]:writing
//[of]:copy (dest string, source string)
//[c]
public func copy (dest: string, source: string)

	def p = source
	def q = dest
	repeat
		def c = p++[]
		q++[] = c
		if c == nul char
			break
		end
	end

	return p
end
//[cf]
//[of]:copy (dest string, source string, size)
//[c]
public func copy (dest: string, source: string, count: size)

	def p = source
	def q = dest
	while count>0
		--count
		def c = p++[]
		q++[] = c
		if c == nul char
			break
		end
	end

	return p
end
//[cf]
//[of]:append (s, char)
//[c]Appends a single char
//[c]
public func append (s: string, c: char)

	s[] = c
	return s+1

end
//[cf]
//[of]:append (s, string)
//[c]Appends a string
//[c]
public func append (s: string, str: string)

	def size = size (str)
	copy (s , str, size)
	return s + size

end
//[cf]
//[of]:append (s, string, size)
//[c]Appends a sub-string
//[c]
public func append (s: string, str: string, size: size)

	copy (s:mem, str:mem, size)
	return s + size

end
//[cf]
//[of]:s << char
//[c]
public equ @shl (s: string, c: char) = append (s, c)
//[cf]
//[of]:s << string
//[c]
public equ @shl (s: string, str: string) = append (s, str)
//[cf]
//[cf]
//[of]:searching
//[of]:first occurrence (s, char)
//[c]Returns the first occurrence of a char, nil if not found
//[c]
public func first occurrence (s: string, c: char)

	def q = s
	def d = q++[]
	while not nul (d)
		if d==c
			return q - 1
		end
		d = q++[]
	end
	
	// not found
	return nil

end
//[cf]
//[of]:last occurrence (s, char)
//[c]Returns the last occurrence of a char, nil if not found
//[c]
public func last occurrence (s: string, c: char)

	def q = s + size(s) - 1
	while q:[]byte >= s:[]byte
		
		if q[] == c
			return q
		end
		q -= 1
		
	end
	
	// not found
	return nil
	
end
//[cf]
//[of]:first occurrence (s, string)
//[c]Returns the first occurrence of a substring, nil if not found
//[c]
public func first occurrence (s: string, t: string)

	def p = s
	def q = t
	def c = p++[]
	def d = q++[]
	def size = size(q)
	while not nul (d)
		if c==d && is equal (p:mem, q:mem, size)
			return p - 1
		end
		c = p++[]
	end
	
	// not found
	return nil
end
//[cf]
//[c]
//[of]:skip blanks (string)
//[c]
public func skip blanks (s: string)
	
	def p = s
	while is blank (p [])
		++ p
	end
	return p

end
//[cf]
//[of]:skip non blanks (string)
//[c]
public func skip non blanks (s: string)

	def p = s
	repeat
		def c = p []
		if is nul (c) || is blank (c)
			break
		end
		++ p
	end
	return p
	
end
//[cf]
//[cf]
//[of]:accessing
//[of]:size (s)
//[c]Returns the length of the string
//[c]
public func size (s: string)

	def p = s
	while not nul (p[])
		++p
	end

	return p - s
	
end
//[cf]
//[of]:compare (s1, s2)
//[c]Compares two strings
//[c]
public func compare (s1: string, s2: string)

	def c: char
	repeat
		c = s1[]
		if c<>s2[]
			break
		end
		if is nul (c)
			break
		end
		++s1
		++s2
	end
	
	return (c - s2[]) : octet : int

end
//[cf]
//[of]:compare no case (s1, s2)
//[c]Compare two strings in case insensitive mode
//[c]
public func compare no case (s1: string, s2: string)

	def c1: char
	def c2: char
	repeat
		c1 = upper (s1++[])
		c2 = upper (s2++[])
		if c1<>c2 || is nul (c1)
			return (c1 - c2) : octet : int
		end
	end
	return 0

end
//[cf]
//[of]:compare no case (s1, s2, size)
//[c]Compare two strings in case insensitive mode
//[c]
public func compare no case (s1: string, s2: string, size: size)

	def limit = (s2 + size) : [] byte // compare pointers, not values
	
	def c1: char
	def c2: char
	while s2 < limit
		c1 = upper (s1++[])
		c2 = upper (s2++[])
		if c1<>c2 || is nul (c1)
			return (c1 - c2):octet:int
		end
	end
	return 0

end
//[cf]
//[of]:hash (s)
//[c]Returns the hash code of the string
//[c]
public func hash (s: string)

	def q = s
	def sum = 0xA5A5A5A5
	while not nul (q[])
		//sum = (sum<<1) ^ q++[]:int
		sum = (sum>>1) + (q++[]:int<<24)
	end
	
	return sum

end
//[cf]
//[cf]
//[of]:testing
//[c]testing
//[c]
//[of]:is equal (s1, s2) 
//[c]Equality test function
//[c]to use when function pointer is required
//[c]
public func is equal (s1: string, s2: string) 

	def c: char
	def d: char
	repeat
		c = s1++[]
		d = s2++[]
		if c<>d
			return false
		end
		if is nul (c)
			break
		end
	end
	
	return true

end
//[cf]
//[c]
//[of]:s1 < s2
//[c]
public equ @less than (s1: string, s2: string) = compare(s1,s2) < 0
//[cf]
//[of]:s1 > s2
//[c]
public equ @greater than (s1: string, s2: string) = compare(s1,s2) > 0
//[cf]
//[of]:s1 <= s2
//[c]
public equ @less or equal (s1: string, s2: string) = compare(s1,s2) <= 0
//[cf]
//[of]:s1 >= s2
//[c]
public equ @greater or equal (s1: string, s2: string) = compare(s1,s2) >= 0
//[cf]
//[of]:s1 == s2
//[c]
public equ @equal (s1: string, s2: string) = compare (s1, s2) == 0
//[cf]
//[of]:s1 <> s2
//[c]
public equ @not equal (s1: string, s2: string) = compare (s1, s2) <> 0
//[cf]
//[c]
//[of]:is empty (s)
//[c]
public equ is empty (s: string) = is nul (s[])
//[cf]
//[of]:not empty (s)
//[c]
public equ not empty (s: string) = not nul (s[])
//[cf]
//[of]:starts with (s, char)
//[c]
public equ starts with (s: string, c: char) = s[0]==c
//[cf]
//[of]:ends with (s, char)
//[c]
public func ends with (s: string, c: char)

	// Test if the last char is the given one
	
	def len = size(s)
	return (len>0) && (s[len-1]==c)
	
end
//[cf]
//[of]:starts with (s, string)
//[c]
public func starts with (s: string, str: string)

	def size = size (str)
	return is equal (s:mem, str:mem, size)

end
//[cf]
//[of]:ends with (s, string)
//[c]
public func ends with (s: string, str: string)

	def size 1 = size (s)
	def size 2 = size (str)
	return is equal ((s + size 1 - size 2):mem, str:mem, size 2)

end
//[cf]
//[of]:contains (s, string)
//[c]
public equ contains (s: string, t: string) = first occurrence (s,t) <> nil
//[cf]
//[cf]

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -