Escape trigraphs when emitting string literals.

The EscapeTrigraphs function is copied from Google Protobuf.

PiperOrigin-RevId: 562774473
pull/13841/head
Protobuf Team Bot 1 year ago committed by Copybara-Service
parent f42ad1eaaf
commit 8bcc8ccaca
  1. 12
      upb/upbc/protoc-gen-upb.cc

@ -46,6 +46,7 @@
#include "absl/log/absl_check.h"
#include "absl/log/absl_log.h"
#include "absl/strings/escaping.h"
#include "absl/strings/str_replace.h"
#include "absl/strings/string_view.h"
#include "absl/strings/substitute.h"
#include "upb/base/descriptor_constants.h"
@ -194,6 +195,11 @@ std::string DoubleToCLiteral(double value) {
}
}
// Escape trigraphs by escaping question marks to \?
std::string EscapeTrigraphs(absl::string_view to_escape) {
return absl::StrReplaceAll(to_escape, {{"?", "\\?"}});
}
std::string FieldDefault(upb::FieldDefPtr field) {
switch (field.ctype()) {
case kUpb_CType_Message:
@ -201,9 +207,9 @@ std::string FieldDefault(upb::FieldDefPtr field) {
case kUpb_CType_Bytes:
case kUpb_CType_String: {
upb_StringView str = field.default_value().str_val;
return absl::Substitute(
"upb_StringView_FromString(\"$0\")",
absl::CEscape(absl::string_view(str.data, str.size)));
return absl::Substitute("upb_StringView_FromString(\"$0\")",
EscapeTrigraphs(absl::CEscape(
absl::string_view(str.data, str.size))));
}
case kUpb_CType_Int32:
return absl::Substitute("(int32_t)$0", field.default_value().int32_val);

Loading…
Cancel
Save