diff --git a/TESTS/ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion.prg b/TESTS/ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion.prg index 45e898f..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, , @laPos, @lnPos_Count ) + 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, , @laPos, @lnPos_Count ) + 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, , @laPos, @lnPos_Count ) + 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 @@ -228,7 +270,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 ) @@ -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, , @laPos, @lnPos_Count ) + 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 diff --git a/foxbin2prg.exe b/foxbin2prg.exe index 7329f6b..e954ceb 100644 Binary files a/foxbin2prg.exe and b/foxbin2prg.exe differ diff --git a/foxbin2prg.prg b/foxbin2prg.prg index d0da57c..623586d 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -2378,13 +2378,16 @@ DEFINE CLASS c_conversor_base AS SESSION + [] ; + [] ; + [] ; + + [] ; + [] ; + [] ; + [] ; + [] ; + + [] ; + [] ; + [] ; + [] ; + + [] ; + [] ; + [] ; + [] ; @@ -2661,6 +2664,60 @@ 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 decode_SpecialCodes_1_31 *--------------------------------------------------------------------------------------------------- * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) @@ -2890,6 +2947,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) @@ -2915,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 @@ -2972,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 @@ -3587,19 +3814,15 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base + [] ; + [] ; + [] ; - + [] ; + [] ; - + [] ; + [] ; + [] ; + [] ; + [] ; + [] ; + [] ; - + [] ; + [] ; + [] ; - + [] ; + [] ; + [] ; + [] ; @@ -3664,235 +3887,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 *------------------------------------------------------ @@ -4774,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. @@ -4797,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 @@ -5077,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' @@ -5131,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 ; @@ -5487,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' @@ -5522,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 @@ -5625,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' @@ -5665,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 ) @@ -5684,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 @@ -5739,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 @@ -5755,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 @@ -5773,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 @@ -6043,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 @@ -6058,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 @@ -6352,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 @@ -6367,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 @@ -6385,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 @@ -6519,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' @@ -7139,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 @@ -7154,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 @@ -7273,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' @@ -7566,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' @@ -7576,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 @@ -7761,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' @@ -7851,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 @@ -7866,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 @@ -7934,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' @@ -8026,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 @@ -8040,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 @@ -8068,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' @@ -8495,9 +8489,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 @@ -8645,8 +8647,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 ; + , laLineasExclusion(1), lnBloquesExclusion ; + , loEx AS EXCEPTION DIMENSION taMethods(1,3) STORE '' TO taMethods, tcSorted, taCode tnMethodCount = 0 @@ -8691,6 +8694,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., @laLineasExclusion, @lnBloquesExclusion ) + *-- Analyze and count line methods, get method names and consolidate block code FOR I = 1 TO lnLineCount IF toFoxBin2Prg.l_DropNullCharsFromCode @@ -8700,35 +8706,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 laLineasExclusion(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)