00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "stringbuffer.h"
00023 #include <stdlib.h>
00024 #include <string.h>
00025 #include <stdio.h>
00026
00027 #define INCREMENT_STRING_SIZE 256
00028
00040 static xmlChar * jasperserver_stringVSprintf(const char *format, va_list argptr);
00041
00053 int jasperserver_string_vformat(jasperserver_string_t *jsstr,const char *format, va_list argptr);
00054
00055
00056 jasperserver_string_t *jasperserver_string_new()
00057 {
00058 jasperserver_string_t *jsstr = (jasperserver_string_t *)malloc( sizeof(jasperserver_string_t));
00059
00060 jsstr->buffer = xmlBufferCreate();
00061 return jsstr;
00062 }
00063
00064
00065
00066
00067
00068
00069
00070
00071 void jasperserver_string_free(jasperserver_string_t *jsstr)
00072 {
00073 if (!jsstr) return;
00074 if (jsstr->buffer)
00075 {
00076 xmlBufferFree(jsstr->buffer);
00077 }
00078 }
00079
00080
00081
00082 void jasperserver_string_cappend(jasperserver_string_t *jsstr,const char *utf)
00083 {
00084 if (!utf || !jsstr)
00085 {
00086 return;
00087 }
00088
00089 xmlBufferCCat(jsstr->buffer, utf);
00090 }
00091
00092
00093
00094
00095 void jasperserver_string_append(jasperserver_string_t *jsstr,const xmlChar *utf)
00096 {
00097 if (!utf || !jsstr)
00098 {
00099 return;
00100 }
00101
00102 xmlBufferCat(jsstr->buffer, utf);
00103 }
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159 void jasperserver_string_set(jasperserver_string_t *jsstr,const xmlChar *str)
00160 {
00161 if (!jsstr || !str) return;
00162
00163 xmlBufferEmpty( jsstr->buffer );
00164 jasperserver_string_append(jsstr, str );
00165 }
00166
00167 void jasperserver_string_cset(jasperserver_string_t *jsstr,const char *str)
00168 {
00169 if (!jsstr || !str) return;
00170
00171 xmlBufferEmpty( jsstr->buffer );
00172 jasperserver_string_cappend(jsstr, str );
00173 }
00174
00175
00176 int jasperserver_string_format(jasperserver_string_t *jsstr,const char *format, ...)
00177 {
00178 int rc;
00179 xmlChar *buf;
00180 va_list ap;
00181
00182 if (format == NULL) return -1;
00183
00184 va_start(ap, format);
00185
00186 rc = jasperserver_string_vformat(jsstr, format, ap);
00187
00188 va_end(ap);
00189 return rc;
00190 }
00191
00192
00193 int jasperserver_string_vformat(jasperserver_string_t *jsstr,const char *format, va_list argptr)
00194 {
00195 int rc;
00196 xmlChar *buf;
00197
00198 buf = jasperserver_stringVSprintf(format, argptr);
00199 if (buf == 0) return 0;
00200 jasperserver_string_append(jsstr, buf);
00201 rc = strlen(buf);
00202 xmlFree(buf);
00203 return rc;
00204 }
00205
00206
00207 static xmlChar *
00208 jasperserver_stringVSprintf(const char *format, va_list argptr)
00209 {
00210 int size;
00211 int count;
00212 xmlChar *buf;
00213
00214 size = 512;
00215 buf = (xmlChar *) xmlMalloc(size);
00216 if (buf == NULL) {
00217 return NULL;
00218 }
00219
00220 while (((count = vsnprintf((char *) buf, size, format, argptr)) < 0)
00221 || (count == size - 1) || (count == size) || (count > size)) {
00222 xmlFree(buf);
00223 size += 512;
00224 buf = (xmlChar *) xmlMalloc(size);
00225 if (buf == NULL) {
00226 return NULL;
00227 }
00228 }
00229
00230 return buf;
00231 }