⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gbx_value.c

📁 Gambas is a graphical development environment based on a Basic interpreter, like Visual Basic. It us
💻 C
📖 第 1 页 / 共 2 页
字号:
  *((char **)addr) = str;  return;__OBJECT:  VALUE_conv(value, type);  OBJECT_REF(value->_object.object, "VALUE_write");  OBJECT_UNREF(((void **)addr), "VALUE_write");  *((void **)addr) = value->_object.object;  return;__VARIANT:  VARIANT_undo(value);  type = value->type;  if (type == T_CSTRING) type = T_STRING;  VARIANT_clear((VARIANT *)addr);  ((VARIANT *)addr)->type = type;  /* Et si type ne fait pas partie des types valides pour cette fonction ?? */  if (type == T_NULL)    return;  addr = ((VARIANT *)addr)->value;  /*goto *jump[Min(T_OBJECT, type)];*/  goto __CONV;  /*  {    VARIANT *var = ((VARIANT *)addr);    VARIANT_free(var);    var->type = value->_variant.vtype;    VARIANT_copy(value->_variant.value, var->value);    if (TYPE_is_object(var->type))      OBJECT_$ref(*((void **)var->value));    return;  }  */__VOID:__LONG:__ARRAY:__STRUCT:__FUNCTION:__CLASS:__NULL:  ERROR_panic("Bad type (%d) for VALUE_write", type);}PUBLIC void VALUE_read(VALUE *value, void *addr, TYPE type){  static void *jump[16] = {    &&__VOID, &&__BOOLEAN, &&__BYTE, &&__SHORT, &&__INTEGER, &&__LONG, &&__FLOAT, &&__DATE,    &&__STRING, &&__CSTRING, &&__VARIANT, &&__ARRAY, &&__STRUCT, &&__FUNCTION, &&__CLASS, &&__NULL    };  char *str;  value->type = type;  if (TYPE_is_object(type))    goto __OBJECT;  else    goto *jump[type];__BOOLEAN:  value->_boolean.value = (*((unsigned char *)addr) != 0) ? (-1) : 0;  return;__BYTE:  value->_byte.value = *((unsigned char *)addr);  return;__SHORT:  value->_short.value = *((short *)addr);  return;__INTEGER:  value->_integer.value = *((long *)addr);  return;__FLOAT:  value->_float.value = *((double *)addr);  return;__DATE:  value->_date.date = ((long *)addr)[0];  value->_date.time = ((long *)addr)[1];  return;__STRING:  str = *((char **)addr);  value->type = T_STRING;  value->_string.addr = str;  value->_string.start = 0;  /*value->_string.len = (str == NULL) ? 0 : strlen(str);*/  value->_string.len = STRING_length(str);  return;__CSTRING:  str = *((char **)addr);  value->type = T_CSTRING;  value->_string.addr = str;  value->_string.start = 0;  value->_string.len = (str == NULL) ? 0 : strlen(str);  /*value->_string.len = STRING_length(str);*/  return;__OBJECT:  value->_object.object = *((void **)addr);  return;__VARIANT:  value->_variant.type = T_VARIANT;  value->_variant.vtype = ((VARIANT *)addr)->type;  /*if (value->_variant.vtype == T_STRING)    value->_variant.vtype = T_STRING;  else*/ if (value->_variant.vtype == T_VOID)    value->_variant.vtype = T_NULL;  VARIANT_copy(((VARIANT *)addr)->value, value->_variant.value);  return;__VOID:__LONG:__ARRAY:__STRUCT:__CLASS:__FUNCTION:__NULL:  ERROR_panic("Bad type (%d) for VALUE_read", type);}/* Retourne TRUE s'il y a eu besoin d'allouer qqch *//*#define MAX_FREE_PTR 64PRIVATE int free_count = 0;PRIVATE void *free_ptr[MAX_FREE_PTR];PRIVATE void add_free_ptr(void *ptr){  if (free_count >= MAX_FREE_PTR)    ERROR_panic("VALUE_put: too many pointers to free");  free_ptr[free_count] = ptr;  free_count++;}PUBLIC void VALUE_put_free(void){  int i;  for (i = 0; i < free_count; i++)    STRING_free((char **)&free_ptr[i]);  free_count = 0;}PUBLIC void VALUE_put_forget(void){  free_count = 0;}*/PUBLIC void VALUE_put(VALUE *value, void *addr, TYPE type){  static void *jump[16] = {    &&__VOID, &&__BOOLEAN, &&__BYTE, &&__SHORT, &&__INTEGER, &&__LONG, &&__FLOAT, &&__DATE,    &&__STRING, &&__STRING, &&__VARIANT, &&__ARRAY, &&__STRUCT, &&__FUNCTION, &&__CLASS, &&__NULL    };  VALUE_conv(value, type);  if (TYPE_is_object(type))    goto __OBJECT;  else    goto *jump[type];__BOOLEAN:  *((unsigned char *)addr) = (value->_boolean.value != 0 ? 1 : 0);  return;__BYTE:  *((unsigned char *)addr) = (unsigned char)(value->_byte.value);  return;__SHORT:  *((short *)addr) = (short)(value->_short.value);  return;__INTEGER:  *((long *)addr) = value->_integer.value;  return;__FLOAT:  *((double *)addr) = value->_float.value;  return;__DATE:  /* Inverser au cas o value ~= addr */  ((long *)addr)[1] = value->_date.time;  ((long *)addr)[0] = value->_date.date;  return;__STRING:  ((long *)addr)[0] = (long)(value->_string.addr + value->_string.start);  ((long *)addr)[1] = value->_string.len;  return;__OBJECT:  *((void **)addr) = value->_object.object;  return;__VARIANT:  *((VARIANT *)addr) = *((VARIANT *)&value->_variant.vtype);  return;  /*  if  type = value->type;  ((VARIANT *)addr)->type = type;  addr = ((VARIANT *)addr)->value;  goto _conv;  */__VOID:__LONG:__ARRAY:__STRUCT:__CLASS:__FUNCTION:__NULL:  ERROR_panic("Bad type (%d) for VALUE_put", type);}PUBLIC void VALUE_free(void *addr, TYPE type){  if (type == T_STRING)  {    STRING_unref((char **)addr);    *((char **)addr) = NULL;  }  else if (TYPE_is_object(type))  {    OBJECT_unref((void **)addr);    *((void **)addr) = NULL;  }  else if (type == T_VARIANT)  {    VARIANT_free((VARIANT *)addr);    ((VARIANT *)addr)->type = T_NULL;  }}PUBLIC void VALUE_to_string(VALUE *value, char **addr, long *len){  static void *jump[16] = {    &&__VOID, &&__BOOLEAN, &&__BYTE, &&__SHORT, &&__INTEGER, &&__LONG, &&__FLOAT, &&__DATE,    &&__STRING, &&__STRING, &&__VARIANT, &&__ARRAY, &&__STRUCT, &&__FUNCTION, &&__CLASS, &&__NULL    };_conv:  if (TYPE_is_object(value->type))    goto __OBJECT;  else    goto *jump[value->type];__NULL:  *addr = ""; /* Pour �re coh�ent avec print "" puisque Null == "" */  *len = 0;  return;__BOOLEAN:  if (value->_boolean.value)  {    *addr = "True";    *len = 4;  }  else  {    *addr = "False";    *len = 5;  }  return;__BYTE:__SHORT:__INTEGER:  *len = sprintf(COMMON_buffer, "%ld", value->_integer.value);  *addr = COMMON_buffer;  return;__DATE:  LOCAL_format_date(DATE_split(value), LF_STANDARD, NULL, 0, addr, len);  return;__FLOAT:  LOCAL_format_number(value->_float.value, LF_STANDARD, NULL, 0, addr, len, TRUE);  return;__STRING:  *len = value->_string.len;  *addr = value->_string.addr + value->_string.start;  return;__OBJECT:  if (VALUE_is_null(value))    goto __NULL;  *len = sprintf(COMMON_buffer, "(%s %p)", OBJECT_class(value->_object.object)->name, value->_object.object);  *addr = COMMON_buffer;  return;__VARIANT:  VARIANT_undo(value);  goto _conv;__VOID:__LONG:__ARRAY:__STRUCT:__FUNCTION:__CLASS:  *len = sprintf(COMMON_buffer, "(%s ?)", TYPE_get_name(value->type));  *addr = COMMON_buffer;  /*THROW(E_TYPE, TYPE_get_name(T_STRING), TYPE_get_name(value->type));*/}PUBLIC void VALUE_from_string(VALUE *value, const char *addr, long len){  if (DATE_from_string(addr, len, value, TRUE)      && NUMBER_from_string(NB_READ_BOTH | NB_READ_HEX_BIN | NB_LOCAL, addr, len, value))    {      if (len == 4 && strncasecmp(addr, "true", len) == 0)      {        value->type = T_BOOLEAN;        value->_boolean.value = -1;      }      else if (len == 5 && strncasecmp(addr, "false", len) == 0)      {        value->type = T_BOOLEAN;        value->_boolean.value = 0;      }      else        value->type = T_NULL;    }}PUBLIC void VALUE_class_read(CLASS *class, VALUE *value, char *addr, CTYPE ctype){  if (ctype.id == T_OBJECT)  {    VALUE_read(value, addr, (ctype.value >= 0) ? (TYPE)class->load->class_ref[ctype.value] : T_OBJECT);  }  else if (ctype.id == T_ARRAY)  {    value->type = T_ARRAY;    value->_array.desc = class->load->array[ctype.value];    value->_array.addr = addr;    value->_array.keep = TRUE; // We suppose that the array goes to the stack  }  else    VALUE_read(value, addr, (TYPE)ctype.id);}PUBLIC void VALUE_class_write(CLASS *class, VALUE *value, char *addr, CTYPE ctype){  if (ctype.id == T_OBJECT)  {    VALUE_write(value, addr, (ctype.value >= 0) ? (TYPE)class->load->class_ref[ctype.value] : T_OBJECT);  }  else if (ctype.id == T_ARRAY)  {    ERROR_panic("Don't know how to copy arrays");  }  else    VALUE_write(value, addr, (TYPE)ctype.id);}PUBLIC void VALUE_class_default(CLASS *class, VALUE *value, CTYPE ctype){  if (ctype.id == T_OBJECT)  {    VALUE_default(value, (ctype.value >= 0) ? (TYPE)class->load->class_ref[ctype.value] : T_OBJECT);  }  else if (ctype.id == T_ARRAY)  {    value->type = T_ARRAY;    value->_array.desc = class->load->array[ctype.value];    value->_array.keep = FALSE;    ARRAY_new(&value->_array.addr, (ARRAY_DESC *)value->_array.desc);  }  else    VALUE_default(value, (TYPE)ctype.id);}PUBLIC bool VALUE_is_null(VALUE *val){  if (val->type == T_NULL)    return TRUE;  if (VALUE_is_string(val) && (val->_string.addr == 0 || val->_string.len == 0))    return TRUE;  if (VALUE_is_object(val) && (val->_object.object == NULL))    return TRUE;  if (val->type == T_VARIANT)  {    if (val->_variant.vtype == T_NULL)      return TRUE;    if (val->_variant.vtype == T_STRING && *((char **)val->_variant.value) == NULL)      return TRUE;    if (TYPE_is_object(val->_variant.vtype) && *((void **)val->_variant.value) == NULL)      return TRUE;  }  return FALSE;}PUBLIC void VALUE_get_string(VALUE *val, char **text, long *length){  if (VALUE_is_null(val))  {    *text = 0;    *length = 0;  }  else  {    *length = val->_string.len;    if (*length)      *text = val->_string.start + val->_string.addr;    else      *text = NULL;  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -