23 RCSID(
"$Id: 73a66b35e9f4595244d7e985f29177b75eebd181 $")
25 #include <freeradius-devel/libradius.h>
36 if (inlen == 0)
return 0;
38 if (inlen < 0) inlen = 4;
40 if (*str < 0x20)
return 0;
42 if (*str <= 0x7e)
return 1;
44 if (*str <= 0xc1)
return 0;
46 if (inlen < 2)
return 0;
48 if ((str[0] >= 0xc2) &&
55 if (inlen < 3)
return 0;
57 if ((str[0] == 0xe0) &&
65 if ((str[0] >= 0xe1) &&
74 if ((str[0] >= 0xee) &&
83 if ((str[0] == 0xed) &&
91 if (inlen < 4)
return 0;
93 if ((str[0] == 0xf0) &&
103 if ((str[0] >= 0xf1) &&
115 if ((str[0] == 0xf4) &&
145 if (cchr == 0) cchr = 1;
146 if (chr_len) *chr_len = cchr;
152 if (schr == 0) schr = 1;
153 if (schr != cchr)
goto next;
155 if (memcmp(str, chr, schr) == 0) {
156 return (
char const *) str;
179 size_t fr_snprint(
char *out,
size_t outlen,
char const *in, ssize_t inlen,
char quote)
181 uint8_t
const *p = (uint8_t
const *) in;
188 if (out && outlen) *out =
'\0';
193 if (inlen < 0) inlen = strlen(in);
200 if (!out)
return inlen;
202 if ((
size_t)inlen >= outlen) {
203 memcpy(out, in, outlen - 1);
204 out[outlen - 1] =
'\0';
206 memcpy(out, in, inlen);
218 if (freespace == 0) out = NULL;
219 if (!out) freespace = 0;
231 if ((inlen == 1) && (*p ==
'\0')) {
282 if ((freespace > 0) && (freespace <= 2)) {
283 if (out) out[used] =
'\0';
287 }
else if (freespace > 2) {
320 if ((freespace > 0) && (freespace <= 4)) {
321 if (out) out[used] =
'\0';
325 }
else if (freespace > 4) {
326 if (out)
snprintf(out + used, freespace,
"\\%03o", *p);
337 if ((freespace > 0) && (freespace <= utf8)) {
338 if (out) out[used] =
'\0';
342 }
else if (freespace > utf8) {
343 memcpy(out + used, p, utf8);
355 if (out && freespace) out[used] =
'\0';
373 return fr_snprint(NULL, 0, in, inlen, quote) + 1;
390 char *
fr_asprint(TALLOC_CTX *ctx,
char const *in, ssize_t inlen,
char quote)
397 out = talloc_array(ctx,
char, len);
int fr_utf8_char(uint8_t const *str, ssize_t inlen)
Checks for utf-8, taken from http://www.w3.org/International/questions/qa-forms-utf-8.
PUBLIC int snprintf(char *string, size_t length, char *format, va_alist)
size_t fr_snprint_len(char const *in, ssize_t inlen, char quote)
Find the length of the buffer required to fully escape a string with fr_prints.
char * fr_asprint(TALLOC_CTX *ctx, char const *in, ssize_t inlen, char quote)
Escape string that may contain binary data, and write it to a new buffer.
char const * fr_utf8_strchr(int *chr_len, char const *str, char const *chr)
Return a pointer to the first UTF8 char in a string.
size_t fr_snprint(char *out, size_t outlen, char const *in, ssize_t inlen, char quote)
Escape any non printable or non-UTF8 characters in the input string.