Molecular Modeling Software
リビジョン | 0ed44fdc6d293621650f861fe46974adf34d8417 (tree) |
---|---|
日時 | 2019-08-17 17:52:26 |
作者 | toshinagata1964 <toshinagata1964@a2be...> |
コミッター | toshinagata1964 |
Implementation of vsaprintf() is improved
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/molby/trunk@624 a2be9bc6-48de-4e38-9406-05402d4bc13c
@@ -129,35 +129,28 @@ strsep(char **stringp, const char *delim) | ||
129 | 129 | #include <stdio.h> |
130 | 130 | #include <errno.h> |
131 | 131 | |
132 | +/* Portable implementation of vsaprintf by use of vsnprintf */ | |
132 | 133 | int |
133 | 134 | vasprintf(char **ret, const char *fmt, va_list ap) |
134 | 135 | { |
135 | - int size = 128; | |
136 | - char *buf; | |
137 | - buf = (char *)malloc(size); | |
136 | + int size, n; | |
137 | + char *buf; | |
138 | + va_list argcopy; | |
139 | + va_copy(argcopy, ap); | |
140 | + size = vsnprintf(NULL, 0, fmt, argcopy); /* Returns the number of output characters */ | |
141 | + buf = (char *)malloc(size + 1); | |
138 | 142 | if (buf == NULL) { |
139 | 143 | *ret = NULL; |
140 | 144 | errno = ENOMEM; |
141 | 145 | return -1; |
142 | 146 | } |
143 | - while (1) { | |
144 | - int n = vsnprintf(buf, size, fmt, ap); | |
145 | - if (n < 0) | |
146 | - break; | |
147 | - if (n >= size) { | |
148 | - size *= 2; | |
149 | - buf = (char *)realloc(buf, size); | |
150 | - if (buf == NULL) | |
151 | - break; | |
152 | - continue; | |
153 | - } else { | |
154 | - *ret = buf; | |
155 | - return n; | |
156 | - } | |
157 | - } | |
158 | - *ret = NULL; | |
159 | - errno = ENOMEM; | |
160 | - return -1; | |
147 | + n = vsnprintf(buf, size + 1, fmt, ap); | |
148 | + if (n < 0) { | |
149 | + free(buf); | |
150 | + return n; | |
151 | + } | |
152 | + *ret = buf; | |
153 | + return n; | |
161 | 154 | } |
162 | 155 | |
163 | 156 | int |