changeset 3:94c885692eb5

Partial set of fixes and enhancements from Linux box
author Mike Pavone <pavone@retrodev.com>
date Wed, 29 Apr 2009 03:21:23 -0400
parents 73e978d590c7
children f67d9be38ddf
files dict.c file.c number.c string.c structs.h window.c
diffstat 6 files changed, 246 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/dict.c	Wed Apr 29 02:58:03 2009 -0400
+++ b/dict.c	Wed Apr 29 03:21:23 2009 -0400
@@ -342,6 +342,7 @@
 	ternary_node * decision = NULL;
 	int decision_key_size;
 	BOOL next_flag = FALSE;
+	BOOL this_flag = FALSE;
 	nodes = current;
 	
 	if(dict->num_nodes <= 0)
@@ -359,12 +360,12 @@
 			if(old_key[i] == current->letter)
 				if(i == (old_key_len))
 				{
-					if(current->left >= 0)
+					/*if(current->left >= 0)
 					{
 						current = nodes + current->left;
 						break;
 					}
-					else if(current->next >= 0)
+					else */if(current->next >= 0)
 					{
 						APPEND_KEY_STORE(key, key_store, key_size, current->letter);
 						current = nodes + current->next;
@@ -386,6 +387,19 @@
 								APPEND_KEY_STORE(key, key_store, key_size, current->letter);
 								current = nodes + current->next;
 							}
+							else if(this_flag)
+							{
+								APPEND_KEY_STORE(key, key_store, key_size, current->letter);
+								APPEND_KEY_STORE(key, key_store, key_size, '\0');
+								release_ref(inputlist[0]);
+								release_ref(inputlist[1]);
+								inputlist[1] = NULL;
+								inputlist[0] = new_datum(BUILTIN_TYPE_STRING, 2, 0, worker_entry->instance->def->program);
+								inputlist[0]->union_type = 1;
+								inputlist[0]->c.generic.data = key;
+								inputlist[0]->c.generic.len = key_size;
+								return 0;
+							}
 							break;
 						}
 						else
@@ -405,6 +419,7 @@
 						decision = nodes + current->right;
 						decision_key_size = key_size;
 						next_flag = FALSE;
+						this_flag = FALSE;
 					}
 					APPEND_KEY_STORE(key, key_store, key_size, current->letter);
 					++i;
@@ -414,18 +429,27 @@
 				current = nodes + current->right;
 			else
 			{
-				if(current->next >= 0)
+				//Hmm, what do I do here if there's a payload at this location?
+				if(current->next >= 0 || current->payload)
 				{
 					//APPEND_KEY_STORE(key, key_store, key_size, current->letter);
 					decision = current;//nodes + current->next;
 					decision_key_size = key_size;
-					next_flag = TRUE;
+					if(current->payload)
+					{
+						next_flag = FALSE;
+						this_flag = TRUE;
+					} else {
+						next_flag = TRUE;
+						this_flag = FALSE;
+					}
 				}
 				else if(current->right >= 0)
 				{
 					decision = nodes + current->right;
 					decision_key_size = key_size;
 					next_flag = FALSE;
+					this_flag = FALSE;
 				}
 				current = nodes + current->left;
 			}
--- a/file.c	Wed Apr 29 02:58:03 2009 -0400
+++ b/file.c	Wed Apr 29 03:21:23 2009 -0400
@@ -541,3 +541,25 @@
 	inputlist[0]->c.integers.num_a = size;
 	return 0;
 }
+
+int vis_file_truncate(datum ** inputlist, queue_entry * worker_entry)
+{
+	file_data * file;
+	inputlist[0] = copy_datum(inputlist[0], 0);
+	file = inputlist[0]->c.generic.data;
+	VIS_EnterCriticalSection(file->shared->lock);
+		switch(file->shared->status)
+		{
+			case FILE_READ:
+			case FILE_WRITE:
+				fclose(file->shared->file);
+			default:
+				break;
+		}
+		file->shared->file = fopen(file->shared->name,"wb");
+		file->shared->size = 0;
+		file->shared->status = FILE_WRITE;
+	VIS_LeaveCriticalSection(file->shared->lock);
+	file->offset = 0;
+	return 0;
+}
--- a/number.c	Wed Apr 29 02:58:03 2009 -0400
+++ b/number.c	Wed Apr 29 03:21:23 2009 -0400
@@ -1,3 +1,4 @@
+#include <math.h>
 #include <stdlib.h>
 #include "datum.h"
 #include "structs.h"
@@ -259,12 +260,15 @@
 	if(string[i] != '\0')
 	{
 		++i;
-		while(string[i] != '\0' && string[i] >= 0 && string[i] <= 9)
+		while(string[i] != '\0' && string[i] >= '0' && string[i] <= '9')
 		{
 			value += ((double)(string[i] - '0'))/divisor;
 			divisor *= 10;
+			++i;
 		}
 	}
+	if(neg_flag)
+		value = 0.0-value;
 	return value;
 }
 #endif
