Monday, November 8, 2010

My First Objective-C

List.h:

#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