| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/string_util.h" | 5 #include "base/string_util.h" |
| 6 | 6 |
| 7 #include "build/build_config.h" | 7 #include "build/build_config.h" |
| 8 | 8 |
| 9 #include <ctype.h> | 9 #include <ctype.h> |
| 10 #include <errno.h> | 10 #include <errno.h> |
| (...skipping 586 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 597 return EndsWithT(str, search, case_sensitive); | 597 return EndsWithT(str, search, case_sensitive); |
| 598 } | 598 } |
| 599 | 599 |
| 600 #if !defined(WCHAR_T_IS_UTF16) | 600 #if !defined(WCHAR_T_IS_UTF16) |
| 601 bool EndsWith(const string16& str, const string16& search, | 601 bool EndsWith(const string16& str, const string16& search, |
| 602 bool case_sensitive) { | 602 bool case_sensitive) { |
| 603 return EndsWithT(str, search, case_sensitive); | 603 return EndsWithT(str, search, case_sensitive); |
| 604 } | 604 } |
| 605 #endif | 605 #endif |
| 606 | 606 |
| 607 DataUnits GetByteDisplayUnits(int64 bytes) { | 607 static const char* const kByteStringsUnlocalized[] = { |
| 608 // The byte thresholds at which we display amounts. A byte count is displayed | 608 " B", |
| 609 // in unit U when kUnitThresholds[U] <= bytes < kUnitThresholds[U+1]. | 609 " kB", |
| 610 // This must match the DataUnits enum. | 610 " MB", |
| 611 static const int64 kUnitThresholds[] = { | 611 " GB", |
| 612 0, // DATA_UNITS_BYTE, | 612 " TB", |
| 613 3*1024, // DATA_UNITS_KIBIBYTE, | 613 " PB" |
| 614 2*1024*1024, // DATA_UNITS_MEBIBYTE, | 614 }; |
| 615 1024*1024*1024 // DATA_UNITS_GIBIBYTE, | |
| 616 }; | |
| 617 | 615 |
| 618 if (bytes < 0) { | 616 string16 FormatBytesUnlocalized(int64 bytes) { |
| 619 NOTREACHED() << "Negative bytes value"; | 617 double unit_amount = static_cast<double>(bytes); |
| 620 return DATA_UNITS_BYTE; | 618 size_t dimension = 0; |
| 619 const int kKilo = 1024; |
| 620 while (unit_amount >= kKilo && |
| 621 dimension < arraysize(kByteStringsUnlocalized) - 1) { |
| 622 unit_amount /= kKilo; |
| 623 dimension++; |
| 621 } | 624 } |
| 622 | 625 |
| 623 int unit_index = arraysize(kUnitThresholds); | 626 char buf[64]; |
| 624 while (--unit_index > 0) { | 627 if (bytes != 0 && dimension > 0 && unit_amount < 100) { |
| 625 if (bytes >= kUnitThresholds[unit_index]) | 628 base::snprintf(buf, arraysize(buf), "%.1lf%s", unit_amount, |
| 626 break; | 629 kByteStringsUnlocalized[dimension]); |
| 630 } else { |
| 631 base::snprintf(buf, arraysize(buf), "%.0lf%s", unit_amount, |
| 632 kByteStringsUnlocalized[dimension]); |
| 627 } | 633 } |
| 628 | 634 |
| 629 DCHECK(unit_index >= DATA_UNITS_BYTE && unit_index <= DATA_UNITS_GIBIBYTE); | 635 return ASCIIToUTF16(buf); |
| 630 return DataUnits(unit_index); | |
| 631 } | |
| 632 | |
| 633 // TODO(mpcomplete): deal with locale | |
| 634 // Byte suffixes. This must match the DataUnits enum. | |
| 635 static const char* const kByteStrings[] = { | |
| 636 "B", | |
| 637 "kB", | |
| 638 "MB", | |
| 639 "GB" | |
| 640 }; | |
| 641 | |
| 642 static const char* const kSpeedStrings[] = { | |
| 643 "B/s", | |
| 644 "kB/s", | |
| 645 "MB/s", | |
| 646 "GB/s" | |
| 647 }; | |
| 648 | |
| 649 string16 FormatBytesInternal(int64 bytes, | |
| 650 DataUnits units, | |
| 651 bool show_units, | |
| 652 const char* const* suffix) { | |
| 653 if (bytes < 0) { | |
| 654 NOTREACHED() << "Negative bytes value"; | |
| 655 return string16(); | |
| 656 } | |
| 657 | |
| 658 DCHECK(units >= DATA_UNITS_BYTE && units <= DATA_UNITS_GIBIBYTE); | |
| 659 | |
| 660 // Put the quantity in the right units. | |
| 661 double unit_amount = static_cast<double>(bytes); | |
| 662 for (int i = 0; i < units; ++i) | |
| 663 unit_amount /= 1024.0; | |
| 664 | |
| 665 char buf[64]; | |
| 666 if (bytes != 0 && units != DATA_UNITS_BYTE && unit_amount < 100) | |
| 667 base::snprintf(buf, arraysize(buf), "%.1lf", unit_amount); | |
| 668 else | |
| 669 base::snprintf(buf, arraysize(buf), "%.0lf", unit_amount); | |
| 670 | |
| 671 std::string ret(buf); | |
| 672 if (show_units) { | |
| 673 ret += " "; | |
| 674 ret += suffix[units]; | |
| 675 } | |
| 676 | |
| 677 return ASCIIToUTF16(ret); | |
| 678 } | |
| 679 | |
| 680 string16 FormatBytes(int64 bytes, DataUnits units, bool show_units) { | |
| 681 return FormatBytesInternal(bytes, units, show_units, kByteStrings); | |
| 682 } | |
| 683 | |
| 684 string16 FormatSpeed(int64 bytes, DataUnits units, bool show_units) { | |
| 685 return FormatBytesInternal(bytes, units, show_units, kSpeedStrings); | |
| 686 } | 636 } |
| 687 | 637 |
| 688 template<class StringType> | 638 template<class StringType> |
| 689 void DoReplaceSubstringsAfterOffset(StringType* str, | 639 void DoReplaceSubstringsAfterOffset(StringType* str, |
| 690 typename StringType::size_type start_offset, | 640 typename StringType::size_type start_offset, |
| 691 const StringType& find_this, | 641 const StringType& find_this, |
| 692 const StringType& replace_with, | 642 const StringType& replace_with, |
| 693 bool replace_all) { | 643 bool replace_all) { |
| 694 if ((start_offset == StringType::npos) || (start_offset >= str->length())) | 644 if ((start_offset == StringType::npos) || (start_offset >= str->length())) |
| 695 return; | 645 return; |
| (...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1078 } | 1028 } |
| 1079 | 1029 |
| 1080 } // namespace | 1030 } // namespace |
| 1081 | 1031 |
| 1082 size_t base::strlcpy(char* dst, const char* src, size_t dst_size) { | 1032 size_t base::strlcpy(char* dst, const char* src, size_t dst_size) { |
| 1083 return lcpyT<char>(dst, src, dst_size); | 1033 return lcpyT<char>(dst, src, dst_size); |
| 1084 } | 1034 } |
| 1085 size_t base::wcslcpy(wchar_t* dst, const wchar_t* src, size_t dst_size) { | 1035 size_t base::wcslcpy(wchar_t* dst, const wchar_t* src, size_t dst_size) { |
| 1086 return lcpyT<wchar_t>(dst, src, dst_size); | 1036 return lcpyT<wchar_t>(dst, src, dst_size); |
| 1087 } | 1037 } |
| OLD | NEW |