Prima
view release on metacpan or search on metacpan
class/Utils.c view on Meta::CPAN
SV*
Utils_read_dir(SV * dh)
{
PDirHandleRec d;
char buf[PATH_MAX_UTF8];
SV * ret;
if (( d = get_dh("read_dir", dh)) == NULL ) {
errno = EBADF;
warn("Prima::Utils::read_dir: invalid dirhandle");
return NULL_SV;
}
if (!d-> is_active) {
errno = EBADF;
return NULL_SV;
}
if ( !apc_fs_readdir(d, buf)) return NULL_SV;
ret = newSVpv(buf, 0);
if (is_valid_utf8((unsigned char*) buf, -1))
SvUTF8_on(ret);
return ret;
}
Bool
Utils_rename( SV* oldpath, SV * newpath )
{
return apc_fs_rename(
SvPV_nolen(oldpath), prima_is_utf8_sv(oldpath),
SvPV_nolen(newpath), prima_is_utf8_sv(newpath)
);
}
Bool
Utils_rewinddir( SV * dh )
{
PDirHandleRec d;
if (( d = get_dh("rewinddir", dh)) == NULL )
return false;
return apc_fs_rewinddir(d);
}
Bool
Utils_rmdir( SV* path )
{
return apc_fs_rmdir( SvPV_nolen(path), prima_is_utf8_sv(path));
}
Bool
Utils_seekdir( SV * dh, long position )
{
PDirHandleRec d;
if (( d = get_dh("seekdir", dh)) == NULL )
return false;
return apc_fs_seekdir(d, position);
}
Bool
Utils_setenv(SV * varname, SV * value)
{
return apc_fs_setenv(
SvPV_nolen(varname), prima_is_utf8_sv(varname),
SvOK(value) ? SvPV_nolen(value) : NULL,
SvOK(value) ? prima_is_utf8_sv(value) : false
);
}
XS(Utils_stat_FROMPERL) {
dXSARGS;
char *name;
StatRec stats;
int ok;
Bool link = false;
U8 gimme;
if ( items > 2)
croak( "invalid usage of Prima::Utils::stat");
if ( items > 1 )
link = SvBOOL(ST(1));
name = SvPV_nolen( ST( 0));
ok = apc_fs_stat( name, prima_is_utf8_sv(ST(0)), link, &stats);
SPAGAIN;
SP -= items;
gimme = GIMME_V;
if ( gimme != G_ARRAY ) {
if ( gimme != G_VOID )
XPUSHs(sv_2mortal(newSViv(ok)));
} else if ( ok) {
EXTEND( sp, 11 );
PUSHs( sv_2mortal(newSVuv( stats. dev )));
PUSHs( sv_2mortal(newSVuv( stats. ino )));
PUSHs( sv_2mortal(newSVuv( stats. mode )));
PUSHs( sv_2mortal(newSVuv( stats. nlink )));
PUSHs( sv_2mortal(newSVuv( stats. uid )));
PUSHs( sv_2mortal(newSVuv( stats. gid )));
PUSHs( sv_2mortal(newSVuv( stats. rdev )));
PUSHs( sv_2mortal(newSVuv( stats. size )));
PUSHs( sv_2mortal(newSVnv( stats. atim )));
PUSHs( sv_2mortal(newSVnv( stats. mtim )));
PUSHs( sv_2mortal(newSVnv( stats. ctim )));
if (stats. blksize >= 0 )
XPUSHs( sv_2mortal(newSVuv( stats. blksize)));
if (stats. blocks >= 0 )
XPUSHs( sv_2mortal(newSVuv( stats. blocks )));
}
PUTBACK;
return;
}
static int
utf8len( const char * utf8, int maxlen)
{
int ulen = 0;
while ( maxlen > 0 ) {
const char *u = (char*) utf8_hop(( U8*) utf8, 1);
ulen++;
maxlen -= u - utf8;
utf8 = u;
}
return ulen;
( run in 0.688 second using v1.01-cache-2.11-cpan-39bf76dae61 )