home *** CD-ROM | disk | FTP | other *** search
- /*
- File: IText.cpp
-
- Contains: Routines for manipulating ITexts.
-
- Owned by: Vincent Lo
-
- Copyright: © 1994 - 1995 by Apple Computer, Inc., all rights reserved.
-
- To Do:
-
- These could all be rewritten to use the ODByteArray functions,
- thus reducing code size.
-
- In Progress:
-
- */
-
- #ifndef _EXCEPT_
- #include <Except.h>
- #endif
-
- #ifndef _UTILERRS_
- #include <UtilErrs.h>
- #endif
-
- #ifndef _ODDEBUG_
- #include "ODDebug.h"
- #endif
-
- #ifndef _ODTYPES_
- #include "ODTypes.h"
- #endif
-
- #ifndef _ITEXT_
- #include "IText.h"
- #endif
-
- #ifndef _BARRAY_
- #include "BArray.h"
- #endif
-
- #ifndef _ODMEMORY_
- #include "ODMemory.h"
- #endif
-
- #include "string.h"
-
-
- //==============================================================================
- // IText
- //==============================================================================
-
-
- #if ODDebug
- #define CHECK_FORMAT(I) ASSERTM((I) && (I)->format==kODTraditionalMacText, \
- kODErrAssertionFailed, "Unknown IText format")
- #else
- #define CHECK_FORMAT(I) if( (I)->format==kODTraditionalMacText ) ; \
- else THROW(kODErrInvalidITextFormat)
- #endif
-
-
- //------------------------------------------------------------------------------
- // NewIText [static] Creates an uninitialized empty IText.
- //------------------------------------------------------------------------------
-
- static ODIText* NewIText( )
- {
- ODIText* result = new ODIText;
- result->format = kODTraditionalMacText;
- result->text._buffer = kODNULL;
- return result;
- }
-
-
- //------------------------------------------------------------------------------
- // CreateITextCString
- //------------------------------------------------------------------------------
-
- ODIText* CreateITextCString(ODScriptCode scriptCode, ODLangCode langCode, char* text)
- {
- ODIText* result = NewIText();
-
- TRY{
- SetITextString(result, text);
- SetITextScriptCode(result, scriptCode);
- SetITextLangCode(result, langCode);
- }CATCH_ALL{
- DisposeIText(result);
- RERAISE;
- }ENDTRY
-
- return result;
- }
-
-
- //------------------------------------------------------------------------------
- // CreateITextPString
- //------------------------------------------------------------------------------
-
- ODIText* CreateITextPString(ODScriptCode scriptCode, ODLangCode langCode, StringPtr text)
- {
- ODIText* result = NewIText();
-
- TRY{
- SetITextString(result, text);
- SetITextScriptCode(result, scriptCode);
- SetITextLangCode(result, langCode);
- }CATCH_ALL{
- DisposeIText(result);
- RERAISE;
- }ENDTRY
-
- return result;
- }
-
-
- //------------------------------------------------------------------------------
- // CreateITextClear
- //------------------------------------------------------------------------------
-
- ODIText* CreateITextClear(ODScriptCode scriptCode, ODLangCode langCode, ODSize textLen)
- {
- ODIText* result = NewIText();
-
- TRY{
- SetITextBufferSize(result, textLen+sizeof(ODTradITextDataHeader), kODFalse);
- SetITextScriptCode(result, scriptCode);
- SetITextLangCode(result, langCode);
- }CATCH_ALL{
- DisposeIText(result);
- RERAISE;
- }ENDTRY
-
- return result;
- }
-
-
- //------------------------------------------------------------------------------
- // CreateIText
- //------------------------------------------------------------------------------
-
- ODIText* CreateITextWLen(ODScriptCode scriptCode, ODLangCode langCode,
- ODUByte* text, ODSize textLength )
- {
- ODIText* result = NewIText();
-
- TRY{
- SetITextBufferSize(result,
- textLength + sizeof(ODTradITextDataHeader), kODFalse);
- ODBlockMove(text,
- &(((ODTradITextData*)(result->text._buffer))->theText),
- textLength);
- SetITextScriptCode(result, scriptCode);
- SetITextLangCode(result, langCode);
- }CATCH_ALL{
- DisposeIText(result);
- RERAISE;
- }ENDTRY
-
- return result;
- }
-
-
- //------------------------------------------------------------------------------
- // CopyIText
- //------------------------------------------------------------------------------
-
- ODIText* CopyIText(ODIText* original)
- {
- CHECK_FORMAT(original);
-
- ODIText* result = NewIText();
-
- TRY{
- unsigned long dataSize = original->text._length;
- result->format = original->format;
- result->text._buffer = (octet *)ODNewPtr(dataSize, kDefaultHeapID);
- result->text._maximum = dataSize;
- result->text._length = dataSize;
- ODBlockMove(original->text._buffer, result->text._buffer, dataSize);
- }CATCH_ALL{
- DisposeIText(result);
- RERAISE;
- }ENDTRY
-
- return result;
- }
-
- //------------------------------------------------------------------------------
- // CopyITextStruct
- //------------------------------------------------------------------------------
-
- ODIText CopyITextStruct(ODIText* original)
- {
- ODIText result;
-
- CHECK_FORMAT(original);
-
- result.format = original->format;
- result.text = CopyByteArrayStruct(&(original->text));
-
- return result;
- }
-
-
- //------------------------------------------------------------------------------
- // SetITextBufferSize
- //------------------------------------------------------------------------------
-
- ODIText*
- SetITextBufferSize( ODIText* iText, ODSize bufferSize, ODBoolean preserveContents )
- {
- // Will create new IText if input is NULL.
-
- if( iText && iText->text._maximum==bufferSize && iText->text._buffer ) {
- iText->text._length = bufferSize;
- return iText; // No-op
- }
-
- ODTradITextData *buffer = (ODTradITextData*) ODNewPtr(bufferSize);
- if( !iText ) {
- TRY{
- iText = NewIText();
- }CATCH_ALL{
- ODDisposePtr(buffer);
- RERAISE;
- }ENDTRY
- } else if( iText->text._buffer ) {
- if( preserveContents )
- ODBlockMove(iText->text._buffer, buffer, bufferSize);
- ODDisposePtr(iText->text._buffer);
- }
- iText->text._buffer = (octet*) buffer;
- iText->text._maximum = bufferSize;
- iText->text._length = bufferSize;
- return iText;
- }
-
-
- //------------------------------------------------------------------------------
- // GetITextPtr
- //------------------------------------------------------------------------------
-
- char* GetITextPtr( ODIText *iText )
- {
- CHECK_FORMAT(iText);
- return ((ODTradITextData*)iText->text._buffer)->theText;
- }
-
-
- //------------------------------------------------------------------------------
- // SetITextScriptCode
- //------------------------------------------------------------------------------
-
- void SetITextScriptCode(ODIText* iText, ODScriptCode scriptCode)
- {
- CHECK_FORMAT(iText);
- ODTradITextData *data = (ODTradITextData*) iText->text._buffer;
- data->theScriptCode = scriptCode;
- }
-
-
- //------------------------------------------------------------------------------
- // GetITextScriptCode
- //------------------------------------------------------------------------------
-
- ODScriptCode GetITextScriptCode(ODIText* iText)
- {
- CHECK_FORMAT(iText);
- ODTradITextData *data = (ODTradITextData*) iText->text._buffer;
- return data->theScriptCode;
- }
-
-
- //------------------------------------------------------------------------------
- // SetITextLangCode
- //------------------------------------------------------------------------------
-
- void SetITextLangCode(ODIText* iText, ODLangCode langCode)
- {
- CHECK_FORMAT(iText);
- ODTradITextData *data = (ODTradITextData*) iText->text._buffer;
- data->theLangCode = langCode;
- }
-
-
- //------------------------------------------------------------------------------
- // GetITextLangCode
- //------------------------------------------------------------------------------
-
- ODLangCode GetITextLangCode(ODIText* iText)
- {
- CHECK_FORMAT(iText);
- ODTradITextData *data = (ODTradITextData*) iText->text._buffer;
- return data->theLangCode;
- }
-
-
- //------------------------------------------------------------------------------
- // SetITextStringLength
- //------------------------------------------------------------------------------
-
- ODIText* SetITextStringLength( ODIText* iText, ODSize length, ODBoolean preserveText )
- {
- ODTradITextDataHeader data = {0,0};
- if( iText ) {
- CHECK_FORMAT(iText);
- if( iText->text._buffer )
- data = * (ODTradITextDataHeader*) iText->text._buffer;
- }
- iText = SetITextBufferSize(iText,length+sizeof(ODTradITextDataHeader),preserveText);
- if( !preserveText )
- * (ODTradITextDataHeader*) iText->text._buffer = data;
- return iText;
- }
-
-
- //------------------------------------------------------------------------------
- // GetITextStringLength
- //------------------------------------------------------------------------------
-
- ODULong GetITextStringLength(ODIText* iText)
- {
- CHECK_FORMAT(iText);
- if( iText->text._buffer )
- return iText->text._length - sizeof(ODTradITextDataHeader);
- else
- return 0;
- }
-
-
- //------------------------------------------------------------------------------
- // SetITextCString
- //------------------------------------------------------------------------------
-
- void SetITextCString(ODIText* iText, char* text)
- {
- CHECK_FORMAT(iText);
- ODSize textLen = text ?strlen(text) :0;
- SetITextStringLength(iText,textLen,kODFalse);
- ODBlockMove(text, ((ODTradITextData*)iText->text._buffer)->theText, textLen);
- }
-
-
- //------------------------------------------------------------------------------
- // SetITextPString
- //------------------------------------------------------------------------------
-
- void SetITextPString(ODIText* iText, StringPtr text)
- {
- CHECK_FORMAT(iText);
- ODSize textLen = text ?text[0] :0;
- SetITextStringLength(iText,textLen,kODFalse);
- ODBlockMove(&text[1], ((ODTradITextData*)iText->text._buffer)->theText, textLen);
- }
-
-
- //------------------------------------------------------------------------------
- // SetITextText
- //------------------------------------------------------------------------------
-
- void SetITextText(ODIText* iText, ODUByte* text, ODSize textLength)
- {
- CHECK_FORMAT(iText);
- SetITextStringLength(iText, textLength, kODFalse);
- ODBlockMove(text, ((ODTradITextData*)iText->text._buffer)->theText,
- textLength);
- }
-
-
- //------------------------------------------------------------------------------
- // GetITextCString
- //------------------------------------------------------------------------------
-
- char* GetITextCString(ODIText* iText, char *cstring)
- {
- CHECK_FORMAT(iText);
- ODSize len;
- if( iText->text._buffer )
- len = iText->text._length - sizeof(ODTradITextDataHeader);
- else
- len = 0;
-
- if( !cstring )
- cstring = new char[len+1];
- cstring[len] = '\0';
- if( len )
- ODBlockMove(((ODTradITextData*)iText->text._buffer)->theText,
- cstring, len);
- return cstring;
- }
-
-
- //------------------------------------------------------------------------------
- // GetITextPString
- //------------------------------------------------------------------------------
-
- StringPtr GetITextPString(ODIText* iText, Str255 pstring)
- {
- CHECK_FORMAT(iText);
- ODSize len;
- if( iText->text._buffer )
- len = iText->text._length - sizeof(ODTradITextDataHeader);
- else
- len = 0;
-
- if( !pstring )
- pstring = new unsigned char[len+1];
- if( len )
- ODBlockMove(((ODTradITextData*)iText->text._buffer)->theText,
- &pstring[1], len);
- pstring[0] = len;
- return pstring;
- }
-
-
- //------------------------------------------------------------------------------
- // DisposeIText
- //------------------------------------------------------------------------------
-
- void DisposeIText(ODIText* iText)
- {
- if( iText ) {
- CHECK_FORMAT(iText);
- DisposeITextStruct(*iText);
- delete iText;
- }
- }
-
-