/* ** OSSP uuid - Universally Unique Identifier ** Copyright (c) 2004-2007 Ralf S. Engelschall ** Copyright (c) 2004-2007 The OSSP Project ** ** 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