home *** CD-ROM | disk | FTP | other *** search
- Path: senator-bedfellow.mit.edu!bloom-beacon.mit.edu!gatech!howland.reston.ans.net!europa.eng.gtefsd.com!uunet!mcsun!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_743346495@es.ele.tue.nl>
- Followup-To: comp.lang.objective-c
- Date: 17 Aug 1993 10:09:57 GMT
- Organization: Eindhoven University of Technology
- Lines: 963
- Approved: news-answers-request@mit.edu
- Expires: 26 Sep 1993 10:09:52 GMT
- Message-ID: <sample_745582192@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:1505 comp.answers:1640 news.answers:11486
-
- Archive-name: Objective-C/sample
- Version: $Id: sample.preamble,v 1.6 1993/08/06 12:50:53 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.
-
- Any text in between `[' and `]' is a comment. Comments indicate problems
- with this FAQ, which should be solved. 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 Tue Aug 17 12:04:37 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 "S[ia]mple Objective-C
- program" described in 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 != 853358
- then
- echo ERROR: wc results of objc-sample/README are $* should be 8 53 358
- fi
-
- chmod 640 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 640 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
-
- #import <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 != 1668379
- then
- echo ERROR: wc results of objc-sample/Node.h are $* should be 16 68 379
- fi
-
- chmod 640 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
-
- #import <objc/Object.h>
- #import "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 != 2862381
- then
- echo ERROR: wc results of objc-sample/Node.m are $* should be 28 62 381
- fi
-
- chmod 640 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 640 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 640 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 640 objc-sample/Stack.h
-
- 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 640 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 640 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'
- #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`
- if test $1$2$3 != 2347279
- then
- echo ERROR: wc results of objc-sample/Char.m are $* should be 23 47 279
- fi
-
- chmod 640 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 640 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'
- #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`
- if test $1$2$3 != 2346285
- then
- echo ERROR: wc results of objc-sample/Float.m are $* should be 23 46 285
- fi
-
- chmod 640 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. However, we'll use the "import" statement which guarantees
- // that the file isn't included more than once.
-
- #import <stdio.h>
- #import <objc/Object.h>
- #import "Queue.h"
- #import "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 != 20112937504
- then
- echo ERROR: wc results of objc-sample/main.m are $* should be 201 1293 7504
- fi
-
- chmod 640 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 640 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 640 objc-sample/Float.h
-
- chmod 750 objc-sample
-
- exit 0
- --
- --Tiggr
-