diff --git a/foxbin2prg.pj2 b/foxbin2prg.pj2
new file mode 100644
index 0000000..e448b63
--- /dev/null
+++ b/foxbin2prg.pj2
@@ -0,0 +1,86 @@
+*--------------------------------------------------------------------------------------------------------------------------------------------------------
+* (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.16" SourceFile="C:\DESA\foxbin2prg\foxbin2prg.pjx" Generated="2013/12/26 19:21:19" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries)
+*
+LPARAMETERS tcDir
+
+lcCurdir = SYS(5)+CURDIR()
+CD ( EVL( tcDir, JUSTPATH( SYS(16) ) ) )
+
+*
+_Autor = "Fernando D. Bozzo"
+_Company = ""
+_Address = ""
+_City = "Coslada"
+_State = "MAD"
+_PostalCode = "28823"
+_Country = "Spain"
+*--
+_Comments = "Conversor bidireccional de binarios FoxPro 9 (scx,vcx,pjx) a texto para sustituir al scctext :-)"
+_CompanyName = "Fernando D. Bozzo"
+_FileDescription = "Conversor bidireccional de binarios FoxPro 9 (scx,vcx,pjx) a texto para sustituir al scctext :-)"
+_LegalCopyright = "Open Source - LICENCIA Creative Commons: Reconocimiento - CompartirIgual (by-sa): http://es.creativecommons.org/blog/licencias/"
+_LegalTrademark = "Open Source"
+_ProductName = " FOXBIN2PRG"
+_MajorVer = "1"
+_MinorVer = "16"
+_Revision = " 127"
+_LanguageID = "1034"
+_AutoIncrement = "1"
+*
+
+
+*
+FOR EACH loProj IN _VFP.Projects FOXOBJECT
+ loProj.Close()
+ENDFOR
+
+STRTOFILE( '', '__newproject.f2b' )
+BUILD PROJECT foxbin2prg.pjx FROM '__newproject.f2b'
+FOR EACH loProj IN _VFP.Projects FOXOBJECT
+ loProj.Close()
+ENDFOR
+
+MODIFY PROJECT 'foxbin2prg.pjx' NOWAIT NOSHOW NOPROJECTHOOK
+
+loProject = _VFP.Projects('foxbin2prg.pjx')
+
+WITH loProject.FILES
+ .ADD('config\config.fpw') && *< FileMetadata: Type="T" Cpid="1252" Timestamp="1132857145" ID="1131721714" ObjRev="0" />
+ .ADD('foxbin2prg.prg') && *< FileMetadata: Type="P" Cpid="1252" Timestamp="1134205420" ID="1130644423" ObjRev="544" />
+ *
+
+ .ITEM('__newproject.f2b').Remove()
+
+ *
+ .ITEM(lcCurdir + 'foxbin2prg.prg').Description = 'Conversor'
+ *
+
+ *
+ *
+
+ *
+ .ITEM(lcCurdir + 'config\config.fpw').Type = 'T'
+ *
+ENDWITH
+
+WITH loProject
+ *
+ .SetMain(lcCurdir + 'foxbin2prg.prg')
+ .Debug = .T.
+ .Encrypted = .F.
+ *<.CmntStyle = 1 />
+ *<.NoLogo = .F. />
+ *<.SaveCode = .T. />
+ .ProjectHookLibrary = ''
+ .ProjectHookClass = ''
+ *
+ENDWITH
+
+
+_VFP.Projects('foxbin2prg.pjx').Close()
+*ERASE '__newproject.f2b'
+CD (lcCurdir)
+RETURN
\ No newline at end of file
diff --git a/foxbin2prg.pjt b/foxbin2prg.pjt
index 0aa6cc2..f5e1a50 100644
Binary files a/foxbin2prg.pjt and b/foxbin2prg.pjt differ
diff --git a/foxbin2prg.pjx b/foxbin2prg.pjx
index d0b3ce9..9fefe16 100644
Binary files a/foxbin2prg.pjx and b/foxbin2prg.pjx differ
diff --git a/foxbin2prg.prg b/foxbin2prg.prg
index f552519..d56f24b 100644
--- a/foxbin2prg.prg
+++ b/foxbin2prg.prg
@@ -279,7 +279,7 @@ IF _VFP.STARTMODE = 0
ENDIF
*-- Muy útil para procesos batch que capturan el código de error
-DECLARE ExitProcess in Win32API INTEGER ExitCode
+DECLARE ExitProcess IN Win32API INTEGER ExitCode
IF NOT EMPTY(lnResp)
ExitProcess(1)
ENDIF
@@ -298,7 +298,9 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
+ [] ;
+ [] ;
+ [] ;
+ + [] ;
+ [] ;
+ + [] ;
+ [] ;
+ [] ;
+ [] ;
@@ -317,13 +319,17 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
+ [] ;
+ [] ;
+ [] ;
+ + [] ;
+ [] ;
+ [] ;
+ [] ;
+ [] ;
+ + [] ;
+ [] ;
+ + [] ;
+ []
+
*--
n_FB2PRG_Version = 1.16
*--
@@ -331,7 +337,9 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
c_CurDir = ''
c_InputFile = ''
c_LogFile = ''
+ c_TextLog = ''
c_OutputFile = ''
+ c_Type = ''
lFileMode = .F.
l_Debug = .F.
l_Test = .F.
@@ -370,10 +378,13 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
PROCEDURE DESTROY
TRY
LOCAL lcFileCDX
- lcFileCDX = FORCEPATH( "TABLABIN.CDX", THIS.c_CurDir )
+ lcFileCDX = FORCEPATH( "TABLABIN.CDX", JUSTPATH(THIS.c_InputFile) )
+
IF FILE( lcFileCDX )
ERASE ( lcFileCDX )
ENDIF
+
+ THIS.writeLog_Flush()
CATCH
ENDTRY
@@ -403,7 +414,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
LOCAL I, lcPath, lnResp, lcFileSpec, lcFile, laFiles(1,5), laConfig(1), lcConfigFile, lcExt ;
, llExisteConfig, lcConfData, lnFileCount ;
, loEx AS EXCEPTION ;
- , loFSO as Scripting.FileSystemObject
+ , loFSO AS Scripting.FileSystemObject
lnResp = 0
@@ -462,7 +473,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
DO CASE
CASE '*' $ JUSTEXT( tc_InputFile ) OR '?' $ JUSTEXT( tc_InputFile )
IF THIS.l_ShowErrors
- MESSAGEBOX( ASTERISK_EXT_NOT_ALLOWED_LOC, 0+48+4096, 'FOXBIN2PRG: ERROR!!', 10000 )
+ MESSAGEBOX( ASTERISK_EXT_NOT_ALLOWED_LOC, 0+48+4096, 'FOXBIN2PRG: ERROR!!', 60000 )
ELSE
ERROR ASTERISK_EXT_NOT_ALLOWED_LOC
ENDIF
@@ -541,7 +552,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
CD (JUSTPATH(THIS.c_CurDir))
*SET PATH TO (lcPath)
ENDTRY
-
+
RETURN lnResp
ENDPROC
@@ -560,9 +571,9 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
TRY
LOCAL lnCodError, lcErrorInfo, laDirFile(1,5), lcExtension ;
- , loFSO as Scripting.FileSystemObject
+ , loFSO AS Scripting.FileSystemObject
lnCodError = 0
-
+
WITH THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG'
loFSO = THIS.o_FSO
.c_InputFile = FULLPATH( tc_InputFile )
@@ -586,7 +597,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
CATCH
ENDTRY
ENDIF
-
+
lcExtension = UPPER( JUSTEXT(.c_InputFile) )
DO CASE
@@ -659,6 +670,7 @@ 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
@@ -669,9 +681,11 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
.o_Conversor.l_PropSort_Enabled = .l_PropSort_Enabled
.o_Conversor.l_ReportSort_Enabled = .l_ReportSort_Enabled
.o_Conversor.c_OriginalFileName = tcOriginalFileName
+ .o_Conversor.c_Foxbin2prg_FullPath = .c_Foxbin2prg_FullPath
*--
.o_Conversor.Convertir( @toModulo )
- .o_Conversor = NULL
+ .c_TextLog = .c_TextLog + CR_LF + .o_Conversor.c_TextLog && Recojo el LOG que haya generado el conversor
+ .normalizarCapitalizacionArchivos()
ENDWITH && THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG'
CATCH TO toEx
@@ -690,15 +704,17 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
THIS.writeLog( lcErrorInfo )
ENDIF
IF THIS.l_Debug AND THIS.l_ShowErrors
- MESSAGEBOX( lcErrorInfo, 0+16+4096, 'FOXBIN2PRG: ERROR!!', 10000 )
+ MESSAGEBOX( lcErrorInfo, 0+16+4096, 'FOXBIN2PRG: ERROR!!', 60000 )
ENDIF
IF tlRelanzarError && Usado en Unit Testing
THROW
ENDIF
FINALLY
- loFSO = NULL
- THIS.o_FSO = NULL
+ loFSO = NULL
+ THIS.o_FSO = NULL
+ THIS.o_Conversor = NULL
+ THIS.writeLog_Flush()
ENDTRY
@@ -706,15 +722,92 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
ENDPROC
+ *******************************************************************************************************************
+ PROCEDURE normalizarCapitalizacionArchivos
+ TRY
+ LOCAL lcPath, lcEXE_CAPS, lcOutputFile ;
+ , loFSO AS SCRIPTING.FileSystemObject
+ lcPath = JUSTPATH(THIS.c_Foxbin2prg_FullPath)
+ lcEXE_CAPS = FORCEPATH( 'filename_caps.exe', lcPath )
+ loFSO = THIS.o_FSO
+
+ IF FILE(lcEXE_CAPS)
+ THIS.writeLog( '* Se ha encontrado el programa de capitalización de nombres [' + lcEXE_CAPS + ']' )
+ ELSE
+ *-- No existe el programa de capitalización, así que no se capitalizan los nombres.
+ THIS.writeLog( '* No se ha encontrado el programa de capitalización de nombres [' + lcEXE_CAPS + ']' )
+ EXIT
+ ENDIF
+
+ THIS.RenameFile( THIS.c_OutputFile, lcEXE_CAPS, loFSO )
+
+ DO CASE
+ CASE THIS.c_Type = 'PJX'
+ THIS.RenameFile( FORCEEXT(THIS.c_OutputFile,'PJT'), lcEXE_CAPS, loFSO )
+
+ CASE THIS.c_Type = 'VCX'
+ THIS.RenameFile( FORCEEXT(THIS.c_OutputFile,'VCT'), lcEXE_CAPS, loFSO )
+
+ CASE THIS.c_Type = 'SCX'
+ THIS.RenameFile( FORCEEXT(THIS.c_OutputFile,'SCT'), lcEXE_CAPS, loFSO )
+
+ CASE THIS.c_Type = 'FRX'
+ THIS.RenameFile( FORCEEXT(THIS.c_OutputFile,'FRT'), lcEXE_CAPS, loFSO )
+
+ CASE THIS.c_Type = 'LBX'
+ THIS.RenameFile( FORCEEXT(THIS.c_OutputFile,'LBT'), lcEXE_CAPS, loFSO )
+
+ CASE THIS.c_Type = 'DBF'
+ IF FILE( FORCEEXT(THIS.c_OutputFile,'FPT') )
+ THIS.RenameFile( FORCEEXT(THIS.c_OutputFile,'FPT'), lcEXE_CAPS, loFSO )
+ ENDIF
+ IF FILE( FORCEEXT(THIS.c_OutputFile,'CDX') )
+ THIS.RenameFile( FORCEEXT(THIS.c_OutputFile,'CDX'), lcEXE_CAPS, loFSO )
+ ENDIF
+
+ CASE THIS.c_Type = 'DBC'
+ THIS.RenameFile( FORCEEXT(THIS.c_OutputFile,'DCX'), lcEXE_CAPS, loFSO )
+ THIS.RenameFile( FORCEEXT(THIS.c_OutputFile,'DCT'), lcEXE_CAPS, loFSO )
+
+ CASE THIS.c_Type = 'MNX'
+ THIS.RenameFile( FORCEEXT(THIS.c_OutputFile,'MNT'), lcEXE_CAPS, loFSO )
+
+ ENDCASE
+ ENDTRY
+
+ RETURN
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE RenameFile
+ LPARAMETERS tcFileName, tcEXE_CAPS, toFSO AS SCRIPTING.FileSystemObject
+
+ LOCAL lcLog
+ THIS.writeLog( '- Se ha solicitado capitalizar el archivo [' + tcFileName + ']' )
+ lcLog = ''
+ DO (tcEXE_CAPS) WITH tcFileName, '', 'F', lcLog
+ toFSO.MoveFile( tcFileName, tcFileName )
+ THIS.writeLog( ' => Se renombrará a [' + tcFileName + ']' )
+ ENDPROC
+
+
*******************************************************************************************************************
PROCEDURE writeLog
LPARAMETERS tcText
- IF THIS.l_Debug
- TRY
- STRTOFILE( TTOC(DATETIME(),3) + ' ' + EVL(tcText,'') + CR_LF, THIS.c_LogFile, 1 )
- CATCH
- ENDTRY
+ TRY
+ THIS.c_TextLog = THIS.c_TextLog + TTOC(DATETIME(),3) + ' ' + EVL(tcText,'') + CR_LF
+ CATCH
+ ENDTRY
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE writeLog_Flush
+ IF THIS.l_Debug AND NOT EMPTY(THIS.c_TextLog)
+ STRTOFILE( THIS.c_TextLog + CR_LF, THIS.c_LogFile, 1 )
+ THIS.c_TextLog = ''
ENDIF
ENDPROC
@@ -830,10 +923,12 @@ DEFINE CLASS c_conversor_base AS SESSION
+ [] ;
+ [] ;
+ [] ;
+ + [] ;
+ [] ;
+ [] ;
+ [] ;
+ [] ;
+ + [] ;
+ [] ;
+ [] ;
+ [] ;
@@ -841,6 +936,7 @@ DEFINE CLASS c_conversor_base AS SESSION
+ [] ;
+ [] ;
+ [] ;
+ + [] ;
+ []
@@ -851,13 +947,16 @@ DEFINE CLASS c_conversor_base AS SESSION
lFileMode = .T.
nClassTimeStamp = ''
n_FB2PRG_Version = 1.0
+ c_Foxbin2prg_FullPath = ''
c_Type = ''
c_CurDir = ''
c_LogFile = ''
+ c_TextLog = ''
l_MethodSort_Enabled = .T.
l_PropSort_Enabled = .T.
l_ReportSort_Enabled = .T.
c_OriginalFileName = ''
+ oFSO = NULL
*******************************************************************************************************************
@@ -872,6 +971,7 @@ DEFINE CLASS c_conversor_base AS SESSION
PUBLIC C_FB2PRG_CODE
C_FB2PRG_CODE = '' && Contendrá todo el código generado
THIS.c_CurDir = SYS(5) + CURDIR()
+ THIS.oFSO = CREATEOBJECT( "Scripting.FileSystemObject")
ENDPROC
@@ -1024,7 +1124,8 @@ DEFINE CLASS c_conversor_base AS SESSION
*******************************************************************************************************************
- FUNCTION comprobarExpresionValida( tcAsignacion, tnCodError, tcExpNormalizada )
+ FUNCTION comprobarExpresionValida
+ LPARAMETERS tcAsignacion, tnCodError, tcExpNormalizada
LOCAL llError, loEx AS EXCEPTION
TRY
@@ -2116,12 +2217,10 @@ DEFINE CLASS c_conversor_base AS SESSION
PROCEDURE writeLog
LPARAMETERS tcText
- IF THIS.l_Debug
- TRY
- STRTOFILE( TTOC(DATETIME(),3) + ' ' + EVL(tcText,'') + CR_LF, THIS.c_LogFile, 1 )
- CATCH
- ENDTRY
- ENDIF
+ TRY
+ THIS.c_TextLog = THIS.c_TextLog + TTOC(DATETIME(),3) + ' ' + EVL(tcText,'') + CR_LF
+ CATCH
+ ENDTRY
ENDPROC
@@ -4034,7 +4133,10 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin
TRY
LOCAL lcObjName, lnCodError, I, X, loEx AS EXCEPTION ;
, loClase AS CL_CLASE OF 'FOXBIN2PRG.PRG' ;
- , loObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG'
+ , loObjeto AS CL_OBJETO OF 'FOXBIN2PRG.PRG' ;
+ , loFSO AS Scripting.FileSystemObject
+
+ loFSO = THIS.oFSO
*-- Creo el registro de cabecera
THIS.createClasslib_RecordHeader()
@@ -4590,7 +4692,6 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin
, UPPER(JUSTSTEM(loFile._Name)) )
ENDFOR
-
USE IN (SELECT("TABLABIN"))
@@ -5871,7 +5972,6 @@ DEFINE CLASS c_conversor_prg_a_dbc AS c_conversor_prg_a_bin
STORE '' TO lcIndex, lcFieldDef
toDatabase.updateDBC( THIS.c_OutputFile )
-
*USE IN (SELECT(JUSTSTEM(THIS.c_OutputFile)))
@@ -6035,7 +6135,6 @@ DEFINE CLASS c_conversor_prg_a_mnx AS c_conversor_prg_a_bin
STORE '' TO lcIndex, lcFieldDef
toMenu.updateDBC( THIS.c_OutputFile )
-
*USE IN (SELECT(JUSTSTEM(THIS.c_OutputFile)))
@@ -7986,7 +8085,7 @@ DEFINE CLASS c_conversor_pjx_a_prg AS c_conversor_bin_a_prg
SCATTER FIELDS NAME,TYPE,EXCLUDE,COMMENTS,CPID,TIMESTAMP,ID,OBJREV MEMO NAME loReg
loReg.NAME = LOWER( ALLTRIM( loReg.NAME, 0, ' ', CHR(0) ) )
loReg.COMMENTS = CHRTRAN( ALLTRIM( loReg.COMMENTS, 0, ' ', CHR(0) ), ['], ["] )
-
+
*-- TIP: Si el "Name" del objeto está vacío, lo salteo
IF EMPTY(loReg.NAME)
LOOP
@@ -9470,7 +9569,7 @@ DEFINE CLASS CL_DBC_BASE AS CL_CUS_BASE
* tnProperty_Count (@! OUT) Cantidad de propiedades encontradas
*---------------------------------------------------------------------------------------------------
LPARAMETERS tcName, tcType, taProperties, tnProperty_Count
-
+
EXTERNAL ARRAY taProperties && STRUCTURE: PropName,RecordLen,DataIDLen,DataID,DataType,Data
TRY
@@ -9510,7 +9609,7 @@ DEFINE CLASS CL_DBC_BASE AS CL_CUS_BASE
DO WHILE lnLastPos < LEN(laProperty(1,1))
tnProperty_Count = tnProperty_Count + 1
DIMENSION taProperties( tnProperty_Count,6 )
-
+
lnRecordLen = CTOBIN( SUBSTR(laProperty(1,1), lnLastPos, 4), "4RS" )
lcBinRecord = SUBSTR(laProperty(1,1), lnLastPos, lnRecordLen)
lnLenCCode = CTOBIN( SUBSTR(lcBinRecord, 4+1, 2), "2RS" )
@@ -9549,7 +9648,7 @@ DEFINE CLASS CL_DBC_BASE AS CL_CUS_BASE
leValue = LEFT( lcValue, AT( CHR(0), lcValue ) - 1 )
ENDIF
ENDCASE
-
+
taProperties( tnProperty_Count,1 ) = lcPropName
taProperties( tnProperty_Count,2 ) = lnRecordLen
taProperties( tnProperty_Count,3 ) = lnLenCCode