Files
harbour-core/contrib/hbnf/getenvrn.c
vszakats 9687850865 2013-03-16 02:10 UTC+0100 Viktor Szakats (harbour syenar.net)
* (all files)
    * stripped svn header
    * minor cleanups
    ; use following command to find out the history of files:
       git log
       git log --follow
       git blame
       git annotate
2013-03-16 02:11:42 +01:00

171 lines
4.7 KiB
C

/*
* Author....: Rick Whitt
* CIS ID....: 70672,605
*
* This is an original work by Rick Whitt and is placed in the
* public domain.
*
* Modification history:
* ---------------------
* Rev 1.2a 09 Sep 1996 JO
* Added underscore prefix to environ() calls for MSC 8.0
* Note: 5.2e version will work if linked with MSC OldNames.lib
*
* Rev 1.2 01 Jan 1996 03:01:00 TED
* Added prototypes to kill compiler warning.
*
* Rev 1.1 15 Aug 1991 23:08:42 GLENN
* Forest Belt proofread/edited/cleaned up doc
*
* Rev 1.0 17 Jul 1991 22:08:12 GLENN
* Initial revision.
*
*/
#include "hbapi.h"
#include "hbapiitm.h"
#if defined( HB_OS_UNIX )
# include <unistd.h>
# if defined( HB_OS_DARWIN )
# include <crt_externs.h>
# define environ ( *_NSGetEnviron() )
# elif ! defined( __WATCOMC__ )
extern char ** environ;
# endif
#elif defined( HB_OS_DOS )
# define environ _environ
extern char ** _environ;
#elif defined( HB_OS_WIN ) && ! defined( HB_OS_WIN_CE )
# include "hbwinuni.h"
# include <windows.h>
#endif
#define NORETURN 0
#define CHARTYPE 1
#define ARRAYTYPE 2
#define CRLF "\x0D\x0A"
HB_FUNC( FT_GETE )
{
#if defined( HB_OS_DOS ) || defined( HB_OS_UNIX )
{
char * buffer = NULL;
int x;
int buffsize = 0;
int rettype = HB_ISARRAY( 1 ) ? ARRAYTYPE :
( HB_ISCHAR( 1 ) && HB_ISBYREF( 1 ) ? CHARTYPE : NORETURN );
/* scan strings first and add up total size */
if( rettype == CHARTYPE )
{
for( x = 0; environ[ x ]; x++ )
{
/* add length of this string plus 2 for the crlf */
buffsize += ( strlen( environ[ x ] ) + 2 );
}
/* add 1 more byte for final nul character */
buffsize++;
/* now allocate that much memory and make sure 1st byte is a nul */
buffer = ( char * ) hb_xgrab( buffsize + 1 );
buffer[ 0 ] = '\0';
}
for( x = 0; environ[ x ]; x++ )
{
if( ! environ[ x ] )
/* null string, we're done */
break;
if( rettype == CHARTYPE )
{
/* tack string onto end of buffer */
hb_strncat( buffer, environ[ x ], buffsize );
/* add crlf at end of each string */
hb_strncat( buffer, CRLF, buffsize );
}
else if( rettype == ARRAYTYPE )
/* store string to next array element */
hb_storvc( environ[ x ], 1, x + 1 );
}
if( rettype == CHARTYPE )
{
/* return buffer to app and free memory */
if( ! hb_storclen_buffer( buffer, strlen( buffer ), 1 ) )
hb_xfree( buffer );
}
/* return number of strings found */
hb_retni( x );
}
#elif defined( HB_OS_WIN ) && ! defined( HB_OS_WIN_CE )
{
LPTCH lpEnviron = GetEnvironmentStrings(), lpEnv;
LPTSTR lpResult = NULL, lpDst;
HB_SIZE nSize = 0, nCount = 0;
PHB_ITEM pArray = NULL;
int rettype = HB_ISARRAY( 1 ) ? ARRAYTYPE :
( HB_ISCHAR( 1 ) && HB_ISBYREF( 1 ) ? CHARTYPE : NORETURN );
if( lpEnviron )
{
if( rettype == CHARTYPE )
{
for( lpEnv = lpEnviron; *lpEnv; lpEnv++ )
{
while( *++lpEnv )
++nSize;
nSize += 3;
}
if( nSize > 0 )
lpResult = ( LPTSTR ) hb_xgrab( ( nSize + 1 ) * sizeof( TCHAR ) );
}
else if( rettype == ARRAYTYPE )
pArray = hb_param( 1, HB_IT_ARRAY );
for( lpEnv = lpEnviron, lpDst = lpResult; *lpEnv; lpEnv++ )
{
nCount++;
if( rettype == CHARTYPE )
{
do
{
*lpDst++ = *lpEnv++;
}
while( *lpEnv );
*lpDst++ = '\r';
*lpDst++ = '\n';
}
else if( rettype == ARRAYTYPE )
{
nSize = 0;
while( lpEnv[ ++nSize ] )
;
HB_ARRAYSETSTRLEN( pArray, nCount, lpEnv, nSize - 1 );
lpEnv += nSize;
}
}
FreeEnvironmentStrings( lpEnviron );
if( rettype == CHARTYPE )
{
PHB_ITEM pItem = HB_ITEMPUTSTRLEN( NULL, lpResult, nSize );
if( ! hb_itemParamStoreRelease( 1, pItem ) )
hb_itemRelease( pItem );
hb_xfree( lpResult );
}
}
else if( rettype == CHARTYPE )
hb_storc( NULL, 1 );
hb_retns( nCount );
}
#else
if( HB_ISCHAR( 1 ) )
hb_storc( NULL, 1 );
hb_retni( 0 );
#endif
}