Files
harbour-core/harbour/contrib/hbamf/amfstdio.c
Viktor Szakats cf1dcec338 2012-06-14 00:24 UTC+0200 Viktor Szakats (harbour syenar.net)
* contrib/hbamf/amfdec.c
  * contrib/hbamf/amfenc.c
  * contrib/hbamf/amfstdio.c
    ! fixed about 30 compiler warnings mostly on missing
      paranthesis causing ambiguous expressions, superfluous
      variable initializations and one case where probably
      an 'else' was missing. Please review the patch to
      see if ambiguous cases were correctly fixed.
2012-06-13 22:26:52 +00:00

100 lines
2.2 KiB
C

/*
* $Id$
*/
/*******
*
* by Ilina Stoilkovska <anili100/at/gmail.com> 2011
* Aleksander Czajczynski <hb/at/fki.pl> 2012
*
* Reading AMFIO data from standard input pipe
*
*
********/
#include "hbapi.h"
#include "hbapiitm.h"
#include "hbapigt.h"
#include "hbapifs.h"
#define SINGLEBUF 32768
#define MAXLEN ( 16 * 1024 * 1024 )
static int s_nCount = 0;
static void countCheck( int n )
{
/* yes, this is flow-control */
s_nCount += n;
while( s_nCount >= SINGLEBUF )
{
hb_conOutStd( "\0\0\0\0", 4 );
s_nCount -= SINGLEBUF;
}
}
HB_FUNC( AMFSTDIO_READ )
{
char * pszStrIn = ( char * ) hb_xgrab( SINGLEBUF );
char * pszLenPrefix = ( char * ) hb_xgrab( 5 );
char * pszBuf; /* = ( char * ) hb_xgrab( SINGLEBUF ); */
char * pszTmp = pszLenPrefix;
HB_USHORT nBytes;
int nTotal = 0;
int nLen;
int nToRead;
HB_FHANDLE hStdIn = hb_fsGetOsHandle( HB_STDIN_HANDLE );
while( nTotal < 4 )
{
nToRead = ( s_nCount + 4 - nTotal > SINGLEBUF ? SINGLEBUF - s_nCount : 4 - nTotal );
nBytes = hb_fsRead( hStdIn, pszStrIn, ( HB_USHORT ) nToRead );
countCheck( nBytes );
memcpy( pszTmp, pszStrIn, nBytes );
nTotal += nBytes;
pszTmp = pszLenPrefix + nTotal;
}
pszLenPrefix[ 4 ] = '\0';
nLen = HB_GET_LE_UINT32( pszLenPrefix );
if( nLen >= MAXLEN )
{
hb_ret();
return;
}
nTotal = 0;
pszBuf = ( char * ) hb_xgrab( nLen + 1 );
pszTmp = pszBuf;
while( nTotal < nLen )
{
/*
* here it's being decided that nToRead is never over 32768 bytes long,
* so hb_fsRead() is fine, no hb_fsReadLarge() needed
*/
if( nLen - nTotal > SINGLEBUF )
nToRead = SINGLEBUF - s_nCount;
else
nToRead = ( s_nCount + nLen - nTotal > SINGLEBUF ? SINGLEBUF - s_nCount : nLen - nTotal );
nBytes = hb_fsRead( hStdIn, pszStrIn, ( HB_USHORT ) nToRead );
countCheck( nBytes );
memcpy( pszTmp, pszStrIn, nBytes );
nTotal += nBytes;
pszTmp = pszBuf + nTotal;
}
hb_xfree( pszStrIn );
hb_xfree( pszLenPrefix );
hb_retclen_buffer( pszBuf, nLen );
}