====October 17, 2013====
Matt finished the make file for our stack program. Matt's code is included at the bottom of this entry. Information on Make files can be found [[http://lab46.corning-cc.edu/documentation/makefile|here]]. To use Matt's Make file:
__**On a lab46 terminal:**__
$ cd /var/public/data/fall2013/linkedlistimp
**Then copy the contents of the directory:**
* **To copy into your ~/src/datas/ directory:**
$ make copy
* **To copy into a different directory:**
$ cp -a ~/src/dir
__**In Matt's Make file:**__
* Variables are at the top.
* Then there are "Labels" that run a set of "rules".
* Written in "MAKEFILE" and runs set of Bash commands.
* The **/inc** directory contains only headers.
* The **/lib** directory contains only libraries.
* The **/src** directory contains only the source code. //**Note:** The parts rule equals the running of the shell command. This means Matt's Make file will only work on a Unix system.//
* **ar:** Sets up the archiver.
* **cc:** Sets up the compiler.
* **src:** Lists all .c files in the src directory.
* **obj:** Turns every .c file into a .o object file.
* **lib:** Finds the current directory the script is in.
* **all:** Compiles src, handles objects, handles libraries.
* **debug rule:** Checks to see if the source code was compiled with debug symbols.
* **lib rule:** Checks library information.
* **clean rule:** Removes all .o object files.
* **testing dir:** Makes the libraries, renames the executable from the source code, then builds the final executable.
__**To use Matt's Make file:**__
- $ make
- $ ls lib Shows the newly made .lib files.
- $ make clean Removes all the object files.
- $ make debug Builds the source code with debugging symbols. Not required but good practice; can also use "make".
- **The terminal output for Matt's Make file:** lab46:~/src/datas/linkedlistimp$ make
make[1]: Entering directory `/home/nbrimme1/src/datas/linkedlistimp/src'
make[2]: Entering directory `/home/nbrimme1/src/datas/linkedlistimp/src/list'
[L] ... SUCCESS
make[2]: Leaving directory `/home/nbrimme1/src/datas/linkedlistimp/src/list'
make[2]: Entering directory `/home/nbrimme1/src/datas/linkedlistimp/src/node'
[B] cp.c ... OK
[B] mk.c ... OK
[B] rm.c ... OK
[L] ... SUCCESS
make[2]: Leaving directory `/home/nbrimme1/src/datas/linkedlistimp/src/node'
make[2]: Entering directory `/home/nbrimme1/src/datas/linkedlistimp/src/stack'
[B] peek.c ... peek.c: In function 'peek':
peek.c:6: warning: control reaches end of non-void function
OK
[B] pop.c ... OK
[B] push.c ... OK
[B] stackops.c ... OK
[L] ... SUCCESS
make[2]: Leaving directory `/home/nbrimme1/src/datas/linkedlistimp/src/stack'
make[1]: Leaving directory `/home/nbrimme1/src/datas/linkedlistimp/src'
lab46:~/src/datas/linkedlistimp$ ls lib
liblist.a libnode.a libstack.a
lab46:~/src/datas/linkedlistimp$ make clean
make[1]: Entering directory `/home/nbrimme1/src/datas/linkedlistimp/src'
make[2]: Entering directory `/home/nbrimme1/src/datas/linkedlistimp/src/list'
rm -f *.o core
make[2]: Leaving directory `/home/nbrimme1/src/datas/linkedlistimp/src/list'
make[2]: Entering directory `/home/nbrimme1/src/datas/linkedlistimp/src/node'
rm -f *.o cp.o mk.o rm.o core
make[2]: Leaving directory `/home/nbrimme1/src/datas/linkedlistimp/src/node'
make[2]: Entering directory `/home/nbrimme1/src/datas/linkedlistimp/src/stack'
rm -f *.o peek.o pop.o push.o stackops.o core
make[2]: Leaving directory `/home/nbrimme1/src/datas/linkedlistimp/src/stack'
make[1]: Leaving directory `/home/nbrimme1/src/datas/linkedlistimp/src'
make[1]: Entering directory `/home/nbrimme1/src/datas/linkedlistimp/testing'
rm -f *.o stacktest core
make[1]: Leaving directory `/home/nbrimme1/src/datas/linkedlistimp/testing'
lab46:~/src/datas/linkedlistimp$ make debug
make[1]: Entering directory `/home/nbrimme1/src/datas/linkedlistimp/src'
make[2]: Entering directory `/home/nbrimme1/src/datas/linkedlistimp/src/list'
ar rcs ../../lib/liblist.a
make[2]: Leaving directory `/home/nbrimme1/src/datas/linkedlistimp/src/list'
make[2]: Entering directory `/home/nbrimme1/src/datas/linkedlistimp/src/node'
gcc -Wall -I ../../inc -DDEBUG -g -c cp.c
gcc -Wall -I ../../inc -DDEBUG -g -c mk.c
gcc -Wall -I ../../inc -DDEBUG -g -c rm.c
ar rcs ../../lib/libnode.a cp.o mk.o rm.o
make[2]: Leaving directory `/home/nbrimme1/src/datas/linkedlistimp/src/node'
make[2]: Entering directory `/home/nbrimme1/src/datas/linkedlistimp/src/stack'
gcc -Wall -I ../../inc -DDEBUG -g -c peek.c
peek.c: In function 'peek':
peek.c:6: warning: control reaches end of non-void function
gcc -Wall -I ../../inc -DDEBUG -g -c pop.c
gcc -Wall -I ../../inc -DDEBUG -g -c push.c
gcc -Wall -I ../../inc -DDEBUG -g -c stackops.c
ar rcs ../../lib/libstack.a peek.o pop.o push.o stackops.o
make[2]: Leaving directory `/home/nbrimme1/src/datas/linkedlistimp/src/stack'
make[1]: Leaving directory `/home/nbrimme1/src/datas/linkedlistimp/src'
lab46:~/src/datas/linkedlistimp$
\\
__**Matt's Code:**__
* **/src/datas/linkedlistimp**
* **/inc**
* **list.h**
#ifndef _LIST_H
#define _LIST_H
#include "node.h"
struct list {
Node *start;
Node *end;
int qty;
};
typedef struct list List;
List *mklist();
List *insert(List *, Node *, Node *);
List *append(List *, Node *, Node *);
List *removeNode(List *, Node **);
void displayf(List *);
void displayb(List *);
List *clearlist(List *);
List *sortlist(List *);
#endif
* **node.h**
#ifndef _NODE_H
#define _NODE_H
#include
struct node {
struct node *next;
struct node *prev;
int value;
};
typedef struct node Node;
Node *mknode(int);
void rmnode(Node **);
Node *cpnode(Node *);
#endif
* **queue.h**
#ifndef _QUEUE_H
#define _QUEUE_H
#include "list.h"
struct queue {
List *data;
Node *front;
Node *back;
int bufsize;
};
typedef struct queue Queue;
Queue *mkqueue(int);
Queue *enqueue(Queue *, Node *);
Node *dequeue(Queue **);
#endif
* **stack.h**
#ifndef _STACK_H
#define _STACK_H
#include "list.h"
struct stack {
List *data;
Node *top;
int size;
};
typedef struct stack Stack;
Stack *mkstack(int);
Stack *push (Stack *, Node *);
Node *pop (Stack **);
Node *peek (Stack *);
#endif
* **/lib**
* **liblist.a**: Library file for list.c.
* **libnode.a**: Library file for node.c.
* **libstack.a**: Library file for stack.c.
* **/src**
* **/src/list**
* **Makefile**
CFLAGS = -Wall
INC = -I ../../inc
AR = ar
CC = gcc $(CFLAGS) $(INC)
SRC = $(shell /bin/ls -1 *.c 2>/dev/null)
OBJ = $(SRC:.c=.o)
LIB = $(shell /bin/pwd | /bin/sed 's/^.*\///')
all: $(SRC) $(OBJ) lib
debug: CC += -DDEBUG -g
debug: DEBUG = debug
debug: $(SRC) $(OBJ) lib
.c.o:
ifneq ($(MAKECMDGOALS),debug)
@printf "[B] %-20s ... " "$<"
@$(CC) -c $< && echo "OK" || echo "FAIL"
else
$(CC) -c $<
endif
lib:
ifneq ($(MAKECMDGOALS),debug)
@printf "[L] %-20s ... " "$<"
@$(AR) rcs ../../lib/lib$(LIB).a $(OBJ) && echo "SUCCESS" || echo "FAIL"
else
$(AR) rcs ../../lib/lib$(LIB).a $(OBJ)
endif
clean:
rm -f *.o $(OBJ) core
* **/src/node**
* **Makefile**
CFLAGS = -Wall
INC = -I ../../inc
AR = ar
CC = gcc $(CFLAGS) $(INC)
SRC = $(shell /bin/ls -1 *.c 2>/dev/null)
OBJ = $(SRC:.c=.o)
LIB = $(shell /bin/pwd | /bin/sed 's/^.*\///')
all: $(SRC) $(OBJ) lib
debug: CC += -DDEBUG -g
debug: DEBUG = debug
debug: $(SRC) $(OBJ) lib
.c.o:
ifneq ($(MAKECMDGOALS),debug)
@printf "[B] %-20s ... " "$<"
@$(CC) -c $< && echo "OK" || echo "FAIL"
else
$(CC) -c $<
endif
lib:
ifneq ($(MAKECMDGOALS),debug)
@printf "[L] %-20s ... " "$<"
@$(AR) rcs ../../lib/lib$(LIB).a $(OBJ) && echo "SUCCESS" || echo "FAIL"
else
$(AR) rcs ../../lib/lib$(LIB).a $(OBJ)
endif
clean:
rm -f *.o $(OBJ) core
* **/src/node**
* **cp.c**
#include "node.h"
Node *cpnode(Node *tmp)
{
Node *newNode = mknode(tmp -> value);
newNode -> prev = newNode -> next = NULL;
return(newNode);
}
* **mk.c**
#include "node.h"
Node *mknode(int value)
{
Node *tmp = (Node *) malloc (sizeof(Node));
tmp -> prev = tmp -> next = NULL;
tmp -> value = value;
return(tmp);
}
* **rm.c**
#include "node.h"
void rmnode(Node **tmp)
{
if ((*tmp) -> prev != NULL)
{
(*tmp) -> prev -> next = (*tmp) -> next;
}
if ((*tmp) -> next != NULL)
{
(*tmp) -> next -> prev = (*tmp) -> prev;
}
(*tmp) -> prev = (*tmp) -> next = NULL;
}
* **cp.o**: Object file for cp.c
* **mk.o**: Object file for mk.o
* **rm.o**: Object file for rm.o
* **/src/stack**
* **Makefile**
CFLAGS = -Wall
INC = -I ../../inc
AR = ar
CC = gcc $(CFLAGS) $(INC)
SRC = $(shell /bin/ls -1 *.c 2>/dev/null)
OBJ = $(SRC:.c=.o)
LIB = $(shell /bin/pwd | /bin/sed 's/^.*\///')
all: $(SRC) $(OBJ) lib
debug: CC += -DDEBUG -g
debug: DEBUG = debug
debug: $(SRC) $(OBJ) lib
.c.o:
ifneq ($(MAKECMDGOALS),debug)
@printf "[B] %-20s ... " "$<"
@$(CC) -c $< && echo "OK" || echo "FAIL"
else
$(CC) -c $<
endif
lib:
ifneq ($(MAKECMDGOALS),debug)
@printf "[L] %-20s ... " "$<"
@$(AR) rcs ../../lib/lib$(LIB).a $(OBJ) && echo "SUCCESS" || echo "FAIL"
else
$(AR) rcs ../../lib/lib$(LIB).a $(OBJ)
endif
clean:
rm -f *.o $(OBJ) core
* **peek.c**
#include "stack.h"
Node *peek(Stack *myStack)
{
// exercise left to the implementer
}
* **pop.c**
#include "stack.h"
Node *pop(Stack **myStack)
{
Node *tmp = NULL;
if ((*myStack) != NULL)
{
tmp = (*myStack) -> data -> end;
(*myStack) -> data = removeNode((*myStack) -> data, &tmp);
(*myStack) -> top = (*myStack) -> data -> end;
}
return (tmp);
}
* **push.c**
#include "stack.h"
Stack *push(Stack *myStack, Node *newNode)
{
if ((myStack -> size <= 0) || ((myStack -> data -> qty) < (myStack -> size)))
{
myStack -> data = append(myStack -> data, myStack -> data -> end, newNode);
myStack -> top = myStack -> data -> end;
}
return(myStack);
}
* **stackops.c**
#include "stack.h"
Stack *mkstack(int size)
{
Stack *myStack;
myStack = (Stack *) malloc (sizeof(Stack));
myStack -> data = mklist();
myStack -> size = size;
myStack -> top = myStack -> data -> end;
return (myStack);
}
* **peek.o**: Object file for peek.c.
* **pop.o**: Object file for pop.c.
* **push.o**: Object file for push.c.
* **stackops.o**: Object file for stackops.c.
* **Makefile**
SHELL = /bin/bash -e
CC = g++ $(CFLAGS) $(OPTS) $(INC)
INC = -I ../include/
CFLAGS = -Wall
OBJ = $(shell find . -name *.o)
OPTS =
PARTS = $(shell /bin/ls -1Ad * | grep -v 'Makefile')
AR = ar
DEBUG =
default: libs
debug: CC += -DDEBUG -g
debug: DEBUG = debug
debug: libs
libs:
@for i in $(PARTS); do make -C $$i $(DEBUG); echo; done
@echo
clean:
@for i in $(PARTS); do make -C $$i clean; done
@rm -f ${LIB}
* **/testing**
* **Makefile**
SHELL = /bin/bash -e
INC = -I inc/
CCFLAGS = -Wall
OPTS =
CC = gcc $(CCFLAGS) $(OPTS) $(INC)
OBJ =
AR = ar
DEBUG =
LIBS = src
UNIT = testing
ALL = $(LIBS) testing
BIN =
default: libs testing
debug: libs-debug testing-debug
#default: $(LIBS) $(BIN)
libs-debug: CC += -DDEBUG -g
libs-debug: DEBUG = debug
libs-debug: libs
libs:
@for i in $(LIBS); do make -C $$i $(DEBUG); echo; done
@echo
testing-debug: CC += -DDEBUG -g
testing-debug: DEBUG = debug
testing-debug: testing
testing:
@for i in $(UNIT); do make -C $$i $(DEBUG); echo; done
@echo
clean:
@for i in $(ALL); do make -C $$i clean; done
# @rm -f bin/*
copy:
mkdir -p ~/src/data/linkedlistimp
cp -av /var/public/data/fall2013/linkedlistimp/* ~/src/data/linkedlistimp/
help:
@echo
@echo "****************[ Data Structures List Implementation ]*****************"
@echo "** make - build everything **"
@echo "** make debug - build everything with debug symbols **"
@echo "** **"
@echo "** make testing - build unit tests **"
@echo "** make testing-debug - build unit tests with debugging symbols **"
@echo "** make libs - build all supporting libraries **"
@echo "** make libs-debug - build all libraries with debug symbols **"
@echo "** **"
@echo "** make clean - clean; remove all objects/compiled code **"
@echo "** make help - this information **"
@echo "************************************************************************"
* **stacktest.c**
#include
#include "stack.h"
int main()
{
Node *tmp;
Stack *myStack;
myStack = mkstack(0);
tmp = create();
tmp -> value = fgetc(stdin);
fgetc(stdin);
while(tmp->value != '\n')
{
myStack = push(myStack, tmp);
tmp = create();
tmp->value = fgetc(stdin);
fgetc(stdin);
}
fprintf(stdout, "linked list has %d nodes\n", myStack->data->qty);
fprintf(stdout, "String is: ");
do {
tmp = pop(&myStack);
if(tmp != NULL)
{
fprintf(stdout, "%c", tmp->value);
}
rmnode(*tmp);
}
while(tmp != NULL);
fprintf(stdout, "\n");
return(0);
}
* **Makefile**
SHELL = /bin/bash -e
INC = -I inc/
CCFLAGS = -Wall
OPTS =
CC = gcc $(CCFLAGS) $(OPTS) $(INC)
OBJ =
AR = ar
DEBUG =
LIBS = src
UNIT = testing
ALL = $(LIBS) testing
BIN =
default: libs testing
debug: libs-debug testing-debug
#default: $(LIBS) $(BIN)
libs-debug: CC += -DDEBUG -g
libs-debug: DEBUG = debug
libs-debug: libs
libs:
@for i in $(LIBS); do make -C $$i $(DEBUG); echo; done
@echo
testing-debug: CC += -DDEBUG -g
testing-debug: DEBUG = debug
testing-debug: testing
testing:
@for i in $(UNIT); do make -C $$i $(DEBUG); echo; done
@echo
clean:
@for i in $(ALL); do make -C $$i clean; done
# @rm -f bin/*
copy:
mkdir -p ~/src/data/linkedlistimp
cp -av /var/public/data/fall2013/linkedlistimp/* ~/src/data/linkedlistimp/
help:
@echo
@echo "****************[ Data Structures List Implementation ]*****************"
@echo "** make - build everything **"
@echo "** make debug - build everything with debug symbols **"
@echo "** **"
@echo "** make testing - build unit tests **"
@echo "** make testing-debug - build unit tests with debugging symbols **"
@echo "** make libs - build all supporting libraries **"
@echo "** make libs-debug - build all libraries with debug symbols **"
@echo "** **"
@echo "** make clean - clean; remove all objects/compiled code **"
@echo "** make help - this information **"
@echo "************************************************************************"
I'm finding that GDB is quickly becoming an indispensable and invaluable tool when finding and fixing bugs. The command alias **gcc='gcc -g'** won't negatively effect anything in the future, so I'll make it an alias. Also, Google has some nice GDB "cheat sheets" that will come in handy.
I had the idea to use 2 lists instead of modifying just 1. My logic is complicated and that logic seems far more simpler; and hopefully simpler to implement.
**Pseudocode/Logic steps:**
- Create 2 lists: (Not sure this will work; Could copy tmp's list into tmp2's list, then call clearList() on tmp2?).
- tmp -> unsorted list.
- tmp2 -> sorted list.
- Find the lowest value in tmp's list
- Insert that value into tmp2's list
- Remove the lowest value from tmp's list
- Repeat steps 2-4 until the program is at the end of the tmp's list.
- Not sure if this is needed; delete empty tmp list?
- Display tmp2's sorted list.
[[http://lab46.corning-cc.edu/opus/fall2013/nbrimme1/start|Back to my Opus]]