home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 October: Mac OS SDK / Dev.CD Oct 96 SDK / Dev.CD Oct 96 SDK2.toast / Development Kits (Disc 2) / OpenDoc Development Framework / ODFDev / ODF / Found / ODUtils / Sources / IText.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-08-16  |  11.0 KB  |  438 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        IText.cpp
  3.  
  4.     Contains:    Routines for manipulating ITexts.
  5.  
  6.     Owned by:    Vincent Lo
  7.  
  8.     Copyright:    © 1994 - 1995 by Apple Computer, Inc., all rights reserved.
  9.  
  10.     To Do:
  11.     
  12.         These could all be rewritten to use the ODByteArray functions,
  13.         thus reducing code size.
  14.  
  15.     In Progress:
  16.         
  17. */
  18.  
  19. #ifndef _EXCEPT_
  20. #include <Except.h>
  21. #endif
  22.  
  23. #ifndef _UTILERRS_
  24. #include <UtilErrs.h>
  25. #endif
  26.  
  27. #ifndef _ODDEBUG_
  28. #include "ODDebug.h"
  29. #endif
  30.  
  31. #ifndef _ODTYPES_
  32. #include "ODTypes.h"
  33. #endif
  34.  
  35. #ifndef _ITEXT_
  36. #include "IText.h"
  37. #endif
  38.  
  39. #ifndef _BARRAY_
  40. #include "BArray.h"
  41. #endif
  42.  
  43. #ifndef _ODMEMORY_
  44. #include "ODMemory.h"
  45. #endif
  46.  
  47. #include "string.h"
  48.  
  49.  
  50. //==============================================================================
  51. // IText
  52. //==============================================================================
  53.  
  54.  
  55. #if ODDebug
  56.     #define CHECK_FORMAT(I)    ASSERTM((I) && (I)->format==kODTraditionalMacText,    \
  57.                                         kODErrAssertionFailed, "Unknown IText format")
  58. #else
  59.     #define CHECK_FORMAT(I)    if( (I)->format==kODTraditionalMacText ) ;            \
  60.                                 else THROW(kODErrInvalidITextFormat)
  61. #endif
  62.  
  63.  
  64. //------------------------------------------------------------------------------
  65. // NewIText  [static]   Creates an uninitialized empty IText.
  66. //------------------------------------------------------------------------------
  67.     
  68. static ODIText* NewIText( )
  69. {
  70.     ODIText* result = new ODIText;
  71.     result->format = kODTraditionalMacText;
  72.     result->text._buffer = kODNULL;
  73.     return result;
  74. }
  75.     
  76.     
  77. //------------------------------------------------------------------------------
  78. // CreateITextCString
  79. //------------------------------------------------------------------------------
  80.     
  81. ODIText* CreateITextCString(ODScriptCode scriptCode, ODLangCode langCode, char* text)
  82. {
  83.     ODIText* result = NewIText();
  84.     
  85.     TRY{
  86.         SetITextString(result, text);
  87.         SetITextScriptCode(result, scriptCode);
  88.         SetITextLangCode(result, langCode);
  89.     }CATCH_ALL{
  90.         DisposeIText(result);
  91.         RERAISE;
  92.     }ENDTRY
  93.     
  94.     return result;
  95. }
  96.  
  97.  
  98. //------------------------------------------------------------------------------
  99. // CreateITextPString
  100. //------------------------------------------------------------------------------
  101.  
  102. ODIText* CreateITextPString(ODScriptCode scriptCode, ODLangCode langCode, StringPtr text)
  103. {
  104.     ODIText* result = NewIText();
  105.     
  106.     TRY{
  107.         SetITextString(result, text);
  108.         SetITextScriptCode(result, scriptCode);
  109.         SetITextLangCode(result, langCode);
  110.     }CATCH_ALL{
  111.         DisposeIText(result);
  112.         RERAISE;
  113.     }ENDTRY
  114.     
  115.     return result;
  116. }
  117.  
  118.  
  119. //------------------------------------------------------------------------------
  120. // CreateITextClear
  121. //------------------------------------------------------------------------------
  122.  
  123. ODIText* CreateITextClear(ODScriptCode scriptCode, ODLangCode langCode, ODSize textLen)
  124. {
  125.     ODIText* result = NewIText();
  126.     
  127.     TRY{
  128.         SetITextBufferSize(result, textLen+sizeof(ODTradITextDataHeader), kODFalse);
  129.         SetITextScriptCode(result, scriptCode);
  130.         SetITextLangCode(result, langCode);
  131.     }CATCH_ALL{
  132.         DisposeIText(result);
  133.         RERAISE;
  134.     }ENDTRY
  135.     
  136.     return result;
  137. }
  138.  
  139.  
  140. //------------------------------------------------------------------------------
  141. // CreateIText
  142. //------------------------------------------------------------------------------
  143.  
  144. ODIText*    CreateITextWLen(ODScriptCode scriptCode, ODLangCode langCode,
  145.                         ODUByte* text, ODSize textLength )
  146. {
  147.     ODIText* result = NewIText();
  148.     
  149.     TRY{
  150.         SetITextBufferSize(result,
  151.                             textLength + sizeof(ODTradITextDataHeader), kODFalse);
  152.         ODBlockMove(text,
  153.                     &(((ODTradITextData*)(result->text._buffer))->theText),
  154.                     textLength);
  155.         SetITextScriptCode(result, scriptCode);
  156.         SetITextLangCode(result, langCode);
  157.     }CATCH_ALL{
  158.         DisposeIText(result);
  159.         RERAISE;
  160.     }ENDTRY
  161.     
  162.     return result;
  163. }
  164.  
  165.  
  166. //------------------------------------------------------------------------------
  167. // CopyIText
  168. //------------------------------------------------------------------------------
  169.  
  170. ODIText* CopyIText(ODIText* original)
  171. {
  172.     CHECK_FORMAT(original);
  173.     
  174.     ODIText* result = NewIText();
  175.     
  176.     TRY{
  177.         unsigned long dataSize = original->text._length;
  178.         result->format = original->format;
  179.         result->text._buffer = (octet *)ODNewPtr(dataSize, kDefaultHeapID);
  180.         result->text._maximum = dataSize;
  181.         result->text._length  = dataSize;
  182.         ODBlockMove(original->text._buffer, result->text._buffer, dataSize);
  183.     }CATCH_ALL{
  184.         DisposeIText(result);
  185.         RERAISE;
  186.     }ENDTRY
  187.     
  188.     return result;
  189. }
  190.  
  191. //------------------------------------------------------------------------------
  192. // CopyITextStruct
  193. //------------------------------------------------------------------------------
  194.  
  195. ODIText CopyITextStruct(ODIText* original)
  196. {
  197.     ODIText    result;
  198.  
  199.     CHECK_FORMAT(original);
  200.  
  201.     result.format = original->format;
  202.     result.text = CopyByteArrayStruct(&(original->text));
  203.  
  204.     return result;
  205. }
  206.  
  207.  
  208. //------------------------------------------------------------------------------
  209. // SetITextBufferSize
  210. //------------------------------------------------------------------------------
  211.  
  212. ODIText*
  213. SetITextBufferSize( ODIText* iText, ODSize bufferSize, ODBoolean preserveContents )
  214. {
  215.     // Will create new IText if input is NULL.
  216.     
  217.     if( iText && iText->text._maximum==bufferSize && iText->text._buffer ) {
  218.         iText->text._length = bufferSize;
  219.         return iText;                        // No-op
  220.     }
  221.     
  222.     ODTradITextData *buffer = (ODTradITextData*) ODNewPtr(bufferSize);
  223.     if( !iText ) {
  224.         TRY{
  225.             iText = NewIText();
  226.         }CATCH_ALL{
  227.             ODDisposePtr(buffer);
  228.             RERAISE;
  229.         }ENDTRY
  230.     } else if( iText->text._buffer ) {
  231.         if( preserveContents )
  232.             ODBlockMove(iText->text._buffer, buffer, bufferSize);
  233.         ODDisposePtr(iText->text._buffer);
  234.     }
  235.     iText->text._buffer = (octet*) buffer;
  236.     iText->text._maximum = bufferSize;
  237.     iText->text._length = bufferSize;
  238.     return iText;
  239. }
  240.  
  241.  
  242. //------------------------------------------------------------------------------
  243. // GetITextPtr
  244. //------------------------------------------------------------------------------
  245.  
  246. char* GetITextPtr( ODIText *iText )
  247. {
  248.     CHECK_FORMAT(iText);
  249.     return ((ODTradITextData*)iText->text._buffer)->theText;
  250. }
  251.  
  252.  
  253. //------------------------------------------------------------------------------
  254. // SetITextScriptCode
  255. //------------------------------------------------------------------------------
  256.  
  257. void SetITextScriptCode(ODIText* iText, ODScriptCode scriptCode)
  258. {
  259.     CHECK_FORMAT(iText);
  260.     ODTradITextData *data = (ODTradITextData*) iText->text._buffer;
  261.     data->theScriptCode = scriptCode;
  262. }
  263.  
  264.  
  265. //------------------------------------------------------------------------------
  266. // GetITextScriptCode
  267. //------------------------------------------------------------------------------
  268.  
  269. ODScriptCode GetITextScriptCode(ODIText* iText)
  270. {
  271.     CHECK_FORMAT(iText);
  272.     ODTradITextData *data = (ODTradITextData*) iText->text._buffer;
  273.     return data->theScriptCode;
  274. }
  275.  
  276.  
  277. //------------------------------------------------------------------------------
  278. // SetITextLangCode
  279. //------------------------------------------------------------------------------
  280.  
  281. void SetITextLangCode(ODIText* iText, ODLangCode langCode)
  282. {
  283.     CHECK_FORMAT(iText);
  284.     ODTradITextData *data = (ODTradITextData*) iText->text._buffer;
  285.     data->theLangCode = langCode;
  286. }
  287.  
  288.  
  289. //------------------------------------------------------------------------------
  290. // GetITextLangCode
  291. //------------------------------------------------------------------------------
  292.  
  293. ODLangCode GetITextLangCode(ODIText* iText)
  294. {
  295.     CHECK_FORMAT(iText);
  296.     ODTradITextData *data = (ODTradITextData*) iText->text._buffer;
  297.     return data->theLangCode;
  298. }
  299.  
  300.  
  301. //------------------------------------------------------------------------------
  302. // SetITextStringLength
  303. //------------------------------------------------------------------------------
  304.  
  305. ODIText* SetITextStringLength( ODIText* iText, ODSize length, ODBoolean preserveText )
  306. {
  307. #if defined(__MWERKS__) && GENERATING68K
  308.     ODTradITextDataHeader data;
  309.     data.theScriptCode = 0;
  310.     data.theLangCode = 0;
  311. #else
  312.     ODTradITextDataHeader data = {0,0};
  313. #endif
  314.     if( iText ) {
  315.         CHECK_FORMAT(iText);
  316.         if( iText->text._buffer )
  317.             data = * (ODTradITextDataHeader*) iText->text._buffer;
  318.     }
  319.     iText = SetITextBufferSize(iText,length+sizeof(ODTradITextDataHeader),preserveText);
  320.     if( !preserveText )
  321.         * (ODTradITextDataHeader*) iText->text._buffer = data;
  322.     return iText;
  323. }
  324.  
  325.  
  326. //------------------------------------------------------------------------------
  327. // GetITextStringLength
  328. //------------------------------------------------------------------------------
  329.  
  330. ODULong GetITextStringLength(ODIText* iText)
  331. {
  332.     CHECK_FORMAT(iText);
  333.     if( iText->text._buffer )
  334.         return iText->text._length - sizeof(ODTradITextDataHeader);
  335.     else
  336.         return 0;
  337. }
  338.  
  339.  
  340. //------------------------------------------------------------------------------
  341. // SetITextCString
  342. //------------------------------------------------------------------------------
  343.  
  344. void SetITextCString(ODIText* iText, char* text)
  345. {
  346.     CHECK_FORMAT(iText);
  347.     ODSize textLen = text ?strlen(text) :0;
  348.     SetITextStringLength(iText,textLen,kODFalse);
  349.     ODBlockMove(text, ((ODTradITextData*)iText->text._buffer)->theText, textLen);
  350. }    
  351.  
  352.  
  353. //------------------------------------------------------------------------------
  354. // SetITextPString
  355. //------------------------------------------------------------------------------
  356.  
  357. void SetITextPString(ODIText* iText, StringPtr text)
  358. {
  359.     CHECK_FORMAT(iText);
  360.     ODSize textLen = text ?text[0] :0;
  361.     SetITextStringLength(iText,textLen,kODFalse);
  362.     ODBlockMove(&text[1], ((ODTradITextData*)iText->text._buffer)->theText, textLen);
  363. }    
  364.  
  365.  
  366. //------------------------------------------------------------------------------
  367. // SetITextText
  368. //------------------------------------------------------------------------------
  369.  
  370. void SetITextText(ODIText* iText, ODUByte* text, ODSize textLength)
  371. {
  372.     CHECK_FORMAT(iText);
  373.     SetITextStringLength(iText, textLength, kODFalse);
  374.     ODBlockMove(text, ((ODTradITextData*)iText->text._buffer)->theText,
  375.                 textLength);
  376. }    
  377.  
  378.  
  379. //------------------------------------------------------------------------------
  380. // GetITextCString
  381. //------------------------------------------------------------------------------
  382.  
  383. char* GetITextCString(ODIText* iText, char *cstring)
  384. {
  385.     CHECK_FORMAT(iText);
  386.     ODSize len;
  387.     if( iText->text._buffer )
  388.         len = iText->text._length - sizeof(ODTradITextDataHeader);
  389.     else
  390.         len = 0;
  391.         
  392.     if( !cstring )
  393.         cstring = new char[len+1];
  394.     cstring[len] = '\0';
  395.     if( len )
  396.         ODBlockMove(((ODTradITextData*)iText->text._buffer)->theText,
  397.                     cstring, len);
  398.     return cstring;
  399. }
  400.  
  401.  
  402. //------------------------------------------------------------------------------
  403. // GetITextPString
  404. //------------------------------------------------------------------------------
  405.  
  406. StringPtr GetITextPString(ODIText* iText, Str255 pstring)
  407. {
  408.     CHECK_FORMAT(iText);
  409.     ODSize len;
  410.     if( iText->text._buffer )
  411.         len = iText->text._length - sizeof(ODTradITextDataHeader);
  412.     else
  413.         len = 0;
  414.         
  415.     if( !pstring )
  416.         pstring = new unsigned char[len+1];
  417.     if( len )
  418.         ODBlockMove(((ODTradITextData*)iText->text._buffer)->theText,
  419.                     &pstring[1], len);
  420.     pstring[0] = len;
  421.     return pstring;
  422. }
  423.  
  424.  
  425. //------------------------------------------------------------------------------
  426. // DisposeIText
  427. //------------------------------------------------------------------------------
  428.  
  429. void DisposeIText(ODIText* iText)
  430. {
  431.     if( iText ) {
  432.         CHECK_FORMAT(iText);
  433.         DisposeITextStruct(*iText);
  434.         delete iText;
  435.     }
  436. }
  437.  
  438.