diff --git a/xfa/fgas/crt/cfgas_formatstring.cpp b/xfa/fgas/crt/cfgas_formatstring.cpp
index 22e9325..5c15135 100644
--- a/xfa/fgas/crt/cfgas_formatstring.cpp
+++ b/xfa/fgas/crt/cfgas_formatstring.cpp
@@ -104,30 +104,31 @@
 }
 
 CFX_WideString GetLiteralText(const wchar_t* pStrPattern,
-                              int32_t& iPattern,
+                              int32_t* iPattern,
                               int32_t iLenPattern) {
   CFX_WideString wsOutput;
-  if (pStrPattern[iPattern] != '\'') {
+  if (pStrPattern[*iPattern] != '\'')
     return wsOutput;
-  }
-  iPattern++;
+
+  (*iPattern)++;
   int32_t iQuote = 1;
-  while (iPattern < iLenPattern) {
-    if (pStrPattern[iPattern] == '\'') {
+  while (*iPattern < iLenPattern) {
+    if (pStrPattern[*iPattern] == '\'') {
       iQuote++;
-      if ((iPattern + 1 >= iLenPattern) ||
-          ((pStrPattern[iPattern + 1] != '\'') && (iQuote % 2 == 0))) {
+      if ((*iPattern + 1 >= iLenPattern) ||
+          ((pStrPattern[*iPattern + 1] != '\'') && (iQuote % 2 == 0))) {
         break;
       }
       iQuote++;
-      iPattern++;
-    } else if (pStrPattern[iPattern] == '\\' && (iPattern + 1 < iLenPattern) &&
-               pStrPattern[iPattern + 1] == 'u') {
+      (*iPattern)++;
+    } else if (pStrPattern[*iPattern] == '\\' &&
+               (*iPattern + 1 < iLenPattern) &&
+               pStrPattern[*iPattern + 1] == 'u') {
       int32_t iKeyValue = 0;
-      iPattern += 2;
+      *iPattern += 2;
       int32_t i = 0;
-      while (iPattern < iLenPattern && i++ < 4) {
-        wchar_t ch = pStrPattern[iPattern++];
+      while (*iPattern < iLenPattern && i++ < 4) {
+        wchar_t ch = pStrPattern[(*iPattern)++];
         iKeyValue = ConvertHex(iKeyValue, ch);
       }
       if (iKeyValue != 0)
@@ -135,31 +136,31 @@
 
       continue;
     }
-    wsOutput += pStrPattern[iPattern++];
+    wsOutput += pStrPattern[(*iPattern)++];
   }
   return wsOutput;
 }
 
 CFX_WideString GetLiteralTextReverse(const wchar_t* pStrPattern,
-                                     int32_t& iPattern) {
+                                     int32_t* iPattern) {
   CFX_WideString wsOutput;
-  if (pStrPattern[iPattern] != '\'')
+  if (pStrPattern[*iPattern] != '\'')
     return wsOutput;
 
-  iPattern--;
+  (*iPattern)--;
   int32_t iQuote = 1;
-  while (iPattern >= 0) {
-    if (pStrPattern[iPattern] == '\'') {
+  while (*iPattern >= 0) {
+    if (pStrPattern[*iPattern] == '\'') {
       iQuote++;
-      if (iPattern - 1 >= 0 ||
-          ((pStrPattern[iPattern - 1] != '\'') && (iQuote % 2 == 0))) {
+      if (*iPattern - 1 >= 0 ||
+          ((pStrPattern[*iPattern - 1] != '\'') && (iQuote % 2 == 0))) {
         break;
       }
       iQuote++;
-      iPattern--;
-    } else if (pStrPattern[iPattern] == '\\' &&
-               pStrPattern[iPattern + 1] == 'u') {
-      iPattern--;
+      (*iPattern)--;
+    } else if (pStrPattern[*iPattern] == '\\' &&
+               pStrPattern[*iPattern + 1] == 'u') {
+      (*iPattern)--;
       int32_t iKeyValue = 0;
       int32_t iLen = wsOutput.GetLength();
       int32_t i = 1;
@@ -173,33 +174,33 @@
       }
       continue;
     }
-    wsOutput = pStrPattern[iPattern--] + wsOutput;
+    wsOutput = pStrPattern[(*iPattern)--] + wsOutput;
   }
   return wsOutput;
 }
 
 bool GetNumericDotIndex(const CFX_WideString& wsNum,
                         const CFX_WideString& wsDotSymbol,
-                        int32_t& iDotIndex) {
+                        int32_t* iDotIndex) {
   int32_t ccf = 0;
   int32_t iLenf = wsNum.GetLength();
   const wchar_t* pStr = wsNum.c_str();
   int32_t iLenDot = wsDotSymbol.GetLength();
   while (ccf < iLenf) {
     if (pStr[ccf] == '\'') {
-      GetLiteralText(pStr, ccf, iLenf);
+      GetLiteralText(pStr, &ccf, iLenf);
     } else if (ccf + iLenDot <= iLenf &&
                !wcsncmp(pStr + ccf, wsDotSymbol.c_str(), iLenDot)) {
-      iDotIndex = ccf;
+      *iDotIndex = ccf;
       return true;
     }
     ccf++;
   }
-  iDotIndex = wsNum.Find('.');
-  if (iDotIndex >= 0)
+  *iDotIndex = wsNum.Find('.');
+  if (*iDotIndex >= 0)
     return true;
 
-  iDotIndex = iLenf;
+  *iDotIndex = iLenf;
   return false;
 }
 
@@ -207,7 +208,7 @@
                      const CFX_WideString& wsDatePattern,
                      IFX_Locale* pLocale,
                      CFX_DateTime* datetime,
-                     int32_t& cc) {
+                     int32_t* cc) {
   int32_t year = 1900;
   int32_t month = 1;
   int32_t day = 1;
@@ -217,21 +218,21 @@
   const wchar_t* strf = wsDatePattern.c_str();
   int32_t lenf = wsDatePattern.GetLength();
   CFX_WideStringC wsDateSymbols(gs_wsDateSymbols);
-  while (cc < len && ccf < lenf) {
+  while (*cc < len && ccf < lenf) {
     if (strf[ccf] == '\'') {
-      CFX_WideString wsLiteral = GetLiteralText(strf, ccf, lenf);
+      CFX_WideString wsLiteral = GetLiteralText(strf, &ccf, lenf);
       int32_t iLiteralLen = wsLiteral.GetLength();
-      if (cc + iLiteralLen > len ||
-          wcsncmp(str + cc, wsLiteral.c_str(), iLiteralLen)) {
+      if (*cc + iLiteralLen > len ||
+          wcsncmp(str + *cc, wsLiteral.c_str(), iLiteralLen)) {
         return false;
       }
-      cc += iLiteralLen;
+      *cc += iLiteralLen;
       ccf++;
       continue;
     } else if (wsDateSymbols.Find(strf[ccf]) == -1) {
-      if (strf[ccf] != str[cc])
+      if (strf[ccf] != str[*cc])
         return false;
-      cc++;
+      (*cc)++;
       ccf++;
       continue;
     }
@@ -243,41 +244,41 @@
     }
     uint32_t dwSymbol = (dwCharSymbol << 8) | (dwSymbolNum + '0');
     if (dwSymbol == FXBSTR_ID(0, 0, 'D', '1')) {
-      if (!FXSYS_isDecimalDigit(str[cc]))
+      if (!FXSYS_isDecimalDigit(str[*cc]))
         return false;
 
-      day = str[cc++] - '0';
-      if (cc < len && FXSYS_isDecimalDigit(str[cc]))
-        day = day * 10 + str[cc++] - '0';
+      day = str[(*cc)++] - '0';
+      if (*cc < len && FXSYS_isDecimalDigit(str[*cc]))
+        day = day * 10 + str[(*cc)++] - '0';
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'D', '2')) {
-      if (!FXSYS_isDecimalDigit(str[cc]))
+      if (!FXSYS_isDecimalDigit(str[*cc]))
         return false;
 
-      day = str[cc++] - '0';
-      if (cc < len)
-        day = day * 10 + str[cc++] - '0';
+      day = str[(*cc)++] - '0';
+      if (*cc < len)
+        day = day * 10 + str[(*cc)++] - '0';
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'J', '1')) {
       int i = 0;
-      while (cc < len && i < 3 && FXSYS_isDecimalDigit(str[cc])) {
-        cc++;
+      while (*cc < len && i < 3 && FXSYS_isDecimalDigit(str[*cc])) {
+        (*cc)++;
         i++;
       }
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'J', '3')) {
-      cc += 3;
+      *cc += 3;
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '1')) {
-      if (!FXSYS_isDecimalDigit(str[cc]))
+      if (!FXSYS_isDecimalDigit(str[*cc]))
         return false;
 
-      month = str[cc++] - '0';
-      if (cc < len && FXSYS_isDecimalDigit(str[cc]))
-        month = month * 10 + str[cc++] - '0';
+      month = str[(*cc)++] - '0';
+      if (*cc < len && FXSYS_isDecimalDigit(str[*cc]))
+        month = month * 10 + str[(*cc)++] - '0';
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '2')) {
-      if (!FXSYS_isDecimalDigit(str[cc]))
+      if (!FXSYS_isDecimalDigit(str[*cc]))
         return false;
 
-      month = str[cc++] - '0';
-      if (cc < len)
-        month = month * 10 + str[cc++] - '0';
+      month = str[(*cc)++] - '0';
+      if (*cc < len)
+        month = month * 10 + str[(*cc)++] - '0';
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '3')) {
       CFX_WideString wsMonthNameAbbr;
       uint16_t i = 0;
@@ -285,13 +286,13 @@
         wsMonthNameAbbr = pLocale->GetMonthName(i, true);
         if (wsMonthNameAbbr.IsEmpty())
           continue;
-        if (!wcsncmp(wsMonthNameAbbr.c_str(), str + cc,
+        if (!wcsncmp(wsMonthNameAbbr.c_str(), str + *cc,
                      wsMonthNameAbbr.GetLength())) {
           break;
         }
       }
       if (i < 12) {
-        cc += wsMonthNameAbbr.GetLength();
+        *cc += wsMonthNameAbbr.GetLength();
         month = i + 1;
       }
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '4')) {
@@ -301,15 +302,15 @@
         wsMonthName = pLocale->GetMonthName(i, false);
         if (wsMonthName.IsEmpty())
           continue;
-        if (!wcsncmp(wsMonthName.c_str(), str + cc, wsMonthName.GetLength()))
+        if (!wcsncmp(wsMonthName.c_str(), str + *cc, wsMonthName.GetLength()))
           break;
       }
       if (i < 12) {
-        cc += wsMonthName.GetLength();
+        *cc += wsMonthName.GetLength();
         month = i + 1;
       }
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'E', '1')) {
-      cc += 1;
+      *cc += 1;
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'E', '3')) {
       CFX_WideString wsDayNameAbbr;
       uint16_t i = 0;
@@ -317,13 +318,13 @@
         wsDayNameAbbr = pLocale->GetDayName(i, true);
         if (wsDayNameAbbr.IsEmpty())
           continue;
-        if (!wcsncmp(wsDayNameAbbr.c_str(), str + cc,
+        if (!wcsncmp(wsDayNameAbbr.c_str(), str + *cc,
                      wsDayNameAbbr.GetLength())) {
           break;
         }
       }
       if (i < 12)
-        cc += wsDayNameAbbr.GetLength();
+        *cc += wsDayNameAbbr.GetLength();
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'E', '4')) {
       CFX_WideString wsDayName;
       int32_t i = 0;
@@ -331,24 +332,24 @@
         wsDayName = pLocale->GetDayName(i, false);
         if (wsDayName == L"")
           continue;
-        if (!wcsncmp(wsDayName.c_str(), str + cc, wsDayName.GetLength()))
+        if (!wcsncmp(wsDayName.c_str(), str + *cc, wsDayName.GetLength()))
           break;
       }
       if (i < 12)
-        cc += wsDayName.GetLength();
+        *cc += wsDayName.GetLength();
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'e', '1')) {
-      cc += 1;
+      *cc += 1;
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'G', '1')) {
-      cc += 2;
+      *cc += 2;
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'Y', '2')) {
-      if (cc + 2 > len || !FXSYS_isDecimalDigit(str[cc]))
+      if (*cc + 2 > len || !FXSYS_isDecimalDigit(str[*cc]))
         return false;
 
-      year = str[cc++] - '0';
-      if (cc >= len || !FXSYS_isDecimalDigit(str[cc]))
+      year = str[(*cc)++] - '0';
+      if (*cc >= len || !FXSYS_isDecimalDigit(str[*cc]))
         return false;
 
-      year = year * 10 + str[cc++] - '0';
+      year = year * 10 + str[(*cc)++] - '0';
       if (year <= 29)
         year += 2000;
       else
@@ -356,35 +357,35 @@
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'Y', '4')) {
       int i = 0;
       year = 0;
-      if (cc + 4 > len)
+      if (*cc + 4 > len)
         return false;
 
       while (i < 4) {
-        if (!FXSYS_isDecimalDigit(str[cc]))
+        if (!FXSYS_isDecimalDigit(str[*cc]))
           return false;
 
-        year = year * 10 + str[cc] - '0';
-        cc++;
+        year = year * 10 + str[*cc] - '0';
+        (*cc)++;
         i++;
       }
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'w', '1')) {
-      cc += 1;
+      *cc += 1;
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'W', '2')) {
-      cc += 2;
+      *cc += 2;
     }
   }
-  if (cc < len)
+  if (*cc < len)
     return false;
 
   datetime->SetDate(year, month, day);
-  return !!cc;
+  return !!(*cc);
 }
 
-void ResolveZone(uint8_t& wHour,
-                 uint8_t& wMinute,
-                 FX_TIMEZONE tzDiff,
-                 IFX_Locale* pLocale) {
-  int32_t iMinuteDiff = wHour * 60 + wMinute;
+void ResolveZone(FX_TIMEZONE tzDiff,
+                 IFX_Locale* pLocale,
+                 uint8_t* wHour,
+                 uint8_t* wMinute) {
+  int32_t iMinuteDiff = *wHour * 60 + *wMinute;
   FX_TIMEZONE tzLocale = pLocale->GetTimeZone();
   iMinuteDiff += tzLocale.tzHour * 60 +
                  (tzLocale.tzHour < 0 ? -tzLocale.tzMinute : tzLocale.tzMinute);
@@ -395,15 +396,15 @@
   while (iMinuteDiff < 0)
     iMinuteDiff += 1440;
 
-  wHour = iMinuteDiff / 60;
-  wMinute = iMinuteDiff % 60;
+  *wHour = iMinuteDiff / 60;
+  *wMinute = iMinuteDiff % 60;
 }
 
 bool ParseLocaleTime(const CFX_WideString& wsTime,
                      const CFX_WideString& wsTimePattern,
                      IFX_Locale* pLocale,
                      CFX_DateTime* datetime,
-                     int32_t& cc) {
+                     int32_t* cc) {
   uint8_t hour = 0;
   uint8_t minute = 0;
   uint8_t second = 0;
@@ -416,22 +417,22 @@
   bool bHasA = false;
   bool bPM = false;
   CFX_WideStringC wsTimeSymbols(gs_wsTimeSymbols);
-  while (cc < len && ccf < lenf) {
+  while (*cc < len && ccf < lenf) {
     if (strf[ccf] == '\'') {
-      CFX_WideString wsLiteral = GetLiteralText(strf, ccf, lenf);
+      CFX_WideString wsLiteral = GetLiteralText(strf, &ccf, lenf);
       int32_t iLiteralLen = wsLiteral.GetLength();
-      if (cc + iLiteralLen > len ||
-          wcsncmp(str + cc, wsLiteral.c_str(), iLiteralLen)) {
+      if (*cc + iLiteralLen > len ||
+          wcsncmp(str + *cc, wsLiteral.c_str(), iLiteralLen)) {
         return false;
       }
-      cc += iLiteralLen;
+      *cc += iLiteralLen;
       ccf++;
       continue;
     }
     if (wsTimeSymbols.Find(strf[ccf]) == -1) {
-      if (strf[ccf] != str[cc])
+      if (strf[ccf] != str[*cc])
         return false;
-      cc++;
+      (*cc)++;
       ccf++;
       continue;
     }
@@ -448,106 +449,106 @@
         dwSymbol == FXBSTR_ID(0, 0, 'H', '1') ||
         dwSymbol == FXBSTR_ID(0, 0, 'h', '1') ||
         dwSymbol == FXBSTR_ID(0, 0, 'K', '1')) {
-      if (!FXSYS_isDecimalDigit(str[cc]))
+      if (!FXSYS_isDecimalDigit(str[*cc]))
         return false;
 
-      hour = str[cc++] - '0';
-      if (cc < len && FXSYS_isDecimalDigit(str[cc]))
-        hour = hour * 10 + str[cc++] - '0';
+      hour = str[(*cc)++] - '0';
+      if (*cc < len && FXSYS_isDecimalDigit(str[*cc]))
+        hour = hour * 10 + str[(*cc)++] - '0';
       if (dwSymbol == FXBSTR_ID(0, 0, 'K', '1') && hour == 24)
         hour = 0;
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'k', '2') ||
                dwSymbol == FXBSTR_ID(0, 0, 'H', '2') ||
                dwSymbol == FXBSTR_ID(0, 0, 'h', '2') ||
                dwSymbol == FXBSTR_ID(0, 0, 'K', '2')) {
-      if (!FXSYS_isDecimalDigit(str[cc]))
+      if (!FXSYS_isDecimalDigit(str[*cc]))
         return false;
 
-      hour = str[cc++] - '0';
-      if (cc >= len)
+      hour = str[(*cc)++] - '0';
+      if (*cc >= len)
         return false;
-      if (!FXSYS_isDecimalDigit(str[cc]))
+      if (!FXSYS_isDecimalDigit(str[*cc]))
         return false;
 
-      hour = hour * 10 + str[cc++] - '0';
+      hour = hour * 10 + str[(*cc)++] - '0';
       if (dwSymbol == FXBSTR_ID(0, 0, 'K', '2') && hour == 24)
         hour = 0;
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '1')) {
-      if (!FXSYS_isDecimalDigit(str[cc]))
+      if (!FXSYS_isDecimalDigit(str[*cc]))
         return false;
 
-      minute = str[cc++] - '0';
-      if (cc < len && FXSYS_isDecimalDigit(str[cc]))
-        minute = minute * 10 + str[cc++] - '0';
+      minute = str[(*cc)++] - '0';
+      if (*cc < len && FXSYS_isDecimalDigit(str[*cc]))
+        minute = minute * 10 + str[(*cc)++] - '0';
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '2')) {
-      if (!FXSYS_isDecimalDigit(str[cc]))
+      if (!FXSYS_isDecimalDigit(str[*cc]))
         return false;
 
-      minute = str[cc++] - '0';
-      if (cc >= len)
+      minute = str[(*cc)++] - '0';
+      if (*cc >= len)
         return false;
-      if (!FXSYS_isDecimalDigit(str[cc]))
+      if (!FXSYS_isDecimalDigit(str[*cc]))
         return false;
 
-      minute = minute * 10 + str[cc++] - '0';
+      minute = minute * 10 + str[(*cc)++] - '0';
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'S', '1')) {
-      if (!FXSYS_isDecimalDigit(str[cc]))
+      if (!FXSYS_isDecimalDigit(str[*cc]))
         return false;
 
-      second = str[cc++] - '0';
-      if (cc < len && FXSYS_isDecimalDigit(str[cc]))
-        second = second * 10 + str[cc++] - '0';
+      second = str[(*cc)++] - '0';
+      if (*cc < len && FXSYS_isDecimalDigit(str[*cc]))
+        second = second * 10 + str[(*cc)++] - '0';
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'S', '2')) {
-      if (!FXSYS_isDecimalDigit(str[cc]))
+      if (!FXSYS_isDecimalDigit(str[*cc]))
         return false;
 
-      second = str[cc++] - '0';
-      if (cc >= len)
+      second = str[(*cc)++] - '0';
+      if (*cc >= len)
         return false;
-      if (!FXSYS_isDecimalDigit(str[cc]))
+      if (!FXSYS_isDecimalDigit(str[*cc]))
         return false;
 
-      second = second * 10 + str[cc++] - '0';
+      second = second * 10 + str[(*cc)++] - '0';
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'F', '3')) {
-      if (cc + 3 >= len)
+      if (*cc + 3 >= len)
         return false;
 
       int i = 0;
       while (i < 3) {
-        if (!FXSYS_isDecimalDigit(str[cc]))
+        if (!FXSYS_isDecimalDigit(str[*cc]))
           return false;
 
-        millisecond = millisecond * 10 + str[cc++] - '0';
+        millisecond = millisecond * 10 + str[(*cc)++] - '0';
         i++;
       }
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'A', '1')) {
       CFX_WideString wsAM = pLocale->GetMeridiemName(true);
       CFX_WideString wsPM = pLocale->GetMeridiemName(false);
-      if ((cc + wsAM.GetLength() <= len) &&
-          (CFX_WideStringC(str + cc, wsAM.GetLength()) == wsAM)) {
-        cc += wsAM.GetLength();
+      if ((*cc + wsAM.GetLength() <= len) &&
+          (CFX_WideStringC(str + *cc, wsAM.GetLength()) == wsAM)) {
+        *cc += wsAM.GetLength();
         bHasA = true;
-      } else if ((cc + wsPM.GetLength() <= len) &&
-                 (CFX_WideStringC(str + cc, wsPM.GetLength()) == wsPM)) {
-        cc += wsPM.GetLength();
+      } else if ((*cc + wsPM.GetLength() <= len) &&
+                 (CFX_WideStringC(str + *cc, wsPM.GetLength()) == wsPM)) {
+        *cc += wsPM.GetLength();
         bHasA = true;
         bPM = true;
       }
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'Z', '1')) {
-      if (cc + 3 > len)
+      if (*cc + 3 > len)
         continue;
 
-      uint32_t dwHash = str[cc++];
-      dwHash = (dwHash << 8) | str[cc++];
-      dwHash = (dwHash << 8) | str[cc++];
+      uint32_t dwHash = str[(*cc)++];
+      dwHash = (dwHash << 8) | str[(*cc)++];
+      dwHash = (dwHash << 8) | str[(*cc)++];
       if (dwHash == FXBSTR_ID(0, 'G', 'M', 'T')) {
         FX_TIMEZONE tzDiff;
         tzDiff.tzHour = 0;
         tzDiff.tzMinute = 0;
-        if (cc < len && (str[cc] == '-' || str[cc] == '+'))
-          cc += ParseTimeZone(str + cc, len - cc, &tzDiff);
+        if (*cc < len && (str[*cc] == '-' || str[*cc] == '+'))
+          *cc += ParseTimeZone(str + *cc, len - *cc, &tzDiff);
 
-        ResolveZone(hour, minute, tzDiff, pLocale);
+        ResolveZone(tzDiff, pLocale, &hour, &minute);
       } else {
         const FX_LOCALETIMEZONEINFO* pEnd =
             g_FXLocaleTimeZoneData + FX_ArraySize(g_FXLocaleTimeZoneData);
@@ -562,12 +563,12 @@
         }
       }
     } else if (dwSymbol == FXBSTR_ID(0, 0, 'z', '1')) {
-      if (str[cc] != 'Z') {
+      if (str[*cc] != 'Z') {
         FX_TIMEZONE tzDiff;
-        cc += ParseTimeZone(str + cc, len - cc, &tzDiff);
-        ResolveZone(hour, minute, tzDiff, pLocale);
+        *cc += ParseTimeZone(str + *cc, len - *cc, &tzDiff);
+        ResolveZone(tzDiff, pLocale, &hour, &minute);
       } else {
-        cc++;
+        (*cc)++;
       }
     }
   }
