Seite zurück / Previous page
links
Seite vor / Next page
rechts
Kapitel zurück / Previous Chapter
zurück
Kapitel vor / Next Chapter
vor
Seitenanfang / Top of page
oben
Seitenende / End of page
unten
DD382200.HTM
DD-Software.StringsFiles1
Add this page to your favorites
Save this document

WinBatch Scripting - Strings and Files


If you have questions about WinBatch, you are encouraged to use online WebBoard BBS at http://webboard.windowware.com

Seitenanfang/TopOfPage Seitenende/EndOfPage Seitenende/EndOfPage Seitenanfang/TopOfPage

udfStrOverlay (sOverlay, sTarget, iStart, iLength, sPadChar)

;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstroverlay",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstroverlay

#DefineFunction udfStrOverlay (sOverlay, sTarget, iStart, iLength, sPadChar)
If !StrLen(sOverlay) Then Return (sTarget)
iTargetLength = StrLen(sTarget)
If !iTargetLength Then Return ("")
If (sPadChar=="") Then sPadChar = " "
iLength = Max(0,iLength)
iStart = Max(0,iStart)
a = StrSub(sTarget,1,iStart-1)
b = StrSub(sTarget,iStart+iLength,-1)
Return (StrSub(StrCat(a,StrFix(sOverlay,sPadChar,iLength),b),1,iTargetLength))
;..........................................................................................................................................
; Returns string sTarget with the string sOverlay overlayed at position iStart.
; Prior to the operation, sOverlay is truncated to iLength
; or padded to iLength with the sPadChar character, which defaults to a blank.
;
; Detlev Dalitz.20020209
;..........................................................................................................................................
#EndFunction

:skip_udfstroverlay
;------------------------------------------------------------------------------------------------------------------------------------------


;--- test ---
sMsgTitle = "Demo udfStrOverlay (sOverlay, sTarget, iStart, iLength, sPadChar)"

:test1
t1 = "dark,edge of night,9,5,*"  ; change at end of sTarget     ; "edge of dark*"
t2 = "dark,edge of night,1,4,*"  ; change at iStart of sTarget  ; "dark of night"
t3 = "dark,edge of night,0,5,*"  ; no change                    ; "edge of night"
t4 = "dark,edge of night,20,5,*" ; no change                    ; "edge of night"
t5 = "dark,edge of night,-3,5,*" ; no change                    ; "edge of night"
t6 = "dark,edge of night,3,0,"   ; no change                    ; "edge of night"
t7 = "dark,edge of night,3,2,"   ; change                       ; "edda of night"
t8 = ",edge of night,3,2,"       ; no change                    ; "edge of night"

For i=1 To 8
   sOverlay = ItemExtract(1,t%i%,",")
   sTarget  = ItemExtract(2,t%i%,",")
   iStart   = ItemExtract(3,t%i%,",")
   iLength  = ItemExtract(4,t%i%,",")
   sPadChar = ItemExtract(5,t%i%,",")
   sNew     = udfStrOverlay(sOverlay,sTarget,iStart,iLength,sPadChar)

   sMsgText = ""
   sMsgText = StrCat(sMsgText,'sOverlay' ,@TAB,@TAB,'"',sOverlay,'"',@CRLF)
   sMsgText = StrCat(sMsgText,'sTarget'  ,@TAB,@TAB,'"',sTarget ,'"',@CRLF)
   sMsgText = StrCat(sMsgText,'iStart'   ,@TAB,@TAB,'"',iStart  ,'"',@CRLF)
   sMsgText = StrCat(sMsgText,'iLength'  ,@TAB,@TAB,'"',iLength ,'"',@CRLF)
   sMsgText = StrCat(sMsgText,'sPadChar' ,@TAB,@TAB,'"',sPadChar,'"',@CRLF)
   sMsgText = StrCat(sMsgText,'sNew'     ,@TAB,@TAB,'"',sNew    ,'"',@CRLF)
   Pause(sMsgTitle,sMsgText)
Next

:test2
BoxOpen("Demo udfStrOverlay (sOverlay, sTarget, iStart, iLength, sPadChar)","")
iTargetLength = 10
sTarget = StrFill("-",iTargetLength)
For i=1 To iTargetLength
   sOut = udfStrOverlay("*",sTarget,i,1,"")
   sOut = StrCat("[",sOut,"]")
   BoxText(sOut)
   TimeDelay(0.1/iTargetLength)
Next
For i=iTargetLength To 1 By -1
   sOut = udfStrOverlay("*",sTarget,i,1,"")
   sOut = StrCat("[",sOut,"]")
   BoxText(sOut)
   TimeDelay(0.1/iTargetLength)
Next
BoxShut()

Exit
;------------------------------------------------------------------------------------------------------------------------------------------
;*EOF*


If you have questions about WinBatch, you are encouraged to use online WebBoard BBS at http://webboard.windowware.com

Seitenanfang/TopOfPage Seitenende/EndOfPage Seitenende/EndOfPage Seitenanfang/TopOfPage

udfStrCnt (sourcestr, searchstr, matchcase)

;==========================================================================================================================================
; How to count substrings in a string?
;==========================================================================================================================================


;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrcnt_1",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrcnt_1

#DefineFunction udfStrCnt_1 (sourcestr, searchstr, matchcase)
n=0
pos=0
If Min(1,Max(0,matchcase))
   While 1
      pos=StrIndex(sourcestr,searchstr,pos+1,@FWDSCAN)
      If (pos>0) Then n=n+1
         Else Return (n)
   EndWhile
Else
   While 1
      pos=StrIndexNC(sourcestr,searchstr,pos+1,@FWDSCAN)
      If (pos>0) Then n=n+1
         Else Return (n)
   EndWhile
EndIf
;..........................................................................................................................................
; Detlev Dalitz.20020209
;..........................................................................................................................................
#EndFunction

:skip_udfstrcnt_1
;------------------------------------------------------------------------------------------------------------------------------------------


;--- test ---
msgtitle = "Demo udfStrCnt (str, searchstr, matchcase)"
str = "TO test or NOT to test"

searchstr = "O"
n = udfStrCnt_1(str,searchstr,@TRUE)
msgtext = ""
msgtext = StrCat(msgtext,@CRLF,'udfStrCnt("',str,'" ,"',searchstr,'" ,@true)')
msgtext = StrCat(msgtext,@CRLF,n,' occurences of "',searchstr,'"')
Message(msgtitle,msgtext)
; ==> '2 occurences of "O"'

searchstr = "O"
n = udfStrCnt_1(str,searchstr,@FALSE)
msgtext = StrCat(msgtext,@CRLF)
msgtext = StrCat(msgtext,@CRLF,'udfStrCnt("',str,'" ,"',searchstr,'" ,@false)')
msgtext = StrCat(msgtext,@CRLF,n,' occurences of "',searchstr,'"')
Message(msgtitle,msgtext)
; ==> '4 occurences of "O"'


searchstr = "TEST"
n = udfStrCnt_1(str,searchstr,@FALSE)
msgtext = StrCat(msgtext,@CRLF)
msgtext = StrCat(msgtext,@CRLF,'udfStrCnt("',str,'" ,"',searchstr,'" ,@false)')
msgtext = StrCat(msgtext,@CRLF,n,' occurences of "',searchstr,'"')
Message(msgtitle,msgtext)
; ==> '2 occurences of "TEST"'



;==========================================================================================================================================
;==========================================================================================================================================



;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrcnt_2",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrcnt_2

#DefineFunction udfStrCnt_2 (sourcestr, searchstr, matchcase)
If (0==Min(1,Max(0,matchcase)))
   sourcestr = StrLower(sourcestr)
   searchstr = StrLower(searchstr)
EndIf
Return ((StrLen(sourcestr) - StrLen(StrReplace(sourcestr,searchstr,""))) / StrLen(searchstr))
;..........................................................................................................................................
; Adapted from WinBatch TechBase
; Article ID:   W14502
; Filename:   Number of Instances of Char in a String.txt
; File Created: 2000:03:30:11:28:01
; Last Updated: 2000:03:30:11:43:44
;
; Slightly modified by Detlev Dalitz.20020521
;..........................................................................................................................................
#EndFunction

:skip_udfstrcnt_2
;------------------------------------------------------------------------------------------------------------------------------------------


; --- test ---
str = "abcannaDnnnannannnDndnnd"

count = udfStrCnt_2(str,"dn",0)
Message("Demo udfStrCnt_2  Count",count)
; ==> 3

count = udfStrCnt_2(str,"dn",1)
Message("Demo udfStrCnt_2  Count",count)
;==>  1



;==========================================================================================================================================
;==========================================================================================================================================



;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrcnt_3",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrcnt_3

#DefineFunction udfStrCnt_3 (sourcestr, searchstr, matchcase)
n=0
pos=0
While 1
   If (matchcase==1) Then pos=StrIndex(sourcestr,searchstr,pos+1,@FWDSCAN)
   If (matchcase==0) Then pos=StrIndexNC(sourcestr,searchstr,pos+1,@FWDSCAN)
   If (pos<>0) Then n=n+1
      Else Break
EndWhile
Return (n)
;..........................................................................................................................................
; Published by Guido sedar@yahoo.com, Tuesday, June 26, 2001 09:05 AM, WinBatch Forum
; This function counts the occurrences of a sub-string in a string.
;
; Parameters:
; str: the string to be searched for a sub-string.
; substr: the string to look for within the main string.
; matchcase: 1=Case sensitive, 0=Ignore case
; Returns the Number of occurrences of sub-string found.
;..........................................................................................................................................
#EndFunction

:skip_udfstrcnt_3
;------------------------------------------------------------------------------------------------------------------------------------------


;--- test ---
count1 = udfStrCnt_3("green","e",0)
; ==> 2

count2 = udfStrCnt_3("green","E",1)
; ==> 0

count3 = udfStrCnt_3("green","E",0)
; ==> 2


;==========================================================================================================================================
;==========================================================================================================================================


;------------------------------------------------------------------------------------------------------------------------------------------
:Performancetest

sMsgTitle = "Demo Performance Test"

sTestString = "TO test or NOT to test"


iTestLoop = 1

iMaxTests = 3

iTest=1
Display(1,sMsgTitle,"Running Test %iTest%, please wait ...")
Exclusive(@ON)
iStart = GetTickCount()
For i=1 To iTestLoop
   Result = udfStrCnt_1(sTestString,"TEST",0)
   Result = udfStrCnt_1(sTestString,"TEST",1)
   Result = udfStrCnt_1(sTestString,"O",0)
   Result = udfStrCnt_1(sTestString,"O",1)
Next
iStop = GetTickCount()
Exclusive(@OFF)
iTicks%iTest% = iStop-iStart

iTest=2
Display(1,sMsgTitle,"Running Test %iTest%, please wait ...")
Exclusive(@ON)
iStart = GetTickCount()
For i=1 To iTestLoop
   Result = udfStrCnt_2(sTestString,"TEST",0)
   Result = udfStrCnt_2(sTestString,"TEST",1)
   Result = udfStrCnt_2(sTestString,"O",0)
   Result = udfStrCnt_2(sTestString,"O",1)
Next
iStop = GetTickCount()
Exclusive(@OFF)
iTicks%iTest% = iStop-iStart

iTest=3
Display(1,sMsgTitle,"Running Test %iTest%, please wait ...")
Exclusive(@ON)
iStart = GetTickCount()
For i=1 To iTestLoop
   Result = udfStrCnt_3(sTestString,"TEST",0)
   Result = udfStrCnt_3(sTestString,"TEST",1)
   Result = udfStrCnt_3(sTestString,"O",0)
   Result = udfStrCnt_3(sTestString,"O",1)
Next
iStop = GetTickCount()
Exclusive(@OFF)
iTicks%iTest% = iStop-iStart


iMaxTicks = 0
For iTest=1 To iMaxTests
   iMaxTicks = Max(iMaxTicks,iTicks%iTest%)
Next
For iTest=1 To iMaxTests
   iPct%iTest% = 100*iTicks%iTest%/iMaxTicks
Next
sMsgText = ""
For iTest=1 To iMaxTests
   sMsgText = StrCat(sMsgText,"Test ",iTest,@TAB,"Ticks = ",@TAB,iTicks%iTest%,@TAB,iPct%iTest%," %%",@CRLF)
Next
ClipPut(sMsgText)
Message(sMsgTitle,sMsgText)


; WB Studio Debug
;   Test 1   Ticks =    48143   91 %
;   Test 2   Ticks =    14571   27 %  <== The Winner.
;   Test 3   Ticks =    52609   100 %

; WB Studio Run
;   Test 1   Ticks =    4923   83 %
;   Test 2   Ticks =    2657   45 %  <== The Winner.
;   Test 3   Ticks =    5877   100 %


Exit
;------------------------------------------------------------------------------------------------------------------------------------------


If you have questions about WinBatch, you are encouraged to use online WebBoard BBS at http://webboard.windowware.com

Seitenanfang/TopOfPage Seitenende/EndOfPage Seitenende/EndOfPage Seitenanfang/TopOfPage

udfStrCompose (str, composelist, delimiter)

;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrcompose",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrcompose

#DefineFunction udfStrCompose (sString, sComposeList, sDelimiter)
If (sComposeList == "") Then Return (sString)
sErrMsg = "*** udfStrCompose: Bad parameter sComposeList ***"
iCount = ItemCount(sComposeList,sDelimiter)
If (iCount mod 2) Then Return (sErrMsg)
sComposeStr = ""
iCount = iCount/2
For ii=1 To iCount
   vItem1 = ItemExtract(ii+ii-1,sComposeList,sDelimiter)
   vItem2 = ItemExtract(ii+ii  ,sComposeList,sDelimiter)
   If !IsInt(vItem2) Then Return (sErrMsg)
   If IsInt(vItem1)
      iLen = Max(1+vItem2-vItem1,1)
      sComposeStr = StrCat(sComposeStr,StrFix(StrSub(sString,vItem1,iLen)," ",iLen))
   Else
      For id=1 To 3
         sDelim = StrSub(""",',`",id,1)
         vItem = ItemExtract(2,vItem1,sDelim)
         If (StrCat(sDelim,vItem,sDelim) == vItem1)
            vItem1 = vItem
            Break
         EndIf
      Next
      vItem = vItem1
      For in=2 To vItem2
         vItem = StrCat(vItem,vItem1)
      Next
      sComposeStr = StrCat(sComposeStr,vItem)
   EndIf
Next
Return (sComposeStr)
;..........................................................................................................................................
; Returns a string which is composed as defined in sComposeList.
; Example:
;
; csDelim = ","
; clist = ""
; clist = Iteminsert(StrCat( ": "      ,csDelim, "1"  ),-1,clist,csDelim) ;  append ': '     times 1
; clist = Iteminsert(StrCat( "#35"     ,csDelim, "1"  ),-1,clist,csDelim) ;  append '#35'    times 1
; clist = Iteminsert(StrCat( "'4711'"  ,csDelim, "2"  ),-1,clist,csDelim) ;  append '4711'   times 2
; clist = Iteminsert(StrCat( "2"       ,csDelim, "5"  ),-1,clist,csDelim) ;  append column 2 thru 5
; clist = Iteminsert(StrCat( " "       ,csDelim, "5"  ),-1,clist,csDelim) ;  append blank    times 5
; clist = Iteminsert(StrCat( "2"       ,csDelim, "3"  ),-1,clist,csDelim) ;  append column 2 thru 3
; clist = Iteminsert(StrCat( "."       ,csDelim, "1"  ),-1,clist,csDelim) ;  append '.'      times 1
; clist = Iteminsert(StrCat( "4"       ,csDelim, "5"  ),-1,clist,csDelim) ;  append column 4 thru 5
; clist = Iteminsert(StrCat( "%%"      ,csDelim, "1"  ),-1,clist,csDelim) ;  append symbol percent times 1
; clist = Iteminsert(StrCat( "%@crlf%" ,csDelim, "2"  ),-1,clist,csDelim) ;  append @crlf    times 2
; clist = Iteminsert(StrCat( ";"""     ,csDelim, "1"  ),-1,clist,csDelim) ;  append ';"'     times 1
; clist = Iteminsert(StrCat( "%@tab%"  ,csDelim, "1"  ),-1,clist,csDelim) ;  append @tab     times 1
; clist = Iteminsert(StrCat( "- . "    ,csDelim, "20" ),-1,clist,csDelim) ;  append '- . '   times 20
; clist = Iteminsert(StrCat( """"      ,csDelim," 1"  ),-1,clist,csDelim) ;  append '"'      times 1
; clist = Iteminsert(StrCat( "%@crlf%" ,csDelim, "1"  ),-1,clist,csDelim) ;  append @crlf    times 1
;
; Composing the tag string looks somewhat cryptic, but don't worry, be happy.
; - Use always sets of two elements: 'from,thru' or 'text,multiplier'.
; - Use tupel (n,m)   for extracting chars from sString out of columns n to m.
; - Use tupel (abc,n) to fill new text "abc" n-times into the composed string,
;   as an alternative: use tupel ('a b c',n) to fill in new text "a b c" n-times.
;..........................................................................................................................................
; Detlev Dalitz.20010716
;..........................................................................................................................................
#EndFunction

:skip_udfstrcompose
;------------------------------------------------------------------------------------------------------------------------------------------



; --- test ---

:test1
sString = "All messages in all conferences have been marked as read."
sComposeList = "43,46,' --> ',2,5,12, ,2,33,36, ,2,44,44,2,3, ,2,38,41, ,2,38,38,55,56, ,1,<,1,-,5"
sComposeStr = udfStrCompose(sString,sComposeList,",")
sMsgTitle = "Demo udfStrCompose (sString, sComposeList, sDelimiter)"
sMsgText  = StrCat('sString = "',sString,'"',@CRLF)
sMsgText  = StrCat(sMsgText,'sComposeList = "',sComposeList,'"',@CRLF)
sMsgText  = StrCat(sMsgText,'sComposeStr = "',sComposeStr,'"')
Message(sMsgTitle,sMsgText)
; ==> "mark -->  --> messages  have  all  been  bad <-----"



:test2
sString = "Demo with bad formatted sComposeList."

; sComposeList is not ok: 3 and a half tupel, odd number of items
sComposeList = "1,5,33,34,10,13,."

; sComposeList is ok: 4 tupel, even number of items
; sComposeList = "1,5,33,34,10,13,.,1"

sComposeStr = udfStrCompose(sString,sComposeList,",")

sMsgTitle = "Demo udfStrCompose (sString, sComposeList, sDelimiter)"
sMsgText  = StrCat('sString = "',sString,'"',@CRLF)
sMsgText  = StrCat(sMsgText,'sComposeList = "',sComposeList,'"',@CRLF)
sMsgText  = StrCat(sMsgText,'sComposeStr = "',sComposeStr,'"')
Message(sMsgTitle,sMsgText)

Exit
;------------------------------------------------------------------------------------------------------------------------------------------


If you have questions about WinBatch, you are encouraged to use online WebBoard BBS at http://webboard.windowware.com

Seitenanfang/TopOfPage Seitenende/EndOfPage Seitenende/EndOfPage Seitenanfang/TopOfPage

udfStrQuote (sStr, sLeft, sRight)
udfStrUnQuote (sStr, iMode)

;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrquote",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrquote

#DefineFunction udfStrQuote (sString, sLeft, sRight)
; If (sString == "") then return (sString)
If (""==sLeft)
   If (""==sRight)
      sQuote = """'`"
      sClean = StrClean(sString,sQuote,"",@FALSE,2)
      If (""==StrClean(sQuote,sClean,"",@FALSE,1))
         sQuote = '"'
         sString = StrReplace(sString,sQuote,StrCat(sQuote,sQuote))
      Else
         sClean = StrClean(sQuote,sClean,"",@FALSE,1)
         sQuote = StrSub(sClean,1,1)
      EndIf
      sLeft  = sQuote
      sRight = sQuote
   EndIf
EndIf
Return (StrCat(sLeft,sString,sRight))
;------------------------------------------------------------------------------------------------------------------------------------------
; With sLeft="" and sRight=""
; the function chooses a winbatch quote delimiter automagically
; and doubles the quotation char in sString if necessary.
;
; With sLeft="""" and sRight=""""
; the function allows quotation without doubling of quotation char in sString.
;
; With sLeft="(* " and sRight=" *)"
; the function encloses sString in pairs of pascal comments.
;
; DD.20010722.20020628
;------------------------------------------------------------------------------------------------------------------------------------------
#EndFunction

:skip_udfstrquote
;------------------------------------------------------------------------------------------------------------------------------------------


;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrunquote",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrunquote

#DefineFunction udfStrUnQuote (sString, iMode)
If (sString=="") Then Return (sString)
If (iMode<0)||(iMode>5) Then Return (sString)
iLen = StrLen(sString)
c1 = StrSub(sString,1,1)
c2 = StrSub(sString,iLen,1)
cc = StrCat(c1,c2)
qq = """""''``"
bb = "(){}[]<>"
Select iMode
Case 0
   dd = qq
   Break
Case 1
   dd = bb
   Break
Case 2
   dd = StrCat(qq,bb)
   Break
Case 3
   dd = StrCat(c1,c1)
   Break
Case 4
   dd = StrCat(bb,c1,c1)
   Break
Case 5
   dd = cc
   Break
EndSelect
ib = @FALSE
ii = 1
While !(ib||(ii>StrLen(dd)/2))
   ib = (""==StrClean(cc,StrSub(dd,ii+ii-1,2),"",@FALSE,1))
   ii = ii + 1
EndWhile
If ib Then sString = StrSub(sString,2,iLen-2)
Return (sString)
;..........................................................................................................................................
; This udf removes quote delimiters, brackets or any first/last chars.
;
; iMode=0 ... Removes quotes only.
; iMode=1 ... Removes brackets only.
; iMode=2 ... Removes quotes and brackets.
; iMode=3 ... Removes first/last chars if equal and quotes.
; iMode=4 ... Removes first/last chars if equal and brackets.
; iMode=5 ... Removes any first/last chars.
;..........................................................................................................................................
; Detlev Dalitz.20010722
;..........................................................................................................................................
#EndFunction
;
:skip_udfstrunquote
;------------------------------------------------------------------------------------------------------------------------------------------


;--- test 1 ---
test1 = `udfStrQuote (str, '', '')`
test2 = `udfStrQuote (str, '"', '"')`
test3 = `udfStrQuote (str, '(', ')')`
test4 = `udfStrQuote (str, '/* ',' */')`
test5 = `udfStrQuote (str, '==> ','')`

For it=1 To 5
   test = test%it%
   str = "."" ab'c ""."
   outstr = ""
   For i=1 To 4
      k      = i+i
      j      = k-1
      str%j% = str
      str%k% = %test%
      str    = str%k%
      line   = StrCat(str%j%,@TAB,@TAB,"-->",@TAB,str%k%)
      outstr = StrCat(outstr,line,@CR)
      If (StrSub(str,1,1)=="""") Then str=StrReplace(str,"""""","""") ; Simulate quote substitution.
   Next
   outstr=StrCat(test,@CR,@CR,outstr)
   Pause("",outstr)
Next


;--- test 2 ---
mode=2
test=StrCat("udfStrUnQuote (str, ",mode,")")
str="""'`[{<#test#>}]`'"""
steps=10
For i=1 To steps
   str2=udfStrUnQuote(str,mode)
   outstr=StrCat(str,@TAB,"-->",@TAB,str2)
   outstr=StrCat(test,@CR,"step ",steps,"/",i,@CR,@CR,outstr)
   Pause("",outstr)
   str=str2
Next


;--- test 3 ---
mode=4
test=StrCat("udfStrUnQuote (str, ",mode,")")
str="""'`[{<#test#>}]`'"""
steps=10
For i=1 To steps
   str2=udfStrUnQuote(str,mode)
   outstr=StrCat(str,@TAB,"-->",@TAB,str2)
   outstr=StrCat(test,@CR,"step ",steps,"/",i,@CR,@CR,outstr)
   Pause("",outstr)
   str=str2
Next


;--- test 4 ---
mode=5
test=StrCat("udfStrUnQuote (str, ",mode,")")
str="""'`[{<#test#>}]`'"""
steps=10
For i=1 To steps
   str2=udfStrUnQuote(str,mode)
   outstr=StrCat(str,@TAB,"-->",@TAB,str2)
   outstr=StrCat(test,@CR,"step ",steps,"/",i,@CR,@CR,outstr)
   Pause("",outstr)
   str=str2
Next

:CANCEL
Exit
;------------------------------------------------------------------------------------------------------------------------------------------
;*EOF*


If you have questions about WinBatch, you are encouraged to use online WebBoard BBS at http://webboard.windowware.com

Seitenanfang/TopOfPage Seitenende/EndOfPage Seitenende/EndOfPage Seitenanfang/TopOfPage

udfStrWildCompare (sPattern, sString, iMatchCase)

;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrwildcompare",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrwildcompare

#DefineFunction udfStrWildCompare (sPattern, sString, iMatchCase)
If (sPattern=="")  Then Return (@TRUE) ; Empty wildcard = TRUE.
If (sPattern=="*") Then Return (@TRUE) ; An asterisk "*" matches anything.
If !iMatchCase
   sPattern = StrLower(sPattern)
   sString = StrLower(sString)
EndIf
While @TRUE
   If (sPattern=="") Then Return (sString=="") ; If end of wildcard is also.

   sPatChar = StrSub(sPattern,1,1) ; Character of wildcard.

   If (sPatChar=="*") ; Is it an asterisk "*"?
      sPattern = StrSub(sPattern,2,-1) ; Bump wildcard to next position.
      While @TRUE ; See if we can match the rest.
         ; Recursive udf call.
         If (udfStrWildCompare(sPattern,sString,iMatchCase)) Then Return (@TRUE)
         If (sString=="") Then Return (@FALSE)
         sString = StrSub(sString,2,-1)
      EndWhile
   EndIf

   If (sPatChar=="?") ; A question mark "?" matches any alpha or numeric character.
      If (sString=="") Then Return (@FALSE)
      sString = StrSub(sString,2,-1)
      sPattern = StrSub(sPattern,2,-1)
      Continue
   EndIf

   If (sPatChar=="#") ; A "#" matches any numeric character.
      sStrChar = StrSub(sString,1,1)
      If (sStrChar>"9") Then Return (@FALSE)
      If (sStrChar<"0") Then Return (@FALSE)
      sString = StrSub(sString,2,-1)
      sPattern = StrSub(sPattern,2,-1)
      Continue
   EndIf

   If (StrSub(sString,1,1)!=sPatChar) Then Return (@FALSE)
   sString = StrSub(sString,2,-1)
   sPattern = StrSub(sPattern,2,-1)

EndWhile
;..........................................................................................................................................
; This function compares a text string to a wildcard string,
; returning @TRUE if the match is successful.
;
; This matching routine uses the following wildcards:
; * ... Zero or more of any characters at this position.
; ? ... One of any character at this position.
; # ... One numeric character at this position.
;
; iMatchCase = 0 ... Ignore uppercase.
; iMatchCase = 1 ... Respect uppercase.
;..........................................................................................................................................
; Published by Alan Kreutzer
; WinBatch TechDatabase, UserDefinedFunctionLibrary, Wildcard UDF
; Slightly modified by Detlev Dalitz.20020531.20030705.
;..........................................................................................................................................
#EndFunction

:skip_udfstrwildcompare
;------------------------------------------------------------------------------------------------------------------------------------------


;--- test ---
iWildComp1 = udfStrWildCompare("???##/#*","das13/2456",0) ; ==> 1 (@TRUE)
iWildComp2 = udfStrWildCompare("???##/#*","xyz99/8976",0) ; ==> 1 (@TRUE)
iWildComp3 = udfStrWildCompare("???##/#*","dasdas456",0)  ; ==> 0 (@FALSE)
iWildComp4 = udfStrWildCompare("dd##/#*" ,"dd45/6",1)     ; ==> 1 (@TRUE)
iWildComp5 = udfStrWildCompare("DD##/#*" ,"dd45/6",1)     ; ==> 0 (@FALSE)
iWildComp6 = udfStrWildCompare("DD##/#*" ,"dd45/6",0)     ; ==> 1 (@TRUE)
Exit
;------------------------------------------------------------------------------------------------------------------------------------------
;*EOF*


If you have questions about WinBatch, you are encouraged to use online WebBoard BBS at http://webboard.windowware.com

Seitenanfang/TopOfPage Seitenende/EndOfPage Seitenende/EndOfPage Seitenanfang/TopOfPage

udfStrCount (str, start, stop, searchstr, matchcase)

;==========================================================================================================================================
; How to count substrings in a substring?
;==========================================================================================================================================


;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrcount_1",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrcount_1

#DefineFunction udfStrCount_1 (str, start, stop, searchstr, matchcase)
n=StrLen(str)
If (n>0)
   start=Min(Max(1,start),n)
   stop=Max(Min(n,stop),1)
   n=((stop-start)>=0)
   If n
      n=0
      p=0
      str=StrSub(str,start,stop-start+1)
      If !matchcase
         str=StrLower(str)
         searchstr=StrLower(searchstr)
      EndIf
      While 1
         p=StrIndex(str,searchstr,p+1,@FWDSCAN)
         If p Then n=n+1
            Else Break
      EndWhile
   EndIf
EndIf
Return (n)
; Detlev Dalitz.20020209
#EndFunction

:skip_udfstrcount_1
;------------------------------------------------------------------------------------------------------------------------------------------


;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrcount_2",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrcount_2

#DefineFunction udfStrCount_2 (str, start, stop, searchstr, matchcase)
n=StrLen(str)
If (n>0)
   start=Min(Max(1,start),n)
   stop=Max(Min(n,stop),1)
   n=((stop-start)>=0)
   If n
      n=0
      p=0
      str=StrSub(str,start,stop-start+1)
      If matchcase
         While 1
            p=StrIndex(str,searchstr,p+1,@FWDSCAN)
            If p Then n=n+1
               Else Return (n)
         EndWhile
      Else
         While 1
            p=StrIndexNC(str,searchstr,p+1,@FWDSCAN)
            If p Then n=n+1
               Else Return (n)
         EndWhile
      EndIf
   EndIf
EndIf
Return (n)
; Detlev Dalitz.20020209
#EndFunction

:skip_udfstrcount_2
;------------------------------------------------------------------------------------------------------------------------------------------


;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrcount_3",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrcount_3

#DefineFunction udfStrCount_3 (str, start, stop, searchstr, matchcase)
n=StrLen(str)
If (n>0)
   start=Min(Max(1,start),n)
   stop=Max(Min(n,stop),1)
   n=((stop-start)>=0)
   If n
      str=StrSub(str,start,stop-start+1)
      If !matchcase
         str=StrLower(str)
         searchstr=StrLower(searchstr)
      EndIf
      bb=BinaryAlloc(StrLen(str))
      BinaryPokeStr(bb,0,str)
      n=BinaryStrCnt(bb,0,BinaryEodGet(bb)-1,searchstr)
      BinaryFree(bb)
   EndIf
EndIf
Return (n)
; Detlev Dalitz.20020209
#EndFunction

:skip_udfstrcount_3
;------------------------------------------------------------------------------------------------------------------------------------------


;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrcount_4",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrcount_4

#DefineFunction udfStrCount_4 (str, start, stop, searchstr, matchcase)
n=StrLen(str)
If (n>0)
   start=Min(Max(1,start),n)-1
   stop=Max(Min(n,stop),1)-1
   n=((stop-start)>=0)
   If n
      If !matchcase
         str=StrLower(str)
         searchstr=StrLower(searchstr)
      EndIf
      bb=BinaryAlloc(StrLen(str))
      BinaryPokeStr(bb,0,str)
      n=BinaryStrCnt(bb,start,stop,searchstr)
      BinaryFree(bb)
   EndIf
EndIf
Return (n)
; Detlev Dalitz.20020209
#EndFunction

:skip_udfstrcount_4
;------------------------------------------------------------------------------------------------------------------------------------------


;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrcount_5",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrcount_5

#DefineFunction udfStrCount_5 (str, start, stop, searchstr, matchcase)
str = StrSub(str,start,stop-start+1)
If str=="" Then Return 0
If searchstr=="" Then Return 0
If !matchcase
   str = StrLower(str)
   searchstr = StrLower(searchstr)
EndIf
Return ((StrLen(str) - StrLen(StrReplace(str,searchstr,""))) / StrLen(searchstr))
#EndFunction

:skip_udfstrcount_5
;------------------------------------------------------------------------------------------------------------------------------------------



;--- test ---

:test1
Maxtests = 5
str = "TO test or NOT to test"

For t=1 To Maxtests
   msgtitle = "Demo udfStrCount_%t% (str, start, stop, searchstr, matchcase)"

   start = 4
   stop = 10
   searchstr = " "
   n = udfStrCount_%t% (str,start,stop,searchstr,@FALSE)
   msgtext = ""
   msgtext = StrCat(msgtext,@CRLF,"udfStrCount(""",str,""",",start,",",stop,",""",searchstr,""",@false",")")
   msgtext = StrCat(msgtext,@CRLF,n," occurences of """,searchstr,"""")
   Message(msgtitle,msgtext)
   ; ==> '1 occurences of " "'

   start = 1
   stop = 40
   searchstr = "to te"
   n = udfStrCount_%t% (str,start,stop,searchstr,@FALSE)
   msgtext = StrCat(msgtext,@CRLF)
   msgtext = StrCat(msgtext,@CRLF,"udfStrCount(""",str,""",",start,",",stop,",""",searchstr,""",@false",")")
   msgtext = StrCat(msgtext,@CRLF,n," occurences of """,searchstr,"""")
   Message(msgtitle,msgtext)
   ; ==> '2 occurences of "to te"'

   searchstr = "to te"
   n = udfStrCount_%t% (str,start,stop,searchstr,@TRUE)
   msgtext = StrCat(msgtext,@CRLF)
   msgtext = StrCat(msgtext,@CRLF,"udfStrCount(""",str,""",",start,",",stop,",""",searchstr,""",@true",")")
   msgtext = StrCat(msgtext,@CRLF,n," occurences of """,searchstr,"""")
   Message(msgtitle,msgtext)
   ; ==> '1 occurences of "to te"'

   searchstr = "o"
   start = 60
   stop = -40
   n = udfStrCount_%t% (str,start,stop,searchstr,@TRUE)
   msgtext = StrCat(msgtext,@CRLF)
   msgtext = StrCat(msgtext,@CRLF,"udfStrCount(""",str,""",",start,",",stop,",""",searchstr,""",@true",")")
   msgtext = StrCat(msgtext,@CRLF,n," occurences of """,searchstr,"""")
   Message(msgtitle,msgtext)
   ; ==> '0 occurences of "o"'

Next


;------------------------------------------------------------------------------------------------------------------------------------------

:Performancetest

msgtitle  = "Demo udfStrCount  Performance Test"
TestStr   = "TO test or NOT to test TO test or NOT to test TO test or NOT to test TO test or NOT to test"
SearchStr = "to te"
Start     = 10
Stop      = 30
MatchCase = @FALSE
TestLoop  = 200

Maxtests = 5
For t=1 To Maxtests
   Display(1,msgtitle,"Running Test %t%, please wait ...")
   Exclusive(@ON)
   start = GetTickCount()
   For i=1 To TestLoop
      str = udfStrCount_%t% (TestStr,Start,Stop,SearchStr,MatchCase)
   Next
   stop = GetTickCount()
   Exclusive(@OFF)
   Ticks%t% = stop-start
Next

MaxTicks = 0
For t=1 To MaxTests
   MaxTicks = Max(MaxTicks,Ticks%t%)
Next
For t=1 To MaxTests
   Pct%t% = 100*Ticks%t%/MaxTicks
Next
msgtext = ""
For t=1 To MaxTests
   msgtext = StrCat(msgtext,"Test ",t,@TAB,"Ticks = ",@TAB,Ticks%t%,@TAB,Pct%t%," %%",@CRLF)
Next
ClipPut(msgtext)
Message(msgtitle,msgtext)

; WB Studio Debug
;   Test 1   Ticks =    22573   96 %
;   Test 2   Ticks =    23438   100 %
;   Test 3   Ticks =    23372   99 %
;   Test 4   Ticks =    21931   93 %
;   Test 5   Ticks =    6203   26 %  <== The Winner.

; WB Studio Run
;   Test 1   Ticks =    2315   59 %
;   Test 2   Ticks =    2952   76 %
;   Test 3   Ticks =    3877   100 %
;   Test 4   Ticks =    3455   89 %
;   Test 5   Ticks =    1409   36 %  <== The Winner.

Exit
;------------------------------------------------------------------------------------------------------------------------------------------
;*EOF*


If you have questions about WinBatch, you are encouraged to use online WebBoard BBS at http://webboard.windowware.com

Seitenanfang/TopOfPage Seitenende/EndOfPage Seitenende/EndOfPage Seitenanfang/TopOfPage

udfStrInsert (sInsert, sTarget, iStart, iLength, sPadChar)

;----------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrinsert",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrinsert

#DefineFunction udfStrInsert (sInsert, sTarget, iStart, iLength, sPadChar)
If !StrLen(sInsert) Then Return (sTarget)
iTargetLength = StrLen(sTarget)
If !iTargetLength Then Return ("")
If (sPadChar=="") Then sPadChar = " "
iStart = Max(0,iStart)
iLength = Max(0,iLength)
Select 1
Case (iStart>iTargetLength)
   sOut = StrCat(sTarget,StrFix(sInsert,sPadChar,iLength))
   Break
Case (iStart<1)
   sOut = StrCat(StrFix(sInsert,sPadChar,iLength),sTarget)
   Break
Case 1
   sOut = StrCat(StrSub(sTarget,1,iStart-1),StrFix(sInsert,sPadChar,iLength),StrSub(sTarget,iStart,-1))
   Break
EndSelect
Return (sOut)
;..........................................................................................................................................
; Returns the result of inserting string sInsert into string sTarget at position iStart.
; Prior to the insertion, sInsert is truncated to iLength
; or padded to iLength with the sPadChar character, which defaults to a blank.
;..........................................................................................................................................
; Detlev Dalitz.20020616.20020725
;..........................................................................................................................................
#EndFunction

:skip_udfstrinsert
;----------------------------------------------------------------------------------------------------------------------



;--- test ---

sMsgTitle = "Demo udfStrInsert (sInsert, sTarget, iStart, iLength, sPadChar)"

:test1
t1 = "inserting,the result of string,12,10,"  ; "the result inserting of string"
t2 = "inserting,the result of string,12,12,*" ; "the result inserting***of string"
t3 = "inserting,the result of string,0,6,*"   ; "insertthe result of string"
t4 = "inserting,the result of string,40,6,*"  ; "the result of stringinsert"
t5 = "inserting,the result of string,-3,6,*"  ; "insertthe result of string"
t6 = "inserting,the result of string,5,0,"    ; "the result of string"
t7 = "inserting,the result of string,15,2,"   ; "the result of instring"
t8 = ",the result of string,15,2,"            ; "the result of string"

For i=1 To 8
   sOverlay = ItemExtract(1,t%i%,",")
   sTarget  = ItemExtract(2,t%i%,",")
   iStart   = ItemExtract(3,t%i%,",")
   iLength  = ItemExtract(4,t%i%,",")
   sPadChar = ItemExtract(5,t%i%,",")
   sNew     = udfStrInsert(sOverlay,sTarget,iStart,iLength,sPadChar)

   sMsgText = ""
   sMsgText = StrCat(sMsgText,'sInsert' ,@TAB,@TAB,'"',sOverlay,'"',@CRLF)
   sMsgText = StrCat(sMsgText,'sTarget' ,@TAB,@TAB,'"',sTarget ,'"',@CRLF)
   sMsgText = StrCat(sMsgText,'iStart'  ,@TAB,@TAB,'"',iStart  ,'"',@CRLF)
   sMsgText = StrCat(sMsgText,'iLength' ,@TAB,@TAB,'"',iLength ,'"',@CRLF)
   sMsgText = StrCat(sMsgText,'sPadChar',@TAB,@TAB,'"',sPadChar,'"',@CRLF)
   sMsgText = StrCat(sMsgText,'sNew'    ,@TAB,@TAB,'"',sNew    ,'"',@CRLF)
   Message(sMsgTitle,sMsgText)
Next


:test2
BoxOpen("Demo udfStrInsert (sInsert, sTarget, iStart, iLength, sPadChar)","")
iTargetLength = 10
sTarget = StrFill(" ",iTargetLength)
For i=1 To iTargetLength
   sOut = udfStrInsert("*",sTarget,i,1,"")
   sOut = StrCat("[",StrSub(sOut,1,iTargetLength),"]")
   BoxText(sOut)
   TimeDelay(0.1/iTargetLength)
Next
For i=iTargetLength To 1 By -1
   sOut = udfStrInsert("*",sTarget,i,1,"")
   sOut = StrCat("[",StrSub(sOut,1,iTargetLength),"]")
   BoxText(sOut)
   TimeDelay(0.1/iTargetLength)
Next
BoxShut()

Exit
;----------------------------------------------------------------------------------------------------------------------
;*EOF*


If you have questions about WinBatch, you are encouraged to use online WebBoard BBS at http://webboard.windowware.com

Seitenanfang/TopOfPage Seitenende/EndOfPage Seitenende/EndOfPage Seitenanfang/TopOfPage

udfStrCenter (str, len, pad)

;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrcenter",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrcenter

#DefineFunction udfStrCenter (sString, iLength, sPad)
sString = StrSub(sString,1,iLength)
Return (StrFix(StrFixLeft(sString,sPad,(StrLen(sString)+iLength)/2),sPad,iLength))
;..........................................................................................................................................
; This function "udfStrCenter" returns a string of iLength width
; with the input string centered and padded with pad character.
;
; Detlev Dalitz.20010729.20030209
;..........................................................................................................................................
#EndFunction

:skip_udfstrcenter
;------------------------------------------------------------------------------------------------------------------------------------------


; --- test ---

test1 = udfStrCenter('title'   , 12, "" ) ; ==> '   title    '
test2 = udfStrCenter('title'   , 12, '*') ; ==> '***title****'
test3 = udfStrCenter('title   ', 12, "" ) ; ==> '  title     '
test4 = udfStrCenter('title   ', 12, '*') ; ==> '**title   **'

Exit
;------------------------------------------------------------------------------------------------------------------------------------------
;*EOF*


If you have questions about WinBatch, you are encouraged to use online WebBoard BBS at http://webboard.windowware.com

Seitenanfang/TopOfPage Seitenende/EndOfPage Seitenende/EndOfPage Seitenanfang/TopOfPage

udfIsUpperCase (sChar)
udfIsLowerCase (sChar)

;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfisuppercase",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfisuppercase

#DefineFunction udfIsUpperCase (sChar)
Return (sChar==StrUpper(sChar))
#EndFunction

:skip_udfisuppercase
;------------------------------------------------------------------------------------------------------------------------------------------


;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfislowercase",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfislowercase

#DefineFunction udfIsLowerCase (sChar)
Return (sChar==StrLower(sChar))
#EndFunction

:skip_udfislowercase
;------------------------------------------------------------------------------------------------------------------------------------------


;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfsaycase",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfsaycase

#DefineFunction udfSayCase (iBool)
Return (ItemExtract(1+iBool,"lowercase,uppercase",","))
#EndFunction

:skip_udfsaycase
;------------------------------------------------------------------------------------------------------------------------------------------


;--- test ---
sUpperChar = "D"
sLowerChar = "d"
UTitle = "Demo udfIsUpperCase"
LTitle = "Demo udfIsLowerCase"
Message(UTitle, StrCat(sUpperChar," is ",udfSayCase( udfIsUpperCase(sUpperChar))))
Message(UTitle, StrCat(sLowerChar," is ",udfSayCase( udfIsUpperCase(sLowerChar))))
Message(LTitle, StrCat(sUpperChar," is ",udfSayCase(!udfIsLowerCase(sUpperChar))))
Message(LTitle, StrCat(sLowerChar," is ",udfSayCase(!udfIsLowerCase(sLowerChar))))
Exit
;------------------------------------------------------------------------------------------------------------------------------------------
;*EOF*


If you have questions about WinBatch, you are encouraged to use online WebBoard BBS at http://webboard.windowware.com

Seitenanfang/TopOfPage Seitenende/EndOfPage Seitenende/EndOfPage Seitenanfang/TopOfPage

udfIsAbbrev (sStr1, sStr2, iLen)

;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfisabbrev",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfisabbrev

#DefineFunction udfIsAbbrev (sString1, sString2, iLength)
iLength = Max(0,iLength) ; Negative number is forced to zero.
If (iLength == 0) Then Return (StrSub(sString1,1,StrLen(sString2)) == sString2)
If (iLength > StrLen (sString2)) Then Return (@FALSE)
Return (StrSub(sString1,1,iLength) == StrSub(sString2,1,iLength))
;..........................................................................................................................................
; This function "udfIsAbbrev" returns @TRUE if sString2 is an abbreviation of sString1 otherwise @FALSE.
; If iLength==0 then the udf returns @TRUE if sString2 is equal to the first characters in sString1, otherwise @FALSE.
; If iLength is specified, sString2 must be at least length characters long or @FALSE will be returned.
;..........................................................................................................................................
; Detlev Dalitz.20010729
;..........................................................................................................................................
#EndFunction

:skip_udfisabbrev
;------------------------------------------------------------------------------------------------------------------------------------------


; --- test ---
iIsAbbrev1 = '"WinBatch" ,"WinBat" ,-4' ; 1 = @TRUE, negative number is forced to zero.
iIsAbbrev2 = '"WinBatch" ,"WinBat" ,0 ' ; 1 = @TRUE
iIsAbbrev3 = '"WinBatch" ,"WinBot" ,0 ' ; 0 = @FALSE
iIsAbbrev4 = '"WinBatch" ,"WinBot" ,4 ' ; 1 = @TRUE
iIsAbbrev5 = '"WinBatch" ,"Wi"     ,3 ' ; 0 = @FALSE
iIsAbbrev6 = '"WinBatch" ,""       ,0 ' ; 1 = @TRUE
iIsAbbrev7 = '"WinBatch" ,""       ,1 ' ; 0 = @FALSE

sResult = ""
For i=1 To 7
   test = iIsAbbrev%i%
   sResult%i% = udfIsAbbrev(%test%)
   sResult = StrCat(sResult,sResult%i%)
Next

If (sResult == "1101010") Then Message("","Test ok.")

Exit
;------------------------------------------------------------------------------------------------------------------------------------------
;*EOF*


If you have questions about WinBatch, you are encouraged to use online WebBoard BBS at http://webboard.windowware.com

Seitenanfang/TopOfPage Seitenende/EndOfPage Seitenende/EndOfPage Seitenanfang/TopOfPage

udfStrCmpVersion (sString1, sString2, sDelim, iMatchCase)

;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrcmpversion",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrcmpversion

#DefineFunction udfStrCmpVersion (sString1, sString2, sDelim, iMatchCase)
sPad = "0"
iMatchCase = Min(1,Max(0,iMatchCase))
iCount1 = ItemCount(sString1,sDelim)
iCount2 = ItemCount(sString2,sDelim)
iCountMax = Max(iCount1,iCount2)
iItemLen = 1 + Max((StrLen(sString1)/iCount1),(StrLen(sString2)/iCount2))
sStringCmp1 = ""
sStringCmp2 = ""
For iCount=1 To iCountMax
   sStringCmp1 = StrFixLeft(ItemExtract(iCount,sString1,sDelim),sPad,iItemLen)
   sStringCmp2 = StrFixLeft(ItemExtract(iCount,sString2,sDelim),sPad,iItemLen)
   If iMatchCase
      iResult = StrCmp(sStringCmp1,sStringCmp2)
   Else
      iResult = StriCmp(sStringCmp1,sStringCmp2)
   EndIf
   If iResult Then Break
Next
Return (iResult)
;..........................................................................................................................................
; This function "udfStrCmpVersion" compares two "version strings".
;
; A "version string" is a string composed by sequences of numbers and/or characters,
; which are delimited, for example, by a single period character, e.g. "1.11.1111" or "2002.abc".
; The given strings are evaluated from left to right.
;
; This udf returns an integer value -1, 0, or 1,
; depending on whether sString1 is less than, equal to, or greater than sString2.
;..........................................................................................................................................
; Detlev Dalitz.20020125.20020817
;..........................................................................................................................................
#EndFunction

:skip_udfstrcmpversion
;------------------------------------------------------------------------------------------------------------------------------------------


; --- test ---

; Test 1: Version1 is less than version2.
sString11 = "9.900.09"
sString12 = "10.40.0101"

; Test 2: Version1 is greater than version2.
sString21 = "10.900"
sString22 = "10.40.0101"

; Test 3: Version1 is equal to version2.
sString31 = "10.900"
sString32 = "10.000900"

; Test 4:
; Version1 is greater than version2 if matchcase is 1 (@TRUE).
; Version1 is equal to version2 if matchcase is 0 (@FALSE).
sString41 = "2002A"
sString42 = "2002a"

; Test 5:
; Version1 is greater than version2.
sString51 = "5.6.0.6626"
sString52 = "5.6.0.1111"



sDelim = "."

iMatchCase = 1
;iMatchCase = 0

sRelationList = "less than,equal to,greater than"
For i=1 To 5
   sString1 = sString%i%1
   sString2 = sString%i%2
   sRelation = ItemExtract(2 + udfStrCmpVersion(sString1,sString2,sDelim,iMatchCase),sRelationList,",")
   sMsgText = ""
   sMsgText = StrCat(sMsgText,'Test ',i,@CRLF)
   sMsgText = StrCat(sMsgText,'Version1 = "',sString1,'"',@CRLF)
   sMsgText = StrCat(sMsgText,'Version2 = "',sString2,'"',@CRLF)
   sMsgText = StrCat(sMsgText,'Version1 is ',sRelation,' Version2',@CRLF)
   Message("Demo  udfStrCmpVersion (sString1, sString2, iMatchCase)",sMsgText)
Next

Exit
;------------------------------------------------------------------------------------------------------------------------------------------
;*EOF*


If you have questions about WinBatch, you are encouraged to use online WebBoard BBS at http://webboard.windowware.com

Seitenanfang/TopOfPage Seitenende/EndOfPage Seitenende/EndOfPage Seitenanfang/TopOfPage

udfStrTrimLeft (sString)
udfStrTrimRight (sString)

;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrtrimleft",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrtrimleft

#DefineFunction udfStrTrimLeft (sString)
If (sString=="") Then Return (sString)
Return (StrSub(sString,StrIndex(sString,StrTrim(sString),0,@FWDSCAN),-1))
; Detlev Dalitz.20020130
#EndFunction

:skip_udfstrtrimleft
;------------------------------------------------------------------------------------------------------------------------------------------


;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrtrimright",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrtrimright

#DefineFunction udfStrTrimRight (sString)
If (sString=="") Then Return (sString)
sTemp = StrTrim(sString)
Return (StrSub(sString,1,StrIndex(sString,sTemp,0,@FWDSCAN)+StrLen(sTemp)-1))
; Detlev Dalitz.20020130
#EndFunction

:skip_udfstrtrimright
;------------------------------------------------------------------------------------------------------------------------------------------



;--- test ---

sStringIn = " 1 2 3 test %TAB%  "

sStringOut = udfStrTrimLeft (sStringIn)
sMsgTitle = "Demo udfStrTrimLeft (str)"
sMsgText  = StrCat('StringIn',@TAB,'= "',sStringIn,'"',@CRLF,'StringOut',@TAB,'= "',sStringOut,'"')
Message(sMsgTitle,sMsgText)


sStringOut = udfStrTrimRight (sStringIn)
sMsgTitle = "Demo udfStrTrimRight (str)"
sMsgText  = StrCat('StringIn',@TAB,'= "',sStringIn,'"',@CRLF,'StringOut',@TAB,'= "',sStringOut,'"')
Message(sMsgTitle,sMsgText)

Exit
;------------------------------------------------------------------------------------------------------------------------------------------


If you have questions about WinBatch, you are encouraged to use online WebBoard BBS at http://webboard.windowware.com

Seitenanfang/TopOfPage Seitenende/EndOfPage Seitenende/EndOfPage Seitenanfang/TopOfPage

udfStrTrimHead (sString)
udfStrTrimTail (sString)

;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrtrimhead",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrtrimhead

#DefineFunction udfStrTrimHead (sString)
sLen=StrLen(sString)
For iPos=1 To sLen
   sChar=StrSub(sString,iPos,1)
   If sChar==" " Then Continue
   If sChar==@TAB Then Continue
   Break
Next
Return (StrSub(sString,iPos,-1))
#EndFunction

:skip_udfstrtrimhead
;------------------------------------------------------------------------------------------------------------------------------------------


;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrtrimtail",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrtrimtail

#DefineFunction udfStrTrimTail (sString)
sLen=StrLen(sString)
For iPos=sLen To 1 By -1
   sChar=StrSub(sString,iPos,1)
   If sChar==" " Then Continue
   If sChar==@TAB Then Continue
   Break
Next
Return (StrSub(sString,1,iPos))
#EndFunction

:skip_udfstrtrimtail
;------------------------------------------------------------------------------------------------------------------------------------------


;--- test ---

sStringIn = " 1 2 3 test %@TAB%  "

sStringOut = udfStrTrimHead (sStringIn)

sMsgTitle = "Demo udfStrTrimHead (sString)"
sMsgText  = StrCat('StringIn',@TAB,'= "',sStringIn,'"',@CRLF,'StringOut',@TAB,'= "',sStringOut,'"')
Message(sMsgTitle,sMsgText)


sStringOut = udfStrTrimTail (sStringIn)

sMsgTitle = "Demo udfStrTrimTail (sString)"
sMsgText  = StrCat('StringIn',@TAB,'= "',sStringIn,'"',@CRLF,'StringOut',@TAB,'= "',sStringOut,'"')
Message(sMsgTitle,sMsgText)

Exit
;------------------------------------------------------------------------------------------------------------------------------------------
;*EOF*


If you have questions about WinBatch, you are encouraged to use online WebBoard BBS at http://webboard.windowware.com

Seitenanfang/TopOfPage Seitenende/EndOfPage Seitenende/EndOfPage Seitenanfang/TopOfPage

udfPathUndecorate (sPathStr)

;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfpathundecorate",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfpathundecorate

#DefineFunction udfPathUndecorate (sPathStr)
iMAX_PATH = 260
hBB = BinaryAlloc(iMAX_PATH)
BinaryPokeStr(hBB,0,sPathStr)
DllCall(StrCat(DirWindows(1),"SHLWAPI.DLL"),long:"PathUndecorateA",lpbinary:hBB)
sPathStr = BinaryPeekStr(hBB,0,iMAX_PATH)
BinaryFree(hBB)
Return (sPathStr)
;..........................................................................................................................................
; This function "udfPathUndecorate" removes the decoration from a path string.
; A decoration consists of a pair of square brackets with one or more digits in between,
; inserted immediately after the base name and before the file name extension.
;
; The following table illustrates how strings are modified by PathUndecorate.
; Initial String       Undecorated String
; C:\Path\File[5].txt  C:\Path\File.txt
; C:\Path\File[12]     C:\Path\File
; C:\Path\File.txt     C:\Path\File.txt
; C:\Path\[3].txt      C:\Path\[3].txt
;
; Requires minimum Version 5.00 of SHLWAPI.DLL
;
;..........................................................................................................................................
; Detlev Dalitz.20010827
;..........................................................................................................................................
#EndFunction

:skip_udfpathundecorate
;------------------------------------------------------------------------------------------------------------------------------------------


;--- test ---

sPathStr1 = "C:\Path\File[5].txt"            ; ==> "C:\Path\File.txt"
sPathStr2 = "C:\Path\File[12]"               ; ==> "C:\Path\File"
sPathStr3 = "C:\Path\File.txt"               ; ==> "C:\Path\File.txt"
sPathStr4 = "C:\Path\[3].txt"                ; ==> "C:\Path\[3].txt"
sPathStr5 = "C:\Path\777[7].File(1)[3].txt"  ; ==> "C:\Path\777[7].File(1).txt"

sMsgTitel = "Demo  udfPathUndecorate (sPathStr)"
sMsgText  = ""
sMsgText = StrCat(sMsgText,sPathStr1,@LF,udfPathUndecorate(sPathStr1),@LF,@LF)
sMsgText = StrCat(sMsgText,sPathStr2,@LF,udfPathUndecorate(sPathStr2),@LF,@LF)
sMsgText = StrCat(sMsgText,sPathStr3,@LF,udfPathUndecorate(sPathStr3),@LF,@LF)
sMsgText = StrCat(sMsgText,sPathStr4,@LF,udfPathUndecorate(sPathStr4),@LF,@LF)
sMsgText = StrCat(sMsgText,sPathStr5,@LF,udfPathUndecorate(sPathStr5),@LF,@LF)

Message(sMsgTitel,sMsgText)

Exit
;------------------------------------------------------------------------------------------------------------------------------------------
;*EOF*


If you have questions about WinBatch, you are encouraged to use online WebBoard BBS at http://webboard.windowware.com

Seitenanfang/TopOfPage Seitenende/EndOfPage Seitenende/EndOfPage Seitenanfang/TopOfPage

How to remove tabs and spaces from a string?

;------------------------------------------------------------------------------------------------------------------------------------------
; How to remove tabs and spaces from a string.
;------------------------------------------------------------------------------------------------------------------------------------------
; This is a collection of six different algorithms
; including a performancetest.
;------------------------------------------------------------------------------------------------------------------------------------------
; Detlev Dalitz.20020201
;------------------------------------------------------------------------------------------------------------------------------------------

#DefineFunction udfStrRemoveTabSpace_1 (str)
len = StrLen(str)
OutStr = ""
i = 1
While (i <= len)
   While (i < len) && (StrClean(StrSub(str,i,2),StrCat(@TAB," "),"",@FALSE,1) == "")
      i = i + 1
   EndWhile
   OutStr = StrCat(OutStr,StrSub(str,i,1))
   i = i + 1
EndWhile
Return (OutStr)
#EndFunction

;------------------------------------------------------------------------------------------------------------------------------------------

#DefineFunction udfStrRemoveTabSpace_2 (str)
str = StrReplace(str,@TAB," ")
While @TRUE
   lenpre = StrLen(str)
   str = StrReplace(str,"  "," ")
   lenpost = StrLen(str)
   If (lenpre==lenpost) Then Break
EndWhile
Return (str)
#EndFunction

;------------------------------------------------------------------------------------------------------------------------------------------

#DefineFunction udfStrRemoveTabSpace_3 (str)
str = StrReplace(str,@TAB," ")
lenpost = StrLen(str)
lenpre  = lenpost + 1
While (lenpre>lenpost)
   lenpre = lenpost
   str = StrReplace(str,"  "," ")
   lenpost = StrLen(str)
EndWhile
Return (str)
#EndFunction

;------------------------------------------------------------------------------------------------------------------------------------------

#DefineFunction udfStrRemoveTabSpace_4 (str)
str = StrClean(str,@TAB," ",@FALSE,1)
While StrIndex(str,"  ",1,@FWDSCAN)
   str = StrReplace(str,"  "," ")
EndWhile
Return (str)
#EndFunction

;------------------------------------------------------------------------------------------------------------------------------------------

#DefineFunction udfStrRemoveTabSpace_5 (str) ; This udf seems to be the fastest.
str = StrReplace(str,@TAB," ")
While StrIndex(str,"  ",1,@FWDSCAN)
   str = StrReplace(str,"  "," ")
EndWhile
Return (str)
#EndFunction

;------------------------------------------------------------------------------------------------------------------------------------------

#DefineFunction udfStrRemoveTabSpace_6 (str)
bb = BinaryAlloc(StrLen(str))
BinaryPokeStr(bb,0,str)
BinaryReplace(bb,@TAB," ",@FALSE)
While (BinaryReplace(bb,"  "," ",@FALSE) > 1)
EndWhile
str = BinaryPeekStr(bb,0,BinaryEodGet(bb))
BinaryFree(bb)
Return (str)
#EndFunction

;------------------------------------------------------------------------------------------------------------------------------------------

;--- test ---

msgtitle = "Demo udfStrRemoveTabSpace Performance Test"

TestStr = StrCat(@TAB,@TAB,@TAB,@TAB,"  Hi       there.  ")
TestLoop = 100

MaxTests = 6
For t=1 To MaxTests
   Display(1,msgtitle,"Running Test %t%, please wait ...")
   Exclusive(@ON)
   start = GetTickCount()
   For i=1 To TestLoop
      str = udfStrRemoveTabSpace_%t% (TestStr)
   Next
   stop = GetTickCount()
   Exclusive(@ON)
   Ticks%t% = stop-start
Next

MaxTicks = 0
For t=1 To MaxTests
   MaxTicks = Max(MaxTicks,Ticks%t%)
Next

For t=1 To MaxTests
   Pct%t% = 100*Ticks%t%/MaxTicks
Next

msgtext = ""
For t=1 To MaxTests
   msgtext = StrCat(msgtext,"Test ",t,@TAB,"Ticks = ",@TAB,Ticks%t%,@TAB,Pct%t%," %%",@CRLF)
Next
ClipPut(msgtext)
Message(msgtitle,msgtext)

Exit
;------------------------------------------------------------------------------------------------------------------------------------------
;   WinBatch Studio Debug
;   Test 1 Ticks =  73098 100 %
;   Test 2 Ticks =  16307 22 %
;   Test 3 Ticks =  17598 24 %
;   Test 4 Ticks =  9515 13 %
;   Test 5 Ticks =  9358 12 %  <== The Winner.
;   Test 6 Ticks =  9928 13 %
;------------------------------------------------------------------------------------------------------------------------------------------
;   WinBatch Studio Run
;   Test 1 Ticks =  10586 100 %
;   Test 2 Ticks =  1955 18 %
;   Test 3 Ticks =  1764 16 %
;   Test 4 Ticks =  1324 12 %
;   Test 5 Ticks =  1284 12 %  <== The Winner.
;   Test 6 Ticks =  1684 15 %
;------------------------------------------------------------------------------------------------------------------------------------------
;*EOF*


If you have questions about WinBatch, you are encouraged to use online WebBoard BBS at http://webboard.windowware.com

Seitenanfang/TopOfPage Seitenende/EndOfPage Seitenende/EndOfPage Seitenanfang/TopOfPage

udfStrReverse (sString)
udfIsStrPalindrome (sString)

;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrreverse_1",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrreverse_1

#DefineFunction udfStrReverse_1 (str)
len=StrLen(str)
OutStr=""
For i=len To 1 By -1
   OutStr=StrCat(OutStr,StrSub(str,i,1))
Next
Return (OutStr)
;..........................................................................................................................................
; Returns string reversed.
; Backward reading.
; "0123456789" <==> "9876543210"
;..........................................................................................................................................
#EndFunction

:skip_udfstrreverse_1
;------------------------------------------------------------------------------------------------------------------------------------------


;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrreverse_2",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrreverse_2

#DefineFunction udfStrReverse_2 (str)
len=StrLen(str)
len1=len+1
len2=len/2
bb=BinaryAlloc(len1)
BinaryPokeStr(bb,1,str)
For i=1 To len2
   BinaryCopy(bb,0,bb,len1-i,1)
   BinaryCopy(bb,len1-i,bb,i,1)
   BinaryCopy(bb,i,bb,0,1)
Next
str=BinaryPeekStr(bb,1,len)
BinaryFree(bb)
Return (str)
;..........................................................................................................................................
; Returns string reversed.
; Swapping.
; "0123456789" <==> "9876543210"
;..........................................................................................................................................
#EndFunction
; Etwa 1,5 mal langsamer als udfStrReverse_1 !
:skip_udfstrreverse_2
;------------------------------------------------------------------------------------------------------------------------------------------


;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrreverse_3",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrreverse_3

#DefineFunction udfStrReverse_3 (str)
len=StrLen(str)
bb=BinaryAlloc(len)
BinaryPokeStr(bb,0,str)
For j=len-1 To 1 By -1
   For i=0 To j-1
      BinaryPoke(bb,i,BinaryPoke(bb,i+1,BinaryPeek(bb,i)))
   Next
Next
str=(BinaryPeekStr(bb,0,len))
BinaryFree(bb)
Return (str)
;..........................................................................................................................................
; Returns string reversed.
; Swapping.
; "0123456789" <==> "9876543210"
;..........................................................................................................................................
#EndFunction
; Etwa 70 mal langsamer als udfStrReverse_1 !!!
:skip_udfstrreverse_3
;------------------------------------------------------------------------------------------------------------------------------------------


;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrreverse_4",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrreverse_4

#DefineFunction udfStrReverse_4 (str)
len=StrLen(str)
A=ArrDimension(len + 1)
For i=1 To len
   A[i]=StrSub(str,i,1)
Next
For j=len To 1 By -1
   For i=1 To j-1
      A[0]=A[i]
      A[i]=A[i+1]
      A[i+1]=A[0]
   Next
Next
str=""
For i=1 To len
   str=StrCat(str,A[i])
Next
Drop (A)
Return (str)
;..........................................................................................................................................
; Returns string reversed.
; Swapping.
; "0123456789" <==> "9876543210"
;..........................................................................................................................................
#EndFunction
; Etwa 50 mal langsamer als udfStrReverse_1 !!
:skip_udfstrreverse_4
;------------------------------------------------------------------------------------------------------------------------------------------


;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udsstrreverse_5",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udsstrreverse_5

#DefineFunction udfStrReverse_5 (str,i,len)
j = 1 + len - i
If (i < j)
   ch = StrSub(str,i,1)
   str = StrCat(StrSub(str,1,i-1),StrSub(str,j,1),StrSub(str,i+1,-1))
   str = StrCat(StrSub(str,1,j-1),ch,StrSub(str,j+1,-1))
   str = udfStrReverse_5 (str,i+1,len)
EndIf
Return (str)
;..........................................................................................................................................
; Returns string reversed.
; Recursive.
; "0123456789" <==> "9876543210"
;..........................................................................................................................................
#EndFunction
;
:skip_udsstrreverse_5
;------------------------------------------------------------------------------------------------------------------------------------------


;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfisstrpalindrome",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfisstrpalindrome

#DefineFunction udfIsStrPalindrome (sString)
If sString=="" Then Return @FALSE
iStrLen = 1+StrLen(sString)
iMid = iStrLen/2
For i=1 To iMid
   If StrSub(sString,i,1)<>StrSub(sString,iStrLen-i,1) Then Return @FALSE
Next
Return @TRUE
;..........................................................................................................................................
; This Function "udfIsPalindrome" returns a boolean value
; which indicates if a given string is a Palindrome or not.
; A Palindrome is a string which can be read either from left to right and from right to left.
; For Example: "madam".
;..........................................................................................................................................
#EndFunction

:skip_udfisstrpalindrome
;------------------------------------------------------------------------------------------------------------------------------------------


;goto test2
; --- test ---

:test1
IsPalindrome1 = udfIsStrPalindrome("madam")
IsPalindrome2 = udfIsStrPalindrome("mad adam")


:test2
; TestStr = "REGEN"
; TestStr = "EINNEGERMITGAZELLEZAGTIMREGENNIE"
; TestStr = "RADAR"
; TestStr = "CIVIC"
; TestStr = "ABBA"
; TestStr = "A man, a plan, a canal, Panama."
; TestStr = "madam"
; TestStr = "Lid off a daffodil"
; TestStr = "Norma is as selfless as I am, Ron"

TestStr = "0123456789"

;   str1 = udfStrReverse_1 (TestStr)
;   str2 = udfStrReverse_2 (TestStr)
;   str3 = udfStrReverse_3 (TestStr)
;   str4 = udfStrReverse_4 (TestStr)
str5 = udfStrReverse_5 (TestStr,1,StrLen(TestStr))


:Performancetest

msgtitle = "Demo udfStrReverse (str)   Performance Test"
BoxOpen(msgtitle,"")

TestStr = "A man, a plan, a canal, Panama."

TestLoop = 10

:Testloop
MaxTests = 4
For t=1 To MaxTests
   BoxText("Running Test %t%, please wait ...")
   Exclusive(@ON)
   start = GetTickCount()
   For i=1 To TestLoop
      str = udfStrReverse_%t% (TestStr)
   Next
   stop = GetTickCount()
   Exclusive(@OFF)
   Ticks%t% = stop-start
Next

:Test5
MaxTests = 5
t=5
BoxText("Running Test %t%, please wait ...")
Exclusive(@ON)
start = GetTickCount()
For i=1 To TestLoop
   str = udfStrReverse_%t% (TestStr,1,StrLen(TestStr))
Next
stop = GetTickCount()
Exclusive(@OFF)
Ticks%t% = stop-start


:Result
MaxTicks = 0
For t=1 To MaxTests
   MaxTicks = Max(MaxTicks,Ticks%t%)
Next
For t=1 To MaxTests
   Pct%t% = 100*Ticks%t%/MaxTicks
Next
msgtext = ""
For t=1 To MaxTests
   msgtext = StrCat(msgtext,"Test ",t,@TAB,"Ticks = ",@TAB,Ticks%t%,@TAB,Pct%t%," %%",@CRLF)
Next

BoxButtonDraw(1,1,"&OK","20,780,980,950")
BoxText(msgtext)
While !BoxButtonStat(1,1)
EndWhile
ClipPut(msgtext)

Exit

;------------------------------------------------------------------------------------------------------------------------------------------
;   WinBatch Studio Run
;   Test 1 Ticks =  1775 3 %   <== The Winner.
;   Test 2 Ticks =  2620 4 %
;   Test 3 Ticks =  53585 100 %
;   Test 4 Ticks =  39225 73 %
;   Test 5 Ticks =  4875 9 %
;------------------------------------------------------------------------------------------------------------------------------------------
;*EOF*


If you have questions about WinBatch, you are encouraged to use online WebBoard BBS at http://webboard.windowware.com

Seitenanfang/TopOfPage Seitenende/EndOfPage Seitenende/EndOfPage Seitenanfang/TopOfPage

udfStrCapitalize (str)

;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrcap_1",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrcap_1

#DefineFunction udfStrCap_1 (str)
len=StrLen(str)
If (len==0) Then Return("")
flag=@TRUE
cap=""
For i=1 To len
   ch=StrSub(str,i,1)
   If flag
      cap=StrCat(cap,StrUpper(ch))
   Else
      cap=StrCat(cap,ch)
   EndIf
   flag=(ch==" ")
Next
Return (cap)
#EndFunction

:skip_udfstrcap_1
;------------------------------------------------------------------------------------------------------------------------------------------


; --- test ---
InStr  = "To be OR NOT to be"  ; "To Be OR NOT To Be"
CapStr = udfStrCap_1 (InStr)
;------------------------------------------------------------------------------------------------------------------------------------------



;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrcap_2",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrcap_2

#DefineFunction udfStrCap_2 (str)
len=StrLen(str)
x=1
While 1
   While 1
      st2=StrSub(str,x,1)
      If st2<>" " || x==len Then Break
      x=x+1
   EndWhile
   str=StrCat(StrFixChars(str,"",x-1),StrUpper(st2),StrFixCharsL(str,"",len-x))
   While 1
      st3=StrSub(str,x,1)
      If st3==" " || x==len Then Break
      x=x+1
   EndWhile
   If x==len Then Break
EndWhile
Return str
#EndFunction

:skip_udfstrcap_2
;------------------------------------------------------------------------------------------------------------------------------------------


; --- test ---
InStr  = "To be OR NOT to be"
CapStr = udfStrCap_2 (InStr)   ; "To Be OR NOT To Be"
;------------------------------------------------------------------------------------------------------------------------------------------



;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrcap_3",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrcap_3

#DefineFunction udfStrCap_3 (str)
item_count=ItemCount(str," ")
For i=1 To item_count
   item=ItemExtract(i,str," ")
   If (item<>"")
      first=StrSub(item,1,1)
      first=StrUpper(first)
      other=StrSub(item,2,-1)
      item=StrCat(first,other)
      str=ItemReplace(item,i,str," ")
   EndIf
Next
Return (str)
#EndFunction

:skip_udfstrcap_3
;------------------------------------------------------------------------------------------------------------------------------------------


; --- test ---
InStr  = "To be OR NOT to be"
CapStr = udfStrCap_3 (InStr)   ; "To Be OR NOT To Be"
;------------------------------------------------------------------------------------------------------------------------------------------



;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrcap_4",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrcap_4

#DefineFunction udfStrCap_4 (sString) ; This algorithm seems to be the fastest.
sStrOut=""
While sString>""
   sStrOut=ItemInsert(StrCat(StrUpper(StrSub(ItemExtract(1,sString," "),1,1)),StrSub(StrLower(ItemExtract(1,sString," ")),2,-1)),-1,sStrOut," ")
   sString=ItemRemove(1,sString," ")
EndWhile
Return sStrOut
#EndFunction

:skip_udfstrcap_4
;------------------------------------------------------------------------------------------------------------------------------------------


; --- test ---
InStr  = "To be OR NOT to be"
CapStr = udfStrCap_4 (InStr)  ; "To Be Or Not To Be"
;------------------------------------------------------------------------------------------------------------------------------------------



;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrcap_5",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrcap_5

#DefineFunction udfStrCap_5 (str)
pcStr=''
While (str<>'')
   item=ItemExtract(1,str,' ')
   first=StrSub(item,1,1)
   first=StrUpper(first)
   other=StrSub(item,2,-1)
   other=StrLower(other)
   item=StrCat(first,other)
   pcStr=ItemInsert(item,-1,pcStr,' ')
   str=ItemRemove(1,str,' ')
EndWhile
Return pcStr
#EndFunction

:skip_udfstrcap_5
;------------------------------------------------------------------------------------------------------------------------------------------


; --- test ---
InStr  = "To be OR NOT to be"
CapStr = udfStrCap_5 (InStr) ; "To Be Or Not To Be"
;------------------------------------------------------------------------------------------------------------------------------------------



;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrcap_6",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrcap_6
#DefineFunction udfStrCap_6 (str)
x=0
len=StrLen(str)
buf=BinaryAlloc(len+100)
BinaryPokeStr(buf,0,str)
y=0
While 1
   While 1
      st2=BinaryPeekStr(buf,x,1)
      st5=BinaryIndexEx(buf,y,@CRLF,@FWDSCAN,0)
      If st5<>-1
         BinaryPokeStr(buf,st5+2,StrUpper(BinaryPeekStr(buf,st5+2,1)))
         y=st5+2
      EndIf
      If st2<>" " || x==len Then Break
      x=x+1
   EndWhile
   BinaryPokeStr(buf,x,StrUpper(st2))

   While 1
      st3=BinaryPeekStr(buf,x,1)
      If st3==" " || x==len Then Break
      x=x+1
   EndWhile
   If x==len Then Break
EndWhile
str=BinaryPeekStr(buf,0,len)
Return str
#EndFunction

:skip_udfstrcap_6
;------------------------------------------------------------------------------------------------------------------------------------------


; --- test ---
InStr  = "To be OR NOT to be"
CapStr = udfStrCap_6 (InStr)   ; "To Be OR NOT To Be"
;------------------------------------------------------------------------------------------------------------------------------------------



;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrcap_7",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrcap_7

#DefineFunction udfStrCap_7 (sString)
iLen = StrLen(sString)
If !iLen Then Return ("")
sOut = StrUpper(StrSub(sString,1,1))
For i=2 To iLen
   If StrIndex(" ,.:;-=<>?!/()[]{}",StrSub(sString,i-1,1),1,@FWDSCAN) Then sOut = StrCat(sOut,StrUpper(StrSub(sString,i,1)))
      Else sOut = StrCat(sOut,StrSub(sString,i,1))
Next
Return (sOut)
#EndFunction

:skip_udfstrcap_7
;------------------------------------------------------------------------------------------------------------------------------------------


; --- test ---
InStr  = "To be OR NOT to be"
CapStr = udfStrCap_7 (InStr)   ; "To Be OR NOT To Be"
;------------------------------------------------------------------------------------------------------------------------------------------



;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udffilecap",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udffilecap

#DefineFunction udfFileCap (InFilename, OutFilename)
fsize=FileSize(InFilename)
If (fsize==0) Then Return ("")
bb=BinaryAlloc(fsize+2)
BinaryPokeStr(bb,0," ")       ; Insert one blank character.
BinaryPokeStr(bb,fsize+1," ") ; Append one blank character.
BinaryReadEx(bb,1,InFilename,0,fsize)
BinaryConvert(bb,0,0,0,2) ; Convert to lowercase.
For i=65 To 90            ; "A" to "Z"
   ch=Num2Char(i)
   str=StrCat(@TAB,ch)
   BinaryReplace(bb,str,str,@FALSE)
   str=StrCat(@CR,ch)
   BinaryReplace(bb,str,str,@FALSE)
   str=StrCat(@LF,ch)
   BinaryReplace(bb,str,str,@FALSE)
   str=StrCat(" ",ch)
   BinaryReplace(bb,str,str,@FALSE)
   str=StrCat("-",ch)
   BinaryReplace(bb,str,str,@FALSE)
   str=StrCat("=",ch)
   BinaryReplace(bb,str,str,@FALSE)
   str=StrCat(",",ch)
   BinaryReplace(bb,str,str,@FALSE)
   str=StrCat(".",ch)
   BinaryReplace(bb,str,str,@FALSE)
   str=StrCat(":",ch)
   BinaryReplace(bb,str,str,@FALSE)
   str=StrCat("?",ch)
   BinaryReplace(bb,str,str,@FALSE)
   str=StrCat("!",ch)
   BinaryReplace(bb,str,str,@FALSE)
   str=StrCat("/",ch)
   BinaryReplace(bb,str,str,@FALSE)
   str=StrCat("(",ch)
   BinaryReplace(bb,str,str,@FALSE)
   str=StrCat(")",ch)
   BinaryReplace(bb,str,str,@FALSE)
   str=StrCat("[",ch)
   BinaryReplace(bb,str,str,@FALSE)
   str=StrCat("]",ch)
   BinaryReplace(bb,str,str,@FALSE)
   str=StrCat("{",ch)
   BinaryReplace(bb,str,str,@FALSE)
   str=StrCat("}",ch)
   BinaryReplace(bb,str,str,@FALSE)
   str=StrCat("'",ch)
   BinaryReplace(bb,str,str,@FALSE)
   str=StrCat('"',ch)
   BinaryReplace(bb,str,str,@FALSE)
Next
BinaryWriteEx(bb,0,OutFilename,0,-1)        ; Create new file.
num=BinaryWriteEx(bb,1,OutFilename,0,fsize) ; Discard added blanks.
BinaryFree(bb)
Return (num)
#EndFunction

:skip_udffilecap
;------------------------------------------------------------------------------------------------------------------------------------------


; --- test ---
InFilename = IntControl(1004,0,0,0,0) ; Use this script as test input.
OutFilename = FileCreateTemp("TMP")

num = udfFileCap (InFilename, OutFilename)
RunZoomWait("notepad",OutFilename)
FileDelete(OutFilename)
;------------------------------------------------------------------------------------------------------------------------------------------



;------------------------------------------------------------------------------------------------------------------------------------------
:Performancetest
msgtitle = "Demo udfStrCap (str)  Performance Test"

TestStr  = StrCat("To be",@TAB,"OR NOT",@TAB,"to be")
TestLoop = 50

MaxTests = 7
For t=1 To MaxTests
   Display(1,msgtitle,"Running Test %t%, please wait ...")
   Exclusive(@ON)
   start = GetTickCount()
   For i=1 To TestLoop
      str = udfStrCap_%t% (TestStr)
   Next
   stop = GetTickCount()
   Exclusive(@OFF)
   Ticks%t% = stop-start
Next

MaxTicks = 0
For t=1 To MaxTests
   MaxTicks = Max(MaxTicks,Ticks%t%)
Next
For t=1 To MaxTests
   Pct%t% = 100*Ticks%t%/MaxTicks
Next
msgtext = ""
For t=1 To MaxTests
   msgtext = StrCat(msgtext,"Test ",t,@TAB,"Ticks = ",@TAB,Ticks%t%,@TAB,Pct%t%," %%",@CRLF)
Next
Message(msgtitle,msgtext)
ClipPut(msgtext)

Exit

;------------------------------------------------------------------------------------------------------------------------------------------
; Test in WinBatch Studio Debug Mode
;   Test 1   Ticks =    14082   81 %
;   Test 2   Ticks =    13883   80 %
;   Test 3   Ticks =    5511   31 %
;   Test 4   Ticks =    2828   16 %   <== The Winner.
;   Test 5   Ticks =    5574   32 %
;   Test 6   Ticks =    17323   100 %
;   Test 7   Ticks =    9151   52 %
;------------------------------------------------------------------------------------------------------------------------------------------
; Test in WinBatch Studio Run Mode
;   Test 1   Ticks =    3529   67 %
;   Test 2   Ticks =    3977   76 %
;   Test 3   Ticks =    1810   34 %
;   Test 4   Ticks =    1164   22 %   <== The Winner.
;   Test 5   Ticks =    1839   35 %
;   Test 6   Ticks =    5218   100 %
;   Test 7   Ticks =    3480   66 %
;------------------------------------------------------------------------------------------------------------------------------------------
; Detlev Dalitz.20030210
;------------------------------------------------------------------------------------------------------------------------------------------
;*EOF*


If you have questions about WinBatch, you are encouraged to use online WebBoard BBS at http://webboard.windowware.com

Seitenanfang/TopOfPage Seitenende/EndOfPage Seitenende/EndOfPage Seitenanfang/TopOfPage

udfStrTranslate (sString, sTableOut, sTableIn, sPad)

;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrtranslate_1",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfStrTranslate_1

#DefineFunction udfStrTranslate_1 (sString, sTableOut, sTableIn, sPad) ; speed performance = low = 100 pct.
If (sTableOut=="") Then If (sTableIn=="") Then Return (StrUpper(sString))
If (sPad=="") Then sPad = " "
hBBTable = BinaryAlloc(256)
For i=0 To 255
   BinaryPoke(hBBTable,i,i)
Next
iLenString = StrLen(sString)
iLenIn = StrLen(sTableIn)
sTableOut = StrFix(sTableOut,sPad,iLenIn)
iLenOut = StrLen(sTableOut)
For i=1 To iLenIn
   BinaryPoke(hBBTable,Char2Num(StrSub(sTableIn,i,1)),Char2Num(StrSub(sTableOut,i,1)))
Next
sOut = ""
For i=1 To iLenString
   sOut = StrCat(sOut,Num2Char(BinaryPeek(hBBTable,Char2Num(StrSub(sString,i,1)))))
Next
BinaryFree(hBBTable)
Return (sOut)
; Detlev Dalitz.20020219
#EndFunction

:skip_udfStrTranslate_1
;------------------------------------------------------------------------------------------------------------------------------------------


;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrtranslate_2",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrtranslate_2

#DefineFunction udfStrTranslate_2 (sString, sTableOut, sTableIn, sPad) ; speed performance = middle = 92..96 pct.
If (sTableOut=="") Then If (sTableIn=="") Then Return (StrUpper(sString))
If (sPad=="") Then sPad = " "
hBBTable = BinaryAlloc(256)
For i=0 To 255
   BinaryPoke(hBBTable,i,i)
Next
iLenString = StrLen(sString)
iLenIn = StrLen(sTableIn)
sTableOut = StrFix(sTableOut,sPad,iLenIn)
iLenOut = StrLen(sTableOut)
hBBString = BinaryAlloc(iLenString)
hBBOut = BinaryAlloc(iLenOut)
hBBIn = BinaryAlloc(iLenIn)
BinaryPokeStr(hBBString,0,sString)
BinaryPokeStr(hBBOut,0,sTableOut)
BinaryPokeStr(hBBIn,0,sTableIn)
ilen = iLenIn-1
For i=0 To ilen
   BinaryCopy(hBBTable,BinaryPeek(hBBIn,i),hBBOut,i,1)
Next
BinaryXlate(hBBString,hBBTable,0)
sOut = BinaryPeekStr(hBBString,0,iLenString)
BinaryFree(hBBTable)
BinaryFree(hBBString)
BinaryFree(hBBOut)
BinaryFree(hBBIn)
Return (sOut)
; Detlev Dalitz.20020219
#EndFunction

:skip_udfstrtranslate_2
;------------------------------------------------------------------------------------------------------------------------------------------


;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrtranslate_3",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrtranslate_3

#DefineFunction udfStrTranslate_3 (sString, sTableOut, sTableIn, sPad)

If (sTableOut=="") Then If (sTableIn=="") Then Return (StrUpper(sString))
If (sPad=="") Then sPad = " "
aArray = ArrDimension(256)
For i=0 To 255
   aArray[i] = i
Next
iLenString = StrLen(sString)
iLenIn = StrLen(sTableIn)
sTableOut = StrFix(sTableOut,sPad,iLenIn)
iLenOut = StrLen(sTableOut)
For i=1 To iLenIn
   aArray[Char2Num(StrSub(sTableIn,i,1))] = Char2Num(StrSub(sTableOut,i,1))
Next
sOut = ""
For i=1 To iLenString
   sOut = StrCat(sOut,Num2Char(aArray[Char2Num(StrSub(sString,i,1))]))
Next
Drop(aArray)
Return (sOut)
; Detlev Dalitz.20020219
#EndFunction

:skip_udfstrtranslate_3
;------------------------------------------------------------------------------------------------------------------------------------------


; --- test ---
sMsgTitle = "Demo udfStrTranslate (sString, sTableOut, sTableIn, sPad)"

sMsgText = ""
TestItem = 'udfStrTranslate_3 ("abczyx", "", "", "")'
sMsgText = StrCat(sMsgText,`%TestItem%`,@TAB,' = ',%TestItem%,@LF) ; ABCZYX

TestItem = 'udfStrTranslate_3 ("abzyx!", "1234?", "abcd!","")'
sMsgText = StrCat(sMsgText,`%TestItem%`,@TAB,' = ',%TestItem%,@LF) ; 12zyx?

TestItem = 'udfStrTranslate_3 ("5678/12/34", "mmddyyyy:", "12345678/", "")'
sMsgText = StrCat(sMsgText,`%TestItem%`,@TAB,' = ',%TestItem%,@LF) ; yyyy:mm:dd

TestItem = 'udfStrTranslate_3 ("1.22.333.4",  "-", ".0123456789", "?")'
sMsgText = StrCat(sMsgText,`%TestItem%`,@TAB,' = ',%TestItem%,@LF) ; ?-??-???-?

TestItem = 'udfStrTranslate_3 ("1.2.3.4", "-0123456789", ".", "?")'
sMsgText = StrCat(sMsgText,`%TestItem%`,@TAB,' = ',%TestItem%,@LF) ; 1-2-3-4

Message(sMsgTitle,sMsgText)

;------------------------------------------------------------------------------------------------------------------------------------------

:Performancetest

sMsgTitle = "Demo udfStrTranslate (sString, sTableOut, sTableIn, sPad)  Performance Test"

; TestItem = '("abcdefg", "", "", "")'
TestItem = '("5678/12/34", "12345678/", "mmddyyyy:", "")'

TestLoop = 10

MaxTests = 3
For t=1 To MaxTests
   Display(1,sMsgTitle,"Running Test %t%, please wait ...")
   Exclusive(@ON)
   start = GetTickCount()
   For i=1 To TestLoop
      sResult = udfStrTranslate_%t% %TestItem%
   Next
   stop = GetTickCount()
   Exclusive(@OFF)
   Ticks%t% = stop-start
Next

MaxTicks = 0
For t=1 To MaxTests
   MaxTicks = Max(MaxTicks,Ticks%t%)
Next
For t=1 To MaxTests
   Pct%t% = 100*Ticks%t%/MaxTicks
Next
sMsgText = ""
For t=1 To MaxTests
   sMsgText = StrCat(sMsgText,"Test ",t,@TAB,"Ticks = ",@TAB,Ticks%t%,@TAB,Pct%t%," %%",@LF)
Next
Message(sMsgTitle,sMsgText)
ClipPut(sMsgText)

;   WinBatch Studio Run



;------------------------------------------------------------------------------------------------------------------------------------------

:Test_ROT13
; As an alternative to the function "udfStrROT13 (sString)".

sString   = "# ABC -- WinBatch rotates *You* -- XYZ !"
sTableIn  = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
sTableOut = 'nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM'
sPad = ""

sRot    = udfStrTranslate_3 (sString, sTableOut, sTableIn, sPad) ; "# NOP -- JvaOngpu ebgngrf *Lbh* -- KLM !"
sRotRot = udfStrTranslate_3 (sRot, sTableOut, sTableIn, sPad)    ; "# ABC -- WinBatch rotates *You* -- XYZ !"

sMsgText = StrCat(sString,@LF,sRot,@LF,sRotRot)
Message(sMsgTitle,sMsgText)

;------------------------------------------------------------------------------------------------------------------------------------------

:Test_Remove_Accents

sString   = "Šêñòr Žž Øçÿ íßt ÑËÜ."
sTableIn  = "ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ"
sTableOut = "SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy"
sPad = ""

sTrans = udfStrTranslate_3 (sString, sTableOut, sTableIn, sPad) ; "Senor Zz Ocy ist NEU."

sMsgText = StrCat(sString,@LF,sTrans)
Message(sMsgTitle,sMsgText)

;------------------------------------------------------------------------------------------------------------------------------------------

:Test_Lowcase
; As an alternative to the not-yet-existing php function "stritr".

sString   = "aBc"
sTableIn  = "ABCabc"
sTableOut = "xyzxyz"
sPad = ""

sTrans = udfStrTranslate_3 (sString, sTableOut, sTableIn, sPad) ; "xyz"

sMsgText = StrCat(sString,@LF,sTrans)
Message(sMsgTitle,sMsgText)

;------------------------------------------------------------------------------------------------------------------------------------------

:Test_FormatNumberString

sString   = "(abc) defg-hijk"
sTableIn  = "abcdefghijk"
sTableOut = "12345678901"
sPad = ""

sTrans = udfStrTranslate_3 (sString, sTableOut, sTableIn, sPad)

sMsgText = StrCat(sString,@LF,sTrans)
Message(sMsgTitle,sMsgText)

;------------------------------------------------------------------------------------------------------------------------------------------

:Soundex
;----------------------------------------------------------
; Soundex und SoundexEx with udfStrTranslate()
;----------------------------------------------------------
Name     = "Ashcraft"
Mode     = 0  ;  0=normal, 1=extended Soundex.
Tabin    = 'WHYEAUIOBFPVCGJKQSXZDTLMNR'
Tabout0  = '00000000111122222222334556'
Tabout1  = '00000000121234435355667889'
Soundex  = StrClean(Name,Tabin,"",@FALSE,2)
Soundex  = StrUpper(Soundex)
Soundex1 = StrSub(Soundex,1,1)
Soundex  = udfStrTranslate_3(Soundex,Tabout%Mode%,Tabin,"")
Soundex  = StrSub(Soundex,2,-1)
Soundex  = StrCat(Soundex1,Soundex)
Soundex  = StrReplace(Soundex,"0","")
i=2
While i<StrLen(Soundex)
   Char = StrSub(Soundex,i,1)
   Soundex = StrReplace(Soundex,StrCat(Char,Char),Char)
   i=i+1
EndWhile
Soundex = StrFix(Soundex,"0",4+Mode)
Message(Name,Soundex)
;------------------------------------------------------------------------------------------------------------------------------------------

Exit
;------------------------------------------------------------------------------------------------------------------------------------------
;*EOF*


If you have questions about WinBatch, you are encouraged to use online WebBoard BBS at http://webboard.windowware.com

Seitenanfang/TopOfPage Seitenende/EndOfPage Seitenende/EndOfPage Seitenanfang/TopOfPage

udfStrReplaceNC (sourcestr, oldstr, newstr)

;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrreplacenc_1",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrreplacenc_1

#DefineFunction udfStrReplaceNC_1 (sourcestr, oldstr, newstr)
lenin = StrLen(sourcestr)
lenold = StrLen(oldstr)
lennew = StrLen(newstr)
bbsize = lenin
If (lennew>lenold) Then bbsize = (1+(lenin/lenold))*lennew
bb = BinaryAlloc(bbsize)
BinaryPokeStr(bb,0,sourcestr)
BinaryReplace(bb,oldstr,newstr,@FALSE)
outstr = BinaryPeekStr(bb,0,BinaryEodGet(bb))
BinaryFree(bb)
Return (outstr)
;..........................................................................................................................................
; Adapted from
; Conf:  WinBatch
; From:  Marty marty+bbs@winbatch.com
; Date:  Thursday, May 16, 2002 01:01 PM
;..........................................................................................................................................
; Slighty modified by Detlev Dalitz.20020517
;..........................................................................................................................................
#EndFunction

:skip_udfstrreplacenc_1
;------------------------------------------------------------------------------------------------------------------------------------------


;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrreplacenc_2",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrreplacenc_2

#DefineFunction udfStrReplaceNC_2 (sourcestr, oldstr, newstr)
lenin = StrLen(sourcestr)
lenold = StrLen(oldstr)
pos = 1
While 1
   pos = StrIndexNC(sourcestr,oldstr,pos,@FWDSCAN)
   If !pos Then Break
   sourcestr = StrCat(StrSub(sourcestr,1,pos-1),newstr,StrSub(sourcestr,pos+lenold,-1))
EndWhile
Return (sourcestr)
;..........................................................................................................................................
; Adapted from
; Conf:  WinBatch
; From:  billmeek winbatch@tfic.com
; Date:  Thursday, May 16, 2002 01:24 PM
;..........................................................................................................................................
; Slighty modified by Detlev Dalitz.20020517
;..........................................................................................................................................
#EndFunction

:skip_udfstrreplacenc_2
;------------------------------------------------------------------------------------------------------------------------------------------



; --- test ---

sourcestr = " Hello Cat the dog said to the cAt"
oldstr = "cat"
newstr = "Sammy"

outstr = udfStrReplaceNC_1 (sourcestr, oldstr, newstr)
Message(sourcestr,outstr)
; ==> "Hello Sammy the dog said to the Sammy"

outstr = udfStrReplaceNC_2 (sourcestr, oldstr, newstr)
Message(sourcestr,outstr)
; ==> " Hello Sammy the dog said to the Sammy"


;------------------------------------------------------------------------------------------------------------------------------------------
:Performancetest

msgtitle = "Demo udfStrReplaceNC   Performance Test"

sourcestr = " Hello Cat the dog said to the cAt"
oldstr = "cat"
newstr = "Sammy"

TestLoop = 200
Maxtests = 2

For t=1 To Maxtests
   Display(1,msgtitle,"Running Test %t%, please wait ...")
   Exclusive(@ON)
   start = GetTickCount()
   For i=1 To TestLoop
      str = udfStrReplaceNC_%t% (sourcestr, oldstr, newstr)
   Next
   stop = GetTickCount()
   Exclusive(@OFF)
   Ticks%t% = stop-start
Next

MaxTicks = 0
For t=1 To MaxTests
   MaxTicks = Max(MaxTicks,Ticks%t%)
Next
For t=1 To MaxTests
   Pct%t% = 100*Ticks%t%/MaxTicks
Next
msgtext = ""
For t=1 To MaxTests
   msgtext = StrCat(msgtext,"Test ",t,@TAB,"Ticks = ",@TAB,Ticks%t%,@TAB,Pct%t%," %%",@CRLF)
Next
Message(msgtitle,msgtext)
ClipPut(msgtext)

Exit
;------------------------------------------------------------------------------------------------------------------------------------------
;   WinBatch Studio Run
;   Test 1 Ticks =  2668 84 %  <== The Winner.
;   Test 2 Ticks =  3167 100 %
;------------------------------------------------------------------------------------------------------------------------------------------
;*EOF*


If you have questions about WinBatch, you are encouraged to use online WebBoard BBS at http://webboard.windowware.com

Seitenanfang/TopOfPage Seitenende/EndOfPage Seitenende/EndOfPage Seitenanfang/TopOfPage

udfStrNumThousands (numstr, mode)

;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrnumthousands",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrnumthousands

#DefineFunction udfStrNumThousands (numstr, mode)
; #DefineFunction udfStrNumCommaize (numstr, mode)

If (numstr=="") Then Return (numstr)

If mode
   point = "," ; European style
   sep = "."
Else
   point = "." ; American style
   sep = ","
EndIf

numstr = StrClean(numstr,StrCat(point,"0123456789"),"",@TRUE,2) ; Allow digits and decimal point.
numle = ItemExtract(1,numstr,point)
numri = ItemExtract(2,numstr,point)
numle = StrSub(numle,StrScan(numle,"123456789",1,@FWDSCAN),-1) ; Delete leading zeroes.
numri = StrSub(numri,1,StrScan(numri,"123456789",StrLen(numri),@BACKSCAN)) ; Delete trailing zeroes.

If (numle == "")
   outle = "0"
Else
   outle = ""
   len = StrLen(numle)
   While (len > 3)
      outle = ItemInsert(StrSub(numle,len-2,3),0,outle,sep)
      numle = StrSub(numle,1,len-3)
      len = StrLen(numle)
   EndWhile
   outle = ItemInsert(numle,0,outle,sep)
EndIf
numout = outle

If (numri == "")
   ; numri = "0"
Else
   outri = ""
   len = StrLen(numri)
   While (len > 3)
      outri = ItemInsert(StrSub(numri,1,3),-1,outri,sep)
      numri = StrSub(numri,4,-1)
      len = StrLen(numri)
   EndWhile
   numri = StrFix(numri,"0",3)
   outri = ItemInsert(numri,-1,outri,sep)
   numout = StrCat(outle,point,outri)
EndIf

Return (numout)
;..........................................................................................................................................
; This function returns a number string formatted in 3-digit packets ("Commaize").
; mode = 0 = American number style = "1,234.567,890"
; mode = 1 = European number style = "1.234,567.890"
;..........................................................................................................................................
; Detlev Dalitz.20020614
;..........................................................................................................................................
#EndFunction

:skip_udfstrnumthousands
;------------------------------------------------------------------------------------------------------------------------------------------


; --- test ---

number1 = "00001234567890000"
str1 = udfStrNumThousands (number1,0)
; ==> "1,234,567,890,000"

number2 = "00001234.567890000"
str2 = udfStrNumThousands (number2,0)
; ==> "1,234.567,890"

number3 = "0000123.4567890000"
str3 = udfStrNumThousands (number3,0)
; ==> "123.456,789"

msgtitle = "Demo  udfStrNumThousands(numstr,mode)"
msgtext  = ""
msgtext  = StrCat(msgtext,number1,@TAB," = ",str1,@CRLF)
msgtext  = StrCat(msgtext,number2,@TAB," = ",str2,@CRLF)
msgtext  = StrCat(msgtext,number3,@TAB," = ",str3,@CRLF)
Message(msgtitle,msgtext)

Exit
;------------------------------------------------------------------------------------------------------------------------------------------
;*EOF*


If you have questions about WinBatch, you are encouraged to use online WebBoard BBS at http://webboard.windowware.com

Seitenanfang/TopOfPage Seitenende/EndOfPage Seitenende/EndOfPage Seitenanfang/TopOfPage

udfStrFormatByteSize (iNumber)
udfStrFormByteSize (numstr, numlen, declen)

;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrformatbytesize",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrformatbytesize

#DefineFunction udfStrFormatByteSize (iNumber)
iBBSize = 16
hBB = BinaryAlloc(iBBSize)
BinaryEodSet(hBB,iBBSize)
sFormStr = ""
If DllCall(StrCat(DirWindows(1),"SHLWAPI.DLL"),long:"StrFormatByteSizeA",long:iNumber,lpbinary:hBB,long:iBBSize) Then sFormStr = BinaryPeekStr(hBB,0,iBBSize)
BinaryFree(hBB)
Return (sFormStr)
;..........................................................................................................................................
;   Range for iNumber = 0..(2**32)-1
;..........................................................................................................................................
;   StrFormatByteSizeA Function
;   Converts a numeric value into a string that represents the number expressed
;   as a size value in bytes, kilobytes, megabytes, or gigabytes, depending on the size.
;
;   Syntax
;   LPTSTR StrFormatByteSizeA(
;       DWORD dw,
;       LPSTR pszBuf,
;       UINT cchBuf
;   );
;
;   Parameters
;   dw
;   [in] Numeric value to be converted.
;
;   pszBuf
;   [out] Pointer to the converted string.
;
;   cchBuf
;   [in] Size of pszBuf, in characters.
;
;   Return Value
;   Returns the address of the converted string, or NULL if the conversion fails.
;
;   Remarks
;   The first parameter of this function has a different type for the ANSI and Unicode versions.
;   If your numeric value is a DWORD, you can use StrFormatByteSize with text macros for both cases.
;   The compiler will cast the numerical value to a LONGLONG for the Unicode case.
;   If your numerical value is a LONGLONG, you should use StrFormatByteSizeW explicitly.
;
;   Example
;          532 -> 532 bytes
;         1340 -> 1.3KB
;        23506 -> 23.5KB
;      2400016 -> 2.4MB
;   2400000000 -> 2.4GB
;
;   Function Information
;   Minimum DLL Version shlwapi.dll version 4.71 or later
;..........................................................................................................................................
#EndFunction

:skip_udfstrformatbytesize
;------------------------------------------------------------------------------------------------------------------------------------------


;------------------------------------------------------------------------------------------------------------------------------------------
If ItemLocate("udfstrformbytesize",IntControl(77,103,0,0,0),@TAB) Then Goto skip_udfstrformbytesize

#DefineFunction udfStrFormByteSize (numstr, numlen, declen)
div = 1024
len = StrLen(div)
dim = 0
lenpre = numlen-declen-(declen>0)
If (lenpre<1) Then Return ("")

While 1
   pos = 1
   num = StrSub(numstr,pos,len)
   pos = pos + len
   numpre = 0
   numpost = 0
   resultstr = ""
   While 1
      numpre = num / div
      numpost = num - (numpre * div)
      resultstr = StrCat(resultstr,numpre)
      digit = StrSub(numstr,pos,1)
      If (digit=="") Then Break
      num = StrCat(numpost,digit)
      pos = pos + 1
   EndWhile
   dim = dim + 1
   If (StrLen(resultstr)<=lenpre) Then Break
   numstr = resultstr
EndWhile

If (numpost>0)
   numpost = 1.0 * numpost / div         ; 0.1234567
   numpost = StrReplace(numpost,".","")  ; "01234567"
   lenpost = StrLen(numpost)

   strpost = ""
   lenmin = Max(2,declen+2)
   For i=lenpost To lenmin By -1
      numround = Min(9,StrSub(numpost,i-1,1) + (StrSub(numpost,i,1)>4))
      strpost = StrCat(numround,strpost)
   Next
   strpost = StrCat(StrSub(numpost,1,declen),strpost)

   resultstr = 0 + resultstr + StrSub(strpost,1,1) ; add maybe overflow

   If (declen>0)
      resultstr = StrCat(resultstr,".")
      For i=1 To declen
         resultstr = StrCat(resultstr,StrSub(strpost,i+1,1))
      Next
   EndIf
Else
   If (declen>0)
      resultstr = StrCat(resultstr,".",StrFill("0",declen))
   EndIf
EndIf

dim = ItemExtract(dim+1," Byte, KB, MB, GB, TB, ??",",")
resultstr = StrCat(resultstr,dim)

Return (resultstr)
;..........................................................................................................................................
; Example:
; sNumString = udfStrFormByte ("23456789", 6, 2)
; This function "udfStrFormByteSize" returns a formatted string like "22.37 MB".
;..........................................................................................................................................
; Detlev Dalitz.20020529
;..........................................................................................................................................
#EndFunction

:skip_udfstrformbytesize
;------------------------------------------------------------------------------------------------------------------------------------------



; --- test ---
; Note: Germany country settings.

:test1
sStr11 = udfStrFormatByteSize (       532