# gdb macros which may be useful for folks using gdb to debug
# apache.  Delete it if it bothers you.

define dump_table
    set $t = (apr_table_entry_t *)((apr_array_header_t *)$arg0)->elts
    set $n = ((apr_array_header_t *)$arg0)->nelts
    set $i = 0
    while $i < $n
	printf "[%u] '%s'='%s'\n", $i, $t[$i].key, $t[$i].val
	set $i = $i + 1
    end
end
document dump_table
    Print the key/value pairs in a table.
end


define rh
	run -f /home/dgaudet/ap2/conf/mpm.conf
end

define ro
	run -DONE_PROCESS
end

define dump_string_array
    set $a = (char **)((apr_array_header_t *)$arg0)->elts
    set $n = (int)((apr_array_header_t *)$arg0)->nelts
    set $i = 0
    while $i < $n
	printf "[%u] '%s'\n", $i, $a[$i]
	set $i = $i + 1
    end
end
document dump_string_array
    Print all of the elements in an array of strings.
end

define dump_bucket
    set $bucket = $arg0
    printf "bucket=%s(0x%lx), length=%ld, data=0x%lx\n", \
            $bucket->type->name, \
            (unsigned long)$bucket, (long)$bucket->length, \
            (unsigned long)$bucket->data
end
document dump_bucket
    Print bucket info
end

define dump_brigade
    set $bb = $arg0
    set $bucket = ((&((apr_bucket_brigade *)$bb)->list))->next
    set $sentinel = ((char *)((&(((apr_bucket_brigade *)$bb)->list)) \
                               - ((size_t) &((struct apr_bucket *)0)->link)))
    set $i = 0

    printf "dump of brigade 0x%lx\n", (unsigned long)$bb
    if $bucket == $sentinel
        printf "brigade is empty\n"
    end

    while $bucket != $sentinel
        printf "   %d: bucket=%s(0x%lx), length=%ld, data=0x%lx\n", \
                $i, $bucket->type->name, \
                (unsigned long)$bucket, (long)$bucket->length, \
                (unsigned long)$bucket->data
        set $i = $i + 1
        set $bucket = $bucket->link.next
    end
end
document dump_brigade
    Print bucket brigade info
end
