Subversion Repositories Kolibri OS

Rev

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

  1. /* Copyright (C) 2007 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 vfprintf.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(_vasnprintf_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 = _svfprintf_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. #ifdef _NANO_FORMATTED_IO
  60. char *
  61. _EXFUN(_vasniprintf_r, (struct _reent*, char *, size_t *,
  62.                         const char *, __VALIST)
  63.        _ATTRIBUTE ((__alias__("_vasnprintf_r"))));
  64. #endif
  65.  
  66. #ifndef _REENT_ONLY
  67.  
  68. char *
  69. _DEFUN(vasnprintf, (buf, lenp, fmt, ap),
  70.        char *buf _AND
  71.        size_t *lenp _AND
  72.        const char *fmt _AND
  73.        va_list ap)
  74. {
  75.   return _vasnprintf_r (_REENT, buf, lenp, fmt, ap);
  76. }
  77.  
  78. #ifdef _NANO_FORMATTED_IO
  79. char *
  80. _EXFUN(vasniprintf, (char *, size_t *, const char *, __VALIST)
  81.        _ATTRIBUTE ((__alias__("vasnprintf"))));
  82. #endif
  83. #endif /* ! _REENT_ONLY */
  84.