@@ -582,12 +583,12 @@
     }
   }
   datetime->SetTime(hour, minute, second, millisecond);
-  return !!cc;
+  return !!(*cc);
 }
 
 int32_t GetNumTrailingLimit(const CFX_WideString& wsFormat,
                             int iDotPos,
-                            bool& bTrimTailZeros) {
+                            bool* bTrimTailZeros) {
   if (iDotPos < 0)
     return 0;
 
@@ -597,7 +598,7 @@
     wchar_t wc = wsFormat[iDotPos];
     if (wc == L'z' || wc == L'9' || wc == 'Z') {
       iTreading++;
-      bTrimTailZeros = wc != L'9';
+      *bTrimTailZeros = wc != L'9';
     }
   }
   return iTreading;
@@ -646,11 +647,10 @@
   return week_index;
 }
 
-bool DateFormat(const CFX_WideString& wsDatePattern,
-                IFX_Locale* pLocale,
-                const CFX_DateTime& datetime,
-                CFX_WideString& wsResult) {
-  bool bRet = true;
+CFX_WideString DateFormat(const CFX_WideString& wsDatePattern,
+                          IFX_Locale* pLocale,
+                          const CFX_DateTime& datetime) {
+  CFX_WideString wsResult;
   int32_t year = datetime.GetYear();
   uint8_t month = datetime.GetMonth();
   uint8_t day = datetime.GetDay();
@@ -660,7 +660,7 @@
   CFX_WideStringC wsDateSymbols(gs_wsDateSymbols);
   while (ccf < lenf) {
     if (strf[ccf] == '\'') {
-      wsResult += GetLiteralText(strf, ccf, lenf);
+      wsResult += GetLiteralText(strf, &ccf, lenf);
       ccf++;
       continue;
     }
@@ -753,13 +753,13 @@
       wsResult += wsWeekInYear;
     }
   }
-  return bRet;
+  return wsResult;
 }
 
-bool TimeFormat(const CFX_WideString& wsTimePattern,
-                IFX_Locale* pLocale,
-                const CFX_DateTime& datetime,
-                CFX_WideString& wsResult) {
+CFX_WideString TimeFormat(const CFX_WideString& wsTimePattern,
+                          IFX_Locale* pLocale,
+                          const CFX_DateTime& datetime) {
+  CFX_WideString wsResult;
   uint8_t hour = datetime.GetHour();
   uint8_t minute = datetime.GetMinute();
   uint8_t second = datetime.GetSecond();
@@ -777,7 +777,7 @@
   CFX_WideStringC wsTimeSymbols(gs_wsTimeSymbols);
   while (ccf < lenf) {
     if (strf[ccf] == '\'') {
-      wsResult += GetLiteralText(strf, ccf, lenf);
+      wsResult += GetLiteralText(strf, &ccf, lenf);
       ccf++;
       continue;
     }
@@ -880,26 +880,23 @@
       }
     }
   }
-  return true;
+  return wsResult;
 }
 
-bool FormatDateTimeInternal(const CFX_DateTime& dt,
-                            const CFX_WideString& wsDatePattern,
-                            const CFX_WideString& wsTimePattern,
-                            bool bDateFirst,
-                            IFX_Locale* pLocale,
-                            CFX_WideString& wsOutput) {
-  bool bRet = true;
+CFX_WideString FormatDateTimeInternal(const CFX_DateTime& dt,
+                                      const CFX_WideString& wsDatePattern,
+                                      const CFX_WideString& wsTimePattern,
+                                      bool bDateFirst,
+                                      IFX_Locale* pLocale) {
   CFX_WideString wsDateOut;
   if (!wsDatePattern.IsEmpty())
-    bRet &= DateFormat(wsDatePattern, pLocale, dt, wsDateOut);
+    wsDateOut = DateFormat(wsDatePattern, pLocale, dt);
 
   CFX_WideString wsTimeOut;
   if (!wsTimePattern.IsEmpty())
-    bRet &= TimeFormat(wsTimePattern, pLocale, dt, wsTimeOut);
+    wsTimeOut = TimeFormat(wsTimePattern, pLocale, dt);
 
-  wsOutput = bDateFirst ? wsDateOut + wsTimeOut : wsTimeOut + wsDateOut;
-  return bRet;
+  return bDateFirst ? wsDateOut + wsTimeOut : wsTimeOut + wsDateOut;
 }
 
 }  // namespace
@@ -1056,7 +1053,7 @@
         if (str[cc] != 'Z')
           cc += ParseTimeZone(str + cc, len - cc, &tzDiff);
 
-        ResolveZone(hour, minute, tzDiff, pLocale);
+        ResolveZone(tzDiff, pLocale, &hour, &minute);
         break;
       }
 
@@ -1067,7 +1064,7 @@
         if (str[cc] != 'Z')
           cc += ParseTimeZone(str + cc, len - cc, &tzDiff);
 
-        ResolveZone(hour, minute, tzDiff, pLocale);
+        ResolveZone(tzDiff, pLocale, &hour, &minute);
       }
     }
   }
