int array_dump ( array_t *arr ) //works only when myType is int, because of printf { if ( ( arr == NULL )||( (arr -> array) == NULL ) ) { printf ("Array_t object is not created yet.\n"); return -1; } else { if ( ( array_getLength ( arr ) ) == 0xDEADBEAF ) { printf ("Array_t object was destructed.\n"); return 1; } else { printf ( "Number of elements: %d \n", ( array_getLength ( arr ) ) ); int i = 0; for ( i = 0; i < ( array_getLength ( arr ) ); i++ ) { printf( "%d ", ( array_getElement ( arr, i ) ) ); } printf ( "\n" ); return 0; } } }
void array_gnomeSort ( array_t *arr ) { assert ( ( arr != NULL )&&( ( arr -> array ) != NULL ) ); assert ( ( array_getLength ( arr ) ) != 0xDEADBEAF ); int i = 1; myType tmp = 0; while ( i < ( array_getLength ( arr ) ) ) { if ( i==0 ) { i = 1; } if ( ( array_getElement ( arr, ( i-1 ) ) ) <= ( array_getElement ( arr, i ) ) ) { i++; } else { tmp = array_getElement ( arr, i ) ; array_setElement ( arr, i, array_getElement ( arr, ( i-1 ) ) ); array_setElement ( arr, ( i-1 ), tmp ); i--; } } }
void array_randomValues ( array_t *arr ) //fills the array with random values from -100 to 100, works only when myType is int { assert ( ( arr != NULL )&&( ( arr -> array ) != NULL ) ); assert ( (array_getLength ( arr ) ) != 0xDEADBEAF ); int i = 0, val = 0; srand ( time ( NULL ) ); for ( i = 0; i < ( array_getLength ( arr ) ); i++ ) { val = rand () % 200 - 100; array_setElement ( arr, i, val ); } }
static void showBacktrace(Link ret){ if (! is_critical(ret)) return; string_t retstring = object_asString(ret); printf("%s\n", retstring->data); free(retstring); Link bt = getAttr(ret, Global->backtrace_key); if ( ! bt ) return; Link * args = array_getArray(bt); size_t argn = array_getLength(bt); Link a; int c; for (c=0; c< argn; c++){ a = args[c]; if (! a ) break; retstring = object_asString(a); printf(" %s\n", retstring->data); free(retstring); } link_free(bt); }
static NATIVECALL(read_stream){ Link * args = array_getArray(Arg); size_t argn = array_getLength(Arg); string_t ret = NULL; size_t amount = 0; Link obj = NULL; switch(argn){ /* no arguments */ case 0: ret = stream_read(This->value.vptr, 4096); break; case 1: obj = args[0]; if (obj->type == Global->number_type){ amount =(size_t) obj->value.number; ret = stream_read(This->value.vptr, amount); }else if ( object_getString( obj ) ){ ret = stream_readbreak(This->value.vptr, object_getString(obj) ); }else{ return exception("InvalidTypeForArgument",NULL,NULL); } break; } if (! ret) return exception("StreamFinished", NULL, NULL); return create_string_str( ret ); }
static Link addChild(Link self,Link value,Link keys){ Link * args = array_getArray(keys); size_t argn = array_getLength(keys); if (argn != 1) return NULL; string_t key = object_getString(args[0]); if ( ! key ) return NULL; Dict dict = self->value.vptr; if ( ! dict){ dict = self->value.vptr = malloc( sizeof( *dict) ); dict->dictionary = dictionary_new(); dict->mutex = mutex_new(); } mutex_lock(dict->mutex); Link old = dictionary_insert(dict->dictionary, key, value ); mutex_unlock(dict->mutex); if (old) link_free(old); return value; // return original not duplicate child }
static NATIVECALL(bwindow_setColor){ BWindow win = This->value.vptr; Link * args = array_getArray(Arg); size_t argn = array_getLength(Arg); size_t count; if (argn > 3) argn=3; for ( count = 0; count < argn; count++){ win->clear_color[count] = object_asNumber(args[count]); } win->clear_color[3] = 1.0; return link_dup(This); }
static Link delChild(Link self,Link keys){ Dict dict = self->value.vptr; if ( ! dict ) return NULL; Link * args = array_getArray(keys); size_t argn = array_getLength(keys); if (argn != 1) return NULL; mutex_lock(dict->mutex); Link ret = dictionary_delete(dict->dictionary, object_getString(args[0])); mutex_unlock(dict->mutex); if ( ! ret) return NULL; return ret; }
static NATIVECALL(file_stream){ Link * args = array_getArray(Arg); size_t argn = array_getLength(Arg); string_t type = file_stream_def_type; string_t name = NULL; mode_t mode = 0666; switch (argn){ case 3: mode = object_asNumber( args[2] ); case 2: type = object_getString( args[1] ); case 1: name = object_getString( args[0] ); break; default: return exception("FileNameRequired", NULL, NULL); } Link link = object_create(stream_type); link->value.vptr = stream_open_file(name->data , type->data, mode); return link; }
static NATIVECALL(shape_sphere){ Link * args = array_getArray(Arg); size_t argn = array_getLength(Arg); Link link = object_create(shape_type); Shape self = link->value.vptr; int n = 20; if (argn == 1){ n = (int)object_asNumber(args[0]); } float radius = 1.0; float center[] = {0.0, 0.0, 0.0}; float twopi = M_PI * 2; List normals = self->normals; List vertices = self->vtx; List texcoords = self->texcoords; struct Xyz vertex; struct Xyz normal; struct Xy texcoord; float j, i; float theta1, theta2, theta3; for ( j = -n/4.0 ; j < n/4.0 ; j++){ theta1 = j * twopi/n; theta2 = (j+1) * twopi/n; for( i=0 ; i < n+1 ; i++){ theta3 = i * twopi/n; if (i == n) theta3 = 0; normal.x = cos(theta2)*cos(theta3); normal.y = sin(theta2); normal.z = cos(theta2)*sin(theta3); vertex.x = center[0] + radius*normal.x; vertex.y = center[1] + radius*normal.y; vertex.z = center[2] + radius*normal.z; texcoord.x = 1.0 - (i/(float)n); texcoord.y = 0.5 + (2*(j+1)/(float)n); list_append(normals, &normal); list_append(vertices, &vertex); list_append(texcoords, &texcoord); normal.x = cos(theta1)*cos(theta3); normal.y = sin(theta1); normal.z = cos(theta1)*sin(theta3); vertex.x = center[0] + radius*normal.x; vertex.y = center[1] + radius*normal.y; vertex.z = center[2] + radius*normal.z; texcoord.x = 1.0 - (i/(float)n); texcoord.y = 0.5 + (2*j/(float)n); list_append(normals,&normal); list_append(vertices, &vertex); list_append(texcoords, &texcoord); } } return link; }