Microprocessor and peripheral 2 assignments for AUTH
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.
 
 
 
 
 
 

224 lines
5.1 KiB

  1. /*!
  2. * \file deque08.c
  3. * \brief
  4. * This file provides double ended queue capability based on a ring buffer
  5. *
  6. * Copyright (C) 2014 Houtouridis Christos <houtouridis.ch@gmail.com>
  7. *
  8. * This program is free software: you can redistribute it and/or modify
  9. * it under the terms of the GNU Lesser General Public License as
  10. * published by the Free Software Foundation, either version 3
  11. * of the License, or (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU Lesser General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU Lesser General Public License
  19. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  20. *
  21. */
  22. #include "deque08.h"
  23. /*
  24. * ============= Private Queue API =============
  25. */
  26. static iterator_t _preInc(deque08_t *q, iterator_t* it) {
  27. return (++*it >= q->capacity) ? *it=0 : *it;
  28. }
  29. static iterator_t _preDec(deque08_t *q, iterator_t* it) {
  30. return (--*it < 0) ? *it=q->capacity-1 : *it;
  31. }
  32. static iterator_t _postInc(deque08_t *q, iterator_t* it) {
  33. iterator_t ret = *it;
  34. if (++*it >= q->capacity) *it=0;
  35. return ret;
  36. }
  37. static iterator_t _postDec(deque08_t *q, iterator_t* it) {
  38. iterator_t ret = *it;
  39. if (--*it < 0) *it=q->capacity-1;
  40. return ret;
  41. }
  42. /*
  43. * ============= Public Queue API =============
  44. */
  45. /*
  46. * Link and Glue functions
  47. */
  48. void deque08_link_buffer (deque08_t *q, byte_t* buf) {
  49. q->m = buf;
  50. }
  51. /*
  52. * Set functions
  53. */
  54. inline void deque08_set_capacity (deque08_t *q, size_t capacity) {
  55. q->capacity = capacity;
  56. }
  57. /*
  58. * User Functions
  59. */
  60. /*!
  61. * \brief
  62. * Check if deque is full
  63. * \param q Which deque to check
  64. * \return
  65. * \arg 0 Not full
  66. * \arg 1 Full
  67. */
  68. int deque08_is_full (deque08_t *q) {
  69. return (q->items == q->capacity) ? 1:0;
  70. }
  71. /*!
  72. * \brief
  73. * Check if deque is empty
  74. * \param q Which deque to check
  75. * \return
  76. * \arg 0 Not empty
  77. * \arg 1 Empty
  78. */
  79. int deque08_is_empty (deque08_t *q) {
  80. return (q->items) ? 0:1;
  81. }
  82. /*!
  83. * \brief
  84. * Return the number of items on deque
  85. * \param q Which deque to check
  86. */
  87. int deque08_size (deque08_t *q) {
  88. return q->items;
  89. }
  90. /*!
  91. * \brief
  92. * Discard all items in deque
  93. * \param q Which deque to check
  94. */
  95. void deque08_flush (deque08_t *q) {
  96. deque08_init(q);
  97. }
  98. /*!
  99. * \brief
  100. * Initialize the queue
  101. * \param queue Which queue to init
  102. */
  103. void deque08_init (deque08_t *q) {
  104. q->f = 0;
  105. q->r = -1;
  106. q->items =0;
  107. }
  108. /*!
  109. * \brief
  110. * This function push a byte in front of deque.
  111. * \param q Pointer to deque to use
  112. * \param b byte to push
  113. * \return
  114. * \arg 0 Full queue
  115. * \arg 1 Done
  116. */
  117. int deque08_push_front (deque08_t *q, byte_t b) {
  118. if (deque08_is_full (q) == 1) //full queue
  119. return 0;
  120. q->m [_preDec (q, &q->f)] = b;
  121. ++q->items;
  122. return 1;
  123. }
  124. /*!
  125. * \brief
  126. * This function pops a byte from the front of the deque.
  127. * \param q Pointer to deque to use
  128. * \param b Pointer to byte to return
  129. * \return
  130. * \arg 0 Empty queue
  131. * \arg 1 Done
  132. */
  133. int deque08_pop_front (deque08_t *q, byte_t *b) {
  134. if (deque08_is_empty (q) == 1) //empty queue
  135. return 0;
  136. *b = q->m [_postInc (q, &q->f)];
  137. --q->items;
  138. return 1;
  139. }
  140. /*!
  141. * \brief
  142. * This function push a byte in the back of deque.
  143. * \param q Pointer to deque to use
  144. * \param b byte to push
  145. * \return
  146. * \arg 0 Full queue
  147. * \arg 1 Done
  148. */
  149. int deque08_push_back (deque08_t *q, byte_t b) {
  150. if (deque08_is_full (q) == 1) //full queue
  151. return 0;
  152. q->m [_preInc (q, &q->r)] = b;
  153. ++q->items;
  154. return 1;
  155. }
  156. /*!
  157. * \brief
  158. * This function pops a byte from the back of the deque.
  159. * \param q Pointer to deque to use
  160. * \param b Pointer to byte to return
  161. * \return
  162. * \arg 0 Empty queue
  163. * \arg 1 Done
  164. */
  165. int deque08_pop_back (deque08_t *q, byte_t *b) {
  166. if (deque08_is_empty (q) == 1) //empty queue
  167. return 0;
  168. *b = q->m [_postDec (q, &q->r)];
  169. --q->items;
  170. return 1;
  171. }
  172. /*!
  173. * \brief
  174. * This function gives the last item in the back of deque.
  175. * \param q Pointer to deque to use
  176. * \param b Pointer to byte to return
  177. * \return
  178. * \arg 0 Empty queue
  179. * \arg 1 Done
  180. */
  181. int deque08_back (deque08_t *q, byte_t *b) {
  182. if (deque08_is_empty (q) == 1) //empty queue
  183. return 0;
  184. *b = q->m [q->r];
  185. return 1;
  186. }
  187. /*!
  188. * \brief
  189. * This function gives the first item in the front of deque.
  190. * \param q Pointer to deque to use
  191. * \param b Pointer to byte to return
  192. * \return
  193. * \arg 0 Empty queue
  194. * \arg 1 Done
  195. */
  196. int deque08_front (deque08_t *q, byte_t *b) {
  197. if (deque08_is_empty (q) == 1) //empty queue
  198. return 0;
  199. *b = q->m [q->f];
  200. return 1;
  201. }