optimization when freeing hash tables. some tuning of buffer allocations

* dict.c hash.c: optimization when freeing hash tables.
* parser.c xmlIO.c include/libxml/tree.h: some tuning of buffer
  allocations
* parser.c parserInternals.c include/libxml/parser.h: keep a
  single allocated block for all the attributes callbacks,
  avoid useless malloc()/free()
* tree.c: do not realloc() when growing a buffer if the buffer
  ain't full, malloc/memcpy/free avoid copying memory.
Daniel
diff --git a/xmlIO.c b/xmlIO.c
index 715cec5..83907f9 100644
--- a/xmlIO.c
+++ b/xmlIO.c
@@ -1574,7 +1574,7 @@
 	return(NULL);
     }
     memset(ret, 0, (size_t) sizeof(xmlParserInputBuffer));
-    ret->buffer = xmlBufferCreate();
+    ret->buffer = xmlBufferCreateSize(2 * xmlDefaultBufferSize);
     if (ret->buffer == NULL) {
         xmlFree(ret);
 	return(NULL);
@@ -1582,7 +1582,7 @@
     ret->buffer->alloc = XML_BUFFER_ALLOC_DOUBLEIT;
     ret->encoder = xmlGetCharEncodingHandler(enc);
     if (ret->encoder != NULL)
-        ret->raw = xmlBufferCreate();
+        ret->raw = xmlBufferCreateSize(2 * xmlDefaultBufferSize);
     else
         ret->raw = NULL;
     ret->readcallback = NULL;
@@ -2173,16 +2173,15 @@
     int buffree;
     unsigned int needSize;
 
-    if ((len <= MINLEN) && (len != 4)) 
+    if ((len <= MINLEN) && (len != 4))
         len = MINLEN;
+
     buffree = in->buffer->size - in->buffer->use;
     if (buffree <= 0) {
         xmlGenericError(xmlGenericErrorContext,
 		"xmlParserInputBufferGrow : buffer full !\n");
 	return(0);
     }
-    if (len > buffree) 
-        len = buffree;
 
     needSize = in->buffer->use + len + 1;
     if (needSize > in->buffer->size){