diff --git a/TESTS/DATOS_READONLY/menu1.mn2 b/TESTS/DATOS_READONLY/menu1.mn2 index de7b935..2848209 100644 --- a/TESTS/DATOS_READONLY/menu1.mn2 +++ b/TESTS/DATOS_READONLY/menu1.mn2 @@ -2,7 +2,7 @@ * (ES) AUTOGENERADO - ¡¡ATENCIÓN!! - ¡¡NO PENSADO PARA EJECUTAR!! USAR SOLAMENTE PARA INTEGRAR CAMBIOS Y ALMACENAR CON HERRAMIENTAS SCM!! * (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!! *-------------------------------------------------------------------------------------------------------------------------------------------------------- -*< FOXBIN2PRG: Version="1.19" SourceFile="C:\DESA\foxbin2prg\TESTS\DATOS_READONLY\menu1.mnx" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries) +*< FOXBIN2PRG: Version="1.19" SourceFile="menu1.mnx" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries) * *1 *APPEND diff --git a/TESTS/DATOS_READONLY/menu3.mn2 b/TESTS/DATOS_READONLY/menu3.mn2 index 69ea8db..0ca8819 100644 --- a/TESTS/DATOS_READONLY/menu3.mn2 +++ b/TESTS/DATOS_READONLY/menu3.mn2 @@ -2,7 +2,7 @@ * (ES) AUTOGENERADO - ¡¡ATENCIÓN!! - ¡¡NO PENSADO PARA EJECUTAR!! USAR SOLAMENTE PARA INTEGRAR CAMBIOS Y ALMACENAR CON HERRAMIENTAS SCM!! * (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!! *-------------------------------------------------------------------------------------------------------------------------------------------------------- -*< FOXBIN2PRG: Version="1.19" SourceFile="C:\DESA\foxbin2prg\TESTS\DATOS_READONLY\menu3.mnx" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries) +*< FOXBIN2PRG: Version="1.19" SourceFile="menu3.mnx" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries) * *1 *REPLACE diff --git a/TESTS/DATOS_READONLY/menu_shortcut.mn2 b/TESTS/DATOS_READONLY/menu_shortcut.mn2 index 4024496..1d3e144 100644 --- a/TESTS/DATOS_READONLY/menu_shortcut.mn2 +++ b/TESTS/DATOS_READONLY/menu_shortcut.mn2 @@ -2,7 +2,7 @@ * (ES) AUTOGENERADO - ¡¡ATENCIÓN!! - ¡¡NO PENSADO PARA EJECUTAR!! USAR SOLAMENTE PARA INTEGRAR CAMBIOS Y ALMACENAR CON HERRAMIENTAS SCM!! * (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!! *-------------------------------------------------------------------------------------------------------------------------------------------------------- -*< FOXBIN2PRG: Version="1.19" SourceFile="C:\DESA\foxbin2prg\TESTS\DATOS_READONLY\menu_shortcut.mnx" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries) +*< FOXBIN2PRG: Version="1.19" SourceFile="menu_shortcut.mnx" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries) * *4 *REPLACE diff --git a/TESTS/DATOS_READONLY/menu_shortcut2.mn2 b/TESTS/DATOS_READONLY/menu_shortcut2.mn2 index 138a9a4..988835e 100644 --- a/TESTS/DATOS_READONLY/menu_shortcut2.mn2 +++ b/TESTS/DATOS_READONLY/menu_shortcut2.mn2 @@ -2,7 +2,7 @@ * (ES) AUTOGENERADO - ¡¡ATENCIÓN!! - ¡¡NO PENSADO PARA EJECUTAR!! USAR SOLAMENTE PARA INTEGRAR CAMBIOS Y ALMACENAR CON HERRAMIENTAS SCM!! * (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!! *-------------------------------------------------------------------------------------------------------------------------------------------------------- -*< FOXBIN2PRG: Version="1.19" SourceFile="C:\DESA\foxbin2prg\TESTS\DATOS_READONLY\menu_shortcut2.mnx" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries) +*< FOXBIN2PRG: Version="1.19" SourceFile="menu_shortcut2.mnx" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries) * *4 *REPLACE diff --git a/foxbin2prg.cfg b/foxbin2prg.cfg index 1385bc8..867d256 100644 --- a/foxbin2prg.cfg +++ b/foxbin2prg.cfg @@ -9,10 +9,10 @@ * * extension: xx2 && Default FoxBin2Prg extensions ends in '2' / Las extensiones por defecto de FoxBin2Prg terminan en '2' * DontShowProgress: 0 && Show progress bar by default in multi-file processing / Mostrar barra de progreso por defecto en procesamiento multi-archivo -* DontShowErrors: 1 && Show message errors by default / Mostrar mensajes de error por defecto +* DontShowErrors: 0 && Show message errors by default / Mostrar mensajes de error por defecto * NoTimestamps: 1 && Crear timespampt by default for minimize differences / Vaciar Timestamps por defecto para minimizar diferencias -* Debug: 1 && Activate individual .Log by default / Activar .Log por defecto -* ExtraBackupLevels: 0 && By default 1 BAK is created. With this you can make more .N.BAK / Por defecto 1 BAK es creado. Con esto puede crear más .N.BAK +* Debug: 0 && Don't Activate individual .Log by default / No Activar .Log por defecto +* ExtraBackupLevels: 0 && By default 1 BAK is created. With this you can make more .N.BAK, or none / Por defecto 1 BAK es creado. Con esto puede crear más .N.BAK, o ninguno * ClearUniqueID: 0 && EXPERIMENTAL! - 0=Keep UniqueID, 1=Clear Unique ID. Useful for Diff and Merge / 0=Mantener UniqueID, 1=Borrar Unique ID. Util para Diff y Merge * XXX_Conversion_Support: N && 0=No support, 1=Generate TXT only (Diff), 2=Generate TXT and BIN (Merge) * PJX_Conversion_Support: 2 && Default value @@ -67,4 +67,4 @@ ClearUniqueID: 1 *LBX_Conversion_Support: 2 *MNX_Conversion_Support: 2 *DBC_Conversion_Support: 2 -*DBF_Conversion_Support: 1 +*DBF_Conversion_Support: 2 diff --git a/foxbin2prg.pj2 b/foxbin2prg.pj2 index 2c295de..04756a4 100644 --- a/foxbin2prg.pj2 +++ b/foxbin2prg.pj2 @@ -26,7 +26,7 @@ _LegalTrademark = "Creative Commons 4: Reconocimiento - CompartirIgual (by-sa): _ProductName = " FOXBIN2PRG v1.19.20" _MajorVer = "1" _MinorVer = "19" -_Revision = " 317" +_Revision = " 319" _LanguageID = "1034" _AutoIncrement = "1" * diff --git a/foxbin2prg.pjt b/foxbin2prg.pjt index b893408..ba70a3b 100644 Binary files a/foxbin2prg.pjt and b/foxbin2prg.pjt differ diff --git a/foxbin2prg.pjx b/foxbin2prg.pjx index fccc328..2a8633d 100644 Binary files a/foxbin2prg.pjx and b/foxbin2prg.pjx differ diff --git a/foxbin2prg.prg b/foxbin2prg.prg index b085e03..19e5a41 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -82,10 +82,11 @@ * 22/03/2014 FDBOZZO v1.19.18 Arreglo bug vcx/scx: Las imágenes no mantienen sus dimensiones programadas y asumen sus dimensiones reales // El comentario a nivel de librería se pierde * 29/03/2014 FDBOZZO v1.19.19 Nueva característica: Hooks al regenerar DBF para poder realizar procesos intermedios, como la carga de datos del DBF regenerado desde una fuente externa * 17/04/2014 FDBOZZO v1.19.20 Relativización de directorios de CDX dentro de los DB2 para minimizar diferencias +* 29/04/2014 FDBOZZO v1.19.21 Agregada posibilidad de convertir un proyecto entero a tx2 // Optimizaciones en generación según timestamps // AGAIN en aperturas // Simplificación sección PAM * * *--------------------------------------------------------------------------------------------------- -* +* * 23/11/2013 Luis Martínez REPORTE BUG scx v1.4: En algunos forms solo se generaba el dataenvironment (arreglado en v.1.5) * 27/11/2013 Fidel Charny REPORTE BUG vcx v1.5: Error en el guardado de ciertas propiedades de array (arreglado en v.1.6) * 02/12/2013 Fidel Charny REPORTE BUG scx v1.6: Se pierden algunas propiedades y no muestra picture si "Name" no es la última (arreglado en v.1.7) @@ -106,6 +107,8 @@ * 10/03/2014 Ryan Harris REPORTE BUG mnx v1.19.16: Al usar comentarios multilínea en las opciones, se corrompe el MN2 y el MNX regenerado (solucionado en v1.19.17) * 20/03/2014 Arturo Ramos REPORTE BUG vcx/scx v1.19.17: Las imágenes no mantienen sus dimensiones programadas y asumen sus dimensiones reales (Solucionado en v1.19.18) * 24/03/2014 Ryan Harris REPORTE BUG vcx/scx v1.19.17: El comentario a nivel de librería se pierde (Solucionado en v1.19.18) +* 29/04/2014 Matt Slay MEJORA v1.19.20: Posibilidad de convertir un proyecto entero a tx2 // Optimización de generación según timestamps (Agregado en v1.19.21) +* 30/04/2014 Jim Nelson MEJORA v1.19.20: Agregado de AGAIN en apertura de tablas (Agregado en v1.19.21) * * *--------------------------------------------------------------------------------------------------- @@ -117,9 +120,9 @@ *--------------------------------------------------------------------------------------------------- * PARÁMETROS: (!=Obligatorio | ?=Opcional) (@=Pasar por referencia | v=Pasar por valor) (IN/OUT) * tc_InputFile (v! IN ) Nombre completo (fullpath) del archivo a convertir -* tcType ( ) Tipo de archivo de entrada. SIN USO. Compatibilidad con SCCTEXT.PRG -* tcTextName ( ) Nombre del archivo texto. Compatibilidad con SCCTEXT.PRG -* tlGenText ( ) .T.=Genera Texto, .F.=Genera Binario. Compatibilidad con SCCTEXT.PRG +* tcType (v? IN ) Tipo de archivo de entrada. SIN USO. Compatibilidad con SCCTEXT.PRG // Si se indica "*" y tc_InputFile es un PJX, se procesa todo el proyecto +* tcTextName (v? IN ) Nombre del archivo texto. Compatibilidad con SCCTEXT.PRG +* tlGenText (v? IN ) .T.=Genera Texto, .F.=Genera Binario. Compatibilidad con SCCTEXT.PRG * tcDontShowErrors (v? IN ) '1' para NO mostrar errores con MESSAGEBOX * tcDebug (v? IN ) '1' para depurar en el sitio donde ocurre el error (solo modo desarrollo) * tcDontShowProgress (v? IN ) '1' para NO mostrar la ventana de progreso @@ -272,6 +275,7 @@ LPARAMETERS tc_InputFile, tcType, tcTextName, tlGenText, tcDontShowErrors, tcDeb #DEFINE FILETYPE_LABEL "B" && Label (.LBX) #DEFINE FILETYPE_CLASSLIB "V" && Class Library (.VCX) #DEFINE FILETYPE_PROGRAM "P" && Program (.PRG) +#DEFINE FILETYPE_PROJECT "J" && Project (.PJX) [NON STANDARD!] #DEFINE FILETYPE_APILIB "L" && API Library (.FLL) #DEFINE FILETYPE_APPLICATION "Z" && Application (.APP) #DEFINE FILETYPE_MENU "M" && Menu (.MNX) @@ -325,6 +329,7 @@ LPARAMETERS tc_InputFile, tcType, tcTextName, tlGenText, tcDontShowErrors, tcDeb #DEFINE C_OBJECT_NAME_WITHOUT_OBJECT_OREG_LOC "Objeto [<>] no contiene el objeto oReg (nivel <>)" #DEFINE C_ONLY_SETNAME_AND_GETNAME_RECOGNIZED_LOC "Operación no reconocida. Solo re reconoce SETNAME y GETNAME." #DEFINE C_OUTPUT_FILE_IS_NOT_OVERWRITEN_LOC "Optimización: El archivo de salida [<>] no se sobreescribe por ser igual al generado." + #DEFINE C_OUTPUTFILE_NEWER_THAN_INPUTFILE_LOC "Optimización: El archivo de salida [<>] no se regenera por ser más nuevo que el de entrada." #DEFINE C_PROCEDURE_NOT_CLOSED_ON_LINE_LOC "Procedimiento sin cerrar. La última línea de código debe ser ENDPROC. [<>]" #DEFINE C_PROCESSING_LOC "Procesando archivo" #DEFINE C_PROCESS_PROGRESS_LOC "Avance del proceso:" @@ -405,6 +410,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM + [] ; + [] ; + [] ; + + [] ; + [] ; + [] ; + [] ; @@ -421,6 +427,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM + [] ; + [] ; + [] ; + + [] ; + [] ; + [] ; + [] ; @@ -437,6 +444,8 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM + [] ; + [] ; + [] ; + + [] ; + + [] ; + [] ; + [] ; + [] @@ -454,12 +463,15 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM c_TextLog = '' c_OutputFile = '' c_Type = '' + t_InputFile_TimeStamp = {//::} + t_OutputFile_TimeStamp = {//::} lFileMode = .F. + n_ExisteCapitalizacion = -1 l_ConfigEvaluated = .F. l_Debug = .F. l_Test = .F. l_ShowErrors = .T. - l_ShowProgress = .F. + l_ShowProgress = .T. l_Recompile = .F. l_NoTimestamps = .T. l_ClearUniqueID = .F. @@ -836,7 +848,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM .writeLog( '> l_ShowErrors: ' + TRANSFORM(.l_ShowErrors) ) .writeLog( '> l_Recompile: ' + TRANSFORM(.l_Recompile) + ' (' + EVL(tcRecompile,'') + ')' ) .writeLog( '> l_NoTimestamps: ' + TRANSFORM(.l_NoTimestamps) ) - .writeLog( '> ClearUniqueID: ' + TRANSFORM(.l_ClearUniqueID) ) + .writeLog( '> l_ClearUniqueID: ' + TRANSFORM(.l_ClearUniqueID) ) .writeLog( '> l_Debug: ' + TRANSFORM(.l_Debug) ) .writeLog( '> n_ExtraBackupLevels: ' + TRANSFORM(.n_ExtraBackupLevels) ) .l_ConfigEvaluated = .T. @@ -847,6 +859,24 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM ENDPROC + PROCEDURE Get_Ext2FromExt + LPARAMETERS tcExt + LOCAL lcExt2 + WITH THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' + lcExt2 = ICASE( tcExt == 'PJX', .c_PJ2 ; + , tcExt == 'VCX', .c_VC2 ; + , tcExt == 'SCX', .c_SC2 ; + , tcExt == 'FRX', .c_FR2 ; + , tcExt == 'LBX', .c_LB2 ; + , tcExt == 'MNX', .c_MN2 ; + , tcExt == 'DBF', .c_DB2 ; + , tcExt == 'DBC', .c_DC2 ; + , 'XXX' ) + ENDWITH && THIS + RETURN lcExt2 + ENDPROC + + PROCEDURE TieneSoporte_Bin2Prg LPARAMETERS tcExt LOCAL llTieneSoporte @@ -887,9 +917,9 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM *-------------------------------------------------------------------------------------------------------------- * PARÁMETROS: (!=Obligatorio | ?=Opcional) (@=Pasar por referencia | v=Pasar por valor) (IN/OUT) * tc_InputFile (!v IN ) Nombre del archivo de entrada - * tcType ( ) Tipo de archivo de entrada. SIN USO. Compatibilidad con SCCTEXT.PRG - * tcTextName ( ) Nombre del archivo texto. Compatibilidad con SCCTEXT.PRG - * tlGenText ( ) .T.=Genera Texto, .F.=Genera Binario. Compatibilidad con SCCTEXT.PRG + * tcType (v? IN ) Tipo de archivo de entrada. SIN USO. Compatibilidad con SCCTEXT.PRG // Si se indica "*" y tc_InputFile es un PJX, se procesa todo el proyecto + * tcTextName (v? IN ) Nombre del archivo texto. Compatibilidad con SCCTEXT.PRG + * tlGenText (v? IN ) .T.=Genera Texto, .F.=Genera Binario. Compatibilidad con SCCTEXT.PRG * tcDontShowErrors (?v IN ) '1' para no mostrar mensajes de error (MESSAGEBOX) * tcDebug (?v IN ) '1' para habilitar modo debug (SOLO DESARROLLO) * tcDontShowProgress (?v IN ) '1' para inhabilitar la barra de progreso @@ -1009,13 +1039,13 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM ENDIF IF FILE( lcFile ) - lnCodError = .Convertir( lcFile, toModulo, toEx, tlRelanzarError, tcOriginalFileName ) + lnCodError = .Convertir( lcFile, toModulo, @toEx, .T., tcOriginalFileName ) ENDIF ENDFOR OTHERWISE *-- UN ARCHIVO INDIVIDUAL O CONSULTA DE SOPORTE DE ARCHIVO - IF LEN(NVL(tc_InputFile,'')) = 1 + IF LEN(EVL(tc_InputFile,'')) = 1 *-- Consulta de soporte de conversión (compatibilidad con SourceSafe) *-- SourceSafe consulta el tipo de soporte de cada archivo antes del Checkin/Checkout *-- para saber si se puede hacer Diff y Merge. @@ -1042,7 +1072,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM CASE tc_InputFile == FILETYPE_CLASSLIB lnCodError = .VCX_Conversion_Support - CASE tc_InputFile $ 'J' && PJX (J no exite en FoxPro, es un valor inventado para evitar conflicto con los tipos existentes) + CASE tc_InputFile $ FILETYPE_PROJECT && PJX (J no exite en FoxPro, es un valor inventado para evitar conflicto con los tipos existentes) lnCodError = .PJX_Conversion_Support OTHERWISE @@ -1051,7 +1081,119 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM ELSE - IF EVL(tcType,'0') <> '0' AND EVL(tcTextName,'0') <> '0' + DO CASE + CASE UPPER( JUSTEXT( EVL(tc_InputFile,'') ) ) == 'PJX' AND EVL(tcType,'0') == '*' + *-- SE QUIEREN CONVERTIR A TEXTO TODOS LOS ARCHIVOS DE UN PROYECTO + lcFileSpec = FULLPATH( tc_InputFile ) + + DO CASE + CASE .l_Recompile AND LEN(tcRecompile) > 3 AND DIRECTORY(tcRecompile) + CD (tcRecompile) + CASE tcRecompile == '1' + CD (JUSTPATH(lcFileSpec)) + ENDCASE + + .c_LogFile = ADDBS( JUSTPATH( lcFileSpec ) ) + STRTRAN( JUSTFNAME( lcFileSpec ), '*', '_ALL' ) + '.LOG' + + IF .l_Debug + IF FILE( .c_LogFile ) + ERASE ( .c_LogFile ) + ENDIF + ENDIF + + SELECT 0 + USE (tc_InputFile) SHARED AGAIN NOUPDATE ALIAS TABLABIN + lnFileCount = 0 + + SCAN FOR NOT DELETED() + lnFileCount = lnFileCount + 1 + DIMENSION laFiles(lnFileCount,1) + laFiles(lnFileCount,1) = ADDBS( JUSTPATH( lcFileSpec ) ) + ALLTRIM( NAME, 0, ' ', CHR(0) ) + ENDSCAN + + USE IN (SELECT("TABLABIN")) + + IF .l_ShowProgress + .o_Frm_Avance.nMAX_VALUE = lnFileCount + ENDIF + + *-- Primero convierto el proyecto + *IF .TieneSoporte_Bin2Prg( UPPER(JUSTEXT(tc_InputFile)) ) + * lnCodError = .Convertir( tc_InputFile, toModulo, toEx, tlRelanzarError, tcOriginalFileName ) + *ENDIF + + *-- Luego convierto los archivos incluidos + FOR I = 1 TO lnFileCount + lcFile = laFiles(I,1) + .o_Frm_Avance.lbl_TAREA.CAPTION = C_PROCESSING_LOC + ' ' + lcFile + '...' + .o_Frm_Avance.nVALUE = I + + IF .l_ShowProgress + .o_Frm_Avance.SHOW() + ENDIF + + IF .TieneSoporte_Bin2Prg( UPPER(JUSTEXT(lcFile)) ) AND FILE( lcFile ) + lnCodError = .Convertir( lcFile, toModulo, @toEx, .T., tcOriginalFileName ) + ENDIF + ENDFOR + + CASE UPPER( JUSTEXT( EVL(tc_InputFile,'') ) ) == 'PJ2' AND EVL(tcType,'0') == '*' + *-- SE QUIEREN CONVERTIR A BINARIO TODOS LOS ARCHIVOS DE UN PROYECTO + lcFileSpec = FULLPATH( tc_InputFile ) + + DO CASE + CASE .l_Recompile AND LEN(tcRecompile) > 3 AND DIRECTORY(tcRecompile) + CD (tcRecompile) + CASE tcRecompile == '1' + CD (JUSTPATH(lcFileSpec)) + ENDCASE + + .c_LogFile = ADDBS( JUSTPATH( lcFileSpec ) ) + STRTRAN( JUSTFNAME( lcFileSpec ), '*', '_ALL' ) + '.LOG' + + IF .l_Debug + IF FILE( .c_LogFile ) + ERASE ( .c_LogFile ) + ENDIF + ENDIF + + lnFileCount = ALINES( laFiles, STREXTRACT( FILETOSTR(tc_InputFile), C_BUILDPROJ_I, C_BUILDPROJ_F ), 1+4 ) + + FOR I = lnFileCount TO 1 STEP -1 + IF '.ADD(' $ laFiles(I) + laFiles(I) = ADDBS( JUSTPATH( lcFileSpec ) ) + STREXTRACT( laFiles(I), ".ADD('", "')" ) + laFiles(I) = FORCEEXT( laFiles(I), .Get_Ext2FromExt( UPPER(JUSTEXT(laFiles(I))) ) ) + ELSE + lnFileCount = lnFileCount - 1 + ADEL( laFiles, I ) + DIMENSION laFiles(lnFileCount) + ENDIF + ENDFOR + + IF .l_ShowProgress + .o_Frm_Avance.nMAX_VALUE = lnFileCount + ENDIF + + *-- Primero convierto el proyecto + *IF .TieneSoporte_Prg2Bin( UPPER(JUSTEXT(tc_InputFile)) ) + * lnCodError = .Convertir( tc_InputFile, toModulo, toEx, tlRelanzarError, tcOriginalFileName ) + *ENDIF + + *-- Luego convierto los archivos incluidos + FOR I = 1 TO lnFileCount + lcFile = laFiles(I) + .o_Frm_Avance.lbl_TAREA.CAPTION = C_PROCESSING_LOC + ' ' + lcFile + '...' + .o_Frm_Avance.nVALUE = I + + IF .l_ShowProgress + .o_Frm_Avance.SHOW() + ENDIF + + IF .TieneSoporte_Prg2Bin( UPPER(JUSTEXT(lcFile)) ) AND FILE( lcFile ) + lnCodError = .Convertir( lcFile, toModulo, @toEx, .T., tcOriginalFileName ) + ENDIF + ENDFOR + + CASE EVL(tcType,'0') <> '0' AND EVL(tcTextName,'0') <> '0' *-- Compatibilidad con SourceSafe IF NOT tlGenText @@ -1063,7 +1205,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM tc_InputFile = tcTextName .l_Recompile = .T. ENDIF - ENDIF + ENDCASE IF FILE(tc_InputFile) ERASE ( tc_InputFile + '.ERR' ) @@ -1110,6 +1252,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM ENDIF FINALLY + USE IN (SELECT("TABLABIN")) THIS.writeLog_Flush() IF THIS.l_ShowProgress AND VARTYPE(THIS.o_Frm_Avance) = "O" THIS.o_Frm_Avance.HIDE() @@ -1137,7 +1280,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM LPARAMETERS tc_InputFile, toModulo, toEx AS EXCEPTION, tlRelanzarError, tcOriginalFileName TRY - LOCAL lnCodError, lcErrorInfo, laDirFile(1,5), lcExtension ; + LOCAL lnCodError, lcErrorInfo, laDirFile(1,5), lcExtension, lnFileCount, laFiles(1,1), I ; , loFSO AS Scripting.FileSystemObject lnCodError = 0 @@ -1324,21 +1467,50 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM ENDCASE - .c_Type = UPPER(JUSTEXT(.c_OutputFile)) - .o_Conversor.c_InputFile = .c_InputFile - .o_Conversor.c_OutputFile = .c_OutputFile - .o_Conversor.c_LogFile = .c_LogFile - .o_Conversor.l_Debug = .l_Debug - .o_Conversor.l_Test = .l_Test - .o_Conversor.n_FB2PRG_Version = .n_FB2PRG_Version - .o_Conversor.l_MethodSort_Enabled = .l_MethodSort_Enabled - .o_Conversor.l_PropSort_Enabled = .l_PropSort_Enabled - .o_Conversor.l_ReportSort_Enabled = .l_ReportSort_Enabled - .o_Conversor.c_OriginalFileName = .c_OriginalFileName - .o_Conversor.c_Foxbin2prg_FullPath = .c_Foxbin2prg_FullPath - *-- - .o_Conversor.Convertir( @toModulo, .F., THIS ) - .c_TextLog = .c_TextLog + CR_LF + .o_Conversor.c_TextLog && Recojo el LOG que haya generado el conversor + *-- Optimización: Comparación de los timestamps de InputFile y OutputFile para saber + *-- si el OutputFile se debe regenerar o no. + lnFileCount = ADIR( laFiles, FORCEEXT( .c_InputFile, '*' ), '', 1 ) + STORE {//::} TO .t_InputFile_TimeStamp, .t_OutputFile_TimeStamp + + IF lnFileCount >= 1 THEN + I = ASCAN( laFiles, JUSTFNAME(.c_InputFile), 1, 0, 1, 1+2+4+8 ) + IF I > 0 THEN + .t_InputFile_TimeStamp = DATETIME( YEAR(laFiles(I,3)), MONTH(laFiles(I,3)), DAY(laFiles(I,3)) ; + , VAL(LEFT(laFiles(I,4),2)), VAL(SUBSTR(laFiles(I,4),4,2)), VAL(RIGHT(laFiles(I,4),2)) ) + ENDIF + + IF FILE( .c_OutputFile ) + I = ASCAN( laFiles, JUSTFNAME(.c_OutputFile), 1, 0, 1, 1+2+4+8 ) + IF I > 0 THEN + .t_OutputFile_TimeStamp = DATETIME( YEAR(laFiles(I,3)), MONTH(laFiles(I,3)), DAY(laFiles(I,3)) ; + , VAL(LEFT(laFiles(I,4),2)), VAL(SUBSTR(laFiles(I,4),4,2)), VAL(RIGHT(laFiles(I,4),2)) ) + ENDIF + ENDIF + ENDIF + + IF .t_InputFile_TimeStamp >= .t_OutputFile_TimeStamp THEN + .c_Type = UPPER(JUSTEXT(.c_OutputFile)) + .o_Conversor.c_InputFile = .c_InputFile + .o_Conversor.c_OutputFile = .c_OutputFile + .o_Conversor.c_LogFile = .c_LogFile + .o_Conversor.l_Debug = .l_Debug + .o_Conversor.l_Test = .l_Test + .o_Conversor.n_FB2PRG_Version = .n_FB2PRG_Version + .o_Conversor.l_MethodSort_Enabled = .l_MethodSort_Enabled + .o_Conversor.l_PropSort_Enabled = .l_PropSort_Enabled + .o_Conversor.l_ReportSort_Enabled = .l_ReportSort_Enabled + .o_Conversor.c_OriginalFileName = .c_OriginalFileName + .o_Conversor.c_Foxbin2prg_FullPath = .c_Foxbin2prg_FullPath + *-- + .o_Conversor.Convertir( @toModulo, .F., THIS ) + .c_TextLog = .c_TextLog + CR_LF + .o_Conversor.c_TextLog && Recojo el LOG que haya generado el conversor + ELSE + *-- Optimizado: El Origen es anterior al Destino - No hace falta regenerar + *.writeLog( '> El archivo de salida [<>] no se regenera por ser más nuevo que el de entrada.' ) + .writeLog( TEXTMERGE(C_OUTPUTFILE_NEWER_THAN_INPUTFILE_LOC) ) + + ENDIF + .normalizarCapitalizacionArchivos() ENDWITH && THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' @@ -1350,11 +1522,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM IF _VFP.STARTMODE = 0 SET STEP ON ENDIF - *THIS.writeLog( lcErrorInfo ) ENDIF - *IF THIS.l_Debug AND THIS.l_ShowErrors - * MESSAGEBOX( lcErrorInfo, 0+16+4096, C_FOXBIN2PRG_ERROR_CAPTION_LOC, 60000 ) - *ENDIF IF tlRelanzarError && Usado en Unit Testing THROW ENDIF @@ -1362,7 +1530,11 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM FINALLY loFSO = NULL THIS.o_Conversor = NULL - *THIS.writeLog_Flush() + + IF lnCodError = 0 OR NOT THIS.l_ShowErrors THEN + THIS.writeLog( REPLICATE('-',80) ) + *THIS.writeLog_Flush() + ENDIF ENDTRY @@ -1426,15 +1598,29 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM lcEXE_CAPS = FORCEPATH( 'filename_caps.exe', lcPath ) loFSO = .o_FSO - IF FILE(lcEXE_CAPS) - *.writeLog( '* Se ha encontrado el programa de capitalización de nombres [' + lcEXE_CAPS + ']' ) - .writeLog( TEXTMERGE(C_NAMES_CAPITALIZATION_PROGRAM_FOUND_LOC) ) - ELSE - *-- No existe el programa de capitalización, así que no se capitalizan los nombres. - *.writeLog( '* No se ha encontrado el programa de capitalización de nombres [' + lcEXE_CAPS + ']' ) - .writeLog( TEXTMERGE(C_NAMES_CAPITALIZATION_PROGRAM_NOT_FOUND_LOC) ) + DO CASE + CASE .n_ExisteCapitalizacion = -1 + *-- La primera vez vale -1, hace la verificación por única vez y cachea la respuesta + IF FILE(lcEXE_CAPS) + *.writeLog( '* Se ha encontrado el programa de capitalización de nombres [' + lcEXE_CAPS + ']' ) + .writeLog( TEXTMERGE(C_NAMES_CAPITALIZATION_PROGRAM_FOUND_LOC) ) + .n_ExisteCapitalizacion = 1 + ELSE + *-- No existe el programa de capitalización, así que no se capitalizan los nombres. + *.writeLog( '* No se ha encontrado el programa de capitalización de nombres [' + lcEXE_CAPS + ']' ) + .writeLog( TEXTMERGE(C_NAMES_CAPITALIZATION_PROGRAM_NOT_FOUND_LOC) ) + .n_ExisteCapitalizacion = 0 + EXIT + ENDIF + + CASE .n_ExisteCapitalizacion = 0 + *-- Segunda pasada en adelante: No hay programa de capitalización EXIT - ENDIF + + OTHERWISE + *-- Segunda pasada en adelante: Hay programa de capitalización + + ENDCASE .RenameFile( .c_OutputFile, lcEXE_CAPS, loFSO ) @@ -1672,7 +1858,7 @@ DEFINE CLASS c_conversor_base AS SESSION C_FB2PRG_CODE = '' && Contendrá todo el código generado THIS.c_CurDir = SYS(5) + CURDIR() THIS.oFSO = CREATEOBJECT( "Scripting.FileSystemObject") - + THIS.SortSpecialProps() ENDPROC @@ -2313,10 +2499,10 @@ DEFINE CLASS c_conversor_base AS SESSION LPARAMETERS tcOperation, tcPropName TRY - LOCAL lcPropName, lnPos, loEx as Exception + LOCAL lcPropName, lnPos, loEx AS EXCEPTION lcPropName = tcPropName tcOperation = UPPER(EVL(tcOperation,'')) - + DO CASE CASE tcOperation == 'GETNAME' lcPropName = SUBSTR(tcPropName,5) @@ -2470,18 +2656,18 @@ DEFINE CLASS c_conversor_base AS SESSION RETURN ENDPROC - - - + + + PROTECTED PROCEDURE SortSpecialProps_Add LPARAMETERS tcPropName, I I = I + 1 DIMENSION THIS.a_SpecialProps(I) THIS.a_SpecialProps(I) = tcPropName ENDPROC - - - + + + PROCEDURE SortSpecialProps LOCAL I I = 0 @@ -2514,7 +2700,7 @@ DEFINE CLASS c_conversor_base AS SESSION .SortSpecialProps_Add( 'Picture', @I ) && Image: Debe estar antes que Stretch y después de DefTop/DefLeft .SortSpecialProps_Add( 'Stretch', @I ) && Image: Debe estar antes que BackStyle .SortSpecialProps_Add( 'BackStyle', @I ) && Image: Debe estar antes que BorderStyle - .SortSpecialProps_Add( 'BorderStyle', @I ) && + .SortSpecialProps_Add( 'BorderStyle', @I ) && .SortSpecialProps_Add( 'BorderWidth', @I ) .SortSpecialProps_Add( 'Enabled', @I ) .SortSpecialProps_Add( 'Top', @I ) @@ -4007,7 +4193,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base *-------------------------------------------------------------------------------------------------------------- LPARAMETERS toClase, tcLine, taCodeLines, tnCodeLines, I - *-- ESTRUCTURA A ANALIZAR: + *-- ESTRUCTURA A ANALIZAR (también se admite sin los símbolos ^ y *): * *m: *metodovacio_con_comentarios && Este método no tiene código, pero tiene comentarios. A ver que pasa! *m: *mimetodo && Mi metodo @@ -4023,7 +4209,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base #ENDIF TRY - LOCAL llBloqueEncontrado, lcDefinedPAM, lnPos, lnPos2, lcPAM_Name, lcItem, lcMethods + LOCAL llBloqueEncontrado, lcDefinedPAM, lnPos, lnPos2, lcPAM_Name, lcItem, lcMethods, lcPAM_Type IF LEFT( tcLine, C_LEN_DEFINED_PAM_I) == C_DEFINED_PAM_I llBloqueEncontrado = .T. @@ -4039,28 +4225,32 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base EXIT OTHERWISE - lnPos = AT( ' ', tcLine, 1 ) - lnPos2 = AT( '&'+'&', tcLine ) + lnPos = AT( ':', tcLine, 1 ) + lnPos2 = AT( '&'+'&', tcLine ) + lcPAM_Type = LEFT(tcLine,3) && *p:, *a:, *m: IF lnPos2 > 0 *-- Con comentarios - lcPAM_Name = LOWER( RTRIM( SUBSTR( tcLine, lnPos+1, lnPos2 - lnPos - 1 ), 0, ' ', CHR(9) ) ) - lcItem = lcPAM_Name + ' ' + SUBSTR( tcLine, lnPos2 + 3 ) + CR_LF + lcPAM_Name = LOWER( ALLTRIM( SUBSTR( tcLine, lnPos+1, lnPos2 - lnPos - 1 ), 0, ' ', CHR(9) ) ) + lcItem = lcPAM_Name + ' ' + SUBSTR( tcLine, lnPos2 + 3 ) + CR_LF - *-- Separo propiedades y métodos + ELSE + *-- Sin comentarios + lcPAM_Name = LOWER( ALLTRIM( SUBSTR( tcLine, lnPos+1 ), 0, ' ', CHR(9) ) ) + lcItem = lcPAM_Name + IIF( lcPAM_Type == '*p:' , '', ' ') + CR_LF + + ENDIF + + *-- Separo propiedades y métodos + IF lcPAM_Type == '*m:' IF LEFT(lcItem,1) == '*' lcMethods = lcMethods + lcItem ELSE - lcDefinedPAM = lcDefinedPAM + lcItem + lcMethods = lcMethods + '*' + lcItem ENDIF ELSE - *-- Sin comentarios - lcPAM_Name = LOWER( RTRIM( SUBSTR( tcLine, lnPos+1 ), 0, ' ', CHR(9) ) ) - lcItem = lcPAM_Name + IIF( LEFT(lcPAM_Name,1) $ '^*' , ' ', '') + CR_LF - - *-- Separo propiedades y métodos - IF LEFT(lcItem,1) == '*' - lcMethods = lcMethods + lcItem + IF lcPAM_Type == '*a:' AND LEFT(lcItem,1) <> '^' + lcDefinedPAM = lcDefinedPAM + '^' + lcItem ELSE lcDefinedPAM = lcDefinedPAM + lcItem ENDIF @@ -4360,7 +4550,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base ENDWITH && THIS I = I - 1 - + IF NOT EMPTY(toClase._Comentario) toClase._Comentario = SUBSTR( toClase._Comentario, 3 ) + CR_LF && Quito el primer CR+LF ENDIF @@ -6558,7 +6748,7 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin STORE 0 TO lnCodError STORE '' TO lcIndex, lcFieldDef - lnDataSessionID = .DataSessionId + lnDataSessionID = .DATASESSIONID ERASE (FORCEEXT(.c_OutputFile, 'DBF')) ERASE (FORCEEXT(.c_OutputFile, 'FPT')) @@ -6618,7 +6808,7 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin lcCreateTable = lcCreateTable + SUBSTR(lcFieldDef,3) + ')' &lcCreateTable. - + IF NOT EMPTY(toFoxBin2Prg.run_AfterCreateTable) lnSelect = SELECT() DO (toFoxBin2Prg.run_AfterCreateTable) WITH (lnDataSessionID), (.c_OutputFile), (toTable) @@ -8054,9 +8244,15 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base , lcType == '^', 'a' ; , 'p' ) - TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <<>> *<>: <> - ENDTEXT + IF lcType == 'p' THEN + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + <<>> *<>: <> + ENDTEXT + ELSE + TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + <<>> *<>: <> + ENDTEXT + ENDIF IF NOT EMPTY(taPropsAndComments(I,2)) TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 @@ -8331,15 +8527,15 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base supgroup="<>" supvalchng="<>" <<>> ENDTEXT - C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + " " - C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + " " - C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + " " + C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + " " + C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + " " + C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + " " C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + " " - C_FB2PRG_CODE = C_FB2PRG_CODE + CR_LF + "