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)