RbBFBlokProjPSIVStrn2008.051ACnmStrnAChpStrnACsvStrnVer1Strn1 Ver2Strn0 Ver3Strn0 RelsStrn0 NnRlStrn0 RegnStrnSVerStrnLVerStrnIVerStrnaiviInt DVewInt K ;prTpInt DLanInt CLanInt DEncInt BflgInt AIconGrupEndGInt MacCStrnBCarStrnMy Application BCMOStrnAVRBL DownloaderBunIStrnnet.strout.avrbl.downloader BSizInt @BMSzInt BSzSStrn4096BMSSStrn2048MDIcStrnBWinStrnAVRBL Downloader.exeBMDIInt WcmNStrnWpNmStrnWiNmStrnBL86StrnAVRBL DownloaderDgCLStrnPadnPadn****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************BlokpObjJN NameStrnApp ContInt paswStrnbClsInt SuprStrn Application flagInt bNtrInt bApOInt CompStrnHInsGrupnameStrnOpenCompStrnVsblInt sorcGrupdEncoInt srclStrn Sub Open() srclStrnAutoQuit = True srclStrnsrclStrnEnd Sub EndGInt EndGInt MnuHGrupnameStrn HelpAbout CompStrnVsblInt sorcGrupEncoInt srclStrnFunction HelpAbout() As Boolean srclStrn AboutBox.Show srclStrnsrclStrn Return True srclStrnsrclStrn End FunctionEndGInt EndGInt MnuHGrupnameStrnFileDownloadWindow CompStrnVsblInt sorcGrupEncoInt srclStrn(Function FileDownloadWindow() As BooleansrclStrnMainWindow.Show srclStrnsrclStrn Return True srclStrnsrclStrn End FunctionEndGInt EndGInt MnuHGrupnameStrn FileLogWindow CompStrnVsblInt sorcGrupEncoInt srclStrn#Function FileLogWindow() As Boolean srclStrnLogWindow.Show srclStrnsrclStrn Return True srclStrnsrclStrn End FunctionEndGInt EndGInt PDefGrup$nameStrnMenuBar PValInt 15/EndGInt VwBhGrupEndGInt CnstGrupnameStrnkFileQuitShortcut CompStrnVsblInt EncoInt nameStrnkFileQuitShortcut typeInt defnStrnflagInt CInsGrup0pltfInt langInt defnStrnCmd+Q EndGInt CInsGrup0pltfInt langInt defnStrnCtrl+Q EndGInt EndGInt CnstGrupnameStrn kFileQuit CompStrnVsblInt EncoInt nameStrn kFileQuit typeInt defnStrn&Quit flagInt CInsGrup0pltfInt langInt defnStrnE&xit EndGInt EndGInt CnstGrupnameStrn kEditClear CompStrnVsblInt EncoInt nameStrn kEditClear typeInt defnStrn&Delete flagInt CInsGrup0pltfInt langInt defnStrn&Delete EndGInt CInsGrup0pltfInt langInt defnStrn&Delete EndGInt EndGInt PadnPadn************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************BlokpVewK ;NameStrn MainWindow ContInt paswStrnbClsInt SuprStrnWindow flagInt bNtrInt CompStrnHInsGrupnameStrnOpenCompStrnVsblInt sorcGrupEncoInt srclStrn Sub Open() srclStrn LoadPrefs srclStrnsrclStrnSetState State.Idle srclStrnsrclStrnEnd Sub EndGInt EndGInt HInsGrup(nameStrn CancelClose CompStrnVsblInt sorcGrupEncoInt srclStrn7Function CancelClose(appQuitting as Boolean) As Boolean srclStrn SavePrefs srclStrnsrclStrnLogWindow.Close srclStrnsrclStrn return falsesrclStrnsrclStrn End FunctionEndGInt EndGInt MethGrupnameStrn EnableButtons CompStrnVsblInt sorcGrupLEncoInt srclStrnSub EnableButtons() srclStrnFif Port.SerialPort <> nil and mHexFile <> nil and mHexFile.Exists then srclStrn"StartStopButn.Caption = "Download" srclStrnStartStopButn.Enabled = TruesrclStrnelsesrclStrnStartStopButn.Enabled = False srclStrnend if srclStrnsrclStrnEnd Sub EndGInt EncoInt AlasStrnflagInt shrdInt parmStrnrsltStrnEndGInt MethGrupnameStrnSetStateCompStrnVsblInt sorcGrupEncoInt srclStrnSub SetState(newState As State) srclStrnmState = newState srclStrnsrclStrnselect case mState srclStrnsrclStrncase State.Idle srclStrnStatusTxt.Text = "Idle" srclStrnProg.Visible = FalsesrclStrnOnOffTxt.Visible = FalsesrclStrnsrclStrncase State.Connecting srclStrnStartStopButn.Enabled = false srclStrnStatusTxt.Text = "Connecting" srclStrnPort.Baud = Val( BaudPop.Text ) srclStrnif Port.Open then srclStrnSetState State.AwaitingPrompt srclStrnelsesrclStrnSetState State.CantOpen srclStrnend if srclStrnsrclStrncase State.CantOpen srclStrn9StatusTxt.Text = "Connection failed (check serial cable)" srclStrnStartStopButn.Enabled = TruesrclStrnsrclStrncase State.AwaitingPrompt srclStrn)StatusTxt.Text = "Awaiting device reset." srclStrnStartStopButn.Enabled = TruesrclStrnsrclStrncase State.SendingKey srclStrnStatusTxt.Text = "Sending key." srclStrn2Dim key() As String = Split( Trim( KeyFld.Text ) ) srclStrn%for i As Integer = 0 to UBound( key ) srclStrn%key(i) = ChrB( Val( "&h" + key(i) ) ) srclStrnnextsrclStrnPort.Write Join( key, "" ) srclStrnSetState State.AwaitingVersion srclStrnsrclStrncase State.AwaitingVersion srclStrn$StatusTxt.Text = "Awaiting version."srclStrnsrclStrncase State.SendingFile srclStrn StatusTxt.Text = "Sending file."srclStrnProg.Value = 0 srclStrnProg.Maximum = mHexFile.Length srclStrnProg.Visible = True srclStrnmLinesSent = 0 srclStrn mLinesOK = 0srclStrn#SendTimer.Mode = Timer.ModeMultiple srclStrnsrclStrncase State.DoneSendingFile srclStrn%StatusTxt.Text = "Done sending file." srclStrnProg.Visible = FalsesrclStrnSendTimer.Mode = Timer.ModeOff srclStrnStartStopButn.Enabled = TruesrclStrnsrclStrnelsesrclStrn$StatusTxt.Text = "?!? Unknown state"srclStrn end select srclStrnsrclStrnEnd Sub EndGInt EncoInt AlasStrnflagInt shrdInt parmStrnnewState As State rsltStrnEndGInt MethGrupnameStrnHandleRemoteDataCompStrnVsblInt sorcGruppEncoInt srclStrn!Sub HandleRemoteData(b As String) srclStrnB// Given one byte of data from the device, decide what to do next. srclStrnsrclStrnif AscB(b) = 17 thensrclStrn mXon = True srclStrnOnOffTxt.Text = "XON" srclStrnOnOffTxt.Visible = True srclStrn)LogWindow.Log LogWindow.kComment, "[XON]" srclStrnreturn srclStrnend if srclStrnsrclStrnif AscB(b) = 19 thensrclStrn mXon = FalsesrclStrnOnOffTxt.Text = "XOFF" srclStrnOnOffTxt.Visible = True srclStrn*LogWindow.Log LogWindow.kComment, "[XOFF]" srclStrnreturn srclStrnend if srclStrnsrclStrnselect case mState srclStrnsrclStrncase State.AwaitingPrompt srclStrnif b = "^" then // got prompt! srclStrnSetState State.SendingKey srclStrnend if srclStrnsrclStrncase State.AwaitingVersion srclStrn%if b = "?" then // done with version srclStrnSetState State.SendingFile srclStrnend if srclStrnsrclStrncase State.SendingFile srclStrnif b = "~" then srclStrnmLinesOK = mLinesOK + 1 srclStrnZLogWindow.Log LogWindow.kComment, Str( mLinesOK ) + " / " + Str( mLinesSent ) + " are OK." srclStrnend if srclStrnsrclStrncase State.DoneSendingFile srclStrnif b = "@" then srclStrnSetState State.Idle srclStrn Port.Close srclStrn'StatusTxt.Text = "Download successful!" srclStrnelseif b = "#" then srclStrnSetState State.Idle srclStrn Port.Close srclStrn6StatusTxt.Text = "ERROR; installation not successful." srclStrnend if srclStrnsrclStrn end select srclStrnsrclStrnEnd Sub EndGInt EncoInt AlasStrnflagInt shrdInt parmStrn b As String rsltStrnEndGInt MethGrupXnameStrnPreferencesFile CompStrnVsblInt sorcGrupEncoInt srclStrn(Function PreferencesFile() As FolderItemsrclStrn?return SpecialFolder.Preferences.Child("avrbl-downloader.pref") srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrnrsltStrn FolderItem EndGInt MethGrupnameStrn LoadPrefs CompStrnVsblInt sorcGrupTEncoInt srclStrnSub LoadPrefs() srclStrn%Dim f As FolderItem = PreferencesFile srclStrn'if f is nil or not f.Exists then return srclStrnsrclStrn-Dim inp As TextInputStream = f.OpenAsTextFile srclStrnif inp is nil then return srclStrnsrclStrnwhile not inp.EOF srclStrn!Dim line As String = inp.ReadLine srclStrn"if line.StartsWith( "port:" ) then srclStrn!PopSelect PortPop, Mid( line, 6 ) srclStrn&elseif line.StartsWith( "baud:" ) then srclStrn!PopSelect BaudPop, Mid( line, 6 ) srclStrn%elseif line.StartsWith( "key:" ) then srclStrnKeyFld.Text = Mid( line, 5 )srclStrn&elseif line.StartsWith( "file:" ) then srclStrnDim file As FolderItem srclStrntry srclStrn@file = GetFolderItem( Mid( line, 6 ), FolderItem.PathTypeShell )srclStrncatch srclStrnend try srclStrn#if file <> nil and file.Exists then srclStrnmHexFile = file srclStrnFileFld.Text = file.ShellPath srclStrnend if srclStrnend if srclStrnwendsrclStrnsrclStrn EnableButtons srclStrnsrclStrnEnd Sub EndGInt EncoInt AlasStrnflagInt shrdInt parmStrnrsltStrnEndGInt MethGrup|nameStrn SavePrefs CompStrnVsblInt sorcGrupEncoInt srclStrnSub SavePrefs() srclStrn%Dim f As FolderItem = PreferencesFile srclStrnif f is nil then return srclStrnsrclStrnf.DeletesrclStrn/Dim outp As TextOutputStream = f.CreateTextFile srclStrn%outp.WriteLine "port:" + PortPop.Text srclStrn%outp.WriteLine "baud:" + BaudPop.Text srclStrn#outp.WriteLine "key:" + KeyFld.Text srclStrnCif mHexFile <> nil then outp.WriteLine "file:" + mHexFile.ShellPath srclStrnsrclStrnEnd Sub EndGInt EncoInt AlasStrnflagInt shrdInt parmStrnrsltStrnEndGInt MethGrupnameStrn PopSelect CompStrnVsblInt sorcGrup4EncoInt srclStrn> Shared Sub PopSelect(pm As PopupMenu, textToSelect As String) srclStrn(for i As Integer = 0 to pm.ListCount - 1srclStrn!if pm.List(i) = textToSelect then srclStrnpm.ListIndex = isrclStrnreturn srclStrnend if srclStrnnextsrclStrnsrclStrnEnd Sub EndGInt EncoInt AlasStrnflagInt shrdInt parmStrn'pm As PopupMenu, textToSelect As String rsltStrnEndGInt PropGrupnameStrnmHexFileCompStrnVsblInt sorcGrup@EncoInt srclStrnmHexFile As FolderItem srclStrnEndGInt EncoInt declStrnmHexFile As FolderItem flagInt shrdInt EndGInt PropGrupnameStrnmState CompStrnVsblInt sorcGrup8EncoInt srclStrnmState As State srclStrnEndGInt EncoInt declStrnmState As State flagInt shrdInt EndGInt PropGrupnameStrnmXonCompStrnVsblInt sorcGrup8EncoInt srclStrnmXon As Boolean srclStrnEndGInt EncoInt declStrnmXon As Boolean flagInt shrdInt EndGInt PropGrupnameStrn mInputStreamCompStrnVsblInt sorcGrupHEncoInt srclStrnmInputStream As TextInputStream srclStrnEndGInt EncoInt declStrnmInputStream As TextInputStream flagInt shrdInt EndGInt PropGrupnameStrn mLinesSent CompStrnVsblInt sorcGrup@EncoInt srclStrnmLinesSent As Integer srclStrnEndGInt EncoInt declStrnmLinesSent As Integer flagInt shrdInt EndGInt PropGrupnameStrnmLinesOKCompStrnVsblInt sorcGrup<EncoInt srclStrnmLinesOK As Integer srclStrnEndGInt EncoInt declStrnmLinesOK As Integer flagInt shrdInt EndGInt PDefGrup<nameStrnImplicitInstanceEncoInt PValStrnTrueEndGInt PDefGrup0nameStrnMenuBar PValStrn 825569190 EndGInt PDefGrup(nameStrn MacProcID PValInt EndGInt PDefGrup0nameStrnMinimizeButton PValStrnTrueEndGInt PDefGrup4nameStrnMaximizeButton PValStrnFalse EndGInt PDefGrup,nameStrn LiveResize PValStrnTrueEndGInt PDefGrup0nameStrn Resizeable PValStrnFalse EndGInt PDefGrup,nameStrn CloseButton PValStrnTrueEndGInt PDefGrup0nameStrnMenuBarVisible PValStrnTrueEndGInt PDefGrup0nameStrn FullScreen PValStrnFalse EndGInt PDefGrup(nameStrnVisible PValStrnTrueEndGInt PDefGrup@nameStrnTitle EncoInt PValStrnAVRBL DownloaderEndGInt PDefGrup$nameStrnBackdropPValStrnEndGInt PDefGrup(nameStrn BackColor PValInt EndGInt PDefGrup0nameStrn HasBackColorPValStrnFalse EndGInt PDefGrup0nameStrn Composite PValStrnFalse EndGInt PDefGrup$nameStrnFrame PValInt EndGInt PDefGrup(nameStrn MaxHeight PValInt }EndGInt PDefGrup$nameStrnMaxWidthPValInt }EndGInt PDefGrup(nameStrn MinHeight PValInt @EndGInt PDefGrup$nameStrnMinWidthPValInt @EndGInt PDefGrup$nameStrnHeight PValInt 6EndGInt PDefGrup$nameStrnWidth PValInt XEndGInt PDefGrup(nameStrn Placement PValInt EndGInt VwBhGrup,VwPrGrupDNameStrnNameVsblInt PrGpStrnID CPifStrnWindow EndGInt VwPrGrupLNameStrn Interfaces VsblInt PrGpStrnID CPifStrnWindow EndGInt VwPrGrupHNameStrnSuper VsblInt PrGpStrnID CPifStrnWindow EndGInt VwPrGrup0NameStrn Placement VsblInt PrGpStrnPositionPValStrn0 typeStrnInteger vbETStrnEnumCPifStrnWindow EnumGrupdefnStrn 0 - Default defnStrn1 - Parent Window defnStrn2 - Main Screen defnStrn3 - Parent Window ScreendefnStrn 4 - Stagger EndGInt EndGInt VwPrGruppNameStrnWidth VsblInt PrGpStrnPositionPValStrn600 typeStrnInteger CPifStrnWindow EndGInt VwPrGruppNameStrnHeight VsblInt PrGpStrnPositionPValStrn400 typeStrnInteger CPifStrnWindow EndGInt VwPrGruppNameStrnMinWidthVsblInt PrGpStrnPositionPValStrn64 typeStrnInteger CPifStrnWindow EndGInt VwPrGruptNameStrn MinHeight VsblInt PrGpStrnPositionPValStrn64 typeStrnInteger CPifStrnWindow EndGInt VwPrGruptNameStrnMaxWidthVsblInt PrGpStrnPositionPValStrn32000 typeStrnInteger CPifStrnWindow EndGInt VwPrGrupxNameStrn MaxHeight VsblInt PrGpStrnPositionPValStrn32000 typeStrnInteger CPifStrnWindow EndGInt VwPrGrup NameStrnFrame VsblInt PrGpStrn Appearance PValStrn0 typeStrnInteger vbETStrnEnumCPifStrnWindow EnumGruppdefnStrn 0 - DocumentdefnStrn1 - Movable Modal defnStrn2 - Modal DialogdefnStrn3 - Floating Window defnStrn 4 - Plain Box defnStrn5 - Shadowed BoxdefnStrn6 - Rounded Window defnStrn7 - Global Floating Window defnStrn8 - Sheet WindowdefnStrn9 - Metal WindowdefnStrn10 - Drawer Window defnStrn11 - Modeless DialogEndGInt EndGInt VwPrGrup|NameStrn Composite VsblInt PrGpStrn Appearance PValStrnFalse typeStrnBoolean CPifStrnWindow EndGInt VwPrGrup|NameStrn HasBackColorVsblInt PrGpStrn Appearance PValStrnFalse typeStrnBoolean CPifStrnWindow EndGInt VwPrGrup|NameStrn BackColor VsblInt PrGpStrn Appearance PValStrn&hFFFFFFtypeStrnColor CPifStrnWindow EndGInt VwPrGrupxNameStrnBackdropVsblInt PrGpStrn Appearance typeStrnPicture vbETStrnPicture CPifStrnWindow EndGInt VwPrGrupxNameStrnTitle VsblInt PrGpStrn Appearance PValStrnUntitledtypeStrnString CPifStrnWindow EndGInt VwPrGruptNameStrnVisible VsblInt PrGpStrn Appearance PValStrnTruetypeStrnBoolean CPifStrnWindow EndGInt VwPrGrup|NameStrn FullScreen VsblInt PrGpStrn Appearance PValStrnFalse typeStrnBoolean CPifStrnWindow EndGInt VwPrGrup|NameStrnMenuBarVisible VsblInt PrGpStrn Appearance PValStrnTruetypeStrnBoolean CPifStrnWindow EndGInt VwPrGrupxNameStrn CloseButton VsblInt PrGpStrn Appearance PValStrnTruetypeStrnBoolean CPifStrnWindow EndGInt VwPrGrup|NameStrn Resizeable VsblInt PrGpStrn Appearance PValStrnFalse typeStrnBoolean CPifStrnWindow EndGInt VwPrGrupxNameStrn LiveResize VsblInt PrGpStrn Appearance PValStrnTruetypeStrnBoolean CPifStrnWindow EndGInt VwPrGrupNameStrnMaximizeButton VsblInt PrGpStrn Appearance PValStrnFalse typeStrnBoolean CPifStrnWindow EndGInt VwPrGrup|NameStrnMinimizeButton VsblInt PrGpStrn Appearance PValStrnTruetypeStrnBoolean CPifStrnWindow EndGInt VwPrGrupxNameStrn MacProcID VsblInt PrGpStrn Appearance PValStrn0 typeStrnInteger CPifStrnWindow EndGInt VwPrGrupxNameStrnMenuBar VsblInt PrGpStrn Appearance typeStrnMenuBar vbETStrnMenuBar CPifStrnWindow EndGInt VwPrGrup|NameStrnImplicitInstanceVsblInt PrGpStrn Appearance PValStrnTruevbETStrnBoolean CPifStrnWindow EndGInt VwPrGrupLNameStrnmXonPrGpStrnBehaviorPValStrn0 typeStrnBoolean EndGInt VwPrGrupTNameStrn mLinesSent PrGpStrnBehaviorPValStrn0 typeStrnInteger EndGInt VwPrGrupPNameStrnmLinesOKPrGpStrnBehaviorPValStrn0 typeStrnInteger EndGInt EndGInt EnumGrupXEncoInt nameStrnState flagInt typeStrnInteger nameStrnState CompStrnVsblInt sorcGrupEncoInt srclStrnIdlesrclStrn Connecting srclStrnAwaitingPrompt srclStrnCantOpensrclStrn SendingKey srclStrnAwaitingVersion srclStrn SendingFile srclStrnDoneSendingFile EndGInt EndGInt CBhvGrup SuprStrnGroupBoxEndGInt  CBhvGrup SuprStrn PopupMenu HInsGrupP nameStrnOpenCompStrnVsblInt sorcGrup  EncoInt srclStrn Sub Open() srclStrn2for i As Integer = 0 to System.SerialPortCount - 1 srclStrn*Dim p As SerialPort = System.SerialPort(i) srclStrnme.AddRow p.NamesrclStrnme.RowTag( i ) = p srclStrnnextsrclStrnsrclStrnEnd Sub EndGInt  EndGInt  HInsGrup  nameStrnChange CompStrnVsblInt sorcGrupEncoInt srclStrn Sub Change()srclStrnif me.ListIndex >= 0 then srclStrn+Port.SerialPort = me.RowTag( me.ListIndex ) srclStrnend if srclStrn EnableButtons srclStrnsrclStrnEnd Sub EndGInt EndGInt  EndGInt  CBhvGrupSuprStrn StaticText EndGInt CBhvGrupSuprStrn PopupMenu HInsGrupnameStrnOpenCompStrnVsblInt sorcGruphEncoInt srclStrn Sub Open() srclStrnme.ListIndex = 14 srclStrnsrclStrnEnd Sub EndGInt EndGInt EndGInt CBhvGrupSuprStrn EditField EndGInt CBhvGrupDSuprStrnSerial HInsGrup nameStrn DataAvailable CompStrnVsblInt sorcGrupEncoInt srclStrnSub DataAvailable() srclStrnDim data As String = me.ReadAll srclStrn)Dim bytes() As String = Split( data, "" ) srclStrnDim hexify As Boolean = false srclStrn'for i As Integer = 0 to UBound( bytes ) srclStrnGif bytes(i) < " " and bytes(i) <> Chr(17) and bytes(i) <> Chr(19) then srclStrn hexify = True srclStrnexit forsrclStrnend if srclStrnnextsrclStrnsrclStrn-data = DefineEncoding( data, Encodings.UTF8 ) srclStrnif hexify then srclStrnPLogWindow.Log LogWindow.kReceived, "Received (hex): " + StringUtils.HexB( data )srclStrnelsesrclStrn)data = ReplaceAll( data, Chr(19), "♁" ) srclStrn)data = ReplaceAll( data, Chr(17), "◉" ) srclStrn6LogWindow.Log LogWindow.kReceived, "Received: " + data srclStrnend if srclStrnsrclStrnfor each b As String in bytes srclStrnHandleRemoteData b srclStrnnextsrclStrnsrclStrnEnd Sub EndGInt EndGInt HInsGrupnameStrnError CompStrnVsblInt sorcGrupEncoInt srclStrn Sub Error() srclStrnQLogWindow.Log LogWindow.kComment, "Serial port error: " + Str( me.LastErrorCode ) srclStrnsrclStrnEnd Sub EndGInt EndGInt EndGInt CBhvGrupSuprStrnGroupBoxEndGInt CBhvGrupSuprStrn EditField EndGInt CBhvGrup<SuprStrn PushButton HInsGrupnameStrnAction CompStrnVsblInt sorcGrupEncoInt srclStrn Sub Action()srclStrnDim dlog As New OpenDialog srclStrn&dlog.PromptText = "Select a .hex file" srclStrn dlog.Filter = FileTypes1.HexFilesrclStrnsrclStrn2Dim f As FolderItem = dlog.ShowModalWithin( self ) srclStrnif f is nil then return srclStrnsrclStrn mHexFile = fsrclStrnFileFld.Text = f.ShellPath srclStrnsrclStrn EnableButtons srclStrnsrclStrnsrclStrnEnd Sub EndGInt EndGInt EndGInt CBhvGrupSuprStrn PushButton HInsGrupnameStrnAction CompStrnVsblInt sorcGrup EncoInt srclStrn Sub Action()srclStrn6if mState = State.Idle or mState = State.CantOpen then srclStrn&mInputStream = mHexFile.OpenAsTextFile srclStrnif mInputStream is nil then srclStrn'StatusTxt.Text = "Unable to open file." srclStrnreturn srclStrnend if srclStrnLogWindow.LogFld.Text = "" srclStrnSetState State.Connecting srclStrnelsesrclStrnBeepsrclStrnend if srclStrnsrclStrnEnd Sub EndGInt  EndGInt HInsGrup!nameStrnOpenCompStrnVsblInt sorcGrupt"EncoInt srclStrn Sub Open() srclStrnLogWindow.Left = Left + Width srclStrnsrclStrnEnd Sub EndGInt "EndGInt !EndGInt CBhvGrup#SuprStrn StaticText EndGInt #CBhvGrup$SuprStrn ProgressBar EndGInt $CBhvGrup%SuprStrn StaticText EndGInt %CBhvGrup&SuprStrnTimer HInsGrup'nameStrnAction CompStrnVsblInt sorcGrup(EncoInt srclStrn Sub Action()srclStrnMif mInputStream is nil or not mXon or mState <> State.SendingFile then return srclStrnsrclStrn.static EOL As String = ChrB(&h0D) + ChrB(&h0A) srclStrnsrclStrnconst linesPerSend = 1 srclStrnsrclStrnDim lines() As String srclStrn$for i As Integer = 1 to linesPerSendsrclStrn"lines.Append mInputStream.ReadLine srclStrn!if mInputStream.EOF then exit for srclStrnnextsrclStrn'Dim data As String = Join( lines, EOL ) srclStrnsrclStrn#LogWindow.Log LogWindow.kSent, data srclStrnPort.Write data + EOL srclStrn-mLinesSent = mLinesSent + UBound( lines ) + 1 srclStrnsrclStrn#Prog.Value = mInputStream.PositionB srclStrnsrclStrn7if mInputStream.EOF and mState = State.SendingFile then srclStrnSetState State.DoneSendingFile srclStrnend if srclStrnsrclStrnEnd Sub EndGInt (EndGInt 'EndGInt &CtrlGrup)cclsStrnGroupBoxnameStrnGroupBoxPDefGrup8*nameStrn InitialParent EncoInt PValStrnEndGInt *PDefGrup(+nameStrn Underline PValStrnEndGInt +PDefGrup$,nameStrnItalic PValStrnEndGInt ,PDefGrup -nameStrnBoldPValStrnEndGInt -PDefGrup$.nameStrnTextSizePValInt EndGInt .PDefGrup8/nameStrnTextFontEncoInt PValStrnSystem EndGInt /PDefGrup00nameStrnAutoDeactivate PValStrnTrueEndGInt 0PDefGrup01nameStrnHelpTag EncoInt PValStrnEndGInt 1PDefGrup(2nameStrnVisible PValStrnTrueEndGInt 2PDefGrup(3nameStrnEnabled PValStrnTrueEndGInt 3PDefGrup<4nameStrnCaption EncoInt PValStrn Configure EndGInt 4PDefGrup$5nameStrnTabIndexPValInt EndGInt 5PDefGrup,6nameStrn TabPanelIndex PValInt EndGInt 6PDefGrup(7nameStrn LockBottom PValStrnEndGInt 7PDefGrup(8nameStrn LockRight PValStrnEndGInt 8PDefGrup$9nameStrnLockTop PValStrnEndGInt 9PDefGrup$:nameStrnLockLeftPValStrnEndGInt :PDefGrup$;nameStrnHeight PValInt cEndGInt ;PDefGrup$nameStrnLeftPValInt EndGInt >PDefGrup(?nameStrnScope PValStrn0 EndGInt ?PDefGrup8@nameStrnSuper EncoInt PValStrnGroupBoxEndGInt @PDefGrup$AnameStrnIndex PValInt EndGInt APDefGrup8BnameStrnNameEncoInt PValStrn GroupBox1 EndGInt BCBixInt iLckInt EndGInt )CtrlGrupCcclsStrn PopupMenu nameStrn PopupMenu PDefGrupDDnameStrn InitialParent EncoInt PValStrn GroupBox1 EndGInt DPDefGrup4EnameStrn DataField EncoInt PValStrnEndGInt EPDefGrup4FnameStrn DataSource EncoInt PValStrnEndGInt FPDefGrup(GnameStrn Underline PValStrnEndGInt GPDefGrup$HnameStrnItalic PValStrnEndGInt HPDefGrup InameStrnBoldPValStrnEndGInt IPDefGrup$JnameStrnTextSizePValInt EndGInt JPDefGrup8KnameStrnTextFontEncoInt PValStrnSystem EndGInt KPDefGrup0LnameStrnAutoDeactivate PValStrnTrueEndGInt LPDefGrup0MnameStrnHelpTag EncoInt PValStrnEndGInt MPDefGrup(NnameStrnVisible PValStrnTrueEndGInt NPDefGrup(OnameStrn ListIndex PValInt EndGInt OPDefGrup4PnameStrn InitialValueEncoInt PValStrnEndGInt PPDefGrup(QnameStrnEnabled PValStrnTrueEndGInt QPDefGrup(RnameStrnTabStop PValStrnTrueEndGInt RPDefGrup$SnameStrnTabIndexPValInt EndGInt SPDefGrup,TnameStrn TabPanelIndex PValInt EndGInt TPDefGrup(UnameStrn LockBottom PValStrnEndGInt UPDefGrup(VnameStrn LockRight PValStrnEndGInt VPDefGrup$WnameStrnLockTop PValStrnEndGInt WPDefGrup$XnameStrnLockLeftPValStrnEndGInt XPDefGrup$YnameStrnHeight PValInt EndGInt YPDefGrup$ZnameStrnWidth PValInt EndGInt ZPDefGrup [nameStrnTop PValInt )EndGInt [PDefGrup \nameStrnLeftPValInt UEndGInt \PDefGrup(]nameStrnScope PValStrn0 EndGInt ]PDefGrup<^nameStrnSuper EncoInt PValStrn PopupMenu EndGInt ^PDefGrup$_nameStrnIndex PValInt EndGInt _PDefGrup4`nameStrnNameEncoInt PValStrnPortPop EndGInt `CBixInt iLckInt EndGInt CCtrlGrupacclsStrn StaticText nameStrn StaticText PDefGrupDbnameStrn InitialParent EncoInt PValStrn GroupBox1 EndGInt bPDefGrup4cnameStrn DataField EncoInt PValStrnEndGInt cPDefGrup4dnameStrn DataSource EncoInt PValStrnEndGInt dPDefGrup(enameStrn Underline PValStrnEndGInt ePDefGrup$fnameStrnItalic PValStrnEndGInt fPDefGrup gnameStrnBoldPValStrnEndGInt gPDefGrup$hnameStrnTextSizePValInt EndGInt hPDefGrup8inameStrnTextFontEncoInt PValStrnSystem EndGInt iPDefGrup0jnameStrnAutoDeactivate PValStrnTrueEndGInt jPDefGrup0knameStrnHelpTag EncoInt PValStrnEndGInt kPDefGrup(lnameStrnVisible PValStrnTrueEndGInt lPDefGrup(mnameStrnEnabled PValStrnTrueEndGInt mPDefGrup(nnameStrn Multiline PValStrnEndGInt nPDefGrup(onameStrn TextColor PValInt EndGInt oPDefGrup(pnameStrn TextAlign PValInt EndGInt pPDefGrup4qnameStrnTextEncoInt PValStrnPort: EndGInt qPDefGrup$rnameStrnTabIndexPValInt EndGInt rPDefGrup,snameStrn TabPanelIndex PValInt EndGInt sPDefGrup(tnameStrn LockBottom PValStrnEndGInt tPDefGrup(unameStrn LockRight PValStrnEndGInt uPDefGrup$vnameStrnLockTop PValStrnEndGInt vPDefGrup$wnameStrnLockLeftPValStrnEndGInt wPDefGrup$xnameStrnHeight PValInt EndGInt xPDefGrup$ynameStrnWidth PValInt %EndGInt yPDefGrup znameStrnTop PValInt *EndGInt zPDefGrup {nameStrnLeftPValInt $EndGInt {PDefGrup(|nameStrnScope PValStrn0 EndGInt |PDefGrup<}nameStrnSuper EncoInt PValStrn StaticText EndGInt }PDefGrup$~nameStrnIndex PValInt EndGInt ~PDefGrup4nameStrnNameEncoInt PValStrnLabel EndGInt CBixInt iLckInt EndGInt aCtrlGrupcclsStrn StaticText nameStrn StaticText PDefGrupDnameStrn InitialParent EncoInt PValStrn GroupBox1 EndGInt PDefGrup4nameStrn DataField EncoInt PValStrnEndGInt PDefGrup4nameStrn DataSource EncoInt PValStrnEndGInt PDefGrup(nameStrn Underline PValStrnEndGInt PDefGrup$nameStrnItalic PValStrnEndGInt PDefGrup nameStrnBoldPValStrnEndGInt PDefGrup$nameStrnTextSizePValInt EndGInt PDefGrup8nameStrnTextFontEncoInt PValStrnSystem EndGInt PDefGrup0nameStrnAutoDeactivate PValStrnTrueEndGInt PDefGrup0nameStrnHelpTag EncoInt PValStrnEndGInt PDefGrup(nameStrnVisible PValStrnTrueEndGInt PDefGrup(nameStrnEnabled PValStrnTrueEndGInt PDefGrup(nameStrn Multiline PValStrnEndGInt PDefGrup(nameStrn TextColor PValInt EndGInt PDefGrup(nameStrn TextAlign PValInt EndGInt PDefGrup4nameStrnTextEncoInt PValStrnBaud: EndGInt PDefGrup$nameStrnTabIndexPValInt EndGInt PDefGrup,nameStrn TabPanelIndex PValInt EndGInt PDefGrup(nameStrn LockBottom PValStrnEndGInt PDefGrup(nameStrn LockRight PValStrnEndGInt PDefGrup$nameStrnLockTop PValStrnEndGInt PDefGrup$nameStrnLockLeftPValStrnEndGInt PDefGrup$nameStrnHeight PValInt EndGInt PDefGrup$nameStrnWidth PValInt %EndGInt PDefGrup nameStrnTop PValInt JEndGInt PDefGrup nameStrnLeftPValInt $EndGInt PDefGrup(nameStrnScope PValStrn0 EndGInt PDefGrup<nameStrnSuper EncoInt PValStrn StaticText EndGInt PDefGrup$nameStrnIndex PValInt EndGInt PDefGrup4nameStrnNameEncoInt PValStrnLabel EndGInt CBixInt iLckInt EndGInt CtrlGrup0cclsStrn PopupMenu nameStrn PopupMenu PDefGrupDnameStrn InitialParent EncoInt PValStrn GroupBox1 EndGInt PDefGrup4nameStrn DataField EncoInt PValStrnEndGInt PDefGrup4nameStrn DataSource EncoInt PValStrnEndGInt PDefGrup(nameStrn Underline PValStrnEndGInt PDefGrup$nameStrnItalic PValStrnEndGInt PDefGrup nameStrnBoldPValStrnEndGInt PDefGrup$nameStrnTextSizePValInt EndGInt PDefGrup8nameStrnTextFontEncoInt PValStrnSystem EndGInt PDefGrup0nameStrnAutoDeactivate PValStrnTrueEndGInt PDefGrup0nameStrnHelpTag EncoInt PValStrnEndGInt PDefGrup(nameStrnVisible PValStrnTrueEndGInt PDefGrup(nameStrn ListIndex PValInt EndGInt PDefGrupnameStrn InitialValueEncoInt PValStrnV300 600 1200 1800 2400 3600 4800 7200 9600 14400 19200 28800 38400 57600 115200 230400 EndGInt PDefGrup(nameStrnEnabled PValStrnTrueEndGInt PDefGrup(nameStrnTabStop PValStrnTrueEndGInt PDefGrup$nameStrnTabIndexPValInt EndGInt PDefGrup,nameStrn TabPanelIndex PValInt EndGInt PDefGrup(nameStrn LockBottom PValStrnEndGInt PDefGrup(nameStrn LockRight PValStrnEndGInt PDefGrup$nameStrnLockTop PValStrnEndGInt PDefGrup$nameStrnLockLeftPValStrnEndGInt PDefGrup$nameStrnHeight PValInt EndGInt PDefGrup$nameStrnWidth PValInt qEndGInt PDefGrup nameStrnTop PValInt IEndGInt PDefGrup nameStrnLeftPValInt UEndGInt PDefGrup(nameStrnScope PValStrn0 EndGInt PDefGrup<nameStrnSuper EncoInt PValStrn PopupMenu EndGInt PDefGrup$nameStrnIndex PValInt EndGInt PDefGrup4nameStrnNameEncoInt PValStrnBaudPop EndGInt CBixInt iLckInt EndGInt CtrlGrup cclsStrn StaticText nameStrn StaticText PDefGrupDnameStrn InitialParent EncoInt PValStrn GroupBox1 EndGInt PDefGrup4nameStrn DataField EncoInt PValStrnEndGInt PDefGrup4nameStrn DataSource EncoInt PValStrnEndGInt PDefGrup(nameStrn Underline PValStrnEndGInt PDefGrup$nameStrnItalic PValStrnEndGInt PDefGrup nameStrnBoldPValStrnEndGInt PDefGrup$nameStrnTextSizePValInt EndGInt PDefGrup8nameStrnTextFontEncoInt PValStrnSystem EndGInt PDefGrup0nameStrnAutoDeactivate PValStrnTrueEndGInt PDefGrup0nameStrnHelpTag EncoInt PValStrnEndGInt PDefGrup(nameStrnVisible PValStrnTrueEndGInt PDefGrup(nameStrnEnabled PValStrnTrueEndGInt PDefGrup(nameStrn Multiline PValStrnEndGInt PDefGrup(nameStrn TextColor PValInt EndGInt PDefGrup(nameStrn TextAlign PValInt EndGInt PDefGrup<nameStrnTextEncoInt PValStrnEntry Key (Hex):EndGInt PDefGrup$nameStrnTabIndexPValInt EndGInt PDefGrup,nameStrn TabPanelIndex PValInt EndGInt PDefGrup(nameStrn LockBottom PValStrnEndGInt PDefGrup(nameStrn LockRight PValStrnEndGInt PDefGrup$nameStrnLockTop PValStrnEndGInt PDefGrup$nameStrnLockLeftPValStrnEndGInt PDefGrup$nameStrnHeight PValInt EndGInt PDefGrup$nameStrnWidth PValInt iEndGInt PDefGrup nameStrnTop PValInt *EndGInt PDefGrup nameStrnLeftPValInt aEndGInt PDefGrup(nameStrnScope PValStrn0 EndGInt PDefGrup<nameStrnSuper EncoInt PValStrn StaticText EndGInt PDefGrup$nameStrnIndex PValInt EndGInt PDefGrup4nameStrnNameEncoInt PValStrnLabel EndGInt CBixInt iLckInt EndGInt CtrlGrup pcclsStrn EditField nameStrn EditField PDefGrupDnameStrn InitialParent EncoInt PValStrn GroupBox1 EndGInt PDefGrup4nameStrn DataField EncoInt PValStrnEndGInt PDefGrup4nameStrn DataSource EncoInt PValStrnEndGInt PDefGrup(nameStrn Alignment PValInt EndGInt PDefGrup(nameStrn AcceptTabs PValStrnEndGInt PDefGrup(nameStrn LimitText PValInt EndGInt PDefGrup$nameStrnReadOnlyPValStrnEndGInt PDefGrup,nameStrnMaskEncoInt PValStrnEndGInt PDefGrup4nameStrnTextEncoInt PValStrn40 26 24EndGInt PDefGrup(nameStrn Underline PValStrnEndGInt PDefGrup$nameStrnItalic PValStrnEndGInt PDefGrup nameStrnBoldPValStrnEndGInt PDefGrup$nameStrnTextSizePValInt EndGInt PDefGrup8nameStrnTextFontEncoInt PValStrnSystem EndGInt PDefGrup0nameStrnAutoDeactivate PValStrnTrueEndGInt PDefGrup0nameStrnHelpTag EncoInt PValStrnEndGInt PDefGrup(nameStrnVisible PValStrnTrueEndGInt PDefGrup0nameStrnFormat EncoInt PValStrnEndGInt PDefGrup(nameStrnEnabled PValStrnTrueEndGInt PDefGrup(nameStrn BackColor PValInt EndGInt PDefGrup(nameStrn TextColor PValInt EndGInt PDefGrup,nameStrn UseFocusRingPValStrnTrueEndGInt PDefGrup$nameStrnPasswordPValStrnEndGInt PDefGrup$nameStrnStyled PValStrnEndGInt PDefGrup4nameStrnScrollbarVertical PValStrnTrueEndGInt PDefGrup0nameStrnScrollbarHorizontal PValStrnEndGInt PDefGrup(nameStrn Multiline PValStrnEndGInt PDefGrup(nameStrnBorder PValStrnTrueEndGInt PDefGrup(nameStrnTabStop PValStrnTrueEndGInt PDefGrup$nameStrnTabIndexPValInt EndGInt PDefGrup,nameStrn TabPanelIndex PValInt EndGInt PDefGrup(nameStrn LockBottom PValStrnEndGInt PDefGrup(nameStrn LockRight PValStrnEndGInt PDefGrup$nameStrnLockTop PValStrnEndGInt PDefGrup$nameStrnLockLeftPValStrnEndGInt PDefGrup$nameStrnHeight PValInt EndGInt PDefGrup$nameStrnWidth PValInt _EndGInt PDefGrup nameStrnTop PValInt (EndGInt PDefGrup nameStrnLeftPValInt EndGInt PDefGrup(nameStrnScope PValStrn0 EndGInt PDefGrup<nameStrnSuper EncoInt PValStrn EditField EndGInt PDefGrup$nameStrnIndex PValInt EndGInt PDefGrup4nameStrnNameEncoInt PValStrnKeyFld EndGInt CBixInt iLckInt EndGInt CtrlGrup@cclsStrnSerial nameStrnSerial PDefGrup$ nameStrnWidth PValInt EndGInt  PDefGrup$ nameStrnHeight PValInt EndGInt  PDefGrup< nameStrn TabPanelIndex EncoInt PValStrn0 EndGInt  PDefGrup  nameStrnDTR PValStrnEndGInt  PDefGrup  nameStrnCTS PValStrnEndGInt  PDefGrup nameStrnXON PValStrnEndGInt PDefGrup nameStrnStopPValInt EndGInt PDefGrup$nameStrnParity PValInt EndGInt PDefGrup nameStrnBitsPValInt EndGInt PDefGrup nameStrnBaudPValInt EndGInt PDefGrup0nameStrnTop EncoInt PValStrn19 EndGInt PDefGrup0nameStrnLeftEncoInt PValStrn-46 EndGInt PDefGrup(nameStrnScope PValStrn0 EndGInt PDefGrup8nameStrnSuper EncoInt PValStrnSerial EndGInt PDefGrup$nameStrnIndex PValInt EndGInt PDefGrup0nameStrnNameEncoInt PValStrnPortEndGInt CBixInt iLckInt EndGInt CtrlGrupcclsStrnGroupBoxnameStrnGroupBoxPDefGrup8nameStrn InitialParent EncoInt PValStrnEndGInt PDefGrup(nameStrn Underline PValStrnEndGInt PDefGrup$nameStrnItalic PValStrnEndGInt PDefGrup nameStrnBoldPValStrnEndGInt PDefGrup$nameStrnTextSizePValInt EndGInt PDefGrup8nameStrnTextFontEncoInt PValStrnSystem EndGInt PDefGrup0 nameStrnAutoDeactivate PValStrnTrueEndGInt  PDefGrup0!nameStrnHelpTag EncoInt PValStrnEndGInt !PDefGrup("nameStrnVisible PValStrnTrueEndGInt "PDefGrup(#nameStrnEnabled PValStrnTrueEndGInt #PDefGrup8$nameStrnCaption EncoInt PValStrnDownloadEndGInt $PDefGrup$%nameStrnTabIndexPValInt EndGInt %PDefGrup,&nameStrn TabPanelIndex PValInt EndGInt &PDefGrup('nameStrn LockBottom PValStrnEndGInt 'PDefGrup((nameStrn LockRight PValStrnEndGInt (PDefGrup$)nameStrnLockTop PValStrnEndGInt )PDefGrup$*nameStrnLockLeftPValStrnEndGInt *PDefGrup$+nameStrnHeight PValInt EndGInt +PDefGrup$,nameStrnWidth PValInt 0EndGInt ,PDefGrup -nameStrnTop PValInt yEndGInt -PDefGrup .nameStrnLeftPValInt EndGInt .PDefGrup(/nameStrnScope PValStrn0 EndGInt /PDefGrup80nameStrnSuper EncoInt PValStrnGroupBoxEndGInt 0PDefGrup$1nameStrnIndex PValInt EndGInt 1PDefGrup82nameStrnNameEncoInt PValStrn GroupBox2 EndGInt 2CBixInt iLckInt EndGInt CtrlGrup3cclsStrn StaticText nameStrn StaticText PDefGrupD4nameStrn InitialParent EncoInt PValStrn GroupBox2 EndGInt 4PDefGrup45nameStrn DataField EncoInt PValStrnEndGInt 5PDefGrup46nameStrn DataSource EncoInt PValStrnEndGInt 6PDefGrup(7nameStrn Underline PValStrnEndGInt 7PDefGrup$8nameStrnItalic PValStrnEndGInt 8PDefGrup 9nameStrnBoldPValStrnEndGInt 9PDefGrup$:nameStrnTextSizePValInt EndGInt :PDefGrup8;nameStrnTextFontEncoInt PValStrnSystem EndGInt ;PDefGrup0nameStrnVisible PValStrnTrueEndGInt >PDefGrup(?nameStrnEnabled PValStrnTrueEndGInt ?PDefGrup(@nameStrn Multiline PValStrnEndGInt @PDefGrup(AnameStrn TextColor PValInt EndGInt APDefGrup(BnameStrn TextAlign PValInt EndGInt BPDefGrup8CnameStrnTextEncoInt PValStrn Hex File: EndGInt CPDefGrup$DnameStrnTabIndexPValInt EndGInt DPDefGrup,EnameStrn TabPanelIndex PValInt EndGInt EPDefGrup(FnameStrn LockBottom PValStrnEndGInt FPDefGrup(GnameStrn LockRight PValStrnEndGInt GPDefGrup$HnameStrnLockTop PValStrnEndGInt HPDefGrup$InameStrnLockLeftPValStrnEndGInt IPDefGrup$JnameStrnHeight PValInt EndGInt JPDefGrup$KnameStrnWidth PValInt :EndGInt KPDefGrup LnameStrnTop PValInt EndGInt LPDefGrup MnameStrnLeftPValInt $EndGInt MPDefGrup(NnameStrnScope PValStrn0 EndGInt NPDefGrup<OnameStrnSuper EncoInt PValStrn StaticText EndGInt OPDefGrup$PnameStrnIndex PValInt EndGInt PPDefGrup4QnameStrnNameEncoInt PValStrnLabel EndGInt QCBixInt iLckInt EndGInt 3CtrlGrup tRcclsStrn EditField nameStrn EditField PDefGrupDSnameStrn InitialParent EncoInt PValStrn GroupBox2 EndGInt SPDefGrup4TnameStrn DataField EncoInt PValStrnEndGInt TPDefGrup4UnameStrn DataSource EncoInt PValStrnEndGInt UPDefGrup(VnameStrn Alignment PValInt EndGInt VPDefGrup(WnameStrn AcceptTabs PValStrnEndGInt WPDefGrup(XnameStrn LimitText PValInt EndGInt XPDefGrup$YnameStrnReadOnlyPValStrnEndGInt YPDefGrup,ZnameStrnMaskEncoInt PValStrnEndGInt ZPDefGrup,[nameStrnTextEncoInt PValStrnEndGInt [PDefGrup(\nameStrn Underline PValStrnEndGInt \PDefGrup$]nameStrnItalic PValStrnEndGInt ]PDefGrup ^nameStrnBoldPValStrnEndGInt ^PDefGrup$_nameStrnTextSizePValInt EndGInt _PDefGrup<`nameStrnTextFontEncoInt PValStrn SmallSystem EndGInt `PDefGrup0anameStrnAutoDeactivate PValStrnTrueEndGInt aPDefGrup0bnameStrnHelpTag EncoInt PValStrnEndGInt bPDefGrup(cnameStrnVisible PValStrnTrueEndGInt cPDefGrup0dnameStrnFormat EncoInt PValStrnEndGInt dPDefGrup(enameStrnEnabled PValStrnTrueEndGInt ePDefGrup(fnameStrn BackColor PValInt EndGInt fPDefGrup(gnameStrn TextColor PValInt EndGInt gPDefGrup,hnameStrn UseFocusRingPValStrnTrueEndGInt hPDefGrup$inameStrnPasswordPValStrnEndGInt iPDefGrup$jnameStrnStyled PValStrnEndGInt jPDefGrup8knameStrnScrollbarVertical PValStrnFalse EndGInt kPDefGrup0lnameStrnScrollbarHorizontal PValStrnEndGInt lPDefGrup,mnameStrn Multiline PValStrnTrueEndGInt mPDefGrup(nnameStrnBorder PValStrnTrueEndGInt nPDefGrup(onameStrnTabStop PValStrnTrueEndGInt oPDefGrup$pnameStrnTabIndexPValInt EndGInt pPDefGrup,qnameStrn TabPanelIndex PValInt EndGInt qPDefGrup(rnameStrn LockBottom PValStrnEndGInt rPDefGrup(snameStrn LockRight PValStrnEndGInt sPDefGrup$tnameStrnLockTop PValStrnEndGInt tPDefGrup$unameStrnLockLeftPValStrnEndGInt uPDefGrup$vnameStrnHeight PValInt $EndGInt vPDefGrup$wnameStrnWidth PValInt qEndGInt wPDefGrup xnameStrnTop PValInt EndGInt xPDefGrup ynameStrnLeftPValInt jEndGInt yPDefGrup(znameStrnScope PValStrn0 EndGInt zPDefGrup<{nameStrnSuper EncoInt PValStrn EditField EndGInt {PDefGrup$|nameStrnIndex PValInt EndGInt |PDefGrup4}nameStrnNameEncoInt PValStrnFileFld EndGInt }CBixInt iLckInt EndGInt RCtrlGrup~cclsStrn PushButton nameStrn PushButton PDefGrupDnameStrn InitialParent EncoInt PValStrn GroupBox2 EndGInt PDefGrup(nameStrn Underline PValStrnEndGInt PDefGrup$nameStrnItalic PValStrnEndGInt PDefGrup nameStrnBoldPValStrnEndGInt PDefGrup$nameStrnTextSizePValInt EndGInt PDefGrup8nameStrnTextFontEncoInt PValStrnSystem EndGInt PDefGrup0nameStrnAutoDeactivate PValStrnTrueEndGInt PDefGrup0nameStrnHelpTag EncoInt PValStrnEndGInt PDefGrup(nameStrnVisible PValStrnTrueEndGInt PDefGrup(nameStrnEnabled PValStrnTrueEndGInt PDefGrup$nameStrnCancel PValStrnEndGInt PDefGrup$nameStrnDefault PValStrnEndGInt PDefGrup8nameStrnCaption EncoInt PValStrnSelect EndGInt PDefGrup(nameStrnTabStop PValStrnTrueEndGInt PDefGrup$nameStrnTabIndexPValInt EndGInt PDefGrup,nameStrn TabPanelIndex PValInt EndGInt PDefGrup(nameStrn LockBottom PValStrnEndGInt PDefGrup(nameStrn LockRight PValStrnEndGInt PDefGrup$nameStrnLockTop PValStrnEndGInt PDefGrup$nameStrnLockLeftPValStrnEndGInt PDefGrup$nameStrnHeight PValInt EndGInt PDefGrup$nameStrnWidth PValInt PEndGInt PDefGrup nameStrnTop PValInt EndGInt PDefGrup nameStrnLeftPValInt EndGInt PDefGrup(nameStrnScope PValStrn0 EndGInt PDefGrup<nameStrnSuper EncoInt PValStrn PushButton EndGInt PDefGrup$nameStrnIndex PValInt EndGInt PDefGrup8nameStrnNameEncoInt PValStrn SelectButn EndGInt CBixInt iLckInt EndGInt ~CtrlGrupcclsStrn PushButton nameStrn PushButton PDefGrupDnameStrn InitialParent EncoInt PValStrn GroupBox2 EndGInt PDefGrup(nameStrn Underline PValStrnEndGInt PDefGrup$nameStrnItalic PValStrnEndGInt PDefGrup nameStrnBoldPValStrnEndGInt PDefGrup$nameStrnTextSizePValInt EndGInt PDefGrup8nameStrnTextFontEncoInt PValStrnSystem EndGInt PDefGrup0nameStrnAutoDeactivate PValStrnTrueEndGInt PDefGrup0nameStrnHelpTag EncoInt PValStrnEndGInt PDefGrup(nameStrnVisible PValStrnTrueEndGInt PDefGrup,nameStrnEnabled PValStrnFalse EndGInt PDefGrup$nameStrnCancel PValStrnEndGInt PDefGrup(nameStrnDefault PValStrnTrueEndGInt PDefGrup8nameStrnCaption EncoInt PValStrnDownloadEndGInt PDefGrup(nameStrnTabStop PValStrnTrueEndGInt PDefGrup$nameStrnTabIndexPValInt EndGInt PDefGrup,nameStrn TabPanelIndex PValInt EndGInt PDefGrup(nameStrn LockBottom PValStrnEndGInt PDefGrup(nameStrn LockRight PValStrnEndGInt PDefGrup$nameStrnLockTop PValStrnEndGInt PDefGrup$nameStrnLockLeftPValStrnEndGInt PDefGrup$nameStrnHeight PValInt EndGInt PDefGrup$nameStrnWidth PValInt dEndGInt PDefGrup nameStrnTop PValInt EndGInt PDefGrup nameStrnLeftPValInt EndGInt PDefGrup(nameStrnScope PValStrn0 EndGInt PDefGrup<nameStrnSuper EncoInt PValStrn PushButton EndGInt PDefGrup$nameStrnIndex PValInt EndGInt PDefGrup<nameStrnNameEncoInt PValStrn StartStopButn EndGInt CBixInt iLckInt EndGInt CtrlGrupcclsStrn StaticText nameStrn StaticText PDefGrupDnameStrn InitialParent EncoInt PValStrn GroupBox2 EndGInt PDefGrup4nameStrn DataField EncoInt PValStrnEndGInt PDefGrup4nameStrn DataSource EncoInt PValStrnEndGInt PDefGrup(nameStrn Underline PValStrnEndGInt PDefGrup$nameStrnItalic PValStrnEndGInt PDefGrup nameStrnBoldPValStrnEndGInt PDefGrup$nameStrnTextSizePValInt EndGInt PDefGrup8nameStrnTextFontEncoInt PValStrnSystem EndGInt PDefGrup0nameStrnAutoDeactivate PValStrnTrueEndGInt PDefGrup0nameStrnHelpTag EncoInt PValStrnEndGInt PDefGrup(nameStrnVisible PValStrnTrueEndGInt PDefGrup(nameStrnEnabled PValStrnTrueEndGInt PDefGrup(nameStrn Multiline PValStrnEndGInt PDefGrup(nameStrn TextColor PValInt EndGInt PDefGrup(nameStrn TextAlign PValInt EndGInt PDefGrup4nameStrnTextEncoInt PValStrnStatus: EndGInt PDefGrup$nameStrnTabIndexPValInt EndGInt PDefGrup,nameStrn TabPanelIndex PValInt EndGInt PDefGrup(nameStrn LockBottom PValStrnEndGInt PDefGrup(nameStrn LockRight PValStrnEndGInt PDefGrup$nameStrnLockTop PValStrnEndGInt PDefGrup$nameStrnLockLeftPValStrnEndGInt PDefGrup$nameStrnHeight PValInt EndGInt PDefGrup$nameStrnWidth PValInt :EndGInt PDefGrup nameStrnTop PValInt EndGInt PDefGrup nameStrnLeftPValInt $EndGInt PDefGrup(nameStrnScope PValStrn0 EndGInt PDefGrup<nameStrnSuper EncoInt PValStrn StaticText EndGInt PDefGrup$nameStrnIndex PValInt EndGInt PDefGrup4nameStrnNameEncoInt PValStrnLabel EndGInt CBixInt iLckInt EndGInt CtrlGrupcclsStrn StaticText nameStrn StaticText PDefGrupDnameStrn InitialParent EncoInt PValStrn GroupBox2 EndGInt PDefGrup4nameStrn DataField EncoInt PValStrnEndGInt PDefGrup4nameStrn DataSource EncoInt PValStrnEndGInt PDefGrup(nameStrn Underline PValStrnEndGInt PDefGrup$nameStrnItalic PValStrnEndGInt PDefGrup nameStrnBoldPValStrnEndGInt PDefGrup$nameStrnTextSizePValInt EndGInt PDefGrup8nameStrnTextFontEncoInt PValStrnSystem EndGInt PDefGrup0nameStrnAutoDeactivate PValStrnTrueEndGInt PDefGrup0nameStrnHelpTag EncoInt PValStrnEndGInt PDefGrup(nameStrnVisible PValStrnTrueEndGInt PDefGrup(nameStrnEnabled PValStrnTrueEndGInt PDefGrup(nameStrn Multiline PValStrnEndGInt PDefGrup(nameStrn TextColor PValInt EndGInt PDefGrup(nameStrn TextAlign PValInt EndGInt PDefGrup0nameStrnTextEncoInt PValStrnIdleEndGInt PDefGrup$nameStrnTabIndexPValInt EndGInt PDefGrup,nameStrn TabPanelIndex PValInt EndGInt PDefGrup(nameStrn LockBottom PValStrnEndGInt PDefGrup(nameStrn LockRight PValStrnEndGInt PDefGrup$nameStrnLockTop PValStrnEndGInt PDefGrup$nameStrnLockLeftPValStrnEndGInt PDefGrup$nameStrnHeight PValInt EndGInt PDefGrup$nameStrnWidth PValInt EndGInt PDefGrup nameStrnTop PValInt EndGInt PDefGrup nameStrnLeftPValInt jEndGInt PDefGrup(nameStrnScope PValStrn0 EndGInt PDefGrup<nameStrnSuper EncoInt PValStrn StaticText EndGInt PDefGrup$nameStrnIndex PValInt EndGInt PDefGrup8nameStrnNameEncoInt PValStrn StatusTxt EndGInt CBixInt iLckInt EndGInt CtrlGruppcclsStrn ProgressBar nameStrn ProgressBar PDefGrupDnameStrn InitialParent EncoInt PValStrn GroupBox2 EndGInt PDefGrup$nameStrnMaximum PValInt dEndGInt PDefGrup$nameStrnValue PValInt EndGInt PDefGrup(nameStrnEnabled PValStrnTrueEndGInt PDefGrup0nameStrnAutoDeactivate PValStrnTrueEndGInt PDefGrup0nameStrnHelpTag EncoInt PValStrnEndGInt PDefGrup,nameStrnVisible PValStrnFalse EndGInt PDefGrup,nameStrn TabPanelIndex PValInt EndGInt PDefGrup(nameStrn LockBottom PValStrnEndGInt PDefGrup(nameStrn LockRight PValStrnEndGInt PDefGrup$nameStrnLockTop PValStrnEndGInt PDefGrup$nameStrnLockLeftPValStrnEndGInt PDefGrup$nameStrnHeight PValInt EndGInt PDefGrup$nameStrnWidth PValInt EndGInt PDefGrup nameStrnTop PValInt EndGInt PDefGrup nameStrnLeftPValInt jEndGInt PDefGrup(nameStrnScope PValStrn0 EndGInt PDefGrup<nameStrnSuper EncoInt PValStrn ProgressBar EndGInt PDefGrup$ nameStrnIndex PValInt EndGInt  PDefGrup0 nameStrnNameEncoInt PValStrnProgEndGInt  CBixInt iLckInt EndGInt CtrlGrup cclsStrn StaticText nameStrn StaticText PDefGrupD nameStrn InitialParent EncoInt PValStrn GroupBox2 EndGInt  PDefGrup4 nameStrn DataField EncoInt PValStrnEndGInt  PDefGrup4nameStrn DataSource EncoInt PValStrnEndGInt PDefGrup(nameStrn Underline PValStrnEndGInt PDefGrup$nameStrnItalic PValStrnEndGInt PDefGrup nameStrnBoldPValStrnEndGInt PDefGrup$nameStrnTextSizePValInt EndGInt PDefGrup8nameStrnTextFontEncoInt PValStrnMonaco EndGInt PDefGrup0nameStrnAutoDeactivate PValStrnTrueEndGInt PDefGrup0nameStrnHelpTag EncoInt PValStrnEndGInt PDefGrup,nameStrnVisible PValStrnFalse EndGInt PDefGrup(nameStrnEnabled PValStrnTrueEndGInt PDefGrup(nameStrn Multiline PValStrnEndGInt PDefGrup(nameStrn TextColor PValInt EndGInt PDefGrup(nameStrn TextAlign PValInt EndGInt PDefGrup0nameStrnTextEncoInt PValStrnXON EndGInt PDefGrup$nameStrnTabIndexPValInt EndGInt PDefGrup,nameStrn TabPanelIndex PValInt EndGInt PDefGrup(nameStrn LockBottom PValStrnEndGInt PDefGrup(nameStrn LockRight PValStrnEndGInt PDefGrup$ nameStrnLockTop PValStrnEndGInt  PDefGrup$!nameStrnLockLeftPValStrnEndGInt !PDefGrup$"nameStrnHeight PValInt EndGInt "PDefGrup$#nameStrnWidth PValInt EndGInt #PDefGrup $nameStrnTop PValInt EndGInt $PDefGrup %nameStrnLeftPValInt EndGInt %PDefGrup(&nameStrnScope PValStrn0 EndGInt &PDefGrup<'nameStrnSuper EncoInt PValStrn StaticText EndGInt 'PDefGrup$(nameStrnIndex PValInt EndGInt (PDefGrup4)nameStrnNameEncoInt PValStrnOnOffTxtEndGInt )CBixInt iLckInt EndGInt  CtrlGrup0*cclsStrnTimer nameStrnTimer PDefGrup$+nameStrnWidth PValInt EndGInt +PDefGrup$,nameStrnHeight PValInt EndGInt ,PDefGrup<-nameStrn TabPanelIndex EncoInt PValStrn0 EndGInt -PDefGrup$.nameStrnPeriod PValInt EndGInt .PDefGrup /nameStrnModePValInt EndGInt /PDefGrup00nameStrnTop EncoInt PValStrn239 EndGInt 0PDefGrup01nameStrnLeftEncoInt PValStrn-43 EndGInt 1PDefGrup(2nameStrnScope PValStrn0 EndGInt 2PDefGrup83nameStrnSuper EncoInt PValStrnTimer EndGInt 3PDefGrup$4nameStrnIndex PValInt EndGInt 4PDefGrup85nameStrnNameEncoInt PValStrn SendTimer EndGInt 5CBixInt iLckInt EndGInt *PadnPadn****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************BlokpMnu15/ NameStrnMenuBar1ContInt paswStrnMItmGrup6spmuInt nameStrnFileMenutextStrn&File indxInt scutStrnmaEnInt EncoInt flagInt SuprStrnMenuItemMItmGrup7spmuInt nameStrnFileDownloadWindow textStrnDownload Window indxInt scutStrnCmd+D MiSKStrnD MiMkInt maEnInt EncoInt flagInt SuprStrnMenuItemEndGInt 7MItmGrup8spmuInt nameStrn FileLogWindow textStrn Log Window indxInt scutStrnCmd+L MiSKStrnL MiMkInt maEnInt EncoInt flagInt SuprStrnMenuItemEndGInt 8MItmGrup9spmuInt nameStrnUntitledSeparator textStrn- indxInt scutStrnmaEnInt EncoInt flagInt SuprStrnMenuItemEndGInt 9MItmGrup:spmuInt nameStrnFileQuittextStrn#App.kFileQuit indxInt scutStrn#App.kFileQuitShortcut MiSKStrn#App.kFileQuitShortcut maEnInt EncoInt flagInt SuprStrn QuitMenuItemEndGInt :EndGInt 6MItmGrup\;spmuInt nameStrnEditMenutextStrn&Edit indxInt scutStrnmaEnInt EncoInt flagInt SuprStrnMenuItemMItmGrupspmuInt nameStrnEditCut textStrnCu&tindxInt scutStrnCmd+X MiSKStrnX MiMkInt maEnInt EncoInt flagInt SuprStrnMenuItemEndGInt >MItmGrup?spmuInt nameStrnEditCopytextStrn&Copy indxInt scutStrnCmd+C MiSKStrnC MiMkInt maEnInt EncoInt flagInt SuprStrnMenuItemEndGInt ?MItmGrup@spmuInt nameStrn EditPaste textStrn&Paste indxInt scutStrnCmd+V MiSKStrnV MiMkInt maEnInt EncoInt flagInt SuprStrnMenuItemEndGInt @MItmGrupAspmuInt nameStrn EditClear textStrn#App.kEditClear indxInt scutStrnmaEnInt EncoInt flagInt SuprStrnMenuItemEndGInt AMItmGrupBspmuInt nameStrn UntitledMenu0 textStrn- indxInt scutStrnmaEnInt EncoInt flagInt SuprStrnMenuItemEndGInt BMItmGrupCspmuInt nameStrn EditSelectAll textStrn Select &All indxInt scutStrnCmd+A MiSKStrnA MiMkInt maEnInt EncoInt flagInt SuprStrnMenuItemEndGInt CEndGInt ;MItmGrupDDspmuInt nameStrnHelpMenutextStrnHelpindxInt scutStrnmaEnInt EncoInt flagInt SuprStrnMenuItemMItmGrupEspmuInt nameStrn HelpAbout textStrnAbout AVRBL Downloader... indxInt scutStrnmaEnInt EncoInt flagInt SuprStrn AppleMenuItem EndGInt EEndGInt DPadnPadnBlokpFTy˖-NameStrn FileTypes1 ContInt paswStrnfTypGruphFnameStrnHex FileMacCStrnR*chtypeStrnTEXTdefnStrn.hexflagInt NameStrnHexFile EndGInt FPadnPadn$************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************BlokpVew+0NameStrn LogWindow ContInt paswStrnbClsInt SuprStrnWindow flagInt bNtrInt CompStrnMethGrup$GnameStrnLog CompStrnVsblInt sorcGrupxHEncoInt srclStrn0 Shared Sub Log(type As Integer, data As String)srclStrnDim c As Color srclStrnselect case typesrclStrn case kSent srclStrn c = &c888888srclStrn case kComment srclStrn c = &c000088srclStrnelsesrclStrn c = &c440000srclStrn end select srclStrnsrclStrnLogWindow.Print c, data srclStrnsrclStrnEnd Sub EndGInt HEncoInt AlasStrnflagInt shrdInt parmStrntype As Integer, data As String rsltStrnEndGInt GMethGrupInameStrnPrint CompStrnVsblInt sorcGrup8JEncoInt srclStrn"Sub Print(c As Color, s As String) srclStrnif mSelChanged then srclStrnLogFld.SelStart = &h7FFFFFFFsrclStrnend if srclStrnsrclStrnLogFld.SelTextColor = c srclStrnLogFld.AppendText s + EndOfLine srclStrnmSelChanged = false srclStrnsrclStrnEnd Sub EndGInt JEncoInt AlasStrnflagInt shrdInt parmStrnc As Color, s As String rsltStrnEndGInt IPropGrupKnameStrn mSelChanged CompStrnVsblInt sorcGrup@LEncoInt srclStrnmSelChanged As Boolean srclStrnEndGInt LEncoInt declStrnmSelChanged As Boolean flagInt shrdInt EndGInt KPDefGrup<MnameStrnImplicitInstanceEncoInt PValStrnTrueEndGInt MPDefGrup$NnameStrnMenuBar PValStrnEndGInt NPDefGrup(OnameStrn MacProcID PValInt EndGInt OPDefGrup0PnameStrnMinimizeButton PValStrnTrueEndGInt PPDefGrup0QnameStrnMaximizeButton PValStrnTrueEndGInt QPDefGrup,RnameStrn LiveResize PValStrnTrueEndGInt RPDefGrup,SnameStrn Resizeable PValStrnTrueEndGInt SPDefGrup,TnameStrn CloseButton PValStrnTrueEndGInt TPDefGrup0UnameStrnMenuBarVisible PValStrnTrueEndGInt UPDefGrup0VnameStrn FullScreen PValStrnFalse EndGInt VPDefGrup,WnameStrnVisible PValStrnFalse EndGInt WPDefGrup@XnameStrnTitle EncoInt PValStrnConnection Log EndGInt XPDefGrup$YnameStrnBackdropPValStrnEndGInt YPDefGrup(ZnameStrn BackColor PValInt EndGInt ZPDefGrup0[nameStrn HasBackColorPValStrnFalse EndGInt [PDefGrup0\nameStrn Composite PValStrnFalse EndGInt \PDefGrup$]nameStrnFrame PValInt EndGInt ]PDefGrup(^nameStrn MaxHeight PValInt }EndGInt ^PDefGrup$_nameStrnMaxWidthPValInt }EndGInt _PDefGrup(`nameStrn MinHeight PValInt @EndGInt `PDefGrup$anameStrnMinWidthPValInt @EndGInt aPDefGrup$bnameStrnHeight PValInt EndGInt bPDefGrup$cnameStrnWidth PValInt XEndGInt cPDefGrup(dnameStrn Placement PValInt EndGInt dVwBhGrupeVwPrGrupDfNameStrnNameVsblInt PrGpStrnID CPifStrnWindow EndGInt fVwPrGrupLgNameStrn Interfaces VsblInt PrGpStrnID CPifStrnWindow EndGInt gVwPrGrupHhNameStrnSuper VsblInt PrGpStrnID CPifStrnWindow EndGInt hVwPrGrup0iNameStrn Placement VsblInt PrGpStrnPositionPValStrn0 typeStrnInteger vbETStrnEnumCPifStrnWindow EnumGrupjdefnStrn 0 - Default defnStrn1 - Parent Window defnStrn2 - Main Screen defnStrn3 - Parent Window ScreendefnStrn 4 - Stagger EndGInt jEndGInt iVwPrGruppkNameStrnWidth VsblInt PrGpStrnPositionPValStrn600 typeStrnInteger CPifStrnWindow EndGInt kVwPrGrupplNameStrnHeight VsblInt PrGpStrnPositionPValStrn400 typeStrnInteger CPifStrnWindow EndGInt lVwPrGruppmNameStrnMinWidthVsblInt PrGpStrnPositionPValStrn64 typeStrnInteger CPifStrnWindow EndGInt mVwPrGruptnNameStrn MinHeight VsblInt PrGpStrnPositionPValStrn64 typeStrnInteger CPifStrnWindow EndGInt nVwPrGruptoNameStrnMaxWidthVsblInt PrGpStrnPositionPValStrn32000 typeStrnInteger CPifStrnWindow EndGInt oVwPrGrupxpNameStrn MaxHeight VsblInt PrGpStrnPositionPValStrn32000 typeStrnInteger CPifStrnWindow EndGInt pVwPrGrup qNameStrnFrame VsblInt PrGpStrn Appearance PValStrn0 typeStrnInteger vbETStrnEnumCPifStrnWindow EnumGrupprdefnStrn 0 - DocumentdefnStrn1 - Movable Modal defnStrn2 - Modal DialogdefnStrn3 - Floating Window defnStrn 4 - Plain Box defnStrn5 - Shadowed BoxdefnStrn6 - Rounded Window defnStrn7 - Global Floating Window defnStrn8 - Sheet WindowdefnStrn9 - Metal WindowdefnStrn10 - Drawer Window defnStrn11 - Modeless DialogEndGInt rEndGInt qVwPrGrup|sNameStrn Composite VsblInt PrGpStrn Appearance PValStrnFalse typeStrnBoolean CPifStrnWindow EndGInt sVwPrGrup|tNameStrn HasBackColorVsblInt PrGpStrn Appearance PValStrnFalse typeStrnBoolean CPifStrnWindow EndGInt tVwPrGrup|uNameStrn BackColor VsblInt PrGpStrn Appearance PValStrn&hFFFFFFtypeStrnColor CPifStrnWindow EndGInt uVwPrGrupxvNameStrnBackdropVsblInt PrGpStrn Appearance typeStrnPicture vbETStrnPicture CPifStrnWindow EndGInt vVwPrGrupxwNameStrnTitle VsblInt PrGpStrn Appearance PValStrnUntitledtypeStrnString CPifStrnWindow EndGInt wVwPrGruptxNameStrnVisible VsblInt PrGpStrn Appearance PValStrnTruetypeStrnBoolean CPifStrnWindow EndGInt xVwPrGrup|yNameStrn FullScreen VsblInt PrGpStrn Appearance PValStrnFalse typeStrnBoolean CPifStrnWindow EndGInt yVwPrGrup|zNameStrnMenuBarVisible VsblInt PrGpStrn Appearance PValStrnTruetypeStrnBoolean CPifStrnWindow EndGInt zVwPrGrupx{NameStrn CloseButton VsblInt PrGpStrn Appearance PValStrnTruetypeStrnBoolean CPifStrnWindow EndGInt {VwPrGrup||NameStrn Resizeable VsblInt PrGpStrn Appearance PValStrnFalse typeStrnBoolean CPifStrnWindow EndGInt |VwPrGrupx}NameStrn LiveResize VsblInt PrGpStrn Appearance PValStrnTruetypeStrnBoolean CPifStrnWindow EndGInt }VwPrGrup~NameStrnMaximizeButton VsblInt PrGpStrn Appearance PValStrnFalse typeStrnBoolean CPifStrnWindow EndGInt ~VwPrGrup|NameStrnMinimizeButton VsblInt PrGpStrn Appearance PValStrnTruetypeStrnBoolean CPifStrnWindow EndGInt VwPrGrupxNameStrn MacProcID VsblInt PrGpStrn Appearance PValStrn0 typeStrnInteger CPifStrnWindow EndGInt VwPrGrupxNameStrnMenuBar VsblInt PrGpStrn Appearance typeStrnMenuBar vbETStrnMenuBar CPifStrnWindow EndGInt VwPrGrup|NameStrnImplicitInstanceVsblInt PrGpStrn Appearance PValStrnTruevbETStrnBoolean CPifStrnWindow EndGInt EndGInt eCnstGrupxnameStrnkSent CompStrnVsblInt EncoInt nameStrnkSent typeInt defnStrn0 flagInt EndGInt CnstGrupnameStrn kReceived CompStrnVsblInt EncoInt nameStrn kReceived typeInt defnStrn1 flagInt EndGInt CnstGrupxnameStrnkCommentCompStrnVsblInt EncoInt nameStrnkCommenttypeInt defnStrn2 flagInt EndGInt CBhvGrupSuprStrn EditField HInsGrupnameStrn SelChange CompStrnVsblInt sorcGruplEncoInt srclStrnSub SelChange() srclStrnmSelChanged = True srclStrnsrclStrnEnd Sub EndGInt EndGInt EndGInt CtrlGrup HcclsStrn EditField nameStrn EditField PDefGrup4nameStrnNameEncoInt PValStrnLogFld EndGInt PDefGrup<nameStrnIndex EncoInt PValStrn -2147483648 EndGInt PDefGrup4nameStrnScope EncoInt PValStrn0 EndGInt PDefGrup0nameStrnLeftEncoInt PValStrn0 EndGInt PDefGrup0nameStrnTop EncoInt PValStrn0 EndGInt PDefGrup4nameStrnWidth EncoInt PValStrn600 EndGInt PDefGrup4nameStrnHeight EncoInt PValStrn400 EndGInt PDefGrup4nameStrnLockLeftEncoInt PValStrnTrueEndGInt PDefGrup4nameStrnLockTop EncoInt PValStrnTrueEndGInt PDefGrup8nameStrn LockRight EncoInt PValStrnTrueEndGInt PDefGrup8nameStrn LockBottom EncoInt PValStrnTrueEndGInt PDefGrup<nameStrn TabPanelIndex EncoInt PValStrn0 EndGInt PDefGrup4nameStrnTabIndexEncoInt PValStrn0 EndGInt PDefGrup4nameStrnTabStop EncoInt PValStrnTrueEndGInt PDefGrup8nameStrnBorder EncoInt PValStrnFalse EndGInt PDefGrup8nameStrn Multiline EncoInt PValStrnTrueEndGInt PDefGrup@nameStrnScrollbarHorizontal EncoInt PValStrnTrueEndGInt PDefGrup@nameStrnScrollbarVertical EncoInt PValStrnTrueEndGInt PDefGrup4nameStrnStyled EncoInt PValStrnTrueEndGInt PDefGrup0nameStrnPasswordEncoInt PValStrnEndGInt PDefGrup<nameStrn UseFocusRingEncoInt PValStrnFalse EndGInt PDefGrup8nameStrn TextColor EncoInt PValStrn0 EndGInt PDefGrup<nameStrn BackColor EncoInt PValStrn16777215EndGInt PDefGrup4nameStrnEnabled EncoInt PValStrnTrueEndGInt PDefGrup0nameStrnFormat EncoInt PValStrnEndGInt PDefGrup4nameStrnVisible EncoInt PValStrnTrueEndGInt PDefGrup0nameStrnHelpTag EncoInt PValStrnEndGInt PDefGrup<nameStrnAutoDeactivate EncoInt PValStrnTrueEndGInt PDefGrup8nameStrnTextFontEncoInt PValStrnMonaco EndGInt PDefGrup4nameStrnTextSizeEncoInt PValStrn10 EndGInt PDefGrup,nameStrnBoldEncoInt PValStrnEndGInt PDefGrup0nameStrnItalic EncoInt PValStrnEndGInt PDefGrup4nameStrn Underline EncoInt PValStrnEndGInt PDefGrup,nameStrnTextEncoInt PValStrnEndGInt PDefGrup,nameStrnMaskEncoInt PValStrnEndGInt PDefGrup0nameStrnReadOnlyEncoInt PValStrnEndGInt PDefGrup8nameStrn LimitText EncoInt PValStrn0 EndGInt PDefGrup4nameStrn AcceptTabs EncoInt PValStrnEndGInt PDefGrup8nameStrn Alignment EncoInt PValStrn0 EndGInt PDefGrup4nameStrn DataSource EncoInt PValStrnEndGInt PDefGrup4nameStrn DataField EncoInt PValStrnEndGInt PDefGrup8nameStrn InitialParent EncoInt PValStrnEndGInt PDefGrup<nameStrnSuper EncoInt PValStrn EditField EndGInt CBixInt iLckInt EndGInt PadnPadn****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************BlokpObjGNameStrn StringUtils ContInt paswStrnbClsInt flagInt bNtrInt CompStrnMethGrup nameStrnRepeat CompStrnVsblInt sorcGrupPEncoInt srclStrn>Function Repeat(s as String, repeatCount as Integer) As String srclStrn6// Concatenate a string to itself 'repeatCount' times. srclStrn=// Example: Repeat("spam ", 5) = "spam spam spam spam spam ". srclStrnsrclStrndim stringLength as Integer srclStrnstringLength = LenB(s) srclStrn+If stringLength = 0 or repeatCount < 1 then srclStrn Return "" srclStrnEnd if srclStrnsrclStrndim m as MemoryBlocksrclStrn/m = new MemoryBlock(stringLength * repeatCount) srclStrnsrclStrndim i, maxi as Integer srclStrn'maxi = (repeatCount - 1) * stringLength srclStrn#For i = 0 to maxi step stringLength srclStrn"m.StringValue(i, stringLength) = s srclStrnNextsrclStrnsrclStrn;Return DefineEncoding(m.StringValue(0, m.Size), s.Encoding) srclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn#s as String, repeatCount as Integer rsltStrnString EndGInt MethGrup HnameStrn EditDistanceCompStrnVsblInt sorcGrup EncoInt srclStrn, srclStrnE// though we're using only a 1D array since the 2D array is wasteful. srclStrnsrclStrn#pragma DisableBackgroundTasks srclStrn#pragma DisableBoundsChecking srclStrn#pragma DisableAutoWaitCursor srclStrnsrclStrnDim n, m As Integer srclStrn n = s1.Len srclStrn m = s2.Len srclStrnif n = 0 then return m srclStrnif m = 0 then return n srclStrnsrclStrnDim i, j, cost As Integer srclStrnDim d(-1) As IntegersrclStrn Redim d(m) srclStrnfor j = 1 to m srclStrnd(j) = jsrclStrnnextsrclStrnsrclStrn&Dim s1chars(-1), s2chars(-1) As String srclStrns1chars = Split( s1, "" ) srclStrns2chars = Split( s2, "" ) srclStrnsrclStrnDim s1char As StringsrclStrn!Dim lastCost, nextCost As Integer srclStrnDim a, b, c As Integer srclStrnDim jMinus1 As Integer srclStrnsrclStrnfor i = 1 to n srclStrns1char = s1chars(i-1) srclStrn lastCost = isrclStrn jMinus1 = 0 srclStrnfor j = 1 to m srclStrnFif StrComp(s1char, s2chars(jMinus1),0) = 0 then cost = 0 else cost = 1 srclStrnsrclStrnD// set nextCost to the minimum of the following three possibilities:srclStrn a = d(j) + 1srclStrnb = lastCost + 1srclStrnc = cost + d(jMinus1) srclStrnsrclStrn if a < b then srclStrn,if c < a then nextCost = c else nextCost = asrclStrnelsesrclStrn,if c < b then nextCost = c else nextCost = bsrclStrnend if srclStrnsrclStrnd(jMinus1) = lastCost srclStrnlastCost = nextCost srclStrn jMinus1 = j srclStrnnextsrclStrnd(m) = lastCost srclStrnnextsrclStrnsrclStrnreturn nextCost srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrns1 As String, s2 As String rsltStrnInteger EndGInt MethGrupnameStrnSoundex CompStrnVsblInt sorcGrup EncoInt srclStrnFFunction Soundex(s As String, stripPrefix As Boolean = true) As String srclStrn0// Return the Soundex code for the given string.srclStrn2// That's the first character, followed by numeric srclStrn*// codes for the first several consonants. srclStrnI// For more detail, see: srclStrnsrclStrn"Dim prefix, prefixes(-1) As String srclStrnDim i, prefixLen As Integer srclStrnsrclStrn s = Trim( s ) srclStrnsrclStrnif stripPrefix then srclStrn8prefixes = Array("La ", "De ", "Van ") // more to come?srclStrnfor each prefix in prefixes srclStrnprefixLen = prefix.Len srclStrn%if Left( s, prefixLen ) = prefix then srclStrns = Mid( s, prefixLen+1 ) srclStrnexitsrclStrnend if srclStrnnextsrclStrnend if srclStrnsrclStrnDim c, out As StringsrclStrnout = Uppercase( Left(s, 1) ) srclStrn&Dim sLen, curCode, lastCode As Integer srclStrn sLen = s.LensrclStrnfor i = 2 to sLen srclStrnc = Uppercase( Mid( s, i, 1 ) ) srclStrnif InStrB( "BPFV", c ) > 0 then srclStrn curCode = 1 srclStrn'elseif InStrB( "CSKGJQXZ", c ) > 0 then srclStrn curCode = 2 srclStrn!elseif InStrB( "DT", c ) > 0 then srclStrn curCode = 3 srclStrnelseif c = "L" then srclStrn curCode = 4 srclStrn!elseif InStrB( "MN", c ) > 0 then srclStrn curCode = 5 srclStrnelseif c = "R" then srclStrn curCode = 6 srclStrnelsesrclStrn curCode = 0 srclStrnend if srclStrn+if curCode > 0 and curCode <> lastCode then srclStrnout = out + str(curCode)srclStrnif Len(out) = 4 then return out srclStrnend if srclStrnnextsrclStrnsrclStrnreturn Left( out + "000", 4 ) srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn*s As String, stripPrefix As Boolean = true rsltStrnString EndGInt MethGrupnameStrnHashCompStrnVsblInt sorcGrup<EncoInt srclStrn%Function Hash(s As String) As Integer srclStrn=// Return the hash value of the given string, as used by RB's srclStrn"// Variant and Dictionary classes. srclStrnsrclStrnDim v As VariantsrclStrnv = s srclStrn return v.Hash srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn s As String rsltStrnInteger EndGInt MethGrupnameStrnCount CompStrnVsblInt sorcGrupEncoInt srclStrn=Function Count(source As String, substr As String) As Integer srclStrn@// Return how many non-overlapping occurrences of 'substr' theresrclStrn// are in 'source'. srclStrnsrclStrndim theCount as Integer srclStrndim substrLength as Integer srclStrndim start as IntegersrclStrnsrclStrnsubstrLength = Len(substr) srclStrn/if substrLength = 0 then return Len(source) + 1 srclStrnsrclStrn start = 1 srclStrnDo srclStrn#start= InStr(start, source, substr) srclStrn!If start < 1 then return theCount srclStrntheCount = theCount + 1 srclStrnstart = start + substrLengthsrclStrnLoopsrclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn"source As String, substr As String rsltStrnInteger EndGInt MethGrupnameStrnCountB CompStrnVsblInt sorcGrupEncoInt srclStrn>Function CountB(source As String, substr As String) As Integer srclStrn@// Return how many non-overlapping occurrences of 'substr' theresrclStrn,// are in 'source', doing binary comparison.srclStrnsrclStrndim theCount as Integer srclStrndim substrLength as Integer srclStrndim start as IntegersrclStrnsrclStrnsubstrLength = Len(substr) srclStrn0if substrLength = 0 then return LenB(source) + 1srclStrnsrclStrn start = 1 srclStrnDo srclStrn$start= InStrB(start, source, substr)srclStrn!If start < 1 then return theCount srclStrntheCount = theCount + 1 srclStrnstart = start + substrLengthsrclStrnLoopsrclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn"source As String, substr As String rsltStrnInteger EndGInt MethGruplnameStrnPadBoth CompStrnVsblInt sorcGrupEncoInt srclStrnRFunction PadBoth(s as String, width as Integer, padding as String = " ") As String srclStrnL// Pad a string to at least 'width' characters, by adding padding characterssrclStrn-// to the left and right sides of the string. srclStrn// srclStrnM// If it is impossible to center the string, the string will be one character srclStrn,// to the right more than it is to the left.srclStrnsrclStrndim length as Integer srclStrnsrclStrnlength = len(s) srclStrn if length >= width then return ssrclStrnsrclStrndim mostToRepeat as Integer srclStrn0mostToRepeat = ceil((width-length)/len(padding))srclStrnsrclStrndim repeated as String srclStrn0repeated = Repeat(padding, ceil(mostToRepeat/2))srclStrnsrclStrnVreturn mid(repeated, 1, ceil((width-length)/2)) + s + mid(repeated,1,(width-length)\2) srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn6s as String, width as Integer, padding as String = " " rsltStrnString EndGInt MethGrupnameStrnPadLeft CompStrnVsblInt sorcGrupLEncoInt srclStrnRFunction PadLeft(s as String, width as Integer, padding as String = " ") As String srclStrnL// Pad a string to at least 'width' characters, by adding padding characterssrclStrn"// to the left side of the string. srclStrnsrclStrndim length as Integer srclStrnlength = len(s) srclStrn if length >= width then return ssrclStrnsrclStrndim mostToRepeat as Integer srclStrn0mostToRepeat = ceil((width-length)/len(padding))srclStrn= width then return ssrclStrnsrclStrndim mostToRepeat as Integer srclStrn0mostToRepeat = ceil((width-length)/len(padding))srclStrn 0 srclStrn c = c + 1 srclStrn(n = InStr( n + sepLen, parts( i ), sep )srclStrnwendsrclStrnnext i srclStrnsrclStrn return c + 1srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrnsrc as string, sep as stringrsltStrninteger EndGInt MethGrup `nameStrnNthFieldQuoted CompStrnVsblInt sorcGrup EncoInt srclStrnQFunction NthFieldQuoted(src as string, sep as string, index as integer) As string srclStrnE// Equivalent to RB's nthField() function, but respects quoted values srclStrn // Usage: srclStrn5// s = """Hello, Kitty"", ""One"", ""Two, Three""" srclStrn$// s1 = nthFieldQuoted(s, ",", 3)srclStrn4// result: s1 = "Two, Three" (including the quotes!)srclStrnsrclStrnE// Easy cases: no occurrences of the separator, or no quotation marks srclStrnif InStr(src,sep)=0 thensrclStrnif index=1 then srclStrn return src srclStrnelsesrclStrn return "" srclStrnend if srclStrnelseif InStr(src,"""")= 0 then srclStrn return NthField(src, sep, index)srclStrnend if srclStrnsrclStrn3// Harder case: both separator and quotation marks. srclStrn(// We'll use InStrQuoted to help us out.srclStrnDim sepLen As Integer = sep.Len srclStrnDim startPos As Integer = 1 srclStrn!for i As Integer = 1 to index - 1 srclStrn9Dim sepPos As Integer = InStrQuoted( startPos, src, sep ) srclStrnif sepPos = 0 then return ""srclStrnstartPos = sepPos + sepLen srclStrnnextsrclStrn9Dim sepPos As Integer = InStrQuoted( startPos, src, sep ) srclStrn.if sepPos = 0 then return Mid( src, startPos ) srclStrn.return Mid( src, startPos, sepPos - startPos ) srclStrnsrclStrn#// Old code is below for posterity. srclStrn&'dim c, n, startPos, endPos as integer srclStrn'dim inQuotes as booleansrclStrn'dim a as stringsrclStrn' srclStrn 'dim sepLen as integer = sep.LensrclStrn#'dim srcLen as integer = len( src ) srclStrn''dim leftSep as string = left( sep, 1 ) srclStrn*'dim adjustedIndex as integer = (index -1) srclStrn' srclStrnsrclStrnW'endpos = srcLen + 1 // (accounts for final field, where no ending separator is found) srclStrn'for n=1 to srcLen srclStrn'a = Mid(src,n,1) srclStrn'if a= """" thensrclStrn'inQuotes = not inQuotessrclStrn)'elseif (a=leftSep) and not inQuotes then srclStrn"'if mid(src, n, sepLen) = sep then srclStrn 'c = c + 1 srclStrn'if index = 1 then srclStrn'// First Field srclStrn 'startPos = 1 srclStrn 'endPos = n-1 srclStrn'exit srclStrn'else srclStrn'// Field 2..x srclStrn'if (c=adjustedIndex) then srclStrn'// Leading Sep gefundensrclStrn'startPos = n+sepLensrclStrn'elseif c = index then srclStrn'// Trailing Sep found srclStrn 'endPos = n-1 srclStrn'exit srclStrn'end if srclStrn'end if srclStrn'end if srclStrn'end if srclStrn'next srclStrn' srclStrn'if startPos = 0 then srclStrn'if index=1 thensrclStrn 'return src srclStrn'else srclStrn 'return "" srclStrn'end if srclStrn'else srclStrn+'return mid(src,startPos,endPos-startPos+1) srclStrn'end if srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn.src as string, sep as string, index as integer rsltStrnstring EndGInt MethGrupTnameStrnContainsCompStrnVsblInt sorcGrupEncoInt srclStrnAFunction Contains(extends s As String, what As String) As Boolean srclStrn4// Return true if 's' contains the substring 'what'.srclStrnE// By "contains" we mean case-insensitive, encoding-savvy containment srclStrn// as with InStr. srclStrnsrclStrnif what = "" then return true srclStrnreturn InStr( s, what ) > 0 srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn#extends s As String, what As String rsltStrnBoolean EndGInt MethGrup`nameStrn CountRegEx CompStrnVsblInt sorcGrupEncoInt srclStrn>Function CountRegEx(s As String, pattern As String) As Integer srclStrnF// Count the number of occurrences of a RegEx pattern within a string. srclStrnsrclStrnDim out As Integer srclStrnsrclStrnDim re As New RegEx srclStrnDim rm As RegExMatchsrclStrnsrclStrnre.SearchPattern = pattern srclStrnrm = re.Search( s ) srclStrnwhile rm <> nil srclStrny'System.DebugLog rm.SubExpressionString(0) + " at " + str(rm.SubExpressionStartB(0)) + " matches " + pattern + " in " + s srclStrn out = out + 1 srclStrnrm = re.Search srclStrnwendsrclStrnsrclStrn return out srclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrns As String, pattern As String rsltStrnInteger EndGInt MethGrupnameStrn StartsWith CompStrnVsblInt sorcGrup@EncoInt srclStrnGFunction StartsWith(extends s As String, withWhat As String) As Boolean srclStrn8// Return true if 's' starts with the string 'withWhat',srclStrn&// doing a standard string comparison. srclStrnsrclStrn'return Left(s, withWhat.Len) = withWhat srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn'extends s As String, withWhat As String rsltStrnBoolean EndGInt MethGrup<nameStrn ContainsB CompStrnVsblInt sorcGrup|EncoInt srclStrnBFunction ContainsB(extends s As String, what As String) As Boolean srclStrn4// Return true if 's' contains the substring 'what'.srclStrn+// By "contains" we mean binary containment srclStrn// as with InStrB. srclStrnsrclStrnif what = "" then return true srclStrnreturn InStrB( s, what ) > 0srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn#extends s As String, what As String rsltStrnBoolean EndGInt MethGrupnameStrn StartsWithB CompStrnVsblInt sorcGrupLEncoInt srclStrnHFunction StartsWithB(extends s As String, withWhat As String) As BooleansrclStrn8// Return true if 's' starts with the string 'withWhat',srclStrn// doing a binary comparison. srclStrnsrclStrn9return StrComp( LeftB(s, withWhat.Len), withWhat, 0 ) = 0 srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn'extends s As String, withWhat As String rsltStrnBoolean EndGInt MethGrupxnameStrnIsEmpty CompStrnVsblInt sorcGrupEncoInt srclStrn0Function IsEmpty(extends s As String) As BooleansrclStrn&// Return true if the string is empty. srclStrnsrclStrn return s = "" srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrnextends s As String rsltStrnBoolean EndGInt MethGrupnameStrn InStrReverseCompStrnVsblInt sorcGrupEncoInt srclStrn_Function InStrReverse(startPos As Integer = - 1, source As String, substr As String) As Integer srclStrnC// Similar to InStr, but searches backwards from the given position srclStrn:// (or if startPos = -1, then from the end of the string). srclStrn'// If substr can't be found, returns 0. srclStrnsrclStrn"Dim srcLen As Integer = source.Len srclStrn'if startPos = -1 then startPos = srcLen srclStrnsrclStrn// Here's an easy way...srclStrnU// There may be a faster implementation, but then again, there may not -- it probably srclStrn*// depends on the particulars of the data. srclStrn.Dim reversedSource As String = Reverse(source) srclStrn.Dim reversedSubstr As String = Reverse(substr) srclStrnDim reversedPos As Integer srclStrnLreversedPos = InStr( srcLen - startPos + 1, reversedSource, reversedSubstr )srclStrn if reversedPos < 1 then return 0srclStrn,return srcLen - reversedPos - substr.Len + 2srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn=startPos As Integer = - 1, source As String, substr As String rsltStrnInteger EndGInt MethGrupnameStrn InStrReverseB CompStrnVsblInt sorcGrup4EncoInt srclStrnaFunction InStrReverseB(startPosB As Integer = - 1, source As String, substr As String) As Integer srclStrnD// Similar to InStrB, but searches backwards from the given positionsrclStrn;// (or if startPosB = -1, then from the end of the string). srclStrn'// If substr can't be found, returns 0. srclStrnsrclStrn#Dim srcLen As Integer = source.LenB srclStrn#Dim subLen As Integer = substr.LenB srclStrn)if startPosB = -1 then startPosB = srcLen srclStrnsrclStrn@// We'll do a simple sequential search. A Boyer-Moore algorithmsrclStrn@// would work better in many cases, but we'd have to rewrite thesrclStrnA// whole algorithm to work backwards. The sequential search will srclStrn'// be good enough in most cases anyway. srclStrnDim posB As Integer srclStrn9for posB = Min( srcLen - subLen + 1, startPosB ) downTo 1 srclStrnJif StrComp( MidB( source, posB, subLen ), substr, 0 ) = 0 then return posB srclStrn next posB srclStrnsrclStrnreturn 0srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn>startPosB As Integer = - 1, source As String, substr As String rsltStrnInteger EndGInt MethGrup<nameStrn SplitToInt CompStrnVsblInt sorcGruppEncoInt srclStrnMFunction SplitToInt(source As String, delimiter As String = " ") As Integer() srclStrnF// Split a string into fields, then convert each field into an Integer srclStrn// using the Val function. srclStrnsrclStrnDim fields(-1) As StringsrclStrn fields = source.Split(delimiter)srclStrnsrclStrnDim out(-1) As Integer srclStrnRedim out( UBound(fields) ) srclStrnsrclStrnDim i As IntegersrclStrnfor i = UBound(fields) DownTo 0 srclStrnout(i) = Val( fields(i) ) srclStrnnextsrclStrnsrclStrn return out srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn+source As String, delimiter As String = " " rsltStrn Integer() EndGInt MethGrupnameStrn SplitToVal CompStrnVsblInt sorcGrup EncoInt srclStrnLFunction SplitToVal(source As String, delimiter As String = " ") As Double()srclStrnD// Split a string into fields, then convert each field into a DoublesrclStrnD// using the Val function. This is appropriate for a set of numberssrclStrnB// used only by the computer; for human-readable numbers, consider srclStrn// using SplitToCDbl instead. srclStrnsrclStrnDim fields(-1) As StringsrclStrn fields = source.Split(delimiter)srclStrnsrclStrnDim out(-1) As Double srclStrnRedim out( UBound(fields) ) srclStrnsrclStrnDim i As IntegersrclStrnfor i = UBound(fields) DownTo 0 srclStrnout(i) = Val( fields(i) ) srclStrnnextsrclStrnsrclStrn return out srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn+source As String, delimiter As String = " " rsltStrnDouble()EndGInt MethGrupnameStrn SplitToCDbl CompStrnVsblInt sorcGrupEncoInt srclStrnMFunction SplitToCDbl(source As String, delimiter As String = " ") As Double() srclStrnD// Split a string into fields, then convert each field into a DoublesrclStrnE// using the CDbl function. This is appropriate for a set of numbers srclStrn'// entered or readable by the end-user. srclStrnsrclStrnDim fields(-1) As StringsrclStrn fields = source.Split(delimiter)srclStrnsrclStrnDim out(-1) As Double srclStrnRedim out( UBound(fields) ) srclStrnsrclStrnDim i As IntegersrclStrnfor i = UBound(fields) DownTo 0 srclStrnout(i) = CDbl( fields(i) ) srclStrnnextsrclStrnsrclStrn return out srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn+source As String, delimiter As String = " " rsltStrnDouble()EndGInt MethGrupnameStrn SplitByRegExCompStrnVsblInt sorcGrupEncoInt srclStrnKFunction SplitByRegEx(source As String, delimPattern As String) As String() srclStrn@// Split a string into fields delimited by a regular expression.srclStrnsrclStrnDim out(-1) As String srclStrnsrclStrnDim re As New RegEx srclStrnDim rm As RegExMatchsrclStrnDim startPos As Integer srclStrnsrclStrnre.SearchPattern = delimPattern srclStrnrm = re.Search( source )srclStrnwhile rm <> nil srclStrny'System.DebugLog rm.SubExpressionString(0) + " at " + str(rm.SubExpressionStartB(0)) + " matches " + pattern + " in " + s srclStrnMout.Append MidB( source, startPos + 1, rm.SubExpressionStartB(0) - startPos ) srclStrn!startPos = re.SearchStartPosition srclStrnrm = re.Search srclStrnwendsrclStrnsrclStrnif startPos < source.LenB then srclStrn'out.Append MidB( source, startPos + 1 ) srclStrnend if srclStrnsrclStrn return out srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn(source As String, delimPattern As StringrsltStrnString()EndGInt MethGrupnameStrnSQLify CompStrnVsblInt sorcGrup4EncoInt srclStrn&Function SQLify(s As String) As String srclStrn;// Return a version of s ready for use in an SQL statement. srclStrnsrclStrn:// In other words, we just need to double the apostrophes: srclStrn!return ReplaceAll( s, "'", "''" ) srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn s As String rsltStrnString EndGInt MethGrupnameStrnChopCompStrnVsblInt sorcGrupEncoInt srclStrn;Function Chop(s As String, charsToCut As Integer) As String srclStrn:// Return s with the rightmost 'charsToCut' chars removed. srclStrnsrclStrn#return s.Left( s.Len - charsToCut ) srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn"s As String, charsToCut As Integer rsltStrnString EndGInt MethGrupnameStrnChopB CompStrnVsblInt sorcGrupEncoInt srclStrn 0 or InStr(source, "K") > 0 _ srclStrn 0 or InStr(source, "WITZ") > 0 thensrclStrnslavoGermanic = truesrclStrnend if srclStrnsrclStrnDim out1, out2 As StringsrclStrnsrclStrn#// skip these when at start of word srclStrnSif MStringAt(source, 1, 2, "GN", "KN", "PN", "WR", "PS") then current = current + 1 srclStrnsrclStrn.// initial 'X' is pronounced 'Z' e.g. 'Xavier' srclStrnif charAt(1) = "X" then srclStrnout1 = out1 + "S" srclStrn%out2 = out2 + "S" // "Z" maps to "S" srclStrncurrent = current + 1 srclStrnend if srclStrnsrclStrn&//---------- main loop --------------- srclStrnwhile current <= length srclStrnsrclStrnselect case charAt(current) srclStrnsrclStrn!case "A", "E", "I", "O", "U", "Y" srclStrnif current = 1 then srclStrn;// all initial vowels map to "A"; elsewhere they're skipped srclStrnout1 = out1 + "A" srclStrnout2 = out2 + "A" srclStrnend if srclStrncurrent = current + 1 srclStrnsrclStrncase "B"srclStrn.//"-mb", e.g", "dumb", already skipped over... srclStrnout1 = out1 + "P" srclStrnout2 = out2 + "P" srclStrn!if charAt(current + 1) = "B" then srclStrncurrent = current + 2 srclStrnelsesrclStrncurrent = current + 1 srclStrnend if srclStrnsrclStrn case "Ç" srclStrnout1 = out1 + "S" srclStrnout2 = out2 + "S" srclStrncurrent = current + 1 srclStrnsrclStrncase "C"srclStrn// various germanic srclStrnif current > 2 _srclStrn'and not MIsVowel(source, current - 2) _ srclStrn0and MStringAt(source, (current - 1), 3, "ACH") _srclStrn@and (charAt(current + 2) <> "I" and (charAt(current + 2) <> "E"_srclStrn@or MStringAt(source, current - 2, 6, "BACHER", "MACHER")) ) thensrclStrnout1 = out1 + "K" srclStrnout2 = out2 + "K" srclStrncurrent = current + 2 srclStrnsrclStrnCelseif current = 1 AND MStringAt(source, current, 6, "CAESAR") then srclStrn9// special case 'caesar' (why didn't this go at the top?) srclStrnout1 = out1 + "S" srclStrnout2 = out2 + "S" srclStrncurrent = current + 2 srclStrnsrclStrn1elseif MStringAt(source, current, 4, "CHIA") then srclStrn// italian 'chianti'srclStrnout1 = out1 + "K" srclStrnout2 = out2 + "K" srclStrncurrent = current + 2 srclStrnsrclStrn/elseif MStringAt(source, current, 2, "CH") then srclStrn// find 'michael' srclStrn=if current > 0 AND MStringAt(source, current, 4, "CHAE") then srclStrnout1 = out1 + "K" srclStrnout2 = out2 + "X" srclStrncurrent = current + 2 srclStrnbreak srclStrnsrclStrnelseif current = 0 _srclStrn:and (MStringAt(source, current + 1, 5, "HARAC", "HARIS") _ srclStrnCor MStringAt(source, current + 1, 3, "HOR", "HYM", "HIA", "HEM")) _ srclStrn-and not MStringAt(source, 0, 5, "CHORE") then srclStrn)// greek roots e.g. 'chemistry', 'chorus' srclStrnout1 = out1 + "K" srclStrnout2 = out2 + "K" srclStrncurrent = current + 2 srclStrnsrclStrnelsesrclStrn3//germanic, greek, or otherwise 'ch' for 'kh' sound srclStrnPif((MStringAt(source, 0, 4, "VAN ", "VON ") or MStringAt(source, 0, 3, "SCH")) _srclStrn5_ // 'architect but not 'arch', 'orchestra', 'orchid' srclStrnDor MStringAt(source, current - 2, 6, "ORCHES", "ARCHIT", "ORCHID") _srclStrn0or MStringAt(source, current + 2, 1, "T", "S") _srclStrnLor ((MStringAt(source, current - 1, 1, "A", "O", "U", "E") OR current = 1) _srclStrn3_ //e.g., 'wachtler', 'wechsler', but not 'tichner' srclStrn^and MStringAt(source, current + 2, 1, "L", "R", "N", "M", "B", "H", "F", "V", "W", " "))) then srclStrnout1 = out1 + "K" srclStrnout2 = out2 + "K" srclStrnelsesrclStrnif current > 1 then srclStrn%if MStringAt(source, 1, 2, "MC") then srclStrn//e.g., "McHugh"srclStrnout1 = out1 + "K" srclStrnout2 = out2 + "K" srclStrnelsesrclStrnout1 = out1 + "X" srclStrnout2 = out2 + "K" srclStrnend if srclStrnelsesrclStrnout1 = out1 + "X" srclStrnout2 = out2 + "X" srclStrnend if srclStrnend if srclStrncurrent = current + 2 srclStrnend if srclStrnsrclStrn// end of CH case srclStrnsrclStrnaelseif MStringAt(source, current, 2, "CZ") and not MStringAt(source, current - 2, 4, "WICZ") then srclStrn//e.g, 'czerny' srclStrnout1 = out1 + "S" srclStrnout2 = out2 + "X" srclStrncurrent = current + 2 srclStrnsrclStrn4elseif MStringAt(source, current + 1, 3, "CIA") thensrclStrn//e.g., 'focaccia' srclStrnout1 = out1 + "X" srclStrnout2 = out2 + "X" srclStrncurrent = current + 3 srclStrnsrclStrnYelseif MStringAt(source, current, 2, "CC") and not (current = 2 AND charAt(1) = "M") then srclStrn*// double "C", but not if e.g. 'McClellan' srclStrn //'bellocchio' but not 'bacchus'srclStrnhif MStringAt(source, current + 2, 1, "I", "E", "H") and not MStringAt(source, current + 2, 2, "HU") thensrclStrn //'accident', 'accede" "succeed'srclStrn0if((current = 2 AND charAt(current - 1) = "A") _srclStrn 1 AND not MIsVowel(source, current - 1) then srclStrnout1 = out1 + "K" srclStrnout2 = out2 + "K" srclStrncurrent = current + 2 srclStrnsrclStrnelseif current = 1 then srclStrn//'ghislane', ghiradellisrclStrn!if charAt(current + 2) = "I" then srclStrnout1 = out1 + "J" srclStrnout2 = out2 + "J" srclStrnelsesrclStrnout1 = out1 + "K" srclStrnout2 = out2 + "K" srclStrnend if srclStrncurrent = current + 2 srclStrnsrclStrnLelseif((current > 2 AND MStringAt(source, current - 2, 1, "B", "H", "D") ) _srclStrn_ //e.g., 'bough' srclStrnHOR (current > 3 AND MStringAt(source, current - 3, 1, "B", "H", "D") ) _srclStrn_ //e.g., 'broughton' srclStrnHOR (current > 4 AND MStringAt(source, current - 4, 1, "B", "H") ) ) thensrclStrn>//Parker's rule (with some further refinements) - e.g., 'hugh' srclStrncurrent = current + 2 srclStrnsrclStrnelsesrclStrnA//e.g., 'laugh', 'McLaughlin', 'cough', 'gough', 'rough', 'tough' srclStrnif current > 3 _srclStrnAND charAt(current - 1) = "U" _ srclStrnCAND MStringAt(source, current - 3, 1, "C", "G", "L", "R", "T") then srclStrnout1 = out1 + "F" srclStrnout2 = out2 + "F" srclStrnelsesrclStrn5if((current > 0) AND charAt(current - 1) <> "I") then srclStrnout1 = out1 + "K" srclStrnout2 = out2 + "K" srclStrnend if srclStrnend if srclStrncurrent = current + 2 srclStrnend if srclStrnsrclStrn%elseif charAt(current + 1) = "N" then srclStrn// GN...srclStrnAif current = 1 AND MIsVowel(source, 0) AND not SlavoGermanic then srclStrnout1 = out1 + "KN" srclStrnout2 = out2 + "N" srclStrnelsesrclStrn//not e.g. 'cagney' srclStrn0if not MStringAt(source, current + 2, 2, "EY") _srclStrn9AND charAt(current + 1) <> "Y" AND not SlavoGermanic then srclStrnout1 = out1 + "N" srclStrnout2 = out2 + "KN" srclStrnelsesrclStrnout1 = out1 + "KN" srclStrnout2 = out2 + "KN" srclStrnend if srclStrnend if srclStrncurrent = current + 2 srclStrnsrclStrnsrclStrnIelseif MStringAt(source, current + 1, 2, "LI") AND not SlavoGermanic then srclStrn //'tagliaro'srclStrnout1 = out1 + "KL" srclStrnout2 = out2 + "L" srclStrncurrent = current + 2 srclStrnsrclStrnsrclStrnelseif current = 1 _srclStrn!AND (charAt(current + 1) = "Y" _ srclStrnlOR MStringAt(source, current + 1, 2, "ES", "EP", "EB", "EL", "EY", "IB", "IL", "IN", "IE", "EI", "ER")) thensrclStrn#//ges-,gep-,gel-, gie- at beginning srclStrnout1 = out1 + "K" srclStrnout2 = out2 + "J" srclStrncurrent = current + 2 srclStrnsrclStrnOelseif (MStringAt(source, current + 1, 2, "ER") OR charAt(current + 1) = "Y") _ srclStrn?AND not MStringAt(source, 1, 6, "DANGER", "RANGER", "MANGER") _ srclStrn5AND not MStringAt(source, current - 1, 1, "E", "I") _ srclStrn "W" thensrclStrnout1 = out1 + "X" srclStrnout2 = out2 + "S" srclStrnelsesrclStrnout1 = out1 + "X" srclStrnout2 = out2 + "X" srclStrnend if srclStrncurrent = current + 3 srclStrnend if srclStrnsrclStrn 1 AND charAt(current - 1) <> "T") then srclStrnout1 = out1 + "S" srclStrnout2 = out2 + "TS" srclStrnelsesrclStrnout1 = out1 + "S" srclStrnout2 = out2 + "S" srclStrnend if srclStrnsrclStrn!if charAt(current + 1) = "Z" then srclStrncurrent = current + 2 srclStrnelsesrclStrncurrent = current + 1 srclStrnend if srclStrnend if srclStrnsrclStrn// ---- srclStrnelsesrclStrn7// if none of the above cases, just skip this character srclStrncurrent = current + 1 srclStrn end Select srclStrnwendsrclStrnsrclStrnoutPrimary = out1 srclStrnoutAlternate = out2 srclStrnsrclStrnEnd Sub EndGInt EncoInt AlasStrnflagInt shrdInt parmStrnJsource As String, ByRef outPrimary As String, ByRef outAlternate As String rsltStrnEndGInt MethGrupnameStrnMIsVowelCompStrnVsblInt sorcGrupEncoInt srclStrn@Function MIsVowel(source As String, atPos As Integer) As BooleansrclStrn>// This is a private helper function for the Metaphone method. srclStrnsrclStrn3return InStr( "AEIOUY", Mid(source, atPos, 1) ) > 0 srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt !shrdInt parmStrn"source As String, atPos As Integer rsltStrnBoolean EndGInt MethGrupnameStrn MStringAt CompStrnVsblInt sorcGrupEncoInt srclStrnoFunction MStringAt(source As String, start As Integer, length As Integer, paramArray args As String) As Boolean srclStrn>// This is a private helper function for the Metaphone method. srclStrnsrclStrnif start < 1 then return false srclStrnDim target As StringsrclStrnif start > source.Len then srclStrn target = " "srclStrnelsesrclStrn#target = Mid(source, start, length) srclStrnend if srclStrn"return (args.IndexOf(target) >= 0) srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt !shrdInt parmStrnPsource As String, start As Integer, length As Integer, paramArray args As StringrsltStrnBoolean EndGInt MethGrupnameStrnReverseBCompStrnVsblInt sorcGrupLEncoInt srclStrn(Function ReverseB(s As String) As StringsrclStrn,// Return s with the bytes in reverse order.srclStrn7// Note that if s is text in any encoding that may have srclStrn6// multi-byte characters, you should probably be using srclStrn// Reverse instead of ReverseB. srclStrnsrclStrnif LenB(s) < 2 then return ssrclStrnsrclStrn#pragma BackgroundTasks False srclStrnDim m as MemoryBlock = ssrclStrnDim leftIndex as Integer = 0srclStrn&Dim rightIndex as Integer = m.Size - 4 srclStrn While leftIndex + 4 < rightIndexsrclStrn(Dim tempL as Integer = m.Long(leftIndex)srclStrn)Dim tempR as Integer = m.Long(rightIndex) srclStrn#m.LittleEndian = not m.LittleEndian srclStrnm.Long(leftIndex) = tempR srclStrnm.Long(rightIndex) =tempL srclStrn#m.LittleEndian = not m.LittleEndian srclStrnleftIndex = leftIndex + 4 srclStrnrightIndex = rightIndex - 4 srclStrnWendsrclStrnrightIndex = rightIndex + 3 srclStrnWhile leftIndex < rightIndexsrclStrn$Dim temp as Byte = m.Byte(leftIndex)srclStrn&m.Byte(leftIndex) = m.Byte(rightIndex) srclStrnm.Byte(rightIndex) = temp srclStrnleftIndex = leftIndex + 1 srclStrnrightIndex = rightIndex - 1 srclStrnWendsrclStrn%Return DefineEncoding(m, Encoding(s)) srclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn s As String rsltStrnString EndGInt MethGrupnameStrnEndsWithCompStrnVsblInt sorcGrup@EncoInt srclStrnEFunction EndsWith(extends s As String, withWhat As String) As Boolean srclStrn6// Return true if 's' ends with the string 'withWhat', srclStrn&// doing a standard string comparison. srclStrnsrclStrn(return Right(s, withWhat.Len) = withWhatsrclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn'extends s As String, withWhat As String rsltStrnBoolean EndGInt MethGrupnameStrn EndsWithB CompStrnVsblInt sorcGrupLEncoInt srclStrnFFunction EndsWithB(extends s As String, withWhat As String) As Boolean srclStrn6// Return true if 's' ends with the string 'withWhat', srclStrn// doing a binary comparison. srclStrnsrclStrn;return StrComp( RightB(s, withWhat.LenB), withWhat, 0 ) = 0 srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn'extends s As String, withWhat As String rsltStrnBoolean EndGInt MethGrupnameStrnSprintf CompStrn TargetHasGUIVsblInt sorcGrupEncoInt srclStrnEFunction Sprintf(src as string, ParamArray data as Variant) As string srclStrnF// Returns a string produced according to the formatting string . srclStrnK// The format string is composed of zero or more directives: ordinary srclStrn$// characters (excluding %) that aresrclStrn0// copied directly to the result, and conversionsrclStrn8// specifications, each of which results in fetching itssrclStrn// own parameter. srclStrnD// For details, see http://de.php.net/manual/en/function.sprintf.phpsrclStrnsrclStrnK// Attention: This function differs from the PHP sprintf() function in that srclStrn@// it formats floating numbers according to the locale settings.srclStrn// For example, in Germany, srclStrn// sprintf("%04.2f", 123.45) srclStrn// will return "0123,45". srclStrnsrclStrn2// Written by Frank Bitterlich, bitterlich@gsco.de srclStrn?// Additional work by Florent Pillet, florent@florentpillet.com srclStrnsrclStrn@// NOTE: This method is currently available only to GUI apps duesrclStrnN// to . srclStrnJ// Once that bug is fixed, we can make this available to console apps too. srclStrnsrclStrndim rex as new RegExsrclStrndim match as RegExMatch srclStrnJdim argtype, padding, alignment, precstr, replacement, frmstr, s as string srclStrn8dim p, width, precision, index, start, length as integersrclStrndim vf as doublesrclStrndim datum As VariantsrclStrnsrclStrnCrex.SearchPattern = "(%)(0|/s|'.)?(-)?(\d*)(\.\d+)?([%bcdeufosxX])" srclStrnrex.Options.Greedy = true srclStrnmatch = rex.Search(src) srclStrn index = -1 srclStrnsrclStrndo until match = nilsrclStrn$if match.SubExpressionCount = 7 thensrclStrn6padding = Right(" " + match.SubExpressionString(2), 1) srclStrn7// if padding = "" then padding = " " // default: space srclStrn(alignment = match.SubExpressionString(3)srclStrn)width = Val(match.SubExpressionString(4)) srclStrn.precstr = Mid(match.SubExpressionString(5), 2) srclStrnprecision = Val(precstr)srclStrn if precstr="" then precision = 6srclStrnsrclStrn&argtype = match.SubExpressionString(6) srclStrnif argtype <> "%" then srclStrnindex = index + 1 srclStrnif index > UBound(data) thensrclStrn datum = 0 srclStrnelsesrclStrndatum = data(index) srclStrnend if srclStrnend if srclStrnsrclStrnselect case argtype srclStrncase "%"srclStrnreplacement = "%" srclStrnsrclStrncase "b" // binary int srclStrnreplacement = bin(datum)srclStrnsrclStrncase "c" // character srclStrn'replacement = Encodings.UTF8.Chr(datum) srclStrn width = 0 srclStrnsrclStrncase "d" // signed int srclStrnif padding = "0" then srclStrnfrmstr = "-"+Repeat("0", width) srclStrn4if datum<0 then frmstr = Left(frmstr, Len(frmstr)-1)srclStrnelsesrclStrn frmstr = "-#" srclStrnend if srclStrn#replacement = Format(datum, frmstr) srclStrnsrclStrncase "e" // scientific notation srclStrn vf = datum srclStrn*frmstr = "-#."+Repeat("0", precision)+"e+" srclStrn Replacement = Format(vf, frmstr)srclStrnp = InStr(Replacement, "e") srclStrn2// Make sure the part after the "e" has two digits srclStrnLReplacement = Left(Replacement, p)+Format(Val(Mid(Replacement, p+1)), "+00")srclStrnsrclStrncase "u" // unsigned intsrclStrn replacement = Format(datum, "#")srclStrnsrclStrncase "f" // signed floatsrclStrnif padding = "0" then srclStrnfrmstr = "-"+Repeat("0", width) srclStrn4if datum<0 then frmstr = Left(frmstr, Len(frmstr)-1)srclStrnelsesrclStrn frmstr = "-#" srclStrnend if srclStrnif precision > 0 then srclStrn.frmstr = frmstr + "." + Repeat("0", precision) srclStrnend if srclStrn#Replacement = Format(datum, frmstr) srclStrnDif precision > 0 and padding<>"0" then width = width + precision + 1srclStrnsrclStrncase "o" // octal int srclStrnreplacement = Oct(datum)srclStrnsrclStrncase "s" // string srclStrnreplacement = datum srclStrnsrclStrnLcase "x" // hex int; uppercase "X" means uppercase hex, "x" is lowercase hexsrclStrnreplacement = hex(datum)srclStrn,if asc(argtype) = &h58 then // uppercase "X"srclStrn$replacement = Uppercase(replacement)srclStrnelse // lowercase "x" srclStrn$replacement = lowercase(replacement)srclStrnend if srclStrn end select srclStrnsrclStrnif width>Len(replacement) then srclStrn#if alignment="-" then // align left srclStrn?replacement=replacement+Repeat(padding, width-Len(replacement)) srclStrnelse // align right srclStrn?replacement=Repeat(padding, width-Len(replacement))+replacement srclStrnend if srclStrnend if srclStrnend if srclStrn&start = match.SubExpressionStartB(0)+1 srclStrn+length = LenB(match.SubExpressionString(0)) srclStrnsrclStrn%s = LeftB(src, start-1) + replacement srclStrn!src = s + MidB(src, start+length) srclStrnsrclStrnmatch = rex.Search(src, Len(s)) srclStrnloopsrclStrnsrclStrn return src srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn)src as string, ParamArray data as Variant rsltStrnstring EndGInt MethGrupLnameStrnThousandsSeparator CompStrnVsblInt sorcGrupEncoInt srclStrn'Function ThousandsSeparator() As String srclStrnD// Return the thousands separator the user uses (either "." or ",").srclStrn if mThousandsSeparator = "" thensrclStrn)mThousandsSeparator = Format(1000, "#,#") srclStrn6mThousandsSeparator = Mid( mThousandsSeparator, 2, 1 ) srclStrnend if srclStrnsrclStrnreturn mThousandsSeparator srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrnrsltStrnString EndGInt MethGrup<nameStrnDecimalSeparatorCompStrnVsblInt sorcGrupEncoInt srclStrn%Function DecimalSeparator() As String srclStrnB// Return the decimal separator the user uses (either "." or ","). srclStrnif mDecimalSeparator = "" then srclStrn&mDecimalSeparator = Format(1.2, "0.0") srclStrn2mDecimalSeparator = Mid( mDecimalSeparator, 2, 1 ) srclStrnend if srclStrnsrclStrnreturn mDecimalSeparatorsrclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrnrsltStrnString EndGInt MethGrupnameStrn SplitByLength CompStrnVsblInt sorcGrup@EncoInt srclStrnFFunction SplitByLength(s As String, fieldWidth As Integer) As String() srclStrnF// Split a string into fields, each containing 'fieldWidth' characters srclStrn3// (except for the last one, which may have fewer). srclStrnsrclStrn3if fieldWidth < 1 then // fieldWidth must be >= 1 srclStrnraise New OutOfBoundsException srclStrnend if srclStrnsrclStrnDim out(-1) As String srclStrnsrclStrnDim qty As Integer srclStrn!qty = Ceil( Len(s) / fieldWidth ) srclStrnRedim out( qty - 1 )srclStrnsrclStrnDim pos, i As Integer srclStrnpos = 1 srclStrnfor i = 0 to qty-1 srclStrn"out(i) = Mid( s, pos, fieldWidth ) srclStrnpos = pos + fieldWidth srclStrnnextsrclStrnsrclStrn return out srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn"s As String, fieldWidth As Integer rsltStrnString()EndGInt MethGrupnameStrnTrimCompStrnVsblInt sorcGrup4EncoInt srclStrn@Function Trim(source As String, charsToTrim As String) As StringsrclStrnJ// This is an extended version of RB's Trim function that lets you specify srclStrn// a set of characters to trim. srclStrnsrclStrn"Dim srcLen As Integer = source.Len srclStrnDim leftPos, i As Integer srclStrnfor i = 1 to srcLen srclStrn8if InStr( charsToTrim, Mid(source, i, 1) ) = 0 then exitsrclStrnnextsrclStrn leftPos = i srclStrn"if leftPos > srcLen then return "" srclStrnsrclStrnDim rightPos As Integer srclStrnfor i = srcLen DownTo 1 srclStrn8if InStr( charsToTrim, Mid(source, i, 1) ) = 0 then exitsrclStrnnextsrclStrn rightPos = isrclStrnsrclStrn5return Mid( source, leftPos, rightPos - leftPos + 1 ) srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn'source As String, charsToTrim As String rsltStrnString EndGInt MethGrupnameStrnSplitByLengthB CompStrnVsblInt sorcGrup<EncoInt srclStrnGFunction SplitByLengthB(s As String, fieldWidth As Integer) As String() srclStrnA// Split a string into fields, each containing 'fieldWidth' bytes srclStrn3// (except for the last one, which may have fewer). srclStrnsrclStrn3if fieldWidth < 1 then // fieldWidth must be >= 1 srclStrnraise New OutOfBoundsException srclStrnend if srclStrnsrclStrnDim out(-1) As String srclStrnsrclStrnDim qty As Integer srclStrn"qty = Ceil( LenB(s) / fieldWidth ) srclStrnRedim out( qty - 1 )srclStrnsrclStrnDim pos, i As Integer srclStrnpos = 1 srclStrnfor i = 0 to qty-1 srclStrn#out(i) = MidB( s, pos, fieldWidth ) srclStrnpos = pos + fieldWidth srclStrnnextsrclStrnsrclStrn return out srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn"s As String, fieldWidth As Integer rsltStrnString()EndGInt MethGrupl nameStrnControlCharacters CompStrnVsblInt sorcGrup EncoInt srclStrn&Function ControlCharacters() As String srclStrn8// Return the control character region of the ASCII set,srclStrn// i.e., ASCII 0 through 31.srclStrnDim i As IntegersrclStrnif mControlChars = "" then srclStrnfor i = 0 to 31 srclStrn6mControlChars = mControlChars + Encodings.ASCII.Chr(i) srclStrnnextsrclStrnend if srclStrnsrclStrnreturn mControlCharssrclStrnsrclStrn End FunctionEndGInt  EncoInt AlasStrnflagInt shrdInt parmStrnrsltStrnString EndGInt  MethGrup  nameStrnLTrim CompStrnVsblInt sorcGrup` EncoInt srclStrnAFunction LTrim(source As String, charsToTrim As String) As String srclStrnK// This is an extended version of RB's LTrim function that lets you specify srclStrn// a set of characters to trim. srclStrnsrclStrn"Dim srcLen As Integer = source.Len srclStrnDim leftPos, i As Integer srclStrnfor i = 1 to srcLen srclStrn8if InStr( charsToTrim, Mid(source, i, 1) ) = 0 then exitsrclStrnnextsrclStrn leftPos = i srclStrn"if leftPos > srcLen then return "" srclStrnsrclStrnreturn Mid( source, leftPos ) srclStrnsrclStrn End FunctionEndGInt  EncoInt AlasStrnflagInt shrdInt parmStrn'source As String, charsToTrim As String rsltStrnString EndGInt  MethGrup nameStrnRTrim CompStrnVsblInt sorcGrup8EncoInt srclStrnAFunction RTrim(source As String, charsToTrim As String) As String srclStrnK// This is an extended version of RB's RTrim function that lets you specify srclStrn// a set of characters to trim. srclStrnsrclStrn"Dim srcLen As Integer = source.Len srclStrnDim rightPos, i As Integer srclStrnfor i = srcLen DownTo 1 srclStrn8if InStr( charsToTrim, Mid(source, i, 1) ) = 0 then exitsrclStrnnextsrclStrn rightPos = isrclStrnsrclStrn!return Mid( source, 1, rightPos ) srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn'source As String, charsToTrim As String rsltStrnString EndGInt  MethGrupnameStrnHexBCompStrnVsblInt sorcGrupEncoInt srclStrn$Function HexB(s As String) As StringsrclStrn1// Return a hex representation of each byte of s, srclStrn8// i.e., each byte becomes a pair of hexadecimal digits,srclStrn*// separated by spaces from the next byte. srclStrnsrclStrn// Credit: Charles Yeomans. srclStrnsrclStrnif s = "" then return ""srclStrnsrclStrn#if RBVersion > 5.5 srclStrnStatic HexTable as MemoryBlock srclStrn#else srclStrnDim HexTable as MemoryBlock srclStrn#endif srclStrnsrclStrnif HexTable Is Nil then srclStrnHexTable = new MemoryBlock(512) srclStrnFor i as Integer = 0 to 15 srclStrn.HexTable.StringValue(i + i , 2) = "0" + Hex(i) srclStrnNextsrclStrnFor i as Integer = 16 to 255srclStrn'HexTable.StringValue(i + i, 2) = Hex(i) srclStrnNextsrclStrnend if srclStrnsrclStrn4dim inData as MemoryBlock = new MemoryBlock(LenB(s))srclStrn&inData.StringValue(0, inData.Size) = s srclStrnsrclStrn?dim outData as MemoryBlock = new MemoryBlock(3*inData.Size - 1) srclStrn3outData.Short(0) = HexTable.Short(2*inData.Byte(0)) srclStrnsrclStrn)dim lastByte as Integer = inData.Size - 1 srclStrn%For offset as Integer = 1 to lastByte srclStrn*outData.Byte(3*offset - 1) = 32 // (space) srclStrn?outData.Short(3*offset) = HexTable.Short(2*inData.Byte(offset)) srclStrnNextsrclStrnsrclStrnLReturn DefineEncoding(outData.StringValue(0, outData.Size), Encodings.ASCII)srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn s As String rsltStrnString EndGInt MethGrupnameStrn MatchCase CompStrnVsblInt sorcGrupEncoInt srclStrnJFunction MatchCase(textToChange As String, sampleText As String) As String srclStrn?// Return a version of textToChange that matches the case style srclStrn5// of sampleText: Lowercase, Uppercase, or Titlecase. srclStrnsrclStrn>// Examine the text until we find 2 characters that have case. srclStrnDim pos As Integer = 1 srclStrn&Dim maxPos As Integer = sampleText.Len srclStrnDim foundUpper() As Boolean srclStrnDim c, upperC, lowerC As String srclStrnfor pos = 1 to maxPos srclStrnc = MidB( sampleText, pos, 1 ) srclStrnupperC = Uppercase(c) srclStrnlowerC = Lowercase(c) srclStrn)if StrComp( upperC, lowerC, 0 ) <> 0 then srclStrn9// found a character with case; remember which case it is srclStrn,foundUpper.Append StrComp(c, upperC, 0 ) = 0srclStrn&if UBound( foundUpper ) >= 1 then exit srclStrnelsesrclStrn3// found a caseless character; reset our found list srclStrnRedim foundUpper(-1)srclStrnend if srclStrnnextsrclStrnsrclStrn if UBound( foundUpper ) < 1 thensrclStrn=// didn't find enough characters with case; sample is no good srclStrnreturn textToChange srclStrnend if srclStrnsrclStrnif foundUpper(0) then srclStrn4if foundUpper(1) then return Uppercase(textToChange)srclStrnreturn Titlecase(textToChange) srclStrnend if srclStrnreturn Lowercase(textToChange) srclStrnsrclStrnsrclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn,textToChange As String, sampleText As StringrsltStrnString EndGInt MethGrupnameStrnRandom CompStrnVsblInt sorcGrupEncoInt srclStrnjFunction Random(length As Integer = 8, charset As String = "0123456789ABCDEFGHJKLMNPQRSTUVWXYZ") As String srclStrnK// Generate a random string of the specified length, by choosing characters srclStrnJ// at random from the given character set. NOTE: we currently assume that srclStrn2// all characters in charset are only 1 byte each. srclStrnsrclStrn#if RBVersion > 5.5 srclStrnstatic m As MemoryBlock srclStrn#else srclStrnDim m As MemoryBlocksrclStrn#endif srclStrnsrclStrnif m = nil then srclStrnm = New MemoryBlock( length ) srclStrnelsesrclStrnm.Size = length srclStrnend if srclStrnsrclStrn+Dim charsetSize As Integer = Len( charset ) srclStrnsrclStrn#if RBVersion > 5.5 srclStrnstatic r As New Random srclStrn"for i As Integer = 0 to length - 1 srclStrnGm.StringValue( i, 1 ) = MidB( charset, r.InRange( 1, charsetSize ), 1 ) srclStrnnextsrclStrn#else srclStrn"for i As Integer = 0 to length - 1 srclStrnAm.StringValue( i, 1 ) = MidB( charset, Rnd * charsetSize + 1, 1 ) srclStrnnextsrclStrn#endif srclStrnsrclStrnEreturn DefineEncoding( m.StringValue( 0, length ), charset.Encoding ) srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrnOlength As Integer = 8, charset As String = "0123456789ABCDEFGHJKLMNPQRSTUVWXYZ" rsltStrnString EndGInt MethGrupnameStrn SplitQuoted CompStrnVsblInt sorcGrup EncoInt srclStrn`Function SplitQuoted(source As String, delimiter As String, removeQuotes as Boolean) As String()srclStrn>// Same as RB's Split, except that it respects quoted strings. srclStrnsrclStrnDim out() As String srclStrnsrclStrnE// Easy cases: no occurrences of the separator, or no quotation marks srclStrn$if InStr( source, delimiter )=0 thensrclStrnout = Array( source ) srclStrn$elseif InStr( source, """" )= 0 thensrclStrn out = Split( source, delimiter )srclStrnelsesrclStrn3// Harder case: both separator and quotation marks. srclStrn(// We'll use InStrQuoted to help us out.srclStrn+Dim delimiterLen As Integer = delimiter.Len srclStrnDim startPos As Integer = 1 srclStrndo srclStrnHDim delimiterPos As Integer = InStrQuoted( startPos, source, delimiter )srclStrnif delimiterPos = 0 thensrclStrn// no more separators srclStrn"out.Append Mid( source, startPos ) srclStrnexitsrclStrnend if srclStrn;out.Append Mid( source, startPos, delimiterPos - startPos ) srclStrn&startPos = delimiterPos + delimiterLen srclStrnloopsrclStrnend if srclStrnsrclStrn+// Finally, strip quotes if asked to do so. srclStrnC// (Including the case of a start quote without an end quote, which srclStrn#// could happen in the last field.) srclStrnif removeQuotes thensrclStrn%for i As Integer = 0 to UBound( out ) srclStrnDim s As String = out(i)srclStrnif s.LeftB( 1 ) = """" then srclStrnif s.RightB( 1 ) = """" thensrclStrn!out(i) = MidB( s, 2, s.LenB - 2 ) srclStrnelsesrclStrnout(i) = MidB( s, 2 ) srclStrnend if srclStrnend if srclStrnnextsrclStrnend if srclStrnsrclStrn return out srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn>source As String, delimiter As String, removeQuotes as Boolean rsltStrnString()EndGInt MethGrupnameStrn JoinQuoted CompStrnVsblInt sorcGrupLEncoInt srclStrnFFunction JoinQuoted(fields() as String, delimiter as String) As String srclStrnI// Join the given strings with a delimiter, just like RB's intrinsic Join srclStrnC// method, except that if any of the fields contains the delimiter, srclStrn=// that item will be surrounded by quotes in the output. See srclStrn(// SplitQuoted for the inverse function.srclStrnsrclStrn?// Approach: copy the items into a second array, putting quotes srclStrn?// around any that contain the delimiter, then Join them. This srclStrn2// way we don't mutate the array that's passed in. srclStrnsrclStrnDim quoted() As String srclStrn$Dim ub As Integer = UBound( fields )srclStrnRedim quoted( ub ) srclStrnfor i As Integer = 0 to ub srclStrnDim fld As String = fields(i) srclStrn#if Instr( fld, Delimiter ) > 0 then srclStrnquoted(i) = """" + fld + """" srclStrnelsesrclStrnquoted(i) = fld srclStrnend if srclStrnnextsrclStrnsrclStrn return Join( quoted, delimiter )srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn'fields() as String, delimiter as String rsltStrnString EndGInt MethGrup nameStrn EncodeCase CompStrnVsblInt sorcGrup EncoInt srclStrn*Function EncodeCase(s As String) As String srclStrnR// Return a version of the given string that encodes the uppercase/lowercase state srclStrnR// of each letter as follows: every time we switch from uppercase to lowercase, we srclStrnX// insert a "^". A "^" in the original string will be represented as "^^". Finally, wesrclStrnU// will assume lowercase at the beginning of the string (so an initial capital letter srclStrn// will be preceded by "^").srclStrn// srclStrnQ// This can be useful for doing things like case-sensitive lookup of strings in a srclStrn2// Dictionary, which is normally case insensitive. srclStrn// srclStrn-// For the inverse operation, see DecodeCase. srclStrnsrclStrn&Dim chars() As String = Split( s, "" ) srclStrn#Dim inUpperState As Boolean = false srclStrnDim idx As Integer srclStrnDim anyUpper As Boolean srclStrnfor idx = 0 to UBound( chars ) srclStrnDim c As String = chars(idx)srclStrnif c = "^" then srclStrn0// got a caret in the original string; double itsrclStrnchars.Insert idx, "^" srclStrn idx = idx + 1 srclStrnelsesrclStrnI// determine whether the given character fails to match the current state srclStrn!Dim codepoint As Integer = Asc(c) srclStrnDim switchCase As Boolean srclStrnif inUpperState thensrclStrnif codepoint < 128 then srclStrn(// lowercase ASCII ranges from 97 to 122srclStrn3switchCase = (codepoint >= 97 and codepoint <= 122) srclStrnelsesrclStrnP// if not ASCII, use RB's routines to see if it'd be any different in upper casesrclStrn/switchCase = StrComp( c, Uppercase(c), 0 ) <> 0 srclStrnend if srclStrnelsesrclStrnif codepoint < 128 then srclStrn'// uppercase ASCII ranges from 65 to 90 srclStrn2switchCase = (codepoint >= 65 and codepoint <= 90) srclStrnelsesrclStrnP// if not ASCII, use RB's routines to see if it'd be any different in lower casesrclStrn/switchCase = StrComp( c, Lowercase(c), 0 ) <> 0 srclStrnend if srclStrn"if switchCase then anyUpper = true srclStrnend if srclStrnif switchCase then srclStrn// yep, time to switch case srclStrnchars.Insert idx, "^" srclStrn idx = idx + 1 srclStrninUpperState = not inUpperState srclStrnend if srclStrnend if srclStrnnextsrclStrnsrclStrn(Dim result As String = Join( chars, "" )srclStrn-if anyUpper then result = Lowercase( result ) srclStrn return result srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn s As String rsltStrnString EndGInt MethGrupnameStrn DecodeCase CompStrnVsblInt sorcGrup,EncoInt srclStrn*Function DecodeCase(s As String) As String srclStrnJ// This function undoes the encoding of case done by EncodeCase, resulting srclStrn// in the original string. srclStrnsrclStrn'Dim parts() As String = Split( s, "^" ) srclStrn.for i As Integer = 1 to UBound( parts ) step 2 srclStrnif parts(i) = "" then srclStrnparts(i) = "^" srclStrnelsesrclStrn parts(i) = Uppercase( parts(i) )srclStrnend if srclStrnnextsrclStrnreturn Join( parts, "" )srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn s As String rsltStrnString EndGInt MethGrupnameStrnReverse CompStrnVsblInt sorcGrupEncoInt srclStrn'Function Reverse(s As String) As String srclStrn1// Return s with the characters in reverse order. srclStrnsrclStrnif Len(s) < 2 then return s srclStrnsrclStrn+Dim characters() as String = Split( s, "" ) srclStrnDim leftIndex as Integer = 0srclStrn.Dim rightIndex as Integer = UBound(characters) srclStrn#pragma BackgroundTasks False srclStrnWhile leftIndex < rightIndexsrclStrn*Dim temp as String = characters(leftIndex) srclStrn.characters(leftIndex) = characters(rightIndex) srclStrncharacters(rightIndex) = temp srclStrnleftIndex = leftIndex + 1 srclStrnrightIndex = rightIndex - 1 srclStrnWendsrclStrnReturn Join( characters, "" ) srclStrnsrclStrn End FunctionEndGInt EncoInt AlasStrnflagInt shrdInt parmStrn s As String rsltStrnString EndGInt MethGrupnameStrn LineEnding CompStrnVsblInt sorcGrupH EncoInt srclStrn*Function LineEnding(s As String) As String srclStrnU// Return the first line ending (of any standard sort: Unix, classic Mac, or Windows) srclStrnS// which is found in the given string. If none is found, return standard EndOfLine srclStrn%// for the platform we're running on. srclStrnsrclStrnR// The code below can't deal with UTF-16, but should deal fine with anything else. srclStrnP// So, in those rare cases where we have UTF-16, let's convert. This could be asrclStrnC// performance bottleneck if you call this on large UTF-16 strings. srclStrnLif s.Encoding = Encodings.UTF16 then s = s.ConvertEncoding( Encodings.UTF8 )srclStrnsrclStrnT// Loop over the bytes of the string until we find a 13 or 10. A line ending shouldsrclStrnA// be either 13 alone (Mac), 10 alone (Unix), or 13+10 (Windows). srclStrnDim posB, maxPosB As IntegersrclStrnmaxPosB = LenB( s ) srclStrnfor posB = 1 to maxPosB srclStrn-Dim b As Integer = AscB( MidB( s, posB, 1 ) ) srclStrnif b = 10 then srclStrnreturn Chr(10) srclStrnelseif b = 13 then srclStrnBif AscB( MidB( s, posB+1, 1 ) ) = 10 then return Chr(13) + Chr(10) srclStrnreturn Chr(13) srclStrnend if srclStrnnextsrclStrnsrclStrnreturn EndOfLinesrclStrnsrclStrn End FunctionEndGInt  EncoInt AlasStrnflagInt shrdInt parmStrn s As String rsltStrnString EndGInt MethGrupp!nameStrn InStrQuoted CompStrnVsblInt sorcGrup"EncoInt srclStrnWFunction InStrQuoted(start As Integer = 1, source As String, find As String) As Integer srclStrnJ// This is the same as the built-in InStr function, except that it ignores srclStrn1// any occurrence of "find" within double quotes. srclStrnsrclStrnsrclStrndo srclStrnL// Find the next occurrence of the search string. If none, then we're done.srclStrn6Dim foundPos As Integer = InStr( start, source, find ) srclStrn$if foundPos < 1 then return foundPossrclStrnsrclStrn?// Now, also find the next quotation mark; if this comes before srclStrnA// our foundPos, then we need to ignore that and resume searching srclStrn3// after the closing quote. Otherwise, we're done. srclStrn6Dim quotePos As Integer = InStr( start, source, """" ) srclStrn;if quotePos = 0 or quotePos > foundPos then return foundPos srclStrnsrclStrn@Dim closeQuotePos As Integer = InStr( quotePos+1, source, """" )srclStrn[if closeQuotePos = 0 then return 0 // no closing quote, treat whole end of string as quoted srclStrnsrclStrnstart = closeQuotePos + 1 srclStrnloopsrclStrnsrclStrn End FunctionEndGInt "EncoInt AlasStrnflagInt shrdInt parmStrn6start As Integer = 1, source As String, find As String rsltStrnInteger EndGInt !MethGrup#nameStrnChopCompStrnVsblInt sorcGrup$EncoInt srclStrn;Function Chop(s As String, stringToCut As String) As String srclStrnD// Chops 'stringToCut' off of s, if stringToCut is found at the end.srclStrnB// Useful for removing file extensions, trailing punctuation, etc. srclStrnsrclStrn'Dim cutLen As Integer = stringToCut.Len srclStrn&if Right(s, cutLen) = stringToCut then srclStrnreturn s.Left( s.Len - cutLen ) srclStrnelsesrclStrnreturn ssrclStrnend if srclStrnsrclStrnsrclStrn End FunctionEndGInt $EncoInt AlasStrnflagInt shrdInt parmStrn"s As String, stringToCut As String rsltStrnString EndGInt #MethGrup%nameStrnChopB CompStrnVsblInt sorcGrup&EncoInt srclStrn- Made all functions available to console apps except Sprintf. ntlnStrnntlnStrn2006-APR-10: version 1.5ntlnStrn'- Improved speed of HexB substantially. ntlnStrnG- Adjusted Random so that it should work in 5.5 and earlier (untested). ntlnStrn-- Added SplitQuoted and JoinQuoted functions. ntlnStrn,- Added EncodeCase and DecodeCase functions.ntlnStrnntlnStrn2006-JUN-29: version 1.6ntlnStrnJ- Fixed buggy handling of "%%" in Sprintf, and made it so that unspecified ntlnStrnI values are output as if you had specified 0; also changed %c to output ntlnStrn0 a Unicode character for the given code point.ntlnStrnE- Improved speed of Reverse and ReverseB (thanks to Charles Yeomans). ntlnStrnI Note that I'm not sure whether the new code works in 5.5; somebody who ntlnStrnI has 5.5 is going to have to start helping with that (if anyone cares). ntlnStrnG- Added new LineEnding function, that returns the first line ending (of ntlnStrn2 any standard sort) that is found in the string. ntlnStrnntlnStrn2006-AUG-08: version 1.7ntlnStrn- Added InStrQuoted function. ntlnStrnG- Rewrote SplitQuoted in terms of InStrQuoted. This fixed several bugs ntlnStrnD in the previous implementation, including an infinite loop and anntlnStrn; OutOfBoundsException that could occur on certain inputs. ntlnStrnG- Rewrote NthFieldQuoted in terms of InStrQuoted, just to make the code ntlnStrnJ simpler and more consistent. This should cause no changes in behavior. ntlnStrnntlnStrn2006-SEP-06: version 1.8ntlnStrnP- Fixed a bug in EndsWithB that would cause it to fail on multi-byte characters.ntlnStrnL- Added versions of Chop and ChopB that specify a string to chop off, ratherntlnStrn than a number of characters. ntlnStrnE- Dramatically improved the speed of Squeeze. NOTE: Also changed the ntlnStrnK behavior slightly. Squeeze now uses standard, non-binary text matching. ntlnStrnG- A new function, SqueezeB, is now provided for binary squeezing. Both ntlnStrnO versions are substantially faster than the old one, which always did binary, ntlnStrn4 but existing code may want to switch to SqueezeB.EndGInt .flagInt EndGInt -NoteGrup/nameStrnLicense CompStrnVsblInt sorcGrup40EncoInt ntlnStrnLicense ntlnStrnntlnStrnPThis StringUtils module is in the public domain. You may use it for any purposentlnStrnNwhatsoever, but it comes with no express or implied warranty of correctness or ntlnStrnfitness for any purpose.ntlnStrnntlnStrnShare and enjoy!EndGInt 0flagInt EndGInt /NoteGrup 1nameStrn Most Wanted CompStrnVsblInt sorcGrup2EncoInt ntlnStrn Most Wanted ntlnStrnOFeatures we'd really like to have, but haven't yet found the time to implement: ntlnStrnntlnStrn...none at the moment! EndGInt 2flagInt EndGInt 1PropGrup3nameStrnmThousandsSeparator CompStrnVsblInt sorcGrupH4EncoInt srclStrnmThousandsSeparator As String srclStrnEndGInt 4EncoInt declStrnmThousandsSeparator As String flagInt !shrdInt EndGInt 3PropGrup5nameStrnmDecimalSeparator CompStrnVsblInt sorcGrupD6EncoInt srclStrnmDecimalSeparator As String srclStrnEndGInt 6EncoInt declStrnmDecimalSeparator As String flagInt !shrdInt EndGInt 5PropGrup7nameStrn mControlChars CompStrnVsblInt sorcGrup@8EncoInt srclStrnmControlChars As String srclStrnEndGInt 8EncoInt declStrnmControlChars As String flagInt !shrdInt EndGInt 7VwBhGrup9VwPrGrupD:NameStrnNameVsblInt PrGpStrnID CPifStrnObject EndGInt :VwPrGrup`;NameStrnIndex VsblInt PrGpStrnID PValStrn -2147483648 CPifStrnObject EndGInt ;VwPrGrupHNameStrnTop VsblInt PrGpStrnPositionPValStrn0 CPifStrnObject EndGInt >EndGInt 9PadnPadnP********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************BlokpVewW[DNameStrnAboutBoxContInt paswStrnbClsInt SuprStrnWindow flagInt bNtrInt CompStrnPDefGrup<?nameStrnImplicitInstanceEncoInt PValStrnTrueEndGInt ?PDefGrup$@nameStrnMenuBar PValStrnEndGInt @PDefGrup(AnameStrn MacProcID PValInt EndGInt APDefGrup0BnameStrnMinimizeButton PValStrnTrueEndGInt BPDefGrup4CnameStrnMaximizeButton PValStrnFalse EndGInt CPDefGrup,DnameStrn LiveResize PValStrnTrueEndGInt DPDefGrup0EnameStrn Resizeable PValStrnFalse EndGInt EPDefGrup,FnameStrn CloseButton PValStrnTrueEndGInt FPDefGrup0GnameStrnMenuBarVisible PValStrnTrueEndGInt GPDefGrup0HnameStrn FullScreen PValStrnFalse EndGInt HPDefGrup(InameStrnVisible PValStrnTrueEndGInt IPDefGrup8JnameStrnTitle EncoInt PValStrnAbout EndGInt JPDefGrup$KnameStrnBackdropPValStrnEndGInt KPDefGrup(LnameStrn BackColor PValInt EndGInt LPDefGrup0MnameStrn HasBackColorPValStrnFalse EndGInt MPDefGrup0NnameStrn Composite PValStrnFalse EndGInt NPDefGrup$OnameStrnFrame PValInt EndGInt OPDefGrup(PnameStrn MaxHeight PValInt }EndGInt PPDefGrup$QnameStrnMaxWidthPValInt }EndGInt QPDefGrup(RnameStrn MinHeight PValInt @EndGInt RPDefGrup$SnameStrnMinWidthPValInt @EndGInt SPDefGrup$TnameStrnHeight PValInt EndGInt TPDefGrup$UnameStrnWidth PValInt EndGInt UPDefGrup(VnameStrn Placement PValInt EndGInt VVwBhGrupWVwPrGrupDXNameStrnNameVsblInt PrGpStrnID CPifStrnWindow EndGInt XVwPrGrupLYNameStrn Interfaces VsblInt PrGpStrnID CPifStrnWindow EndGInt YVwPrGrupHZNameStrnSuper VsblInt PrGpStrnID CPifStrnWindow EndGInt ZVwPrGrup0[NameStrn Placement VsblInt PrGpStrnPositionPValStrn0 typeStrnInteger vbETStrnEnumCPifStrnWindow EnumGrup\defnStrn 0 - Default defnStrn1 - Parent Window defnStrn2 - Main Screen defnStrn3 - Parent Window ScreendefnStrn 4 - Stagger EndGInt \EndGInt [VwPrGrupp]NameStrnWidth VsblInt PrGpStrnPositionPValStrn600 typeStrnInteger CPifStrnWindow EndGInt ]VwPrGrupp^NameStrnHeight VsblInt PrGpStrnPositionPValStrn400 typeStrnInteger CPifStrnWindow EndGInt ^VwPrGrupp_NameStrnMinWidthVsblInt PrGpStrnPositionPValStrn64 typeStrnInteger CPifStrnWindow EndGInt _VwPrGrupt`NameStrn MinHeight VsblInt PrGpStrnPositionPValStrn64 typeStrnInteger CPifStrnWindow EndGInt `VwPrGruptaNameStrnMaxWidthVsblInt PrGpStrnPositionPValStrn32000 typeStrnInteger CPifStrnWindow EndGInt aVwPrGrupxbNameStrn MaxHeight VsblInt PrGpStrnPositionPValStrn32000 typeStrnInteger CPifStrnWindow EndGInt bVwPrGrup cNameStrnFrame VsblInt PrGpStrn Appearance PValStrn0 typeStrnInteger vbETStrnEnumCPifStrnWindow EnumGruppddefnStrn 0 - DocumentdefnStrn1 - Movable Modal defnStrn2 - Modal DialogdefnStrn3 - Floating Window defnStrn 4 - Plain Box defnStrn5 - Shadowed BoxdefnStrn6 - Rounded Window defnStrn7 - Global Floating Window defnStrn8 - Sheet WindowdefnStrn9 - Metal WindowdefnStrn10 - Drawer Window defnStrn11 - Modeless DialogEndGInt dEndGInt cVwPrGrup|eNameStrn Composite VsblInt PrGpStrn Appearance PValStrnFalse typeStrnBoolean CPifStrnWindow EndGInt eVwPrGrup|fNameStrn HasBackColorVsblInt PrGpStrn Appearance PValStrnFalse typeStrnBoolean CPifStrnWindow EndGInt fVwPrGrup|gNameStrn BackColor VsblInt PrGpStrn Appearance PValStrn&hFFFFFFtypeStrnColor CPifStrnWindow EndGInt gVwPrGrupxhNameStrnBackdropVsblInt PrGpStrn Appearance typeStrnPicture vbETStrnPicture CPifStrnWindow EndGInt hVwPrGrupxiNameStrnTitle VsblInt PrGpStrn Appearance PValStrnUntitledtypeStrnString CPifStrnWindow EndGInt iVwPrGruptjNameStrnVisible VsblInt PrGpStrn Appearance PValStrnTruetypeStrnBoolean CPifStrnWindow EndGInt jVwPrGrup|kNameStrn FullScreen VsblInt PrGpStrn Appearance PValStrnFalse typeStrnBoolean CPifStrnWindow EndGInt kVwPrGrup|lNameStrnMenuBarVisible VsblInt PrGpStrn Appearance PValStrnTruetypeStrnBoolean CPifStrnWindow EndGInt lVwPrGrupxmNameStrn CloseButton VsblInt PrGpStrn Appearance PValStrnTruetypeStrnBoolean CPifStrnWindow EndGInt mVwPrGrup|nNameStrn Resizeable VsblInt PrGpStrn Appearance PValStrnFalse typeStrnBoolean CPifStrnWindow EndGInt nVwPrGrupxoNameStrn LiveResize VsblInt PrGpStrn Appearance PValStrnTruetypeStrnBoolean CPifStrnWindow EndGInt oVwPrGruppNameStrnMaximizeButton VsblInt PrGpStrn Appearance PValStrnFalse typeStrnBoolean CPifStrnWindow EndGInt pVwPrGrup|qNameStrnMinimizeButton VsblInt PrGpStrn Appearance PValStrnTruetypeStrnBoolean CPifStrnWindow EndGInt qVwPrGrupxrNameStrn MacProcID VsblInt PrGpStrn Appearance PValStrn0 typeStrnInteger CPifStrnWindow EndGInt rVwPrGrupxsNameStrnMenuBar VsblInt PrGpStrn Appearance typeStrnMenuBar vbETStrnMenuBar CPifStrnWindow EndGInt sVwPrGrup|tNameStrnImplicitInstanceVsblInt PrGpStrn Appearance PValStrnTruevbETStrnBoolean CPifStrnWindow EndGInt tEndGInt WCnstGrupunameStrnkLinkPressedColor CompStrnVsblInt EncoInt nameStrnkLinkPressedColor typeInt defnStrn&c880088flagInt EndGInt uCnstGrupvnameStrn kLinkUpColorCompStrnVsblInt EncoInt nameStrn kLinkUpColortypeInt defnStrn&c000088flagInt EndGInt vCBhvGrupwSuprStrn StaticText EndGInt wCBhvGrupxSuprStrn StaticText HInsGrupynameStrnOpenCompStrnVsblInt sorcGrupzEncoInt srclStrn Sub Open() srclStrn-me.MouseCursor = System.Cursors.FingerPointer srclStrnsrclStrnEnd Sub EndGInt zEndGInt yHInsGrup {nameStrn MouseDown CompStrnVsblInt sorcGrup|EncoInt srclStrn9Function MouseDown(X As Integer, Y As Integer) As Boolean srclStrn me.TextColor = kLinkPressedColorsrclStrn return True srclStrnsrclStrn End FunctionEndGInt |EndGInt {HInsGrupt}nameStrn MouseDrag CompStrnVsblInt sorcGrup(~EncoInt srclStrn)Sub MouseDrag(X As Integer, Y As Integer) srclStrn:if X > 0 and X < me.Width and Y > 0 and Y < me.Height then srclStrn me.TextColor = kLinkPressedColorsrclStrnelsesrclStrnme.TextColor = kLinkUpColor srclStrnend if srclStrnsrclStrnEnd Sub EndGInt ~EndGInt }HInsGrup8nameStrnMouseUp CompStrnVsblInt sorcGrupEncoInt srclStrn'Sub MouseUp(X As Integer, Y As Integer) srclStrn(if me.TextColor = kLinkPressedColor thensrclStrnShowURL me.Text srclStrnme.TextColor = kLinkUpColor srclStrnend if srclStrnsrclStrnEnd Sub EndGInt EndGInt EndGInt xCtrlGrupcclsStrn StaticText nameStrn StaticText PDefGrup8nameStrn InitialParent EncoInt PValStrnEndGInt PDefGrup4nameStrn DataField EncoInt PValStrnEndGInt PDefGrup4nameStrn DataSource EncoInt PValStrnEndGInt PDefGrup(nameStrn Underline PValStrnEndGInt PDefGrup$nameStrnItalic PValStrnEndGInt PDefGrup$nameStrnBoldPValStrnTrueEndGInt PDefGrup$nameStrnTextSizePValInt EndGInt PDefGrup8nameStrnTextFontEncoInt PValStrnSystem EndGInt PDefGrup0nameStrnAutoDeactivate PValStrnTrueEndGInt PDefGrup0nameStrnHelpTag EncoInt PValStrnEndGInt PDefGrup(nameStrnVisible PValStrnTrueEndGInt PDefGrup(nameStrnEnabled PValStrnTrueEndGInt PDefGrup(nameStrn Multiline PValStrnEndGInt PDefGrup(nameStrn TextColor PValInt EndGInt PDefGrup(nameStrn TextAlign PValInt EndGInt PDefGrup<nameStrnTextEncoInt PValStrnAVRBL DownloaderEndGInt PDefGrup$nameStrnTabIndexPValInt EndGInt PDefGrup,nameStrn TabPanelIndex PValInt EndGInt PDefGrup(nameStrn LockBottom PValStrnEndGInt PDefGrup(nameStrn LockRight PValStrnEndGInt PDefGrup$nameStrnLockTop PValStrnEndGInt PDefGrup$nameStrnLockLeftPValStrnEndGInt PDefGrup$nameStrnHeight PValInt EndGInt PDefGrup$nameStrnWidth PValInt VEndGInt PDefGrup nameStrnTop PValInt EndGInt PDefGrup nameStrnLeftPValInt BEndGInt PDefGrup(nameStrnScope PValStrn0 EndGInt PDefGrup<nameStrnSuper EncoInt PValStrn StaticText EndGInt PDefGrup$nameStrnIndex PValInt EndGInt PDefGrup4nameStrnNameEncoInt PValStrnLabel EndGInt CBixInt iLckInt EndGInt CtrlGrup@cclsStrn StaticText nameStrn StaticText PDefGrup8nameStrn InitialParent EncoInt PValStrnEndGInt PDefGrup4nameStrn DataField EncoInt PValStrnEndGInt PDefGrup4nameStrn DataSource EncoInt PValStrnEndGInt PDefGrup(nameStrn Underline PValStrnEndGInt PDefGrup$nameStrnItalic PValStrnEndGInt PDefGrup(nameStrnBoldPValStrnFalse EndGInt PDefGrup$nameStrnTextSizePValInt EndGInt PDefGrup<nameStrnTextFontEncoInt PValStrn SmallSystem EndGInt PDefGrup0nameStrnAutoDeactivate PValStrnTrueEndGInt PDefGrup0nameStrnHelpTag EncoInt PValStrnEndGInt PDefGrup(nameStrnVisible PValStrnTrueEndGInt PDefGrup(nameStrnEnabled PValStrnTrueEndGInt PDefGrup,nameStrn Multiline PValStrnTrueEndGInt PDefGrup(nameStrn TextColor PValInt EndGInt PDefGrup(nameStrn TextAlign PValInt EndGInt PDefGrupXnameStrnTextEncoInt PValStrn,by Joe Strout (joe@strout.net) February 2009EndGInt PDefGrup$nameStrnTabIndexPValInt EndGInt PDefGrup,nameStrn TabPanelIndex PValInt EndGInt PDefGrup(nameStrn LockBottom PValStrnEndGInt PDefGrup(nameStrn LockRight PValStrnEndGInt PDefGrup$nameStrnLockTop PValStrnEndGInt PDefGrup$nameStrnLockLeftPValStrnEndGInt PDefGrup$nameStrnHeight PValInt EndGInt PDefGrup$nameStrnWidth PValInt VEndGInt PDefGrup nameStrnTop PValInt &EndGInt PDefGrup nameStrnLeftPValInt BEndGInt PDefGrup(nameStrnScope PValStrn0 EndGInt PDefGrup<nameStrnSuper EncoInt PValStrn StaticText EndGInt PDefGrup$nameStrnIndex PValInt EndGInt PDefGrup4nameStrnNameEncoInt PValStrnLabel EndGInt CBixInt iLckInt EndGInt CtrlGrup cclsStrn StaticText nameStrn StaticText PDefGrup8nameStrn InitialParent EncoInt PValStrnEndGInt PDefGrup4nameStrn DataField EncoInt PValStrnEndGInt PDefGrup4nameStrn DataSource EncoInt PValStrnEndGInt PDefGrup(nameStrn Underline PValStrnEndGInt PDefGrup$nameStrnItalic PValStrnEndGInt PDefGrup(nameStrnBoldPValStrnFalse EndGInt PDefGrup$nameStrnTextSizePValInt EndGInt PDefGrup<nameStrnTextFontEncoInt PValStrn SmallSystem EndGInt PDefGrup0nameStrnAutoDeactivate PValStrnTrueEndGInt PDefGrup0nameStrnHelpTag EncoInt PValStrnEndGInt PDefGrup(nameStrnVisible PValStrnTrueEndGInt PDefGrup(nameStrnEnabled PValStrnTrueEndGInt PDefGrup,nameStrn Multiline PValStrnTrueEndGInt PDefGrup(nameStrn TextColor PValInt EndGInt PDefGrup(nameStrn TextAlign PValInt EndGInt PDefGrupnameStrnTextEncoInt PValStrnThis program allows you to download code to AVR microcontrollers equipped with the AVRBL bootloader from Progressive Resources. That includes, for example, the RoboBuilder humanoid robot. For more details and the latest version, see: EndGInt PDefGrup$nameStrnTabIndexPValInt EndGInt PDefGrup,nameStrn TabPanelIndex PValInt EndGInt PDefGrup(nameStrn LockBottom PValStrnEndGInt PDefGrup(nameStrn LockRight PValStrnEndGInt PDefGrup$nameStrnLockTop PValStrnEndGInt PDefGrup$nameStrnLockLeftPValStrnEndGInt PDefGrup$nameStrnHeight PValInt QEndGInt PDefGrup$nameStrnWidth PValInt EndGInt PDefGrup nameStrnTop PValInt PEndGInt PDefGrup nameStrnLeftPValInt _EndGInt PDefGrup(nameStrnScope PValStrn0 EndGInt PDefGrup<nameStrnSuper EncoInt PValStrn StaticText EndGInt PDefGrup$nameStrnIndex PValInt EndGInt PDefGrup4nameStrnNameEncoInt PValStrnLabel EndGInt CBixInt iLckInt EndGInt CtrlGrup`cclsStrn StaticText nameStrn StaticText PDefGrup8nameStrn InitialParent EncoInt PValStrnEndGInt PDefGrup4nameStrn DataField EncoInt PValStrnEndGInt PDefGrup4nameStrn DataSource EncoInt PValStrnEndGInt PDefGrup,nameStrn Underline PValStrnTrueEndGInt PDefGrup$nameStrnItalic PValStrnEndGInt PDefGrup nameStrnBoldPValStrnEndGInt PDefGrup$nameStrnTextSizePValInt EndGInt PDefGrup<nameStrnTextFontEncoInt PValStrn SmallSystem EndGInt PDefGrup0nameStrnAutoDeactivate PValStrnTrueEndGInt PDefGrup0nameStrnHelpTag EncoInt PValStrnEndGInt PDefGrup(nameStrnVisible PValStrnTrueEndGInt PDefGrup(nameStrnEnabled PValStrnTrueEndGInt PDefGrup(nameStrn Multiline PValStrnEndGInt PDefGrup8nameStrn TextColor PValStrn #kLinkUpColor EndGInt PDefGrup(nameStrn TextAlign PValInt EndGInt PDefGruplnameStrnTextEncoInt PValStrn?http://www.strout.net/info/robotics/utilities/avrbl-downloader/ EndGInt PDefGrup$nameStrnTabIndexPValInt EndGInt PDefGrup,nameStrn TabPanelIndex PValInt EndGInt PDefGrup(nameStrn LockBottom PValStrnEndGInt PDefGrup(nameStrn LockRight PValStrnEndGInt PDefGrup$nameStrnLockTop PValStrnEndGInt PDefGrup$nameStrnLockLeftPValStrnEndGInt PDefGrup$nameStrnHeight PValInt EndGInt PDefGrup$nameStrnWidth PValInt EndGInt PDefGrup nameStrnTop PValInt EndGInt PDefGrup nameStrnLeftPValInt EndGInt PDefGrup(nameStrnScope PValStrn0 EndGInt PDefGrup<nameStrnSuper EncoInt PValStrn StaticText EndGInt PDefGrup$nameStrnIndex PValInt EndGInt PDefGrup8nameStrnNameEncoInt PValStrn StaticText1 EndGInt CBixInt iLckInt EndGInt PadnPadnd****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************BlokpUIsWnStGrupDOTabGrupContInt eSptInt  EndGInt OTabGrupdContInt K ;LSptInt RSptInt ScrXInt ScrYInt lstHInt @lstVInt @CtrlInt EndGInt OTabGrup@ContInt K ;AltEInt LSptInt EEstInt ciIDInt EndGInt LsLcStrnMainWindow.SetState rEdtRect,bEndGInt PadnPadnx********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************EOF!