From 14210f5e34cf1784d9b102d52047f5aa93ce75e6 Mon Sep 17 00:00:00 2001 From: Kurt Zeilenga Date: Sat, 22 Jan 2000 03:40:54 +0000 Subject: [PATCH] Fix charlen and add getc --- libraries/libldap/utf-8.c | 58 +++++++++++++++++++++++++++++++++------ 1 file changed, 50 insertions(+), 8 deletions(-) diff --git a/libraries/libldap/utf-8.c b/libraries/libldap/utf-8.c index 7051b6dfdd..f2ed924bc5 100644 --- a/libraries/libldap/utf-8.c +++ b/libraries/libldap/utf-8.c @@ -38,16 +38,18 @@ ber_len_t ldap_utf8_bytes( const char * p ) ber_len_t ldap_utf8_chars( const char * p ) { - /* could be optimized */ - int chars=0; - int i=0; - unsigned char *u; + /* could be optimized and could check for invalid sequences */ + ber_len_t chars; - for( i=0; u[i]; i++) { - if ( u[i] & 0xC0 != 0x80 ) chars++; - } + for( chars=0; *p ; chars++ ) { + int charlen = ldap_utf8_charlen( p ); + + if( !charlen ) return chars; + + p = &p[charlen]; + }; - return i; + return chars; } int ldap_utf8_charlen( const char * p ) @@ -179,3 +181,43 @@ int ldap_utf8_isspace( const char * p ) return 0; } + +char* ldap_utf8_fgetc( FILE *s, char *buf ) +{ + int i; + unsigned char *p; + unsigned int c; + int len; + + if( s == NULL ) return NULL; + + p = buf; + + c = fgetc( s ); + if( c == EOF ) { + p[0] = -1; + return NULL; + } + + p[0] = c; + + len = ldap_utf8_charlen( buf ); + + if( len < 1 ) return NULL; + + for( i = 1; i < len; i++ ) { + unsigned int c = fgetc( s ); + if( c == EOF ) { + p[i] = -1; + return NULL; + } + if( c & 0xC0 != 0x80 ) { + ungetc( c, s ); + p[i] = -1; + return NULL; + } + p[i] = c; + } + + return buf; +} -- 2.39.5