summaryrefslogtreecommitdiffstats
path: root/Stash.xs
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2010-11-12 04:09:54 -0600
committerJesse Luehrs <doy@tozt.net>2010-11-12 04:09:54 -0600
commit9b608466b5fdd9e91e34e050eb9ca861e36aa71d (patch)
tree19ab0857a9373bfab7131a2de1fb5fc0b08b15f4 /Stash.xs
parenta382a84ba7f959ceab7ecbf75e7c937153ebb603 (diff)
downloadpackage-stash-xs-9b608466b5fdd9e91e34e050eb9ca861e36aa71d.tar.gz
package-stash-xs-9b608466b5fdd9e91e34e050eb9ca861e36aa71d.zip
implement list_all_package_symbols
Diffstat (limited to 'Stash.xs')
-rw-r--r--Stash.xs58
1 files changed, 58 insertions, 0 deletions
diff --git a/Stash.xs b/Stash.xs
index d7eecc7..07c0238 100644
--- a/Stash.xs
+++ b/Stash.xs
@@ -199,3 +199,61 @@ remove_package_glob(self, name)
HV *namespace;
CODE:
hv_delete(_get_namespace(self), name, strlen(name), G_DISCARD);
+
+void
+list_all_package_symbols(self, vartype=VAR_NONE)
+ SV *self
+ vartype_t vartype
+ PPCODE:
+ if (vartype == VAR_NONE) {
+ HV *namespace;
+ HE *entry;
+ int keys;
+
+ namespace = _get_namespace(self);
+ keys = hv_iterinit(namespace);
+ EXTEND(SP, keys);
+ while (entry = hv_iternext(namespace)) {
+ mPUSHs(newSVhek(HeKEY_hek(entry)));
+ }
+ }
+ else {
+ HV *namespace;
+ HE *entry;
+ SV *val;
+ char *key;
+ int len;
+
+ namespace = _get_namespace(self);
+ hv_iterinit(namespace);
+ while (val = hv_iternextsv(namespace, &key, &len)) {
+ GV *gv = (GV*)val;
+ if (isGV(gv)) {
+ switch (vartype) {
+ case VAR_SCALAR:
+ if (GvSV(val))
+ mXPUSHp(key, len);
+ break;
+ case VAR_ARRAY:
+ if (GvAV(val))
+ mXPUSHp(key, len);
+ break;
+ case VAR_HASH:
+ if (GvHV(val))
+ mXPUSHp(key, len);
+ break;
+ case VAR_CODE:
+ if (GvCVu(val))
+ mXPUSHp(key, len);
+ break;
+ case VAR_IO:
+ if (GvIO(val))
+ mXPUSHp(key, len);
+ break;
+ }
+ }
+ else if (vartype == VAR_CODE) {
+ mXPUSHp(key, len);
+ }
+ }
+ }