Move shared parts of the two printfs out.

Bug: http://b/67371539
Test: ran tests
Change-Id: I24eae6a5d2c64ff4fd65c8d508a3709bab5a11c4
diff --git a/libc/stdio/vfprintf.cpp b/libc/stdio/vfprintf.cpp
index fe2e338..a60b862 100644
--- a/libc/stdio/vfprintf.cpp
+++ b/libc/stdio/vfprintf.cpp
@@ -33,59 +33,7 @@
 
 #define CHAR_TYPE char
 #define FUNCTION_NAME __vfprintf
-
-#include <sys/mman.h>
-#include <sys/types.h>
-
-#include <errno.h>
-#include <float.h>
-#include <langinfo.h>
-#include <limits.h>
-#include <locale.h>
-#include <math.h>
-#include <stdarg.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <wchar.h>
-
-#include "fvwrite.h"
-#include "gdtoa.h"
-#include "local.h"
-
-union arg {
-  int intarg;
-  unsigned int uintarg;
-  long longarg;
-  unsigned long ulongarg;
-  long long longlongarg;
-  unsigned long long ulonglongarg;
-  ptrdiff_t ptrdiffarg;
-  size_t sizearg;
-  ssize_t ssizearg;
-  intmax_t intmaxarg;
-  uintmax_t uintmaxarg;
-  void* pvoidarg;
-  char* pchararg;
-  signed char* pschararg;
-  short* pshortarg;
-  int* pintarg;
-  long* plongarg;
-  long long* plonglongarg;
-  ptrdiff_t* pptrdiffarg;
-  ssize_t* pssizearg;
-  intmax_t* pintmaxarg;
-  double doublearg;
-  long double longdoublearg;
-  wint_t wintarg;
-  wchar_t* pwchararg;
-};
-
-static int __find_arguments(const CHAR_TYPE* fmt0, va_list ap, union arg** argtable, size_t* argtablesiz);
-static int __grow_type_table(unsigned char** typetable, int* tablesize);
+#include "printf_common.h"
 
 /*
  * Flush out all the vectors defined by the given uio,
@@ -105,35 +53,6 @@
 }
 
 /*
- * Helper function for `fprintf to unbuffered unix file': creates a
- * temporary buffer.  We only work on write-only files; this avoids
- * worries about ungetc buffers and so forth.
- */
-static int __sbprintf(FILE* fp, const CHAR_TYPE* fmt, va_list ap) {
-  FILE fake;
-  struct __sfileext fakeext;
-  unsigned char buf[BUFSIZ];
-
-  _FILEEXT_SETUP(&fake, &fakeext);
-  /* copy the important variables */
-  fake._flags = fp->_flags & ~__SNBF;
-  fake._file = fp->_file;
-  fake._cookie = fp->_cookie;
-  fake._write = fp->_write;
-
-  /* set up the buffer */
-  fake._bf._base = fake._p = buf;
-  fake._bf._size = fake._w = sizeof(buf);
-  fake._lbfsize = 0; /* not actually used, but Just In Case */
-
-  /* do the work, then copy any error status */
-  int ret = FUNCTION_NAME(&fake, fmt, ap);
-  if (ret >= 0 && __sflush(&fake)) ret = EOF;
-  if (fake._flags & __SERR) fp->_flags |= __SERR;
-  return (ret);
-}
-
-/*
  * Convert a wide character string argument for the %ls format to a multibyte
  * string representation. If not -1, prec specifies the maximum number of
  * bytes to output, and also means that we can't assume that the wide char
@@ -185,72 +104,7 @@
   return (convbuf);
 }
 
-#define DEFPREC 6
-
-#define to_digit(c) ((c) - '0')
-#define is_digit(c) ((unsigned)to_digit(c) <= 9)
-#define to_char(n) ((CHAR_TYPE)((n) + '0'))
-
-template <typename CharT>
-static int exponent(CharT* p0, int exp, int fmtch) {
-  CharT* p = p0;
-  *p++ = fmtch;
-  if (exp < 0) {
-    exp = -exp;
-    *p++ = '-';
-  } else {
-    *p++ = '+';
-  }
-
-  CharT expbuf[MAXEXPDIG];
-  CharT* t = expbuf + MAXEXPDIG;
-  if (exp > 9) {
-    do {
-      *--t = to_char(exp % 10);
-    } while ((exp /= 10) > 9);
-    *--t = to_char(exp);
-    for (; t < expbuf + MAXEXPDIG; *p++ = *t++) /* nothing */;
-  } else {
-    /*
-     * Exponents for decimal floating point conversions
-     * (%[eEgG]) must be at least two characters long,
-     * whereas exponents for hexadecimal conversions can
-     * be only one character long.
-     */
-    if (fmtch == 'e' || fmtch == 'E') *p++ = '0';
-    *p++ = to_char(exp);
-  }
-  return (p - p0);
-}
-
-/*
- * The size of the buffer we use as scratch space for integer
- * conversions, among other things.  Technically, we would need the
- * most space for base 10 conversions with thousands' grouping
- * characters between each pair of digits.  100 bytes is a
- * conservative overestimate even for a 128-bit uintmax_t.
- */
-#define BUF 100
-
-#define STATIC_ARG_TBL_SIZE 8 /* Size of static argument table. */
-
-/*
- * Flags used during conversion.
- */
-#define ALT 0x0001      /* alternate form */
-#define LADJUST 0x0004  /* left adjustment */
-#define LONGDBL 0x0008  /* long double */
-#define LONGINT 0x0010  /* long integer */
-#define LLONGINT 0x0020 /* long long integer */
-#define SHORTINT 0x0040 /* short integer */
-#define ZEROPAD 0x0080  /* zero (as opposed to blank) pad */
-#define FPT 0x0100      /* Floating point number */
-#define PTRINT 0x0200   /* (unsigned) ptrdiff_t */
-#define SIZEINT 0x0400  /* (signed) size_t */
-#define CHARINT 0x0800  /* 8 bit integer */
-#define MAXINT 0x1000   /* largest integer size (intmax_t) */
-
-int FUNCTION_NAME(FILE* fp, const CHAR_TYPE* fmt0, __va_list ap) {
+int FUNCTION_NAME(FILE* fp, const CHAR_TYPE* fmt0, va_list ap) {
   int ch;              /* character from fmt */
   int n, n2;           /* handy integers (short term usage) */
   CHAR_TYPE* cp;            /* handy char pointer (short term usage) */
@@ -337,23 +191,6 @@
       iovp = iov;                         \
     }                                     \
   } while (0)