@@ -1082,7 +1079,7 @@
 
 void CFGAS_FormatString::SplitFormatString(
     const CFX_WideString& wsFormatString,
-    std::vector<CFX_WideString>& wsPatterns) {
+    std::vector<CFX_WideString>* wsPatterns) {
   int32_t iStrLen = wsFormatString.GetLength();
   const wchar_t* pStr = wsFormatString.c_str();
   const wchar_t* pToken = pStr;
@@ -1090,13 +1087,13 @@
   bool iQuote = false;
   while (true) {
     if (pStr >= pEnd) {
-      wsPatterns.push_back(CFX_WideString(pToken, pStr - pToken));
+      wsPatterns->push_back(CFX_WideString(pToken, pStr - pToken));
       return;
     }
     if (*pStr == '\'') {
       iQuote = !iQuote;
     } else if (*pStr == L'|' && !iQuote) {
-      wsPatterns.push_back(CFX_WideString(pToken, pStr - pToken));
+      wsPatterns->push_back(CFX_WideString(pToken, pStr - pToken));
       pToken = pStr + 1;
     }
     pStr++;
@@ -1113,7 +1110,7 @@
   CFX_WideStringC wsConstChars(gs_wsConstChars);
   while (ccf < iLenf) {
     if (pStr[ccf] == '\'') {
-      GetLiteralText(pStr, ccf, iLenf);
+      GetLiteralText(pStr, &ccf, iLenf);
     } else if (!bBraceOpen && wsConstChars.Find(pStr[ccf]) == -1) {
       CFX_WideString wsCategory(pStr[ccf]);
       ccf++;
@@ -1158,18 +1155,19 @@
   return eCategory;
 }
 
-void CFGAS_FormatString::GetTextFormat(const CFX_WideString& wsPattern,
-                                       const CFX_WideStringC& wsCategory,
-                                       CFX_WideString& wsPurgePattern) {
+CFX_WideString CFGAS_FormatString::GetTextFormat(
+    const CFX_WideString& wsPattern,
+    const CFX_WideStringC& wsCategory) {
   int32_t ccf = 0;
   int32_t iLenf = wsPattern.GetLength();
   const wchar_t* pStr = wsPattern.c_str();
   bool bBrackOpen = false;
   CFX_WideStringC wsConstChars(gs_wsConstChars);
+  CFX_WideString wsPurgePattern;
   while (ccf < iLenf) {
     if (pStr[ccf] == '\'') {
       int32_t iCurChar = ccf;
-      GetLiteralText(pStr, ccf, iLenf);
+      GetLiteralText(pStr, &ccf, iLenf);
       wsPurgePattern += CFX_WideStringC(pStr + iCurChar, ccf - iCurChar + 1);
     } else if (!bBrackOpen && wsConstChars.Find(pStr[ccf]) == -1) {
       CFX_WideString wsSearchCategory(pStr[ccf]);
@@ -1201,14 +1199,16 @@
   }
   if (!bBrackOpen)
     wsPurgePattern = wsPattern;
+
+  return wsPurgePattern;
 }
 
 IFX_Locale* CFGAS_FormatString::GetNumericFormat(
     const CFX_WideString& wsPattern,
-    int32_t& iDotIndex,
-    uint32_t& dwStyle,
-    CFX_WideString& wsPurgePattern) {
-  dwStyle = 0;
+    int32_t* iDotIndex,
+    uint32_t* dwStyle,
+    CFX_WideString* wsPurgePattern) {
+  *dwStyle = 0;
   IFX_Locale* pLocale = nullptr;
   int32_t ccf = 0;
   int32_t iLenf = wsPattern.GetLength();
@@ -1219,8 +1219,8 @@
   while (ccf < iLenf) {
     if (pStr[ccf] == '\'') {
       int32_t iCurChar = ccf;
-      GetLiteralText(pStr, ccf, iLenf);
-      wsPurgePattern += CFX_WideStringC(pStr + iCurChar, ccf - iCurChar + 1);
+      GetLiteralText(pStr, &ccf, iLenf);
+      *wsPurgePattern += CFX_WideStringC(pStr + iCurChar, ccf - iCurChar + 1);
     } else if (!bBrackOpen && wsConstChars.Find(pStr[ccf]) == -1) {
       CFX_WideString wsCategory(pStr[ccf]);
       ccf++;
@@ -1267,40 +1267,40 @@
           ASSERT(pLocale);
 
           wsSubCategory = pLocale->GetNumPattern(eSubCategory);
-          iDotIndex = wsSubCategory.Find('.');
-          if (iDotIndex > 0) {
-            iDotIndex += wsPurgePattern.GetLength();
+          *iDotIndex = wsSubCategory.Find('.');
+          if (*iDotIndex > 0) {
+            *iDotIndex += wsPurgePattern->GetLength();
             bFindDot = true;
-            dwStyle |= FX_NUMSTYLE_DotVorv;
+            *dwStyle |= FX_NUMSTYLE_DotVorv;
           }
-          wsPurgePattern += wsSubCategory;
+          *wsPurgePattern += wsSubCategory;
           if (eSubCategory == FX_LOCALENUMPATTERN_Percent)
-            dwStyle |= FX_NUMSTYLE_Percent;
+            *dwStyle |= FX_NUMSTYLE_Percent;
 
           continue;
         }
         ccf++;
       }
     } else if (pStr[ccf] == 'E') {
-      dwStyle |= FX_NUMSTYLE_Exponent;
-      wsPurgePattern += pStr[ccf];
+      *dwStyle |= FX_NUMSTYLE_Exponent;
+      *wsPurgePattern += pStr[ccf];
     } else if (pStr[ccf] == '%') {
-      dwStyle |= FX_NUMSTYLE_Percent;
-      wsPurgePattern += pStr[ccf];
+      *dwStyle |= FX_NUMSTYLE_Percent;
+      *wsPurgePattern += pStr[ccf];
     } else if (pStr[ccf] != '}') {
-      wsPurgePattern += pStr[ccf];
+      *wsPurgePattern += pStr[ccf];
     }
     if (!bFindDot) {
       if (pStr[ccf] == '.' || pStr[ccf] == 'V' || pStr[ccf] == 'v') {
         bFindDot = true;
-        iDotIndex = wsPurgePattern.GetLength() - 1;
-        dwStyle |= FX_NUMSTYLE_DotVorv;
+        *iDotIndex = wsPurgePattern->GetLength() - 1;
+        *dwStyle |= FX_NUMSTYLE_DotVorv;
       }
     }
     ccf++;
   }
   if (!bFindDot)
-    iDotIndex = wsPurgePattern.GetLength();
+    *iDotIndex = wsPurgePattern->GetLength();
   if (!pLocale)
     pLocale = m_pLocaleMgr->GetDefLocale();
   return pLocale;
@@ -1308,13 +1308,12 @@
 
 bool CFGAS_FormatString::ParseText(const CFX_WideString& wsSrcText,
                                    const CFX_WideString& wsPattern,
-                                   CFX_WideString& wsValue) {
-  wsValue.clear();
+                                   CFX_WideString* wsValue) {
+  wsValue->clear();
   if (wsSrcText.IsEmpty() || wsPattern.IsEmpty())
     return false;
 
-  CFX_WideString wsTextFormat;
-  GetTextFormat(wsPattern, L"text", wsTextFormat);
+  CFX_WideString wsTextFormat = GetTextFormat(wsPattern, L"text");
   if (wsTextFormat.IsEmpty())
     return false;
 
@@ -1328,11 +1327,11 @@
     switch (pStrPattern[iPattern]) {
       case '\'': {
         CFX_WideString wsLiteral =
-            GetLiteralText(pStrPattern, iPattern, iLenPattern);
+            GetLiteralText(pStrPattern, &iPattern, iLenPattern);
         int32_t iLiteralLen = wsLiteral.GetLength();
         if (iText + iLiteralLen > iLenText ||
             wcsncmp(pStrText + iText, wsLiteral.c_str(), iLiteralLen)) {
-          wsValue = wsSrcText;
+          *wsValue = wsSrcText;
           return false;
         }
         iText += iLiteralLen;
@@ -1341,13 +1340,13 @@
       }
       case 'A':
         if (FXSYS_iswalpha(pStrText[iText])) {
-          wsValue += pStrText[iText];
+          *wsValue += pStrText[iText];
           iText++;
         }
         iPattern++;
         break;
       case 'X':
-        wsValue += pStrText[iText];
+        *wsValue += pStrText[iText];
         iText++;
         iPattern++;
         break;
@@ -1355,21 +1354,21 @@
       case '0':
         if (FXSYS_isDecimalDigit(pStrText[iText]) ||
             FXSYS_iswalpha(pStrText[iText])) {
-          wsValue += pStrText[iText];
+          *wsValue += pStrText[iText];
           iText++;
         }
         iPattern++;
         break;
       case '9':
         if (FXSYS_isDecimalDigit(pStrText[iText])) {
-          wsValue += pStrText[iText];
+          *wsValue += pStrText[iText];
           iText++;
         }
         iPattern++;
         break;
       default:
         if (pStrPattern[iPattern] != pStrText[iText]) {
-          wsValue = wsSrcText;
+          *wsValue = wsSrcText;
           return false;
         }
         iPattern++;
@@ -1382,8 +1381,8 @@
 
 bool CFGAS_FormatString::ParseNum(const CFX_WideString& wsSrcNum,
                                   const CFX_WideString& wsPattern,
-                                  CFX_WideString& wsValue) {
-  wsValue.clear();
+                                  CFX_WideString* wsValue) {
+  wsValue->clear();
   if (wsSrcNum.IsEmpty() || wsPattern.IsEmpty())
     return false;
 
@@ -1391,7 +1390,7 @@
   uint32_t dwFormatStyle = 0;
   CFX_WideString wsNumFormat;
   IFX_Locale* pLocale =
-      GetNumericFormat(wsPattern, dot_index_f, dwFormatStyle, wsNumFormat);
+      GetNumericFormat(wsPattern, &dot_index_f, &dwFormatStyle, &wsNumFormat);
   if (!pLocale || wsNumFormat.IsEmpty())
     return false;
 
@@ -1411,7 +1410,7 @@
   bool bNeg = false;
   bool bReverseParse = false;
   int32_t dot_index = 0;
-  if (!GetNumericDotIndex(wsSrcNum, wsDotSymbol, dot_index) &&
+  if (!GetNumericDotIndex(wsSrcNum, wsDotSymbol, &dot_index) &&
       (dwFormatStyle & FX_NUMSTYLE_DotVorv)) {
     bReverseParse = true;
   }
@@ -1421,7 +1420,7 @@
   while (ccf >= 0 && cc >= 0) {
     switch (strf[ccf]) {
       case '\'': {
-        CFX_WideString wsLiteral = GetLiteralTextReverse(strf, ccf);
+        CFX_WideString wsLiteral = GetLiteralTextReverse(strf, &ccf);
         int32_t iLiteralLen = wsLiteral.GetLength();
         cc -= iLiteralLen - 1;
         if (cc < 0 || wcsncmp(str + cc, wsLiteral.c_str(), iLiteralLen))
@@ -1435,13 +1434,13 @@
         if (!FXSYS_isDecimalDigit(str[cc]))
           return false;
 
-        wsValue = str[cc] + wsValue;
+        wsValue->Insert(0, str[cc]);
         cc--;
         ccf--;
         break;
       case 'z':
         if (FXSYS_isDecimalDigit(str[cc])) {
-          wsValue = str[cc] + wsValue;
+          wsValue->Insert(0, str[cc]);
           cc--;
         }
         ccf--;
@@ -1449,7 +1448,7 @@
       case 'Z':
         if (str[cc] != ' ') {
           if (FXSYS_isDecimalDigit(str[cc])) {
-            wsValue = str[cc] + wsValue;
+            wsValue->Insert(0, str[cc]);
             cc--;
           }
         } else {
@@ -1641,14 +1640,14 @@
       return false;
   }
   if (dot_index < len && (dwFormatStyle & FX_NUMSTYLE_DotVorv))
-    wsValue += '.';
+    *wsValue += '.';
   if (!bReverseParse) {
     ccf = dot_index_f + 1;
     cc = (dot_index == len) ? len : dot_index + 1;
     while (cc < len && ccf < lenf) {
       switch (strf[ccf]) {
         case '\'': {
-          CFX_WideString wsLiteral = GetLiteralText(strf, ccf, lenf);
+          CFX_WideString wsLiteral = GetLiteralText(strf, &ccf, lenf);
           int32_t iLiteralLen = wsLiteral.GetLength();
           if (cc + iLiteralLen > len ||
               wcsncmp(str + cc, wsLiteral.c_str(), iLiteralLen)) {
@@ -1662,13 +1661,13 @@
           if (!FXSYS_isDecimalDigit(str[cc]))
             return false;
 
-          wsValue += str[cc];
+          *wsValue += str[cc];
           cc++;
           ccf++;
           break;
         case 'z':
           if (FXSYS_isDecimalDigit(str[cc])) {
-            wsValue += str[cc];
+            *wsValue += str[cc];
             cc++;
           }
           ccf++;
@@ -1676,7 +1675,7 @@
         case 'Z':
           if (str[cc] != ' ') {
             if (FXSYS_isDecimalDigit(str[cc])) {
-              wsValue += str[cc];
+              *wsValue += str[cc];
               cc++;
             }
           } else {
@@ -1807,7 +1806,7 @@
             ccf++;
 
           while (cc < len && FXSYS_isDecimalDigit(str[cc])) {
-            wsValue += str[cc];
+            *wsValue += str[cc];
             cc++;
           }
         } break;
@@ -1849,7 +1848,7 @@
       return false;
   }
   if (iExponent || bHavePercentSymbol) {
-    CFX_Decimal decimal = CFX_Decimal(wsValue.AsStringC());
+    CFX_Decimal decimal = CFX_Decimal(wsValue->AsStringC());
     if (iExponent) {
       decimal = decimal *
                 CFX_Decimal(FXSYS_pow(10, static_cast<float>(iExponent)), 3);
@@ -1857,20 +1856,20 @@
     if (bHavePercentSymbol)
       decimal = decimal / CFX_Decimal(100);
 
-    wsValue = decimal;
+    *wsValue = decimal;
   }
   if (bNeg)
-    wsValue = L'-' + wsValue;
+    wsValue->Insert(0, L'-');
 
   return true;
 }
 
 FX_DATETIMETYPE CFGAS_FormatString::GetDateTimeFormat(
     const CFX_WideString& wsPattern,
-    IFX_Locale*& pLocale,
-    CFX_WideString& wsDatePattern,
-    CFX_WideString& wsTimePattern) {
-  pLocale = nullptr;
+    IFX_Locale** pLocale,
+    CFX_WideString* wsDatePattern,
+    CFX_WideString* wsTimePattern) {
+  *pLocale = nullptr;
   CFX_WideString wsTempPattern;
   FX_LOCALECATEGORY eCategory = FX_LOCALECATEGORY_Unknown;
   int32_t ccf = 0;
@@ -1882,7 +1881,7 @@
   while (ccf < iLenf) {
     if (pStr[ccf] == '\'') {
       int32_t iCurChar = ccf;
-      GetLiteralText(pStr, ccf, iLenf);
+      GetLiteralText(pStr, &ccf, iLenf);
       wsTempPattern += CFX_WideStringC(pStr + iCurChar, ccf - iCurChar + 1);
     } else if (!bBraceOpen && iFindCategory != 3 &&
                wsConstChars.Find(pStr[ccf]) == -1) {
@@ -1891,11 +1890,11 @@
       while (ccf < iLenf && pStr[ccf] != '{' && pStr[ccf] != '.' &&
              pStr[ccf] != '(') {
         if (pStr[ccf] == 'T') {
-          wsDatePattern = wsPattern.Left(ccf);
-          wsTimePattern = wsPattern.Right(wsPattern.GetLength() - ccf);
-          wsTimePattern.SetAt(0, ' ');
-          if (!pLocale)
-            pLocale = m_pLocaleMgr->GetDefLocale();
+          *wsDatePattern = wsPattern.Left(ccf);
+          *wsTimePattern = wsPattern.Right(wsPattern.GetLength() - ccf);
+          wsTimePattern->SetAt(0, ' ');
+          if (!*pLocale)
+            *pLocale = m_pLocaleMgr->GetDefLocale();
 
           return FX_DATETIMETYPE_DateTime;
         }
@@ -1923,7 +1922,7 @@
           while (ccf < iLenf && pStr[ccf] != ')')
             wsLCID += pStr[ccf++];
 
-          pLocale = m_pLocaleMgr->GetLocaleByName(wsLCID);
+          *pLocale = m_pLocaleMgr->GetLocaleByName(wsLCID);
         } else if (pStr[ccf] == '{') {
           bBraceOpen = true;
           break;
@@ -1945,23 +1944,23 @@
               break;
             }
           }
-          if (!pLocale)
-            pLocale = m_pLocaleMgr->GetDefLocale();
-          ASSERT(pLocale);
+          if (!*pLocale)
+            *pLocale = m_pLocaleMgr->GetDefLocale();
+          ASSERT(*pLocale);
 
           switch (eCategory) {
             case FX_LOCALECATEGORY_Date:
-              wsDatePattern =
-                  wsTempPattern + pLocale->GetDatePattern(eSubCategory);
+              *wsDatePattern =
+                  wsTempPattern + (*pLocale)->GetDatePattern(eSubCategory);
               break;
             case FX_LOCALECATEGORY_Time:
-              wsTimePattern =
-                  wsTempPattern + pLocale->GetTimePattern(eSubCategory);
+              *wsTimePattern =
+                  wsTempPattern + (*pLocale)->GetTimePattern(eSubCategory);
               break;
             case FX_LOCALECATEGORY_DateTime:
-              wsDatePattern =
-                  wsTempPattern + pLocale->GetDatePattern(eSubCategory);
-              wsTimePattern = pLocale->GetTimePattern(eSubCategory);
+              *wsDatePattern =
+                  wsTempPattern + (*pLocale)->GetDatePattern(eSubCategory);
+              *wsTimePattern = (*pLocale)->GetTimePattern(eSubCategory);
               break;
             default:
               break;
@@ -1975,9 +1974,9 @@
       bBraceOpen = false;
       if (!wsTempPattern.IsEmpty()) {
         if (eCategory == FX_LOCALECATEGORY_Time)
-          wsTimePattern = wsTempPattern;
+          *wsTimePattern = wsTempPattern;
         else if (eCategory == FX_LOCALECATEGORY_Date)
-          wsDatePattern = wsTempPattern;
+          *wsDatePattern = wsTempPattern;
 
         wsTempPattern.clear();
       }
@@ -1989,15 +1988,15 @@
 
   if (!wsTempPattern.IsEmpty()) {
     if (eCategory == FX_LOCALECATEGORY_Date)
-      wsDatePattern += wsTempPattern;
+      *wsDatePattern += wsTempPattern;
     else
-      wsTimePattern += wsTempPattern;
+      *wsTimePattern += wsTempPattern;
   }
-  if (!pLocale)
-    pLocale = m_pLocaleMgr->GetDefLocale();
+  if (!*pLocale)
+    *pLocale = m_pLocaleMgr->GetDefLocale();
   if (!iFindCategory) {
-    wsTimePattern.clear();
-    wsDatePattern = wsPattern;
+    wsTimePattern->clear();
+    *wsDatePattern = wsPattern;
   }
   return (FX_DATETIMETYPE)iFindCategory;
 }
@@ -2014,7 +2013,7 @@
   CFX_WideString wsTimePattern;
   IFX_Locale* pLocale = nullptr;
   FX_DATETIMETYPE eCategory =
-      GetDateTimeFormat(wsPattern, pLocale, wsDatePattern, wsTimePattern);
+      GetDateTimeFormat(wsPattern, &pLocale, &wsDatePattern, &wsTimePattern);
   if (!pLocale)
     return false;
   if (eCategory == FX_DATETIMETYPE_Unknown)
@@ -2024,23 +2023,23 @@
   if (eCategory == FX_DATETIMETYPE_TimeDate) {
     int32_t iStart = 0;
     if (!ParseLocaleTime(wsSrcDateTime, wsTimePattern, pLocale, dtValue,
-                         iStart)) {
+                         &iStart)) {
       return false;
     }
     if (!ParseLocaleDate(wsSrcDateTime, wsDatePattern, pLocale, dtValue,
-                         iStart)) {
+                         &iStart)) {
       return false;
     }
   } else {
     int32_t iStart = 0;
     if ((eCategory & FX_DATETIMETYPE_Date) &&
         !ParseLocaleDate(wsSrcDateTime, wsDatePattern, pLocale, dtValue,
-                         iStart)) {
+                         &iStart)) {
       return false;
     }
     if ((eCategory & FX_DATETIMETYPE_Time) &&
         !ParseLocaleTime(wsSrcDateTime, wsTimePattern, pLocale, dtValue,
-                         iStart)) {
+                         &iStart)) {
       return false;
     }
   }
@@ -2049,8 +2048,7 @@
 
 bool CFGAS_FormatString::ParseZero(const CFX_WideString& wsSrcText,
                                    const CFX_WideString& wsPattern) {
-  CFX_WideString wsTextFormat;
-  GetTextFormat(wsPattern, L"zero", wsTextFormat);
+  CFX_WideString wsTextFormat = GetTextFormat(wsPattern, L"zero");
 
   int32_t iText = 0;
   int32_t iPattern = 0;
@@ -2061,7 +2059,7 @@
   while (iPattern < iLenPattern && iText < iLenText) {
     if (pStrPattern[iPattern] == '\'') {
       CFX_WideString wsLiteral =
-          GetLiteralText(pStrPattern, iPattern, iLenPattern);
+          GetLiteralText(pStrPattern, &iPattern, iLenPattern);
       int32_t iLiteralLen = wsLiteral.GetLength();
       if (iText + iLiteralLen > iLenText ||
           wcsncmp(pStrText + iText, wsLiteral.c_str(), iLiteralLen)) {
@@ -2082,8 +2080,7 @@
 
 bool CFGAS_FormatString::ParseNull(const CFX_WideString& wsSrcText,
                                    const CFX_WideString& wsPattern) {
-  CFX_WideString wsTextFormat;
-  GetTextFormat(wsPattern, L"null", wsTextFormat);
+  CFX_WideString wsTextFormat = GetTextFormat(wsPattern, L"null");
 
   int32_t iText = 0;
   int32_t iPattern = 0;
@@ -2094,7 +2091,7 @@
   while (iPattern < iLenPattern && iText < iLenText) {
     if (pStrPattern[iPattern] == '\'') {
       CFX_WideString wsLiteral =
-          GetLiteralText(pStrPattern, iPattern, iLenPattern);
+          GetLiteralText(pStrPattern, &iPattern, iLenPattern);
       int32_t iLiteralLen = wsLiteral.GetLength();
       if (iText + iLiteralLen > iLenText ||
           wcsncmp(pStrText + iText, wsLiteral.c_str(), iLiteralLen)) {
@@ -2115,7 +2112,7 @@
 
 bool CFGAS_FormatString::FormatText(const CFX_WideString& wsSrcText,
                                     const CFX_WideString& wsPattern,
-                                    CFX_WideString& wsOutput) {
+                                    CFX_WideString* wsOutput) {
   if (wsPattern.IsEmpty())
     return false;
 
@@ -2123,8 +2120,7 @@
   if (iLenText == 0)
     return false;
 
-  CFX_WideString wsTextFormat;
-  GetTextFormat(wsPattern, L"text", wsTextFormat);
+  CFX_WideString wsTextFormat = GetTextFormat(wsPattern, L"text");
 
   int32_t iText = 0;
   int32_t iPattern = 0;
@@ -2134,7 +2130,7 @@
   while (iPattern < iLenPattern) {
     switch (pStrPattern[iPattern]) {
       case '\'': {
-        wsOutput += GetLiteralText(pStrPattern, iPattern, iLenPattern);
+        *wsOutput += GetLiteralText(pStrPattern, &iPattern, iLenPattern);
         iPattern++;
         break;
       }
@@ -2142,14 +2138,14 @@
         if (iText >= iLenText || !FXSYS_iswalpha(pStrText[iText]))
           return false;
 
-        wsOutput += pStrText[iText++];
+        *wsOutput += pStrText[iText++];
         iPattern++;
         break;
       case 'X':
         if (iText >= iLenText)
           return false;
 
-        wsOutput += pStrText[iText++];
+        *wsOutput += pStrText[iText++];
         iPattern++;
         break;
       case 'O':
@@ -2158,18 +2154,18 @@
                                   !FXSYS_iswalpha(pStrText[iText]))) {
           return false;
         }
-        wsOutput += pStrText[iText++];
+        *wsOutput += pStrText[iText++];
         iPattern++;
         break;
       case '9':
         if (iText >= iLenText || !FXSYS_isDecimalDigit(pStrText[iText]))
           return false;
 
-        wsOutput += pStrText[iText++];
+        *wsOutput += pStrText[iText++];
         iPattern++;
         break;
       default:
-        wsOutput += pStrPattern[iPattern++];
+        *wsOutput += pStrPattern[iPattern++];
         break;
     }
   }
@@ -2178,7 +2174,7 @@
 
 bool CFGAS_FormatString::FormatStrNum(const CFX_WideStringC& wsInputNum,
                                       const CFX_WideString& wsPattern,
-                                      CFX_WideString& wsOutput) {
+                                      CFX_WideString* wsOutput) {
   if (wsInputNum.IsEmpty() || wsPattern.IsEmpty())
     return false;
 
@@ -2186,7 +2182,7 @@
   uint32_t dwNumStyle = 0;
   CFX_WideString wsNumFormat;
   IFX_Locale* pLocale =
-      GetNumericFormat(wsPattern, dot_index_f, dwNumStyle, wsNumFormat);
+      GetNumericFormat(wsPattern, &dot_index_f, &dwNumStyle, &wsNumFormat);
   if (!pLocale || wsNumFormat.IsEmpty())
     return false;
 
@@ -2210,7 +2206,7 @@
     while (ccf < dot_index_f) {
       switch (strf[ccf]) {
         case '\'':
-          GetLiteralText(strf, ccf, dot_index_f);
+          GetLiteralText(strf, &ccf, dot_index_f);
           break;
         case '9':
         case 'z':
@@ -2246,7 +2242,7 @@
 
   bool bTrimTailZeros = false;
   int32_t iTreading =
-      GetNumTrailingLimit(wsNumFormat, dot_index_f, bTrimTailZeros);
+      GetNumTrailingLimit(wsNumFormat, dot_index_f, &bTrimTailZeros);
   int32_t scale = decimal.GetScale();
   if (iTreading < scale) {
     decimal.SetScale(iTreading);
@@ -2281,10 +2277,10 @@
           if (!FXSYS_isDecimalDigit(str[cc]))
             return false;
 
-          wsOutput = str[cc] + wsOutput;
+          wsOutput->Insert(0, str[cc]);
           cc--;
         } else {
-          wsOutput = L'0' + wsOutput;
+          wsOutput->Insert(0, L'0');
         }
         ccf--;
         break;
@@ -2293,7 +2289,7 @@
           if (!FXSYS_isDecimalDigit(str[cc]))
             return false;
           if (str[0] != '0')
-            wsOutput = str[cc] + wsOutput;
+            wsOutput->Insert(0, str[cc]);
 
           cc--;
         }
@@ -2303,31 +2299,28 @@
         if (cc >= 0) {
           if (!FXSYS_isDecimalDigit(str[cc]))
             return false;
-          if (str[0] == '0')
-            wsOutput = L' ' + wsOutput;
-          else
-            wsOutput = str[cc] + wsOutput;
 
+          wsOutput->Insert(0, str[0] == '0' ? L' ' : str[cc]);
           cc--;
         } else {
-          wsOutput = L' ' + wsOutput;
+          wsOutput->Insert(0, L' ');
         }
         ccf--;
         break;
       case 'S':
         if (bNeg) {
-          wsOutput =
-              pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus) + wsOutput;
+          *wsOutput =
+              pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus) + *wsOutput;
           bAddNeg = true;
         } else {
-          wsOutput = L' ' + wsOutput;
+          wsOutput->Insert(0, L' ');
         }
         ccf--;
         break;
       case 's':
         if (bNeg) {
-          wsOutput =
-              pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus) + wsOutput;
+          *wsOutput =
+              pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus) + *wsOutput;
           bAddNeg = true;
         }
         ccf--;
@@ -2335,21 +2328,21 @@
       case 'E': {
         CFX_WideString wsExp;
         wsExp.Format(L"E%+d", exponent);
-        wsOutput = wsExp + wsOutput;
+        *wsOutput = wsExp + *wsOutput;
         ccf--;
         break;
       }
       case '$': {
-        wsOutput =
+        *wsOutput =
             pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol) +
-            wsOutput;
+            *wsOutput;
         ccf--;
         break;
       }
       case 'r':
         if (ccf - 1 >= 0 && strf[ccf - 1] == 'c') {
           if (bNeg)
-            wsOutput = L"CR" + wsOutput;
+            *wsOutput = L"CR" + *wsOutput;
 
           ccf -= 2;
           bAddNeg = true;
@@ -2357,11 +2350,7 @@
         break;
       case 'R':
         if (ccf - 1 >= 0 && strf[ccf - 1] == 'C') {
-          if (bNeg)
-            wsOutput = L"CR" + wsOutput;
-          else
-            wsOutput = L"  " + wsOutput;
-
+          *wsOutput = bNeg ? L"CR" : L"  " + *wsOutput;
           ccf -= 2;
           bAddNeg = true;
         }
@@ -2369,7 +2358,7 @@
       case 'b':
         if (ccf - 1 >= 0 && strf[ccf - 1] == 'd') {
           if (bNeg)
-            wsOutput = L"db" + wsOutput;
+            *wsOutput = L"db" + *wsOutput;
 
           ccf -= 2;
           bAddNeg = true;
@@ -2377,76 +2366,64 @@
         break;
       case 'B':
         if (ccf - 1 >= 0 && strf[ccf - 1] == 'D') {
-          if (bNeg)
-            wsOutput = L"DB" + wsOutput;
-          else
-            wsOutput = L"  " + wsOutput;
-
+          *wsOutput = bNeg ? L"DB" : L"  " + *wsOutput;
           ccf -= 2;
           bAddNeg = true;
         }
         break;
       case '%': {
-        wsOutput =
-            pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent) + wsOutput;
+        *wsOutput =
+            pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent) + *wsOutput;
         ccf--;
         break;
       }
       case ',':
         if (cc >= 0)
-          wsOutput = wsGroupSymbol + wsOutput;
+          *wsOutput = wsGroupSymbol + *wsOutput;
 
         ccf--;
         break;
       case '(':
-        if (bNeg)
-          wsOutput = L"(" + wsOutput;
-        else
-          wsOutput = L" " + wsOutput;
-
+        wsOutput->Insert(0, bNeg ? L'(' : L' ');
         bAddNeg = true;
         ccf--;
         break;
       case ')':
-        if (bNeg)
-          wsOutput = L")" + wsOutput;
-        else
-          wsOutput = L" " + wsOutput;
-
+        wsOutput->Insert(0, bNeg ? L')' : L' ');
         ccf--;
         break;
       case '\'':
-        wsOutput = GetLiteralTextReverse(strf, ccf) + wsOutput;
+        *wsOutput = GetLiteralTextReverse(strf, &ccf) + *wsOutput;
         ccf--;
         break;
       default:
-        wsOutput = strf[ccf] + wsOutput;
+        wsOutput->Insert(0, strf[ccf]);
         ccf--;
     }
   }
 
   if (cc >= 0) {
     int nPos = dot_index % 3;
-    wsOutput.clear();
+    wsOutput->clear();
     for (int32_t i = 0; i < dot_index; i++) {
       if (i % 3 == nPos && i != 0)
-        wsOutput += wsGroupSymbol;
-      wsOutput += wsSrcNum[i];
+        *wsOutput += wsGroupSymbol;
+      *wsOutput += wsSrcNum[i];
     }
     if (dot_index < len) {
-      wsOutput += pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal);
-      wsOutput += wsSrcNum.Right(len - dot_index - 1);
+      *wsOutput += pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal);
+      *wsOutput += wsSrcNum.Right(len - dot_index - 1);
     }
     if (bNeg) {
-      wsOutput =
-          pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus) + wsOutput;
+      *wsOutput =
+          pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus) + *wsOutput;
     }
     return false;
   }
   if (dot_index_f == wsNumFormat.GetLength()) {
     if (!bAddNeg && bNeg) {
-      wsOutput =
-          pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus) + wsOutput;
+      *wsOutput =
+          pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus) + *wsOutput;
     }
     return true;
   }
@@ -2454,12 +2431,12 @@
   CFX_WideString wsDotSymbol =
       pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal);
   if (strf[dot_index_f] == 'V') {
-    wsOutput += wsDotSymbol;
+    *wsOutput += wsDotSymbol;
   } else if (strf[dot_index_f] == '.') {
     if (dot_index < len)
-      wsOutput += wsDotSymbol;
+      *wsOutput += wsDotSymbol;
     else if (strf[dot_index_f + 1] == '9' || strf[dot_index_f + 1] == 'Z')
-      wsOutput += wsDotSymbol;
+      *wsOutput += wsDotSymbol;
   }
 
   ccf = dot_index_f + 1;
@@ -2467,7 +2444,7 @@
   while (ccf < lenf) {
     switch (strf[ccf]) {
       case '\'':
-        wsOutput += GetLiteralText(strf, ccf, lenf);
+        *wsOutput += GetLiteralText(strf, &ccf, lenf);
         ccf++;
         break;
       case '9':
@@ -2475,10 +2452,10 @@
           if (!FXSYS_isDecimalDigit(str[cc]))
             return false;
 
-          wsOutput += str[cc];
+          *wsOutput += str[cc];
           cc++;
         } else {
-          wsOutput += L'0';
+          *wsOutput += L'0';
         }
         ccf++;
         break;
@@ -2487,7 +2464,7 @@
           if (!FXSYS_isDecimalDigit(str[cc]))
             return false;
 
-          wsOutput += str[cc];
+          *wsOutput += str[cc];
           cc++;
         }
         ccf++;
@@ -2497,29 +2474,29 @@
           if (!FXSYS_isDecimalDigit(str[cc]))
             return false;
 
-          wsOutput += str[cc];
+          *wsOutput += str[cc];
           cc++;
         } else {
-          wsOutput += L'0';
+          *wsOutput += L'0';
         }
         ccf++;
         break;
       case 'E': {
         CFX_WideString wsExp;
         wsExp.Format(L"E%+d", exponent);
-        wsOutput += wsExp;
+        *wsOutput += wsExp;
         ccf++;
         break;
       }
       case '$':
-        wsOutput +=
+        *wsOutput +=
             pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_CurrencySymbol);
         ccf++;
         break;
       case 'c':
         if (ccf + 1 < lenf && strf[ccf + 1] == 'r') {
           if (bNeg)
-            wsOutput += L"CR";
+            *wsOutput += L"CR";
 
           ccf += 2;
           bAddNeg = true;
@@ -2527,11 +2504,7 @@
         break;
       case 'C':
         if (ccf + 1 < lenf && strf[ccf + 1] == 'R') {
-          if (bNeg)
-            wsOutput += L"CR";
-          else
-            wsOutput += L"  ";
-
+          *wsOutput += bNeg ? L"CR" : L"  ";
           ccf += 2;
           bAddNeg = true;
         }
@@ -2539,7 +2512,7 @@
       case 'd':
         if (ccf + 1 < lenf && strf[ccf + 1] == 'b') {
           if (bNeg)
-            wsOutput += L"db";
+            *wsOutput += L"db";
 
           ccf += 2;
           bAddNeg = true;
@@ -2547,46 +2520,34 @@
         break;
       case 'D':
         if (ccf + 1 < lenf && strf[ccf + 1] == 'B') {
-          if (bNeg)
-            wsOutput += L"DB";
-          else
-            wsOutput += L"  ";
-
+          *wsOutput += bNeg ? L"DB" : L"  ";
           ccf += 2;
           bAddNeg = true;
         }
         break;
       case '%':
-        wsOutput += pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent);
+        *wsOutput += pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Percent);
         ccf++;
         break;
       case '8':
         while (ccf < lenf && strf[ccf] == '8')
           ccf++;
         while (cc < len && FXSYS_isDecimalDigit(str[cc])) {
-          wsOutput += str[cc];
+          *wsOutput += str[cc];
           cc++;
         }
         break;
       case ',':
-        wsOutput += wsGroupSymbol;
+        *wsOutput += wsGroupSymbol;
         ccf++;
         break;
       case '(':
-        if (bNeg)
-          wsOutput += '(';
-        else
-          wsOutput += ' ';
-
+        *wsOutput += bNeg ? '(' : ' ';
         bAddNeg = true;
         ccf++;
         break;
       case ')':
-        if (bNeg)
-          wsOutput += ')';
-        else
-          wsOutput += ' ';
-
+        *wsOutput += bNeg ? ')' : ' ';
         ccf++;
         break;
       default:
@@ -2594,15 +2555,15 @@
     }
   }
   if (!bAddNeg && bNeg) {
-    wsOutput = pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus) +
-               wsOutput[0] + wsOutput.Mid(1, wsOutput.GetLength() - 1);
+    *wsOutput = pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Minus) +
+                (*wsOutput)[0] + wsOutput->Mid(1, wsOutput->GetLength() - 1);
   }
   return true;
 }
 
 bool CFGAS_FormatString::FormatNum(const CFX_WideString& wsSrcNum,
                                    const CFX_WideString& wsPattern,
-                                   CFX_WideString& wsOutput) {
+                                   CFX_WideString* wsOutput) {
   if (wsSrcNum.IsEmpty() || wsPattern.IsEmpty())
     return false;
   return FormatStrNum(wsSrcNum.AsStringC(), wsPattern, wsOutput);
@@ -2610,8 +2571,8 @@
 
 bool CFGAS_FormatString::FormatDateTime(const CFX_WideString& wsSrcDateTime,
                                         const CFX_WideString& wsPattern,
-                                        CFX_WideString& wsOutput,
-                                        FX_DATETIMETYPE eDateTimeType) {
+                                        FX_DATETIMETYPE eDateTimeType,
+                                        CFX_WideString* wsOutput) {
   if (wsSrcDateTime.IsEmpty() || wsPattern.IsEmpty())
     return false;
 
@@ -2619,7 +2580,7 @@
   CFX_WideString wsTimePattern;
   IFX_Locale* pLocale = nullptr;
   FX_DATETIMETYPE eCategory =
-      GetDateTimeFormat(wsPattern, pLocale, wsDatePattern, wsTimePattern);
+      GetDateTimeFormat(wsPattern, &pLocale, &wsDatePattern, &wsTimePattern);
   if (!pLocale)
     return false;
 
@@ -2638,13 +2599,15 @@
   if (iT < 0) {
     if (eCategory == FX_DATETIMETYPE_Date &&
         FX_DateFromCanonical(wsSrcDateTime, &dt)) {
-      return FormatDateTimeInternal(dt, wsDatePattern, wsTimePattern, true,
-                                    pLocale, wsOutput);
+      *wsOutput = FormatDateTimeInternal(dt, wsDatePattern, wsTimePattern, true,
+                                         pLocale);
+      return true;
     }
     if (eCategory == FX_DATETIMETYPE_Time &&
         FX_TimeFromCanonical(wsSrcDateTime.AsStringC(), &dt, pLocale)) {
-      return FormatDateTimeInternal(dt, wsDatePattern, wsTimePattern, true,
-                                    pLocale, wsOutput);
+      *wsOutput = FormatDateTimeInternal(dt, wsDatePattern, wsTimePattern, true,
+                                         pLocale);
+      return true;
     }
   } else {
     CFX_WideString wsSrcDate(wsSrcDateTime.c_str(), iT);
@@ -2654,31 +2617,31 @@
       return false;
     if (FX_DateFromCanonical(wsSrcDate, &dt) &&
         FX_TimeFromCanonical(wsSrcTime, &dt, pLocale)) {
-      return FormatDateTimeInternal(dt, wsDatePattern, wsTimePattern,
-                                    eCategory != FX_DATETIMETYPE_TimeDate,
-                                    pLocale, wsOutput);
+      *wsOutput = FormatDateTimeInternal(dt, wsDatePattern, wsTimePattern,
+                                         eCategory != FX_DATETIMETYPE_TimeDate,
+                                         pLocale);
+      return true;
     }
   }
   return false;
 }
 
 bool CFGAS_FormatString::FormatZero(const CFX_WideString& wsPattern,
-                                    CFX_WideString& wsOutput) {
+                                    CFX_WideString* wsOutput) {
   if (wsPattern.IsEmpty())
     return false;
 
-  CFX_WideString wsTextFormat;
-  GetTextFormat(wsPattern, L"zero", wsTextFormat);
+  CFX_WideString wsTextFormat = GetTextFormat(wsPattern, L"zero");
   int32_t iPattern = 0;
   const wchar_t* pStrPattern = wsTextFormat.c_str();
   int32_t iLenPattern = wsTextFormat.GetLength();
   while (iPattern < iLenPattern) {
     if (pStrPattern[iPattern] == '\'') {
-      wsOutput += GetLiteralText(pStrPattern, iPattern, iLenPattern);
+      *wsOutput += GetLiteralText(pStrPattern, &iPattern, iLenPattern);
       iPattern++;
       continue;
     } else {
-      wsOutput += pStrPattern[iPattern++];
+      *wsOutput += pStrPattern[iPattern++];
       continue;
     }
   }
@@ -2686,22 +2649,21 @@
 }
 
 bool CFGAS_FormatString::FormatNull(const CFX_WideString& wsPattern,
-                                    CFX_WideString& wsOutput) {
+                                    CFX_WideString* wsOutput) {
   if (wsPattern.IsEmpty())
     return false;
 
-  CFX_WideString wsTextFormat;
-  GetTextFormat(wsPattern, L"null", wsTextFormat);
+  CFX_WideString wsTextFormat = GetTextFormat(wsPattern, L"null");
   int32_t iPattern = 0;
   const wchar_t* pStrPattern = wsTextFormat.c_str();
   int32_t iLenPattern = wsTextFormat.GetLength();
   while (iPattern < iLenPattern) {
     if (pStrPattern[iPattern] == '\'') {
-      wsOutput += GetLiteralText(pStrPattern, iPattern, iLenPattern);
+      *wsOutput += GetLiteralText(pStrPattern, &iPattern, iLenPattern);
       iPattern++;
       continue;
     }
-    wsOutput += pStrPattern[iPattern++];
+    *wsOutput += pStrPattern[iPattern++];
   }
   return true;
 }
diff --git a/xfa/fgas/crt/cfgas_formatstring.h b/xfa/fgas/crt/cfgas_formatstring.h
index a8cb917..87252f4 100644
--- a/xfa/fgas/crt/cfgas_formatstring.h
+++ b/xfa/fgas/crt/cfgas_formatstring.h
@@ -23,14 +23,14 @@
   ~CFGAS_FormatString();
 
   void SplitFormatString(const CFX_WideString& wsFormatString,
-                         std::vector<CFX_WideString>& wsPatterns);
+                         std::vector<CFX_WideString>* wsPatterns);
   FX_LOCALECATEGORY GetCategory(const CFX_WideString& wsPattern);
   bool ParseText(const CFX_WideString& wsSrcText,
                  const CFX_WideString& wsPattern,
-                 CFX_WideString& wsValue);
+                 CFX_WideString* wsValue);
   bool ParseNum(const CFX_WideString& wsSrcNum,
                 const CFX_WideString& wsPattern,
-                CFX_WideString& wsValue);
+                CFX_WideString* wsValue);
   bool ParseDateTime(const CFX_WideString& wsSrcDateTime,
                      const CFX_WideString& wsPattern,
                      FX_DATETIMETYPE eDateTimeType,
@@ -41,32 +41,31 @@
                  const CFX_WideString& wsPattern);
   bool FormatText(const CFX_WideString& wsSrcText,
                   const CFX_WideString& wsPattern,
-                  CFX_WideString& wsOutput);
+                  CFX_WideString* wsOutput);
   bool FormatNum(const CFX_WideString& wsSrcNum,
                  const CFX_WideString& wsPattern,
-                 CFX_WideString& wsOutput);
+                 CFX_WideString* wsOutput);
   bool FormatDateTime(const CFX_WideString& wsSrcDateTime,
                       const CFX_WideString& wsPattern,
-                      CFX_WideString& wsOutput,
-                      FX_DATETIMETYPE eDateTimeType);
-  bool FormatZero(const CFX_WideString& wsPattern, CFX_WideString& wsOutput);
-  bool FormatNull(const CFX_WideString& wsPattern, CFX_WideString& wsOutput);
+                      FX_DATETIMETYPE eDateTimeType,
+                      CFX_WideString* wsOutput);
+  bool FormatZero(const CFX_WideString& wsPattern, CFX_WideString* wsOutput);
+  bool FormatNull(const CFX_WideString& wsPattern, CFX_WideString* wsOutput);
 
  private:
