diff --git a/TESTS/ut__foxbin2prg__c_conversor_bin_a_prg__indentarMemo.prg b/TESTS/ut__foxbin2prg__c_conversor_bin_a_prg__indentarMemo.prg
new file mode 100644
index 0000000..3a7f7dc
--- /dev/null
+++ b/TESTS/ut__foxbin2prg__c_conversor_bin_a_prg__indentarMemo.prg
@@ -0,0 +1,175 @@
+DEFINE CLASS ut__foxbin2prg__c_conversor_bin_a_prg__indentarMemo AS FxuTestCase OF FxuTestCase.prg
+
+ #IF .F.
+ LOCAL THIS AS ut__foxbin2prg__c_conversor_bin_a_prg__indentarMemo OF ut__foxbin2prg__c_conversor_bin_a_prg__indentarMemo.PRG
+ #ENDIF
+
+ #DEFINE C_FB2P_VALUE_I ''
+ #DEFINE C_FB2P_VALUE_F ''
+ #DEFINE CR_LF CHR(13) + CHR(10)
+ #DEFINE C_CR CHR(13)
+ #DEFINE C_LF CHR(10)
+ #DEFINE C_TAB CHR(9)
+ #DEFINE C_PROC 'PROCEDURE'
+ #DEFINE C_ENDPROC 'ENDPROC'
+ #DEFINE C_TEXT 'TEXT'
+ #DEFINE C_ENDTEXT 'ENDTEXT'
+ #DEFINE C_IF_F '#IF .F.'
+ #DEFINE C_ENDIF '#ENDIF'
+ #DEFINE C_DEFINE_CLASS 'DEFINE CLASS'
+ #DEFINE C_ENDDEFINE_CLASS 'ENDDEFINE'
+ icObj = NULL
+
+
+ *******************************************************************************************************************************************
+ FUNCTION SETUP
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ SET PROCEDURE TO 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ oFXU_LIB = CREATEOBJECT('CL_FXU_CONFIG')
+ oFXU_LIB.setup_comun()
+
+ THIS.icObj = NEWOBJECT("c_conversor_bin_a_prg", "FOXBIN2PRG.PRG")
+ loObj = THIS.icObj
+ loObj.l_Test = .T.
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION TearDown
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+ THIS.icObj = NULL
+
+ IF VARTYPE(oFXU_LIB) = "O"
+ oFXU_LIB.teardown_comun()
+ oFXU_LIB = NULL
+ ENDIF
+ RELEASE PROCEDURE 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Evaluate_results
+ LPARAMETERS toEx AS EXCEPTION, tnCodError_Esperado, tcMemo, tcMemo_Salida, tcMemo_Esperado
+
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+ LOCAL loObj AS c_conversor_bin_a_prg OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+
+ IF PCOUNT() = 0
+ THIS.messageout( "* Support method, not a valid test." )
+ RETURN .T.
+ ENDIF
+
+ IF ISNULL(toEx)
+ *-- Algunos ajustes para mejor visualización de caracteres especiales
+ tcMemo = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcMemo )
+ tcMemo_Esperado = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcMemo_Esperado )
+ tcMemo_Salida = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcMemo_Salida )
+
+ *-- Visualización de valores
+ THIS.messageout( ' Memo de entrada:' )
+ THIS.messageout( '[' + tcMemo + ']' )
+
+ THIS.messageout( REPLICATE('-',80) )
+
+ THIS.messageout( ' Memo esperado:' )
+ THIS.messageout( '[' + tcMemo_Esperado + ']' )
+
+
+ *-- Evaluación de valores
+ THIS.assertequals( '[' + tcMemo_Esperado + ']', '[' + tcMemo_Salida + ']', "Contenido del Memo de PROCEDURE" )
+
+ ELSE
+ *-- Evaluación de errores
+ THIS.messageout( "Error " + TRANSFORM(toEx.ERRORNO) + ', ' + TRANSFORM(toEx.MESSAGE) )
+ THIS.messageout( toEx.PROCEDURE + ', ' + TRANSFORM(toEx.LINENO) )
+ THIS.messageout( TRANSFORM(toEx.LINECONTENTS) )
+
+ THIS.assertequals( tnCodError_Esperado, toEx.ERRORNO, 'Error' )
+ ENDIF
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_evaluarUnMemo_PROCEDURE_YQuitarleLaCabecera_PROCEDURE_YElPie_ENDPROC_DejandoSoloElContenido
+ LOCAL lnCodError, lcMenError, lnCodError_Esperado ;
+ , lcMemo, lcMemo_Salida, lcMemo_Esperado ;
+ , loEx AS EXCEPTION
+ LOCAL loObj AS c_conversor_bin_a_prg OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+ loEx = NULL
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+
+ TEXT TO lcMemo TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ <<'PROCEDURE miMetodo'>>
+ Page1.Name = "Page1"
+ <<'ENDPROC'>>
+
+
+ ENDTEXT
+
+ *-- DATOS ESPERADOS
+ STORE 0 TO lnCodError_Esperado
+
+ TEXT TO lcMemo_Esperado TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ <><>Page1.Name = "Page1"
+ ENDTEXT
+
+
+ *-- TEST
+ lcMemo_Salida = loObj.IndentarMemo( @lcMemo, C_TAB+C_TAB )
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado, @lcMemo, @lcMemo_Salida, @lcMemo_Esperado )
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_evaluarUnMemo_PROCEDURE_YDarUnError_1098_Por_ProcedimientoSinCerrar
+ LOCAL lnCodError, lcMenError, lnCodError_Esperado ;
+ , lcMemo, lcMemo_Salida, lcMemo_Esperado ;
+ , loEx AS EXCEPTION
+ LOCAL loObj AS c_conversor_bin_a_prg OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+ loEx = NULL
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+
+ TEXT TO lcMemo TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ <<'PROCEDURE miMetodo'>>
+ Page1.Name = "Page1"
+
+
+ ENDTEXT
+
+ *-- DATOS ESPERADOS
+ STORE 0 TO lnCodError_Esperado
+ lnCodError_Esperado = 1098
+
+ TEXT TO lcMemo_Esperado TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
+ <><>Page1.Name = "Page1"
+ ENDTEXT
+
+
+ *-- TEST
+ TRY
+ lcMemo_Salida = loObj.IndentarMemo( @lcMemo, C_TAB+C_TAB )
+ CATCH TO loEx
+ ENDTRY
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado, @lcMemo, @lcMemo_Salida, @lcMemo_Esperado )
+
+ ENDFUNC
+
+
+ENDDEFINE
diff --git a/foxbin2prg.prg b/foxbin2prg.prg
index aa2a471..366af53 100644
--- a/foxbin2prg.prg
+++ b/foxbin2prg.prg
@@ -4823,7 +4823,8 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
ENDIF
*-- Genero el método SIN indentar, ya que se hace luego
- *TEXT TO tcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ *tcMethods2 = tcMethods
+ *TEXT TO tcMethods2 ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
* <<'PROCEDURE'>> <>
* <>
* <<'ENDPROC'>>
@@ -4832,7 +4833,6 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
tcMethods = tcMethods + CR_LF + 'PROCEDURE ' + tcMethodName
tcMethods = tcMethods + CR_LF + THIS.IndentarMemo( taCode(taMethods(I,2)) )
tcMethods = tcMethods + CR_LF + 'ENDPROC'
- tcMethods = tcMethods + CR_LF
ENDFOR
ENDIF
@@ -5073,7 +5073,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
LPARAMETERS tcMethod, tcIndentation
*-- INDENTA EL CÓDIGO DE UN MÉTODO DADO Y QUITA LA CABECERA DE MÉTODO (PROCEDURE/ENDPROC) SI LA ENCUENTRA
TRY
- LOCAL I, lcMethod, llProcedure, lnInicio, lnFin
+ LOCAL I, X, lcMethod, llProcedure, lnInicio, lnFin, laLineas(1)
lcMethod = ''
llProcedure = ( LEFT(tcMethod,10) == 'PROCEDURE ' ;
OR LEFT(tcMethod,17) == 'HIDDEN PROCEDURE ' ;
@@ -5083,6 +5083,24 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
IF VARTYPE(tcIndentation) # 'C'
tcIndentation = ''
ENDIF
+
+ *-- Quito las líneas en blanco luego del final del ENDPROC
+ X = 0
+ FOR I = lnFin TO 1 STEP -1
+ IF NOT EMPTY(laLineas(I)) && Última línea de código
+ IF LEFT( laLineas(I), 10 ) <> C_ENDPROC
+ ERROR 'Procedimiento sin cerrar. La última línea de código debe ser ENDPROC. [' + laLineas(1) + ']'
+ ENDIF
+ EXIT
+ ENDIF
+ X = X + 1
+ ENDFOR
+
+ IF X > 0
+ lnFin = lnFin - X
+ DIMENSION laLineas(lnFin)
+ ENDIF
+
*-- Si encuentra la cabecera de un PROCEDURE, la saltea
IF llProcedure
@@ -5377,26 +5395,29 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
LPARAMETERS tcMethods
*-- Finalmente, todos los métodos los ordeno y escribo juntos
- LOCAL laMethods(1), laCode(1), lnMethodCount, I
+ LOCAL laMethods(1), laCode(1), lnMethodCount, I, lcMethods, lcMethods2
IF NOT EMPTY(tcMethods)
+ STORE '' TO lcMethods, lcMethods2
DIMENSION laMethods(1,3)
THIS.SortMethod( @tcMethods, @laMethods, @laCode, '', @lnMethodCount )
FOR I = 1 TO lnMethodCount
*-- Genero los métodos indentados
- *TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ *TEXT TO lcMethods2 ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
* <><>PROCEDURE <>
* <>
* <>ENDPROC
*ENDTEXT
*-- Sustituyo el TEXT/ENDTEXT aquí porque a veces quita espacios de la derecha, y eso es peligroso
- C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + C_TAB + laMethods(I,3) + 'PROCEDURE ' + laMethods(I,1)
- C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + THIS.IndentarMemo( laCode(laMethods(I,2)), CHR(9) + CHR(9) )
- C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + C_TAB + 'ENDPROC'
- C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF
+ lcMethods = lcMethods + CR_LF + C_TAB + laMethods(I,3) + 'PROCEDURE ' + laMethods(I,1)
+ lcMethods = lcMethods + CR_LF + THIS.IndentarMemo( laCode(laMethods(I,2)), CHR(9) + CHR(9) )
+ lcMethods = lcMethods + CR_LF + C_TAB + 'ENDPROC'
+ lcMethods = lcMethods + CR_LF
ENDFOR
+
+ C_FB2PRG_CODE = C_FB2PRG_CODE + lcMethods
ENDIF
RETURN
@@ -5411,8 +5432,8 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
EXTERNAL ARRAY taMethods, taCode, taProtected, taPropsAndComments
TRY
- LOCAL lcMethod, lnProtectedItem, lnCommentRow, lcProcDef, lcMethods
- STORE '' TO lcMethod, lcProcDef, lcMethods
+ LOCAL lcMethod, lnProtectedItem, lnCommentRow, lcProcDef, lcMethods, lcMethods2
+ STORE '' TO lcMethod, lcProcDef, lcMethods, lcMethods2
IF tnMethodCount > 0 THEN
FOR I = 1 TO tnMethodCount
@@ -5448,7 +5469,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
ENDIF
*-- Código del método
- *TEXT TO lcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ *TEXT TO lcMethods2 ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
* <>
* <>ENDPROC