Skip to content

Commit 5db478e

Browse files
author
Ben Bader
committed
Replace private categories with static functions, fix naming conventions.
1 parent 9ecdb62 commit 5db478e

File tree

1 file changed

+67
-84
lines changed

1 file changed

+67
-84
lines changed

compiler/cpp/src/generate/t_cocoa_generator.cc

Lines changed: 67 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,7 @@ string t_cocoa_generator::cocoa_thrift_imports() {
354354
* JSON strings.
355355
*/
356356
string t_cocoa_generator::to_json_protocol() {
357-
return string() + "@protocol MSThriftToJson\n"
357+
return string() + "@protocol ThriftToJson\n"
358358
+ "- (void) toJson: (NSMutableString *) builder;\n"
359359
+ "@end\n\n";
360360
}
@@ -364,80 +364,63 @@ string t_cocoa_generator::to_json_protocol() {
364364
* as they are appended.
365365
*/
366366
string t_cocoa_generator::json_escape_function() {
367-
return string () + "@interface NSMutableString (JsonEscaping)\n"
368-
+ "\n"
369-
+ "- (void) appendJsonString: (NSString *)toEscape;\n"
370-
+ "- (void) appendJsonData: (NSData *)data;\n"
371-
+ "\n"
372-
+ "@end\n"
373-
+ "\n"
374-
+ "@interface NSData (ToHex)\n"
375-
+ "\n"
376-
+ "- (NSString *) toHexString;\n"
377-
+ "\n"
378-
+ "@end\n"
379-
+ "\n"
380-
+ "@implementation NSMutableString (JsonEscaping)\n"
381-
+ "\n"
382-
+ "- (void) appendJsonString: (NSString *)toEscape {\n"
383-
+ " NSUInteger len = [toEscape length];\n"
384-
+ " unichar buffer[len];\n"
385-
+ "\n"
386-
+ " [toEscape getCharacters:buffer range:NSMakeRange(0, len)];\n"
387-
+ "\n"
388-
+ " [self appendString: @\"\\\"\"];\n"
389-
+ " for (int i = 0; i < len; ++i) {\n"
390-
+ " unichar c = buffer[i];\n"
391-
+ "\n"
392-
+ " switch (c) {\n"
393-
+ " case '\\\\': [self appendString: @\"\\\\\\\\\"]; break;\n"
394-
+ " case '\\b': [self appendString: @\"\\\\b\"]; break;\n"
395-
+ " case '\\f': [self appendString: @\"\\\\f\"]; break;\n"
396-
+ " case '\\n': [self appendString: @\"\\\\n\"]; break;\n"
397-
+ " case '\\r': [self appendString: @\"\\\\r\"]; break;\n"
398-
+ " case '\\t': [self appendString: @\"\\\\t\"]; break;\n"
399-
+ " default:\n"
400-
+ " if (c < 32 || c > 127) {\n"
401-
+ " [self appendFormat:@\"\\\\u%04x\", (int) c];\n"
402-
+ " } else {\n"
403-
+ " [self appendFormat:@\"%C\", c];\n"
404-
+ " }\n"
405-
+ " break;\n"
406-
+ " }\n"
407-
+ " }\n"
408-
+ " [self appendString: @\"\\\"\"];\n"
409-
+ "}\n"
410-
+ "\n"
411-
+ "- (void) appendJsonData: (NSData *)data {\n"
412-
+ " [self appendJsonString:[data toHexString]];\n"
413-
+ "}\n"
414-
+ "\n"
415-
+ "@end\n"
416-
+ "\n"
417-
+ "@implementation NSData (ToHex)\n"
418-
+ "\n"
419-
+ "- (NSString *) toHexString {\n"
420-
+ " static char const *kHexAlphabet = \"0123456789ABCDEF\";\n"
421-
+ " NSUInteger numBytes = self.length;\n"
422-
+ "\n"
423-
+ " if (numBytes > 0) {\n"
424-
+ " const unsigned char *data = self.bytes;\n"
425-
+ " char *hex = malloc(sizeof(char) * (numBytes * 2 + 1));\n"
426-
+ " char *p = hex;\n"
427-
+ " for (NSUInteger i = 0; i < numBytes; ++i) {\n"
428-
+ " *p++ = kHexAlphabet[((*data & 0xF0) >> 4)];\n"
429-
+ " *p++ = kHexAlphabet[ (*data & 0x0F) ];\n"
430-
+ " ++data;\n"
431-
+ " }\n"
432-
+ " NSString *result = [NSString stringWithUTF8String:hex];\n"
433-
+ " free(hex);\n"
434-
+ " return result;\n"
435-
+ " } else {\n"
436-
+ " return @\"\";\n"
437-
+ " }\n"
438-
+ "}\n"
439-
+ "\n"
440-
+ "@end\n\n";
367+
stringstream out;
368+
out << "static NSString* HexEncode(NSData *toEncode) {\n"
369+
<< " static char const *kHexAlphabet = \"0123456789ABCDEF\";\n"
370+
<< " NSUInteger numBytes = toEncode.length;\n"
371+
<< "\n"
372+
<< " if (numBytes > 0) {\n"
373+
<< " const unsigned char *data = toEncode.bytes;\n"
374+
<< " char *hex = malloc(sizeof(char) * (numBytes * 2 + 1));\n"
375+
<< " char *p = hex;\n"
376+
<< " for (NSUInteger i = 0; i < numBytes; ++i) {\n"
377+
<< " *p++ = kHexAlphabet[((*data & 0xF0) >> 4)];\n"
378+
<< " *p++ = kHexAlphabet[ (*data & 0x0F) ];\n"
379+
<< " ++data;\n"
380+
<< " }\n"
381+
<< " NSString *result = [NSString stringWithUTF8String:hex];\n"
382+
<< " free(hex);\n"
383+
<< " return result;\n"
384+
<< " } else {\n"
385+
<< " return @\"\";\n"
386+
<< " }\n"
387+
<< "}\n"
388+
<< "\n"
389+
<< "static void AppendJsonEscapedString(NSMutableString *ms, NSString *toEscape) {\n"
390+
<< " NSUInteger len = toEscape.length;\n"
391+
<< " unichar buffer[len];\n"
392+
<< "\n"
393+
<< " [toEscape getCharacters:buffer range:NSMakeRange(0, len)];\n"
394+
<< "\n"
395+
<< " [ms appendString:@\"\\\"\"];\n"
396+
<< " for (int i = 0; i < len; ++i) {\n"
397+
<< " unichar c = buffer[i];\n"
398+
<< " switch (c) {\n"
399+
<< " case '\\\\': [ms appendString: @\"\\\\\\\\\"]; break;\n"
400+
<< " case '\\b': [ms appendString: @\"\\\\b\"]; break;\n"
401+
<< " case '\\f': [ms appendString: @\"\\\\f\"]; break;\n"
402+
<< " case '\\n': [ms appendString: @\"\\\\n\"]; break;\n"
403+
<< " case '\\r': [ms appendString: @\"\\\\r\"]; break;\n"
404+
<< " case '\\t': [ms appendString: @\"\\\\t\"]; break;\n"
405+
<< " default:\n"
406+
<< " if (c < 32 || c > 127) {\n"
407+
<< " [ms appendFormat:@\"\\\\u%04x\", (int) c];\n"
408+
<< " } else {\n"
409+
<< " [ms appendFormat:@\"%C\", c];\n"
410+
<< " }\n"
411+
<< " break;\n"
412+
<< " }\n"
413+
<< " }\n"
414+
<< " [ms appendString:@\"\\\"\"];\n"
415+
<< "}\n"
416+
<< "\n"
417+
<< "static void AppendJsonEscapedBinary(NSMutableString *ms, NSData *toEscape) {\n"
418+
<< " [ms appendString:@\"\\\"\"];\n"
419+
<< " [ms appendString:HexEncode(toEscape)];\n"
420+
<< " [ms appendString:@\"\\\"\"];\n"
421+
<< "}\n\n";
422+
423+
return out.str();
441424
}
442425

443426
/**
@@ -490,9 +473,9 @@ void t_cocoa_generator::generate_enum(t_enum* tenum) {
490473
f_header_ << endl << "};" << endl << endl;
491474

492475
// Generate name-lookup function
493-
f_header_ << "NSString* nameOf" << name << "(enum " << name << " value);\n\n";
476+
f_header_ << "NSString* NameOf" << name << "(enum " << name << " value);\n\n";
494477

495-
f_impl_ << "NSString* nameOf" << name << "(enum " << name << " value) {\n";
478+
f_impl_ << "NSString* NameOf" << name << "(enum " << name << " value) {\n";
496479

497480
indent(f_impl_, 1) << "switch (value) {\n";
498481

@@ -615,7 +598,7 @@ void t_cocoa_generator::generate_cocoa_struct_interface(ofstream& out,
615598
}
616599
out << "<TBase, NSCoding";
617600
if (emit_to_json_) {
618-
out << ", MSThriftToJson";
601+
out << ", ThriftToJson";
619602
}
620603
out << "> ";
621604

@@ -1487,15 +1470,15 @@ void t_cocoa_generator::generate_cocoa_struct_to_json_method(
14871470
}
14881471
indent(out, nl) << "[builder appendFormat:@\"" << spec << "\", " << field_name << "];\n";
14891472
} else if (base == t_base_type::TYPE_STRING && base_type->is_binary()) {
1490-
indent(out, nl) << "[builder appendJsonData:" << field_name << "];\n";
1473+
indent(out, nl) << "AppendJsonEscapedBinary(builder, " << field_name << ");\n";
14911474
} else if (base == t_base_type::TYPE_STRING) {
1492-
indent(out, nl) << "[builder appendJsonString:" << field_name << "];\n";
1475+
indent(out, nl) << "AppendJsonEscapedString(builder, " << field_name << ");\n";
14931476
} else {
14941477
throw "what r u doing";
14951478
}
14961479
} else if (type->is_enum()) {
14971480
string enum_name = cocoa_prefix_ + type->get_name();
1498-
indent(out, nl) << "[builder appendFormat:@\"\\\"%@\\\"\", nameOf" << enum_name << "(" << field_name << ")];\n";
1481+
indent(out, nl) << "[builder appendFormat:@\"\\\"%@\\\"\", NameOf" << enum_name << "(" << field_name << ")];\n";
14991482
} else if (type->is_list() || type->is_set()) {
15001483
t_type *element_type;
15011484
if (type->is_list()) {
@@ -1563,11 +1546,11 @@ void t_cocoa_generator::generate_cocoa_struct_to_json_method(
15631546
string append_method;
15641547
t_base_type *base = static_cast<t_base_type*>(type);
15651548
if (base->is_binary()) {
1566-
append_method = "appendJsonData:";
1549+
append_method = "AppendJsonEscapedBinary";
15671550
} else {
1568-
append_method = "appendJsonString:";
1551+
append_method = "AppendJsonEscapedString";
15691552
}
1570-
indent(out, nl + 1) << "[builder " << append_method << key_name << "];\n";
1553+
indent(out, nl + 1) << append_method << "(builder, " << key_name << ");\n";
15711554
} else {
15721555
indent(out, nl + 1) << "[builder appendFormat:@\"\\\"%@\\\"\", " << key_name << "];\n";
15731556
}

0 commit comments

Comments
 (0)