-  void GetTextFormat(const CFX_WideString& wsPattern,
-                     const CFX_WideStringC& wsCategory,
-                     CFX_WideString& wsPurgePattern);
+  CFX_WideString GetTextFormat(const CFX_WideString& wsPattern,
+                               const CFX_WideStringC& wsCategory);
   IFX_Locale* GetNumericFormat(const CFX_WideString& wsPattern,
-                               int32_t& iDotIndex,
-                               uint32_t& dwStyle,
-                               CFX_WideString& wsPurgePattern);
+                               int32_t* iDotIndex,
+                               uint32_t* dwStyle,
+                               CFX_WideString* wsPurgePattern);
   bool FormatStrNum(const CFX_WideStringC& wsInputNum,
                     const CFX_WideString& wsPattern,
-                    CFX_WideString& wsOutput);
+                    CFX_WideString* wsOutput);
   FX_DATETIMETYPE GetDateTimeFormat(const CFX_WideString& wsPattern,
-                                    IFX_Locale*& pLocale,
-                                    CFX_WideString& wsDatePattern,
-                                    CFX_WideString& wsTimePattern);
+                                    IFX_Locale** pLocale,
+                                    CFX_WideString* wsDatePattern,
+                                    CFX_WideString* wsTimePattern);
 
   CXFA_LocaleMgr* m_pLocaleMgr;
 };
