Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright (c) 1990 The Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms are permitted
  6.  * provided that the above copyright notice and this paragraph are
  7.  * duplicated in all such forms and that any documentation,
  8.  * advertising materials, and other materials related to such
  9.  * distribution and use acknowledge that the software was developed
  10.  * by the University of California, Berkeley.  The name of the
  11.  * University may not be used to endorse or promote products derived
  12.  * from this software without specific prior written permission.
  13.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  14.  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  15.  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  16.  */
  17. /* This code was copied from asprintf.c */
  18. /* doc in siprintf.c */
  19.  
  20. #include <_ansi.h>
  21. #include <reent.h>
  22. #include <stdio.h>
  23. #include <stdarg.h>
  24. #include <limits.h>
  25. #include "local.h"
  26.  
  27. int
  28. _DEFUN(_asiprintf_r, (ptr, strp, fmt),
  29.        struct _reent *ptr _AND
  30.        char **strp        _AND
  31.        const char *fmt _DOTS)
  32. {
  33.   int ret;
  34.   va_list ap;
  35.   FILE f;
  36.  
  37.   /* mark a zero-length reallocatable buffer */
  38.   f._flags = __SWR | __SSTR | __SMBF;
  39.   f._bf._base = f._p = NULL;
  40.   f._bf._size = f._w = 0;
  41.   f._file = -1;  /* No file. */
  42.   va_start (ap, fmt);
  43.   ret = _svfiprintf_r (ptr, &f, fmt, ap);
  44.   va_end (ap);
  45.   if (ret >= 0)
  46.     {
  47.       *f._p = 0;
  48.       *strp = (char *) f._bf._base;
  49.     }
  50.   return (ret);
  51. }
  52.  
  53. #ifndef _REENT_ONLY
  54.  
  55. int
  56. _DEFUN(asiprintf, (strp, fmt),
  57.        char **strp _AND
  58.        const char *fmt _DOTS)
  59. {
  60.   int ret;
  61.   va_list ap;
  62.   FILE f;
  63.  
  64.   /* mark a zero-length reallocatable buffer */
  65.   f._flags = __SWR | __SSTR | __SMBF;
  66.   f._bf._base = f._p = NULL;
  67.   f._bf._size = f._w = 0;
  68.   f._file = -1;  /* No file. */
  69.   va_start (ap, fmt);
  70.   ret = _svfiprintf_r (_REENT, &f, fmt, ap);
  71.   va_end (ap);
  72.   if (ret >= 0)
  73.     {
  74.       *f._p = 0;
  75.       *strp = (char *) f._bf._base;
  76.     }
  77.   return (ret);
  78. }
  79.  
  80. #endif /* ! _REENT_ONLY */
  81.