Changeset: 650 - Bug Fix scx/vcx: Procesar solo un nivel de text/endtext, ya que no se admiten más niveles (Lutz Scheffler)

This commit is contained in:
fdbozzo
2015-03-01 17:50:10 +01:00
2 changed files with 132 additions and 21 deletions

View File

@@ -11,9 +11,11 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion as
#DEFINE C_IF_F '#IF' #DEFINE C_IF_F '#IF'
#DEFINE C_ENDIF '#ENDIF' #DEFINE C_ENDIF '#ENDIF'
icObj = NULL icObj = NULL
icFB = NULL
******************************************************************************************************************************************* *******************************************************************************************************************************************
FUNCTION Setup FUNCTION Setup
THIS.icFB = NEWOBJECT("c_foxbin2prg", "FOXBIN2PRG.PRG")
THIS.icObj = NEWOBJECT("c_conversor_prg_a_bin", "FOXBIN2PRG.PRG") THIS.icObj = NEWOBJECT("c_conversor_prg_a_bin", "FOXBIN2PRG.PRG")
ENDFUNC ENDFUNC
@@ -22,6 +24,7 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion as
******************************************************************************************************************************************* *******************************************************************************************************************************************
FUNCTION TearDown FUNCTION TearDown
THIS.icObj = NULL THIS.icObj = NULL
THIS.icFB = NULL
ENDFUNC ENDFUNC
@@ -85,7 +88,7 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion as
laLineasExclusion_Esperadas( 3) = .T. laLineasExclusion_Esperadas( 3) = .T.
laLineasExclusion_Esperadas( 4) = .T. laLineasExclusion_Esperadas( 4) = .T.
laLineasExclusion_Esperadas( 5) = .T. laLineasExclusion_Esperadas( 5) = .T.
laLineasExclusion_Esperadas( 7) = .T. laLineasExclusion_Esperadas( 6) = .T.
laLineasExclusion_Esperadas( 8) = .T. laLineasExclusion_Esperadas( 8) = .T.
laLineasExclusion_Esperadas( 9) = .T. laLineasExclusion_Esperadas( 9) = .T.
laLineasExclusion_Esperadas(10) = .T. laLineasExclusion_Esperadas(10) = .T.
@@ -117,6 +120,56 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion as
ENDFUNC ENDFUNC
*******************************************************************************************************************************************
FUNCTION Deberia_ObtenerLaUbicacionDelBloque_IF_ENDIF_externo_CuandoOtros_IF_ENDIF_internos_sonEvaluados
LOCAL lcMethod, laLineas(1), lnLineas, laPos(1,2), lnPos_Count, laExpected_Pos(1,2) ;
, laLineasExclusion(14), laLineasExclusion_Esperadas(14)
LOCAL loObj AS c_conversor_prg_a_bin OF "FOXBIN2PRG.PRG"
loObj = THIS.icObj
*-- Input and expected params
STORE '' TO lcMethod
laExpected_Pos(1,1) = 3
laExpected_Pos(1,2) = 13
laLineasExclusion_Esperadas( 3) = .T.
laLineasExclusion_Esperadas( 4) = .T.
laLineasExclusion_Esperadas( 5) = .T.
laLineasExclusion_Esperadas( 7) = .T.
laLineasExclusion_Esperadas( 8) = .T.
laLineasExclusion_Esperadas( 9) = .T.
laLineasExclusion_Esperadas(10) = .T.
laLineasExclusion_Esperadas(11) = .T.
laLineasExclusion_Esperadas(12) = .T.
laLineasExclusion_Esperadas(13) = .T.
TEXT TO lcMethod NOSHOW TEXTMERGE FLAGS 1 PRETEXT 1+2
<<C_PROC>> myMethod_B
*-- Code Block
<<C_IF_F>>
<<C_IF_F>>
<<C_TEXT>>
value ;
<<C_ENDIF>>
*-- Code Block
<<C_IF_F>>
value ,
<<C_ENDTEXT>>
<<C_ENDIF>>
<<C_ENDIF>>
<<C_ENDPROC>>
ENDTEXT
lnLineas = ALINES( laLineas, lcMethod )
*-- Test
loObj.identificarBloquesDeExclusion( @laLineas, lnLineas, , @laLineasExclusion, @lnPos_Count, @laPos )
*-- Evaluaci<63>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 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) ;
@@ -208,6 +261,59 @@ DEFINE CLASS ut__foxbin2prg__c_conversor_base__IdentificarBloquesDeExclusion as
ENDFUNC ENDFUNC
*******************************************************************************************************************************************
FUNCTION Deberia_ObtenerLaUbicacionDelBloque_TEXT_ENDTEXT_CuandoCodigoConteniendo_TEXT_esEvaluado
LOCAL lcMethod, laLineas(1), lnLineas, laPos(1,2), lnPos_Count, laExpected_Pos(3,2) ;
, laLineasExclusion(14), laLineasExclusion_Esperadas(14)
LOCAL loObj AS c_conversor_prg_a_bin OF "FOXBIN2PRG.PRG"
loObj = THIS.icObj
*-- Input and expected params
STORE '' TO lcMethod
laExpected_Pos(1,1) = 3
laExpected_Pos(1,2) = 5
laExpected_Pos(2,1) = 7
laExpected_Pos(2,2) = 9
laExpected_Pos(3,1) = 11
laExpected_Pos(3,2) = 13
laLineasExclusion_Esperadas( 3) = .T.
laLineasExclusion_Esperadas( 4) = .T.
laLineasExclusion_Esperadas( 5) = .T.
laLineasExclusion_Esperadas( 7) = .T.
laLineasExclusion_Esperadas( 8) = .T.
laLineasExclusion_Esperadas( 9) = .T.
laLineasExclusion_Esperadas(11) = .T.
laLineasExclusion_Esperadas(12) = .T.
laLineasExclusion_Esperadas(13) = .T.
TEXT TO lcMethod NOSHOW TEXTMERGE FLAGS 1 PRETEXT 1+2
<<C_PROC>> myMethod_B
*-- Code Block
<<C_TEXT>>
<<C_TEXT>>
<<C_ENDTEXT>>
*-- Code Block
<<C_TEXT>>
<<C_TEXT>> ;
<<C_ENDTEXT>>
*-- Code Block
<<C_TEXT>>
<<C_TEXT>> ,
<<C_ENDTEXT>>
<<C_ENDPROC>>
ENDTEXT
lnLineas = ALINES( laLineas, lcMethod )
*-- Test
loObj.identificarBloquesDeExclusion( @laLineas, lnLineas, , @laLineasExclusion, @lnPos_Count, @laPos )
*-- Evaluaci<63>n de resultados
THIS.Evaluate_results( @laExpected_Pos, @laPos, lnPos_Count, @laLineasExclusion_Esperadas, @laLineasExclusion )
ENDFUNC
******************************************************************************************************************************************* *******************************************************************************************************************************************
FUNCTION Deberia_NoEncontrarBloque_TEXT_ENDTEXT_CuandoEvaluaUnaLineaQueComienzaConUnCampoLlamado_Text_YLineaAnteriorTerminaEn_PuntoYComa FUNCTION Deberia_NoEncontrarBloque_TEXT_ENDTEXT_CuandoEvaluaUnaLineaQueComienzaConUnCampoLlamado_Text_YLineaAnteriorTerminaEn_PuntoYComa
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)

