Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

86 rindas
2.1 KiB

  1. // This file is part of Jiffy released under the MIT license.
  2. // See the LICENSE file for more information.
  3. #include <assert.h>
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include "jiffy.h"
  7. #include "termstack.h"
  8. inline void
  9. termstack_push(TermStack *stack, ERL_NIF_TERM term)
  10. {
  11. if(stack->top == stack->size) {
  12. size_t new_size = stack->size * 2;
  13. if (stack->elements == &stack->__default_elements[0]) {
  14. ERL_NIF_TERM *new_elements = enif_alloc(new_size * sizeof(ERL_NIF_TERM));
  15. memcpy(new_elements, stack->elements, stack->size * sizeof(ERL_NIF_TERM));
  16. stack->elements = new_elements;
  17. } else {
  18. stack->elements = enif_realloc(stack->elements,
  19. new_size * sizeof(ERL_NIF_TERM));
  20. }
  21. stack->size = new_size;
  22. }
  23. assert(stack->top < stack->size);
  24. stack->elements[stack->top++] = term;
  25. }
  26. inline ERL_NIF_TERM
  27. termstack_pop(TermStack *stack)
  28. {
  29. assert(stack->top > 0 && stack->top <= stack->size);
  30. return stack->elements[--stack->top];
  31. }
  32. inline int
  33. termstack_is_empty(TermStack *stack)
  34. {
  35. return stack->top == 0;
  36. }
  37. ERL_NIF_TERM termstack_save(ErlNifEnv *env, TermStack *stack)
  38. {
  39. return enif_make_tuple_from_array(env, stack->elements, stack->top);
  40. }
  41. int termstack_restore(ErlNifEnv *env, ERL_NIF_TERM from, TermStack *stack)
  42. {
  43. const ERL_NIF_TERM *elements;
  44. int arity;
  45. if(enif_get_tuple(env, from, &arity, &elements)) {
  46. stack->top = arity;
  47. if(arity <= SMALL_TERMSTACK_SIZE) {
  48. stack->elements = &stack->__default_elements[0];
  49. stack->size = SMALL_TERMSTACK_SIZE;
  50. } else {
  51. stack->size = arity * 2;
  52. stack->elements = enif_alloc(stack->size * sizeof(ERL_NIF_TERM));
  53. if(!stack->elements) {
  54. return 0;
  55. }
  56. }
  57. memcpy(stack->elements, elements, arity * sizeof(ERL_NIF_TERM));
  58. return 1;
  59. }
  60. return 0;
  61. }
  62. void
  63. termstack_destroy(TermStack *stack)
  64. {
  65. if(stack->elements != &stack->__default_elements[0]) {
  66. enif_free(stack->elements);
  67. }
  68. }