Example #1
0
/* $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 );
   }
}
Example #2
0
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 );
      }
   }
}