View File

@@ -132,6 +132,7 @@
* 13/01/2015 FDBOZZO v1.19.41 Bug Fix scx/vcx: Detecci<63>n err<72>nea de estructuras PROCEDURE/ENDPROC cuando se usan como par<61>metros en LPARAMETERS (Ryan Harris) * 13/01/2015 FDBOZZO v1.19.41 Bug Fix scx/vcx: Detecci<63>n err<72>nea de estructuras PROCEDURE/ENDPROC cuando se usan como par<61>metros en LPARAMETERS (Ryan Harris)
* 13/01/2015 FDBOZZO v1.19.41 Bug Fix db2: Detecci<63>n err<72>nea de tabla inv<6E>lida cuando el tama<6D>o es inferior a 328 bytes. L<>mite m<>nimo cambiado a 65 bytes. * 13/01/2015 FDBOZZO v1.19.41 Bug Fix db2: Detecci<63>n err<72>nea de tabla inv<6E>lida cuando el tama<6D>o es inferior a 328 bytes. L<>mite m<>nimo cambiado a 65 bytes.
* 20/01/2015 FDBOZZO v1.19.42 Mejora: Validaci<63>n de versi<73>n de Visual FoxPro, para evitar problemas ajenos a FoxBin2Prg * 20/01/2015 FDBOZZO v1.19.42 Mejora: Validaci<63>n de versi<73>n de Visual FoxPro, para evitar problemas ajenos a FoxBin2Prg
* 25/02/2015 FDBOZZO v1.19.42 Bug Fix scx/vcx: Procesar solo un nivel de text/endtext, ya que no se admiten m<>s niveles (Lutz Scheffler)
* </HISTORIAL DE CAMBIOS Y NOTAS IMPORTANTES> * </HISTORIAL DE CAMBIOS Y NOTAS IMPORTANTES>
* *
*--------------------------------------------------------------------------------------------------- *---------------------------------------------------------------------------------------------------
@@ -192,6 +193,7 @@
* 06/01/2015 Jim Nelson Mejora v1.19.39: Permitir configurar la barra de progreso para que solamente aparezca cuando se procesan m<>ltiples archivos y no cuando se procesa solo 1 (Agregado en v1.19.40) * 06/01/2015 Jim Nelson Mejora v1.19.39: Permitir configurar la barra de progreso para que solamente aparezca cuando se procesan m<>ltiples archivos y no cuando se procesa solo 1 (Agregado en v1.19.40)
* 06/01/2015 Mike Potjer Reporte bug db2: [Error 12, Variable "TCOUTPUTFILE" is not found] cuando DBF_Conversion_Support=4 y el archivo de salida es igual al generado (Agregado en v1.19.40) * 06/01/2015 Mike Potjer Reporte bug db2: [Error 12, Variable "TCOUTPUTFILE" is not found] cuando DBF_Conversion_Support=4 y el archivo de salida es igual al generado (Agregado en v1.19.40)
* 13/01/2015 Ryan Harris Reporte bug vcx/scx v1.19.40: Detecci<63>n err<72>nea de estructuras PROCEDURE/ENDPROC cuando se usan como par<61>metros LPARAMETERS en l<>nea aparte (Arreglado en v1.19.41) * 13/01/2015 Ryan Harris Reporte bug vcx/scx v1.19.40: Detecci<63>n err<72>nea de estructuras PROCEDURE/ENDPROC cuando se usan como par<61>metros LPARAMETERS en l<>nea aparte (Arreglado en v1.19.41)
* 25/02/2015 Lutz Scheffler Reporte de Bug scx/vcx v1.19.41: Procesar solo un nivel de text/endtext, ya que no se admiten m<>s niveles (Arreglado en v1.19.42)
* </TESTEO Y REPORTE DE BUGS (AGRADECIMIENTOS)> * </TESTEO Y REPORTE DE BUGS (AGRADECIMIENTOS)>
* *
*--------------------------------------------------------------------------------------------------- *---------------------------------------------------------------------------------------------------
@@ -1925,7 +1927,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
*ENDIF *ENDIF
IF VERSION(5) < 900 OR INT( VAL( SUBSTR( VERSION(4), RAT('.', VERSION(4)) + 1 ) ) ) < 3504 IF VERSION(5) < 900 OR INT( VAL( SUBSTR( VERSION(4), RAT('.', VERSION(4)) + 1 ) ) ) < 3504
ERROR C_INCORRECT_VFP9_VERSION__MISSING_SP1_LOC ERROR C_INCORRECT_VFP9_VERSION__MISSING_SP1_LOC
ENDIF ENDIF
*-- Determino el tipo de InputFile (Archivo o Directorio) *-- Determino el tipo de InputFile (Archivo o Directorio)
@@ -4075,7 +4077,7 @@ DEFINE CLASS C_CONVERSOR_BASE AS SESSION
IF tnIniFin = 1 IF tnIniFin = 1
*-- TOKENS DE INICIO *-- TOKENS DE INICIO
IF UPPER( LEFT( lcLine, LEN(ta_ID_Bloques(X,1)) ) ) == ta_ID_Bloques(X,1) IF UPPER( LEFT( lcLine, ta_ID_Bloques(X,3) ) ) == ta_ID_Bloques(X,1)
*-- Evaluar casos especiales *-- Evaluar casos especiales
lcWord = UPPER( ALLTRIM(GETWORDNUM(lcLine,1) ) ) lcWord = UPPER( ALLTRIM(GETWORDNUM(lcLine,1) ) )
@@ -4096,7 +4098,7 @@ DEFINE CLASS C_CONVERSOR_BASE AS SESSION
ENDIF ENDIF
ELSE ELSE
*-- TOKENS DE FIN *-- TOKENS DE FIN
IF LEFT( UPPER( lcLine ), tnLen_IDFinBQ ) == ta_ID_Bloques(X,2) && Fin de bloque encontrado (#ENDI, ENDTEXT, etc) IF LEFT( UPPER( lcLine ), ta_ID_Bloques(X,4) ) == ta_ID_Bloques(X,2) && Fin de bloque encontrado (#ENDI, ENDTEXT, etc)
*-- Evaluar casos especiales *-- Evaluar casos especiales
lcWord = UPPER( ALLTRIM(GETWORDNUM(lcLine,1) ) ) lcWord = UPPER( ALLTRIM(GETWORDNUM(lcLine,1) ) )
@@ -4284,7 +4286,7 @@ DEFINE CLASS C_CONVERSOR_BASE AS SESSION
* PAR<41>METROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) * PAR<41>METROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT)
* tnTimeStamp (v! IN ) Timestamp en formato num<75>rico * tnTimeStamp (v! IN ) Timestamp en formato num<75>rico
*--------------------------------------------------------------------------------------------------- *---------------------------------------------------------------------------------------------------
LPARAMETERS tnTimeStamp LPARAMETERS tnTimestamp
*-- CONVIERTE UN DATO TIMESTAMP NUMERICO USADO POR LOS ARCHIVOS SCX/VCX/etc. EN TIPO DATETIME *-- CONVIERTE UN DATO TIMESTAMP NUMERICO USADO POR LOS ARCHIVOS SCX/VCX/etc. EN TIPO DATETIME
TRY TRY
LOCAL lcTimeStamp,lnYear,lnMonth,lnDay,lnHour,lnMinutes,lnSeconds,lcTime,lnHour,ltTimeStamp,lnResto ; LOCAL lcTimeStamp,lnYear,lnMonth,lnDay,lnHour,lnMinutes,lnSeconds,lcTime,lnHour,ltTimeStamp,lnResto ;
@@ -4292,7 +4294,7 @@ DEFINE CLASS C_CONVERSOR_BASE AS SESSION
lcTimeStamp_Ret = '' lcTimeStamp_Ret = ''
IF EMPTY(tnTimeStamp) IF EMPTY(tnTimestamp)
IF THIS.lFileMode IF THIS.lFileMode
IF ADIR(laDirInfo,THIS.c_InputFile)=0 IF ADIR(laDirInfo,THIS.c_InputFile)=0
EXIT EXIT
@@ -4310,15 +4312,15 @@ DEFINE CLASS C_CONVERSOR_BASE AS SESSION
EXIT EXIT
ENDIF ENDIF
tnTimeStamp = THIS.n_ClassTimeStamp tnTimestamp = THIS.n_ClassTimeStamp
IF EMPTY(tnTimeStamp) IF EMPTY(tnTimestamp)
EXIT EXIT
ENDIF ENDIF
ENDIF ENDIF
*-- YYYY YYYM MMMD DDDD HHHH HMMM MMMS SSSS *-- YYYY YYYM MMMD DDDD HHHH HMMM MMMS SSSS
lnResto = tnTimeStamp lnResto = tnTimestamp
lnYear = INT( lnResto / 2**25 + 1980) lnYear = INT( lnResto / 2**25 + 1980)
lnResto = lnResto % 2**25 lnResto = lnResto % 2**25
lnMonth = INT( lnResto / 2**21 ) lnMonth = INT( lnResto / 2**21 )
@@ -4524,15 +4526,19 @@ DEFINE CLASS C_CONVERSOR_BASE AS SESSION
LOCAL loLang as CL_LANG OF 'FOXBIN2PRG.PRG' LOCAL loLang as CL_LANG OF 'FOXBIN2PRG.PRG'
loLang = _SCREEN.o_FoxBin2Prg_Lang loLang = _SCREEN.o_FoxBin2Prg_Lang
DIMENSION taLineasExclusion(tnCodeLines), taBloquesExclusion(1,2) DIMENSION taLineasExclusion(tnCodeLines), taBloquesExclusion(1,2)
STORE 0 TO tnBloquesExclusion, lnPrimerID, I, X, lnLen_IDFinBQ STORE 0 TO tnBloquesExclusion, lnPrimerID, I, X
IF tnCodeLines > 1 IF tnCodeLines > 1
IF EMPTY(ta_ID_Bloques) IF EMPTY(ta_ID_Bloques)
DIMENSION ta_ID_Bloques(2,2) DIMENSION ta_ID_Bloques(2,4)
ta_ID_Bloques(1,1) = '#IF' ta_ID_Bloques(1,1) = '#IF'
ta_ID_Bloques(1,2) = '#ENDI' ta_ID_Bloques(1,2) = '#ENDI'
ta_ID_Bloques(1,3) = LEN( ta_ID_Bloques(1,1) )
ta_ID_Bloques(1,4) = LEN( ta_ID_Bloques(1,2) )
ta_ID_Bloques(2,1) = 'TEXT' ta_ID_Bloques(2,1) = 'TEXT'
ta_ID_Bloques(2,2) = 'ENDT' ta_ID_Bloques(2,2) = 'ENDT'
ta_ID_Bloques(2,3) = LEN( ta_ID_Bloques(2,1) )
ta_ID_Bloques(2,4) = LEN( ta_ID_Bloques(2,2) )
lnID_Bloques_Count = ALEN( ta_ID_Bloques, 1 ) lnID_Bloques_Count = ALEN( ta_ID_Bloques, 1 )
ENDIF ENDIF
@@ -4563,7 +4569,6 @@ DEFINE CLASS C_CONVERSOR_BASE AS SESSION
IF lnPrimerID > 0 && Se ha identificado un ID de bloque excluyente IF lnPrimerID > 0 && Se ha identificado un ID de bloque excluyente
tnBloquesExclusion = tnBloquesExclusion + 1 tnBloquesExclusion = tnBloquesExclusion + 1
lnLen_IDFinBQ = LEN( ta_ID_Bloques(lnPrimerID,2) )
DIMENSION taBloquesExclusion(tnBloquesExclusion,2) DIMENSION taBloquesExclusion(tnBloquesExclusion,2)
taBloquesExclusion(tnBloquesExclusion,1) = I taBloquesExclusion(tnBloquesExclusion,1) = I
taLineasExclusion(I) = .T. taLineasExclusion(I) = .T.
@@ -4579,12 +4584,12 @@ DEFINE CLASS C_CONVERSOR_BASE AS SESSION
ENDIF ENDIF
DO CASE DO CASE
CASE .elTextoEvaluadoEsElTokenIndicado( @lcLine, @ta_ID_Bloques, lnLen_IDFinBQ, X, 1 ) ; CASE lnPrimerID = 1 AND .elTextoEvaluadoEsElTokenIndicado( @lcLine, @ta_ID_Bloques, 0, X, 1 ) ;
AND NOT .currentLineIsPreviousLineContinuation( @taCodeLines, I ) AND NOT .currentLineIsPreviousLineContinuation( @taCodeLines, I )
*-- Busca el primer marcador (#IF o TEXT) *-- Busca el primer marcador (#IF) NOTA: No busco [TEXT] porque no se pueden anidar.
lnAnidamientos = lnAnidamientos + 1 lnAnidamientos = lnAnidamientos + 1
CASE .elTextoEvaluadoEsElTokenIndicado( @lcLine, @ta_ID_Bloques, lnLen_IDFinBQ, X, 2 ) CASE .elTextoEvaluadoEsElTokenIndicado( @lcLine, @ta_ID_Bloques, 0, X, 2 )
*-- Busca el segundo marcador (#ENDIF o ENDTEXT) *-- Busca el segundo marcador (#ENDIF o ENDTEXT)
lnAnidamientos = lnAnidamientos - 1 lnAnidamientos = lnAnidamientos - 1
@@ -4616,7 +4621,7 @@ DEFINE CLASS C_CONVERSOR_BASE AS SESSION
FINALLY FINALLY
RELEASE taCodeLines, tnCodeLines, ta_ID_Bloques, taLineasExclusion, tnBloquesExclusion, taBloquesExclusion, loLang ; RELEASE taCodeLines, tnCodeLines, ta_ID_Bloques, taLineasExclusion, tnBloquesExclusion, taBloquesExclusion, loLang ;
, lnBloques, I, X, lnPrimerID, lnLen_IDFinBQ, lnID_Bloques_Count, lcWord, lnAnidamientos, lcLine, lcPrevLine , lnBloques, I, X, lnPrimerID, lnID_Bloques_Count, lcWord, lnAnidamientos, lcLine, lcPrevLine
ENDTRY ENDTRY
RETURN RETURN
@@ -4732,11 +4737,11 @@ DEFINE CLASS C_CONVERSOR_BASE AS SESSION
FUNCTION RowTimeStamp(ltDateTime) FUNCTION RowTimeStamp(ltDateTime)
* Generate a FoxPro 3.0-style row timestamp * Generate a FoxPro 3.0-style row timestamp
*-- CONVIERTE UN DATO TIPO DATETIME EN TIMESTAMP NUMERICO USADO POR LOS ARCHIVOS SCX/VCX/etc. *-- CONVIERTE UN DATO TIPO DATETIME EN TIMESTAMP NUMERICO USADO POR LOS ARCHIVOS SCX/VCX/etc.
LOCAL lcTimeValue, tnTimeStamp LOCAL lcTimeValue, tnTimestamp
TRY TRY
IF EMPTY(ltDateTime) IF EMPTY(ltDateTime)
tnTimeStamp = 0 tnTimestamp = 0
EXIT EXIT
ENDIF ENDIF
@@ -4744,7 +4749,7 @@ DEFINE CLASS C_CONVERSOR_BASE AS SESSION
m.ltDateTime = DATETIME() m.ltDateTime = DATETIME()
ENDIF ENDIF
tnTimeStamp = ( YEAR(m.ltDateTime) - 1980) * 2^25 ; tnTimestamp = ( YEAR(m.ltDateTime) - 1980) * 2^25 ;
+ MONTH(m.ltDateTime) * 2^21 ; + MONTH(m.ltDateTime) * 2^21 ;
+ DAY(m.ltDateTime) * 2^16 ; + DAY(m.ltDateTime) * 2^16 ;
+ HOUR(m.ltDateTime) * 2^11 ; + HOUR(m.ltDateTime) * 2^11 ;
@@ -4752,7 +4757,7 @@ DEFINE CLASS C_CONVERSOR_BASE AS SESSION
+ SEC(m.ltDateTime) + SEC(m.ltDateTime)
ENDTRY ENDTRY
RETURN INT(tnTimeStamp) RETURN INT(tnTimestamp)
ENDFUNC ENDFUNC