⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 av_charptrptr.c

📁 适合于Unix/Linux下的一个持久数据库连接池
💻 C
字号:
#include "EXTERN.h"#include "perl.h"#include "XSUB.h"#include "Av_CharPtrPtr.h"#ifndef na	#define na PL_na#endif/* Used by the INPUT typemap for char**. * Will convert a Perl AV* (containing strings) to a C char**. */char **XS_unpack_charPtrPtr(SV *rv ){	AV *av;	SV **ssv;	char **s;	int avlen;	int x;	if( SvROK( rv ) && (SvTYPE(SvRV(rv)) == SVt_PVAV) )		av = (AV*)SvRV(rv);	else {		warn("XS_unpack_charPtrPtr: rv was not an AV ref");		return( (char**)NULL );	}	/* is it empty? */	avlen = av_len(av);	if( avlen < 0 ){		warn("XS_unpack_charPtrPtr: array was empty");		return( (char**)NULL );	}	/* av_len+2 == number of strings, plus 1 for an end-of-array sentinel.	 */	s = (char **)safemalloc( sizeof(char*) * (avlen + 2) );	if( s == NULL ){		warn("XS_unpack_charPtrPtr: unable to malloc char**");		return( (char**)NULL );	}	for( x = 0; x <= avlen; ++x ){		ssv = av_fetch( av, x, 0 );		if( ssv != NULL ){			if( SvPOK( *ssv ) ){				s[x] = (char *)safemalloc( SvCUR(*ssv) + 1 );				if( s[x] == NULL )					warn("XS_unpack_charPtrPtr: unable to malloc char*");				else					strcpy( s[x], SvPV( *ssv, na ) );			}			else				warn("XS_unpack_charPtrPtr: array elem %d was not a string.", x );		}		else			s[x] = (char*)NULL;	}	s[x] = (char*)NULL; /* sentinel */	return( s );}/* Used by the OUTPUT typemap for char**. * Will convert a C char** to a Perl AV*. */voidXS_pack_charPtrPtr(SV *st, char **s){	AV *av = newAV();	SV *sv;	char **c;	for( c = s; *c != NULL; ++c ){		sv = newSVpv( *c, 0 );		av_push( av, sv );	}	sv = newSVrv( st, NULL );	/* upgrade stack SV to an RV */	SvREFCNT_dec( sv );	/* discard */	SvRV( st ) = (SV*)av;	/* make stack RV point at our AV */}/* cleanup the temporary char** from XS_unpack_charPtrPtr */voidXS_release_charPtrPtr(char **s){	char **c;	for( c = s; *c != NULL; ++c )		safefree( *c );	safefree( s );}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -