# HG changeset patch # User Mike Pavone # Date 1240989683 14400 # Node ID 94c885692eb5a05a5473d88fb5e52c7e4f319fc6 # Parent 73e978d590c7b0b778b758d7ae85c6d49bd57f72 Partial set of fixes and enhancements from Linux box diff -r 73e978d590c7 -r 94c885692eb5 dict.c --- 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; } diff -r 73e978d590c7 -r 94c885692eb5 file.c --- 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; +} diff -r 73e978d590c7 -r 94c885692eb5 number.c --- 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 #include #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 diff -r 73e978d590c7 -r 94c885692eb5 string.c --- 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 diff -r 73e978d590c7 -r 94c885692eb5 structs.h --- 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; diff -r 73e978d590c7 -r 94c885692eb5 window.c --- 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; +} - - - - - -