@@ -348,3 +352,76 @@
 	return 0;
 }
 
+int vis_real_mult(datum ** inputlist, queue_entry * worker_entry)
+{
+	inputlist[0] = copy_datum(inputlist[0], 0);
+	inputlist[0]->c.real *= inputlist[1]->c.real;
+	release_ref(inputlist[1]);
+	return 0;
+}
+#define PI	3.14159265
+int vis_real_cos(datum ** inputlist, queue_entry * worker_entry)
+{
+	inputlist[0] = copy_datum(inputlist[0], 0);
+	inputlist[0]->c.real = cos(inputlist[0]->c.real * PI/180.0);
+	return 0;
+}
+
+int vis_real_sin(datum ** inputlist, queue_entry * worker_entry)
+{
+	inputlist[0] = copy_datum(inputlist[0], 0);
+	inputlist[0]->c.real = sin(inputlist[0]->c.real * PI/180.0);
+	return 0;
+}
+
+int vis_real_tan(datum ** inputlist, queue_entry * worker_entry)
+{
+	inputlist[0] = copy_datum(inputlist[0], 0);
+	inputlist[0]->c.real = tan(inputlist[0]->c.real * PI/180.0);
+	return 0;
+}
+
+int vis_real_arccos(datum ** inputlist, queue_entry * worker_entry)
+{
+	inputlist[0] = copy_datum(inputlist[0], 0);
+	inputlist[0]->c.real = acos(inputlist[0]->c.real)*180.0/PI;
+	return 0;
+}
+
+int vis_real_arcsin(datum ** inputlist, queue_entry * worker_entry)
+{
+	inputlist[0] = copy_datum(inputlist[0], 0);
+	inputlist[0]->c.real = asin(inputlist[0]->c.real)*180.0/PI;
+	return 0;
+}
+
+int vis_real_arctan(datum ** inputlist, queue_entry * worker_entry)
+{
+	inputlist[0] = copy_datum(inputlist[0], 0);
+	inputlist[0]->c.real = atan(inputlist[0]->c.real)*180.0/PI;
+	return 0;
+}
+
+int vis_real_exp(datum ** inputlist, queue_entry * worker_entry)
+{
+	inputlist[0] = copy_datum(inputlist[0], 0);
+	inputlist[0]->c.real = pow(inputlist[0]->c.real, inputlist[1]->c.real);
+	release_ref(inputlist[1]);
+	return 0;
+}
+
+int vis_real_sqrt(datum ** inputlist, queue_entry * worker_entry)
+{
+	inputlist[0] = copy_datum(inputlist[0], 0);
+	inputlist[0]->c.real = sqrt(inputlist[0]->c.real);
+	return 0;
+}
+
+int vis_whole_fromreal(datum ** inputlist, queue_entry * worker_entry)
+{
+	datum * output = new_datum(BUILTIN_TYPE_WHOLE, 2, 0, worker_entry->instance->def->program);
+	output->c.integers.num_a = inputlist[0]->c.real;
+	release_ref(inputlist[0]);
+	inputlist[0] = output;
+	return 0;
+}
\ No newline at end of file
--- a/string.c	Wed Apr 29 02:58:03 2009 -0400
+++ b/string.c	Wed Apr 29 03:21:23 2009 -0400
@@ -141,7 +141,8 @@
 	if(len < 0)
 		len = strlen(string);
 	output = new_datum(BUILTIN_TYPE_STRING, 1, len+1, prog);
-	memcpy(output->c.generic.data, string, len);
+	if(string)
+		memcpy(output->c.generic.data, string, len);
 	((char *)output->c.generic.data)[len] = '\0';
 	return output;
 }
@@ -313,6 +314,7 @@
 	else
 	{
 		ERRORPUTS("Second argument to Get DString@String must be either a String or a List");
+		print_stack_trace(worker_entry->instance);
 		release_ref(inputlist[0]);
 		release_ref(inputlist[1]);
 		return -1;
@@ -358,3 +360,57 @@
 	}
 	return 0;
 }
+
+int vis_string_lefttrim(datum ** params, queue_entry * entry)
+{
+	BOOL isatrimchar;
+	int i,j;
+	char *string,*trim_chars;
+	string = params[0]->c.generic.data;
+	trim_chars = params[1]->c.generic.data;
+	isatrimchar = TRUE;
+	for(i = 0; i < params[0]->c.generic.len-1; ++i)
+	{
+		isatrimchar = FALSE;
+		for(j = 0; j < params[1]->c.generic.len-1; ++j)
+			if(string[i] == trim_chars[j])
+			{
+				isatrimchar = TRUE;
+				break;
+			}
+		if(!isatrimchar)
+			break;
+	}
+	release_ref(params[1]);
+	params[1] = params[0];
+	params[0] = make_string(string+i, params[1]->c.generic.len-1-i, entry->instance->def->program);
+	release_ref(params[1]);
+	return 0;
+}
+
+int vis_string_righttrim(datum ** params, queue_entry * entry)
+{
+	BOOL isatrimchar;
+	int i,j;
+	char *string,*trim_chars;
+	string = params[0]->c.generic.data;
+	trim_chars = params[1]->c.generic.data;
+	isatrimchar = TRUE;
+	for(i = params[0]->c.generic.len-2; i >= 0 ; --i)
+	{
+		isatrimchar = FALSE;
+		for(j = 0; j < params[1]->c.generic.len-1; ++j)
+			if(string[i] == trim_chars[j])
+			{
+				isatrimchar = TRUE;
+				break;
+			}
+		if(!isatrimchar)
+			break;
+	}
+	release_ref(params[1]);
+	params[1] = params[0];
+	params[0] = make_string(string, i+1, entry->instance->def->program);
+	release_ref(params[1]);
+	return 0;
+}
\ No newline at end of file
--- a/structs.h	Wed Apr 29 02:58:03 2009 -0400
+++ b/structs.h	Wed Apr 29 03:21:23 2009 -0400
@@ -357,6 +357,7 @@
 	datum * widget_xpos;
 	datum * widget_ypos;
 	datum * id_list;