diff --git a/xfa/fgas/crt/cfgas_formatstring_unittest.cpp b/xfa/fgas/crt/cfgas_formatstring_unittest.cpp
index d1adc38..4cf2a89 100644
--- a/xfa/fgas/crt/cfgas_formatstring_unittest.cpp
+++ b/xfa/fgas/crt/cfgas_formatstring_unittest.cpp
@@ -105,8 +105,8 @@
   for (size_t i = 0; i < FX_ArraySize(tests); ++i) {
     CFX_WideString result;
     EXPECT_TRUE(fmt(tests[i].locale)
-                    ->FormatDateTime(tests[i].input, tests[i].pattern, result,
-                                     FX_DATETIMETYPE_Date));
+                    ->FormatDateTime(tests[i].input, tests[i].pattern,
+                                     FX_DATETIMETYPE_Date, &result));
     EXPECT_STREQ(tests[i].output, result.c_str()) << " TEST: " << i;
   }
 }
@@ -150,8 +150,8 @@
   for (size_t i = 0; i < FX_ArraySize(tests); ++i) {
     CFX_WideString result;
     EXPECT_TRUE(fmt(tests[i].locale)
-                    ->FormatDateTime(tests[i].input, tests[i].pattern, result,
-                                     FX_DATETIMETYPE_Time));
+                    ->FormatDateTime(tests[i].input, tests[i].pattern,
+                                     FX_DATETIMETYPE_Time, &result));
     EXPECT_STREQ(tests[i].output, result.c_str()) << " TEST: " << i;
   }
 
