#import <objc/Object.h> @interface List : Object // List is a subclass of the superclass Object { int list[100]; // These are instance variables. int size; } /* Public methods */ - free; - (int) addEntry: (int) num; - print; /* Private methods */ /* Other programs should not use these methods. */ - resetSize; @end
List.m:
#import "List.h" @implementation List + new // factory method { self = [super new]; [self resetSize]; return self; } - free { return [super free]; } - (int) addEntry: (int) num { list[size++] = num; return size; } - print { int i; printf("\n"); for (i = 0; i < size; ++i) printf ("%i ", list[i]); puts(""); return self; // Always return self // if n othing else makes sense. } - resetSize { size = 0; return self; }Stack.h:
#import <objc/Object.h> typedef struct StackLink { struct StackLink *next; //void *data; int data; } StackLink; @interface Stack : Object { StackLink *top; unsigned int size; } - free; - push: (int) anInt; - addEntry: (int) anInt; - (int) pop; - (unsigned int) size; @endStack.m:
#import "Stack.h" #import <stdlib.h> @implementation Stack #define NULL_LINK (StackLink *) 0 + new { self = [super new]; top = NULL_LINK; //(StackLink *) 0; return self; } - free { StackLink *next; while (top != NULL_LINK) { next = top->next; free ((char *) top); top = next; } return [super free]; } - push: (int) value { StackLink *newLink; newLink = (StackLink *) malloc (sizeof (StackLink)); if (newLink == 0) { fprintf(stderr, "Out of memory\n"); return nil; } newLink->data = value; newLink->next = top; top = newLink; size++; return self; } - addEntry: (int) value { return [self push: value]; } - (int) pop { int value; StackLink *topLink; if (0 != size) { topLink = top; top = top->next; value = topLink->data; free (topLink); size--; } else { value = 0; } return value; } - (unsigned int) size { return size; } - print { StackLink *startLink; int i = size; startLink = top; while (startLink) { printf("Stack[%d] = %d\n", i, startLink->data); startLink = startLink->next; i--; } return self; } @endmain.m:
#import <objc/Object.h> #import "List.h" #import "Stack.h" //int main(int argc, char *argv[]) void perform (id obj) { [obj addEntry: 5]; [obj print]; [obj addEntry: 6]; [obj addEntry: 3]; [obj print]; } main() { id list; list = [List new]; perform(list); [list free]; id stack; stack = [Stack new]; perform(stack); [stack free]; printf("\n"); return 0; }Makefile:
.SUFFIXES: .o .m .m.o: $(CC) -c $(CFLAGS) $< -o $@ # Macros CC=gcc #CFLAGS=-Wall -Wno-import -mtune=core2 -mfpmath=sse -ffast-math -msse3 -fobjc-exceptions CFLAGS=-Wno-import -mtune=core2 -g LDFLAGS=-lobjc SRCS=main.m List.m Stack.m OBJS=$(SRCS:.m=.o) EXECUTABLE=main .PHONY: all all: $(EXECUTABLE) $(EXECUTABLE): $(OBJS) $(CC) $(LDFLAGS) -o $@ $(OBJS) #$(OBJS): $(SRCS) # echo "$(CC) -c $(CFLAGS) $< -o $@" clean: rm -f *.o $(EXECUTABLE) TAGS: $(SRCS) ctags -R $(SRCS)