+void char2hex(char *h, unsigned char c) {
+ static const char hexdigits[] = { '0', '1', '2', '3', '4', '5', '6', '7',
+ '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
+ h[0] = hexdigits[c / 16];
+ h[1] = hexdigits[c % 16];
+ return;
+}
+
+char *radattr2ascii(char *ascii, size_t len, unsigned char *attr) {
+ int i, l;
+ char *s, *d;
+
+ if (!attr || len == 1) {
+ *ascii = '\0';
+ return ascii;
+ }
+
+ l = ATTRVALLEN(attr);
+ s = (char *)ATTRVAL(attr);
+ d = ascii;
+
+ for (i = 0; i < l; i++) {
+ if (s[i] > 31 && s[i] < 127) {
+ *d++ = s[i];
+ if (d - ascii == len - 1)
+ break;
+ } else {
+ if (d - ascii > len - 4)
+ break;
+ *d++ = '%';
+ char2hex(d, s[i]);
+ d += 2;
+ if (d - ascii == len - 1)
+ break;
+ }
+ }
+ *d = '\0';
+ return ascii;
+}
+