hxsym_console_util.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:3k
源码类别:

Symbian

开发平台:

C/C++

  1. /*****************************************************************************
  2.  * hxsym_console_util.cpp
  3.  * ---------------
  4.  *
  5.  *
  6.  * utilities for printing dprintf output to RDebug (console)
  7.  *
  8.  *
  9.  * Target:
  10.  * Symbian OS
  11.  *
  12.  *
  13.  * (c) 1995-2003 RealNetworks, Inc. Patents pending. All rights reserved.
  14.  *
  15.  *****************************************************************************/
  16. // Symbian includes... 
  17. #include <e32base.h>
  18. #include <e32def.h>
  19. #include <e32svr.h>
  20. #include <string.h>
  21. #include "hxassert.h"
  22. #include "hxsym_console_util.h"
  23. #if !defined (HELIX_FEATURE_DPRINTF)
  24. #error file should not be included in build
  25. #endif
  26. namespace
  27. {
  28. void EnsureSafeChunk(TPtrC& ptrChunk);
  29. HBufC* AllocEscapedBuffer(const char* pszText);
  30. //
  31. // Ensure that chunk doesn't end in middle of escape (%X) sequence. If it does,
  32. // resize chunk slightly smaller so that it does not.
  33. // 
  34. void EnsureSafeChunk(TPtrC& ptrChunk)
  35. {
  36.     TUint32 cchChunk = ptrChunk.Length();
  37.     HX_ASSERT(cchChunk > 0);
  38.     // update chunk if last char is '%' (may or may not be beginning of escape sequence)
  39.     TUint32 idx = cchChunk - 1;
  40.     if( ptrChunk[idx] == '%' )
  41.     {
  42.         // scan back before all '%' chars at end of chunk
  43.         while( ptrChunk[idx] == '%' && idx > 0 )
  44.         {
  45.             --idx;
  46.         };
  47.     
  48.         // scan forward
  49.         bool bInEscape = false;
  50.         for (/**/; idx < cchChunk; ++idx)
  51.         {
  52.             if( !bInEscape && ptrChunk[idx] == '%' )
  53.             {
  54.                 bInEscape = true;
  55.             }
  56.             else
  57.             {
  58.                 bInEscape = false;
  59.             }
  60.         }
  61.         if(bInEscape)
  62.         {
  63.             // last char was escape char (would split chunk in middle of '%X')
  64.             ptrChunk.Set( ptrChunk.Left(cchChunk - 1));
  65.         }
  66.         HX_ASSERT(ptrChunk.Length() > 0);
  67.     }
  68. }
  69. //
  70. // escape possible '%' chars in text
  71. //
  72. HBufC* AllocEscapedBuffer(const char* pszText)
  73. {
  74.     HBufC* pBuff = 0;
  75.     TUint32 cchIn = pszText ? strlen(pszText) : 0;
  76.     if (cchIn > 0)
  77.     {
  78.         // determine length needed in order to escape '%'
  79.         TUint32 cch = cchIn;
  80.         for(TUint32 idx = 0; idx < cchIn; ++idx)
  81.         {
  82.             if( pszText[idx] == '%' )
  83.             {
  84.                 ++cch;
  85.             }
  86.         }
  87.         // allocate new buffer
  88. pBuff = HBufC::NewMax(cch);
  89.         if( pBuff)
  90.         {
  91.             // escape '%' with '%%'
  92.     TPtr ptr = pBuff->Des();
  93.             TUint32 idxOut = 0;
  94.             for(TUint32 idx = 0; idx < cchIn; ++idx)
  95.             {
  96.         if( pszText[idx] == '%' )
  97.                 {
  98.                     ptr[idxOut++] = '%';
  99.                 }
  100.                 ptr[idxOut++] = pszText[idx];
  101.             }
  102.         }
  103.     }
  104.     return pBuff;   
  105. }
  106. } // locals
  107. //
  108. // print text to console (via RDebug)
  109. //
  110. void PrintConsole(const char* pszText)
  111. {
  112.     // allocate new buffer
  113.     HBufC* pBuff = AllocEscapedBuffer(pszText);
  114.     if(pBuff)
  115.     {
  116.         // print out in chunks to work around RDebug limit
  117. TUint32 cchLeft = pBuff->Des().Length();
  118. TUint32 idxOffset = 0;
  119. const TUint32 CHUNK_SIZE = 128;
  120. while (cchLeft > 0)
  121. {
  122.     TPtrC ptrChunk(pBuff->Ptr() + idxOffset, Min(cchLeft, CHUNK_SIZE));
  123.             
  124.             EnsureSafeChunk(ptrChunk);
  125.     RDebug::Print(ptrChunk);
  126.     idxOffset += ptrChunk.Length();
  127.     cchLeft -= ptrChunk.Length();
  128. }
  129. delete pBuff;
  130.     }
  131. }