+static char* filter_restricted( const char *in )
+{
+ if ( !in ) return NULL;
+ size_t n = strlen( in );
+ char *out = calloc( 1, n + 1 );
+ char *p = out;
+ mbstate_t mbs;
+ memset( &mbs, 0, sizeof(mbs) );
+ while ( *in )
+ {
+ wchar_t w;
+ size_t c = mbrtowc( &w, in, n, &mbs );
+ if ( c <= 0 || c > n ) break;
+ n -= c;
+ in += c;
+ if ( w == 0x9 || w == 0xA || w == 0xD ||
+ ( w >= 0x20 && w <= 0xD7FF ) ||
+ ( w >= 0xE000 && w <= 0xFFFD ) ||
+ ( w >= 0x10000 && w <= 0x10FFFF ) )
+ {
+ mbstate_t ps;
+ memset( &ps, 0, sizeof(ps) );
+ c = wcrtomb( p, w, &ps );
+ if ( c > 0 )
+ p += c;
+ }
+ }
+ return out;
+}
+
+typedef enum