changeset 26:20d40cb8abf3

Added Get Double@File
author Mike Pavone <pavone@retrodev.com>
date Fri, 26 Jun 2009 17:23:20 -0400
parents 8b2b3f4a2a58
children 0c9272a96b58
files file.c interp.c interp.h
diffstat 3 files changed, 37 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/file.c	Wed Jun 24 23:56:49 2009 -0400
+++ b/file.c	Fri Jun 26 17:23:20 2009 -0400
@@ -471,6 +471,38 @@
 	return 0;
 }
 
+int vis_file_get_double(datum ** inputlist, queue_entry * worker_entry)
+{
+	file_data * file;
+	BOOL eof;
+	double num;
+	
+	inputlist[0] = copy_datum(inputlist[0], 0);
+	file = (file_data *)inputlist[0]->c.generic.data;
+	VIS_EnterCriticalSection(file->shared->lock);
+		if(!(eof = (file->offset >= file->shared->size)))
+		{
+			vis_file_read_open_check(file);
+			fread(&num,sizeof(num),1, file->shared->file);
+		}
+	VIS_LeaveCriticalSection(file->shared->lock);
+	if(eof)
+	{
+		release_ref(inputlist[0]);
+		inputlist[0] = inputlist[1] = NULL;
+		inputlist[2] = new_datum(BUILTIN_TYPE_YESNO, 2, 0, worker_entry->instance->def->program);
+		datum_set_yesno(inputlist[2], 1);
+	}
+	else
+	{
+		inputlist[1] = new_datum(BUILTIN_TYPE_REAL, 3, 0, worker_entry->instance->def->program);
+		inputlist[1]->c.real = num;
+		inputlist[2] = NULL;
+		file->offset += sizeof(num);
+	}
+	return 0;
+}
+
 void vis_file_write_open_check(file_data * file)
 {
 	switch(file->shared->status)
--- a/interp.c	Wed Jun 24 23:56:49 2009 -0400
+++ b/interp.c	Fri Jun 26 17:23:20 2009 -0400
@@ -1687,6 +1687,10 @@
 	aworker->input_types[0] = BUILTIN_TYPE_FILE;
 	//add_method(this_comp, aworker);
 	
+	aworker = create_worker(prog, "Get Double@File", 1, 3, WORKER_TYPE);
+	aworker->implement_func=(custom_worker *)vis_file_get_double;
+	aworker->input_types[0] = BUILTIN_TYPE_FILE;
+	
 	aworker = create_worker(prog, "Put String@File", 2, 1, WORKER_TYPE);
 	aworker->implement_func=(custom_worker *)vis_file_put_string;
 	aworker->input_types[0] = BUILTIN_TYPE_FILE;
--- a/interp.h	Wed Jun 24 23:56:49 2009 -0400
+++ b/interp.h	Fri Jun 26 17:23:20 2009 -0400
@@ -160,6 +160,7 @@
 int vis_file_get_byte(datum ** inputlist, queue_entry * worker_entry);
 int vis_file_get_word(datum ** inputlist, queue_entry * worker_entry);
 int vis_file_get_long(datum ** inputlist, queue_entry * worker_entry);
+int vis_file_get_double(datum ** inputlist, queue_entry * worker_entry);
 int vis_file_put_string(datum ** inputlist, queue_entry * worker_entry);
 int vis_file_length(datum ** inputlist, queue_entry * worker_entry);
 int vis_worker_from_string(datum ** inputlist, queue_entry * worker_entry);