-#define PAD(howmany, with)     \
-  do {                         \
-    if ((n = (howmany)) > 0) { \
-      while (n > PADSIZE) {    \
-        PRINT(with, PADSIZE);  \
-        n -= PADSIZE;          \
-      }                        \
-      PRINT(with, n);          \
-    }                          \
-  } while (0)
-#define PRINTANDPAD(p, ep, len, with)       \
-  do {                                      \
-    n2 = (ep) - (p);                        \
-    if (n2 > (len)) n2 = (len);             \
-    if (n2 > 0) PRINT((p), n2);             \
-    PAD((len) - (n2 > 0 ? n2 : 0), (with)); \
-  } while (0)
 #define FLUSH()                                          \
   do {                                                   \
     if (uio.uio_resid && __sprint(fp, &uio)) goto error; \
@@ -361,87 +198,6 @@
     iovp = iov;                                          \
   } while (0)
 
-  /*
-   * To extend shorts properly, we need both signed and unsigned
-   * argument extraction methods.
-   */
-#define SARG()                                                                               \
-  ((intmax_t)(flags & MAXINT                                                                 \
-                  ? GETARG(intmax_t)                                                         \
-                  : flags & LLONGINT                                                         \
-                        ? GETARG(long long)                                                  \
-                        : flags & LONGINT                                                    \
-                              ? GETARG(long)                                                 \
-                              : flags & PTRINT                                               \
-                                    ? GETARG(ptrdiff_t)                                      \
-                                    : flags & SIZEINT                                        \
-                                          ? GETARG(ssize_t)                                  \
-                                          : flags & SHORTINT                                 \
-                                                ? (short)GETARG(int)                         \
-                                                : flags & CHARINT ? (signed char)GETARG(int) \
-                                                                  : GETARG(int)))
-#define UARG()                                                                                \
-  ((uintmax_t)(flags & MAXINT                                                                 \
-                   ? GETARG(uintmax_t)                                                        \
-                   : flags & LLONGINT                                                         \
-                         ? GETARG(unsigned long long)                                         \
-                         : flags & LONGINT                                                    \
-                               ? GETARG(unsigned long)                                        \
-                               : flags & PTRINT ? (uintptr_t)GETARG(ptrdiff_t) : /* XXX */    \
-                                     flags & SIZEINT                                          \
-                                         ? GETARG(size_t)                                     \
-                                         : flags & SHORTINT                                   \
-                                               ? (unsigned short)GETARG(int)                  \
-                                               : flags & CHARINT ? (unsigned char)GETARG(int) \
-                                                                 : GETARG(unsigned int)))
-
-  /*
-   * Append a digit to a value and check for overflow.
-   */
-#define APPEND_DIGIT(val, dig)                            \
-  do {                                                    \
-    if ((val) > INT_MAX / 10) goto overflow;              \
-    (val) *= 10;                                          \
-    if ((val) > INT_MAX - to_digit((dig))) goto overflow; \
-    (val) += to_digit((dig));                             \
-  } while (0)
-
-  /*
-   * Get * arguments, including the form *nn$.  Preserve the nextarg
-   * that the argument can be gotten once the type is determined.
-   */
-#define GETASTER(val)                                                     \
-  n2 = 0;                                                                 \
-  cp = fmt;                                                               \
-  while (is_digit(*cp)) {                                                 \
-    APPEND_DIGIT(n2, *cp);                                                \
-    cp++;                                                                 \
-  }                                                                       \
-  if (*cp == '$') {                                                       \
-    int hold = nextarg;                                                   \
-    if (argtable == NULL) {                                               \
-      argtable = statargtable;                                            \
-      if (__find_arguments(fmt0, orgap, &argtable, &argtablesiz) == -1) { \
-        ret = -1;                                                         \
-        goto error;                                                       \
-      }                                                                   \
-    }                                                                     \
-    nextarg = n2;                                                         \
-    val = GETARG(int);                                                    \
-    nextarg = hold;                                                       \
-    fmt = ++cp;                                                           \
-  } else {                                                                \
-    val = GETARG(int);                                                    \
-  }
-
-/*
- * Get the argument indexed by nextarg.   If the argument table is
- * built, use it to get the argument.  If its not, get the next
- * argument (and arguments must be gotten sequentially).
- */
-#define GETARG(type) \
-  ((argtable != NULL) ? *((type*)(&argtable[nextarg++])) : (nextarg++, va_arg(ap, type)))
-
   _SET_ORIENTATION(fp, -1);
 
   // Writing "" to a read only file returns EOF, not 0.
