#include #ifndef __NO_COMPILE int zubr_is_alpha( __mpu_char16_t c ) { return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || c >= 0x80; } int zubr_is_alnum( __mpu_char16_t c ) { return zubr_is_alpha( c ) || (c >= '0' && c <= '9'); } int zubr_is_digit( __mpu_char16_t c ) { return c >= '0' && c <= '9'; } int zubr_is_upper( __mpu_char16_t c ) { return c >= 'A' && c <= 'Z'; } int zubr_is_print( __mpu_char16_t c ) { return c >= 0x20 && c != 0x7f; } __mpu_char16_t zubr_to_lower( __mpu_char16_t c ) { if( c >= 'A' && c <= 'Z' ) return c - 'A' + 'a'; return c; } __mpu_char16_t zubr_to_upper( __mpu_char16_t c ) { if( c >= 'a' && c <= 'z' ) return c - 'a' + 'A'; return c; } static char *zubr_ucs2_to_utf8_dup( const __mpu_char16_t *s ) { size_t n = mpu_str16len( s ); size_t cap = n * 3 + 1; char *p = malloc( cap ); if( !p ) return NULL; if( mpu_ucs2_to_utf8( (__mpu_char8_t *)p, s, cap ) == (__mpu_size_t)-1 ) { free( p ); return NULL; } return p; } __mpu_char16_t *zubr_utf8_to_ucs2_dup( const char *s ) { size_t n = strlen( s ); __mpu_char16_t *p = malloc( (n + 1) * sizeof(*p) ); if( !p ) return NULL; if( mpu_utf8_to_ucs2( p, (const __mpu_char8_t *)s, n + 1 ) == (__mpu_size_t)-1 ) { free( p ); return NULL; } return p; } mpu_FILE *zubr_fopen( const __mpu_char16_t *filename, const char *mode ) { char *name = zubr_ucs2_to_utf8_dup( filename ); mpu_FILE *fp; if( !name ) return NULL; fp = mpu_fopen( name, mode ); free( name ); return fp; } int zubr_unlink( const __mpu_char16_t *filename ) { char *name = zubr_ucs2_to_utf8_dup( filename ); int rc; if( !name ) return -1; rc = unlink( name ); free( name ); return rc; } __mpu_char16_t *zubr_getenv( const char *name ) { char *value = getenv( name ); if( !value ) return NULL; return zubr_utf8_to_ucs2_dup( value ); } #endif