#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;
@end
Stack.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;
}
@end
main.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)
No comments:
Post a Comment