]> git.proxmox.com Git - mirror_edk2.git/blobdiff - StdLib/LibC/Uefi/compat.c
edk2: Remove AppPkg, StdLib, StdLibPrivateInternalFiles
[mirror_edk2.git] / StdLib / LibC / Uefi / compat.c
diff --git a/StdLib/LibC/Uefi/compat.c b/StdLib/LibC/Uefi/compat.c
deleted file mode 100644 (file)
index 251863f..0000000
+++ /dev/null
@@ -1,843 +0,0 @@
-/*\r
- * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>\r
- * All rights reserved.\r
- *\r
- * Redistribution and use in source and binary forms, with or without\r
- * modification, are permitted provided that the following conditions\r
- * are met:\r
- * 1. Redistributions of source code must retain the above copyright\r
- *    notice, this list of conditions and the following disclaimer.\r
- * 2. Redistributions in binary form must reproduce the above copyright\r
- *    notice, this list of conditions and the following disclaimer in the\r
- *    documentation and/or other materials provided with the distribution.\r
- * 3. The name of the author may not be used to endorse or promote products\r
- *    derived from this software without specific prior written permission.\r
- *\r
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,\r
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\r
- * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL\r
- * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\r
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\r
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\r
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\r
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\r
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\r
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
- *\r
- * $Id: compat.c,v 1.1.1.1 2008/08/24 05:33:08 gmcgarry Exp $\r
-\r
- * Copyright (c) 1997, 2002 The NetBSD Foundation, Inc.\r
- * All rights reserved.\r
- *\r
- * This code is derived from software contributed to The NetBSD Foundation\r
- * by Klaus Klein and Jason R. Thorpe.\r
- *\r
- * Redistribution and use in source and binary forms, with or without\r
- * modification, are permitted provided that the following conditions\r
- * are met:\r
- * 1. Redistributions of source code must retain the above copyright\r
- *    notice, this list of conditions and the following disclaimer.\r
- * 2. Redistributions in binary form must reproduce the above copyright\r
- *    notice, this list of conditions and the following disclaimer in the\r
- *    documentation and/or other materials provided with the distribution.\r
- * 3. All advertising materials mentioning features or use of this software\r
- *    must display the following acknowledgement:\r
- *        This product includes software developed by the NetBSD\r
- *        Foundation, Inc. and its contributors.\r
- * 4. Neither the name of The NetBSD Foundation nor the names of its\r
- *    contributors may be used to endorse or promote products derived\r
- *    from this software without specific prior written permission.\r
- *\r
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS\r
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\r
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS\r
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
- * POSSIBILITY OF SUCH DAMAGE.\r
- *\r
- *  $NetBSD: compat.c,v 1.1.1.1 2008/08/24 05:33:08 gmcgarry Exp $\r
-\r
- * Copyright (c) 1987, 1993\r
- *  The Regents of the University of California.  All rights reserved.\r
- *\r
- * Redistribution and use in source and binary forms, with or without\r
- * modification, are permitted provided that the following conditions\r
- * are met:\r
- * 1. Redistributions of source code must retain the above copyright\r
- *    notice, this list of conditions and the following disclaimer.\r
- * 2. Redistributions in binary form must reproduce the above copyright\r
- *    notice, this list of conditions and the following disclaimer in the\r
- *    documentation and/or other materials provided with the distribution.\r
- * 3. Neither the name of the University nor the names of its contributors\r
- *    may be used to endorse or promote products derived from this software\r
- *    without specific prior written permission.\r
- *\r
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND\r
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE\r
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
- * SUCH DAMAGE.\r
- *\r
- *  $NetBSD: compat.c,v 1.1.1.1 2008/08/24 05:33:08 gmcgarry Exp $\r
- */\r
-#include  <LibConfig.h>\r
-#include  <string.h>\r
-#include  <fcntl.h>\r
-#include  <sys/syslimits.h>\r
-\r
-#ifndef HAVE_GETOPT\r
-char *optarg;\r
-int optind = 1;\r
-int\r
-getopt(int argc, char **argv, char *args)\r
-{\r
-        size_t n;\r
-  size_t nlen = strlen(args);\r
-        char cmd;\r
-        char rv;\r
-\r
-        if (argv[optind] && *argv[optind] == '-') {\r
-                cmd = *(argv[optind] + 1);\r
-\r
-                for (n = 0; n < nlen; n++) {\r
-                        if (args[n] == ':')\r
-        continue;\r
-                        if (args[n] == cmd) {\r
-                                rv = *(argv[optind] + 1);\r
-                                if (args[n+1] == ':') {\r
-          if (*(argv[optind] + 2) != '\0') {\r
-                                          optarg = argv[optind] + 2;\r
-            optind += 1;\r
-          } else {\r
-                                          optarg = argv[optind + 1];\r
-                                          optind += 2;\r
-          }\r
-                                        if (!optarg)\r
-             optarg="";\r
-                                        return rv;\r
-                                } else {\r
-                                        optarg = NULL;\r
-                                        optind += 1;\r
-                                        return rv;\r
-                                }\r
-                        }\r
-                }\r
-        }\r
-        return -1;\r
-}\r
-#endif\r
-\r
-#define ISPATHSEPARATOR(x) ((x == '/') || (x == '\\'))\r
-\r
-#ifdef HAVE_BASENAME\r
-#ifndef PATH_MAX\r
-  #define PATH_MAX 5000\r
-#endif\r
-\r
-char *\r
-basename(char *path)\r
-{\r
-  static char singledot[] = ".";\r
-  static char result[PATH_MAX];\r
-  char *p, *lastp;\r
-  size_t len;\r
-\r
-  /*\r
-   * If `path' is a null pointer or points to an empty string,\r
-   * return a pointer to the string ".".\r
-   */\r
-  if ((path == NULL) || (*path == '\0'))\r
-    return (singledot);\r
-\r
-  /* Strip trailing slashes, if any. */\r
-  lastp = path + strlen(path) - 1;\r
-  while (lastp != path && ISPATHSEPARATOR(*lastp))\r
-    lastp--;\r
-\r
-  /* Now find the beginning of this (final) component. */\r
-  p = lastp;\r
-  while (p != path && !ISPATHSEPARATOR(*(p - 1)))\r
-    p--;\r
-\r
-  /* ...and copy the result into the result buffer. */\r
-  len = (lastp - p) + 1 /* last char */;\r
-  if (len > (PATH_MAX - 1))\r
-    len = PATH_MAX - 1;\r
-\r
-  memcpy(result, p, len);\r
-  result[len] = '\0';\r
-\r
-  return (result);\r
-}\r
-#endif\r
-\r
-#if !defined(HAVE_MKSTEMP) && !defined(WIN32)\r
-int\r
-mkstemp(char *path)\r
-{\r
-  char *start, *trv;\r
-  unsigned int pid;\r
-\r
-  /* To guarantee multiple calls generate unique names even if\r
-     the file is not created. 676 different possibilities with 7\r
-     or more X's, 26 with 6 or less. */\r
-  static char xtra[2] = "aa";\r
-  int xcnt = 0;\r
-\r
-  pid = getpid();\r
-\r
-  /* Move to end of path and count trailing X's. */\r
-  for (trv = path; *trv; ++trv)\r
-    if (*trv == 'X')\r
-      xcnt++;\r
-    else\r
-      xcnt = 0;\r
-\r
-  /* Use at least one from xtra.  Use 2 if more than 6 X's. */\r
-  if (*(trv - 1) == 'X')\r
-    *--trv = xtra[0];\r
-  if (xcnt > 6 && *(trv - 1) == 'X')\r
-    *--trv = xtra[1];\r
-\r
-  /* Set remaining X's to pid digits with 0's to the left. */\r
-  while (*--trv == 'X') {\r
-    *trv = (pid % 10) + '0';\r
-    pid /= 10;\r
-  }\r
-\r
-  /* update xtra for next call. */\r
-  if (xtra[0] != 'z')\r
-    xtra[0]++;\r
-  else {\r
-    xtra[0] = 'a';\r
-    if (xtra[1] != 'z')\r
-      xtra[1]++;\r
-    else\r
-      xtra[1] = 'a';\r
-  }\r
-\r
-  return open(path, O_CREAT | O_EXCL | O_RDWR, 0600);\r
-}\r
-#endif\r
-\r
-#ifdef HAVE_FFS\r
-int\r
-ffs(int x)\r
-{\r
-  int r = 1;\r
-  if (!x) return 0;\r
-  if (!(x & 0xffff)) { x >>= 16; r += 16; }\r
-  if (!(x &   0xff)) { x >>= 8;  r += 8;  }\r
-  if (!(x &    0xf)) { x >>= 4;  r += 4;  }\r
-  if (!(x &      3)) { x >>= 2;  r += 2;  }\r
-  if (!(x &      1)) { x >>= 1;  r += 1;  }\r
-\r
-  return r;\r
-}\r
-#endif\r
-\r
-/*\r
- * Copyright Patrick Powell 1995\r
- * This code is based on code written by Patrick Powell (papowell@astart.com)\r
- * It may be used for any purpose as long as this notice remains intact\r
- * on all source code distributions\r
- */\r
-\r
-#if !defined(HAVE_SNPRINTF) || !defined(HAVE_VSNPRINTF)\r
-\r
-static void\r
-dopr(char *buffer, size_t maxlen, const char *format, va_list args);\r
-\r
-static void\r
-fmtstr(char *buffer, size_t *currlen, size_t maxlen, char *value, int flags,\r
-    int min, int max);\r
-\r
-static void\r
-fmtint(char *buffer, size_t *currlen, size_t maxlen, long value, int base,\r
-    int min, int max, int flags);\r
-\r
-static void\r
-fmtfp(char *buffer, size_t *currlen, size_t maxlen, long double fvalue,\r
-    int min, int max, int flags);\r
-\r
-static void\r
-dopr_outch(char *buffer, size_t *currlen, size_t maxlen, char c);\r
-\r
-/*\r
- * dopr(): poor man's version of doprintf\r
- */\r
-\r
-/* format read states */\r
-#define DP_S_DEFAULT 0\r
-#define DP_S_FLAGS   1\r
-#define DP_S_MIN     2\r
-#define DP_S_DOT     3\r
-#define DP_S_MAX     4\r
-#define DP_S_MOD     5\r
-#define DP_S_CONV    6\r
-#define DP_S_DONE    7\r
-\r
-/* format flags - Bits */\r
-#define DP_F_MINUS  (1 << 0)\r
-#define DP_F_PLUS   (1 << 1)\r
-#define DP_F_SPACE  (1 << 2)\r
-#define DP_F_NUM    (1 << 3)\r
-#define DP_F_ZERO   (1 << 4)\r
-#define DP_F_UP     (1 << 5)\r
-#define DP_F_UNSIGNED   (1 << 6)\r
-\r
-/* Conversion Flags */\r
-#define DP_C_SHORT     1\r
-#define DP_C_LONG      2\r
-#define DP_C_LDOUBLE   3\r
-#define DP_C_LONG_LONG 4\r
-\r
-#define char_to_int(p) (p - '0')\r
-#define abs_val(p) (p < 0 ? -p : p)\r
-\r
-\r
-static void\r
-dopr(char *buffer, size_t maxlen, const char *format, va_list args)\r
-{\r
-  char *strvalue, ch;\r
-  long value;\r
-  long double fvalue;\r
-  int min = 0, max = -1, state = DP_S_DEFAULT, flags = 0, cflags = 0;\r
-  size_t currlen = 0;\r
-\r
-  ch = *format++;\r
-\r
-  while (state != DP_S_DONE) {\r
-    if ((ch == '\0') || (currlen >= maxlen))\r
-      state = DP_S_DONE;\r
-\r
-    switch(state) {\r
-    case DP_S_DEFAULT:\r
-      if (ch == '%')\r
-        state = DP_S_FLAGS;\r
-      else\r
-        dopr_outch(buffer, &currlen, maxlen, ch);\r
-      ch = *format++;\r
-      break;\r
-    case DP_S_FLAGS:\r
-      switch (ch) {\r
-      case '-':\r
-        flags |= DP_F_MINUS;\r
-        ch = *format++;\r
-        break;\r
-      case '+':\r
-        flags |= DP_F_PLUS;\r
-        ch = *format++;\r
-        break;\r
-      case ' ':\r
-        flags |= DP_F_SPACE;\r
-        ch = *format++;\r
-        break;\r
-      case '#':\r
-        flags |= DP_F_NUM;\r
-        ch = *format++;\r
-        break;\r
-      case '0':\r
-        flags |= DP_F_ZERO;\r
-        ch = *format++;\r
-        break;\r
-      default:\r
-        state = DP_S_MIN;\r
-        break;\r
-      }\r
-      break;\r
-    case DP_S_MIN:\r
-      if (isdigit((unsigned char)ch)) {\r
-        min = 10 * min + char_to_int (ch);\r
-        ch = *format++;\r
-      } else if (ch == '*') {\r
-        min = va_arg (args, int);\r
-        ch = *format++;\r
-        state = DP_S_DOT;\r
-      } else\r
-        state = DP_S_DOT;\r
-      break;\r
-    case DP_S_DOT:\r
-      if (ch == '.') {\r
-        state = DP_S_MAX;\r
-        ch = *format++;\r
-      } else\r
-        state = DP_S_MOD;\r
-      break;\r
-    case DP_S_MAX:\r
-      if (isdigit((unsigned char)ch)) {\r
-        if (max < 0)\r
-          max = 0;\r
-        max = 10 * max + char_to_int(ch);\r
-        ch = *format++;\r
-      } else if (ch == '*') {\r
-        max = va_arg (args, int);\r
-        ch = *format++;\r
-        state = DP_S_MOD;\r
-      } else\r
-        state = DP_S_MOD;\r
-      break;\r
-    case DP_S_MOD:\r
-      switch (ch) {\r
-      case 'h':\r
-        cflags = DP_C_SHORT;\r
-        ch = *format++;\r
-        break;\r
-      case 'l':\r
-        cflags = DP_C_LONG;\r
-        ch = *format++;\r
-        if (ch == 'l') {\r
-          cflags = DP_C_LONG_LONG;\r
-          ch = *format++;\r
-        }\r
-        break;\r
-      case 'q':\r
-        cflags = DP_C_LONG_LONG;\r
-        ch = *format++;\r
-        break;\r
-      case 'L':\r
-        cflags = DP_C_LDOUBLE;\r
-        ch = *format++;\r
-        break;\r
-      default:\r
-        break;\r
-      }\r
-      state = DP_S_CONV;\r
-      break;\r
-    case DP_S_CONV:\r
-      switch (ch) {\r
-      case 'd':\r
-      case 'i':\r
-        if (cflags == DP_C_SHORT)\r
-          value = va_arg(args, int);\r
-        else if (cflags == DP_C_LONG)\r
-          value = va_arg(args, long int);\r
-        else if (cflags == DP_C_LONG_LONG)\r
-          value = va_arg (args, long long);\r
-        else\r
-          value = va_arg (args, int);\r
-        fmtint(buffer, &currlen, maxlen, value, 10, min, max, flags);\r
-        break;\r
-      case 'o':\r
-        flags |= DP_F_UNSIGNED;\r
-        if (cflags == DP_C_SHORT)\r
-          value = va_arg(args, unsigned int);\r
-        else if (cflags == DP_C_LONG)\r
-          value = va_arg(args, unsigned long int);\r
-        else if (cflags == DP_C_LONG_LONG)\r
-          value = va_arg(args, unsigned long long);\r
-        else\r
-          value = va_arg(args, unsigned int);\r
-        fmtint(buffer, &currlen, maxlen, value, 8, min, max, flags);\r
-        break;\r
-      case 'u':\r
-        flags |= DP_F_UNSIGNED;\r
-        if (cflags == DP_C_SHORT)\r
-          value = va_arg(args, unsigned int);\r
-        else if (cflags == DP_C_LONG)\r
-          value = va_arg(args, unsigned long int);\r
-        else if (cflags == DP_C_LONG_LONG)\r
-          value = va_arg(args, unsigned long long);\r
-        else\r
-          value = va_arg(args, unsigned int);\r
-        fmtint (buffer, &currlen, maxlen, value, 10, min, max, flags);\r
-        break;\r
-      case 'X':\r
-        flags |= DP_F_UP;\r
-      case 'x':\r
-        flags |= DP_F_UNSIGNED;\r
-        if (cflags == DP_C_SHORT)\r
-          value = va_arg(args, unsigned int);\r
-        else if (cflags == DP_C_LONG)\r
-          value = va_arg(args, unsigned long int);\r
-        else if (cflags == DP_C_LONG_LONG)\r
-          value = va_arg(args, unsigned long long);\r
-        else\r
-          value = va_arg(args, unsigned int);\r
-        fmtint(buffer, &currlen, maxlen, value, 16, min, max, flags);\r
-        break;\r
-      case 'f':\r
-        if (cflags == DP_C_LDOUBLE)\r
-          fvalue = va_arg(args, long double);\r
-        else\r
-          fvalue = va_arg(args, double);\r
-        /* um, floating point? */\r
-        fmtfp(buffer, &currlen, maxlen, fvalue, min, max, flags);\r
-        break;\r
-      case 'E':\r
-        flags |= DP_F_UP;\r
-      case 'e':\r
-        if (cflags == DP_C_LDOUBLE)\r
-          fvalue = va_arg(args, long double);\r
-        else\r
-          fvalue = va_arg(args, double);\r
-        break;\r
-      case 'G':\r
-        flags |= DP_F_UP;\r
-      case 'g':\r
-        if (cflags == DP_C_LDOUBLE)\r
-          fvalue = va_arg(args, long double);\r
-        else\r
-          fvalue = va_arg(args, double);\r
-        break;\r
-      case 'c':\r
-        dopr_outch(buffer, &currlen, maxlen, va_arg(args, int));\r
-        break;\r
-      case 's':\r
-        strvalue = va_arg(args, char *);\r
-        if (max < 0)\r
-          max = maxlen; /* ie, no max */\r
-        fmtstr(buffer, &currlen, maxlen, strvalue, flags, min, max);\r
-        break;\r
-      case 'p':\r
-        strvalue = va_arg(args, void *);\r
-        fmtint(buffer, &currlen, maxlen, (long) strvalue, 16, min, max, flags);\r
-        break;\r
-      case 'n':\r
-        if (cflags == DP_C_SHORT) {\r
-          short int *num;\r
-          num = va_arg(args, short int *);\r
-          *num = currlen;\r
-        } else if (cflags == DP_C_LONG) {\r
-          long int *num;\r
-          num = va_arg(args, long int *);\r
-          *num = currlen;\r
-        } else if (cflags == DP_C_LONG_LONG) {\r
-          long long *num;\r
-          num = va_arg(args, long long *);\r
-          *num = currlen;\r
-        } else {\r
-          int *num;\r
-          num = va_arg(args, int *);\r
-          *num = currlen;\r
-        }\r
-        break;\r
-      case '%':\r
-        dopr_outch(buffer, &currlen, maxlen, ch);\r
-        break;\r
-      case 'w': /* not supported yet, treat as next char */\r
-        ch = *format++;\r
-        break;\r
-      default: /* Unknown, skip */\r
-      break;\r
-      }\r
-      ch = *format++;\r
-      state = DP_S_DEFAULT;\r
-      flags = cflags = min = 0;\r
-      max = -1;\r
-      break;\r
-    case DP_S_DONE:\r
-      break;\r
-    default: /* hmm? */\r
-      break; /* some picky compilers need this */\r
-    }\r
-  }\r
-  if (currlen < maxlen - 1)\r
-    buffer[currlen] = '\0';\r
-  else\r
-    buffer[maxlen - 1] = '\0';\r
-}\r
-\r
-static void\r
-fmtstr(char *buffer, size_t *currlen, size_t maxlen,\r
-    char *value, int flags, int min, int max)\r
-{\r
-  int cnt = 0, padlen, strln;     /* amount to pad */\r
-\r
-  if (value == 0)\r
-    value = "<NULL>";\r
-\r
-  for (strln = 0; value[strln]; ++strln); /* strlen */\r
-  padlen = min - strln;\r
-  if (padlen < 0)\r
-    padlen = 0;\r
-  if (flags & DP_F_MINUS)\r
-    padlen = -padlen; /* Left Justify */\r
-\r
-  while ((padlen > 0) && (cnt < max)) {\r
-    dopr_outch(buffer, currlen, maxlen, ' ');\r
-    --padlen;\r
-    ++cnt;\r
-  }\r
-  while (*value && (cnt < max)) {\r
-    dopr_outch(buffer, currlen, maxlen, *value++);\r
-    ++cnt;\r
-  }\r
-  while ((padlen < 0) && (cnt < max)) {\r
-    dopr_outch(buffer, currlen, maxlen, ' ');\r
-    ++padlen;\r
-    ++cnt;\r
-  }\r
-}\r
-\r
-/* Have to handle DP_F_NUM (ie 0x and 0 alternates) */\r
-\r
-static void\r
-fmtint(char *buffer, size_t *currlen, size_t maxlen,\r
-    long value, int base, int min, int max, int flags)\r
-{\r
-  unsigned long uvalue;\r
-  char convert[20];\r
-  int signvalue = 0, place = 0, caps = 0;\r
-  int spadlen = 0; /* amount to space pad */\r
-  int zpadlen = 0; /* amount to zero pad */\r
-\r
-#define PADMAX(x,y) ((x) > (y) ? (x) : (y))\r
-\r
-  if (max < 0)\r
-    max = 0;\r
-\r
-  uvalue = value;\r
-\r
-  if (!(flags & DP_F_UNSIGNED)) {\r
-    if (value < 0) {\r
-      signvalue = '-';\r
-      uvalue = -value;\r
-    } else if (flags & DP_F_PLUS)  /* Do a sign (+/i) */\r
-      signvalue = '+';\r
-    else if (flags & DP_F_SPACE)\r
-      signvalue = ' ';\r
-  }\r
-\r
-  if (flags & DP_F_UP)\r
-    caps = 1; /* Should characters be upper case? */\r
-  do {\r
-    convert[place++] =\r
-        (caps ? "0123456789ABCDEF" : "0123456789abcdef")\r
-        [uvalue % (unsigned)base];\r
-    uvalue = (uvalue / (unsigned)base );\r
-  } while (uvalue && (place < 20));\r
-  if (place == 20)\r
-    place--;\r
-  convert[place] = 0;\r
-\r
-  zpadlen = max - place;\r
-  spadlen = min - PADMAX(max, place) - (signvalue ? 1 : 0);\r
-  if (zpadlen < 0)\r
-    zpadlen = 0;\r
-  if (spadlen < 0)\r
-    spadlen = 0;\r
-  if (flags & DP_F_ZERO) {\r
-    zpadlen = PADMAX(zpadlen, spadlen);\r
-    spadlen = 0;\r
-  }\r
-  if (flags & DP_F_MINUS)\r
-    spadlen = -spadlen; /* Left Justifty */\r
-\r
-  /* Spaces */\r
-  while (spadlen > 0) {\r
-    dopr_outch(buffer, currlen, maxlen, ' ');\r
-    --spadlen;\r
-  }\r
-\r
-  /* Sign */\r
-  if (signvalue)\r
-    dopr_outch(buffer, currlen, maxlen, signvalue);\r
-\r
-  /* Zeros */\r
-  if (zpadlen > 0) {\r
-    while (zpadlen > 0) {\r
-      dopr_outch(buffer, currlen, maxlen, '0');\r
-      --zpadlen;\r
-    }\r
-  }\r
-\r
-  /* Digits */\r
-  while (place > 0)\r
-    dopr_outch(buffer, currlen, maxlen, convert[--place]);\r
-\r
-  /* Left Justified spaces */\r
-  while (spadlen < 0) {\r
-    dopr_outch (buffer, currlen, maxlen, ' ');\r
-    ++spadlen;\r
-  }\r
-}\r
-\r
-static long double\r
-pow10(int exp)\r
-{\r
-  long double result = 1;\r
-\r
-  while (exp) {\r
-    result *= 10;\r
-    exp--;\r
-  }\r
-\r
-  return result;\r
-}\r
-\r
-static long\r
-round(long double value)\r
-{\r
-  long intpart = value;\r
-\r
-  value -= intpart;\r
-  if (value >= 0.5)\r
-    intpart++;\r
-\r
-  return intpart;\r
-}\r
-\r
-static void\r
-fmtfp(char *buffer, size_t *currlen, size_t maxlen, long double fvalue,\r
-      int min, int max, int flags)\r
-{\r
-  char iconvert[20], fconvert[20];\r
-  int signvalue = 0, iplace = 0, fplace = 0;\r
-  int padlen = 0; /* amount to pad */\r
-  int zpadlen = 0, caps = 0;\r
-  long intpart, fracpart;\r
-  long double ufvalue;\r
-\r
-  /*\r
-   * AIX manpage says the default is 0, but Solaris says the default\r
-   * is 6, and sprintf on AIX defaults to 6\r
-   */\r
-  if (max < 0)\r
-    max = 6;\r
-\r
-  ufvalue = abs_val(fvalue);\r
-\r
-  if (fvalue < 0)\r
-    signvalue = '-';\r
-  else if (flags & DP_F_PLUS)  /* Do a sign (+/i) */\r
-    signvalue = '+';\r
-  else if (flags & DP_F_SPACE)\r
-    signvalue = ' ';\r
-\r
-  intpart = ufvalue;\r
-\r
-  /*\r
-   * Sorry, we only support 9 digits past the decimal because of our\r
-   * conversion method\r
-   */\r
-  if (max > 9)\r
-    max = 9;\r
-\r
-  /* We "cheat" by converting the fractional part to integer by\r
-   * multiplying by a factor of 10\r
-   */\r
-  fracpart = round((pow10 (max)) * (ufvalue - intpart));\r
-\r
-  if (fracpart >= pow10 (max)) {\r
-    intpart++;\r
-    fracpart -= pow10 (max);\r
-  }\r
-\r
-  /* Convert integer part */\r
-  do {\r
-    iconvert[iplace++] =\r
-        (caps ? "0123456789ABCDEF" : "0123456789abcdef")\r
-        [intpart % 10];\r
-    intpart = (intpart / 10);\r
-  } while(intpart && (iplace < 20));\r
-  if (iplace == 20)\r
-    iplace--;\r
-  iconvert[iplace] = 0;\r
-\r
-  /* Convert fractional part */\r
-  do {\r
-    fconvert[fplace++] =\r
-        (caps ? "0123456789ABCDEF" : "0123456789abcdef")\r
-        [fracpart % 10];\r
-    fracpart = (fracpart / 10);\r
-  } while(fracpart && (fplace < 20));\r
-  if (fplace == 20)\r
-    fplace--;\r
-  fconvert[fplace] = 0;\r
-\r
-  /* -1 for decimal point, another -1 if we are printing a sign */\r
-  padlen = min - iplace - max - 1 - ((signvalue) ? 1 : 0);\r
-  zpadlen = max - fplace;\r
-  if (zpadlen < 0)\r
-    zpadlen = 0;\r
-  if (padlen < 0)\r
-    padlen = 0;\r
-  if (flags & DP_F_MINUS)\r
-    padlen = -padlen; /* Left Justifty */\r
-\r
-  if ((flags & DP_F_ZERO) && (padlen > 0)) {\r
-    if (signvalue) {\r
-      dopr_outch(buffer, currlen, maxlen, signvalue);\r
-      --padlen;\r
-      signvalue = 0;\r
-    }\r
-    while (padlen > 0) {\r
-      dopr_outch(buffer, currlen, maxlen, '0');\r
-      --padlen;\r
-    }\r
-  }\r
-  while (padlen > 0) {\r
-    dopr_outch(buffer, currlen, maxlen, ' ');\r
-    --padlen;\r
-  }\r
-  if (signvalue)\r
-    dopr_outch(buffer, currlen, maxlen, signvalue);\r
-\r
-  while (iplace > 0)\r
-    dopr_outch(buffer, currlen, maxlen, iconvert[--iplace]);\r
-\r
-  /*\r
-   * Decimal point.  This should probably use locale to find the\r
-   * correct char to print out.\r
-   */\r
-  dopr_outch(buffer, currlen, maxlen, '.');\r
-\r
-  while (fplace > 0)\r
-    dopr_outch(buffer, currlen, maxlen, fconvert[--fplace]);\r
-\r
-  while (zpadlen > 0) {\r
-    dopr_outch(buffer, currlen, maxlen, '0');\r
-    --zpadlen;\r
-  }\r
-\r
-  while (padlen < 0) {\r
-    dopr_outch(buffer, currlen, maxlen, ' ');\r
-    ++padlen;\r
-  }\r
-}\r
-\r
-static void\r
-dopr_outch(char *buffer, size_t *currlen, size_t maxlen, char c)\r
-{\r
-  if (*currlen < maxlen)\r
-    buffer[(*currlen)++] = c;\r
-}\r
-#endif /* !defined(HAVE_SNPRINTF) || !defined(HAVE_VSNPRINTF) */\r
-\r
-#ifndef HAVE_VSNPRINTF\r
-int\r
-vsnprintf(char *str, size_t count, const char *fmt, va_list args)\r
-{\r
-  str[0] = 0;\r
-  dopr(str, count, fmt, args);\r
-\r
-  return(strlen(str));\r
-}\r
-#endif /* !HAVE_VSNPRINTF */\r
-\r
-#ifndef HAVE_SNPRINTF\r
-int\r
-snprintf(char *str,size_t count,const char *fmt,...)\r
-{\r
-  va_list ap;\r
-\r
-  va_start(ap, fmt);\r
-  (void) vsnprintf(str, count, fmt, ap);\r
-  va_end(ap);\r
-\r
-  return(strlen(str));\r
-}\r
-\r
-#endif /* !HAVE_SNPRINTF */\r