changeset 162:157cc497a7f1

Add rand srand and time to os module
author Mike Pavone <pavone@retrodev.com>
date Sat, 10 Aug 2013 18:58:40 -0700
parents fc8eecad71e6
children f594e6836c44
files cbackend.js samples/rand.tp
diffstat 2 files changed, 50 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/cbackend.js	Sat Aug 10 18:26:33 2013 -0700
+++ b/cbackend.js	Sat Aug 10 18:58:40 2013 -0700
@@ -773,6 +773,8 @@
 	var os = new cObject('mod_obj_os');
 	os.addInclude('<sys/stat.h>');
 	os.addInclude('<fcntl.h>');
+	os.addInclude('<stdlib.h>');
+	os.addInclude('<time.h>');
 	os.addMessage('write', {
 		vars: {str: 'string *', intret: 'obj_int32 *', filedes: 'obj_int32 *'},
 		lines: [
@@ -790,8 +792,8 @@
 			'size = va_arg(args, obj_int32 *);',
 			'str = (string *)make_object(&string_meta, NULL, 0);',
 			'str->data = GC_MALLOC_ATOMIC(size->num + 1);',
-			'str->length = str->bytes = read(filedes->num, str->data, size->num);',
-			'if (str->bytes < 0) { str->bytes = str->length = 0; }',
+			'str->len = str->bytes = read(filedes->num, str->data, size->num);',
+			'if (str->bytes < 0) { str->bytes = str->len = 0; }',
 			'str->data[str->bytes] = 0;',
 			'return &(str->header);'
 		]
@@ -870,6 +872,39 @@
 			'return &(intret->header);'
 		]
 	});
+	os.addMessage('rand', {
+		vars: {intret: 'obj_int32 *'},
+		lines: [
+			'intret = (obj_int32 *)make_object(&obj_int32_meta, NULL, 0);',
+			'intret->num = rand();',
+			'return &(intret->header);'
+		]
+	});
+	os.addMessage('rand64', {
+		vars: {intret64: 'obj_int64 *'},
+		lines: [
+			'intret64 = (obj_int64 *)make_object(&obj_int64_meta, NULL, 0);',
+			'intret64->num = (((int64_t)rand()) << 32 ) | rand();',
+			'return &(intret64->header);'
+		]
+	});
+	os.addMessage('srand', {
+		vars: {oseed: 'object *', seed: 'obj_int32 *'},
+		lines: [
+			'oseed = va_arg(args, object *);',
+			'seed = mcall(' + getMethodId("int32") + ', 1, oseed);',
+			'srand(seed->num);',
+			'return &(seed->header);'
+		]
+	});
+	os.addMessage('time', {
+		vars: {intret64: 'obj_int64 *'},
+		lines: [
+			'intret64 = (obj_int64 *)make_object(&obj_int64_meta, NULL, 0);',
+			'intret64->num = time(NULL);',
+			'return &(intret64->header);'
+		]
+	});
 	toplevel.names['os'] = os;
 }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/samples/rand.tp	Sat Aug 10 18:58:40 2013 -0700
@@ -0,0 +1,13 @@
+#{
+	main <- :args {
+		os srand: (os time)
+		count <- 1
+		if: (args length) > 1 {
+			count <- int32: (args get: 1)
+		}
+		while: { count > 0 } do: {
+			print: (hex: (os rand64)) . "\n"
+			count <- count - 1
+		}
+	}
+}