define ___pharglobals
	if basic_functions_module.zts
		set $tsrm_ls = ts_resource_ex(0, 0)
		set $pharglobals = ((zend_phar_globals) (*((void ***) $tsrm_ls))[phar_globals_id-1])
	else
		set $pharglobals = phar_globals
	end
end

define ____print_pharht
	set $ht = $arg0
	set $p = $ht.pListHead

	while $p != 0
		set $i = $ind
		while $i > 0
			printf "  "
			set $i = $i - 1
		end

		set $temp = *(phar_archive_data*)$p->pDataPtr
		____print_str $temp.fname $temp.fname_len
		printf " => "

		if $arg1 == 0

			printf "%i (alias ", $temp.refcount
			____print_str $temp.alias $temp.alias_len
			printf ")\n"
		end

		set $p = $p->pListNext
	end
end

define print_phar
	set $ind = 1
	___pharglobals
	printf "{"
	____print_pharht $pharglobals.phar_fname_map 0
	printf "}\n"
end

document display_phar_globals
	display phar globals
end

define display_phar_globals
	___pharglobals
	graph display $phar_globals.$arg0
end

define print_pharfp
	___pharglobals
	set $ht = $pharglobals.phar_fname_map
	set $p = $ht.pListHead
	set $fpcount = 0

	while $p != 0
		set $pharname = (*(phar_archive_data*)$p->pDataPtr).fname
		set $pharrefcount = (*(phar_archive_data*)$p->pDataPtr).refcount
		if (*(phar_archive_data*)$p->pDataPtr).fp != 0
			set $fpcount = $fpcount + 1
			printf "phar %s is open (%i)\n", $pharname, $pharrefcount
		end
		set $manifest = (*(phar_archive_data*)$p->pDataPtr).manifest
		set $m = $manifest.pListHead
		while $m != 0
			if (*(phar_entry_info *)$m->pData).fp
				set $fpcount = $fpcount + 1
				set $a = (*(phar_entry_info *)$m->pData).fp_refcount
				printf "phar %s file %s is open (%i)\n", $pharname, (*(phar_entry_info *)$m->pData).filename, $a
			end
			set $m = $m->pListNext
		end

		set $p = $p->pListNext
	end
	printf "Open file pointers: %d\n", $fpcount
end

document print_pharfp
	displays all open file pointers in phar, and the phars plus entries that are open with reference counts
end

define dump_entry
	___pharglobals
	set $ht = $pharglobals.phar_fname_map
	set $p = $ht.pListHead
	set $done = 0
	while $p != 0
		set $t = (*(phar_archive_data*)$p->pDataPtr)
		if $t.fname[0] == $arg0[0] || $t.alias[0] == $arg0[0]
			set $manifest = (*(phar_archive_data*)$p->pDataPtr).manifest
			set $m = $manifest.pListHead
			while $m != 0
				if (*(phar_entry_info *)$m->pData).filename[0] == $arg1[0]
					if $argc == 3
						output *((phar_entry_info *)$m->pData)->fp
					end
					if $argc == 2
						output *(phar_entry_info *)$m->pData
					end
					printf "\n"
					set $done = 1
					loop_break
				end
				set $m = $m->pListNext
			end
		end
		if $done == 1
			loop_break
		end
		set $p = $p->pListNext
	end
end

document dump_entry
	dump_entry "pharname"|"pharalias" "filename" [1]
	display phar_entry_info for a file within a phar.  If the optional third param
	is passed in, displays the php_stream that is the file's fp
end
