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 )