@@ -177,8 +177,8 @@
   for (size_t i = 0; i < FX_ArraySize(tests); ++i) {
     CFX_WideString result;
     EXPECT_TRUE(fmt(tests[i].locale)
-                    ->FormatDateTime(tests[i].input, tests[i].pattern, result,
-                                     FX_DATETIMETYPE_TimeDate));
+                    ->FormatDateTime(tests[i].input, tests[i].pattern,
+                                     FX_DATETIMETYPE_TimeDate, &result));
     EXPECT_STREQ(tests[i].output, result.c_str()) << " TEST: " << i;
   }
 }
@@ -252,7 +252,7 @@
   std::vector<CFX_WideString> results;
   fmt(L"en")->SplitFormatString(
       L"null{'No data'} | null{} | text{999*9999} | text{999*999*9999}",
-      results);
+      &results);
   EXPECT_EQ(4UL, results.size());
 
   const wchar_t* patterns[] = {L"null{'No data'} ", L" null{} ",
@@ -287,7 +287,7 @@
   for (size_t i = 0; i < FX_ArraySize(tests); ++i) {
     CFX_WideString result;
     EXPECT_TRUE(fmt(tests[i].locale)
-                    ->ParseNum(tests[i].input, tests[i].pattern, result));
+                    ->ParseNum(tests[i].input, tests[i].pattern, &result));
     EXPECT_STREQ(tests[i].output, result.c_str()) << " TEST: " << i;
   }
 }
