lua_udunits2 - Lua interface to the udunits2 library
ut = require('udunits2') uts = require('udunits2.system') utu = require('udunits2.unit') cv = require('udunits2.converter')
lua_udunits2 provides a Lua interface for the UCAR UDUNITS-2 units conversion library. Its documentation should be used to understand its basic functionality and use. This document describes only the Lua interface.
lua_udunits2 distinguishes between methods (which operate on
ut_system
, ut_unit
, or cv_converter
objects) and functions,
which do not. There is a small set of subroutines which may be
interpreted as being in either category; both functions and methods
are provided for those.
In most cases the names and arguments for the Lua routines are the same as for the C routines with the following changes:
The ut_
and cv_
prefixes have been removed.
Methods use the standard Lua method invocation, so
ut_unit* unit = ut_new_base_unit( system );
becomes
unit = system:new_base_unit()
Exceptions are noted in API CHANGES. See also PITFALLS.
UDUNITS-2 uses function return values and the ut_get_status()
function to obtain the status of the last call to the function. Some
functions return the status directly, others return a NULL
pointer
and the caller must use ut_get_status() to obtain further information.
The Lua interface strives to be a bit more Lua-like.
The Lua versions of UDUNITS-2 routines which return ut_status
return a boolean indicating success or failure, and in the case of
failure the status code and the value of the C system variable
errno
.
The Lua versions of UDUNITS-2 routines which return objects return
the object upon success; upon failure they return nil
,
the status code, and the value of the C system variable errno
.
The ut_get_status()
and ut_set_status
functions are still
available.
UDUNITS-2 supports user provided error message handlers. Lua
functions may be used as handlers, but the API is different. See the
documentation for set_error_message_handler
in API CHANGES
for more information.
The UDUNITS-2 library is exposed via four Lua modules. When
require
'd these modules are not inserted into the global symbol
table. So, do this:
ut = require('udunits')
not this:
require('udunits')
Only load a module to access its functions. Objects will
automatically find their methods. For example, in the following code,
it is not required to load udunits2.unit
for the unit1
object to
have access to the same_system()
method.
uts = require( 'udunits2.system' ) system = uts.new() unit1 = system:new_base_unit() unit2 = system:new_base_unit() unit1:same_system( unit 2)
udunits2
This module provides the following functions:
trim encode_date encode_clock encode_time decode_time get_status set_status set_error_message_handler (see below for API change) handle_error_message (see below for API change)
UDUNITS-2 provides a number of enumerated constants; these are
provided as integers with the UT_
prefix removed.
ASCII ISO_8859_1 LATIN1 UTF8
SUCCESS BAD_ARG EXISTS NO_UNIT OS NOT_SAME_SYSTEM MEANINGLESS NO_SECOND VISIT_ERROR CANT_FORMAT SYNTAX UNKNOWN OPEN_ARG OPEN_ENV OPEN_DEFAULT PARSE
NAMES DEFINITION
This module provides an additional function not available in UDUNITS-2:
boolean = isa( object, type )
returns true if object is a UDUNITS-2 object of the specified type. type is a string and may take one of the following values:
converter error_message_handler system unit
udunits2.system
This module provides the following functions:
new (same as ut_new_system() ) read_xml
and the following methods
add_name_prefix new_base_unit add_symbol_prefix new_dimensionless_unit get_dimensionless_unit_one parse get_unit_by_name unmap_name_to_unit get_unit_by_symbol unmap_symbol_to_unit
udunits2.unit
This module provides the following functions:
are_convertible compare divide get_converter multiply same_system
and the following methods:
are_convertible map_symbol_to_unit (API change) clone map_unit_to_name compare map_unit_to_symbol divide multiply format (API change) offset get_converter offset_by_time get_name raise get_symbol root get_system same_system invert scale (API change) is_dimensionless set_second log (API change) unmap_unit_to_name map_name_to_unit (API change) unmap_unit_to_symbol
Note that there is overlap between the methods and the functions.
udunits2.converter
This module provides the following functions:
combine get_galilean get_trivial get_converter get_inverse get_log get_scale get_pow get_offset
and the following methods:
combine convert get_expression
Note that there is overlap between the methods and the functions. The
cv_convert_float
and cv_convert_double
functions are coalesced
into the convert
method.
ut_map_name_to_unit
C: ut_map_name_to_unit( name, encoding, const unit) Lua: unit:map_name_to_unit( name, encoding )
ut_map_symbol_to_unit
C: ut_map_symbol_to_unit( symbol, encoding, const unit) Lua: unit:map_symbol_to_unit( symbol, encoding )
ut_scale
C: ut_scale( factor, unit ) Lua: unit:scale( factor )
ut_log
C: ut_log( base, unit ) Lua: unit:log( base )
ut_format
C: ut_format(unit, buf, size, opts) Lua: buf = unit:format( opts )
The output string is limited to 1023 bytes.
ut_handle_error_message
In Lua, pass a simple string
C: ut_handle_error_message(fmt, ...) Lua: handle_error_message( string )
ut_set_error_message_handler
In C, a pointer to a ut_error_message_handler
is passed and
returned.
In Lua, pass in one of the following:
stderr
Error messages are written to the standard error string (equivalent to
ut_write_to_stderr
).
ignore
Error messages are discarded (equivalent to ut_ignore
).
The function will be called with a single argument, the formatted error message string. Its length is limited to 1023 characters.
error_message_handler
objectThis must come from a previous call to set_error_message_handler
.
Any operations on such an object are meaningless.
set_error_message_handler
returns the last message handler set.
It may be either of the strings stderr
, ignore
, a Lua function,
or a special error_message_handler
object, which is used to
encapsulate arbitrary handlers set from C. No operations on this
object other than passing back to set_error_message_handler
are
defined.
cv_get_expression
C: cv_get_expression( converter, buf, max, variable ) Lua: buf = converter:get_expression( variable )
This package provides C side support for manipulating UDUNITS-2
objects on the Lua stack. This requires linking against the
lib_lua_udunits2
library.
The following functions are declared in lua_udunits2.h
:
UDUNITS-2
object onto the Lua stackluaut_push_udata_system(luaState *L, ut_system* obj, int is_lua_managed); luaut_push_udata_unit(luaState *L, ut_unit* obj, int is_lua_managed); luaut_push_udata_converter(luaState *L, cv_converter* obj, int is_lua_managed); luaut_push_udata_message_handler(luaState* L, ut_error_message_handler* obj, int is_lua_managed);
Pushes a UDUNITS-2
object pointer onto the Lua stack. If is_lua_managed
is non-zero then deallocation of the object will be handled by Lua.
UDUNITS-2
object from the Lua stackut_system* luaut_tosystem(L,idx); ut_unit* luaut_tounit(L,idx); cv_converter* luaut_toconverter(L,idx); ut_error_message_handler luaut_tomessage_handler(L,idx);
Return the UDUNITS-2
object pointer at the given stack location.
int luaut_is_system(L, idx); int luaut_is_unit(L, idx); int luaut_is_converter(L, idx); int luaut_is_message_handler(L, idx);
Return true if the object on the Lua stack at the given index is the specific type.
ut_system* luaut_check_system(L, narg); ut_unit* luaut_check_unit(L, narg); cv_converter* luaut_check_converter(L, narg); ut_error_message_handler* luaut_check_message_handler(L, narg);
Raise an error if the given function is not of the specified type,
else return the pointer to the object. Similar in spirit to the
luaL_check*
functions.
There is none. UDUNITS-2 stores some state in global variables. No attempt has been made to maintain consistency across multiple Lua threads or interpreters.
If multiple Lua interpreters call the library and one or more install
Lua functions as error message handlers, interpreters which have
not done so will throw an error when calling
set_error_message_handler
. This latter is a feature to prevent
confused code.
None of the visitor functionality has been exposed.
Conversions of arrays is not supported.
Diab Jerius, <djerius@cfa.harvard.edu>
Copyright (C) 2011 by the Smithsonian Astrophysical Observatory
This software is released under the GNU General Public License. You may find a copy at http://www.fsf.org/copyleft/gpl.html.