Files
harbour-core/harbour/contrib/hbmisc/stringsx.c
Viktor Szakats 11aa4eb482 2008-06-14 09:13 UTC+0200 Viktor Szakats (harbour.01 syenar hu)
* contrib/hbbmcdx/bmdbfcdx1.c
   * contrib/hbct/ctnet.c
   * contrib/hbct/pos2.c
   * contrib/hbgf/gtk/creabutt.c
   * contrib/hbgf/gtk/creawin.c
   * contrib/hbgt/bitflags.c
   * contrib/hbmisc/stringsx.c
   * contrib/hbtip/encmthd.c
   * contrib/hbtip/utils.c
   * contrib/hbw32/w32_ole.c
   * contrib/hbwhat32/_wincdlg.c
   * contrib/hbwhat32/_winclpb.c
   * contrib/hbwhat32/_wintree.c
   * contrib/rddads/ads1.c
   * contrib/xhb/xstrdel.c
   * source/rdd/dbcmd.c
   * source/rdd/dbf1.c
   * source/rdd/dbfcdx/dbfcdx1.c
   * source/rdd/dbffpt/dbffpt1.c
   * source/rdd/dbfntx/dbfntx1.c
   * source/rdd/delim1.c
   * source/rdd/hbsix/sxsem.c
   * source/rdd/sdf1.c
   * source/rdd/workarea.c
   * source/rtl/alert.prg
   * source/rtl/errorsys.prg
   * source/rtl/gtcrs/gtcrs.c
   * source/rtl/gtgui/gtgui.c
   * source/rtl/gtsln/gtsln.c
   * source/rtl/gtwin/gtwin.c
   * source/rtl/gtxwc/gtxwc.c
   * source/rtl/hbgtcore.c
   * source/rtl/hbregex.c
   * source/vm/cmdarg.c
   * source/vm/dynsym.c
     ! LUPDATE() buffer overread fixed. (hb_retds(""))
     % hb_itemPutC*()/hb_retc*()/hb_errInternal() "" parameter -> NULL
       NOTE: gtwvg not changed.
     * Few minor cleanups.
     * Some formatting in ads1.c.
       (verified to result in no actual codeflow change)
     ; TODO: hb_retc( NULL ) -> hb_retc_null()
2008-06-14 07:19:56 +00:00

110 lines
2.2 KiB
C

/*
* $Id$
*/
#include "hbapi.h"
/* TODO: search this file for TODO and find 'em! */
char *hb_strtoken(char *szText,
long lText,
long lIndex,
char cDelimiter,
long *lLen)
{
long wStart;
long wEnd = 0;
long wCounter = 0;
HB_TRACE(HB_TR_DEBUG, ("hb_strtoken(%s, %ld, %ld, %d, %p)", szText, lText, lIndex, (int) cDelimiter, lLen));
do
{
wStart = wEnd;
if( cDelimiter != ' ' )
{
if( szText[wStart] == cDelimiter )
wStart++;
}
else
{
while( wStart < lText && szText[wStart] == cDelimiter )
wStart++;
}
if( wStart < lText && szText[wStart] != cDelimiter )
{
wEnd = wStart + 1;
while( wEnd < lText && szText[wEnd] != cDelimiter )
wEnd++;
}
else
wEnd = wStart;
} while( wCounter++ < lIndex - 1 && wEnd < lText );
if( wCounter < lIndex )
{
*lLen = 0;
return "";
}
else
{
*lLen = wEnd - wStart;
return szText + wStart;
}
}
/* returns the nth occurence of a substring within a token-delimited string */
HB_FUNC( STRTOKEN )
{
char *szText;
long lIndex = hb_parnl(2);
char cDelimiter = *hb_parc(3);
long lLen;
if( !cDelimiter )
cDelimiter = ' ';
szText = hb_strtoken(hb_parc(1), hb_parclen(1), lIndex, cDelimiter, &lLen);
hb_stornl(lLen, 4);
hb_retclen(szText, lLen);
}
/* debug function to dump the ASCII values of an entire string */
HB_FUNC( STRDUMP )
{
char *szText = hb_parc(1);
long i, lLength = hb_parclen(1);
for( i = 0; i < lLength; i++ )
printf("%d ", szText[i]);
printf("\n");
}
HB_FUNC( ROT13 )
{
if( ISCHAR(1) )
{
char *szText = hb_parc( 1 );
ULONG i, lLen = hb_parclen( 1 );
char *szResult = (char*)hb_xgrab(lLen + 1);
for( i = 0; i < lLen; i++ )
{
char c = szText[i];
if( (c >= 'A' && c <= 'M') || (c >= 'a' && c <= 'm') )
c += 13;
else if( (c >= 'N' && c <= 'Z') || (c >= 'n' && c <= 'z') )
c -= 13;
szResult[i] = c;
}
hb_retclen(szResult, lLen);
hb_xfree(szResult);
}
else
hb_retc(NULL);
}