From 842dd4638f6f71366be80a1ebff0df9f8fe45b89 Mon Sep 17 00:00:00 2001 From: fdbozzo Date: Tue, 1 Sep 2015 16:46:39 +0200 Subject: [PATCH] =?UTF-8?q?Bug=20Fix=20mnx:=20Cuando=20se=20usa=20'&&'=20e?= =?UTF-8?q?n=20los=20textos=20de=20las=20opciones,=20se=20corrompe=20el=20?= =?UTF-8?q?binario=20del=20men=C3=BA=20al=20regenerarlo=20(Walter=20Nichol?= =?UTF-8?q?s)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CONFIG/config.fpw | 10 +- FoxBin2PRGVersionFile.txt | 5 +- TESTS/DATOS_READONLY/menu1.MNT | Bin 3198 -> 2492 bytes TESTS/DATOS_READONLY/menu1.mn2 | 30 +- TESTS/DATOS_READONLY/menu1.mnx | Bin 2345 -> 2345 bytes ...r_base__lineIsOnlyCommentAndNoMetadata.prg | 103 +++++- foxbin2prg.exe | Bin 599011 -> 606295 bytes foxbin2prg.prg | 335 ++++++++++++++++-- 8 files changed, 406 insertions(+), 77 deletions(-) diff --git a/CONFIG/config.fpw b/CONFIG/config.fpw index cc23e10..ef3f93b 100644 --- a/CONFIG/config.fpw +++ b/CONFIG/config.fpw @@ -1,10 +1,2 @@ -ALLOWEXTERNAL=OFF -RESOURCE=OFF SCREEN=OFF -_BLOWSER="" -_BUILDER="" -_REPORTBUILDER="" -_REPORTOUTPUT="" -_REPORTPREVIEW="" -_TASKPANE="" -_TOOLBOX="" +RESOURCE=OFF \ No newline at end of file diff --git a/FoxBin2PRGVersionFile.txt b/FoxBin2PRGVersionFile.txt index 8ffa60f..8c920f7 100644 --- a/FoxBin2PRGVersionFile.txt +++ b/FoxBin2PRGVersionFile.txt @@ -3,7 +3,7 @@ Lparameters toUpdateInfo Local lcNote With toUpdateInfo .VersionNumber = 'v1.19.46' - .VersionDate = Date(2015,07,28) + .VersionDate = Date(2015,09,01) .SourceFileUrl = 'http://vfpxrepository.com/dl/thorupdate/Projects/FoxBin2Prg/FoxBin2Prg.Zip' .Link = 'http://vfpx.codeplex.com/wikipage?title=FoxBin2PRG' @@ -17,12 +17,13 @@ Demo video using FoxBin2Prg with PlasticSCM: http://youtu.be/sE4wQ50Itqg 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) - 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 - 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 mnx: When menu options contains '&&' in their texts, menu binary is corrupted when regenerated (Walter Nichols) 2015/06/21 v1.19.45 diff --git a/TESTS/DATOS_READONLY/menu1.MNT b/TESTS/DATOS_READONLY/menu1.MNT index 0e068b592f2a540de4609b0d8a8611e970a81449..d36224de1f1e85bc78ec2d7226cccb52531dd232 100644 GIT binary patch literal 2492 zcmeHIO>fgc5DlUrYGJ9OaO!1}sObkJYLf~<)l#L2D_Jy7NK#dmDp?z6Q(PR|_(N&_ z8-IucCvKeBwP)9L3Kg6oN~C!9?aZ5*H{(KK`AeZtc)))DKmTS0c<ebg_ajBk41_|V0#;(bS>a%s3xO>mJ%;huitHH?X$iHrxYwQ9ob)jI^cTKQ9z4` zR0YjyrBdC!8%@TNhwHW4CHqdio7lCZ%gIeltWT~tbLjYra*|XVIp^^>$j z*|)PQ-pZ@W>c&*&@{XoHU|-bzuaZ?{E$jCcQXC?@Ss%pt5*UQ%r^L9l#A?= zX0-XeY%sf*2RIo>OQd=DhyBY9jqo8d+0V}wPex`^$NX7yxh7zqG?Nc@8S1hYk6Xk3 z=}QeOt>V<>jB7@B2v?5gk`WVgJ_g=9yrrOD626zqZ`!ocWD>!d7;=SVE!aMqbYn t&DW67F*0?;)GHVY7t zu&xf2OJyL+=jpBC7=V6FZV$x3%no+I&`SBDEltpcB=?3FNC+IDONoU-h6uelJq;~S zYXTK7hPI~vGEtj4VItR`E{OR%f&h5b6Z_Hc+#7)BBj0eT3C9%tlqCQtE1#v2dNv$y z?_`(RS(LjL)#_nKw~B!pIO^gXf^1Arq{!p~_aa$=4Qx+a?JCi9@&-VF!y1i;U9opQ z7Ezxd4KJqp4@3-PT8pVes>z1jD5V0m>&@JHkaBMtjVt<@TerTcdsp*YA8X%CYiW?# zHGu%Qjp@S9?`1Qf;#ufLfdUrEN(j`Ob;X}%M1h3=w_!`6RpDvAr_wX=)rsyIBvu3} zj<_lkZwO^EqDPErT_Fq2eKW{7?kMZc@BsNpwqnWgAO*BriXYF%0{}Ln6sfl$5DhM1 z0PNF@a$S6#$*2fN+Y{ZklB(L_(+ebMNo_V&rcQ0EEtRTM6p>gRksURmD%~W?J=n*0l-R#;05)t6ua3j=4J}Uv41lNI$+*8KX7{q+093-_E#v@r zEe|K?+7L}VrFjaD#$Kj$6)Rvld6HB&U%rvaVX!F%DT3~TP6SP@hFS$3Bclt9{K)qQ z-pZBY;aow&+A3!NIQgfnX4%)`vxiE{J)k0+w1;U5fX2$CJq#VC2}qlXpGjHfW?4PB zGxlfiKal;ja5e@NZ-YNI-Aoel9kPjIA={ccI!3yK@OS@beseGb5+0vPa`m3|Ak+fy z1>pP<_k)i8-U>cKv2+uau@(x`4*IL0K7^fiDm>D@eN^07Xc`~KQNQSwj)sN Yo(Cj6v1sE1aYYXRFS&bJ80n7i2N46<1ONa4 diff --git a/TESTS/DATOS_READONLY/menu1.mn2 b/TESTS/DATOS_READONLY/menu1.mn2 index 14c9144..106888d 100644 --- a/TESTS/DATOS_READONLY/menu1.mn2 +++ b/TESTS/DATOS_READONLY/menu1.mn2 @@ -14,28 +14,28 @@ * DEFINE MENU _MSYSMENU BAR -DEFINE PAD _43302YWGE OF _MSYSMENU PROMPT "Opción A con submenú" COLOR SCHEME 3 ; +DEFINE PAD _000000001 OF _MSYSMENU PROMPT "Opción A && submenú" COLOR SCHEME 3 ; NEGOTIATE NONE, LEFT ; KEY DEL, "Pulsar " ; SKIP FOR SKIP_FOR() ; - MESSAGE "Mensaje para Opción A con submenú" && Comentario + MESSAGE "Mensaje para Opción A con submenú" && Comentario's Opción A -ON PAD _43302YWGE OF _MSYSMENU ACTIVATE POPUP OpciónA_CS +ON PAD _000000001 OF _MSYSMENU ACTIVATE POPUP OpciónAsub *---------------------------------- - DEFINE POPUP OpciónA_CS MARGIN RELATIVE SHADOW COLOR SCHEME 4 - DEFINE BAR 1 OF OpciónA_CS PROMPT "Opción A-1" ; - PICTURE "..\..\foxunit\fxuacknowledgements.bmp" - ON BAR 1 OF OpciónA_CS ACTIVATE POPUP OpciónA1 + DEFINE POPUP OpciónAsub MARGIN RELATIVE SHADOW COLOR SCHEME 4 + DEFINE BAR 1 OF OpciónAsub PROMPT "Opción A-&&-1" ; + PICTURE "..\..\foxunit\fxuacknowledgements.bmp" && Comentario Opción A-1 + ON BAR 1 OF OpciónAsub ACTIVATE POPUP OpciónA1 *---------------------------------- DEFINE POPUP OpciónA1 MARGIN RELATIVE SHADOW COLOR SCHEME 4 - DEFINE BAR Shortcut_Menu_Title OF OpciónA1 PROMPT "OpciónA-1-Sub" ; - PICTURE "..\..\foxunit\fxuacknowledgements.bmp" - ON SELECTION BAR Shortcut_Menu_Title OF OpciónA1 wait window "Ejecuta Comando o función para Opción A-1" + DEFINE BAR Shortcut_Menu_Title OF OpciónA1 PROMPT "OpciónA-1-&&-Sub" ; + PICTURE "..\..\foxunit\fxuacknowledgements.bmp" && Comentario Opción A-1-sub con && trampa :) + ON SELECTION BAR Shortcut_Menu_Title OF OpciónA1 wait window "Ejecuta Comando o función 'trampa' para Opción A-&&-1" - DEFINE BAR 2 OF OpciónA_CS PROMPT "Opción A-2" - ON BAR 2 OF OpciónA_CS ACTIVATE POPUP OpciónA2Su + DEFINE BAR 2 OF OpciónAsub PROMPT "Opción A-2" && Comentario Opción A-2 + ON BAR 2 OF OpciónAsub ACTIVATE POPUP OpciónA2Su *---------------------------------- DEFINE POPUP Opció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 ; PICTRES _mfi_sysprint ; MESSAGE "Message para Opción A-2-Sub.3 (Tipo Bar#)" && Comentarios para Opción A-2-Sub.3 - ON SELECTION POPUP OpciónA_CS *-- PROCEDURE Le cambié el nombre! + ON SELECTION POPUP OpciónAsub *-- PROCEDURE Le cambié el nombre! DEFINE PAD opc_b OF _MSYSMENU PROMPT "Opción B con comando" COLOR SCHEME 3 ; KEY CTRL+B, "Pulse CTRL+B" ; SKIP FOR NOT glEnabled_Opc_B ; - MESSAGE "Mensaje para Opción B con Command" && Comentario de la Opción b + MESSAGE "Mensaje para Opción B con Command && con trampa's" && Comentario's de la Opción b -ON SELECTION PAD opc_b OF _MSYSMENU WAIT WINDOW "Opción B" +ON SELECTION PAD opc_b OF _MSYSMENU WAIT WINDOW "Opción B y ma's trampas" ON SELECTION POPUP ALL DO MenuBarProc ON SELECTION MENU _MSYSMENU DO SELECTION_MENU__MSYSMENU_FB2P diff --git a/TESTS/DATOS_READONLY/menu1.mnx b/TESTS/DATOS_READONLY/menu1.mnx index 5b374f17de0fb478c11ccab00be0b5fbb7c383b4..7608ce7e5266df1f4cac7bc889bd9d3d45b66f59 100644 GIT binary patch literal 2345 zcmeH}ziSjh6vsEeG$)E$D42kbU}+hre?Y~*!NOm)-#0UNH#=GK7dY@{hxeWLnfGSig@orTQx}3DSesRt zi(`5w2(sn%{;(@ZP*a$ui(5!fvK6Ca`!QX`Qj3t}9Hv<>zT3-Wx38VDQlclBl(AZ& z4f0%xE=8WltNI9eu|x+yu?470(5VJ@kS#nkwTI;OZ2?c?zXZX zltA7t(FvZc#R^xPa_Ii~Y9QNvA#+G7!sPcyD(;EYWSG>TpMkl9g25nHat9OjkUQx8 zh0+ZoV+ekIX_mzOc1F#ss0;k_^JGof4pggU`Y`Va${z7;On!Y3$M?Gq-9Mjt^8W|| z#&|^UUl^R8gU2)tF%|Bv#X{zckOCQJp;@qq@qO9 z$f}lBZ8T{6H%t6e02vxX=iP$cg&{YW#y8;ObtkuQ4<2{$r*LSHp}87z%O2l<^lLBP zKiHn+Rx9TA)*((nWwg+x@ehc@RfgerTHxNoO5vW7IVCeex~ZX3ZfTqz!=x0lac=d- z70_z1)KVv)lXBBE{t7WVw@mEcM;?nfNx>DMOO6$7cegbgzR1j>yCLmMkOZeWvj$j@w`U;;* zGu?ajv`L|kuTOK6^JrC_5_O1PP>1YV(kO}_7LX&i{-Q&+s!w*q2leJd{9+BH&>^(# z9RTlP9}6H;sf(jumP0#sZ;j>;5N760%p$&ir3$`H*bdCAwDtl%x;K7A3wnjmSbTx~ chF!=17d~whz8%;hjB<1ShD5L78^6NBKh{{wjQ{`u literal 2345 zcmeHI$&S-N5N(Fx0AeI|!LXHB1!9RkA&HP!jN{B?#%)`10)$0D0uD$BapAys^8>us zcG~S8i!Y$0Dp%L*dc9S*ds`>3ol;8eZDz1-**L0H{%U`|ED{3Q5txm37vga~u5ffe zglCa9ARv7VX4A_rX1OlrCa8~h;Bl^Xl#SUzZ*|~0Da&Zr453eV;NXwz1!U)ea}BN# zPsWQG81w}I{`|^hz9=e!Y#X?rZ}5sxU+&0{(%hx{X)(!XK$L#ifs;Jmi!y9+8UXjl&lY+*Pjm?= z3t{~FNR!t|TFo%-13v+Eg~{MxD1HvZ8ghl_pJb*$bOgX(Uz*3!e44X(Ggg5=ei`p2 zbp>X-UHGz`C7eC-r!fBd0NVZC2kwv0n*1+Hi3B0fza;@*mf#G{S(w(|Nn3hMlmJ2F zNGQQMdX5CVzruhqbgWDyTU*`(HjbY15GdIK5%|>2qkoaC_hSGsd`Y{9l+;SiyM<{RI686{us>63ute_YAjhefWW~ I^^&*$0_TdfnE(I) diff --git a/TESTS/ut__foxbin2prg__c_conversor_base__lineIsOnlyCommentAndNoMetadata.prg b/TESTS/ut__foxbin2prg__c_conversor_base__lineIsOnlyCommentAndNoMetadata.prg index da07d6b..c1b831f 100644 --- a/TESTS/ut__foxbin2prg__c_conversor_base__lineIsOnlyCommentAndNoMetadata.prg +++ b/TESTS/ut__foxbin2prg__c_conversor_base__lineIsOnlyCommentAndNoMetadata.prg @@ -45,7 +45,7 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__lineIsOnlyCommentAndNoMetadata AS ******************************************************************************************************************************************* FUNCTION Evaluate_results 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. 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 ) tcComentario = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcComentario ) tcComentario_Esperado = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcComentario_Esperado ) + tcLineaOriginal = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcLineaOriginal ) *-- Visualización de valores + THIS.messageout( ' Línea original = [' + tcLineaOriginal + ']' ) THIS.messageout( ' Linea = [' + TRANSFORM(tcLinea) + ']' ) THIS.messageout( ' Comentario = [' + TRANSFORM(tcComentario) + ']' ) - THIS.messageout( ' tlRetorno = [' + TRANSFORM(tlRetorno) + ']' ) + THIS.messageout( ' OnlyCommentAndNoMetadata? = [' + TRANSFORM(tlRetorno) + ']' ) *-- Evaluación de valores @@ -99,20 +101,22 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__lineIsOnlyCommentAndNoMetadata AS *-- DATOS DE ENTRADA 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) + ' ' + lcComentario = ' ' + CHR(9) + CHR(9) + 'con algunos comentarios ' 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 = lcLinea + 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( @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 @@ -128,27 +132,29 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__lineIsOnlyCommentAndNoMetadata AS *-- DATOS DE ENTRADA STORE 0 TO lnCodError + lcLinea = ' * esta es una linea de código ' && Empieza con "*<", por lo que es metadata la línea lcComentario = ' con algunos comentarios ' - lcLinea = ' * esta es una linea de código ' lcLineaOriginal = lcLinea + '&' + '&' + lcComentario - lcLineaOriginal = LTRIM( lcLineaOriginal, 0, CHR(9), ' ' ) + 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 = lcLinea_Esperada + *lcLinea_Esperada = LTRIM(lcLineaOriginal, 0, CHR(9), ' ' ) &&ALLTRIM( lcLinea, 0, CHR(9), ' ' ) + lcLinea_Esperada = ALLTRIM(lcLinea, 0, CHR(9), ' ' ) + lcComentario_Esperado = lcLinea_Esperada && Se espera la línea, porque es todo comentario llRetorno_Esperado = .F. + lcLinea = LTRIM( lcLineaOriginal, 0, CHR(9), ' ' ) && Este tratamiento lo hace set_Line normalmente *-- 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 ******************************************************************************************************************************************* - FUNCTION Deberia_DevolverSeparados_LineaDeCodigo_y_Valor_y_Retornar_True + FUNCTION Deberia_DevolverLaLineaDeCodigoComoComentario_y_Retornar_True LOCAL lnCodError, lcMenError, lnCodError_Esperado ; , lcLinea, lcLineaOriginal, lcComentario, lcLinea_Esperada, lcComentario_Esperado, llRetorno, llRetorno_Esperado ; , loEx AS EXCEPTION @@ -158,21 +164,84 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__lineIsOnlyCommentAndNoMetadata AS *-- DATOS DE ENTRADA 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 ' - lcLinea = ' * esta es una linea de código ' lcLineaOriginal = lcLinea + '&' + '&' + lcComentario lcLineaOriginal = LTRIM(lcLineaOriginal, 0, CHR(9), ' ') *-- DATOS ESPERADOS STORE 0 TO lnCodError_Esperado - lcLinea_Esperada = lcLinea + lcLinea_Esperada = ALLTRIM(lcLinea, 0, CHR(9), ' ' ) lcComentario_Esperado = LTRIM(lcComentario) llRetorno_Esperado = .T. + lcLinea = LTRIM( lcLineaOriginal, 0, CHR(9), ' ' ) && Este tratamiento lo hace set_Line normalmente *-- 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ónAsub PROMPT ""+var+'aa'+]+'["bb]'+[+"Opción A&]+[&2"] && No debe confundir el '&&' del código con comentarios + lcComentario = [ Comentario Opció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ónAsub PROMPT ""+var+'aa'+]+'["bb]'+[+"Opción A&]+[&2"] && No debe confundir el '&&' del código con comentarios + lcComentario = [ Comentario's Opció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 diff --git a/foxbin2prg.exe b/foxbin2prg.exe index de42d41522d642c0d48d96f2c406f775a331c5c7..4c826d075ca7c9c4e48b34ecc251312aced1b32e 100644 GIT binary patch delta 22190 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 KC;ZbTm;4V@EN937 diff --git a/foxbin2prg.prg b/foxbin2prg.prg index c69de09..d864dbf 100644 --- a/foxbin2prg.prg +++ b/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ón de un error que no puede abrir la tabla (por ej, porque el memo está corrupto) * 22/06/2015 FDBOZZO v1.19.46 Mejora: Agregado soporte interno para consulta de información de cfg de directorio, mediante nuevo pará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) +* 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ú al regenerarlo (Walter Nichols) * * *--------------------------------------------------------------------------------------------------- @@ -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) * 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 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ú al regenerarlo (Arreglado en v1.19.46) * * *--------------------------------------------------------------------------------------------------- @@ -3792,22 +3795,88 @@ DEFINE CLASS c_foxbin2prg AS Session * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) * tcLine (!@ IN/OUT) Línea a separar del comentario * tcComment (@? OUT) Comentario + * tlDeepCommentAnalysis (v? IN ) Indica realizar un aná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 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 y espacios + IF tlDeepCommentAnalysis THEN + LOCAL laSeparador(3,3), lcSeparadoresIzq, lcSeparadoresDer, lcStr, lnAT_Amp, lnAT1, lnAT2, lnLen, I, X + + lcStr = tcLine &&EVL(tcStr, [DEFINE BAR 2 OF OpciónAsub PROMPT "Opción A&]+[&2" &]+[& Comentario Opció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ó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ácter a carácter el siguiente separador + *-- izquierdo de cadena ( '"[ ), se busca su pareja derecha y se cancela el texto entre ambos. + *-- La anulación de subcadenas es temporal, solo para determinar la verdadera posición del comentario, + *-- por ejemplo, esto: + *-- DEFINE BAR 2 OF OpciónAsub PROMPT ""+var+'aa'+["bb]+"Opción A&&2" && Comentario Opción A-2 + *-- se convierte temporalmente en esto: + *-- DEFINE BAR 2 OF OpciónAsub PROMPT XX+var+XXXX+XXXXX+XXXXXXXXXXXXX && Comentario Opción A-2 + *-- lo que facilita encontrar el comentario '&&' real. + *-- Si se encuentra algú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á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á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 RETURN (ln_AT_Cmt > 0) ENDPROC - PROCEDURE normalizeFileCapitalization LPARAMETERS tl_NormalizeInputFile, tcFileName @@ -5925,20 +5994,84 @@ DEFINE CLASS c_conversor_base AS Custom * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) * tcLine (!@ IN/OUT) Línea a separar del comentario * tcComment (@? OUT) Comentario + * tlDeepCommentAnalysis (v? IN ) Indica realizar un análisis profundo de comentarios (para detectar casos complejos de código con '&&' embebido) *--------------------------------------------------------------------------------------------------- - * NOTA: Recordar que esta funció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, tlDeepCommentAnalysis as Boolean 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 y espacios de la derecha de la línea de código + IF tlDeepCommentAnalysis THEN + LOCAL laSeparador(3,3), lcSeparadoresIzq, lcSeparadoresDer, lcStr, lnAT_Amp, lnAT1, lnAT2, lnLen, I, X + + lcStr = tcLine &&EVL(tcStr, [DEFINE BAR 2 OF OpciónAsub PROMPT "Opción A&]+[&2" &]+[& Comentario Opció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ó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ácter a carácter el siguiente separador + *-- izquierdo de cadena ( '"[ ), se busca su pareja derecha y se cancela el texto entre ambos. + *-- La anulación de subcadenas es temporal, solo para determinar la verdadera posición del comentario, + *-- por ejemplo, esto: + *-- DEFINE BAR 2 OF OpciónAsub PROMPT ""+var+'aa'+["bb]+"Opción A&&2" && Comentario Opción A-2 + *-- se convierte temporalmente en esto: + *-- DEFINE BAR 2 OF OpciónAsub PROMPT XX+var+XXXX+XXXXX+XXXXXXXXXXXXX && Comentario Opción A-2 + *-- lo que facilita encontrar el comentario '&&' real. + *-- Si se encuentra algú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á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á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 - RELEASE tcLine, tcComment RETURN (ln_AT_Cmt > 0) ENDPROC @@ -6153,16 +6286,22 @@ DEFINE CLASS c_conversor_base AS Custom PROCEDURE lineIsOnlyCommentAndNoMetadata *--------------------------------------------------------------------------------------------------- * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tcLine (!@ IN/OUT) Línea a separar del comentario - * tcComment (@? OUT) Comentario + * tcLine (!@ IN/OUT) Línea a separar del 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álisis profundo de comentarios (para detectar casos complejos de código con '&&' embebido) *--------------------------------------------------------------------------------------------------- * NOTA: Recordar que esta funció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 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 CASE LEFT(tcLine,2) == '*<' @@ -16588,20 +16727,84 @@ DEFINE CLASS CL_CUS_BASE AS CUSTOM * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) * tcLine (!@ IN/OUT) Línea a separar del comentario * tcComment (@? OUT) Comentario + * tlDeepCommentAnalysis (v? IN ) Indica realizar un análisis profundo de comentarios (para detectar casos complejos de código con '&&' embebido) *--------------------------------------------------------------------------------------------------- - * NOTA: Recordar que esta funció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, tlDeepCommentAnalysis as Boolean 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 y espacios de la derecha de la línea de código + IF tlDeepCommentAnalysis THEN + LOCAL laSeparador(3,3), lcSeparadoresIzq, lcSeparadoresDer, lcStr, lnAT_Amp, lnAT1, lnAT2, lnLen, I, X + + lcStr = tcLine &&EVL(tcStr, [DEFINE BAR 2 OF OpciónAsub PROMPT "Opción A&]+[&2" &]+[& Comentario Opció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ó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ácter a carácter el siguiente separador + *-- izquierdo de cadena ( '"[ ), se busca su pareja derecha y se cancela el texto entre ambos. + *-- La anulación de subcadenas es temporal, solo para determinar la verdadera posición del comentario, + *-- por ejemplo, esto: + *-- DEFINE BAR 2 OF OpciónAsub PROMPT ""+var+'aa'+["bb]+"Opción A&&2" && Comentario Opción A-2 + *-- se convierte temporalmente en esto: + *-- DEFINE BAR 2 OF OpciónAsub PROMPT XX+var+XXXX+XXXXX+XXXXXXXXXXXXX && Comentario Opción A-2 + *-- lo que facilita encontrar el comentario '&&' real. + *-- Si se encuentra algú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á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á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 - RELEASE tcLine, tcComment RETURN (ln_AT_Cmt > 0) ENDPROC @@ -16699,20 +16902,84 @@ DEFINE CLASS CL_COL_BASE AS COLLECTION * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) * tcLine (!@ IN/OUT) Línea a separar del comentario * tcComment (@? OUT) Comentario + * tlDeepCommentAnalysis (v? IN ) Indica realizar un análisis profundo de comentarios (para detectar casos complejos de código con '&&' embebido) *--------------------------------------------------------------------------------------------------- - * NOTA: Recordar que esta funció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, tlDeepCommentAnalysis as Boolean 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 y espacios de la derecha de la línea de código + IF tlDeepCommentAnalysis THEN + LOCAL laSeparador(3,3), lcSeparadoresIzq, lcSeparadoresDer, lcStr, lnAT_Amp, lnAT1, lnAT2, lnLen, I, X + + lcStr = tcLine &&EVL(tcStr, [DEFINE BAR 2 OF OpciónAsub PROMPT "Opción A&]+[&2" &]+[& Comentario Opció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ó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ácter a carácter el siguiente separador + *-- izquierdo de cadena ( '"[ ), se busca su pareja derecha y se cancela el texto entre ambos. + *-- La anulación de subcadenas es temporal, solo para determinar la verdadera posición del comentario, + *-- por ejemplo, esto: + *-- DEFINE BAR 2 OF OpciónAsub PROMPT ""+var+'aa'+["bb]+"Opción A&&2" && Comentario Opción A-2 + *-- se convierte temporalmente en esto: + *-- DEFINE BAR 2 OF OpciónAsub PROMPT XX+var+XXXX+XXXXX+XXXXXXXXXXXXX && Comentario Opción A-2 + *-- lo que facilita encontrar el comentario '&&' real. + *-- Si se encuentra algú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á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á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 - RELEASE tcLine, tcComment RETURN (ln_AT_Cmt > 0) ENDPROC @@ -23018,10 +23285,10 @@ DEFINE CLASS CL_DBF_RECORD AS CL_CUS_BASE DO CASE CASE lcFieldType == 'G' luValue = 'GENERAL FIELD NOT SUPPORTED' - CASE lcFieldType == 'W' - luValue = 'BLOB FIELD NOT SUPPORTED' - CASE lcFieldType == 'Q' - luValue = 'VARBINARY FIELD NOT SUPPORTED' + *CASE lcFieldType == 'W' + * luValue = 'BLOB FIELD NOT SUPPORTED' + *CASE lcFieldType == 'Q' + * luValue = 'VARBINARY FIELD NOT SUPPORTED' OTHERWISE luValue = EVALUATE(lcField) ENDCASE @@ -23034,7 +23301,7 @@ DEFINE CLASS CL_DBF_RECORD AS CL_CUS_BASE ENDIF &&.Encode(luValue) <> luValue ENDCASE TEXT TO lcText TEXTMERGE NOSHOW flags 1+2 PRETEXT 1+2 additive - <<>> <<'<' + lcField + '>'>><>>> + <<>> <<'<' + lcField + '>'>><><<''>> ENDTEXT NEXT @@ -23786,7 +24053,7 @@ DEFINE CLASS CL_MENU AS CL_MENU_COL_BASE CASE EMPTY( tcLine ) LOOP - CASE toConversor.lineIsOnlyCommentAndNoMetadata( @tcLine, @lcComment ) + CASE toConversor.lineIsOnlyCommentAndNoMetadata( @tcLine, @lcComment, .F., .T. ) LOOP && Saltear comentarios 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 ) LOOP - CASE toConversor.lineIsOnlyCommentAndNoMetadata( @tcLine, @lcComment ) + CASE toConversor.lineIsOnlyCommentAndNoMetadata( @tcLine, @lcComment, .F., .T. ) LOOP && Saltear comentarios 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 ) LOOP - CASE toConversor.lineIsOnlyCommentAndNoMetadata( @tcLine, @lcComment ) + CASE toConversor.lineIsOnlyCommentAndNoMetadata( @tcLine, @lcComment, .F., .T. ) LOOP && Saltear comentarios CASE LEFT( tcLine, LEN(C_MENUCODE_F) ) == C_MENUCODE_F