You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

62 lines
2.2 KiB

  1. /*
  2. +----------------------------------------------------------------------+
  3. | Zend Engine |
  4. +----------------------------------------------------------------------+
  5. | Copyright (c) 1998-2000 Zend Technologies Ltd. (http://www.zend.com) |
  6. +----------------------------------------------------------------------+
  7. | This source file is subject to version 0.92 of the Zend license, |
  8. | that is bundled with this package in the file LICENSE, and is |
  9. | available at through the world-wide-web at |
  10. | http://www.zend.com/license/0_92.txt. |
  11. | If you did not receive a copy of the Zend license and are unable to |
  12. | obtain it through the world-wide-web, please send a note to |
  13. | license@zend.com so we can mail you a copy immediately. |
  14. +----------------------------------------------------------------------+
  15. | Authors: Andi Gutmans <andi@zend.com> |
  16. | Zeev Suraski <zeev@zend.com> |
  17. +----------------------------------------------------------------------+
  18. */
  19. #include "zend.h"
  20. typedef struct _dynamic_array {
  21. char *array;
  22. unsigned int element_size;
  23. unsigned int current;
  24. unsigned int allocated;
  25. } dynamic_array;
  26. ZEND_API int zend_dynamic_array_init(dynamic_array *da, unsigned int element_size, unsigned int size)
  27. {
  28. da->element_size = element_size;
  29. da->allocated = size;
  30. da->current = 0;
  31. da->array = (char *) emalloc(size*element_size);
  32. if (da->array == NULL) {
  33. return 1;
  34. }
  35. return 0;
  36. }
  37. ZEND_API void *zend_dynamic_array_push(dynamic_array *da)
  38. {
  39. if (da->current == da->allocated) {
  40. da->allocated *= 2;
  41. da->array = (char *) erealloc(da->array, da->allocated*da->element_size);
  42. }
  43. return (void *)(da->array+(da->current++)*da->element_size);
  44. }
  45. ZEND_API void *zend_dynamic_array_pop(dynamic_array *da)
  46. {
  47. return (void *)(da->array+(--(da->current))*da->element_size);
  48. }
  49. ZEND_API void *zend_dynamic_array_get_element(dynamic_array *da, unsigned int index)
  50. {
  51. if (index >= da->current) {
  52. return NULL;
  53. }
  54. return (void *)(da->array+index*da->element_size);
  55. }