Mercurial > projects > dwt-addons
diff dwtx/dwtxhelper/mangoicu/UEnumeration.d @ 92:f05207c07a98
changed filetype to unix
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Mon, 07 Jul 2008 15:54:03 +0200 |
parents | 11e8159caf7a |
children |
line wrap: on
line diff
--- a/dwtx/dwtxhelper/mangoicu/UEnumeration.d Mon Jul 07 15:53:07 2008 +0200 +++ b/dwtx/dwtxhelper/mangoicu/UEnumeration.d Mon Jul 07 15:54:03 2008 +0200 @@ -1,264 +1,264 @@ -/******************************************************************************* - - @file UEnumeration.d - - Copyright (c) 2004 Kris Bell - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for damages - of any kind arising from the use of this software. - - Permission is hereby granted to anyone to use this software for any - purpose, including commercial applications, and to alter it and/or - redistribute it freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must - not claim that you wrote the original software. If you use this - software in a product, an acknowledgment within documentation of - said product would be appreciated but is not required. - - 2. Altered source versions must be plainly marked as such, and must - not be misrepresented as being the original software. - - 3. This notice may not be removed or altered from any distribution - of the source. - - 4. Derivative works are permitted, but they must carry this notice - in full and credit the original source. - - - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - - @version Initial version, November 2004 - @author Kris - - Note that this package and documentation is built around the ICU - project (http://oss.software.ibm.com/icu/). Below is the license - statement as specified by that software: - - - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - - ICU License - ICU 1.8.1 and later - - COPYRIGHT AND PERMISSION NOTICE - - Copyright (c) 1995-2003 International Business Machines Corporation and - others. - - All rights reserved. - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, and/or sell copies of the Software, and to permit persons - to whom the Software is furnished to do so, provided that the above - copyright notice(s) and this permission notice appear in all copies of - the Software and that both the above copyright notice(s) and this - permission notice appear in supporting documentation. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT - OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL - INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING - FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION - WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - Except as contained in this notice, the name of a copyright holder - shall not be used in advertising or otherwise to promote the sale, use - or other dealings in this Software without prior written authorization - of the copyright holder. - - ---------------------------------------------------------------------- - - All trademarks and registered trademarks mentioned herein are the - property of their respective owners. - -*******************************************************************************/ - -module dwtx.dwtxhelper.mangoicu.UEnumeration; - -private import dwtx.dwtxhelper.mangoicu.ICU; - -/******************************************************************************* - - UEnumeration is returned by a number of ICU classes, for providing - access to such things as ULocale lists and so on, - -*******************************************************************************/ - -class UEnumeration : ICU -{ - package Handle handle; - - /*********************************************************************** - - ***********************************************************************/ - - this (Handle handle) - { - this.handle = handle; - } - - /*********************************************************************** - - Disposes of the storage used by a UEnumeration object - - ***********************************************************************/ - - ~this () - { - uenum_close (handle); - } - - /*********************************************************************** - - Returns the next element in the iterator's list. - - If there are no more elements, returns NULL. If the - iterator is out-of-sync with its service, status is - set to U_ENUM_OUT_OF_SYNC_ERROR and NULL is returned. - If the native service string is a UChar* string, it - is converted to char* with the invariant converter. - The result is terminated by (char)0. If the conversion - fails (because a character cannot be converted) then - status is set to U_INVARIANT_CONVERSION_ERROR and the - return value is undefined (but non-NULL). - - ***********************************************************************/ - - uint count () - { - UErrorCode e; - - uint x = uenum_count (handle, e); - testError (e, "enumeration out of sync"); - return x; - } - - /*********************************************************************** - - Resets the iterator to the current list of service IDs. - - This re-establishes sync with the service and rewinds - the iterator to start at the first element - - ***********************************************************************/ - - void reset () - { - ICU.UErrorCode e; - - uenum_reset (handle, e); - testError (e, "failed to reset enumeration"); - } - - /*********************************************************************** - - Returns the next element in the iterator's list. - - If there are no more elements, returns NULL. If the - iterator is out-of-sync with its service, status is - set to U_ENUM_OUT_OF_SYNC_ERROR and NULL is returned. - If the native service string is a char* string, it is - converted to UChar* with the invariant converter. - - ***********************************************************************/ - - bool next (out char[] dst) - { - ICU.UErrorCode e; - uint len; - - char* p = uenum_next (handle, &len, e); - testError (e, "failed to traverse enumeration"); - if (p) - return dst = p[0..len], true; - return false; - } - - /*********************************************************************** - - Returns the next element in the iterator's list. - - If there are no more elements, returns NULL. If the - iterator is out-of-sync with its service, status is - set to U_ENUM_OUT_OF_SYNC_ERROR and NULL is returned. - If the native service string is a char* string, it is - converted to UChar* with the invariant converter. - - ***********************************************************************/ - - bool next (inout wchar[] dst) - { - ICU.UErrorCode e; - uint len; - - wchar* p = uenum_unext (handle, &len, e); - testError (e, "failed to traverse enumeration"); - if (p) - return dst = p[0..len], true; - return false; - } - - - /*********************************************************************** - - Bind the ICU functions from a shared library. This is - complicated by the issues regarding D and DLLs on the - Windows platform - - ***********************************************************************/ - - private static void* library; - - /*********************************************************************** - - ***********************************************************************/ - - private static extern (C) - { - void function (Handle) uenum_close; - uint function (Handle, inout UErrorCode) uenum_count; - void function (Handle, inout UErrorCode) uenum_reset; - char* function (Handle, uint*, inout UErrorCode) uenum_next; - wchar* function (Handle, uint*, inout UErrorCode) uenum_unext; - } - - /*********************************************************************** - - ***********************************************************************/ - - static FunctionLoader.Bind[] targets = - [ - {cast(void**) &uenum_close, "uenum_close"}, - {cast(void**) &uenum_count, "uenum_count"}, - {cast(void**) &uenum_reset, "uenum_reset"}, - {cast(void**) &uenum_next, "uenum_next"}, - {cast(void**) &uenum_unext, "uenum_unext"}, - ]; - - /*********************************************************************** - - ***********************************************************************/ - - static this () - { - library = FunctionLoader.bind (icuuc, targets); - } - - /*********************************************************************** - - ***********************************************************************/ - - static ~this () - { - FunctionLoader.unbind (library); - } -} +/******************************************************************************* + + @file UEnumeration.d + + Copyright (c) 2004 Kris Bell + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for damages + of any kind arising from the use of this software. + + Permission is hereby granted to anyone to use this software for any + purpose, including commercial applications, and to alter it and/or + redistribute it freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must + not claim that you wrote the original software. If you use this + software in a product, an acknowledgment within documentation of + said product would be appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + + 3. This notice may not be removed or altered from any distribution + of the source. + + 4. Derivative works are permitted, but they must carry this notice + in full and credit the original source. + + + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + @version Initial version, November 2004 + @author Kris + + Note that this package and documentation is built around the ICU + project (http://oss.software.ibm.com/icu/). Below is the license + statement as specified by that software: + + + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + ICU License - ICU 1.8.1 and later + + COPYRIGHT AND PERMISSION NOTICE + + Copyright (c) 1995-2003 International Business Machines Corporation and + others. + + All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, and/or sell copies of the Software, and to permit persons + to whom the Software is furnished to do so, provided that the above + copyright notice(s) and this permission notice appear in all copies of + the Software and that both the above copyright notice(s) and this + permission notice appear in supporting documentation. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL + INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING + FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, + NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION + WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + Except as contained in this notice, the name of a copyright holder + shall not be used in advertising or otherwise to promote the sale, use + or other dealings in this Software without prior written authorization + of the copyright holder. + + ---------------------------------------------------------------------- + + All trademarks and registered trademarks mentioned herein are the + property of their respective owners. + +*******************************************************************************/ + +module dwtx.dwtxhelper.mangoicu.UEnumeration; + +private import dwtx.dwtxhelper.mangoicu.ICU; + +/******************************************************************************* + + UEnumeration is returned by a number of ICU classes, for providing + access to such things as ULocale lists and so on, + +*******************************************************************************/ + +class UEnumeration : ICU +{ + package Handle handle; + + /*********************************************************************** + + ***********************************************************************/ + + this (Handle handle) + { + this.handle = handle; + } + + /*********************************************************************** + + Disposes of the storage used by a UEnumeration object + + ***********************************************************************/ + + ~this () + { + uenum_close (handle); + } + + /*********************************************************************** + + Returns the next element in the iterator's list. + + If there are no more elements, returns NULL. If the + iterator is out-of-sync with its service, status is + set to U_ENUM_OUT_OF_SYNC_ERROR and NULL is returned. + If the native service string is a UChar* string, it + is converted to char* with the invariant converter. + The result is terminated by (char)0. If the conversion + fails (because a character cannot be converted) then + status is set to U_INVARIANT_CONVERSION_ERROR and the + return value is undefined (but non-NULL). + + ***********************************************************************/ + + uint count () + { + UErrorCode e; + + uint x = uenum_count (handle, e); + testError (e, "enumeration out of sync"); + return x; + } + + /*********************************************************************** + + Resets the iterator to the current list of service IDs. + + This re-establishes sync with the service and rewinds + the iterator to start at the first element + + ***********************************************************************/ + + void reset () + { + ICU.UErrorCode e; + + uenum_reset (handle, e); + testError (e, "failed to reset enumeration"); + } + + /*********************************************************************** + + Returns the next element in the iterator's list. + + If there are no more elements, returns NULL. If the + iterator is out-of-sync with its service, status is + set to U_ENUM_OUT_OF_SYNC_ERROR and NULL is returned. + If the native service string is a char* string, it is + converted to UChar* with the invariant converter. + + ***********************************************************************/ + + bool next (out char[] dst) + { + ICU.UErrorCode e; + uint len; + + char* p = uenum_next (handle, &len, e); + testError (e, "failed to traverse enumeration"); + if (p) + return dst = p[0..len], true; + return false; + } + + /*********************************************************************** + + Returns the next element in the iterator's list. + + If there are no more elements, returns NULL. If the + iterator is out-of-sync with its service, status is + set to U_ENUM_OUT_OF_SYNC_ERROR and NULL is returned. + If the native service string is a char* string, it is + converted to UChar* with the invariant converter. + + ***********************************************************************/ + + bool next (inout wchar[] dst) + { + ICU.UErrorCode e; + uint len; + + wchar* p = uenum_unext (handle, &len, e); + testError (e, "failed to traverse enumeration"); + if (p) + return dst = p[0..len], true; + return false; + } + + + /*********************************************************************** + + Bind the ICU functions from a shared library. This is + complicated by the issues regarding D and DLLs on the + Windows platform + + ***********************************************************************/ + + private static void* library; + + /*********************************************************************** + + ***********************************************************************/ + + private static extern (C) + { + void function (Handle) uenum_close; + uint function (Handle, inout UErrorCode) uenum_count; + void function (Handle, inout UErrorCode) uenum_reset; + char* function (Handle, uint*, inout UErrorCode) uenum_next; + wchar* function (Handle, uint*, inout UErrorCode) uenum_unext; + } + + /*********************************************************************** + + ***********************************************************************/ + + static FunctionLoader.Bind[] targets = + [ + {cast(void**) &uenum_close, "uenum_close"}, + {cast(void**) &uenum_count, "uenum_count"}, + {cast(void**) &uenum_reset, "uenum_reset"}, + {cast(void**) &uenum_next, "uenum_next"}, + {cast(void**) &uenum_unext, "uenum_unext"}, + ]; + + /*********************************************************************** + + ***********************************************************************/ + + static this () + { + library = FunctionLoader.bind (icuuc, targets); + } + + /*********************************************************************** + + ***********************************************************************/ + + static ~this () + { + FunctionLoader.unbind (library); + } +}