This is ResultObject.m in view mode; [Download] [Up]
/***********************************************************************\
Common class providing a multiple-result interface in all Convert objects
Copyright (C) 1993 David John Burrowes
This 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 1, or (at your option) any later version.
This 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 this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
The author, David John Burrowes, can be reached at:
davidjohn@kira.net.netcom.com
David John Burrowes
1926 Ivy #10
San Mateo, CA 94403-1367
\***********************************************************************/
/*
====================================================================
This is the implementation file for the ResultObject class. Full documentation for this class can be found in the ResultObject.rtf file. I will not duplicate all that fine information here.
This is $Revision: 1.4 $ of this file
It was last modified by $Author: death $ on $Date: 93/04/04 23:45:10 $
Note that this file was created while using the New Century Schoolbook Roman typeface. You may find that some things line up strangely if you don't use that family.
$Log: ResultObject.m,v $
Revision 1.4 93/04/04 23:45:10 death
Sun Apr 4 23:45:09 PDT 1993
Revision 1.3 93/01/10 15:08:44 death
Sun Jan 10 15:08:44 PST 1993
Revision 1.2 92/07/26 13:59:14 death
Update of the result object...
====================================================================
*/
//
// Import our own definition
//
#import "ResultObject.h"
#import <strings.h>
#import <stdlib.h>
#import <memory.h>
@implementation ResultObject
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: CopyCString:
// Parameters: a string that we want to copy and store
// Returns: self
// Description:
// Stores the specified string in the first storage area for returned data. The
// string is copied first.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Instance) CopyCString: (CString) data
{
return [self CopyCString: data Into: FIRST_RESULT];
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: CopyCString:Into:
// Parameters: a string, and location to store it
// Returns: self
// Description:
// Attempts to make a copy of the string. If we succeed, we store it in the requested
// position, otherwise, we do nothing but post an error!!!.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Instance) CopyCString: (CString) data Into: (Integer) reference
{
GenericType theData;
Integer status;
CString tempStr;
tempStr = (char*) malloc(strlen(data)+1);
if (tempStr == NullCString)
status = ERR_CANTSTORE;
else
{
strcpy(tempStr, data);
theData.cstring = tempStr;
[self PutData: theData WithType: TYPE_CSTRING Into: reference DoIOwn: YES];
status = [self GetMyError];
if (status != ERR_OK)
free(tempStr);
}
[self StoreMyError: status];
return self;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: CopyPointer:WithLength:
// Parameters: a pointer, and the length of its data
// Returns: self
// Description:
// Stores the specified data in the first storage area. Copies the data that the
// pointer points to, first..
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Instance) CopyPointer: (Pointer) data WithLength: (PositiveInteger) length
{
return [self CopyPointer: data WithLength: length Into: FIRST_RESULT];
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: CopyPointer:WithLength:Into:
// Parameters: data item, and location to store it
// Returns: self
// Description:
// Stores the specified data in the specified storage area. To do this, we build
// a data type with our data and its type, and then we ask to store it properly.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Instance) CopyPointer: (Pointer) data WithLength: (PositiveInteger) length Into: (Integer) reference
{
GenericType theData;
Integer status;
Pointer tempPtr;
tempPtr = (Pointer) malloc(length);
if (tempPtr == NullPointer)
status = ERR_CANTSTORE;
else
{
bcopy(data, tempPtr, length);
theData.pointer = tempPtr;
[self PutData: theData WithType: TYPE_POINTER Into: reference DoIOwn: YES];
status = [self GetMyError];
if (status != ERR_OK)
free(tempPtr);
}
[self StoreMyError: status];
return self;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: init
// Parameters: none
// Returns: self
// Description:
// This initalizes this object. What this means is simply that we call the parent
// to init, and then clear all our storage areas
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Instance) init
{
Integer index;
StorageArea* SA; // pointer to the storage area we want to work on.
[super init];
//
// Now, clear our storage areas. We can't use ResetResults, because if there is
// junk somewhere in there, it might try to free some string or ptr that doesn't exist...
//
for (index = 0; index < MAXAREAS; index++)
{
SA = &ReturnVals[index]; // Esentially doing a pascal WITH ReturnVals[index]...
SA->StoredData.type = TYPE_NONE;
SA->StoredData.data.integer = 0;
SA->IOwnData = NO;
}
return self;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: free
// Parameters: none
// Returns: self
// Description:
// Clears anything about us, then asks the parent to clear themselves too...
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- free
{
[self ResetResults];
[super free];
return self;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: GetBoolean
// Parameters: none
// Returns: a boolean value
// Description:
// Retrieves the boolean value, if any, from the first storage area, and returns it.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Boolean) GetBoolean
{
return [self GetBooleanFrom: FIRST_RESULT];
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: GetBooleanFrom:
// Parameters: an integer indicating which storage area to retrieve from
// Returns: a Boolean value
// Description:
// Retrieves the boolean value, if any, from the storage area specified.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Boolean) GetBooleanFrom: (Integer) reference
{
GenericType data;
data = [self GetDataWithType: TYPE_BOOLEAN From: reference];
if ([self GetMyError] == ERR_OK)
return data.boolean;
else return NO;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: GetCharacter
// Parameters: none
// Returns: a character value
// Description:
// Retrieves the character value, if any, from the first storage area, and returns it.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Character) GetCharacter
{
return [self GetCharacterFrom: FIRST_RESULT];
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: GetCharacterFrom:
// Parameters: an integer indicating which storage area to retrieve from
// Returns: a character value
// Description:
// Retrieves the character value, if any, from the storage area specified.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Character) GetCharacterFrom: (Integer) reference
{
GenericType data;
data = [self GetDataWithType: TYPE_CHARACTER From: reference];
if ([self GetMyError] == ERR_OK)
return data.character;
else return (Character) 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: GetCString
// Parameters: none
// Returns: a Cstring value
// Description:
// Retrieves the cstring value, if any, from the first storage area, and returns it.
// This assumes that GetCString has already made a copy of the data to return
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (CString) GetCString
{
return [self GetCStringFrom: FIRST_RESULT];
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: GetCStringFrom
// Parameters: a number indicating which storage area to retrieve from
// Returns: a Cstring value
// Description:
// Retrieves the cstring value, if any, from the specified storage area, and returns it.
// We always make a copy of the string and then return the copy.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (CString) GetCStringFrom: (Integer) reference
{
GenericType data;
CString tempStr = NullCString;
data = [self GetDataWithType: TYPE_CSTRING From: reference];
if ([self GetMyError] == ERR_OK)
{
tempStr = (CString) malloc(strlen(data.cstring)+1);
if (tempStr == NullCString)
{
[self StoreMyError: ERR_CANTSTORE];
free(tempStr);
tempStr = NullCString;
}
else
strcpy(tempStr, data.cstring);
}
return tempStr;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: GetDataWithType:From:
// Parameters: none
// Returns: a generic type value
// Description:
// Locates a data value in the storage area specified by storage. If it matches
// the requested type, return it. Otherwise, post an error.
// At present, we ignore the owning flag...
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (GenericType) GetDataWithType: (Integer) theType From: (Integer) storage;
{
Integer status;
GenericType theData;
if ((storage > MAXAREAS -1) || (storage < 0))
status = ERR_NOSUCHAREA;
else
{
if (ReturnVals[storage].StoredData.type != theType)
{
status = ERR_NOSUCHTYPE;
theData.integer = 0;
}
else
{
theData = ReturnVals[storage].StoredData.data;
status = ERR_OK;
}
}
[self StoreMyError: status];
return theData;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: GetErrorCode
// Parameters: none
// Returns: an integer value
// Description:
// Retrieves an error code from the main error code storage area.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Integer) GetErrorCode
{
return [self GetIntegerFrom: ERRORCODE_RESULT];
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: GetErrorText
// Parameters: none
// Returns: a CString value
// Description:
// Retrieves a string from the error string result area, and returns it to the
// caller. Note that this does mean it retrieves and returns a copy..
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (CString) GetErrorText
{
return [self GetCStringFrom: ERRORTEXT_RESULT];
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: GetInteger
// Parameters: none
// Returns: an integer value
// Description:
// Retrieves the integer value, if any, from the first storage area.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Integer) GetInteger
{
return [self GetIntegerFrom: FIRST_RESULT];
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: GetIntegerFrom:
// Parameters: an integer indicating which storage area to retrieve from
// Returns: a Boolean value
// Description:
// Retrieves the boolean value, if any, from the storage area specified.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Integer) GetIntegerFrom: (Integer) reference
{
GenericType data;
data = [self GetDataWithType: TYPE_INTEGER From: reference];
if ([self GetMyError] == ERR_OK)
return data.integer;
else return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: GetMyError
// Parameters: none
// Returns: an error value
// Description:
// Retrieves the error code that the methods that make up this class will
// generate, in case they had any problems while working. At the moment, only
// GetDataWithType:From: and PutDataWithType: Into:DoIOwn: store error
// codes.. oh, and so do the two Copy methods..
// Note that we must access the info directly, and not call GetData, otherwise
// we'll be mutually recursing for a brief time before we crash.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Integer) GetMyError
{
return ReturnVals[MYERROR_RESULT].StoredData.data.integer;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: GetObject
// Parameters: none
// Returns: an Object value
// Description:
// Retrieves the Object value, if any, from the first storage area.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Instance) GetObject
{
return [self GetObjectFrom: FIRST_RESULT];
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: GetObjectFrom:
// Parameters: a reference to the storagearea we want to retrieve the value from
// Returns: an Object value
// Description:
// Retrieves the Object value, if any, from the specified storage area
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Instance) GetObjectFrom: (Integer) reference
{
GenericType data;
data = [self GetDataWithType: TYPE_INSTANCE From: reference];
if ([self GetMyError] == ERR_OK)
return data.instance;
else return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: GetPointer
// Parameters: none
// Returns: a pointer value
// Description:
// Retrieves the pointer value, if any, from the first storage area. It does NOT
// make a copy of the pointer data.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Pointer) GetPointer
{
return [self GetPointerFrom: FIRST_RESULT];
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: GetPointerFrom:
// Parameters: an integer indicating what storage area to retrieve from
// Returns: a pointer value
// Description:
// Retrieves the pointer value, if any, from the specified storage are. It does NOT
// make a copy of the pointer data.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Pointer) GetPointerFrom: (Integer) reference
{
GenericType data;
data = [self GetDataWithType: TYPE_POINTER From: reference];
if ([self GetMyError] == ERR_OK)
return data.pointer;
else return NullPointer;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: GetPositiveInteger
// Parameters: none
// Returns: a positive integer value
// Description:
// Retrieves the positiveinteger value, if any, from the first storage area.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (PositiveInteger) GetPositiveInteger
{
return [self GetPositiveIntegerFrom: FIRST_RESULT];
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: GetPositiveIntegerFrom:
// Parameters: an integer indicating which storage area to retrieve from
// Returns: a PositiveInteger value
// Description:
// Retrieves the integer value, if any, from the storage area specified.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (PositiveInteger) GetPositiveIntegerFrom: (PositiveInteger) reference
{
GenericType data;
data = [self GetDataWithType: TYPE_POSITIVEINTEGER From: reference];
if ([self GetMyError] == ERR_OK)
return data.positiveinteger;
else return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: PutBoolean:Into:
// Parameters: data item, and location to store it
// Returns: self
// Description:
// Stores the specified data in the specified storage area. To do this, we build
// a data type with our data and its type, and then we ask to store it properly.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Instance) PutBoolean: (Boolean) data Into: (Integer) reference
{
GenericType theData;
theData.boolean = data;
[self PutData: theData WithType: TYPE_BOOLEAN Into: reference DoIOwn: YES];
return self;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: PutCharacter:Into:
// Parameters: data item, and location to store it
// Returns: self
// Description:
// Stores the specified data in the specified storage area. To do this, we build
// a data type with our data and its type, and then we ask to store it properly.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Instance) PutCharacter: (Character) data Into: (Integer) reference
{
GenericType theData;
theData.character = data;
[self PutData: theData WithType: TYPE_CHARACTER Into: reference DoIOwn: YES];
return self;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: PutCString:Into:
// Parameters: data item, and location to store it
// Returns: self
// Description:
// Stores the specified data in the specified storage area. To do this, we build
// a data type with our data and its type, and then we ask to store it properly.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Instance) PutCString: (CString) data Into: (Integer) reference
{
GenericType theData;
theData.cstring = data;
[self PutData: theData WithType: TYPE_CSTRING Into: reference DoIOwn: NO];
return self;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: PutData:Into:DoIOwn:
// Parameters: data to be stored, which storage area to put it in, and whether we own it
// Returns: self
// Description:
// If we are trying to store in an area that we shouldn't be, then return an error and
// don't store anything. Otherwise copy our information into the storage area.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Instance) PutData: (GenericType) theData WithType: (Integer) theType
Into: (Integer) storage DoIOwn: (Boolean) ownit
{
Integer status;
if ((storage > MAXAREAS -1) || (storage < 0))
status = ERR_NOSUCHAREA;
else
{
ReturnVals[storage].IOwnData = ownit;
ReturnVals[storage].StoredData.data= theData;
ReturnVals[storage].StoredData.type= theType;
status = ERR_OK;
}
[self StoreMyError: status];
return self;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: PutInteger:Into:
// Parameters: data item, and location to store it
// Returns: self
// Description:
// Stores the specified data in the specified storage area. To do this, we build
// a data type with our data and its type, and then we ask to store it properly.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Instance) PutInteger: (Integer) data Into: (Integer) reference
{
GenericType theData;
theData.integer = data;
[self PutData: theData WithType: TYPE_INTEGER Into: reference DoIOwn: YES];
return self;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: PutObject:Into:
// Parameters: data item, and location to store it
// Returns: self
// Description:
// Stores the specified data in the specified storage area. To do this, we build
// a data type with our data and its type, and then we ask to store it properly.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Instance) PutObject: (Instance) data Into: (Integer) reference
{
GenericType theData;
theData.instance = data;
[self PutData: theData WithType: TYPE_INSTANCE Into: reference DoIOwn: NO];
return self;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: PutPointer:Into:
// Parameters: data item, and location to store it
// Returns: self
// Description:
// Stores the specified data in the specified storage area. To do this, we build
// a data type with our data and its type, and then we ask to store it properly.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Instance) PutPointer: (Pointer) data Into: (Integer) reference
{
GenericType theData;
theData.pointer = data;
[self PutData: theData WithType: TYPE_POINTER Into: reference DoIOwn: NO];
return self;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: PutPositiveInteger:Into:
// Parameters: data item, and location to store it
// Returns: self
// Description:
// Stores the specified data in the specified storage area. To do this, we build
// a data type with our data and its type, and then we ask to store it properly.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Instance) PutPositiveInteger: (PositiveInteger) data Into: (Integer) reference
{
GenericType theData;
theData.positiveinteger = data;
[self PutData: theData WithType: TYPE_POSITIVEINTEGER Into: reference DoIOwn: YES];
return self;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: ResetResults
// Parameters: none
// Returns: self
// Description:
// This clears all the result storage areas. This is accomplished by:
// (1) Freeing any strings or pointers we own
// (2) Setting all data items to a type of TYPE_NONE
// (3) (this is redundant) putting 0 into each storage data item
// This is accomplished by first checking if we own the data, and if so, if it is a poiner
// or a CString. If so, then we take the data, and implicitly cast it as a char* and free it.
// In any case, we then set the type of the data storage area to no data type, and clear
// the data item (again, implicitly casting the data item to do this). This implicit
// casting can be done because the ultimate data item is a union with multiple types
// unioned in it. =)
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Instance) ResetResults
{
Integer index;
StorageArea* SA; // pointer to the storage area we want to work on.
for (index = 0; index < MAXAREAS; index++)
{
SA = &ReturnVals[index]; // Esentially doing a pascal WITH ReturnVals[index]...
if ((SA->IOwnData == YES) &&
((SA->StoredData.type == TYPE_CSTRING) ||
(SA->StoredData.type == TYPE_POINTER)))
free(SA->StoredData.data.cstring);
SA->StoredData.type = TYPE_NONE;
SA->StoredData.data.integer = 0;
SA->IOwnData = NO;
}
//
// Special case. put a empty CString into the error text, to allow for sloppy
// programming.
//
[self PutCString: "" Into: ERRORTEXT_RESULT];
return self;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: StoreErrorCode:AndText:
// Parameters: an error code and an error string to be stored for the callser to find
// Returns: self
// Description:
// This stores the error code and error string into the result areas reserved for
// them, and returns self.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Instance) StoreErrorCode: (Integer) code AndText: (CString) text
{
[self PutInteger: code Into: ERRORCODE_RESULT];
[self PutCString: text Into: ERRORTEXT_RESULT];
return self;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: StoreErrorCode:AndCopyOfText:
// Parameters: an error code and an error string to be stored for the callser to find
// Returns: self
// Description:
// This stores its the error code, and a full copy of the error text in the result
// areas reserved for these purposes..
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Instance) StoreErrorCode: (Integer) code AndCopyOfText: (CString) text
{
[self PutInteger: code Into: ERRORCODE_RESULT];
[self CopyCString: text Into: ERRORTEXT_RESULT];
return self;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: StoreBoolean:
// Parameters: a Boolean
// Returns: self
// Description:
// This stores its data into the first result storage area, and returns self.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Instance) StoreBoolean: (Boolean) data
{
return [self PutBoolean: data Into: FIRST_RESULT];
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: StoreCharacter:
// Parameters: a Character
// Returns: self
// Description:
// This stores its data into the first result storage area, and returns self.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Instance) StoreCharacter: (Character) data
{ return [self PutCharacter: data Into: FIRST_RESULT]; }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: StoreCString:
// Parameters: a CString
// Returns: self
// Description:
// This stores its data into the first result storage area, and returns self.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Instance) StoreCString: (CString) data
{
return [self PutCString: data Into: FIRST_RESULT];
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: StoreInteger:
// Parameters: an Integer
// Returns: self
// Description:
// This stores its data into the first result storage area, and returns self.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Instance) StoreInteger: (Integer) data
{
return [self PutInteger: data Into: FIRST_RESULT];
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: StoreMyError:
// Parameters: an Integer
// Returns: self
// Description:
// This stores its data into the the error register used for our own error generation
// Note that this must do this nasty work itself, rather than using, say,
// PutInteger:Into:, cause otherwise it's very likely you'll have an infinite loop
// on your hand... nasty
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Instance) StoreMyError: (Integer) data
{
ReturnVals[MYERROR_RESULT].IOwnData = YES;
ReturnVals[MYERROR_RESULT].StoredData.data.integer= data;
ReturnVals[MYERROR_RESULT].StoredData.type= TYPE_INTEGER;
return self;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: StoreObject:
// Parameters: an Object
// Returns: self
// Description:
// This stores its data into the first result storage area, and returns self.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Instance) StoreObject: (Instance) data
{
return [self PutObject: data Into: FIRST_RESULT];
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: StorePointer:
// Parameters: a Pointer
// Returns: self
// Description:
// This stores its data into the first result storage area, and returns self.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Instance) StorePointer: (Pointer) data
{
return [self PutPointer: data Into: FIRST_RESULT];
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Routine: StorePositiveInteger:
// Parameters: a PositiveInteger
// Returns: self
// Description:
// This stores its data into the first result storage area, and returns self.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (Instance) StorePositiveInteger: (PositiveInteger) data
{
return [self PutPositiveInteger: data Into: FIRST_RESULT];
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.