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

📄 gbx_c_array.c

📁 Gambas is a graphical development environment based on a Basic interpreter, like Visual Basic. It us
💻 C
📖 第 1 页 / 共 2 页
字号:
#define IMPLEMENT_put(_type, _gtype) \BEGIN_METHOD(CARRAY_##_type##_put, GB_##_gtype value; GB_INTEGER index) \\  void *data = get_data(THIS, VARG(index)); \  if (!data) return; \  GB_Store(GB_T_##_gtype, (GB_VALUE *)ARG(value), data); \  \END_METHOD#define IMPLEMENT_put2(_type, _gtype, _gstore) \BEGIN_METHOD(CARRAY_##_type##_put, GB_##_gtype value; GB_INTEGER index) \\  void *data = get_data(THIS, VARG(index)); \  if (!data) return; \  GB_Store(GB_T_##_gstore, (GB_VALUE *)ARG(value), data); \  \END_METHODIMPLEMENT_put(integer, INTEGER)IMPLEMENT_put2(short, INTEGER, SHORT)IMPLEMENT_put2(byte, INTEGER, BYTE)IMPLEMENT_put(float, FLOAT)IMPLEMENT_put(date, DATE)IMPLEMENT_put(string, STRING)IMPLEMENT_put(object, OBJECT)IMPLEMENT_put(variant, VARIANT)BEGIN_METHOD(CARRAY_insert, GB_OBJECT array; GB_INTEGER pos)  long pos = VARGOPT(pos, -1);  CARRAY *array = (CARRAY *)VARG(array);  int count = ARRAY_count(array->data);  void *data;  if (count <= 0)    return;       if (pos < 0)     pos = ARRAY_count(THIS->data);  data = ARRAY_insert_many(&THIS->data, pos, count);  borrow(array, 0, -1);  memmove(data, array->data, count * TYPE_sizeof_memory(THIS->type));END_METHODBEGIN_METHOD(CARRAY_copy, GB_INTEGER start; GB_INTEGER length)  CARRAY *array;  int count = ARRAY_count(THIS->data);  void *data;  int start = VARGOPT(start, 0);  int length = VARGOPT(length, -1);  if (start < 0 || start >= count)  {      GB_Error((char *)E_BOUND);    return;  }    if (length == -1)    length = count - start;       if (length < 0 || (start + length) > count)  {      GB_Error((char *)E_BOUND);    return;  }    GB_ArrayNew((GB_ARRAY)&array, THIS->type, 0);      if (length > 0)  {    data = ARRAY_insert_many(&array->data, 0, length);    memmove(data, get_data(THIS, start), length * TYPE_sizeof_memory(THIS->type));    borrow(array, 0, -1);  }    GB_ReturnObject(array);END_METHODBEGIN_METHOD_VOID(CARRAY_pop)  long index = ARRAY_count(THIS->data) - 1;  if (index < 0)  {    GB_Error((char *)E_ARG);    return;  }  GB_ReturnPtr(THIS->type, get_data(THIS, index));  BORROW(&TEMP);  release_one(THIS, index);  ARRAY_remove(&THIS->data, index);  UNBORROW(&TEMP);END_METHODBEGIN_METHOD(CARRAY_get, GB_INTEGER index)  void *data = get_data(THIS, VARG(index));  if (data)    GB_ReturnPtr(THIS->type, data);END_METHODBEGIN_METHOD_VOID(CARRAY_next)  long *index = (long *)GB_GetEnum();  if (*index >= ARRAY_count(THIS->data))    GB_StopEnum();  else  {    GB_ReturnPtr(THIS->type, get_data(THIS, *index));    (*index)++;  }END_METHODBEGIN_METHOD(CARRAY_sort, GB_INTEGER mode)  COMPARE_FUNC compare;  long mode = VARGOPT(mode, 0);  void *data = THIS->data;  if (ARRAY_count(data) <= 1)    return;  compare = COMPARE_get(THIS->type, mode);  qsort(data, ARRAY_count(data), TYPE_sizeof_memory(THIS->type), compare);END_METHODPRIVATE void find(CARRAY *_object, int mode, void *value){  COMPARE_FUNC compare = COMPARE_get(THIS->type, mode);  int i;  for (i = 0; i < ARRAY_count(THIS->data); i++)  {    if ((*compare)(value, get_data(THIS, i)) == 0)    {      GB_ReturnInt(i);      return;    }  }  GB_ReturnInt(-1);}#define IMPLEMENT_find(_type, _gtype) \BEGIN_METHOD(CARRAY_##_type##_find, _gtype value; GB_INTEGER mode) \\  find(THIS, VARGOPT(mode, 0), &VARG(value)); \\END_METHODIMPLEMENT_find(integer, GB_INTEGER)IMPLEMENT_find(short, GB_INTEGER)IMPLEMENT_find(byte, GB_INTEGER)IMPLEMENT_find(float, GB_FLOAT)IMPLEMENT_find(date, GB_DATE)IMPLEMENT_find(object, GB_OBJECT)BEGIN_METHOD(CARRAY_string_find, GB_STRING value; GB_INTEGER mode)  char *str = GB_ToZeroString(ARG(value));  find(THIS, VARGOPT(mode, 0), &str);END_METHODBEGIN_METHOD(CARRAY_string_join, GB_STRING sep)  char *sep = ",";  char *res = NULL;  int i;  char **data = (char **)THIS->data;  if (!MISSING(sep))    sep = GB_ToZeroString(ARG(sep));  for (i = 0; i < ARRAY_count(data); i++)  {    if (i)      STRING_add(&res, sep, 0);    STRING_add(&res, data[i], STRING_length(data[i]));  }  if (res)  {    STRING_extend_end(&res);    GB_ReturnString(res);  }  else    GB_ReturnNull();END_METHODBEGIN_METHOD_VOID(CARRAY_reverse)  size_t size;  long count;  char *buffer[16];  char *pi, *pj;  count = ARRAY_count(THIS->data);  if (count <= 1)    return;  size = TYPE_sizeof_memory(THIS->type);  pi = get_data(THIS, 0);  pj = get_data(THIS, count - 1);  do  {    memcpy(buffer, pi, size);    memcpy(pi, pj, size);    memcpy(pj, buffer, size);    pi += size;    pj -= size;  }  while (pi < pj);END_METHODBEGIN_METHOD(CARRAY_read, GB_OBJECT file; GB_INTEGER start; GB_INTEGER length)  long count = ARRAY_count(THIS->data);  long start = VARGOPT(start, 0);  long length = VARGOPT(length, count);  if ((start + length) > count)    length = count - start;  STREAM_read(CSTREAM_stream(VARG(file)), get_data(THIS, start), length * TYPE_sizeof_memory(THIS->type));END_METHODBEGIN_METHOD(CARRAY_write, GB_OBJECT file; GB_INTEGER start; GB_INTEGER length)  long count = ARRAY_count(THIS->data);  long start = VARGOPT(start, 0);  long length = VARGOPT(length, count);  if ((start + length) > count)    length = count - start;  STREAM_write(CSTREAM_stream(VARG(file)), get_data(THIS, start), length * TYPE_sizeof_memory(THIS->type));END_METHODPUBLIC GB_DESC NATIVE_Array[] ={  GB_DECLARE(".Array", sizeof(CARRAY)), GB_NOT_CREATABLE(),  GB_METHOD("_free", NULL, CARRAY_free, NULL),  GB_PROPERTY_READ("Count", "i", CARRAY_count),  GB_PROPERTY_READ("Max", "i", CARRAY_max),  GB_PROPERTY_READ("Length", "i", CARRAY_count),  GB_METHOD("Remove", NULL, CARRAY_remove, "(Index)i[(Count)i]"),  GB_METHOD("Clear", NULL, CARRAY_clear, NULL),  GB_METHOD("Resize", NULL, CARRAY_resize, "(Size)i"),  GB_METHOD("Sort", NULL, CARRAY_sort, "[(Mode)i]"),  GB_METHOD("Reverse", NULL, CARRAY_reverse, NULL),  //GB_METHOD("FromString", "i", CARRAY_from_string, "(String)s[(Separator)s(Escape)s]"),  //GB_METHOD("Sort", NULL, CARRAY_sort, "[(Compare)i]"),  //GB_METHOD("Find", "i", CARRAY_find, "(Value)s[(Compare)i]"),  GB_END_DECLARE};PUBLIC GB_DESC NATIVE_IntegerArray[] ={  GB_DECLARE("Integer[]", sizeof(CARRAY)), GB_INHERITS(".Array"),  GB_METHOD("_new", NULL, CARRAY_new, "[(Size)i]"),    GB_METHOD("Add", NULL, CARRAY_integer_add, "(Value)i[(Index)i]"),  GB_METHOD("Push", NULL, CARRAY_integer_push, "(Value)i"),  GB_METHOD("_put", NULL, CARRAY_integer_put, "(Value)i(Index)i"),  GB_METHOD("Find", "i", CARRAY_integer_find, "(Value)i[(Mode)i]"),  GB_METHOD("Pop", "i", CARRAY_pop, NULL),  GB_METHOD("_get", "i", CARRAY_get, "(Index)i"),  GB_METHOD("_next", "i", CARRAY_next, NULL),  GB_METHOD("Read", NULL, CARRAY_read, "(File)File;[(Start)i(Length)i]"),  GB_METHOD("Write", NULL, CARRAY_write, "(File)File;[(Start)i(Length)i]"),  GB_METHOD("Insert", NULL, CARRAY_insert, "(Array)Integer[];[(Pos)i]"),  GB_METHOD("Copy", "Integer[]", CARRAY_copy, "[(Start)i(Length)i]"),  //GB_METHOD("Extract", NULL, CARRAY_extract, "(Start)i[(Length)i]"),  GB_END_DECLARE};PUBLIC GB_DESC NATIVE_ShortArray[] ={  GB_DECLARE("Short[]", sizeof(CARRAY)), GB_INHERITS(".Array"),  GB_METHOD("_new", NULL, CARRAY_new, "[(Size)i]"),    GB_METHOD("Add", NULL, CARRAY_integer_add, "(Value)i[(Index)i]"),  GB_METHOD("Push", NULL, CARRAY_integer_push, "(Value)i"),  GB_METHOD("_put", NULL, CARRAY_short_put, "(Value)i(Index)i"),  GB_METHOD("Find", "i", CARRAY_integer_find, "(Value)i[(Mode)i]"),  GB_METHOD("Pop", "i", CARRAY_pop, NULL),  GB_METHOD("_get", "i", CARRAY_get, "(Index)i"),  GB_METHOD("_next", "i", CARRAY_next, NULL),  GB_METHOD("Read", NULL, CARRAY_read, "(File)File;[(Start)i(Length)i]"),  GB_METHOD("Write", NULL, CARRAY_write, "(File)File;[(Start)i(Length)i]"),  GB_METHOD("Insert", NULL, CARRAY_insert, "(Array)Short[];[(Pos)i]"),  GB_METHOD("Copy", "Short[]", CARRAY_copy, "[(Start)i(Length)i]"),  GB_END_DECLARE};PUBLIC GB_DESC NATIVE_ByteArray[] ={  GB_DECLARE("Byte[]", sizeof(CARRAY)), GB_INHERITS(".Array"),  GB_METHOD("_new", NULL, CARRAY_new, "[(Size)i]"),    GB_METHOD("Add", NULL, CARRAY_integer_add, "(Value)i[(Index)i]"),  GB_METHOD("Push", NULL, CARRAY_integer_push, "(Value)i"),  GB_METHOD("_put", NULL, CARRAY_byte_put, "(Value)i(Index)i"),  GB_METHOD("Find", "i", CARRAY_integer_find, "(Value)i[(Mode)i]"),  GB_METHOD("Pop", "i", CARRAY_pop, NULL),  GB_METHOD("_get", "i", CARRAY_get, "(Index)i"),  GB_METHOD("_next", "i", CARRAY_next, NULL),  GB_METHOD("Read", NULL, CARRAY_read, "(File)File;[(Start)i(Length)i]"),  GB_METHOD("Write", NULL, CARRAY_write, "(File)File;[(Start)i(Length)i]"),  GB_METHOD("Insert", NULL, CARRAY_insert, "(Array)Byte[];[(Pos)i]"),  GB_METHOD("Copy", "Byte[]", CARRAY_copy, "[(Start)i(Length)i]"),  GB_END_DECLARE};PUBLIC GB_DESC NATIVE_StringArray[] ={  GB_DECLARE("String[]", sizeof(CARRAY)), GB_INHERITS(".Array"),  GB_METHOD("_new", NULL, CARRAY_new, "[(Size)i]"),    GB_METHOD("Add", NULL, CARRAY_string_add, "(Value)s[(Index)i]"),  GB_METHOD("Push", NULL, CARRAY_string_push, "(Value)s"),  GB_METHOD("_put", NULL, CARRAY_string_put, "(Value)s(Index)i"),  GB_METHOD("Find", "i", CARRAY_string_find, "(Value)s[(Mode)i]"),  GB_METHOD("Pop", "s", CARRAY_pop, NULL),  GB_METHOD("_get", "s", CARRAY_get, "(Index)i"),  GB_METHOD("_next", "s", CARRAY_next, NULL),  GB_METHOD("Insert", NULL, CARRAY_insert, "(Array)String[];[(Pos)i]"),  GB_METHOD("Join", "s", CARRAY_string_join, "[(Separator)s]"),  /* Inutile ! NE sert qu'

⌨️ 快捷键说明

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