@@ -343,7 +343,7 @@
   for (size_t i = 0; i < FX_ArraySize(tests); ++i) {
     CFX_WideString result;
     EXPECT_TRUE(fmt(tests[i].locale)
-                    ->FormatNum(tests[i].input, tests[i].pattern, result));
+                    ->FormatNum(tests[i].input, tests[i].pattern, &result));
     EXPECT_STREQ(tests[i].output, result.c_str()) << " TEST: " << i;
   }
 }
@@ -365,7 +365,7 @@
   for (size_t i = 0; i < FX_ArraySize(tests); ++i) {
     CFX_WideString result;
     EXPECT_TRUE(fmt(tests[i].locale)
-                    ->ParseText(tests[i].input, tests[i].pattern, result));
+                    ->ParseText(tests[i].input, tests[i].pattern, &result));
     EXPECT_STREQ(tests[i].output, result.c_str()) << " TEST: " << i;
   }
 }
@@ -373,7 +373,7 @@
 TEST_F(CFGAS_FormatStringTest, InvalidTextParse) {
   // Input does not match mask.
   CFX_WideString result;
-  EXPECT_FALSE(fmt(L"en")->ParseText(L"123-4567-8", L"AAA-9999-X", result));
+  EXPECT_FALSE(fmt(L"en")->ParseText(L"123-4567-8", L"AAA-9999-X", &result));
 }
 
 TEST_F(CFGAS_FormatStringTest, TextFormat) {
@@ -390,7 +390,7 @@
   for (size_t i = 0; i < FX_ArraySize(tests); ++i) {
     CFX_WideString result;
     EXPECT_TRUE(fmt(tests[i].locale)
-                    ->FormatText(tests[i].input, tests[i].pattern, result));
+                    ->FormatText(tests[i].input, tests[i].pattern, &result));
     EXPECT_STREQ(tests[i].output, result.c_str()) << " TEST: " << i;
   }
 }
@@ -420,7 +420,7 @@
 
   for (size_t i = 0; i < FX_ArraySize(tests); ++i) {
     CFX_WideString result;
-    EXPECT_TRUE(fmt(tests[i].locale)->FormatNull(tests[i].pattern, result));
+    EXPECT_TRUE(fmt(tests[i].locale)->FormatNull(tests[i].pattern, &result));
     EXPECT_STREQ(tests[i].output, result.c_str()) << " TEST: " << i;
   }
 }
@@ -458,7 +458,7 @@
     CFX_WideString result;
     EXPECT_TRUE(
         fmt(tests[i].locale)
-            ->FormatZero(/* tests[i].input,*/ tests[i].pattern, result));
+            ->FormatZero(/* tests[i].input,*/ tests[i].pattern, &result));
     EXPECT_STREQ(tests[i].output, result.c_str()) << " TEST: " << i;
   }
 }
diff --git a/xfa/fxfa/parser/cxfa_localevalue.cpp b/xfa/fxfa/parser/cxfa_localevalue.cpp
index 113c8cc..983d1ef 100644
--- a/xfa/fxfa/parser/cxfa_localevalue.cpp
+++ b/xfa/fxfa/parser/cxfa_localevalue.cpp
@@ -114,7 +114,7 @@
 
   auto pFormat = pdfium::MakeUnique<CFGAS_FormatString>(m_pLocaleMgr);
   std::vector<CFX_WideString> wsPatterns;
-  pFormat->SplitFormatString(wsPattern, wsPatterns);
+  pFormat->SplitFormatString(wsPattern, &wsPatterns);
 
   bool bRet = false;
   int32_t iCount = pdfium::CollectionSize<int32_t>(wsPatterns);
@@ -134,16 +134,16 @@
         break;
       case FX_LOCALECATEGORY_Num: {
         CFX_WideString fNum;
-        bRet = pFormat->ParseNum(wsValue, wsFormat, fNum);
+        bRet = pFormat->ParseNum(wsValue, wsFormat, &fNum);
         if (!bRet)
-          bRet = pFormat->FormatNum(wsValue, wsFormat, wsOutput);
+          bRet = pFormat->FormatNum(wsValue, wsFormat, &wsOutput);
         break;
       }
       case FX_LOCALECATEGORY_Text:
-        bRet = pFormat->ParseText(wsValue, wsFormat, wsOutput);
+        bRet = pFormat->ParseText(wsValue, wsFormat, &wsOutput);
         wsOutput.clear();
         if (!bRet)
-          bRet = pFormat->FormatText(wsValue, wsFormat, wsOutput);
+          bRet = pFormat->FormatText(wsValue, wsFormat, &wsOutput);
         break;
       case FX_LOCALECATEGORY_Date: {
         CFX_DateTime dt;
@@ -152,8 +152,8 @@
           bRet = pFormat->ParseDateTime(wsValue, wsFormat, FX_DATETIMETYPE_Date,
                                         &dt);
           if (!bRet) {
-            bRet = pFormat->FormatDateTime(wsValue, wsFormat, wsOutput,
-                                           FX_DATETIMETYPE_Date);
+            bRet = pFormat->FormatDateTime(wsValue, wsFormat,
+                                           FX_DATETIMETYPE_Date, &wsOutput);
           }
         }
         break;
@@ -163,8 +163,8 @@
         bRet = pFormat->ParseDateTime(wsValue, wsFormat, FX_DATETIMETYPE_Time,
                                       &dt);
         if (!bRet) {
-          bRet = pFormat->FormatDateTime(wsValue, wsFormat, wsOutput,
-                                         FX_DATETIMETYPE_Time);
+          bRet = pFormat->FormatDateTime(wsValue, wsFormat,
+                                         FX_DATETIMETYPE_Time, &wsOutput);
         }
         break;
       }
@@ -173,8 +173,8 @@
         bRet = pFormat->ParseDateTime(wsValue, wsFormat,
                                       FX_DATETIMETYPE_DateTime, &dt);
         if (!bRet) {
-          bRet = pFormat->FormatDateTime(wsValue, wsFormat, wsOutput,
-                                         FX_DATETIMETYPE_DateTime);
+          bRet = pFormat->FormatDateTime(wsValue, wsFormat,
+                                         FX_DATETIMETYPE_DateTime, &wsOutput);
         }
         break;
       }
@@ -327,7 +327,7 @@
                                       XFA_VALUEPICTURE eValueType) const {
   auto pFormat = pdfium::MakeUnique<CFGAS_FormatString>(m_pLocaleMgr);
   std::vector<CFX_WideString> wsPatterns;
-  pFormat->SplitFormatString(wsFormat, wsPatterns);
+  pFormat->SplitFormatString(wsFormat, &wsPatterns);
   wsResult.clear();
   int32_t iCount = pdfium::CollectionSize<int32_t>(wsPatterns);
   for (int32_t i = 0; i < iCount; i++) {
@@ -353,29 +353,29 @@
   switch (eCategory) {
     case FX_LOCALECATEGORY_Null:
       if (m_wsValue.IsEmpty())
-        bRet = pFormat->FormatNull(wsFormat, wsResult);
+        bRet = pFormat->FormatNull(wsFormat, &wsResult);
       break;
     case FX_LOCALECATEGORY_Zero:
       if (m_wsValue == L"0")
-        bRet = pFormat->FormatZero(wsFormat, wsResult);
+        bRet = pFormat->FormatZero(wsFormat, &wsResult);
       break;
     case FX_LOCALECATEGORY_Num:
-      bRet = pFormat->FormatNum(m_wsValue, wsFormat, wsResult);
+      bRet = pFormat->FormatNum(m_wsValue, wsFormat, &wsResult);
       break;
     case FX_LOCALECATEGORY_Text:
-      bRet = pFormat->FormatText(m_wsValue, wsFormat, wsResult);
+      bRet = pFormat->FormatText(m_wsValue, wsFormat, &wsResult);
       break;
     case FX_LOCALECATEGORY_Date:
-      bRet = pFormat->FormatDateTime(m_wsValue, wsFormat, wsResult,
-                                     FX_DATETIMETYPE_Date);
+      bRet = pFormat->FormatDateTime(m_wsValue, wsFormat, FX_DATETIMETYPE_Date,
+                                     &wsResult);
       break;
     case FX_LOCALECATEGORY_Time:
-      bRet = pFormat->FormatDateTime(m_wsValue, wsFormat, wsResult,
-                                     FX_DATETIMETYPE_Time);
+      bRet = pFormat->FormatDateTime(m_wsValue, wsFormat, FX_DATETIMETYPE_Time,
+                                     &wsResult);
       break;
     case FX_LOCALECATEGORY_DateTime:
-      bRet = pFormat->FormatDateTime(m_wsValue, wsFormat, wsResult,
-                                     FX_DATETIMETYPE_DateTime);
+      bRet = pFormat->FormatDateTime(m_wsValue, wsFormat,
+                                     FX_DATETIMETYPE_DateTime, &wsResult);
       break;
     default:
       wsResult = m_wsValue;
@@ -619,7 +619,7 @@
 
   auto pFormat = pdfium::MakeUnique<CFGAS_FormatString>(m_pLocaleMgr);
   std::vector<CFX_WideString> wsPatterns;
-  pFormat->SplitFormatString(wsPattern, wsPatterns);
+  pFormat->SplitFormatString(wsPattern, &wsPatterns);
   bool bRet = false;
   int32_t iCount = pdfium::CollectionSize<int32_t>(wsPatterns);
   for (int32_t i = 0; i < iCount && !bRet; i++) {
@@ -637,13 +637,13 @@
         break;
       case FX_LOCALECATEGORY_Num: {
         CFX_WideString fNum;
-        bRet = pFormat->ParseNum(wsValue, wsFormat, fNum);
+        bRet = pFormat->ParseNum(wsValue, wsFormat, &fNum);
         if (bRet)
           m_wsValue = fNum;
         break;
       }
       case FX_LOCALECATEGORY_Text:
-        bRet = pFormat->ParseText(wsValue, wsFormat, m_wsValue);
+        bRet = pFormat->ParseText(wsValue, wsFormat, &m_wsValue);
         break;
       case FX_LOCALECATEGORY_Date: {
         CFX_DateTime dt;
