summaryrefslogtreecommitdiff
path: root/src/port.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/port.c')
-rw-r--r--src/port.c109
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