Advertisement
svederni

driver

Oct 26th, 2016
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.74 KB | None | 0 0
  1. #include <malloc.h>
  2. #include <stdio.h>
  3. #include <getopt.h>
  4. #include "mylib.h"
  5. #include "stack.h"
  6.  
  7. typedef struct {
  8. long xxx;
  9. } MyRec;
  10.  
  11. MyRec * new_MyRec (long index) {
  12. MyRec * this_MyRec = (MyRec *) malloc (sizeof(MyRec));
  13. this_MyRec->xxx = index;
  14. return this_MyRec;
  15. }
  16.  
  17. void delete_MyRec (void * vpp) {
  18. MyRec ** myrecpp = (MyRec **) vpp;
  19. free (*myrecpp);
  20. *myrecpp = 0;
  21. }
  22.  
  23. FILE * write_MyRec (void * vp, FILE * stream) {
  24. MyRec * myrecp = (MyRec *) vp;
  25. fprintf (stream, "MyRec has value of: %ld", myrecp->xxx);
  26. return stream;
  27. }
  28.  
  29. static long from_where (void);
  30.  
  31. int main (int argc, char *const* argv) {
  32.  
  33. MyRec * element; /* to store in the stack */
  34. Stack * main_stack; /* the List/Stack to test */
  35. int option; /* each command line option */
  36. long command; /* stack command entered by user */
  37. long status; /* return status of stack functions */
  38.  
  39. /* initialize debug states */
  40. set_debug_off();
  41.  
  42. /* check command line options for debug display */
  43. while ((option = getopt (argc, argv, "x")) != EOF) {
  44.  
  45. switch (option) {
  46. case 'x': set_debug_on(); break;
  47. }
  48. }
  49.  
  50. /* allocate and initialize */
  51. main_stack = new_Stack(0, delete_MyRec, write_MyRec);
  52.  
  53. while (1) {
  54. command = 0; /* initialize command, need for loops */
  55. writeline ("\nThe commands are:\n");
  56. writeline (" is(e)mpty, ");
  57. writeline ("(i)nsert, ");
  58. writeline ("(p)op, ");
  59. newline ();
  60. writeline (" (a)dvance pre, advance (n)ext, ");
  61. newline ();
  62. writeline (" (r)emove, ");
  63. writeline ("(t)op, ");
  64. writeline ("p(u)sh, (v)iew, ");
  65. newline ();
  66. writeline (" (w)rite, (W)rite reverse,");
  67. newline ();
  68.  
  69. writeline ("\nPlease enter a command: ");
  70. command = fgetc (stdin);
  71. if (command == EOF) /* are we done? */
  72. break;
  73. clrbuf (command); /* get rid of extra characters */
  74.  
  75. switch (command) { /* process commands */
  76.  
  77. case 'a': /* advance pre */
  78. advance_pre_List (main_stack);
  79. break;
  80.  
  81. case 'n': /* advance next */
  82. advance_next_List (main_stack);
  83. break;
  84.  
  85. case 'e': /* isempty */
  86. if (isempty_Stack (main_stack))
  87. writeline ("\nStack is empty.");
  88. else
  89. writeline ("\nStack is not empty.");
  90. break;
  91.  
  92. case 'i': /* insert */
  93. writeline (
  94. "\nPlease enter a number to insert into list: ");
  95. element = new_MyRec (decin ());
  96. clrbuf (0); /* get rid of extra characters */
  97. status = insert (main_stack, element, from_where ());
  98. if (! status)
  99. fprintf (stderr,
  100. "\nWARNING: insert FAILED\n");
  101. break;
  102.  
  103. case 'p': /* pop */
  104. element = (MyRec *) pop (main_stack);
  105. if (! element)
  106. fprintf (stderr,
  107. "\nWARNING: pop FAILED\n");
  108. else {
  109. writeline (
  110. "\nNumber popped from the stack is: ");
  111. write_MyRec (element, stdout);
  112. delete_MyRec (&element);
  113. }
  114. break;
  115.  
  116. case 'r': /* remove */
  117. element =
  118. (MyRec *) remove_List (main_stack, from_where ());
  119. if (! element)
  120. fprintf (stderr,
  121. "\nWARNING: remove FAILED\n");
  122. else {
  123. writeline (
  124. "\nNumber removed from list is: ");
  125. write_MyRec (element, stdout);
  126. delete_MyRec (&element);
  127. }
  128. break;
  129.  
  130. case 't': /* top */
  131. element = (MyRec *) top (main_stack);
  132. if (! element)
  133. fprintf (stderr,
  134. "\nWARNING: top FAILED\n");
  135. else {
  136. writeline (
  137. "\nNumber at top of the stack is: ");
  138. write_MyRec (element, stdout);
  139. }
  140. break;
  141.  
  142. case 'u': /* push */
  143. writeline (
  144. "\nPlease enter a number to push to stack: ");
  145. element = new_MyRec (decin ());
  146. clrbuf (0); /* get rid of extra characters */
  147. status = push (main_stack, element);
  148. if (! status)
  149. fprintf (stderr,
  150. "\nWARNING: push FAILED\n");
  151. break;
  152.  
  153. case 'v': /* view */
  154. element = (MyRec *) view (main_stack, from_where ());
  155. if (! element)
  156. fprintf (stderr,
  157. "\nWARNING: view FAILED\n");
  158. else {
  159. writeline (
  160. "\nNumber viewed from list is: ");
  161. write_MyRec (element, stdout);
  162. }
  163. break;
  164.  
  165. case 'w': /* write */
  166. writeline ("\nThe Stack contains:\n");
  167. write_Stack (main_stack, stderr);
  168. newline ();
  169. break;
  170.  
  171. case 'W': /* write */
  172. writeline ("\nThe Stack contains (in reverse):\n");
  173. write_reverse_List (main_stack, stderr);
  174. newline ();
  175. break;
  176. }
  177. }
  178.  
  179. delete_Stack (&main_stack); /* deallocate stack */
  180. newline ();
  181. return 0;
  182. }
  183.  
  184. /* This function prompts the user where in the list they want to
  185. either insert, remove, or view, depending upon from which part
  186. of the driver the function is called. */
  187. static long from_where (void) {
  188.  
  189. int character;
  190. long retval;
  191. writeline ("Specify 1 for FRONT, 0 for END, or location number");
  192. writeline ("\nPlease enter choice: ");
  193.  
  194. if ((character = fgetc(stdin)) == '\n')
  195. retval = -1;
  196.  
  197. else {
  198. ungetc (character, stdin);
  199. retval = decin ();
  200. clrbuf (0);
  201. }
  202.  
  203. return retval;
  204. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement