Open Forum > Business BASIC Migrations
Business BASIC Helper Library
(1/1)
Support:
Here are a few ProvideX Business Basic like functions that can be used to help with your conversion to Script BASIC.
--- Code: Script BASIC ---' BB Function Helper Library ' BB_ATH - Business BASIC ATH() function'' Converts a text string of hex character pairs to ASCII values.'FUNCTION BB_ATH(HexStr) LOCAL LenHex, AsciiStr, HexTable, ScanPos, HiByte, LowByte LenHex = LEN(HexStr) IF LenHex % 2 = 0 THEN HexTable = "0123456789ABCDEF" FOR ScanPos = 1 TO LenHex STEP 2 HiByte = INSTR(HexTable,UCASE(MID(HexStr, ScanPos, 1))) - 1 LowByte = INSTR(HexTable,UCASE(MID(HexStr, ScanPos + 1, 1))) - 1 IF ISINTEGER(HiByte) AND ISINTEGER(LowByte) THEN AsciiStr &= CHR(HiByte * 16 + LowByte) ELSE AsciiStr = "" GOTO Exit_For END IF NEXT ScanPos Exit_For: ELSE AsciiStr = "" END IF BB_ATH = AsciiStr END FUNCTION ' BB_CVS - Business Basic CVS() function'' Action:' 1 = Remove Leading characters' 2 = Remove Trailing characters' 4 = Convert String to Upper Case' 8 = Convert String to Lower Case' 16 = Replace characters < 32 with the control character' 32 = Replace multiple occurrence of the character with one' 64 = * Replace $ with defined Windows currency symbol' 128 = * Replace defined Windows currency, comma and thousand symbol' 256 = * Ucase first char of each word, rest to lower' * = Not implemented yet.'FUNCTION BB_CVS(StrExpr, Action, CtrlChar) LOCAL Char, ExprLen, TempStr, ScanPos IF CtrlChar = undef THEN CtrlChar = " " Char = ASC(CtrlChar) ' Remove Leading characters IF (Action AND 1) THEN ExprLen = LEN(StrExpr) IF CtrlChar = " " THEN StrExpr = LTRIM(StrExpr) ELSE TempStr = "" FOR ScanPos = 1 TO ExprLen IF MID(StrExpr, ScanPos, 1) <> CtrlChar THEN TempStr &= MID(StrExpr, ScanPos, 1) NEXT ScanPos StrExpr = TempStr END IF END IF ' Remove Trailing characters IF (Action AND 2) THEN ExprLen = LEN(StrExpr) IF CtrlChar = " " THEN StrExpr = RTRIM(StrExpr) ELSE TempStr = "" FOR ScanPos = ExprLen TO 1 STEP - 1 IF MID(StrExpr, ScanPos, 1) = CtrlChar THEN TempStr = LEFT(StrExpr, ScanPos - 1) NEXT ScanPos IF LEN(TempStr) THEN StrExpr = TempStr END IF END IF ' Convert String to Upper Case IF (Action AND 4) THEN StrExpr = UCASE(StrExpr) END IF ' Convert String to Lower Case IF (Action AND 8) THEN StrExpr = LCASE(StrExpr) END IF ' Replace characters < 32 with the control character IF (Action AND 16) THEN FOR ScanPos = 1 TO LEN(StrExpr) IF ASC(MID(StrExpr, ScanPos, 1)) < 32 THEN StrExpr = LEFT(StrExpr, ScanPos -1) & CtrlChar & MID(StrExpr, ScanPos + 1) NEXT ScanPos END IF ' Replace multiple occurence of the character with one IF (Action AND 32) THEN HitCnt = 0 StartPos = 1 NextPos: ScanPos = INSTR(StrExpr,CtrlChar,StartPos) IF ISINTEGER(ScanPos) THEN IF HitCnt THEN IF ASC(MID(StrExpr, ScanPos,1)) = CtrlChar THEN TeStrExpr = LEFT(StrExpr, ScanPos -1) & MID(StrExpr, ScanPos + 1) ELSE HitCnt += 1 END IF StartPos += 1 GOTO NextPos END IF END IF BB_CVS = StrExpr END FUNCTION ' BB_DEC - Business BASIC DEC() function'' Returns a two's complement binary equivalent of the string.'FUNCTION BB_DEC(BinStr) LOCAL i, d FOR i = LEN(BinStr) TO 1 STEP -1 d += ASC(MID(BinStr,i,1)) * 256 ^ ABS(i - LEN(BinStr)) NEXT i BB_DEC = d END FUNCTION ' BB_HTA - Business BASIC HTA() function'' Returns the hexadecimal text string of the pasted argument string.'FUNCTION BB_HTA(AsciiStr) LOCAL AsciiLen,ScanPos,HexStr AsciiLen = LEN(AsciiStr) IF AsciiLen THEN FOR ScanPos = 1 TO AsciiLen HexStr &= RIGHT("0" & HEX(ASC(MID(AsciiStr, ScanPos, 1))),2) NEXT ScanPos ELSE HexStr = "" END IF BB_HTA = HexStrEND FUNCTION ' BB_JUL - Business BASIC JUL() function'' Converts a date from year, month, day to a Julian date.'FUNCTION BB_JUL(Y,M,D) IF Y = undef AND M = undef AND D = undef THEN BB_JUL = NOW ELSE BB_JUL = TIMEVALUE(Y,M,D) END IF END FUNCTION ' BB_LRC - Business Basic LRC() function.'' Returns a one byte string containing the longitudinal redundancy checksum of a character string.'FUNCTION BB_LRC(ArgStr) LOCAL ArgStrLen, ScanPos, LRCVal LRCVal = 0 ArgStrLen = LEN(ArgStr) IF ArgStrLen THEN FOR ScanPos = 1 TO ArgStrLen LRCVal += LRCVal XOR ASC(MID(ArgStr, ScanPos, 1)) NEXT ScanPos BB_LRC = CHR(LRCVal) ELSE BB_LRC = CHR(&H00) END IF END FUNCTION ' BB_PAD - Business BASIC PAD() funtion'' Returns a character string of the length specified (NumExpr)'' NOTE: StrExpr = String to be processed' NewLen = Desired length of string' HowToPad = This parameter defines how to pad the string' 0 - Pad on left (right justify)' 1 - Pad on right (left justify)' 2 - Center in string' StrPad = First character of this string used to pad StrExpr'FUNCTION BB_PAD(StrExpr,NewLen,HowToPad,StrPad) LOCAL StrExpr,NewLen,HowToPad,StrPad,PadVal,StrExprLen,ResultStr,RLPLen IF HowToPad = undef THEN PadVal = 1 ELSE IF HowToPad = 0 OR UCASE(HowToPad) = "L" THEN PadVal = 0 ELSE IF HowToPad = 1 OR UCASE(HowToPad) = "R" THEN PadVal = 1 ELSE IF HowToPad = 2 OR UCASE(HowToPad) = "C" THEN PadVal = 2 ELSE BB_ERR = 41 BB_PAD = "" EXIT FUNCTION END IF IF StrPad = undef THEN StrPad = " " StrExprLen = LEN(StrExpr) IF PadVal = 0 THEN IF NewLen < StrExprLen THEN ResultStr = RIGHT(StrExpr, NewLen) ELSE ResultStr = STRING(NewLen - StrExprLen, StrPad) & StrExpr END IF END IF IF PadVal = 1 THEN IF NewLen < StrExprLen THEN ResultStr = LEFT(StrExpr, NewLen) ELSE ResultStr = StrExpr & STRING(NewLen - StrExprLen, StrPad) END IF END IF IF PadVal = 2 THEN IF NewLen < StrExprLen THEN ResultStr = LEFT(StrExpr, NewLen) ELSE RLPLen = (NewLen - StrExprLen) / 2 IF RLPLen % 2 THEN ResultStr = STRING(FIX(RLPLen),StrPad) & StrExpr & STRING(FIX(RLPLen) + 1,StrPad) ELSE ResultStr = STRING(RLPLen,StrPad) & StrExpr & STRING(RLPLen,StrPad) END IF ENDIF END IF BB_PAD = ResultStr END FUNCTION ' BB_POS - Business Basic POS() function' ' BB_POS follows these logic steps:'' 1. If stringA or StringB is null, return 0' 2. Start with first byte in stringB if intA is positive, or the Nth byte' from the end of stringB if intA is negatine (-N).' 3. If past either the begining or end of stringB then return 0' (or occurrence count if intB is 0)' 4. Compare stringA with the substring at the current position in stringB.' The length of substring will be either the length of stringA or the' remainder of stringB, whichever is shorter.' 5. If a given releationship is true and if this was the Nth successful' try (specified by intB=N) then return the current scan position.' 6. If the relation was not satisfied then bump the scan position' (possibly backwards if intA is negative) and go to step 3 and try again.'' Relationship Operators:'' "=" - Equal To' "<" - Less Than' ">" - Greater Than' "<=" - Less Than Or Equal To' ">=" - Greater Than Or Equal To' "<>" - Not Equal To' ":" - Equal to Any' "^" - Not Equal To Any'FUNCTION BB_POS(MatchStr,ScanStr,Relate,IncVal,OccurVal) LOCAL LenMatchStr,LenScanStr,ScanPos,OccurCnt,Item,StartVal,EndVal IF Relate = undef THEN Relate = "=" IF IncVal = undef THEN IncVal = 1 IF OccurVal = undef THEN OccurVal = 1 LenMatchStr = LEN(MatchStr) IF INSTR(":^", Relate) THEN LenMatchStr = 1 LenScanStr = LEN(ScanStr) IF LenMatchStr = 0 OR LenScanStr = 0 OR OccurVal < 0 THEN BB_POS = 0 EXIT FUNCTION END IF IF IncVal > 0 THEN StartVal = 1 EndVal = LenScanStr ELSE StartVal = LenScanStr EndVal = 1 END IF FOR ScanPos = StartVal TO EndVal STEP IncVal Item = MID(ScanStr, ScanPos, LenMatchStr) IF Relate = "=" THEN IF MatchStr = Item THEN OccurCnt += 1 ELSE IF Relate = "<" THEN IF MatchStr < Item THEN OccurCnt += 1 ELSE IF Relate = ">" THEN IF MatchStr > Item THEN OccurCnt += 1 ELSE IF Relate = "<=" OR Relate = "=<" THEN IF MatchStr <= Item THEN OccurCnt += 1 ELSE IF Relate = ">=" OR Relate = "=>" THEN IF MatchStr >= Item THEN OccurCnt += 1 ELSE IF Relate = "<>" OR Relate = "><" THEN IF MatchStr <> Item THEN OccurCnt += 1 ELSE IF Relate = ":" THEN IF INSTR(MatchStr, Item) THEN OccurCnt += 1 ELSE IF Relate = "^" THEN IF NOT ISNUMERIC(INSTR(MatchStr, Item)) THEN OccurCnt += 1 ELSE BB_POS = 0 EXIT FUNCTION END IF IF OccurVal > 0 THEN IF OccurCnt = OccurVal THEN GOTO Done END IF NEXT ScanPos Done: IF OccurVal = 0 THEN BB_POS = OccurCnt ELSE IF OccurCnt THEN BB_POS = ScanPos ELSE BB_POS = 0 END IF END FUNCTION
bbtest.sb
--- Code: Script BASIC ---' bb.inc test script IMPORT bb.inc PRINT "HTA()\n"hta = BB_HTA("Script BASIC")PRINT hta,"\n\n"PRINT "ATH()\n"PRINT BB_ATH(hta),"\n\n"PRINT "PAD()\n"s = BB_PAD("BASIC",10,2," ")PRINT "|" & s & "|\n\n"PRINT "POS()\n"s = "The quick brown fox"' yields 5PRINT BB_POS("q",s,"="),"\n"' yields 0PRINT BB_POS("z",s,"="),"\n" ' yields 13PRINT BB_POS("o",s,"=") ,"\n"' yields 18 - Scan from end (fox)PRINT BB_POS("o",s,"=",-1),"\n"' yields 18 - Second occurrence (fox)PRINT BB_POS("o",s,"=",1,2),"\n" ' yields 13 - Checks every 2nd positionPRINT BB_POS("o",s,"=",2),"\n" ' yields 6 - "u" is first char. > "r"PRINT BB_POS("r",s,"<"),"\n" PRINT "CVS()\n"s = " sb "PRINT "|" & BB_CVS(s,3," "),"|\n"PRINT "|" & BB_CVS(s,4,""),"|\n\n"
Output
jrs@laptop:~/sb/sb22/PHB$ time scriba bbtest.sb
HTA()
536372697074204241534943
ATH()
Script BASIC
PAD()
| BASIC |
POS()
5
0
13
18
18
13
6
CVS()
|sb|
| SB |
real 0m0.026s
user 0m0.022s
sys 0m0.004s
jrs@laptop:~/sb/sb22/PHB$
Navigation
[0] Message Index
Go to full version