fix queue pattern (from chris@maryland)
[unix-history] / usr / src / usr.bin / window / wwalloc.c
index 4df747d..6a463f0 100644 (file)
@@ -1,36 +1,35 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)wwalloc.c   3.1 83/08/09";
+static char sccsid[] = "@(#)wwalloc.c  3.6 %G%";
 #endif
 
 #include "ww.h"
 
 char **
 #endif
 
 #include "ww.h"
 
 char **
-wwalloc(nrow, ncol, size)
+wwalloc(row, col, nrow, ncol, size)
 {
 {
-       register char **p;
+       register char *p, **pp;
        register int i;
 
        register int i;
 
-       p = (char **) malloc((unsigned) nrow * sizeof (char *));
-       if (p == 0)
+       /* fast, call malloc only once */
+       pp = (char **)
+               malloc((unsigned) sizeof (char **) * nrow + size * nrow * ncol);
+       if (pp == 0) {
+               wwerrno = WWE_NOMEM;
                return 0;
                return 0;
+       }
+       p = (char *)&pp[nrow];
+       col *= size;
+       size /= sizeof (char);          /* paranoid */
+       size *= ncol;
        for (i = 0; i < nrow; i++) {
        for (i = 0; i < nrow; i++) {
-               p[i] = malloc((unsigned) ncol * size);
-               if (p[i] == 0) {
-                       wwfree(p, i);
-                       return 0;
-               }
+               pp[i] = p - col;
+               p += size;
        }
        }
-       return p;
+       return pp - row;
 }
 
 }
 
-wwfree(p, nrow)
+wwfree(p, row)
 register char **p;
 {
 register char **p;
 {
-       register int i;
-
-       if (p == 0)
-               return;
-       for (i = 0; i < nrow; i++)
-               free(p[i]);
-       free((char *)p);
+       free((char *)(p + row));
 }
 }