// 解析excel文件 bool parse_excel(const std::string &excel, const enum_parse_option parse_option, cfgbase_t &cfgbase){ if(false == filetool::exist(excel)){ ECHO_ERR("错误: 找不到excel文件<%s>", excel.c_str()); return false; } errvec_t errvec; if (!parser::parse_excel(excel, cfgbase, errvec, parse_option)){ ECHO_ERR("错误:解析<%s>文件失败,请确保该文件存在且未被打开", excel.c_str()); echotool::echo_errvec(errvec); return false; } return true; }
char* get_whole_file_buf(const std::string &path) { if(false == exist(path)){ return NULL; } /* 若要一个byte不漏地读入整个文件,只能采用二进制方式打开 */ errno_t err; FILE *file = NULL; err = fopen_s(&file, path.c_str(), "rb" ); if (NULL == file || err > 0){ ECHO_ERR("打开<%s>文件失败,错误号:%u", path.c_str(), err); return NULL; } /* 获取文件大小 */ fseek (file , 0 , SEEK_END); long size = ftell (file); rewind (file); /* 分配内存存储整个文件 */ char *buf = new char[size]; if (buf == NULL) { ECHO_ERR("载入<%s>文件失败,错误原因:分配<%ubyte>的内存失败", path.c_str(), size); return NULL; } /* 将文件拷贝到buffer中 */ size_t ret = fread (buf, 1, size, file); if (ret != size){ ECHO_ERR("载入<%s>文件失败,错误原因:文件读取大小不符<%u> != <%u>", path.c_str(), ret, size); return NULL; } /* 现在整个文件已经在buffer中 */ /* 关闭文件并释放内存 */ fclose (file); return buf; }
bool gen_xsds(string &excel, string &xsd_dir) { if(false == fileuitl::exist(excel)) { ECHO_ERR("´íÎó: %s ·¾¶²»´æÔÚ", excel.c_str()); return false; } if(false == fileuitl::exist(xsd_dir)) { ECHO_ERR("´íÎó: %s ·¾¶²»´æÔÚ", xsd_dir.c_str()); return false; } propunit_t unit; errvec_t errvec; bool ok = parseutil::parse_excel(excel, unit, errvec); if (!ok){ ECHO_ERR("´íÎó: %s ½âÎöÎļþʧ°Ü", xsd_dir.c_str()); proputil::echo_errvec(errvec); return false; } // proputil::parse(excel, unit, errvec); for(propdeclvec_t::iterator itr = unit.propdecls.begin(); itr != unit.propdecls.end(); ++itr) { propdecl_t &decl = *itr; string xsd = xsd_dir + "\\" + strip_ext(strip_dir(decl.filename)) + ".xsd"; gen_xsd(decl, xsd); } return true; }
bool overwrite_file(const std::string &path, const std::string &new_text) { string old_text; get_whole_file_str(path, old_text); if (old_text == new_text){ return true; } ofstream o(path); if (!o.good()){ ECHO_ERR("无法生成文件,路径错误:<%s>", path.c_str()); return false; } o << new_text; o.flush(); o.close(); return true; }
int main(int argc, char **argv) { if (argc < 2){ ECHO_ERR("参数格式错误,格式应为:"); ECHO_ERR(" excel文件的路径 命令1 命令1的参数 命令2 命令2的参数..."); ECHO_ERR(" 比如: e:/hello.xlsx -xsd ../xsd/ -saveasxml ../xml/"); return 0; } std::string excel = argv[1]; // excel文件的路径 cfgbase_t cfgbase; enum_parse_option parse_option = get_parse_option(argc, argv); // 解析excel文件,结果存放在 cfgbase 中 if (!parse_excel(excel, parse_option, cfgbase)){ return 0; } // 根据传入参数,开始执行命令 int pos = 2; while(pos < argc){ std::string cmd = argv[pos++]; if(cmd == "-xsd"){ if(pos + 1 > argc){ ECHO_ERR("生成xsd的命令错误,格式应为: "); ECHO_ERR(" -xsd 生成的xsd文件放到哪个文件夹下"); ECHO_ERR(" 比如: -xsd ../xsd/"); return 0; } std::string xsd_dir = argv[pos++]; // 生成xsd文件 xsd_generator xsd_gen(cfgbase, xsd_dir); xsd_gen.generate(); }else if(cmd == "-c++"){ if(pos + 3 > argc){ ECHO_ERR("生成c++源代码文件的命令错误,格式应为: "); ECHO_ERR(" -c++ h模板文件 cpp模板文件 生成的c++文件放在哪个文件夹下"); ECHO_ERR(" 比如: -c++ ../h_template.h ../cpp_template.cpp ./c++/"); return 0; } std::string h_templet = argv[pos++]; std::string cpp_templet = argv[pos++]; std::string cpp_dir = argv[pos++]; // 生成c++文件 cpp_generator cpp_gen(cfgbase, cpp_dir, h_templet, cpp_templet); cpp_gen.generate(); }else if(cmd == "-go"){ if(pos + 2 > argc){ ECHO_ERR("生成go源代码文件命令错误,格式应为: "); ECHO_ERR(" -go go模板文件 生成的go文件放在哪个文件夹下"); ECHO_ERR(" 比如: -go ../go_template.go ./go/"); return 0; } // 生成go文件(未开放) std::string go_templet = argv[pos++]; std::string go_dir = argv[pos++]; }else if(cmd == "-saveasxml"){ if(pos + 1 > argc){ ECHO_WARN("导出xml文件的命令错误,格式应为: "); ECHO_WARN(" -saveasxml 生成的xml文件存放在哪个文件夹下"); ECHO_WARN(" 比如: -saveasxml ./xml/"); return 0; } std::string xml_dir = argv[pos++]; // 生成xml文件 xml_generator xml_gen(cfgbase, xml_dir); xml_gen.generate(); }else if(cmd == "-json"){ if(pos + 1 > argc){ ECHO_WARN("导出json文件的命令错误,格式应为: "); ECHO_WARN(" -json 生成的json文件存放在哪个文件夹下"); ECHO_WARN(" 比如: -json ./json/"); return 0; } std::string json_dir = argv[pos++]; // 生成json文件 json_generator json_gen(cfgbase, json_dir); json_gen.generate(); } } return 0; }