Page 1 of 1

FWH64 and at() function

Posted: Sun Mar 04, 2012 10:38 pm
by George
Team,
The at() function is not accepting the third parameter in FWH64.
From documentation:
AT()
Locates the position of a substring in a main string.
Syntax
AT( <cSearch>, <cString>, [<nStart>], [<nEnd>] ) --> nPos
Argument(s)
<cSearch> Substring to search for
<cString> Main string
<nStart> First position to search in cString, by default 1
<nEnd> End posistion to search, by default cString length
When passing only two parameters is OK.
See below the error that I am receiving when passing the third parameter:
Error 0021 Incorrect number of arguments in AT Passed: 3, expected: 2

Regards,


George

Re: FWH64 and at() function

Posted: Mon Mar 05, 2012 3:05 am
by Antonio Linares

Re: FWH64 and at() function

Posted: Mon Mar 05, 2012 2:54 pm
by George
Antonio,
I was using the harbour64 that comes with FWH64 package (Oct 2011)
However after changing to new harbour64_vc64_20120127 I am getting the same message:
Error 0021 Incorrect number of arguments in AT Passed: 3, expected: 2

Please see below the AT() function source code , (maybe this can help to fix the problem), found on harbour:

Code: Select all

/*
 * $Id: at.c,v 1.15 2009/03/02 09:20:04 marchuet Exp $
 */

/*
 * Harbour Project source code:
 * AT() function
 *
 * Copyright 1999 Antonio Linares <alinares@fivetech.com>
 * www - http://www.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 <ctype.h>

#include "hbapi.h"
#include "hbapiitm.h"
#include "hbapierr.h"

/* locates a substring in a string */

#ifdef HB_C52_STRICT

    HB_FUNC( AT )
    {
       PHB_ITEM pSub = hb_param( 1, HB_IT_STRING );
       PHB_ITEM pText = hb_param( 2, HB_IT_STRING );

       if( pText && pSub )
       {
          hb_retnl( hb_strAt( pSub->item.asString.value, pSub->item.asString.length, pText->item.asString.value, pText->item.asString.length ) );
       }
       else
       {
          hb_errRT_BASE_SubstR( EG_ARG, 1108, NULL, "AT", 2, hb_paramError( 1 ), hb_paramError( 2 ) );
       }
    }

#else

    HB_FUNC( AT )
    {
       PHB_ITEM pSub = hb_param( 1, HB_IT_STRING );
       PHB_ITEM pText = hb_param( 2, HB_IT_STRING );
       PHB_ITEM pStart = hb_param( 3, HB_IT_NUMERIC );
       PHB_ITEM pEnd = hb_param( 4, HB_IT_NUMERIC );

       if( pText && pSub )
       {
          LONG lStart = pStart ? hb_itemGetNL( pStart ) : 1;
          LONG lEnd = pEnd ? hb_itemGetNL( pEnd ) : ( LONG ) pText->item.asString.length;
          ULONG ulPos;

          if( lStart < 0 )
          {
             lStart += pText->item.asString.length;

             if( lStart < 0 )
             {
                lStart = 0;
             }
          }
          else if( lStart )
          {
             lStart--;
          }

          if( lEnd < 0 )
          {
             lEnd += pText->item.asString.length + 1;
          }

          if( lEnd > ( LONG ) pText->item.asString.length )
          {
             lEnd = pText->item.asString.length;
          }

          // Stop searching if starting past beyond end.
          if( lStart >= lEnd )
          {
             //TraceLog( NULL, "Start: %i End: %i\n", lStart, lEnd );
             hb_retnl( 0 );
             return;
          }

          //TraceLog( NULL, "Search >%s< for >%s< from %i to %i\n", pText->item.asString.value, pSub->item.asString.value, lStart, lEnd );

          ulPos = hb_strAt( pSub->item.asString.value, pSub->item.asString.length, pText->item.asString.value + lStart, lEnd - lStart );

          hb_retnl( ulPos ? ulPos + lStart : 0 );
       }
       else
       {
          hb_errRT_BASE_SubstR( EG_ARG, 1108, NULL, "AT", 2, hb_paramError( 1 ), hb_paramError( 2 ) );
       }
    }

#endif

