aboutsummaryrefslogtreecommitdiff
path: root/php/ext/google/protobuf/def.c
diff options
context:
space:
mode:
authorPaul Yang <TeBoring@users.noreply.github.com>2017-06-05 00:10:18 -0700
committerGitHub <noreply@github.com>2017-06-05 00:10:18 -0700
commit6f325805c0bc956f927b0e2dbfb4dd8133b4ed69 (patch)
tree2f7d596b8e19933b67868d7378bb663960b75f87 /php/ext/google/protobuf/def.c
parentfbaad3617fbfadafbcc653a621620a5081df64eb (diff)
downloadprotobuf-6f325805c0bc956f927b0e2dbfb4dd8133b4ed69.tar.gz
protobuf-6f325805c0bc956f927b0e2dbfb4dd8133b4ed69.tar.bz2
protobuf-6f325805c0bc956f927b0e2dbfb4dd8133b4ed69.zip
Add new file option php_namespace. (#3162)
* Add new file option php_namespace. Use this option to change the namespace of php generated classes. Default is empty. When this option is empty, the package name will be used for determining the namespace. * Uncomment commented tests * Revert gdb test change * Update csharp descriptor. * Add test for empty php_namespace.
Diffstat (limited to 'php/ext/google/protobuf/def.c')
-rw-r--r--php/ext/google/protobuf/def.c27
1 files changed, 21 insertions, 6 deletions
diff --git a/php/ext/google/protobuf/def.c b/php/ext/google/protobuf/def.c
index 099ebd05..332616b2 100644
--- a/php/ext/google/protobuf/def.c
+++ b/php/ext/google/protobuf/def.c
@@ -405,23 +405,34 @@ static const char *classname_prefix(const char *classname,
}
static void convert_to_class_name_inplace(const char *package,
+ const char *namespace_given,
const char *prefix, char *classname) {
- size_t package_len = package == NULL ? 0 : strlen(package);
size_t prefix_len = prefix == NULL ? 0 : strlen(prefix);
size_t classname_len = strlen(classname);
int i = 0, j;
bool first_char = true;
- int offset = package_len != 0 ? 2 : 0;
+ size_t package_len = package == NULL ? 0 : strlen(package);
+ size_t namespace_given_len =
+ namespace_given == NULL ? 0 : strlen(namespace_given);
+ bool use_namespace_given = namespace_given != NULL;
+ size_t namespace_len =
+ use_namespace_given ? namespace_given_len : package_len;
+
+ int offset = namespace_len != 0 ? 2 : 0;
for (j = 0; j < classname_len; j++) {
- classname[package_len + prefix_len + classname_len + offset - 1 - j] =
+ classname[namespace_len + prefix_len + classname_len + offset - 1 - j] =
classname[classname_len - j - 1];
}
- if (package_len != 0) {
+ if (namespace_len != 0) {
classname[i++] = '\\';
- for (j = 0; j < package_len; j++) {
+ for (j = 0; j < namespace_len; j++) {
+ if (use_namespace_given) {
+ classname[i++] = namespace_given[j];
+ continue;
+ }
// php packages are divided by '\'.
if (package[j] == '.') {
classname[i++] = '\\';
@@ -490,16 +501,20 @@ PHP_METHOD(DescriptorPool, internalAddGeneratedFile) {
* bytes allocated, one for '.', one for trailing 0, and 3 for 'GPB' if \
* given message is google.protobuf.Empty.*/ \
const char *fullname = upb_##def_type_lower##_fullname(def_type_lower); \
+ const char *php_namespace = upb_filedef_phpnamespace(files[0]); \
const char *prefix_given = upb_filedef_phpprefix(files[0]); \
size_t classname_len = strlen(fullname) + 5; \
if (prefix_given != NULL) { \
classname_len += strlen(prefix_given); \
} \
+ if (php_namespace != NULL) { \
+ classname_len += strlen(php_namespace); \
+ } \
char *classname = ecalloc(sizeof(char), classname_len); \
const char *package = upb_filedef_package(files[0]); \
classname_no_prefix(fullname, package, classname); \
const char *prefix = classname_prefix(classname, prefix_given, package); \
- convert_to_class_name_inplace(package, prefix, classname); \
+ convert_to_class_name_inplace(package, php_namespace, prefix, classname); \
PHP_PROTO_CE_DECLARE pce; \
if (php_proto_zend_lookup_class(classname, strlen(classname), &pce) == \
FAILURE) { \