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 / OpenDoc Development / Debugging Support / OpenDoc Source Code / Utilities / IText.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-04-22  |  10.9 KB  |  432 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.     ODTradITextDataHeader data = {0,0};
  308.     if( iText ) {
  309.         CHECK_FORMAT(iText);
  310.         if( iText->text._buffer )
  311.             data = * (ODTradITextDataHeader*) iText->text._buffer;
  312.     }
  313.     iText = SetITextBufferSize(iText,length+sizeof(ODTradITextDataHeader),preserveText);
  314.     if( !preserveText )
  315.         * (ODTradITextDataHeader*) iText->text._buffer = data;
  316.     return iText;
  317. }
  318.  
  319.  
  320. //------------------------------------------------------------------------------
  321. // GetITextStringLength
  322. //------------------------------------------------------------------------------
  323.  
  324. ODULong GetITextStringLength(ODIText* iText)
  325. {
  326.     CHECK_FORMAT(iText);
  327.     if( iText->text._buffer )
  328.         return iText->text._length - sizeof(ODTradITextDataHeader);
  329.     else
  330.         return 0;
  331. }
  332.  
  333.  
  334. //------------------------------------------------------------------------------
  335. // SetITextCString
  336. //------------------------------------------------------------------------------
  337.  
  338. void SetITextCString(ODIText* iText, char* text)
  339. {
  340.     CHECK_FORMAT(iText);
  341.     ODSize textLen = text ?strlen(text) :0;
  342.     SetITextStringLength(iText,textLen,kODFalse);
  343.     ODBlockMove(text, ((ODTradITextData*)iText->text._buffer)->theText, textLen);
  344. }    
  345.  
  346.  
  347. //------------------------------------------------------------------------------
  348. // SetITextPString
  349. //------------------------------------------------------------------------------
  350.  
  351. void SetITextPString(ODIText* iText, StringPtr text)
  352. {
  353.     CHECK_FORMAT(iText);
  354.     ODSize textLen = text ?text[0] :0;
  355.     SetITextStringLength(iText,textLen,kODFalse);
  356.     ODBlockMove(&text[1], ((ODTradITextData*)iText->text._buffer)->theText, textLen);
  357. }    
  358.  
  359.  
  360. //------------------------------------------------------------------------------
  361. // SetITextText
  362. //------------------------------------------------------------------------------
  363.  
  364. void SetITextText(ODIText* iText, ODUByte* text, ODSize textLength)
  365. {
  366.     CHECK_FORMAT(iText);
  367.     SetITextStringLength(iText, textLength, kODFalse);
  368.     ODBlockMove(text, ((ODTradITextData*)iText->text._buffer)->theText,
  369.                 textLength);
  370. }    
  371.  
  372.  
  373. //------------------------------------------------------------------------------
  374. // GetITextCString
  375. //------------------------------------------------------------------------------
  376.  
  377. char* GetITextCString(ODIText* iText, char *cstring)
  378. {
  379.     CHECK_FORMAT(iText);
  380.     ODSize len;
  381.     if( iText->text._buffer )
  382.         len = iText->text._length - sizeof(ODTradITextDataHeader);
  383.     else
  384.         len = 0;
  385.         
  386.     if( !cstring )
  387.         cstring = new char[len+1];
  388.     cstring[len] = '\0';
  389.     if( len )
  390.         ODBlockMove(((ODTradITextData*)iText->text._buffer)->theText,
  391.                     cstring, len);
  392.     return cstring;
  393. }
  394.  
  395.  
  396. //------------------------------------------------------------------------------
  397. // GetITextPString
  398. //------------------------------------------------------------------------------
  399.  
  400. StringPtr GetITextPString(ODIText* iText, Str255 pstring)
  401. {
  402.     CHECK_FORMAT(iText);
  403.     ODSize len;
  404.     if( iText->text._buffer )
  405.         len = iText->text._length - sizeof(ODTradITextDataHeader);
  406.     else
  407.         len = 0;
  408.         
  409.     if( !pstring )
  410.         pstring = new unsigned char[len+1];
  411.     if( len )
  412.         ODBlockMove(((ODTradITextData*)iText->text._buffer)->theText,
  413.                     &pstring[1], len);
  414.     pstring[0] = len;
  415.     return pstring;
  416. }
  417.  
  418.  
  419. //------------------------------------------------------------------------------
  420. // DisposeIText
  421. //------------------------------------------------------------------------------
  422.  
  423. void DisposeIText(ODIText* iText)
  424. {
  425.     if( iText ) {
  426.         CHECK_FORMAT(iText);
  427.         DisposeITextStruct(*iText);
  428.         delete iText;
  429.     }
  430. }
  431.  
  432.