ULONG hb_AtSkipStrings( const char * szSub, ULONG ulSubLen, const char * szText, ULONG ulLen )
{
   char cLastChar = ' ';

   HB_TRACE(HB_TR_DEBUG, ("hb_AtSkipStrings(%s, %lu, %s, %lu)", szSub, ulSubLen, szText, ulLen));

   if( ulSubLen > 0 && ulLen >= ulSubLen )
   {
      ULONG ulPos = 0;
      ULONG ulSubPos = 0;

      while( ulPos < ulLen && ulSubPos < ulSubLen )
      {
         if( szText[ ulPos ] == '"' && szSub[0] != '"' )
         {
            while( ++ulPos < ulLen && szText[ ulPos ] != '"' )
            {
               // Skip.
            }

            ulPos++;
            ulSubPos = 0;
            continue;
         }

         if( szText[ ulPos ] == '\'' && szSub[0] != '\'' )
         {
            while( ++ulPos < ulLen && szText[ ulPos ] != '\'' )
            {
               // Skip.
            }

            ulPos++;
            ulSubPos = 0;
            continue;
         }

         if( szText[ ulPos ] == '[' && szSub[0] != '[' )
         {
            if( ! ( HB_ISALPHA( (BYTE) cLastChar ) || HB_ISDIGIT( (BYTE) cLastChar ) || strchr( "])}_.", cLastChar ) ) )
            {
               while( ++ulPos < ulLen && szText[ ulPos ] != ']' )
               {
                  // Skip.
               }

               ulPos++;
               ulSubPos = 0;
               continue;
            }
         }

         if( szText[ ulPos ] == szSub[ ulSubPos ] )
         {
            ulSubPos++;
            ulPos++;
         }
         else if( ulSubPos )
         {
            /* Go back to the first character after the first match,
               or else tests like "22345" $ "012223456789" will fail. */
            ulPos -= ( ulSubPos - 1 );
            ulSubPos = 0;
         }
         else
         {
            cLastChar = szText[ ulPos ];
            ulPos++;
         }
      }

      return ( ulSubPos < ulSubLen ) ? 0 : ( ulPos - ulSubLen + 1 );
   }
   else
   {
      return 0;
   }
}

HB_FUNC( ATSKIPSTRINGS ) // cFind, cWhere, nStart
{
   PHB_ITEM pFind = hb_param( 1, HB_IT_STRING ), pWhere = hb_param( 2, HB_IT_STRING );

   if( pFind && pWhere )
   {
      unsigned long ulStart = (unsigned long) hb_parnl(3);

      if( ulStart > 0 )
      {
         ulStart--;
      }

      if( ulStart < pWhere->item.asString.length )
      {
         unsigned long ulRet;

         ulRet = hb_AtSkipStrings( pFind->item.asString.value, pFind->item.asString.length,
                                      pWhere->item.asString.value + ulStart, pWhere->item.asString.length - ulStart );

         if( ulRet )
         {
            hb_retnl( ulRet + ulStart );
            return;
         }
      }
   }

   hb_retnl( 0 );
}
 
Regards,

George

Re: FWH64 and at() function

Posted: Mon Mar 05, 2012 4:08 pm
by Antonio Linares
George,

It seems as we compiled it using #ifdef HB_C52_STRICT set by default, and that made the difference.

See how the you have posted checks for such define and uses different implementations

Re: FWH64 and at() function

Posted: Mon Mar 05, 2012 6:02 pm
by George
Antonio,
I'm trying to compile the function AT(), which has four parameters, but it generates the following messages:
c: \ vc64 \ include \ ctype.h (14) E0024 Error Error in # pragma
c: \ vc64 \ include \ crtdefs.h (44) E0019 Error # error "ERROR: Only Win32 target supported! '
c: \ vc64 \ include \ sal.h (15) E0024 Error Error in # pragma
Where I can find the AT() source code that supports 64 bits.
Regards,

George

Re: FWH64 and at() function

Posted: Mon Mar 05, 2012 8:55 pm
by Antonio Linares
George,

Please try to use hb_At() instead of At().

hb_At() supports the extra parameters that you are looking for.

Re: FWH64 and at() function

Posted: Tue Mar 06, 2012 12:46 am
by George
Thanks Antonio.
It's working now.

FWH32 works great with xBuilder from xHarbour.com.
Do you know if FWH64 is also compatible with xHarbour builder?

George

Re: FWH64 and at() function

Posted: Tue Mar 06, 2012 1:12 pm
by Antonio Linares
George,

As far as I know xHarbour.com does not provide a 64 bits version. I may be wrong...