From 4b83d6ddeb2d9b5a4102839cfe0d38fe2c72411d Mon Sep 17 00:00:00 2001 From: David Reiss Date: Thu, 27 Mar 2008 19:45:19 +0000 Subject: [PATCH] Allow nested namespaces to be used in perl. git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@665584 13f79535-47bb-0310-9956-ffa450edef68 --- compiler/cpp/src/generate/t_perl_generator.cc | 12 ++++--- compiler/cpp/src/generate/t_perl_generator.h | 34 ++++++++++++++++++- 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/compiler/cpp/src/generate/t_perl_generator.cc b/compiler/cpp/src/generate/t_perl_generator.cc index 5e1503ba..0b16212e 100644 --- a/compiler/cpp/src/generate/t_perl_generator.cc +++ b/compiler/cpp/src/generate/t_perl_generator.cc @@ -22,10 +22,12 @@ void t_perl_generator::init_generator() { MKDIR(get_out_dir().c_str()); string outdir = get_out_dir(); - std::string ns = program_->get_perl_package(); - if (ns.length() > 0) { - outdir += ns + "/"; - MKDIR(outdir.c_str()); + std::list dirs; + perl_namespace_dirs(program_, dirs); + std::list::iterator it; + for (it = dirs.begin(); it != dirs.end(); it++) { + outdir += *it + "/"; + MKDIR(outdir.c_str()); } // Make output file @@ -42,7 +44,7 @@ void t_perl_generator::init_generator() { // Print header f_consts_ << autogen_comment() << - "package "<<( ns.empty() ? "" : ns+"::")<<"Constants;"< #include #include +#include #include "t_oop_generator.h" @@ -141,9 +142,40 @@ class t_perl_generator : public t_oop_generator { "#\n"; } + void perl_namespace_dirs(t_program* p, std::list& dirs) { + std::string ns = p->get_perl_package(); + std::string::size_type loc; + + if (ns.size() > 0) { + while ((loc = ns.find(".")) != std::string::npos) { + dirs.push_back(ns.substr(0, loc)); + ns = ns.substr(loc+1); + } + } + + if (ns.size() > 0) { + dirs.push_back(ns); + } + } + std::string perl_namespace(t_program* p) { std::string ns = p->get_perl_package(); - return ns.empty() ? ns : (ns + "::"); + std::string result = ""; + std::string::size_type loc; + + if (ns.size() > 0) { + while ((loc = ns.find(".")) != std::string::npos) { + result += ns.substr(0, loc); + result += "::"; + ns = ns.substr(loc+1); + } + + if (ns.size() > 0) { + result += ns + "::"; + } + } + + return result; } private: -- 2.17.1