XML Schema Datetime and Decimals

XML Schema Datetime and Decimals — XML Schema datetime and arbitrary length decimal number arithmetic.

Synopsis

                    rasqal_xsd_datetime;
#define             RASQAL_XSD_DATETIME_NO_TZ
rasqal_xsd_datetime *  rasqal_new_xsd_datetime          (rasqal_world *world,
                                                         const char *datetime_string);
rasqal_xsd_datetime *  rasqal_new_xsd_datetime_from_timeval
                                                        (rasqal_world *world,
                                                         struct timeval *tv);
rasqal_xsd_datetime *  rasqal_new_xsd_datetime_from_unixtime
                                                        (rasqal_world *world,
                                                         time_t secs);
void                rasqal_free_xsd_datetime            (rasqal_xsd_datetime *dt);
int                 rasqal_xsd_datetime_compare         (const rasqal_xsd_datetime *dt1,
                                                         const rasqal_xsd_datetime *dt2);
int                 rasqal_xsd_datetime_equals          (const rasqal_xsd_datetime *dt1,
                                                         const rasqal_xsd_datetime *dt2);
struct timeval *    rasqal_xsd_datetime_get_as_timeval  (rasqal_xsd_datetime *dt);
time_t              rasqal_xsd_datetime_get_as_unixtime (rasqal_xsd_datetime *dt);
rasqal_xsd_decimal *  rasqal_xsd_datetime_get_seconds_as_decimal
                                                        (rasqal_world *world,
                                                         rasqal_xsd_datetime *dt);
char *              rasqal_xsd_datetime_get_timezone_as_counted_string
                                                        (rasqal_xsd_datetime *dt,
                                                         size_t *len_p);
char *              rasqal_xsd_datetime_get_tz_as_counted_string
                                                        (rasqal_xsd_datetime *dt,
                                                         size_t *len_p);
int                 rasqal_xsd_datetime_set_from_timeval
                                                        (rasqal_xsd_datetime *dt,
                                                         struct timeval *tv);
int                 rasqal_xsd_datetime_set_from_unixtime
                                                        (rasqal_xsd_datetime *dt,
                                                         time_t clock);
char *              rasqal_xsd_datetime_to_counted_string
                                                        (const rasqal_xsd_datetime *dt,
                                                         size_t *len_p);
char *              rasqal_xsd_datetime_to_string       (const rasqal_xsd_datetime *dt);
void                rasqal_free_xsd_decimal             (rasqal_xsd_decimal *dec);
rasqal_xsd_decimal *  rasqal_new_xsd_decimal            (rasqal_world *world);
typedef             rasqal_xsd_decimal;
int                 rasqal_xsd_decimal_abs              (rasqal_xsd_decimal *result,
                                                         rasqal_xsd_decimal *a);
int                 rasqal_xsd_decimal_add              (rasqal_xsd_decimal *result,
                                                         rasqal_xsd_decimal *a,
                                                         rasqal_xsd_decimal *b);
char *              rasqal_xsd_decimal_as_counted_string
                                                        (rasqal_xsd_decimal *dec,
                                                         size_t *len_p);
char *              rasqal_xsd_decimal_as_string        (rasqal_xsd_decimal *dec);
int                 rasqal_xsd_decimal_ceil             (rasqal_xsd_decimal *result,
                                                         rasqal_xsd_decimal *a);
int                 rasqal_xsd_decimal_compare          (rasqal_xsd_decimal *a,
                                                         rasqal_xsd_decimal *b);
int                 rasqal_xsd_decimal_divide           (rasqal_xsd_decimal *result,
                                                         rasqal_xsd_decimal *a,
                                                         rasqal_xsd_decimal *b);
int                 rasqal_xsd_decimal_equals           (rasqal_xsd_decimal *a,
                                                         rasqal_xsd_decimal *b);
int                 rasqal_xsd_decimal_floor            (rasqal_xsd_decimal *result,
                                                         rasqal_xsd_decimal *a);
double              rasqal_xsd_decimal_get_double       (rasqal_xsd_decimal *dec);
long                rasqal_xsd_decimal_get_long         (rasqal_xsd_decimal *dec,
                                                         int *error_p);
int                 rasqal_xsd_decimal_is_zero          (rasqal_xsd_decimal *d);
int                 rasqal_xsd_decimal_multiply         (rasqal_xsd_decimal *result,
                                                         rasqal_xsd_decimal *a,
                                                         rasqal_xsd_decimal *b);
int                 rasqal_xsd_decimal_negate           (rasqal_xsd_decimal *result,
                                                         rasqal_xsd_decimal *a);
int                 rasqal_xsd_decimal_print            (rasqal_xsd_decimal *dec,
                                                         FILE *stream);
int                 rasqal_xsd_decimal_round            (rasqal_xsd_decimal *result,
                                                         rasqal_xsd_decimal *a);
