diff --git a/FoxBin2PRGVersionFile.txt b/FoxBin2PRGVersionFile.txt
index aea4cd2..5d34353 100644
--- a/FoxBin2PRGVersionFile.txt
+++ b/FoxBin2PRGVersionFile.txt
@@ -2,8 +2,8 @@ Lparameters toUpdateInfo
Local lcNote
With toUpdateInfo
- .VersionNumber = 'v1.19.40'
- .VersionDate = Date(2015,01,11)
+ .VersionNumber = 'v1.19.41'
+ .VersionDate = Date(2015,01,18)
.SourceFileUrl = 'http://vfpxrepository.com/dl/thorupdate/Projects/FoxBin2Prg/FoxBin2Prg.Zip'
.Link = 'http://vfpx.codeplex.com/wikipage?title=FoxBin2PRG'
@@ -17,6 +17,10 @@ Demo video using FoxBin2Prg with PlasticSCM: http://youtu.be/sE4wQ50Itqg
Change History -------------------------------------------------------------
+2015/01/18 v1.19.41
+- Bug Fix db2: Erroneous detection of Invalid Table when size is less than 328 bytes. Lower limit was changed to 65 bytes.
+- Bug Fix vcx/scx: Erroneous detection of PROCEDURE/ENDPROC structures when used as parameters of LPARAMETERS and start in new line (Ryan Harris)
+
2015/01/11 v1.19.40
- Enhancement frx/lbx: Clean ASCII 0 from expression field for Dataenvironment, Cursors and Relations
- Bug fix frx/lbx: When using Dataenvironment with more than one cursor, remaining cursors are lost
diff --git a/TESTS/DATOS_READONLY/procedure_in_lparameters.vc2 b/TESTS/DATOS_READONLY/procedure_in_lparameters.vc2
new file mode 100644
index 0000000..f250471
--- /dev/null
+++ b/TESTS/DATOS_READONLY/procedure_in_lparameters.vc2
@@ -0,0 +1,39 @@
+*--------------------------------------------------------------------------------------------------------------------------------------------------------
+* (ES) AUTOGENERADO - ¡¡ATENCIÓN!! - ¡¡NO PENSADO PARA EJECUTAR!! USAR SOLAMENTE PARA INTEGRAR CAMBIOS Y ALMACENAR CON HERRAMIENTAS SCM!!
+* (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!!
+*--------------------------------------------------------------------------------------------------------------------------------------------------------
+*< FOXBIN2PRG: Version="1.19" SourceFile="procedure_in_lparameters.vcx" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries)
+*
+*
+DEFINE CLASS custest AS custom
+ *< CLASSDATA: Baseclass="custom" Timestamp="" Scale="Pixels" Uniqueid="" />
+
+ *
+ *m: createcsrhealthcodes
+ *
+
+ Name = "custest"
+
+ PROCEDURE createcsrhealthcodes
+
+
+ *
+ * Add values to cursor, row by row.
+ *
+ FOR lnIndex = 1 TO lnCount
+
+ *
+ * Write values to csr
+ *
+ REPLACE CBO_Id WITH lnCBO_ID, Diagnosis WITH lcDiagnosis, AdmitDiagnosis WITH lcAdmitDiagnosis, ; && Try to Break FB2P
+ Procedure WITH lcProcedure IN csrHealthCareCodes
+
+ ENDFOR
+
+ *
+ * Return success flag.
+ *
+ RETURN llSuccess
+ ENDPROC
+
+ENDDEFINE
diff --git a/TESTS/DATOS_READONLY/procedure_in_lparameters.vct b/TESTS/DATOS_READONLY/procedure_in_lparameters.vct
new file mode 100644
index 0000000..01fd5f3
Binary files /dev/null and b/TESTS/DATOS_READONLY/procedure_in_lparameters.vct differ
diff --git a/TESTS/DATOS_READONLY/procedure_in_lparameters.vcx b/TESTS/DATOS_READONLY/procedure_in_lparameters.vcx
new file mode 100644
index 0000000..837b926
Binary files /dev/null and b/TESTS/DATOS_READONLY/procedure_in_lparameters.vcx differ
diff --git a/TESTS/ut__foxbin2prg__c_foxbin2prg__EvaluarConfiguracion.prg b/TESTS/ut__foxbin2prg__c_foxbin2prg__EvaluarConfiguracion.prg
index 52b42c5..d20a73a 100644
--- a/TESTS/ut__foxbin2prg__c_foxbin2prg__EvaluarConfiguracion.prg
+++ b/TESTS/ut__foxbin2prg__c_foxbin2prg__EvaluarConfiguracion.prg
@@ -238,7 +238,7 @@ DEFINE CLASS ut__foxbin2prg__c_foxbin2prg__EvaluarConfiguracion AS FxuTestCase O
STRTOFILE( 'MNX_Conversion_Support: 1' + CRLF, 'TESTS\DATOS_TEST\foxbin2prg.cfg', 1 )
STRTOFILE( 'DBF_Conversion_Support: 2' + CRLF, 'TESTS\DATOS_TEST\foxbin2prg.cfg', 1 )
STRTOFILE( 'DBC_Conversion_Support: 1' + CRLF, 'TESTS\DATOS_TEST\foxbin2prg.cfg', 1 )
- STRTOFILE( 'ShowProgressbar: 0' + CRLF, 'TESTS\DATOS_TEST\foxbin2prg.cfg', 1 )
+ STRTOFILE( 'DontShowProgress: 1' + CRLF, 'TESTS\DATOS_TEST\foxbin2prg.cfg', 1 )
STRTOFILE( 'DontShowErrors: 1' + CRLF, 'TESTS\DATOS_TEST\foxbin2prg.cfg', 1 )
*STRTOFILE( 'Recompile: ' + CRLF, 'TESTS\DATOS_TEST\foxbin2prg.cfg', 1 )
STRTOFILE( 'NoTimestamps: 0' + CRLF, 'TESTS\DATOS_TEST\foxbin2prg.cfg', 1 )
diff --git a/foxbin2prg.exe b/foxbin2prg.exe
index 0e2604c..0b49642 100644
Binary files a/foxbin2prg.exe and b/foxbin2prg.exe differ
diff --git a/foxbin2prg.pj2 b/foxbin2prg.pj2
index f5b98aa..be83bd0 100644
--- a/foxbin2prg.pj2
+++ b/foxbin2prg.pj2
@@ -26,7 +26,7 @@ _LegalTrademark = "Creative Commons 4: Reconocimiento - CompartirIgual (by-sa):
_ProductName = "FOXBIN2PRG"
_MajorVer = "1"
_MinorVer = "19"
-_Revision = "40"
+_Revision = "41"
_LanguageID = "1034"
_AutoIncrement = "0"
*
diff --git a/foxbin2prg.pjt b/foxbin2prg.pjt
index 9f0b367..8d4a53a 100644
Binary files a/foxbin2prg.pjt and b/foxbin2prg.pjt differ
diff --git a/foxbin2prg.pjx b/foxbin2prg.pjx
index d35c037..4e14ded 100644
Binary files a/foxbin2prg.pjx and b/foxbin2prg.pjx differ
diff --git a/foxbin2prg.prg b/foxbin2prg.prg
index b075263..b04f0e4 100644
--- a/foxbin2prg.prg
+++ b/foxbin2prg.prg
@@ -129,6 +129,8 @@
* 06/01/2015 FDBOZZO v1.19.40 Mejora: Permitir configurar la barra de progreso para que solamente aparezca cuando se procesan múltiples archivos y no cuando se procesa solo 1 (Jim Nelson)
* 07/01/2015 FDBOZZO v1.19.40 Bug fix db2: [Error 12, Variable "TCOUTPUTFILE" is not found] cuando DBF_Conversion_Support=4 y el archivo de salida es igual al generado (Mike Potjer)
* 07/01/2015 FDBOZZO v1.19.40 Mejora scx/vcx: Detección de nombres de objeto duplicados para notificar casos de corrupción
+* 13/01/2015 FDBOZZO v1.19.41 Bug Fix scx/vcx: Detección errónea de estructuras PROCEDURE/ENDPROC cuando se usan como parámetros en LPARAMETERS (Ryan Harris)
+* 13/01/2015 FDBOZZO v1.19.41 Bug Fix db2: Detección errónea de tabla inválida cuando el tamaño es inferior a 328 bytes. Límite mínimo cambiado a 65 bytes.
*
*
*---------------------------------------------------------------------------------------------------
@@ -188,6 +190,7 @@
* 30/12/2014 Ryan Harris Reporte bug dbc v1.19.38: Los datos de DisplayClass y DisplayClassLibrary tenían el valor de "Default" en vez del propio (Agregado en v1.19.39)
* 06/01/2015 Jim Nelson Mejora v1.19.39: Permitir configurar la barra de progreso para que solamente aparezca cuando se procesan múltiples archivos y no cuando se procesa solo 1 (Agregado en v1.19.40)
* 06/01/2015 Mike Potjer Reporte bug db2: [Error 12, Variable "TCOUTPUTFILE" is not found] cuando DBF_Conversion_Support=4 y el archivo de salida es igual al generado (Agregado en v1.19.40)
+* 13/01/2015 Ryan Harris Reporte bug vcx/scx v1.19.40: Detección errónea de estructuras PROCEDURE/ENDPROC cuando se usan como parámetros LPARAMETERS en línea aparte (Arreglado en v1.19.41)
*
*
*---------------------------------------------------------------------------------------------------
@@ -2049,6 +2052,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
IF .n_ShowProgressbar <> 0 THEN
.cargar_frm_avance()
+ .o_Frm_Avance.Caption = STRTRAN( .o_Frm_Avance.Caption, '> -', '(Bin>Txt) -' )
ENDIF
DO CASE
@@ -2106,6 +2110,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
IF .n_ShowProgressbar <> 0 THEN
.cargar_frm_avance()
+ .o_Frm_Avance.Caption = STRTRAN( .o_Frm_Avance.Caption, '> -', '(Txt>Bin) -' )
ENDIF
DO CASE
@@ -2202,6 +2207,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
*-- SE QUIEREN CONVERTIR A TEXTO TODOS LOS ARCHIVOS DE UN PROYECTO
IF .n_ShowProgressbar <> 0 THEN
.cargar_frm_avance()
+ .o_Frm_Avance.Caption = STRTRAN( .o_Frm_Avance.Caption, '> -', '(Bin>Txt) -' )
ENDIF
.writeLog( '> ' + loLang.C_CONVERT_ALL_FILES_IN_A_PROJECT_LOC + ': ' + loLang.C_BINARY_TO_TEXT_LOC )
@@ -2249,6 +2255,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
*-- SE QUIEREN CONVERTIR A BINARIO TODOS LOS ARCHIVOS DE UN PROYECTO
IF .n_ShowProgressbar <> 0 THEN
.cargar_frm_avance()
+ .o_Frm_Avance.Caption = STRTRAN( .o_Frm_Avance.Caption, '> -', '(Txt>Bin) -' )
ENDIF
.writeLog( '> ' + loLang.C_CONVERT_ALL_FILES_IN_A_PROJECT_LOC + ': ' + loLang.C_TEXT_TO_BINARY_LOC )
@@ -2850,7 +2857,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
IF ln_AT_Cmt > 0
tcComment = LTRIM( SUBSTR( tcLine, ln_AT_Cmt + 2 ) )
- tcLine = RTRIM( LEFT( tcLine, ln_AT_Cmt - 1 ), 0, CHR(9) ) && Quito TABS
+ tcLine = RTRIM( LEFT( tcLine, ln_AT_Cmt - 1 ), 0, CHR(9), ' ' ) && Quito TABS y espacios
ENDIF
RETURN (ln_AT_Cmt > 0)
@@ -3198,67 +3205,50 @@ DEFINE CLASS frm_avance AS FORM
+ [] ;
+ []
-
ADD OBJECT shp_base AS shape WITH ;
Top = 28, ;
Left = 12, ;
Height = 13, ;
Width = 604, ;
- Curvature = 15, ;
+ Curvature = 8, ;
+ BorderWidth = 8, ;
+ BackColor = 14215910, ;
+ BorderColor = 14215910, ;
Name = "shp_base"
-
ADD OBJECT shp_avance AS shape WITH ;
Top = 28, ;
Left = 12, ;
Height = 13, ;
Width = 36, ;
- Curvature = 15, ;
- BackColor = RGB(255,255,128), ;
- BorderColor = RGB(255,0,0), ;
+ Curvature = 8, ;
+ BackColor = 6734335, ;
+ BorderColor = 10476031, ;
+ BorderWidth = 1, ;
Name = "shp_Avance"
-
- ADD OBJECT lbl_tarea AS label WITH ;
- BackStyle = 0, ;
- Caption = ".", ;
- Height = 17, ;
- Left = 12, ;
- Top = 8, ;
- Width = 604, ;
- Name = "lbl_Tarea"
-
-
ADD OBJECT shp_base2 AS shape WITH ;
Top = 64, ;
Left = 12, ;
Height = 13, ;
Width = 604, ;
- Curvature = 15, ;
+ Curvature = 8, ;
+ BorderWidth = 0, ;
+ BackColor = 14215910, ;
+ BorderColor = 14215910, ;
Name = "shp_base2"
-
ADD OBJECT shp_avance2 AS shape WITH ;
Top = 64, ;
Left = 12, ;
Height = 13, ;
Width = 36, ;
- Curvature = 15, ;
- BackColor = RGB(255,255,128), ;
- BorderColor = RGB(255,0,0), ;
+ Curvature = 8, ;
+ BackColor = 6734335, ;
+ BorderColor = 10476031, ;
+ BorderWidth = 1, ;
Name = "shp_Avance2"
-
- ADD OBJECT lbl_tarea2 AS label WITH ;
- BackStyle = 0, ;
- Caption = ".", ;
- Height = 17, ;
- Left = 12, ;
- Top = 44, ;
- Width = 604, ;
- Name = "lbl_Tarea2"
-
-
ADD OBJECT cmdCancel AS commandbutton WITH ;
Top = 84, ;
Left = 252, ;
@@ -3268,6 +3258,255 @@ DEFINE CLASS frm_avance AS FORM
Enabled = .F., ;
Name = "cmdCancel"
+ ADD OBJECT lin_1 AS shape WITH ;
+ Top = 28, ;
+ Left = 32, ;
+ Height = 53, ;
+ Width = 0, ;
+ BorderColor = 16777215, ;
+ Name = "lin_1"
+
+ ADD OBJECT lin_2 AS shape WITH ;
+ Top = 28, ;
+ Left = 52, ;
+ Height = 53, ;
+ Width = 0, ;
+ BorderColor = 16777215, ;
+ Name = "lin_2"
+
+ ADD OBJECT lin_3 AS shape WITH ;
+ Top = 28, ;
+ Left = 72, ;
+ Height = 53, ;
+ Width = 0, ;
+ BorderColor = 16777215, ;
+ Name = "lin_3"
+
+ ADD OBJECT lin_4 AS shape WITH ;
+ Top = 28, ;
+ Left = 92, ;
+ Height = 53, ;
+ Width = 0, ;
+ BorderColor = 16777215, ;
+ Name = "lin_4"
+
+ ADD OBJECT lin_5 AS shape WITH ;
+ Top = 28, ;
+ Left = 112, ;
+ Height = 53, ;
+ Width = 0, ;
+ BorderColor = 16777215, ;
+ Name = "lin_5"
+
+ ADD OBJECT lin_6 AS shape WITH ;
+ Top = 28, ;
+ Left = 132, ;
+ Height = 53, ;
+ Width = 0, ;
+ BorderColor = 16777215, ;
+ Name = "lin_6"
+
+ ADD OBJECT lin_7 AS shape WITH ;
+ Top = 28, ;
+ Left = 152, ;
+ Height = 53, ;
+ Width = 0, ;
+ BorderColor = 16777215, ;
+ Name = "lin_7"
+
+ ADD OBJECT lin_8 AS shape WITH ;
+ Top = 28, ;
+ Left = 172, ;
+ Height = 53, ;
+ Width = 0, ;
+ BorderColor = 16777215, ;
+ Name = "lin_8"
+
+ ADD OBJECT lin_9 AS shape WITH ;
+ Top = 28, ;
+ Left = 192, ;
+ Height = 53, ;
+ Width = 0, ;
+ BorderColor = 16777215, ;
+ Name = "lin_9"
+
+ ADD OBJECT lin_10 AS shape WITH ;
+ Top = 28, ;
+ Left = 212, ;
+ Height = 53, ;
+ Width = 0, ;
+ BorderColor = 16777215, ;
+ Name = "lin_10"
+
+ ADD OBJECT lin_11 AS shape WITH ;
+ Top = 28, ;
+ Left = 232, ;
+ Height = 53, ;
+ Width = 0, ;
+ BorderColor = 16777215, ;
+ Name = "lin_11"
+
+ ADD OBJECT lin_12 AS shape WITH ;
+ Top = 28, ;
+ Left = 252, ;
+ Height = 53, ;
+ Width = 0, ;
+ BorderColor = 16777215, ;
+ Name = "lin_12"
+
+ ADD OBJECT lin_13 AS shape WITH ;
+ Top = 28, ;
+ Left = 272, ;
+ Height = 53, ;
+ Width = 0, ;
+ BorderColor = 16777215, ;
+ Name = "lin_13"
+
+ ADD OBJECT lin_14 AS shape WITH ;
+ Top = 28, ;
+ Left = 292, ;
+ Height = 53, ;
+ Width = 0, ;
+ BorderColor = 16777215, ;
+ Name = "lin_14"
+
+ ADD OBJECT lin_15 AS shape WITH ;
+ Top = 28, ;
+ Left = 312, ;
+ Height = 53, ;
+ Width = 0, ;
+ BorderColor = 16777215, ;
+ Name = "lin_15"
+
+ ADD OBJECT lin_16 AS shape WITH ;
+ Top = 28, ;
+ Left = 332, ;
+ Height = 53, ;
+ Width = 0, ;
+ BorderColor = 16777215, ;
+ Name = "lin_16"
+
+ ADD OBJECT lin_17 AS shape WITH ;
+ Top = 28, ;
+ Left = 352, ;
+ Height = 53, ;
+ Width = 0, ;
+ BorderColor = 16777215, ;
+ Name = "lin_17"
+
+ ADD OBJECT lin_18 AS shape WITH ;
+ Top = 28, ;
+ Left = 372, ;
+ Height = 53, ;
+ Width = 0, ;
+ BorderColor = 16777215, ;
+ Name = "lin_18"
+
+ ADD OBJECT lin_19 AS shape WITH ;
+ Top = 28, ;
+ Left = 392, ;
+ Height = 53, ;
+ Width = 0, ;
+ BorderColor = 16777215, ;
+ Name = "lin_19"
+
+ ADD OBJECT lin_20 AS shape WITH ;
+ Top = 28, ;
+ Left = 412, ;
+ Height = 53, ;
+ Width = 0, ;
+ BorderColor = 16777215, ;
+ Name = "lin_20"
+
+ ADD OBJECT lin_21 AS shape WITH ;
+ Top = 28, ;
+ Left = 432, ;
+ Height = 53, ;
+ Width = 0, ;
+ BorderColor = 16777215, ;
+ Name = "lin_21"
+
+ ADD OBJECT lin_22 AS shape WITH ;
+ Top = 28, ;
+ Left = 452, ;
+ Height = 53, ;
+ Width = 0, ;
+ BorderColor = 16777215, ;
+ Name = "lin_22"
+
+ ADD OBJECT lin_23 AS shape WITH ;
+ Top = 28, ;
+ Left = 472, ;
+ Height = 53, ;
+ Width = 0, ;
+ BorderColor = 16777215, ;
+ Name = "lin_23"
+
+ ADD OBJECT lin_24 AS shape WITH ;
+ Top = 28, ;
+ Left = 492, ;
+ Height = 53, ;
+ Width = 0, ;
+ BorderColor = 16777215, ;
+ Name = "lin_24"
+
+ ADD OBJECT lin_25 AS shape WITH ;
+ Top = 28, ;
+ Left = 512, ;
+ Height = 53, ;
+ Width = 0, ;
+ BorderColor = 16777215, ;
+ Name = "lin_25"
+
+ ADD OBJECT lin_26 AS shape WITH ;
+ Top = 28, ;
+ Left = 532, ;
+ Height = 53, ;
+ Width = 0, ;
+ BorderColor = 16777215, ;
+ Name = "lin_26"
+
+ ADD OBJECT lin_27 AS shape WITH ;
+ Top = 28, ;
+ Left = 552, ;
+ Height = 53, ;
+ Width = 0, ;
+ BorderColor = 16777215, ;
+ Name = "lin_27"
+
+ ADD OBJECT lin_28 AS shape WITH ;
+ Top = 28, ;
+ Left = 572, ;
+ Height = 53, ;
+ Width = 0, ;
+ BorderColor = 16777215, ;
+ Name = "lin_28"
+
+ ADD OBJECT lin_29 AS shape WITH ;
+ Top = 28, ;
+ Left = 592, ;
+ Height = 53, ;
+ Width = 0, ;
+ BorderColor = 16777215, ;
+ Name = "lin_29"
+
+ ADD OBJECT lbl_tarea AS label WITH ;
+ BackStyle = 0, ;
+ Caption = ".", ;
+ Height = 17, ;
+ Left = 12, ;
+ Top = 8, ;
+ Width = 604, ;
+ Name = "lbl_Tarea"
+
+ ADD OBJECT lbl_tarea2 AS label WITH ;
+ BackStyle = 0, ;
+ Caption = ".", ;
+ Height = 17, ;
+ Left = 12, ;
+ Top = 44, ;
+ Width = 604, ;
+ Name = "lbl_Tarea2"
PROCEDURE AvanceDelProceso
LPARAMETERS tcTexto, tnValor, tnTotal, tnTipo
@@ -3331,10 +3570,10 @@ DEFINE CLASS frm_avance AS FORM
PROCEDURE Init
LOCAL loLang as CL_LANG OF 'FOXBIN2PRG.PRG'
- loLang = _SCREEN.o_FoxBin2Prg_Lang
- THIS.CAPTION = 'FoxBin2Prg ' + _SCREEN.c_FB2PRG_EXE_Version + ' - ' + loLang.C_PROCESS_PROGRESS_LOC + ' (' + loLang.C_PRESS_ESC_TO_CANCEL + ')'
- THIS.nValue = 0
- THIS.nValue2 = 0
+ loLang = _SCREEN.o_FoxBin2Prg_Lang
+ THIS.CAPTION = 'FoxBin2Prg ' + _SCREEN.c_FB2PRG_EXE_Version + ' > - ' + loLang.C_PROCESS_PROGRESS_LOC + ' (' + loLang.C_PRESS_ESC_TO_CANCEL + ')'
+ THIS.nValue = 0
+ THIS.nValue2 = 0
ENDPROC
@@ -4158,13 +4397,12 @@ DEFINE CLASS C_CONVERSOR_BASE AS SESSION
*---------------------------------------------------------------------------------------------------
LPARAMETERS tcLine, tcComment
LOCAL ln_AT_Cmt
+ tcComment = ''
ln_AT_Cmt = AT( '&'+'&', tcLine)
IF ln_AT_Cmt > 0
tcComment = LTRIM( SUBSTR( tcLine, ln_AT_Cmt + 2 ) )
- tcLine = RTRIM( LEFT( tcLine, ln_AT_Cmt - 1 ), 0, CHR(9) ) && Quito TABS
- ELSE
- tcComment = ''
+ tcLine = RTRIM( LEFT( tcLine, ln_AT_Cmt - 1 ), 0, CHR(9), ' ' ) && Quito TABS y espacios
ENDIF
RELEASE tcLine, tcComment
@@ -10585,7 +10823,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS C_CONVERSOR_BASE
*-- 1.Bloque de código del método en su posición original
TRY
LOCAL lnLineCount, laLine(1), I, lnTextNodes, tcSorted, lnProtectedLine, lcMethod, lnLine_Len, lcLine, llProcOpen ;
- , laLineasExclusion(1), lnBloquesExclusion ;
+ , laLineasExclusion(1), lnBloquesExclusion, lcLastLine ;
, loEx AS EXCEPTION
IF NOT EMPTY(m.tcMethod) AND LEFT(m.tcMethod,9) == "ENDPROC"+CHR(13)+CHR(10)
@@ -10593,187 +10831,197 @@ DEFINE CLASS c_conversor_bin_a_prg AS C_CONVERSOR_BASE
ENDIF
IF NOT EMPTY(m.tcMethod)
- DIMENSION laLine(1)
- STORE '' TO laLine
- STORE 0 TO lnTextNodes
+ WITH THIS AS c_conversor_bin_a_prg OF 'FOXBIN2PRG.PRG'
+ DIMENSION laLine(1)
+ STORE '' TO laLine, lcLine, lcLastLine
+ STORE 0 TO lnTextNodes
- lnLineCount = ALINES(laLine, m.tcMethod) && NO aplicar nungún formato ni limpieza, que es el CÓDIGO FUENTE
+ lnLineCount = ALINES(laLine, m.tcMethod) && NO aplicar nungún formato ni limpieza, que es el CÓDIGO FUENTE
- *-- Delete beginning empty lines before first "PROCEDURE", that is the first not empty line.
- FOR I = 1 TO lnLineCount
- IF EMPTY(laLine(I)) OR LEFT( LTRIM(laLine(I)),1 ) = '*'
- *-- Skip empty and commented lines
- ELSE
- IF I > 1
- FOR X = I-1 TO 1 STEP -1
- ADEL(laLine, X)
- ENDFOR
- lnLineCount = lnLineCount - I + 1
- DIMENSION laLine(lnLineCount)
- ENDIF
- EXIT
- ENDIF
- ENDFOR
-
- *-- Delete ending empty lines after last "ENDPROC", that is the last not empty line.
- FOR I = lnLineCount TO 1 STEP -1
- IF EMPTY(laLine(I)) OR LEFT( LTRIM(laLine(I)),1 ) = '*'
- ADEL(laLine, I)
- ELSE
- IF I < lnLineCount
- lnLineCount = I
- DIMENSION laLine(lnLineCount)
- ENDIF
- EXIT
- ENDIF
- ENDFOR
-
- *-- Identifico los TEXT/ENDTEXT, #IF .F./#ENDIF
- THIS.identificarBloquesDeExclusion( @laLine, lnLineCount, .F., @laLineasExclusion, @lnBloquesExclusion )
-
- *-- Analyze and count line methods, get method names and consolidate block code
- FOR I = 1 TO lnLineCount
- IF toFoxBin2Prg.l_DropNullCharsFromCode
- laLine(I) = CHRTRAN( laLine(I), C_NULL_CHAR, '' )
- ENDIF
-
- lnLine_Len = LEN( laLine(I) )
- lcLine = LTRIM( laLine(I), 0, C_TAB, ' ' )
-
- DO CASE
- CASE laLineasExclusion(I)
- IF tnMethodCount > 0 AND llProcOpen
- taCode(tnMethodCount) = taCode(tnMethodCount) + laLine(I) + CR_LF
+ *-- Delete beginning empty lines before first "PROCEDURE", that is the first not empty line.
+ FOR I = 1 TO lnLineCount
+ IF EMPTY(laLine(I)) OR LEFT( LTRIM(laLine(I)),1 ) = '*'
+ *-- Skip empty and commented lines
ELSE
- *-- Invalid method code, as outer code added for tools like ReFox or others, is cleaned up
- ENDIF
-
- CASE lnTextNodes = 0 AND UPPER( LEFT(lcLine, 10) ) == 'PROCEDURE '
- tnMethodCount = tnMethodCount + 1
- DIMENSION taMethods(tnMethodCount, 3), taCode(tnMethodCount)
- taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(lcLine, 11) )
- taMethods(tnMethodCount, 2) = tnMethodCount
- taMethods(tnMethodCount, 3) = ''
- taCode(tnMethodCount) = 'PROCEDURE ' + taMethods(tnMethodCount, 1) + CR_LF && laLine(I) + CR_LF
- llProcOpen = .T.
-
- CASE lnTextNodes = 0 AND UPPER( LEFT(lcLine, 9) ) == 'FUNCTION ' && NOT VALID WITH VFP IDE, BUT 3rd. PARTY SOFTWARE CAN USE IT
- tnMethodCount = tnMethodCount + 1
- DIMENSION taMethods(tnMethodCount, 3), taCode(tnMethodCount)
- taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(lcLine, 10) )
- taMethods(tnMethodCount, 2) = tnMethodCount
- taMethods(tnMethodCount, 3) = ''
- taCode(tnMethodCount) = 'PROCEDURE ' + taMethods(tnMethodCount, 1) + CR_LF && laLine(I) + CR_LF
- llProcOpen = .T.
-
- CASE lnTextNodes = 0 AND UPPER( LEFT(lcLine, 17) ) == 'HIDDEN PROCEDURE '
- tnMethodCount = tnMethodCount + 1
- DIMENSION taMethods(tnMethodCount, 3), taCode(tnMethodCount)
- taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(lcLine, 18) )
- taMethods(tnMethodCount, 2) = tnMethodCount
- taMethods(tnMethodCount, 3) = 'HIDDEN '
- taCode(tnMethodCount) = 'HIDDEN PROCEDURE ' + taMethods(tnMethodCount, 1) + CR_LF && laLine(I) + CR_LF
- llProcOpen = .T.
-
- CASE lnTextNodes = 0 AND UPPER( LEFT(lcLine, 16) ) == 'HIDDEN FUNCTION ' && NOT VALID WITH VFP IDE, BUT 3rd. PARTY SOFTWARE CAN USE IT
- tnMethodCount = tnMethodCount + 1
- DIMENSION taMethods(tnMethodCount, 3), taCode(tnMethodCount)
- taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(lcLine, 17) )
- taMethods(tnMethodCount, 2) = tnMethodCount
- taMethods(tnMethodCount, 3) = 'HIDDEN '
- taCode(tnMethodCount) = 'HIDDEN PROCEDURE ' + taMethods(tnMethodCount, 1) + CR_LF && laLine(I) + CR_LF
- llProcOpen = .T.
-
- CASE lnTextNodes = 0 AND UPPER( LEFT(lcLine, 20) ) == 'PROTECTED PROCEDURE '
- tnMethodCount = tnMethodCount + 1
- DIMENSION taMethods(tnMethodCount, 3), taCode(tnMethodCount)
- taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(lcLine, 21) )
- taMethods(tnMethodCount, 2) = tnMethodCount
- taMethods(tnMethodCount, 3) = 'PROTECTED '
- taCode(tnMethodCount) = 'PROTECTED PROCEDURE ' + taMethods(tnMethodCount, 1) + CR_LF && laLine(I) + CR_LF
- llProcOpen = .T.
-
- CASE lnTextNodes = 0 AND UPPER( LEFT(lcLine, 19) ) == 'PROTECTED FUNCTION ' && NOT VALID WITH VFP IDE, BUT 3rd. PARTY SOFTWARE CAN USE IT
- tnMethodCount = tnMethodCount + 1
- DIMENSION taMethods(tnMethodCount, 3), taCode(tnMethodCount)
- taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(lcLine, 20) )
- taMethods(tnMethodCount, 2) = tnMethodCount
- taMethods(tnMethodCount, 3) = 'PROTECTED '
- taCode(tnMethodCount) = 'PROTECTED PROCEDURE ' + taMethods(tnMethodCount, 1) + CR_LF && laLine(I) + CR_LF
- llProcOpen = .T.
-
- CASE lnTextNodes = 0 AND LEFT(lcLine, 7) == 'ENDPROC'
- IF lnLine_Len >= 7 AND LEFT( UPPER( CHRTRAN( lcLine , '&'+CHR(9)+CHR(0), ' ') ) + ' ' ,8) == 'ENDPROC '
- *-- Es el final de estructura ENDPROC
- IF NOT llProcOpen
- *-- Esto no es normal, porque hay más de un ENDPROC, por lo que se ignora.
- LOOP
+ IF I > 1
+ FOR X = I-1 TO 1 STEP -1
+ ADEL(laLine, X)
+ ENDFOR
+ lnLineCount = lnLineCount - I + 1
+ DIMENSION laLine(lnLineCount)
ENDIF
- ELSE
- *-- Es otra cosa (variable, etc)
- taCode(tnMethodCount) = taCode(tnMethodCount) + lcLine + CR_LF
- LOOP
+ EXIT
ENDIF
+ ENDFOR
- taCode(tnMethodCount) = taCode(tnMethodCount) + lcLine &&+ CR_LF
- llProcOpen = .F.
-
- CASE lnTextNodes = 0 AND LEFT(laLine(I), 7) == 'ENDFUNC' && NOT VALID WITH VFP IDE, BUT 3rd. PARTY SOFTWARE CAN USE IT
- IF lnLine_Len >= 7 AND LEFT( UPPER( CHRTRAN( laLine(I) , '&'+CHR(9)+CHR(0), ' ') ) + ' ' ,8) == 'ENDFUNC '
- *-- Es el final de estructura ENDPROC
- IF NOT llProcOpen
- *-- Esto no es normal, porque hay más de un ENDFUNC, por lo que se ignora.
- LOOP
+ *-- Delete ending empty lines after last "ENDPROC", that is the last not empty line.
+ FOR I = lnLineCount TO 1 STEP -1
+ IF EMPTY(laLine(I)) OR LEFT( LTRIM(laLine(I)),1 ) = '*'
+ ADEL(laLine, I)
+ ELSE
+ IF I < lnLineCount
+ lnLineCount = I
+ DIMENSION laLine(lnLineCount)
ENDIF
- lcLine = STRTRAN( lcLine, 'ENDFUNC', 'ENDPROC' )
- ELSE
- *-- Es otra cosa (variable, etc)
- taCode(tnMethodCount) = taCode(tnMethodCount) + lcLine + CR_LF
- LOOP
+ EXIT
+ ENDIF
+ ENDFOR
+
+ *-- Identifico los TEXT/ENDTEXT, #IF .F./#ENDIF
+ .identificarBloquesDeExclusion( @laLine, lnLineCount, .F., @laLineasExclusion, @lnBloquesExclusion )
+
+ *-- Analyze and count line methods, get method names and consolidate block code
+ FOR I = 1 TO lnLineCount
+ IF toFoxBin2Prg.l_DropNullCharsFromCode
+ laLine(I) = CHRTRAN( laLine(I), C_NULL_CHAR, '' )
ENDIF
- taCode(tnMethodCount) = taCode(tnMethodCount) + lcLine &&+ CR_LF
- llProcOpen = .F.
+ lnLine_Len = LEN( laLine(I) )
+ lcLastLine = lcLine
+ lcLine = laLine(I)
+ .get_SeparatedLineAndComment( @lcLine )
+ lcLine = LTRIM( lcLine, 0, C_TAB, ' ' )
- *CASE tnMethodCount = 0 OR NOT llProcOpen AND LEFT( LTRIM(laLine(I)),1 ) = '*'
- CASE tnMethodCount = 0 OR NOT llProcOpen
- *-- Skip empty and commented lines before methods begin
- *-- Aquí como condición podría poner: NOT llProcOpen AND LEFT(laLine(I), 7) # 'ENDPROC', pero abarcaría demasiado.
-
- OTHERWISE && Method Code
- taCode(tnMethodCount) = taCode(tnMethodCount) + laLine(I) + CR_LF
-
- ENDCASE
- ENDFOR
-
- *-- Agrego los métodos definidos, pero sin código (Protected/Reserved3)
- FOR I = 1 TO tnPropsAndComments_Count
- lcMethod = CHRTRAN( taPropsAndComments(I,1), '*', '' )
- IF LEFT( taPropsAndComments(I,1), 1 ) == '*' AND ASCAN( taMethods, lcMethod, 1, 0, 1, 1+2+4+8 ) = 0
- tnMethodCount = tnMethodCount + 1
- DIMENSION taMethods(tnMethodCount, 3) &&, taCode(tnMethodCount)
- taMethods(tnMethodCount, 1) = lcMethod
- taMethods(tnMethodCount, 2) = 0
-
- lnProtectedLine = ASCAN( taProtected, lcMethod, 1, 0, 1, 1+2+4+8 )
-
- IF lnProtectedLine = 0 THEN
- IF tnProtected_Count = 0
- lnProtectedLine = 0
+ DO CASE
+ CASE laLineasExclusion(I)
+ IF tnMethodCount > 0 AND llProcOpen
+ taCode(tnMethodCount) = taCode(tnMethodCount) + laLine(I) + CR_LF
ELSE
- lnProtectedLine = ASCAN( taProtected, lcMethod + '^', 1, 0, 1, 1+2+4+8 )
+ *-- Invalid method code, as outer code added for tools like ReFox or others, is cleaned up
ENDIF
+ CASE RIGHT(lcLastLine,1) == ';'
+ *-- Saltear el análisis de esta línea, que es continuación de la anterior (lcLastLine).
+ taCode(tnMethodCount) = taCode(tnMethodCount) + laLine(I) + CR_LF
+ LOOP
+
+ CASE lnTextNodes = 0 AND UPPER( LEFT(lcLine, 10) ) == 'PROCEDURE '
+ tnMethodCount = tnMethodCount + 1
+ DIMENSION taMethods(tnMethodCount, 3), taCode(tnMethodCount)
+ taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(lcLine, 11) )
+ taMethods(tnMethodCount, 2) = tnMethodCount
+ taMethods(tnMethodCount, 3) = ''
+ taCode(tnMethodCount) = 'PROCEDURE ' + taMethods(tnMethodCount, 1) + CR_LF && laLine(I) + CR_LF
+ llProcOpen = .T.
+
+ CASE lnTextNodes = 0 AND UPPER( LEFT(lcLine, 9) ) == 'FUNCTION ' && NOT VALID WITH VFP IDE, BUT 3rd. PARTY SOFTWARE CAN USE IT
+ tnMethodCount = tnMethodCount + 1
+ DIMENSION taMethods(tnMethodCount, 3), taCode(tnMethodCount)
+ taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(lcLine, 10) )
+ taMethods(tnMethodCount, 2) = tnMethodCount
+ taMethods(tnMethodCount, 3) = ''
+ taCode(tnMethodCount) = 'PROCEDURE ' + taMethods(tnMethodCount, 1) + CR_LF && laLine(I) + CR_LF
+ llProcOpen = .T.
+
+ CASE lnTextNodes = 0 AND UPPER( LEFT(lcLine, 17) ) == 'HIDDEN PROCEDURE '
+ tnMethodCount = tnMethodCount + 1
+ DIMENSION taMethods(tnMethodCount, 3), taCode(tnMethodCount)
+ taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(lcLine, 18) )
+ taMethods(tnMethodCount, 2) = tnMethodCount
+ taMethods(tnMethodCount, 3) = 'HIDDEN '
+ taCode(tnMethodCount) = 'HIDDEN PROCEDURE ' + taMethods(tnMethodCount, 1) + CR_LF && laLine(I) + CR_LF
+ llProcOpen = .T.
+
+ CASE lnTextNodes = 0 AND UPPER( LEFT(lcLine, 16) ) == 'HIDDEN FUNCTION ' && NOT VALID WITH VFP IDE, BUT 3rd. PARTY SOFTWARE CAN USE IT
+ tnMethodCount = tnMethodCount + 1
+ DIMENSION taMethods(tnMethodCount, 3), taCode(tnMethodCount)
+ taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(lcLine, 17) )
+ taMethods(tnMethodCount, 2) = tnMethodCount
+ taMethods(tnMethodCount, 3) = 'HIDDEN '
+ taCode(tnMethodCount) = 'HIDDEN PROCEDURE ' + taMethods(tnMethodCount, 1) + CR_LF && laLine(I) + CR_LF
+ llProcOpen = .T.
+
+ CASE lnTextNodes = 0 AND UPPER( LEFT(lcLine, 20) ) == 'PROTECTED PROCEDURE '
+ tnMethodCount = tnMethodCount + 1
+ DIMENSION taMethods(tnMethodCount, 3), taCode(tnMethodCount)
+ taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(lcLine, 21) )
+ taMethods(tnMethodCount, 2) = tnMethodCount
+ taMethods(tnMethodCount, 3) = 'PROTECTED '
+ taCode(tnMethodCount) = 'PROTECTED PROCEDURE ' + taMethods(tnMethodCount, 1) + CR_LF && laLine(I) + CR_LF
+ llProcOpen = .T.
+
+ CASE lnTextNodes = 0 AND UPPER( LEFT(lcLine, 19) ) == 'PROTECTED FUNCTION ' && NOT VALID WITH VFP IDE, BUT 3rd. PARTY SOFTWARE CAN USE IT
+ tnMethodCount = tnMethodCount + 1
+ DIMENSION taMethods(tnMethodCount, 3), taCode(tnMethodCount)
+ taMethods(tnMethodCount, 1) = RTRIM( SUBSTR(lcLine, 20) )
+ taMethods(tnMethodCount, 2) = tnMethodCount
+ taMethods(tnMethodCount, 3) = 'PROTECTED '
+ taCode(tnMethodCount) = 'PROTECTED PROCEDURE ' + taMethods(tnMethodCount, 1) + CR_LF && laLine(I) + CR_LF
+ llProcOpen = .T.
+
+ CASE lnTextNodes = 0 AND LEFT(lcLine, 7) == 'ENDPROC'
+ IF lnLine_Len >= 7 AND LEFT( UPPER( CHRTRAN( lcLine , '&'+CHR(9)+CHR(0), ' ') ) + ' ' ,8) == 'ENDPROC '
+ *-- Es el final de estructura ENDPROC
+ IF NOT llProcOpen
+ *-- Esto no es normal, porque hay más de un ENDPROC, por lo que se ignora.
+ LOOP
+ ENDIF
+ ELSE
+ *-- Es otra cosa (variable, etc)
+ taCode(tnMethodCount) = taCode(tnMethodCount) + lcLine + CR_LF
+ LOOP
+ ENDIF
+
+ taCode(tnMethodCount) = taCode(tnMethodCount) + lcLine &&+ CR_LF
+ llProcOpen = .F.
+
+ CASE lnTextNodes = 0 AND LEFT(laLine(I), 7) == 'ENDFUNC' && NOT VALID WITH VFP IDE, BUT 3rd. PARTY SOFTWARE CAN USE IT
+ IF lnLine_Len >= 7 AND LEFT( UPPER( CHRTRAN( laLine(I) , '&'+CHR(9)+CHR(0), ' ') ) + ' ' ,8) == 'ENDFUNC '
+ *-- Es el final de estructura ENDPROC
+ IF NOT llProcOpen
+ *-- Esto no es normal, porque hay más de un ENDFUNC, por lo que se ignora.
+ LOOP
+ ENDIF
+ lcLine = STRTRAN( lcLine, 'ENDFUNC', 'ENDPROC' )
+ ELSE
+ *-- Es otra cosa (variable, etc)
+ taCode(tnMethodCount) = taCode(tnMethodCount) + lcLine + CR_LF
+ LOOP
+ ENDIF
+
+ taCode(tnMethodCount) = taCode(tnMethodCount) + lcLine &&+ CR_LF
+ llProcOpen = .F.
+
+ *CASE tnMethodCount = 0 OR NOT llProcOpen AND LEFT( LTRIM(laLine(I)),1 ) = '*'
+ CASE tnMethodCount = 0 OR NOT llProcOpen
+ *-- Skip empty and commented lines before methods begin
+ *-- Aquí como condición podría poner: NOT llProcOpen AND LEFT(laLine(I), 7) # 'ENDPROC', pero abarcaría demasiado.
+
+ OTHERWISE && Method Code
+ taCode(tnMethodCount) = taCode(tnMethodCount) + laLine(I) + CR_LF
+
+ ENDCASE
+ ENDFOR
+
+ *-- Agrego los métodos definidos, pero sin código (Protected/Reserved3)
+ FOR I = 1 TO tnPropsAndComments_Count
+ lcMethod = CHRTRAN( taPropsAndComments(I,1), '*', '' )
+ IF LEFT( taPropsAndComments(I,1), 1 ) == '*' AND ASCAN( taMethods, lcMethod, 1, 0, 1, 1+2+4+8 ) = 0
+ tnMethodCount = tnMethodCount + 1
+ DIMENSION taMethods(tnMethodCount, 3) &&, taCode(tnMethodCount)
+ taMethods(tnMethodCount, 1) = lcMethod
+ taMethods(tnMethodCount, 2) = 0
+
+ lnProtectedLine = ASCAN( taProtected, lcMethod, 1, 0, 1, 1+2+4+8 )
+
IF lnProtectedLine = 0 THEN
- taMethods(tnMethodCount, 3) = ''
+ IF tnProtected_Count = 0
+ lnProtectedLine = 0
+ ELSE
+ lnProtectedLine = ASCAN( taProtected, lcMethod + '^', 1, 0, 1, 1+2+4+8 )
+ ENDIF
+
+ IF lnProtectedLine = 0 THEN
+ taMethods(tnMethodCount, 3) = ''
+ ELSE
+ taMethods(tnMethodCount, 3) = 'HIDDEN '
+ ENDIF
ELSE
- taMethods(tnMethodCount, 3) = 'HIDDEN '
+ taMethods(tnMethodCount, 3) = 'PROTECTED '
ENDIF
- ELSE
- taMethods(tnMethodCount, 3) = 'PROTECTED '
ENDIF
- ENDIF
- ENDFOR
+ ENDFOR
+ ENDWITH && THIS AS c_conversor_bin_a_prg OF 'FOXBIN2PRG.PRG'
ENDIF
CATCH TO loEx
@@ -13458,13 +13706,12 @@ DEFINE CLASS CL_CUS_BASE AS CUSTOM
*---------------------------------------------------------------------------------------------------
LPARAMETERS tcLine, tcComment
LOCAL ln_AT_Cmt
+ tcComment = ''
ln_AT_Cmt = AT( '&'+'&', tcLine)
IF ln_AT_Cmt > 0
tcComment = LTRIM( SUBSTR( tcLine, ln_AT_Cmt + 2 ) )
- tcLine = RTRIM( LEFT( tcLine, ln_AT_Cmt - 1 ), 0, CHR(9) ) && Quito TABS
- ELSE
- tcComment = ''
+ tcLine = RTRIM( LEFT( tcLine, ln_AT_Cmt - 1 ), 0, CHR(9), ' ' ) && Quito TABS y espacios
ENDIF
RELEASE tcLine, tcComment
@@ -13547,9 +13794,7 @@ DEFINE CLASS CL_COL_BASE AS COLLECTION
IF ln_AT_Cmt > 0
tcComment = LTRIM( SUBSTR( tcLine, ln_AT_Cmt + 2 ) )
- tcLine = RTRIM( LEFT( tcLine, ln_AT_Cmt - 1 ), 0, CHR(9) ) && Quito TABS
- ELSE
- tcComment = ''
+ tcLine = RTRIM( LEFT( tcLine, ln_AT_Cmt - 1 ), 0, CHR(9), ' ' ) && Quito TABS y espacios
ENDIF
RELEASE tcLine, tcComment
@@ -21297,9 +21542,12 @@ DEFINE CLASS CL_DBF_UTILS AS SESSION
lcStr = FREAD(lnHandle,1) && 0 File type
tn_HexFileType = EVALUATE( TRANSFORM(ASC(lcStr),'@0') )
- IF lnFileLength < 328 OR .fileTypeDescription(tn_HexFileType) = 'Unknown'
+ DO CASE
+ CASE lnFileLength < 65
+ ERROR 15, tc_FileName + ' (FileLength < 65)'
+ CASE .fileTypeDescription(tn_HexFileType) = 'Unknown'
ERROR 15, tc_FileName
- ENDIF
+ ENDCASE
.n_HexFileType = tn_HexFileType
lcStr = FREAD(lnHandle,3) && 1-3 Last update (YYMMDD)