diff --git a/harbour/ChangeLog b/harbour/ChangeLog index cf7c26ae91..63d7b3f0bf 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -16,6 +16,17 @@ The license applies to all entries newer than 2009-04-28. */ +2011-05-09 13:13 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) + + contrib/hbwin/wapi_misc.c + * contrib/hbwin/hbwin.hbp + * contrib/hbwin/hbwapi.h + * contrib/hbwin/win_prn3.c + * hb_tstrlen() -> hbwapi_tstrlen() and made public + * hb_tstrncat() -> hbwapi_tstrncat() and made public + + hbwapi_tstrdup() + + hbwapi_FileNameAtSystemDir() public function + please review it, I'm notoriously bad with 1 byte over/underruns + 2011-05-09 12:32 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) * contrib/gtwvg/gtwvg.c * examples/gtwvw/gtwvw.c diff --git a/harbour/contrib/hbwin/hbwapi.h b/harbour/contrib/hbwin/hbwapi.h index 1944780aaf..0706f2eddd 100644 --- a/harbour/contrib/hbwin/hbwapi.h +++ b/harbour/contrib/hbwin/hbwapi.h @@ -126,6 +126,11 @@ HB_EXTERN_BEGIN +extern HB_EXPORT TCHAR * hbwapi_tstrdup( const TCHAR * pszText ); +extern HB_EXPORT TCHAR * hbwapi_tstrncat( TCHAR * pDest, const TCHAR * pSource, HB_SIZE nLen ); +extern HB_EXPORT HB_SIZE hbwapi_tstrlen( const TCHAR * pText ); +extern HB_EXPORT TCHAR * hbwapi_FileNameAtSystemDir( const TCHAR * pFileName ); + extern HB_EXPORT void hbwapi_SetLastError( DWORD dwLastError ); extern HB_EXPORT DWORD hbwapi_GetLastError( void ); diff --git a/harbour/contrib/hbwin/hbwin.hbp b/harbour/contrib/hbwin/hbwin.hbp index bd12ded4ac..8a34ed1736 100644 --- a/harbour/contrib/hbwin/hbwin.hbp +++ b/harbour/contrib/hbwin/hbwin.hbp @@ -39,6 +39,7 @@ hbolesrv.c wapi_alloc.c wapi_commctrl.c wapi_err.c +wapi_misc.c wapi_mmsystem.c wapi_shellapi.c wapi_winbase.c diff --git a/harbour/contrib/hbwin/wapi_misc.c b/harbour/contrib/hbwin/wapi_misc.c new file mode 100644 index 0000000000..4c281aa669 --- /dev/null +++ b/harbour/contrib/hbwin/wapi_misc.c @@ -0,0 +1,133 @@ +/* + * $Id$ + */ + +/* + * Harbour Project source code: + * Low-level Windows worker functions + * + * Copyright 2011 Viktor Szakats (harbour.01 syenar.hu) + * www - http://harbour-project.org + * + * 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 2, 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 software; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/). + * + * As a special exception, the Harbour Project gives permission for + * additional uses of the text contained in its release of Harbour. + * + * The exception is that, if you link the Harbour libraries with other + * files to produce an executable, this does not by itself cause the + * resulting executable to be covered by the GNU General Public License. + * Your use of that executable is in no way restricted on account of + * linking the Harbour library code into it. + * + * This exception does not however invalidate any other reasons why + * the executable file might be covered by the GNU General Public License. + * + * This exception applies only to the code released by the Harbour + * Project under the name Harbour. If you copy code from other + * Harbour Project or Free Software Foundation releases into a copy of + * Harbour, as the General Public License permits, the exception does + * not apply to the code that you add in this way. To avoid misleading + * anyone as to the status of such modified files, you must delete + * this exception notice from them. + * + * If you write modifications of your own for Harbour, it is your choice + * whether to permit this exception to apply to your modifications. + * If you do not wish that, delete this exception notice. + * + */ + +#include "hbwapi.h" + +/* NOTE: Based on hb_strdup() */ +TCHAR * hbwapi_tstrdup( const TCHAR * pszText ) +{ + TCHAR * pszDup; + HB_SIZE nLen; + + HB_TRACE(HB_TR_DEBUG, ("hbwapi_tstrdup(%p)", pszText)); + + nLen = ( hbwapi_tstrlen( pszText ) + 1 ) * sizeof( TCHAR ); + + pszDup = ( TCHAR * ) hb_xgrab( nLen ); + memcpy( pszDup, pszText, nLen ); + + return pszDup; +} + +/* NOTE: Based on hb_strncat() */ +TCHAR * hbwapi_tstrncat( TCHAR * pDest, const TCHAR * pSource, HB_SIZE nLen ) +{ + TCHAR * pBuf = pDest; + + HB_TRACE(HB_TR_DEBUG, ("hbwapi_tstrncat(%p, %p, %" HB_PFS "u)", pDest, pSource, nLen)); + + pDest[ nLen ] = TEXT( '\0' ); + + while( nLen && *pDest ) + { + pDest++; + nLen--; + } + + while( nLen && ( *pDest++ = *pSource++ ) != TEXT( '\0' ) ) + nLen--; + + return pBuf; +} + +HB_SIZE hbwapi_tstrlen( const TCHAR * pText ) +{ + HB_SIZE nLen = 0; + + HB_TRACE(HB_TR_DEBUG, ("hbwapi_tstrlen(%p)", pText)); + + while( pText[ nLen ] != TEXT( '\0' ) ) + ++nLen; + + return nLen; +} + +TCHAR * hbwapi_FileNameAtSystemDir( const TCHAR * pFileName ) +{ +#if defined( HB_OS_WIN_CE ) + return hbwapi_tstrdup( pFileName ); +#else + UINT nLen = GetSystemDirectory( NULL, 0 ); + + if( nLen ) + { + LPTSTR buffer; + + if( pFileName ) + nLen += hbwapi_tstrlen( pFileName ) + 1; + + buffer = ( LPTSTR ) hb_xgrab( nLen * sizeof( TCHAR ) ); + + GetSystemDirectory( buffer, nLen ); + + if( pFileName ) + { + hbwapi_tstrncat( buffer, TEXT( "\\" ), nLen - 1 ); + hbwapi_tstrncat( buffer, pFileName, nLen - 1 ); + } + + return buffer; + } + else + return hbwapi_tstrdup( pFileName ); +#endif +} diff --git a/harbour/contrib/hbwin/win_prn3.c b/harbour/contrib/hbwin/win_prn3.c index 23fc8721ed..f3448b9fb1 100644 --- a/harbour/contrib/hbwin/win_prn3.c +++ b/harbour/contrib/hbwin/win_prn3.c @@ -50,45 +50,10 @@ * */ -#include "hbwin.h" +#include "hbwapi.h" #if ! defined( HB_OS_WIN_CE ) - -#include - -/* NOTE: Based on hb_strncat() */ -static TCHAR * hb_tstrncat( TCHAR * pDest, const TCHAR * pSource, HB_SIZE nLen ) -{ - TCHAR * pBuf = pDest; - - HB_TRACE(HB_TR_DEBUG, ("hb_tstrncat(%p, %p, %" HB_PFS "u)", pDest, pSource, nLen)); - - pDest[ nLen ] = TEXT( '\0' ); - - while( nLen && *pDest ) - { - pDest++; - nLen--; - } - - while( nLen && ( *pDest++ = *pSource++ ) != TEXT( '\0' ) ) - nLen--; - - return pBuf; -} - -static HB_SIZE hb_tstrlen( const TCHAR * pText ) -{ - HB_SIZE nLen = 0; - - HB_TRACE(HB_TR_DEBUG, ("hb_tstrlen(%p)", pText)); - - while( pText[ nLen ] != TEXT( '\0' ) ) - ++nLen; - - return nLen; -} - +# include #endif static HB_BOOL hb_SetDefaultPrinter( LPCTSTR lpPrinterName ) @@ -217,9 +182,9 @@ static HB_BOOL hb_SetDefaultPrinter( LPCTSTR lpPrinterName ) return HB_FALSE; } - nStrLen = hb_tstrlen( lpPrinterName ) + - hb_tstrlen( ppi2->pDriverName ) + - hb_tstrlen( ppi2->pPortName ) + 2; + nStrLen = hbwapi_tstrlen( lpPrinterName ) + + hbwapi_tstrlen( ppi2->pDriverName ) + + hbwapi_tstrlen( ppi2->pPortName ) + 2; /* Allocate buffer big enough for concatenated string. String will be in form "printername,drivername,portname". */ @@ -228,11 +193,11 @@ static HB_BOOL hb_SetDefaultPrinter( LPCTSTR lpPrinterName ) pBuffer[ 0 ] = TEXT( '\0' ); /* Build string in form "printername,drivername,portname". */ - hb_tstrncat( pBuffer, lpPrinterName, nStrLen ); - hb_tstrncat( pBuffer, TEXT( "," ), nStrLen ); - hb_tstrncat( pBuffer, ppi2->pDriverName, nStrLen ); - hb_tstrncat( pBuffer, TEXT( "," ), nStrLen ); - hb_tstrncat( pBuffer, ppi2->pPortName, nStrLen ); + hbwapi_tstrncat( pBuffer, lpPrinterName, nStrLen ); + hbwapi_tstrncat( pBuffer, TEXT( "," ), nStrLen ); + hbwapi_tstrncat( pBuffer, ppi2->pDriverName, nStrLen ); + hbwapi_tstrncat( pBuffer, TEXT( "," ), nStrLen ); + hbwapi_tstrncat( pBuffer, ppi2->pPortName, nStrLen ); /* Set the default printer in win.ini and registry. */ bFlag = WriteProfileString( TEXT( "windows" ), TEXT( "device" ), pBuffer );