home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 January
/
usenetsourcesnewsgroupsinfomagicjanuary1994.iso
/
answers
/
Objective-C
/
sample
< prev
next >
Wrap
Text File
|
1993-12-20
|
29KB
|
1,222 lines
Path: senator-bedfellow.mit.edu!bloom-beacon.mit.edu!xlink.net!zib-berlin.de!netmbx.de!Germany.EU.net!EU.net!sun4nl!tuegate.tue.nl!krait.es.ele.tue.nl!tiggr
From: tiggr@es.ele.tue.nl (Tiggr)
Newsgroups: comp.lang.objective-c,comp.answers,news.answers
Subject: comp.lang.objective-c FAQ, part 3/3: A Sample Program
Supersedes: <sample_753551527@es.ele.tue.nl>
Followup-To: comp.lang.objective-c
Date: 20 Dec 1993 16:26:21 GMT
Organization: Eindhoven University of Technology
Lines: 1202
Approved: news-answers-request@mit.edu
Expires: 29 Jan 1994 16:26:13 GMT
Message-ID: <sample_756404773@es.ele.tue.nl>
Reply-To: tiggr@es.ele.tue.nl (Tiggr)
NNTP-Posting-Host: krait.es.ele.tue.nl
Summary: This third part of the comp.lang.objective-c FAQ postings
presents a simple sample program written in Objective-C.
Originator: tiggr@krait.es.ele.tue.nl
Xref: senator-bedfellow.mit.edu comp.lang.objective-c:1830 comp.answers:3103 news.answers:16033
Archive-name: Objective-C/sample
Version: $Id: sample.preamble,v 2.2 1993/12/17 15:18:42 tiggr Exp $
A simple sample
Objective-C program
This is the third part in a series of three informational postings
concerning comp.lang.objective-c. This article presents a simple program
written in Objective-C. The program consist of several files which are
contained in a shar file (see instructions below on how to unpack).
The early version of this FAQ was compiled by Bill Shirley, with the aid of
many people. The current version is being maintained by Tiggr, aided by a
lot of people, including Paul Sanchez and Bill Shirley.
Send your suggestions, additions, bug reports, comments and fixes to
`tiggr@es.ele.tue.nl'.
#---------------------------------- cut here ----------------------------------
# This is a shell archive. Remove anything before this line,
# then unpack it by saving it in a file and typing "sh file".
#
# Wrapped by Pieter Schoenmakers <tiggr@viper> on Fri Dec 17 16:18:49 1993
#
# This archive contains:
# objc-sample
#
# Existing files will not be overwritten.
# Error checking via wc(1) will be performed.
LANG=""; export LANG
PATH=/bin:/usr/bin:$PATH; export PATH
echo mkdir - objc-sample
mkdir objc-sample
if test -f objc-sample/README
then
echo Ok to overwrite existing file objc-sample/README\?
read answer
case "$answer" in
[yY]*) echo Proceeding;;
*) echo Aborting; exit 1;;
esac
rm -f objc-sample/README
if test -f objc-sample/README
then
echo Error: could not remove objc-sample/README, aborting
exit 1
fi
fi
echo x - objc-sample/README
cat >objc-sample/README <<'@EOF'
This directory contains the complete code for the "Simple Sample Objective-C
program" described in the comp.lang.objective-c FAQ. If you have a suitable
compiler, use the supplied Makefile. Otherwise, program output can be found
in the file "output".
You should probably read "main.m" first. It is very heavily annotated.
Also note and read the file COPYRIGHT.
@EOF
set `wc -lwc <objc-sample/README`
if test $1$2$3 != 855366
then
echo ERROR: wc results of objc-sample/README are $* should be 8 55 366
fi
chmod 644 objc-sample/README
if test -f objc-sample/Char.h
then
echo Ok to overwrite existing file objc-sample/Char.h\?
read answer
case "$answer" in
[yY]*) echo Proceeding;;
*) echo Aborting; exit 1;;
esac
rm -f objc-sample/Char.h
if test -f objc-sample/Char.h
then
echo Error: could not remove objc-sample/Char.h, aborting
exit 1
fi
fi
echo x - objc-sample/Char.h
cat >objc-sample/Char.h <<'@EOF'
#import <objc/Object.h>
@interface Char: Object
{
int value;
}
- init: (int) x;
- report;
@end
@EOF
set `wc -lwc <objc-sample/Char.h`
if test $1$2$3 != 1116100
then
echo ERROR: wc results of objc-sample/Char.h are $* should be 11 16 100
fi
chmod 644 objc-sample/Char.h
if test -f objc-sample/Node.h
then
echo Ok to overwrite existing file objc-sample/Node.h\?
read answer
case "$answer" in
[yY]*) echo Proceeding;;
*) echo Aborting; exit 1;;
esac
rm -f objc-sample/Node.h
if test -f objc-sample/Node.h
then
echo Error: could not remove objc-sample/Node.h, aborting
exit 1
fi
fi
echo x - objc-sample/Node.h
cat >objc-sample/Node.h <<'@EOF'
// Node.h - comp.lang.objective-c simple sample Objective-C program
#include <objc/Object.h>
@interface Node : Object
{
id next;
id data;
}
+ new: anItem; // create a Node and store anItem in it
- free; // free a Node and return the item in it
- next; // report the id of the next node after this one
- set_next: aNode; // make the next node be aNode
@end
@EOF
set `wc -lwc <objc-sample/Node.h`
if test $1$2$3 != 1568379
then
echo ERROR: wc results of objc-sample/Node.h are $* should be 15 68 379
fi
chmod 644 objc-sample/Node.h
if test -f objc-sample/Node.m
then
echo Ok to overwrite existing file objc-sample/Node.m\?
read answer
case "$answer" in
[yY]*) echo Proceeding;;
*) echo Aborting; exit 1;;
esac
rm -f objc-sample/Node.m
if test -f objc-sample/Node.m
then
echo Error: could not remove objc-sample/Node.m, aborting
exit 1
fi
fi
echo x - objc-sample/Node.m
cat >objc-sample/Node.m <<'@EOF'
// Node.m - comp.lang.objective-c simple sample Objective-C program
#include <objc/Object.h>
#include "Node.h"
@implementation Node : Object
+ new: anItem
{
self = [super new];
next = 0;
data = anItem;
return self;
}
- free
{
id tmp = data;
[super free];
return tmp;
}
- next { return next; }
- set_next: aNode { next = aNode; return self; }
@end
@EOF
set `wc -lwc <objc-sample/Node.m`
if test $1$2$3 != 2762382
then
echo ERROR: wc results of objc-sample/Node.m are $* should be 27 62 382
fi
chmod 644 objc-sample/Node.m
if test -f objc-sample/Queue.h
then
echo Ok to overwrite existing file objc-sample/Queue.h\?
read answer
case "$answer" in
[yY]*) echo Proceeding;;
*) echo Aborting; exit 1;;
esac
rm -f objc-sample/Queue.h
if test -f objc-sample/Queue.h
then
echo Error: could not remove objc-sample/Queue.h, aborting
exit 1
fi
fi
echo x - objc-sample/Queue.h
cat >objc-sample/Queue.h <<'@EOF'
// Queue.h - comp.lang.objective-c simple sample Objective-C program
#import <objc/Object.h>
#import "Node.h"
@interface Queue : Object
{
id head;
id tail;
unsigned qsize;
}
+ new; // create a new Queue
- empty; // clear out all contents of the Queue
- put: anItem; // put anItem on the Queue
- get; // return the item on top of the Queue
- (unsigned) size; // tell us the current size of the Queue
@end
@EOF
set `wc -lwc <objc-sample/Queue.h`
if test $1$2$3 != 1974433
then
echo ERROR: wc results of objc-sample/Queue.h are $* should be 19 74 433
fi
chmod 644 objc-sample/Queue.h
if test -f objc-sample/Queue.m
then
echo Ok to overwrite existing file objc-sample/Queue.m\?
read answer
case "$answer" in
[yY]*) echo Proceeding;;
*) echo Aborting; exit 1;;
esac
rm -f objc-sample/Queue.m
if test -f objc-sample/Queue.m
then
echo Error: could not remove objc-sample/Queue.m, aborting
exit 1
fi
fi
echo x - objc-sample/Queue.m
cat >objc-sample/Queue.m <<'@EOF'
// Queue.m - comp.lang.objective-c simple sample Objective-C program
#import "Queue.h"
@implementation Queue
+ new
{
self = [super new];
head = tail = 0;
qsize = 0;
return self;
}
- empty
{
while([self size])
[[self get] free];
return self;
}
- put: anItem
{
if (tail)
tail = [[tail set_next : [Node new : anItem]] next];
else
head = tail = [Node new : anItem];
++qsize;
return self;
}
- get
{
id contents;
id old_head = head;
head = [head next];
contents = [old_head free];
if (--qsize == 0)
tail = head;
return contents;
}
- (unsigned) size { return qsize; }
@end
@EOF
set `wc -lwc <objc-sample/Queue.m`
if test $1$2$3 != 46105630
then
echo ERROR: wc results of objc-sample/Queue.m are $* should be 46 105 630
fi
chmod 644 objc-sample/Queue.m
if test -f objc-sample/Stack.h
then
echo Ok to overwrite existing file objc-sample/Stack.h\?
read answer
case "$answer" in
[yY]*) echo Proceeding;;
*) echo Aborting; exit 1;;
esac
rm -f objc-sample/Stack.h
if test -f objc-sample/Stack.h
then
echo Error: could not remove objc-sample/Stack.h, aborting
exit 1
fi
fi
echo x - objc-sample/Stack.h
cat >objc-sample/Stack.h <<'@EOF'
// Stack.h - comp.lang.objective-c simple sample Objective-C program
#import <objc/Object.h>
#import "Node.h"
@interface Stack : Object
{
id stack;
unsigned stack_size;
}
+ new; // create a new Stack
- empty; // clear out all contents of the Stack
- put: anItem; // put anItem on the Stack
- get; // return the item on top of the Stack
- (unsigned) size; // tell us the current size of the Stack
@end
@EOF
set `wc -lwc <objc-sample/Stack.h`
if test $1$2$3 != 1872421
then
echo ERROR: wc results of objc-sample/Stack.h are $* should be 18 72 421
fi
chmod 644 objc-sample/Stack.h
echo mkdir - objc-sample/RCS
mkdir objc-sample/RCS
if test -f objc-sample/RCS/Char.m,v
then
echo Ok to overwrite existing file objc-sample/RCS/Char.m,v\?
read answer
case "$answer" in
[yY]*) echo Proceeding;;
*) echo Aborting; exit 1;;
esac
rm -f objc-sample/RCS/Char.m,v
if test -f objc-sample/RCS/Char.m,v
then
echo Error: could not remove objc-sample/RCS/Char.m,v, aborting
exit 1
fi
fi
echo x - objc-sample/RCS/Char.m,v
cat >objc-sample/RCS/Char.m,v <<'@EOF'
head 1.1;
access;
symbols;
locks
tiggr:1.1; strict;
comment @# @;
1.1
date 93.12.02.09.24.28; author tiggr; state Exp;
branches;
next ;
desc
@@
1.1
log
@Initial revision
@
text
@#import <stdio.h>
#import "Char.h"
@@implementation Char
{
int value;
}
- init: (int) x
{
[super init]; // In case the parent class is doing
// something special in its init...
value = x;
return self;
}
- report
{
printf(" %c", value);
return self;
}
@@end
@
@EOF
set `wc -lwc <objc-sample/RCS/Char.m,v`
if test $1$2$3 != 4776468
then
echo ERROR: wc results of objc-sample/RCS/Char.m,v are $* should be 47 76 468
fi
chmod 444 objc-sample/RCS/Char.m,v
if test -f objc-sample/RCS/Float.m,v
then
echo Ok to overwrite existing file objc-sample/RCS/Float.m,v\?
read answer
case "$answer" in
[yY]*) echo Proceeding;;
*) echo Aborting; exit 1;;
esac
rm -f objc-sample/RCS/Float.m,v
if test -f objc-sample/RCS/Float.m,v
then
echo Error: could not remove objc-sample/RCS/Float.m,v, aborting
exit 1
fi
fi
echo x - objc-sample/RCS/Float.m,v
cat >objc-sample/RCS/Float.m,v <<'@EOF'
head 1.1;
access;
symbols;
locks
tiggr:1.1; strict;
comment @# @;
1.1
date 93.12.02.09.24.56; author tiggr; state Exp;
branches;
next ;
desc
@@
1.1
log
@Initial revision
@
text
@#import <stdio.h>
#import "Float.h"
@@implementation Float
{
float value;
}
- init: (float) x
{
[super init]; // In case the parent class is doing
// something special in its init...
value = x;
return self;
}
- report
{
printf("%4.1f", value);
return self;
}
@@end
@
@EOF
set `wc -lwc <objc-sample/RCS/Float.m,v`
if test $1$2$3 != 4775474
then
echo ERROR: wc results of objc-sample/RCS/Float.m,v are $* should be 47 75 474
fi
chmod 444 objc-sample/RCS/Float.m,v
chmod 755 objc-sample/RCS
if test -f objc-sample/Stack.m
then
echo Ok to overwrite existing file objc-sample/Stack.m\?
read answer
case "$answer" in
[yY]*) echo Proceeding;;
*) echo Aborting; exit 1;;
esac
rm -f objc-sample/Stack.m
if test -f objc-sample/Stack.m
then
echo Error: could not remove objc-sample/Stack.m, aborting
exit 1
fi
fi
echo x - objc-sample/Stack.m
cat >objc-sample/Stack.m <<'@EOF'
// Stack.m - comp.lang.objective-c simple sample Objective-C program
#import "Stack.h"
@implementation Stack
+ new
{
self = [super new];
stack = 0;
stack_size = 0;
return self;
}
- empty
{
while([self size])
[[self get] free];
return self;
}
- put: anItem
{
stack = [[Node new : anItem] set_next : stack];
++stack_size;
return self;
}
- get
{
id contents;
id old_stack = stack;
stack = [stack next];
contents = [old_stack free];
--stack_size;
return contents;
}
- (unsigned) size { return stack_size; }
@end
@EOF
set `wc -lwc <objc-sample/Stack.m`
if test $1$2$3 != 4285560
then
echo ERROR: wc results of objc-sample/Stack.m are $* should be 42 85 560
fi
chmod 644 objc-sample/Stack.m
if test -f objc-sample/output
then
echo Ok to overwrite existing file objc-sample/output\?
read answer
case "$answer" in
[yY]*) echo Proceeding;;
*) echo Aborting; exit 1;;
esac
rm -f objc-sample/output
if test -f objc-sample/output
then
echo Error: could not remove objc-sample/output, aborting
exit 1
fi
fi
echo x - objc-sample/output
cat >objc-sample/output <<'@EOF'
Output from demo, excluding Char class:
Include the Char class in the demo? (y/n): n
queue: 5, stack:-5.0
queue: 4.0, stack: -4
queue: 3, stack:-3.0
queue: 2.0, stack: -2
queue: 1, stack:-1.0
queue: 0.0, stack: 0
queue: -1, stack: 1.0
queue:-2.0, stack: 2
queue: -3, stack: 3.0
queue:-4.0, stack: 4
queue: -5, stack: 5.0
Output from demo, including Char class:
Include the Char class in the demo? (y/n): y
queue: 5, stack: h
queue: q, stack:-4.0
queue: 3, stack: j
queue: o, stack:-2.0
queue: 1, stack: l
queue: m, stack: 0.0
queue: -1, stack: n
queue: k, stack: 2.0
queue: -3, stack: p
queue: i, stack: 4.0
queue: -5, stack: r
@EOF
set `wc -lwc <objc-sample/output`
if test $1$2$3 != 29111679
then
echo ERROR: wc results of objc-sample/output are $* should be 29 111 679
fi
chmod 644 objc-sample/output
if test -f objc-sample/Char.m
then
echo Ok to overwrite existing file objc-sample/Char.m\?
read answer
case "$answer" in
[yY]*) echo Proceeding;;
*) echo Aborting; exit 1;;
esac
rm -f objc-sample/Char.m
if test -f objc-sample/Char.m
then
echo Error: could not remove objc-sample/Char.m, aborting
exit 1
fi
fi
echo x - objc-sample/Char.m
cat >objc-sample/Char.m <<'@EOF'
#include <stdio.h>
#include "Char.h"
@implementation Char
{
int value;
}
- init: (int) x
{
[super init]; // In case the parent class is doing
// something special in its init...
value = x;
return self;
}
- report
{
printf(" %c", value);
return self;
}
@end
@EOF
set `wc -lwc <objc-sample/Char.m`
if test $1$2$3 != 2347281
then
echo ERROR: wc results of objc-sample/Char.m are $* should be 23 47 281
fi
chmod 644 objc-sample/Char.m
if test -f objc-sample/Makefile
then
echo Ok to overwrite existing file objc-sample/Makefile\?
read answer
case "$answer" in
[yY]*) echo Proceeding;;
*) echo Aborting; exit 1;;
esac
rm -f objc-sample/Makefile
if test -f objc-sample/Makefile
then
echo Error: could not remove objc-sample/Makefile, aborting
exit 1
fi
fi
echo x - objc-sample/Makefile
cat >objc-sample/Makefile <<'@EOF'
# This Makefile assumes you have GNU gcc 2.3 or better and a suitable
# runtime library with object support. It also works on a NeXT. Don't know
# about Stepstone.
.SUFFIXES: .o .m
.m.o:
$(CC) -c $(CFLAGS) $<
# Use this on a NeXT
#CC= cc
#LIBS=
# Use this with GNU CC on a non-NeXT.
CC= gcc
LIBS= -lobjc
CFLAGS= -Wall -O2 -g
OFILES= main.o Node.o Queue.o Stack.o Float.o Char.o
demo: $(OFILES)
$(CC) $(CFLAGS) $(LDFLAGS) -o demo $(OFILES) $(LIBS)
clean:
rm -f $(OFILES) demo
Char.o : Char.m Char.h
Float.o : Float.m Float.h
Node.o : Node.m Node.h
Queue.o : Queue.m Queue.h Node.h
Stack.o : Stack.m Stack.h Node.h
main.o : main.m Queue.h Node.h Stack.h Float.h
@EOF
set `wc -lwc <objc-sample/Makefile`
if test $1$2$3 != 35115689
then
echo ERROR: wc results of objc-sample/Makefile are $* should be 35 115 689
fi
chmod 644 objc-sample/Makefile
if test -f objc-sample/Float.m
then
echo Ok to overwrite existing file objc-sample/Float.m\?
read answer
case "$answer" in
[yY]*) echo Proceeding;;
*) echo Aborting; exit 1;;
esac
rm -f objc-sample/Float.m
if test -f objc-sample/Float.m
then
echo Error: could not remove objc-sample/Float.m, aborting
exit 1
fi
fi
echo x - objc-sample/Float.m
cat >objc-sample/Float.m <<'@EOF'
#include <stdio.h>
#include "Float.h"
@implementation Float
{
float value;
}
- init: (float) x
{
[super init]; // In case the parent class is doing
// something special in its init...
value = x;
return self;
}
- report
{
printf("%4.1f", value);
return self;
}
@end
@EOF
set `wc -lwc <objc-sample/Float.m`
if test $1$2$3 != 2346287
then
echo ERROR: wc results of objc-sample/Float.m are $* should be 23 46 287
fi
chmod 644 objc-sample/Float.m
if test -f objc-sample/main.m
then
echo Ok to overwrite existing file objc-sample/main.m\?
read answer
case "$answer" in
[yY]*) echo Proceeding;;
*) echo Aborting; exit 1;;
esac
rm -f objc-sample/main.m
if test -f objc-sample/main.m
then
echo Error: could not remove objc-sample/main.m, aborting
exit 1
fi
fi
echo x - objc-sample/main.m
cat >objc-sample/main.m <<'@EOF'
// main.m - comp.lang.objective-c simple sample Objective-C program
// This is a comment. Everything to the right of a double slash
// is ignored.
/* This is too. Objective-C is a superset of ANSI C, so you don't lose any
of your favorite features. */
// Classes are the one real extension which Objective C adds to
// ANSI C. A class is a description of a collection of data, like
// a C structure, and the methods by which that data may be accessed
// or manipulated. Instances of a class are called objects, and
// methods are invoked by sending messages to either the class itself,
// to produce objects, or to those objects. The recipient of a message
// is called a "receiver". The form of a message is:
//
// [receiver method andMaybeSomeArguments]
//
// the receiver and method components are mandatory, as are the square
// brackets surrounding the message. Additional arguments may or may not be
// present, depending upon the method definition. Messages may appear
// anywhere a statement is allowed in C.
// The first thing we do is bring in some include files, as in
// C. On the NeXT, it is customary to use the "import" statement which
// guarantees that the file isn't included more than once. Using GNU CC
// this is not all that nice sinds it generates a huge warning for every
// file being compiled. So, since it does not really matter, we'll stick to
// `#include'.
#include <stdio.h>
#include <objc/Object.h>
#include "Queue.h"
#include "Stack.h"
// That brought in class definitions for Objects, Queues, and
// Stacks. The Object class is the basis for all other classes,
// which is why it gets brought in first. It provides basic functional
// behavior which is inherited by all derived classes. All user created
// classes should have Object somewhere in their ancestry.
// Queue and Stack are classes of our own construction, and provide FIFO and
// LIFO storage capabilities, respectively. I'm not going to go into
// implementation details here. It's irrelevant how they work, all that is
// important is that they both respond to 'put:' and 'get'. If you want to
// inspect them, look into the Queue.m, Stack.m, Queue.h and Stack.h files.
// A simple Class definition follows. It inherits directly from the base
// class "Object". This gives it lots of nice properties, not the least of
// which is the ability to be referenced by any pointer of the generic
// object type "id". All objects can be pointed to by any id variable, and
// the default return type from methods is id. This allows messages to be
// embedded in other messages, either as receivers or arguments.
// An Int object allocates space for a single integer. The "report" message
// causes it to report its value. Everything between the @implementation
// and the @end is part of the class definition.
// Note - It is *highly* unusual to have a class implementation in your main
// program. Since the object is fully defined before it gets used, no
// interface description is required. There is nothing illegal about doing
// things this way, but it is so unusual that the compiler will produce a
// warning for this class. We have included the Int class implementation
// here solely for expository purposes.
@implementation Int: Object // Int is derived from Object
{
int value; // This is the data portion. Like a struct.
}
// The following are the method definitions. A "+" prefix means
// it is a factory method, i.e., how to manufacture instances of
// the class. The body of the method is between braces, like a C
// function.
// This class doesn't define any factory methods. It relies on the
// +alloc method defined in class Object. For examples of factory
// methods, look at the +new method defined in the Stack or
// Queue implementations.
// Self is a special variable, which refers to the object currently
// being manipulated. Super refers to the parent class of self.
// The following method asks the parent class (Object) to hand us a
// new instance, which becomes self. Then we update the instance
// variables and return a pointer to the new object.
// It is standard for methods that do not need to return any
// special value to instead return self. This allows for a
// nested syntax of method calls.
// The "-" in front of init means that it's an instance method,
// i.e., something a particular object should respond to.
- init: (int) i // This method will initialize a new Int
{
[super init]; // In case the parent class is doing
// something special in its init...
value = i;
return self;
}
- report
{
printf("%4d", value);
return self;
}
@end
// We have implemented Float and Char classes more traditionally, using
// separate files for the interface (.h) and implementation (.m).
// The Float and Char objects are like the Int object, but with the
// obvious difference that they work with floats and characters.
// We include the interface definitions at this point.
#import "Float.h"
#import "Char.h"
// If you inspect those files, note polymorphism -- methods have same
// names as in the Int class.
int main(void)
{
// First we create instances of "Stack" and "Queue" data structures
id queue = [Queue new]; // +new is an older convention for
id stack = [Stack new]; // allocation & initialization.
// [[x alloc] init] is the preferred
// way to do this now.
int i;
int reply;
fprintf(stderr, "Include the Char class in the demo? (y/n): ");
reply = getchar(); // no error checking...
for (i = 5; i > -6; --i)
{
// Depending on which version of the demo we're running,
// we alternate putting Int's and Floats onto the queue and
// stack, or Int's, Float's, and Char's.
if (reply == 'y')
{
// If "i" is odd we put an Int on the queue and a Char on
// the stack. If "i" is even we put an Char on the queue
// and a Float on the stack.
// Since there is more than one method "init", and
// Objective-C uses run-time binding, the compiler doesn't
// know what the type of the object returned by alloc.
// We disambiguate with an explicit C-style cast to make
// sure the appropriate "init" is invoked.
[queue put: (i & 1) ?
[(Int*)[Int alloc] init: i] :
[(Char*)[Char alloc] init: 'm'+i]];
[stack put: (i & 1) ?
[(Char*)[Char alloc] init: 'm'+i] :
[(Float*)[Float alloc] init: i]];
}
else // Note - garbage input will invoke the else clause.
{
// If "i" is odd we put an Int on the queue and a Float on
// the stack. If "i" is even we put a Float on the queue
// and an Int on the stack.
[queue put: (i & 1) ?
[(Int*)[Int alloc] init: i] :
[(Float*)[Float alloc] init: i]];
[stack put: (i & 1) ?
[(Float*)[Float alloc] init: i] :
[(Int*)[Int alloc] init: i]];
}
}
while ([queue size] && [stack size])
{
// The following illustrates run-time binding. Will report be
// invoked for a Float object or an Int object? Did the user
// elect for Char objects at run time? We don't know ahead
// of time, but with run-time binding and polymorphism
// it works properly. The burden is on the class
// implementer rather than the class user.
// Note that the following lines remain unchanged, whether
// we are using the Char class or not. The queue and stack
// hand us the next object, it reports itself regardless
// of its type, and then it frees itself.
printf("queue:"); [[[queue get] report] free];
printf(", stack:"); [[[stack get] report] free];
putchar('\n');
}
return 0;
}
@EOF
set `wc -lwc <objc-sample/main.m`
if test $1$2$3 != 19613247686
then
echo ERROR: wc results of objc-sample/main.m are $* should be 196 1324 7686
fi
chmod 644 objc-sample/main.m
if test -f objc-sample/COPYRIGHT
then
echo Ok to overwrite existing file objc-sample/COPYRIGHT\?
read answer
case "$answer" in
[yY]*) echo Proceeding;;
*) echo Aborting; exit 1;;
esac
rm -f objc-sample/COPYRIGHT
if test -f objc-sample/COPYRIGHT
then
echo Error: could not remove objc-sample/COPYRIGHT, aborting
exit 1
fi
fi
echo x - objc-sample/COPYRIGHT
cat >objc-sample/COPYRIGHT <<'@EOF'
This copyright notice applies to all source files distributed in the
comp.lang.objective-c FAQ: `A Simple Sample Objective-C program'.
Copyright (C) 1993 Paul J. Sanchez and Bill Shirley
The `simple sample Objective-C program' is free software; you can
redistribute it and/or modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either version 2, or
(at your option) any later version.
The `simple sample Objective-C program' is distributed in the hope that it
will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Emacs; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
@EOF
set `wc -lwc <objc-sample/COPYRIGHT`
if test $1$2$3 != 18144902
then
echo ERROR: wc results of objc-sample/COPYRIGHT are $* should be 18 144 902
fi
chmod 644 objc-sample/COPYRIGHT
if test -f objc-sample/Float.h
then
echo Ok to overwrite existing file objc-sample/Float.h\?
read answer
case "$answer" in
[yY]*) echo Proceeding;;
*) echo Aborting; exit 1;;
esac
rm -f objc-sample/Float.h
if test -f objc-sample/Float.h
then
echo Error: could not remove objc-sample/Float.h, aborting
exit 1
fi
fi
echo x - objc-sample/Float.h
cat >objc-sample/Float.h <<'@EOF'
#import <objc/Object.h>
@interface Float: Object
{
float value;
}
- init: (float) x;
- report;
@end
@EOF
set `wc -lwc <objc-sample/Float.h`
if test $1$2$3 != 1116105
then
echo ERROR: wc results of objc-sample/Float.h are $* should be 11 16 105
fi
chmod 644 objc-sample/Float.h
if test -f objc-sample/Float.m.\~1\~
then
echo Ok to overwrite existing file objc-sample/Float.m.\~1\~\?
read answer
case "$answer" in
[yY]*) echo Proceeding;;
*) echo Aborting; exit 1;;
esac
rm -f objc-sample/Float.m.\~1\~
if test -f objc-sample/Float.m.\~1\~
then
echo Error: could not remove objc-sample/Float.m.\~1\~, aborting
exit 1
fi
fi
echo x - objc-sample/Float.m.\~1\~
cat >objc-sample/Float.m.\~1\~ <<'@EOF'
#import <stdio.h>
#import "Float.h"
@implementation Float
{
float value;
}
- init: (float) x
{
[super init]; // In case the parent class is doing
// something special in its init...
value = x;
return self;
}
- report
{
printf("%4.1f", value);
return self;
}
@end
@EOF
set `wc -lwc <objc-sample/Float.m.\~1\~`
if test $1$2$3 != 2346285
then
echo ERROR: wc results of objc-sample/Float.m.\~1\~ are $* should be 23 46 285
fi
chmod 644 objc-sample/Float.m.\~1\~
if test -f objc-sample/Char.m.\~1\~
then
echo Ok to overwrite existing file objc-sample/Char.m.\~1\~\?
read answer
case "$answer" in
[yY]*) echo Proceeding;;
*) echo Aborting; exit 1;;
esac
rm -f objc-sample/Char.m.\~1\~
if test -f objc-sample/Char.m.\~1\~
then
echo Error: could not remove objc-sample/Char.m.\~1\~, aborting
exit 1
fi
fi
echo x - objc-sample/Char.m.\~1\~
cat >objc-sample/Char.m.\~1\~ <<'@EOF'
#import <stdio.h>
#import "Char.h"
@implementation Char
{
int value;
}
- init: (int) x
{
[super init]; // In case the parent class is doing
// something special in its init...
value = x;
return self;
}
- report
{
printf(" %c", value);
return self;
}
@end
@EOF
set `wc -lwc <objc-sample/Char.m.\~1\~`
if test $1$2$3 != 2347279
then
echo ERROR: wc results of objc-sample/Char.m.\~1\~ are $* should be 23 47 279
fi
chmod 644 objc-sample/Char.m.\~1\~
chmod 755 objc-sample
exit 0