Subversion Repositories Kolibri OS

Rev

Rev 4872 | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. /* Copyright (C) 2007, 2008 Eric Blake
  2.  * Permission to use, copy, modify, and distribute this software
  3.  * is freely granted, provided that this notice is preserved.
  4.  */
  5. /* This code was derived from asprintf.c */
  6. /* doc in viprintf.c */
  7.  
  8. #include <_ansi.h>
  9. #include <reent.h>
  10. #include <stdio.h>
  11. #include <stdarg.h>
  12. #include <limits.h>
  13. #include <errno.h>
  14. #include "local.h"
  15.  
  16. char *
  17. _DEFUN(_vasniprintf_r, (ptr, buf, lenp, fmt, ap),
  18.        struct _reent *ptr _AND
  19.        char *buf _AND
  20.        size_t *lenp _AND
  21.        const char *fmt _AND
  22.        va_list ap)
  23. {
  24.   int ret;
  25.   FILE f;
  26.   size_t len = *lenp;
  27.  
  28.   if (buf && len)
  29.     {
  30.       /* mark an existing buffer, but allow allocation of larger string */
  31.       f._flags = __SWR | __SSTR | __SOPT;
  32.     }
  33.   else
  34.     {
  35.       /* mark a zero-length reallocatable buffer */
  36.       f._flags = __SWR | __SSTR | __SMBF;
  37.       len = 0;
  38.       buf = NULL;
  39.     }
  40.   f._bf._base = f._p = (unsigned char *) buf;
  41.   /* For now, inherit the 32-bit signed limit of FILE._bf._size.
  42.      FIXME - it would be nice to rewrite sys/reent.h to support size_t
  43.      for _size.  */
  44.   if (len > INT_MAX)
  45.     {
  46.       ptr->_errno = EOVERFLOW;
  47.       return NULL;
  48.     }
  49.   f._bf._size = f._w = len;
  50.   f._file = -1;  /* No file. */
  51.   ret = _svfiprintf_r (ptr, &f, fmt, ap);
  52.   if (ret < 0)
  53.     return NULL;
  54.   *lenp = ret;
  55.   *f._p = '\0';
  56.   return (char *) f._bf._base;
  57. }
  58.  
  59. #ifndef _REENT_ONLY
  60.  
  61. char *
  62. _DEFUN(vasniprintf, (buf, lenp, fmt, ap),
  63.        char *buf _AND
  64.        size_t *lenp _AND
  65.        const char *fmt _AND
  66.        va_list ap)
  67. {
  68.   return _vasniprintf_r (_REENT, buf, lenp, fmt, ap);
  69. }
  70.  
  71. #endif /* ! _REENT_ONLY */
  72.