' ---------------------------------------------------------------------------------------
' Nombre / Name                                                                       1.5
' -------------
'   SGetArg$(cad$,p%,template$)
'
' ¿Qué hace? / What do it?
' ------------------------
'   Obtiene y procesa la cadena de argumentos CLI.
'   Get and process the CLI argument(s) string
'
' Argumentos / Arguments
' ----------------------
'   cad$         Cadena de argumentos CLI/Shell
'                (habitualmente obtenida con COMMAND$).
'                CLI/Shell arguments string
'                (habitually the string returned by COMMAND$).
'
'   p%           Nº (posición) del argumento pedido. Número entero >=1.
'                The argument asked (position).  Integer number >=1.
'
'   template$    Cadena de sintaxis.
'                The template string.
'
' Devuelve / Returns
' ------------------
'   O una cadena nula
'   (no existe el argumento nº "p%" pedido) O el argumento solicitado.
'   Or a null string
'   (don't exists the argument #"p%") OR the argument requested.
'
' Requiere / Requires
' -------------------
'   --
'
' ---------------------------------------------------------------------------------------

FUNCTION SGetArg$(cad$,p%,template$)
LOCAL num%,quotes%,char%,cadtmp$,a%

	SGetArg$ = ""

	'                  Anti bad coders };D. Remember! p% must be >=1 !!
	'   Protección contra malos programadores };D. Recuerde ¡¡ p% ha de ser >=1 !!
	' ------------------------------------------------------------------------------
	IF p% <=0 THEN p%=1

	WHILE cad$ <> ""

		'           Removing not necesary spaces (start/end)
		'   Suprimir espacios innecesarios (inicio/final de la cadena)
		' --------------------------------------------------------------
		cad$=LTRIM$(RTRIM$(cad$))

		num%    = 1
		cadtmp$ = ""
		quotes% = 0

		FOR a%=1 TO LEN(cad$)

			char%=ASC(MID$(cad$,a%,1))

				SELECT CASE char%

					'        Modifying quotes status
					'   Modificando estado de las comillas
					' --------------------------------------
					CASE 34
					quotes% = NOT quotes%

					'    Spaces/ Espacios
					' ----------------------
					CASE 32
					IF quotes% = 0 THEN
						'     The space is an arguments separator
						'   El espacio es un separador de argumentos
						' -------------------------------------------
						IF num%=p% THEN
							'           Parse arg asked... end
							'   Procesado argumento pedido... terminar
							' ------------------------------------------
							EXIT FOR
						ELSE
							'   Parse the next character (and argument)
							'  Procesar siguiente carácter (y argumento)
							' -------------------------------------------
							num%=num%+1%
							EXIT SELECT
						END IF
					ELSE
						'           To preserve space for the argument asked (quoted)
						'    Preservar espacios del argumento pedido si están entre comillas
						' ---------------------------------------------------------------------
						IF num%=p% THEN cadtmp$=cadtmp$+CHR$(char%)
					END IF

					'     Preserve others characters (only for the argument asked)
					'   Preservar el resto de los caracteres para el argumento pedido
					' -----------------------------------------------------------------
					CASE ELSE
					IF num%=p% THEN cadtmp$=cadtmp$+CHR$(char%)

				END SELECT

		NEXT a%

		cad$ = cadtmp$

		'                 Template info
		'   Información sobre la sintaxis del comando
		' ---------------------------------------------

		IF cad$ = "?" THEN

			'   Activar trampa para evitar "Input Past End"
			' No es una solución elegante... pero funciona ;)
			'                  --------
			'        Trap to avoid the "Input Past End"
			'        Not very elegant but this works ;)
			' -----------------------------------------------
				BREAK STOP

			ActivarTrampa:
				ON ERROR GOTO Trampa
				PRINT template$;
				INPUT ": ",cad$
			DesactivarTrampa:
				ON ERROR GOTO 0

				BREAK ON

		ELSE

			'            Exit point if cad$<>""
			'   Punto de salida de la función si cad$<>""
			' ---------------------------------------------
			SGetArg$ = cad$
			EXIT WHILE

		END IF

	WEND

	'            Exit point if cad$=""
	'   Punto de salida de la función si cad$=""
	' --------------------------------------------
	EXIT FUNCTION


' ------------------------
' Mi "tramposa" trampa X-D
'    My tricky trap X-D
' ------------------------
Trampa:

	'   Error "Input Past End" (cuando el usuario combina RUN y el argumento ?)
	' "Input Past End error" (if the user uses RUN and ? argument simulteanously)
	' ---------------------------------------------------------------------------
	IF ERR = 62 THEN
		' Como si no hubiese argumento
		'   As the argument is null
		' ----------------------------
		cad$ = ""
		RESUME DesactivarTrampa
	END IF

END FUNCTION

' ---------------------------------------------------------------------------------------
' Nombre / Name                                                                       1.0
' -------------
'   FixPath$(path$)
'
' ¿Qué hace? / What do it?
' ------------------------
'   Corrige un camino de acceso, absoluto o relativo,
'     añadiendo al final de éste "/" si es necesario.
'   Fix an absolute or relative path file
'     adding the "/" at end if this is necessary.
'
' Argumentos / Arguments
' ----------------------
'   path      CADENA / STRING
'             Camino de acceso a corregir / Path to fix.
'
' Devuelve / Returns
' ------------------
'   CADENA / STRING
'   Camino de acceso corregido / Path fixed.
'
' Requiere / Requires
' -------------------
'   --
'
' Ejemplo / Example
' -----------------
'
' PRINT FixPath$("RAM:Tmp")                 - > RAM:Tmp/
' PRINT FixPath$("SYS:")                    - > SYS:
' PRINT FixPath$("SYSTEM:Devs/Dosdrivers/") - > SYSTEM:Devs/Dosdrivers/
' ---------------------------------------------------------------------------------------

FUNCTION FixPath$(BYVAL path$)

	FixPath$ = path$

	IF RIGHT$(path$,1) <> "/" AND RIGHT$(path$,1) <> ":" THEN
		FixPath$ = path$ + "/"
	END IF

END FUNCTION

' ---------------------------------------------------------------------------------------
' Nombre / Name                                                                       1.0
' -------------
'   ChangeExt$(fname$,ext$)
'
' ¿Qué hace? / What do it?
' ------------------------
'   Cambia o añade en una cadena la extensión dada.
'   Change or add in a string the extension passed.
'
' Argumentos / Arguments
' ----------------------
'   fname     CADENA / STRING
'             Nombre del fichero inicial / Original filename
'
'   ext       CADENA / STRING
'             Nueva extensión / New extension
'
' Devuelve / Returns
' ------------------
'   CADENA / STRING
'   La nueva cadena / The new string.
'
' Requiere / Requires
' -------------------
'   --
'
' Ejemplo / Example
' -----------------
'
' PRINT ChangeExt$("Image","png")            - > Image.png
' PRINT ChangeExt$("","exe")                 - > .exe
' PRINT ChangeExt$("Document.fw","fwrite")   - > Document.fwrite
' PRINT ChangeExt$("Surprise.exe.asm","bin") - > Surprise.exe.bin
' ---------------------------------------------------------------------------------------

FUNCTION ChangeExt$(BYVAL fname$,BYVAL ext$)
LOCAL dummy&

	dummy& = RINSTR(fname$,".")

	IF dummy& <> 0& AND LEN(fname$) > 1& THEN
		fname$ = LEFT$(fname$,dummy&-1&)
	END IF

	ChangeExt$ = fname$ + "."+ ext$

END FUNCTION

' ---------------------------------------------------------------------------------------
