added comparision to the Character class
This commit is contained in:
		| @ -51,6 +51,55 @@ class(#limited) Character(Magnitude) | ||||
| 	## } | ||||
|  | ||||
| 	method(#primitive) asInteger. | ||||
|  | ||||
| 	method = aCharacter | ||||
| 	{ | ||||
| 		<primitive: #Character_eq> | ||||
| 		self primitiveFailed. | ||||
| 	} | ||||
|  | ||||
| 	method ~= char | ||||
| 	{ | ||||
| 		<primitive: #Character_ne> | ||||
| 		self primitiveFailed. | ||||
| 	} | ||||
|  | ||||
| 	method < char | ||||
| 	{ | ||||
| 		<primitive: #Character_lt> | ||||
| 		self primitiveFailed. | ||||
| 	} | ||||
|  | ||||
| 	method > char | ||||
| 	{ | ||||
| 		<primitive: #Character_gt> | ||||
| 		self primitiveFailed. | ||||
| 	} | ||||
|  | ||||
| 	method <= char | ||||
| 	{ | ||||
| 		<primitive: #Character_le> | ||||
| 		self primitiveFailed. | ||||
| 	} | ||||
|  | ||||
| 	method >= char | ||||
| 	{ | ||||
| 		<primitive: #Character_ge> | ||||
| 		self primitiveFailed. | ||||
| 	} | ||||
| 	 | ||||
| 	method - char | ||||
| 	{ | ||||
| 		<primitive: #Character_sub> | ||||
| 		^(self asInteger - char asInteger) asCharacter | ||||
| 	} | ||||
| 	 | ||||
| 	method + char | ||||
| 	{ | ||||
| 		<primitive: #Character_add> | ||||
| 		^(self asInteger + char asInteger) asCharacter | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| class(#limited) Number(Magnitude) | ||||
|  | ||||
| @ -1,5 +1,117 @@ | ||||
| #include 'Moo.moo'. | ||||
|  | ||||
| ##interface IPAddressInterface | ||||
| ##{ | ||||
| ##} | ||||
| ## class XXX(Object,IPAddressInterface) {} | ||||
|  | ||||
| class(#byte) IPAddress(Object) | ||||
| { | ||||
| } | ||||
|  | ||||
| ###class(#byte(4)) IP4Address(IPAddress) -> new basicNew always create 4 bytes. size to new: or basicNew: is ignored. | ||||
| ###class(#byte(16)) IP6Address(IPAddress) | ||||
|  | ||||
| class(#byte) IP4Address(IPAddress) | ||||
| { | ||||
| 	method(#class) new | ||||
| 	{ | ||||
| 		^self basicNew: 4. | ||||
| 	} | ||||
| 	 | ||||
| 	method(#class) fromString: str | ||||
| 	{ | ||||
| 		^self new fromString: str. | ||||
| 	} | ||||
| 	 | ||||
| 	method fromString: str | ||||
| 	{ | ||||
| 		| dots digits pos size c acc | | ||||
|  | ||||
| 		pos := 0. | ||||
| 		size := str size. | ||||
| 		 | ||||
| 		acc := 0. | ||||
| 		digits := 0. | ||||
| 		dots := 0. | ||||
|  | ||||
| 		do | ||||
| 		{ | ||||
| 			if (pos >= size) | ||||
| 			{ | ||||
| 				if (dots < 3 or: [digits == 0])  | ||||
| 				{ | ||||
| 					Exception signal: ('invalid IPv4 address A ' & str). | ||||
| 				}. | ||||
| 				self basicAt: dots put: acc. | ||||
| 				break. | ||||
| 			}. | ||||
| 			 | ||||
| 			c := str at: pos. | ||||
| 			pos := pos + 1. | ||||
|  | ||||
| 			if (c >= $0 and: [c <= $9]) | ||||
| 			{ | ||||
| 				acc := acc * 10 + (c - $0) asInteger. | ||||
| 				if (acc > 255) { Exception signal: ('invalid IPv4 address B ' & str). }. | ||||
| 				digits := digits + 1. | ||||
| 			} | ||||
| 			elsif (c == $.) | ||||
| 			{ | ||||
| 				if (dots >= 3 or: [digits == 0]) { Exception signal: ('invalid IPv4 address C ' & str). }. | ||||
| 				self basicAt: dots put: acc. | ||||
| 				dots := dots + 1. | ||||
| 				acc := 0. | ||||
| 				digits := 0. | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				Exception signal: ('invalid IPv4 address ' & str). | ||||
| 			}. | ||||
| 			 | ||||
| 			 | ||||
| 		} | ||||
| 		while (true). | ||||
| 	} | ||||
| } | ||||
|  | ||||
| class(#byte) IP6Address(IPAddress) | ||||
| { | ||||
| 	method(#class) new | ||||
| 	{ | ||||
| 		^self basicNew: 16. | ||||
| 	} | ||||
| 	 | ||||
| 	method(#class) fromString: str | ||||
| 	{ | ||||
| 	 | ||||
| 	} | ||||
| } | ||||
|  | ||||
| class(#byte) IP4SocketAddress(IP4Address) | ||||
| { | ||||
| 	method(#class) new | ||||
| 	{ | ||||
| 		^self basicNew: 6. | ||||
| 	} | ||||
| } | ||||
|  | ||||
| class SocketAddress(Object) from 'sck.addr' | ||||
| { | ||||
| 	##method(#primitive) family. | ||||
| 	method(#primitive) fromString: str. | ||||
| 	 | ||||
| 	method(#class) fromString: str | ||||
| 	{ | ||||
| 		^self new fromString: str | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| ##class InetSocketAddress(SocketAddress) | ||||
| ##{ | ||||
| ##} | ||||
|  | ||||
| class Socket(Object) from 'sck' | ||||
| { | ||||
| 	var handle := -1. | ||||
| @ -96,6 +208,8 @@ extend Socket | ||||
| 		] | ||||
| 	} | ||||
|  | ||||
| ## TODO: how to specify a timeout for an action? using another semaphore?? | ||||
|  | ||||
| 	method watchInput | ||||
| 	{ | ||||
| 		if (self.insem isNil) | ||||
| @ -106,10 +220,6 @@ extend Socket | ||||
| 		}. | ||||
|  | ||||
| 		System signal: self.insem onInput: self.handle. | ||||
|  | ||||
| 		###s2 := Semaphore new. | ||||
| 		###s2 signalAction: [:sem | inputActionBlock value: self value: false]. | ||||
| 		###System signal: s2 afterSecs: 10. | ||||
| 	} | ||||
|  | ||||
| 	method unwatchInput | ||||
| @ -142,27 +252,46 @@ class MyObject(Object) | ||||
| 	{ | ||||
| 		| s conact inact outact | | ||||
|  | ||||
|  | ||||
| s := IP4Address fromString: '192.168.1.1'. | ||||
| s dump. | ||||
| s := IP6Address new. | ||||
| s dump. | ||||
| s := IP4SocketAddress new. | ||||
| s dump. | ||||
| thisProcess terminate. | ||||
| 		inact := [:sck :state | | ||||
| 			| data n | | ||||
| (* | ||||
| end of data -> 0. | ||||
| no data -> -1. | ||||
| has data -> 1 or moreailure indicated by primitive function 0x55a6210 - _integer_add | ||||
|  | ||||
| error -> exception | ||||
| *) | ||||
|  | ||||
| 			data := ByteArray new: 100. | ||||
| 			n := sck readBytes: data. | ||||
| 			if (n == 0) | ||||
| 			do | ||||
| 			{ | ||||
| 				sck close. | ||||
| 				n := sck readBytes: data. | ||||
| 				if (n <= 0) | ||||
| 				{ | ||||
| 					if (n == 0) { sck close }. | ||||
| 					break. | ||||
| 				} | ||||
| 				elsif (n > 0) | ||||
| 				{ | ||||
| 					(n asString & ' bytes read') dump. | ||||
| 					data dump. | ||||
| 				}. | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				(n asString & ' bytes read') dump. | ||||
| 				data dump. | ||||
| 			}. | ||||
| 			while (true). | ||||
| 		]. | ||||
|  | ||||
| 		outact := [:sck :state | | ||||
| 			if (state) | ||||
| 			{ | ||||
| 				sck writeBytes: #[ $h, $e, $l, $l, $o, C'\n' ]. | ||||
| 				 | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
|  | ||||
		Reference in New Issue
	
	Block a user