diff options
Diffstat (limited to 'shared/ossp_uuid/perl/uuid.xs')
-rw-r--r-- | shared/ossp_uuid/perl/uuid.xs | 236 |
1 files changed, 236 insertions, 0 deletions
diff --git a/shared/ossp_uuid/perl/uuid.xs b/shared/ossp_uuid/perl/uuid.xs new file mode 100644 index 00000000..a9ed41d2 --- /dev/null +++ b/shared/ossp_uuid/perl/uuid.xs @@ -0,0 +1,236 @@ +/* +** OSSP uuid - Universally Unique Identifier +** Copyright (c) 2004-2007 Ralf S. Engelschall <rse@engelschall.com> +** Copyright (c) 2004-2007 The OSSP Project <http://www.ossp.org/> +** +** This file is part of OSSP uuid, a library for the generation +** of UUIDs which can found at http://www.ossp.org/pkg/lib/uuid/ +** +** Permission to use, copy, modify, and distribute this software for +** any purpose with or without fee is hereby granted, provided that +** the above copyright notice and this permission notice appear in all +** copies. +** +** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED +** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR +** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +** SUCH DAMAGE. +** +** uuid.xs: Perl Binding (Perl/XS part) +*/ + +#include "uuid.h" + +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" + +MODULE = OSSP::uuid PACKAGE = OSSP::uuid + +void +constant(sv) + PREINIT: + dXSTARG; + STRLEN len; + int i; + static struct { + const char *name; + int value; + } constant_table[] = { + { "UUID_VERSION", UUID_VERSION }, + { "UUID_LEN_BIN", UUID_LEN_BIN }, + { "UUID_LEN_STR", UUID_LEN_STR }, + { "UUID_LEN_SIV", UUID_LEN_SIV }, + { "UUID_RC_OK", UUID_RC_OK }, + { "UUID_RC_ARG", UUID_RC_ARG }, + { "UUID_RC_MEM", UUID_RC_MEM }, + { "UUID_RC_SYS", UUID_RC_SYS }, + { "UUID_RC_INT", UUID_RC_INT }, + { "UUID_RC_IMP", UUID_RC_IMP }, + { "UUID_MAKE_V1", UUID_MAKE_V1 }, + { "UUID_MAKE_V3", UUID_MAKE_V3 }, + { "UUID_MAKE_V4", UUID_MAKE_V4 }, + { "UUID_MAKE_V5", UUID_MAKE_V5 }, + { "UUID_MAKE_MC", UUID_MAKE_MC }, + { "UUID_FMT_BIN", UUID_FMT_BIN }, + { "UUID_FMT_STR", UUID_FMT_STR }, + { "UUID_FMT_SIV", UUID_FMT_SIV }, + { "UUID_FMT_TXT", UUID_FMT_TXT } + }; + INPUT: + SV *sv; + const char *s = SvPV(sv, len); + PPCODE: + for (i = 0; i < sizeof(constant_table)/sizeof(constant_table[0]); i++) { + if (strcmp(s, constant_table[i].name) == 0) { + EXTEND(SP, 1); + PUSHs(&PL_sv_undef); + PUSHi(constant_table[i].value); + break; + } + } + if (i == sizeof(constant_table)/sizeof(constant_table[0])) { + sv = sv_2mortal(newSVpvf("unknown contant OSSP::uuid::%s", s)); + PUSHs(sv); + } + + +uuid_rc_t +uuid_create(uuid) + PROTOTYPE: + $ + INPUT: + uuid_t *&uuid = NO_INIT + CODE: + RETVAL = uuid_create(&uuid); + OUTPUT: + uuid + RETVAL + +uuid_rc_t +uuid_destroy(uuid) + PROTOTYPE: + $ + INPUT: + uuid_t *uuid + CODE: + RETVAL = uuid_destroy(uuid); + OUTPUT: + RETVAL + +uuid_rc_t +uuid_load(uuid,name) + PROTOTYPE: + $$ + INPUT: + uuid_t *uuid + const char *name + CODE: + RETVAL = uuid_load(uuid, name); + OUTPUT: + RETVAL + +uuid_rc_t +uuid_make(uuid,mode,...) + PROTOTYPE: + $$;$$ + INPUT: + uuid_t *uuid + unsigned int mode + PREINIT: + uuid_t *ns; + const char *name; + CODE: + if ((mode & UUID_MAKE_V3) || (mode & UUID_MAKE_V5)) { + if (items != 4) + croak("mode UUID_MAKE_V3/UUID_MAKE_V5 requires two additional arguments to uuid_make()"); + if (!SvROK(ST(2))) + croak("mode UUID_MAKE_V3/UUID_MAKE_V5 requires a UUID object as namespace"); + ns = INT2PTR(uuid_t *, SvIV((SV*)SvRV(ST(2)))); + name = (const char *)SvPV_nolen(ST(3)); + RETVAL = uuid_make(uuid, mode, ns, name); + } + else { + if (items != 2) + croak("invalid number of arguments to uuid_make()"); + RETVAL = uuid_make(uuid, mode); + } + OUTPUT: + RETVAL + +uuid_rc_t +uuid_isnil(uuid,result) + PROTOTYPE: + $$ + INPUT: + uuid_t *uuid + int &result = NO_INIT + CODE: + RETVAL = uuid_isnil(uuid, &result); + OUTPUT: + result + RETVAL + +uuid_rc_t +uuid_compare(uuid,uuid2,result) + PROTOTYPE: + $$$ + INPUT: + uuid_t *uuid + uuid_t *uuid2 + int &result = NO_INIT + CODE: + RETVAL = uuid_compare(uuid, uuid2, &result); + OUTPUT: + result + RETVAL + +uuid_rc_t +uuid_import(uuid,fmt,data_ptr,data_len) + PROTOTYPE: + $$$$ + INPUT: + uuid_t *uuid + uuid_fmt_t fmt + const void *data_ptr + size_t data_len + CODE: + if (ST(3) == &PL_sv_undef) + data_len = sv_len(ST(2)); + RETVAL = uuid_import(uuid, fmt, data_ptr, data_len); + OUTPUT: + RETVAL + +uuid_rc_t +uuid_export(uuid,fmt,data_ptr,data_len) + PROTOTYPE: + $$$$ + INPUT: + uuid_t *uuid + uuid_fmt_t fmt + void *&data_ptr = NO_INIT + size_t &data_len = NO_INIT + PPCODE: + data_ptr = NULL; + data_len = 0; + RETVAL = uuid_export(uuid, fmt, &data_ptr, &data_len); + if (RETVAL == UUID_RC_OK) { + if (fmt == UUID_FMT_SIV) + data_len = strlen((char *)data_ptr); + else if (fmt == UUID_FMT_STR || fmt == UUID_FMT_TXT) + data_len--; /* Perl doesn't wish NUL-termination on strings */ + sv_setpvn(ST(2), data_ptr, data_len); + free(data_ptr); + if (ST(3) != &PL_sv_undef) + sv_setuv(ST(3), (UV)data_len); + } + PUSHi((IV)RETVAL); + +char * +uuid_error(rc) + PROTOTYPE: + $ + INPUT: + uuid_rc_t rc + CODE: + RETVAL = uuid_error(rc); + OUTPUT: + RETVAL + +unsigned long +uuid_version() + PROTOTYPE: + INPUT: + CODE: + RETVAL = uuid_version(); + OUTPUT: + RETVAL + |