+	datum * menu;
 } vis_window;
 
 typedef struct
@@ -372,6 +373,12 @@
 
 typedef struct
 {
+	datum * label_list;
+	datum * action_list;
+} vis_menu;
+
+typedef struct
+{
 	VIS_CRITICAL_SECTION(lock)
 	datum ** params;
 	BOOL done_flag;
--- a/window.c	Wed Apr 29 02:58:03 2009 -0400
+++ b/window.c	Wed Apr 29 03:21:23 2009 -0400
@@ -10,9 +10,14 @@
 #include "syl_window.h"
 VIS_CRITICAL_SECTION(app_lock);
 #else
-	#ifdef WIN32
+	#ifdef GTK
+#include "gtk_window.h"
+VIS_CRITICAL_SECTION(gtk_init_lock);
+	#else
+		#ifdef WIN32
 #include "ms_window.h"
-VIS_CRITICAL_SECTION(hwnd_lock);
+VIS_CRITICAL_SECTION(hwnd_lock);	
+		#endif
 	#endif
 #endif
 
@@ -41,8 +46,12 @@
 		
 		VIS_InitializeCriticalSection(app_lock);
 	#else
-		#ifdef WIN32
-			VIS_InitializeCriticalSection(hwnd_lock);
+		#ifdef GTK
+			VIS_InitializeCriticalSection(gtk_init_lock);
+		#else
+			#ifdef WIN32
+				VIS_InitializeCriticalSection(hwnd_lock);
+			#endif
 		#endif
 	#endif
 }
@@ -62,6 +71,7 @@
 	window->widget_xpos = create_dict(worker_entry->instance->def->program);
 	window->widget_ypos = create_dict(worker_entry->instance->def->program);
 	window->id_list = create_list(worker_entry->instance->def->program);
+	window->menu = NULL;
 	release_ref(inputlist[1]);
 	release_ref(inputlist[2]);
 	inputlist[0] = window_datum;
@@ -254,6 +264,7 @@
 	return 0;
 }
 
+//Also used for Set Data@Datagrid
 int vis_dropdown_settext(datum ** params, queue_entry * entry)
 {
 	vis_widget * widget;
@@ -277,15 +288,47 @@
 	return 0;
 }
 
+int vis_datagrid_new(datum ** inputlist, queue_entry * worker_entry)
+{
+	widget_new(inputlist, BUILTIN_TYPE_DATAGRID, worker_entry->instance->def->program);
+	return 0;
+}
 
+int vis_menu_new(datum ** inputlist, queue_entry * worker_entry)
+{
+	vis_menu * menu;
+	inputlist[0] = new_datum(BUILTIN_TYPE_MENU, 1, sizeof(vis_menu), worker_entry->instance->def->program);
+	menu = inputlist[0]->c.generic.data;
+	menu->label_list = create_list(worker_entry->instance->def->program);
+	menu->action_list = create_list(worker_entry->instance->def->program);
+	return 0;
+}
 
+int vis_menu_add_item(datum ** inputlist, queue_entry * worker_entry)
+{
+	datum * wparams[2];
+	vis_menu * menu;
+	inputlist[0] = copy_datum(inputlist[0], 0);
+	menu = inputlist[0]->c.generic.data;
+	wparams[0] = menu->label_list;
+	wparams[1] = inputlist[1];
+	vis_list_append(wparams, worker_entry);
+	menu->label_list = wparams[0];
+	wparams[0] = menu->action_list;
+	wparams[1] = inputlist[2];
+	vis_list_append(wparams, worker_entry);
+	menu->action_list = wparams[0];
+	return 0;
+}
 
-
+int vis_window_set_menu(datum ** inputlist, queue_entry * worker_entry)
+{
+	vis_window * window;
+	inputlist[0] = copy_datum(inputlist[0], 0);
+	window = inputlist[0]->c.generic.data;
+	release_ref(window->menu);
+	window->menu = inputlist[1];
+	return 0;
+}
 
 
-
-
-
-
-
-