Exemple #1
0
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;
    }
  }
}
Exemple #2
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--;
    }
  }
}
Exemple #3
0
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 );
  }
}
Exemple #4
0
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);
}
Exemple #5
0
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 );
}
Exemple #6
0
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
}
Exemple #7
0
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);
}
Exemple #8
0
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;
}
Exemple #9
0
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;
}
Exemple #10
0
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;
}