/* $Doc$ * $FuncName$ AddToArray( <pItem>, <pReturn>, <uiPos> ) * $Description$ Add <pItem> to array <pReturn> at pos <uiPos> * $End$ */ static void AddToArray( PHB_ITEM pItem, PHB_ITEM pReturn, ULONG ulPos ) { HB_ITEM_NEW( Temp ); HB_TRACE(HB_TR_DEBUG, ("AddToArray(%p, %p, %lu)", pItem, pReturn, ulPos)); if( pItem->type == HB_IT_SYMBOL ) { int iLen = strlen( pItem->item.asSymbol.value->szName ) + 2; char *sTemp = (char *) hb_xgrab( iLen + 1 ); hb_snprintf( sTemp, iLen + 1, "[%s]", pItem->item.asSymbol.value->szName ); hb_itemPutCPtr( &Temp, sTemp, iLen ); hb_arraySetForward( pReturn, ulPos, &Temp ); // hb_itemRelease( pTemp ); /* Get rid of temporary str.*/ } else /* Normal types */ { hb_arraySet( pReturn, ulPos, pItem ); } }
HB_EXTERN_END /* adjustable, but this should be sufficient in normal situation */ #define MAX_READ 4096 void hb_ParseLine( PHB_ITEM pReturn, const char * szText, int iDelimiter, int * iWord ) { if( szText ) { int iLen = ( int ) strlen( szText ); if( iLen > 0 ) { HB_ITEM_NEW( Temp ); int i = 0, word_count = 0; /* booked enough memory */ char * szResult = ( char * ) hb_xgrab( iLen + 1 ); while( i < iLen ) { int ui = 0; hb_xmemset( szResult, ' ', ( size_t ) ( iLen + 1 ) ); /* an '"' found, loop until the next one is found */ if( szText[ i ] == '"' ) { /* an '"' after '"' ? */ if( szText[ i + 1 ] != '"' ) szResult[ ui ] = szText[ i + 1 ]; else szResult[ ui ] = '\0'; ++i; while( ++i < iLen ) { if( szText[ i - 1 ] == '"' ) { szResult[ ui + 1 ] = '\0'; break; } if( szText[ i ] == '"' ) szResult[ ui + 1 ] = '\0'; else szResult[ ++ui ] = szText[ i ]; } word_count++; hb_arrayAddForward( pReturn, hb_itemPutC( &Temp, szResult ) ); } /* delimiter found */ else if( szText[ i ] == iDelimiter ) { /* first delimiter found but no word yet */ if( word_count == 0 ) /* add an empty string */ szResult[ ui ] = '\0'; else { /* we have already have the first word * check next character */ if( szText[ i - 1 ] == iDelimiter ) /* delimiter after delimiter * just add an empty string */ szResult[ ui ] = '\0'; else { /* ",,0" * it is not a delimiter * move to next character */ ++i; szResult[ ui ] = szText[ i ]; while( ++i < iLen ) { if( szText[ i ] == iDelimiter ) break; szResult[ ++ui ] = szText[ i ]; } } } word_count++; szResult[ ui + 1 ] = '\0'; hb_arrayAddForward( pReturn, hb_itemPutC( &Temp, szResult ) ); } else { szResult[ ui ] = szText[ i ]; while( ++i < iLen ) { if( szText[ i ] == iDelimiter ) { szResult[ ui + 1 ] = '\0'; break; } if( szText[ i ] == '"' ) { szResult[ ui ] = szText[ i + 1 ]; ++i; while( ++i < iLen ) { if( ( szText[ i - 1 ] == '"' ) || ( szText[ i ] == '"' ) ) { szResult[ ui + 1 ] = '\0'; break; } szResult[ ++ui ] = szText[ i ]; } } else szResult[ ++ui ] = szText[ i ]; } word_count++; szResult[ ui + 1 ] = '\0'; hb_arrayAddForward( pReturn, hb_itemPutC( &Temp, szResult ) ); } i++; } /* last character in passed string is a delimiter * just add an empty string */ if( szText[ iLen - 1 ] == iDelimiter ) { word_count++; hb_arrayAddForward( pReturn, hb_itemPutC( &Temp, "" ) ); } /* store number of words */ *iWord = word_count; /* clean up */ hb_xfree( szResult ); } } }