Mercurial > code
annotate port/asprintf.c @ 114:bb2694382675
Move err.[ch] to port/ directory
author | David Demelier <markand@malikania.fr> |
---|---|
date | Mon, 13 Feb 2012 18:06:07 +0100 |
parents | add14be36dad |
children | cedd831d02ff |
rev | line source |
---|---|
111
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * asprintf.c -- basic port of asprintf / vsprintf functions |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
4 * Copyright (c) 2011, 2012 David Demelier <markand@malikania.fr> |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 #include <stdio.h> |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 #include <stdlib.h> |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 #include <string.h> |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 #include <stdarg.h> |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
24 #define BASE 80 |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 int |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
27 vasprintf(char **res, const char *format, va_list ap) |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
28 { |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 int rvalue, ok; |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 size_t base = BASE; |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 if ((*res = malloc(base)) == NULL) |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 return -1; |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 ok = 0; |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 do { |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 rvalue = vsnprintf(*res, base, format, ap); |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 if ((signed int)base <= rvalue || rvalue <= 0) { |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 *res = realloc(*res, base + BASE); |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 base += BASE; |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 } else |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 ok = 1; |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 } while (!ok && *res != NULL); |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 return rvalue; |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 } |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 int |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 asprintf(char **res, const char *fmt, ...) |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 { |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
52 va_list ap; |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 int rvalue; |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 va_start(ap, fmt); |
112
add14be36dad
Forgot to switch to vasprintf
David Demelier <markand@malikania.fr>
parents:
111
diff
changeset
|
56 rvalue = vasprintf(res, fmt, ap); |
111
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
57 va_end(ap); |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
58 |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
59 return rvalue; |
21e0ed613dd9
Port of asprintf and vasprintf
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 } |