int                 rasqal_xsd_decimal_set_double       (rasqal_xsd_decimal *dec,
                                                         double d);
int                 rasqal_xsd_decimal_set_long         (rasqal_xsd_decimal *dec,
                                                         long l Param2);
int                 rasqal_xsd_decimal_set_string       (rasqal_xsd_decimal *dec,
                                                         const char *string);
int                 rasqal_xsd_decimal_subtract         (rasqal_xsd_decimal *result,
                                                         rasqal_xsd_decimal *a,
                                                         rasqal_xsd_decimal *b);

Description

Classes for providing XSD datatypes for Datetimes plus Decimals with arbitrary length floating point decimals and standard operators on the Decimals suitable for SPARQL.

Details

rasqal_xsd_datetime

typedef struct {
  signed int year;
  unsigned char month;
  unsigned char day;
  /* the following fields are integer values not characters */
  signed char hour;
  signed char minute;
  signed char second;
  signed int microseconds;
  signed short timezone_minutes;
} rasqal_xsd_datetime;

XML Schema dateTime datatype (xsd:dateTime)

Signed types are required for normalization process where a value can be negative temporarily.

signed int year;

year

unsigned char month;

month 1-12

unsigned char day;

0-31

signed char hour;

hour 0-23

signed char minute;

minute 0-59

signed char second;

second 0-60 (yes 60 is allowed for leap seconds)

signed int microseconds;

microseconds

signed short timezone_minutes;

minutes +/- against UTC or RASQAL_XSD_DATETIME_NO_TZ if there isno timezone in the dateTime.

RASQAL_XSD_DATETIME_NO_TZ

#define RASQAL_XSD_DATETIME_NO_TZ (9999)

Sentinel XSD Decimal timezone value indicating no timezone is present.


rasqal_new_xsd_datetime ()

rasqal_xsd_datetime *  rasqal_new_xsd_datetime          (rasqal_world *world,
                                                         const char *datetime_string);

Constructor - make a new XSD datetime object from a string

world :

world object

datetime_string :

XSD Datetime string

Returns :

new datetime or NULL on failure

rasqal_new_xsd_datetime_from_timeval ()

rasqal_xsd_datetime *  rasqal_new_xsd_datetime_from_timeval
                                                        (rasqal_world *world,
                                                         struct timeval *tv);

Constructor - make a new XSD datetime object from a timeval

world :

world object

tv :

pointer to struct timeval

Returns :

new datetime or NULL on failure

rasqal_new_xsd_datetime_from_unixtime ()

rasqal_xsd_datetime *  rasqal_new_xsd_datetime_from_unixtime
                                                        (rasqal_world *world,
                                                         time_t secs);

Constructor - make a new XSD datetime object from unixtime seconds

world :

world object

secs :

unixtime

Returns :

new datetime or NULL on failure

rasqal_free_xsd_datetime ()

void                rasqal_free_xsd_datetime            (rasqal_xsd_datetime *dt);

Destroy XSD datetime object.

dt :

datetime object

rasqal_xsd_datetime_compare ()

int                 rasqal_xsd_datetime_compare         (const rasqal_xsd_datetime *dt1,
                                                         const rasqal_xsd_datetime *dt2);

Compare two XSD dateTimes

dt1 :

first XSD dateTime

dt2 :

second XSD dateTime

Returns :

<0 if dt1 is less than dt2, 0 if equal, >1 otherwise

rasqal_xsd_datetime_equals ()

int                 rasqal_xsd_datetime_equals          (const rasqal_xsd_datetime *dt1,
                                                         const rasqal_xsd_datetime *dt2);

Compare two XSD dateTimes for equality.

dt1 :

first XSD dateTime

dt2 :

second XSD dateTime

Returns :

non-0 if equal.

rasqal_xsd_datetime_get_as_timeval ()

struct timeval *    rasqal_xsd_datetime_get_as_timeval  (rasqal_xsd_datetime *dt);

Get a datetime as struct timeval

The returned timeval must be freed by the caller such as using rasqal_free_memory().

dt :

datetime

Returns :

pointer to a new timeval structure or NULL on failure

rasqal_xsd_datetime_get_as_unixtime ()

time_t              rasqal_xsd_datetime_get_as_unixtime (rasqal_xsd_datetime *dt);

Get a datetime as unix seconds

dt :

datetime

Returns :

unix seconds or 0 if dt is NULL

rasqal_xsd_datetime_get_seconds_as_decimal ()

rasqal_xsd_decimal *  rasqal_xsd_datetime_get_seconds_as_decimal
                                                        (rasqal_world *world,
                                                         rasqal_xsd_datetime *dt);

Get the seconds component of a dateTime as a decimal

world :

world object

dt :

XSD dateTime

Returns :

decimal object or NULL on failure

