Commit 38d3248

mo khan <mo.khan@gmail.com>
2020-07-04 18:58:24
Split main_stack.c
1 parent 93acf97
src/01/01a/main.c
@@ -5,7 +5,6 @@
 int main(int argc, char *argv[])
 {
   printf("=== COMP-272 - Assignment 1 - Question 1a ===\n");
-  printf("%lu\n", sizeof(int));
   PriorityQueue *queue = initialize();
 
   for (int i = 0; i < 10; i++) {
src/01/01b/main.c
@@ -0,0 +1,8 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+int main(int argc, char *argv[])
+{
+  printf("=== COMP-272 - Assignment 1 - Question 1b ===\n");
+  return 0;
+}
src/01/01b/Makefile
@@ -0,0 +1,37 @@
+#!/usr/bin/make -f
+SHELL=/bin/sh
+
+CC=clang
+TEST_LIBS = -lcgreen
+
+BUILDDIR := build
+OBJS := $(addprefix $(BUILDDIR)/,min_stack.o)
+TEST_OBJS := $(addprefix $(BUILDDIR)/,min_stack_test.o)
+
+$(BUILDDIR)/%.o : %.c
+	$(COMPILE.c) $(OUTPUT_OPTION) $<
+
+.PHONY: all
+all: $(OBJS) $(BUILDDIR)/main.o
+	$(CC) $(OBJS) $(BUILDDIR)/main.o -o $(BUILDDIR)/program
+
+.PHONY: test
+test: $(OBJS) $(TEST_OBJS)
+	$(CC) $(OBJS) $(TEST_OBJS) $(TEST_LIBS) -o $(BUILDDIR)/test
+
+$(OBJS): | $(BUILDDIR)
+
+$(TEST_OBJS): | $(BUILDDIR)
+
+$(BUILDDIR):
+	mkdir $(BUILDDIR)
+
+.PHONY: clean
+clean:
+	rm -fr build
+
+run : all
+	./build/program
+
+run_test : test
+	cgreen-runner -c -v $(BUILDDIR)/test
src/01/01b/min_stack.c
@@ -0,0 +1,72 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include "min_stack.h"
+
+Stack *initialize() {
+  Stack *self = malloc(sizeof(Stack));
+  self->head = NULL;
+  return self;
+}
+
+int size(Stack *self) {
+  Node *current = self->head;
+  int i;
+  for (i = 0; current != NULL; i++)
+    current = current->next;
+  return i;
+}
+
+static Node *new(int data) {
+  Node *node = malloc(sizeof(Node));
+  node->next = NULL;
+  node->data = data;
+  return node;
+}
+
+static int compare(int x, int y) {
+  return x == y ? 0 : (x > y) ? 1 : -1;
+}
+
+static void insert(Node **self, int data) {
+  int comparison = compare(data, (*self)->data);
+  Node *node = new(data);
+
+  switch(comparison) {
+    case 1:
+      if ((*self)->next)
+        insert(&((*self)->next), data);
+      else
+        (*self)->next = node;
+      break;
+    default:
+      node->next = *self;
+      *self = node;
+      break;
+  }
+}
+
+void push(Stack *self, int data) {
+  if (self->head)
+    insert(&self->head, data);
+  else
+    self->head = new(data);
+}
+
+int min(Stack *self) {
+  if (self && self->head)
+    return self->head->data;
+
+  return (int)NULL;
+}
+
+int pop(Stack *self) {
+  if (!self->head)
+    return (int)NULL;
+
+  Node *current = self->head;
+  int data = current->data;
+  self->head = current->next;
+  current->next = NULL;
+  free(current);
+  return data;
+}
src/01/01b/min_stack.h
@@ -0,0 +1,16 @@
+struct node {
+  int data;
+  struct node *next;
+};
+
+typedef struct node Node;
+
+typedef struct {
+  Node *head;
+} Stack;
+
+Stack *initialize();
+int size(Stack *self);
+void push(Stack *self, int data);
+int min(Stack *self);
+int pop(Stack *self);
src/01/01b/min_stack_test.c
@@ -1,4 +1,5 @@
 #include <cgreen/cgreen.h>
+#include "min_stack.h"
 
 /*
    Design and implement a `MinStack` data structure that can store
@@ -9,92 +10,12 @@
  * `size()`
  * `min()`
  All operations should run in constant time.
- */
+*/
 
 Describe(MinStack);
 BeforeEach(MinStack){ }
 AfterEach(MinStack){ }
 
-struct node {
-  int data;
-  struct node *next;
-};
-
-typedef struct node Node;
-
-typedef struct {
-  Node *head;
-} Stack;
-
-static Stack *initialize() {
-  Stack *self = malloc(sizeof(Stack));
-  self->head = NULL;
-  return self;
-}
-
-static int size(Stack *self) {
-  Node *current = self->head;
-  int i;
-  for (i = 0; current != NULL; i++)
-    current = current->next;
-  return i;
-}
-
-static Node *new(int data) {
-  Node *node = malloc(sizeof(Node));
-  node->next = NULL;
-  node->data = data;
-  return node;
-}
-
-static int compare(int x, int y) {
-  return x == y ? 0 : (x > y) ? 1 : -1;
-}
-
-static void insert(Node **self, int data) {
-  int comparison = compare(data, (*self)->data);
-  Node *node = new(data);
-
-  switch(comparison) {
-    case 1:
-      if ((*self)->next)
-        insert(&((*self)->next), data);
-      else
-        (*self)->next = node;
-      break;
-    default:
-      node->next = *self;
-      *self = node;
-      break;
-  }
-}
-
-static void push(Stack *self, int data) {
-  if (self->head)
-    insert(&self->head, data);
-  else
-    self->head = new(data);
-}
-
-static int min(Stack *self) {
-  if (self && self->head)
-    return self->head->data;
-
-  return (int)NULL;
-}
-
-static int pop(Stack *self) {
-  if (!self->head)
-    return (int)NULL;
-
-  Node *current = self->head;
-  int data = current->data;
-  self->head = current->next;
-  current->next = NULL;
-  free(current);
-  return data;
-}
-
 Ensure(MinStack, when_empty) {
   Stack *stack = initialize();
 
@@ -169,3 +90,9 @@ TestSuite *min_stack_tests() {
   add_test_with_context(suite, MinStack, when_pushing_multiple_integers_out_of_order);
   return suite;
 }
+
+int main(int argc, char **argv) {
+  TestSuite *suite = create_test_suite();
+  add_suite(suite, min_stack_tests());
+  return run_test_suite(suite, create_text_reporter());
+}