dynamic array functions
authorFabrice Bellard <fabrice@bellard.org>
Fri, 13 Jun 2003 14:22:23 +0000 (14:22 +0000)
committerFabrice Bellard <fabrice@bellard.org>
Fri, 13 Jun 2003 14:22:23 +0000 (14:22 +0000)
Originally committed as revision 1955 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/avformat.h
libavformat/cutils.c

index 3267cba..e7dab88 100644 (file)
@@ -428,6 +428,16 @@ int stristart(const char *str, const char *val, const char **ptr);
 void pstrcpy(char *buf, int buf_size, const char *str);
 char *pstrcat(char *buf, int buf_size, const char *s);
 
+void __dynarray_add(unsigned long **tab_ptr, int *nb_ptr, unsigned long elem);
+
+#define dynarray_add(tab, nb_ptr, elem)\
+do {\
+    typeof(tab) _tab = (tab);\
+    typeof(elem) _elem = (elem);\
+    (void)sizeof(**_tab == _elem); /* check that types are compatible */\
+    __dynarray_add((unsigned long **)_tab, nb_ptr, (unsigned long)_elem);\
+} while(0)
+
 struct in_addr;
 int resolve_host(struct in_addr *sin_addr, const char *hostname);
 
index 3e46533..28f40b0 100644 (file)
@@ -108,3 +108,24 @@ char *pstrcat(char *buf, int buf_size, const char *s)
 }
 
 #endif
+
+/* add one element to a dynamic array */
+void __dynarray_add(unsigned long **tab_ptr, int *nb_ptr, unsigned long elem)
+{
+    int nb, nb_alloc;
+    unsigned long *tab;
+
+    nb = *nb_ptr;
+    tab = *tab_ptr;
+    if ((nb & (nb - 1)) == 0) {
+        if (nb == 0)
+            nb_alloc = 1;
+        else
+            nb_alloc = nb * 2;
+        tab = av_realloc(tab, nb_alloc * sizeof(unsigned long));
+        *tab_ptr = tab;
+    }
+    tab[nb++] = elem;
+    *nb_ptr = nb;
+}
+