diff options
| author | kx <kx@radix-linux.su> | 2026-09-30 21:14:58 +0300 |
|---|---|---|
| committer | kx <kx@radix-linux.su> | 2026-09-30 21:14:58 +0300 |
| commit | 5b1c65152f77e03a4800fceae32d16efe2dadc9c (patch) | |
| tree | caffe4b2235503cccfedfb772dc266cb311840b3 /src/port.c | |
| parent | 8b354d2b9f2640d90705abd324a413a0d8fa3867 (diff) | |
| download | zubr-trunk.tar.xz | |
Diffstat (limited to 'src/port.c')
| -rw-r--r-- | src/port.c | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/src/port.c b/src/port.c new file mode 100644 index 0000000..38999b0 --- /dev/null +++ b/src/port.c @@ -0,0 +1,109 @@ + +#include <defs.h> + +#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 |
