diff options
Diffstat (limited to 'tnslc/utils')
| -rw-r--r-- | tnslc/utils/algo.tnsl | 10 | ||||
| -rw-r--r-- | tnslc/utils/file.tnsl | 89 | ||||
| -rw-r--r-- | tnslc/utils/utils.tnsl | 6 | ||||
| -rw-r--r-- | tnslc/utils/vector.tnsl | 201 | 
4 files changed, 306 insertions, 0 deletions
| diff --git a/tnslc/utils/algo.tnsl b/tnslc/utils/algo.tnsl new file mode 100644 index 0000000..c501e35 --- /dev/null +++ b/tnslc/utils/algo.tnsl @@ -0,0 +1,10 @@ + +/; strcmp(~uint8 a, b) [bool] +	/; loop (a` == b` && a` !== 0 && b` !== 0) [a++; b++] ;/ + +	/; if (b` == 0 && a` == 0) +		return true +	;/ +	return false +;/ + diff --git a/tnslc/utils/file.tnsl b/tnslc/utils/file.tnsl new file mode 100644 index 0000000..a33e30c --- /dev/null +++ b/tnslc/utils/file.tnsl @@ -0,0 +1,89 @@ +struct File { +	Artifact path, +	~void handle, +	bool at_end +} + +~uint8 PT_HANDLE = "Handle: %p\n\0" +uint INVALID_HANDLE = 0xffffffff +~uint8 PARENT_DIR = ".." +~uint8 CURRENT_DIR = "." + +/; method File +	/; init (~uint8 str) +		self.path.init() +		self.path.split_cstr(str, '/') +		self.handle = NULL +		self.at_end = false +	;/ + +	/; relative (~uint8 path) [File] +		~uint8 current = self.path.to_cstr('/') +		File out +		out.init(current) +		_delete(current) +		out.path.pop() +		 +		Artifact add +		add.init() +		add.split_cstr(path, '/') + +		# Brunt of work here +		/; loop (uint i = 0; i < add.count) [i++] +			~uint8 cur = add.get(i) +			/; if (strcmp(cur, CURRENT_DIR) == false) +				out.path.split_cstr(cur, '/') +			;/ +		;/ + +		add.end() + +		return out +	;/ + +	/; end +		self.path.end() +		/; if (self.handle < INVALID_HANDLE && self.handle != NULL) +			_close_file(self.handle) +			self.handle = NULL +		;/ +	;/ + +	/; open +		~uint8 p = self.path.to_cstr('/') +		self.handle = _open_file(p) +		_delete(p) +	;/ + +	/; create +		~uint8 p = self.path.to_cstr('/') +		self.handle = _create_file(p) +		_delete(p) +	;/ + +	/; close +		/; if (self.handle !== INVALID_HANDLE && self.handle !== NULL) +			_close_file(self.handle) +			self.handle = NULL +			self.at_end = false +		;/ +	;/ + +	/; read [uint8] +		uint8 out +		int bytes = _read_byte(self.handle, ~out) +		/; if (bytes == 0) +			self.at_end = true +			return 0 +		;/ +		return out +	;/ + +	/; write (uint8 byte) +		int written = _write_byte(self.handle, ~byte) +		/; if (written == 0) +			self.at_end = true +		;/ +	;/ + +;/ diff --git a/tnslc/utils/utils.tnsl b/tnslc/utils/utils.tnsl new file mode 100644 index 0000000..aa7968a --- /dev/null +++ b/tnslc/utils/utils.tnsl @@ -0,0 +1,6 @@ +/; module utils + +	:import "vector.tnsl" +	:import "file.tnsl" +	:import "algo.tnsl" +;/ diff --git a/tnslc/utils/vector.tnsl b/tnslc/utils/vector.tnsl new file mode 100644 index 0000000..d00d698 --- /dev/null +++ b/tnslc/utils/vector.tnsl @@ -0,0 +1,201 @@ +struct Vector { +	~void data, +	uint +		count, +		size, +		_elsz +} + +uint VECTOR_MIN_ELEMENTS = 4 +uint VECTOR_MAX_GROW = 256 + +~uint8 NUM_STR = "Num %d\n\0" + +/; method Vector +	 +	/; init (uint elsz) +		self._elsz = elsz +		self.size = VECTOR_MIN_ELEMENTS +		self.count = 0 +		self.data = _alloc(self.size * self._elsz) +	;/ + +	/; from_cstr(~uint8 cstr) +		self.init(1) +		self.push_cstr(cstr) +	;/ + +	/; _grow (uint i) +		self.size = self.size + i +		self.data = _realloc(self.data, self.size * self._elsz) +	;/ + +	/; get (uint index) [~void] +		/; if (index !< self.count) +			return NULL +		;/ + +		return self.data + index * self._elsz +	;/ + +	/; push (~void el) +		/; if (self.size == self.count + 1) +			/; if (self.size < VECTOR_MAX_GROW) +				self._grow(self.size) +			;; else +				self._grow(VECTOR_MAX_GROW) +			;/ +		;/ + +		~void start = self.data + self.count * self._elsz +		/; loop (int i = 0; i < self._elsz) [i++] +			~uint8 to = start + i +			~uint8 from = el + i +			to` = from` +		;/ +		self.count++ +	;/ + +	/; _shrink(uint i) +		/; if (i !< self.size) +			self.size = 1 +		;; else +			self.size = self.size - i +		;/ + +		self.data = _realloc(self.data, self.size * self._elsz) +	;/ + +	/; pop +		self.count-- + +		/; if (self.count < self.size / 2) +			self._shrink(self.size / 3) +		;/ +	;/ + +	/; push_char (uint8 ch) +		self.push(~ch) +	;/ + +	/; push_cstr(~uint8 ch) +		/; loop (ch` !== 0) [ch++] +			self.push(ch) +		;/ +	;/ + +	/; as_cstr [~uint8] +		~uint8 z = self.data + self.count +		z` = 0 +		return self.data +	;/ + +	/; end +		self.count = 0 +		self.size = 0 +		self._elsz = 0 +		_delete(self.data) +	;/ +;/ + + +# Artifacts + +struct Artifact { +	~~uint8 strings, +	uint +		size, +		count +} + +/; method Artifact + +	/; init +		self.size = VECTOR_MIN_ELEMENTS +		self.count = 0 +		self.strings = _alloc(len self.strings * self.size) +	;/ + +	/; split_cstr (~uint8 str, uint8 split) +		Vector track +		track.init(1) + +		/; loop (str` !== 0) [str++] +			/; if (str` == split) +				self.push(track.as_cstr()) +				track.init(1) +			;; else +				track.push(str) +			;/ +		;/ + +		self.push(track.as_cstr()) +	;/ + +	/; _grow (uint i) +		self.size = self.size + i +		self.strings = _realloc(self.strings, self.size * len self.strings) +	;/ + +	/; push (~uint8 str) +		/; if (self.size == self.count + 1) +			/; if (self.size < VECTOR_MAX_GROW) +				self._grow(self.size) +			;; else +				self._grow(VECTOR_MAX_GROW) +			;/ +		;/ + +		self.strings{self.count} = str +		self.count++ +	;/ + +	/; _shrink(uint i) +		/; if (i !< self.size) +			self.size = 1 +		;; else +			self.size = self.size - i +		;/ + +		self.strings = _realloc(self.strings, self.size * len self.strings) +	;/ + +	/; pop +		_delete(self.get(self.count - 1)) +		self.count-- + +		/; if (self.count < self.size / 2) +			self._shrink(self.size / 3) +		;/ +	;/ + +	/; get (uint index) [~uint8] +		/; if (index !< self.count) +			return NULL +		;/ + +		return self.strings{index} +	;/ +	 +	/; to_cstr (uint8 join) [~uint8] +		Vector out +		out.init(1) + +		/; loop (int i = 0; i < self.count) [i++] +			out.push_cstr(self.get(i)) +			/; if (i < self.count - 1) +				out.push(~join) +			;/ +		;/ + +		return out.as_cstr() +	;/ + +	/; end +		/; loop (int i = 0; i < self.count) [i++] +			_delete(self.get(i)) +		;/ +		_delete(self.strings) +	;/ +;/ + |