@@ -651,6 +651,17 @@ protected:
651
651
__CLR_OR_THIS_CALL ~time_get_byname() noexcept override {}
652
652
};
653
653
654
+ constexpr bool _Is_valid_fmt_specifier(const char _Specifier) {
655
+ constexpr char _Valid_specifiers[] = "aAbBcCdDeFgGhHIjmMnprRStTuUVwWxXyYzZ";
656
+ for (const char _Valid_specifier : _Valid_specifiers) {
657
+ if (_Valid_specifier == _Specifier) {
658
+ return true;
659
+ }
660
+ }
661
+
662
+ return false;
663
+ }
664
+
654
665
_EXPORT_STD extern "C++" template <class _Elem, class _OutIt = ostreambuf_iterator<_Elem, char_traits<_Elem>>>
655
666
class time_put : public locale::facet { // facet for converting encoded times to text
656
667
public:
@@ -687,7 +698,19 @@ public:
687
698
_Specifier = _Ctype_fac.narrow(*_Fmtfirst);
688
699
}
689
700
690
- _Dest = do_put(_Dest, _Iosbase, _Fill, _Pt, _Specifier, _Modifier); // convert a single field
701
+ if (_Specifier == '%' && _Modifier == '\0') {
702
+ // if the specifier is percent and no modifier is set, just append it
703
+ *_Dest++ = _Percent;
704
+ } else if (!_Is_valid_fmt_specifier(_Specifier)) {
705
+ // no valid specifier, directly copy as literal elements
706
+ *_Dest++ = _Percent;
707
+ if (_Modifier != '\0') {
708
+ *_Dest++ = _Modifier;
709
+ }
710
+ *_Dest++ = _Specifier;
711
+ } else {
712
+ _Dest = do_put(_Dest, _Iosbase, _Fill, _Pt, _Specifier, _Modifier); // convert a single field
713
+ }
691
714
}
692
715
}
693
716
@@ -811,7 +834,19 @@ public:
811
834
_Specifier = _Ctype_fac.narrow(*_Fmtfirst);
812
835
}
813
836
814
- _Dest = do_put(_Dest, _Iosbase, _Fill, _Pt, _Specifier, _Modifier); // convert a single field
837
+ if (_Specifier == '%' && _Modifier == '\0') {
838
+ // if the specifier is percent and no modifier is set, just append it
839
+ *_Dest++ = _Percent;
840
+ } else if (!_Is_valid_fmt_specifier(_Specifier)) {
841
+ // no valid specifier, directly copy as literal elements
842
+ *_Dest++ = _Percent;
843
+ *_Dest++ = _Raw;
844
+ if (_Modifier != '\0') {
845
+ *_Dest++ = *_Fmtfirst;
846
+ }
847
+ } else {
848
+ _Dest = do_put(_Dest, _Iosbase, _Fill, _Pt, _Specifier, _Modifier); // convert a single field
849
+ }
815
850
}
816
851
}
817
852
@@ -943,7 +978,19 @@ public:
943
978
_Specifier = _Ctype_fac.narrow(*_Fmtfirst);
944
979
}
945
980
946
- _Dest = do_put(_Dest, _Iosbase, _Fill, _Pt, _Specifier, _Modifier); // convert a single field
981
+ if (_Specifier == '%' && _Modifier == '\0') {
982
+ // if the specifier is percent and no modifier is set, just append it
983
+ *_Dest++ = _Percent;
984
+ } else if (!_Is_valid_fmt_specifier(
985
+ _Specifier)) { // no valid specifier, directly copy as literal elements
986
+ *_Dest++ = _Percent;
987
+ if (_Modifier != '\0') {
988
+ *_Dest++ = _Modifier;
989
+ }
990
+ *_Dest++ = _Specifier;
991
+ } else {
992
+ _Dest = do_put(_Dest, _Iosbase, _Fill, _Pt, _Specifier, _Modifier); // convert a single field
993
+ }
947
994
}
948
995
}
949
996
0 commit comments