diff --git a/.gitignore b/.gitignore index 1d62335..d23acbb 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,6 @@ picoc.files picoc.includes tests/fred.txt +analysis.txt +gmon.out +tests/gmon.out diff --git a/Makefile b/Makefile index cbd3853..84145be 100644 --- a/Makefile +++ b/Makefile @@ -22,6 +22,7 @@ $(TARGET): $(OBJS) test: all (cd tests; make test) (cd tests; make csmith) + (cd tests; make jpoirier) clean: rm -f $(TARGET) $(OBJS) *~ diff --git a/tests/Makefile b/tests/Makefile index e02902c..9f2e6e9 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -65,6 +65,7 @@ TESTS= 00_assignment.test \ include csmith/Makefile +include jpoirier/Makefile %.test: %.expect %.c @echo Test: $*... @@ -91,3 +92,6 @@ test: $(TESTS) csmith: $(CSMITH_TESTS) @echo "CSmith test passed" +jpoirier: $(JPOIRIER_TESTS) + @echo "JPoirier test passed" + diff --git a/tests/jpoirier/00_linked_list.c b/tests/jpoirier/00_linked_list.c new file mode 100644 index 0000000..d44057e --- /dev/null +++ b/tests/jpoirier/00_linked_list.c @@ -0,0 +1,125 @@ +#include +#include + + +static void enqueue_tail(int d); +static void enqueue_head(int d); +static int dequeue_tail(void); +static int dequeue_head(void); + +struct Node { + struct Node *next; + struct Node *prev; + int data; +}; + +struct Node *head = NULL; +struct Node *tail = NULL; + +void enqueue_tail(int d) { + struct Node *new_node = malloc(sizeof(new_node)); + + new_node->data = d; + new_node->next = tail; + new_node->prev = NULL; + if (tail != NULL) + tail->prev = new_node; + tail = new_node; + if (head == NULL) + head = tail; + +// printf("enqueue_tail new node data: %d\n", new_node->data); +// printf("enqueue_tail new node: %p\n", (void*)new_node); +// printf("enqueue_tail next node: %p\n", (void*)new_node->next); +// printf("enqueue_tail prev node: %p\n", (void*)new_node->prev); +} + +void enqueue_head(int d) { + struct Node *new_node = malloc(sizeof(new_node)); + + new_node->data = d; + new_node->next = NULL; + new_node->prev = head; + if (head != NULL) + head->next = new_node; + head = new_node; + if (tail == NULL) + tail = head; + +// printf("enqueue_head new node data: %d\n", new_node->data); +// printf("enqueue_head new node: %p\n", (void*)new_node); +// printf("enqueue_head next node: %p\n", (void*)new_node->next); +// printf("enqueue_head prev node: %p\n", (void*)new_node->prev); +} + +int dequeue_tail(void) { + if (tail == NULL) + return -1; + +// printf("dequeue_tail tail: %p\n", (void*)tail); +// printf("dequeue_tail tail next: %p\n", (void*)tail->next); +// printf("dequeue_tail tail prev: %p\n", (void*)tail->prev); + + struct Node *t = tail; + int d = tail->data; + if (tail->next != NULL) + tail->next->prev = NULL; + tail = tail->next; + free(t); + return d; +} + +int dequeue_head(void) { + if (head == NULL) + return -1; + +// printf("A. dequeue_head head: %p\n", (void*)head); +// printf("A. dequeue_head head next: %p\n", (void*)head->next); +// printf("A. dequeue_head head prev: %p\n", (void*)head->prev); + + struct Node *t = head; + int d = head->data; + if (head->prev != NULL) { + head->prev->next = NULL; + } + head = head->prev; + +// printf("B. dequeue_head head: %p\n", (void*)head); +// printf("B. dequeue_head head next: %p\n", (void*)((head == NULL) ? NULL : head->next)); +// printf("B. dequeue_head head prev: %p\n", (void*)((head == NULL) ? NULL : head->prev)); + + free(t); + return d; +} + +int main(int argc, char **argv) { + int i; + for (i = 0; i < 20; i++){ + printf("enqueue tail: %d\n", i); + enqueue_tail(i); + } + for (i = 0; i < 20; i++) { + printf("dequeue tail: %d\n", dequeue_tail()); + } + + for (i = 0; i < 20; i++){ + printf("enqueue head: %d\n", i); + enqueue_head(i); + } + for (i = 0; i < 20; i++) { + printf("dequeue head: %d\n", dequeue_head()); + } + + for (i = 0; i < 10; i++){ + printf("enqueue head: %d\n", i); + enqueue_head(i); + } + for (i = 10; i < 20; i++){ + printf("enqueue tail: %d\n", i); + enqueue_head(i); + } + for (i = 0; i < 20; i++) { + printf("dequeue tail: %d\n", dequeue_tail()); + } + return 0; +} diff --git a/tests/jpoirier/00_linked_list.expect b/tests/jpoirier/00_linked_list.expect new file mode 100644 index 0000000..1494366 --- /dev/null +++ b/tests/jpoirier/00_linked_list.expect @@ -0,0 +1,120 @@ +enqueue tail: 0 +enqueue tail: 1 +enqueue tail: 2 +enqueue tail: 3 +enqueue tail: 4 +enqueue tail: 5 +enqueue tail: 6 +enqueue tail: 7 +enqueue tail: 8 +enqueue tail: 9 +enqueue tail: 10 +enqueue tail: 11 +enqueue tail: 12 +enqueue tail: 13 +enqueue tail: 14 +enqueue tail: 15 +enqueue tail: 16 +enqueue tail: 17 +enqueue tail: 18 +enqueue tail: 19 +dequeue tail: 19 +dequeue tail: 18 +dequeue tail: 17 +dequeue tail: 16 +dequeue tail: 15 +dequeue tail: 14 +dequeue tail: 13 +dequeue tail: 12 +dequeue tail: 11 +dequeue tail: 10 +dequeue tail: 9 +dequeue tail: 8 +dequeue tail: 7 +dequeue tail: 6 +dequeue tail: 5 +dequeue tail: 4 +dequeue tail: 3 +dequeue tail: 2 +dequeue tail: 1 +dequeue tail: 0 +enqueue head: 0 +enqueue head: 1 +enqueue head: 2 +enqueue head: 3 +enqueue head: 4 +enqueue head: 5 +enqueue head: 6 +enqueue head: 7 +enqueue head: 8 +enqueue head: 9 +enqueue head: 10 +enqueue head: 11 +enqueue head: 12 +enqueue head: 13 +enqueue head: 14 +enqueue head: 15 +enqueue head: 16 +enqueue head: 17 +enqueue head: 18 +enqueue head: 19 +dequeue head: 19 +dequeue head: 18 +dequeue head: 17 +dequeue head: 16 +dequeue head: 15 +dequeue head: 14 +dequeue head: 13 +dequeue head: 12 +dequeue head: 11 +dequeue head: 10 +dequeue head: 9 +dequeue head: 8 +dequeue head: 7 +dequeue head: 6 +dequeue head: 5 +dequeue head: 4 +dequeue head: 3 +dequeue head: 2 +dequeue head: 1 +dequeue head: 0 +enqueue head: 0 +enqueue head: 1 +enqueue head: 2 +enqueue head: 3 +enqueue head: 4 +enqueue head: 5 +enqueue head: 6 +enqueue head: 7 +enqueue head: 8 +enqueue head: 9 +enqueue tail: 10 +enqueue tail: 11 +enqueue tail: 12 +enqueue tail: 13 +enqueue tail: 14 +enqueue tail: 15 +enqueue tail: 16 +enqueue tail: 17 +enqueue tail: 18 +enqueue tail: 19 +dequeue tail: 0 +dequeue tail: 1 +dequeue tail: 2 +dequeue tail: 3 +dequeue tail: 4 +dequeue tail: 5 +dequeue tail: 6 +dequeue tail: 7 +dequeue tail: 8 +dequeue tail: 9 +dequeue tail: 10 +dequeue tail: 11 +dequeue tail: 12 +dequeue tail: 13 +dequeue tail: 14 +dequeue tail: 15 +dequeue tail: 16 +dequeue tail: 17 +dequeue tail: 18 +dequeue tail: 19 diff --git a/tests/jpoirier/Makefile b/tests/jpoirier/Makefile new file mode 100644 index 0000000..e4f356b --- /dev/null +++ b/tests/jpoirier/Makefile @@ -0,0 +1,2 @@ +JPOIRIER_TESTS= jpoirier/00_linked_list.test \ +