Replace UTIL_* definitions with DataType enum class Bug: pdfium:1085 Change-Id: Iccf276068dacae939c88f0fe508cc88d6b4a0a31 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/80572 Reviewed-by: Lei Zhang <thestig@chromium.org> Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/fxjs/cjs_util.cpp b/fxjs/cjs_util.cpp index 9d11c7a..81820fe 100644 --- a/fxjs/cjs_util.cpp +++ b/fxjs/cjs_util.cpp
@@ -135,14 +135,14 @@ WideString segment; switch (ParseDataType(&fmt)) { - case UTIL_INT: + case DataType::kInt: segment = WideString::Format(fmt.c_str(), pRuntime->ToInt32(params[i])); break; - case UTIL_DOUBLE: + case DataType::kDouble: segment = WideString::Format(fmt.c_str(), pRuntime->ToDouble(params[i])); break; - case UTIL_STRING: + case DataType::kString: segment = WideString::Format(fmt.c_str(), pRuntime->ToWideString(params[i]).c_str()); break; @@ -398,10 +398,10 @@ } // static -int CJS_Util::ParseDataType(WideString* sFormat) { +CJS_Util::DataType CJS_Util::ParseDataType(WideString* sFormat) { enum State { BEFORE, FLAGS, WIDTH, PRECISION, SPECIFIER, AFTER }; - int result = -1; + DataType result = DataType::kInvalid; State state = BEFORE; size_t precision_digits = 0; size_t i = 0; @@ -422,7 +422,7 @@ break; case WIDTH: if (c == L'*') - return -1; + return DataType::kInvalid; if (FXSYS_IsDecimalDigit(c)) { // Stay in same state. } else if (c == L'.') { @@ -434,7 +434,7 @@ break; case PRECISION: if (c == L'*') - return -1; + return DataType::kInvalid; if (FXSYS_IsDecimalDigit(c)) { // Stay in same state. ++precision_digits; @@ -446,32 +446,32 @@ case SPECIFIER: if (c == L'c' || c == L'C' || c == L'd' || c == L'i' || c == L'o' || c == L'u' || c == L'x' || c == L'X') { - result = UTIL_INT; + result = DataType::kInt; } else if (c == L'e' || c == L'E' || c == L'f' || c == L'g' || c == L'G') { - result = UTIL_DOUBLE; + result = DataType::kDouble; } else if (c == L's' || c == L'S') { // Map s to S since we always deal internally with wchar_t strings. // TODO(tsepez): Probably 100% borked. %S is not a standard // conversion. sFormat->SetAt(i, L'S'); - result = UTIL_STRING; + result = DataType::kString; } else { - return -1; + return DataType::kInvalid; } state = AFTER; break; case AFTER: if (c == L'%') - return -1; + return DataType::kInvalid; // Stay in same state until string exhausted. break; } ++i; } // See https://crbug.com/740166 - if (result == UTIL_INT && precision_digits > 2) - return -1; + if (result == DataType::kInt && precision_digits > 2) + return DataType::kInvalid; return result; }
diff --git a/fxjs/cjs_util.h b/fxjs/cjs_util.h index e565520..2ad4d27 100644 --- a/fxjs/cjs_util.h +++ b/fxjs/cjs_util.h
@@ -13,13 +13,15 @@ #include "fxjs/cjs_object.h" #include "fxjs/js_define.h" -// Return values for ParseDataType() below. -#define UTIL_INT 0 -#define UTIL_DOUBLE 1 -#define UTIL_STRING 2 - class CJS_Util final : public CJS_Object { public: + enum class DataType { + kInvalid = -1, + kInt = 0, + kDouble = 1, + kString = 2, + }; + static uint32_t GetObjDefnID(); static void DefineJSObjects(CFXJS_Engine* pEngine); @@ -33,7 +35,7 @@ // byte-by-byte. // // Exposed for testing. - static int ParseDataType(WideString* sFormat); + static DataType ParseDataType(WideString* sFormat); // Exposed for testing. static WideString StringPrintx(const WideString& cFormat,
diff --git a/fxjs/cjs_util_unittest.cpp b/fxjs/cjs_util_unittest.cpp index b4c07f7..77fa270 100644 --- a/fxjs/cjs_util_unittest.cpp +++ b/fxjs/cjs_util_unittest.cpp
@@ -10,99 +10,99 @@ TEST(CJS_Util, ParseDataType) { struct ParseDataTypeCase { const wchar_t* const input_string; - const int expected; + const CJS_Util::DataType expected; }; // Commented out tests follow the spec but are not passing. const ParseDataTypeCase cases[] = { // Not conversions - {L"", -1}, - {L"d", -1}, + {L"", CJS_Util::DataType::kInvalid}, + {L"d", CJS_Util::DataType::kInvalid}, // Simple cases - {L"%d", UTIL_INT}, - {L"%x", UTIL_INT}, - {L"%f", UTIL_DOUBLE}, - {L"%s", UTIL_STRING}, + {L"%d", CJS_Util::DataType::kInt}, + {L"%x", CJS_Util::DataType::kInt}, + {L"%f", CJS_Util::DataType::kDouble}, + {L"%s", CJS_Util::DataType::kString}, // nDecSep Not implemented - // {L"%,0d", UTIL_INT}, - // {L"%,1d", UTIL_INT}, - // {L"%,2d", UTIL_INT}, - // {L"%,3d", UTIL_INT}, + // {L"%,0d", CJS_Util::DataType::kInt}, + // {L"%,1d", CJS_Util::DataType::kInt}, + // {L"%,2d", CJS_Util::DataType::kInt}, + // {L"%,3d", CJS_Util::DataType::kInt}, // {L"%,4d", -1}, // {L"%,d", -1}, // cFlags("+ 0#"") are only valid for numeric conversions. - {L"%+d", UTIL_INT}, - {L"%+x", UTIL_INT}, - {L"%+f", UTIL_DOUBLE}, + {L"%+d", CJS_Util::DataType::kInt}, + {L"%+x", CJS_Util::DataType::kInt}, + {L"%+f", CJS_Util::DataType::kDouble}, // {L"%+s", -1}, - {L"% d", UTIL_INT}, - {L"% x", UTIL_INT}, - {L"% f", UTIL_DOUBLE}, + {L"% d", CJS_Util::DataType::kInt}, + {L"% x", CJS_Util::DataType::kInt}, + {L"% f", CJS_Util::DataType::kDouble}, // {L"% s", -1}, - {L"%0d", UTIL_INT}, - {L"%0x", UTIL_INT}, - {L"%0f", UTIL_DOUBLE}, + {L"%0d", CJS_Util::DataType::kInt}, + {L"%0x", CJS_Util::DataType::kInt}, + {L"%0f", CJS_Util::DataType::kDouble}, // {L"%0s", -1}, - {L"%#d", UTIL_INT}, - {L"%#x", UTIL_INT}, - {L"%#f", UTIL_DOUBLE}, + {L"%#d", CJS_Util::DataType::kInt}, + {L"%#x", CJS_Util::DataType::kInt}, + {L"%#f", CJS_Util::DataType::kDouble}, // {L"%#s", -1}, // nWidth should work. for all conversions, can be combined with cFlags=0 // for numbers. - {L"%5d", UTIL_INT}, - {L"%05d", UTIL_INT}, - {L"%5x", UTIL_INT}, - {L"%05x", UTIL_INT}, - {L"%5f", UTIL_DOUBLE}, - {L"%05f", UTIL_DOUBLE}, - {L"%5s", UTIL_STRING}, + {L"%5d", CJS_Util::DataType::kInt}, + {L"%05d", CJS_Util::DataType::kInt}, + {L"%5x", CJS_Util::DataType::kInt}, + {L"%05x", CJS_Util::DataType::kInt}, + {L"%5f", CJS_Util::DataType::kDouble}, + {L"%05f", CJS_Util::DataType::kDouble}, + {L"%5s", CJS_Util::DataType::kString}, // {L"%05s", -1}, // nPrecision should only work for float // {L"%.5d", -1}, // {L"%.5x", -1}, - {L"%.5f", UTIL_DOUBLE}, + {L"%.5f", CJS_Util::DataType::kDouble}, // {L"%.5s", -1}, // {L"%.14d", -1}, // {L"%.14x", -1}, - {L"%.14f", UTIL_DOUBLE}, + {L"%.14f", CJS_Util::DataType::kDouble}, // {L"%.14s", -1}, // {L"%.f", -1}, // See https://crbug.com/740166 // nPrecision too large (> 260) causes crashes in Windows. // Avoid this by limiting to two digits - {L"%.1d", UTIL_INT}, - {L"%.10d", UTIL_INT}, - {L"%.100d", -1}, + {L"%.1d", CJS_Util::DataType::kInt}, + {L"%.10d", CJS_Util::DataType::kInt}, + {L"%.100d", CJS_Util::DataType::kInvalid}, // Unexpected characters - {L"%ad", -1}, - {L"%bx", -1}, - // {L"%cf", -1}, - // {L"%es", -1}, - // {L"%gd", -1}, - {L"%hx", -1}, - // {L"%if", -1}, - {L"%js", -1}, - {L"%@d", -1}, - {L"%~x", -1}, - {L"%[f", -1}, - {L"%\0s", -1}, - {L"%\nd", -1}, - {L"%\rx", -1}, - // {L"%%f", -1}, - // {L"% s", -1}, + {L"%ad", CJS_Util::DataType::kInvalid}, + {L"%bx", CJS_Util::DataType::kInvalid}, + // {L"%cf", CJS_Util::DataType::kInvalid}, + // {L"%es", CJS_Util::DataType::kInvalid}, + // {L"%gd", CJS_Util::DataType::kInvalid}, + {L"%hx", CJS_Util::DataType::kInvalid}, + // {L"%if", CJS_Util::DataType::kInvalid}, + {L"%js", CJS_Util::DataType::kInvalid}, + {L"%@d", CJS_Util::DataType::kInvalid}, + {L"%~x", CJS_Util::DataType::kInvalid}, + {L"%[f", CJS_Util::DataType::kInvalid}, + {L"%\0s", CJS_Util::DataType::kInvalid}, + {L"%\nd", CJS_Util::DataType::kInvalid}, + {L"%\rx", CJS_Util::DataType::kInvalid}, + // {L"%%f", CJS_Util::DataType::kInvalid}, + // {L"% s", CJS_Util::DataType::kInvalid}, // Combine multiple valid components - {L"%+6d", UTIL_INT}, - {L"% 7x", UTIL_INT}, - {L"%#9.3f", UTIL_DOUBLE}, - {L"%10s", UTIL_STRING}, + {L"%+6d", CJS_Util::DataType::kInt}, + {L"% 7x", CJS_Util::DataType::kInt}, + {L"%#9.3f", CJS_Util::DataType::kDouble}, + {L"%10s", CJS_Util::DataType::kString}, }; for (size_t i = 0; i < pdfium::size(cases); i++) {