Subversion Repositories Kolibri OS

Rev

Rev 5056 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5056 serge 1
/*
2
 *  linux/lib/kasprintf.c
3
 *
4
 *  Copyright (C) 1991, 1992  Linus Torvalds
5
 */
6
 
7
#include 
8
#include 
9
#include 
10
#include 
11
#include 
12
 
13
/* Simplified asprintf. */
14
char *kvasprintf(gfp_t gfp, const char *fmt, va_list ap)
15
{
6936 serge 16
	unsigned int first, second;
5056 serge 17
	char *p;
18
	va_list aq;
19
 
20
	va_copy(aq, ap);
6936 serge 21
	first = vsnprintf(NULL, 0, fmt, aq);
5056 serge 22
	va_end(aq);
23
 
6936 serge 24
    p = kmalloc(first+1, gfp);
5056 serge 25
	if (!p)
26
		return NULL;
27
 
6936 serge 28
	second = vsnprintf(p, first+1, fmt, ap);
29
	WARN(first != second, "different return values (%u and %u) from vsnprintf(\"%s\", ...)",
30
	     first, second, fmt);
5056 serge 31
 
32
	return p;
33
}
34
EXPORT_SYMBOL(kvasprintf);
35
 
6936 serge 36
/*
37
 * If fmt contains no % (or is exactly %s), use kstrdup_const. If fmt
38
 * (or the sole vararg) points to rodata, we will then save a memory
39
 * allocation and string copy. In any case, the return value should be
40
 * freed using kfree_const().
41
 */
42
const char *kvasprintf_const(gfp_t gfp, const char *fmt, va_list ap)
43
{
44
	if (!strchr(fmt, '%'))
45
        return strdup(fmt);
46
	if (!strcmp(fmt, "%s"))
47
        return strdup(va_arg(ap, const char*));
48
	return kvasprintf(gfp, fmt, ap);
49
}
50
EXPORT_SYMBOL(kvasprintf_const);
51
 
5056 serge 52
char *kasprintf(gfp_t gfp, const char *fmt, ...)
53
{
54
	va_list ap;
55
	char *p;
56
 
57
	va_start(ap, fmt);
58
	p = kvasprintf(gfp, fmt, ap);
59
	va_end(ap);
60
 
61
	return p;
62
}
63
EXPORT_SYMBOL(kasprintf);