added a missed file
This commit is contained in:
		
							
								
								
									
										119
									
								
								qse/lib/cmn/String.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								qse/lib/cmn/String.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,119 @@ | ||||
| /* | ||||
|  * $Id$ | ||||
|  * | ||||
|     Copyright (c) 2006-2014 Chung, Hyung-Hwan. All rights reserved. | ||||
|  | ||||
|     Redistribution and use in source and binary forms, with or without | ||||
|     modification, are permitted provided that the following conditions | ||||
|     are met: | ||||
|     1. Redistributions of source code must retain the above copyright | ||||
|        notice, this list of conditions and the following disclaimer. | ||||
|     2. Redistributions in binary form must reproduce the above copyright | ||||
|        notice, this list of conditions and the following disclaimer in the | ||||
|        documentation and/or other materials provided with the distribution. | ||||
|  | ||||
|     THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR | ||||
|     IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | ||||
|     OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | ||||
|     IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||||
|     INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||||
|     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||
|     DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||
|     THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
|     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||||
|     THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  */ | ||||
|  | ||||
| #include <qse/cmn/String.hpp> | ||||
| #include "mem.h" | ||||
|  | ||||
| #if !defined(QSE_HAVE_CONFIG_H) | ||||
| #	if defined(_WIN32) || defined(__OS2__) || defined(__DOS__) | ||||
| #		if (defined(__WATCOMC__) && (__WATCOMC__ < 1200)) || defined(__BORLANDC__) | ||||
| #			undef HAVE_VA_COPY | ||||
| #			undef HAVE___VA_COPY | ||||
| #		else | ||||
| #			define HAVE_VA_COPY | ||||
| #			define HAVE___VA_COPY | ||||
| #		endif | ||||
| #	endif | ||||
| #endif | ||||
|  | ||||
| #if !defined(HAVE_VA_COPY) | ||||
| #	if defined(HAVE___VA_COPY) | ||||
| #		define va_copy(dst,src) __va_copy((dst),(src)) | ||||
| #	else | ||||
| #		define va_copy(dst,src) QSE_MEMCPY(&(dst),&(src),QSE_SIZEOF(va_list)) | ||||
| #	endif | ||||
| #endif | ||||
|  | ||||
| ///////////////////////////////// | ||||
| QSE_BEGIN_NAMESPACE(QSE) | ||||
| ///////////////////////////////// | ||||
|  | ||||
|  | ||||
| int WcString::format (const qse_wchar_t* fmt, ...) | ||||
| { | ||||
| 	va_list ap; | ||||
| 	va_start (ap, fmt); | ||||
| 	int x = this->formatv (fmt, ap); | ||||
| 	va_end (ap); | ||||
| 	return x; | ||||
|  | ||||
| } | ||||
| int WcString::formatv (const qse_wchar_t* fmt, va_list ap) | ||||
| { | ||||
| 	va_list saved_ap; | ||||
|  | ||||
| 	va_copy (saved_ap, ap); | ||||
| 	qse_size_t n = qse_wcsxvfmt(QSE_NULL, 0, fmt, ap); | ||||
| 	if (n == (qse_size_t)-1) | ||||
| 	{ | ||||
| 		// there's mb/wc conversion error. | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	if (n > this->getCapacity()) this->possess_data (this->round_capacity(n)); | ||||
| 	else if (this->_item->isShared()) this->possess_data (); | ||||
|  | ||||
| 	qse_wcsxvfmt ((qse_wchar_t*)this->getBuffer(), this->getCapacity() + 1, fmt, saved_ap); | ||||
|  | ||||
| 	this->force_size (n); | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| ////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| int MbString::format (const qse_mchar_t* fmt, ...) | ||||
| { | ||||
| 	va_list ap; | ||||
| 	va_start (ap, fmt); | ||||
| 	int x = this->formatv (fmt, ap); | ||||
| 	va_end (ap); | ||||
| 	return x; | ||||
| } | ||||
|  | ||||
| int MbString::formatv (const qse_mchar_t* fmt, va_list ap) | ||||
| { | ||||
| 	va_list saved_ap; | ||||
|  | ||||
| 	va_copy (saved_ap, ap); | ||||
| 	qse_size_t n = qse_mbsxvfmt(QSE_NULL, 0, fmt, ap); | ||||
| 	if (n == (qse_size_t)-1) | ||||
| 	{ | ||||
| 		// there's mb/wc conversion error. | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	if (n > this->getCapacity()) this->possess_data (this->round_capacity(n)); | ||||
| 	else if (this->_item->isShared()) this->possess_data (); | ||||
|  | ||||
| 	qse_mbsxvfmt ((qse_mchar_t*)this->getBuffer(), this->getCapacity() + 1, fmt, saved_ap); | ||||
|  | ||||
| 	this->force_size (n); | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| ///////////////////////////////// | ||||
| QSE_END_NAMESPACE(QSE) | ||||
| ///////////////////////////////// | ||||
		Reference in New Issue
	
	Block a user