[T106][ZXW-22]7520V3SCV2.01.01.02P42U09_VEC_V0.8_AP_VEC origin source commit

Change-Id: Ic6e05d89ecd62fc34f82b23dcf306c93764aec4b
diff --git a/ap/app/goahead/server/h.c b/ap/app/goahead/server/h.c
new file mode 100755
index 0000000..228b162
--- /dev/null
+++ b/ap/app/goahead/server/h.c
@@ -0,0 +1,146 @@
+#ifdef UEMF
+	#include	"uemf.h"
+#else
+	#include	"basic/basicInternal.h"
+#endif
+
+
+#define H_LEN		0		
+#define H_USED		1		
+#define H_OFFSET	2		
+#define H_INCR		16		
+
+
+int hFree(void ***map, int handle)
+{
+	int 	len;
+	int		*mp;	
+
+	a_assert(map);
+	mp = &((*(int**)map)[-H_OFFSET]);
+	a_assert(mp[H_LEN] >= H_INCR);
+
+	a_assert(mp[handle + H_OFFSET]);
+	a_assert(mp[H_USED]);
+	mp[handle + H_OFFSET] = 0;
+	if (--(mp[H_USED]) == 0) {
+		bfree(B_L, (void*) mp);
+		*map = NULL;
+	}
+
+
+	if (*map == NULL) {
+		handle = -1;
+	} else {
+		len = mp[H_LEN];
+		if (mp[H_USED] < mp[H_LEN]) {
+			for (handle = len - 1; handle >= 0; handle--) {
+				if (mp[handle + H_OFFSET])
+					break;
+			}
+		} else {
+			handle = len;
+		}
+	}
+	return handle + 1;
+}
+
+
+#ifdef B_STATS
+int HALLOC(B_ARGS_DEC, void ***map)
+#else
+int hAlloc(void ***map)
+#endif
+{
+	int		handle, len, memsize, incr;
+	int		*mp;
+
+	a_assert(map);
+
+	if (*map == NULL) {
+		incr = H_INCR;
+		memsize = (incr + H_OFFSET) * sizeof(void**);
+#ifdef B_STATS
+		if ((mp = (int*) balloc(B_ARGS, memsize)) == NULL) {
+#else
+		if ((mp = (int*) balloc(B_L, memsize)) == NULL) {
+#endif
+			return -1;
+		}
+		memset(mp, 0, memsize);
+		mp[H_LEN] = incr;
+		mp[H_USED] = 0;
+		*map = (void**) &mp[H_OFFSET];
+	} else {
+		mp = &((*(int**)map)[-H_OFFSET]);
+	}
+
+	len = mp[H_LEN];
+
+
+	if (mp[H_USED] < mp[H_LEN]) {
+		for (handle = 0; handle < len; handle++) {
+			if (mp[handle+H_OFFSET] == 0) {
+				mp[H_USED]++;
+				return handle;
+			}
+		}
+	} else {
+		handle = len;
+	}
+
+	len += H_INCR;
+	memsize = (len + H_OFFSET) * sizeof(void**);
+	if ((mp = (int*) brealloc(B_L, (void*) mp, memsize)) == NULL) {
+		return -1;
+	}
+	*map = (void**) &mp[H_OFFSET];
+	mp[H_LEN] = len;
+    memset(&mp[H_OFFSET + len - H_INCR], 0, sizeof(int) * H_INCR);
+
+	mp[H_USED]++;
+	return handle;
+}
+
+
+#ifdef B_STATS
+int HALLOCENTRY(B_ARGS_DEC, void ***list, int *max, int size)
+#else
+int hAllocEntry(void ***list, int *max, int size)
+#endif
+{
+	int		id;
+	char_t	*cp;
+
+	a_assert(list);
+	a_assert(max);
+
+#ifdef B_STATS
+	if ((id = HALLOC(B_ARGS, (void***) list)) < 0) {
+#else
+	if ((id = hAlloc((void***) list)) < 0) {
+#endif
+		return -1;
+	}
+
+	if (size > 0) {
+#ifdef B_STATS
+		if ((cp = balloc(B_ARGS, size)) == NULL) {
+#else
+		if ((cp = balloc(B_L, size)) == NULL) {
+#endif
+			hFree(list, id);
+			return -1;
+		}
+		a_assert(cp);
+		memset(cp, 0, size);
+
+		(*list)[id] = (void*) cp;
+	}
+
+	if (id >= *max) {
+		*max = id + 1;
+	}
+	return id;
+}
+