[bb] Commandline Splitting by Dan [ 1+ years ago ]

Started by BlitzBot, June 29, 2017, 00:28:40

Previous topic - Next topic

BlitzBot

Title : Commandline Splitting
Author : Dan
Posted : 1+ years ago

Description : This function Splits the Space separated Commandline parameters into the CMDLine type.
Usefull for getting the Filenames dropped from the explorer to the .exe file.

The Space chars between " " are ignored, so the whole parameter is passed to the Type.

With the Return value, you can check if any parameters were passed, or how many are in.


Code :
Code (blitzbasic) Select
; Version: 1.0
; Author: Dan (at www.blitzbasic.com forum)
; Email: -
; Copyright: PD
; Description: Returns space separated Commandline parameters
;              Parameter in Quotes ".." is passed as is
;              Read the description from the CommandLine_Init function
;====================================================================

;Put type declaration at the start:

Type CMDLine
     Field arg$
End Type

;Demo: uncomment to test, set the commandline in the IDE's options
;BB ide Menu: Program/Program Command Line ...
;c:b3d est.bmp /hlp "c:b 3dfile name.txt" c:windowswin.com /PNG /type bla bla .jpg c:dd1.jpg/ lala

;Graphics 1650,1050,32,2
;
;A=Commandline_Init()   ;Must be called first, to split the commandline into parts, it returns a number of Commands.
;;
;Print "Commandline Captured: "+a
;For x=1 To a
; Print x+" "+Commandline_Read$(x)
; Delay 100  ; needed only for the demo display slowdown
;Next
;WaitKey
;/Demo

Function Commandline_Read$(nr)
; Returns the commandline at index nr
If nr>0
this.CMDLine = First CMDLine
For this.CMDLine = Each CMDLine
x=x+1
If nr=x Then Return thisarg$
Next
End If
Return False
End Function

Function Commandline_Init()
;This function returns the number of commandline, added to the CMDline type
;To use this function in your program you have to declare the rules for passing the commandline to this app
;
;This function works as :
; Every commandline parameter will be split at the 1st space position
; example:/hlp c:files1.bmp
; will return 2 as parameter value and
;/hlp
;c:files1.bmp
;
;Space characters are stripped from each parameter, but not if they were enclosed in the Double Quote "
; singlequote ' and Doublesinglequote '' are ignored
; if the filename has space chars in it eg: My Birthdayphoto.jpg  the file passed to this program
; from the commandline shall be like this: "My Birthdaysphoto.jpg" (enclosed in quotes)
; This is automaticaly done in windows (8.1) when dropping files onto the .exe
; If the file/pathname contains a space char " " in it, the whole drive:path/filename.ext shall be enclosed in quotes
; eg. "c:my filesmy file.jpe g"
; This function does not check if the file exists, because the parameter can be nonfile, so it is on your part to do this
; This function returns an value of maximum parameters added, so you can check if anything were added aswell
; and access the single items within the limits of this value
; Call this function like: A=Commandline_Init()

qa$=CommandLine()
CMD_start=1
CMD_Quote=0
CMD_index=0
x=0
ca$=""
a$=""
If Len(qa$)=0 Goto CMDreadEnd

.CMDread
x=x+1  
ca$=ca$+Mid$(qa$,x,1)

;    Print LSet ("x="+x,6)+":"+Right$(Hex$(Asc(ca$)),2)+" = "+ca$+" --"+CMD_Start+" ->"+CMD_Quote    ; Uncomment for debug
a$=Trim(Mid$(qa$,CMD_Start,X-CMD_Start))
If ca$=" " And CMD_Quote=0
If CMD_Start=1
If a$>""
CMD_index=CMD_AddType(CMD_Index,a$)
EndIf

CMD_start=x
Else
   A$=Trim(Mid$(qa$,CMD_Start+1,X-CMD_Start))
If A$>""
CMD_index=CMD_AddType(CMD_Index,a$)
EndIf

CMD_Start=x
EndIf
EndIf

If ca$=Chr$(34)
If x-CMD_Start>0 And CMD_Quote=0
If a$>""
CMD_index=CMD_AddType(CMD_Index,a$)
EndIf
CMD_Start=x

EndIf
If CMD_Quote=0
CMD_Start=x+1
CMD_Quote=1
Else
   If a$>""
CMD_index=CMD_AddType(CMD_Index,a$)
EndIf
CMD_start=x+1
CMD_Quote=0

EndIf
EndIf

If x>Len(qa$)
If A$>""
  CMD_index=CMD_AddType(CMD_Index,a$)
EndIf
Goto CMDreadEnd
EndIf

ca$=""

Goto CMDread

.CMDreadEnd
    ;Print CMD_Index ;Uncomment for debug
Return CMD_index

End Function

Function CMD_AddType(index,A$)
;Used to shorten the code from the Commandline_Init() function
CMD_index=index+1
This.Cmdline = New CMDLine
thisarg$=A$
Return CMD_index
End Function


Comments : none...