POD2-IT

 view release on metacpan or  search on metacpan

IT/perlxstut.pod  view on Meta::CPAN

	    CODE:
		RETVAL = foo(a,b,c);
	    OUTPUT:
		RETVAL

In ogni caso, queste due XSUB forniscono un codice C generato praticamente
uguale: il compilatore B<xsubpp> E<egrave> abbastanza intelligente da intuire
la sezione C<CODE:> dalle prime due righe della descrizione XSUB. Che
dire della sezione C<OUTPUT:>? E<Egrave> assolutamente la stessa! Anche la
sezione C<OUTPUT:> puE<ograve> essere rimossa, I<sempre che le sezioni C<CODE:>
o C<PPCODE:> > non siano specificate: B<xsubpp> puE<ograve> quindi vedere che ha
bisogno di generare una sezione di chiamata a funzione, e genererE<agrave> anche
la sezione C<OUTPUT>. Per quanto detto, un'abbreviazione della XSUB
diventa:

	double
	foo(a,b,c)
		int             a
		long            b
		const char *    c

IT/perlxstut.pod  view on Meta::CPAN

Tornate nela directory MiaProva e aggiungete il seguente codice alla fine
di C<MiaProva.xs>:

	void
	statfs(path)
		char * path
	    INIT:
		int i;
		struct statfs buf;

	    PPCODE:
		i = statfs(path, &buf);
		if (i == 0) {
			XPUSHs(sv_2mortal(newSVnv(buf.f_bavail)));
			XPUSHs(sv_2mortal(newSVnv(buf.f_bfree)));
			XPUSHs(sv_2mortal(newSVnv(buf.f_blocks)));
			XPUSHs(sv_2mortal(newSVnv(buf.f_bsize)));
			XPUSHs(sv_2mortal(newSVnv(buf.f_ffree)));
			XPUSHs(sv_2mortal(newSVnv(buf.f_files)));
			XPUSHs(sv_2mortal(newSVnv(buf.f_type)));
			XPUSHs(sv_2mortal(newSVnv(buf.f_fsid[0])));

IT/perlxstut.pod  view on Meta::CPAN


=over 4

=item *

La direttiva C<INIT:> contiene codice che verrE<agrave> inserito immediatamente
dopo che lo stack degli argomenti viene decodificato. Il linguaggio C
non consente dichiarazioni di variaible in posizioni arbitrarie
all'interno di una funzione, per cui questa E<egrave> di norma la soluzione migliore
per dichiarare le variabili locali di cui la XSUB ha bisogno. (In
alternativa, E<egrave> possibile mettere l'intera sezione C<PPCODE:> in
parentesi graffe, ed aggiungere queste dichiarazioni all'inizio).

=item *

Questa routine restituisce anche un numero di argomenti differenti
dipendentemente dal fatto che la chiamata a C<statfs> abbia successo
o meno. Se ci sono errori, viene restituito il numero dell'errore
come unico elemento di un array. Se la chiamata ha successo, viene
restituito un array di 9 elementi. PoichE<eacute> questa funzione riceve un solo
argomento, abbiamo bisogno di fare spazio sullo stack per tenere i
9 valori che potrebbero essere restituiti.

Otteniamo tutto ciE<ograve> utilizzando la direttiva C<PPCODE:>, piuttosto che
la direttiva C<CODE:>. Questo indica a B<xsubpp> che utilizzeremo i
valori di ritorno che saranno messi sullo stack degli argomenti da noi
stessi.

=item *

Quando vogliamo inserire i valori da restituire al chiamante sullo stack,
utilizziamo qualla serie di marco che cominciano con C<XPUSH>. Ce ne sono
cinque versioni differenti a seconda dei tipi delle variabili: interi,
interi senza segno, I<double>, stringhe e scalari Perl. Nel nostro

IT/perlxstut.pod  view on Meta::CPAN

Ci sono un certo numero di concetti nuovi, descritti qui a seguire.

=over 4

=item *

Questa funzione non utilizza una C<typemap>. Al contrario, dichiariamo che
accetta un parametro C<SV*> (scalare), e che restituisce un valore C<SV*>;
ci prendiamo direttamente cura di questi scalari all'interno del codice.
PoichE<eacute> stiamo restituendo un solo valore, non abbiamo bisogno di una
direttiva C<PPCODE:> - al contrario, utilizziamo le direttive C<CODE:> e
C<OUTPUT:>.

=item *

Quando si ha a che fare con i riferimenti, E<egrave> importante trattarli con
cautela. Il blocco C<INIT:> prima di tutto si assicura che C<SvROK>
abbia valore vero, il che indica che C<paths> E<egrave> un riferimento valido.
Successivamente verifica che l'oggetto riferito da C<paths> sia un array,
utilizzando C<SvRV> per dereferenziarlo, e C<SvTYPE> per scoprire qual E<egrave>
il suo tipo. Come controllo addizionale verifica che l'array sia non



( run in 0.476 second using v1.01-cache-2.11-cpan-5511b514fd6 )