Perl generator for Thrift compiler
Summary: Submitted by Jake Luciani
Reviewed By: mcslee
Test Plan: Who likes perl? Not me. Test files to be checked in soon.
git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@665111 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/compiler/cpp/src/main.cc b/compiler/cpp/src/main.cc
index 51de7fd..30d8fa9 100644
--- a/compiler/cpp/src/main.cc
+++ b/compiler/cpp/src/main.cc
@@ -28,6 +28,7 @@
#include "generate/t_py_generator.h"
#include "generate/t_rb_generator.h"
#include "generate/t_xsd_generator.h"
+#include "generate/t_perl_generator.h"
using namespace std;
@@ -116,6 +117,7 @@
bool gen_xsd = false;
bool gen_php = false;
bool gen_phpi = false;
+bool gen_perl = false;
bool gen_recurse = false;
/**
@@ -196,7 +198,7 @@
* @param fmt C format string followed by additional arguments
*/
void failure(const char* fmt, ...) {
- va_list args;
+ va_list args;
fprintf(stderr, "[FAILURE:%s:%d] ", g_curpath.c_str(), yylineno);
va_start(args, fmt);
vfprintf(stderr, fmt, args);
@@ -244,8 +246,8 @@
pwarning(0, "Cannot open include file %s\n", filename.c_str());
return std::string();
}
-
- // Stat this files
+
+ // Stat this file
struct stat finfo;
if (stat(rp, &finfo) == 0) {
return rp;
@@ -254,18 +256,18 @@
// new search path with current dir global
vector<string> sp = g_incl_searchpath;
sp.insert(sp.begin(), g_curdir);
-
+
// iterate through paths
vector<string>::iterator it;
for (it = sp.begin(); it != sp.end(); it++) {
string sfilename = *(it) + "/" + filename;
-
+
// Realpath!
char rp[PATH_MAX];
if (realpath(sfilename.c_str(), rp) == NULL) {
continue;
}
-
+
// Stat this files
struct stat finfo;
if (stat(rp, &finfo) == 0) {
@@ -273,7 +275,7 @@
}
}
}
-
+
// Uh oh
pwarning(0, "Could not find include file %s\n", filename.c_str());
return std::string();
@@ -292,6 +294,7 @@
fprintf(stderr, " -py Generate Python output files\n");
fprintf(stderr, " -rb Generate Ruby output files\n");
fprintf(stderr, " -xsd Generate XSD output files\n");
+ fprintf(stderr, " -perl Generate Perl output files\n");
fprintf(stderr, " -I dir Add a directory to the list of directories \n");
fprintf(stderr, " searched for include directives\n");
fprintf(stderr, " -nowarn Suppress all compiler warnings (BAD!)\n");
@@ -394,7 +397,7 @@
for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) {
validate_const_rec(name + "<key>", k_type, v_iter->first);
validate_const_rec(name + "<val>", v_type, v_iter->second);
- }
+ }
} else if (type->is_list() || type->is_set()) {
t_type* e_type;
if (type->is_list()) {
@@ -427,10 +430,10 @@
/**
* Parses a program
*/
-void parse(t_program* program, t_program* parent_program) {
+void parse(t_program* program, t_program* parent_program) {
// Get scope file path
string path = program->get_path();
-
+
// Set current dir global, which is used in the include_file function
g_curdir = directory_name(path);
g_curpath = path;
@@ -443,7 +446,7 @@
// Create new scope and scan for includes
pverbose("Scanning %s for includes\n", path.c_str());
- g_parse_mode = INCLUDES;
+ g_parse_mode = INCLUDES;
g_program = program;
g_scope = program->scope();
try {
@@ -547,6 +550,13 @@
delete xsd;
}
+ if (gen_perl) {
+ pverbose("Generating PERL\n");
+ t_perl_generator* perl = new t_perl_generator(program);
+ perl->generate_program();
+ delete perl;
+ }
+
} catch (string s) {
printf("Error: %s\n", s.c_str());
} catch (const char* exc) {
@@ -607,6 +617,8 @@
gen_rb = true;
} else if (strcmp(arg, "-xsd") == 0) {
gen_xsd = true;
+ } else if (strcmp(arg, "-perl") == 0) {
+ gen_perl = true;
} else if (strcmp(arg, "-I") == 0) {
// An argument of "-I\ asdf" is invalid and has unknown results
arg = argv[++i];
@@ -625,9 +637,9 @@
arg = strtok(NULL, " ");
}
}
-
+
// You gotta generate something!
- if (!gen_cpp && !gen_java && !gen_php && !gen_phpi && !gen_py && !gen_rb && !gen_xsd) {
+ if (!gen_cpp && !gen_java && !gen_php && !gen_phpi && !gen_py && !gen_rb && !gen_xsd && !gen_perl) {
fprintf(stderr, "!!! No output language(s) specified\n\n");
usage();
}