35 #ifndef _MOOT_RECODE_H 36 #define _MOOT_RECODE_H 40 #ifdef MOOT_RECODE_ENABLED 43 #endif // MOOT_RECODE_ENABLED 56 #ifdef MOOT_RECODE_ENABLED 57 RECODE_OUTER rc_outer;
58 RECODE_REQUEST rc_request;
62 #endif // MOOT_RECODE_ENABLED 63 std::string rc_reqstr;
75 mootRecoder(
const std::string &requestString=
"",
bool diacritics_only=
false)
76 : rc_outer(NULL), rc_request(NULL)
78 if (!requestString.empty()) scan_request(requestString,diacritics_only);
82 mootRecoder(
const std::string &src,
const std::string &dst,
bool diacritics_only=
false)
83 : rc_outer(NULL), rc_request(NULL)
85 scan_request(src, dst, diacritics_only);
91 #ifdef MOOT_RECODE_ENABLED 92 if (rc_request) recode_delete_request(rc_request);
93 if (rc_outer) recode_delete_outer(rc_outer);
94 #endif // MOOT_RECODE_ENABLED 98 void ensure_outer(
void) {
99 #ifdef MOOT_RECODE_ENABLED 100 if (!rc_outer) rc_outer = recode_new_outer(
true);
101 #endif // MOOT_RECODE_ENABLED 109 inline void scan_request(
const std::string &reqstr,
bool diacritics_only=
false) {
112 #ifdef MOOT_RECODE_ENABLED 113 if (!rc_request) rc_request = recode_new_request(rc_outer);
114 assert(rc_request != NULL);
115 if (!reqstr.empty()) {
116 rc_request->diacritics_only = diacritics_only;
117 if (!recode_scan_request(rc_request, reqstr.c_str())) {
118 fprintf(stderr,
"mootRecode::scan_request(): failed to scan request `%s'\n",
121 recode_delete_request(rc_request);
127 else if (rc_request) {
128 recode_delete_request(rc_request);
132 fprintf(stderr,
"mootRecode::scan_request(): librecode disabled! (request=\"%s\"\n",
134 #endif // MOOT_RECODE_ENABLED 138 inline void scan_request(
const std::string &src,
const std::string &dst,
bool diacritics_only=
false)
140 if (src.empty() && dst.empty()) scan_request(src,diacritics_only);
142 std::string reqstr = src;
145 scan_request(reqstr,diacritics_only);
154 inline bool string2file(
const char *in, FILE *out)
156 #ifdef MOOT_RECODE_ENABLED 158 return recode_string_to_file(rc_request,in,out);
165 inline bool buffer2file(
const char *buf,
size_t buflen, FILE *out)
167 #ifdef MOOT_RECODE_ENABLED 169 return recode_buffer_to_file(rc_request,buf,buflen,out);
171 fwrite(buf,buflen,1,out);
176 inline bool string2file(
const std::string &in, FILE *out)
178 #ifdef MOOT_RECODE_ENABLED 180 return recode_buffer_to_file(rc_request,in.data(),in.size(),out);
182 fwrite(in.data(), in.size(), 1, out);
191 inline bool buffer2buffer(
const char *in,
size_t in_size,
char **out,
size_t *out_used,
size_t *out_alloc)
193 #ifdef MOOT_RECODE_ENABLED 195 return recode_buffer_to_buffer(rc_request, in, in_size, out, out_used, out_alloc);
197 if (!*out) *out =
reinterpret_cast<char *
>(malloc(in_size));
198 else if (*out_alloc < in_size) {
200 *out =
reinterpret_cast<char *
>(malloc(in_size));
202 assert(*out != NULL);
203 *out_alloc = in_size;
204 memcpy(*out, in, in_size);
210 inline bool string2buffer(
const char *s,
char **out,
size_t *out_used,
size_t *out_alloc)
212 return buffer2buffer(s,strlen(s), out,out_used,out_alloc);
216 inline bool string2buffer(
const std::string &in,
char **out,
size_t *out_used,
size_t *out_alloc)
218 return buffer2buffer(in.data(),in.size(), out,out_used,out_alloc);
226 inline bool buffer2string(
const char *in,
size_t in_size, std::string &out)
229 size_t out_used = 0, out_alloc = 0;
230 bool rv = buffer2buffer(in,in_size, &tmp, &out_used, &out_alloc);
232 out.append(tmp, out_used);
239 inline bool string2string(
const char *s, std::string &out)
241 return buffer2string(s,strlen(s), out);
245 inline bool string2string(
const std::string &in, std::string &out)
247 return buffer2string(in.data(),in.size(), out);
259 bool rv = string2string(in,s);
260 return out && out->
puts(s) && rv;
264 inline bool buffer2mstream(
const char *buf,
size_t buflen,
mootio::mostream *out)
267 bool rv = buffer2string(buf,buflen,s);
268 return out && out->
puts(s) && rv;
275 bool rv = string2string(in,s);
276 return out && out->
puts(s) && rv;
315 : buf1(NULL), buf1_used(0), buf1_alloc(0),
316 buf2(NULL), buf2_used(0), buf2_alloc(0)
320 rc2.rc_outer = rc1.rc_outer;
322 scan_request(src,dst);
329 if (buf1) free(buf1);
330 if (buf2) free(buf2);
338 inline void scan_request(
const std::string &reqstr)
340 size_t dst_begin = reqstr.rfind(
"..");
341 string src(reqstr, 0, dst_begin);
342 string dst(reqstr, dst_begin);
343 standalone = (dst ==
"XML-standalone" || dst ==
"h0");
344 scan_request(src,dst);
348 inline void scan_request(
const std::string &src,
const std::string &dst) {
349 standalone = (dst.empty() || dst ==
"XML-standalone" || dst ==
"h0");
352 rc1.scan_request(
"",
false);
355 rc1.scan_request(src,dst,
false);
357 rc1.scan_request(src,
"HTML_4.0",
false);
358 rc2.scan_request(
"HTML_4.0",dst,
true);
367 inline bool buffer2file(
const char *in,
size_t in_size, FILE *out)
369 if (standalone)
return rc1.buffer2file(in,in_size, out);
371 bool rv1 = rc1.buffer2buffer(in,in_size, &buf1,&buf1_used,&buf1_alloc);
372 bool rv2 = rc2.buffer2file(buf1,buf1_used, out);
377 inline bool string2file(
const char *in, FILE *out)
379 return buffer2file(in,strlen(in),out);
383 inline bool string2file(
const std::string &in, FILE *out)
385 return buffer2file(in.data(),in.size(), out);
392 inline bool buffer2buffer(
const char *in,
size_t in_size,
char **out,
size_t *out_used,
size_t *out_alloc)
394 if (standalone)
return rc1.buffer2buffer(in,in_size, out,out_used,out_alloc);
396 bool rv1 = rc1.buffer2buffer(in,in_size, &buf1,&buf1_used,&buf1_alloc);
397 bool rv2 = rc2.buffer2buffer(buf1,buf1_used, out,out_used,out_alloc);
402 inline bool string2buffer(
const char *s,
char **out,
size_t *out_used,
size_t *out_alloc)
404 return buffer2buffer(s,strlen(s), out,out_used,out_alloc);
408 inline bool string2buffer(
const std::string &in,
char **out,
size_t *out_used,
size_t *out_alloc)
410 return buffer2buffer(in.data(),in.size(), out,out_used,out_alloc);
418 inline bool buffer2string(
const char *in,
size_t in_size, std::string &out)
422 bool rv1 = rc1.buffer2buffer(in,in_size, &buf1,&buf1_used,&buf1_alloc);
423 if (buf1) out.append(buf1,buf1_used);
427 bool rv1 = rc1.buffer2buffer(in,in_size, &buf1,&buf1_used,&buf1_alloc);
428 bool rv2 = rc2.buffer2string(buf1,buf1_used, out);
433 inline bool string2string(
const char *s, std::string &out)
435 return buffer2string(s,strlen(s), out);
439 inline bool string2string(
const std::string &in, std::string &out)
441 return buffer2string(in.data(),in.size(), out);
450 inline bool buffer2mstream(
const char *in,
size_t in_size,
mootio::mostream *out)
454 bool rv1 = rc1.buffer2buffer(in,in_size, &buf1,&buf1_used,&buf1_alloc);
456 out && (out->
write(buf1,buf1_used) == buf1_used) && rv1;
459 bool rv1 = rc1.buffer2buffer(in,in_size, &buf1,&buf1_used,&buf1_alloc);
460 bool rv2 = rc2.buffer2buffer(buf1,buf1_used, &buf2,&buf2_used,&buf2_alloc);
462 out && (out->
write(buf2,buf2_used) == buf2_used) && rv1 && rv2;
468 return buffer2mstream(s,strlen(s), out);
474 return buffer2mstream(in.data(),in.size(), out);
485 #endif //_MOOT_RECODE_H Definition: mootAssocVector.h:39
virtual bool write(const char *buf, size_t n)
Definition: mootIO.h:218
Abstract base class for output stream wrappers.
Definition: mootIO.h:194
virtual bool puts(const char *s)
Definition: mootIO.h:227
Special 2-phase recoder object for XML text.
Definition: mootRecode.h:314
generic I/O abstraction layer
Interface to librecode character-conversion routines.
Definition: mootRecode.h:50