1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/xpcom/build/nsXPCOMStrings.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,379 @@ 1.4 +/* vim:set ts=2 sw=2 et cindent: */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +#include "nsString.h" 1.10 +#include "nsCharTraits.h" 1.11 + 1.12 +#include "nsXPCOMStrings.h" 1.13 +#include "nsNativeCharsetUtils.h" 1.14 + 1.15 +/* ------------------------------------------------------------------------- */ 1.16 + 1.17 +XPCOM_API(nsresult) 1.18 +NS_StringContainerInit(nsStringContainer &aContainer) 1.19 +{ 1.20 + NS_ASSERTION(sizeof(nsStringContainer_base) >= sizeof(nsString), 1.21 + "nsStringContainer is not large enough"); 1.22 + 1.23 + // use placement new to avoid heap allocating nsString object 1.24 + new (&aContainer) nsString(); 1.25 + 1.26 + return NS_OK; 1.27 +} 1.28 + 1.29 +XPCOM_API(nsresult) 1.30 +NS_StringContainerInit2(nsStringContainer &aContainer, 1.31 + const char16_t *aData, 1.32 + uint32_t aDataLength, 1.33 + uint32_t aFlags) 1.34 +{ 1.35 + NS_ASSERTION(sizeof(nsStringContainer_base) >= sizeof(nsString), 1.36 + "nsStringContainer is not large enough"); 1.37 + 1.38 + if (!aData) 1.39 + { 1.40 + new (&aContainer) nsString(); 1.41 + } 1.42 + else 1.43 + { 1.44 + if (aDataLength == UINT32_MAX) 1.45 + { 1.46 + if (NS_WARN_IF(aFlags & NS_STRING_CONTAINER_INIT_SUBSTRING)) 1.47 + return NS_ERROR_INVALID_ARG; 1.48 + aDataLength = nsCharTraits<char16_t>::length(aData); 1.49 + } 1.50 + 1.51 + if (aFlags & (NS_STRING_CONTAINER_INIT_DEPEND | 1.52 + NS_STRING_CONTAINER_INIT_ADOPT)) 1.53 + { 1.54 + uint32_t flags; 1.55 + if (aFlags & NS_STRING_CONTAINER_INIT_SUBSTRING) 1.56 + flags = nsSubstring::F_NONE; 1.57 + else 1.58 + flags = nsSubstring::F_TERMINATED; 1.59 + 1.60 + if (aFlags & NS_STRING_CONTAINER_INIT_ADOPT) 1.61 + flags |= nsSubstring::F_OWNED; 1.62 + 1.63 + new (&aContainer) nsSubstring(const_cast<char16_t *>(aData), 1.64 + aDataLength, flags); 1.65 + } 1.66 + else 1.67 + { 1.68 + new (&aContainer) nsString(aData, aDataLength); 1.69 + } 1.70 + } 1.71 + 1.72 + return NS_OK; 1.73 +} 1.74 + 1.75 +XPCOM_API(void) 1.76 +NS_StringContainerFinish(nsStringContainer &aContainer) 1.77 +{ 1.78 + // call the nsString dtor 1.79 + reinterpret_cast<nsString *>(&aContainer)->~nsString(); 1.80 +} 1.81 + 1.82 +/* ------------------------------------------------------------------------- */ 1.83 + 1.84 +XPCOM_API(uint32_t) 1.85 +NS_StringGetData(const nsAString &aStr, const char16_t **aData, 1.86 + bool *aTerminated) 1.87 +{ 1.88 + if (aTerminated) 1.89 + *aTerminated = aStr.IsTerminated(); 1.90 + 1.91 + nsAString::const_iterator begin; 1.92 + aStr.BeginReading(begin); 1.93 + *aData = begin.get(); 1.94 + return begin.size_forward(); 1.95 +} 1.96 + 1.97 +XPCOM_API(uint32_t) 1.98 +NS_StringGetMutableData(nsAString &aStr, uint32_t aDataLength, 1.99 + char16_t **aData) 1.100 +{ 1.101 + if (aDataLength != UINT32_MAX) { 1.102 + aStr.SetLength(aDataLength); 1.103 + if (aStr.Length() != aDataLength) { 1.104 + *aData = nullptr; 1.105 + return 0; 1.106 + } 1.107 + } 1.108 + 1.109 + nsAString::iterator begin; 1.110 + aStr.BeginWriting(begin); 1.111 + *aData = begin.get(); 1.112 + return begin.size_forward(); 1.113 +} 1.114 + 1.115 +XPCOM_API(char16_t *) 1.116 +NS_StringCloneData(const nsAString &aStr) 1.117 +{ 1.118 + return ToNewUnicode(aStr); 1.119 +} 1.120 + 1.121 +XPCOM_API(nsresult) 1.122 +NS_StringSetData(nsAString &aStr, const char16_t *aData, uint32_t aDataLength) 1.123 +{ 1.124 + aStr.Assign(aData, aDataLength); 1.125 + return NS_OK; // XXX report errors 1.126 +} 1.127 + 1.128 +XPCOM_API(nsresult) 1.129 +NS_StringSetDataRange(nsAString &aStr, 1.130 + uint32_t aCutOffset, uint32_t aCutLength, 1.131 + const char16_t *aData, uint32_t aDataLength) 1.132 +{ 1.133 + if (aCutOffset == UINT32_MAX) 1.134 + { 1.135 + // append case 1.136 + if (aData) 1.137 + aStr.Append(aData, aDataLength); 1.138 + return NS_OK; // XXX report errors 1.139 + } 1.140 + 1.141 + if (aCutLength == UINT32_MAX) 1.142 + aCutLength = aStr.Length() - aCutOffset; 1.143 + 1.144 + if (aData) 1.145 + { 1.146 + if (aDataLength == UINT32_MAX) 1.147 + aStr.Replace(aCutOffset, aCutLength, nsDependentString(aData)); 1.148 + else 1.149 + aStr.Replace(aCutOffset, aCutLength, Substring(aData, aDataLength)); 1.150 + } 1.151 + else 1.152 + aStr.Cut(aCutOffset, aCutLength); 1.153 + 1.154 + return NS_OK; // XXX report errors 1.155 +} 1.156 + 1.157 +XPCOM_API(nsresult) 1.158 +NS_StringCopy(nsAString &aDest, const nsAString &aSrc) 1.159 +{ 1.160 + aDest.Assign(aSrc); 1.161 + return NS_OK; // XXX report errors 1.162 +} 1.163 + 1.164 +XPCOM_API(void) 1.165 +NS_StringSetIsVoid(nsAString &aStr, const bool aIsVoid) 1.166 +{ 1.167 + aStr.SetIsVoid(aIsVoid); 1.168 +} 1.169 + 1.170 +XPCOM_API(bool) 1.171 +NS_StringGetIsVoid(const nsAString &aStr) 1.172 +{ 1.173 + return aStr.IsVoid(); 1.174 +} 1.175 + 1.176 +/* ------------------------------------------------------------------------- */ 1.177 + 1.178 +XPCOM_API(nsresult) 1.179 +NS_CStringContainerInit(nsCStringContainer &aContainer) 1.180 +{ 1.181 + NS_ASSERTION(sizeof(nsStringContainer_base) >= sizeof(nsCString), 1.182 + "nsCStringContainer is not large enough"); 1.183 + 1.184 + // use placement new to avoid heap allocating nsCString object 1.185 + new (&aContainer) nsCString(); 1.186 + 1.187 + return NS_OK; 1.188 +} 1.189 + 1.190 +XPCOM_API(nsresult) 1.191 +NS_CStringContainerInit2(nsCStringContainer &aContainer, 1.192 + const char *aData, 1.193 + uint32_t aDataLength, 1.194 + uint32_t aFlags) 1.195 +{ 1.196 + NS_ASSERTION(sizeof(nsStringContainer_base) >= sizeof(nsCString), 1.197 + "nsStringContainer is not large enough"); 1.198 + 1.199 + if (!aData) 1.200 + { 1.201 + new (&aContainer) nsCString(); 1.202 + } 1.203 + else 1.204 + { 1.205 + if (aDataLength == UINT32_MAX) 1.206 + { 1.207 + if (NS_WARN_IF(aFlags & NS_CSTRING_CONTAINER_INIT_SUBSTRING)) 1.208 + return NS_ERROR_INVALID_ARG; 1.209 + aDataLength = nsCharTraits<char>::length(aData); 1.210 + } 1.211 + 1.212 + if (aFlags & (NS_CSTRING_CONTAINER_INIT_DEPEND | 1.213 + NS_CSTRING_CONTAINER_INIT_ADOPT)) 1.214 + { 1.215 + uint32_t flags; 1.216 + if (aFlags & NS_CSTRING_CONTAINER_INIT_SUBSTRING) 1.217 + flags = nsCSubstring::F_NONE; 1.218 + else 1.219 + flags = nsCSubstring::F_TERMINATED; 1.220 + 1.221 + if (aFlags & NS_CSTRING_CONTAINER_INIT_ADOPT) 1.222 + flags |= nsCSubstring::F_OWNED; 1.223 + 1.224 + new (&aContainer) nsCSubstring(const_cast<char *>(aData), 1.225 + aDataLength, flags); 1.226 + } 1.227 + else 1.228 + { 1.229 + new (&aContainer) nsCString(aData, aDataLength); 1.230 + } 1.231 + } 1.232 + 1.233 + return NS_OK; 1.234 +} 1.235 + 1.236 +XPCOM_API(void) 1.237 +NS_CStringContainerFinish(nsCStringContainer &aContainer) 1.238 +{ 1.239 + // call the nsCString dtor 1.240 + reinterpret_cast<nsCString *>(&aContainer)->~nsCString(); 1.241 +} 1.242 + 1.243 +/* ------------------------------------------------------------------------- */ 1.244 + 1.245 +XPCOM_API(uint32_t) 1.246 +NS_CStringGetData(const nsACString &aStr, const char **aData, 1.247 + bool *aTerminated) 1.248 +{ 1.249 + if (aTerminated) 1.250 + *aTerminated = aStr.IsTerminated(); 1.251 + 1.252 + nsACString::const_iterator begin; 1.253 + aStr.BeginReading(begin); 1.254 + *aData = begin.get(); 1.255 + return begin.size_forward(); 1.256 +} 1.257 + 1.258 +XPCOM_API(uint32_t) 1.259 +NS_CStringGetMutableData(nsACString &aStr, uint32_t aDataLength, char **aData) 1.260 +{ 1.261 + if (aDataLength != UINT32_MAX) { 1.262 + aStr.SetLength(aDataLength); 1.263 + if (aStr.Length() != aDataLength) { 1.264 + *aData = nullptr; 1.265 + return 0; 1.266 + } 1.267 + } 1.268 + 1.269 + nsACString::iterator begin; 1.270 + aStr.BeginWriting(begin); 1.271 + *aData = begin.get(); 1.272 + return begin.size_forward(); 1.273 +} 1.274 + 1.275 +XPCOM_API(char *) 1.276 +NS_CStringCloneData(const nsACString &aStr) 1.277 +{ 1.278 + return ToNewCString(aStr); 1.279 +} 1.280 + 1.281 +XPCOM_API(nsresult) 1.282 +NS_CStringSetData(nsACString &aStr, const char *aData, uint32_t aDataLength) 1.283 +{ 1.284 + aStr.Assign(aData, aDataLength); 1.285 + return NS_OK; // XXX report errors 1.286 +} 1.287 + 1.288 +XPCOM_API(nsresult) 1.289 +NS_CStringSetDataRange(nsACString &aStr, 1.290 + uint32_t aCutOffset, uint32_t aCutLength, 1.291 + const char *aData, uint32_t aDataLength) 1.292 +{ 1.293 + if (aCutOffset == UINT32_MAX) 1.294 + { 1.295 + // append case 1.296 + if (aData) 1.297 + aStr.Append(aData, aDataLength); 1.298 + return NS_OK; // XXX report errors 1.299 + } 1.300 + 1.301 + if (aCutLength == UINT32_MAX) 1.302 + aCutLength = aStr.Length() - aCutOffset; 1.303 + 1.304 + if (aData) 1.305 + { 1.306 + if (aDataLength == UINT32_MAX) 1.307 + aStr.Replace(aCutOffset, aCutLength, nsDependentCString(aData)); 1.308 + else 1.309 + aStr.Replace(aCutOffset, aCutLength, Substring(aData, aDataLength)); 1.310 + } 1.311 + else 1.312 + aStr.Cut(aCutOffset, aCutLength); 1.313 + 1.314 + return NS_OK; // XXX report errors 1.315 +} 1.316 + 1.317 +XPCOM_API(nsresult) 1.318 +NS_CStringCopy(nsACString &aDest, const nsACString &aSrc) 1.319 +{ 1.320 + aDest.Assign(aSrc); 1.321 + return NS_OK; // XXX report errors 1.322 +} 1.323 + 1.324 +XPCOM_API(void) 1.325 +NS_CStringSetIsVoid(nsACString &aStr, const bool aIsVoid) 1.326 +{ 1.327 + aStr.SetIsVoid(aIsVoid); 1.328 +} 1.329 + 1.330 +XPCOM_API(bool) 1.331 +NS_CStringGetIsVoid(const nsACString &aStr) 1.332 +{ 1.333 + return aStr.IsVoid(); 1.334 +} 1.335 + 1.336 +/* ------------------------------------------------------------------------- */ 1.337 + 1.338 +XPCOM_API(nsresult) 1.339 +NS_CStringToUTF16(const nsACString &aSrc, 1.340 + nsCStringEncoding aSrcEncoding, 1.341 + nsAString &aDest) 1.342 +{ 1.343 + switch (aSrcEncoding) 1.344 + { 1.345 + case NS_CSTRING_ENCODING_ASCII: 1.346 + CopyASCIItoUTF16(aSrc, aDest); 1.347 + break; 1.348 + case NS_CSTRING_ENCODING_UTF8: 1.349 + CopyUTF8toUTF16(aSrc, aDest); 1.350 + break; 1.351 + case NS_CSTRING_ENCODING_NATIVE_FILESYSTEM: 1.352 + NS_CopyNativeToUnicode(aSrc, aDest); 1.353 + break; 1.354 + default: 1.355 + return NS_ERROR_NOT_IMPLEMENTED; 1.356 + } 1.357 + 1.358 + return NS_OK; // XXX report errors 1.359 +} 1.360 + 1.361 +XPCOM_API(nsresult) 1.362 +NS_UTF16ToCString(const nsAString &aSrc, 1.363 + nsCStringEncoding aDestEncoding, 1.364 + nsACString &aDest) 1.365 +{ 1.366 + switch (aDestEncoding) 1.367 + { 1.368 + case NS_CSTRING_ENCODING_ASCII: 1.369 + LossyCopyUTF16toASCII(aSrc, aDest); 1.370 + break; 1.371 + case NS_CSTRING_ENCODING_UTF8: 1.372 + CopyUTF16toUTF8(aSrc, aDest); 1.373 + break; 1.374 + case NS_CSTRING_ENCODING_NATIVE_FILESYSTEM: 1.375 + NS_CopyUnicodeToNative(aSrc, aDest); 1.376 + break; 1.377 + default: 1.378 + return NS_ERROR_NOT_IMPLEMENTED; 1.379 + } 1.380 + 1.381 + return NS_OK; // XXX report errors 1.382 +}