Mercurial > projects > dwt-linux
diff dwt/dwthelper/utils.d @ 223:d0081b1505da
dwt.dwthelper restructure
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Thu, 10 Apr 2008 08:58:40 +0200 |
parents | ba054b4a1c55 |
children | 5366f8db1eda |
line wrap: on
line diff
--- a/dwt/dwthelper/utils.d Wed Apr 09 17:39:05 2008 +0200 +++ b/dwt/dwthelper/utils.d Thu Apr 10 08:58:40 2008 +0200 @@ -32,8 +32,6 @@ // alias tango.util.collection.model.Map.Map!(Object,Object) Map; // alias tango.util.collection.HashMap.HashMap!(Object,Object) HashMap; -public import dwt.dwthelper.Integer; - alias char[] String; alias tango.text.Text.Text!(char) StringBuffer; @@ -742,76 +740,6 @@ } - - -// import tango.core.Runtime; -private uint calcKey( void* key ){ - uint k = cast(uint)cast(void*)key; - k ^= 0x8000_0000; - return k; -} - -// private bool collectHandler(Object o){ -// uint key = calcKey( cast(void*)o ); -// if( auto p = key in mKeyCollectedNotifiers ){ -// (*p)( key ); -// mKeyCollectedNotifiers.remove( key ); -// } -// ClassInfo ci = o.classinfo; -// while(ci !is null ){ -// foreach( i; ci.interfaces ){ -// uint key = calcKey( cast(void*)o + i.offset ); -// if( auto p = key in mKeyCollectedNotifiers ){ -// (*p)( key ); -// mKeyCollectedNotifiers.remove( key ); -// } -// } -// ci = ci.base; -// } -// return true; -// } -// -// static this(){ -// Runtime.collectHandler( & collectHandler ); -// } -// -// void delegate( uint k ) KeyCollectedNotifier; -// KeyCollectedNotifier[ uint ] mKeyCollectedNotifiers; -// -// private synchronized void addKeyCollectedNotifier( uint key, KeyCollectedNotifier del ){ -// mKeyCollectedNotifiers[ key ] = del; -// } - -class WeakHashMap(K,T) { - static assert( is(K==class) || is(K==interface) ); - T[uint] data; - - private void removeInternalKey( uint key ){ - data.remove( key ); - } - - public void add (K key, T element){ - data[ calcKey(cast(void*)key) ] = element; -// addKeyCollectedNotifier( calcKey(key), &removeInternalKey ); - } - public void removeKey (K key){ - data.remove( calcKey(cast(void*)key) ); - } - public T get(K key){ - if( auto p = calcKey(cast(void*)key) in data ){ - return *p; - } - return null; - } -} -/+++ - -import dwt.dwthelper.InputStream; -InputStream ClassInfoGetResourceAsStream( ClassInfo ci, char[] aName ){ - implMissing( __FILE__, __LINE__ ); - return null; -} -+++/ void ExceptionPrintStackTrace( Exception e ){ ExceptionPrintStackTrace( e, Stderr ); } @@ -819,31 +747,6 @@ print.formatln( "Exception in {}({}): {}", e.file, e.line, e.msg ); } -bool ArrayEquals(T)( T[] a, T[] b ){ - if( a.length !is b.length ){ - return false; - } - for( int i = 0; i < a.length; i++ ){ - static if( is( T==class) || is(T==interface)){ - if( a[i] !is null && b[i] !is null ){ - if( a[i] != b[i] ){ - return false; - } - } - else if( a[i] is null && b[i] is null ){ - } - else{ - return false; - } - } - else{ - if( a[i] != b[i] ){ - return false; - } - } - } -} - interface Reader{ } interface Writer{ @@ -913,6 +816,31 @@ } +bool ArrayEquals(T)( T[] a, T[] b ){ + if( a.length !is b.length ){ + return false; + } + for( int i = 0; i < a.length; i++ ){ + static if( is( T==class) || is(T==interface)){ + if( a[i] !is null && b[i] !is null ){ + if( a[i] != b[i] ){ + return false; + } + } + else if( a[i] is null && b[i] is null ){ + } + else{ + return false; + } + } + else{ + if( a[i] != b[i] ){ + return false; + } + } + } +} + class Arrays{ public static bool equals(Object[] a, Object[] b){ if( a.length !is b.length ){ @@ -941,183 +869,6 @@ } return -1; } - -/++ - + Decode XML entities into UTF8 string. - + Eg. "&" -> "&", "&" -> "&", "&" -> "&" - + Throws TextException on failure - + The given string is modified. - +/ -char[] xmlUnescape( char[] str ){ - - void error(){ - throw new TextException( "xmlUnescape" ); - } - // < ... - // Ӓ - // ኯ - char[] src = str; - char[] trg = str; - while( src.length ){ - if( src[0] !is '&' ){ - trg[0] = src[0]; - trg = trg[1..$]; - src = src[1..$]; - } - else{ - src = src[1..$]; // go past '&' - if( src.length < 2 ) error(); - - // search semi - int len = Math.min( src.length, 10 ); // limit semi search to possible longest entityname - int semi = tango.text.Util.locate( src[0 .. len ], ';' ); - if( semi is len ) error(); // no semi found - - char[] entityName = src[ 0 .. semi ]; // name without semi - dchar entityValue = 0; - switch( entityName ){ - case "lt": entityValue = '<'; break; - case "gt": entityValue = '>'; break; - case "amp": entityValue = '&'; break; - case "quot": entityValue = '\"'; break; - case "apos": entityValue = '\''; break; - default: - if( entityName[0] is 'x' ){ - if( semi < 2 ) error(); - if( semi > 9 ) error(); - foreach( hex; entityName[1..$] ){ - entityValue <<= 4; - if( hex >= '0' && hex <= '9' ){ - entityValue |= ( hex - '0' ); - } - else if( hex >= 'a' && hex <= 'f' ){ - entityValue |= ( hex - 'a' ); - } - else if( hex >= 'A' && hex <= 'F' ){ - entityValue |= ( hex - 'A' ); - } - else{ - error(); - } - } - } - else{ - if( semi < 1 ) error(); - if( semi > 9 ) error(); - foreach( dec; entityName[1..$] ){ - if( dec >= '0' && dec <= '9' ){ - entityValue *= 10; - entityValue += ( dec - '0' ); - } - else{ - error(); - } - } - } - } - dchar[1] arr; - arr[0] = entityValue; - uint ate = 0; - char[] res = tango.text.convert.Utf.toString( arr, trg, &ate ); - trg = trg[ res.length .. $ ]; - src = src[ semi +1 .. $ ]; // go past semi - } - } - return str[ 0 .. trg.ptr-str.ptr ]; -} - - -/++ - + Encode XML entities into UTF8 string. - + First checks if processing is needed. - + If not, the original string is returned. - + If processing is needed, a new string is allocated. - +/ -char[] xmlEscape( char[] xml ){ - bool needsReplacement( dchar c ){ - switch( c ){ - case '<': - case '>': - case '&': - case '\"': - case '\'': - case '\r': - case '\n': - case '\u0009': - return true; - default: - return c > 0x7F; - } - } - - // Check if processing is needed - foreach( char c; xml ){ - if( needsReplacement( c )){ - goto Lprocess; - } - } - return xml; -Lprocess: - - // yes, do a new string, start with +20 chars - char[] res = new char[ xml.length + 20 ]; - res.length = 0; - - foreach( dchar c; xml ){ - - if( !needsReplacement( c )){ - res ~= c; - } - else{ - res ~= '&'; - switch( c ){ - case '<': res ~= "lt"; break; - case '>': res ~= "gt"; break; - case '&': res ~= "amp"; break; - case '\"': res ~= "quot"; break; - case '\'': res ~= "apos"; break; - case '\r': case '\n': case '\u0009': - default: - char toHexDigit( int i ){ - if( i < 10 ) return '0'+i; - return 'A'+i-10; - } - res ~= "#x"; - if( c <= 0xFF ){ - res ~= toHexDigit(( c >> 4 ) & 0x0F ); - res ~= toHexDigit(( c >> 0 ) & 0x0F ); - } - else if( c <= 0xFFFF ){ - res ~= toHexDigit(( c >> 12 ) & 0x0F ); - res ~= toHexDigit(( c >> 8 ) & 0x0F ); - res ~= toHexDigit(( c >> 4 ) & 0x0F ); - res ~= toHexDigit(( c >> 0 ) & 0x0F ); - } - else if( c <= 0xFFFFFF ){ - res ~= toHexDigit(( c >> 20 ) & 0x0F ); - res ~= toHexDigit(( c >> 16 ) & 0x0F ); - res ~= toHexDigit(( c >> 12 ) & 0x0F ); - res ~= toHexDigit(( c >> 8 ) & 0x0F ); - res ~= toHexDigit(( c >> 4 ) & 0x0F ); - res ~= toHexDigit(( c >> 0 ) & 0x0F ); - } - else { - res ~= toHexDigit(( c >> 28 ) & 0x0F ); - res ~= toHexDigit(( c >> 24 ) & 0x0F ); - res ~= toHexDigit(( c >> 20 ) & 0x0F ); - res ~= toHexDigit(( c >> 16 ) & 0x0F ); - res ~= toHexDigit(( c >> 12 ) & 0x0F ); - res ~= toHexDigit(( c >> 8 ) & 0x0F ); - res ~= toHexDigit(( c >> 4 ) & 0x0F ); - res ~= toHexDigit(( c >> 0 ) & 0x0F ); - } - break; - } - res ~= ';'; - } - } -} - int arrayIndexOf(T)( T[] arr, T v ){ int res = -1; int idx = 0;