@@ -1009,422 +765,3 @@
   }
   return (ret);
 }
-
-/*
- * Type ids for argument type table.
- */
-#define T_UNUSED 0
-#define T_SHORT 1
-#define T_U_SHORT 2
-#define TP_SHORT 3
-#define T_INT 4
-#define T_U_INT 5
-#define TP_INT 6
-#define T_LONG 7
-#define T_U_LONG 8
-#define TP_LONG 9
-#define T_LLONG 10
-#define T_U_LLONG 11
-#define TP_LLONG 12
-#define T_DOUBLE 13
-#define T_LONG_DOUBLE 14
-#define TP_CHAR 15
-#define TP_VOID 16
-#define T_PTRINT 17
-#define TP_PTRINT 18
-#define T_SIZEINT 19
-#define T_SSIZEINT 20
-#define TP_SSIZEINT 21
-#define T_MAXINT 22
-#define T_MAXUINT 23
-#define TP_MAXINT 24
-#define T_CHAR 25
-#define T_U_CHAR 26
-#define T_WINT 27
-#define TP_WCHAR 28
-
-/*
- * Find all arguments when a positional parameter is encountered.  Returns a
- * table, indexed by argument number, of pointers to each arguments.  The
- * initial argument table should be an array of STATIC_ARG_TBL_SIZE entries.
- * It will be replaced with a mmap-ed one if it overflows (malloc cannot be
- * used since we are attempting to make snprintf thread safe, and alloca is
- * problematic since we have nested functions..)
- */
-static int __find_arguments(const CHAR_TYPE* fmt0, va_list ap, union arg** argtable,
-                            size_t* argtablesiz) {
-  int ch;                   /* character from fmt */
-  int n, n2;                /* handy integer (short term usage) */
-  int flags;                /* flags as above */
-  unsigned char* typetable; /* table of types */
-  unsigned char stattypetable[STATIC_ARG_TBL_SIZE];
-  int tablesize; /* current size of type table */
-  int tablemax;  /* largest used index in table */
-  int nextarg;   /* 1-based argument index */
-  int ret = 0;   /* return value */
-
-  /*
-   * Add an argument type to the table, expanding if necessary.
-   */
-#define ADDTYPE(type)                                                      \
-  ((nextarg >= tablesize) ? __grow_type_table(&typetable, &tablesize) : 0, \
-   (nextarg > tablemax) ? tablemax = nextarg : 0, typetable[nextarg++] = type)
-
-#define ADDSARG()                                                                             \
-  ((flags & MAXINT)                                                                           \
-       ? ADDTYPE(T_MAXINT)                                                                    \
-       : ((flags & PTRINT) ? ADDTYPE(T_PTRINT)                                                \
-                           : ((flags & SIZEINT)                                               \
-                                  ? ADDTYPE(T_SSIZEINT)                                       \
-                                  : ((flags & LLONGINT)                                       \
-                                         ? ADDTYPE(T_LLONG)                                   \
-                                         : ((flags & LONGINT)                                 \
-                                                ? ADDTYPE(T_LONG)                             \
-                                                : ((flags & SHORTINT)                         \
-                                                       ? ADDTYPE(T_SHORT)                     \
-                                                       : ((flags & CHARINT) ? ADDTYPE(T_CHAR) \
-                                                                            : ADDTYPE(T_INT))))))))
-
-#define ADDUARG()                                                                  \
-  ((flags & MAXINT)                                                                \
-       ? ADDTYPE(T_MAXUINT)                                                        \
-       : ((flags & PTRINT)                                                         \
-              ? ADDTYPE(T_PTRINT)                                                  \
-              : ((flags & SIZEINT)                                                 \
-                     ? ADDTYPE(T_SIZEINT)                                          \
-                     : ((flags & LLONGINT)                                         \
-                            ? ADDTYPE(T_U_LLONG)                                   \
-                            : ((flags & LONGINT)                                   \
-                                   ? ADDTYPE(T_U_LONG)                             \
-                                   : ((flags & SHORTINT)                           \
-                                          ? ADDTYPE(T_U_SHORT)                     \
-                                          : ((flags & CHARINT) ? ADDTYPE(T_U_CHAR) \
-                                                               : ADDTYPE(T_U_INT))))))))
-
-  /*
-   * Add * arguments to the type array.
-   */
-#define ADDASTER()         \
-  n2 = 0;                  \
-  cp = fmt;                \
-  while (is_digit(*cp)) {  \
-    APPEND_DIGIT(n2, *cp); \
-    cp++;                  \
-  }                        \
-  if (*cp == '$') {        \
-    int hold = nextarg;    \
-    nextarg = n2;          \
-    ADDTYPE(T_INT);        \
-    nextarg = hold;        \
-    fmt = ++cp;            \
-  } else {                 \
-    ADDTYPE(T_INT);        \
-  }
-  CHAR_TYPE* fmt = const_cast<CHAR_TYPE*>(fmt0);
-  CHAR_TYPE* cp;
-  typetable = stattypetable;
-  tablesize = STATIC_ARG_TBL_SIZE;
-  tablemax = 0;
-  nextarg = 1;
-  memset(typetable, T_UNUSED, STATIC_ARG_TBL_SIZE);
-
-  /*
-   * Scan the format for conversions (`%' character).
-   */
-  for (;;) {
-    for (cp = fmt; (ch = *fmt) != '\0' && ch != '%'; fmt++) continue;
-    if (ch == '\0') goto done;
-    fmt++; /* skip over '%' */
-
-    flags = 0;
-
-  rflag:
-    ch = *fmt++;
-  reswitch:
-    switch (ch) {
-      case ' ':
-      case '#':
-      case '\'':
-        goto rflag;
-      case '*':
-        ADDASTER();
-        goto rflag;
-      case '-':
-      case '+':
-        goto rflag;
-      case '.':
-        if ((ch = *fmt++) == '*') {
-          ADDASTER();
-          goto rflag;
-        }
-        while (is_digit(ch)) {
-          ch = *fmt++;
-        }
-        goto reswitch;
-      case '0':
-        goto rflag;
-      case '1':
-      case '2':
-      case '3':
-      case '4':
-      case '5':
-      case '6':
-      case '7':
-      case '8':
-      case '9':
-        n = 0;
-        do {
-          APPEND_DIGIT(n, ch);
-          ch = *fmt++;
-        } while (is_digit(ch));
-        if (ch == '$') {
-          nextarg = n;
-          goto rflag;
-        }
-        goto reswitch;
-      case 'L':
-        flags |= LONGDBL;
-        goto rflag;
-      case 'h':
-        if (*fmt == 'h') {
-          fmt++;
-          flags |= CHARINT;
-        } else {
-          flags |= SHORTINT;
-        }
-        goto rflag;
-      case 'j':
-        flags |= MAXINT;
-        goto rflag;
-      case 'l':
-        if (*fmt == 'l') {
-          fmt++;
-          flags |= LLONGINT;
-        } else {
-          flags |= LONGINT;
-        }
-        goto rflag;
-      case 'q':
-        flags |= LLONGINT;
-        goto rflag;
-      case 't':
-        flags |= PTRINT;
-        goto rflag;
-      case 'z':
-        flags |= SIZEINT;
-        goto rflag;
-      case 'C':
-        flags |= LONGINT;
-        /*FALLTHROUGH*/
-      case 'c':
-        if (flags & LONGINT)
-          ADDTYPE(T_WINT);
-        else
-          ADDTYPE(T_INT);
-        break;
-      case 'D':
-        flags |= LONGINT;
-        /*FALLTHROUGH*/
-      case 'd':
-      case 'i':
-        ADDSARG();
-        break;
-      case 'a':
-      case 'A':
-      case 'e':
-      case 'E':
-      case 'f':
-      case 'F':
-      case 'g':
-      case 'G':
-        if (flags & LONGDBL)
-          ADDTYPE(T_LONG_DOUBLE);
-        else
-          ADDTYPE(T_DOUBLE);
-        break;
-#ifndef NO_PRINTF_PERCENT_N
-      case 'n':
-        if (flags & LLONGINT)
-          ADDTYPE(TP_LLONG);
-        else if (flags & LONGINT)
-          ADDTYPE(TP_LONG);
-        else if (flags & SHORTINT)
-          ADDTYPE(TP_SHORT);
-        else if (flags & PTRINT)
-          ADDTYPE(TP_PTRINT);
-        else if (flags & SIZEINT)
-          ADDTYPE(TP_SSIZEINT);
-        else if (flags & MAXINT)
-          ADDTYPE(TP_MAXINT);
-        else
-          ADDTYPE(TP_INT);
-        continue; /* no output */
-#endif            /* NO_PRINTF_PERCENT_N */
-      case 'O':
-        flags |= LONGINT;
-        /*FALLTHROUGH*/
-      case 'o':
-        ADDUARG();
-        break;
-      case 'p':
-        ADDTYPE(TP_VOID);
-        break;
-      case 'S':
-        flags |= LONGINT;
-        /*FALLTHROUGH*/
-      case 's':
-        ADDTYPE((flags & LONGINT) ? TP_WCHAR : TP_CHAR);
-        break;
-      case 'U':
-        flags |= LONGINT;
-        /*FALLTHROUGH*/
-      case 'u':
-      case 'X':
-      case 'x':
-        ADDUARG();
-        break;
-      default: /* "%?" prints ?, unless ? is NUL */
-        if (ch == '\0') goto done;
-        break;
-    }
-  }
-done:
-  /*
-   * Build the argument table.
-   */
-  if (tablemax >= STATIC_ARG_TBL_SIZE) {
-    *argtablesiz = sizeof(union arg) * (tablemax + 1);
-    *argtable = static_cast<arg*>(mmap(NULL, *argtablesiz,
-                                       PROT_WRITE | PROT_READ,
-                                       MAP_ANON | MAP_PRIVATE, -1, 0));
-    if (*argtable == MAP_FAILED) return -1;
-  }
-
-#if 0
-	/* XXX is this required? */
-	(*argtable)[0].intarg = 0;
-#endif
-  for (n = 1; n <= tablemax; n++) {
-    switch (typetable[n]) {
-      case T_UNUSED:
-      case T_CHAR:
-      case T_U_CHAR:
-      case T_SHORT:
-      case T_U_SHORT:
-      case T_INT:
-        (*argtable)[n].intarg = va_arg(ap, int);
-        break;
-      case TP_SHORT:
-        (*argtable)[n].pshortarg = va_arg(ap, short*);
-        break;
-      case T_U_INT:
-        (*argtable)[n].uintarg = va_arg(ap, unsigned int);
-        break;
-      case TP_INT:
-        (*argtable)[n].pintarg = va_arg(ap, int*);
-        break;
-      case T_LONG:
-        (*argtable)[n].longarg = va_arg(ap, long);
-        break;
-      case T_U_LONG:
-        (*argtable)[n].ulongarg = va_arg(ap, unsigned long);
-        break;
-      case TP_LONG:
-        (*argtable)[n].plongarg = va_arg(ap, long*);
-        break;
-      case T_LLONG:
-        (*argtable)[n].longlongarg = va_arg(ap, long long);
-        break;
-      case T_U_LLONG:
-        (*argtable)[n].ulonglongarg = va_arg(ap, unsigned long long);
-        break;
-      case TP_LLONG:
-        (*argtable)[n].plonglongarg = va_arg(ap, long long*);
-        break;
-      case T_DOUBLE:
-        (*argtable)[n].doublearg = va_arg(ap, double);
-        break;
-      case T_LONG_DOUBLE:
-        (*argtable)[n].longdoublearg = va_arg(ap, long double);
-        break;
-      case TP_CHAR:
-        (*argtable)[n].pchararg = va_arg(ap, char*);
-        break;
-      case TP_VOID:
-        (*argtable)[n].pvoidarg = va_arg(ap, void*);
-        break;
-      case T_PTRINT:
-        (*argtable)[n].ptrdiffarg = va_arg(ap, ptrdiff_t);
-        break;
-      case TP_PTRINT:
-        (*argtable)[n].pptrdiffarg = va_arg(ap, ptrdiff_t*);
-        break;
-      case T_SIZEINT:
-        (*argtable)[n].sizearg = va_arg(ap, size_t);
-        break;
-      case T_SSIZEINT:
-        (*argtable)[n].ssizearg = va_arg(ap, ssize_t);
-        break;
-      case TP_SSIZEINT:
-        (*argtable)[n].pssizearg = va_arg(ap, ssize_t*);
-        break;
-      case T_MAXINT:
-        (*argtable)[n].intmaxarg = va_arg(ap, intmax_t);
-        break;
-      case T_MAXUINT:
-        (*argtable)[n].uintmaxarg = va_arg(ap, uintmax_t);
-        break;
-      case TP_MAXINT:
-        (*argtable)[n].pintmaxarg = va_arg(ap, intmax_t*);
-        break;
-      case T_WINT:
-        (*argtable)[n].wintarg = va_arg(ap, wint_t);
-        break;
-      case TP_WCHAR:
-        (*argtable)[n].pwchararg = va_arg(ap, wchar_t*);
-        break;
-    }
-  }
-  goto finish;
-
-overflow:
-  errno = ENOMEM;
-  ret = -1;
-
-finish:
-  if (typetable != NULL && typetable != stattypetable) {
-    munmap(typetable, *argtablesiz);
-    typetable = NULL;
-  }
-  return (ret);
-}
-
-/*
- * Increase the size of the type table.
- */
-static int __grow_type_table(unsigned char** typetable, int* tablesize) {
-  unsigned char* old_table = *typetable;
-  int new_size = *tablesize * 2;
-
-  if (new_size < getpagesize()) new_size = getpagesize();
-
-  if (*tablesize == STATIC_ARG_TBL_SIZE) {
-    *typetable = static_cast<unsigned char*>(mmap(NULL, new_size,
-                                                  PROT_WRITE | PROT_READ,
-                                                  MAP_ANON | MAP_PRIVATE, -1, 0));
-    if (*typetable == MAP_FAILED) return -1;
-    bcopy(old_table, *typetable, *tablesize);
-  } else {
-    unsigned char* new_table = static_cast<unsigned char*>(mmap(NULL, new_size,
-                                                                PROT_WRITE | PROT_READ,
-                                                                MAP_ANON | MAP_PRIVATE, -1, 0));
-    if (new_table == MAP_FAILED) return -1;
-    memmove(new_table, *typetable, *tablesize);
-    munmap(*typetable, *tablesize);
-    *typetable = new_table;
-  }
-  memset(*typetable + *tablesize, T_UNUSED, (new_size - *tablesize));
-
-  *tablesize = new_size;
-  return 0;
-}