rasqal_xsd_datetime_get_timezone_as_counted_string ()

char *              rasqal_xsd_datetime_get_timezone_as_counted_string
                                                        (rasqal_xsd_datetime *dt,
                                                         size_t *len_p);

Get the timezone of a datetime as a duration format string with optional length count

The returned string is owned by the caller and must be freed by rasqal_free_memory().

dt :

datetime

len_p :

pointer to store returned string length

Returns :

pointer to a new string or NULL on failure

rasqal_xsd_datetime_get_tz_as_counted_string ()

char *              rasqal_xsd_datetime_get_tz_as_counted_string
                                                        (rasqal_xsd_datetime *dt,
                                                         size_t *len_p);

Get the timezone of a datetime as a timezone string

The returned string is owned by the caller and must be freed by rasqal_free_memory().

dt :

datetime

len_p :

pointer to store returned string length

Returns :

pointer to a new string or NULL on failure

rasqal_xsd_datetime_set_from_timeval ()

int                 rasqal_xsd_datetime_set_from_timeval
                                                        (rasqal_xsd_datetime *dt,
                                                         struct timeval *tv);

Set an XSD dateTime from a struct timeval pointer

dt :

datetime

tv :

timeval

Returns :

non-0 on failure

rasqal_xsd_datetime_set_from_unixtime ()

int                 rasqal_xsd_datetime_set_from_unixtime
                                                        (rasqal_xsd_datetime *dt,
                                                         time_t clock);

Set an XSD dateTime from unixtime seconds

dt :

date time

clock :

unix time in seconds

Returns :

non-0 on failure

rasqal_xsd_datetime_to_counted_string ()

char *              rasqal_xsd_datetime_to_counted_string
                                                        (const rasqal_xsd_datetime *dt,
                                                         size_t *len_p);

Convert a rasqal_xsd_datetime struct to a xsd:dateTime lexical form counted string.

Caller should rasqal_free_memory() the returned string.

dt :

datetime struct

len_p :

output length (or NULL)

Returns :

lexical form string or NULL on failure.

rasqal_xsd_datetime_to_string ()

char *              rasqal_xsd_datetime_to_string       (const rasqal_xsd_datetime *dt);

Convert a rasqal_xsd_datetime struct to a xsd:dateTime lexical form string.

Caller should rasqal_free_memory() the returned string.

dt :

datetime struct

Returns :

lexical form string or NULL on failure.

rasqal_free_xsd_decimal ()

void                rasqal_free_xsd_decimal             (rasqal_xsd_decimal *dec);

Destroy XSD Decimal object.

dec :

Decimal object

rasqal_new_xsd_decimal ()

rasqal_xsd_decimal *  rasqal_new_xsd_decimal            (rasqal_world *world);

Create a new XSD Decimal object.

world :

rasqal world object

Returns :

new xsd:decimal object or NULL on failure.

rasqal_xsd_decimal

typedef struct rasqal_xsd_decimal_s rasqal_xsd_decimal;

Rasqal XSD Decimal class.


rasqal_xsd_decimal_abs ()

int                 rasqal_xsd_decimal_abs              (rasqal_xsd_decimal *result,
                                                         rasqal_xsd_decimal *a);

Return the absolute value of an XSD Decimal

result :

result variable

a :

argment decimal

Returns :

non-0 on failure

rasqal_xsd_decimal_add ()

int                 rasqal_xsd_decimal_add              (rasqal_xsd_decimal *result,
                                                         rasqal_xsd_decimal *a,
                                                         rasqal_xsd_decimal *b);

Add two XSD Decimals and store in result XSD Decimal

result :

result variable

a :

argment decimal 1

b :

argument decimal 2

Returns :

non-0 on failure

rasqal_xsd_decimal_as_counted_string ()

char *              rasqal_xsd_decimal_as_counted_string
                                                        (rasqal_xsd_decimal *dec,
                                                         size_t *len_p);

Get an XSD Decimal as a string lexical form with optional length.

The returned string is shared and owned by the dec object and must be copied. If len_p is not NULL, the length of the returned string is stored.

dec :

XSD Decimal

len_p :

pointer to length variable (or NULL)

Returns :

lexical form string or NULL on failure.

rasqal_xsd_decimal_as_string ()

char *              rasqal_xsd_decimal_as_string        (rasqal_xsd_decimal *dec);

Get an XSD Decimal as a string lexical form.

The returned string is shared and owned by the dec object and must be copied.

dec :

XSD Decimal

Returns :

lexical form string or NULL on failure.

rasqal_xsd_decimal_ceil ()

int                 rasqal_xsd_decimal_ceil             (rasqal_xsd_decimal *result,
                                                         rasqal_xsd_decimal *a);

Return the number with no fractional part closes to argument for an XSD Decimal

result :

result variable

a :

argment decimal

Returns :

non-0 on failure

