OS2World OLD-STATIC-BACKUP Forum

OS/2 - SIGs => Rexx => Topic started by: jep on 2008.03.31, 10:49:03

Title: DataType
Post by: jep on 2008.03.31, 10:49:03
Marked as: Advanced
Hello,

here's my example on how to check if a value is a date, time or timestamp. It's not that very well tested yet so use with care.

Can you improve it? tell me what to do!

Note: It's possible to modify it to overload the builtin function DATATYPE, just check Rexx Tips & Tricks if you want to create your own datatype and test it.


datatypes: procedure
    if ARG() = 2 then
    do
        if length( strip( ARG(1) ) ) = 0 then
            if pos( 'EMPTY', translate( ARG(2) ) ) > 0 then Return 1
            else Return 0
        if pos( 'TIMESTAMP', translate( ARG(2) ) ) > 0 then
        do
            parse value ARG(1) with date_stamp' 'time_stamp','.
            if rxDateType( date_stamp, 'I', rxNot ) then
                if rxTimeType( time_stamp, 'L', rxNot ) then Return 1
        end
        else if pos( 'DATE', translate( ARG(2) ) ) > 0 then
        do
            if pos( 'E', translate( ARG(2) ) ) = 1 then
                if rxDateType( ARG(1), 'E', rxNotEuropeanDate ) then Return 1
            if pos( 'I', translate( ARG(2) ) ) = 1 then
                if rxDateType( ARG(1), 'I', rxNotISODate ) then Return 1
            if pos( 'N', translate( ARG(2) ) ) = 1 then
                if rxDateType( ARG(1), 'N', rxNotNormalDate ) then Return 1
            if pos( 'O', translate( ARG(2) ) ) = 1 then
                if rxDateType( ARG(1), 'O', rxNotOrderedDate ) then Return 1
            if pos( 'S', translate( ARG(2) ) ) = 1 then
                if rxDateType( ARG(1), 'S', rxNotStandardDate ) then Return 1
            if pos( 'U', translate( ARG(2) ) ) = 1 then
                if rxDateType( ARG(1), 'U', rxNot ) then Return 1
            Return datatypes( ARG(1), 'EDATE' )
        end
        else if pos( 'TIME', translate( ARG(2) ) ) > 0 then
        do
            if pos( 'C', translate( ARG(2) ) ) = 1 then
                if rxTimeType( ARG(1), 'E', rxNotCivilTime ) then Return 1
            if pos( 'L', translate( ARG(2) ) ) = 1 then
                if rxTimeType( ARG(1), 'L', rxNotLongTime ) then Return 1
            if pos( 'N', translate( ARG(2) ) ) = 1 then
                if rxTimeType( ARG(1), 'N', rxNot ) then Return 1
            Return datatypes( ARG(1), 'ETIME' )
        end
        else Return Datatype( ARG(1), ARG(2) )
        Return 0
    end
    else if datatypes( ARG(1), 'TIMESTAMP' ) then Return 'TIMESTAMP'
    else if datatypes( ARG(1), 'DATE' ) then Return 'DATE'
    else if datatypes( ARG(1), 'TIME' ) then Return 'TIME'
Return Datatype( ARG(1) )

rxDateType: procedure
    interpret 'SIGNAL ON SYNTAX NAME '||ARG(3)
    SIGNAL OFF NOVALUE
    SIGNAL OFF FAILURE
    SIGNAL OFF ERROR
    SIGNAL OFF NOTREADY
    if datatype( date( 'B', ARG(1), ARG(2) ), 'W' ) then Return 1
Return 0
   
rxTimeType: procedure
    interpret 'SIGNAL ON SYNTAX NAME '||ARG(3)
    SIGNAL OFF NOVALUE
    SIGNAL OFF FAILURE
    SIGNAL OFF ERROR
    SIGNAL OFF NOTREADY
    if datatype( time( 'S', ARG(1), ARG(2) ), 'W' ) then Return 1
Return 0

rxNotDateTime:
Return datatypes( ARG(1) )
   
rxNotEuropeanDate:
Return datatypes( ARG(1), 'IDATE' )
   
rxNotISODate:
Return datatypes( ARG(1), 'NDATE' )
   
rxNotNormalDate:
Return datatypes( ARG(1), 'ODATE' )

rxNotOrderedDate:
Return datatypes( ARG(1), 'SDATE' )
   
rxNotStandardDate:
Return datatypes( ARG(1), 'UDATE' )
   
rxNot:
Return 0
   
rxNotCivilTime:
Return datatypes( ARG(1), 'LTIME' )
   
rxNotLongTime:
Return datatypes( ARG(1), 'NTIME' )