File: typemap

package info (click to toggle)
liblinux-fd-perl 0.017-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 716 kB
  • sloc: perl: 49; makefile: 8
file content (65 lines) | stat: -rw-r--r-- 2,143 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
TYPEMAP
Fd	T_FD
struct signalfd_siginfo	T_SIGFDINFO
sigset_t*	T_SIGSET
signo_t	T_SIGNO
struct timespec	T_TIMESPEC

INPUT
T_FD
	$var = PerlIO_fileno(IoOFP(sv_2io(SvRV($arg))))
T_SIGSET
	if (SvROK($arg)) {
		if (!sv_derived_from($arg, \"POSIX::SigSet\")) {
			Perl_croak(aTHX_ \"$var is not of type POSIX::SigSet\");
		} else {
	\x{23}if PERL_VERSION > 15 || PERL_VERSION == 15 && PERL_SUBVERSION > 2
			$var = (sigset_t *) SvPV_nolen(SvRV($arg));
	\x{23}else
			IV tmp = SvIV((SV*)SvRV($arg));
			$var = INT2PTR(sigset_t*, tmp);
	\x{23}endif
		}
	} else if (SvOK($arg)) {
		int signo = (SvIOK($arg) || looks_like_number($arg)) && SvIV($arg) ? SvIV($arg) : whichsig(SvPV_nolen($arg));
		SV* buffer = sv_2mortal(newSVpvn(\"\", 0));
		sv_grow(buffer, sizeof(sigset_t));
		$var = (sigset_t*)SvPV_nolen(buffer);
		sigemptyset($var);
		sigaddset($var, signo);
	} else {
		$var = NULL;
	}
T_SIGNO
	$var = (SvIOK($arg) || looks_like_number($arg)) && SvIV($arg) ? SvIV($arg) : whichsig(SvPV_nolen($arg));
T_TIMESPEC
	if (SvROK($arg) && sv_derived_from($arg, \"Time::Spec\")) {
		$var = *(struct timespec*)SvPV_nolen(SvRV($arg));
	} else {
		NV input = SvNV($arg);
		$var.tv_sec  = (time_t) floor(input);
		$var.tv_nsec = (long) ((input - $var.tv_sec) * 1000000000);
	}

OUTPUT
T_SIGFDINFO
	{
	HV* ret = newHV();
	hv_stores(ret, \"signo\", newSViv($var.ssi_signo));
	hv_stores(ret, \"code\", newSViv($var.ssi_code));
	hv_stores(ret, \"errno\", newSViv($var.ssi_errno));
	hv_stores(ret, \"pid\", newSVuv($var.ssi_pid));
	hv_stores(ret, \"uid\", newSVuv($var.ssi_uid));
	hv_stores(ret, \"fd\", newSViv($var.ssi_fd));
	hv_stores(ret, \"tid\", newSVuv($var.ssi_tid));
	hv_stores(ret, \"band\", newSVuv($var.ssi_band));
	hv_stores(ret, \"overrun\", newSVuv($var.ssi_overrun));
	hv_stores(ret, \"trapno\", newSVuv($var.ssi_trapno));
	hv_stores(ret, \"status\", newSViv($var.ssi_status));
	hv_stores(ret, \"value\", newSViv($var.ssi_int));
	hv_stores(ret, \"ptr\", newSVuv(PTR2UV($var.ssi_ptr)));
	hv_stores(ret, \"addr\", newSVuv(PTR2UV($var.ssi_addr)));
	$arg = newRV_noinc((SV*)ret);
	}
T_TIMESPEC
	sv_setnv($arg, $var.tv_sec + $var.tv_nsec / 1000000000.0);