Subversion Repositories HelenOS

Rev

Rev 3386 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3386 Rev 4581
Line 34... Line 34...
34
 */
34
 */
35
 
35
 
36
#include <stdarg.h>
36
#include <stdarg.h>
37
#include <stdio.h>
37
#include <stdio.h>
38
#include <stdlib.h>
38
#include <stdlib.h>
-
 
39
#include <string.h>
39
#include <io/printf_core.h>
40
#include <io/printf_core.h>
40
 
41
 
41
static int asprintf_prewrite(const char *str, size_t count, void *unused)
42
static int asprintf_str_write(const char *str, size_t count, void *unused)
42
{
43
{
43
    return count;
44
    return str_nlength(str, count);
-
 
45
}
-
 
46
 
-
 
47
static int asprintf_wstr_write(const wchar_t *str, size_t count, void *unused)
-
 
48
{
-
 
49
    return wstr_nlength(str, count);
44
}
50
}
45
 
51
 
46
/** Allocate and print to string.
52
/** Allocate and print to string.
47
 *
53
 *
48
 * @param strp      Address of the pointer where to store the address of
54
 * @param strp Address of the pointer where to store the address of
49
 *          the newly allocated string.
55
 *             the newly allocated string.
50
 * @fmt         Format strin.
56
 * @fmt        Format string.
-
 
57
 *
-
 
58
 * @return Number of characters printed or a negative error code.
51
 *
59
 *
52
 * @return      Number of characters printed or a negative error code.
-
 
53
 */
60
 */
54
int asprintf(char **strp, const char *fmt, ...)
61
int asprintf(char **strp, const char *fmt, ...)
55
{
62
{
56
    struct printf_spec ps = {
63
    struct printf_spec ps = {
57
         asprintf_prewrite,
64
        asprintf_str_write,
-
 
65
        asprintf_wstr_write,
58
         NULL
66
        NULL
59
    };
67
    };
60
    int ret;
68
   
61
    va_list args;
69
    va_list args;
62
 
-
 
63
    va_start(args, fmt);
70
    va_start(args, fmt);
-
 
71
   
64
    ret = printf_core(fmt, &ps, args);
72
    int ret = printf_core(fmt, &ps, args);
65
    va_end(args);
73
    va_end(args);
-
 
74
   
66
    if (ret > 0) {
75
    if (ret > 0) {
67
        *strp = malloc(ret + 20);
76
        *strp = malloc(STR_BOUNDS(ret) + 1);
68
        if (!*strp)
77
        if (*strp == NULL)
69
            return -1;
78
            return -1;
-
 
79
       
70
        va_start(args, fmt);
80
        va_start(args, fmt);
71
        vsprintf(*strp, fmt, args);
81
        vsnprintf(*strp, STR_BOUNDS(ret) + 1, fmt, args);
72
        va_end(args);      
82
        va_end(args);
73
    }
83
    }
74
 
84
   
75
    return ret;
85
    return ret;
76
}
86
}
77
 
87
 
78
/** @}
88
/** @}
79
 */
89
 */