array.c
资源名称:c.rar [点击查看]
上传用户:shmaik
上传日期:2014-06-01
资源大小:45093k
文件大小:2k
源码类别:

VC书籍

开发平台:

C/C++

  1. static char rcsid[] = "$Id: H:/drh/idioms/book/RCS/array.doc,v 1.11 1997/10/29 22:05:21 drh Exp $";
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "assert.h"
  5. #include "array.h"
  6. #include "arrayrep.h"
  7. #include "mem.h"
  8. #define T Array_T
  9. T Array_new(int length, int size) {
  10. T array;
  11. NEW(array);
  12. if (length > 0)
  13. ArrayRep_init(array, length, size,
  14. CALLOC(length, size));
  15. else
  16. ArrayRep_init(array, length, size, NULL);
  17. return array;
  18. }
  19. void ArrayRep_init(T array, int length, int size,
  20. void *ary) {
  21. assert(array);
  22. assert(ary && length>0 || length==0 && ary==NULL);
  23. assert(size > 0);
  24. array->length = length;
  25. array->size   = size;
  26. if (length > 0)
  27. array->array = ary;
  28. else
  29. array->array = NULL;
  30. }
  31. void Array_free(T *array) {
  32. assert(array && *array);
  33. FREE((*array)->array);
  34. FREE(*array);
  35. }
  36. void *Array_get(T array, int i) {
  37. assert(array);
  38. assert(i >= 0 && i < array->length);
  39. return array->array + i*array->size;
  40. }
  41. void *Array_put(T array, int i, void *elem) {
  42. assert(array);
  43. assert(i >= 0 && i < array->length);
  44. assert(elem);
  45. memcpy(array->array + i*array->size, elem,
  46. array->size);
  47. return elem;
  48. }
  49. int Array_length(T array) {
  50. assert(array);
  51. return array->length;
  52. }
  53. int Array_size(T array) {
  54. assert(array);
  55. return array->size;
  56. }
  57. void Array_resize(T array, int length) {
  58. assert(array);
  59. assert(length >= 0);
  60. if (length == 0)
  61. FREE(array->array);
  62. else if (array->length == 0)
  63. array->array = ALLOC(length*array->size);
  64. else
  65. RESIZE(array->array, length*array->size);
  66. array->length = length;
  67. }
  68. T Array_copy(T array, int length) {
  69. T copy;
  70. assert(array);
  71. assert(length >= 0);
  72. copy = Array_new(length, array->size);
  73. if (copy->length >= array->length
  74. && array->length > 0)
  75. memcpy(copy->array, array->array, array->length);
  76. else if (array->length > copy->length
  77. && copy->length > 0)
  78. memcpy(copy->array, array->array, copy->length);
  79. return copy;
  80. }