From 1879285bc9bad4717f5325482dd2e9cba361cb7f Mon Sep 17 00:00:00 2001 From: fdbozzo Date: Tue, 29 Jul 2014 18:32:31 +0200 Subject: [PATCH 1/8] =?UTF-8?q?Changeset:=20381=20fdbozzo=20-=2029/07/2014?= =?UTF-8?q?=2017:48:43:=20-=20Nuevos=20casos=20de=20prueba=20para=20detecc?= =?UTF-8?q?i=C3=B3n=20correcta=20de=20text/endtext?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...or_base__IdentificarBloquesDeExclusion.prg | 61 +++++++++++++++++-- foxbin2prg.prg | 46 ++++++++++---- 2 files changed, 92 insertions(+), 15 deletions(-) diff --git a/TESTS/ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion.prg b/TESTS/ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion.prg index 0501f59..45e898f 100644 --- a/TESTS/ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion.prg +++ b/TESTS/ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion.prg @@ -159,7 +159,7 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion as ******************************************************************************************************************************************* - FUNCTION Deberia_NoEncontrarNingunBloque_TEXT_ENDTEXT_CuandoUnaLineaQueComienzaConUnCampoLlamado_Text_esEvaluado + FUNCTION Deberia_NoEncontrarBloque_TEXT_ENDTEXT_CuandoEvaluaUnaLineaQueComienzaConUnCampoLlamado_Text_YLineaAnteriorTerminaEn_PuntoYComa LOCAL lcMethod, laLineas(1), lnLineas, laPos(1,2), lnPos_Count, laExpected_Pos(1,2) LOCAL loObj AS c_conversor_prg_a_bin OF "FOXBIN2PRG.PRG" loObj = THIS.icObj @@ -174,7 +174,7 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion as *-- Code Block IF !FOUND() APPEND BLANK - REPLACE CURSOR WITH "cawlmain", START WITH 1, END WITH 999999, isnumeric WITH .F., lastused WITH "", ; && Worst case for next line + REPLACE CURSOR WITH "cawlmain", START WITH 1, END WITH 999999, isnumeric WITH .F., lastused WITH "", ; && Worst case for next line with a field called "text" TEXT WITH "Wärmeobjekte", standard WITH .T. ENDIF @@ -187,7 +187,7 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion as Empfaenger C(2),; Rohdatum C(8),; RohZeit C(4),; - LFDNr C(4),; && Worst case for next line + LFDNr C(4),; && Worst case for next line with a field called "text" Text C(26),; Trenner C(2),; DATUM D NULL,; @@ -204,7 +204,7 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion as lfdnr c(30) NULL DEFAULT .NULL.,; linkkey int,; email CHAR(60) NULL DEFAULT .NULL.,; - subject VARCHAR(254) NULL DEFAULT .NULL.,; && Worst case for next line + subject VARCHAR(254) NULL DEFAULT .NULL.,; && Worst case for next line with a field called "text" TEXT m NULL DEFAULT .NULL.,; docname c(50) NULL DEFAULT .NULL.,; versenden l NOT NULL DEFAULT .F.,; @@ -235,4 +235,57 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion as ENDFUNC + ******************************************************************************************************************************************* + FUNCTION Deberia_NoEncontrarBloque_TEXT_ENDTEXT_CuandoEvaluaUnaLineaQueComienzaConUnCampoLlamado_Text_YLineaAnteriorTerminaEn_Coma + LOCAL lcMethod, laLineas(1), lnLineas, laPos(1,2), lnPos_Count, laExpected_Pos(1,2) + LOCAL loObj AS c_conversor_prg_a_bin OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + + *-- Input and expected params + STORE '' TO lcMethod + laExpected_Pos(1,1) = 4 + laExpected_Pos(1,2) = 15 + + TEXT TO lcMethod NOSHOW TEXTMERGE FLAGS 1 PRETEXT 1+2+4 + <> myMethod_B + *-- Code Block + IF ODBC_Query.odbc + <> TO cSQL NOSHOW + update menuitems + set parent_menuitem_id = ?iParent_menuitem_id, && Worst case for next line with a field called "text" + text = ?strText, + command = ?strCommand, + message = ?strMessage, + keyname = ?strKeyname, + keylabel = ?strKeylabel, + skipfor = ?strSkipfor, + sequence = ?iSequence + where menuitem_id = ?iMenuitem_id + <> + ODBC_Query(cSQL) + ELSE + update menuitems; + set parent_menuitem_id = iParent_menuitem_id,; && Worst case for next line with a field called "text" + text = strText,; + command = strCommand,; + message = strMessage,; + keyname = strKeyname,; + keylabel = strKeylabel,; + skipfor = strSkipfor,; + sequence = iSequence; + where menuitem_id == iMenuitem_id + ENDIF + <> + ENDTEXT + + lnLineas = ALINES( laLineas, lcMethod ) + + *-- Test + loObj.identificarBloquesDeExclusion( @laLineas, lnLineas, , @laPos, @lnPos_Count ) + + THIS.Evaluate_results( @laExpected_Pos, @laPos, lnPos_Count ) + + ENDFUNC + + ENDDEFINE diff --git a/foxbin2prg.prg b/foxbin2prg.prg index e14cd3f..d0da57c 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -95,6 +95,7 @@ * 06/07/2014 FDBOZZO v1.19.26 Bug Fix cfg: ExtraBackupLevel no se tiene en cuenta cuando se usa multi-configuración * 02/06/2014 DH/FDBOZZO v1.19.27 Mejora: Agregado soporte para exportar datos para DIFF (no para importar) * 21/07/2014 FDBOZZO v1.19.28 Mejora: Agregada funcionalidad para filtrado de tablas y datos cuando se elige DBF_Conversion_Support:4 (Edyshor) +* 29/07/2014 FDBOZZO v1.19.29 Arreglo bug vcx/scx: Un campo de tabla llamado "text" que comienza la línea puede confundirse con la estructura TEXT/ENDTEXT y reconocer mal el resto del código * * *--------------------------------------------------------------------------------------------------- @@ -133,6 +134,7 @@ * 27/06/2014 Daniel Sánchez MEJORA v1.19.25: Si el campo memo "methods" de los vcx/scx contiene asteriscos fuera de lugar (que no debería), FoxBin2Prg falla. Debería poder procesarlo igual. * 02/06/2014 Doug Hennig MEJORA v1.19.22: Agregada funcionalidad para exportar los datos de las tablas al archivo db2 (Agregado en v1.19.27) * 21/07/2014 Edyshor PROPUESTA DE MEJORA db2 v1.19.27: Sería útil poder filtrar tablas y datos cuando se elige DBF_Conversion_Support:4 (Agregado en v1.19.28) +* 29/07/2014 M_N_M REPORTE BUG vcx/scx v1.19.28: Los campos de tabla con nombre "text" a veces provocan corrupción del binario generado (Arreglado en v1.19.29) * * *--------------------------------------------------------------------------------------------------- @@ -3585,6 +3587,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base + [] ; + [] ; + [] ; + + [] ; + [] ; + [] ; + [] ; @@ -3754,6 +3757,24 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base RETURN llEncontrado ENDPROC + + + PROCEDURE currentLineIsPreviousLineContinuation + LPARAMETERS taCodeLines, I + + LOCAL lcPrevLine, llIsContinuation + *-- Analizo la línea anterior para saber si termina con ";" o "," y la actual es continuación + IF I > 1 + lcPrevLine = taCodeLines(I-1) + ELSE + lcPrevLine = '' + ENDIF + .get_SeparatedLineAndComment( @lcPrevLine ) + IF INLIST( RIGHT( lcPrevLine,1 ), ';', ',' ) && Esta línea es continuación de la anterior + llIsContinuation = .T. + ENDIF + RETURN llIsContinuation + ENDPROC PROCEDURE identificarBloquesDeExclusion @@ -3799,7 +3820,8 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base FOR X = 1 TO lnID_Bloques_Count lnLen_IDFinBQ = LEN( ta_ID_Bloques(X,2) ) - IF .elTextoEvaluadoEsElTokenIndicado( @lcLine, @ta_ID_Bloques, lnLen_IDFinBQ, X, 1 ) + IF .elTextoEvaluadoEsElTokenIndicado( @lcLine, @ta_ID_Bloques, lnLen_IDFinBQ, X, 1 ) ; + AND NOT THIS.currentLineIsPreviousLineContinuation( @taCodeLines, I ) lnPrimerID = X lnAnidamientos = 1 EXIT @@ -3807,14 +3829,14 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base ENDFOR IF lnPrimerID > 0 && Se ha identificado un ID de bloque excluyente - IF I > 1 - *-- Analizo la línea anterior para saber si termina con ";" y la actual es continuación - lcPrevLine = taCodeLines(I-1) - .get_SeparatedLineAndComment( @lcPrevLine ) - IF RIGHT( lcPrevLine,1 ) = ';' && Esta línea es continuación de la anterior - LOOP - ENDIF - ENDIF + *IF I > 1 + * *-- Analizo la línea anterior para saber si termina con ";" o "," y la actual es continuación + * lcPrevLine = taCodeLines(I-1) + * .get_SeparatedLineAndComment( @lcPrevLine ) + * IF INLIST( RIGHT( lcPrevLine,1 ), ';', ',' ) && Esta línea es continuación de la anterior + * LOOP + * ENDIF + *ENDIF tnBloquesExclusion = tnBloquesExclusion + 1 lnLen_IDFinBQ = LEN( ta_ID_Bloques(lnPrimerID,2) ) @@ -3831,10 +3853,12 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base ENDIF DO CASE - CASE .elTextoEvaluadoEsElTokenIndicado( @lcLine, @ta_ID_Bloques, lnLen_IDFinBQ, X, 1 ) + CASE .elTextoEvaluadoEsElTokenIndicado( @lcLine, @ta_ID_Bloques, lnLen_IDFinBQ, X, 1 ) ; + AND NOT THIS.currentLineIsPreviousLineContinuation( @taCodeLines, I ) lnAnidamientos = lnAnidamientos + 1 - CASE .elTextoEvaluadoEsElTokenIndicado( @lcLine, @ta_ID_Bloques, lnLen_IDFinBQ, X, 2 ) + CASE .elTextoEvaluadoEsElTokenIndicado( @lcLine, @ta_ID_Bloques, lnLen_IDFinBQ, X, 2 ) ; + AND NOT THIS.currentLineIsPreviousLineContinuation( @taCodeLines, I ) lnAnidamientos = lnAnidamientos - 1 IF lnAnidamientos = 0 From 686eee500995e2e73d8d49f42ab15c703715a8e0 Mon Sep 17 00:00:00 2001 From: fdbozzo Date: Tue, 29 Jul 2014 18:33:19 +0200 Subject: [PATCH 2/8] =?UTF-8?q?Changeset:=20382=20fdbozzo=20-=2029/07/2014?= =?UTF-8?q?=2018:32:32:=20-=20Cambio=20de=20versi=C3=B3n=20en=20pjx=20a=20?= =?UTF-8?q?1.19.29=20y=20EXE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- foxbin2prg.exe | Bin 443091 -> 443506 bytes foxbin2prg.pj2 | 4 ++-- foxbin2prg.pjt | Bin 597154 -> 599781 bytes foxbin2prg.pjx | Bin 8993 -> 8993 bytes 4 files changed, 2 insertions(+), 2 deletions(-) diff --git a/foxbin2prg.exe b/foxbin2prg.exe index 608d91286d772b5587fe300e6a41dff5b740d0ee..7329f6bc6e39187c005f9d724a3c0af273256adb 100644 GIT binary patch delta 14307 zcma)?2UrzH+y0;3v%9AN(xgij8}^FWsfwW}V2dUM0To3=id~Ny>u0ZHVvi-Z#O|>~ zMPoD?dqIr~qSzBlEQl@NJ!kQ}N8kTe0k^t29UsTGj+4B_{xSO@&-x7+c;{@DQ4@Jxv8K_ot48J3%`l{e?Zfaw3Bsxq0kLQ=ysYF0+2k zgn^>B#OgE^qP#k2aR2qpZD2?49m?e%nsV7g`p}GQ**?@-=l`f~g$7NYRA!4S!hg6Z z<^6|dEF<{;z5ow4C0OtmT-b(Sp{-DvJq#A!`X;@m&%*ebS`Qt_z-%d$ka7h&VK+UM-~l z^J-P2)cl;B^sKy?jI8wN+)g>^Lox>C=W+@kl$Do}m7kKAF(|9cDOPYwswTEQ&F-C& z{DtRCe_9IgxL3$~yN2v2H77kKFTGRFp#JHpd6llP2p&%VQw>+D2#05;vGKZ?|_p&}eLC}-f{Vz%eBXJ(?HiVTR&uG=1@9rR$B{C! za?^A2l0!2y+r7{(ot@DUNV1Lx7qfyQh?Y{!!Dnd{KW=(_J;EsN9J=*s@gl$ zRWR4(PAOR_nHeKea>6nP4bD$bj*N?lh>SvS>0VXMaQQr=Lo_nt)�y*U!Vzap5st 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 v05*3m{}gVY_YdE_MRAf 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 E4`9$MegFUf diff --git a/foxbin2prg.pj2 b/foxbin2prg.pj2 index b132a4e..6fdb618 100644 --- a/foxbin2prg.pj2 +++ b/foxbin2prg.pj2 @@ -23,10 +23,10 @@ _CompanyName = "Fernando D. Bozzo" _FileDescription = "Conversor bidireccional de binarios FoxPro 9 (scx,vcx,pjx) a texto para sustituir al scctext :-)" _LegalCopyright = "Creative Commons 4: Reconocimiento - CompartirIgual (by-sa): http://creativecommons.org/licenses/by/4.0/" _LegalTrademark = "Creative Commons 4: Reconocimiento - CompartirIgual (by-sa): http://creativecommons.org/licenses/by/4.0/" -_ProductName = " FOXBIN2PRG v1.19.28" +_ProductName = " FOXBIN2PRG v1.19.29" _MajorVer = "1" _MinorVer = "19" -_Revision = "28" +_Revision = "29" _LanguageID = "1034" _AutoIncrement = "0" * diff --git a/foxbin2prg.pjt b/foxbin2prg.pjt index ca3885125b850e01893c38582d47396926da8c23..5607e989bcf56aa1c61a0ed0c5d4ecc33cbb9e5f 100644 GIT binary patch delta 15406 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 p2-bl!vDjM%S3q|~R19 delta 13602 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 pQT$I#!OV0EA}53mHmtm7kZjDBkUy{tqsr$VUJG delta 721 zcmXxgPe>F|90%~dv~ZtE=p;GZ_nl3NyPiv$GK>7%N!V96Z*c2qPh*Lxi|8 zvjmAHx$;Y@OQ?s4pdvb05=LEuitG;*(Z5}Sh^$zsi;zywRo~_F_`Uc0^4@PQJD2q+ z0ip4ZXTc*FnRL=HGWgiD)=}B(3T&2CF_ z8Dq15zS^Q?7yni}Tm%T7uCcjp<|^|LbJXup#+u*eW|_8Vb4yGTu*I)HDq(WUG<7^F zBv1)>aUrmmt0DxwwKmtz9B1}1eLw&VI(r~&qfqUvLasp@S^P~?W;XG->E8#pXlrYxd(Bmb%%IGhl+~|m%rS0FDno*g~ z>qblTZ&y>Ms#YQgA{PBs#A^|UJ}+WhlS8i;@do2;5j&b4dZc*wRx>5y#20}5e*olU zQZreegvDqANmS*>34#6sn$ethl_SuD_oHL{!OsBqO1L|gib-%;9_70~ y0;mmW?Z^e@KLPafEJoFmy1~+S;lHR4 Date: Thu, 31 Jul 2014 20:56:34 +0200 Subject: [PATCH 3/8] =?UTF-8?q?Changeset:=20384=20fdbozzo=20-=2031/07/2014?= =?UTF-8?q?=2020:54:10:=20-=20Optimizaci=C3=B3n=20y=20normalizaci=C3=B3n?= =?UTF-8?q?=20de=20las=20propiedades=20y=20m=C3=A9todos=20que=20van=20en?= =?UTF-8?q?=20el=20memo=20PROTECTED=20para=20que=20no=20se=20repitan?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- foxbin2prg.prg | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/foxbin2prg.prg b/foxbin2prg.prg index d0da57c..505d86d 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -8495,9 +8495,17 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ASORT( taProtected, 1, -1, 0, 1 ) ENDIF - FOR I = 1 TO tnProtected_Count - tcSortedMemo = tcSortedMemo + taProtected(I) + CR_LF + FOR I = tnProtected_Count TO 1 STEP -1 + *-- El ASCAN es para evitar valores repetidos, que se eliminarán. v1.19.29 + IF ASCAN( taProtected, taProtected(I), 1, -1, 0,1+2+4 ) = I + tcSortedMemo = tcSortedMemo + LOWER(taProtected(I)) + CR_LF + ELSE + ADEL( taProtected, I ) + tnProtected_Count = tnProtected_Count - 1 + ENDIF ENDFOR + + DIMENSION taProtected(tnProtected_Count) ENDIF RETURN From 75aecb59a133720596cf7e10aa38448140ad9c30 Mon Sep 17 00:00:00 2001 From: fdbozzo Date: Fri, 1 Aug 2014 00:33:58 +0200 Subject: [PATCH 4/8] =?UTF-8?q?Changeset:=20385=20fdbozzo=20-=2031/07/2014?= =?UTF-8?q?=2020:56:35:=20-=20Optimizaci=C3=B3n=20del=20m=C3=A9todo=20iden?= =?UTF-8?q?tificarBloquesDeExclusion=20-=20Uso=20del=20m=C3=A9todo=20ident?= =?UTF-8?q?ificarBloquesDeExclusion=20en=20SortMethod,=20sustituyendo=20c?= =?UTF-8?q?=C3=B3digo=20duplicado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- foxbin2prg.prg | 496 +++++++++++++++++++++++-------------------------- 1 file changed, 233 insertions(+), 263 deletions(-) diff --git a/foxbin2prg.prg b/foxbin2prg.prg index 505d86d..6dcb616 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -2378,13 +2378,16 @@ DEFINE CLASS c_conversor_base AS SESSION + [] ; + [] ; + [] ; + + [] ; + [] ; + [] ; + [] ; + [] ; + + [] ; + [] ; + [] ; + [] ; + + [] ; + [] ; + [] ; + [] ; @@ -2661,6 +2664,170 @@ DEFINE CLASS c_conversor_base AS SESSION ENDPROC + PROCEDURE currentLineIsPreviousLineContinuation + LPARAMETERS taCodeLines, I + + LOCAL lcPrevLine, llIsContinuation + *-- Analizo la línea anterior para saber si termina con ";" o "," y la actual es continuación + IF I > 1 + lcPrevLine = taCodeLines(I-1) + ELSE + lcPrevLine = '' + ENDIF + .get_SeparatedLineAndComment( @lcPrevLine ) + IF INLIST( RIGHT( lcPrevLine,1 ), ';', ',' ) && Esta línea es continuación de la anterior + llIsContinuation = .T. + ENDIF + RETURN llIsContinuation + ENDPROC + + + PROCEDURE elTextoEvaluadoEsElTokenIndicado + LPARAMETERS tcLine, ta_ID_Bloques, tnLen_IDFinBQ, X, tnIniFin + LOCAL llEncontrado, lcWord + + TRY + IF tnIniFin = 1 + *-- TOKENS DE INICIO + IF UPPER( LEFT( tcLine, LEN(ta_ID_Bloques(X,1)) ) ) == ta_ID_Bloques(X,1) + *-- Evaluar casos especiales + lcWord = UPPER( ALLTRIM(GETWORDNUM(tcLine,1) ) ) + + IF ta_ID_Bloques(X,1) == 'TEXT' AND NOT lcWord == 'TEXT' + EXIT + ENDIF + + llEncontrado = .T. + ENDIF + ELSE + *-- TOKENS DE FIN + IF LEFT( UPPER( tcLine ), tnLen_IDFinBQ ) == ta_ID_Bloques(X,2) && Fin de bloque encontrado (#ENDI, ENDTEXT, etc) + *-- Evaluar casos especiales + lcWord = UPPER( ALLTRIM(GETWORDNUM(tcLine,1) ) ) + + IF ta_ID_Bloques(X,2) == 'ENDT' AND NOT lcWord == LEFT( 'ENDTEXT', LEN(lcWord) ) + EXIT + ENDIF + + llEncontrado = .T. + ENDIF + ENDIF + ENDTRY + + RETURN llEncontrado + ENDPROC + + + PROCEDURE identificarBloquesDeExclusion + LPARAMETERS taCodeLines, tnCodeLines, ta_ID_Bloques, taBloquesExclusion, tnBloquesExclusion, taLineasDeExclusion + * LOS BLOQUES DE EXCLUSIÓN SON AQUELLOS QUE TIENEN TEXT/ENDTEXT OF #IF .F./#ENDIF Y SE USAN PARA NO BUSCAR + * INSTRUCCIONES COMO "DEFINE CLASS" O "PROCEDURE" EN LOS MISMOS. + *-------------------------------------------------------------------------------------------------------------- + * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) + * taCodeLines (!@ IN ) El array con las líneas del código de texto donde buscar + * tnCodeLines (@? IN ) Cantidad de líneas de código + * ta_ID_Bloques (@? IN ) Array de pares de identificadores (2 cols). Ej: '#IF .F.','#ENDI' ; 'TEXT','ENDTEXT' ; etc + * taBloquesExclusion (@? OUT) Array con las posiciones de los bloques (2 cols). Ej: 3,14 ; 23,58 ; etc + * tnBloquesExclusion (@? OUT) Cantidad de bloques de exclusión + * taLineasDeExclusion (@? OUT) Array unidimensional con un .T. o .F. según la línea sea de exclusión o no + *-------------------------------------------------------------------------------------------------------------- + EXTERNAL ARRAY ta_ID_Bloques, taBloquesExclusion + + TRY + LOCAL lnBloques, I, X, lnPrimerID, lnLen_IDFinBQ, lnID_Bloques_Count, lcWord, lnAnidamientos, lcLine, lcPrevLine + DIMENSION taBloquesExclusion(1,2), taLineasDeExclusion(tnCodeLines) + STORE 0 TO tnBloquesExclusion, lnPrimerID, I, X, lnLen_IDFinBQ + + IF tnCodeLines > 1 + IF EMPTY(ta_ID_Bloques) + DIMENSION ta_ID_Bloques(2,2) + ta_ID_Bloques(1,1) = '#IF' + ta_ID_Bloques(1,2) = '#ENDI' + ta_ID_Bloques(2,1) = 'TEXT' + ta_ID_Bloques(2,2) = 'ENDT' + lnID_Bloques_Count = ALEN( ta_ID_Bloques, 1 ) + ENDIF + + *-- Búsqueda del ID de inicio de bloque + WITH THIS AS c_conversor_prg_a_bin OF 'FOXBIN2PRG.PRG' + FOR I = 1 TO tnCodeLines + * Reduzco los espacios. Ej: '#IF .F. && cmt' ==> '#IF .F.&&cmt' + lcLine = LTRIM( STRTRAN( STRTRAN( CHRTRAN( taCodeLines(I), CHR(9), ' ' ), ' ', ' ' ), ' ', ' ' ) ) + + IF .lineIsOnlyCommentAndNoMetadata( @lcLine ) + LOOP + ENDIF + + lnPrimerID = 0 + + FOR X = 1 TO lnID_Bloques_Count + lnLen_IDFinBQ = LEN( ta_ID_Bloques(X,2) ) + IF .elTextoEvaluadoEsElTokenIndicado( @lcLine, @ta_ID_Bloques, lnLen_IDFinBQ, X, 1 ) ; + AND NOT THIS.currentLineIsPreviousLineContinuation( @taCodeLines, I ) + lnPrimerID = X + lnAnidamientos = 1 + EXIT + ENDIF + ENDFOR + + IF lnPrimerID > 0 && Se ha identificado un ID de bloque excluyente + tnBloquesExclusion = tnBloquesExclusion + 1 + lnLen_IDFinBQ = LEN( ta_ID_Bloques(lnPrimerID,2) ) + DIMENSION taBloquesExclusion(tnBloquesExclusion,2) + taBloquesExclusion(tnBloquesExclusion,1) = I + taLineasDeExclusion(I) = .T. + + * Búsqueda del ID de fin de bloque + FOR I = I + 1 TO tnCodeLines + * Reduzco los espacios. Ej: '#IF .F. && cmt' ==> '#IF .F.&&cmt' + lcLine = LTRIM( STRTRAN( STRTRAN( CHRTRAN( taCodeLines(I), CHR(9), ' ' ), ' ', ' ' ), ' ', ' ' ) ) + taLineasDeExclusion(I) = .T. + + IF .lineIsOnlyCommentAndNoMetadata( @lcLine ) + LOOP + ENDIF + + DO CASE + CASE .elTextoEvaluadoEsElTokenIndicado( @lcLine, @ta_ID_Bloques, lnLen_IDFinBQ, X, 1 ) ; + AND NOT THIS.currentLineIsPreviousLineContinuation( @taCodeLines, I ) + lnAnidamientos = lnAnidamientos + 1 + + CASE .elTextoEvaluadoEsElTokenIndicado( @lcLine, @ta_ID_Bloques, lnLen_IDFinBQ, X, 2 ) ; + AND NOT THIS.currentLineIsPreviousLineContinuation( @taCodeLines, I ) + lnAnidamientos = lnAnidamientos - 1 + + IF lnAnidamientos = 0 + taBloquesExclusion(tnBloquesExclusion,2) = I + EXIT + ENDIF + ENDCASE + ENDFOR + + *-- Validación + IF EMPTY(taBloquesExclusion(tnBloquesExclusion,2)) + *ERROR 'No se ha encontrado el marcador de fin [' + ta_ID_Bloques(lnPrimerID,2) ; + + '] que cierra al marcador de inicio [' + ta_ID_Bloques(lnPrimerID,1) ; + + '] de la línea ' + TRANSFORM(taBloquesExclusion(tnBloquesExclusion,1)) + ERROR (TEXTMERGE(C_END_MARKER_NOT_FOUND_LOC)) + ENDIF + ENDIF + ENDFOR + ENDWITH && THIS + ENDIF + + CATCH TO loEx + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + + ENDTRY + + RETURN + ENDPROC + + PROCEDURE decode_SpecialCodes_1_31 *--------------------------------------------------------------------------------------------------- * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) @@ -2890,6 +3057,64 @@ DEFINE CLASS c_conversor_base AS SESSION ENDFUNC + PROCEDURE get_ListNamesWithValuesFrom_InLine_MetadataTag + *-- OBTENGO EL ARRAY DE DATOS Y VALORES DE LA LINEA DE METADATOS INDICADA + *-- NOTA: Los valores NO PUEDEN contener comillas dobles en su valor, ya que generaría un error al parsearlos. + *-- Ejemplo: + *< FileMetadata: Type="V" Cpid="1252" Timestamp="1131901580" ID="1129207528" ObjRev="544" /> + *< OLE: Nombre="frm_form.Pageframe1.Page1.Cnt_controles_h.Olecontrol1" Parent="frm_form.Pageframe1.Page1.Cnt_controles_h" ObjName="Olecontrol1" Checksum="1685567300" Value="0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPg...ADAP7AAAA==" /> + *-------------------------------------------------------------------------------------------------------------- + * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) + * tcLineWithMetadata (!@ IN ) Línea con metadatos y un tag de metadatos + * taPropsAndValues (!@ OUT) Array a devolver con las propiedades y valores encontrados + * tnPropsAndValues_Count (!@ OUT) Cantidad de propiedades encontradas + * tcLeftTag (v! IN ) TAG de inicio de los metadatos + * tcRightTag (v! IN ) TAG de fin de los metadatos + *-------------------------------------------------------------------------------------------------------------- + LPARAMETERS tcLineWithMetadata, taPropsAndValues, tnPropsAndValues_Count, tcLeftTag, tcRightTag + EXTERNAL ARRAY taPropsAndValues + + LOCAL lcMetadatos, I, lnEqualSigns, lcNextVar, lcStr, lcVirtualMeta, lnPos1, lnPos2, lnLastPos, lnCantComillas + STORE '' TO lcVirtualMeta + STORE 0 TO lnPos1, lnPos2, lnLastPos, tnPropsAndValues_Count, I + + lcMetadatos = ALLTRIM( STREXTRACT( tcLineWithMetadata, tcLeftTag, tcRightTag, 1, 1) ) + lnCantComillas = OCCURS( '"', lcMetadatos ) + + IF lnCantComillas % 2 <> 0 && Valido que las comillas "" sean pares + *ERROR "Error de datos: No se puede parsear porque las comillas no son pares en la línea [" + lcMetadatos + "]" + ERROR (TEXTMERGE(C_DATA_ERROR_CANT_PARSE_UNPAIRING_DOUBLE_QUOTES_LOC)) + ENDIF + + lnLastPos = 1 + DIMENSION taPropsAndValues( lnCantComillas / 2, 2 ) + + *------------------------------------------------------------------------------------- + * IMPORTANTE!! + * ------------ + * SI SE SEPARAN LAS IGUALDADES CON ESPACIOS, ÉSTAS DEJAN DE RECONOCERSE!! (prop = "valor" en vez de prop="valor") + * TENER EN CUENTA AL GENERAR EL TEXTO O AL MODIFICARLO MANUALMENTE AL MERGEAR + *------------------------------------------------------------------------------------- + FOR I = 1 TO lnCantComillas STEP 2 + tnPropsAndValues_Count = tnPropsAndValues_Count + 1 + + * Type="V" Cpid="1252" + * ^ ^ => Posiciones del par de comillas dobles + lnPos1 = AT( '"', lcMetadatos, I ) + lnPos2 = AT( '"', lcMetadatos, I + 1 ) + + * Type="V" Cpid="1252" + * ^ ^ ^ => LastPos, lnPos1 y lnPos2 + taPropsAndValues(tnPropsAndValues_Count,1) = ALLTRIM( GETWORDNUM( SUBSTR( lcMetadatos, lnLastPos, lnPos1 - lnLastPos ), 1, '=' ) ) + taPropsAndValues(tnPropsAndValues_Count,2) = SUBSTR( lcMetadatos, lnPos1 + 1, lnPos2 - lnPos1 - 1 ) + + lnLastPos = lnPos2 + 1 + ENDFOR + + RETURN + ENDPROC + + PROCEDURE get_SeparatedLineAndComment *--------------------------------------------------------------------------------------------------- * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) @@ -3587,19 +3812,15 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base + [] ; + [] ; + [] ; - + [] ; + [] ; - + [] ; + [] ; + [] ; + [] ; + [] ; + [] ; + [] ; - + [] ; + [] ; + [] ; - + [] ; + [] ; + [] ; + [] ; @@ -3664,235 +3885,6 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base ENDFUNC - ******************************************************************************************************************* - PROCEDURE get_ListNamesWithValuesFrom_InLine_MetadataTag - *-- OBTENGO EL ARRAY DE DATOS Y VALORES DE LA LINEA DE METADATOS INDICADA - *-- NOTA: Los valores NO PUEDEN contener comillas dobles en su valor, ya que generaría un error al parsearlos. - *-- Ejemplo: - *< FileMetadata: Type="V" Cpid="1252" Timestamp="1131901580" ID="1129207528" ObjRev="544" /> - *< OLE: Nombre="frm_form.Pageframe1.Page1.Cnt_controles_h.Olecontrol1" Parent="frm_form.Pageframe1.Page1.Cnt_controles_h" ObjName="Olecontrol1" Checksum="1685567300" Value="0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPg...ADAP7AAAA==" /> - *-------------------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tcLineWithMetadata (!@ IN ) Línea con metadatos y un tag de metadatos - * taPropsAndValues (!@ OUT) Array a devolver con las propiedades y valores encontrados - * tnPropsAndValues_Count (!@ OUT) Cantidad de propiedades encontradas - * tcLeftTag (v! IN ) TAG de inicio de los metadatos - * tcRightTag (v! IN ) TAG de fin de los metadatos - *-------------------------------------------------------------------------------------------------------------- - LPARAMETERS tcLineWithMetadata, taPropsAndValues, tnPropsAndValues_Count, tcLeftTag, tcRightTag - EXTERNAL ARRAY taPropsAndValues - - LOCAL lcMetadatos, I, lnEqualSigns, lcNextVar, lcStr, lcVirtualMeta, lnPos1, lnPos2, lnLastPos, lnCantComillas - STORE '' TO lcVirtualMeta - STORE 0 TO lnPos1, lnPos2, lnLastPos, tnPropsAndValues_Count, I - - lcMetadatos = ALLTRIM( STREXTRACT( tcLineWithMetadata, tcLeftTag, tcRightTag, 1, 1) ) - lnCantComillas = OCCURS( '"', lcMetadatos ) - - IF lnCantComillas % 2 <> 0 && Valido que las comillas "" sean pares - *ERROR "Error de datos: No se puede parsear porque las comillas no son pares en la línea [" + lcMetadatos + "]" - ERROR (TEXTMERGE(C_DATA_ERROR_CANT_PARSE_UNPAIRING_DOUBLE_QUOTES_LOC)) - ENDIF - - lnLastPos = 1 - DIMENSION taPropsAndValues( lnCantComillas / 2, 2 ) - - *------------------------------------------------------------------------------------- - * IMPORTANTE!! - * ------------ - * SI SE SEPARAN LAS IGUALDADES CON ESPACIOS, ÉSTAS DEJAN DE RECONOCERSE!! (prop = "valor" en vez de prop="valor") - * TENER EN CUENTA AL GENERAR EL TEXTO O AL MODIFICARLO MANUALMENTE AL MERGEAR - *------------------------------------------------------------------------------------- - FOR I = 1 TO lnCantComillas STEP 2 - tnPropsAndValues_Count = tnPropsAndValues_Count + 1 - - * Type="V" Cpid="1252" - * ^ ^ => Posiciones del par de comillas dobles - lnPos1 = AT( '"', lcMetadatos, I ) - lnPos2 = AT( '"', lcMetadatos, I + 1 ) - - * Type="V" Cpid="1252" - * ^ ^ ^ => LastPos, lnPos1 y lnPos2 - taPropsAndValues(tnPropsAndValues_Count,1) = ALLTRIM( GETWORDNUM( SUBSTR( lcMetadatos, lnLastPos, lnPos1 - lnLastPos ), 1, '=' ) ) - taPropsAndValues(tnPropsAndValues_Count,2) = SUBSTR( lcMetadatos, lnPos1 + 1, lnPos2 - lnPos1 - 1 ) - - lnLastPos = lnPos2 + 1 - ENDFOR - - RETURN - ENDPROC - - - PROCEDURE elTextoEvaluadoEsElTokenIndicado - LPARAMETERS tcLine, ta_ID_Bloques, tnLen_IDFinBQ, X, tnIniFin - LOCAL llEncontrado, lcWord - - TRY - IF tnIniFin = 1 - *-- TOKENS DE INICIO - IF UPPER( LEFT( tcLine, LEN(ta_ID_Bloques(X,1)) ) ) == ta_ID_Bloques(X,1) - *-- Evaluar casos especiales - lcWord = UPPER( ALLTRIM(GETWORDNUM(tcLine,1) ) ) - - IF ta_ID_Bloques(X,1) == 'TEXT' AND NOT lcWord == 'TEXT' - EXIT - ENDIF - - llEncontrado = .T. - ENDIF - ELSE - *-- TOKENS DE FIN - IF LEFT( UPPER( tcLine ), tnLen_IDFinBQ ) == ta_ID_Bloques(X,2) && Fin de bloque encontrado (#ENDI, ENDTEXT, etc) - *-- Evaluar casos especiales - lcWord = UPPER( ALLTRIM(GETWORDNUM(tcLine,1) ) ) - - IF ta_ID_Bloques(X,2) == 'ENDT' AND NOT lcWord == LEFT( 'ENDTEXT', LEN(lcWord) ) - EXIT - ENDIF - - llEncontrado = .T. - ENDIF - ENDIF - ENDTRY - - RETURN llEncontrado - ENDPROC - - - PROCEDURE currentLineIsPreviousLineContinuation - LPARAMETERS taCodeLines, I - - LOCAL lcPrevLine, llIsContinuation - *-- Analizo la línea anterior para saber si termina con ";" o "," y la actual es continuación - IF I > 1 - lcPrevLine = taCodeLines(I-1) - ELSE - lcPrevLine = '' - ENDIF - .get_SeparatedLineAndComment( @lcPrevLine ) - IF INLIST( RIGHT( lcPrevLine,1 ), ';', ',' ) && Esta línea es continuación de la anterior - llIsContinuation = .T. - ENDIF - RETURN llIsContinuation - ENDPROC - - - PROCEDURE identificarBloquesDeExclusion - LPARAMETERS taCodeLines, tnCodeLines, ta_ID_Bloques, taBloquesExclusion, tnBloquesExclusion - * LOS BLOQUES DE EXCLUSIÓN SON AQUELLOS QUE TIENEN TEXT/ENDTEXT OF #IF .F./#ENDIF Y SE USAN PARA NO BUSCAR - * INSTRUCCIONES COMO "DEFINE CLASS" O "PROCEDURE" EN LOS MISMOS. - *-------------------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * taCodeLines (!@ IN ) El array con las líneas del código de texto donde buscar - * tnCodeLines (@? IN ) Cantidad de líneas de código - * ta_ID_Bloques (@? IN ) Array de pares de identificadores (2 cols). Ej: '#IF .F.','#ENDI' ; 'TEXT','ENDTEXT' ; etc - * taBloquesExclusion (@? OUT) Array con las posiciones de los bloques (2 cols). Ej: 3,14 ; 23,58 ; etc - * tnBloquesExclusion (@? OUT) Cantidad de bloques de exclusión - *-------------------------------------------------------------------------------------------------------------- - EXTERNAL ARRAY ta_ID_Bloques, taBloquesExclusion - - TRY - LOCAL lnBloques, I, X, lnPrimerID, lnLen_IDFinBQ, lnID_Bloques_Count, lcWord, lnAnidamientos, lcLine, lcPrevLine - DIMENSION taBloquesExclusion(1,2) - STORE 0 TO tnBloquesExclusion, lnPrimerID, I, X, lnLen_IDFinBQ - - IF tnCodeLines > 1 - IF EMPTY(ta_ID_Bloques) - DIMENSION ta_ID_Bloques(2,2) - ta_ID_Bloques(1,1) = '#IF' - ta_ID_Bloques(1,2) = '#ENDI' - ta_ID_Bloques(2,1) = 'TEXT' - ta_ID_Bloques(2,2) = 'ENDT' - lnID_Bloques_Count = ALEN( ta_ID_Bloques, 1 ) - ENDIF - - *-- Búsqueda del ID de inicio de bloque - WITH THIS AS c_conversor_prg_a_bin OF 'FOXBIN2PRG.PRG' - FOR I = 1 TO tnCodeLines - * Reduzco los espacios. Ej: '#IF .F. && cmt' ==> '#IF .F.&&cmt' - lcLine = LTRIM( STRTRAN( STRTRAN( CHRTRAN( taCodeLines(I), CHR(9), ' ' ), ' ', ' ' ), ' ', ' ' ) ) - - IF .lineIsOnlyCommentAndNoMetadata( @lcLine ) - LOOP - ENDIF - - lnPrimerID = 0 - - FOR X = 1 TO lnID_Bloques_Count - lnLen_IDFinBQ = LEN( ta_ID_Bloques(X,2) ) - IF .elTextoEvaluadoEsElTokenIndicado( @lcLine, @ta_ID_Bloques, lnLen_IDFinBQ, X, 1 ) ; - AND NOT THIS.currentLineIsPreviousLineContinuation( @taCodeLines, I ) - lnPrimerID = X - lnAnidamientos = 1 - EXIT - ENDIF - ENDFOR - - IF lnPrimerID > 0 && Se ha identificado un ID de bloque excluyente - *IF I > 1 - * *-- Analizo la línea anterior para saber si termina con ";" o "," y la actual es continuación - * lcPrevLine = taCodeLines(I-1) - * .get_SeparatedLineAndComment( @lcPrevLine ) - * IF INLIST( RIGHT( lcPrevLine,1 ), ';', ',' ) && Esta línea es continuación de la anterior - * LOOP - * ENDIF - *ENDIF - - tnBloquesExclusion = tnBloquesExclusion + 1 - lnLen_IDFinBQ = LEN( ta_ID_Bloques(lnPrimerID,2) ) - DIMENSION taBloquesExclusion(tnBloquesExclusion,2) - taBloquesExclusion(tnBloquesExclusion,1) = I - - * Búsqueda del ID de fin de bloque - FOR I = I + 1 TO tnCodeLines - * Reduzco los espacios. Ej: '#IF .F. && cmt' ==> '#IF .F.&&cmt' - lcLine = LTRIM( STRTRAN( STRTRAN( CHRTRAN( taCodeLines(I), CHR(9), ' ' ), ' ', ' ' ), ' ', ' ' ) ) - - IF .lineIsOnlyCommentAndNoMetadata( @lcLine ) - LOOP - ENDIF - - DO CASE - CASE .elTextoEvaluadoEsElTokenIndicado( @lcLine, @ta_ID_Bloques, lnLen_IDFinBQ, X, 1 ) ; - AND NOT THIS.currentLineIsPreviousLineContinuation( @taCodeLines, I ) - lnAnidamientos = lnAnidamientos + 1 - - CASE .elTextoEvaluadoEsElTokenIndicado( @lcLine, @ta_ID_Bloques, lnLen_IDFinBQ, X, 2 ) ; - AND NOT THIS.currentLineIsPreviousLineContinuation( @taCodeLines, I ) - lnAnidamientos = lnAnidamientos - 1 - - IF lnAnidamientos = 0 - taBloquesExclusion(tnBloquesExclusion,2) = I - EXIT - ENDIF - ENDCASE - ENDFOR - - *-- Validación - IF EMPTY(taBloquesExclusion(tnBloquesExclusion,2)) - *ERROR 'No se ha encontrado el marcador de fin [' + ta_ID_Bloques(lnPrimerID,2) ; - + '] que cierra al marcador de inicio [' + ta_ID_Bloques(lnPrimerID,1) ; - + '] de la línea ' + TRANSFORM(taBloquesExclusion(tnBloquesExclusion,1)) - ERROR (TEXTMERGE(C_END_MARKER_NOT_FOUND_LOC)) - ENDIF - ENDIF - ENDFOR - ENDWITH && THIS - ENDIF - - CATCH TO loEx - IF THIS.l_Debug AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF - - THROW - - ENDTRY - - RETURN - ENDPROC - - ******************************************************************************************************************* PROCEDURE analizarBloque_FoxBin2Prg *------------------------------------------------------ @@ -8653,8 +8645,9 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base *-- taCode[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 - LOCAL loEx AS EXCEPTION + LOCAL lnLineCount, laLine(1), I, lnTextNodes, tcSorted, lnProtectedLine, lcMethod, lnLine_Len, lcLine, llProcOpen ; + , laBloquesExclusion(1,2), lnBloquesExclusion, laLineasDeExclusion(1) ; + , loEx AS EXCEPTION DIMENSION taMethods(1,3) STORE '' TO taMethods, tcSorted, taCode tnMethodCount = 0 @@ -8699,6 +8692,9 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDIF ENDFOR + *-- Identifico los TEXT/ENDTEXT, #IF .F./#ENDIF + THIS.identificarBloquesDeExclusion( @laLine, lnLineCount, .F., @laBloquesExclusion, @lnBloquesExclusion, @laLineasDeExclusion ) + *-- Analyze and count line methods, get method names and consolidate block code FOR I = 1 TO lnLineCount IF toFoxBin2Prg.l_DropNullCharsFromCode @@ -8708,35 +8704,9 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base lnLine_Len = LEN( laLine(I) ) DO CASE - CASE UPPER( LEFT(laLine(I), 4) ) == 'TEXT' - lcLine = UPPER( CHRTRAN( laLine(I) , '&'+CHR(9)+CHR(0), ' ') ) + ' ' - IF lnLine_Len >= 4 AND LEFT(lcLine,5) == 'TEXT ' - *-- Es el comando TEXT - ELSE - *-- Es otra cosa (variable, etc) - taCode(tnMethodCount) = taCode(tnMethodCount) + laLine(I) + CR_LF - LOOP - ENDIF - - lnTextNodes = lnTextNodes + 1 + CASE laLineasDeExclusion(I) taCode(tnMethodCount) = taCode(tnMethodCount) + laLine(I) + CR_LF - - CASE UPPER( LEFT(laLine(I), 4) ) == 'ENDT' - lcLine = UPPER( CHRTRAN( laLine(I) , '&'+CHR(9)+CHR(0), ' ') ) + ' ' - IF lnLine_Len >= 7 AND LEFT(lcLine,8) == 'ENDTEXT ' ; - OR lnLine_Len >= 6 AND LEFT(lcLine,7) == 'ENDTEX ' ; - OR lnLine_Len >= 5 AND LEFT(lcLine,6) == 'ENDTE ' ; - OR lnLine_Len >= 4 AND LEFT(lcLine,5) == 'ENDT ' - *-- Es el comando ENDTEXT - ELSE - *-- Es otra cosa (variable, etc) - taCode(tnMethodCount) = taCode(tnMethodCount) + laLine(I) + CR_LF - LOOP - ENDIF - - lnTextNodes = lnTextNodes - 1 - taCode(tnMethodCount) = taCode(tnMethodCount) + laLine(I) + CR_LF - + CASE lnTextNodes = 0 AND UPPER( LEFT(laLine(I), 10) ) == 'PROCEDURE ' tnMethodCount = tnMethodCount + 1 DIMENSION taMethods(tnMethodCount, 3), taCode(tnMethodCount) From 5aa42ae538ad71847c10a19ec54a4f10a373e209 Mon Sep 17 00:00:00 2001 From: fdbozzo Date: Fri, 1 Aug 2014 01:16:33 +0200 Subject: [PATCH 5/8] =?UTF-8?q?Changeset:=20386=20fdbozzo=20-=2001/08/2014?= =?UTF-8?q?=2000:33:59:=20-=20Refactorizaci=C3=B3n=20de=20las=20llamadas?= =?UTF-8?q?=20a=20identificarBloquesDeExclusion=20y=20cambio=20de=20la=20v?= =?UTF-8?q?ariable=20aBloquesExclusion=20por=20la=20nueva=20aLineasExclusi?= =?UTF-8?q?on?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...or_base__IdentificarBloquesDeExclusion.prg | 10 +- foxbin2prg.prg | 366 +++++++++--------- 2 files changed, 189 insertions(+), 187 deletions(-) diff --git a/TESTS/ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion.prg b/TESTS/ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion.prg index 45e898f..2aa01e7 100644 --- a/TESTS/ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion.prg +++ b/TESTS/ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion.prg @@ -81,7 +81,7 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion as lnLineas = ALINES( laLineas, lcMethod ) *-- Test - loObj.identificarBloquesDeExclusion( @laLineas, lnLineas, , @laPos, @lnPos_Count ) + loObj.identificarBloquesDeExclusion( @laLineas, lnLineas, , , @lnPos_Count, @laPos ) THIS.Evaluate_results( @laExpected_Pos, @laPos, lnPos_Count ) @@ -115,7 +115,7 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion as lnLineas = ALINES( laLineas, lcMethod ) *-- Test - loObj.identificarBloquesDeExclusion( @laLineas, lnLineas, , @laPos, @lnPos_Count ) + loObj.identificarBloquesDeExclusion( @laLineas, lnLineas, , , @lnPos_Count, @laPos ) THIS.Evaluate_results( @laExpected_Pos, @laPos, lnPos_Count ) @@ -151,7 +151,7 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion as lnLineas = ALINES( laLineas, lcMethod ) *-- Test - loObj.identificarBloquesDeExclusion( @laLineas, lnLineas, , @laPos, @lnPos_Count ) + loObj.identificarBloquesDeExclusion( @laLineas, lnLineas, , , @lnPos_Count, @laPos ) THIS.Evaluate_results( @laExpected_Pos, @laPos, lnPos_Count ) @@ -228,7 +228,7 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion as lnLineas = ALINES( laLineas, lcMethod ) *-- Test - loObj.identificarBloquesDeExclusion( @laLineas, lnLineas, , @laPos, @lnPos_Count ) + loObj.identificarBloquesDeExclusion( @laLineas, lnLineas, , , @lnPos_Count, @laPos ) THIS.Evaluate_results( @laExpected_Pos, @laPos, lnPos_Count ) @@ -281,7 +281,7 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion as lnLineas = ALINES( laLineas, lcMethod ) *-- Test - loObj.identificarBloquesDeExclusion( @laLineas, lnLineas, , @laPos, @lnPos_Count ) + loObj.identificarBloquesDeExclusion( @laLineas, lnLineas, , , @lnPos_Count, @laPos ) THIS.Evaluate_results( @laExpected_Pos, @laPos, lnPos_Count ) diff --git a/foxbin2prg.prg b/foxbin2prg.prg index 6dcb616..623586d 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -2718,116 +2718,6 @@ DEFINE CLASS c_conversor_base AS SESSION ENDPROC - PROCEDURE identificarBloquesDeExclusion - LPARAMETERS taCodeLines, tnCodeLines, ta_ID_Bloques, taBloquesExclusion, tnBloquesExclusion, taLineasDeExclusion - * LOS BLOQUES DE EXCLUSIÓN SON AQUELLOS QUE TIENEN TEXT/ENDTEXT OF #IF .F./#ENDIF Y SE USAN PARA NO BUSCAR - * INSTRUCCIONES COMO "DEFINE CLASS" O "PROCEDURE" EN LOS MISMOS. - *-------------------------------------------------------------------------------------------------------------- - * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * taCodeLines (!@ IN ) El array con las líneas del código de texto donde buscar - * tnCodeLines (@? IN ) Cantidad de líneas de código - * ta_ID_Bloques (@? IN ) Array de pares de identificadores (2 cols). Ej: '#IF .F.','#ENDI' ; 'TEXT','ENDTEXT' ; etc - * taBloquesExclusion (@? OUT) Array con las posiciones de los bloques (2 cols). Ej: 3,14 ; 23,58 ; etc - * tnBloquesExclusion (@? OUT) Cantidad de bloques de exclusión - * taLineasDeExclusion (@? OUT) Array unidimensional con un .T. o .F. según la línea sea de exclusión o no - *-------------------------------------------------------------------------------------------------------------- - EXTERNAL ARRAY ta_ID_Bloques, taBloquesExclusion - - TRY - LOCAL lnBloques, I, X, lnPrimerID, lnLen_IDFinBQ, lnID_Bloques_Count, lcWord, lnAnidamientos, lcLine, lcPrevLine - DIMENSION taBloquesExclusion(1,2), taLineasDeExclusion(tnCodeLines) - STORE 0 TO tnBloquesExclusion, lnPrimerID, I, X, lnLen_IDFinBQ - - IF tnCodeLines > 1 - IF EMPTY(ta_ID_Bloques) - DIMENSION ta_ID_Bloques(2,2) - ta_ID_Bloques(1,1) = '#IF' - ta_ID_Bloques(1,2) = '#ENDI' - ta_ID_Bloques(2,1) = 'TEXT' - ta_ID_Bloques(2,2) = 'ENDT' - lnID_Bloques_Count = ALEN( ta_ID_Bloques, 1 ) - ENDIF - - *-- Búsqueda del ID de inicio de bloque - WITH THIS AS c_conversor_prg_a_bin OF 'FOXBIN2PRG.PRG' - FOR I = 1 TO tnCodeLines - * Reduzco los espacios. Ej: '#IF .F. && cmt' ==> '#IF .F.&&cmt' - lcLine = LTRIM( STRTRAN( STRTRAN( CHRTRAN( taCodeLines(I), CHR(9), ' ' ), ' ', ' ' ), ' ', ' ' ) ) - - IF .lineIsOnlyCommentAndNoMetadata( @lcLine ) - LOOP - ENDIF - - lnPrimerID = 0 - - FOR X = 1 TO lnID_Bloques_Count - lnLen_IDFinBQ = LEN( ta_ID_Bloques(X,2) ) - IF .elTextoEvaluadoEsElTokenIndicado( @lcLine, @ta_ID_Bloques, lnLen_IDFinBQ, X, 1 ) ; - AND NOT THIS.currentLineIsPreviousLineContinuation( @taCodeLines, I ) - lnPrimerID = X - lnAnidamientos = 1 - EXIT - ENDIF - ENDFOR - - IF lnPrimerID > 0 && Se ha identificado un ID de bloque excluyente - tnBloquesExclusion = tnBloquesExclusion + 1 - lnLen_IDFinBQ = LEN( ta_ID_Bloques(lnPrimerID,2) ) - DIMENSION taBloquesExclusion(tnBloquesExclusion,2) - taBloquesExclusion(tnBloquesExclusion,1) = I - taLineasDeExclusion(I) = .T. - - * Búsqueda del ID de fin de bloque - FOR I = I + 1 TO tnCodeLines - * Reduzco los espacios. Ej: '#IF .F. && cmt' ==> '#IF .F.&&cmt' - lcLine = LTRIM( STRTRAN( STRTRAN( CHRTRAN( taCodeLines(I), CHR(9), ' ' ), ' ', ' ' ), ' ', ' ' ) ) - taLineasDeExclusion(I) = .T. - - IF .lineIsOnlyCommentAndNoMetadata( @lcLine ) - LOOP - ENDIF - - DO CASE - CASE .elTextoEvaluadoEsElTokenIndicado( @lcLine, @ta_ID_Bloques, lnLen_IDFinBQ, X, 1 ) ; - AND NOT THIS.currentLineIsPreviousLineContinuation( @taCodeLines, I ) - lnAnidamientos = lnAnidamientos + 1 - - CASE .elTextoEvaluadoEsElTokenIndicado( @lcLine, @ta_ID_Bloques, lnLen_IDFinBQ, X, 2 ) ; - AND NOT THIS.currentLineIsPreviousLineContinuation( @taCodeLines, I ) - lnAnidamientos = lnAnidamientos - 1 - - IF lnAnidamientos = 0 - taBloquesExclusion(tnBloquesExclusion,2) = I - EXIT - ENDIF - ENDCASE - ENDFOR - - *-- Validación - IF EMPTY(taBloquesExclusion(tnBloquesExclusion,2)) - *ERROR 'No se ha encontrado el marcador de fin [' + ta_ID_Bloques(lnPrimerID,2) ; - + '] que cierra al marcador de inicio [' + ta_ID_Bloques(lnPrimerID,1) ; - + '] de la línea ' + TRANSFORM(taBloquesExclusion(tnBloquesExclusion,1)) - ERROR (TEXTMERGE(C_END_MARKER_NOT_FOUND_LOC)) - ENDIF - ENDIF - ENDFOR - ENDWITH && THIS - ENDIF - - CATCH TO loEx - IF THIS.l_Debug AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF - - THROW - - ENDTRY - - RETURN - ENDPROC - - PROCEDURE decode_SpecialCodes_1_31 *--------------------------------------------------------------------------------------------------- * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) @@ -3140,11 +3030,13 @@ DEFINE CLASS c_conversor_base AS SESSION *-- Si se indican más de 3 parámetros, evalúa el valor completo a través de las líneas de código (valores multi-línea) *-------------------------------------------------------------------------------------------------------------- * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * taCodeLines (!@ IN ) El array con las líneas del código donde buscar - * tnCodeLines (!@ IN ) Cantidad de líneas de código - * taBloquesExclusion (!@ IN ) Array con las posiciones de inicio/fin de los bloques de exclusion - * tnBloquesExclusion (!@ IN ) Cantidad de bloques de exclusión - * toModulo (@? OUT) Objeto con toda la información del módulo analizado + * tcAsignacion (v! IN ) Asignación completa con variable, igualdad y valor + * tcPropName (@! OUT) Nombre de la variable + * tcValue (@? OUT) Valor + * toClase (v! IN ) + * taCodeLines (@! IN ) Líneas de código a analizar + * tnCodeLines (v! IN ) Cantidad de líneas de código + * I (@! IN/OUT) Línea actual *-------------------------------------------------------------------------------------------------------------- LPARAMETERS tcAsignacion, tcPropName, tcValue, toClase, taCodeLines, tnCodeLines, I LOCAL ln_AT_Cmt @@ -3197,25 +3089,135 @@ DEFINE CLASS c_conversor_base AS SESSION ******************************************************************************************************************* PROCEDURE identificarBloquesDeCodigo - LPARAMETERS taCodeLines, tnCodeLines, taBloquesExclusion, tnBloquesExclusion, toModulo + LPARAMETERS taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toModulo + ENDPROC + + + PROCEDURE identificarBloquesDeExclusion + LPARAMETERS taCodeLines, tnCodeLines, ta_ID_Bloques, taLineasExclusion, tnBloquesExclusion, taBloquesExclusion + * LOS BLOQUES DE EXCLUSIÓN SON AQUELLOS QUE TIENEN TEXT/ENDTEXT OF #IF/#ENDIF Y SE USAN PARA NO BUSCAR + * INSTRUCCIONES COMO "DEFINE CLASS" O "PROCEDURE" EN LOS MISMOS. + *-------------------------------------------------------------------------------------------------------------- + * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) + * taCodeLines (!@ IN ) El array con las líneas del código de texto donde buscar + * tnCodeLines (@? IN ) Cantidad de líneas de código + * ta_ID_Bloques (@? IN ) Array de pares de identificadores (2 cols). Ej: '#IF .F.','#ENDI' ; 'TEXT','ENDTEXT' ; etc + * taLineasExclusion (@? OUT) Array unidimensional con un .T. o .F. según la línea sea de exclusión o no + * tnBloquesExclusion (@? OUT) Cantidad de bloques de exclusión + *-------------------------------------------------------------------------------------------------------------- + EXTERNAL ARRAY ta_ID_Bloques, taLineasExclusion + + TRY + LOCAL lnBloques, I, X, lnPrimerID, lnLen_IDFinBQ, lnID_Bloques_Count, lcWord, lnAnidamientos, lcLine, lcPrevLine + DIMENSION taLineasExclusion(tnCodeLines), taBloquesExclusion(1,2) + STORE 0 TO tnBloquesExclusion, lnPrimerID, I, X, lnLen_IDFinBQ + + IF tnCodeLines > 1 + IF EMPTY(ta_ID_Bloques) + DIMENSION ta_ID_Bloques(2,2) + ta_ID_Bloques(1,1) = '#IF' + ta_ID_Bloques(1,2) = '#ENDI' + ta_ID_Bloques(2,1) = 'TEXT' + ta_ID_Bloques(2,2) = 'ENDT' + lnID_Bloques_Count = ALEN( ta_ID_Bloques, 1 ) + ENDIF + + *-- Búsqueda del ID de inicio de bloque + WITH THIS AS c_conversor_prg_a_bin OF 'FOXBIN2PRG.PRG' + FOR I = 1 TO tnCodeLines + * Reduzco los espacios. Ej: '#IF .F. && cmt' ==> '#IF .F.&&cmt' + lcLine = LTRIM( STRTRAN( STRTRAN( CHRTRAN( taCodeLines(I), CHR(9), ' ' ), ' ', ' ' ), ' ', ' ' ) ) + + IF .lineIsOnlyCommentAndNoMetadata( @lcLine ) + LOOP + ENDIF + + lnPrimerID = 0 + + FOR X = 1 TO lnID_Bloques_Count + lnLen_IDFinBQ = LEN( ta_ID_Bloques(X,2) ) + IF .elTextoEvaluadoEsElTokenIndicado( @lcLine, @ta_ID_Bloques, lnLen_IDFinBQ, X, 1 ) ; + AND NOT THIS.currentLineIsPreviousLineContinuation( @taCodeLines, I ) + lnPrimerID = X + lnAnidamientos = 1 + EXIT + ENDIF + ENDFOR + + IF lnPrimerID > 0 && Se ha identificado un ID de bloque excluyente + tnBloquesExclusion = tnBloquesExclusion + 1 + lnLen_IDFinBQ = LEN( ta_ID_Bloques(lnPrimerID,2) ) + DIMENSION taBloquesExclusion(tnBloquesExclusion,2) + taBloquesExclusion(tnBloquesExclusion,1) = I + taLineasExclusion(I) = .T. + + * Búsqueda del ID de fin de bloque + FOR I = I + 1 TO tnCodeLines + * Reduzco los espacios. Ej: '#IF .F. && cmt' ==> '#IF .F.&&cmt' + lcLine = LTRIM( STRTRAN( STRTRAN( CHRTRAN( taCodeLines(I), CHR(9), ' ' ), ' ', ' ' ), ' ', ' ' ) ) + taLineasExclusion(I) = .T. + + IF .lineIsOnlyCommentAndNoMetadata( @lcLine ) + LOOP + ENDIF + + DO CASE + CASE .elTextoEvaluadoEsElTokenIndicado( @lcLine, @ta_ID_Bloques, lnLen_IDFinBQ, X, 1 ) ; + AND NOT THIS.currentLineIsPreviousLineContinuation( @taCodeLines, I ) + lnAnidamientos = lnAnidamientos + 1 + + CASE .elTextoEvaluadoEsElTokenIndicado( @lcLine, @ta_ID_Bloques, lnLen_IDFinBQ, X, 2 ) ; + AND NOT THIS.currentLineIsPreviousLineContinuation( @taCodeLines, I ) + lnAnidamientos = lnAnidamientos - 1 + + IF lnAnidamientos = 0 + taBloquesExclusion(tnBloquesExclusion,2) = I + EXIT + ENDIF + ENDCASE + ENDFOR + + *-- Validación + IF EMPTY(taBloquesExclusion(tnBloquesExclusion,2)) + *ERROR 'No se ha encontrado el marcador de fin [' + ta_ID_Bloques(lnPrimerID,2) ; + + '] que cierra al marcador de inicio [' + ta_ID_Bloques(lnPrimerID,1) ; + + '] de la línea ' + TRANSFORM(taBloquesExclusion(tnBloquesExclusion,1)) + ERROR (TEXTMERGE(C_END_MARKER_NOT_FOUND_LOC)) + ENDIF + ENDIF + ENDFOR + ENDWITH && THIS + ENDIF + + CATCH TO loEx + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + + ENDTRY + + RETURN ENDPROC ******************************************************************************************************************* PROCEDURE lineaExcluida - LPARAMETERS tn_Linea, tnBloquesExclusion, taBloquesExclusion + LPARAMETERS tn_Linea, tnBloquesExclusion, taLineasExclusion - EXTERNAL ARRAY taBloquesExclusion - LOCAL X, llExcluida + EXTERNAL ARRAY taLineasExclusion + *LOCAL X, llExcluida - FOR X = 1 TO tnBloquesExclusion - IF BETWEEN( tn_Linea, taBloquesExclusion(X,1), taBloquesExclusion(X,2) ) - llExcluida = .T. - EXIT - ENDIF - ENDFOR + *FOR X = 1 TO tnBloquesExclusion + * IF BETWEEN( tn_Linea, taBloquesExclusion(X,1), taBloquesExclusion(X,2) ) + * llExcluida = .T. + * EXIT + * ENDIF + *ENDFOR - RETURN llExcluida + *RETURN llExcluida + RETURN taLineasExclusion(tn_Linea) ENDPROC @@ -4766,7 +4768,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base ******************************************************************************************************************* PROCEDURE analizarLineasDeProcedure LPARAMETERS toClase, toObjeto, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto, tc_Comentario ; - , taBloquesExclusion, tnBloquesExclusion + , taLineasExclusion, tnBloquesExclusion EXTERNAL ARRAY taCodeLines #IF .F. @@ -4789,7 +4791,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base FOR I = I + 1 TO tnCodeLines .set_Line( @tcLine, @taCodeLines, I ) - IF NOT .lineaExcluida( I, tnBloquesExclusion, @taBloquesExclusion ) ; + IF NOT .lineaExcluida( I, tnBloquesExclusion, @taLineasExclusion ) ; AND NOT .lineIsOnlyCommentAndNoMetadata( @tcLine, @tc_Comentario ) DO CASE @@ -5069,9 +5071,9 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base ******************************************************************************************************************* PROCEDURE analizarBloque_DEFINE_CLASS LPARAMETERS toModulo, toClase, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto ; - , taBloquesExclusion, tnBloquesExclusion, tc_Comentario + , taLineasExclusion, tnBloquesExclusion, tc_Comentario - EXTERNAL ARRAY taCodeLines, tnBloquesExclusion, taBloquesExclusion + EXTERNAL ARRAY taCodeLines, tnBloquesExclusion, taLineasExclusion #IF .F. LOCAL toModulo AS CL_MODULO OF 'FOXBIN2PRG.PRG' @@ -5123,7 +5125,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base LOOP CASE .analizarBloque_PROCEDURE( @toModulo, @toClase, @loObjeto, @tcLine, @taCodeLines, @I, @tnCodeLines ; - , @tcProcedureAbierto, @tc_Comentario, @taBloquesExclusion, @tnBloquesExclusion ) + , @tcProcedureAbierto, @tc_Comentario, @taLineasExclusion, @tnBloquesExclusion ) *-- OJO: Esta se analiza primero a propósito, solo porque no puede estar detrás de PROTECTED y HIDDEN STORE .T. TO llCLASSCOMMENTS_Completed ; , llCLASS_PROPERTY_Completed ; @@ -5479,7 +5481,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base ******************************************************************************************************************* PROCEDURE analizarBloque_PROCEDURE LPARAMETERS toModulo, toClase, toObjeto, tcLine, taCodeLines, I, tnCodeLines, tcProcedureAbierto ; - , tc_Comentario, taBloquesExclusion, tnBloquesExclusion + , tc_Comentario, taLineasExclusion, tnBloquesExclusion #IF .F. LOCAL toModulo AS CL_MODULO OF 'FOXBIN2PRG.PRG' @@ -5514,7 +5516,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base IF llBloqueEncontrado *-- Evalúo todo el contenido del PROCEDURE THIS.analizarLineasDeProcedure( @toClase, @toObjeto, @tcLine, @taCodeLines, @I, @tnCodeLines, @tcProcedureAbierto ; - , @tc_Comentario, @taBloquesExclusion, @tnBloquesExclusion ) + , @tc_Comentario, @taLineasExclusion, @tnBloquesExclusion ) ENDIF RETURN llBloqueEncontrado @@ -5617,18 +5619,18 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base PROCEDURE identificarBloquesDeCodigo *-------------------------------------------------------------------------------------------------------------- * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * taCodeLines (!@ IN ) El array con las líneas del código donde buscar - * tnCodeLines (!@ IN ) Cantidad de líneas de código - * taBloquesExclusion (!@ IN ) Array con las posiciones de inicio/fin de los bloques de exclusion - * tnBloquesExclusion (!@ IN ) Cantidad de bloques de exclusión + * taCodeLines (@! IN ) El array con las líneas del código donde buscar + * tnCodeLines (@! IN ) Cantidad de líneas de código + * taLineasExclusion (@! IN ) Array unidimensional con un .T. o .F. según la línea sea de exclusión o no + * tnBloquesExclusion (@! IN ) Cantidad de bloques de exclusión * toModulo (@? OUT) Objeto con toda la información del módulo analizado * * NOTA: * Como identificador se usa el nombre de clase o de procedimiento, según corresponda. *-------------------------------------------------------------------------------------------------------------- - LPARAMETERS taCodeLines, tnCodeLines, taBloquesExclusion, tnBloquesExclusion, toModulo + LPARAMETERS taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toModulo - EXTERNAL ARRAY taCodeLines, taBloquesExclusion + EXTERNAL ARRAY taCodeLines, taLineasExclusion #IF .F. LOCAL toModulo AS CL_MODULO OF 'FOXBIN2PRG.PRG' @@ -5657,7 +5659,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base .set_Line( @lcLine, @taCodeLines, I ) DO CASE - CASE .lineaExcluida( I, tnBloquesExclusion, @taBloquesExclusion ) ; + CASE .lineaExcluida( I, tnBloquesExclusion, @taLineasExclusion ) ; OR .lineIsOnlyCommentAndNoMetadata( @lcLine, @lc_Comentario ) && Excluida, vacía o solo Comentarios CASE NOT llFoxBin2Prg_Completed AND .analizarBloque_FoxBin2Prg( toModulo, @lcLine, @taCodeLines, @I, tnCodeLines ) @@ -5676,7 +5678,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base llINCLUDE_SCX_Completed = .T. CASE .analizarBloque_DEFINE_CLASS( @toModulo, @loClase, @lcLine, @taCodeLines, @I, tnCodeLines ; - , @lcProcedureAbierto, @taBloquesExclusion, @tnBloquesExclusion, @lc_Comentario ) + , @lcProcedureAbierto, @taLineasExclusion, @tnBloquesExclusion, @lc_Comentario ) *-- Puede haber varias ENDCASE @@ -5731,7 +5733,7 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin TRY LOCAL lnCodError, lcLine, laCodeLines(1), lnCodeLines ; - , laBloquesExclusion(1,2), lnBloquesExclusion, I + , laLineasExclusion(1), lnBloquesExclusion, I WITH THIS AS c_conversor_prg_a_vcx OF 'FOXBIN2PRG.PRG' STORE 0 TO lnCodError, lnCodeLines @@ -5747,10 +5749,10 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin .createClasslib() *-- Identifico los TEXT/ENDTEXT, #IF .F./#ENDIF - .identificarBloquesDeExclusion( @laCodeLines, lnCodeLines, .F., @laBloquesExclusion, @lnBloquesExclusion ) + .identificarBloquesDeExclusion( @laCodeLines, lnCodeLines, .F., @laLineasExclusion, @lnBloquesExclusion ) *-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo de cada clase - .identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laBloquesExclusion, lnBloquesExclusion, @toModulo ) + .identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toModulo ) .escribirArchivoBin( @toModulo, toFoxBin2Prg ) ENDWITH && THIS @@ -5765,7 +5767,7 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin FINALLY USE IN (SELECT("TABLABIN")) - RELEASE lnCodError, lcLine, laCodeLines, lnCodeLines, laBloquesExclusion, lnBloquesExclusion, I + RELEASE lnCodError, lcLine, laCodeLines, lnCodeLines, laLineasExclusion, lnBloquesExclusion, I ENDTRY RETURN @@ -6035,7 +6037,7 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin TRY LOCAL lnCodError, laCodeLines(1), lnCodeLines, lnFB2P_Version ; - , laBloquesExclusion(1,2), lnBloquesExclusion, I + , laLineasExclusion(1), lnBloquesExclusion, I WITH THIS AS c_conversor_prg_a_scx OF 'FOXBIN2PRG.PRG' STORE 0 TO lnCodError, lnCodeLines, lnFB2P_Version @@ -6050,10 +6052,10 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin .createForm() *-- Identifico los TEXT/ENDTEXT, #IF .F./#ENDIF - .identificarBloquesDeExclusion( @laCodeLines, lnCodeLines, .F., @laBloquesExclusion, @lnBloquesExclusion ) + .identificarBloquesDeExclusion( @laCodeLines, lnCodeLines, .F., @laLineasExclusion, @lnBloquesExclusion ) *-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo de cada clase - .identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laBloquesExclusion, lnBloquesExclusion, @toModulo ) + .identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toModulo ) .escribirArchivoBin( @toModulo, toFoxBin2Prg ) ENDWITH && THIS @@ -6344,7 +6346,7 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin #ENDIF TRY - LOCAL laCodeLines(1), lnCodeLines, laBloquesExclusion(1,2), lnBloquesExclusion, I + LOCAL laCodeLines(1), lnCodeLines, laLineasExclusion(1), lnBloquesExclusion, I WITH THIS AS c_conversor_prg_a_pjx OF 'FOXBIN2PRG.PRG' STORE 0 TO lnCodeLines @@ -6359,10 +6361,10 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin .createProject() *-- Identifico los TEXT/ENDTEXT, #IF .F./#ENDIF - *.identificarBloquesDeExclusion( @laCodeLines, .F., @laBloquesExclusion, @lnBloquesExclusion ) + *.identificarBloquesDeExclusion( @laCodeLines, .F., @laLineasExclusion, @lnBloquesExclusion ) *-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo de cada clase - .identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laBloquesExclusion, lnBloquesExclusion, @toProject ) + .identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toProject ) .escribirArchivoBin( @toProject, toFoxBin2Prg ) ENDWITH && THIS @@ -6377,7 +6379,7 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin FINALLY USE IN (SELECT("TABLABIN")) - RELEASE laCodeLines, lnCodeLines, laBloquesExclusion, lnBloquesExclusion, I + RELEASE laCodeLines, lnCodeLines, laLineasExclusion, lnBloquesExclusion, I ENDTRY RETURN @@ -6511,19 +6513,19 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin ******************************************************************************************************************* PROCEDURE identificarBloquesDeCodigo - LPARAMETERS taCodeLines, tnCodeLines, taBloquesExclusion, tnBloquesExclusion, toProject + LPARAMETERS taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toProject *-------------------------------------------------------------------------------------------------------------- * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * taCodeLines (!@ IN ) El array con las líneas del código donde buscar - * tnCodeLines (!@ IN ) Cantidad de líneas de código - * taBloquesExclusion (!@ IN ) Array con las posiciones de inicio/fin de los bloques de exclusion - * tnBloquesExclusion (!@ IN ) Cantidad de bloques de exclusión + * taCodeLines (@! IN ) El array con las líneas del código donde buscar + * tnCodeLines (@! IN ) Cantidad de líneas de código + * taLineasExclusion (@! IN ) Array unidimensional con un .T. o .F. según la línea sea de exclusión o no + * tnBloquesExclusion (@! IN ) Cantidad de bloques de exclusión * toProject (@? OUT) Objeto con toda la información del proyecto analizado * * NOTA: * Como identificador se usa el nombre de clase o de procedimiento, según corresponda. *-------------------------------------------------------------------------------------------------------------- - EXTERNAL ARRAY taCodeLines, taBloquesExclusion + EXTERNAL ARRAY taCodeLines, taLineasExclusion #IF .F. LOCAL toProject AS CL_PROJECT OF 'FOXBIN2PRG.PRG' @@ -7131,7 +7133,7 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin TRY LOCAL lnCodError, loEx AS EXCEPTION, laCodeLines(1), lnCodeLines, lnFB2P_Version ; - , laBloquesExclusion(1,2), lnBloquesExclusion, I + , laLineasExclusion(1), lnBloquesExclusion, I WITH THIS AS c_conversor_prg_a_frx OF 'FOXBIN2PRG.PRG' STORE 0 TO lnCodError, lnCodeLines @@ -7146,7 +7148,7 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin .createReport() *-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo del reporte - .identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laBloquesExclusion, lnBloquesExclusion, @toReport ) + .identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toReport ) .escribirArchivoBin( @toReport, toFoxBin2Prg ) ENDWITH && THIS @@ -7265,19 +7267,19 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin ******************************************************************************************************************* PROCEDURE identificarBloquesDeCodigo - LPARAMETERS taCodeLines, tnCodeLines, taBloquesExclusion, tnBloquesExclusion, toReport + LPARAMETERS taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toReport *-------------------------------------------------------------------------------------------------------------- * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) * taCodeLines (!@ IN ) El array con las líneas del código donde buscar * tnCodeLines (!@ IN ) Cantidad de líneas de código - * taBloquesExclusion (@? IN ) Sin uso - * tnBloquesExclusion (@? IN ) Sin uso + * taLineasExclusion (@! IN ) Array unidimensional con un .T. o .F. según la línea sea de exclusión o no + * tnBloquesExclusion (@? IN ) Cantidad de bloques de exclusion * toReport (@? OUT) Objeto con toda la información del reporte analizado * * NOTA: * Como identificador se usa el nombre de clase o de procedimiento, según corresponda. *-------------------------------------------------------------------------------------------------------------- - EXTERNAL ARRAY taCodeLines, taBloquesExclusion + EXTERNAL ARRAY taCodeLines, taLineasExclusion #IF .F. LOCAL toReport AS CL_REPORT OF 'FOXBIN2PRG.PRG' @@ -7558,7 +7560,7 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin #ENDIF TRY - LOCAL lnCodError, loEx AS EXCEPTION, laCodeLines(1), lnCodeLines, laBloquesExclusion(1,2), lnBloquesExclusion, I + LOCAL lnCodError, loEx AS EXCEPTION, laCodeLines(1), lnCodeLines, laLineasExclusion(1), lnBloquesExclusion, I STORE 0 TO lnCodError, lnCodeLines WITH THIS AS c_conversor_prg_a_dbf OF 'FOXBIN2PRG.PRG' @@ -7568,7 +7570,7 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin toFoxBin2Prg.doBackup( .F., .T., '', '', '' ) *-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo del reporte - .identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laBloquesExclusion, lnBloquesExclusion, @toTable ) + .identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toTable ) .escribirArchivoBin( @toTable, @toFoxBin2Prg ) ENDWITH && THIS @@ -7753,12 +7755,12 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) * taCodeLines (!@ IN ) El array con las líneas del código donde buscar * tnCodeLines (!@ IN ) Cantidad de líneas de código - * taBloquesExclusion (@? IN ) Sin uso + * taLineasExclusion (@! IN ) Array unidimensional con un .T. o .F. según la línea sea de exclusión o no * tnBloquesExclusion (@? IN ) Sin uso * toTable (@? OUT) Objeto con toda la información de la tabla analizada *-------------------------------------------------------------------------------------------------------------- - LPARAMETERS taCodeLines, tnCodeLines, taBloquesExclusion, tnBloquesExclusion, toTable - EXTERNAL ARRAY taCodeLines, taBloquesExclusion + LPARAMETERS taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toTable + EXTERNAL ARRAY taCodeLines, taLineasExclusion #IF .F. LOCAL toTable AS CL_DBF_TABLE OF 'FOXBIN2PRG.PRG' @@ -7843,7 +7845,7 @@ DEFINE CLASS c_conversor_prg_a_dbc AS c_conversor_prg_a_bin TRY LOCAL lnCodError, loEx AS EXCEPTION, loReg, lcLine, laCodeLines(1), lnCodeLines ; - , laBloquesExclusion(1,2), lnBloquesExclusion, I + , laLineasExclusion(1), lnBloquesExclusion, I STORE 0 TO lnCodError, lnCodeLines STORE '' TO lcLine STORE NULL TO loReg, toModulo @@ -7858,7 +7860,7 @@ DEFINE CLASS c_conversor_prg_a_dbc AS c_conversor_prg_a_bin *.createTable() *-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo del reporte - .identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laBloquesExclusion, lnBloquesExclusion, @toDatabase ) + .identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toDatabase ) .escribirArchivoBin( @toDatabase, toFoxBin2Prg ) ENDWITH && THIS @@ -7926,15 +7928,15 @@ DEFINE CLASS c_conversor_prg_a_dbc AS c_conversor_prg_a_bin * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) * taCodeLines (!@ IN ) El array con las líneas del código donde buscar * tnCodeLines (!@ IN ) Cantidad de líneas de código - * taBloquesExclusion (@? IN ) Sin uso + * taLineasExclusion (@! IN ) Array unidimensional con un .T. o .F. según la línea sea de exclusión o no * tnBloquesExclusion (@? IN ) Sin uso * toDatabase (@? OUT) Objeto con toda la información de la base de datos analizada * * NOTA: * Como identificador se usa el nombre de clase o de procedimiento, según corresponda. *-------------------------------------------------------------------------------------------------------------- - LPARAMETERS taCodeLines, tnCodeLines, taBloquesExclusion, tnBloquesExclusion, toDatabase - EXTERNAL ARRAY taCodeLines, taBloquesExclusion + LPARAMETERS taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toDatabase + EXTERNAL ARRAY taCodeLines, taLineasExclusion #IF .F. LOCAL toDatabase AS CL_DBC OF 'FOXBIN2PRG.PRG' @@ -8018,7 +8020,7 @@ DEFINE CLASS c_conversor_prg_a_mnx AS c_conversor_prg_a_bin TRY LOCAL lnCodError, loEx AS EXCEPTION, loReg, lcLine, laCodeLines(1), lnCodeLines ; - , laBloquesExclusion(1,2), lnBloquesExclusion + , laLineasExclusion(1), lnBloquesExclusion STORE 0 TO lnCodError, lnCodeLines STORE '' TO lcLine @@ -8032,7 +8034,7 @@ DEFINE CLASS c_conversor_prg_a_mnx AS c_conversor_prg_a_bin .createMenu() *-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo del reporte - .identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laBloquesExclusion, lnBloquesExclusion, @toMenu ) + .identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toMenu ) .escribirArchivoBin( @toMenu ) ENDWITH && THIS @@ -8060,15 +8062,15 @@ DEFINE CLASS c_conversor_prg_a_mnx AS c_conversor_prg_a_bin * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) * taCodeLines (!@ IN ) El array con las líneas del código donde buscar * tnCodeLines (!@ IN ) Cantidad de líneas de código - * taBloquesExclusion (@? IN ) Sin uso + * taLineasExclusion (@! IN ) Array unidimensional con un .T. o .F. según la línea sea de exclusión o no * tnBloquesExclusion (@? IN ) Sin uso * toMenu (@? OUT) Objeto con toda la información del menú analizado * * NOTA: * Como identificador se usa el nombre de clase o de procedimiento, según corresponda. *-------------------------------------------------------------------------------------------------------------- - LPARAMETERS taCodeLines, tnCodeLines, taBloquesExclusion, tnBloquesExclusion, toMenu - EXTERNAL ARRAY taCodeLines, taBloquesExclusion + LPARAMETERS taCodeLines, tnCodeLines, taLineasExclusion, tnBloquesExclusion, toMenu + EXTERNAL ARRAY taCodeLines, taLineasExclusion #IF .F. LOCAL toMenu AS CL_MENU OF 'FOXBIN2PRG.PRG' @@ -8646,7 +8648,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base *-- 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 ; - , laBloquesExclusion(1,2), lnBloquesExclusion, laLineasDeExclusion(1) ; + , laLineasExclusion(1), lnBloquesExclusion ; , loEx AS EXCEPTION DIMENSION taMethods(1,3) STORE '' TO taMethods, tcSorted, taCode @@ -8693,7 +8695,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDFOR *-- Identifico los TEXT/ENDTEXT, #IF .F./#ENDIF - THIS.identificarBloquesDeExclusion( @laLine, lnLineCount, .F., @laBloquesExclusion, @lnBloquesExclusion, @laLineasDeExclusion ) + THIS.identificarBloquesDeExclusion( @laLine, lnLineCount, .F., @laLineasExclusion, @lnBloquesExclusion ) *-- Analyze and count line methods, get method names and consolidate block code FOR I = 1 TO lnLineCount @@ -8704,7 +8706,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base lnLine_Len = LEN( laLine(I) ) DO CASE - CASE laLineasDeExclusion(I) + CASE laLineasExclusion(I) taCode(tnMethodCount) = taCode(tnMethodCount) + laLine(I) + CR_LF CASE lnTextNodes = 0 AND UPPER( LEFT(laLine(I), 10) ) == 'PROCEDURE ' From b3fbfa3f5415db6d5c6c5e813bd33b38a0308468 Mon Sep 17 00:00:00 2001 From: fdbozzo Date: Fri, 1 Aug 2014 21:36:37 +0200 Subject: [PATCH 6/8] Changeset: 387 fdbozzo - 01/08/2014 01:16:35: - Agregados casos de prueba para comprobar el nuevo array aLineasExclusion --- ...or_base__IdentificarBloquesDeExclusion.prg | 73 +++++++++++++++---- 1 file changed, 60 insertions(+), 13 deletions(-) diff --git a/TESTS/ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion.prg b/TESTS/ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion.prg index 2aa01e7..0b50c40 100644 --- a/TESTS/ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion.prg +++ b/TESTS/ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion.prg @@ -27,7 +27,7 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion as ******************************************************************************************************************************************* FUNCTION Evaluate_results - LPARAMETERS taExpected_Pos, taPos, tnPos_Count + LPARAMETERS taExpected_Pos, taPos, tnPos_Count, taLineasExclusion_Esperadas, taLineasExclusion LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG" loObj = THIS.icObj @@ -37,11 +37,24 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion as RETURN .T. ENDIF + *-- INFORMACIÓN THIS.messageout( "Pares de posiciones esperados: " + TRANSFORM(tnPos_Count) ) FOR I = 1 TO tnPos_Count THIS.messageout( "Posición de Inicio/Fin esperados: " + TRANSFORM(taExpected_Pos(I,1)) + ',' + TRANSFORM(taExpected_Pos(I,2)) ) ENDFOR + + THIS.messageout( "" ) + + IF TYPE( "taLineasExclusion",1 ) = "A" + FOR I = 1 TO ALEN(taLineasExclusion_Esperadas,1) + THIS.messageout( "Línea de exclusión " + STR(I,2) + " esperada: " + TRANSFORM( taLineasExclusion_Esperadas(I) ) ; + + IIF( taLineasExclusion_Esperadas(I), ' <', '' ) ) + ENDFOR + ENDIF + + THIS.messageout( REPLICATE("*",80) ) + *-- TESTS THIS.assertequals( ALEN(taExpected_Pos,1), ALEN(taPos,1), "Posición de Inicio/Fin" ) FOR I = 1 TO tnPos_Count @@ -49,12 +62,17 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion as , TRANSFORM(taPos(I,1)) + ',' + TRANSFORM(taPos(I,2)) ; , "Posición de Inicio/Fin" ) ENDFOR + + IF TYPE( "taLineasExclusion",1 ) = "A" + THIS.assertequalsarrays( @taLineasExclusion_Esperadas, @taLineasExclusion, "Líneas de Exclusión" ) + ENDIF ENDFUNC ******************************************************************************************************************************************* FUNCTION Deberia_ObtenerLaUbicacionDelBloque_IF_ENDIF_CuandoCodigoCon_IF_ENDIF_predominante_esEvaluado - LOCAL lcMethod, laLineas(1), lnLineas, laPos(1,2), lnPos_Count, laExpected_Pos(2,2) + LOCAL lcMethod, laLineas(1), lnLineas, laPos(1,2), lnPos_Count, laExpected_Pos(2,2) ; + , laLineasExclusion(10), laLineasExclusion_Esperadas(10) LOCAL loObj AS c_conversor_prg_a_bin OF "FOXBIN2PRG.PRG" loObj = THIS.icObj @@ -64,6 +82,12 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion as laExpected_Pos(1,2) = 5 laExpected_Pos(2,1) = 7 laExpected_Pos(2,2) = 9 + laLineasExclusion_Esperadas( 3) = .T. + laLineasExclusion_Esperadas( 4) = .T. + laLineasExclusion_Esperadas( 5) = .T. + laLineasExclusion_Esperadas( 7) = .T. + laLineasExclusion_Esperadas( 8) = .T. + laLineasExclusion_Esperadas( 9) = .T. TEXT TO lcMethod NOSHOW TEXTMERGE FLAGS 1 PRETEXT 1+2+4 <> myMethod_B @@ -81,16 +105,18 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion as lnLineas = ALINES( laLineas, lcMethod ) *-- Test - loObj.identificarBloquesDeExclusion( @laLineas, lnLineas, , , @lnPos_Count, @laPos ) + loObj.identificarBloquesDeExclusion( @laLineas, lnLineas, , @laLineasExclusion, @lnPos_Count, @laPos ) - THIS.Evaluate_results( @laExpected_Pos, @laPos, lnPos_Count ) + *-- Evaluación de resultados + THIS.Evaluate_results( @laExpected_Pos, @laPos, lnPos_Count, @laLineasExclusion_Esperadas, @laLineasExclusion ) ENDFUNC ******************************************************************************************************************************************* FUNCTION Deberia_ObtenerLaUbicacionDelBloque_IF_ENDIF_Externo_CuandoCodigoCon_IF_ENDIF_predominante_esEvaluado - LOCAL lcMethod, laLineas(1), lnLineas, laPos(1,2), lnPos_Count, laExpected_Pos(1,2) + LOCAL lcMethod, laLineas(1), lnLineas, laPos(1,2), lnPos_Count, laExpected_Pos(1,2) ; + , laLineasExclusion(10), laLineasExclusion_Esperadas(10) LOCAL loObj AS c_conversor_prg_a_bin OF "FOXBIN2PRG.PRG" loObj = THIS.icObj @@ -98,6 +124,13 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion as STORE '' TO lcMethod laExpected_Pos(1,1) = 3 laExpected_Pos(1,2) = 9 + laLineasExclusion_Esperadas( 3) = .T. + laLineasExclusion_Esperadas( 4) = .T. + laLineasExclusion_Esperadas( 5) = .T. + laLineasExclusion_Esperadas( 6) = .T. + laLineasExclusion_Esperadas( 7) = .T. + laLineasExclusion_Esperadas( 8) = .T. + laLineasExclusion_Esperadas( 9) = .T. TEXT TO lcMethod NOSHOW TEXTMERGE FLAGS 1 PRETEXT 1+2+4 <> myMethod_B @@ -115,16 +148,18 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion as lnLineas = ALINES( laLineas, lcMethod ) *-- Test - loObj.identificarBloquesDeExclusion( @laLineas, lnLineas, , , @lnPos_Count, @laPos ) + loObj.identificarBloquesDeExclusion( @laLineas, lnLineas, , @laLineasExclusion, @lnPos_Count, @laPos ) - THIS.Evaluate_results( @laExpected_Pos, @laPos, lnPos_Count ) + *-- Evaluación de resultados + THIS.Evaluate_results( @laExpected_Pos, @laPos, lnPos_Count, @laLineasExclusion_Esperadas, @laLineasExclusion ) ENDFUNC ******************************************************************************************************************************************* FUNCTION Deberia_ObtenerLaUbicacionDelBloque_TEXT_ENDTEXT_CuandoCodigoCon_TEXT_ENDTEXT_predominante_esEvaluado - LOCAL lcMethod, laLineas(1), lnLineas, laPos(1,2), lnPos_Count, laExpected_Pos(2,2) + LOCAL lcMethod, laLineas(1), lnLineas, laPos(1,2), lnPos_Count, laExpected_Pos(2,2) ; + , laLineasExclusion(10), laLineasExclusion_Esperadas(10) LOCAL loObj AS c_conversor_prg_a_bin OF "FOXBIN2PRG.PRG" loObj = THIS.icObj @@ -134,6 +169,12 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion as laExpected_Pos(1,2) = 5 laExpected_Pos(2,1) = 7 laExpected_Pos(2,2) = 9 + laLineasExclusion_Esperadas( 3) = .T. + laLineasExclusion_Esperadas( 4) = .T. + laLineasExclusion_Esperadas( 5) = .T. + laLineasExclusion_Esperadas( 7) = .T. + laLineasExclusion_Esperadas( 8) = .T. + laLineasExclusion_Esperadas( 9) = .T. TEXT TO lcMethod NOSHOW TEXTMERGE FLAGS 1 PRETEXT 1+2+4 <> myMethod_B @@ -151,9 +192,10 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion as lnLineas = ALINES( laLineas, lcMethod ) *-- Test - loObj.identificarBloquesDeExclusion( @laLineas, lnLineas, , , @lnPos_Count, @laPos ) + loObj.identificarBloquesDeExclusion( @laLineas, lnLineas, , @laLineasExclusion, @lnPos_Count, @laPos ) - THIS.Evaluate_results( @laExpected_Pos, @laPos, lnPos_Count ) + *-- Evaluación de resultados + THIS.Evaluate_results( @laExpected_Pos, @laPos, lnPos_Count, @laLineasExclusion_Esperadas, @laLineasExclusion ) ENDFUNC @@ -237,7 +279,8 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion as ******************************************************************************************************************************************* FUNCTION Deberia_NoEncontrarBloque_TEXT_ENDTEXT_CuandoEvaluaUnaLineaQueComienzaConUnCampoLlamado_Text_YLineaAnteriorTerminaEn_Coma - LOCAL lcMethod, laLineas(1), lnLineas, laPos(1,2), lnPos_Count, laExpected_Pos(1,2) + LOCAL lcMethod, laLineas(1), lnLineas, laPos(1,2), lnPos_Count, laExpected_Pos(1,2) ; + , laLineasExclusion(29), laLineasExclusion_Esperadas(29) LOCAL loObj AS c_conversor_prg_a_bin OF "FOXBIN2PRG.PRG" loObj = THIS.icObj @@ -245,6 +288,9 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion as STORE '' TO lcMethod laExpected_Pos(1,1) = 4 laExpected_Pos(1,2) = 15 + FOR I = 4 TO 15 + laLineasExclusion_Esperadas(I) = .T. + ENDFOR TEXT TO lcMethod NOSHOW TEXTMERGE FLAGS 1 PRETEXT 1+2+4 <> myMethod_B @@ -281,9 +327,10 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion as lnLineas = ALINES( laLineas, lcMethod ) *-- Test - loObj.identificarBloquesDeExclusion( @laLineas, lnLineas, , , @lnPos_Count, @laPos ) + loObj.identificarBloquesDeExclusion( @laLineas, lnLineas, , @laLineasExclusion, @lnPos_Count, @laPos ) - THIS.Evaluate_results( @laExpected_Pos, @laPos, lnPos_Count ) + *-- Evaluación de resultados + THIS.Evaluate_results( @laExpected_Pos, @laPos, lnPos_Count, @laLineasExclusion_Esperadas, @laLineasExclusion ) ENDFUNC From 693d50f8e473fc8efaa4f34a2e858450ed3474e6 Mon Sep 17 00:00:00 2001 From: fdbozzo Date: Fri, 1 Aug 2014 21:38:08 +0200 Subject: [PATCH 7/8] Changeset: 388 fdbozzo - 01/08/2014 21:36:38: - EXE --- foxbin2prg.exe | Bin 443506 -> 442980 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/foxbin2prg.exe b/foxbin2prg.exe index 7329f6bc6e39187c005f9d724a3c0af273256adb..e954cebb74f1a1b5411082a40db0f7efa747c677 100644 GIT binary patch delta 14910 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 delta 15389 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 Date: Fri, 1 Aug 2014 23:02:02 +0200 Subject: [PATCH 8/8] Changeset: 391 fdbozzo - 01/08/2014 22:57:17: --- FoxBin2PRGVersionFile.txt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/FoxBin2PRGVersionFile.txt b/FoxBin2PRGVersionFile.txt index 9413152..853cf99 100644 --- a/FoxBin2PRGVersionFile.txt +++ b/FoxBin2PRGVersionFile.txt @@ -2,8 +2,8 @@ Lparameters toUpdateInfo Local lcNote With toUpdateInfo - .VersionNumber = 'v1.19.28' - .VersionDate = Date(2014,07,26) + .VersionNumber = 'v1.19.29' + .VersionDate = Date(2014,08,01) .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 ------------------------------------------------------------- +2014/08/01 v1.19.29 +- Bug Fix vcx/scx: Bad text/endtext block detection when there is a line that begins with a "text" field and previous line end with "," in regards of ";" (M_N_M) +- Optimizations and refactoring + 2014/07/26 v1.19.28 - Feature: Added new options in foxbin2prg.cfg (DBF_Conversion_Included, DBF_Conversion_Excluded) and in filename.dbf.cfg (DBF_Conversion_Order, DBF_Conversion_Condition) for exporting DBFs data to text when DBF_Conversion_Support is 4 (Edyshor)