Bug Fix mnx: Cuando se usa '&&' en los textos de las opciones, se corrompe el binario del menú al regenerarlo (Walter Nichols)
This commit is contained in:
@@ -1,10 +1,2 @@
|
|||||||
ALLOWEXTERNAL=OFF
|
|
||||||
RESOURCE=OFF
|
|
||||||
SCREEN=OFF
|
SCREEN=OFF
|
||||||
_BLOWSER=""
|
RESOURCE=OFF
|
||||||
_BUILDER=""
|
|
||||||
_REPORTBUILDER=""
|
|
||||||
_REPORTOUTPUT=""
|
|
||||||
_REPORTPREVIEW=""
|
|
||||||
_TASKPANE=""
|
|
||||||
_TOOLBOX=""
|
|
||||||
@@ -3,7 +3,7 @@ Lparameters toUpdateInfo
|
|||||||
Local lcNote
|
Local lcNote
|
||||||
With toUpdateInfo
|
With toUpdateInfo
|
||||||
.VersionNumber = 'v1.19.46'
|
.VersionNumber = 'v1.19.46'
|
||||||
.VersionDate = Date(2015,07,28)
|
.VersionDate = Date(2015,09,01)
|
||||||
.SourceFileUrl = 'http://vfpxrepository.com/dl/thorupdate/Projects/FoxBin2Prg/FoxBin2Prg.Zip'
|
.SourceFileUrl = 'http://vfpxrepository.com/dl/thorupdate/Projects/FoxBin2Prg/FoxBin2Prg.Zip'
|
||||||
|
|
||||||
.Link = 'http://vfpx.codeplex.com/wikipage?title=FoxBin2PRG'
|
.Link = 'http://vfpx.codeplex.com/wikipage?title=FoxBin2PRG'
|
||||||
@@ -17,12 +17,13 @@ Demo video using FoxBin2Prg with PlasticSCM: http://youtu.be/sE4wQ50Itqg
|
|||||||
|
|
||||||
Change History -------------------------------------------------------------
|
Change History -------------------------------------------------------------
|
||||||
|
|
||||||
2015/07/28 v1.19.46
|
2015/09/01 v1.19.46
|
||||||
- Bug Fix: set_UserValue() method causes error when trying to get information about another error and the VFP binary table can not be opened (ie, because corrupted memo)
|
- Bug Fix: set_UserValue() method causes error when trying to get information about another error and the VFP binary table can not be opened (ie, because corrupted memo)
|
||||||
- Feature: Added internal support for querying directory cfg information, with a new optional parameter, for API methods that require it (ie: get_Ext2FromExt, hasSupport*)
|
- Feature: Added internal support for querying directory cfg information, with a new optional parameter, for API methods that require it (ie: get_Ext2FromExt, hasSupport*)
|
||||||
- Feature: Convert FUNCTION to PROCEDURE for maintaining compatibility with the way that VFP save methods on binaries
|
- Feature: Convert FUNCTION to PROCEDURE for maintaining compatibility with the way that VFP save methods on binaries
|
||||||
- New fb2p_diff.exe: Allow a quick Diff of VFP9 binaries, for those that don't need converting to text manually
|
- New fb2p_diff.exe: Allow a quick Diff of VFP9 binaries, for those that don't need converting to text manually
|
||||||
- Bug Fix: When processing a directory or a project with all the files, sometimes an "Alias already in use" error may occur (Dave Crozier)
|
- Bug Fix: When processing a directory or a project with all the files, sometimes an "Alias already in use" error may occur (Dave Crozier)
|
||||||
|
- Bug Fix mnx: When menu options contains '&&' in their texts, menu binary is corrupted when regenerated (Walter Nichols)
|
||||||
|
|
||||||
|
|
||||||
2015/06/21 v1.19.45
|
2015/06/21 v1.19.45
|
||||||
|
|||||||
Binary file not shown.
@@ -14,28 +14,28 @@
|
|||||||
|
|
||||||
*<MenuCode>
|
*<MenuCode>
|
||||||
DEFINE MENU _MSYSMENU BAR
|
DEFINE MENU _MSYSMENU BAR
|
||||||
DEFINE PAD _43302YWGE OF _MSYSMENU PROMPT "Opci<63>n A con submen<65>" COLOR SCHEME 3 ;
|
DEFINE PAD _000000001 OF _MSYSMENU PROMPT "Opci<63>n A && submen<65>" COLOR SCHEME 3 ;
|
||||||
NEGOTIATE NONE, LEFT ;
|
NEGOTIATE NONE, LEFT ;
|
||||||
KEY DEL, "Pulsar <DEL>" ;
|
KEY DEL, "Pulsar <DEL>" ;
|
||||||
SKIP FOR SKIP_FOR() ;
|
SKIP FOR SKIP_FOR() ;
|
||||||
MESSAGE "Mensaje para Opci<63>n A con submen<65>" && Comentario
|
MESSAGE "Mensaje para Opci<63>n A con submen<65>" && Comentario's Opci<63>n A
|
||||||
|
|
||||||
ON PAD _43302YWGE OF _MSYSMENU ACTIVATE POPUP Opci<63>nA_CS
|
ON PAD _000000001 OF _MSYSMENU ACTIVATE POPUP Opci<63>nAsub
|
||||||
|
|
||||||
*----------------------------------
|
*----------------------------------
|
||||||
DEFINE POPUP Opci<63>nA_CS MARGIN RELATIVE SHADOW COLOR SCHEME 4
|
DEFINE POPUP Opci<63>nAsub MARGIN RELATIVE SHADOW COLOR SCHEME 4
|
||||||
DEFINE BAR 1 OF Opci<63>nA_CS PROMPT "Opci<63>n A-1" ;
|
DEFINE BAR 1 OF Opci<63>nAsub PROMPT "Opci<63>n A-&&-1" ;
|
||||||
PICTURE "..\..\foxunit\fxuacknowledgements.bmp"
|
PICTURE "..\..\foxunit\fxuacknowledgements.bmp" && Comentario Opci<63>n A-1
|
||||||
ON BAR 1 OF Opci<63>nA_CS ACTIVATE POPUP Opci<63>nA1
|
ON BAR 1 OF Opci<63>nAsub ACTIVATE POPUP Opci<63>nA1
|
||||||
|
|
||||||
*----------------------------------
|
*----------------------------------
|
||||||
DEFINE POPUP Opci<63>nA1 MARGIN RELATIVE SHADOW COLOR SCHEME 4
|
DEFINE POPUP Opci<63>nA1 MARGIN RELATIVE SHADOW COLOR SCHEME 4
|
||||||
DEFINE BAR Shortcut_Menu_Title OF Opci<63>nA1 PROMPT "Opci<63>nA-1-Sub" ;
|
DEFINE BAR Shortcut_Menu_Title OF Opci<63>nA1 PROMPT "Opci<63>nA-1-&&-Sub" ;
|
||||||
PICTURE "..\..\foxunit\fxuacknowledgements.bmp"
|
PICTURE "..\..\foxunit\fxuacknowledgements.bmp" && Comentario Opci<63>n A-1-sub con && trampa :)
|
||||||
ON SELECTION BAR Shortcut_Menu_Title OF Opci<63>nA1 wait window "Ejecuta Comando o funci<63>n para Opci<63>n A-1"
|
ON SELECTION BAR Shortcut_Menu_Title OF Opci<63>nA1 wait window "Ejecuta Comando o funci<63>n 'trampa' para Opci<63>n A-&&-1"
|
||||||
|
|
||||||
DEFINE BAR 2 OF Opci<63>nA_CS PROMPT "Opci<63>n A-2"
|
DEFINE BAR 2 OF Opci<63>nAsub PROMPT "Opci<63>n A-2" && Comentario Opci<63>n A-2
|
||||||
ON BAR 2 OF Opci<63>nA_CS ACTIVATE POPUP Opci<63>nA2Su
|
ON BAR 2 OF Opci<63>nAsub ACTIVATE POPUP Opci<63>nA2Su
|
||||||
|
|
||||||
*----------------------------------
|
*----------------------------------
|
||||||
DEFINE POPUP Opci<63>nA2Su MARGIN RELATIVE SHADOW COLOR SCHEME 4
|
DEFINE POPUP Opci<63>nA2Su MARGIN RELATIVE SHADOW COLOR SCHEME 4
|
||||||
@@ -65,14 +65,14 @@ ON PAD _43302YWGE OF _MSYSMENU ACTIVATE POPUP Opci
|
|||||||
SKIP FOR NOT glEnabled_Opc_A_2_Sub_3 ;
|
SKIP FOR NOT glEnabled_Opc_A_2_Sub_3 ;
|
||||||
PICTRES _mfi_sysprint ;
|
PICTRES _mfi_sysprint ;
|
||||||
MESSAGE "Message para Opci<63>n A-2-Sub.3 (Tipo Bar#)" && Comentarios para Opci<63>n A-2-Sub.3
|
MESSAGE "Message para Opci<63>n A-2-Sub.3 (Tipo Bar#)" && Comentarios para Opci<63>n A-2-Sub.3
|
||||||
ON SELECTION POPUP Opci<63>nA_CS *-- PROCEDURE Le cambi<62> el nombre!
|
ON SELECTION POPUP Opci<63>nAsub *-- PROCEDURE Le cambi<62> el nombre!
|
||||||
|
|
||||||
DEFINE PAD opc_b OF _MSYSMENU PROMPT "Opci<63>n B con comando" COLOR SCHEME 3 ;
|
DEFINE PAD opc_b OF _MSYSMENU PROMPT "Opci<63>n B con comando" COLOR SCHEME 3 ;
|
||||||
KEY CTRL+B, "Pulse CTRL+B" ;
|
KEY CTRL+B, "Pulse CTRL+B" ;
|
||||||
SKIP FOR NOT glEnabled_Opc_B ;
|
SKIP FOR NOT glEnabled_Opc_B ;
|
||||||
MESSAGE "Mensaje para Opci<63>n B con Command" && Comentario de la Opci<63>n b
|
MESSAGE "Mensaje para Opci<63>n B con Command && con trampa's" && Comentario's de la Opci<63>n b
|
||||||
|
|
||||||
ON SELECTION PAD opc_b OF _MSYSMENU WAIT WINDOW "Opci<63>n B"
|
ON SELECTION PAD opc_b OF _MSYSMENU WAIT WINDOW "Opci<63>n B y ma's trampas"
|
||||||
ON SELECTION POPUP ALL DO MenuBarProc
|
ON SELECTION POPUP ALL DO MenuBarProc
|
||||||
ON SELECTION MENU _MSYSMENU DO SELECTION_MENU__MSYSMENU_FB2P
|
ON SELECTION MENU _MSYSMENU DO SELECTION_MENU__MSYSMENU_FB2P
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
@@ -45,7 +45,7 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__lineIsOnlyCommentAndNoMetadata AS
|
|||||||
*******************************************************************************************************************************************
|
*******************************************************************************************************************************************
|
||||||
FUNCTION Evaluate_results
|
FUNCTION Evaluate_results
|
||||||
LPARAMETERS toEx AS EXCEPTION, tnCodError_Esperado ;
|
LPARAMETERS toEx AS EXCEPTION, tnCodError_Esperado ;
|
||||||
, tcLinea, tcComentario, tlRetorno, tcLinea_Esperada, tcComentario_Esperado, tlRetorno_Esperado
|
, tcLinea, tcComentario, tlRetorno, tcLinea_Esperada, tcComentario_Esperado, tlRetorno_Esperado, tcLineaOriginal
|
||||||
|
|
||||||
#IF .F.
|
#IF .F.
|
||||||
PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
|
PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
|
||||||
@@ -64,12 +64,14 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__lineIsOnlyCommentAndNoMetadata AS
|
|||||||
tcLinea_Esperada = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcLinea_Esperada )
|
tcLinea_Esperada = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcLinea_Esperada )
|
||||||
tcComentario = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcComentario )
|
tcComentario = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcComentario )
|
||||||
tcComentario_Esperado = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcComentario_Esperado )
|
tcComentario_Esperado = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcComentario_Esperado )
|
||||||
|
tcLineaOriginal = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcLineaOriginal )
|
||||||
|
|
||||||
|
|
||||||
*-- Visualizaci<63>n de valores
|
*-- Visualizaci<63>n de valores
|
||||||
|
THIS.messageout( ' L<>nea original = [' + tcLineaOriginal + ']' )
|
||||||
THIS.messageout( ' Linea = [' + TRANSFORM(tcLinea) + ']' )
|
THIS.messageout( ' Linea = [' + TRANSFORM(tcLinea) + ']' )
|
||||||
THIS.messageout( ' Comentario = [' + TRANSFORM(tcComentario) + ']' )
|
THIS.messageout( ' Comentario = [' + TRANSFORM(tcComentario) + ']' )
|
||||||
THIS.messageout( ' tlRetorno = [' + TRANSFORM(tlRetorno) + ']' )
|
THIS.messageout( ' OnlyCommentAndNoMetadata? = [' + TRANSFORM(tlRetorno) + ']' )
|
||||||
|
|
||||||
|
|
||||||
*-- Evaluaci<63>n de valores
|
*-- Evaluaci<63>n de valores
|
||||||
@@ -99,20 +101,22 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__lineIsOnlyCommentAndNoMetadata AS
|
|||||||
|
|
||||||
*-- DATOS DE ENTRADA
|
*-- DATOS DE ENTRADA
|
||||||
STORE 0 TO lnCodError
|
STORE 0 TO lnCodError
|
||||||
lcComentario = ' ' + CHR(9) + CHR(9) + 'con algunos comentarios '
|
|
||||||
lcLinea = ' ' + CHR(9) + CHR(9) + ' esta es una linea de c<>digo ' + CHR(9) + ' '
|
lcLinea = ' ' + CHR(9) + CHR(9) + ' esta es una linea de c<>digo ' + CHR(9) + ' '
|
||||||
|
lcComentario = ' ' + CHR(9) + CHR(9) + 'con algunos comentarios '
|
||||||
lcLineaOriginal = lcLinea + '&' + '&' + lcComentario
|
lcLineaOriginal = lcLinea + '&' + '&' + lcComentario
|
||||||
|
lcLineaOriginal = LTRIM(lcLineaOriginal, 0, CHR(9), ' ' ) && Este tratamiento lo hace set_Line normalmente
|
||||||
|
|
||||||
*-- DATOS ESPERADOS
|
*-- DATOS ESPERADOS
|
||||||
STORE 0 TO lnCodError_Esperado
|
STORE 0 TO lnCodError_Esperado
|
||||||
lcLinea_Esperada = lcLinea
|
lcLinea_Esperada = ALLTRIM(lcLinea, 0, CHR(9), ' ' )
|
||||||
lcComentario_Esperado = LTRIM(lcComentario)
|
lcComentario_Esperado = LTRIM(lcComentario)
|
||||||
llRetorno_Esperado = .F.
|
llRetorno_Esperado = .F.
|
||||||
|
lcLinea = LTRIM( lcLineaOriginal, 0, CHR(9), ' ' ) && Este tratamiento lo hace set_Line normalmente
|
||||||
|
|
||||||
*-- TEST
|
*-- TEST
|
||||||
llRetorno = loObj.lineIsOnlyCommentAndNoMetadata( @lcLineaOriginal, @lcComentario )
|
llRetorno = loObj.lineIsOnlyCommentAndNoMetadata( @lcLinea, @lcComentario )
|
||||||
|
|
||||||
THIS.Evaluate_results( loEx, lnCodError_Esperado, @lcLinea, @lcComentario, @llRetorno, @lcLinea_Esperada, @lcComentario_Esperado, @llRetorno_Esperado )
|
THIS.Evaluate_results( loEx, lnCodError_Esperado, @lcLinea, @lcComentario, @llRetorno, @lcLinea_Esperada, @lcComentario_Esperado, @llRetorno_Esperado, @lcLineaOriginal )
|
||||||
|
|
||||||
ENDFUNC
|
ENDFUNC
|
||||||
|
|
||||||
@@ -128,27 +132,29 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__lineIsOnlyCommentAndNoMetadata AS
|
|||||||
|
|
||||||
*-- DATOS DE ENTRADA
|
*-- DATOS DE ENTRADA
|
||||||
STORE 0 TO lnCodError
|
STORE 0 TO lnCodError
|
||||||
|
lcLinea = ' *<TAG> esta es una linea de c<>digo ' && Empieza con "*<", por lo que es metadata la l<>nea
|
||||||
lcComentario = ' con algunos comentarios '
|
lcComentario = ' con algunos comentarios '
|
||||||
lcLinea = ' *<TAG> esta es una linea de c<>digo '
|
|
||||||
lcLineaOriginal = lcLinea + '&' + '&' + lcComentario
|
lcLineaOriginal = lcLinea + '&' + '&' + lcComentario
|
||||||
lcLineaOriginal = LTRIM( lcLineaOriginal, 0, CHR(9), ' ' )
|
lcLineaOriginal = LTRIM(lcLineaOriginal, 0, CHR(9), ' ' ) && Este tratamiento lo hace set_Line normalmente
|
||||||
|
|
||||||
*-- DATOS ESPERADOS
|
*-- DATOS ESPERADOS
|
||||||
STORE 0 TO lnCodError_Esperado
|
STORE 0 TO lnCodError_Esperado
|
||||||
lcLinea_Esperada = ALLTRIM( lcLinea, 0, CHR(9), ' ' )
|
*lcLinea_Esperada = LTRIM(lcLineaOriginal, 0, CHR(9), ' ' ) &&ALLTRIM( lcLinea, 0, CHR(9), ' ' )
|
||||||
lcComentario_Esperado = lcLinea_Esperada
|
lcLinea_Esperada = ALLTRIM(lcLinea, 0, CHR(9), ' ' )
|
||||||
|
lcComentario_Esperado = lcLinea_Esperada && Se espera la l<>nea, porque es todo comentario
|
||||||
llRetorno_Esperado = .F.
|
llRetorno_Esperado = .F.
|
||||||
|
lcLinea = LTRIM( lcLineaOriginal, 0, CHR(9), ' ' ) && Este tratamiento lo hace set_Line normalmente
|
||||||
|
|
||||||
*-- TEST
|
*-- TEST
|
||||||
llRetorno = loObj.lineIsOnlyCommentAndNoMetadata( @lcLineaOriginal, @lcComentario )
|
llRetorno = loObj.lineIsOnlyCommentAndNoMetadata( @lcLinea, @lcComentario )
|
||||||
|
|
||||||
THIS.Evaluate_results( loEx, lnCodError_Esperado, @lcLineaOriginal, @lcComentario, @llRetorno, @lcLinea_Esperada, @lcComentario_Esperado, @llRetorno_Esperado )
|
THIS.Evaluate_results( loEx, lnCodError_Esperado, @lcLinea, @lcComentario, @llRetorno, @lcLinea_Esperada, @lcComentario_Esperado, @llRetorno_Esperado, @lcLineaOriginal )
|
||||||
|
|
||||||
ENDFUNC
|
ENDFUNC
|
||||||
|
|
||||||
|
|
||||||
*******************************************************************************************************************************************
|
*******************************************************************************************************************************************
|
||||||
FUNCTION Deberia_DevolverSeparados_LineaDeCodigo_y_Valor_y_Retornar_True
|
FUNCTION Deberia_DevolverLaLineaDeCodigoComoComentario_y_Retornar_True
|
||||||
LOCAL lnCodError, lcMenError, lnCodError_Esperado ;
|
LOCAL lnCodError, lcMenError, lnCodError_Esperado ;
|
||||||
, lcLinea, lcLineaOriginal, lcComentario, lcLinea_Esperada, lcComentario_Esperado, llRetorno, llRetorno_Esperado ;
|
, lcLinea, lcLineaOriginal, lcComentario, lcLinea_Esperada, lcComentario_Esperado, llRetorno, llRetorno_Esperado ;
|
||||||
, loEx AS EXCEPTION
|
, loEx AS EXCEPTION
|
||||||
@@ -158,21 +164,84 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__lineIsOnlyCommentAndNoMetadata AS
|
|||||||
|
|
||||||
*-- DATOS DE ENTRADA
|
*-- DATOS DE ENTRADA
|
||||||
STORE 0 TO lnCodError
|
STORE 0 TO lnCodError
|
||||||
|
lcLinea = ' * esta es una linea de c<>digo ' && Empieza con "*", por lo que es solo comentario la l<>nea
|
||||||
lcComentario = ' con algunos comentarios '
|
lcComentario = ' con algunos comentarios '
|
||||||
lcLinea = ' * esta es una linea de c<>digo '
|
|
||||||
lcLineaOriginal = lcLinea + '&' + '&' + lcComentario
|
lcLineaOriginal = lcLinea + '&' + '&' + lcComentario
|
||||||
lcLineaOriginal = LTRIM(lcLineaOriginal, 0, CHR(9), ' ')
|
lcLineaOriginal = LTRIM(lcLineaOriginal, 0, CHR(9), ' ')
|
||||||
|
|
||||||
*-- DATOS ESPERADOS
|
*-- DATOS ESPERADOS
|
||||||
STORE 0 TO lnCodError_Esperado
|
STORE 0 TO lnCodError_Esperado
|
||||||
lcLinea_Esperada = lcLinea
|
lcLinea_Esperada = ALLTRIM(lcLinea, 0, CHR(9), ' ' )
|
||||||
lcComentario_Esperado = LTRIM(lcComentario)
|
lcComentario_Esperado = LTRIM(lcComentario)
|
||||||
llRetorno_Esperado = .T.
|
llRetorno_Esperado = .T.
|
||||||
|
lcLinea = LTRIM( lcLineaOriginal, 0, CHR(9), ' ' ) && Este tratamiento lo hace set_Line normalmente
|
||||||
|
|
||||||
*-- TEST
|
*-- TEST
|
||||||
llRetorno = loObj.lineIsOnlyCommentAndNoMetadata( @lcLineaOriginal, @lcComentario )
|
llRetorno = loObj.lineIsOnlyCommentAndNoMetadata( @lcLinea, @lcComentario )
|
||||||
|
|
||||||
THIS.Evaluate_results( loEx, lnCodError_Esperado, @lcLinea, @lcComentario, @llRetorno, @lcLinea_Esperada, @lcComentario_Esperado, @llRetorno_Esperado )
|
THIS.Evaluate_results( loEx, lnCodError_Esperado, @lcLinea, @lcComentario, @llRetorno, @lcLinea_Esperada, @lcComentario_Esperado, @llRetorno_Esperado, @lcLineaOriginal )
|
||||||
|
|
||||||
|
ENDFUNC
|
||||||
|
|
||||||
|
|
||||||
|
*******************************************************************************************************************************************
|
||||||
|
FUNCTION Deberia_DevolverSeparados_LineaDeCodigoQueIncluye_DobleAmpersand_y_Valor_y_Retornar_False
|
||||||
|
LOCAL lnCodError, lcMenError, lnCodError_Esperado ;
|
||||||
|
, lcLinea, lcLineaOriginal, lcComentario, lcLinea_Esperada, lcComentario_Esperado, llRetorno, llRetorno_Esperado ;
|
||||||
|
, loEx AS EXCEPTION
|
||||||
|
LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
|
||||||
|
loObj = THIS.icObj
|
||||||
|
loEx = NULL
|
||||||
|
|
||||||
|
*-- DATOS DE ENTRADA
|
||||||
|
STORE 0 TO lnCodError
|
||||||
|
lcLinea = [DEFINE BAR 2 OF Opci<63>nAsub PROMPT ""+var+'aa'+]+'["bb]'+[+"Opci<63>n A&]+[&2"] && No debe confundir el '&&' del c<>digo con comentarios
|
||||||
|
lcComentario = [ Comentario Opci<63>n A-2]
|
||||||
|
lcLineaOriginal = lcLinea + '&' + '&' + lcComentario
|
||||||
|
lcLineaOriginal = LTRIM(lcLineaOriginal, 0, CHR(9), ' ' ) && Este tratamiento lo hace set_Line normalmente
|
||||||
|
|
||||||
|
*-- DATOS ESPERADOS
|
||||||
|
STORE 0 TO lnCodError_Esperado
|
||||||
|
lcLinea_Esperada = ALLTRIM(lcLinea, 0, CHR(9), ' ' )
|
||||||
|
lcComentario_Esperado = LTRIM(lcComentario)
|
||||||
|
llRetorno_Esperado = .F.
|
||||||
|
lcLinea = LTRIM( lcLineaOriginal, 0, CHR(9), ' ' ) && Este tratamiento lo hace set_Line normalmente
|
||||||
|
|
||||||
|
*-- TEST
|
||||||
|
llRetorno = loObj.lineIsOnlyCommentAndNoMetadata( @lcLinea, @lcComentario, .F., .T. ) && Activando Deep Comment Analysis
|
||||||
|
|
||||||
|
THIS.Evaluate_results( loEx, lnCodError_Esperado, @lcLinea, @lcComentario, @llRetorno, @lcLinea_Esperada, @lcComentario_Esperado, @llRetorno_Esperado, @lcLineaOriginal )
|
||||||
|
|
||||||
|
ENDFUNC
|
||||||
|
|
||||||
|
|
||||||
|
*******************************************************************************************************************************************
|
||||||
|
FUNCTION Deberia_DevolverSeparados_LineaDeCodigoQueIncluye_DobleAmpersand_y_ComentarioConComillas_y_Retornar_False
|
||||||
|
LOCAL lnCodError, lcMenError, lnCodError_Esperado ;
|
||||||
|
, lcLinea, lcLineaOriginal, lcComentario, lcLinea_Esperada, lcComentario_Esperado, llRetorno, llRetorno_Esperado ;
|
||||||
|
, loEx AS EXCEPTION
|
||||||
|
LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
|
||||||
|
loObj = THIS.icObj
|
||||||
|
loEx = NULL
|
||||||
|
|
||||||
|
*-- DATOS DE ENTRADA
|
||||||
|
STORE 0 TO lnCodError
|
||||||
|
lcLinea = [DEFINE BAR 2 OF Opci<63>nAsub PROMPT ""+var+'aa'+]+'["bb]'+[+"Opci<63>n A&]+[&2"] && No debe confundir el '&&' del c<>digo con comentarios
|
||||||
|
lcComentario = [ Comentario's Opci<63>n A-2]
|
||||||
|
lcLineaOriginal = lcLinea + '&' + '&' + lcComentario
|
||||||
|
lcLineaOriginal = LTRIM(lcLineaOriginal, 0, CHR(9), ' ' ) && Este tratamiento lo hace set_Line normalmente
|
||||||
|
|
||||||
|
*-- DATOS ESPERADOS
|
||||||
|
STORE 0 TO lnCodError_Esperado
|
||||||
|
lcLinea_Esperada = ALLTRIM(lcLinea, 0, CHR(9), ' ' )
|
||||||
|
lcComentario_Esperado = LTRIM(lcComentario)
|
||||||
|
llRetorno_Esperado = .F.
|
||||||
|
lcLinea = LTRIM( lcLineaOriginal, 0, CHR(9), ' ' ) && Este tratamiento lo hace set_Line normalmente
|
||||||
|
|
||||||
|
*-- TEST
|
||||||
|
llRetorno = loObj.lineIsOnlyCommentAndNoMetadata( @lcLinea, @lcComentario, .F., .T. ) && Activando Deep Comment Analysis
|
||||||
|
|
||||||
|
THIS.Evaluate_results( loEx, lnCodError_Esperado, @lcLinea, @lcComentario, @llRetorno, @lcLinea_Esperada, @lcComentario_Esperado, @llRetorno_Esperado, @lcLineaOriginal )
|
||||||
|
|
||||||
ENDFUNC
|
ENDFUNC
|
||||||
|
|
||||||
|
|||||||
BIN
foxbin2prg.exe
BIN
foxbin2prg.exe
Binary file not shown.
335
foxbin2prg.prg
335
foxbin2prg.prg
@@ -173,6 +173,7 @@
|
|||||||
* 22/06/2015 FDBOZZO v1.19.46 Bug Fix: Arreglo de bug en m<>todo set_UserValue() cuando se intenta obtener informaci<63>n de un error que no puede abrir la tabla (por ej, porque el memo est<73> corrupto)
|
* 22/06/2015 FDBOZZO v1.19.46 Bug Fix: Arreglo de bug en m<>todo set_UserValue() cuando se intenta obtener informaci<63>n de un error que no puede abrir la tabla (por ej, porque el memo est<73> corrupto)
|
||||||
* 22/06/2015 FDBOZZO v1.19.46 Mejora: Agregado soporte interno para consulta de informaci<63>n de cfg de directorio, mediante nuevo par<61>metro opcional, para los m<>todos API que lo requieren (por ej: get_Ext2FromExt, hasSupport*)
|
* 22/06/2015 FDBOZZO v1.19.46 Mejora: Agregado soporte interno para consulta de informaci<63>n de cfg de directorio, mediante nuevo par<61>metro opcional, para los m<>todos API que lo requieren (por ej: get_Ext2FromExt, hasSupport*)
|
||||||
* 29/07/2015 FDBOZZO v1.19.46 Bug Fix: Cuando se procesa un directorio o un proyecto con todos los archivos, a veces puede ocurrir el error "Alias already in use" (Dave Crozier)
|
* 29/07/2015 FDBOZZO v1.19.46 Bug Fix: Cuando se procesa un directorio o un proyecto con todos los archivos, a veces puede ocurrir el error "Alias already in use" (Dave Crozier)
|
||||||
|
* 01/09/2015 FDBOZZO v1.19.46 Bug Fix mnx: Cuando se usa '&&' en los textos de las opciones, se corrompe el binario del men<65> al regenerarlo (Walter Nichols)
|
||||||
* </HISTORIAL DE CAMBIOS Y NOTAS IMPORTANTES>
|
* </HISTORIAL DE CAMBIOS Y NOTAS IMPORTANTES>
|
||||||
*
|
*
|
||||||
*---------------------------------------------------------------------------------------------------
|
*---------------------------------------------------------------------------------------------------
|
||||||
@@ -263,6 +264,8 @@
|
|||||||
* 09/06/2015 Lutz Scheffler Reporte bug v1.19.44: Cuando se procesan m<>ltiples archivos PJ2, puede ocurrir un error de "variable llError no definida" (Arreglado en v1.19.45)
|
* 09/06/2015 Lutz Scheffler Reporte bug v1.19.44: Cuando se procesan m<>ltiples archivos PJ2, puede ocurrir un error de "variable llError no definida" (Arreglado en v1.19.45)
|
||||||
* 13/06/2015 Matt Slay Reporte bug v1.19.44: Los proyectos PJX/PJ2 que referencian archivos de otras unidades de disco causan errores ne esos archivos al procesar con las opciones "*" o "*-" (Arreglado en v1.19.45)
|
* 13/06/2015 Matt Slay Reporte bug v1.19.44: Los proyectos PJX/PJ2 que referencian archivos de otras unidades de disco causan errores ne esos archivos al procesar con las opciones "*" o "*-" (Arreglado en v1.19.45)
|
||||||
* 29/07/2015 Dave Crozier Reporte Bug v1.19.45: Cuando se procesa un directorio o un proyecto con todos los archivos, a veces puede ocurrir el error "Alias already in use" (Arreglado en v1.19.46)
|
* 29/07/2015 Dave Crozier Reporte Bug v1.19.45: Cuando se procesa un directorio o un proyecto con todos los archivos, a veces puede ocurrir el error "Alias already in use" (Arreglado en v1.19.46)
|
||||||
|
* 29/07/2015 Walter Nicholls Mejora DBF-Data v1.19.45: Permitir exportar e importar datos de los DBF
|
||||||
|
* 28/08/2015 Walter Nicholls Reporte Bug: Cuando se usa '&&' en los textos de las opciones, se corrompe el binario del men<65> al regenerarlo (Arreglado en v1.19.46)
|
||||||
* </TESTEO Y REPORTE DE BUGS (AGRADECIMIENTOS)>
|
* </TESTEO Y REPORTE DE BUGS (AGRADECIMIENTOS)>
|
||||||
*
|
*
|
||||||
*---------------------------------------------------------------------------------------------------
|
*---------------------------------------------------------------------------------------------------
|
||||||
@@ -3792,22 +3795,88 @@ DEFINE CLASS c_foxbin2prg AS Session
|
|||||||
* PAR<41>METROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT)
|
* PAR<41>METROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT)
|
||||||
* tcLine (!@ IN/OUT) L<>nea a separar del comentario
|
* tcLine (!@ IN/OUT) L<>nea a separar del comentario
|
||||||
* tcComment (@? OUT) Comentario
|
* tcComment (@? OUT) Comentario
|
||||||
|
* tlDeepCommentAnalysis (v? IN ) Indica realizar un an<61>lisis profundo de comentarios (para detectar casos complejos de c<>digo con '&&' embebido)
|
||||||
*---------------------------------------------------------------------------------------------------
|
*---------------------------------------------------------------------------------------------------
|
||||||
LPARAMETERS tcLine, tcComment
|
LPARAMETERS tcLine as String, tcComment as String, tlDeepCommentAnalysis as Boolean
|
||||||
LOCAL ln_AT_Cmt
|
LOCAL ln_AT_Cmt
|
||||||
tcComment = ''
|
tcComment = ''
|
||||||
ln_AT_Cmt = AT( '&'+'&', tcLine)
|
ln_AT_Cmt = AT( '&'+'&', tcLine)
|
||||||
|
|
||||||
IF ln_AT_Cmt > 0
|
IF ln_AT_Cmt > 0
|
||||||
tcComment = LTRIM( SUBSTR( tcLine, ln_AT_Cmt + 2 ) )
|
IF tlDeepCommentAnalysis THEN
|
||||||
tcLine = RTRIM( LEFT( tcLine, ln_AT_Cmt - 1 ), 0, CHR(9), ' ' ) && Quito TABS y espacios
|
LOCAL laSeparador(3,3), lcSeparadoresIzq, lcSeparadoresDer, lcStr, lnAT_Amp, lnAT1, lnAT2, lnLen, I, X
|
||||||
|
|
||||||
|
lcStr = tcLine &&EVL(tcStr, [DEFINE BAR 2 OF Opci<63>nAsub PROMPT "Opci<63>n A&]+[&2" &]+[& Comentario Opci<63>n A-2])
|
||||||
|
laSeparador(1,1) = '"'
|
||||||
|
laSeparador(1,2) = '"'
|
||||||
|
laSeparador(1,3) = 2
|
||||||
|
laSeparador(2,1) = "'"
|
||||||
|
laSeparador(2,2) = "'"
|
||||||
|
laSeparador(2,3) = 2
|
||||||
|
laSeparador(3,1) = '['
|
||||||
|
laSeparador(3,2) = ']'
|
||||||
|
laSeparador(3,3) = 1
|
||||||
|
lcSeparadoresIzq = laSeparador(1,1) + laSeparador(2,1) + laSeparador(3,1)
|
||||||
|
lcSeparadoresDer = laSeparador(1,2) + laSeparador(2,2) + laSeparador(3,2)
|
||||||
|
lnLen = LEN(lcStr)
|
||||||
|
|
||||||
|
*-- Anular subcadenas para luego encontrar comentarios '&&' (y analizar solo si existe al menos un '&&')
|
||||||
|
X = 1
|
||||||
|
lnAT1 = AT(laSeparador(X,1), lcStr)
|
||||||
|
|
||||||
|
*-- Funcionamiento:
|
||||||
|
*-- La anulaci<63>n de subcadenas se hace comenzando desde la primer comilla doble ["], y luego se va
|
||||||
|
*-- cancelando hasta la siguiente. A partir de ahi, se busca car<61>cter a car<61>cter el siguiente separador
|
||||||
|
*-- izquierdo de cadena ( '"[ ), se busca su pareja derecha y se cancela el texto entre ambos.
|
||||||
|
*-- La anulaci<63>n de subcadenas es temporal, solo para determinar la verdadera posici<63>n del comentario,
|
||||||
|
*-- por ejemplo, esto:
|
||||||
|
*-- DEFINE BAR 2 OF Opci<63>nAsub PROMPT ""+var+'aa'+["bb]+"Opci<63>n A&&2" && Comentario Opci<63>n A-2
|
||||||
|
*-- se convierte temporalmente en esto:
|
||||||
|
*-- DEFINE BAR 2 OF Opci<63>nAsub PROMPT XX+var+XXXX+XXXXX+XXXXXXXXXXXXX && Comentario Opci<63>n A-2
|
||||||
|
*-- lo que facilita encontrar el comentario '&&' real.
|
||||||
|
*-- Si se encuentra alg<6C>n separador de cadena que no cierre, se genera un error 10 (Syntax Error).
|
||||||
|
IF lnAT1 > 0 THEN
|
||||||
|
FOR I = lnAT1+1 TO lnLen
|
||||||
|
IF X > 0 THEN
|
||||||
|
lnAT2 = AT(laSeparador(X,2), lcStr, laSeparador(X,3))
|
||||||
|
|
||||||
|
IF lnAT2 > 0 THEN
|
||||||
|
lcStr = STUFF(lcStr, lnAT1, lnAT2-lnAT1+1, REPLICATE('X',lnAT2-lnAT1+1))
|
||||||
|
ELSE
|
||||||
|
ln_AT_Cmt = AT( '&'+'&', lcStr)
|
||||||
|
|
||||||
|
IF ln_AT_Cmt = 0 OR ln_AT_Cmt < lnAT1
|
||||||
|
*-- No tiene comentario '&&' real, o s<> lo tiene y adem<65>s contiene un delimitador de cadena como parte del comentario
|
||||||
|
EXIT
|
||||||
|
ELSE
|
||||||
|
ERROR 'Closing string delimiter <' + laSeparador(X,2) + '> not found: ' + tcLine
|
||||||
|
ENDIF
|
||||||
|
ENDIF
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
*-- Verifico si el car<61>cter es un separador de cadenas: '"[
|
||||||
|
X = AT( SUBSTR(lcStr, I, 1), lcSeparadoresIzq)
|
||||||
|
|
||||||
|
IF X > 0 THEN
|
||||||
|
lnAT1 = AT(laSeparador(X,1), lcStr)
|
||||||
|
ENDIF
|
||||||
|
ENDFOR
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
ln_AT_Cmt = AT( '&'+'&', lcStr)
|
||||||
|
ENDIF && tlDeepCommentAnalysis
|
||||||
|
|
||||||
|
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 y espacios
|
||||||
|
ENDIF
|
||||||
|
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
RETURN (ln_AT_Cmt > 0)
|
RETURN (ln_AT_Cmt > 0)
|
||||||
ENDPROC
|
ENDPROC
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
PROCEDURE normalizeFileCapitalization
|
PROCEDURE normalizeFileCapitalization
|
||||||
LPARAMETERS tl_NormalizeInputFile, tcFileName
|
LPARAMETERS tl_NormalizeInputFile, tcFileName
|
||||||
|
|
||||||
@@ -5925,20 +5994,84 @@ DEFINE CLASS c_conversor_base AS Custom
|
|||||||
* PAR<41>METROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT)
|
* PAR<41>METROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT)
|
||||||
* tcLine (!@ IN/OUT) L<>nea a separar del comentario
|
* tcLine (!@ IN/OUT) L<>nea a separar del comentario
|
||||||
* tcComment (@? OUT) Comentario
|
* tcComment (@? OUT) Comentario
|
||||||
|
* tlDeepCommentAnalysis (v? IN ) Indica realizar un an<61>lisis profundo de comentarios (para detectar casos complejos de c<>digo con '&&' embebido)
|
||||||
*---------------------------------------------------------------------------------------------------
|
*---------------------------------------------------------------------------------------------------
|
||||||
* NOTA: Recordar que esta funci<63>n suele usarse junto a Set_Line(), que quita TABS y espacios a la izquierda.
|
LPARAMETERS tcLine as String, tcComment as String, tlDeepCommentAnalysis as Boolean
|
||||||
*---------------------------------------------------------------------------------------------------
|
|
||||||
LPARAMETERS tcLine, tcComment
|
|
||||||
LOCAL ln_AT_Cmt
|
LOCAL ln_AT_Cmt
|
||||||
tcComment = ''
|
tcComment = ''
|
||||||
ln_AT_Cmt = AT( '&'+'&', tcLine)
|
ln_AT_Cmt = AT( '&'+'&', tcLine)
|
||||||
|
|
||||||
IF ln_AT_Cmt > 0
|
IF ln_AT_Cmt > 0
|
||||||
tcComment = LTRIM( SUBSTR( tcLine, ln_AT_Cmt + 2 ) )
|
IF tlDeepCommentAnalysis THEN
|
||||||
tcLine = RTRIM( LEFT( tcLine, ln_AT_Cmt - 1 ), 0, CHR(9), ' ' ) && Quito TABS y espacios de la derecha de la l<>nea de c<>digo
|
LOCAL laSeparador(3,3), lcSeparadoresIzq, lcSeparadoresDer, lcStr, lnAT_Amp, lnAT1, lnAT2, lnLen, I, X
|
||||||
|
|
||||||
|
lcStr = tcLine &&EVL(tcStr, [DEFINE BAR 2 OF Opci<63>nAsub PROMPT "Opci<63>n A&]+[&2" &]+[& Comentario Opci<63>n A-2])
|
||||||
|
laSeparador(1,1) = '"'
|
||||||
|
laSeparador(1,2) = '"'
|
||||||
|
laSeparador(1,3) = 2
|
||||||
|
laSeparador(2,1) = "'"
|
||||||
|
laSeparador(2,2) = "'"
|
||||||
|
laSeparador(2,3) = 2
|
||||||
|
laSeparador(3,1) = '['
|
||||||
|
laSeparador(3,2) = ']'
|
||||||
|
laSeparador(3,3) = 1
|
||||||
|
lcSeparadoresIzq = laSeparador(1,1) + laSeparador(2,1) + laSeparador(3,1)
|
||||||
|
lcSeparadoresDer = laSeparador(1,2) + laSeparador(2,2) + laSeparador(3,2)
|
||||||
|
lnLen = LEN(lcStr)
|
||||||
|
|
||||||
|
*-- Anular subcadenas para luego encontrar comentarios '&&' (y analizar solo si existe al menos un '&&')
|
||||||
|
X = 1
|
||||||
|
lnAT1 = AT(laSeparador(X,1), lcStr)
|
||||||
|
|
||||||
|
*-- Funcionamiento:
|
||||||
|
*-- La anulaci<63>n de subcadenas se hace comenzando desde la primer comilla doble ["], y luego se va
|
||||||
|
*-- cancelando hasta la siguiente. A partir de ahi, se busca car<61>cter a car<61>cter el siguiente separador
|
||||||
|
*-- izquierdo de cadena ( '"[ ), se busca su pareja derecha y se cancela el texto entre ambos.
|
||||||
|
*-- La anulaci<63>n de subcadenas es temporal, solo para determinar la verdadera posici<63>n del comentario,
|
||||||
|
*-- por ejemplo, esto:
|
||||||
|
*-- DEFINE BAR 2 OF Opci<63>nAsub PROMPT ""+var+'aa'+["bb]+"Opci<63>n A&&2" && Comentario Opci<63>n A-2
|
||||||
|
*-- se convierte temporalmente en esto:
|
||||||
|
*-- DEFINE BAR 2 OF Opci<63>nAsub PROMPT XX+var+XXXX+XXXXX+XXXXXXXXXXXXX && Comentario Opci<63>n A-2
|
||||||
|
*-- lo que facilita encontrar el comentario '&&' real.
|
||||||
|
*-- Si se encuentra alg<6C>n separador de cadena que no cierre, se genera un error 10 (Syntax Error).
|
||||||
|
IF lnAT1 > 0 THEN
|
||||||
|
FOR I = lnAT1+1 TO lnLen
|
||||||
|
IF X > 0 THEN
|
||||||
|
lnAT2 = AT(laSeparador(X,2), lcStr, laSeparador(X,3))
|
||||||
|
|
||||||
|
IF lnAT2 > 0 THEN
|
||||||
|
lcStr = STUFF(lcStr, lnAT1, lnAT2-lnAT1+1, REPLICATE('X',lnAT2-lnAT1+1))
|
||||||
|
ELSE
|
||||||
|
ln_AT_Cmt = AT( '&'+'&', lcStr)
|
||||||
|
|
||||||
|
IF ln_AT_Cmt = 0 OR ln_AT_Cmt < lnAT1
|
||||||
|
*-- No tiene comentario '&&' real, o s<> lo tiene y adem<65>s contiene un delimitador de cadena como parte del comentario
|
||||||
|
EXIT
|
||||||
|
ELSE
|
||||||
|
ERROR 'Closing string delimiter <' + laSeparador(X,2) + '> not found: ' + tcLine
|
||||||
|
ENDIF
|
||||||
|
ENDIF
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
*-- Verifico si el car<61>cter es un separador de cadenas: '"[
|
||||||
|
X = AT( SUBSTR(lcStr, I, 1), lcSeparadoresIzq)
|
||||||
|
|
||||||
|
IF X > 0 THEN
|
||||||
|
lnAT1 = AT(laSeparador(X,1), lcStr)
|
||||||
|
ENDIF
|
||||||
|
ENDFOR
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
ln_AT_Cmt = AT( '&'+'&', lcStr)
|
||||||
|
ENDIF && tlDeepCommentAnalysis
|
||||||
|
|
||||||
|
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 y espacios
|
||||||
|
ENDIF
|
||||||
|
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
RELEASE tcLine, tcComment
|
|
||||||
RETURN (ln_AT_Cmt > 0)
|
RETURN (ln_AT_Cmt > 0)
|
||||||
ENDPROC
|
ENDPROC
|
||||||
|
|
||||||
@@ -6153,16 +6286,22 @@ DEFINE CLASS c_conversor_base AS Custom
|
|||||||
PROCEDURE lineIsOnlyCommentAndNoMetadata
|
PROCEDURE lineIsOnlyCommentAndNoMetadata
|
||||||
*---------------------------------------------------------------------------------------------------
|
*---------------------------------------------------------------------------------------------------
|
||||||
* PAR<41>METROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT)
|
* PAR<41>METROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT)
|
||||||
* tcLine (!@ IN/OUT) L<>nea a separar del comentario
|
* tcLine (!@ IN/OUT) L<>nea a separar del comentario
|
||||||
* tcComment (@? OUT) Comentario
|
* tcComment (@? OUT) Comentario
|
||||||
|
* tlDoNotSeparateLineAndComment (v? IN ) Indica o separar la l<>nea de c<>digo del comentario
|
||||||
|
* tlDeepCommentAnalysis (v? IN ) Indica realizar un an<61>lisis profundo de comentarios (para detectar casos complejos de c<>digo con '&&' embebido)
|
||||||
*---------------------------------------------------------------------------------------------------
|
*---------------------------------------------------------------------------------------------------
|
||||||
* NOTA: Recordar que esta funci<63>n suele usarse junto a Set_Line(), que quita TABS y espacios a la izquierda.
|
* NOTA: Recordar que esta funci<63>n suele usarse junto a Set_Line(), que quita TABS y espacios a la izquierda.
|
||||||
*---------------------------------------------------------------------------------------------------
|
*---------------------------------------------------------------------------------------------------
|
||||||
LPARAMETERS tcLine, tcComment
|
LPARAMETERS tcLine as String, tcComment as String, tlDoNotSeparateLineAndComment as Boolean, tlDeepCommentAnalysis as Boolean
|
||||||
LOCAL lllineIsOnlyCommentAndNoMetadata, ln_AT_Cmt
|
LOCAL lllineIsOnlyCommentAndNoMetadata, ln_AT_Cmt
|
||||||
|
|
||||||
WITH THIS AS c_conversor_base OF 'FOXBIN2PRG.PRG'
|
WITH THIS AS c_conversor_base OF 'FOXBIN2PRG.PRG'
|
||||||
.get_SeparatedLineAndComment( @tcLine, @tcComment )
|
IF tlDoNotSeparateLineAndComment
|
||||||
|
tcComment = ''
|
||||||
|
ELSE
|
||||||
|
.get_SeparatedLineAndComment( @tcLine, @tcComment, tlDeepCommentAnalysis )
|
||||||
|
ENDIF
|
||||||
|
|
||||||
DO CASE
|
DO CASE
|
||||||
CASE LEFT(tcLine,2) == '*<'
|
CASE LEFT(tcLine,2) == '*<'
|
||||||
@@ -16588,20 +16727,84 @@ DEFINE CLASS CL_CUS_BASE AS CUSTOM
|
|||||||
* PAR<41>METROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT)
|
* PAR<41>METROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT)
|
||||||
* tcLine (!@ IN/OUT) L<>nea a separar del comentario
|
* tcLine (!@ IN/OUT) L<>nea a separar del comentario
|
||||||
* tcComment (@? OUT) Comentario
|
* tcComment (@? OUT) Comentario
|
||||||
|
* tlDeepCommentAnalysis (v? IN ) Indica realizar un an<61>lisis profundo de comentarios (para detectar casos complejos de c<>digo con '&&' embebido)
|
||||||
*---------------------------------------------------------------------------------------------------
|
*---------------------------------------------------------------------------------------------------
|
||||||
* NOTA: Recordar que esta funci<63>n suele usarse junto a Set_Line(), que quita TABS y espacios a la izquierda.
|
LPARAMETERS tcLine as String, tcComment as String, tlDeepCommentAnalysis as Boolean
|
||||||
*---------------------------------------------------------------------------------------------------
|
|
||||||
LPARAMETERS tcLine, tcComment
|
|
||||||
LOCAL ln_AT_Cmt
|
LOCAL ln_AT_Cmt
|
||||||
tcComment = ''
|
tcComment = ''
|
||||||
ln_AT_Cmt = AT( '&'+'&', tcLine)
|
ln_AT_Cmt = AT( '&'+'&', tcLine)
|
||||||
|
|
||||||
IF ln_AT_Cmt > 0
|
IF ln_AT_Cmt > 0
|
||||||
tcComment = LTRIM( SUBSTR( tcLine, ln_AT_Cmt + 2 ) )
|
IF tlDeepCommentAnalysis THEN
|
||||||
tcLine = RTRIM( LEFT( tcLine, ln_AT_Cmt - 1 ), 0, CHR(9), ' ' ) && Quito TABS y espacios de la derecha de la l<>nea de c<>digo
|
LOCAL laSeparador(3,3), lcSeparadoresIzq, lcSeparadoresDer, lcStr, lnAT_Amp, lnAT1, lnAT2, lnLen, I, X
|
||||||
|
|
||||||
|
lcStr = tcLine &&EVL(tcStr, [DEFINE BAR 2 OF Opci<63>nAsub PROMPT "Opci<63>n A&]+[&2" &]+[& Comentario Opci<63>n A-2])
|
||||||
|
laSeparador(1,1) = '"'
|
||||||
|
laSeparador(1,2) = '"'
|
||||||
|
laSeparador(1,3) = 2
|
||||||
|
laSeparador(2,1) = "'"
|
||||||
|
laSeparador(2,2) = "'"
|
||||||
|
laSeparador(2,3) = 2
|
||||||
|
laSeparador(3,1) = '['
|
||||||
|
laSeparador(3,2) = ']'
|
||||||
|
laSeparador(3,3) = 1
|
||||||
|
lcSeparadoresIzq = laSeparador(1,1) + laSeparador(2,1) + laSeparador(3,1)
|
||||||
|
lcSeparadoresDer = laSeparador(1,2) + laSeparador(2,2) + laSeparador(3,2)
|
||||||
|
lnLen = LEN(lcStr)
|
||||||
|
|
||||||
|
*-- Anular subcadenas para luego encontrar comentarios '&&' (y analizar solo si existe al menos un '&&')
|
||||||
|
X = 1
|
||||||
|
lnAT1 = AT(laSeparador(X,1), lcStr)
|
||||||
|
|
||||||
|
*-- Funcionamiento:
|
||||||
|
*-- La anulaci<63>n de subcadenas se hace comenzando desde la primer comilla doble ["], y luego se va
|
||||||
|
*-- cancelando hasta la siguiente. A partir de ahi, se busca car<61>cter a car<61>cter el siguiente separador
|
||||||
|
*-- izquierdo de cadena ( '"[ ), se busca su pareja derecha y se cancela el texto entre ambos.
|
||||||
|
*-- La anulaci<63>n de subcadenas es temporal, solo para determinar la verdadera posici<63>n del comentario,
|
||||||
|
*-- por ejemplo, esto:
|
||||||
|
*-- DEFINE BAR 2 OF Opci<63>nAsub PROMPT ""+var+'aa'+["bb]+"Opci<63>n A&&2" && Comentario Opci<63>n A-2
|
||||||
|
*-- se convierte temporalmente en esto:
|
||||||
|
*-- DEFINE BAR 2 OF Opci<63>nAsub PROMPT XX+var+XXXX+XXXXX+XXXXXXXXXXXXX && Comentario Opci<63>n A-2
|
||||||
|
*-- lo que facilita encontrar el comentario '&&' real.
|
||||||
|
*-- Si se encuentra alg<6C>n separador de cadena que no cierre, se genera un error 10 (Syntax Error).
|
||||||
|
IF lnAT1 > 0 THEN
|
||||||
|
FOR I = lnAT1+1 TO lnLen
|
||||||
|
IF X > 0 THEN
|
||||||
|
lnAT2 = AT(laSeparador(X,2), lcStr, laSeparador(X,3))
|
||||||
|
|
||||||
|
IF lnAT2 > 0 THEN
|
||||||
|
lcStr = STUFF(lcStr, lnAT1, lnAT2-lnAT1+1, REPLICATE('X',lnAT2-lnAT1+1))
|
||||||
|
ELSE
|
||||||
|
ln_AT_Cmt = AT( '&'+'&', lcStr)
|
||||||
|
|
||||||
|
IF ln_AT_Cmt = 0 OR ln_AT_Cmt < lnAT1
|
||||||
|
*-- No tiene comentario '&&' real, o s<> lo tiene y adem<65>s contiene un delimitador de cadena como parte del comentario
|
||||||
|
EXIT
|
||||||
|
ELSE
|
||||||
|
ERROR 'Closing string delimiter <' + laSeparador(X,2) + '> not found: ' + tcLine
|
||||||
|
ENDIF
|
||||||
|
ENDIF
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
*-- Verifico si el car<61>cter es un separador de cadenas: '"[
|
||||||
|
X = AT( SUBSTR(lcStr, I, 1), lcSeparadoresIzq)
|
||||||
|
|
||||||
|
IF X > 0 THEN
|
||||||
|
lnAT1 = AT(laSeparador(X,1), lcStr)
|
||||||
|
ENDIF
|
||||||
|
ENDFOR
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
ln_AT_Cmt = AT( '&'+'&', lcStr)
|
||||||
|
ENDIF && tlDeepCommentAnalysis
|
||||||
|
|
||||||
|
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 y espacios
|
||||||
|
ENDIF
|
||||||
|
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
RELEASE tcLine, tcComment
|
|
||||||
RETURN (ln_AT_Cmt > 0)
|
RETURN (ln_AT_Cmt > 0)
|
||||||
ENDPROC
|
ENDPROC
|
||||||
|
|
||||||
@@ -16699,20 +16902,84 @@ DEFINE CLASS CL_COL_BASE AS COLLECTION
|
|||||||
* PAR<41>METROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT)
|
* PAR<41>METROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT)
|
||||||
* tcLine (!@ IN/OUT) L<>nea a separar del comentario
|
* tcLine (!@ IN/OUT) L<>nea a separar del comentario
|
||||||
* tcComment (@? OUT) Comentario
|
* tcComment (@? OUT) Comentario
|
||||||
|
* tlDeepCommentAnalysis (v? IN ) Indica realizar un an<61>lisis profundo de comentarios (para detectar casos complejos de c<>digo con '&&' embebido)
|
||||||
*---------------------------------------------------------------------------------------------------
|
*---------------------------------------------------------------------------------------------------
|
||||||
* NOTA: Recordar que esta funci<63>n suele usarse junto a Set_Line(), que quita TABS y espacios a la izquierda.
|
LPARAMETERS tcLine as String, tcComment as String, tlDeepCommentAnalysis as Boolean
|
||||||
*---------------------------------------------------------------------------------------------------
|
|
||||||
LPARAMETERS tcLine, tcComment
|
|
||||||
LOCAL ln_AT_Cmt
|
LOCAL ln_AT_Cmt
|
||||||
tcComment = ''
|
tcComment = ''
|
||||||
ln_AT_Cmt = AT( '&'+'&', tcLine)
|
ln_AT_Cmt = AT( '&'+'&', tcLine)
|
||||||
|
|
||||||
IF ln_AT_Cmt > 0
|
IF ln_AT_Cmt > 0
|
||||||
tcComment = LTRIM( SUBSTR( tcLine, ln_AT_Cmt + 2 ) )
|
IF tlDeepCommentAnalysis THEN
|
||||||
tcLine = RTRIM( LEFT( tcLine, ln_AT_Cmt - 1 ), 0, CHR(9), ' ' ) && Quito TABS y espacios de la derecha de la l<>nea de c<>digo
|
LOCAL laSeparador(3,3), lcSeparadoresIzq, lcSeparadoresDer, lcStr, lnAT_Amp, lnAT1, lnAT2, lnLen, I, X
|
||||||
|
|
||||||
|
lcStr = tcLine &&EVL(tcStr, [DEFINE BAR 2 OF Opci<63>nAsub PROMPT "Opci<63>n A&]+[&2" &]+[& Comentario Opci<63>n A-2])
|
||||||
|
laSeparador(1,1) = '"'
|
||||||
|
laSeparador(1,2) = '"'
|
||||||
|
laSeparador(1,3) = 2
|
||||||
|
laSeparador(2,1) = "'"
|
||||||
|
laSeparador(2,2) = "'"
|
||||||
|
laSeparador(2,3) = 2
|
||||||
|
laSeparador(3,1) = '['
|
||||||
|
laSeparador(3,2) = ']'
|
||||||
|
laSeparador(3,3) = 1
|
||||||
|
lcSeparadoresIzq = laSeparador(1,1) + laSeparador(2,1) + laSeparador(3,1)
|
||||||
|
lcSeparadoresDer = laSeparador(1,2) + laSeparador(2,2) + laSeparador(3,2)
|
||||||
|
lnLen = LEN(lcStr)
|
||||||
|
|
||||||
|
*-- Anular subcadenas para luego encontrar comentarios '&&' (y analizar solo si existe al menos un '&&')
|
||||||
|
X = 1
|
||||||
|
lnAT1 = AT(laSeparador(X,1), lcStr)
|
||||||
|
|
||||||
|
*-- Funcionamiento:
|
||||||
|
*-- La anulaci<63>n de subcadenas se hace comenzando desde la primer comilla doble ["], y luego se va
|
||||||
|
*-- cancelando hasta la siguiente. A partir de ahi, se busca car<61>cter a car<61>cter el siguiente separador
|
||||||
|
*-- izquierdo de cadena ( '"[ ), se busca su pareja derecha y se cancela el texto entre ambos.
|
||||||
|
*-- La anulaci<63>n de subcadenas es temporal, solo para determinar la verdadera posici<63>n del comentario,
|
||||||
|
*-- por ejemplo, esto:
|
||||||
|
*-- DEFINE BAR 2 OF Opci<63>nAsub PROMPT ""+var+'aa'+["bb]+"Opci<63>n A&&2" && Comentario Opci<63>n A-2
|
||||||
|
*-- se convierte temporalmente en esto:
|
||||||
|
*-- DEFINE BAR 2 OF Opci<63>nAsub PROMPT XX+var+XXXX+XXXXX+XXXXXXXXXXXXX && Comentario Opci<63>n A-2
|
||||||
|
*-- lo que facilita encontrar el comentario '&&' real.
|
||||||
|
*-- Si se encuentra alg<6C>n separador de cadena que no cierre, se genera un error 10 (Syntax Error).
|
||||||
|
IF lnAT1 > 0 THEN
|
||||||
|
FOR I = lnAT1+1 TO lnLen
|
||||||
|
IF X > 0 THEN
|
||||||
|
lnAT2 = AT(laSeparador(X,2), lcStr, laSeparador(X,3))
|
||||||
|
|
||||||
|
IF lnAT2 > 0 THEN
|
||||||
|
lcStr = STUFF(lcStr, lnAT1, lnAT2-lnAT1+1, REPLICATE('X',lnAT2-lnAT1+1))
|
||||||
|
ELSE
|
||||||
|
ln_AT_Cmt = AT( '&'+'&', lcStr)
|
||||||
|
|
||||||
|
IF ln_AT_Cmt = 0 OR ln_AT_Cmt < lnAT1
|
||||||
|
*-- No tiene comentario '&&' real, o s<> lo tiene y adem<65>s contiene un delimitador de cadena como parte del comentario
|
||||||
|
EXIT
|
||||||
|
ELSE
|
||||||
|
ERROR 'Closing string delimiter <' + laSeparador(X,2) + '> not found: ' + tcLine
|
||||||
|
ENDIF
|
||||||
|
ENDIF
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
*-- Verifico si el car<61>cter es un separador de cadenas: '"[
|
||||||
|
X = AT( SUBSTR(lcStr, I, 1), lcSeparadoresIzq)
|
||||||
|
|
||||||
|
IF X > 0 THEN
|
||||||
|
lnAT1 = AT(laSeparador(X,1), lcStr)
|
||||||
|
ENDIF
|
||||||
|
ENDFOR
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
ln_AT_Cmt = AT( '&'+'&', lcStr)
|
||||||
|
ENDIF && tlDeepCommentAnalysis
|
||||||
|
|
||||||
|
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 y espacios
|
||||||
|
ENDIF
|
||||||
|
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
RELEASE tcLine, tcComment
|
|
||||||
RETURN (ln_AT_Cmt > 0)
|
RETURN (ln_AT_Cmt > 0)
|
||||||
ENDPROC
|
ENDPROC
|
||||||
|
|
||||||
@@ -23018,10 +23285,10 @@ DEFINE CLASS CL_DBF_RECORD AS CL_CUS_BASE
|
|||||||
DO CASE
|
DO CASE
|
||||||
CASE lcFieldType == 'G'
|
CASE lcFieldType == 'G'
|
||||||
luValue = 'GENERAL FIELD NOT SUPPORTED'
|
luValue = 'GENERAL FIELD NOT SUPPORTED'
|
||||||
CASE lcFieldType == 'W'
|
*CASE lcFieldType == 'W'
|
||||||
luValue = 'BLOB FIELD NOT SUPPORTED'
|
* luValue = 'BLOB FIELD NOT SUPPORTED'
|
||||||
CASE lcFieldType == 'Q'
|
*CASE lcFieldType == 'Q'
|
||||||
luValue = 'VARBINARY FIELD NOT SUPPORTED'
|
* luValue = 'VARBINARY FIELD NOT SUPPORTED'
|
||||||
OTHERWISE
|
OTHERWISE
|
||||||
luValue = EVALUATE(lcField)
|
luValue = EVALUATE(lcField)
|
||||||
ENDCASE
|
ENDCASE
|
||||||
@@ -23034,7 +23301,7 @@ DEFINE CLASS CL_DBF_RECORD AS CL_CUS_BASE
|
|||||||
ENDIF &&.Encode(luValue) <> luValue
|
ENDIF &&.Encode(luValue) <> luValue
|
||||||
ENDCASE
|
ENDCASE
|
||||||
TEXT TO lcText TEXTMERGE NOSHOW flags 1+2 PRETEXT 1+2 additive
|
TEXT TO lcText TEXTMERGE NOSHOW flags 1+2 PRETEXT 1+2 additive
|
||||||
<<>> <<'<' + lcField + '>'>><<luValue>></<<lcField>>>
|
<<>> <<'<' + lcField + '>'>><<luValue>><<'</' + lcField + '>'>>
|
||||||
ENDTEXT
|
ENDTEXT
|
||||||
NEXT
|
NEXT
|
||||||
|
|
||||||
@@ -23786,7 +24053,7 @@ DEFINE CLASS CL_MENU AS CL_MENU_COL_BASE
|
|||||||
CASE EMPTY( tcLine )
|
CASE EMPTY( tcLine )
|
||||||
LOOP
|
LOOP
|
||||||
|
|
||||||
CASE toConversor.lineIsOnlyCommentAndNoMetadata( @tcLine, @lcComment )
|
CASE toConversor.lineIsOnlyCommentAndNoMetadata( @tcLine, @lcComment, .F., .T. )
|
||||||
LOOP && Saltear comentarios
|
LOOP && Saltear comentarios
|
||||||
|
|
||||||
CASE NOT llBloque_MenuType_Analizado AND LEFT( tcLine, LEN(C_MENUTYPE_I) ) == C_MENUTYPE_I
|
CASE NOT llBloque_MenuType_Analizado AND LEFT( tcLine, LEN(C_MENUTYPE_I) ) == C_MENUTYPE_I
|
||||||
@@ -24512,7 +24779,7 @@ DEFINE CLASS CL_MENU_BARPOP AS CL_MENU_COL_BASE
|
|||||||
CASE EMPTY( tcLine )
|
CASE EMPTY( tcLine )
|
||||||
LOOP
|
LOOP
|
||||||
|
|
||||||
CASE toConversor.lineIsOnlyCommentAndNoMetadata( @tcLine, @lcComment )
|
CASE toConversor.lineIsOnlyCommentAndNoMetadata( @tcLine, @lcComment, .F., .T. )
|
||||||
LOOP && Saltear comentarios
|
LOOP && Saltear comentarios
|
||||||
|
|
||||||
CASE LEFT( tcLine, LEN(C_MENUCODE_F) ) == C_MENUCODE_F
|
CASE LEFT( tcLine, LEN(C_MENUCODE_F) ) == C_MENUCODE_F
|
||||||
@@ -24755,7 +25022,7 @@ DEFINE CLASS CL_MENU_OPTION AS CL_MENU_COL_BASE
|
|||||||
CASE EMPTY( tcLine )
|
CASE EMPTY( tcLine )
|
||||||
LOOP
|
LOOP
|
||||||
|
|
||||||
CASE toConversor.lineIsOnlyCommentAndNoMetadata( @tcLine, @lcComment )
|
CASE toConversor.lineIsOnlyCommentAndNoMetadata( @tcLine, @lcComment, .F., .T. )
|
||||||
LOOP && Saltear comentarios
|
LOOP && Saltear comentarios
|
||||||
|
|
||||||
CASE LEFT( tcLine, LEN(C_MENUCODE_F) ) == C_MENUCODE_F
|
CASE LEFT( tcLine, LEN(C_MENUCODE_F) ) == C_MENUCODE_F
|
||||||
|
|||||||
Reference in New Issue
Block a user