rasqal_xsd_decimal_compare ()

int                 rasqal_xsd_decimal_compare          (rasqal_xsd_decimal *a,
                                                         rasqal_xsd_decimal *b);

Compare two XSD Decimals

a :

first XSD decimal

b :

second XSD decimal

Returns :

<0 if a is less than b, 0 if equal, >1 otherwise

rasqal_xsd_decimal_divide ()

int                 rasqal_xsd_decimal_divide           (rasqal_xsd_decimal *result,
                                                         rasqal_xsd_decimal *a,
                                                         rasqal_xsd_decimal *b);

Divide two XSD Decimals and store in result XSD Decimal

If the divisor b is 0, failure is returned

result :

result variable

a :

argment decimal 1

b :

argument decimal 2

Returns :

non-0 on failure

rasqal_xsd_decimal_equals ()

int                 rasqal_xsd_decimal_equals           (rasqal_xsd_decimal *a,
                                                         rasqal_xsd_decimal *b);

Compare two XSD Decimals for equality.

a :

first XSD Decimal

b :

second XSD Decimal

Returns :

non-0 if equal.

rasqal_xsd_decimal_floor ()

int                 rasqal_xsd_decimal_floor            (rasqal_xsd_decimal *result,
                                                         rasqal_xsd_decimal *a);

Return the number with no fractional part closes to argument for an XSD Decimal

result :

result variable

a :

argment decimal

Returns :

non-0 on failure

rasqal_xsd_decimal_get_double ()

double              rasqal_xsd_decimal_get_double       (rasqal_xsd_decimal *dec);

Get an XSD Decimal as a double (may lose precision)

dec :

XSD Decimal

Returns :

double value.

rasqal_xsd_decimal_get_long ()

long                rasqal_xsd_decimal_get_long         (rasqal_xsd_decimal *dec,
                                                         int *error_p);

Get an XSD Decimal as a long (may lose precision)

dec :

XSD Decimal

error_p :

pointer to error flag

Returns :

long value or 0 on failure and *error_p is non-0

rasqal_xsd_decimal_is_zero ()

int                 rasqal_xsd_decimal_is_zero          (rasqal_xsd_decimal *d);

Test if an XSD decimal is zero.

d :

decimal

Returns :

non-0 if decimal is zero

rasqal_xsd_decimal_multiply ()

int                 rasqal_xsd_decimal_multiply         (rasqal_xsd_decimal *result,
                                                         rasqal_xsd_decimal *a,
                                                         rasqal_xsd_decimal *b);

Multiply two XSD Decimals and store in result XSD Decimal

result :

result variable

a :

argment decimal 1

b :

argument decimal 2

Returns :

non-0 on failure

rasqal_xsd_decimal_negate ()

int                 rasqal_xsd_decimal_negate           (rasqal_xsd_decimal *result,
                                                         rasqal_xsd_decimal *a);

Negate an XSD Decimal

result :

result variable

a :

argment decimal

Returns :

non-0 on failure

rasqal_xsd_decimal_print ()

int                 rasqal_xsd_decimal_print            (rasqal_xsd_decimal *dec,
                                                         FILE *stream);

Print an XSD Decimal to a stream

dec :

XSD Decimal object

stream :

FILE* handle to print to

Returns :

non-0 on failure

rasqal_xsd_decimal_round ()

int                 rasqal_xsd_decimal_round            (rasqal_xsd_decimal *result,
                                                         rasqal_xsd_decimal *a);

Return the number with no fractional part closes to argument for an XSD Decimal

result :

result variable

a :

argment decimal

Returns :

non-0 on failure

rasqal_xsd_decimal_set_double ()

int                 rasqal_xsd_decimal_set_double       (rasqal_xsd_decimal *dec,
                                                         double d);

Set an XSD Decimal value from a double.

dec :

XSD Decimal

d :

double

Returns :

non-0 on failure

rasqal_xsd_decimal_set_long ()

int                 rasqal_xsd_decimal_set_long         (rasqal_xsd_decimal *dec,
                                                         long l Param2);

Set an XSD Decimal value from a long.

dec :

XSD Decimal

Returns :

non-0 on failure

rasqal_xsd_decimal_set_string ()

int                 rasqal_xsd_decimal_set_string       (rasqal_xsd_decimal *dec,
                                                         const char *string);

Set an XSD Decimal value from a string lexical form

dec :

XSD Decimal

string :

lexical form

Returns :

non-0 on failure

rasqal_xsd_decimal_subtract ()

int                 rasqal_xsd_decimal_subtract         (rasqal_xsd_decimal *result,
                                                         rasqal_xsd_decimal *a,
                                                         rasqal_xsd_decimal *b);

Subtract two XSD Decimals and store in result XSD Decimal

result :

result variable

a :

argment decimal 1

b :

argument decimal 2

Returns :

non-0 on failure