237 lines
6.4 KiB
Plaintext
237 lines
6.4 KiB
Plaintext
|
/*
|
||
|
** 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
|
||
|
|